@sourcegraph/amp 0.0.1778160156-gb2be4b → 0.0.1778185482-gf00656

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +10 -10
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -5288,12 +5288,12 @@ ${E}`))}},error:(K)=>{if(!U)U=!0,X(Error(`Failed to spawn brew: ${K.message}`))}
5288
5288
  ${E}`;if(Y==="pnpm"&&E.includes("Unable to find the global bin directory"))W+=`
5289
5289
 
5290
5290
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
5291
- npm install -g @sourcegraph/amp`;X(Error(W))}},error:(K)=>{if(!V)V=!0,X(Error(`Failed to spawn ${Y}: ${K.message}`))},complete:()=>{if(!V)V=!0,F()}})})}c0();c0();FN();async function $X0(A,Q){let J=`${Q||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let F=await fetch(J,{signal:Y.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let X=await F.json(),D=X.version??X["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=Mo(A,D),V=G<0,U,K;if(X.time){let E=X.time[A],W=X.time[D],z=Date.now();if(E)U=Math.floor((z-new Date(E).getTime())/3600000);if(W)K=Math.floor((z-new Date(W).getTime())/3600000)}return j.info("NPM version comparison",{currentVersion:A,latestVersion:D,compareResult:G,hasUpdate:V,currentVersionAge:U,latestVersionAge:K}),{hasUpdate:V,latestVersion:D,currentVersion:A,currentVersionAge:U,latestVersionAge:K,source:"npm"}}catch(F){return j.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var Mq5="https://static.ampcode.com/cli/cli-version.txt";async function JX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Mq5}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!$.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let J=(await $.text()).trim();if(!J||!/^\d+\.\d+\.\d+/.test(J))return{hasUpdate:!1,currentVersion:A,source:"bin"};let Y=Mo(A,J),Z=Y<0;return j.info("Bin version comparison",{currentVersion:A,latestVersion:J,compareResult:Y,hasUpdate:Z}),{hasUpdate:Z,latestVersion:J,currentVersion:A,source:"bin"}}catch($){return j.debug("Error checking bin version",{error:$}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout(B)}}var Lq5=604800000;function Pb4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let B=Date.now()-Q;if(B>Lq5)return{ageMs:B};return null}function Mo(A,Q){let B=(Z)=>{let[F,X]=Z.split("-");return{parts:F?.split(".").map(Number)||[],label:X}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let F=$.parts[Z]||0,X=J.parts[Z]||0;if(F<X)return-1;if(F>X)return 1}if($.label===J.label)return 0;if(!$.label&&J.label)return 1;if($.label&&!J.label)return-1;if($.label&&J.label)return $.label<J.label?-1:1;return 0}function St0(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Q)return null;let B=parseInt(Q[1],10)*1000,$=Q[2],J=B!==0?mV(B):void 0;return{sha:$,age:J}}catch{return null}}L1();c0();import{readFile as Oq5,realpath as jq5}from"node:fs/promises";import{homedir as Rq5}from"node:os";import{dirname as _b4,join as kt0}from"node:path";async function Tb4(A){switch(A){case"binary":case"brew":return Pq5(No());case"npm":case"pnpm":case"yarn":case"bun":return _q5();case"bootstrap":return Tq5()}}async function Pq5(A){let Q=await PD(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function _q5(){try{let A=process.argv[1];if(!A)return null;let Q=await jq5(A),B=_b4(_b4(Q));return await Sb4(kt0(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Tq5(){try{let A=process.env.AMP_HOME??kt0(Rq5(),".amp");return await Sb4(kt0(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Sb4(A){let Q=await Oq5(A,"utf8"),B=JSON.parse(Q);if(B.name!=="@sourcegraph/amp")return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}var Sq5=3600000,kq5=5000;function vt0(A,Q,B={}){let $=new h4,J=$.pipe(nA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Sq5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await lV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await vq5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await lV(kq5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let W=Math.min(K,E);await lV(W),E-=W}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function vq5(A,Q,B,$){let J={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return B.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),J.stop=!0,J;let Y=await Q.get("updates.mode");if(Y==="disabled")return B.debug("checking disabled"),J.stop=!0,J;let Z=await tN(),F=Z==="binary"||Z==="brew";B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F});let X;if(F)X=await JX0(A);else{let V=await Hj();X=await $X0(A,V)}if(!(X.latestVersion&&X.hasUpdate))return B.debug("no update available"),J;let D=(V)=>{$.next(V),J.emittedVisibleState=!0};if(Z){let V=await Tb4(Z);if(V&&Mo(V,X.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:V,latestVersion:X.latestVersion}),J.updatedTo=V,Mo(A,V)<0){let U=await LW(V),K={from:A,to:V,externallyUpdated:!0,...U};if(U.status==="same")B.info("on-disk already updated by another instance",K),D("updated");else B.warn("on-disk already updated by another instance, with PATH warning",K),D("updated-with-warning")}return J}}let G=()=>{if(X.currentVersionAge!==void 0&&X.latestVersionAge!==void 0){let V=X.currentVersionAge-X.latestVersionAge,U=0.5;if(Math.abs(V)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:X.currentVersionAge,latestVersionAge:X.latestVersionAge,ageDifferenceHours:V}),!0}return!1};if(!Y)Y=Z==="pnpm"?"warn":"auto",B.debug("no configured update mode; selected default based on package manager",{packageManager:Z,mode:Y});if(Z==="brew"){if(!G())D("update-available-brew");return J}if(Z==="binary"&&process.execPath!==No()){if(B.debug("non-standard binary path, showing warning"),!G())D("update-available-unrecognized-path");return J}if(Y==="warn"){if(!G())D("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!G())D("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!G())D("update-available");return J}try{await Co(X.latestVersion,Z),J.updatedTo=X.latestVersion;let V=await LW(X.latestVersion),U={from:X.currentVersion,to:X.latestVersion,...V};if(V.status==="same")B.info("success",U),D("updated");else B.warn("success with warning",U),D("updated-with-warning")}catch(V){D("update-error")}return J}catch(Y){return B.debug("check failed",{error:Y}),J}}FN();import{stderr as _D}from"node:process";function kb4(A){let Q=new yN().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async($)=>{await Nt0($.force||!1,$.verbose||!1,"0.0.1778160156-gb2be4b"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new yN("update").alias("up").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async($)=>{await xq5($.targetVersion)});A.addCommand(B)}function yq5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
5291
+ npm install -g @sourcegraph/amp`;X(Error(W))}},error:(K)=>{if(!V)V=!0,X(Error(`Failed to spawn ${Y}: ${K.message}`))},complete:()=>{if(!V)V=!0,F()}})})}c0();c0();FN();async function $X0(A,Q){let J=`${Q||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let F=await fetch(J,{signal:Y.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let X=await F.json(),D=X.version??X["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=Mo(A,D),V=G<0,U,K;if(X.time){let E=X.time[A],W=X.time[D],z=Date.now();if(E)U=Math.floor((z-new Date(E).getTime())/3600000);if(W)K=Math.floor((z-new Date(W).getTime())/3600000)}return j.info("NPM version comparison",{currentVersion:A,latestVersion:D,compareResult:G,hasUpdate:V,currentVersionAge:U,latestVersionAge:K}),{hasUpdate:V,latestVersion:D,currentVersion:A,currentVersionAge:U,latestVersionAge:K,source:"npm"}}catch(F){return j.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var Mq5="https://static.ampcode.com/cli/cli-version.txt";async function JX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Mq5}?t=${Date.now()}`,{signal:Q.signal,cache:"no-store"});if(!$.ok)return{hasUpdate:!1,currentVersion:A,source:"bin"};let J=(await $.text()).trim();if(!J||!/^\d+\.\d+\.\d+/.test(J))return{hasUpdate:!1,currentVersion:A,source:"bin"};let Y=Mo(A,J),Z=Y<0;return j.info("Bin version comparison",{currentVersion:A,latestVersion:J,compareResult:Y,hasUpdate:Z}),{hasUpdate:Z,latestVersion:J,currentVersion:A,source:"bin"}}catch($){return j.debug("Error checking bin version",{error:$}),{hasUpdate:!1,currentVersion:A,source:"bin"}}finally{clearTimeout(B)}}var Lq5=604800000;function Pb4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let B=Date.now()-Q;if(B>Lq5)return{ageMs:B};return null}function Mo(A,Q){let B=(Z)=>{let[F,X]=Z.split("-");return{parts:F?.split(".").map(Number)||[],label:X}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let F=$.parts[Z]||0,X=J.parts[Z]||0;if(F<X)return-1;if(F>X)return 1}if($.label===J.label)return 0;if(!$.label&&J.label)return 1;if($.label&&!J.label)return-1;if($.label&&J.label)return $.label<J.label?-1:1;return 0}function St0(A){try{let Q=A.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Q)return null;let B=parseInt(Q[1],10)*1000,$=Q[2],J=B!==0?mV(B):void 0;return{sha:$,age:J}}catch{return null}}L1();c0();import{readFile as Oq5,realpath as jq5}from"node:fs/promises";import{homedir as Rq5}from"node:os";import{dirname as _b4,join as kt0}from"node:path";async function Tb4(A){switch(A){case"binary":case"brew":return Pq5(No());case"npm":case"pnpm":case"yarn":case"bun":return _q5();case"bootstrap":return Tq5()}}async function Pq5(A){let Q=await PD(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function _q5(){try{let A=process.argv[1];if(!A)return null;let Q=await jq5(A),B=_b4(_b4(Q));return await Sb4(kt0(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Tq5(){try{let A=process.env.AMP_HOME??kt0(Rq5(),".amp");return await Sb4(kt0(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Sb4(A){let Q=await Oq5(A,"utf8"),B=JSON.parse(Q);if(B.name!=="@sourcegraph/amp")return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}var Sq5=3600000,kq5=5000;function vt0(A,Q,B={}){let $=new h4,J=$.pipe(nA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Sq5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await lV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await vq5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await lV(kq5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let W=Math.min(K,E);await lV(W),E-=W}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function vq5(A,Q,B,$){let J={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return B.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),J.stop=!0,J;let Y=await Q.get("updates.mode");if(Y==="disabled")return B.debug("checking disabled"),J.stop=!0,J;let Z=await tN(),F=Z==="binary"||Z==="brew";B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F});let X;if(F)X=await JX0(A);else{let V=await Hj();X=await $X0(A,V)}if(!(X.latestVersion&&X.hasUpdate))return B.debug("no update available"),J;let D=(V)=>{$.next(V),J.emittedVisibleState=!0};if(Z){let V=await Tb4(Z);if(V&&Mo(V,X.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:V,latestVersion:X.latestVersion}),J.updatedTo=V,Mo(A,V)<0){let U=await LW(V),K={from:A,to:V,externallyUpdated:!0,...U};if(U.status==="same")B.info("on-disk already updated by another instance",K),D("updated");else B.warn("on-disk already updated by another instance, with PATH warning",K),D("updated-with-warning")}return J}}let G=()=>{if(X.currentVersionAge!==void 0&&X.latestVersionAge!==void 0){let V=X.currentVersionAge-X.latestVersionAge,U=0.5;if(Math.abs(V)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:X.currentVersionAge,latestVersionAge:X.latestVersionAge,ageDifferenceHours:V}),!0}return!1};if(!Y)Y=Z==="pnpm"?"warn":"auto",B.debug("no configured update mode; selected default based on package manager",{packageManager:Z,mode:Y});if(Z==="brew"){if(!G())D("update-available-brew");return J}if(Z==="binary"&&process.execPath!==No()){if(B.debug("non-standard binary path, showing warning"),!G())D("update-available-unrecognized-path");return J}if(Y==="warn"){if(!G())D("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!G())D("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!G())D("update-available");return J}try{await Co(X.latestVersion,Z),J.updatedTo=X.latestVersion;let V=await LW(X.latestVersion),U={from:X.currentVersion,to:X.latestVersion,...V};if(V.status==="same")B.info("success",U),D("updated");else B.warn("success with warning",U),D("updated-with-warning")}catch(V){D("update-error")}return J}catch(Y){return B.debug("check failed",{error:Y}),J}}FN();import{stderr as _D}from"node:process";function kb4(A){let Q=new yN().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async($)=>{await Nt0($.force||!1,$.verbose||!1,"0.0.1778185482-gf00656"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new yN("update").alias("up").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async($)=>{await xq5($.targetVersion)});A.addCommand(B)}function yq5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
5292
5292
  `),$=!1,B=0}function Y(Z){if(!Q)return;let F=Z.padEnd(B," ");A.write(`\r${F}`),$=!0,B=F.length}return{flushProgressLine:J,renderProgress:Y}}async function xq5(A){let B=process.platform==="win32"&&zj()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:$,renderProgress:J}=yq5(_D);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")_D.write(o0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
5293
5293
 
5294
5294
  `));try{if(!A){_D.write(o0.blue(`Checking for updates...
5295
- `));let F=!1,X;if(zj()){let D=await JX0("0.0.1778160156-gb2be4b");F=D.hasUpdate,X=D.latestVersion}else{let D=await Hj(),G=await $X0("0.0.1778160156-gb2be4b",D);F=G.hasUpdate,X=G.latestVersion}if(!F){let D=St0("0.0.1778160156-gb2be4b"),G=D?.age?`released ${D.age} ago`:`built ${mV(new Date("2026-05-07T13:26:26.632Z"))} ago`;_D.write(o0.green(`✓ Amp is already up to date on version ${"0.0.1778160156-gb2be4b"} (${G})
5296
- `));let V=await LW("0.0.1778160156-gb2be4b",B);if(V.warning)_D.write(`
5295
+ `));let F=!1,X;if(zj()){let D=await JX0("0.0.1778185482-gf00656");F=D.hasUpdate,X=D.latestVersion}else{let D=await Hj(),G=await $X0("0.0.1778185482-gf00656",D);F=G.hasUpdate,X=G.latestVersion}if(!F){let D=St0("0.0.1778185482-gf00656"),G=D?.age?`released ${D.age} ago`:`built ${mV(new Date("2026-05-07T20:28:26.630Z"))} ago`;_D.write(o0.green(`✓ Amp is already up to date on version ${"0.0.1778185482-gf00656"} (${G})
5296
+ `));let V=await LW("0.0.1778185482-gf00656",B);if(V.warning)_D.write(`
5297
5297
  `+o0.yellow(V.warning)+`
5298
5298
  `);process.exit(0)}if(!X)_D.write(o0.yellow("[WARN] could not find latest version")),process.exit(0);A=X}_D.write(o0.blue(`Updating to version ${A}...
5299
5299
  `)),await Co(A,void 0,(F)=>{$(),_D.write(o0.dim(`Running: ${F}
@@ -5730,7 +5730,7 @@ ${$}`).join(`
5730
5730
  `)}function iv5(A){return A.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)}function i41(A){return A.replace(/\[(image(?:\s+\d+)?)\]/gi,"").trim()}function nv5(A){let Q=PI.extname(A.sourcePath).toLowerCase();if(Q.length>0)return Q;if(A.source.type==="base64")switch(A.source.mediaType){case"image/jpeg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp"}return".png"}async function av5(A,Q){let B=[];for(let[$,J]of Q.entries()){if(J.source.type!=="base64"){j.warn("Skipping non-base64 debug package issue image",{index:$,sourceType:J.source.type});continue}let Y=`issue-image-${$+1}${nv5(J)}`,Z=PI.join(A,Y);try{await Nf(Z,Buffer.from(J.source.data,"base64")),B.push(Y)}catch(F){j.warn("Failed to write debug package issue image",{index:$,fileName:Y,error:F})}}return B}function ov5(A,Q,B=[]){let $=["# Bug Report","","## Issue Description","",A,""];if(B.length>0){for(let[J,Y]of B.entries())$.push(`![Issue image ${J+1}](./${Y})`);$.push("")}if($.push("## Included Files","","- `cli-logs.json` — CLI logs filtered for this session PID","- `thread.yaml` — Full thread data (messages, metadata, agent mode, etc.)"),B.length>0)$.push("- `issue-image-*.*` — Images attached to the issue description");if(If(Q.thread))$.push("- `thread.sqlite` — DTW Durable Object SQLite dump","- `cloudflare-logs.json` — Worker logs from Cloudflare (if CLOUDFLARE_API_TOKEN was set)");if($.push("","## Debug Instructions","","To investigate, start with the issue description above, then:","","1. Review `cli-logs.json` for errors, warnings, and the sequence of events"),If(Q.thread))$.push("2. Open `thread.sqlite` and inspect the `messages` and `thread_events` tables:"," ```sh"," sqlite3 -json thread.sqlite 'SELECT * FROM messages ORDER BY created_at, rowid'"," sqlite3 -json thread.sqlite 'SELECT * FROM thread_events ORDER BY seq'"," ```","3. Review `cloudflare-logs.json` (if present) for server-side worker errors","4. Check Cloudflare dashboards for more detail:",` - Logs: <${c41(Q.thread.id)}>`,` - Data Studio: <${d41(Q.thread.id)}>`);return $.push("",IG0(Q)),$.join(`
5731
5731
  `)}function n41(A){let Q=A.activeThreadHandle.getInitialTreeURI();return{thread:A.thread,ampURL:A.ampURL,effectiveAgentMode:A.getEffectiveAgentMode(),isProcessing:A.isProcessing,threadPoolIsDTW:A.threadPool.isDTWMode?.()===!0,transportState:A.threadPool.getTransportConnectionState?.(),transportRole:A.threadPool.getTransportConnectionRole?.(),threadViewState:A.threadViewStates[A.thread.id],initialTreePath:Q?K5(F8(Q)):void 0,currentWorkspacePath:K5(F8(A.currentWorkspace)),clientId:A.clientId,logFile:A.logFile,pid:process.pid}}async function ki4(A){try{let Q=PI.join("/tmp",`amp-thread-${A.thread.id}-${Date.now()}.json`),B=JSON.stringify(A.thread,null,2);await Nf(Q,B,"utf-8"),await zJ(Q),j.info("Thread JSON written and opened in editor",{file:Q});return}catch(Q){return j.error("Failed to write thread JSON or open editor",Q),Error("Failed to write thread JSON or open editor",{cause:Q})}}async function vi4(A){try{let Q=PI.join("/tmp",`amp-thread-${A.thread.id}-${Date.now()}.yaml`),B=p41.default.stringify(A.thread);await Nf(Q,B,"utf-8"),await zJ(Q),j.info("Thread YAML written and opened in editor",{file:Q});return}catch(Q){return j.error("Failed to write thread YAML or open editor",Q),Error("Failed to write thread YAML or open editor",{cause:Q})}}async function yi4(A,Q){if(typeof Q!=="string")return Error("Select a log option from the picker");switch(Q){case"cli-open":{let B=A.logFile;if(!B)return Error("CLI log file is unavailable for this session");let $="less -R +G",J=NG0(process.pid,B,$);try{try{C4.instance.tuiInstance.suspend(),nr(J,{stdio:"inherit"})}finally{process.stdout.write("\x1B[?25l"),C4.instance.tuiInstance.resume()}j.info("Opened filtered CLI logs",{command:J,pid:process.pid,logFile:ar(B),outputCommand:$??null});return}catch(Y){return j.error("Failed to open filtered CLI logs",{error:Y,command:J}),Error("Failed to open filtered CLI logs",{cause:Y})}}case"cloudflare-logs":{await dA(A.context??A.contextFallback,c41(A.thread.id));return}case"cloudflare-data-studio":{await dA(A.context??A.contextFallback,d41(A.thread.id));return}default:return Error(`Unknown log option: ${Q}`)}}async function xi4(A){let Q=n41(A),B=Si4(Q),$=!1;try{await C4.instance.tuiInstance.clipboard.writeText(B),$=!0}catch(J){j.error("Failed to copy debug prompt",{error:J})}return new S2(new TA({child:new T6({markdown:[$?"**Copied Markdown debug prompt to clipboard.**":"**Clipboard copy failed. Select and copy manually.**","",B].join(`
5732
5732
  `)})}),"Debug Prompt","info","help",{width:100,height:28})}function rv5(A){return typeof A==="object"&&A!==null&&"label"in A&&typeof A.label==="string"&&"command"in A&&typeof A.command==="string"}async function fi4(A,Q){if(!rv5(Q))return Error("Select a command from the picker");try{await C4.instance.tuiInstance.clipboard.writeText(Q.command),A.showToast(`Copied: ${Q.label}`,"success")}catch(B){j.error("Failed to copy DTW debug command",{error:B})}}async function bi4(A){return new S2(new TA({child:new T6({markdown:IG0(n41(A))})}),"Thread Diagnostics","info","help",{width:100,height:26})}async function ui4(A,Q){let B=A.logFile;if(!B)return Error("CLI log file is unavailable for this session");let $=i41(Q.description);if($.trim().length===0)return Error("Description is required");let J=Q.images,Y=ar(B),Z=process.pid,F=iv5($)||"debug-package",X=mv5.tmpdir(),D=PI.join(X,`amp-${F}`),G=`${D}.zip`;A.showStatusMessage("Building debug package...");try{nr(`mkdir -p ${D}`);let V=`select(.pid == ${Z})`,U=nr(`cat ${Y} | jq -c '${V}'`,{encoding:"utf-8",maxBuffer:52428800});await Nf(PI.join(D,"cli-logs.json"),U,"utf-8"),await Nf(PI.join(D,"thread.yaml"),p41.default.stringify(A.thread),"utf-8");let K=await av5(D,J),E=ov5($,n41(A),K);await Nf(PI.join(D,"agent-read-this.md"),E,"utf-8"),nr(`zip -j ${G} ${D}/*`),nr(`osascript -e 'set the clipboard to POSIX file "${G}"'`),A.showToast("Debug package copied to clipboard — paste into Slack","success"),j.info("Packaged debug bundle to clipboard",{zipPath:G,packageDir:D,pid:Z,threadId:A.thread.id});return}catch(V){return j.error("Failed to package debug bundle",{error:V}),Error("Failed to package debug bundle",{cause:V})}}K8();var sv5=80,tv5=20,hi4=4,ev5=42,ci4=420,li4=640,Ay5=Math.max(32,RU),gi4="░▒▓█▁▂▃▄▅▆▇∿∾∽≋≈∼",wG0=["▁","▂","▃","▄","▅","▆","▇","█"],Qy5=["▏","▎","▍","▌","▋","▊","▉","█"],By5=["▕","▐","▉","▊","▋","▌","▍","▎"],$y5=W0.symmetric(1,0),Jy5=W0.all(1),Yy5=W0.all(1),Zy5={primary:{r:102,g:102,b:102},secondary:{r:255,g:255,b:255}},Fy5={primary:{r:77,g:0,b:10},secondary:{r:255,g:77,b:95}};function Xy5(A){return{borderShape:A?.borderShape??"notched",borderAnimation:A?.borderAnimation??"subtle",titleAnimation:A?.titleAnimation??"none",timeMs:A?.timeMs,animate:A?.animate,seed:A?.seed??ev5}}function ii4(A){switch(A){case"notched":return Jy5;case"classic":return $y5}}class SA extends N1{props;constructor(A){super();this.props=A}build(A){let Q=T0.of(A),B=t1.of(A),$=this.props.tone??"default",J=Xy5(this.props.visualStyle),Y=this.props.bodyFit??{kind:"shrink"},Z=zy5(this.props,Y,B,J.borderShape),F=Iy5($,Q),X=c1.all(new l1(F.border,1,"rounded")),D=o41(this.props.header,J.borderShape),G=r41(this.props.footer,J.borderShape),V=wy5(D===void 0?this.props.header:void 0,F.header,J),U=Oy5(this.props.child,Y),K=G===void 0?jy5(this.props.footer,Q):new U0({height:0}),E=Y.kind==="fill"?"max":"min",W=typeof this.props.header==="string"?`NeoModal:${this.props.header}`:"NeoModal",z=this.props.autofocus??!0,H=this.props.chromePadding??ii4(J.borderShape),q=D===void 0&&typeof this.props.header==="string"?1:0,N=G===void 0?Dn4(this.props.footer):0,I=new i4({autofocus:z,canRequestFocus:!0,debugLabel:W,onKey:(R)=>{if(R.key==="Escape")return this.props.onDismiss(),"handled";return"ignored"},child:new x0({mainAxisSize:E,crossAxisAlignment:"stretch",children:[V,new U0({height:q}),U,new U0({height:N}),K]})}),C=!(J.borderShape==="notched"||J.borderAnimation!=="none")?new g0({constraints:Z,decoration:new f4(Q.colors.background,X),padding:H,child:I}):Vy5({borderShape:J.borderShape,borderAnimation:J.borderAnimation,child:I,constraints:Z,background:Q.colors.background,borderColor:F.border,tone:$,headerColor:F.header,footerKeyColor:Q.app.keybind,footerHintColor:Q.colors.foreground,padding:H,title:D,footer:G,titleAnimation:J.titleAnimation,seed:J.seed,timeMs:J.timeMs,animate:J.animate}),O=new g0({decoration:new f4(Q.colors.background),padding:Yy5,child:C});return new e4({fit:"expand",children:[new ni4,new v1({onClick:()=>{},opaque:this.props.barrierOpaque??!0,child:U0.expand()}),new r1({child:O})]})}}class ni4 extends $8{createRenderObject(){return new ai4}}class ai4 extends $4{performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=Number.isFinite(A.maxWidth)?A.maxWidth:A.minWidth,B=Number.isFinite(A.maxHeight)?A.maxHeight:A.minHeight;this.setSize(Q,B)}paint(A,Q=0,B=0){let $=Math.floor(Q+this.offset.x),J=Math.floor(B+this.offset.y),Y=A.getSize(),Z=Math.max(0,$),F=Math.max(0,J),X=Math.min(Y.width,$+this.size.width),D=Math.min(Y.height,J+this.size.height);for(let G=F;G<D;G++)for(let V=Z;V<X;V++){let U=A.getCell(V,G);if(!U||Dy5(U))continue;let K={char:U.char,style:{...U.style,dim:!0},width:U.width};if(U.hyperlink!==void 0)K.hyperlink=U.hyperlink;A.setCell(V,G,K)}}}function Dy5(A){return A.char===" "&&A.width===1&&A.hyperlink===void 0&&Gy5(A.style)}function Gy5(A){return A.fg===void 0&&A.bg===void 0&&A.bold===void 0&&A.italic===void 0&&A.underline===void 0&&A.strikethrough===void 0&&A.reverse===void 0&&A.dim===void 0}function o41(A,Q){return Q==="notched"&&typeof A==="string"?A:void 0}function r41(A,Q){if(Q!=="notched")return;if(A===void 0)return[{keys:["Esc"],label:"close"}];if(!CG0(A)||A.length===0)return;return A}function Vy5(A){if(A.timeMs!==void 0)return mi4(A,A.timeMs);if(!(A.animate??Uy5(A)))return mi4(A,0);return new oi4({borderShape:A.borderShape,borderAnimation:A.borderAnimation,child:A.child,constraints:A.constraints,background:A.background,borderColor:A.borderColor,tone:A.tone,headerColor:A.headerColor,footerKeyColor:A.footerKeyColor,footerHintColor:A.footerHintColor,padding:A.padding,title:A.title,footer:A.footer,titleAnimation:A.titleAnimation,seed:A.seed,initialTimeMs:0})}function mi4(A,Q){return new s41({borderShape:A.borderShape,borderAnimation:A.borderAnimation,child:A.child,constraints:A.constraints,background:A.background,borderColor:A.borderColor,tone:A.tone,headerColor:A.headerColor,footerKeyColor:A.footerKeyColor,footerHintColor:A.footerHintColor,padding:A.padding,title:A.title,footer:A.footer,titleAnimation:A.titleAnimation,seed:A.seed,timeMs:Q})}function Uy5(A){return A.titleAnimation!=="none"||A.borderAnimation!=="none"}class oi4 extends v0{props;constructor(A){super();this.props=A}createState(){return new ri4}}class ri4 extends S0{startedAt=Date.now();timer=null;initState(){this.startTimer()}didUpdateWidget(A){if(A.props.borderShape!==this.widget.props.borderShape||A.props.borderAnimation!==this.widget.props.borderAnimation||A.props.seed!==this.widget.props.seed||A.props.title!==this.widget.props.title||A.props.titleAnimation!==this.widget.props.titleAnimation)this.startedAt=Date.now();this.startTimer()}dispose(){this.stopTimer(),super.dispose()}startTimer(){if(this.timer||this.animationComplete())return;this.timer=setInterval(()=>{if(!this.mounted)return;if(this.setState(()=>{}),this.animationComplete())this.stopTimer()},RU),this.timer.unref()}stopTimer(){if(!this.timer)return;clearInterval(this.timer),this.timer=null}animationComplete(){if(this.widget.props.borderAnimation!=="none")return!1;if(this.widget.props.titleAnimation!=="none")return Date.now()-this.startedAt>=Yn4(this.widget.props.titleAnimation);return!0}build(A){return new s41({borderShape:this.widget.props.borderShape,borderAnimation:this.widget.props.borderAnimation,child:this.widget.props.child,constraints:this.widget.props.constraints,background:this.widget.props.background,borderColor:this.widget.props.borderColor,tone:this.widget.props.tone,headerColor:this.widget.props.headerColor,footerKeyColor:this.widget.props.footerKeyColor,footerHintColor:this.widget.props.footerHintColor,padding:this.widget.props.padding,title:this.widget.props.title,footer:this.widget.props.footer,titleAnimation:this.widget.props.titleAnimation,seed:this.widget.props.seed,timeMs:Date.now()-this.startedAt+this.widget.props.initialTimeMs})}}class s41 extends z5{props;constructor(A){super({child:A.child});this.props=A}createRenderObject(){return new a41(this.props)}updateRenderObject(A){N4(A instanceof a41,"unexpected modal surface"),A.update(this.props)}}class a41 extends $4{props;glow;constructor(A){super();this.props=A;this.glow=new j9(A.seed)}update(A){let Q=!this.props.constraints.equals(A.constraints)||this.props.padding!==A.padding;if(A.seed!==this.props.seed)this.glow=new j9(A.seed);if(this.props=A,Q)this.markNeedsLayout();this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=A.enforce(this.props.constraints),B=2+this.props.padding.horizontal,$=2+this.props.padding.vertical,J=new M1(Math.max(0,Q.minWidth-B),Math.max(0,Q.maxWidth-B),Math.max(0,Q.minHeight-$),Math.max(0,Q.maxHeight-$)),Y=this.children[0];if(Y)Y.layout(J),Y.setOffset(1+this.props.padding.left,1+this.props.padding.top);let Z=(Y?.size.width??0)+B,F=(Y?.size.height??0)+$,X=Q.constrain(Z,F);this.setSize(X.width,X.height)}paint(A,Q=0,B=0){let $=Math.floor(Q+this.offset.x),J=Math.floor(B+this.offset.y),Y=Math.floor(this.size.width),Z=Math.floor(this.size.height);if(Y<=0||Z<=0)return;A.fill($,J,Y,Z," ",{bg:this.props.background}),this.paintBorder(A,$,J,Y,Z),super.paint(A,Q,B)}paintBorder(A,Q,B,$,J){if($<2||J<2)return;for(let Y=1;Y<$-1;Y++)this.paintBorderCell(A,Q+Y,B,Y,0,$,J,"top"),this.paintBorderCell(A,Q+Y,B+J-1,Y,J-1,$,J,"bottom");for(let Y=1;Y<J-1;Y++)this.paintBorderCell(A,Q,B+Y,0,Y,$,J,"left"),this.paintBorderCell(A,Q+$-1,B+Y,$-1,Y,$,J,"right");if(this.paintCorner(A,Q,B,0,0,$,J,"top-left"),this.paintCorner(A,Q+$-1,B,$-1,0,$,J,"top-right"),this.paintCorner(A,Q,B+J-1,0,J-1,$,J,"bottom-left"),this.paintCorner(A,Q+$-1,B+J-1,$-1,J-1,$,J,"bottom-right"),this.props.borderShape==="notched")this.paintNotchedLabels(A,Q,B,$,J)}paintBorderCell(A,Q,B,$,J,Y,Z,F){let X=this.sampleBorderIntensity($,J,Y,Z);A.setChar(Q,B,this.borderGlyph(F,X),this.borderStyle(X),1)}paintCorner(A,Q,B,$,J,Y,Z,F){let X=this.sampleBorderIntensity($,J,Y,Z);A.setChar(Q,B,this.cornerGlyph(F,X),this.borderStyle(X),1)}paintNotchedLabels(A,Q,B,$,J){let Y=this.props.title;if(Y){let G=My5(Y,this.props.titleAnimation,this.props.timeMs);this.paintBorderText(A,Q+2,B,` ${G} `,$-4,{fg:this.props.headerColor,bg:this.props.background,bold:!0})}let Z=this.props.footer;if(!Z||J<2)return;let F=si4(Z,{fg:this.props.footerKeyColor,bg:this.props.background},{fg:this.props.footerHintColor,bg:this.props.background,dim:!0}),X=ti4(F),D=Math.max(2,$-X-2);this.paintStyledBorderText(A,Q+D,B+J-1,F,Math.max(0,$-D-2))}paintBorderText(A,Q,B,$,J,Y){this.paintStyledBorderText(A,Q,B,[{text:$,style:Y}],J)}paintStyledBorderText(A,Q,B,$,J){let Y=Q,Z=Ey5($,J);for(let F of Z)A.setChar(Y,B,F.grapheme,F.style,F.width),Y+=F.width}borderGlyph(A,Q){switch(this.props.borderAnimation){case"mysterious-message":return this.mysteriousMessageBorderGlyph(A,Q);case"none":case"subtle":return A==="left"||A==="right"?"│":"─"}}mysteriousMessageBorderGlyph(A,Q){let B=this.mysteriousMessageBorderIndex(Q);if(A==="left")return Qy5[B]??"▏";if(A==="right")return By5[B]??"▕";return wG0[B]??"▁"}mysteriousMessageBorderIndex(A){return Math.max(0,Math.min(wG0.length-1,Math.floor(A*wG0.length)))}mysteriousMessageCornerGlyph(A,Q){let B=this.mysteriousMessageBorderIndex(Q);if(A==="top-left"||A==="top-right")return wG0[B]??"▁";return"█"}cornerGlyph(A,Q){if(this.props.borderAnimation==="mysterious-message")return this.mysteriousMessageCornerGlyph(A,Q);switch(A){case"top-left":return"╭";case"top-right":return"╮";case"bottom-left":return"╰";case"bottom-right":return"╯"}}borderStyle(A){let Q={fg:this.borderColor(A),bg:this.props.background};if(this.props.borderAnimation==="mysterious-message"&&A>0.72)Q.bold=!0;return Q}borderColor(A){switch(this.props.borderAnimation){case"none":return this.props.borderColor;case"subtle":case"mysterious-message":return this.animatedBorderColor(A)}}animatedBorderColor(A){let Q=0.18+or(A)*0.82;switch(this.props.tone){case"default":return nQ(Q,void 0,Zy5);case"warning":return nQ(Q,_M);case"success":return nQ(Q,void 0);case"error":return nQ(Q,void 0,Fy5)}}sampleBorderIntensity(A,Q,B,$){let J=Math.max(1,B*2+$*2-4),Y=Ky5(A,Q,B,$),Z=Y/J,F=this.props.timeMs/1000,X=this.glow.sample(A*1.3+Y*0.07,Q*1.1-F*5,F,1.2),D=(Z-F*0.18%1+1)%1,G=Math.min(D,1-D),V=Math.max(0,1-G/0.085)**2;return or(X*0.58+V*0.54)}}function Ky5(A,Q,B,$){if(Q<=0)return Math.max(0,A);if(A>=B-1)return B-1+Math.max(0,Q);if(Q>=$-1)return B+$-2+Math.max(0,B-1-A);return B*2+$-3+Math.max(0,$-1-Q)}function si4(A,Q,B){let $=[{text:" ",style:B}];return A.forEach((J,Y)=>{if(Y>0)$.push({text:" · ",style:B});J.keys.forEach((Z,F)=>{if(F>0)$.push({text:"/",style:B});$.push({text:Z,style:Q})}),$.push({text:` ${J.label}`,style:B})}),$.push({text:" ",style:B}),$}function ti4(A){return ei4(A).reduce((Q,B)=>Q+B.width,0)}function Ey5(A,Q){if(Q<=0)return[];let B=[],$=0;for(let J of ei4(A)){if($+J.width>Q)return Wy5(B,$,Q,J.style);B.push(J),$+=J.width}return B}function ei4(A){let Q=[];for(let B of A)for(let $ of L4(B.text))Q.push({grapheme:$,style:B.style,width:h6($)});return Q}function Wy5(A,Q,B,$){let Y=h6("…");if(Y>B)return A;let Z=Q;while(A.length>0&&Z+Y>B){let F=A.pop();if(F)Z-=F.width}if(Z+Y<=B)A.push({grapheme:"…",style:$,width:Y});return A}function or(A){return Math.max(0,Math.min(1,A))}function zy5(A,Q,B,$){let J=Math.max(0,B.size.width-hi4),Y=Math.max(0,B.size.height-hi4),Z=Math.max(A.minWidth??0,Hy5(A,$)),F=Math.max(0,Math.min(A.maxWidth??sv5,J));if(Q.kind==="fill"){let G=qy5(A,$),V=Math.max(Q.modalRows,G),U=Math.max(0,Math.min(V,Y));return new M1(Math.min(Z,F),F,U,U)}let X=Math.max(0,Math.min(A.maxHeight??tv5,Y)),D=Math.min(A.minHeight??0,X);return new M1(Math.min(Z,F),F,D,X)}function Hy5(A,Q){if(Q!=="notched")return 0;let B=0,$=o41(A.header,Q);if($)B=Math.max(B,4+d4(` ${$} `));let J=r41(A.footer,Q);if(J)B=Math.max(B,4+ti4(si4(J,{},{})));return B}function qy5(A,Q){let B=A.chromePadding??ii4(Q),$=o41(A.header,Q),J=r41(A.footer,Q),Y=2,Z=A.header===void 0||$!==void 0?0:1,F=$===void 0&&typeof A.header==="string"?1:0,X=J===void 0?Ny5(A.footer):0,D=J===void 0?Dn4(A.footer):0,G=1;return 2+B.top+B.bottom+Z+F+1+D+X}function Ny5(A){if(A===void 0)return 1;if(A==="none")return 0;if(CG0(A))return A.length===0?0:1;return 1}function Iy5(A,Q){switch(A){case"default":return{border:Q.colors.border,header:Q.app.command};case"warning":return{border:Q.colors.warning,header:Q.colors.warning};case"success":return{border:Q.app.toolSuccess,header:Q.app.toolSuccess};case"error":return{border:Q.app.toolError,header:Q.app.toolError}}}function wy5(A,Q,B){if(A===void 0)return new U0({height:0});if(typeof A==="string")return new g0({padding:W0.symmetric(1,0),child:new r1({child:Cy5(A,Q,B)})});return A}function Cy5(A,Q,B){if(B.titleAnimation==="none")return new p({text:new M(A,new v({color:Q,bold:!0}))});let $=B.timeMs??(B.animate===!1?0:void 0);if($!==void 0)return new p({text:Bn4(A,Q,B.titleAnimation,$)});return new An4({title:A,color:Q,animation:B.titleAnimation})}class An4 extends v0{props;constructor(A){super();this.props=A}createState(){return new Qn4}}class Qn4 extends S0{startedAt=Date.now();timer=null;initState(){this.startTimer()}didUpdateWidget(A){if(A.props.title!==this.widget.props.title||A.props.animation!==this.widget.props.animation||A.props.color!==this.widget.props.color)this.startedAt=Date.now();this.startTimer()}dispose(){this.stopTimer(),super.dispose()}startTimer(){if(this.timer||this.widget.props.animation==="none"||this.animationComplete())return;this.timer=setInterval(()=>{if(!this.mounted)return;if(this.setState(()=>{}),this.animationComplete())this.stopTimer()},Ay5),this.timer.unref()}stopTimer(){if(!this.timer)return;clearInterval(this.timer),this.timer=null}animationComplete(){return Date.now()-this.startedAt>=Yn4(this.widget.props.animation)}build(A){return new p({text:Bn4(this.widget.props.title,this.widget.props.color,this.widget.props.animation,Date.now()-this.startedAt)})}}function Bn4(A,Q,B,$){let J=L4(A),Y=new v({color:Q,bold:!0}),Z=new v({color:Q,bold:!0,dim:!0});switch(B){case"none":return new M(A,Y);case"wipe":return new M("",void 0,pi4(J,$n4(J,$),Y,Z));case"scramble":return new M("",void 0,pi4(J,Jn4(J,$),Y,Z))}}function My5(A,Q,B){let $=L4(A);switch(Q){case"none":return A;case"wipe":return $n4($,B).join("");case"scramble":return Jn4($,B).join("")}}function pi4(A,Q,B,$){return Q.map((J,Y)=>{let Z=J===A[Y]?B:$;return new M(J,Z)})}function $n4(A,Q){let B=Zn4(or(Q/ci4)),$=Math.floor(B*(A.length+1));return A.map((J,Y)=>{if(Y<$)return J;if(Y===$)return"▒";return" "})}function Jn4(A,Q){let $=Zn4(or(Q/li4))*(A.length+5),J=Math.floor(Q/45);return A.map((Y,Z)=>{if(or(($-Z)/5)>=1)return Y;return Ly5(Z,J)})}function Ly5(A,Q){return gi4[(A*7+Q*11)%gi4.length]??"░"}function Yn4(A){if(A==="scramble")return li4;return ci4}function Zn4(A){return 1-(1-A)**3}function Oy5(A,Q){let B=Q.kind==="fill"?"tight":"loose";return new W3({fit:B,child:new Fn4({child:A})})}class Fn4 extends z5{constructor({child:A}){super({child:A})}createRenderObject(){return new Xn4}}class Xn4 extends $4{performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=this.children[0];if(Q)Q.layout(A.loosen()),Q.setOffset(0,0);let B=Q?.size.width??0,$=Q?.size.height??0,J=A.constrain(A.hasTightWidth?A.maxWidth:B,A.hasTightHeight?A.maxHeight:$);this.setSize(J.width,J.height)}}function jy5(A,Q){if(A===void 0)return di4([{keys:["Esc"],label:"close"}],Q);if(CG0(A))return A.length===0?new U0({height:0}):di4(A,Q);if(A==="none")return new U0({height:0});return A}function CG0(A){return Array.isArray(A)}function Dn4(A){return A===void 0||CG0(A)&&A.length>0?1:0}function di4(A,Q){let B=new v({color:Q.app.keybind}),$=new v({color:Q.colors.foreground,dim:!0}),J=[];return A.forEach((Y,Z)=>{if(Z>0)J.push(new M(" · ",$));Y.keys.forEach((F,X)=>{if(X>0)J.push(new M("/",$));J.push(new M(F,B))}),J.push(new M(` ${Y.label}`,$))}),new r1({child:p.spans(J)})}function Py5(A){return[{label:"cli: copy tail logs",command:_I("tail",process.pid,{path:A})},{label:"cli: copy logs snapshot",command:_I("snapshot",process.pid,{path:A})},{label:"cli: htop",command:`htop -p ${process.pid}`}]}async function _y5(A,Q){try{await C4.instance.tuiInstance.clipboard.writeText(A.command)}catch(B){j.error("Failed to copy debug command from Neo command palette",{error:B})}finally{Q()}}function Ty5(A,Q){let B=NG0(process.pid,{path:A},"less -R +G");Q();try{C4.instance.tuiInstance.suspend(),Ry5(B,{stdio:"inherit"})}catch($){j.error("Failed to open filtered CLI logs in pager",{error:$,command:B})}finally{process.stdout.write("\x1B[?25l"),C4.instance.tuiInstance.resume()}}function Gn4(A){return[{noun:"debug",verb:"page logs",description:"View CLI logs in pager",status:{type:"enabled"},run:(Q,B,$)=>{Ty5(A,$)}},{noun:"debug",verb:"copy command",description:"Copy debug command to clipboard",status:{type:"enabled"},run:(Q,B,$)=>{Q.pushWithDismiss((J)=>new SA({header:"Debug: Copy Command",minWidth:80,maxWidth:80,autofocus:!1,footer:"none",onDismiss:J,child:new g6({items:Py5(A),getLabel:(Y)=>Y.label,showBorder:!1,onAccept:(Y)=>{_y5(Y,$)},onDismiss:J})}))}}]}var wf="exit-app-key-pressed",Cf="cancel-key-pressed",TI="loading-thread",Mf="previous-thread-reference",Lf="double-enter-steer";class sr extends l4{}class MG0 extends l4{}class LG0 extends l4{}class tr extends l4{visualIndex;constructor(A){super();this.visualIndex=A}}class er extends l4{}class OG0 extends l4{}class As extends l4{}class Of extends l4{}class jf extends l4{}class Qs extends l4{}class Bs extends l4{}class $s extends l4{}class Rf extends l4{}class AQ extends l4{text;successMessage;failureMessage;constructor(A="",Q="Selection copied to clipboard",B="Failed to copy selection"){super();this.text=A;this.successMessage=Q;this.failureMessage=B}}class jG0 extends l4{}class Js extends l4{}class RG0 extends l4{}class PG0 extends l4{}class Ys extends l4{}class Zs extends l4{}class Fs extends l4{}class _G0 extends l4{}class TG0 extends l4{}class SG0 extends l4{}class YR extends l4{}class Xs extends l4{}class t41 extends l4{mode;constructor(A){super();this.mode=A}}C3();s1();var Vn4=process.platform==="win32"?" ":"█",Un4=process.platform==="win32"?"░":"█";class X2 extends v0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:A,controller:Q,getScrollInfo:B,thickness:$=1,trackChar:J=Vn4,thumbChar:Y=Un4,showTrack:Z=!0,thumbColor:F,trackColor:X}){super(A?{key:A}:{});this.controller=Q,this.getScrollInfo=B,this.thickness=$,this.trackChar=J,this.thumbChar=Y,this.showTrack=Z,this.thumbColor=F,this.trackColor=X}createState(){return new Kn4}}class Kn4 extends S0{_dragStartY=null;_dragStartOffset=null;_isOverThumb=!1;_isPositionOverThumb(A){let{totalContentHeight:Q,viewportHeight:B}=this.widget.getScrollInfo(),J=this.context.findRenderObject()?.size.height??0;if(J===0||Q<=B)return!1;let Y=this.widget.getScrollInfo(),Z=Math.min(1,B/Q),F=Math.max(1,J*Z),X=Math.max(0,Math.min(1,Y.scrollOffset/(Q-B))),D=J-F,G=Math.max(0,D*X),V=G+F;return A>=G&&A<=V}_handleHover=(A)=>{let Q=this._isOverThumb;if(this._isOverThumb=this._isPositionOverThumb(A.localPosition.y),Q!==this._isOverThumb)this.setState()};_handleDrag=(A)=>{let{totalContentHeight:Q,viewportHeight:B,scrollOffset:$}=this.widget.getScrollInfo(),Y=this.context.findRenderObject()?.size.height??0;if(Y===0||Q<=B)return;if(this._dragStartY===null)this._dragStartY=A.localPosition.y,this._dragStartOffset=$;let Z=A.localPosition.y-this._dragStartY,F=Math.min(1,B/Q),X=Math.max(1,Y*F),D=Y-X;if(D<=0)return;let G=Q-B,V=D/G,U=Z/V,K=Math.max(0,Math.min(G,this._dragStartOffset+U));this.widget.controller.jumpTo(K)};_handleRelease=()=>{this._dragStartY=null,this._dragStartOffset=null};_handleClick=(A)=>{if(A.button!=="left")return;let Q=A.localPosition.y,{totalContentHeight:B,viewportHeight:$,scrollOffset:J}=this.widget.getScrollInfo(),Z=this.context.findRenderObject()?.size.height??0;if(Z===0||B<=$)return;let F=Math.min(1,$/B),X=Math.max(1,Z*F),D=B-$,G=Z-X,V=Math.max(0,Math.min(1,J/(B-$))),U=Math.max(0,G*V),K=U+X;if(Q>=U&&Q<=K)return;if(Q<U)this.widget.controller.animateTo(Math.max(0,J-$));else this.widget.controller.animateTo(Math.min(D,J+$))};build(A){return new v1({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?a6.POINTER:a6.DEFAULT,child:new En4({controller:this.widget.controller,getScrollInfo:this.widget.getScrollInfo,thickness:this.widget.thickness,trackChar:this.widget.trackChar,thumbChar:this.widget.thumbChar,showTrack:this.widget.showTrack,thumbColor:this.widget.thumbColor,trackColor:this.widget.trackColor})})}}class En4 extends $I{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:A,controller:Q,getScrollInfo:B,thickness:$=1,trackChar:J=Vn4,thumbChar:Y=Un4,showTrack:Z=!0,thumbColor:F,trackColor:X}){super(A?{key:A}:{});this.controller=Q,this.getScrollInfo=B,this.thickness=$,this.trackChar=J,this.thumbChar=Y,this.showTrack=Z,this.thumbColor=F,this.trackColor=X}createRenderObject(){return new Wn4(this)}updateRenderObject(A){A.updateWidget(this)}}class Wn4 extends $4{_widget;constructor(A){super();this._widget=A}updateWidget(A){this._widget=A,this.markNeedsLayout()}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=Math.min(A.maxWidth,this._widget.thickness),B=A.maxHeight;this.setSize(Q,B),super.performLayout()}getMinIntrinsicWidth(A){return this._widget.thickness}getMaxIntrinsicWidth(A){return this._widget.thickness}getMinIntrinsicHeight(A){return 0}getMaxIntrinsicHeight(A){return 0}paint(A,Q,B){let{thumbStartFloat:$,thumbSizeFloat:J,showScrollbar:Y}=this._calculateScrollbarMetrics();if(!Y)return;let Z=this._widget.trackColor,F=this._widget.thumbColor,X=process.platform==="win32",D=$,G=$+J;if(!X){let V=["▁","▂","▃","▄","▅","▆","▇","█"];for(let U=0;U<this.size.height;U++){let K="█",E=!0;if(U===Math.floor(D)){let W=1-(D-U),z=Math.floor(W*8);K=V[z]||"█",E=!1}else if(U===Math.floor(G)){let W=1-(G-U),z=Math.floor(W*8);K=V[z]||"█"}else if(U>D&&U<G)E=!1;A.setChar(Q,B+U,K,{fg:F,bg:Z,reverse:E},1)}return}for(let V=0;V<this.size.height;V++){let U=V+0.5,K=U>=D&&U<G,E=K?this._widget.thumbChar:this._widget.trackChar;A.setChar(Q,B+V,E,{fg:K?F:Z,bg:Z,reverse:!1},1)}}_calculateScrollbarMetrics(){let{totalContentHeight:A,viewportHeight:Q,scrollOffset:B}=this._widget.getScrollInfo(),$=this.size.height;if(A<=Q||$<=0)return{thumbStartFloat:0,thumbSizeFloat:0,showScrollbar:!1};let J=Math.max(0,Math.min(1,B/(A-Q))),Y=Math.min(1,Q/A),Z=Math.max(1,$*Y),F=$-Z;return{thumbStartFloat:Math.max(0,F*J),thumbSizeFloat:Z,showScrollbar:!0}}}var zn4=1;class rY extends v0{props;constructor(A){super();this.props=A}createState(){return new Hn4}}class Hn4 extends S0{ownership;viewportHeight=0;initState(){let A=this.widget.props.controller;if(A)this.ownership={controller:A,owned:!1};else{let Q=new rA;Q.followMode=!1,Q.jumpTo(0),this.ownership={controller:Q,owned:!0}}}didUpdateWidget(A){N4(A.props.controller===this.widget.props.controller,"NeoModalScrollArea.controller identity must be stable across rebuilds")}dispose(){if(this.ownership.owned)this.ownership.controller.dispose()}getScrollInfo=()=>{let{controller:A}=this.ownership,Q=this.viewportHeight;return{totalContentHeight:Math.max(A.maxScrollExtent+Q,0),viewportHeight:Q,scrollOffset:Math.max(A.offset,0)}};setMeasuredHeight=(A)=>{this.viewportHeight=A};build(A){let Q=T0.of(A),{controller:B}=this.ownership;return new qn4({thickness:zn4,onMeasured:this.setMeasuredHeight,scrollable:new TA({controller:B,autofocus:this.widget.props.autofocus??!0,keyboardScrolling:!0,child:this.widget.props.child}),scrollbar:new X2({controller:B,thickness:zn4,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:this.getScrollInfo})})}__testing={isOwned:()=>this.ownership.owned,controller:()=>this.ownership.controller}}class qn4 extends O9{thickness;onMeasured;constructor({scrollable:A,scrollbar:Q,thickness:B,onMeasured:$}){super({children:[A,Q]});this.thickness=B,this.onMeasured=$}createRenderObject(){return new Nn4(this.thickness,this.onMeasured)}}class Nn4 extends $4{thickness;onMeasured;constructor(A,Q){super();this.thickness=A;this.onMeasured=Q}performLayout(){let A=this._lastConstraints;N4(!!A,"ScrollAreaLayoutRenderObject.performLayout called without constraints");let Q=A.maxWidth,B=Math.max(0,Math.min(this.thickness,Q)),$=Q-B,[J,Y]=this.children;N4(J!==void 0&&Y!==void 0,"ScrollAreaLayout requires scrollable and scrollbar children"),J.layout(new M1($,$,0,A.maxHeight)),J.setOffset(0,0);let Z=J.size.height;this.onMeasured(Z),Y.layout(new M1(B,B,Z,Z)),Y.setOffset($,0),this.setSize(Q,Z)}}var In4=10;class e41 extends v0{pluginService;workspaceRoot;logFilePath;onDismiss;constructor(A){super();this.pluginService=A.pluginService,this.workspaceRoot=A.workspaceRoot,this.logFilePath=A.logFilePath,this.onDismiss=A.onDismiss}createState(){return new wn4}}class wn4 extends S0{plugins=[];subscription=null;initState(){this.subscription=this.widget.pluginService.plugins.subscribe((A)=>{this.setState(()=>{this.plugins=A})})}didUpdateWidget(A){if(A.pluginService===this.widget.pluginService)return;this.subscription?.unsubscribe(),this.subscription=this.widget.pluginService.plugins.subscribe((Q)=>{this.setState(()=>{this.plugins=Q})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}relativePath(A){let Q=s0.file(this.widget.workspaceRoot),B=X1.relativePath(Q,OA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return R5(A)}detailPrefix(A){if(A.length===0)return` ${" ".repeat(In4)}`;return` ${`${A}:`.padEnd(In4," ")}`}bunNotFoundExplanation(A,Q){let B=T0.of(A),{app:$,colors:J}=B,Y=new v({color:J.foreground}),Z=new v({color:$.toolError}),F=new v({color:$.link,underline:!0}),X=`${Q} ${W4(Q,"plugin")} could not start because Bun is not installed.`,D="https://ampcode.com/install",G="https://bun.sh",V=(U,K)=>new M(K,F,void 0,OW(U),()=>{dA(A,U)});return new f0({padding:W0.only({left:1,right:1,bottom:1}),child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new p({text:new M(X,Z),maxLines:2,overflow:"ellipsis"}),new p({text:new M(" ",Y)}),new p({text:new M("To run plugins, either ",Y,[V("https://ampcode.com/install","install the Amp binary"),new M(" or ",Y),V("https://bun.sh","install bun"),new M(".",Y)])})]})})}pluginRows(A){let Q=T0.of(A),{app:B,colors:$}=Q,J=new v({color:$.foreground,dim:!0}),Y=new v({color:B.link}),Z=new v({color:B.link,underline:!0});if(this.plugins.length===0)return[new f0({padding:W0.symmetric(1,1),child:new p({text:new M("No plugins found.",J)})})];let F=this.plugins.filter((V)=>V.errorMessage!==null),X=F.length>0&&F.every((V)=>id(V.errorMessage)),G=(X?this.plugins.filter((V)=>!id(V.errorMessage)):this.plugins).map((V)=>{let U=V.uri.toString(),K=U.startsWith("file://"),E=()=>{dA(A,U)},W=V.status==="active"?new v({color:B.toolSuccess}):V.status==="error"?new v({color:B.toolError}):new v({color:$.warning}),z=new p({text:new M(this.relativePath(V.uri),K?Z:new v({color:B.command}),void 0,K?OW(U):void 0,K?E:void 0),maxLines:1,overflow:"ellipsis"}),H=K?new v1({cursor:"pointer",onClick:E,child:z}):z,q=[new t0({children:[new p({text:new M(V.status,W,[new M(" ",J)]),maxLines:1,overflow:"clip"}),new W3({fit:"loose",child:H})]})];if(V.errorMessage)q.push(new p({text:new M(this.detailPrefix("Error"),J,[new M(V.errorMessage,new v({color:B.toolError}))]),maxLines:1,overflow:"ellipsis"}),new p({text:new M(this.detailPrefix(""),J,[new M(`see logs: ${this.widget.logFilePath}`,J)]),maxLines:1,overflow:"ellipsis"}));if(V.registeredEvents.length>0)q.push(new p({text:new M(this.detailPrefix("Events"),J,[new M(V.registeredEvents.join(", "),Y)]),maxLines:1,overflow:"ellipsis"}));for(let[N,I]of V.registeredCommands.entries())q.push(new p({text:new M(N===0?this.detailPrefix("Commands"):this.detailPrefix(""),J,[new M(`${I.category}: ${I.title}`,Y)]),maxLines:1,overflow:"ellipsis"}));for(let[N,I]of V.registeredTools.entries())q.push(new p({text:new M(N===0?this.detailPrefix("Tools"):this.detailPrefix(""),J,[new M(I.name,Y)]),maxLines:1,overflow:"ellipsis"}));return new f0({padding:W0.only({left:1,right:1,bottom:1}),child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:q})})});if(X)G.push(this.bunNotFoundExplanation(A,F.length));return G}build(A){let Q=this.plugins.filter((Y)=>Y.status==="active").length,B=this.plugins.reduce((Y,Z)=>Y+Z.registeredCommands.length,0),$=this.plugins.reduce((Y,Z)=>Y+Z.registeredTools.length,0),J=`${Q}/${this.plugins.length} ${W4(this.plugins.length,"plugin")} active (${B} ${W4(B,"command")}, ${$} ${W4($,"tool")})`;return new SA({header:"Plugins",autofocus:!1,maxWidth:90,maxHeight:30,footer:[{keys:["Esc"],label:"close"},{keys:["↑↓","j/k"],label:"scroll"}],onDismiss:this.widget.onDismiss,child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new f0({padding:W0.only({left:1,right:1,bottom:1}),child:new p({text:new M(J,new v({bold:!0}))})}),new W3({fit:"loose",child:new rY({child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:this.pluginRows(A)})})})]})})}}function Cn4(A){return[{noun:"plugins",verb:"list",description:"List all loaded plugins",keywords:["extensions","tools","commands"],status:{type:"enabled"},run:(Q,B,$)=>{Q.push(new e41({pluginService:A.pluginService,workspaceRoot:A.workspaceRoot,logFilePath:A.logFilePath,onDismiss:$}))}},{noun:"plugins",verb:"reload",description:"Reload all plugins",keywords:["refresh","restart","extensions"],status:{type:"enabled"},run:(Q,B,$)=>{A.pluginService.reload(),A.toastController.show("Reloading plugins..."),$()}}]}c0();class Ds extends l4{}class Pf extends l4{}class AA1 extends v0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new Mn4}}class Mn4 extends S0{build(A){let{options:Q,onConfirm:B,onCancel:$}=this.widget.props,{colors:J}=T0.of(A),Y=Q.message?new p({text:new M(Q.message,new v({color:J.foreground}))}):new U0({height:1});return new SA({header:Q.title,minWidth:64,maxWidth:80,footer:[{keys:["Y"],label:Q.confirmButtonText??"yes"},{keys:["N","Esc"],label:"cancel"},{keys:["↑↓","j/k"],label:"scroll"}],autofocus:!1,onDismiss:$,child:new t4({actions:new Map([[Ds,new D4(()=>B())],[Pf,new D4(()=>$())]]),child:new m5({debugLabel:"NeoConfirmDialogShortcuts",shortcuts:Sy5(),child:new rY({child:Y})})})})}}function Sy5(){return new Map([[T1.key("y"),new Ds],[T1.shift("Y"),new Ds],[T1.shift("y"),new Ds],[T1.key("n"),new Pf],[T1.shift("N"),new Pf],[T1.shift("n"),new Pf],[T1.key("Escape"),new Pf]])}class Gs extends v0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new Ln4}}class Ln4 extends S0{controller=new M8;onTextChanged=()=>{this.setState()};initState(){this.controller.text=this.widget.props.initialValue??"",this.controller.addListener(this.onTextChanged)}dispose(){this.controller.removeListener(this.onTextChanged),this.controller.dispose(),super.dispose()}handleSubmit(){let A=this.controller.text.trim();if((this.widget.props.isRequired??!0)&&A.length===0)return;this.widget.props.onSubmit(A)}build(A){let{colors:Q,app:B}=T0.of(A),Y=!(this.widget.props.isRequired??!0)||this.controller.text.trim().length>0?[{keys:["Enter"],label:"submit"},{keys:["Esc"],label:"cancel"}]:[{keys:["Esc"],label:"cancel"}],Z=[];if(this.widget.props.helpText)Z.push(new p({text:new M(this.widget.props.helpText,new v({color:Q.foreground}))})),Z.push(new U0({height:1}));return Z.push(new t0({children:[new p({text:new M("> ",new v({color:B.command}))}),new _1({child:new oB({controller:this.controller,placeholder:this.widget.props.placeholder??"",autofocus:!0,maxLines:1,style:{textColor:Q.foreground,border:null},onSubmitted:()=>this.handleSubmit()})})]})),new SA({header:this.widget.props.header,minWidth:80,maxWidth:80,footer:Y,autofocus:!1,bodyFit:this.widget.props.bodyFit,onDismiss:this.widget.props.onDismiss,child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:Z})})}}class QA1 extends N1{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}build(A){return new SA({header:this.props.options.title,minWidth:64,maxWidth:80,footer:[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"},{keys:["Esc"],label:"cancel"}],autofocus:!1,onDismiss:this.props.onCancel,child:ky5(this.props)})}}function ky5(A){let Q=A.options.options.map((B)=>({value:B,label:B}));return new J9({options:Q,body:A.options.message,onSelect:(B)=>{if(B===null){A.onCancel();return}A.onSelect(B)},padding:W0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!1})}class BA1{options;unregisterPluginCommands=null;pluginCommandSubscriptions=[];pluginErrorToastKeys=new Set;activeDialog=null;queuedDialogs=[];disposed=!1;constructor(A){this.options=A}init(){this.disposed=!1,this.configurePluginPlatform(),this.subscribePluginCommands()}dispose(){this.disposed=!0,this.unregisterPluginCommands?.(),this.unregisterPluginCommands=null;for(let A of this.pluginCommandSubscriptions)A.unsubscribe();this.pluginCommandSubscriptions=[],this.cancelPendingDialogs()}hasBlockingDialog(){return this.activeDialog!==null}buildDialogLayers(){let A=this.activeDialog;if(!A)return[];switch(A.kind){case"input":return[new Gs({key:new RW(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 AA1({key:new RW(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)})];case"select":return[new QA1({key:new RW(A),options:A.options,onSelect:(Q)=>this.resolveSelectDialog(A,Q),onCancel:()=>this.resolveSelectDialog(A,void 0)})]}}configurePluginPlatform(){let A=this.options.neoContext.pluginPlatform;if(!A)return;A.showToast=(Q)=>this.options.toastController.show(Q,"success"),A.showOpenedURLToast=(Q)=>{this.options.toastController.show(`Opened URL: ${Q}`,"success",8000)},A.appendToThreadHandler=this.options.neoContext.observerOnly?async()=>{throw Error("thread.append is only available from an executor-owned plugin runtime")}:this.options.appendToThread,A.showInputDialog=this.showInputDialog,A.showConfirmDialog=this.showConfirmDialog,A.showSelectDialog=this.showSelectDialog}subscribePluginCommands(){let A=this.options.neoContext.pluginService;if(!A)return;this.refreshPluginCommands(A.commands.list()),this.pluginCommandSubscriptions=[A.plugins.subscribe((Q)=>{this.showNewPluginErrorToasts(Q),this.refreshPluginCommands(A.commands.list())}),A.commands.changed.subscribe(()=>{this.refreshPluginCommands(A.commands.list())})]}refreshPluginCommands(A){this.unregisterPluginCommands?.();let B=A.map(($)=>this.createPluginCommand($)).map(($)=>this.options.commandRegistry.register($));this.unregisterPluginCommands=()=>{for(let $ of B)$()}}showNewPluginErrorToasts(A){let Q=new Set;for(let B of A){if(B.status!=="error")continue;if(id(B.errorMessage))continue;let $=`${B.uri.toString()}
5733
- ${B.errorMessage??""}`;if(Q.add($),this.pluginErrorToastKeys.has($))continue;this.options.toastController.show(this.formatPluginErrorToast(B),"error",8000)}this.pluginErrorToastKeys=Q}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,keywords:["plugin",A.pluginName,A.id],status:{type:"enabled"},run:async(Q,B,$)=>{$();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(J){j.error("Neo plugin command failed",{error:J,command:A}),this.options.toastController.show(J instanceof Error?J.message:String(J),"error",5000)}}}}showInputDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"input",options:A,resolve:Q})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(!1);return}this.enqueueDialog({kind:"confirm",options:A,resolve:Q})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"select",options:A,resolve:Q})})};cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[];for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}enqueueDialog(A){if(this.activeDialog){this.queuedDialogs.push(A);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A})}resolveInputDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveConfirmDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveSelectDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}zl();w2();import{readFile as vy5}from"node:fs/promises";import $A1 from"node:os";async function On4(A,Q){try{return{path:Q,contents:hh0(await vy5(A,"utf8"))}}catch{return null}}async function jn4(A,Q){let B=[],$=await YA.getThread({thread:Q},{config:A.configService}),J=$.ok?$.result.thread.data:null;B.push({path:"thread.json",contents:JSON.stringify(e$(J),null,2)});let Y=await On4(Dx(Q),`logs/${Q}.log`);if(Y)B.push(Y);let Z=await On4(A.settingsFilePath,"settings/global.json");if(Z)B.push(Z);let F=await tN()??"unknown",X=await YA.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778160156-gb2be4b",clientOS:`${$A1.platform()} ${$A1.release()} ${$A1.arch()}`,installMethod:F}},{config:A.configService});if(!X.ok)throw Error(`Failed to submit report: ${X.error.message}`);return X.result.reportID}class JA1{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.backStack.pop();this.forwardStack.push(Q)}}}}c0();G9();w2();async function Rn4(A,Q,B){let $;switch(B){case"private":$="This thread's visibility has been updated to private";break;case"workspace":$="This thread's visibility has been updated to workspace";break;case"group":$="This thread's visibility has been updated to group";break;case"unlisted":$="This thread's visibility has been updated to unlisted. Anyone on the Internet with the link can view it.";break;case"public":$="This thread's visibility has been updated to public. Anyone on the Internet can see it on your public profile, and it is publicly searchable.";break}try{let J=await YA.setThreadMeta({thread:Q,meta:nY(B)},{config:A.configService});if(!J.ok)throw Error(J.error.message);let Y=!1;if(B!=="private"){let F=MB(new URL(A.ampURL),Q).toString();try{await C4.instance.tuiInstance.clipboard.writeText(F),Y=!0}catch(X){j.error("Failed to copy thread URL after visibility update",{error:X})}}let Z=Y?`${$} Link copied to clipboard.`:$;return new aQ(Z)}catch(J){let Y=J instanceof Error?J.message:String(J);if(Y.includes("no-workspace"))return Error("You are not a member of any workspace.");if(Y.includes("groups-disabled"))return Error("The groups feature is not enabled for this workspace.");if(Y.includes("no-groups"))return Error("You are not a member of any groups.");return j.error("Unexpected failure to update thread visibility",{error:J}),Error(`Failed to update thread visibility for ${Q}`)}}class kG0 extends z5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new YA1(this.offstage)}updateRenderObject(A){if(A instanceof YA1)A.offstage=this.offstage}}class YA1 extends $4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class ZA1{_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 FA1 extends v0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Pn4}}class Pn4 extends S0{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 Mj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new Mj,B=this.makeScopedDismiss(Q),$=A(B);this.setState(()=>{this.entries.push({key:Q,widget:$,dismiss:B})})}pop(){if(this.entries.length===0)return!1;return this.setState(()=>{this.entries.pop()}),!0}get canPop(){return this.entries.length>0}makeScopedDismiss(A){return()=>{if(!this.mounted)return;let Q=this.entries[this.entries.length-1];if(!Q||Q.key!==A)return;this.setState(()=>{this.entries.pop()})}}build(A){let Q=[];Q.push(new kG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new i4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new kG0({key:$.key,offstage:!J,child:Y}))}return new e4({fit:"expand",children:Q})}}class DA1 extends N1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=yy5(Q);return new SA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:W0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new g6({items:Q,showBorder:!1,getLabel:($)=>{let J=XA1($);return $.keywords&&$.keywords.length>0?`${J} ${$.keywords.join(" ").toLowerCase()}`:J},sortItems:($,J,Y)=>{if(Y===""){let G=$.item.status.type==="disabled"?1:0,V=J.item.status.type==="disabled"?1:0;if(G!==V)return G-V;let U=$.item.sortBoost??0,K=J.item.sortBoost??0;if(U!==K)return K-U;let E=$.item.noun?.toLowerCase()??"",W=J.item.noun?.toLowerCase()??"";if(E!==W)return E<W?-1:1;return 0}let Z=pj($.item.verb.toLowerCase(),Y),F=pj(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=pj(XA1($.item),Y),D=pj(XA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=T0.of(J);return new p({text:new M($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new _n4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class _n4 extends N1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=T0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new M(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new M(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new M(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),W=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)W.push({child:xy5(Q.shortcut,Z,$)});return new Tn4({columns:W,padding:W0.horizontal(1),backgroundColor:D})}}function XA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function yy5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,d4(B.noun)):Q},0)}function xy5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new M(" ",Y));Z.push(new M(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new M(" ",Y));return Z.push(new M(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class Tn4 extends N1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let F=0;F<Q.length;F++){let X=Q[F];if(F>0&&B>0)Y.push(new U0({width:B}));if(X.fixedWidth!==void 0)Y.push(new U0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new _1({child:X.child}));else Y.push(X.child)}let Z=new t0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new g0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class GA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#B(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#B()}}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class sY extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=sY.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(sY)?.commandRegistry??null}}class VA1 extends v0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Sn4}}class Sn4 extends S0{modalStack=new ZA1;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=sY.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=sY.of(A).commands,B=new DA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new FA1({root:B,controller:this.modalStack})}}var UA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]},{input:"S",keys:["Alt"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],KA1=[{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 vG0 extends N1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=t1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new f0({padding:W0.only({left:4}),child:X})]});else D=new t0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new U0({width:1}),new _1({flex:1,child:X})]});Y.push(new f0({padding:W0.horizontal(6),child:D}))}return new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class EA1 extends v0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new kn4}}class kn4 extends S0{scrollController;initState(){this.scrollController=new rA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=R1.of(A).colorScheme,J=T0.of(A).app,Y=t1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,W=K-4,z=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let R=O.noun?.toLowerCase();return R!=="dev"&&R!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,R)=>{let S=(O.noun??"").toLowerCase(),T=(R.noun??"").toLowerCase(),f=S.localeCompare(T);if(f!==0)return f;let h=O.verb.toLowerCase(),x=R.verb.toLowerCase(),k=h.localeCompare(x);if(k!==0)return k;return O.id.localeCompare(R.id)}),I=new TA({autofocus:!0,controller:this.scrollController,child:new g0({constraints:new M1(z,z,0,Number.POSITIVE_INFINITY),child:new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new r1({child:new p({text:new M(`Amp CLI - Help & Keyboard Shortcuts
5733
+ ${B.errorMessage??""}`;if(Q.add($),this.pluginErrorToastKeys.has($))continue;this.options.toastController.show(this.formatPluginErrorToast(B),"error",8000)}this.pluginErrorToastKeys=Q}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,keywords:["plugin",A.pluginName,A.id],status:{type:"enabled"},run:async(Q,B,$)=>{$();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(J){j.error("Neo plugin command failed",{error:J,command:A}),this.options.toastController.show(J instanceof Error?J.message:String(J),"error",5000)}}}}showInputDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"input",options:A,resolve:Q})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(!1);return}this.enqueueDialog({kind:"confirm",options:A,resolve:Q})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"select",options:A,resolve:Q})})};cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[];for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}enqueueDialog(A){if(this.activeDialog){this.queuedDialogs.push(A);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A})}resolveInputDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveConfirmDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveSelectDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}zl();w2();import{readFile as vy5}from"node:fs/promises";import $A1 from"node:os";async function On4(A,Q){try{return{path:Q,contents:hh0(await vy5(A,"utf8"))}}catch{return null}}async function jn4(A,Q){let B=[],$=await YA.getThread({thread:Q},{config:A.configService}),J=$.ok?$.result.thread.data:null;B.push({path:"thread.json",contents:JSON.stringify(e$(J),null,2)});let Y=await On4(Dx(Q),`logs/${Q}.log`);if(Y)B.push(Y);let Z=await On4(A.settingsFilePath,"settings/global.json");if(Z)B.push(Z);let F=await tN()??"unknown",X=await YA.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778185482-gf00656",clientOS:`${$A1.platform()} ${$A1.release()} ${$A1.arch()}`,installMethod:F}},{config:A.configService});if(!X.ok)throw Error(`Failed to submit report: ${X.error.message}`);return X.result.reportID}class JA1{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.backStack.pop();this.forwardStack.push(Q)}}}}c0();G9();w2();async function Rn4(A,Q,B){let $;switch(B){case"private":$="This thread's visibility has been updated to private";break;case"workspace":$="This thread's visibility has been updated to workspace";break;case"group":$="This thread's visibility has been updated to group";break;case"unlisted":$="This thread's visibility has been updated to unlisted. Anyone on the Internet with the link can view it.";break;case"public":$="This thread's visibility has been updated to public. Anyone on the Internet can see it on your public profile, and it is publicly searchable.";break}try{let J=await YA.setThreadMeta({thread:Q,meta:nY(B)},{config:A.configService});if(!J.ok)throw Error(J.error.message);let Y=!1;if(B!=="private"){let F=MB(new URL(A.ampURL),Q).toString();try{await C4.instance.tuiInstance.clipboard.writeText(F),Y=!0}catch(X){j.error("Failed to copy thread URL after visibility update",{error:X})}}let Z=Y?`${$} Link copied to clipboard.`:$;return new aQ(Z)}catch(J){let Y=J instanceof Error?J.message:String(J);if(Y.includes("no-workspace"))return Error("You are not a member of any workspace.");if(Y.includes("groups-disabled"))return Error("The groups feature is not enabled for this workspace.");if(Y.includes("no-groups"))return Error("You are not a member of any groups.");return j.error("Unexpected failure to update thread visibility",{error:J}),Error(`Failed to update thread visibility for ${Q}`)}}class kG0 extends z5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new YA1(this.offstage)}updateRenderObject(A){if(A instanceof YA1)A.offstage=this.offstage}}class YA1 extends $4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class ZA1{_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 FA1 extends v0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Pn4}}class Pn4 extends S0{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 Mj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new Mj,B=this.makeScopedDismiss(Q),$=A(B);this.setState(()=>{this.entries.push({key:Q,widget:$,dismiss:B})})}pop(){if(this.entries.length===0)return!1;return this.setState(()=>{this.entries.pop()}),!0}get canPop(){return this.entries.length>0}makeScopedDismiss(A){return()=>{if(!this.mounted)return;let Q=this.entries[this.entries.length-1];if(!Q||Q.key!==A)return;this.setState(()=>{this.entries.pop()})}}build(A){let Q=[];Q.push(new kG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new i4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new kG0({key:$.key,offstage:!J,child:Y}))}return new e4({fit:"expand",children:Q})}}class DA1 extends N1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=yy5(Q);return new SA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:W0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new g6({items:Q,showBorder:!1,getLabel:($)=>{let J=XA1($);return $.keywords&&$.keywords.length>0?`${J} ${$.keywords.join(" ").toLowerCase()}`:J},sortItems:($,J,Y)=>{if(Y===""){let G=$.item.status.type==="disabled"?1:0,V=J.item.status.type==="disabled"?1:0;if(G!==V)return G-V;let U=$.item.sortBoost??0,K=J.item.sortBoost??0;if(U!==K)return K-U;let E=$.item.noun?.toLowerCase()??"",W=J.item.noun?.toLowerCase()??"";if(E!==W)return E<W?-1:1;return 0}let Z=pj($.item.verb.toLowerCase(),Y),F=pj(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=pj(XA1($.item),Y),D=pj(XA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=T0.of(J);return new p({text:new M($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new _n4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class _n4 extends N1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=T0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new M(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new M(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new M(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),W=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)W.push({child:xy5(Q.shortcut,Z,$)});return new Tn4({columns:W,padding:W0.horizontal(1),backgroundColor:D})}}function XA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function yy5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,d4(B.noun)):Q},0)}function xy5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new M(" ",Y));Z.push(new M(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new M(" ",Y));return Z.push(new M(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class Tn4 extends N1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let F=0;F<Q.length;F++){let X=Q[F];if(F>0&&B>0)Y.push(new U0({width:B}));if(X.fixedWidth!==void 0)Y.push(new U0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new _1({child:X.child}));else Y.push(X.child)}let Z=new t0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new g0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class GA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#B(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#B()}}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class sY extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=sY.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(sY)?.commandRegistry??null}}class VA1 extends v0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Sn4}}class Sn4 extends S0{modalStack=new ZA1;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=sY.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=sY.of(A).commands,B=new DA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new FA1({root:B,controller:this.modalStack})}}var UA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]},{input:"S",keys:["Alt"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],KA1=[{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 vG0 extends N1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=t1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new f0({padding:W0.only({left:4}),child:X})]});else D=new t0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new U0({width:1}),new _1({flex:1,child:X})]});Y.push(new f0({padding:W0.horizontal(6),child:D}))}return new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class EA1 extends v0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new kn4}}class kn4 extends S0{scrollController;initState(){this.scrollController=new rA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=R1.of(A).colorScheme,J=T0.of(A).app,Y=t1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,W=K-4,z=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let R=O.noun?.toLowerCase();return R!=="dev"&&R!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,R)=>{let S=(O.noun??"").toLowerCase(),T=(R.noun??"").toLowerCase(),f=S.localeCompare(T);if(f!==0)return f;let h=O.verb.toLowerCase(),x=R.verb.toLowerCase(),k=h.localeCompare(x);if(k!==0)return k;return O.id.localeCompare(R.id)}),I=new TA({autofocus:!0,controller:this.scrollController,child:new g0({constraints:new M1(z,z,0,Number.POSITIVE_INFINITY),child:new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new r1({child:new p({text:new M(`Amp CLI - Help & Keyboard Shortcuts
5734
5734
  `,Z)})}),new U0({height:1}),new f0({padding:W0.horizontal(2),child:new p({text:new M(`Editor Shortcuts
5735
5735
  `,F)})}),new vG0({items:UA1.filter((O)=>O.submitOnEnterOnly===void 0||O.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(O)=>{let R=[];for(let T of O.methods){let f=this.buildCleanKeyCombination(T);R.push(f)}let S=R.join(", ");return[new p({text:new M(S,X)}),new p({text:new M(O.description,G)})]}}),new U0({height:1}),new f0({padding:W0.horizontal(2),child:new p({text:new M(`Scrolling & Navigation
5736
5736
  `,F)})}),new vG0({items:KA1,renderRow:(O)=>{let R=[];for(let T of O.methods){let f=this.buildCleanKeyCombination(T);R.push(f)}let S=R.join(", ");return[new p({text:new M(S,X)}),new p({text:new M(O.description,G)})]}}),new U0({height:1}),new f0({padding:W0.horizontal(2),child:new p({text:new M(`Command Palette Commands
@@ -5830,7 +5830,7 @@ Ctrl-X, Y, Z to unlock`;if(E){let a=G.text.replace(/`([^`]+)`/g,"$1")+`
5830
5830
  `))}function kh5(A,Q){let{colors:B,app:$}=Q;switch(A){case"pending":return{icon:"◌",color:B.warning};case"registered":return{icon:"•",color:B.mutedForeground};case"failed":return{icon:"✗",color:$.toolError};case"duplicate":return{icon:"◇",color:B.warning};default:return{icon:"?",color:B.foreground}}}function $s4(A,Q){let B=A.replace(/\s+/g," ").trim();if(d4(B)<=Q)return B;let $="...",J=d4($);if(Q<=J)return hF($,Q);return`${hF(B,Q-J,!0,"")}${$}`}var a61="https://ampcode.com/news/neo",o61=[{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:a61,href:a61},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}];function vh5(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:a61,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function yh5(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var uf=50,VR=40,i61=1000,xh5=420,fh5=760,bh5=-250,uh5=1100,GV0=33,Fs4=0.999,hh5=2.1,gh5=720,mh5=420,Ws4="Meet the new",zs4="Amp",Hs4="CLI",r61=L4(Ws4).length,ph5=L4(zs4).length,dh5=L4(Hs4).length,VV0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Xs4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},Ds4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},Gs4=[VV0,Xs4,Ds4,VV0,Xs4,Ds4,VV0],ch5=VV0;class s61 extends v0{onDismiss;onQuit;animationProgress;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??yh5(),this.introStages=this.variant==="npm-migration"?vh5(this.binaryInstallCommand):o61,this.dismissible=this.variant!=="npm-migration"}createState(){return new qs4}}class qs4 extends S0{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=i61;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 j9(42);initState(){super.initState(),this.startAnimationIfNeeded()}didUpdateWidget(A){if(super.didUpdateWidget(A),A.animationProgress!==this.widget.animationProgress)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=tY(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Fs4,this.firstStageHintVisible=this.animationProgress>=Fs4,this.firstStageTitleRevealProgress=this.firstStageTitleVisible?1:0,this.firstStageHintRevealProgress=this.firstStageHintVisible?1:0;return}if(this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0,this.startProgressAnimation({from:0,to:1,durationMs:i61,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;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=tY(A/fh5);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},GV0)}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.setState(()=>{this.previousIntroStage=null,this.stageTransitionProgress=1});return}this.setState(()=>{this.stageTransitionProgress=0}),this.stageTransitionTimer=setInterval(()=>{let B=performance.now()-this.stageTransitionStartedAt,$=tY(B/xh5);if(this.setState(()=>{if(this.stageTransitionProgress=$,$>=1)this.previousIntroStage=null}),$>=1)this.stopStageTransitionTimer()},GV0)}startProgressAnimation({from:A,to:Q,durationMs:B,onComplete:$}){this.stopAnimation(),this.startedAt=performance.now(),this.animationStartProgress=A,this.animationTargetProgress=Q,this.animationDurationMs=B,this.onAnimationComplete=$,this.animationProgress=A,this.animationTimer=setInterval(()=>{let J=performance.now()-this.startedAt,Y=tY(J/this.animationDurationMs),Z=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*hf(Y);if(this.setState(()=>{this.animationProgress=Z}),Y>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},GV0)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null}stopStageTransitionTimer(){if(this.stageTransitionTimer)clearInterval(this.stageTransitionTimer),this.stageTransitionTimer=null}startFirstStageRevealSequence(){this.stopFirstStageRevealTimers(),this.setState(()=>{this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0});let A=Math.max(0,i61+bh5),Q=A+uh5;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?tY((A-this.firstStageTitleRevealStartedAt)/gh5):this.firstStageTitleRevealProgress,B=this.firstStageHintRevealStartedAt?tY((A-this.firstStageHintRevealStartedAt)/mh5):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=B}),Q>=1&&B>=1)this.stopFirstStageRevealTimer()},GV0)}stopFirstStageRevealTimers(){if(this.stopFirstStageRevealTimer(),this.firstStageTitleRevealStartedAt=null,this.firstStageHintRevealStartedAt=null,this.firstStageTitleTimer)clearTimeout(this.firstStageTitleTimer),this.firstStageTitleTimer=null;if(this.firstStageHintTimer)clearTimeout(this.firstStageHintTimer),this.firstStageHintTimer=null}stopFirstStageRevealTimer(){if(this.firstStageRevealTimer)clearInterval(this.firstStageRevealTimer),this.firstStageRevealTimer=null}stopDismissAnimation(){if(this.dismissTimer)clearInterval(this.dismissTimer),this.dismissTimer=null}currentOrbPalette(){let A=Vs4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:Us4(Vs4(this.previousIntroStage),A,hf(this.stageTransitionProgress));return this.dismissProgress>0?Us4(Q,ch5,hf(this.dismissProgress)):Q}build(A){let Q=R1.of(A).colorScheme,B=T0.of(A),$=this.currentOrbPalette(),J=nQ(1,"frontier",$),Y=t1.of(A).size,F=this.widget.animationProgress??this.animationProgress,X=Math.max(Y.width/uf,Y.height/VR)*hh5,D=X+(1-X)*F,G=hf(this.dismissProgress),V=Math.max(uf,Math.round(uf*D)),U=Math.max(VR,Math.round(VR*D)),K=Math.round((Y.width-V)/2),E=Math.round((Y.height-U)/2),W=Math.max(0,Math.floor((Y.width-uf)/2)),z=-Math.floor(VR/2),H=Math.round(K+(W-K)*F),q=Math.round(E+(z-E)*F),N=H+V/2,I=q+U/2,w=lh5({dismissProgress:this.dismissProgress,easedDismissProgress:G,introOrbScale:D,normalOrbCenterX:N,normalOrbCenterY:I,size:Y}),C=Math.max(uf,Math.round(uf*w.orbScale)),O=Math.max(VR,Math.round(VR*w.orbScale)),R=w.orbCenterX,S=w.orbCenterY,T=Math.round(R-C/2),f=Math.round(S-O/2),h=Math.max(3,Math.min(Y.height-5,Math.floor(VR/2)+2)),x=Math.max(h+3,Y.height-3),k=w.textDissolveProgress,b=this.isFinalIntroStage()?w.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&k<1,l=c&&this.firstStageHintVisible,g=l&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),i=this.introStage===0?this.firstStageTitleRevealProgress:1,d=this.introStage===0?this.firstStageHintRevealProgress:1,Q0=Math.max(24,Math.min(74,Y.width-4)),H0=Math.min(12,Math.max(8,Y.height-h-6)),a=Math.max(0,Math.floor((Y.width-Q0)/2)),I0=Math.max(0,Math.min(Y.height-H0,Math.floor(Y.height*0.55-H0/2))),_0=this.widget.animationProgress!==void 0?new kx({width:C,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new kx({width:C,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new i4({autofocus:!0,canRequestFocus:!0,debugLabel:"NeoWelcomeTakeover",onKey:(B0)=>{if(B0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&B0.key==="c"&&B0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&B0.key==="q")return this.widget.onQuit?.(),"handled";if((B0.key===" "||B0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(B0.key==="Escape"||B0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(B0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(B0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new e4({fit:"expand",children:[new Ns4({color:Q.background,dissolveProgress:b}),new e4({fit:"expand",children:[new v1({onClick:()=>{},child:U0.expand()}),new WA({left:T,top:f,width:C,height:O,child:_0}),...c?[new WA({left:a,top:I0,width:Q0,height:H0,child:nh5({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:Q0,height:H0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:J,link:B.app.link,keybind:B.app.keybind,titleRevealProgress:i,dissolveProgress:k,context:A})})]:[],...l?[...g?[new WA({left:a,top:Math.max(0,x-1),width:Q0,height:1,child:new p({text:eh5({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:k}),textAlign:"center"})})]:[],new WA({left:a,top:x,width:Q0,height:1,child:Qg5({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:B.app.keybind,revealProgress:d,dissolveProgress:k,context:A})})]:[]]})]})})}}class Ns4 extends $8{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new Is4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class Is4 extends $4{color;dissolveProgress;constructor(A,Q){super();this.color=A,this.dissolveProgress=Q}update(A,Q){this.color=A,this.dissolveProgress=Q,this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,B=0){let $=Math.floor(Q+this.offset.x),J=Math.floor(B+this.offset.y),Y=Math.floor(this.size.width),Z=Math.floor(this.size.height),F={bg:this.color},X=tY(this.dissolveProgress);if(X<=0){A.fill($,J,Y,Z," ",F);return}if(X>=1)return;for(let D=0;D<Z;D++)for(let G=0;G<Y;G++)if(!ih5(G,D,Y,Z,X))A.fill($+G,J+D,1,1," ",F)}}function tY(A){return Math.min(1,Math.max(0,A))}function hf(A){return 1-(1-A)**3}function Vs4(A){return Gs4[A]??Gs4[0]}function Us4(A,Q,B){return{primary:Lj(A.primary,Q.primary,B),secondary:Lj(A.secondary,Q.secondary,B)}}function lh5({dismissProgress:A,easedDismissProgress:Q,introOrbScale:B,normalOrbCenterX:$,normalOrbCenterY:J,size:Y}){return{orbScale:B+(B*0.86-B)*Q,orbCenterX:$+(Y.width*0.54-$)*Q,orbCenterY:J-Y.height*0.44*Q,textDissolveProgress:tY(A/0.52),backdropDissolveProgress:hf(tY((A-0.12)/0.88))}}function ih5(A,Q,B,$,J){let Y=$<=1?0:Q/($-1),Z=ws4(A+Q*Math.max(1,B));return(1-Y)*0.72+Z*0.28<J}function nh5({introStages:A,stage:Q,previousStage:B,progress:$,direction:J,width:Y,height:Z,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E}){if(B===null||$>=1)return n61({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E});let W=hf($),z=J*Math.round((1-W)*Y),H=-J*Math.round(W*Y);return new SW(new e4({fit:"expand",children:[new WA({left:H,top:0,width:Y,height:Z,child:n61({introStages:A,stage:B,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:B===0?1:U,dissolveProgress:K,context:E})}),new WA({left:z,top:0,width:Y,height:Z,child:n61({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E})})]}))}function n61({introStages:A,stage:Q,foreground:B,mutedForeground:$,accent:J,link:Y,keybind:Z,titleRevealProgress:F,dissolveProgress:X,context:D}){let G=A[Q]??A[0]??o61[0],V=new v({color:J,bold:!0}),U=new v({color:B}),K=A===o61&&Q===0,E=[...G.title===null?[]:[new p({text:K?UV0(rh5({progress:F,foreground:J,pulseColor:J}),X):new M(Q$(G.title,X),V),textAlign:"center"})],...G.body.length>0?[ah5()]:[],...G.body.map((W)=>oh5(W,U,$,Y,Z,X,D))];return new r1({child:new f0({padding:W0.horizontal(1),child:new x0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:E})})})}function ah5(){return U0.height(1)}function oh5(A,Q,B,$,J,Y,Z){if(typeof A==="string")return new p({text:new M(Q$(A,Y),Q),textAlign:"center"});if("codeBlock"in A)return new Q3({onCopy:(F,X)=>{if(X)J5.success(Z,"Copied to clipboard",2000)},child:new x0({mainAxisSize:"min",children:A.codeBlock.map((F)=>new p({text:new M(Q$(F,Y),new v({color:J})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let F=new p({text:new M("",void 0,[new M(Q$(A.text,Y),new v({color:B,dim:!0})),new M(Q$(A.keybind,Y,L4(A.text).length),new v({color:J}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new r1({child:new Q3({child:F})});return F}if("highlightText"in A){let F=GA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=mD.of(Z),D=new M("",void 0,[new M(A.text,Q),new M(A.highlightText,new v({color:J})),new M(A.textAfterHighlight,Q),new M(F.text,F.style,F.children,F.hyperlink,()=>{dA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new M(A.textAfter,Q)]);return new p({text:UV0(D,Y),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new x0({mainAxisSize:"min",children:[new p({text:new M(Q$(A.text,Y),Q),textAlign:"center"}),new r1({child:new t0({mainAxisSize:"min",children:[GA.createWidget(Z,A.href,Q$(A.linkText,Y),new v({color:$,underline:!0})),new p({text:new M(Q$(A.textAfter,Y),Q)})]})})]});let F=GA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=mD.of(Z),D=new M("",void 0,[new M(A.text,Q),new M(F.text,F.style,F.children,F.hyperlink,()=>{dA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new M(A.textAfter,Q)]);return new p({text:UV0(D,Y),textAlign:"center"})}if(Y>0)return new p({text:new M(Q$(A.text,Y),new v({color:$,underline:!0})),textAlign:"center"});return new r1({child:GA.createWidget(Z,A.href,A.text,new v({color:$,underline:!0}))})}function rh5({progress:A,foreground:Q,pulseColor:B}){let $=new v({color:Q,bold:!0}),J=new v({color:th5({progress:A,foreground:Q,pulseColor:B}),bold:!0});return new M("",void 0,[new M(sh5(A).padEnd(r61," "),$),new M(" ",$),new M(Ks4(zs4,ph5,A,0.72),$),new M(" ",$),new M(Ks4(Hs4,dh5,A,0.88),J)])}function sh5(A){let Q=L4(Ws4),B=Math.min(r61,Math.ceil(tY(A/0.62)*r61));return Q.slice(0,B).join("")}function Ks4(A,Q,B,$){return B>=$?A:"".padEnd(Q," ")}function th5({progress:A,foreground:Q,pulseColor:B}){if(A<0.88||A>=1)return Q;let $=tY((A-0.88)/0.12);return Math.cos($*Math.PI*4)*(1-$)>0.12?B:Q}function eh5({stage:A,featureStageCount:Q,foreground:B,dissolveProgress:$}){return new M(Q$(`${A}/${Q}`,$),new v({color:B,dim:!0}))}function Ag5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}){let Z=new v({color:$}),F=new v({color:B,dim:!0}),X=Q?A?"Enter":"Space":"Esc",D=Q?A?" to get started":" to continue":" to quit, or use ",G=Q?"":"amp --take-me-back",V=Q?"":" to use the old version",U=`${D}${G}${V}`;if(!Q)return new M("",void 0,[new M(X,Z),new M(D,F),new M(G,Z),new M(V,F)]);let K=Es4(X,J),E=Es4(U,tY((J*(L4(X).length+L4(U).length)-L4(X).length)/L4(U).length));return new M("",void 0,[new M(Q$(K,Y),Z),new M(Q$(E.slice(0,D.length),Y),F),new M(Q$(E.slice(D.length,D.length+G.length),Y),Z),new M(Q$(E.slice(D.length+G.length),Y),F)])}function Qg5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y,context:Z}){if(Q)return new p({text:Ag5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}),textAlign:"center"});let F=new v({color:$}),X=new v({color:B,dim:!0});return new Q3({onCopy:(D,G)=>{if(G)J5.success(Z,"Copied to clipboard",2000)},child:new p({text:new M("",void 0,[new M("q",F),new M(" to quit, or use ",X),new M("amp --take-me-back",F),new M(" to use the old version",X)]),textAlign:"center",selectable:!0})})}function Es4(A,Q){let B=L4(A),$=Math.min(B.length,Math.ceil(tY(Q)*B.length));return B.slice(0,$).join("").padEnd(B.length," ")}function UV0(A,Q,B=0){if(Q<=0)return A;let $=B+L4(A.text??"").length,J=A.children?.map((Y)=>{let Z=UV0(Y,Q,$);return $+=L4(Y.toPlainText()).length,Z});return new M(A.text?Q$(A.text,Q,B):A.text,A.style,J,A.hyperlink,A.onClick)}function Q$(A,Q,B=0){if(Q<=0)return A;return L4(A).map((J,Y)=>{if(J.trim()==="")return J;return ws4(B+Y)<Q?" ":J}).join("")}function ws4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}c0();w2();function mI(A,Q){let{colors:B,dim:$}=Q,J=[];if(A.totalCostUSD===null)return J;let Y=A.costBreakdown,Z=Y?.freeUSD??0,F=Y?.paidUSD??0;if(Z===0&&F===0)return J;let D={decimalPlaces:"more-if-tiny",intent:"cost"};if(F===0)J.push(new M(mU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new M(" (free)",new v({color:B.foreground,dim:$})));else if(Z>0)J.push(new M(mU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new M(" (free)",new v({color:B.foreground,dim:$}))),J.push(new M(" + ",new v({color:B.foreground,dim:$}))),J.push(new M(mU(F,D),new v({color:B.foreground,dim:$,bold:!$})));else J.push(new M(mU(F,D),new v({color:B.foreground,dim:$,bold:!$})));return J}class t61 extends l4{}class e61 extends l4{}function Bg5(A,Q){if(Q.code==="auth-required")return"You must be logged in to view thread usage. Run `amp login` first.";if(Q.code==="thread-not-found")return`Thread ${A} not found.`;return`Failed to load thread usage: ${Q.message??Q.code}`}function $g5(A,Q){let B=T0.of(Q),{colors:$}=B,J=mI(A,{colors:{foreground:$.foreground}}),Y=[];if(J.length>0)Y.push(new M("Total: ",new v({color:$.mutedForeground}))),Y.push(...J);else if(A.totalCostUSD===null)Y.push(new M("Usage information is currently unavailable."));else Y.push(new M("No usage recorded for this thread yet."));if(A.costBreakdownURL)Y.push(new M(`
5831
5831
 
5832
5832
  `)),Y.push(new M("Details: ",new v({color:$.mutedForeground}))),Y.push(new M(A.costBreakdownURL,new v({color:B.app.link})));return new p({text:new M("",void 0,Y)})}function Jg5(A,Q,B){let $=$g5(A,Q);if(!A.costBreakdownURL)return new SA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new D4(()=>{return t4.maybeInvoke(Q,new AQ(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new D4(()=>{return dA(Q,J),"handled"});return new SA({header:"Thread Cost",minWidth:80,maxWidth:100,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["o"],label:"open in browser"},{keys:["y"],label:"copy url"}],onDismiss:B,child:new t4({actions:new Map([[t61,Y],[e61,Z]]),child:new m5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[T1.key("o"),new e61],[T1.key("y"),new t61]]),child:new m4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Cs4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["usage","credits","billing","spend"],get status(){return A.getActiveThreadID()?{type:"enabled"}:{type:"disabled",reason:"No active thread"}},run:async(Q,B,$)=>{let J=A.getActiveThreadID();if(!J)return;try{let Y=await YA.threadDisplayCostInfo({threadID:J},{config:A.configService});if(!Y.ok){A.toastController.show(Bg5(J,Y.error),"error",5000),$();return}Q.push(Jg5(Y.result,B,$))}catch(Y){j.error("Failed to load Neo thread cost",{error:Y,threadID:J}),A.toastController.show(`Failed to show thread cost: ${Y instanceof Error?Y.message:String(Y)}`,"error",5000),$()}}}}var Yg5=250,Zg5=2000;function Fg5({ampURL:A,threadID:Q,logPath:B}){return[`Debug thread ${MB(new URL(A),Q).toString()} (cli log: ${B}). Start with the CLI log, actor logs, and Rivet DB/inspector as sources of truth. Read thread-actors/docs/debugging-actors.md and thread-actors/scripts/README.md. For dev, actor logs are in .amp/in/thread-actors.json.log; for staging/prod, logs are in gcloud.`,"","Problem: "].join(`
5833
- `)}class A51 extends v0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;onThreadArchived;initialUserInput;openThreadPickerOnStart;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.onThreadArchived=A.onThreadArchived,this.initialUserInput=A.initialUserInput,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.neoContext=A.neoContext}createState(){return new Ls4}}class Ls4 extends S0{editorController=new M8;commandPalette=new Jr(this);commandRegistry=new GA1;toastController=new le0;exitHintTimer=new ox(this,1000);ideStatus=new u8(this,{});threadNavigationHistory=new JA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;titleSubscription=null;agentStateSubscription=null;currentTitleText=void 0;currentAgentBusy=!1;currentTerminalTitle=void 0;terminalTitleSpinner=new H6;terminalTitleSpinnerTimer=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;configReloadSubscription=null;configReloadToastTimer=null;pendingConfigReloadToastType=null;lastConfigReloadToast=null;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>jn4({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);setThreadVisibility=(A,Q)=>{return Rn4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService},A,Q)};archiveThread=async(A)=>{let Q=await Rd4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Pd4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};removeThreadLabel=async(A,Q)=>{let B=await _d4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(nB.getInstance().interceptConsole(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configReloadSubscription=this.widget.configService.configReloadEvents.subscribe((Q)=>this.scheduleConfigReloadToast(Q)),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(v30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new BA1({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread}),this.pluginIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=C4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}scheduleConfigReloadToast(A){if(this.pendingConfigReloadToastType=this.pendingConfigReloadToastType==="failed"||A.type==="failed"?"failed":"succeeded",this.configReloadToastTimer)clearTimeout(this.configReloadToastTimer);this.configReloadToastTimer=setTimeout(()=>{this.flushConfigReloadToast()},Yg5),this.configReloadToastTimer.unref()}flushConfigReloadToast(){let A=this.pendingConfigReloadToastType;if(this.pendingConfigReloadToastType=null,this.configReloadToastTimer=null,!A)return;let Q=Date.now();if(this.lastConfigReloadToast?.type===A&&Q-this.lastConfigReloadToast.shownAt<Zg5)return;switch(this.lastConfigReloadToast={type:A,shownAt:Q},A){case"succeeded":this.toastController.show("Config reloaded","success",1500);break;case"failed":this.toastController.show("Config reload failed","error",5000);break}}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Cn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>eA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:Z}))}},{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(J,Y,Z)=>{A.navigateBack(),Z()}},Cs4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(J,Y,Z)=>{A.navigateForward(),Z()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new jA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:Z}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(J)=>{J.pushWithDismiss((Y)=>new l61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await dA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{zJ(this.widget.neoContext.settingsFilePath).catch((J)=>{j.error("Failed to open settings file in editor",{error:J})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains","editor","attach"],status:{type:"enabled"},run:(J,Y,Z)=>{J.pushWithDismiss((F)=>new LA1({onCancel:F,onSelect:(X)=>{this.handleIdeSelection(X),Z()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new WA1({commands:sY.of(Y).commands,onDismiss:Z}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(J,Y,Z)=>{Z(),A.showNeoWelcome()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new SA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new M(ue0({version:"0.0.1778160156-gb2be4b",buildTimestamp:"2026-05-07T13:26:26.632Z",buildType:"'release'"}))})}))}},{noun:"amp",verb:"reconnect",description:"Disconnect and reconnect the active thread",keywords:["connection","disconnect","socket","debug"],get status(){return A.activeThreadContext?.client.getThreadId()?{type:"enabled"}:{type:"disabled",reason:"Cannot use amp: reconnect with no active thread"}},run:(J,Y,Z)=>{A.reconnectActiveThread(),Z()}},{noun:"amp",verb:"disconnect",description:"Disconnect the active thread without reconnecting",keywords:["connection","socket","debug","dev"],get status(){return A.activeThreadContext?.client.getThreadId()?{type:"enabled"}:{type:"disabled",reason:"Cannot use amp: disconnect with no active thread"}},run:(J,Y,Z)=>{A.disconnectActiveThread(),Z()}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:T1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{t4.maybeInvoke(Y,new Rf)}},...Q,...Gn4(this.widget.neoContext.logFilePath)].map((J)=>this.commandRegistry.register(J));return()=>{for(let J of $)J()}}build(A){let Q=this.buildHints(),B=this.ideStatus.getValue(),$=new c61({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,setThreadVisibility:this.setThreadVisibility,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B}),J=t1.of(A),Z=[new g0({constraints:M1.tight(J.size.width,J.size.height),child:$})];if(this.commandPalette.isEnabled())Z.push(new i4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new VA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Z.push(eA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)Z.push(new i4({debugLabel:"NeoWelcomeDialogOverlay",child:new s61({onDismiss:this.dismissNeoWelcome,onQuit:()=>C4.instance.stop(),variant:this.widget.neoWelcomeVariant})}));if(Z.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Z.push(new CA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:ys.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Z.push(new MA1);return new _3({neoContext:this.widget.neoContext,child:new sY({commandRegistry:this.commandRegistry,child:new SI({completionBuilder:this.widget.completionBuilder,child:new J5({controller:this.toastController,child:new t4({actions:this.buildActions(),child:new m5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[T1.ctrl("c"),new OG0],[T1.ctrl("o"),new jG0],[T1.alt("i"),new PG0],[T1.alt("p"),new VI],[T1.ctrl("t"),new _G0]]),child:new m4({debugLabel:"AppShellFocus",child:new ie0({controller:this.toastController,child:new e4({children:Z})})})})})})})})})}buildActions(){let A=new D4(()=>{if(WJ.hasAnyCopyableSelection())return WJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new D4(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new D4(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new D4(()=>{return this.startNewDraftThread(),"handled"}),J=new D4(()=>{return C4.instance.stop(),"handled"}),Y=new D4((U)=>{if(!U.text)return"ignored";return C4.instance.tuiInstance.clipboard.writeText(U.text).then(()=>{this.toastController.show(U.successMessage,"success",2000)}).catch((K)=>{j.error("Failed to copy Neo text to clipboard",{error:K}),this.toastController.show(U.failureMessage,"error",2000)}),"handled"}),Z=new D4(()=>{return C4.instance.toggleFrameStatsOverlay(),"handled"}),F=new D4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),X=new D4(()=>{let U=this.activeThreadContext?.client.getThreadId();if(!U)return this.toastController.show("No active thread","error",2000),"handled";let K=Dx(U);return C4.instance.tuiInstance.clipboard.writeText(K).then(()=>{this.toastController.show("Copied log path to clipboard","success",2000)}).catch((E)=>{j.error("Failed to copy thread log path",{error:E,threadID:U,logPath:K}),this.toastController.show("Failed to copy log path","error",2000)}),"handled"}),D=new D4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";let U=this.activeThreadContext?.client.getThreadId();if(!U)return"handled";return this.prepareThreadIssueInvestigation(U),"handled"}),G=new D4(()=>{let U=this.activeThreadContext?.client.getThreadId();if(!U)return this.toastController.show("No active thread","error",2000),"handled";return this.toastController.show("Sending report...","success",2000),this.sendFeedbackReport(U).then(async(K)=>{try{await C4.instance.tuiInstance.clipboard.writeText(K),this.toastController.show("Sent report and copied report ID","success",3000)}catch(E){j.warn("Failed to copy report ID to clipboard",{error:E,reportID:K}),this.toastController.show(`Sent report ${K}`,"success",3000)}}).catch((K)=>{j.error("Failed to send report from debug overlay",{error:K,threadID:U}),this.toastController.show("Failed to send report","error",3000)}),"handled"}),V=new D4(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[OG0,A],[Qs,$],[Rf,J],[AQ,Y],[Js,B],[jG0,Q],[PG0,F],[Ys,X],[Zs,D],[Fs,G],[VI,Z],[_G0,V]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.titleSubscription?.unsubscribe(),this.titleSubscription=null,this.agentStateSubscription?.unsubscribe(),this.agentStateSubscription=null,this.currentAgentBusy=!1,this.syncTerminalTitleSpinner(),this.clearTerminalTitle(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),A.prompt!==void 0)this.editorController.text=A.prompt}prepareThreadIssueInvestigation(A){try{this.startNewDraftThread({prompt:Fg5({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:Dx(A)}),hideDebugOverlay:!0})}catch(Q){j.error("Failed to prepare thread issue investigation",{error:Q,threadID:A})}}closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await hx(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){j.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.neoContext.sessionAgentMode,B=A,$=aB(Q),J=fX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return xX0(B,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=Ms4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(bZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ms4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(TI);if(this.exitHintTimer.isActive())A.add(wf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),C4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,B=null,$)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),Y=A.find((F)=>F.type==="text");if(Y&&Y.type==="text")this.widget.history.add(Y.text,ys.cwd()),this.widget.history.reset();let Z=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,B?nY(B):void 0);this.sendUserMessage(Z,A,Q,$),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(Z)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let B=Q["reasoning.effort"];if(B!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:B};let $=aB(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};EJ((Y)=>{let Z={...Y,agentMode:A};if(B!==void 0)Z={...Z,lastReasoningEffortByMode:{...Z.lastReasoningEffortByMode??{},[A]:B}};if(J!==void 0)Z={...Z,lastSpeedByMode:{...Z.lastSpeedByMode??{},[A]:J}};return Z}).catch((Y)=>{j.warn("Failed to persist Neo session defaults for new message",{error:Y instanceof Error?Y.message:String(Y)})})}sendUserMessage(A,Q,B,$){let J=OY0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}async reconnectActiveThread(){let A=this.activeThreadContext;if(!A){this.toastController.show("No active thread to reconnect","error",2000);return}let Q=A.client.getThreadId(),B=this.toastController.show(Q?`Reconnecting ${Q}...`:"Reconnecting thread...","warning",60000);try{await A.client.reconnect(),this.toastController.update(B,Q?`Reconnected ${Q}`:"Reconnected thread","success",2000)}catch($){j.error("Failed to reconnect thread",{error:$,threadID:Q});let J=$ instanceof Error?$.message:String($);this.toastController.update(B,`Reconnect failed: ${J}`,"error",4000)}}async disconnectActiveThread(){let A=this.activeThreadContext;if(!A){this.toastController.show("No active thread to disconnect","error",2000);return}let Q=A.client.getThreadId(),B=this.toastController.show(Q?`Disconnecting ${Q}...`:"Disconnecting thread...","warning",60000);try{await A.client.disconnectAndWait(),this.toastController.update(B,Q?`Disconnected ${Q}`:"Disconnected thread","success",2000)}catch($){j.error("Failed to disconnect thread",{error:$,threadID:Q});let J=$ instanceof Error?$.message:String($);this.toastController.update(B,`Disconnect failed: ${J}`,"error",4000)}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q},this.subscribeTitleUpdates(Q),this.subscribeNotifications(Q)})}subscribeTitleUpdates(A){this.titleSubscription?.unsubscribe(),this.titleSubscription=A.title().subscribe({next:(Q)=>{this.currentTitleText=Q,this.updateTerminalTitle()}}),this.agentStateSubscription?.unsubscribe(),this.agentStateSubscription=A.agentState().subscribe({next:(Q)=>{let B=wA1(Q);if(B===this.currentAgentBusy)return;this.currentAgentBusy=B,this.syncTerminalTitleSpinner(),this.updateTerminalTitle()}})}subscribeNotifications(A){this.widget.notificationService.attach(A.agentState())}clearTerminalTitle(){this.currentTitleText=void 0,this.updateTerminalTitle()}updateTerminalTitle(){let A=ys.cwd().replace(ys.env.HOME||"","~"),Q=this.currentAgentBusy?`${this.terminalTitleSpinner.toBraille()} `:"",B=this.currentTitleText?`${Q}amp - ${this.currentTitleText} - ${A}`:this.currentAgentBusy?`${Q}amp - ${A}`:"";if(B===this.currentTerminalTitle)return;this.currentTerminalTitle=B,ys.stdout.write(BI(B))}syncTerminalTitleSpinner(){if(this.currentAgentBusy){if(this.terminalTitleSpinnerTimer)return;this.terminalTitleSpinnerTimer=setInterval(()=>{this.terminalTitleSpinner.step(),this.updateTerminalTitle()},200);return}if(this.terminalTitleSpinnerTimer)clearInterval(this.terminalTitleSpinnerTimer),this.terminalTitleSpinnerTimer=null}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.titleSubscription?.unsubscribe(),this.agentStateSubscription?.unsubscribe(),this.agentStateSubscription=null,this.terminalTitleSpinnerTimer)clearInterval(this.terminalTitleSpinnerTimer),this.terminalTitleSpinnerTimer=null;if(this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.configReloadSubscription?.unsubscribe(),this.configReloadSubscription=null,this.configReloadToastTimer)clearTimeout(this.configReloadToastTimer),this.configReloadToastTimer=null;this.pendingConfigReloadToastType=null,this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.neoWelcomeVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function Ms4(A,Q,B){let $={...A};for(let J of Xg5(Q,B)){if(!bZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function Xg5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function Os4(A,Q,B,$){let J=rT(A),Y="\x1B[0m",Z="\x1B[34m",F="\x1B[90m",X="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new pY(G,V),K=new j9(42),E=new YI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(M1.tight(G,V)),E.paint(U,0,0);let W=U.getBuffer().getCells(),z=0;for(let R=0;R<V;R++)if(W[R].some((S)=>S.char!==" ")){z=R;break}let H=V-1;for(let R=V-1;R>=0;R--)if(W[R].some((S)=>S.char!==" ")){H=R;break}function q(R,S){if(!R)return"";if(R.type==="rgb"){let{r:T,g:f,b:h}=R.value;if(B.getColorDepth()>=24)return`\x1B[${S?38:48};2;${T};${f};${h}m`;let x=wj(T,f,h);return`\x1B[${S?38:48};5;${x}m`}return""}let N=[];if(H>=z)for(let R=z;R<=H;R++){let S="";for(let T=0;T<G;T++){let f=W[R][T],h=f.char,x=q(f.style.fg,!0);S+=x+h+"\x1B[0m"}N.push(S)}let I=N.length,w=Math.max(I,D.length),C=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let R=0;R<w;R++){let S=" ".repeat(G);if(R>=C&&R<C+I)S=N[R-C];let T=" ",f="";if(R>=O&&R<O+D.length)f=D[R-O];B.write(S+T+f+`
5833
+ `)}class A51 extends v0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;onThreadArchived;initialUserInput;openThreadPickerOnStart;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.onThreadArchived=A.onThreadArchived,this.initialUserInput=A.initialUserInput,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.neoContext=A.neoContext}createState(){return new Ls4}}class Ls4 extends S0{editorController=new M8;commandPalette=new Jr(this);commandRegistry=new GA1;toastController=new le0;exitHintTimer=new ox(this,1000);ideStatus=new u8(this,{});threadNavigationHistory=new JA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;titleSubscription=null;agentStateSubscription=null;currentTitleText=void 0;currentAgentBusy=!1;currentTerminalTitle=void 0;terminalTitleSpinner=new H6;terminalTitleSpinnerTimer=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;configReloadSubscription=null;configReloadToastTimer=null;pendingConfigReloadToastType=null;lastConfigReloadToast=null;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>jn4({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);setThreadVisibility=(A,Q)=>{return Rn4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService},A,Q)};archiveThread=async(A)=>{let Q=await Rd4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Pd4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};removeThreadLabel=async(A,Q)=>{let B=await _d4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(nB.getInstance().interceptConsole(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configReloadSubscription=this.widget.configService.configReloadEvents.subscribe((Q)=>this.scheduleConfigReloadToast(Q)),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(v30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new BA1({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread}),this.pluginIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=C4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}scheduleConfigReloadToast(A){if(this.pendingConfigReloadToastType=this.pendingConfigReloadToastType==="failed"||A.type==="failed"?"failed":"succeeded",this.configReloadToastTimer)clearTimeout(this.configReloadToastTimer);this.configReloadToastTimer=setTimeout(()=>{this.flushConfigReloadToast()},Yg5),this.configReloadToastTimer.unref()}flushConfigReloadToast(){let A=this.pendingConfigReloadToastType;if(this.pendingConfigReloadToastType=null,this.configReloadToastTimer=null,!A)return;let Q=Date.now();if(this.lastConfigReloadToast?.type===A&&Q-this.lastConfigReloadToast.shownAt<Zg5)return;switch(this.lastConfigReloadToast={type:A,shownAt:Q},A){case"succeeded":this.toastController.show("Config reloaded","success",1500);break;case"failed":this.toastController.show("Config reload failed","error",5000);break}}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Cn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>eA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:Z}))}},{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(J,Y,Z)=>{A.navigateBack(),Z()}},Cs4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(J,Y,Z)=>{A.navigateForward(),Z()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new jA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:Z}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(J)=>{J.pushWithDismiss((Y)=>new l61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await dA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{zJ(this.widget.neoContext.settingsFilePath).catch((J)=>{j.error("Failed to open settings file in editor",{error:J})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains","editor","attach"],status:{type:"enabled"},run:(J,Y,Z)=>{J.pushWithDismiss((F)=>new LA1({onCancel:F,onSelect:(X)=>{this.handleIdeSelection(X),Z()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new WA1({commands:sY.of(Y).commands,onDismiss:Z}))}},{noun:"amp",verb:"show welcome",description:"Show the welcome message again",keywords:["intro","onboarding","getting started"],status:{type:"enabled"},run:(J,Y,Z)=>{Z(),A.showNeoWelcome()}},{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["about","release","build"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new SA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new M(ue0({version:"0.0.1778185482-gf00656",buildTimestamp:"2026-05-07T20:28:26.630Z",buildType:"'release'"}))})}))}},{noun:"amp",verb:"reconnect",description:"Disconnect and reconnect the active thread",keywords:["connection","disconnect","socket","debug"],get status(){return A.activeThreadContext?.client.getThreadId()?{type:"enabled"}:{type:"disabled",reason:"Cannot use amp: reconnect with no active thread"}},run:(J,Y,Z)=>{A.reconnectActiveThread(),Z()}},{noun:"amp",verb:"disconnect",description:"Disconnect the active thread without reconnecting",keywords:["connection","socket","debug","dev"],get status(){return A.activeThreadContext?.client.getThreadId()?{type:"enabled"}:{type:"disabled",reason:"Cannot use amp: disconnect with no active thread"}},run:(J,Y,Z)=>{A.disconnectActiveThread(),Z()}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:T1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{t4.maybeInvoke(Y,new Rf)}},...Q,...Gn4(this.widget.neoContext.logFilePath)].map((J)=>this.commandRegistry.register(J));return()=>{for(let J of $)J()}}build(A){let Q=this.buildHints(),B=this.ideStatus.getValue(),$=new c61({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,setThreadVisibility:this.setThreadVisibility,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B}),J=t1.of(A),Z=[new g0({constraints:M1.tight(J.size.width,J.size.height),child:$})];if(this.commandPalette.isEnabled())Z.push(new i4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new VA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Z.push(eA1({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)Z.push(new i4({debugLabel:"NeoWelcomeDialogOverlay",child:new s61({onDismiss:this.dismissNeoWelcome,onQuit:()=>C4.instance.stop(),variant:this.widget.neoWelcomeVariant})}));if(Z.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Z.push(new CA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:ys.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Z.push(new MA1);return new _3({neoContext:this.widget.neoContext,child:new sY({commandRegistry:this.commandRegistry,child:new SI({completionBuilder:this.widget.completionBuilder,child:new J5({controller:this.toastController,child:new t4({actions:this.buildActions(),child:new m5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[T1.ctrl("c"),new OG0],[T1.ctrl("o"),new jG0],[T1.alt("i"),new PG0],[T1.alt("p"),new VI],[T1.ctrl("t"),new _G0]]),child:new m4({debugLabel:"AppShellFocus",child:new ie0({controller:this.toastController,child:new e4({children:Z})})})})})})})})})}buildActions(){let A=new D4(()=>{if(WJ.hasAnyCopyableSelection())return WJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new D4(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new D4(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new D4(()=>{return this.startNewDraftThread(),"handled"}),J=new D4(()=>{return C4.instance.stop(),"handled"}),Y=new D4((U)=>{if(!U.text)return"ignored";return C4.instance.tuiInstance.clipboard.writeText(U.text).then(()=>{this.toastController.show(U.successMessage,"success",2000)}).catch((K)=>{j.error("Failed to copy Neo text to clipboard",{error:K}),this.toastController.show(U.failureMessage,"error",2000)}),"handled"}),Z=new D4(()=>{return C4.instance.toggleFrameStatsOverlay(),"handled"}),F=new D4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),X=new D4(()=>{let U=this.activeThreadContext?.client.getThreadId();if(!U)return this.toastController.show("No active thread","error",2000),"handled";let K=Dx(U);return C4.instance.tuiInstance.clipboard.writeText(K).then(()=>{this.toastController.show("Copied log path to clipboard","success",2000)}).catch((E)=>{j.error("Failed to copy thread log path",{error:E,threadID:U,logPath:K}),this.toastController.show("Failed to copy log path","error",2000)}),"handled"}),D=new D4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";let U=this.activeThreadContext?.client.getThreadId();if(!U)return"handled";return this.prepareThreadIssueInvestigation(U),"handled"}),G=new D4(()=>{let U=this.activeThreadContext?.client.getThreadId();if(!U)return this.toastController.show("No active thread","error",2000),"handled";return this.toastController.show("Sending report...","success",2000),this.sendFeedbackReport(U).then(async(K)=>{try{await C4.instance.tuiInstance.clipboard.writeText(K),this.toastController.show("Sent report and copied report ID","success",3000)}catch(E){j.warn("Failed to copy report ID to clipboard",{error:E,reportID:K}),this.toastController.show(`Sent report ${K}`,"success",3000)}}).catch((K)=>{j.error("Failed to send report from debug overlay",{error:K,threadID:U}),this.toastController.show("Failed to send report","error",3000)}),"handled"}),V=new D4(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[OG0,A],[Qs,$],[Rf,J],[AQ,Y],[Js,B],[jG0,Q],[PG0,F],[Ys,X],[Zs,D],[Fs,G],[VI,Z],[_G0,V]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.titleSubscription?.unsubscribe(),this.titleSubscription=null,this.agentStateSubscription?.unsubscribe(),this.agentStateSubscription=null,this.currentAgentBusy=!1,this.syncTerminalTitleSpinner(),this.clearTerminalTitle(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),A.prompt!==void 0)this.editorController.text=A.prompt}prepareThreadIssueInvestigation(A){try{this.startNewDraftThread({prompt:Fg5({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:Dx(A)}),hideDebugOverlay:!0})}catch(Q){j.error("Failed to prepare thread issue investigation",{error:Q,threadID:A})}}closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await hx(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){j.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.neoContext.sessionAgentMode,B=A,$=aB(Q),J=fX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return xX0(B,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=Ms4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(bZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ms4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(TI);if(this.exitHintTimer.isActive())A.add(wf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),C4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,B=null,$)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),Y=A.find((F)=>F.type==="text");if(Y&&Y.type==="text")this.widget.history.add(Y.text,ys.cwd()),this.widget.history.reset();let Z=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,B?nY(B):void 0);this.sendUserMessage(Z,A,Q,$),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(Z)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let B=Q["reasoning.effort"];if(B!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:B};let $=aB(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};EJ((Y)=>{let Z={...Y,agentMode:A};if(B!==void 0)Z={...Z,lastReasoningEffortByMode:{...Z.lastReasoningEffortByMode??{},[A]:B}};if(J!==void 0)Z={...Z,lastSpeedByMode:{...Z.lastSpeedByMode??{},[A]:J}};return Z}).catch((Y)=>{j.warn("Failed to persist Neo session defaults for new message",{error:Y instanceof Error?Y.message:String(Y)})})}sendUserMessage(A,Q,B,$){let J=OY0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}async reconnectActiveThread(){let A=this.activeThreadContext;if(!A){this.toastController.show("No active thread to reconnect","error",2000);return}let Q=A.client.getThreadId(),B=this.toastController.show(Q?`Reconnecting ${Q}...`:"Reconnecting thread...","warning",60000);try{await A.client.reconnect(),this.toastController.update(B,Q?`Reconnected ${Q}`:"Reconnected thread","success",2000)}catch($){j.error("Failed to reconnect thread",{error:$,threadID:Q});let J=$ instanceof Error?$.message:String($);this.toastController.update(B,`Reconnect failed: ${J}`,"error",4000)}}async disconnectActiveThread(){let A=this.activeThreadContext;if(!A){this.toastController.show("No active thread to disconnect","error",2000);return}let Q=A.client.getThreadId(),B=this.toastController.show(Q?`Disconnecting ${Q}...`:"Disconnecting thread...","warning",60000);try{await A.client.disconnectAndWait(),this.toastController.update(B,Q?`Disconnected ${Q}`:"Disconnected thread","success",2000)}catch($){j.error("Failed to disconnect thread",{error:$,threadID:Q});let J=$ instanceof Error?$.message:String($);this.toastController.update(B,`Disconnect failed: ${J}`,"error",4000)}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q},this.subscribeTitleUpdates(Q),this.subscribeNotifications(Q)})}subscribeTitleUpdates(A){this.titleSubscription?.unsubscribe(),this.titleSubscription=A.title().subscribe({next:(Q)=>{this.currentTitleText=Q,this.updateTerminalTitle()}}),this.agentStateSubscription?.unsubscribe(),this.agentStateSubscription=A.agentState().subscribe({next:(Q)=>{let B=wA1(Q);if(B===this.currentAgentBusy)return;this.currentAgentBusy=B,this.syncTerminalTitleSpinner(),this.updateTerminalTitle()}})}subscribeNotifications(A){this.widget.notificationService.attach(A.agentState())}clearTerminalTitle(){this.currentTitleText=void 0,this.updateTerminalTitle()}updateTerminalTitle(){let A=ys.cwd().replace(ys.env.HOME||"","~"),Q=this.currentAgentBusy?`${this.terminalTitleSpinner.toBraille()} `:"",B=this.currentTitleText?`${Q}amp - ${this.currentTitleText} - ${A}`:this.currentAgentBusy?`${Q}amp - ${A}`:"";if(B===this.currentTerminalTitle)return;this.currentTerminalTitle=B,ys.stdout.write(BI(B))}syncTerminalTitleSpinner(){if(this.currentAgentBusy){if(this.terminalTitleSpinnerTimer)return;this.terminalTitleSpinnerTimer=setInterval(()=>{this.terminalTitleSpinner.step(),this.updateTerminalTitle()},200);return}if(this.terminalTitleSpinnerTimer)clearInterval(this.terminalTitleSpinnerTimer),this.terminalTitleSpinnerTimer=null}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){if(this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.titleSubscription?.unsubscribe(),this.agentStateSubscription?.unsubscribe(),this.agentStateSubscription=null,this.terminalTitleSpinnerTimer)clearInterval(this.terminalTitleSpinnerTimer),this.terminalTitleSpinnerTimer=null;if(this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.configReloadSubscription?.unsubscribe(),this.configReloadSubscription=null,this.configReloadToastTimer)clearTimeout(this.configReloadToastTimer),this.configReloadToastTimer=null;this.pendingConfigReloadToastType=null,this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.neoWelcomeVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function Ms4(A,Q,B){let $={...A};for(let J of Xg5(Q,B)){if(!bZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function Xg5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function Os4(A,Q,B,$){let J=rT(A),Y="\x1B[0m",Z="\x1B[34m",F="\x1B[90m",X="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new pY(G,V),K=new j9(42),E=new YI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,E0.default(),K);E.layout(M1.tight(G,V)),E.paint(U,0,0);let W=U.getBuffer().getCells(),z=0;for(let R=0;R<V;R++)if(W[R].some((S)=>S.char!==" ")){z=R;break}let H=V-1;for(let R=V-1;R>=0;R--)if(W[R].some((S)=>S.char!==" ")){H=R;break}function q(R,S){if(!R)return"";if(R.type==="rgb"){let{r:T,g:f,b:h}=R.value;if(B.getColorDepth()>=24)return`\x1B[${S?38:48};2;${T};${f};${h}m`;let x=wj(T,f,h);return`\x1B[${S?38:48};5;${x}m`}return""}let N=[];if(H>=z)for(let R=z;R<=H;R++){let S="";for(let T=0;T<G;T++){let f=W[R][T],h=f.char,x=q(f.style.fg,!0);S+=x+h+"\x1B[0m"}N.push(S)}let I=N.length,w=Math.max(I,D.length),C=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let R=0;R<w;R++){let S=" ".repeat(G);if(R>=C&&R<C+I)S=N[R-C];let T=" ",f="";if(R>=O&&R<O+D.length)f=D[R-O];B.write(S+T+f+`
5834
5834
  `)}if($)B.write(`
5835
5835
  \x1B[90m${$}\x1B[0m
5836
5836
  `)}c0();iX0();var Dg5=2000;function js4(A){let Q=!0,B=!0,$=A.configService.config.subscribe((V)=>{Q=V.settings["notifications.enabled"]??!0,B=V.settings["notifications.system.enabled"]!==!1}),J=0,Y=(V)=>{if(!Q)return;let U=Date.now();if(U-J<Dg5)return;if(J=U,Pj())return;if(nF0())aF0();else GZ0(V)},Z=(V)=>{if(!Q||!B)return;if(Pj()&&!oo()&&!_x())return;process.stdout.write(SD(`\x1B]777;notify;Amp;${V}\x1B\\`))},F=null,X=null,D=()=>{F?.unsubscribe(),F=null,X=null};return{attach:(V)=>{D(),F=V.subscribe({next:(U)=>{try{let K=X!==null&&cB(X),E=X==="awaiting_approval";if(U==="awaiting_approval"&&!E)Y("requires-user-input"),Z("Waiting for approval");else if((U==="idle"||U==="error")&&(K||E))Y("idle"),Z("Agent is ready")}catch(K){j.debug("Neo notification handling failed",{error:K})}finally{X=U}},error:(U)=>{j.debug("Neo notification agent state stream errored",{error:U})}})},detach:D,unsubscribe(){D(),$.unsubscribe()}}}function Gg5({initialUserInput:A,showNeoWelcome:Q,neoWelcomeVariant:B,neoWelcomeDismissed:$}){if(B==="npm-migration")return{show:!0,markDismissedOnDismiss:!1};if(Q)return{show:!0,markDismissedOnDismiss:!0};let J=!A&&!$;return{show:J,markDismissedOnDismiss:J}}async function Vg5(A){await EJ((Q)=>hX0(Q,A,"interactive"))}async function Rs4(A,Q={}){let{initialThreadID:B,initialUserInput:$,openThreadPickerOnStart:J=!1,observerOnly:Y=!1,initialAgentMode:Z,initialReasoningEffort:F,showNeoWelcome:X=!1,neoWelcomeVariant:D="intro"}=Q,G=D==="npm-migration",V=async(C)=>{let O=await A.getThreadFromServer(C);if(!O)return null;return kF0(O)},U=async(C)=>{let O=await A.getThreadFromServer(C);if(!O)throw Error(`Thread ${C} not found`);let R=await hY(C,A.configService,A.apiKey,{usesThreadActors:!0}),f=await HU({endpoint:A.rivetEndpoint}).threadActor.getOrCreate([C],{params:{wsToken:R.wsToken},createWithInput:{threadId:R.threadId,threadVersion:R.threadVersion,ownerUserId:R.ownerUserId,...R.agentMode?{agentMode:R.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:Bx4(O)}),skipReadyWait:!0});if(!f.ok&&f.status!==409)throw Error(`Thread import failed (${f.status}): ${await f.text()}`);try{await Tx4(C,A.configService,A.apiKey,{executorType:"local-client"})}catch(h){j.warn("failed to mark thread as imported on server",{threadID:C,error:h instanceof Error?h.message:String(h)})}},K=new He0(A.rivetEndpoint,A.apiKey,A.configService,{clientID:lN.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(C)=>A.pluginService.event.toolCall(C),requestPluginToolResult:(C)=>A.pluginService.event.toolResult(C),pluginService:A.pluginService,invokeTool:async(C,O)=>{let R=typeof O.args==="object"&&O.args!==null?O.args:{},S=await aN({toolName:O.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:O.toolCallId,threadId:C});return A.toolService.invokeTool(O.toolName,{args:R},S)},persistLastThreadID:Vg5,readFileSystemDirectory:A.readFileSystemDirectory},V,U),E=await DI(),W=Gg5({initialUserInput:$,showNeoWelcome:X,neoWelcomeVariant:D,neoWelcomeDismissed:E.neoWelcomeDismissed}),z={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(C)=>{let O=await A.getThreadFromServer(C);return O?LV(O):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:la,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:G?!1:Y,sessionAgentMode:Z??E.agentMode,explicitReasoningEffort:F,lastReasoningEffortByMode:E.lastReasoningEffortByMode,lastSpeedByMode:E.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},H=(C,O)=>{return Yx({ampURL:A.ampURL,configService:A.configService,threadID:C,signal:O})},q=(C,O)=>{return _h4({ampURL:A.ampURL,configService:A.configService,threadID:C,signal:O})},N=new be0,I=js4({configService:A.configService}),w=new Set;try{await ro(new A51({clientPool:K,analyzeContextForThread:H,listSkillsForThread:q,completionBuilder:A.completionBuilder,history:new Jo,ideManager:N,configService:A.configService,initialThreadID:G?void 0:B,notificationService:I,initialUserInput:G?void 0:$,openThreadPickerOnStart:G?!1:J,neoContext:z,showNeoWelcome:W.show,neoWelcomeVariant:D,onNeoWelcomeDismissed:W.markDismissedOnDismiss?()=>{EJ(vh4).catch((O)=>{j.warn("Failed to mark Neo welcome as dismissed",{error:O})})}:void 0,onThreadArchived:(O)=>{w.add(O)}}));let C=K.lastActiveObservingClient;if(C){let{client:O,observer:R}=C,S=O.getThreadId();if(S){let T={id:S,title:R.title().getValue(),agentMode:R.agentMode,archived:w.has(S)},f=`${A.ampURL.replace(/\/$/,"")}/threads/${S}`;Os4(T,f,process.stdout)}}}finally{process.stdout.write(BI("")),I.unsubscribe(),K.dispose(),await A.dispose?.()}process.exit(0)}mp();nK();async function Ug5(A,Q,B){let $=N80(A);if(!$.success)throw Error(`Invalid permission format: ${$.error.message}`);if($.data.length===0)throw Error("No permission entry provided");let J=PH($.data);if(!J.success){let X=J.error.issues.map((D)=>D.message).join(", ");throw Error(`Invalid permission entry: ${X}`)}let Y=await Q.get("permissions",B)??[],F=[$.data[0],...Y];await Q.set("permissions",F,B)}async function Ps4(A){try{let Q=A.args.map((B)=>{if(/[\s/\\*?[\]{}()"]/.test(B))return`"${B}"`;return B}).join(" ");await Ug5(Q,A.settings,A.scope),A.exit(0)}catch(Q){let B=Q instanceof Error?Q.message:"Unknown error";A.stderr.write(`Error: ${B}
@@ -7468,7 +7468,7 @@ ${J}`,Q);this.line=B,this.column=$,this.codeblock=J}}/*!
7468
7468
  `),Y=[];for(let Z=0;Z<J.length;Z++){let D=J[Z].replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|HAVING|LIMIT|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON|AND|OR|AS|IN|NOT|NULL|IS|BETWEEN|LIKE|EXISTS|UNION|DISTINCT|COUNT|SUM|AVG|MIN|MAX|DATE|TIMESTAMP_TRUNC|TIMESTAMP_SUB|CURRENT_TIMESTAMP|INTERVAL|CASE|WHEN|THEN|ELSE|END|WITH|INSERT|UPDATE|DELETE|SET|VALUES|INTO|CREATE|ALTER|DROP|TRUE|FALSE|ASC|DESC)\b/gi,"\x00$1\x01").split(/(\x00[^\x01]+\x01)/);for(let G of D)if(G.startsWith("\x00")&&G.endsWith("\x01"))Y.push(new M(G.slice(1,-1),new v({color:$.app.keybind,bold:!0})));else Y.push(new M(G,new v({color:B.colorScheme.foreground})));if(Z<J.length-1)Y.push(new M(`
7469
7469
  `))}return new g0({decoration:{color:B.colorScheme.background,border:c1.all(new l1($.app.keybind,1,"rounded"))},child:new f0({padding:W0.symmetric(0,1),child:new p({text:new M(void 0,void 0,Y)})})})}}class F31 extends $8{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:B=null,showAxes:$=!0,colors:J=OU0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=B,this.showAxes=$,this.colors=J}createRenderObject(){return new Y31({chartData:this.chartData,highlightIndex:this.highlightIndex,showAxes:this.showAxes,colors:this.colors})}updateRenderObject(A){let Q=A;Q.chartData=this.chartData,Q.highlightIndex=this.highlightIndex,Q.showAxes=this.showAxes,Q.colors=this.colors,Q.markNeedsLayout()}}function i0A(A,Q,B,$,J,Y,Z){if(Y<=0)return null;switch(A){case"horizontal-bar":{let F=B;return F>=0&&F<Y?F:null}case"bar":case"stacked-bar":{let F=Z?m8:0,X=$-F;if(X<=0)return null;let D=Q-F;if(D<0||D>=X)return null;let G=Math.max(1,Math.floor(X/Y)),V=Math.floor(D/G);return V>=0&&V<Y?V:null}case"line":case"sparkline":case"stacked-area":{let F=Z?m8:0,X=$-F;if(X<=0)return null;let D=Math.max(0,Math.min(X-1,Q-F));if(Y===1)return 0;let G=X/(Y-1),V=Math.round(D/G);return Math.max(0,Math.min(Y-1,V))}default:return null}}function Ii5(A,Q,B,$,J,Y,Z,F){if(J<=0||Q<0||Q>=J)return null;let X=2;switch(A){case"horizontal-bar":return{x:Math.floor(B/2),y:Q};case"bar":case"stacked-bar":{let D=Y?m8:0,G=B-D,V=$-(Y?X:0);if(G<=0||V<=0)return null;let U=Math.max(1,Math.floor(G/J)),K=D+Q*U+Math.floor(U/2),E=F>0?Z/F:0,W=Math.round((1-E)*(V-1));return{x:K,y:W}}case"line":case"sparkline":case"stacked-area":{let D=Y?m8:0,G=B-D,V=$-(Y?X:0);if(G<=0||V<=0)return null;let U=J>1?D+Math.round(Q/(J-1)*(G-1)):D+Math.floor(G/2),K=F>0?Z/F:0,E=Math.round((1-K)*(V-1));return{x:U,y:E}}default:return null}}function wi5(A){let Q=0;for(let B of A)for(let $ of B.points)if($.value>Q)Q=$.value;return Q||1}function Ci5(A,Q,B,$,J){if(B.length<=1){let F=$(A.value),X=A.meta?` (${A.meta})`:"";return A.label.length+2+F.length+X.length}let Y=A.label.length,Z=0;for(let F of B){let X=F.points[Q];if(!X)continue;Z+=X.value;let D=2+F.name.length+2+$(X.value).length;Y=Math.max(Y,D)}if(J){let F=9+$(Z).length;Y=Math.max(Y,F)}return Y}function Mi5(A,Q,B,$,J,Y,Z){let F;try{let E=R1.of(A),W=T0.of(A);F={foreground:E.colorScheme.foreground,background:E.colorScheme.background,border:W.app.keybind}}catch{F={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let X=new v({color:F.foreground,bold:!0}),D=new v({color:F.foreground}),G=new v({color:F.foreground,dim:!0}),V=[],U=new v({color:F.foreground,underline:!0}),K=(E,W)=>new M(W,U,void 0,OW(E),()=>{dA(A,E)});if($.length<=1){if(V.push(new M(`${Q.label}: `,X)),Q.link)V.push(K(Q.link,Y(Q.value)));else V.push(new M(Y(Q.value),D));if(Q.meta)V.push(new M(` (${Q.meta})`,G))}else{let E=Z==="stacked-bar"||Z==="stacked-area";V.push(new M(`${Q.label}
7470
7470
  `,X));let W=0;for(let z=0;z<$.length;z++){let H=$[z],q=H.points[B];if(!q)continue;W+=q.value;let N=H.color??J[z%J.length]??F.foreground;if(V.push(new M("● ",new v({color:N}))),V.push(new M(`${H.name}: `,G)),q.link)V.push(K(q.link,Y(q.value)));else V.push(new M(Y(q.value),D));if(z<$.length-1||E)V.push(new M(`
7471
- `))}if(E)V.push(new M(" ",G)),V.push(new M("Total: ",G)),V.push(new M(Y(W),D))}return new g0({decoration:{color:F.background,border:c1.all(new l1(F.border,1,"rounded"))},child:new p({text:new M(void 0,void 0,V)})})}c0();C3();K8();t5();y7();R7();G9();w2();jB();MV();c4();dk();zT();L1();c0();G9();class X31{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(A,Q){this.enabled=A;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let A=Array.from(this.commandCounts.entries()).map(([Q,B])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1778160156-gb2be4b"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await _30(Q,this.configService)}catch(Q){j.error("Failed to export command telemetry events",Q)}}async submit(A){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(A)||0;this.commandCounts.set(A,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class Aw extends v0{props;constructor(A){super();this.props=A}createState(){return new n0A}}class n0A extends S0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class a0A extends S0{controller=new M8;focusNode=new X6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=T0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=c1.all(new l1(B.foreground,1,"solid")),X=new oB({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new t0({children:[new g0({decoration:{color:B.background},child:new p({text:new M(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new g0({padding:W0.symmetric(1,0),child:new p({text:this.widget.props.title?new M(this.widget.props.title,new v({color:$.command,bold:!0})):new M("",void 0,[new M("Command: ",new v({color:B.foreground})),new M(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new M("Enter",new v({color:$.keybind}))),V.push(new M(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new M("Esc",new v({color:$.keybind}))),V.push(new M(" to cancel",new v({color:B.foreground,dim:!0})));let U=new g0({padding:W0.symmetric(1,0),child:new p({text:new M("",void 0,V)})});return new g0({decoration:{border:F,color:B.background},padding:W0.all(1),child:new x0({children:[G,new U0({height:1}),D,new $5,U]})})}}class ss extends v0{props;constructor(A){super();this.props=A}createState(){return new a0A}}jB();class o0A extends S0{controller=new M8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new X6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=n9)return!1;let Q=await iF(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=T0.of(A),{colors:B,app:$}=Q,Y=t1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new dD({controller:this.controller,triggers:[new wJ],completionBuilder:this.widget.props.completionBuilder,onSubmitted:(K)=>{this.widget.props.onSubmit(K.trim(),this.imageAttachments)},theme:B,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:C4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new m4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new g0({constraints:new M1({maxHeight:Z}),padding:W0.symmetric(1,0),child:X}),G=new g0({padding:W0.symmetric(1,0),child:new p({text:new M("",void 0,[new M("Command: ",new v({color:B.foreground})),new M(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new g0({padding:W0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new M("",void 0,[new M("Esc",new v({color:$.keybind})),new M(" again to clear input",new v({color:B.foreground,dim:!0}))]):new M("",void 0,[new M("Press ",new v({color:B.foreground,dim:!0})),new M("Enter",new v({color:$.keybind})),new M(" to submit, ",new v({color:B.foreground,dim:!0})),new M("Esc",new v({color:$.keybind})),new M(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new U0({height:1}),new _1({child:D}),new U0({height:1}),V];return new g0({decoration:{border:c1.all(new l1(B.foreground,1,"solid")),color:B.background},padding:W0.all(1),child:new x0({children:U})})}}class D31 extends v0{props;constructor(A){super();this.props=A}createState(){return new o0A}}function r0A(A){let B=new Date().getTime()-A.getTime(),$=Math.floor(B/60000),J=Math.floor(B/3600000),Y=Math.floor(B/86400000);if($<1)return"just now";if($<60)return`${$}m ago`;if(J<24)return`${J}h ago`;if(Y<7)return`${Y}d ago`;return A.toLocaleDateString()}class G31 extends N1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((J,Y)=>Y.pubDate.getTime()-J.pubDate.getTime()),B=Math.max(0,...Q.map((J)=>r0A(J.pubDate).length));return new g6({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=T0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(W,z)=>new U0({width:z,child:t0.end([new p({text:new M(W,new v({color:K}))})])});return new g0({decoration:V?{color:V}:void 0,padding:W0.symmetric(2,0),child:new t0({children:[new _1({child:new p({text:new M(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(r0A(J.pubDate),B)]})})}})}}class YB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!YB._instance)YB._instance=new YB;return YB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}c0();class s0A extends S0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=T0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new g6({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let z=this.currentQuery.trim().toLowerCase();return new g0({decoration:K?{color:K}:void 0,padding:W0.symmetric(2,0),child:new p({text:new M("",void 0,[new M("Create new label: ",new v({color:E})),new M(z,new v({color:E,bold:!0}))])})})}return new g0({decoration:K?{color:K}:void 0,padding:W0.symmetric(2,0),child:new p({text:new M(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class V31 extends v0{props;constructor(A){super();this.props=A}createState(){return new s0A}}class iD extends v0{props;constructor(A){super();this.props=A}createState(){return new t0A}}class t0A extends S0{_spinner=new H6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=T0.of(A),{colors:B,app:$}=Q,J=c1.all(new l1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new M("",void 0,[new M(Y,new v({color:$.processing})),new M(" ",void 0),new M(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new x0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new U0({height:2,child:new g0({padding:W0.symmetric(2,0),child:new p({text:new M("",new v({dim:!0}),[new M("Press ",new v({color:B.foreground})),new M("Esc",new v({color:B.info})),new M(" to cancel",new v({color:B.foreground}))])})})}));let D=new g0({decoration:new f4(B.background,J),child:new U0({width:60,height:7,child:new x0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new i4({debugLabel:"LoadingDialog",child:new m4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class cU extends v0{props;constructor(A){super();this.props=A}createState(){return new e0A}}class e0A extends S0{scrollController=new rA;scrollAreaKey=new J2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof S2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=T0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=OD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=c1.all(new l1(Q.colors.border,1,"solid")),Z=new g0({padding:W0.symmetric(1,0),child:new p({text:new M($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new M($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new Q3({child:new g0({padding:W0.symmetric(1,0),child:new t0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new TA({controller:this.scrollController,autofocus:!0,child:F})}),new X2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new g0({padding:W0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new M("",void 0,[new M("Press ",new v({color:Q.colors.foreground,dim:!0})),new M("R",new v({color:Q.app.keybind})),new M(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new M("Esc",new v({color:Q.app.keybind})),new M(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new M("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new M("",U,[new M("Press ",U),new M("Escape",V),new M(" to close • Use ",U),new M("↑↓",V),new M(" or ",U),new M("j/k",V),new M(" to scroll",U)])}return new M("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new i4({debugLabel:"MessageDialog",child:new e4({fit:"expand",children:[new v1({onClick:()=>{},child:new U0}),new m4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new g0({decoration:{border:Y,color:Q.colors.background},padding:W0.all(1),child:new x0({mainAxisAlignment:"center",children:[Z,new U0({height:1}),X,D]})})})]})})}}C3();s1();class A1A extends v0{props;constructor(A){super();this.props=A}createState(){return new Q1A}}class Q1A extends S0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=s0.file(this.widget.props.cwd),B=X1.relativePath(Q,OA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return R5(A)}statusIcon(A){let Q=h8.default(),{colors:B,app:$}=Q;switch(A){case"loading":return{icon:"◌",color:B.warning};case"active":return{icon:"✓",color:$.toolSuccess};case"error":return{icon:"✗",color:$.toolError}}}build(A){let Q=T0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new M("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new M(`${Y}/${J} ${W4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new M(` (${Z} ${W4(Z,"command")}, ${F} ${W4(F,"tool")})`,new v({dim:!0})));$.push(new M(`
7471
+ `))}if(E)V.push(new M(" ",G)),V.push(new M("Total: ",G)),V.push(new M(Y(W),D))}return new g0({decoration:{color:F.background,border:c1.all(new l1(F.border,1,"rounded"))},child:new p({text:new M(void 0,void 0,V)})})}c0();C3();K8();t5();y7();R7();G9();w2();jB();MV();c4();dk();zT();L1();c0();G9();class X31{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(A,Q){this.enabled=A;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let A=Array.from(this.commandCounts.entries()).map(([Q,B])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1778185482-gf00656"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await _30(Q,this.configService)}catch(Q){j.error("Failed to export command telemetry events",Q)}}async submit(A){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(A)||0;this.commandCounts.set(A,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class Aw extends v0{props;constructor(A){super();this.props=A}createState(){return new n0A}}class n0A extends S0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class a0A extends S0{controller=new M8;focusNode=new X6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=T0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=c1.all(new l1(B.foreground,1,"solid")),X=new oB({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new t0({children:[new g0({decoration:{color:B.background},child:new p({text:new M(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new g0({padding:W0.symmetric(1,0),child:new p({text:this.widget.props.title?new M(this.widget.props.title,new v({color:$.command,bold:!0})):new M("",void 0,[new M("Command: ",new v({color:B.foreground})),new M(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new M("Enter",new v({color:$.keybind}))),V.push(new M(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new M("Esc",new v({color:$.keybind}))),V.push(new M(" to cancel",new v({color:B.foreground,dim:!0})));let U=new g0({padding:W0.symmetric(1,0),child:new p({text:new M("",void 0,V)})});return new g0({decoration:{border:F,color:B.background},padding:W0.all(1),child:new x0({children:[G,new U0({height:1}),D,new $5,U]})})}}class ss extends v0{props;constructor(A){super();this.props=A}createState(){return new a0A}}jB();class o0A extends S0{controller=new M8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new X6({debugLabel:"CommandMultilinePrompt",onKey:(A)=>{if(A.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=async(A)=>{if(this.imageAttachments.length>=n9)return!1;let Q=await iF(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=T0.of(A),{colors:B,app:$}=Q,Y=t1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new dD({controller:this.controller,triggers:[new wJ],completionBuilder:this.widget.props.completionBuilder,onSubmitted:(K)=>{this.widget.props.onSubmit(K.trim(),this.imageAttachments)},theme:B,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:C4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new m4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new g0({constraints:new M1({maxHeight:Z}),padding:W0.symmetric(1,0),child:X}),G=new g0({padding:W0.symmetric(1,0),child:new p({text:new M("",void 0,[new M("Command: ",new v({color:B.foreground})),new M(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new g0({padding:W0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new M("",void 0,[new M("Esc",new v({color:$.keybind})),new M(" again to clear input",new v({color:B.foreground,dim:!0}))]):new M("",void 0,[new M("Press ",new v({color:B.foreground,dim:!0})),new M("Enter",new v({color:$.keybind})),new M(" to submit, ",new v({color:B.foreground,dim:!0})),new M("Esc",new v({color:$.keybind})),new M(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new U0({height:1}),new _1({child:D}),new U0({height:1}),V];return new g0({decoration:{border:c1.all(new l1(B.foreground,1,"solid")),color:B.background},padding:W0.all(1),child:new x0({children:U})})}}class D31 extends v0{props;constructor(A){super();this.props=A}createState(){return new o0A}}function r0A(A){let B=new Date().getTime()-A.getTime(),$=Math.floor(B/60000),J=Math.floor(B/3600000),Y=Math.floor(B/86400000);if($<1)return"just now";if($<60)return`${$}m ago`;if(J<24)return`${J}h ago`;if(Y<7)return`${Y}d ago`;return A.toLocaleDateString()}class G31 extends N1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((J,Y)=>Y.pubDate.getTime()-J.pubDate.getTime()),B=Math.max(0,...Q.map((J)=>r0A(J.pubDate).length));return new g6({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=T0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(W,z)=>new U0({width:z,child:t0.end([new p({text:new M(W,new v({color:K}))})])});return new g0({decoration:V?{color:V}:void 0,padding:W0.symmetric(2,0),child:new t0({children:[new _1({child:new p({text:new M(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(r0A(J.pubDate),B)]})})}})}}class YB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!YB._instance)YB._instance=new YB;return YB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}c0();class s0A extends S0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=T0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new g6({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let z=this.currentQuery.trim().toLowerCase();return new g0({decoration:K?{color:K}:void 0,padding:W0.symmetric(2,0),child:new p({text:new M("",void 0,[new M("Create new label: ",new v({color:E})),new M(z,new v({color:E,bold:!0}))])})})}return new g0({decoration:K?{color:K}:void 0,padding:W0.symmetric(2,0),child:new p({text:new M(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class V31 extends v0{props;constructor(A){super();this.props=A}createState(){return new s0A}}class iD extends v0{props;constructor(A){super();this.props=A}createState(){return new t0A}}class t0A extends S0{_spinner=new H6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=T0.of(A),{colors:B,app:$}=Q,J=c1.all(new l1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new M("",void 0,[new M(Y,new v({color:$.processing})),new M(" ",void 0),new M(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new x0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new U0({height:2,child:new g0({padding:W0.symmetric(2,0),child:new p({text:new M("",new v({dim:!0}),[new M("Press ",new v({color:B.foreground})),new M("Esc",new v({color:B.info})),new M(" to cancel",new v({color:B.foreground}))])})})}));let D=new g0({decoration:new f4(B.background,J),child:new U0({width:60,height:7,child:new x0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new i4({debugLabel:"LoadingDialog",child:new m4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class cU extends v0{props;constructor(A){super();this.props=A}createState(){return new e0A}}class e0A extends S0{scrollController=new rA;scrollAreaKey=new J2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof S2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=T0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=OD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=c1.all(new l1(Q.colors.border,1,"solid")),Z=new g0({padding:W0.symmetric(1,0),child:new p({text:new M($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new M($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new Q3({child:new g0({padding:W0.symmetric(1,0),child:new t0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new TA({controller:this.scrollController,autofocus:!0,child:F})}),new X2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new g0({padding:W0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new M("",void 0,[new M("Press ",new v({color:Q.colors.foreground,dim:!0})),new M("R",new v({color:Q.app.keybind})),new M(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new M("Esc",new v({color:Q.app.keybind})),new M(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new M("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new M("",U,[new M("Press ",U),new M("Escape",V),new M(" to close • Use ",U),new M("↑↓",V),new M(" or ",U),new M("j/k",V),new M(" to scroll",U)])}return new M("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new i4({debugLabel:"MessageDialog",child:new e4({fit:"expand",children:[new v1({onClick:()=>{},child:new U0}),new m4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new g0({decoration:{border:Y,color:Q.colors.background},padding:W0.all(1),child:new x0({mainAxisAlignment:"center",children:[Z,new U0({height:1}),X,D]})})})]})})}}C3();s1();class A1A extends v0{props;constructor(A){super();this.props=A}createState(){return new Q1A}}class Q1A extends S0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=s0.file(this.widget.props.cwd),B=X1.relativePath(Q,OA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return R5(A)}statusIcon(A){let Q=h8.default(),{colors:B,app:$}=Q;switch(A){case"loading":return{icon:"◌",color:B.warning};case"active":return{icon:"✓",color:$.toolSuccess};case"error":return{icon:"✗",color:$.toolError}}}build(A){let Q=T0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new M("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new M(`${Y}/${J} ${W4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new M(` (${Z} ${W4(Z,"command")}, ${F} ${W4(F,"tool")})`,new v({dim:!0})));$.push(new M(`
7472
7472
 
7473
7473
  `));for(let X of this.plugins){let{icon:D,color:G}=this.statusIcon(X.status),V=this.getRelativePath(X.uri);if($.push(new M(`${D} `,new v({color:G}))),$.push(new M(V,new v({bold:!0}))),$.push(new M(` ${X.status}`,new v({dim:!0}))),$.push(new M(`
7474
7474
  `)),X.status==="active"&&X.registeredEvents.length>0)$.push(new M(" Events: ",new v({dim:!0}))),$.push(new M(X.registeredEvents.join(", "),new v({color:B.link}))),$.push(new M(`
@@ -7646,7 +7646,7 @@ ${t.content||""}`:t.content||"",b0=[],h0=t.baseDir.startsWith("file://")?AK0(t.b
7646
7646
  `)}function fAA(A,Q){A.command("usage").description("Show your current Amp usage and credit balance").action(async(B,$)=>{let J=$.optsWithGlobals(),Y=await Q(J),Z=await Y.settings.get("proxy"),F=H04({settings:{url:Y.ampURL,proxy:Z},secrets:{getToken:(D,G)=>Y.secrets.get(D,G)}}),X=await YA.userDisplayBalanceInfo({},{config:F});if(!X.ok){if(X.error.code==="auth-required")process.stderr.write(o0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(o0.red("Error: ")+X.error.message+`
7647
7647
  `),process.exit(1)}process.stdout.write(await mo5(X.result.displayText)+`
7648
7648
  `),process.exit(0)})}var D03=xt.join(S$,"logs","headless.log"),E91=xt.join(jx,"device-id.json"),G03=`cli-tui-${D8A(16).toString("hex")}`;async function V03(){for(let A of kM)try{if((await A.listConfigs()).length>0)return A}catch(Q){j.debug("Failed to detect query-based IDE integration",{ideName:A.ideName,error:Q})}return}try{if(process.platform==="win32")await Promise.resolve().then(() => T4(_b(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){_J.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
7649
- `)}function U03(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function f2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")AY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")AY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)AY("internal.model",W03(Q.model))}function $8A(A){let Q=A.indexOf(":");if(Q===-1)throw new J4(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new J4(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function K03(A){if(A===void 0)return;let Q=A.trim();if(J04(Q))return Q;throw new J4(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function E03(A,Q){if(kX(A,Q))return;let B=u$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new J4(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function W03(A){if(!A.includes("="))return $8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new J4(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new J4(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new J4(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);$8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new J4("No valid model overrides found in --model flag value.",1);return Q}function z03(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 H03(A){try{return await G8A(A,"utf-8")}catch{return A}}async function W91(A,Q,B){let $=z03(A,Q);if(!$)return;let J=bA(B)?B.features:[],Y=bA(B)?B.user.email:void 0;if(!iK0(J,IB.HARNESS_SYSTEM_PROMPT)&&!(Y&&O7(Y)))throw new J4("You are not allowed to do this.",1);AY("systemPrompt",await H03($))}function iK0(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function q03(A){return A!=="pending"}function kR(A){if(!bA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function N03(A){let Q=kR(A);if(Q)return Q.id;if(SX(A))throw Error(A.error.message);throw Error("unreachable")}function I03(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 w03(A){let $=I03(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 J4(`Couldn't connect to the Amp server at ${A}.`,1,$)}function ft(A,Q){let B=or0(Error(A.error.message));if(B.message===Y7.networkOffline||B.message===Y7.networkTimeout)return w03(Q);if(B.message!==Y7.internalBug)return new J4(B.message,1,B.suggestion);return new J4(A.error.message.replace(/^Error: /,""),1)}async function C03(){if(process.versions.bun)return!1;try{return await tN()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var J8A=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH; 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??bF,description:`Custom settings file path (overrides the default location ${bF})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(j).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${la})`},{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:$9(),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:TM.SMART.key,description:`Set the agent mode (${f$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(f$().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"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}],Y8A=(A)=>("deprecated"in A)&&A.deprecated===!0,M03=(A)=>("hidden"in A)&&A.hidden===!0,L03=(A)=>("default"in A),O03=(A)=>("default"in A)?A.default:void 0;function dK0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=K03(Q.effort);if(B!==void 0)E03(Q.mode,B);return B}function j03(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new J4(Y7.unknownCommand(B),1,Z)}}async function nK0(A){return{...A,getThreadEnvironment:EW,getEnvironmentData:(Q,B)=>tX({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new EL(A.fileSystem),generateThreadTitle:WF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>IQ(A.configService),pluginService:A.pluginService}}function V8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:EW,getEnvironmentData:(Q,B)=>tX({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var cK0=s0.file(X03.homedir()),z91=process.env.XDG_CONFIG_HOME?s0.file(process.env.XDG_CONFIG_HOME):X1.joinPath(cK0,".config");function R03(A){return dR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(nF0())aF0();else GZ0(Q);let B=Pj(),$=oo();if((!B||$||_x())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(SD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(SD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(Pj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function p8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;oe1("0.0.1778160156-gb2be4b");let Y=x30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:m0.of(s0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:cK0,userConfigDir:z91});ts4(Y);let Z=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(Z.settings)});let F=!1;{let g=await A.secrets.get("apiKey",A.ampURL);if(F=Boolean(g),j.info("API key lookup before login",{found:Boolean(g),ampURL:A.ampURL,deferAuth:$}),!g)if($)j.info("No API key found, continuing startup with deferred auth");else{X5.write(`No API key found. Starting login flow...
7649
+ `)}function U03(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function f2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")AY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")AY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)AY("internal.model",W03(Q.model))}function $8A(A){let Q=A.indexOf(":");if(Q===-1)throw new J4(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new J4(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function K03(A){if(A===void 0)return;let Q=A.trim();if(J04(Q))return Q;throw new J4(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function E03(A,Q){if(kX(A,Q))return;let B=u$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new J4(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function W03(A){if(!A.includes("="))return $8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new J4(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new J4(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new J4(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);$8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new J4("No valid model overrides found in --model flag value.",1);return Q}function z03(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 H03(A){try{return await G8A(A,"utf-8")}catch{return A}}async function W91(A,Q,B){let $=z03(A,Q);if(!$)return;let J=bA(B)?B.features:[],Y=bA(B)?B.user.email:void 0;if(!iK0(J,IB.HARNESS_SYSTEM_PROMPT)&&!(Y&&O7(Y)))throw new J4("You are not allowed to do this.",1);AY("systemPrompt",await H03($))}function iK0(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function q03(A){return A!=="pending"}function kR(A){if(!bA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function N03(A){let Q=kR(A);if(Q)return Q.id;if(SX(A))throw Error(A.error.message);throw Error("unreachable")}function I03(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 w03(A){let $=I03(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 J4(`Couldn't connect to the Amp server at ${A}.`,1,$)}function ft(A,Q){let B=or0(Error(A.error.message));if(B.message===Y7.networkOffline||B.message===Y7.networkTimeout)return w03(Q);if(B.message!==Y7.internalBug)return new J4(B.message,1,B.suggestion);return new J4(A.error.message.replace(/^Error: /,""),1)}async function C03(){if(process.versions.bun)return!1;try{return await tN()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var J8A=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH; 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??bF,description:`Custom settings file path (overrides the default location ${bF})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(j).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${la})`},{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:$9(),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:TM.SMART.key,description:`Set the agent mode (${f$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(f$().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"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}],Y8A=(A)=>("deprecated"in A)&&A.deprecated===!0,M03=(A)=>("hidden"in A)&&A.hidden===!0,L03=(A)=>("default"in A),O03=(A)=>("default"in A)?A.default:void 0;function dK0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=K03(Q.effort);if(B!==void 0)E03(Q.mode,B);return B}function j03(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new J4(Y7.unknownCommand(B),1,Z)}}async function nK0(A){return{...A,getThreadEnvironment:EW,getEnvironmentData:(Q,B)=>tX({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new EL(A.fileSystem),generateThreadTitle:WF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>IQ(A.configService),pluginService:A.pluginService}}function V8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:EW,getEnvironmentData:(Q,B)=>tX({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var cK0=s0.file(X03.homedir()),z91=process.env.XDG_CONFIG_HOME?s0.file(process.env.XDG_CONFIG_HOME):X1.joinPath(cK0,".config");function R03(A){return dR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(nF0())aF0();else GZ0(Q);let B=Pj(),$=oo();if((!B||$||_x())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(SD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(SD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(Pj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function p8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;oe1("0.0.1778185482-gf00656");let Y=x30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:m0.of(s0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:cK0,userConfigDir:z91});ts4(Y);let Z=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(Z.settings)});let F=!1;{let g=await A.secrets.get("apiKey",A.ampURL);if(F=Boolean(g),j.info("API key lookup before login",{found:Boolean(g),ampURL:A.ampURL,deferAuth:$}),!g)if($)j.info("No API key found, continuing startup with deferred auth");else{X5.write(`No API key found. Starting login flow...
7650
7650
  `);let i=await P03(A),d=await A.secrets.get("apiKey",A.ampURL);if(j.info("Login flow completed",{success:i,storedKeyPresent:Boolean(d),ampURL:A.ampURL}),!i)await IW(),process.exit(1);F=!0}}{let g=await Y.getLatest(),i=g.settings.url,d=g.secrets.isSet?.[i];j.info("Config secrets state after login",{configURL:i,apiKeySet:d?.apiKey??!1})}let X=y1(IQ(Y).pipe(P5(q03))),D=$?"pending":await X;if(!$)j.info("Server status resolved",{status:"ready",isAuthenticated:bA(D),isError:SX(D),errorMessage:SX(D)?D.error.message:void 0});let G=X.then((g)=>N03(g));G.catch(()=>{return});let U=!Q.takeMeBack&&bA(D)&&iK0(D.features,IB.THREAD_ACTORS_TUI)?"all":process.env.PLUGINS??"permissions",{toolService:K,dispose:E}=uR4({configService:Y}),W=new Map,z=()=>W.clear(),H=new uf0(Y,A.settings.getWorkspaceRootPath()),q=lJ4({configService:Y,filesystem:O3}),N=f74({configService:Y,trustStore:H,skillMCPServers:q.skillMCPServers,createOAuthProvider:async(g,i,d)=>{let Q0=`${g}:${i}`,H0=W.get(Q0);if(H0)return j.debug("Reusing existing OAuth provider for server",{serverName:g,serverUrl:i}),H0;j.debug("Creating OAuth provider for server",{serverName:g,serverUrl:i});let a=(async()=>{let I0=new uM(A.secrets),F0=await I0.getClientInfo(g,i),_0=d?.scopes??F0?.scopes,B0=Wf4();j.info("OAuth headless mode check",{useHeadless:B0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:X5.isTTY});let K0;if(B0)K0=A.executeMode?Ef4():Kf4(g);let o=new ok0({storage:I0,serverName:g,serverUrl:i,clientId:d?.clientId??F0?.clientId,clientSecret:d?.clientSecret??F0?.clientSecret,authUrl:d?.authUrl??F0?.authUrl,tokenUrl:d?.tokenUrl??F0?.tokenUrl,scopes:_0,headlessAuthHandler:K0});return j.debug("OAuth provider created",{serverName:g,serverUrl:i,hasManualClientId:!!(d?.clientId??F0?.clientId),willUseDCR:!(d?.clientId??F0?.clientId),scopes:_0,headlessMode:B0,executeMode:A.executeMode}),o})();return W.set(Q0,a),a}}),I=un0({configService:Y,filesystem:O3,spawn:TY0}),w=Q.headless?ys4():void 0,C=w??new KV0({configService:Y}),O=C instanceof KV0?C:void 0;if(O)O.pluginExecutorKind="local";let R=Bb0({configService:Y,fileSystem:O3,platform:C,loadGlobalPlugins:es0(Y),pluginFilter:U}),S=yQ4(R),T=[N,I,S],f;if(J)f=new Map;else if(A.executeMode){let g=await EO4({toolService:K,providers:T,initialTimeout:15000});f=g.registrations;for(let[i,d]of g.initErrors)j.warn(`${i} provider initialization slow or failed:`,d)}else f=hn0({toolService:K,providers:T});if(Q.jetbrains)jM("JetBrains");else if(Q.ide&&ef4())jM("VS Code");else if(Q.ide&&Ab4())jM("Neovim");else if(Q.ide){let g=await V03();if(g){let i=l30(g.ideName);if(i)jM(i)}}if(A.executeMode)re1(!0);let h,x=u3.status.pipe(C1((g)=>Boolean(g.connected&&g.authenticated&&g.ideName&&n04(g.ideName))),P4()).subscribe((g)=>{if(g){if(!h)h=K.registerTool(KO4)}else h?.dispose(),h=void 0}),k;if(!A.executeMode){let g=await A.settings.get("fuzzy.alwaysIncludePaths")??[];k=new cF0(process.cwd(),{alwaysIncludePaths:g},!0)}else k=new class extends cF0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let b=new Qg0(Ll(Y,{usesThreadActors:!1}),{maxThreads:200});j.info("Starting Amp background services");let c=new F51,l={configService:Y,toolService:K,mcpService:N,skillService:q,toolboxService:I,trustStore:H,threadService:b,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:k,fileSystem:O3,terminal:c,pluginService:R,pluginPlatform:O,headlessPluginPlatform:w,serverStatus:D,serverStatusPromise:X,viewerUserIDPromise:G,hasAPIKeyAtStartup:F};return{...l,async asyncDispose(){if(l.mcpService.hasAuthenticatingClients())j.info("Waiting for OAuth authentication to complete before exit..."),await l.mcpService.waitForAuthentication();for(let g of f.values())g.dispose();await l.mcpService.dispose(),z(),await l.threadService.asyncDispose(),l.configService.unsubscribe(),E(),l.fuzzyServer.dispose(),l.settingsStorage[Symbol.dispose](),x.unsubscribe(),h?.dispose(),await l.pluginService.dispose()}}}async function P03(A){if(!A.executeMode){if(!await vX0("Would you like to log in to Amp? [(y)es, (n)o]: "))return X5.write(`Login cancelled. Run the command again to retry.
7651
7651
  `),!1}return await U8A(A)}async function U8A(A){let Q=D8A(32).toString("hex"),B=await ux(A.ampURL,Q),$=new AbortController;try{await PX(B,$.signal)}catch(Y){j.error("Error opening browser",{error:Y})}let J=await ux(A.ampURL,Q,!1);X5.write(`If your browser does not open automatically, visit:
7652
7652
 
@@ -7654,7 +7654,7 @@ ${o0.blue.bold(J)}
7654
7654
 
7655
7655
  `);try{return await Hh4(A.ampURL,Q,A.secrets,$),X5.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(Y){return j.error("Login failed",{error:Y}),_J.write(`
7656
7656
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
7657
- `),!1}}async function _03(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new J4("No Amp API key found. Run `amp login` first.",1);let J=Y03("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(F)=>Y(F??1))})}function T03(A){let Q=new yN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((z)=>{if(z.code==="commander.help"||z.code==="commander.version"||z.exitCode===0)Zj(),process.exit(0);let H=z.originalError??z;Iv4(H)}),Mg4(Q,{version:"0.0.1778160156-gb2be4b",buildTimestamp:"2026-05-07T13:26:26.632Z",buildType:"'release'"}),Q.addHelpText("after",rf4()),Q.configureHelp({formatHelp:sf4}),Q.command("logout").description("Log out by removing stored API key").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await h03(N)}),Q.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await u03(N,await Vt0(q,N.settings))}),Hv4(Q,p5);let $=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...z)=>{let H=z.find((w)=>typeof w==="object"&&w!==null&&typeof w.optsWithGlobals==="function")??$,q=z.filter((w)=>w!==H).flatMap((w)=>Array.isArray(w)?w:typeof w==="string"?[w]:[]),N=H.optsWithGlobals(),I=await p5(N);await _03(I.ampURL,I.secrets,q),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(z,H,q)=>{let N=q.optsWithGlobals(),I=await p5(N);await Yf4(z??"get",I.ampURL,I.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await Zf4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(z)=>{await zu4({raw:z.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(`
7657
+ `),!1}}async function _03(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new J4("No Amp API key found. Run `amp login` first.",1);let J=Y03("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(F)=>Y(F??1))})}function T03(A){let Q=new yN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((z)=>{if(z.code==="commander.help"||z.code==="commander.version"||z.exitCode===0)Zj(),process.exit(0);let H=z.originalError??z;Iv4(H)}),Mg4(Q,{version:"0.0.1778185482-gf00656",buildTimestamp:"2026-05-07T20:28:26.630Z",buildType:"'release'"}),Q.addHelpText("after",rf4()),Q.configureHelp({formatHelp:sf4}),Q.command("logout").description("Log out by removing stored API key").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await h03(N)}),Q.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await u03(N,await Vt0(q,N.settings))}),Hv4(Q,p5);let $=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...z)=>{let H=z.find((w)=>typeof w==="object"&&w!==null&&typeof w.optsWithGlobals==="function")??$,q=z.filter((w)=>w!==H).flatMap((w)=>Array.isArray(w)?w:typeof w==="string"?[w]:[]),N=H.optsWithGlobals(),I=await p5(N);await _03(I.ampURL,I.secrets,q),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(z,H,q)=>{let N=q.optsWithGlobals(),I=await p5(N);await Yf4(z??"get",I.ampURL,I.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await Zf4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(z)=>{await zu4({raw:z.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(`
7658
7658
  `)).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(z,H,q)=>{if(z&&H.apply)throw new J4("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let N=H.apply??z;if(!N||N.trim().length===0)X5.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.
7659
7659
 
7660
7660
  `),q.outputHelp(),process.exit(0);let I=N2(N)??VJ(N),w=q.optsWithGlobals(),C=await p5(w);f2(q,w);let O=await p8(C,w),R=!1;try{if(H.checkout&&H.skipCheckout)throw new J4("Choose either --checkout or --skip-checkout, not both.",1);if(SX(O.serverStatus))throw ft(O.serverStatus,C.ampURL);let S=bA(O.serverStatus)?O.serverStatus.features:void 0;if(!iK0(S,IB.V2))throw new J4("live-sync is not enabled for your user",1);await Zh4({ampURL:C.ampURL,threadId:I,configService:O.configService,threadService:O.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:vX0}),R=!0}finally{if(await O.asyncDispose(),R)process.exit(0)}});let J=async(z,H,q)=>{x30({storage:H.settings,secretStorage:H.secrets,workspaceRoot:m0.of(s0.file(process.cwd())),defaultAmpURL:H.ampURL,homeDir:cK0,userConfigDir:z91});let N={...H,executeMode:!1};await lK0(N,{...z,openThreadSwitcher:!0},q,A)},Y=Q.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").option("--include-archived","Include archived threads in the list").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await X8A(q,N,H)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await r03(q,N,H)}),Y.command("continue [threadIDOrURL]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, interactive mode shows a picker. Use --last to continue the last thread for the current mode directly.").option("--last","Continue the last thread for the current mode directly").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(z,H,q)=>{let N=q.optsWithGlobals(),I=await p5(N);if(H.pick)_J.write(`${o0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
@@ -7687,8 +7687,8 @@ ${C}
7687
7687
  `))}),H.args.length>0)j03(N,H);await lK0(N,q,H,A)}),kb4(Q),Q}async function Tb(A,Q){await EJ((B)=>hX0(B,A,Q))}async function Z8A(A,Q,B){let $=Date.now(),[J,Y]=await Promise.all([YA.getThreadLinkInfo({thread:A},{config:Q}),B]);if(j.getChild("fetchAndStartThread").info(`Ownership check in ${Date.now()-$}ms`),J.ok){let Z=J.result.creatorUserID;if(Z&&Z!==Y&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new J4(`Cannot resume thread created by another user.
7688
7688
 
7689
7689
  This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}async function K8A(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await WV0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await WV0()).trimEnd(),stdinInput:null}}function E8A(A,Q,B){if(A.streamJson&&!Q)throw new J4("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new J4("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new J4("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new J4("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 J4("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new J4("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 J4("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"},{"type":"image","source":{"type":"base64","media_type":"image/png","data":"..."}}]}}' | amp --execute --stream-json --stream-json-input`);if(Q&&B===""&&!A.streamJsonInput&&!A.headless)throw new J4("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"
7690
- Or pipe via stdin: echo "your message" | amp --execute`)}function S03(A,Q){if(IA4([i50.parse({tool:"*",action:"allow"})]),GA4({bypass:!0}),fs4(A.settings))j.debug("Enabling permissions plugin"),Q.registerInternalPlugin({name:"permissions",entryPoint:B51})}async function lK0(A,Q,B,$){if(Q.headless)return k03(A,Q,B);let J=await p8(A,Q),Y=await J.serverStatusPromise,Z=await J.configService.getLatest(),F=bA(Y)&&iK0(Y.features,IB.THREAD_ACTORS_TUI),X=F&&!Q.takeMeBack;if(Q.showWelcome&&!F)throw await J.asyncDispose(),new J4("--show-welcome is only available with the new Amp CLI feature flag",1);if(X){let D=!A.executeMode&&await C03();return S03(Z,J.pluginService),v03(A,Q,B,J,{showNpmMigrationWelcome:D})}else{if(Q.threadId&&HQ(Q.threadId)){let D=await YA.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(D?.ok&&D.result.usesThreadActors)throw await J.asyncDispose(),new J4(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return y03(A,Q,B,$,{dependencies:J})}}async function k03(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=gr0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};f2(B,Q);let J=process.hrtime.bigint(),Y=await p8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(SX(Z))throw ft(Z,A.ampURL);let F=bA(Z)?Z:null,X=F?.user.email;await W91(B,Q,Z);let D=kR(Z),G=$r(Q,D);if(G instanceof Error)f5(G.message);if(F&&!QS(Q.mode,X))throw new J4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!O7(X)))throw new J4("Headless executor mode is only available for Amp employees",1);VF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new J4("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!HQ(K))throw new J4(`Invalid thread ID: ${K}`,1);let E=K?void 0:await a03({dependencies:Y,apiKey:U,visibility:G??void 0}),W=K??E?.threadId;if(!W)throw new J4("Failed to resolve headless thread ID",1);let z=await Nf4(W);if(z.status==="already-running")await Y.asyncDispose(),await IW(),process.exit(0);try{await Gf4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:W,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await z.release(),await Y.asyncDispose()}await IW(),process.exit(0)}async function v03(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await K8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;E8A({...Q,streamJson:F},A.executeMode,Y),f2(B,Q),Gv4(),VF0();let X=Q.threadId&&HQ(Q.threadId)?Q.threadId:void 0,D=Q.observe?N2(Q.observe)??VJ(Q.observe):void 0,G=await $.serverStatusPromise;if(SX(G))throw ft(G,A.ampURL);let V=await $.secretStorage.get("apiKey",A.ampURL);if(!V)throw new J4("API key required. Please run `amp login` first.",1);let U=bA(G)&&O7(G.user.email);if(A.executeMode){Ke0($.mcpService,A.settings);try{let K=dK0(B,Q),E=await DI(),W=X?K:yX0({agentMode:Q.mode,explicitEffort:K,sessionState:E}),z=X?void 0:xX0(await hx($.configService),{agentMode:Q.mode,explicitEffort:K,sessionState:E}),H=await bx4({apiKey:V,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:W,labels:Q.label,initialThreadID:X,initialSettings:z});if(await Tb(H,"execute"),Q.archive)await $.threadService.archive(H,!0)}finally{await $.asyncDispose()}await IW(),process.exit(0)}else{let K=dK0(B,Q),E=J.showNpmMigrationWelcome?"npm-migration":"intro",W=Ll($.configService),z=new ts($.fuzzyServer),H=process.cwd();await Rs4({ampURL:A.ampURL,apiKey:V,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??yF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:q})=>qx({fileSystem:$.fileSystem,workspaceRoot:H},q),completionBuilder:z,workspaceRoot:H,listThreads:()=>W.listThreads(),getThreadFromServer:(q)=>W.getThread(q),toolboxes:$.toolboxService.toolboxes,isInternalUser:U,settingsFilePath:$.settingsStorage.getSettingsFilePath()},{initialThreadID:D??X,initialUserInput:Y||void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",showNeoWelcome:Q.showWelcome,neoWelcomeVariant:E,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:K}),process.exit(0)}}async function y03(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(F0,_0)=>{let B0=Number(process.hrtime.bigint()-_0)/1e6,K0=gr0();j.info("Startup phase",{phase:F0,phaseMs:Math.round(B0),sinceMainMs:K0===null?void 0:Math.round(K0)})},{userInput:F,stdinInput:X}=await K8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;E8A({...Q,streamJson:D},A.executeMode,F),f2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await p8(A,Q),U=V.hasAPIKeyAtStartup,K=V.serverStatus==="pending";if(j.info("Interactive auth startup mode",{deferInteractiveAuth:K,hasAPIKeyAtStartup:U,executeMode:A.executeMode,headless:Boolean(Q.headless)}),!J)Z("runMainThread:createThreadDependencies",G);let{serverStatus:E}=V;if(!K&&SX(E))throw ft(E,A.ampURL);let W=bA(E)?E:null,z=W?.user.email,H=!!(z&&O7(z));if(H)VF0();if(!K)await W91(B,Q,E);let q=kR(E),N=q?.features??[],I=q?.team??null,w=$r(Q,q);if(w instanceof Error)f5(w.message);if(W&&!QS(Q.mode,z))throw new J4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let C=Q.threadId&&HQ(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await nK0(V);Z("runMainThread:createWorkerDeps",G);let R=A.executeMode?void 0:async(F0)=>Tb(F0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(F0)=>{let _0=K?await V.serverStatusPromise:E,B0=await UF0(A.settings,process.cwd(),kR(_0),w);if(B0 instanceof Error)f5(B0.message);return m81(O,{threadMeta:B0?nY(B0):void 0,agentMode:F0??Q.mode,onFirstAssistantMessage:R})},validateThreadOwnership:async(F0,_0)=>{if(_0?.nonBlockingOwnershipCheck){Z8A(F0,V.configService,V.viewerUserIDPromise).catch((B0)=>{if(B0 instanceof J4){if(_0.onOwnershipError){_0.onOwnershipError(B0,F0);return}wW(B0,F0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})});return}try{await Z8A(F0,V.configService,V.viewerUserIDPromise)}catch(B0){if(B0 instanceof J4)throw B0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:R,handleError:wW},T=async()=>{try{return kAA(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(F0){if(F0 instanceof J4)throw F0;throw await wW(F0,Q.threadId),Error("handleError should have called process.exit()")}},f=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let F0=await V.configService.getLatest(),_0=ym(F0),B0=await YA.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(_0)});if(B0.ok)return j.info("User free tier status:",B0),B0.result;return}catch(F0){j.error("Failed to fetch free tier status:",F0);return}})(),x=!A.executeMode?new U51:null,k,b=null;if(x)k=x,b=(async()=>{let F0=K?await V.serverStatusPromise:V.serverStatus;if(SX(F0))throw ft(F0,A.ampURL);await W91(B,Q,F0);let _0=process.hrtime.bigint(),B0=await T();if(Z("runMainThread:createThreadPool",_0),x.attach(B0),F){let K0=await y1(B0.threadHandles$);if(!K0)throw new J4("No active thread is available yet.",1);await K0.sendMessage({content:[{type:"text",text:F}]})}})(),b.catch(async(F0)=>{let _0=F0 instanceof Error?F0:Error(String(F0));x.setInitError(_0),await wW(F0,Q.threadId)});else G=process.hrtime.bigint(),k=await T(),Z("runMainThread:createThreadPool",G);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let l=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),R03({configService:V.configService,threadService:V.threadService,config:l,useNotificationsForService:c,threadViewStates$:()=>k.threadHandles$.pipe(u4((F0)=>{if(!F0)return m0.of({});return P6(F0.thread$,F0.threadViewState$).pipe(C1(([_0,B0])=>({[_0.id]:B0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){Ke0(V.mcpService,A.settings);let F0=dK0(B,Q),_0=await DI(),B0=C?F0:yX0({agentMode:Q.mode,explicitEffort:F0,sessionState:_0}),K0={userInput:F,stdinInput:X,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:H,agentMode:Q.mode,reasoningEffort:B0,labels:Q.label},o=await mv4({threadPool:k,...K0});if(await Tb(o,"execute"),Q.archive)await V.threadService.archive(o,!0);await V.asyncDispose(),process.exit(0)}let g=!1,i=!1;if(Q.jetbrains||Q.ide){await i30();let F0=await yX({jetbrainsOnly:Q.jetbrains});if(F0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(F0.length===1){let _0=F0[0];if(_0)u3.selectConfig(_0)}else i=!0}G=process.hrtime.bigint();let d=vt0("0.0.1778160156-gb2be4b",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let Q0=new Ee0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let F0=await y1(k.threadHandles$);if(!F0)throw new J4("No active thread is available yet.",1);await F0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let H0=await DI();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",H0);let a=dK0(B,Q),I0={...H0,launchCount:H0.launchCount+1,lastReasoningEffortByMode:a?{...H0.lastReasoningEffortByMode,[Q.mode]:a}:H0.lastReasoningEffortByMode};EJ((F0)=>({...F0,launchCount:F0.launchCount+1}));try{if(G=process.hrtime.bigint(),await it4({history:new Jo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:YA,threadPool:k,createSystemPromptDeps:async()=>V8A(V),ideClient:u3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:Q0,updateService:d,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:C,showJetBrainsInstaller:g,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:G03,logFile:{path:$},sessionState:I0,freeTierStatusPromise:f,workspace:I??null,features:N,isInternalUser:H,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-07T13:26:26.632Z"},(F0)=>new N51({...F0,threadPool:F0.threadPool},(_0)=>new h81({..._0,threadState:_0.threadState}))),Z("runMainThread:mountApp-returned",G),b)await b}finally{await k.dispose().catch((F0)=>{j.error("Failed to dispose thread pool during shutdown",F0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function p5(A){if(j.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)_J.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7691
- `);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,B=process.stdout.isTTY&&process.stderr.isTTY;j.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let $=await m74({get:async(F)=>{if(F!==bd)return;try{let X=await G8A(E91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==bd)return;await Z03(xt.dirname(E91),{recursive:!0}),await F03(E91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:z90()});se1($);let J=await kf4({...A,workspaceTrust:{current:!0,changes:iT0},getHook:process.env.AMP_URL?(F,X)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return X()}:void 0});if(A.mcpConfig){let F=await Rh4(A.mcpConfig);J=Ph4(J,F)}let Y=xt.dirname(J.getSettingsFilePath());pR4(jx,Y),J=_s1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=j7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!RH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:as4(await Vt0(A,J))}}function x03(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(F,X)=>X.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function f03(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=xt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?D03:la));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function b03(){Jv4();let A=x03(process.argv),Q=f03(process.argv,A),B=Vv4(Q);fZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)o0.level=0;if(U03(j),j.info("Starting Amp CLI.",{version:"0.0.1778160156-gb2be4b",buildTimestamp:"2026-05-07T13:26:26.632Z"}),process.platform==="win32"&&zj())Nb4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new J4(Y7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await T03(B).parseAsync(process.argv)}gR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await b03().catch(wW)});async function u03(A,Q){let B=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!B)await A.settings.set("url",process.env.AMP_URL,"global"),X5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7690
+ Or pipe via stdin: echo "your message" | amp --execute`)}function S03(A,Q){if(IA4([i50.parse({tool:"*",action:"allow"})]),GA4({bypass:!0}),fs4(A.settings))j.debug("Enabling permissions plugin"),Q.registerInternalPlugin({name:"permissions",entryPoint:B51})}async function lK0(A,Q,B,$){if(Q.headless)return k03(A,Q,B);let J=await p8(A,Q),Y=await J.serverStatusPromise,Z=await J.configService.getLatest(),F=bA(Y)&&iK0(Y.features,IB.THREAD_ACTORS_TUI),X=F&&!Q.takeMeBack;if(Q.showWelcome&&!F)throw await J.asyncDispose(),new J4("--show-welcome is only available with the new Amp CLI feature flag",1);if(X){let D=!A.executeMode&&await C03();return S03(Z,J.pluginService),v03(A,Q,B,J,{showNpmMigrationWelcome:D})}else{if(Q.threadId&&HQ(Q.threadId)){let D=await YA.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(D?.ok&&D.result.usesThreadActors)throw await J.asyncDispose(),new J4(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return y03(A,Q,B,$,{dependencies:J})}}async function k03(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=gr0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};f2(B,Q);let J=process.hrtime.bigint(),Y=await p8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(SX(Z))throw ft(Z,A.ampURL);let F=bA(Z)?Z:null,X=F?.user.email;await W91(B,Q,Z);let D=kR(Z),G=$r(Q,D);if(G instanceof Error)f5(G.message);if(F&&!QS(Q.mode,X))throw new J4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!O7(X)))throw new J4("Headless executor mode is only available for Amp employees",1);VF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new J4("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!HQ(K))throw new J4(`Invalid thread ID: ${K}`,1);let E=K?void 0:await a03({dependencies:Y,apiKey:U,visibility:G??void 0}),W=K??E?.threadId;if(!W)throw new J4("Failed to resolve headless thread ID",1);let z=await Nf4(W);if(z.status==="already-running")await Y.asyncDispose(),await IW(),process.exit(0);try{await Gf4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:W,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await z.release(),await Y.asyncDispose()}await IW(),process.exit(0)}async function v03(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await K8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;E8A({...Q,streamJson:F},A.executeMode,Y),f2(B,Q),Gv4(),VF0();let X=Q.threadId&&HQ(Q.threadId)?Q.threadId:void 0,D=Q.observe?N2(Q.observe)??VJ(Q.observe):void 0,G=await $.serverStatusPromise;if(SX(G))throw ft(G,A.ampURL);let V=await $.secretStorage.get("apiKey",A.ampURL);if(!V)throw new J4("API key required. Please run `amp login` first.",1);let U=bA(G)&&O7(G.user.email);if(A.executeMode){Ke0($.mcpService,A.settings);try{let K=dK0(B,Q),E=await DI(),W=X?K:yX0({agentMode:Q.mode,explicitEffort:K,sessionState:E}),z=X?void 0:xX0(await hx($.configService),{agentMode:Q.mode,explicitEffort:K,sessionState:E}),H=await bx4({apiKey:V,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:W,labels:Q.label,initialThreadID:X,initialSettings:z});if(await Tb(H,"execute"),Q.archive)await $.threadService.archive(H,!0)}finally{await $.asyncDispose()}await IW(),process.exit(0)}else{let K=dK0(B,Q),E=J.showNpmMigrationWelcome?"npm-migration":"intro",W=Ll($.configService),z=new ts($.fuzzyServer),H=process.cwd();await Rs4({ampURL:A.ampURL,apiKey:V,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??yF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:q})=>qx({fileSystem:$.fileSystem,workspaceRoot:H},q),completionBuilder:z,workspaceRoot:H,listThreads:()=>W.listThreads(),getThreadFromServer:(q)=>W.getThread(q),toolboxes:$.toolboxService.toolboxes,isInternalUser:U,settingsFilePath:$.settingsStorage.getSettingsFilePath()},{initialThreadID:D??X,initialUserInput:Y||void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",showNeoWelcome:Q.showWelcome,neoWelcomeVariant:E,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:K}),process.exit(0)}}async function y03(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(F0,_0)=>{let B0=Number(process.hrtime.bigint()-_0)/1e6,K0=gr0();j.info("Startup phase",{phase:F0,phaseMs:Math.round(B0),sinceMainMs:K0===null?void 0:Math.round(K0)})},{userInput:F,stdinInput:X}=await K8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;E8A({...Q,streamJson:D},A.executeMode,F),f2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await p8(A,Q),U=V.hasAPIKeyAtStartup,K=V.serverStatus==="pending";if(j.info("Interactive auth startup mode",{deferInteractiveAuth:K,hasAPIKeyAtStartup:U,executeMode:A.executeMode,headless:Boolean(Q.headless)}),!J)Z("runMainThread:createThreadDependencies",G);let{serverStatus:E}=V;if(!K&&SX(E))throw ft(E,A.ampURL);let W=bA(E)?E:null,z=W?.user.email,H=!!(z&&O7(z));if(H)VF0();if(!K)await W91(B,Q,E);let q=kR(E),N=q?.features??[],I=q?.team??null,w=$r(Q,q);if(w instanceof Error)f5(w.message);if(W&&!QS(Q.mode,z))throw new J4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let C=Q.threadId&&HQ(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await nK0(V);Z("runMainThread:createWorkerDeps",G);let R=A.executeMode?void 0:async(F0)=>Tb(F0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(F0)=>{let _0=K?await V.serverStatusPromise:E,B0=await UF0(A.settings,process.cwd(),kR(_0),w);if(B0 instanceof Error)f5(B0.message);return m81(O,{threadMeta:B0?nY(B0):void 0,agentMode:F0??Q.mode,onFirstAssistantMessage:R})},validateThreadOwnership:async(F0,_0)=>{if(_0?.nonBlockingOwnershipCheck){Z8A(F0,V.configService,V.viewerUserIDPromise).catch((B0)=>{if(B0 instanceof J4){if(_0.onOwnershipError){_0.onOwnershipError(B0,F0);return}wW(B0,F0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})});return}try{await Z8A(F0,V.configService,V.viewerUserIDPromise)}catch(B0){if(B0 instanceof J4)throw B0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:R,handleError:wW},T=async()=>{try{return kAA(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(F0){if(F0 instanceof J4)throw F0;throw await wW(F0,Q.threadId),Error("handleError should have called process.exit()")}},f=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let F0=await V.configService.getLatest(),_0=ym(F0),B0=await YA.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(_0)});if(B0.ok)return j.info("User free tier status:",B0),B0.result;return}catch(F0){j.error("Failed to fetch free tier status:",F0);return}})(),x=!A.executeMode?new U51:null,k,b=null;if(x)k=x,b=(async()=>{let F0=K?await V.serverStatusPromise:V.serverStatus;if(SX(F0))throw ft(F0,A.ampURL);await W91(B,Q,F0);let _0=process.hrtime.bigint(),B0=await T();if(Z("runMainThread:createThreadPool",_0),x.attach(B0),F){let K0=await y1(B0.threadHandles$);if(!K0)throw new J4("No active thread is available yet.",1);await K0.sendMessage({content:[{type:"text",text:F}]})}})(),b.catch(async(F0)=>{let _0=F0 instanceof Error?F0:Error(String(F0));x.setInitError(_0),await wW(F0,Q.threadId)});else G=process.hrtime.bigint(),k=await T(),Z("runMainThread:createThreadPool",G);let c=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let l=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),R03({configService:V.configService,threadService:V.threadService,config:l,useNotificationsForService:c,threadViewStates$:()=>k.threadHandles$.pipe(u4((F0)=>{if(!F0)return m0.of({});return P6(F0.thread$,F0.threadViewState$).pipe(C1(([_0,B0])=>({[_0.id]:B0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){Ke0(V.mcpService,A.settings);let F0=dK0(B,Q),_0=await DI(),B0=C?F0:yX0({agentMode:Q.mode,explicitEffort:F0,sessionState:_0}),K0={userInput:F,stdinInput:X,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:H,agentMode:Q.mode,reasoningEffort:B0,labels:Q.label},o=await mv4({threadPool:k,...K0});if(await Tb(o,"execute"),Q.archive)await V.threadService.archive(o,!0);await V.asyncDispose(),process.exit(0)}let g=!1,i=!1;if(Q.jetbrains||Q.ide){await i30();let F0=await yX({jetbrainsOnly:Q.jetbrains});if(F0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(F0.length===1){let _0=F0[0];if(_0)u3.selectConfig(_0)}else i=!0}G=process.hrtime.bigint();let d=vt0("0.0.1778185482-gf00656",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let Q0=new Ee0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let F0=await y1(k.threadHandles$);if(!F0)throw new J4("No active thread is available yet.",1);await F0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let H0=await DI();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",H0);let a=dK0(B,Q),I0={...H0,launchCount:H0.launchCount+1,lastReasoningEffortByMode:a?{...H0.lastReasoningEffortByMode,[Q.mode]:a}:H0.lastReasoningEffortByMode};EJ((F0)=>({...F0,launchCount:F0.launchCount+1}));try{if(G=process.hrtime.bigint(),await it4({history:new Jo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:YA,threadPool:k,createSystemPromptDeps:async()=>V8A(V),ideClient:u3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:Q0,updateService:d,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:C,showJetBrainsInstaller:g,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:G03,logFile:{path:$},sessionState:I0,freeTierStatusPromise:f,workspace:I??null,features:N,isInternalUser:H,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-07T20:28:26.630Z"},(F0)=>new N51({...F0,threadPool:F0.threadPool},(_0)=>new h81({..._0,threadState:_0.threadState}))),Z("runMainThread:mountApp-returned",G),b)await b}finally{await k.dispose().catch((F0)=>{j.error("Failed to dispose thread pool during shutdown",F0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function p5(A){if(j.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)_J.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7691
+ `);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,B=process.stdout.isTTY&&process.stderr.isTTY;j.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let $=await m74({get:async(F)=>{if(F!==bd)return;try{let X=await G8A(E91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==bd)return;await Z03(xt.dirname(E91),{recursive:!0}),await F03(E91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:z90()});se1($);let J=await kf4({...A,workspaceTrust:{current:!0,changes:iT0},getHook:process.env.AMP_URL?(F,X)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return X()}:void 0});if(A.mcpConfig){let F=await Rh4(A.mcpConfig);J=Ph4(J,F)}let Y=xt.dirname(J.getSettingsFilePath());pR4(jx,Y),J=_s1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=j7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!RH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:as4(await Vt0(A,J))}}function x03(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(F,X)=>X.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function f03(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=xt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?D03:la));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function b03(){Jv4();let A=x03(process.argv),Q=f03(process.argv,A),B=Vv4(Q);fZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)o0.level=0;if(U03(j),j.info("Starting Amp CLI.",{version:"0.0.1778185482-gf00656",buildTimestamp:"2026-05-07T20:28:26.630Z"}),process.platform==="win32"&&zj())Nb4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new J4(Y7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await T03(B).parseAsync(process.argv)}gR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await b03().catch(wW)});async function u03(A,Q){let B=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!B)await A.settings.set("url",process.env.AMP_URL,"global"),X5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7692
7692
  `);else if(!RH(A.ampURL))X5.write(`Logging in to ${new URL(A.ampURL).hostname}
7693
7693
  `);let $=process.env.AMP_API_KEY;if($)X5.write(`API key found in environment variable, storing...
7694
7694
  `),await Q.set("apiKey",$,A.ampURL),X5.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1778160156-gb2be4b",
3
+ "version": "0.0.1778185482-gf00656",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {