@sourcegraph/amp 0.0.1778137469-g337d30 → 0.0.1778137759-g2b4034

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 sF0(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=Io(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 Gq5="https://static.ampcode.com/cli/cli-version.txt";async function tF0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Gq5}?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=Io(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 Vq5=604800000;function Ib4(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>Vq5)return{ageMs:B};return null}function Io(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 jt0(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?gV(B):void 0;return{sha:$,age:J}}catch{return null}}L1();c0();import{readFile as Uq5,realpath as Kq5}from"node:fs/promises";import{homedir as Eq5}from"node:os";import{dirname as wb4,join as Rt0}from"node:path";async function Cb4(A){switch(A){case"binary":case"brew":return Wq5(zo());case"npm":case"pnpm":case"yarn":case"bun":return zq5();case"bootstrap":return Hq5()}}async function Wq5(A){let Q=await jD(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 zq5(){try{let A=process.argv[1];if(!A)return null;let Q=await Kq5(A),B=wb4(wb4(Q));return await Mb4(Rt0(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Hq5(){try{let A=process.env.AMP_HOME??Rt0(Eq5(),".amp");return await Mb4(Rt0(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Mb4(A){let Q=await Uq5(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 qq5=3600000,Nq5=5000;function Pt0(A,Q,B={}){let $=new h4,J=$.pipe(nA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??qq5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await hV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await Iq5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await hV(Nq5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let W=Math.min(K,E);await hV(W),E-=W}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function Iq5(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 Ox(),F=Z==="binary"||Z==="brew";B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F});let X;if(F)X=await tF0(A);else{let V=await Hj();X=await sF0(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 Cb4(Z);if(V&&Io(V,X.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:V,latestVersion:X.latestVersion}),J.updatedTo=V,Io(A,V)<0){let U=await CW(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!==zo()){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 No(X.latestVersion,Z),J.updatedTo=X.latestVersion;let V=await CW(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 RD}from"node:process";function Lb4(A){let Q=new vN().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 Et0($.force||!1,$.verbose||!1,"0.0.1778137469-g337d30"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new vN("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 Cq5($.targetVersion)});A.addCommand(B)}function wq5(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 sF0(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=Io(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 Gq5="https://static.ampcode.com/cli/cli-version.txt";async function tF0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Gq5}?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=Io(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 Vq5=604800000;function Ib4(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>Vq5)return{ageMs:B};return null}function Io(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 jt0(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?gV(B):void 0;return{sha:$,age:J}}catch{return null}}L1();c0();import{readFile as Uq5,realpath as Kq5}from"node:fs/promises";import{homedir as Eq5}from"node:os";import{dirname as wb4,join as Rt0}from"node:path";async function Cb4(A){switch(A){case"binary":case"brew":return Wq5(zo());case"npm":case"pnpm":case"yarn":case"bun":return zq5();case"bootstrap":return Hq5()}}async function Wq5(A){let Q=await jD(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 zq5(){try{let A=process.argv[1];if(!A)return null;let Q=await Kq5(A),B=wb4(wb4(Q));return await Mb4(Rt0(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Hq5(){try{let A=process.env.AMP_HOME??Rt0(Eq5(),".amp");return await Mb4(Rt0(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Mb4(A){let Q=await Uq5(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 qq5=3600000,Nq5=5000;function Pt0(A,Q,B={}){let $=new h4,J=$.pipe(nA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??qq5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await hV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await Iq5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await hV(Nq5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let W=Math.min(K,E);await hV(W),E-=W}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function Iq5(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 Ox(),F=Z==="binary"||Z==="brew";B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F});let X;if(F)X=await tF0(A);else{let V=await Hj();X=await sF0(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 Cb4(Z);if(V&&Io(V,X.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:V,latestVersion:X.latestVersion}),J.updatedTo=V,Io(A,V)<0){let U=await CW(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!==zo()){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 No(X.latestVersion,Z),J.updatedTo=X.latestVersion;let V=await CW(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 RD}from"node:process";function Lb4(A){let Q=new vN().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 Et0($.force||!1,$.verbose||!1,"0.0.1778137759-g2b4034"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new vN("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 Cq5($.targetVersion)});A.addCommand(B)}function wq5(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 Cq5(A){let B=process.platform==="win32"&&zj()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:$,renderProgress:J}=wq5(RD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")RD.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){RD.write(o0.blue(`Checking for updates...
5295
- `));let F=!1,X;if(zj()){let D=await tF0("0.0.1778137469-g337d30");F=D.hasUpdate,X=D.latestVersion}else{let D=await Hj(),G=await sF0("0.0.1778137469-g337d30",D);F=G.hasUpdate,X=G.latestVersion}if(!F){let D=jt0("0.0.1778137469-g337d30"),G=D?.age?`released ${D.age} ago`:`built ${gV(new Date("2026-05-07T07:08:21.362Z"))} ago`;RD.write(o0.green(`✓ Amp is already up to date on version ${"0.0.1778137469-g337d30"} (${G})
5296
- `));let V=await CW("0.0.1778137469-g337d30",B);if(V.warning)RD.write(`
5295
+ `));let F=!1,X;if(zj()){let D=await tF0("0.0.1778137759-g2b4034");F=D.hasUpdate,X=D.latestVersion}else{let D=await Hj(),G=await sF0("0.0.1778137759-g2b4034",D);F=G.hasUpdate,X=G.latestVersion}if(!F){let D=jt0("0.0.1778137759-g2b4034"),G=D?.age?`released ${D.age} ago`:`built ${gV(new Date("2026-05-07T07:13:03.500Z"))} ago`;RD.write(o0.green(`✓ Amp is already up to date on version ${"0.0.1778137759-g2b4034"} (${G})
5296
+ `));let V=await CW("0.0.1778137759-g2b4034",B);if(V.warning)RD.write(`
5297
5297
  `+o0.yellow(V.warning)+`
5298
5298
  `);process.exit(0)}if(!X)RD.write(o0.yellow("[WARN] could not find latest version")),process.exit(0);A=X}RD.write(o0.blue(`Updating to version ${A}...
5299
5299
  `)),await No(A,void 0,(F)=>{$(),RD.write(o0.dim(`Running: ${F}
@@ -5730,7 +5730,7 @@ ${$}`).join(`
5730
5730
  `)}function kv5(A){return A.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)}function m41(A){return A.replace(/\[(image(?:\s+\d+)?)\]/gi,"").trim()}function vv5(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 yv5(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}${vv5(J)}`,Z=PI.join(A,Y);try{await Hf(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 xv5(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(qf(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"),qf(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: <${h41(Q.thread.id)}>`,` - Data Studio: <${u41(Q.thread.id)}>`);return $.push("",WG0(Q)),$.join(`
5731
5731
  `)}function p41(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?U5(Z8(Q)):void 0,currentWorkspacePath:U5(Z8(A.currentWorkspace)),clientId:A.clientId,logFile:A.logFile,pid:process.pid}}async function Mi4(A){try{let Q=PI.join("/tmp",`amp-thread-${A.thread.id}-${Date.now()}.json`),B=JSON.stringify(A.thread,null,2);await Hf(Q,B,"utf-8"),await WJ(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 Li4(A){try{let Q=PI.join("/tmp",`amp-thread-${A.thread.id}-${Date.now()}.yaml`),B=b41.default.stringify(A.thread);await Hf(Q,B,"utf-8"),await WJ(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 Oi4(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=EG0(process.pid,B,$);try{try{L4.instance.tuiInstance.suspend(),cr(J,{stdio:"inherit"})}finally{process.stdout.write("\x1B[?25l"),L4.instance.tuiInstance.resume()}j.info("Opened filtered CLI logs",{command:J,pid:process.pid,logFile:lr(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 lA(A.context??A.contextFallback,h41(A.thread.id));return}case"cloudflare-data-studio":{await lA(A.context??A.contextFallback,u41(A.thread.id));return}default:return Error(`Unknown log option: ${Q}`)}}async function ji4(A){let Q=p41(A),B=Ci4(Q),$=!1;try{await L4.instance.tuiInstance.clipboard.writeText(B),$=!0}catch(J){j.error("Failed to copy debug prompt",{error:J})}return new T2(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 fv5(A){return typeof A==="object"&&A!==null&&"label"in A&&typeof A.label==="string"&&"command"in A&&typeof A.command==="string"}async function Ri4(A,Q){if(!fv5(Q))return Error("Select a command from the picker");try{await L4.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 Pi4(A){return new T2(new TA({child:new T6({markdown:WG0(p41(A))})}),"Thread Diagnostics","info","help",{width:100,height:26})}async function _i4(A,Q){let B=A.logFile;if(!B)return Error("CLI log file is unavailable for this session");let $=m41(Q.description);if($.trim().length===0)return Error("Description is required");let J=Q.images,Y=lr(B),Z=process.pid,F=kv5($)||"debug-package",X=Rv5.tmpdir(),D=PI.join(X,`amp-${F}`),G=`${D}.zip`;A.showStatusMessage("Building debug package...");try{cr(`mkdir -p ${D}`);let V=`select(.pid == ${Z})`,U=cr(`cat ${Y} | jq -c '${V}'`,{encoding:"utf-8",maxBuffer:52428800});await Hf(PI.join(D,"cli-logs.json"),U,"utf-8"),await Hf(PI.join(D,"thread.yaml"),b41.default.stringify(A.thread),"utf-8");let K=await yv5(D,J),E=xv5($,p41(A),K);await Hf(PI.join(D,"agent-read-this.md"),E,"utf-8"),cr(`zip -j ${G} ${D}/*`),cr(`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})}}U8();var bv5=80,uv5=20,Ti4=4,hv5=42,xi4=420,fi4=640,gv5=Math.max(32,OU),Si4="░▒▓█▁▂▃▄▅▆▇∿∾∽≋≈∼",zG0=["▁","▂","▃","▄","▅","▆","▇","█"],mv5=["▏","▎","▍","▌","▋","▊","▉","█"],pv5=["▕","▐","▉","▊","▋","▌","▍","▎"],dv5=W0.symmetric(1,0),cv5=W0.all(1),lv5=W0.all(1),iv5={primary:{r:102,g:102,b:102},secondary:{r:255,g:255,b:255}},nv5={primary:{r:77,g:0,b:10},secondary:{r:255,g:77,b:95}};function av5(A){return{borderShape:A?.borderShape??"notched",borderAnimation:A?.borderAnimation??"subtle",titleAnimation:A?.titleAnimation??"none",timeMs:A?.timeMs,animate:A?.animate,seed:A?.seed??hv5}}function bi4(A){switch(A){case"notched":return cv5;case"classic":return dv5}}class SA extends N1{props;constructor(A){super();this.props=A}build(A){let Q=T0.of(A),B=s1.of(A),$=this.props.tone??"default",J=av5(this.props.visualStyle),Y=this.props.bodyFit??{kind:"shrink"},Z=By5(this.props,Y,B,J.borderShape),F=Zy5($,Q),X=c1.all(new l1(F.border,1,"rounded")),D=c41(this.props.header,J.borderShape),G=l41(this.props.footer,J.borderShape),V=Fy5(D===void 0?this.props.header:void 0,F.header,J),U=Vy5(this.props.child,Y),K=G===void 0?Uy5(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??bi4(J.borderShape),q=D===void 0&&typeof this.props.header==="string"?1:0,N=G===void 0?An4(this.props.footer):0,I=new i4({autofocus:z,canRequestFocus:!0,debugLabel:W,onKey:(P)=>{if(P.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}):sv5({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:lv5,child:C});return new t4({fit:"expand",children:[new ui4,new y1({onClick:()=>{},opaque:this.props.barrierOpaque??!0,child:U0.expand()}),new A4({child:O})]})}}class ui4 extends Q8{createRenderObject(){return new hi4}}class hi4 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||ov5(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 ov5(A){return A.char===" "&&A.width===1&&A.hyperlink===void 0&&rv5(A.style)}function rv5(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 c41(A,Q){return Q==="notched"&&typeof A==="string"?A:void 0}function l41(A,Q){if(Q!=="notched")return;if(A===void 0)return[{keys:["Esc"],label:"close"}];if(!HG0(A)||A.length===0)return;return A}function sv5(A){if(A.timeMs!==void 0)return ki4(A,A.timeMs);if(!(A.animate??tv5(A)))return ki4(A,0);return new gi4({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 ki4(A,Q){return new i41({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 tv5(A){return A.titleAnimation!=="none"||A.borderAnimation!=="none"}class gi4 extends v0{props;constructor(A){super();this.props=A}createState(){return new mi4}}class mi4 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()},OU),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>=ri4(this.widget.props.titleAnimation);return!0}build(A){return new i41({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 i41 extends W5{props;constructor(A){super({child:A.child});this.props=A}createRenderObject(){return new d41(this.props)}updateRenderObject(A){N4(A instanceof d41,"unexpected modal surface"),A.update(this.props)}}class d41 extends $4{props;glow;constructor(A){super();this.props=A;this.glow=new O9(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 O9(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=Dy5(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=pi4(Z,{fg:this.props.footerKeyColor,bg:this.props.background},{fg:this.props.footerHintColor,bg:this.props.background,dim:!0}),X=di4(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=Ay5($,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 mv5[B]??"▏";if(A==="right")return pv5[B]??"▕";return zG0[B]??"▁"}mysteriousMessageBorderIndex(A){return Math.max(0,Math.min(zG0.length-1,Math.floor(A*zG0.length)))}mysteriousMessageCornerGlyph(A,Q){let B=this.mysteriousMessageBorderIndex(Q);if(A==="top-left"||A==="top-right")return zG0[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+ir(A)*0.82;switch(this.props.tone){case"default":return iQ(Q,void 0,iv5);case"warning":return iQ(Q,_M);case"success":return iQ(Q,void 0);case"error":return iQ(Q,void 0,nv5)}}sampleBorderIntensity(A,Q,B,$){let J=Math.max(1,B*2+$*2-4),Y=ev5(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 ir(X*0.58+V*0.54)}}function ev5(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 pi4(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 di4(A){return ci4(A).reduce((Q,B)=>Q+B.width,0)}function Ay5(A,Q){if(Q<=0)return[];let B=[],$=0;for(let J of ci4(A)){if($+J.width>Q)return Qy5(B,$,Q,J.style);B.push(J),$+=J.width}return B}function ci4(A){let Q=[];for(let B of A)for(let $ of M4(B.text))Q.push({grapheme:$,style:B.style,width:h6($)});return Q}function Qy5(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 ir(A){return Math.max(0,Math.min(1,A))}function By5(A,Q,B,$){let J=Math.max(0,B.size.width-Ti4),Y=Math.max(0,B.size.height-Ti4),Z=Math.max(A.minWidth??0,$y5(A,$)),F=Math.max(0,Math.min(A.maxWidth??bv5,J));if(Q.kind==="fill"){let G=Jy5(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??uv5,Y)),D=Math.min(A.minHeight??0,X);return new M1(Math.min(Z,F),F,D,X)}function $y5(A,Q){if(Q!=="notched")return 0;let B=0,$=c41(A.header,Q);if($)B=Math.max(B,4+d4(` ${$} `));let J=l41(A.footer,Q);if(J)B=Math.max(B,4+di4(pi4(J,{},{})));return B}function Jy5(A,Q){let B=A.chromePadding??bi4(Q),$=c41(A.header,Q),J=l41(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?Yy5(A.footer):0,D=J===void 0?An4(A.footer):0,G=1;return 2+B.top+B.bottom+Z+F+1+D+X}function Yy5(A){if(A===void 0)return 1;if(A==="none")return 0;if(HG0(A))return A.length===0?0:1;return 1}function Zy5(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 Fy5(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 A4({child:Xy5(A,Q,B)})});return A}function Xy5(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:ni4(A,Q,B.titleAnimation,$)});return new li4({title:A,color:Q,animation:B.titleAnimation})}class li4 extends v0{props;constructor(A){super();this.props=A}createState(){return new ii4}}class ii4 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()},gv5),this.timer.unref()}stopTimer(){if(!this.timer)return;clearInterval(this.timer),this.timer=null}animationComplete(){return Date.now()-this.startedAt>=ri4(this.widget.props.animation)}build(A){return new p({text:ni4(this.widget.props.title,this.widget.props.color,this.widget.props.animation,Date.now()-this.startedAt)})}}function ni4(A,Q,B,$){let J=M4(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,vi4(J,ai4(J,$),Y,Z));case"scramble":return new M("",void 0,vi4(J,oi4(J,$),Y,Z))}}function Dy5(A,Q,B){let $=M4(A);switch(Q){case"none":return A;case"wipe":return ai4($,B).join("");case"scramble":return oi4($,B).join("")}}function vi4(A,Q,B,$){return Q.map((J,Y)=>{let Z=J===A[Y]?B:$;return new M(J,Z)})}function ai4(A,Q){let B=si4(ir(Q/xi4)),$=Math.floor(B*(A.length+1));return A.map((J,Y)=>{if(Y<$)return J;if(Y===$)return"▒";return" "})}function oi4(A,Q){let $=si4(ir(Q/fi4))*(A.length+5),J=Math.floor(Q/45);return A.map((Y,Z)=>{if(ir(($-Z)/5)>=1)return Y;return Gy5(Z,J)})}function Gy5(A,Q){return Si4[(A*7+Q*11)%Si4.length]??"░"}function ri4(A){if(A==="scramble")return fi4;return xi4}function si4(A){return 1-(1-A)**3}function Vy5(A,Q){let B=Q.kind==="fill"?"tight":"loose";return new P2({fit:B,child:new ti4({child:A})})}class ti4 extends W5{constructor({child:A}){super({child:A})}createRenderObject(){return new ei4}}class ei4 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 Uy5(A,Q){if(A===void 0)return yi4([{keys:["Esc"],label:"close"}],Q);if(HG0(A))return A.length===0?new U0({height:0}):yi4(A,Q);if(A==="none")return new U0({height:0});return A}function HG0(A){return Array.isArray(A)}function An4(A){return A===void 0||HG0(A)&&A.length>0?1:0}function yi4(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 A4({child:p.spans(J)})}function Ey5(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 Wy5(A,Q){try{await L4.instance.tuiInstance.clipboard.writeText(A.command)}catch(B){j.error("Failed to copy debug command from Neo command palette",{error:B})}finally{Q()}}function zy5(A,Q){let B=EG0(process.pid,{path:A},"less -R +G");Q();try{L4.instance.tuiInstance.suspend(),Ky5(B,{stdio:"inherit"})}catch($){j.error("Failed to open filtered CLI logs in pager",{error:$,command:B})}finally{process.stdout.write("\x1B[?25l"),L4.instance.tuiInstance.resume()}}function Qn4(A){return[{noun:"debug",verb:"page logs",description:"View CLI logs in pager",status:{type:"enabled"},run:(Q,B,$)=>{zy5(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:Ey5(A),getLabel:(Y)=>Y.label,showBorder:!1,onAccept:(Y)=>{Wy5(Y,$)},onDismiss:J})}))}}]}var Nf="exit-app-key-pressed",If="cancel-key-pressed",TI="loading-thread",wf="previous-thread-reference",Cf="double-enter-steer";class ar extends l4{}class qG0 extends l4{}class NG0 extends l4{}class or extends l4{visualIndex;constructor(A){super();this.visualIndex=A}}class rr extends l4{}class IG0 extends l4{}class sr extends l4{}class Mf extends l4{}class Lf extends l4{}class tr extends l4{}class er extends l4{}class As extends l4{}class Of extends l4{}class tB 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 wG0 extends l4{}class Qs extends l4{}class CG0 extends l4{}class MG0 extends l4{}class Bs extends l4{}class $s extends l4{}class Js extends l4{}class LG0 extends l4{}class OG0 extends l4{}class jG0 extends l4{}class JR extends l4{}class Ys extends l4{}class n41 extends l4{mode;constructor(A){super();this.mode=A}}I3();r1();var Bn4=process.platform==="win32"?" ":"█",$n4=process.platform==="win32"?"░":"█";class F2 extends v0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:A,controller:Q,getScrollInfo:B,thickness:$=1,trackChar:J=Bn4,thumbChar:Y=$n4,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 Jn4}}class Jn4 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 y1({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?a6.POINTER:a6.DEFAULT,child:new Yn4({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 Yn4 extends BI{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:A,controller:Q,getScrollInfo:B,thickness:$=1,trackChar:J=Bn4,thumbChar:Y=$n4,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 Zn4(this)}updateRenderObject(A){A.updateWidget(this)}}class Zn4 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 Fn4=1;class aY extends v0{props;constructor(A){super();this.props=A}createState(){return new Xn4}}class Xn4 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 Dn4({thickness:Fn4,onMeasured:this.setMeasuredHeight,scrollable:new TA({controller:B,autofocus:this.widget.props.autofocus??!0,keyboardScrolling:!0,child:this.widget.props.child}),scrollbar:new F2({controller:B,thickness:Fn4,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:this.getScrollInfo})})}__testing={isOwned:()=>this.ownership.owned,controller:()=>this.ownership.controller}}class Dn4 extends L9{thickness;onMeasured;constructor({scrollable:A,scrollbar:Q,thickness:B,onMeasured:$}){super({children:[A,Q]});this.thickness=B,this.onMeasured=$}createRenderObject(){return new Gn4(this.thickness,this.onMeasured)}}class Gn4 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 Vn4=10;class a41 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 Un4}}class Un4 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 O5(A)}detailPrefix(A){if(A.length===0)return` ${" ".repeat(Vn4)}`;return` ${`${A}:`.padEnd(Vn4," ")}`}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)})})];return this.plugins.map((F)=>{let X=F.uri.toString(),D=X.startsWith("file://"),G=()=>{lA(A,X)},V=F.status==="active"?new v({color:B.toolSuccess}):F.status==="error"?new v({color:B.toolError}):new v({color:$.warning}),U=new p({text:new M(this.relativePath(F.uri),D?Z:new v({color:B.command}),void 0,D?AI(X):void 0,D?G:void 0),maxLines:1,overflow:"ellipsis"}),K=D?new y1({cursor:"pointer",onClick:G,child:U}):U,E=[new e0({children:[new p({text:new M(F.status,V,[new M(" ",J)]),maxLines:1,overflow:"clip"}),new P2({fit:"loose",child:K})]})];if(F.errorMessage)E.push(new p({text:new M(this.detailPrefix("Error"),J,[new M(`see logs: ${this.widget.logFilePath}`,new v({color:B.toolError}))]),maxLines:1,overflow:"ellipsis"}));if(F.registeredEvents.length>0)E.push(new p({text:new M(this.detailPrefix("Events"),J,[new M(F.registeredEvents.join(", "),Y)]),maxLines:1,overflow:"ellipsis"}));for(let[W,z]of F.registeredCommands.entries())E.push(new p({text:new M(W===0?this.detailPrefix("Commands"):this.detailPrefix(""),J,[new M(`${z.category}: ${z.title}`,Y)]),maxLines:1,overflow:"ellipsis"}));for(let[W,z]of F.registeredTools.entries())E.push(new p({text:new M(W===0?this.detailPrefix("Tools"):this.detailPrefix(""),J,[new M(z.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:E})})})}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} ${z4(this.plugins.length,"plugin")} active (${B} ${z4(B,"command")}, ${$} ${z4($,"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 P2({fit:"loose",child:new aY({child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:this.pluginRows(A)})})})]})})}}function Kn4(A){return[{noun:"plugins",verb:"list",description:"List all loaded plugins",keywords:["extensions","tools","commands"],status:{type:"enabled"},run:(Q,B,$)=>{Q.push(new a41({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 Zs extends l4{}class jf extends l4{}class o41 extends v0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new En4}}class En4 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 BA({actions:new Map([[Zs,new D4(()=>B())],[jf,new D4(()=>$())]]),child:new g5({debugLabel:"NeoConfirmDialogShortcuts",shortcuts:Hy5(),child:new aY({child:Y})})})})}}function Hy5(){return new Map([[T1.key("y"),new Zs],[T1.shift("Y"),new Zs],[T1.shift("y"),new Zs],[T1.key("n"),new jf],[T1.shift("N"),new jf],[T1.shift("n"),new jf],[T1.key("Escape"),new jf]])}class Fs extends v0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new Wn4}}class Wn4 extends S0{controller=new C8;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 e0({children:[new p({text:new M("> ",new v({color:B.command}))}),new _1({child:new nB({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 r41 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:qy5(this.props)})}}function qy5(A){let Q=A.options.options.map((B)=>({value:B,label:B}));return new $9({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 s41{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 Fs({key:new LW(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 o41({key:new LW(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)})];case"select":return[new r41({key:new LW(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;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()}}Kl();N2();import{readFile as Ny5}from"node:fs/promises";import t41 from"node:os";async function zn4(A,Q){try{return{path:Q,contents:yh0(await Ny5(A,"utf8"))}}catch{return null}}async function Hn4(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(s$(J),null,2)});let Y=await zn4(Fx(Q),`logs/${Q}.log`);if(Y)B.push(Y);let Z=await zn4(A.settingsFilePath,"settings/global.json");if(Z)B.push(Z);let F=await Ox()??"unknown",X=await YA.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778137469-g337d30",clientOS:`${t41.platform()} ${t41.release()} ${t41.arch()}`,installMethod:F}},{config:A.configService});if(!X.ok)throw Error(`Failed to submit report: ${X.error.message}`);return X.result.reportID}class e41{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();c9();N2();async function qn4(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:lY(B)},{config:A.configService});if(!J.ok)throw Error(J.error.message);let Y=!1;if(B!=="private"){let F=CB(new URL(A.ampURL),Q).toString();try{await L4.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 nQ(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 RG0 extends W5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new AA1(this.offstage)}updateRenderObject(A){if(A instanceof AA1)A.offstage=this.offstage}}class AA1 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 QA1{_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 BA1 extends v0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Nn4}}class Nn4 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 RG0({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 RG0({key:$.key,offstage:!J,child:Y}))}return new t4({fit:"expand",children:Q})}}class JA1 extends N1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=Iy5(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=$A1($);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($A1($.item),Y),D=pj($A1(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 In4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class In4 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:wy5(Q.shortcut,Z,$)});return new wn4({columns:W,padding:W0.horizontal(1),backgroundColor:D})}}function $A1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Iy5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,d4(B.noun)):Q},0)}function wy5(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 wn4 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 e0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new g0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class YA1{#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 oY extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=oY.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(oY)?.commandRegistry??null}}class ZA1 extends v0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Cn4}}class Cn4 extends S0{modalStack=new QA1;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=oY.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=oY.of(A).commands,B=new JA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new BA1({root:B,controller:this.modalStack})}}var FA1=[{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"]}]}],XA1=[{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 PG0 extends N1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=s1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new f0({padding:W0.only({left:4}),child:X})]});else D=new e0({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 DA1 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 Mn4}}class Mn4 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=s1.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 P=O.noun?.toLowerCase();return P!=="dev"&&P!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,P)=>{let S=(O.noun??"").toLowerCase(),T=(P.noun??"").toLowerCase(),f=S.localeCompare(T);if(f!==0)return f;let h=O.verb.toLowerCase(),x=P.verb.toLowerCase(),k=h.localeCompare(x);if(k!==0)return k;return O.id.localeCompare(P.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 A4({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()}}Kl();N2();import{readFile as Ny5}from"node:fs/promises";import t41 from"node:os";async function zn4(A,Q){try{return{path:Q,contents:yh0(await Ny5(A,"utf8"))}}catch{return null}}async function Hn4(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(s$(J),null,2)});let Y=await zn4(Fx(Q),`logs/${Q}.log`);if(Y)B.push(Y);let Z=await zn4(A.settingsFilePath,"settings/global.json");if(Z)B.push(Z);let F=await Ox()??"unknown",X=await YA.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778137759-g2b4034",clientOS:`${t41.platform()} ${t41.release()} ${t41.arch()}`,installMethod:F}},{config:A.configService});if(!X.ok)throw Error(`Failed to submit report: ${X.error.message}`);return X.result.reportID}class e41{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();c9();N2();async function qn4(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:lY(B)},{config:A.configService});if(!J.ok)throw Error(J.error.message);let Y=!1;if(B!=="private"){let F=CB(new URL(A.ampURL),Q).toString();try{await L4.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 nQ(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 RG0 extends W5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new AA1(this.offstage)}updateRenderObject(A){if(A instanceof AA1)A.offstage=this.offstage}}class AA1 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 QA1{_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 BA1 extends v0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new Nn4}}class Nn4 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 RG0({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 RG0({key:$.key,offstage:!J,child:Y}))}return new t4({fit:"expand",children:Q})}}class JA1 extends N1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=Iy5(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=$A1($);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($A1($.item),Y),D=pj($A1(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 In4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class In4 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:wy5(Q.shortcut,Z,$)});return new wn4({columns:W,padding:W0.horizontal(1),backgroundColor:D})}}function $A1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function Iy5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,d4(B.noun)):Q},0)}function wy5(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 wn4 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 e0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new g0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class YA1{#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 oY extends q6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=oY.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(oY)?.commandRegistry??null}}class ZA1 extends v0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Cn4}}class Cn4 extends S0{modalStack=new QA1;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=oY.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=oY.of(A).commands,B=new JA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new BA1({root:B,controller:this.modalStack})}}var FA1=[{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"]}]}],XA1=[{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 PG0 extends N1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=s1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new f0({padding:W0.only({left:4}),child:X})]});else D=new e0({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 DA1 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 Mn4}}class Mn4 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=s1.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 P=O.noun?.toLowerCase();return P!=="dev"&&P!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,P)=>{let S=(O.noun??"").toLowerCase(),T=(P.noun??"").toLowerCase(),f=S.localeCompare(T);if(f!==0)return f;let h=O.verb.toLowerCase(),x=P.verb.toLowerCase(),k=h.localeCompare(x);if(k!==0)return k;return O.id.localeCompare(P.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 A4({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 PG0({items:FA1.filter((O)=>O.submitOnEnterOnly===void 0||O.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(O)=>{let P=[];for(let T of O.methods){let f=this.buildCleanKeyCombination(T);P.push(f)}let S=P.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 PG0({items:XA1,renderRow:(O)=>{let P=[];for(let T of O.methods){let f=this.buildCleanKeyCombination(T);P.push(f)}let S=P.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
@@ -5831,7 +5831,7 @@ Ctrl-X, Y, Z to unlock`;if(E){let a=G.text.replace(/`([^`]+)`/g,"$1")+`
5831
5831
  `))}function qh5(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 ir4(A,Q){let B=A.replace(/\s+/g," ").trim();if(d4(B)<=Q)return B;let $="...",J=d4($);if(Q<=J)return bF($,Q);return`${bF(B,Q-J,!0,"")}${$}`}var rr4="https://ampcode.com/news/neo",d61=[{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:rr4,href:rr4},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}],ff=50,GR=40,m61=1000,Nh5=420,Ih5=760,wh5=-250,Ch5=1100,YV0=33,sr4=0.999,Mh5=2.1,mW=d61.length,Lh5=mW-2,Oh5=720,jh5=420,Ys4="Meet the new",Zs4="Amp",Fs4="CLI",c61=M4(Ys4).length,Rh5=M4(Zs4).length,Ph5=M4(Fs4).length,ZV0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},tr4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},er4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},As4=[ZV0,tr4,er4,ZV0,tr4,er4,ZV0],_h5=ZV0;class l61 extends v0{onDismiss;animationProgress;constructor(A){super();this.onDismiss=A.onDismiss,this.animationProgress=A.animationProgress}createState(){return new Xs4}}class Xs4 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=m61;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 O9(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=rY(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=sr4,this.firstStageHintVisible=this.animationProgress>=sr4,this.firstStageTitleRevealProgress=this.firstStageTitleVisible?1:0,this.firstStageHintRevealProgress=this.firstStageHintVisible?1:0;return}this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0,this.startProgressAnimation({from:0,to:1,durationMs:m61,onComplete:()=>{}}),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=rY(A/Ih5);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},YV0)}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.introStage>=mW-1){this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<mW-1)return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.introStage>=mW-1)return;this.moveIntroStage(1)}goToPreviousIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<=0)return;this.moveIntroStage(-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,$=rY(B/Nh5);if(this.setState(()=>{if(this.stageTransitionProgress=$,$>=1)this.previousIntroStage=null}),$>=1)this.stopStageTransitionTimer()},YV0)}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=rY(J/this.animationDurationMs),Z=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*bf(Y);if(this.setState(()=>{this.animationProgress=Z}),Y>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},YV0)}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,m61+wh5),Q=A+Ch5;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?rY((A-this.firstStageTitleRevealStartedAt)/Oh5):this.firstStageTitleRevealProgress,B=this.firstStageHintRevealStartedAt?rY((A-this.firstStageHintRevealStartedAt)/jh5):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=B}),Q>=1&&B>=1)this.stopFirstStageRevealTimer()},YV0)}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=Qs4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:Bs4(Qs4(this.previousIntroStage),A,bf(this.stageTransitionProgress));return this.dismissProgress>0?Bs4(Q,_h5,bf(this.dismissProgress)):Q}build(A){let Q=R1.of(A).colorScheme,B=T0.of(A),$=this.currentOrbPalette(),J=iQ(1,"frontier",$),Y=s1.of(A).size,F=this.widget.animationProgress??this.animationProgress,X=Math.max(Y.width/ff,Y.height/GR)*Mh5,D=X+(1-X)*F,G=bf(this.dismissProgress),V=Math.max(ff,Math.round(ff*D)),U=Math.max(GR,Math.round(GR*D)),K=Math.round((Y.width-V)/2),E=Math.round((Y.height-U)/2),W=Math.max(0,Math.floor((Y.width-ff)/2)),z=-Math.floor(GR/2),H=Math.round(K+(W-K)*F),q=Math.round(E+(z-E)*F),N=H+V/2,I=q+U/2,w=Th5({dismissProgress:this.dismissProgress,easedDismissProgress:G,introOrbScale:D,normalOrbCenterX:N,normalOrbCenterY:I,size:Y}),C=Math.max(ff,Math.round(ff*w.orbScale)),O=Math.max(GR,Math.round(GR*w.orbScale)),P=w.orbCenterX,S=w.orbCenterY,T=Math.round(P-C/2),f=Math.round(S-O/2),h=Math.max(3,Math.min(Y.height-5,Math.floor(GR/2)+2)),x=Math.max(h+3,Y.height-3),k=w.textDissolveProgress,b=this.introStage>=mW-1?w.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&k<1,l=c&&this.firstStageHintVisible,g=l&&this.introStage>0&&this.introStage<mW-1,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 Tx({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 Tx({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:($0)=>{if($0.key==="Enter")return this.advanceIntroStage(),"handled";if(($0.key===" "||$0.key==="Space")&&this.introStage<mW-1)return this.advanceIntroStage(),"handled";if($0.key==="Escape"||$0.key==="Esc")return this.dismissFromFinalIntroStage()?"handled":"ignored";if($0.key==="ArrowRight")return this.nextIntroStage(),"handled";if($0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new t4({fit:"expand",children:[new Ds4({color:Q.background,dissolveProgress:b}),new t4({fit:"expand",children:[new y1({onClick:()=>{},child:U0.expand()}),new EA({left:T,top:f,width:C,height:O,child:_0}),...c?[new EA({left:a,top:I0,width:Q0,height:H0,child:kh5({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 EA({left:a,top:Math.max(0,x-1),width:Q0,height:1,child:new p({text:uh5({stage:this.introStage,foreground:Q.mutedForeground,dissolveProgress:k}),textAlign:"center"})})]:[],new EA({left:a,top:x,width:Q0,height:1,child:new p({text:hh5({stage:this.introStage,foreground:Q.mutedForeground,keybind:B.app.keybind,revealProgress:d,dissolveProgress:k}),textAlign:"center"})})]:[]]})]})})}}class Ds4 extends Q8{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new Gs4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class Gs4 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=rY(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(!Sh5(G,D,Y,Z,X))A.fill($+G,J+D,1,1," ",F)}}function rY(A){return Math.min(1,Math.max(0,A))}function bf(A){return 1-(1-A)**3}function Qs4(A){return As4[A]??As4[0]}function Bs4(A,Q,B){return{primary:Lj(A.primary,Q.primary,B),secondary:Lj(A.secondary,Q.secondary,B)}}function Th5({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:rY(A/0.52),backdropDissolveProgress:bf(rY((A-0.12)/0.88))}}function Sh5(A,Q,B,$,J){let Y=$<=1?0:Q/($-1),Z=Vs4(A+Q*Math.max(1,B));return(1-Y)*0.72+Z*0.28<J}function kh5({stage:A,previousStage:Q,progress:B,direction:$,width:J,height:Y,foreground:Z,mutedForeground:F,accent:X,link:D,keybind:G,titleRevealProgress:V,dissolveProgress:U,context:K}){if(Q===null||B>=1)return p61({stage:A,foreground:Z,mutedForeground:F,accent:X,link:D,keybind:G,titleRevealProgress:V,dissolveProgress:U,context:K});let E=bf(B),W=$*Math.round((1-E)*J),z=-$*Math.round(E*J);return new PW(new t4({fit:"expand",children:[new EA({left:z,top:0,width:J,height:Y,child:p61({stage:Q,foreground:Z,mutedForeground:F,accent:X,link:D,keybind:G,titleRevealProgress:Q===0?1:V,dissolveProgress:U,context:K})}),new EA({left:W,top:0,width:J,height:Y,child:p61({stage:A,foreground:Z,mutedForeground:F,accent:X,link:D,keybind:G,titleRevealProgress:V,dissolveProgress:U,context:K})})]}))}function p61({stage:A,foreground:Q,mutedForeground:B,accent:$,link:J,keybind:Y,titleRevealProgress:Z,dissolveProgress:F,context:X}){let D=d61[A]??d61[0],G=new v({color:$,bold:!0}),V=new v({color:Q}),U=[...D.title===null?[]:[new p({text:A===0?FV0(xh5({progress:Z,foreground:$,pulseColor:$}),F):new M(pW(D.title,F),G),textAlign:"center"})],...D.body.length>0?[vh5()]:[],...D.body.map((K)=>yh5(K,V,B,J,Y,F,X))];return new A4({child:new f0({padding:W0.horizontal(1),child:new x0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:U})})})}function vh5(){return U0.height(1)}function yh5(A,Q,B,$,J,Y,Z){if(typeof A==="string")return new p({text:new M(pW(A,Y),Q),textAlign:"center"});if("keybind"in A)return new p({text:new M("",void 0,[new M(pW(A.text,Y),new v({color:B,dim:!0})),new M(pW(A.keybind,Y,M4(A.text).length),new v({color:J}))]),textAlign:"center"});if("highlightText"in A){let F=HA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=hD.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,()=>{lA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new M(A.textAfter,Q)]);return new p({text:FV0(D,Y),textAlign:"center"})}if("linkText"in A){let F=HA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=hD.of(Z),D=new M("",void 0,[new M(A.text,Q),new M(F.text,F.style,F.children,F.hyperlink,()=>{lA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new M(A.textAfter,Q)]);return new p({text:FV0(D,Y),textAlign:"center"})}if(Y>0)return new p({text:new M(pW(A.text,Y),new v({color:$,underline:!0})),textAlign:"center"});return new A4({child:HA.createWidget(Z,A.href,A.text,new v({color:$,underline:!0}))})}function xh5({progress:A,foreground:Q,pulseColor:B}){let $=new v({color:Q,bold:!0}),J=new v({color:bh5({progress:A,foreground:Q,pulseColor:B}),bold:!0});return new M("",void 0,[new M(fh5(A).padEnd(c61," "),$),new M(" ",$),new M($s4(Zs4,Rh5,A,0.72),$),new M(" ",$),new M($s4(Fs4,Ph5,A,0.88),J)])}function fh5(A){let Q=M4(Ys4),B=Math.min(c61,Math.ceil(rY(A/0.62)*c61));return Q.slice(0,B).join("")}function $s4(A,Q,B,$){return B>=$?A:"".padEnd(Q," ")}function bh5({progress:A,foreground:Q,pulseColor:B}){if(A<0.88||A>=1)return Q;let $=rY((A-0.88)/0.12);return Math.cos($*Math.PI*4)*(1-$)>0.12?B:Q}function uh5({stage:A,foreground:Q,dissolveProgress:B}){return new M(pW(`${A}/${Lh5}`,B),new v({color:Q,dim:!0}))}function hh5({stage:A,foreground:Q,keybind:B,revealProgress:$,dissolveProgress:J}){let Y=new v({color:B}),Z=new v({color:Q,dim:!0}),F=A>=mW-1?"Enter":"Space",X=A>=mW-1?" to get started":" to continue",D=Js4(F,$),G=Js4(X,rY(($*(M4(F).length+M4(X).length)-M4(F).length)/M4(X).length));return new M("",void 0,[new M(pW(D,J),Y),new M(pW(G,J),Z)])}function Js4(A,Q){let B=M4(A),$=Math.min(B.length,Math.ceil(rY(Q)*B.length));return B.slice(0,$).join("").padEnd(B.length," ")}function FV0(A,Q,B=0){if(Q<=0)return A;let $=B+M4(A.text??"").length,J=A.children?.map((Y)=>{let Z=FV0(Y,Q,$);return $+=M4(Y.toPlainText()).length,Z});return new M(A.text?pW(A.text,Q,B):A.text,A.style,J,A.hyperlink,A.onClick)}function pW(A,Q,B=0){if(Q<=0)return A;return M4(A).map((J,Y)=>{if(J.trim()==="")return J;return Vs4(B+Y)<Q?" ":J}).join("")}function Vs4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}c0();N2();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(hU(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(hU(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(hU(F,D),new v({color:B.foreground,dim:$,bold:!$})));else J.push(new M(hU(F,D),new v({color:B.foreground,dim:$,bold:!$})));return J}class i61 extends l4{}class n61 extends l4{}function gh5(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 mh5(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(`
5832
5832
 
5833
5833
  `)),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 ph5(A,Q,B){let $=mh5(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 BA.maybeInvoke(Q,new tB(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new D4(()=>{return lA(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 BA({actions:new Map([[i61,Y],[n61,Z]]),child:new g5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[T1.key("o"),new n61],[T1.key("y"),new i61]]),child:new m4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Us4(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(gh5(J,Y.error),"error",5000),$();return}Q.push(ph5(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 dh5=250,ch5=2000;function lh5({ampURL:A,threadID:Q,logPath:B}){return[`Debug thread ${CB(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(`
5834
- `)}class a61 extends v0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;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.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 Es4}}class Es4 extends S0{editorController=new C8;commandPalette=new Qr(this);commandRegistry=new YA1;toastController=new ge0;exitHintTimer=new nx(this,1000);ideStatus=new b8(this,{});threadNavigationHistory=new e41;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)=>Hn4({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);setThreadVisibility=(A,Q)=>{return qn4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService},A,Q)};archiveThread=async(A)=>{let Q=await Nd4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Id4({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 wd4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(lB.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(T30(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 s41({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=L4.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()},dh5),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<ch5)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?Kn4({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)=>aA1({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()}},Us4({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 wA1({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 g61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await lA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{WJ(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 NA1({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 GA1({commands:oY.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(ve0({version:"0.0.1778137469-g337d30",buildTimestamp:"2026-05-07T07:08:21.362Z",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)=>{BA.maybeInvoke(Y,new Of)}},...Q,...Qn4(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 h61({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=s1.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 ZA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Z.push(aA1({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 l61({onDismiss:this.dismissNeoWelcome})}));if(Z.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Z.push(new HA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ss.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Z.push(new qA1);return new R3({neoContext:this.widget.neoContext,child:new oY({commandRegistry:this.commandRegistry,child:new SI({completionBuilder:this.widget.completionBuilder,child:new v5({controller:this.toastController,child:new BA({actions:this.buildActions(),child:new g5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[T1.ctrl("c"),new IG0],[T1.ctrl("o"),new wG0],[T1.alt("i"),new MG0],[T1.alt("p"),new GI],[T1.ctrl("t"),new LG0]]),child:new m4({debugLabel:"AppShellFocus",child:new me0({controller:this.toastController,child:new t4({children:Z})})})})})})})})})}buildActions(){let A=new D4(()=>{if(EJ.hasAnyCopyableSelection())return EJ.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 L4.instance.stop(),"handled"}),Y=new D4((U)=>{if(!U.text)return"ignored";return L4.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 L4.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=Fx(U);return L4.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 L4.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([[IG0,A],[tr,$],[Of,J],[tB,Y],[Qs,B],[wG0,Q],[MG0,F],[Bs,X],[$s,D],[Js,G],[GI,Z],[LG0,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:lh5({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:Fx(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 bx(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,$=iB(Q),J=SX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return TX0(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=Ks4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(xZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ks4(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(Nf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),L4.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,Ss.cwd()),this.widget.history.reset();let Z=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,B?lY(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 $=iB(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};KJ((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=NY0(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=zA1(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=Ss.cwd().replace(Ss.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,Ss.stdout.write(QI(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 Ks4(A,Q,B){let $={...A};for(let J of ih5(Q,B)){if(!xZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function ih5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function Ws4(A,Q,B,$){let J=oT(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 gY(G,V),K=new O9(42),E=new JI(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 P=0;P<V;P++)if(W[P].some((S)=>S.char!==" ")){z=P;break}let H=V-1;for(let P=V-1;P>=0;P--)if(W[P].some((S)=>S.char!==" ")){H=P;break}function q(P,S){if(!P)return"";if(P.type==="rgb"){let{r:T,g:f,b:h}=P.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 P=z;P<=H;P++){let S="";for(let T=0;T<G;T++){let f=W[P][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 P=0;P<w;P++){let S=" ".repeat(G);if(P>=C&&P<C+I)S=N[P-C];let T=" ",f="";if(P>=O&&P<O+D.length)f=D[P-O];B.write(S+T+f+`
5834
+ `)}class a61 extends v0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;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.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 Es4}}class Es4 extends S0{editorController=new C8;commandPalette=new Qr(this);commandRegistry=new YA1;toastController=new ge0;exitHintTimer=new nx(this,1000);ideStatus=new b8(this,{});threadNavigationHistory=new e41;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)=>Hn4({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);setThreadVisibility=(A,Q)=>{return qn4({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService},A,Q)};archiveThread=async(A)=>{let Q=await Nd4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Id4({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 wd4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(lB.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(T30(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 s41({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=L4.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()},dh5),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<ch5)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?Kn4({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)=>aA1({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()}},Us4({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 wA1({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 g61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await lA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{WJ(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 NA1({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 GA1({commands:oY.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(ve0({version:"0.0.1778137759-g2b4034",buildTimestamp:"2026-05-07T07:13:03.500Z",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)=>{BA.maybeInvoke(Y,new Of)}},...Q,...Qn4(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 h61({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=s1.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 ZA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Z.push(aA1({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 l61({onDismiss:this.dismissNeoWelcome})}));if(Z.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Z.push(new HA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ss.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Z.push(new qA1);return new R3({neoContext:this.widget.neoContext,child:new oY({commandRegistry:this.commandRegistry,child:new SI({completionBuilder:this.widget.completionBuilder,child:new v5({controller:this.toastController,child:new BA({actions:this.buildActions(),child:new g5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[T1.ctrl("c"),new IG0],[T1.ctrl("o"),new wG0],[T1.alt("i"),new MG0],[T1.alt("p"),new GI],[T1.ctrl("t"),new LG0]]),child:new m4({debugLabel:"AppShellFocus",child:new me0({controller:this.toastController,child:new t4({children:Z})})})})})})})})})}buildActions(){let A=new D4(()=>{if(EJ.hasAnyCopyableSelection())return EJ.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 L4.instance.stop(),"handled"}),Y=new D4((U)=>{if(!U.text)return"ignored";return L4.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 L4.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=Fx(U);return L4.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 L4.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([[IG0,A],[tr,$],[Of,J],[tB,Y],[Qs,B],[wG0,Q],[MG0,F],[Bs,X],[$s,D],[Js,G],[GI,Z],[LG0,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:lh5({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:Fx(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 bx(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,$=iB(Q),J=SX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return TX0(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=Ks4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(xZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=Ks4(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(Nf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),L4.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,Ss.cwd()),this.widget.history.reset();let Z=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,B?lY(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 $=iB(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};KJ((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=NY0(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=zA1(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=Ss.cwd().replace(Ss.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,Ss.stdout.write(QI(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 Ks4(A,Q,B){let $={...A};for(let J of ih5(Q,B)){if(!xZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function ih5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function Ws4(A,Q,B,$){let J=oT(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 gY(G,V),K=new O9(42),E=new JI(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 P=0;P<V;P++)if(W[P].some((S)=>S.char!==" ")){z=P;break}let H=V-1;for(let P=V-1;P>=0;P--)if(W[P].some((S)=>S.char!==" ")){H=P;break}function q(P,S){if(!P)return"";if(P.type==="rgb"){let{r:T,g:f,b:h}=P.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 P=z;P<=H;P++){let S="";for(let T=0;T<G;T++){let f=W[P][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 P=0;P<w;P++){let S=" ".repeat(G);if(P>=C&&P<C+I)S=N[P-C];let T=" ",f="";if(P>=O&&P<O+D.length)f=D[P-O];B.write(S+T+f+`
5835
5835
  `)}if($)B.write(`
5836
5836
  \x1B[90m${$}\x1B[0m
5837
5837
  `)}c0();mX0();var nh5=2000;function zs4(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<nh5)return;if(J=U,Pj())return;if(mF0())pF0();else JZ0(V)},Z=(V)=>{if(!Q||!B)return;if(Pj()&&!io()&&!Px())return;process.stdout.write(_D(`\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&&pB(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 ah5({initialUserInput:A,showNeoWelcome:Q,neoWelcomeDismissed:B}){if(Q)return{show:!0,markDismissedOnDismiss:!0};let $=!A&&!B;return{show:$,markDismissedOnDismiss:$}}async function oh5(A){await KJ((Q)=>yX0(Q,A,"interactive"))}async function Hs4(A,Q={}){let{initialThreadID:B,initialUserInput:$,openThreadPickerOnStart:J=!1,observerOnly:Y=!1,initialAgentMode:Z,initialReasoningEffort:F,showNeoWelcome:X=!1}=Q,D=async(I)=>{let w=await A.getThreadFromServer(I);if(!w)return null;return jF0(w)},G=async(I)=>{let w=await A.getThreadFromServer(I);if(!w)throw Error(`Thread ${I} not found`);let C=await bY(I,A.configService,A.apiKey,{usesThreadActors:!0}),S=await WU({endpoint:A.rivetEndpoint}).threadActor.getOrCreate([I],{params:{wsToken:C.wsToken},createWithInput:{threadId:C.threadId,threadVersion:C.threadVersion,ownerUserId:C.ownerUserId,...C.agentMode?{agentMode:C.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:ay4(w)}),skipReadyWait:!0});if(!S.ok&&S.status!==409)throw Error(`Thread import failed (${S.status}): ${await S.text()}`);try{await Cx4(I,A.configService,A.apiKey,{executorType:"local-client"})}catch(T){j.warn("failed to mark thread as imported on server",{threadID:I,error:T instanceof Error?T.message:String(T)})}},V=new Ue0(A.rivetEndpoint,A.apiKey,A.configService,{clientID:cN.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(I)=>A.pluginService.event.toolCall(I),requestPluginToolResult:(I)=>A.pluginService.event.toolResult(I),pluginService:A.pluginService,invokeTool:async(I,w)=>{let C=typeof w.args==="object"&&w.args!==null?w.args:{},O=await nN({toolName:w.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:w.toolCallId,threadID:I});return A.toolService.invokeTool(w.toolName,{args:C},O)},persistLastThreadID:oh5,readFileSystemDirectory:A.readFileSystemDirectory},D,G),U=await XI(),K=ah5({initialUserInput:$,showNeoWelcome:X,neoWelcomeDismissed:U.neoWelcomeDismissed}),E={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(I)=>{let w=await A.getThreadFromServer(I);return w?wV(w):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:pa,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:Y,sessionAgentMode:Z??U.agentMode,explicitReasoningEffort:F,lastReasoningEffortByMode:U.lastReasoningEffortByMode,lastSpeedByMode:U.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},W=(I,w)=>{return $x({ampURL:A.ampURL,configService:A.configService,threadID:I,signal:w})},z=(I,w)=>{return wh4({ampURL:A.ampURL,configService:A.configService,threadID:I,signal:w})},H=new ke0,q=zs4({configService:A.configService}),N=new Set;try{await no(new a61({clientPool:V,analyzeContextForThread:W,listSkillsForThread:z,completionBuilder:A.completionBuilder,history:new Qo,ideManager:H,configService:A.configService,initialThreadID:B,notificationService:q,initialUserInput:$,openThreadPickerOnStart:J,neoContext:E,showNeoWelcome:K.show,onNeoWelcomeDismissed:K.markDismissedOnDismiss?()=>{KJ(Oh4).catch((w)=>{j.warn("Failed to mark Neo welcome as dismissed",{error:w})})}:void 0,onThreadArchived:(w)=>{N.add(w)}}));let I=V.lastActiveObservingClient;if(I){let{client:w,observer:C}=I,O=w.getThreadId();if(O){let P={id:O,title:C.title().getValue(),agentMode:C.agentMode,archived:N.has(O)},S=`${A.ampURL.replace(/\/$/,"")}/threads/${O}`;Ws4(P,S,process.stdout)}}}finally{process.stdout.write(QI("")),q.unsubscribe(),V.dispose(),await A.dispose?.()}process.exit(0)}hp();lK();async function rh5(A,Q,B){let $=z80(A);if(!$.success)throw Error(`Invalid permission format: ${$.error.message}`);if($.data.length===0)throw Error("No permission entry provided");let J=jH($.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 qs4(A){try{let Q=A.args.map((B)=>{if(/[\s/\\*?[\]{}()"]/.test(B))return`"${B}"`;return B}).join(" ");await rh5(Q,A.settings,A.scope),A.exit(0)}catch(Q){let B=Q instanceof Error?Q.message:"Unknown error";A.stderr.write(`Error: ${B}
@@ -7469,7 +7469,7 @@ ${J}`,Q);this.line=B,this.column=$,this.codeblock=J}}/*!
7469
7469
  `),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(`
7470
7470
  `))}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 Q31 extends Q8{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:B=null,showAxes:$=!0,colors:J=IU0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=B,this.showAxes=$,this.colors=J}createRenderObject(){return new e51({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 f0A(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?g8: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?g8: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 Ji5(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?g8: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?g8: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 Yi5(A){let Q=0;for(let B of A)for(let $ of B.points)if($.value>Q)Q=$.value;return Q||1}function Zi5(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 Fi5(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,AI(E),()=>{lA(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}
7471
7471
  `,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(`
7472
- `))}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();I3();U8();t5();y7();R7();c9();N2();OB();IV();c4();pk();WT();L1();c0();c9();class B31{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.1778137469-g337d30"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await j30(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 b0A}}class b0A 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 u0A extends S0{controller=new C8;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 nB({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 e0({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 as extends v0{props;constructor(A){super();this.props=A}createState(){return new u0A}}OB();class h0A extends S0{controller=new C8;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 lF(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=s1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new mD({controller:this.controller,triggers:[new NJ],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:L4.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 $31 extends v0{props;constructor(A){super();this.props=A}createState(){return new h0A}}function g0A(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 J31 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)=>g0A(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:e0.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 e0({children:[new _1({child:new p({text:new M(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(g0A(J.pubDate),B)]})})}})}}class JB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!JB._instance)JB._instance=new JB;return JB._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 m0A 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 Y31 extends v0{props;constructor(A){super();this.props=A}createState(){return new m0A}}class cD extends v0{props;constructor(A){super();this.props=A}createState(){return new p0A}}class p0A 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 pU extends v0{props;constructor(A){super();this.props=A}createState(){return new d0A}}class d0A extends S0{scrollController=new rA;scrollAreaKey=new $2("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 T2}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=ID0(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 B8({child:new g0({padding:W0.symmetric(1,0),child:new e0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new TA({controller:this.scrollController,autofocus:!0,child:F})}),new F2({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 t4({fit:"expand",children:[new y1({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]})})})]})})}}I3();r1();class c0A extends v0{props;constructor(A){super();this.props=A}createState(){return new l0A}}class l0A 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 O5(A)}statusIcon(A){let Q=u8.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} ${z4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new M(` (${Z} ${z4(Z,"command")}, ${F} ${z4(F,"tool")})`,new v({dim:!0})));$.push(new M(`
7472
+ `))}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();I3();U8();t5();y7();R7();c9();N2();OB();IV();c4();pk();WT();L1();c0();c9();class B31{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.1778137759-g2b4034"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await j30(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 b0A}}class b0A 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 u0A extends S0{controller=new C8;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 nB({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 e0({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 as extends v0{props;constructor(A){super();this.props=A}createState(){return new u0A}}OB();class h0A extends S0{controller=new C8;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 lF(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=s1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new mD({controller:this.controller,triggers:[new NJ],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:L4.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 $31 extends v0{props;constructor(A){super();this.props=A}createState(){return new h0A}}function g0A(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 J31 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)=>g0A(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:e0.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 e0({children:[new _1({child:new p({text:new M(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new U0({width:2}),E(g0A(J.pubDate),B)]})})}})}}class JB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!JB._instance)JB._instance=new JB;return JB._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 m0A 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 Y31 extends v0{props;constructor(A){super();this.props=A}createState(){return new m0A}}class cD extends v0{props;constructor(A){super();this.props=A}createState(){return new p0A}}class p0A 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 pU extends v0{props;constructor(A){super();this.props=A}createState(){return new d0A}}class d0A extends S0{scrollController=new rA;scrollAreaKey=new $2("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 T2}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=ID0(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 B8({child:new g0({padding:W0.symmetric(1,0),child:new e0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new TA({controller:this.scrollController,autofocus:!0,child:F})}),new F2({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 t4({fit:"expand",children:[new y1({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]})})})]})})}}I3();r1();class c0A extends v0{props;constructor(A){super();this.props=A}createState(){return new l0A}}class l0A 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 O5(A)}statusIcon(A){let Q=u8.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} ${z4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new M(` (${Z} ${z4(Z,"command")}, ${F} ${z4(F,"tool")})`,new v({dim:!0})));$.push(new M(`
7473
7473
 
7474
7474
  `));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(`
7475
7475
  `)),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(`
@@ -7647,7 +7647,7 @@ ${t.content||""}`:t.content||"",b0=[],h0=t.baseDir.startsWith("file://")?oU0(t.b
7647
7647
  `)}function jAA(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=V04({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+`
7648
7648
  `),process.exit(1)}process.stdout.write(await Oo5(X.result.displayText)+`
7649
7649
  `),process.exit(0)})}var ne5=kt.join(_$,"logs","headless.log"),X91=kt.join(Lx,"device-id.json"),ae5=`cli-tui-${e3A(16).toString("hex")}`;async function oe5(){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(Rb(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){RJ.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
7650
- `)}function re5(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 x2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")tJ("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")tJ("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)tJ("internal.model",ee5(Q.model))}function n3A(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 se5(A){if(A===void 0)return;let Q=A.trim();if(te1(Q))return Q;throw new J4(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function te5(A,Q){if(SX(A,Q))return;let B=f$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new J4(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function ee5(A){if(!A.includes("="))return n3A(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);n3A(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 A03(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 Q03(A){try{return await A8A(A,"utf-8")}catch{return A}}async function D91(A,Q,B){let $=A03(A,Q);if(!$)return;let J=fA(B)?B.features:[],Y=fA(B)?B.user.email:void 0;if(!mK0(J,NB.HARNESS_SYSTEM_PROMPT)&&!(Y&&O7(Y)))throw new J4("You are not allowed to do this.",1);tJ("systemPrompt",await Q03($))}function mK0(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function B03(A){return A!=="pending"}function SR(A){if(!fA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function $03(A){let Q=SR(A);if(Q)return Q.id;if(TX(A))throw Error(A.error.message);throw Error("unreachable")}function J03(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 Y03(A){let $=J03(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 vt(A,Q){let B=cr0(Error(A.error.message));if(B.message===Y7.networkOffline||B.message===Y7.networkTimeout)return Y03(Q);if(B.message!==Y7.internalBug)return new J4(B.message,1,B.suggestion);return new J4(A.error.message.replace(/^Error: /,""),1)}var a3A=[{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??xF,description:`Custom settings file path (overrides the default location ${xF})`},{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 ${pa})`},{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:B9(),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 (${y$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(y$().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}],o3A=(A)=>("deprecated"in A)&&A.deprecated===!0,Z03=(A)=>("hidden"in A)&&A.hidden===!0,F03=(A)=>("default"in A),X03=(A)=>("default"in A)?A.default:void 0;function uK0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=se5(Q.effort);if(B!==void 0)te5(Q.mode,B);return B}function D03(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 pK0(A){return{...A,getThreadEnvironment:UW,getEnvironmentData:(Q,B)=>sX({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new EL(A.fileSystem),generateThreadTitle:XF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>NQ(A.configService),pluginService:A.pluginService}}function Q8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:UW,getEnvironmentData:(Q,B)=>sX({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var hK0=s0.file(ie5.homedir()),G91=process.env.XDG_CONFIG_HOME?s0.file(process.env.XDG_CONFIG_HOME):X1.joinPath(hK0,".config");function G03(A){return fR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(mF0())pF0();else JZ0(Q);let B=Pj(),$=io();if((!B||$||Px())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(_D("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(_D("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(Pj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function m8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;de1("0.0.1778137469-g337d30");let Y=k30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:m0.of(s0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:hK0,userConfigDir:G91});ps4(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{F5.write(`No API key found. Starting login flow...
7650
+ `)}function re5(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 x2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")tJ("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")tJ("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)tJ("internal.model",ee5(Q.model))}function n3A(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 se5(A){if(A===void 0)return;let Q=A.trim();if(te1(Q))return Q;throw new J4(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function te5(A,Q){if(SX(A,Q))return;let B=f$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new J4(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function ee5(A){if(!A.includes("="))return n3A(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);n3A(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 A03(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 Q03(A){try{return await A8A(A,"utf-8")}catch{return A}}async function D91(A,Q,B){let $=A03(A,Q);if(!$)return;let J=fA(B)?B.features:[],Y=fA(B)?B.user.email:void 0;if(!mK0(J,NB.HARNESS_SYSTEM_PROMPT)&&!(Y&&O7(Y)))throw new J4("You are not allowed to do this.",1);tJ("systemPrompt",await Q03($))}function mK0(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function B03(A){return A!=="pending"}function SR(A){if(!fA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function $03(A){let Q=SR(A);if(Q)return Q.id;if(TX(A))throw Error(A.error.message);throw Error("unreachable")}function J03(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 Y03(A){let $=J03(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 vt(A,Q){let B=cr0(Error(A.error.message));if(B.message===Y7.networkOffline||B.message===Y7.networkTimeout)return Y03(Q);if(B.message!==Y7.internalBug)return new J4(B.message,1,B.suggestion);return new J4(A.error.message.replace(/^Error: /,""),1)}var a3A=[{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??xF,description:`Custom settings file path (overrides the default location ${xF})`},{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 ${pa})`},{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:B9(),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 (${y$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(y$().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}],o3A=(A)=>("deprecated"in A)&&A.deprecated===!0,Z03=(A)=>("hidden"in A)&&A.hidden===!0,F03=(A)=>("default"in A),X03=(A)=>("default"in A)?A.default:void 0;function uK0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=se5(Q.effort);if(B!==void 0)te5(Q.mode,B);return B}function D03(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 pK0(A){return{...A,getThreadEnvironment:UW,getEnvironmentData:(Q,B)=>sX({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new EL(A.fileSystem),generateThreadTitle:XF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>NQ(A.configService),pluginService:A.pluginService}}function Q8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:UW,getEnvironmentData:(Q,B)=>sX({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var hK0=s0.file(ie5.homedir()),G91=process.env.XDG_CONFIG_HOME?s0.file(process.env.XDG_CONFIG_HOME):X1.joinPath(hK0,".config");function G03(A){return fR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(mF0())pF0();else JZ0(Q);let B=Pj(),$=io();if((!B||$||Px())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(_D("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(_D("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(Pj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function m8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;de1("0.0.1778137759-g2b4034");let Y=k30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:m0.of(s0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:hK0,userConfigDir:G91});ps4(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{F5.write(`No API key found. Starting login flow...
7651
7651
  `);let i=await V03(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 qW(),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=v1(NQ(Y).pipe(j5(B03))),D=$?"pending":await X;if(!$)j.info("Server status resolved",{status:"ready",isAuthenticated:fA(D),isError:TX(D),errorMessage:TX(D)?D.error.message:void 0});let G=X.then((g)=>$03(g));G.catch(()=>{return});let U=!Q.takeMeBack&&fA(D)&&mK0(D.features,NB.THREAD_ACTORS_TUI)?"all":process.env.PLUGINS??"permissions",{toolService:K,dispose:E}=SR4({configService:Y}),W=new Map,z=()=>W.clear(),H=new vf0(Y,A.settings.getWorkspaceRootPath()),q=uJ4({configService:Y,filesystem:M3}),N=T74({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,$0=Ff4();j.info("OAuth headless mode check",{useHeadless:$0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:F5.isTTY});let K0;if($0)K0=A.executeMode?Zf4():Yf4(g);let o=new ck0({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:$0,executeMode:A.executeMode}),o})();return W.set(Q0,a),a}}),I=vn0({configService:Y,filesystem:M3,spawn:LY0}),w=Q.headless?Ls4():void 0,C=w??new XV0({configService:Y}),O=C instanceof XV0?C:void 0;if(O)O.pluginExecutorKind="local";let P=sf0({configService:Y,fileSystem:M3,platform:C,loadGlobalPlugins:as0(Y),pluginFilter:U}),S=RQ4(P),T=[N,I,S],f;if(J)f=new Map;else if(A.executeMode){let g=await FO4({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=yn0({toolService:K,providers:T});if(Q.jetbrains)jM("JetBrains");else if(Q.ide&&lf4())jM("VS Code");else if(Q.ide&&if4())jM("Neovim");else if(Q.ide){let g=await oe5();if(g){let i=p30(g.ideName);if(i)jM(i)}}if(A.executeMode)ce1(!0);let h,x=f3.status.pipe(C1((g)=>Boolean(g.connected&&g.authenticated&&g.ideName&&m04(g.ideName))),P4()).subscribe((g)=>{if(g){if(!h)h=K.registerTool(ZO4)}else h?.dispose(),h=void 0}),k;if(!A.executeMode){let g=await A.settings.get("fuzzy.alwaysIncludePaths")??[];k=new uF0(process.cwd(),{alwaysIncludePaths:g},!0)}else k=new class extends uF0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let b=new rh0(wl(Y,{usesThreadActors:!1}),{maxThreads:200});j.info("Starting Amp background services");let c=new Q51,l={configService:Y,toolService:K,mcpService:N,skillService:q,toolboxService:I,trustStore:H,threadService:b,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:k,fileSystem:M3,terminal:c,pluginService:P,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 V03(A){if(!A.executeMode){if(!await PX0("Would you like to log in to Amp? [(y)es, (n)o]: "))return F5.write(`Login cancelled. Run the command again to retry.
7652
7652
  `),!1}return await B8A(A)}async function B8A(A){let Q=e3A(32).toString("hex"),B=await fx(A.ampURL,Q),$=new AbortController;try{await RX(B,$.signal)}catch(Y){j.error("Error opening browser",{error:Y})}let J=await fx(A.ampURL,Q,!1);F5.write(`If your browser does not open automatically, visit:
7653
7653
 
@@ -7655,7 +7655,7 @@ ${o0.blue.bold(J)}
7655
7655
 
7656
7656
  `);try{return await Dh4(A.ampURL,Q,A.secrets,$),F5.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(Y){return j.error("Login failed",{error:Y}),RJ.write(`
7657
7657
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
7658
- `),!1}}async function U03(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=de5("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 K03(A){let Q=new vN().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;Kv4(H)}),Wg4(Q,{version:"0.0.1778137469-g337d30",buildTimestamp:"2026-05-07T07:08:21.362Z",buildType:"'release'"}),Q.addHelpText("after",pf4()),Q.configureHelp({formatHelp:df4}),Q.command("logout").description("Log out by removing stored API key").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await C03(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 w03(N,await Zt0(q,N.settings))}),Gv4(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 U03(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 sx4(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 tx4(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 Xu4({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
+ `),!1}}async function U03(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=de5("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 K03(A){let Q=new vN().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;Kv4(H)}),Wg4(Q,{version:"0.0.1778137759-g2b4034",buildTimestamp:"2026-05-07T07:13:03.500Z",buildType:"'release'"}),Q.addHelpText("after",pf4()),Q.configureHelp({formatHelp:df4}),Q.command("logout").description("Log out by removing stored API key").action(async(z,H)=>{let q=H.optsWithGlobals(),N=await p5(q);await C03(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 w03(N,await Zt0(q,N.settings))}),Gv4(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 U03(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 sx4(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 tx4(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 Xu4({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(`
7659
7659
  `)).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)F5.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.
7660
7660
 
7661
7661
  `),q.outputHelp(),process.exit(0);let I=q2(N)??DJ(N),w=q.optsWithGlobals(),C=await p5(w);x2(q,w);let O=await m8(C,w),P=!1;try{if(H.checkout&&H.skipCheckout)throw new J4("Choose either --checkout or --skip-checkout, not both.",1);if(TX(O.serverStatus))throw vt(O.serverStatus,C.ampURL);let S=fA(O.serverStatus)?O.serverStatus.features:void 0;if(!mK0(S,NB.V2))throw new J4("live-sync is not enabled for your user",1);await tu4({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:PX0}),P=!0}finally{if(await O.asyncDispose(),P)process.exit(0)}});let J=async(z,H,q)=>{k30({storage:H.settings,secretStorage:H.secrets,workspaceRoot:m0.of(s0.file(process.cwd())),defaultAmpURL:H.ampURL,homeDir:hK0,userConfigDir:G91});let N={...H,executeMode:!1};await gK0(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 t3A(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 v03(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)RJ.write(`${o0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
@@ -7688,8 +7688,8 @@ ${C}
7688
7688
  `))}),H.args.length>0)D03(N,H);await gK0(N,q,H,A)}),Lb4(Q),Q}async function Pb(A,Q){await KJ((B)=>yX0(B,A,Q))}async function r3A(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.
7689
7689
 
7690
7690
  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 $8A(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await GV0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await GV0()).trimEnd(),stdinInput:null}}function J8A(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"
7691
- Or pipe via stdin: echo "your message" | amp --execute`)}function E03(A,Q){if(EA4([d50.parse({tool:"*",action:"allow"})]),JA4({bypass:!0}),js4(A.settings))j.debug("Enabling permissions plugin"),Q.registerInternalPlugin({name:"permissions",entryPoint:r61})}async function gK0(A,Q,B,$){if(Q.headless)return W03(A,Q,B);let J=await m8(A,Q),Y=await J.serverStatusPromise,Z=await J.configService.getLatest(),F=fA(Y)&&mK0(Y.features,NB.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)return E03(Z,J.pluginService),z03(A,Q,B,J);else{if(Q.threadId&&zQ(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 H03(A,Q,B,$,{dependencies:J})}}async function W03(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=xr0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};x2(B,Q);let J=process.hrtime.bigint(),Y=await m8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(TX(Z))throw vt(Z,A.ampURL);let F=fA(Z)?Z:null,X=F?.user.email;await D91(B,Q,Z);let D=SR(Z),G=Ar(Q,D);if(G instanceof Error)x5(G.message);if(F&&!AS(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);YF0();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&&!zQ(K))throw new J4(`Invalid thread ID: ${K}`,1);let E=K?void 0:await S03({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 Vf4(W);if(z.status==="already-running")await Y.asyncDispose(),await qW(),process.exit(0);try{await Bf4({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 qW(),process.exit(0)}async function z03(A,Q,B,$){let{userInput:J,stdinInput:Y}=await $8A(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;J8A({...Q,streamJson:Z},A.executeMode,J),x2(B,Q),$v4(),YF0();let F=Q.threadId&&zQ(Q.threadId)?Q.threadId:void 0,X=Q.observe?q2(Q.observe)??DJ(Q.observe):void 0,D=await $.serverStatusPromise;if(TX(D))throw vt(D,A.ampURL);let G=await $.secretStorage.get("apiKey",A.ampURL);if(!G)throw new J4("API key required. Please run `amp login` first.",1);let V=fA(D)&&O7(D.user.email);if(A.executeMode){Xe0($.mcpService,A.settings);try{let U=uK0(B,Q),K=await XI(),E=F?U:_X0({agentMode:Q.mode,explicitEffort:U,sessionState:K}),W=F?void 0:TX0(await bx($.configService),{agentMode:Q.mode,explicitEffort:U,sessionState:K}),z=await _x4({apiKey:G,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:J,stdinInput:Y,stats:!!Q.stats,streamJson:Z,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:E,labels:Q.label,initialThreadID:F,initialSettings:W});if(await Pb(z,"execute"),Q.archive)await $.threadService.archive(z,!0)}finally{await $.asyncDispose()}await qW(),process.exit(0)}else{let U=uK0(B,Q),K=wl($.configService),E=new os($.fuzzyServer),W=process.cwd();await Hs4({ampURL:A.ampURL,apiKey:G,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??kF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:z})=>zx({fileSystem:$.fileSystem,workspaceRoot:W},z),completionBuilder:E,workspaceRoot:W,listThreads:()=>K.listThreads(),getThreadFromServer:(z)=>K.getThread(z),toolboxes:$.toolboxService.toolboxes,isInternalUser:V,settingsFilePath:$.settingsStorage.getSettingsFilePath()},{initialThreadID:X??F,initialUserInput:J||void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!X,splashOrbVisualStyle:"neo",showNeoWelcome:Q.showWelcome,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:U}),process.exit(0)}}async function H03(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(F0,_0)=>{let $0=Number(process.hrtime.bigint()-_0)/1e6,K0=xr0();j.info("Startup phase",{phase:F0,phaseMs:Math.round($0),sinceMainMs:K0===null?void 0:Math.round(K0)})},{userInput:F,stdinInput:X}=await $8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;J8A({...Q,streamJson:D},A.executeMode,F),x2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await m8(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&&TX(E))throw vt(E,A.ampURL);let W=fA(E)?E:null,z=W?.user.email,H=!!(z&&O7(z));if(H)YF0();if(!K)await D91(B,Q,E);let q=SR(E),N=q?.features??[],I=q?.team??null,w=Ar(Q,q);if(w instanceof Error)x5(w.message);if(W&&!AS(Q.mode,z))throw new J4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let C=Q.threadId&&zQ(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await pK0(V);Z("runMainThread:createWorkerDeps",G);let P=A.executeMode?void 0:async(F0)=>Pb(F0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(F0)=>{let _0=K?await V.serverStatusPromise:E,$0=await ZF0(A.settings,process.cwd(),SR(_0),w);if($0 instanceof Error)x5($0.message);return x81(O,{threadMeta:$0?lY($0):void 0,agentMode:F0??Q.mode,onFirstAssistantMessage:P})},validateThreadOwnership:async(F0,_0)=>{if(_0?.nonBlockingOwnershipCheck){r3A(F0,V.configService,V.viewerUserIDPromise).catch(($0)=>{if($0 instanceof J4){if(_0.onOwnershipError){_0.onOwnershipError($0,F0);return}NW($0,F0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:$0})});return}try{await r3A(F0,V.configService,V.viewerUserIDPromise)}catch($0){if($0 instanceof J4)throw $0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:$0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:P,handleError:NW},T=async()=>{try{return CAA(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(F0){if(F0 instanceof J4)throw F0;throw await NW(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=km(F0),$0=await YA.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(_0)});if($0.ok)return j.info("User free tier status:",$0),$0.result;return}catch(F0){j.error("Failed to fetch free tier status:",F0);return}})(),x=!A.executeMode?new Z51:null,k,b=null;if(x)k=x,b=(async()=>{let F0=K?await V.serverStatusPromise:V.serverStatus;if(TX(F0))throw vt(F0,A.ampURL);await D91(B,Q,F0);let _0=process.hrtime.bigint(),$0=await T();if(Z("runMainThread:createThreadPool",_0),x.attach($0),F){let K0=await v1($0.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 NW(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(),G03({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,$0])=>({[_0.id]:$0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){Xe0(V.mcpService,A.settings);let F0=uK0(B,Q),_0=await XI(),$0=C?F0:_X0({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:$0,labels:Q.label},o=await yv4({threadPool:k,...K0});if(await Pb(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 d30();let F0=await vX({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)f3.selectConfig(_0)}else i=!0}G=process.hrtime.bigint();let d=Pt0("0.0.1778137469-g337d30",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let Q0=new De0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let F0=await v1(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 XI();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",H0);let a=uK0(B,Q),I0={...H0,launchCount:H0.launchCount+1,lastReasoningEffortByMode:a?{...H0.lastReasoningEffortByMode,[Q.mode]:a}:H0.lastReasoningEffortByMode};KJ((F0)=>({...F0,launchCount:F0.launchCount+1}));try{if(G=process.hrtime.bigint(),await ft4({history:new Qo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:YA,threadPool:k,createSystemPromptDeps:async()=>Q8A(V),ideClient:f3,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:ae5,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-07T07:08:21.362Z"},(F0)=>new K51({...F0,threadPool:F0.threadPool},(_0)=>new v81({..._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)RJ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7692
- `);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 x74({get:async(F)=>{if(F!==xd)return;try{let X=await A8A(X91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==xd)return;await ce5(kt.dirname(X91),{recursive:!0}),await le5(X91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:K90()});le1($);let J=await Lf4({...A,workspaceTrust:{current:!0,changes:mT0},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 Nh4(A.mcpConfig);J=Ih4(J,F)}let Y=kt.dirname(J.getSettingsFilePath());xR4(Lx,Y),J=Ms1(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()}),!OH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:us4(await Zt0(A,J))}}function q03(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 N03(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=kt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?ne5:pa));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function I03(){sk4();let A=q03(process.argv),Q=N03(process.argv,A),B=Jv4(Q);TZ0("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(re5(j),j.info("Starting Amp CLI.",{version:"0.0.1778137469-g337d30",buildTimestamp:"2026-05-07T07:08:21.362Z"}),process.platform==="win32"&&zj())Vb4();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 K03(B).parseAsync(process.argv)}vR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await I03().catch(NW)});async function w03(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"),F5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7691
+ Or pipe via stdin: echo "your message" | amp --execute`)}function E03(A,Q){if(EA4([d50.parse({tool:"*",action:"allow"})]),JA4({bypass:!0}),js4(A.settings))j.debug("Enabling permissions plugin"),Q.registerInternalPlugin({name:"permissions",entryPoint:r61})}async function gK0(A,Q,B,$){if(Q.headless)return W03(A,Q,B);let J=await m8(A,Q),Y=await J.serverStatusPromise,Z=await J.configService.getLatest(),F=fA(Y)&&mK0(Y.features,NB.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)return E03(Z,J.pluginService),z03(A,Q,B,J);else{if(Q.threadId&&zQ(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 H03(A,Q,B,$,{dependencies:J})}}async function W03(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=xr0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};x2(B,Q);let J=process.hrtime.bigint(),Y=await m8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(TX(Z))throw vt(Z,A.ampURL);let F=fA(Z)?Z:null,X=F?.user.email;await D91(B,Q,Z);let D=SR(Z),G=Ar(Q,D);if(G instanceof Error)x5(G.message);if(F&&!AS(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);YF0();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&&!zQ(K))throw new J4(`Invalid thread ID: ${K}`,1);let E=K?void 0:await S03({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 Vf4(W);if(z.status==="already-running")await Y.asyncDispose(),await qW(),process.exit(0);try{await Bf4({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 qW(),process.exit(0)}async function z03(A,Q,B,$){let{userInput:J,stdinInput:Y}=await $8A(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;J8A({...Q,streamJson:Z},A.executeMode,J),x2(B,Q),$v4(),YF0();let F=Q.threadId&&zQ(Q.threadId)?Q.threadId:void 0,X=Q.observe?q2(Q.observe)??DJ(Q.observe):void 0,D=await $.serverStatusPromise;if(TX(D))throw vt(D,A.ampURL);let G=await $.secretStorage.get("apiKey",A.ampURL);if(!G)throw new J4("API key required. Please run `amp login` first.",1);let V=fA(D)&&O7(D.user.email);if(A.executeMode){Xe0($.mcpService,A.settings);try{let U=uK0(B,Q),K=await XI(),E=F?U:_X0({agentMode:Q.mode,explicitEffort:U,sessionState:K}),W=F?void 0:TX0(await bx($.configService),{agentMode:Q.mode,explicitEffort:U,sessionState:K}),z=await _x4({apiKey:G,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:J,stdinInput:Y,stats:!!Q.stats,streamJson:Z,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:E,labels:Q.label,initialThreadID:F,initialSettings:W});if(await Pb(z,"execute"),Q.archive)await $.threadService.archive(z,!0)}finally{await $.asyncDispose()}await qW(),process.exit(0)}else{let U=uK0(B,Q),K=wl($.configService),E=new os($.fuzzyServer),W=process.cwd();await Hs4({ampURL:A.ampURL,apiKey:G,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??kF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:z})=>zx({fileSystem:$.fileSystem,workspaceRoot:W},z),completionBuilder:E,workspaceRoot:W,listThreads:()=>K.listThreads(),getThreadFromServer:(z)=>K.getThread(z),toolboxes:$.toolboxService.toolboxes,isInternalUser:V,settingsFilePath:$.settingsStorage.getSettingsFilePath()},{initialThreadID:X??F,initialUserInput:J||void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!X,splashOrbVisualStyle:"neo",showNeoWelcome:Q.showWelcome,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:U}),process.exit(0)}}async function H03(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(F0,_0)=>{let $0=Number(process.hrtime.bigint()-_0)/1e6,K0=xr0();j.info("Startup phase",{phase:F0,phaseMs:Math.round($0),sinceMainMs:K0===null?void 0:Math.round(K0)})},{userInput:F,stdinInput:X}=await $8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;J8A({...Q,streamJson:D},A.executeMode,F),x2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await m8(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&&TX(E))throw vt(E,A.ampURL);let W=fA(E)?E:null,z=W?.user.email,H=!!(z&&O7(z));if(H)YF0();if(!K)await D91(B,Q,E);let q=SR(E),N=q?.features??[],I=q?.team??null,w=Ar(Q,q);if(w instanceof Error)x5(w.message);if(W&&!AS(Q.mode,z))throw new J4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let C=Q.threadId&&zQ(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await pK0(V);Z("runMainThread:createWorkerDeps",G);let P=A.executeMode?void 0:async(F0)=>Pb(F0,"interactive"),S={threadService:V.threadService,workerDeps:O,createThread:async(F0)=>{let _0=K?await V.serverStatusPromise:E,$0=await ZF0(A.settings,process.cwd(),SR(_0),w);if($0 instanceof Error)x5($0.message);return x81(O,{threadMeta:$0?lY($0):void 0,agentMode:F0??Q.mode,onFirstAssistantMessage:P})},validateThreadOwnership:async(F0,_0)=>{if(_0?.nonBlockingOwnershipCheck){r3A(F0,V.configService,V.viewerUserIDPromise).catch(($0)=>{if($0 instanceof J4){if(_0.onOwnershipError){_0.onOwnershipError($0,F0);return}NW($0,F0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:$0})});return}try{await r3A(F0,V.configService,V.viewerUserIDPromise)}catch($0){if($0 instanceof J4)throw $0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:$0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:P,handleError:NW},T=async()=>{try{return CAA(S,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(F0){if(F0 instanceof J4)throw F0;throw await NW(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=km(F0),$0=await YA.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(_0)});if($0.ok)return j.info("User free tier status:",$0),$0.result;return}catch(F0){j.error("Failed to fetch free tier status:",F0);return}})(),x=!A.executeMode?new Z51:null,k,b=null;if(x)k=x,b=(async()=>{let F0=K?await V.serverStatusPromise:V.serverStatus;if(TX(F0))throw vt(F0,A.ampURL);await D91(B,Q,F0);let _0=process.hrtime.bigint(),$0=await T();if(Z("runMainThread:createThreadPool",_0),x.attach($0),F){let K0=await v1($0.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 NW(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(),G03({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,$0])=>({[_0.id]:$0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){Xe0(V.mcpService,A.settings);let F0=uK0(B,Q),_0=await XI(),$0=C?F0:_X0({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:$0,labels:Q.label},o=await yv4({threadPool:k,...K0});if(await Pb(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 d30();let F0=await vX({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)f3.selectConfig(_0)}else i=!0}G=process.hrtime.bigint();let d=Pt0("0.0.1778137759-g2b4034",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let Q0=new De0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let F0=await v1(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 XI();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",H0);let a=uK0(B,Q),I0={...H0,launchCount:H0.launchCount+1,lastReasoningEffortByMode:a?{...H0.lastReasoningEffortByMode,[Q.mode]:a}:H0.lastReasoningEffortByMode};KJ((F0)=>({...F0,launchCount:F0.launchCount+1}));try{if(G=process.hrtime.bigint(),await ft4({history:new Qo,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:YA,threadPool:k,createSystemPromptDeps:async()=>Q8A(V),ideClient:f3,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:ae5,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-07T07:13:03.500Z"},(F0)=>new K51({...F0,threadPool:F0.threadPool},(_0)=>new v81({..._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)RJ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7692
+ `);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 x74({get:async(F)=>{if(F!==xd)return;try{let X=await A8A(X91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==xd)return;await ce5(kt.dirname(X91),{recursive:!0}),await le5(X91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:K90()});le1($);let J=await Lf4({...A,workspaceTrust:{current:!0,changes:mT0},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 Nh4(A.mcpConfig);J=Ih4(J,F)}let Y=kt.dirname(J.getSettingsFilePath());xR4(Lx,Y),J=Ms1(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()}),!OH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:us4(await Zt0(A,J))}}function q03(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 N03(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=kt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?ne5:pa));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function I03(){sk4();let A=q03(process.argv),Q=N03(process.argv,A),B=Jv4(Q);TZ0("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(re5(j),j.info("Starting Amp CLI.",{version:"0.0.1778137759-g2b4034",buildTimestamp:"2026-05-07T07:13:03.500Z"}),process.platform==="win32"&&zj())Vb4();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 K03(B).parseAsync(process.argv)}vR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await I03().catch(NW)});async function w03(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"),F5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7693
7693
  `);else if(!OH(A.ampURL))F5.write(`Logging in to ${new URL(A.ampURL).hostname}
7694
7694
  `);let $=process.env.AMP_API_KEY;if($)F5.write(`API key found in environment variable, storing...
7695
7695
  `),await Q.set("apiKey",$,A.ampURL),F5.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1778137469-g337d30",
3
+ "version": "0.0.1778137759-g2b4034",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {