@sourcegraph/amp 0.0.1778084602-gfd096d → 0.0.1778084963-gfd096d
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +10 -10
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -4884,12 +4884,12 @@ ${E}`))}},error:(K)=>{if(!U)U=!0,F(Error(`Failed to spawn brew: ${K.message}`))}
|
|
|
4884
4884
|
${E}`;if(Y==="pnpm"&&E.includes("Unable to find the global bin directory"))W+=`
|
|
4885
4885
|
|
|
4886
4886
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4887
|
-
npm install -g @sourcegraph/amp`;F(Error(W))}},error:(K)=>{if(!V)V=!0,F(Error(`Failed to spawn ${Y}: ${K.message}`))},complete:()=>{if(!V)V=!0,X()}})})}c0();c0();PN();async function dD0(A,Q){let J=`${Q||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let X=await fetch(J,{signal:Y.signal});if(!X.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let F=await X.json(),D=F.version??F["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=lr(A,D),V=G<0,U,K;if(F.time){let E=F.time[A],W=F.time[D],H=Date.now();if(E)U=Math.floor((H-new Date(E).getTime())/3600000);if(W)K=Math.floor((H-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(X){return j.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var Xv5="https://static.ampcode.com/cli/cli-version.txt";async function cD0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Xv5}?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=lr(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 Fv5=604800000;function Dl4(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>Fv5)return{ageMs:B};return null}function lr(A,Q){let B=(Z)=>{let[X,F]=Z.split("-");return{parts:X?.split(".").map(Number)||[],label:F}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let X=$.parts[Z]||0,F=J.parts[Z]||0;if(X<F)return-1;if(X>F)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 a11(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?QU(B):void 0;return{sha:$,age:J}}catch{return null}}R1();c0();import{readFile as Dv5,realpath as Gv5}from"node:fs/promises";import{homedir as Vv5}from"node:os";import{dirname as Gl4,join as o11}from"node:path";async function Vl4(A){switch(A){case"binary":case"brew":return Uv5(mr());case"npm":case"pnpm":case"yarn":case"bun":return Kv5();case"bootstrap":return Ev5()}}async function Uv5(A){let Q=await pD(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function Kv5(){try{let A=process.argv[1];if(!A)return null;let Q=await Gv5(A),B=Gl4(Gl4(Q));return await Ul4(o11(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Ev5(){try{let A=process.env.AMP_HOME??o11(Vv5(),".amp");return await Ul4(o11(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Ul4(A){let Q=await Dv5(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 Wv5=3600000,Hv5=5000;function r11(A,Q,B={}){let $=new h4,J=$.pipe(nA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Wv5,X=!1,F=()=>{X=!0};return setImmediate(async()=>{let D=new JV().with({name:"update"});if(Y>0){if(await AU(Y),X)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!X){let U=await zv5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await AU(Hv5),X)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!X){let W=Math.min(K,E);await AU(W),E-=W}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:F}}async function zv5(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 If(),X=Z==="binary"||Z==="brew";B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:X});let F;if(X)F=await cD0(A);else{let V=await AR();F=await dD0(A,V)}if(!(F.latestVersion&&F.hasUpdate))return B.debug("no update available"),J;let D=(V)=>{$.next(V),J.emittedVisibleState=!0};if(Z){let V=await Vl4(Z);if(V&&lr(V,F.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:V,latestVersion:F.latestVersion}),J.updatedTo=V,lr(A,V)<0){let U=await lW(V),K={from:A,to:V,externallyUpdated:!0,...U};if(U.status==="same")B.info("on-disk already updated by another instance",K),D("updated");else B.warn("on-disk already updated by another instance, with PATH warning",K),D("updated-with-warning")}return J}}let G=()=>{if(F.currentVersionAge!==void 0&&F.latestVersionAge!==void 0){let V=F.currentVersionAge-F.latestVersionAge,U=0.5;if(Math.abs(V)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:F.currentVersionAge,latestVersionAge:F.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!==mr()){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 cr(F.latestVersion,Z),J.updatedTo=F.latestVersion;let V=await lW(F.latestVersion),U={from:F.currentVersion,to:F.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}}PN();import{stderr as dD}from"node:process";function Kl4(A){let Q=new AI().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 f11($.force||!1,$.verbose||!1,"0.0.
|
|
4887
|
+
npm install -g @sourcegraph/amp`;F(Error(W))}},error:(K)=>{if(!V)V=!0,F(Error(`Failed to spawn ${Y}: ${K.message}`))},complete:()=>{if(!V)V=!0,X()}})})}c0();c0();PN();async function dD0(A,Q){let J=`${Q||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let X=await fetch(J,{signal:Y.signal});if(!X.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let F=await X.json(),D=F.version??F["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=lr(A,D),V=G<0,U,K;if(F.time){let E=F.time[A],W=F.time[D],H=Date.now();if(E)U=Math.floor((H-new Date(E).getTime())/3600000);if(W)K=Math.floor((H-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(X){return j.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var Xv5="https://static.ampcode.com/cli/cli-version.txt";async function cD0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Xv5}?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=lr(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 Fv5=604800000;function Dl4(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>Fv5)return{ageMs:B};return null}function lr(A,Q){let B=(Z)=>{let[X,F]=Z.split("-");return{parts:X?.split(".").map(Number)||[],label:F}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let X=$.parts[Z]||0,F=J.parts[Z]||0;if(X<F)return-1;if(X>F)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 a11(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?QU(B):void 0;return{sha:$,age:J}}catch{return null}}R1();c0();import{readFile as Dv5,realpath as Gv5}from"node:fs/promises";import{homedir as Vv5}from"node:os";import{dirname as Gl4,join as o11}from"node:path";async function Vl4(A){switch(A){case"binary":case"brew":return Uv5(mr());case"npm":case"pnpm":case"yarn":case"bun":return Kv5();case"bootstrap":return Ev5()}}async function Uv5(A){let Q=await pD(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function Kv5(){try{let A=process.argv[1];if(!A)return null;let Q=await Gv5(A),B=Gl4(Gl4(Q));return await Ul4(o11(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Ev5(){try{let A=process.env.AMP_HOME??o11(Vv5(),".amp");return await Ul4(o11(A,"package","package.json"))}catch(A){return j.debug("failed to read installed version from bootstrap package.json",{error:A}),null}}async function Ul4(A){let Q=await Dv5(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 Wv5=3600000,Hv5=5000;function r11(A,Q,B={}){let $=new h4,J=$.pipe(nA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Wv5,X=!1,F=()=>{X=!0};return setImmediate(async()=>{let D=new JV().with({name:"update"});if(Y>0){if(await AU(Y),X)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!X){let U=await zv5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await AU(Hv5),X)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!X){let W=Math.min(K,E);await AU(W),E-=W}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:F}}async function zv5(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 If(),X=Z==="binary"||Z==="brew";B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:X});let F;if(X)F=await cD0(A);else{let V=await AR();F=await dD0(A,V)}if(!(F.latestVersion&&F.hasUpdate))return B.debug("no update available"),J;let D=(V)=>{$.next(V),J.emittedVisibleState=!0};if(Z){let V=await Vl4(Z);if(V&&lr(V,F.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:V,latestVersion:F.latestVersion}),J.updatedTo=V,lr(A,V)<0){let U=await lW(V),K={from:A,to:V,externallyUpdated:!0,...U};if(U.status==="same")B.info("on-disk already updated by another instance",K),D("updated");else B.warn("on-disk already updated by another instance, with PATH warning",K),D("updated-with-warning")}return J}}let G=()=>{if(F.currentVersionAge!==void 0&&F.latestVersionAge!==void 0){let V=F.currentVersionAge-F.latestVersionAge,U=0.5;if(Math.abs(V)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:F.currentVersionAge,latestVersionAge:F.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!==mr()){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 cr(F.latestVersion,Z),J.updatedTo=F.latestVersion;let V=await lW(F.latestVersion),U={from:F.currentVersion,to:F.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}}PN();import{stderr as dD}from"node:process";function Kl4(A){let Q=new AI().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 f11($.force||!1,$.verbose||!1,"0.0.1778084963-gfd096d"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new AI("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 Nv5($.targetVersion)});A.addCommand(B)}function qv5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
|
|
4888
4888
|
`),$=!1,B=0}function Y(Z){if(!Q)return;let X=Z.padEnd(B," ");A.write(`\r${X}`),$=!0,B=X.length}return{flushProgressLine:J,renderProgress:Y}}async function Nv5(A){let B=process.platform==="win32"&&ej()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:$,renderProgress:J}=qv5(dD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")dD.write(a0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4889
4889
|
|
|
4890
4890
|
`));try{if(!A){dD.write(a0.blue(`Checking for updates...
|
|
4891
|
-
`));let X=!1,F;if(ej()){let D=await cD0("0.0.
|
|
4892
|
-
`));let V=await lW("0.0.
|
|
4891
|
+
`));let X=!1,F;if(ej()){let D=await cD0("0.0.1778084963-gfd096d");X=D.hasUpdate,F=D.latestVersion}else{let D=await AR(),G=await dD0("0.0.1778084963-gfd096d",D);X=G.hasUpdate,F=G.latestVersion}if(!X){let D=a11("0.0.1778084963-gfd096d"),G=D?.age?`released ${D.age} ago`:`built ${QU(new Date("2026-05-06T16:33:10.737Z"))} ago`;dD.write(a0.green(`✓ Amp is already up to date on version ${"0.0.1778084963-gfd096d"} (${G})
|
|
4892
|
+
`));let V=await lW("0.0.1778084963-gfd096d",B);if(V.warning)dD.write(`
|
|
4893
4893
|
`+a0.yellow(V.warning)+`
|
|
4894
4894
|
`);process.exit(0)}if(!F)dD.write(a0.yellow("[WARN] could not find latest version")),process.exit(0);A=F}dD.write(a0.blue(`Updating to version ${A}...
|
|
4895
4895
|
`)),await cr(A,void 0,(X)=>{$(),dD.write(a0.dim(`Running: ${X}
|
|
@@ -5326,7 +5326,7 @@ ${$}`).join(`
|
|
|
5326
5326
|
`)}function Ta5(A){return A.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)}function D31(A){return A.replace(/\[(image(?:\s+\d+)?)\]/gi,"").trim()}function Sa5(A){let Q=Aw.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 ka5(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}${Sa5(J)}`,Z=Aw.join(A,Y);try{await Eb(Z,Buffer.from(J.source.data,"base64")),B.push(Y)}catch(X){j.warn("Failed to write debug package issue image",{index:$,fileName:Y,error:X})}}return B}function va5(A,Q,B=[]){let $=["# Bug Report","","## Issue Description","",A,""];if(B.length>0){for(let[J,Y]of B.entries())$.push(``);$.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(Wb(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"),Wb(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: <${X31(Q.thread.id)}>`,` - Data Studio: <${Z31(Q.thread.id)}>`);return $.push("",XU0(Q)),$.join(`
|
|
5327
5327
|
`)}function G31(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?H5(G8(Q)):void 0,currentWorkspacePath:H5(G8(A.currentWorkspace)),clientId:A.clientId,logFile:A.logFile,pid:process.pid}}async function K0A(A){try{let Q=Aw.join("/tmp",`amp-thread-${A.thread.id}-${Date.now()}.json`),B=JSON.stringify(A.thread,null,2);await Eb(Q,B,"utf-8"),await OJ(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 E0A(A){try{let Q=Aw.join("/tmp",`amp-thread-${A.thread.id}-${Date.now()}.yaml`),B=Y31.default.stringify(A.thread);await Eb(Q,B,"utf-8"),await OJ(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 W0A(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=ZU0(process.pid,B,$);try{try{L4.instance.tuiInstance.suspend(),Et(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:Wt(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,X31(A.thread.id));return}case"cloudflare-data-studio":{await lA(A.context??A.contextFallback,Z31(A.thread.id));return}default:return Error(`Unknown log option: ${Q}`)}}async function H0A(A){let Q=G31(A),B=U0A(Q),$=!1;try{await L4.instance.tuiInstance.clipboard.writeText(B),$=!0}catch(J){j.error("Failed to copy debug prompt",{error:J})}return new b2(new _A({child:new k6({markdown:[$?"**Copied Markdown debug prompt to clipboard.**":"**Clipboard copy failed. Select and copy manually.**","",B].join(`
|
|
5328
5328
|
`)})}),"Debug Prompt","info","help",{width:100,height:28})}function ya5(A){return typeof A==="object"&&A!==null&&"label"in A&&typeof A.label==="string"&&"command"in A&&typeof A.command==="string"}async function z0A(A,Q){if(!ya5(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 q0A(A){return new b2(new _A({child:new k6({markdown:XU0(G31(A))})}),"Thread Diagnostics","info","help",{width:100,height:26})}async function N0A(A,Q){let B=A.logFile;if(!B)return Error("CLI log file is unavailable for this session");let $=D31(Q.description);if($.trim().length===0)return Error("Description is required");let J=Q.images,Y=Wt(B),Z=process.pid,X=Ta5($)||"debug-package",F=Oa5.tmpdir(),D=Aw.join(F,`amp-${X}`),G=`${D}.zip`;A.showStatusMessage("Building debug package...");try{Et(`mkdir -p ${D}`);let V=`select(.pid == ${Z})`,U=Et(`cat ${Y} | jq -c '${V}'`,{encoding:"utf-8",maxBuffer:52428800});await Eb(Aw.join(D,"cli-logs.json"),U,"utf-8"),await Eb(Aw.join(D,"thread.yaml"),Y31.default.stringify(A.thread),"utf-8");let K=await ka5(D,J),E=va5($,G31(A),K);await Eb(Aw.join(D,"agent-read-this.md"),E,"utf-8"),Et(`zip -j ${G} ${D}/*`),Et(`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})}}H8();var xa5=80,fa5=20,I0A=4,ba5=42,O0A=420,j0A=640,ua5=Math.max(32,lU),w0A="░▒▓█▁▂▃▄▅▆▇∿∾∽≋≈∼",FU0=["▁","▂","▃","▄","▅","▆","▇","█"],ha5=["▏","▎","▍","▌","▋","▊","▉","█"],ga5=["▕","▐","▉","▊","▋","▌","▍","▎"],ma5=z0.symmetric(1,0),pa5=z0.all(1),da5=z0.all(1),ca5={primary:{r:102,g:102,b:102},secondary:{r:255,g:255,b:255}},la5={primary:{r:77,g:0,b:10},secondary:{r:255,g:77,b:95}};function ia5(A){return{borderShape:A?.borderShape??"notched",borderAnimation:A?.borderAnimation??"subtle",titleAnimation:A?.titleAnimation??"none",timeMs:A?.timeMs,animate:A?.animate,seed:A?.seed??ba5}}function R0A(A){switch(A){case"notched":return pa5;case"classic":return ma5}}class TA extends w1{props;constructor(A){super();this.props=A}build(A){let Q=_0.of(A),B=e1.of(A),$=this.props.tone??"default",J=ia5(this.props.visualStyle),Y=this.props.bodyFit??{kind:"shrink"},Z=Ao5(this.props,Y,B,J.borderShape),X=Jo5($,Q),F=a1.all(new o1(X.border,1,"rounded")),D=U31(this.props.header,J.borderShape),G=K31(this.props.footer,J.borderShape),V=Yo5(D===void 0?this.props.header:void 0,X.header,J),U=Do5(this.props.child,Y),K=G===void 0?Go5(this.props.footer,Q):new W0({height:0}),E=Y.kind==="fill"?"max":"min",W=typeof this.props.header==="string"?`NeoModal:${this.props.header}`:"NeoModal",H=this.props.autofocus??!0,z=this.props.chromePadding??R0A(J.borderShape),q=D===void 0&&typeof this.props.header==="string"?1:0,N=G===void 0?c0A(this.props.footer):0,I=new l4({autofocus:H,canRequestFocus:!0,debugLabel:W,onKey:(_)=>{if(_.key==="Escape")return this.props.onDismiss(),"handled";return"ignored"},child:new f0({mainAxisSize:E,crossAxisAlignment:"stretch",children:[V,new W0({height:q}),U,new W0({height:N}),K]})}),C=!(J.borderShape==="notched"||J.borderAnimation!=="none")?new m0({constraints:Z,decoration:new x4(Q.colors.background,F),padding:z,child:I}):oa5({borderShape:J.borderShape,borderAnimation:J.borderAnimation,child:I,constraints:Z,background:Q.colors.background,borderColor:X.border,tone:$,headerColor:X.header,footerKeyColor:Q.app.keybind,footerHintColor:Q.colors.foreground,padding:z,title:D,footer:G,titleAnimation:J.titleAnimation,seed:J.seed,timeMs:J.timeMs,animate:J.animate}),O=new m0({decoration:new x4(Q.colors.background),padding:da5,child:C});return new t4({fit:"expand",children:[new P0A,new x1({onClick:()=>{},opaque:this.props.barrierOpaque??!0,child:W0.expand()}),new B4({child:O})]})}}class P0A extends Y8{createRenderObject(){return new _0A}}class _0A extends Y4{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,$),X=Math.max(0,J),F=Math.min(Y.width,$+this.size.width),D=Math.min(Y.height,J+this.size.height);for(let G=X;G<D;G++)for(let V=Z;V<F;V++){let U=A.getCell(V,G);if(!U||na5(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 na5(A){return A.char===" "&&A.width===1&&A.hyperlink===void 0&&aa5(A.style)}function aa5(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 U31(A,Q){return Q==="notched"&&typeof A==="string"?A:void 0}function K31(A,Q){if(Q!=="notched")return;if(A===void 0)return[{keys:["Esc"],label:"close"}];if(!DU0(A)||A.length===0)return;return A}function oa5(A){if(A.timeMs!==void 0)return C0A(A,A.timeMs);if(!(A.animate??ra5(A)))return C0A(A,0);return new T0A({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 C0A(A,Q){return new E31({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 ra5(A){return A.titleAnimation!=="none"||A.borderAnimation!=="none"}class T0A extends v0{props;constructor(A){super();this.props=A}createState(){return new S0A}}class S0A extends k0{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()},lU),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>=g0A(this.widget.props.titleAnimation);return!0}build(A){return new E31({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 E31 extends N5{props;constructor(A){super({child:A.child});this.props=A}createRenderObject(){return new V31(this.props)}updateRenderObject(A){N4(A instanceof V31,"unexpected modal surface"),A.update(this.props)}}class V31 extends Y4{props;glow;constructor(A){super();this.props=A;this.glow=new y9(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 y9(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 O1(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,X=(Y?.size.height??0)+$,F=Q.constrain(Z,X);this.setSize(F.width,F.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,X){let F=this.sampleBorderIntensity($,J,Y,Z);A.setChar(Q,B,this.borderGlyph(X,F),this.borderStyle(F),1)}paintCorner(A,Q,B,$,J,Y,Z,X){let F=this.sampleBorderIntensity($,J,Y,Z);A.setChar(Q,B,this.cornerGlyph(X,F),this.borderStyle(F),1)}paintNotchedLabels(A,Q,B,$,J){let Y=this.props.title;if(Y){let G=Xo5(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 X=k0A(Z,{fg:this.props.footerKeyColor,bg:this.props.background},{fg:this.props.footerHintColor,bg:this.props.background,dim:!0}),F=v0A(X),D=Math.max(2,$-F-2);this.paintStyledBorderText(A,Q+D,B+J-1,X,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=ta5($,J);for(let X of Z)A.setChar(Y,B,X.grapheme,X.style,X.width),Y+=X.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 ha5[B]??"▏";if(A==="right")return ga5[B]??"▕";return FU0[B]??"▁"}mysteriousMessageBorderIndex(A){return Math.max(0,Math.min(FU0.length-1,Math.floor(A*FU0.length)))}mysteriousMessageCornerGlyph(A,Q){let B=this.mysteriousMessageBorderIndex(Q);if(A==="top-left"||A==="top-right")return FU0[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+Ht(A)*0.82;switch(this.props.tone){case"default":return QB(Q,void 0,ca5);case"warning":return QB(Q,QL);case"success":return QB(Q,void 0);case"error":return QB(Q,void 0,la5)}}sampleBorderIntensity(A,Q,B,$){let J=Math.max(1,B*2+$*2-4),Y=sa5(A,Q,B,$),Z=Y/J,X=this.props.timeMs/1000,F=this.glow.sample(A*1.3+Y*0.07,Q*1.1-X*5,X,1.2),D=(Z-X*0.18%1+1)%1,G=Math.min(D,1-D),V=Math.max(0,1-G/0.085)**2;return Ht(F*0.58+V*0.54)}}function sa5(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 k0A(A,Q,B){let $=[{text:" ",style:B}];return A.forEach((J,Y)=>{if(Y>0)$.push({text:" · ",style:B});J.keys.forEach((Z,X)=>{if(X>0)$.push({text:"/",style:B});$.push({text:Z,style:Q})}),$.push({text:` ${J.label}`,style:B})}),$.push({text:" ",style:B}),$}function v0A(A){return y0A(A).reduce((Q,B)=>Q+B.width,0)}function ta5(A,Q){if(Q<=0)return[];let B=[],$=0;for(let J of y0A(A)){if($+J.width>Q)return ea5(B,$,Q,J.style);B.push(J),$+=J.width}return B}function y0A(A){let Q=[];for(let B of A)for(let $ of f4(B.text))Q.push({grapheme:$,style:B.style,width:p6($)});return Q}function ea5(A,Q,B,$){let Y=p6("…");if(Y>B)return A;let Z=Q;while(A.length>0&&Z+Y>B){let X=A.pop();if(X)Z-=X.width}if(Z+Y<=B)A.push({grapheme:"…",style:$,width:Y});return A}function Ht(A){return Math.max(0,Math.min(1,A))}function Ao5(A,Q,B,$){let J=Math.max(0,B.size.width-I0A),Y=Math.max(0,B.size.height-I0A),Z=Math.max(A.minWidth??0,Qo5(A,$)),X=Math.max(0,Math.min(A.maxWidth??xa5,J));if(Q.kind==="fill"){let G=Bo5(A,$),V=Math.max(Q.modalRows,G),U=Math.max(0,Math.min(V,Y));return new O1(Math.min(Z,X),X,U,U)}let F=Math.max(0,Math.min(A.maxHeight??fa5,Y)),D=Math.min(A.minHeight??0,F);return new O1(Math.min(Z,X),X,D,F)}function Qo5(A,Q){if(Q!=="notched")return 0;let B=0,$=U31(A.header,Q);if($)B=Math.max(B,4+a4(` ${$} `));let J=K31(A.footer,Q);if(J)B=Math.max(B,4+v0A(k0A(J,{},{})));return B}function Bo5(A,Q){let B=A.chromePadding??R0A(Q),$=U31(A.header,Q),J=K31(A.footer,Q),Y=2,Z=A.header===void 0||$!==void 0?0:1,X=$===void 0&&typeof A.header==="string"?1:0,F=J===void 0?$o5(A.footer):0,D=J===void 0?c0A(A.footer):0,G=1;return 2+B.top+B.bottom+Z+X+1+D+F}function $o5(A){if(A===void 0)return 1;if(A==="none")return 0;if(DU0(A))return A.length===0?0:1;return 1}function Jo5(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 Yo5(A,Q,B){if(A===void 0)return new W0({height:0});if(typeof A==="string")return new m0({padding:z0.symmetric(1,0),child:new B4({child:Zo5(A,Q,B)})});return A}function Zo5(A,Q,B){if(B.titleAnimation==="none")return new l({text:new M(A,new y({color:Q,bold:!0}))});let $=B.timeMs??(B.animate===!1?0:void 0);if($!==void 0)return new l({text:b0A(A,Q,B.titleAnimation,$)});return new x0A({title:A,color:Q,animation:B.titleAnimation})}class x0A extends v0{props;constructor(A){super();this.props=A}createState(){return new f0A}}class f0A extends k0{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()},ua5),this.timer.unref()}stopTimer(){if(!this.timer)return;clearInterval(this.timer),this.timer=null}animationComplete(){return Date.now()-this.startedAt>=g0A(this.widget.props.animation)}build(A){return new l({text:b0A(this.widget.props.title,this.widget.props.color,this.widget.props.animation,Date.now()-this.startedAt)})}}function b0A(A,Q,B,$){let J=f4(A),Y=new y({color:Q,bold:!0}),Z=new y({color:Q,bold:!0,dim:!0});switch(B){case"none":return new M(A,Y);case"wipe":return new M("",void 0,M0A(J,u0A(J,$),Y,Z));case"scramble":return new M("",void 0,M0A(J,h0A(J,$),Y,Z))}}function Xo5(A,Q,B){let $=f4(A);switch(Q){case"none":return A;case"wipe":return u0A($,B).join("");case"scramble":return h0A($,B).join("")}}function M0A(A,Q,B,$){return Q.map((J,Y)=>{let Z=J===A[Y]?B:$;return new M(J,Z)})}function u0A(A,Q){let B=m0A(Ht(Q/O0A)),$=Math.floor(B*(A.length+1));return A.map((J,Y)=>{if(Y<$)return J;if(Y===$)return"▒";return" "})}function h0A(A,Q){let $=m0A(Ht(Q/j0A))*(A.length+5),J=Math.floor(Q/45);return A.map((Y,Z)=>{if(Ht(($-Z)/5)>=1)return Y;return Fo5(Z,J)})}function Fo5(A,Q){return w0A[(A*7+Q*11)%w0A.length]??"░"}function g0A(A){if(A==="scramble")return j0A;return O0A}function m0A(A){return 1-(1-A)**3}function Do5(A,Q){let B=Q.kind==="fill"?"tight":"loose";return new x2({fit:B,child:new p0A({child:A})})}class p0A extends N5{constructor({child:A}){super({child:A})}createRenderObject(){return new d0A}}class d0A extends Y4{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 Go5(A,Q){if(A===void 0)return L0A([{keys:["Esc"],label:"close"}],Q);if(DU0(A))return A.length===0?new W0({height:0}):L0A(A,Q);if(A==="none")return new W0({height:0});return A}function DU0(A){return Array.isArray(A)}function c0A(A){return A===void 0||DU0(A)&&A.length>0?1:0}function L0A(A,Q){let B=new y({color:Q.app.keybind}),$=new y({color:Q.colors.foreground,dim:!0}),J=[];return A.forEach((Y,Z)=>{if(Z>0)J.push(new M(" · ",$));Y.keys.forEach((X,F)=>{if(F>0)J.push(new M("/",$));J.push(new M(X,B))}),J.push(new M(` ${Y.label}`,$))}),new B4({child:l.spans(J)})}function Uo5(A){return[{label:"cli: copy tail logs",command:Qw("tail",process.pid,{path:A})},{label:"cli: copy logs snapshot",command:Qw("snapshot",process.pid,{path:A})},{label:"cli: htop",command:`htop -p ${process.pid}`}]}async function Ko5(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 Eo5(A,Q){let B=ZU0(process.pid,{path:A},"less -R +G");Q();try{L4.instance.tuiInstance.suspend(),Vo5(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 l0A(A){return[{noun:"debug",verb:"page logs",description:"View CLI logs in pager",status:{type:"enabled"},run:(Q,B,$)=>{Eo5(A,$)}},{noun:"debug",verb:"copy command",description:"Copy debug command to clipboard",status:{type:"enabled"},run:(Q,B,$)=>{Q.pushWithDismiss((J)=>new TA({header:"Debug: Copy Command",minWidth:80,maxWidth:80,autofocus:!1,footer:"none",onDismiss:J,child:new d6({items:Uo5(A),getLabel:(Y)=>Y.label,showBorder:!1,onAccept:(Y)=>{Ko5(Y,$)},onDismiss:J})}))}}]}var Hb="exit-app-key-pressed",zb="cancel-key-pressed",Bw="loading-thread",qb="previous-thread-reference",Nb="double-enter-steer";class qt extends c4{}class GU0 extends c4{}class VU0 extends c4{}class Nt extends c4{visualIndex;constructor(A){super();this.visualIndex=A}}class It extends c4{}class UU0 extends c4{}class wt extends c4{}class Ib extends c4{}class wb extends c4{}class Ct extends c4{}class Mt extends c4{}class Lt extends c4{}class Cb extends c4{}class Z$ extends c4{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 KU0 extends c4{}class Ot extends c4{}class EU0 extends c4{}class WU0 extends c4{}class jt extends c4{}class Rt extends c4{}class Pt extends c4{}class HU0 extends c4{}class zU0 extends c4{}class qU0 extends c4{}class mR extends c4{}class _t extends c4{}class W31 extends c4{mode;constructor(A){super();this.mode=A}}L3();t1();var i0A=process.platform==="win32"?" ":"█",n0A=process.platform==="win32"?"░":"█";class K2 extends v0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:A,controller:Q,getScrollInfo:B,thickness:$=1,trackChar:J=i0A,thumbChar:Y=n0A,showTrack:Z=!0,thumbColor:X,trackColor:F}){super(A?{key:A}:{});this.controller=Q,this.getScrollInfo=B,this.thickness=$,this.trackChar=J,this.thumbChar=Y,this.showTrack=Z,this.thumbColor=X,this.trackColor=F}createState(){return new a0A}}class a0A extends k0{_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),X=Math.max(1,J*Z),F=Math.max(0,Math.min(1,Y.scrollOffset/(Q-B))),D=J-X,G=Math.max(0,D*F),V=G+X;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,X=Math.min(1,B/Q),F=Math.max(1,Y*X),D=Y-F;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 X=Math.min(1,$/B),F=Math.max(1,Z*X),D=B-$,G=Z-F,V=Math.max(0,Math.min(1,J/(B-$))),U=Math.max(0,G*V),K=U+F;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 x1({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?s6.POINTER:s6.DEFAULT,child:new o0A({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 o0A extends PI{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:A,controller:Q,getScrollInfo:B,thickness:$=1,trackChar:J=i0A,thumbChar:Y=n0A,showTrack:Z=!0,thumbColor:X,trackColor:F}){super(A?{key:A}:{});this.controller=Q,this.getScrollInfo=B,this.thickness=$,this.trackChar=J,this.thumbChar=Y,this.showTrack=Z,this.thumbColor=X,this.trackColor=F}createRenderObject(){return new r0A(this)}updateRenderObject(A){A.updateWidget(this)}}class r0A extends Y4{_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,X=this._widget.thumbColor,F=process.platform==="win32",D=$,G=$+J;if(!F){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),H=Math.floor(W*8);K=V[H]||"█",E=!1}else if(U===Math.floor(G)){let W=1-(G-U),H=Math.floor(W*8);K=V[H]||"█"}else if(U>D&&U<G)E=!1;A.setChar(Q,B+U,K,{fg:X,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?X: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),X=$-Z;return{thumbStartFloat:Math.max(0,X*J),thumbSizeFloat:Z,showScrollbar:!0}}}var s0A=1;class YZ extends v0{props;constructor(A){super();this.props=A}createState(){return new t0A}}class t0A extends k0{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=_0.of(A),{controller:B}=this.ownership;return new e0A({thickness:s0A,onMeasured:this.setMeasuredHeight,scrollable:new _A({controller:B,autofocus:this.widget.props.autofocus??!0,keyboardScrolling:!0,child:this.widget.props.child}),scrollbar:new K2({controller:B,thickness:s0A,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:this.getScrollInfo})})}__testing={isOwned:()=>this.ownership.owned,controller:()=>this.ownership.controller}}class e0A extends v9{thickness;onMeasured;constructor({scrollable:A,scrollbar:Q,thickness:B,onMeasured:$}){super({children:[A,Q]});this.thickness=B,this.onMeasured=$}createRenderObject(){return new A1A(this.thickness,this.onMeasured)}}class A1A extends Y4{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 O1($,$,0,A.maxHeight)),J.setOffset(0,0);let Z=J.size.height;this.onMeasured(Z),Y.layout(new O1(B,B,Z,Z)),Y.setOffset($,0),this.setSize(Q,Z)}}var Q1A=10;class H31 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 B1A}}class B1A extends k0{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=V1.relativePath(Q,OA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return T5(A)}detailPrefix(A){if(A.length===0)return` ${" ".repeat(Q1A)}`;return` ${`${A}:`.padEnd(Q1A," ")}`}pluginRows(A){let Q=_0.of(A),{app:B,colors:$}=Q,J=new y({color:$.foreground,dim:!0}),Y=new y({color:B.link}),Z=new y({color:B.link,underline:!0});if(this.plugins.length===0)return[new b0({padding:z0.symmetric(1,1),child:new l({text:new M("No plugins found.",J)})})];return this.plugins.map((X)=>{let F=X.uri.toString(),D=F.startsWith("file://"),G=()=>{lA(A,F)},V=X.status==="active"?new y({color:B.toolSuccess}):X.status==="error"?new y({color:B.toolError}):new y({color:$.warning}),U=new l({text:new M(this.relativePath(X.uri),D?Z:new y({color:B.command}),void 0,D?jI(F):void 0,D?G:void 0),maxLines:1,overflow:"ellipsis"}),K=D?new x1({cursor:"pointer",onClick:G,child:U}):U,E=[new B1({children:[new l({text:new M(X.status,V,[new M(" ",J)]),maxLines:1,overflow:"clip"}),new x2({fit:"loose",child:K})]})];if(X.errorMessage)E.push(new l({text:new M(this.detailPrefix("Error"),J,[new M(`see logs: ${this.widget.logFilePath}`,new y({color:B.toolError}))]),maxLines:1,overflow:"ellipsis"}));if(X.registeredEvents.length>0)E.push(new l({text:new M(this.detailPrefix("Events"),J,[new M(X.registeredEvents.join(", "),Y)]),maxLines:1,overflow:"ellipsis"}));for(let[W,H]of X.registeredCommands.entries())E.push(new l({text:new M(W===0?this.detailPrefix("Commands"):this.detailPrefix(""),J,[new M(`${H.category}: ${H.title}`,Y)]),maxLines:1,overflow:"ellipsis"}));for(let[W,H]of X.registeredTools.entries())E.push(new l({text:new M(W===0?this.detailPrefix("Tools"):this.detailPrefix(""),J,[new M(H.name,Y)]),maxLines:1,overflow:"ellipsis"}));return new b0({padding:z0.only({left:1,right:1,bottom:1}),child:new f0({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} ${H4(this.plugins.length,"plugin")} active (${B} ${H4(B,"command")}, ${$} ${H4($,"tool")})`;return new TA({header:"Plugins",autofocus:!1,maxWidth:90,maxHeight:30,footer:[{keys:["Esc"],label:"close"},{keys:["↑↓","j/k"],label:"scroll"}],onDismiss:this.widget.onDismiss,child:new f0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new b0({padding:z0.only({left:1,right:1,bottom:1}),child:new l({text:new M(J,new y({bold:!0}))})}),new x2({fit:"loose",child:new YZ({child:new f0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:this.pluginRows(A)})})})]})})}}function $1A(A){return[{noun:"plugins",verb:"list",description:"List all loaded plugins",keywords:["extensions","tools","commands"],status:{type:"enabled"},run:(Q,B,$)=>{Q.push(new H31({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 Tt extends c4{}class Mb extends c4{}class z31 extends v0{props;constructor(A){super();this.props=A}createState(){return new J1A}}class J1A extends k0{build(A){let{options:Q,onConfirm:B,onCancel:$}=this.widget.props,{colors:J}=_0.of(A),Y=Q.message?new l({text:new M(Q.message,new y({color:J.foreground}))}):new W0({height:1});return new TA({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([[Tt,new K4(()=>B())],[Mb,new K4(()=>$())]]),child:new l5({debugLabel:"NeoConfirmDialogShortcuts",shortcuts:Wo5(),child:new YZ({child:Y})})})})}}function Wo5(){return new Map([[v1.key("y"),new Tt],[v1.shift("Y"),new Tt],[v1.shift("y"),new Tt],[v1.key("n"),new Mb],[v1.shift("N"),new Mb],[v1.shift("n"),new Mb],[v1.key("Escape"),new Mb]])}class St extends v0{props;constructor(A){super();this.props=A}createState(){return new Y1A}}class Y1A extends k0{controller=new j8;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}=_0.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 l({text:new M(this.widget.props.helpText,new y({color:Q.foreground}))})),Z.push(new W0({height:1}));return Z.push(new B1({children:[new l({text:new M("> ",new y({color:B.command}))}),new k1({child:new Q$({controller:this.controller,placeholder:this.widget.props.placeholder??"",autofocus:!0,maxLines:1,style:{textColor:Q.foreground,border:null},onSubmitted:()=>this.handleSubmit()})})]})),new TA({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 f0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:Z})})}}class q31 extends w1{props;constructor(A){super();this.props=A}build(A){return new TA({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:Ho5(this.props)})}}function Ho5(A){let Q=A.options.options.map((B)=>({value:B,label:B}));return new U9({options:Q,body:A.options.message,onSelect:(B)=>{if(B===null){A.onCancel();return}A.onSelect(B)},padding:z0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!1})}class N31{options;unregisterPluginCommands=null;pluginCommandSubscriptions=[];pluginErrorToastKeys=new Set;pendingInputDialog=null;pendingConfirmDialog=null;pendingSelectDialog=null;constructor(A){this.options=A}init(){this.configurePluginPlatform(),this.subscribePluginCommands()}dispose(){this.unregisterPluginCommands?.(),this.unregisterPluginCommands=null;for(let A of this.pluginCommandSubscriptions)A.unsubscribe();this.pluginCommandSubscriptions=[]}hasBlockingDialog(){return this.pendingInputDialog!==null||this.pendingConfirmDialog!==null||this.pendingSelectDialog!==null}buildDialogLayers(){let A=[];if(this.pendingInputDialog)A.push(new St({header:this.pendingInputDialog.options.title??"Input",helpText:this.pendingInputDialog.options.helpText,initialValue:this.pendingInputDialog.options.initialValue,isRequired:!1,onSubmit:this.resolveInputDialog,onDismiss:this.cancelInputDialog}));if(this.pendingConfirmDialog)A.push(new z31({options:this.pendingConfirmDialog.options,onConfirm:this.resolveConfirmDialog,onCancel:this.cancelConfirmDialog}));if(this.pendingSelectDialog)A.push(new q31({options:this.pendingSelectDialog.options,onSelect:this.resolveSelectDialog,onCancel:this.cancelSelectDialog}));return A}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()}
|
|
5329
|
-
${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.options.state.mounted){Q(void 0);return}this.options.state.setState(()=>{this.options.commandPalette.disable(),this.pendingInputDialog={options:A,resolve:Q}})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(!this.options.state.mounted){Q(!1);return}this.options.state.setState(()=>{this.options.commandPalette.disable(),this.pendingConfirmDialog={options:A,resolve:Q}})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(!this.options.state.mounted){Q(void 0);return}this.options.state.setState(()=>{this.options.commandPalette.disable(),this.pendingSelectDialog={options:A,resolve:Q}})})};resolveInputDialog=(A)=>{let Q=this.pendingInputDialog;if(!Q)return;this.clearDialogState(()=>{this.pendingInputDialog=null}),Q.resolve(A)};cancelInputDialog=()=>{let A=this.pendingInputDialog;if(!A)return;this.clearDialogState(()=>{this.pendingInputDialog=null}),A.resolve(void 0)};resolveConfirmDialog=()=>{let A=this.pendingConfirmDialog;if(!A)return;this.clearDialogState(()=>{this.pendingConfirmDialog=null}),A.resolve(!0)};cancelConfirmDialog=()=>{let A=this.pendingConfirmDialog;if(!A)return;this.clearDialogState(()=>{this.pendingConfirmDialog=null}),A.resolve(!1)};resolveSelectDialog=(A)=>{let Q=this.pendingSelectDialog;if(!Q)return;this.clearDialogState(()=>{this.pendingSelectDialog=null}),Q.resolve(A)};cancelSelectDialog=()=>{let A=this.pendingSelectDialog;if(!A)return;this.clearDialogState(()=>{this.pendingSelectDialog=null}),A.resolve(void 0)};clearDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}Vi();O2();import{readFile as zo5}from"node:fs/promises";import I31 from"node:os";async function Z1A(A,Q){try{return{path:Q,contents:Mm0(await zo5(A,"utf8"))}}catch{return null}}async function X1A(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(YJ(J),null,2)});let Y=await Z1A(ex(Q),`logs/${Q}.log`);if(Y)B.push(Y);let Z=await Z1A(A.settingsFilePath,"settings/global.json");if(Z)B.push(Z);let X=await If()??"unknown",F=await YA.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778084602-gfd096d",clientOS:`${I31.platform()} ${I31.release()} ${I31.arch()}`,installMethod:X}},{config:A.configService});if(!F.ok)throw Error(`Failed to submit report: ${F.error.message}`);return F.result.reportID}class w31{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();e9();O2();async function F1A(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:BZ(B)},{config:A.configService});if(!J.ok)throw Error(J.error.message);let Y=!1;if(B!=="private"){let X=TB(new URL(A.ampURL),Q).toString();try{await L4.instance.tuiInstance.clipboard.writeText(X),Y=!0}catch(F){j.error("Failed to copy thread URL after visibility update",{error:F})}}let Z=Y?`${$} Link copied to clipboard.`:$;return new BB(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 NU0 extends N5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new C31(this.offstage)}updateRenderObject(A){if(A instanceof C31)A.offstage=this.offstage}}class C31 extends Y4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class M31{_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 L31 extends v0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new D1A}}class D1A extends k0{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 ZR,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new ZR,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 NU0({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 l4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new NU0({key:$.key,offstage:!J,child:Y}))}return new t4({fit:"expand",children:Q})}}class j31 extends w1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=qo5(Q);return new TA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:z0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new d6({items:Q,showBorder:!1,getLabel:($)=>{let J=O31($);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=OR($.item.verb.toLowerCase(),Y),X=OR(J.item.verb.toLowerCase(),Y);if(Z!==X)return X-Z;let F=OR(O31($.item),Y),D=OR(O31(J.item),Y);if(F!==D)return D-F;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=_0.of(J);return new l({text:new M($.status.reason,new y({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new G1A({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class G1A extends w1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=_0.of(Y),{colors:X,app:F}=Z,D=B?F.selectionBackground:void 0,G=B?F.selectionForeground:X.foreground,V=B?G:X.mutedForeground,U=new l({text:new M(Q.noun?.toLowerCase()??"",new y({color:V,dim:$||!B})),textAlign:"right"}),K=[new M(Q.verb.toLowerCase(),new y({color:G,bold:!0,dim:$}))];if($)K.push(new M(" (unavailable)",new y({color:G,dim:!0})));let E=l.spans(K),W=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)W.push({child:No5(Q.shortcut,Z,$)});return new V1A({columns:W,padding:z0.horizontal(1),backgroundColor:D})}}function O31(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function qo5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,a4(B.noun)):Q},0)}function No5(A,Q,B){let{colors:$,app:J}=Q,Y=new y({color:$.mutedForeground,dim:B}),Z=[];for(let X of A.modifiers()){if(Z.length>0)Z.push(new M(" ",Y));Z.push(new M(X,new y({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new M(" ",Y));return Z.push(new M(A.key,new y({color:J.keybind,bold:!0,dim:B}))),l.spans(Z)}class V1A extends w1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let X=0;X<Q.length;X++){let F=Q[X];if(X>0&&B>0)Y.push(new W0({width:B}));if(F.fixedWidth!==void 0)Y.push(new W0({width:F.fixedWidth,child:F.child}));else if(F.expanded)Y.push(new k1({child:F.child}));else Y.push(F.child)}let Z=new B1({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new m0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class R31{#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 ZZ extends N6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=ZZ.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(ZZ)?.commandRegistry??null}}class P31 extends v0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new U1A}}class U1A extends k0{modalStack=new M31;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=ZZ.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=ZZ.of(A).commands,B=new j31({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new L31({root:B,controller:this.modalStack})}}var _31=[{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"]}]}],T31=[{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 IU0 extends w1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=e1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[X,F]=this.renderRow(Z),D;if(J)D=new f0({crossAxisAlignment:"start",mainAxisSize:"min",children:[X,new b0({padding:z0.only({left:4}),child:F})]});else D=new B1({crossAxisAlignment:"start",children:[new k1({flex:1,child:X}),new W0({width:1}),new k1({flex:1,child:F})]});Y.push(new b0({padding:z0.horizontal(6),child:D}))}return new f0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class S31 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 K1A}}class K1A extends k0{scrollController;initState(){this.scrollController=new rA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=T1.of(A).colorScheme,J=_0.of(A).app,Y=e1.of(A),Z=new y({color:B.primary,bold:!0}),X=new y({color:B.secondary,bold:!0}),F=new y({color:J.keybind}),D=new y({color:J.command}),G=new y({color:B.foreground}),V=new y({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,W=K-4,H=Math.max(40,Math.min(80,E)),z=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let _=O.noun?.toLowerCase();return _!=="dev"&&_!=="debug"&&!O.id.startsWith("debug-")&&!z.has(O.id)})].sort((O,_)=>{let T=(O.noun??"").toLowerCase(),S=(_.noun??"").toLowerCase(),b=T.localeCompare(S);if(b!==0)return b;let h=O.verb.toLowerCase(),x=_.verb.toLowerCase(),v=h.localeCompare(x);if(v!==0)return v;return O.id.localeCompare(_.id)}),I=new _A({autofocus:!0,controller:this.scrollController,child:new m0({constraints:new O1(H,H,0,Number.POSITIVE_INFINITY),child:new f0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new B4({child:new l({text:new M(`Amp CLI - Help & Keyboard Shortcuts
|
|
5329
|
+
${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.options.state.mounted){Q(void 0);return}this.options.state.setState(()=>{this.options.commandPalette.disable(),this.pendingInputDialog={options:A,resolve:Q}})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(!this.options.state.mounted){Q(!1);return}this.options.state.setState(()=>{this.options.commandPalette.disable(),this.pendingConfirmDialog={options:A,resolve:Q}})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(!this.options.state.mounted){Q(void 0);return}this.options.state.setState(()=>{this.options.commandPalette.disable(),this.pendingSelectDialog={options:A,resolve:Q}})})};resolveInputDialog=(A)=>{let Q=this.pendingInputDialog;if(!Q)return;this.clearDialogState(()=>{this.pendingInputDialog=null}),Q.resolve(A)};cancelInputDialog=()=>{let A=this.pendingInputDialog;if(!A)return;this.clearDialogState(()=>{this.pendingInputDialog=null}),A.resolve(void 0)};resolveConfirmDialog=()=>{let A=this.pendingConfirmDialog;if(!A)return;this.clearDialogState(()=>{this.pendingConfirmDialog=null}),A.resolve(!0)};cancelConfirmDialog=()=>{let A=this.pendingConfirmDialog;if(!A)return;this.clearDialogState(()=>{this.pendingConfirmDialog=null}),A.resolve(!1)};resolveSelectDialog=(A)=>{let Q=this.pendingSelectDialog;if(!Q)return;this.clearDialogState(()=>{this.pendingSelectDialog=null}),Q.resolve(A)};cancelSelectDialog=()=>{let A=this.pendingSelectDialog;if(!A)return;this.clearDialogState(()=>{this.pendingSelectDialog=null}),A.resolve(void 0)};clearDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}Vi();O2();import{readFile as zo5}from"node:fs/promises";import I31 from"node:os";async function Z1A(A,Q){try{return{path:Q,contents:Mm0(await zo5(A,"utf8"))}}catch{return null}}async function X1A(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(YJ(J),null,2)});let Y=await Z1A(ex(Q),`logs/${Q}.log`);if(Y)B.push(Y);let Z=await Z1A(A.settingsFilePath,"settings/global.json");if(Z)B.push(Z);let X=await If()??"unknown",F=await YA.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778084963-gfd096d",clientOS:`${I31.platform()} ${I31.release()} ${I31.arch()}`,installMethod:X}},{config:A.configService});if(!F.ok)throw Error(`Failed to submit report: ${F.error.message}`);return F.result.reportID}class w31{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();e9();O2();async function F1A(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:BZ(B)},{config:A.configService});if(!J.ok)throw Error(J.error.message);let Y=!1;if(B!=="private"){let X=TB(new URL(A.ampURL),Q).toString();try{await L4.instance.tuiInstance.clipboard.writeText(X),Y=!0}catch(F){j.error("Failed to copy thread URL after visibility update",{error:F})}}let Z=Y?`${$} Link copied to clipboard.`:$;return new BB(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 NU0 extends N5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new C31(this.offstage)}updateRenderObject(A){if(A instanceof C31)A.offstage=this.offstage}}class C31 extends Y4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class M31{_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 L31 extends v0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new D1A}}class D1A extends k0{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 ZR,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new ZR,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 NU0({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 l4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new NU0({key:$.key,offstage:!J,child:Y}))}return new t4({fit:"expand",children:Q})}}class j31 extends w1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=qo5(Q);return new TA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:z0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new d6({items:Q,showBorder:!1,getLabel:($)=>{let J=O31($);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=OR($.item.verb.toLowerCase(),Y),X=OR(J.item.verb.toLowerCase(),Y);if(Z!==X)return X-Z;let F=OR(O31($.item),Y),D=OR(O31(J.item),Y);if(F!==D)return D-F;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=_0.of(J);return new l({text:new M($.status.reason,new y({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new G1A({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class G1A extends w1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=_0.of(Y),{colors:X,app:F}=Z,D=B?F.selectionBackground:void 0,G=B?F.selectionForeground:X.foreground,V=B?G:X.mutedForeground,U=new l({text:new M(Q.noun?.toLowerCase()??"",new y({color:V,dim:$||!B})),textAlign:"right"}),K=[new M(Q.verb.toLowerCase(),new y({color:G,bold:!0,dim:$}))];if($)K.push(new M(" (unavailable)",new y({color:G,dim:!0})));let E=l.spans(K),W=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)W.push({child:No5(Q.shortcut,Z,$)});return new V1A({columns:W,padding:z0.horizontal(1),backgroundColor:D})}}function O31(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function qo5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,a4(B.noun)):Q},0)}function No5(A,Q,B){let{colors:$,app:J}=Q,Y=new y({color:$.mutedForeground,dim:B}),Z=[];for(let X of A.modifiers()){if(Z.length>0)Z.push(new M(" ",Y));Z.push(new M(X,new y({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new M(" ",Y));return Z.push(new M(A.key,new y({color:J.keybind,bold:!0,dim:B}))),l.spans(Z)}class V1A extends w1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let X=0;X<Q.length;X++){let F=Q[X];if(X>0&&B>0)Y.push(new W0({width:B}));if(F.fixedWidth!==void 0)Y.push(new W0({width:F.fixedWidth,child:F.child}));else if(F.expanded)Y.push(new k1({child:F.child}));else Y.push(F.child)}let Z=new B1({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new m0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class R31{#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 ZZ extends N6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=ZZ.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(ZZ)?.commandRegistry??null}}class P31 extends v0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new U1A}}class U1A extends k0{modalStack=new M31;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=ZZ.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=ZZ.of(A).commands,B=new j31({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new L31({root:B,controller:this.modalStack})}}var _31=[{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"]}]}],T31=[{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 IU0 extends w1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=e1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[X,F]=this.renderRow(Z),D;if(J)D=new f0({crossAxisAlignment:"start",mainAxisSize:"min",children:[X,new b0({padding:z0.only({left:4}),child:F})]});else D=new B1({crossAxisAlignment:"start",children:[new k1({flex:1,child:X}),new W0({width:1}),new k1({flex:1,child:F})]});Y.push(new b0({padding:z0.horizontal(6),child:D}))}return new f0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class S31 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 K1A}}class K1A extends k0{scrollController;initState(){this.scrollController=new rA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=T1.of(A).colorScheme,J=_0.of(A).app,Y=e1.of(A),Z=new y({color:B.primary,bold:!0}),X=new y({color:B.secondary,bold:!0}),F=new y({color:J.keybind}),D=new y({color:J.command}),G=new y({color:B.foreground}),V=new y({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,W=K-4,H=Math.max(40,Math.min(80,E)),z=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let _=O.noun?.toLowerCase();return _!=="dev"&&_!=="debug"&&!O.id.startsWith("debug-")&&!z.has(O.id)})].sort((O,_)=>{let T=(O.noun??"").toLowerCase(),S=(_.noun??"").toLowerCase(),b=T.localeCompare(S);if(b!==0)return b;let h=O.verb.toLowerCase(),x=_.verb.toLowerCase(),v=h.localeCompare(x);if(v!==0)return v;return O.id.localeCompare(_.id)}),I=new _A({autofocus:!0,controller:this.scrollController,child:new m0({constraints:new O1(H,H,0,Number.POSITIVE_INFINITY),child:new f0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new B4({child:new l({text:new M(`Amp CLI - Help & Keyboard Shortcuts
|
|
5330
5330
|
`,Z)})}),new W0({height:1}),new b0({padding:z0.horizontal(2),child:new l({text:new M(`Editor Shortcuts
|
|
5331
5331
|
`,X)})}),new IU0({items:_31.filter((O)=>O.submitOnEnterOnly===void 0||O.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(O)=>{let _=[];for(let S of O.methods){let b=this.buildCleanKeyCombination(S);_.push(b)}let T=_.join(", ");return[new l({text:new M(T,F)}),new l({text:new M(O.description,G)})]}}),new W0({height:1}),new b0({padding:z0.horizontal(2),child:new l({text:new M(`Scrolling & Navigation
|
|
5332
5332
|
`,X)})}),new IU0({items:T31,renderRow:(O)=>{let _=[];for(let S of O.methods){let b=this.buildCleanKeyCombination(S);_.push(b)}let T=_.join(", ");return[new l({text:new M(T,F)}),new l({text:new M(O.description,G)})]}}),new W0({height:1}),new b0({padding:z0.horizontal(2),child:new l({text:new M(`Command Palette Commands
|
|
@@ -5427,7 +5427,7 @@ Ctrl-X, Y, Z to unlock`;if(E){let i=G.text.replace(/`([^`]+)`/g,"$1")+`
|
|
|
5427
5427
|
`))}function E03(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 x6A(A,Q){let B=A.replace(/\s+/g," ").trim();if(a4(B)<=Q)return B;let $="...",J=a4($);if(Q<=J)return tX($,Q);return`${tX(B,Q-J,!0,"")}${$}`}var h6A="https://ampcode.com/news/neo",K21=[{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:["Amp now has a complete plugin API.",{text:"Add tools, commands, control UI, and hook into ",linkText:"events",href:"https://ampcode.com/manual/plugin-api",textAfter:"."}]},{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:h6A,href:h6A},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}],yb=50,nR=40,V21=1000,W03=420,H03=760,z03=-250,q03=1100,sU0=33,g6A=0.999,N03=2.1,GH=K21.length,I03=GH-2,w03=720,C03=420,a6A="Meet the new",o6A="Amp",r6A="CLI",E21=f4(a6A).length,M03=f4(o6A).length,L03=f4(r6A).length,tU0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},m6A={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},p6A={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},d6A=[tU0,m6A,p6A,tU0,m6A,p6A,tU0],O03=tU0;class W21 extends v0{onDismiss;animationProgress;constructor(A){super();this.onDismiss=A.onDismiss,this.animationProgress=A.animationProgress}createState(){return new s6A}}class s6A extends k0{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=V21;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 y9(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=XZ(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=g6A,this.firstStageHintVisible=this.animationProgress>=g6A,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:V21,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=XZ(A/H03);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},sU0)}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>=GH-1){this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<GH-1)return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.introStage>=GH-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,$=XZ(B/W03);if(this.setState(()=>{if(this.stageTransitionProgress=$,$>=1)this.previousIntroStage=null}),$>=1)this.stopStageTransitionTimer()},sU0)}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=XZ(J/this.animationDurationMs),Z=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*xb(Y);if(this.setState(()=>{this.animationProgress=Z}),Y>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},sU0)}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,V21+z03),Q=A+q03;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?XZ((A-this.firstStageTitleRevealStartedAt)/w03):this.firstStageTitleRevealProgress,B=this.firstStageHintRevealStartedAt?XZ((A-this.firstStageHintRevealStartedAt)/C03):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=B}),Q>=1&&B>=1)this.stopFirstStageRevealTimer()},sU0)}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=c6A(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:l6A(c6A(this.previousIntroStage),A,xb(this.stageTransitionProgress));return this.dismissProgress>0?l6A(Q,O03,xb(this.dismissProgress)):Q}build(A){let Q=T1.of(A).colorScheme,B=_0.of(A),$=this.currentOrbPalette(),J=QB(1,"frontier",$),Y=e1.of(A).size,X=this.widget.animationProgress??this.animationProgress,F=Math.max(Y.width/yb,Y.height/nR)*N03,D=F+(1-F)*X,G=xb(this.dismissProgress),V=Math.max(yb,Math.round(yb*D)),U=Math.max(nR,Math.round(nR*D)),K=Math.round((Y.width-V)/2),E=Math.round((Y.height-U)/2),W=Math.max(0,Math.floor((Y.width-yb)/2)),H=-Math.floor(nR/2),z=Math.round(K+(W-K)*X),q=Math.round(E+(H-E)*X),N=z+V/2,I=q+U/2,w=j03({dismissProgress:this.dismissProgress,easedDismissProgress:G,introOrbScale:D,normalOrbCenterX:N,normalOrbCenterY:I,size:Y}),C=Math.max(yb,Math.round(yb*w.orbScale)),O=Math.max(nR,Math.round(nR*w.orbScale)),_=w.orbCenterX,T=w.orbCenterY,S=Math.round(_-C/2),b=Math.round(T-O/2),h=Math.max(3,Math.min(Y.height-5,Math.floor(nR/2)+2)),x=Math.max(h+3,Y.height-3),v=w.textDissolveProgress,u=this.introStage>=GH-1?w.backdropDissolveProgress:0,m=this.firstStageTitleVisible&&v<1,d=m&&this.firstStageHintVisible,g=d&&this.introStage>0&&this.introStage<GH-1,n=this.introStage===0?this.firstStageTitleRevealProgress:1,c=this.introStage===0?this.firstStageHintRevealProgress:1,$0=Math.max(24,Math.min(74,Y.width-4)),E0=Math.min(12,Math.max(8,Y.height-h-6)),i=Math.max(0,Math.floor((Y.width-$0)/2)),J0=Math.max(0,Math.min(Y.height-E0,Math.floor(Y.height*0.55-E0/2))),w0=this.widget.animationProgress!==void 0?new Of({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 Of({width:C,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new l4({autofocus:!0,canRequestFocus:!0,debugLabel:"NeoWelcomeTakeover",onKey:(A0)=>{if(A0.key==="Enter")return this.advanceIntroStage(),"handled";if((A0.key===" "||A0.key==="Space")&&this.introStage<GH-1)return this.advanceIntroStage(),"handled";if(A0.key==="Escape"||A0.key==="Esc")return this.dismissFromFinalIntroStage()?"handled":"ignored";if(A0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(A0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new t4({fit:"expand",children:[new t6A({color:Q.background,dissolveProgress:u}),new t4({fit:"expand",children:[new x1({onClick:()=>{},child:W0.expand()}),new EA({left:S,top:b,width:C,height:O,child:w0}),...m?[new EA({left:i,top:J0,width:$0,height:E0,child:P03({stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:$0,height:E0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:J,link:B.app.link,keybind:B.app.keybind,titleRevealProgress:n,dissolveProgress:v,context:A})})]:[],...d?[...g?[new EA({left:i,top:Math.max(0,x-1),width:$0,height:1,child:new l({text:y03({stage:this.introStage,foreground:Q.mutedForeground,dissolveProgress:v}),textAlign:"center"})})]:[],new EA({left:i,top:x,width:$0,height:1,child:new l({text:x03({stage:this.introStage,foreground:Q.mutedForeground,keybind:B.app.keybind,revealProgress:c,dissolveProgress:v}),textAlign:"center"})})]:[]]})]})})}}class t6A extends Y8{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new e6A(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class e6A extends Y4{color;dissolveProgress;constructor(A,Q){super();this.color=A,this.dissolveProgress=Q}update(A,Q){this.color=A,this.dissolveProgress=Q,this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;N4(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,B=0){let $=Math.floor(Q+this.offset.x),J=Math.floor(B+this.offset.y),Y=Math.floor(this.size.width),Z=Math.floor(this.size.height),X={bg:this.color},F=XZ(this.dissolveProgress);if(F<=0){A.fill($,J,Y,Z," ",X);return}if(F>=1)return;for(let D=0;D<Z;D++)for(let G=0;G<Y;G++)if(!R03(G,D,Y,Z,F))A.fill($+G,J+D,1,1," ",X)}}function XZ(A){return Math.min(1,Math.max(0,A))}function xb(A){return 1-(1-A)**3}function c6A(A){return d6A[A]??d6A[0]}function l6A(A,Q,B){return{primary:XR(A.primary,Q.primary,B),secondary:XR(A.secondary,Q.secondary,B)}}function j03({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:XZ(A/0.52),backdropDissolveProgress:xb(XZ((A-0.12)/0.88))}}function R03(A,Q,B,$,J){let Y=$<=1?0:Q/($-1),Z=A5A(A+Q*Math.max(1,B));return(1-Y)*0.72+Z*0.28<J}function P03({stage:A,previousStage:Q,progress:B,direction:$,width:J,height:Y,foreground:Z,mutedForeground:X,accent:F,link:D,keybind:G,titleRevealProgress:V,dissolveProgress:U,context:K}){if(Q===null||B>=1)return U21({stage:A,foreground:Z,mutedForeground:X,accent:F,link:D,keybind:G,titleRevealProgress:V,dissolveProgress:U,context:K});let E=xb(B),W=$*Math.round((1-E)*J),H=-$*Math.round(E*J);return new rW(new t4({fit:"expand",children:[new EA({left:H,top:0,width:J,height:Y,child:U21({stage:Q,foreground:Z,mutedForeground:X,accent:F,link:D,keybind:G,titleRevealProgress:Q===0?1:V,dissolveProgress:U,context:K})}),new EA({left:W,top:0,width:J,height:Y,child:U21({stage:A,foreground:Z,mutedForeground:X,accent:F,link:D,keybind:G,titleRevealProgress:V,dissolveProgress:U,context:K})})]}))}function U21({stage:A,foreground:Q,mutedForeground:B,accent:$,link:J,keybind:Y,titleRevealProgress:Z,dissolveProgress:X,context:F}){let D=K21[A]??K21[0],G=new y({color:$,bold:!0}),V=new y({color:Q}),U=[...D.title===null?[]:[new l({text:A===0?eU0(S03({progress:Z,foreground:$,pulseColor:$}),X):new M(VH(D.title,X),G),textAlign:"center"})],...D.body.length>0?[_03()]:[],...D.body.map((K)=>T03(K,V,B,J,Y,X,F))];return new B4({child:new b0({padding:z0.horizontal(1),child:new f0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:U})})})}function _03(){return W0.height(1)}function T03(A,Q,B,$,J,Y,Z){if(typeof A==="string")return new l({text:new M(VH(A,Y),Q),textAlign:"center"});if("keybind"in A)return new l({text:new M("",void 0,[new M(VH(A.text,Y),new y({color:B,dim:!0})),new M(VH(A.keybind,Y,f4(A.text).length),new y({color:J}))]),textAlign:"center"});if("highlightText"in A){let X=zA.createSpan(A.href,A.linkText,new y({color:$,underline:!0})),F=QG.of(Z),D=new M("",void 0,[new M(A.text,Q),new M(A.highlightText,new y({color:J})),new M(A.textAfterHighlight,Q),new M(X.text,X.style,X.children,X.hyperlink,()=>{lA(Z,A.href,{forceExternal:!1,onShowImagePreview:F})}),new M(A.textAfter,Q)]);return new l({text:eU0(D,Y),textAlign:"center"})}if("linkText"in A){let X=zA.createSpan(A.href,A.linkText,new y({color:$,underline:!0})),F=QG.of(Z),D=new M("",void 0,[new M(A.text,Q),new M(X.text,X.style,X.children,X.hyperlink,()=>{lA(Z,A.href,{forceExternal:!1,onShowImagePreview:F})}),new M(A.textAfter,Q)]);return new l({text:eU0(D,Y),textAlign:"center"})}if(Y>0)return new l({text:new M(VH(A.text,Y),new y({color:$,underline:!0})),textAlign:"center"});return new B4({child:zA.createWidget(Z,A.href,A.text,new y({color:$,underline:!0}))})}function S03({progress:A,foreground:Q,pulseColor:B}){let $=new y({color:Q,bold:!0}),J=new y({color:v03({progress:A,foreground:Q,pulseColor:B}),bold:!0});return new M("",void 0,[new M(k03(A).padEnd(E21," "),$),new M(" ",$),new M(i6A(o6A,M03,A,0.72),$),new M(" ",$),new M(i6A(r6A,L03,A,0.88),J)])}function k03(A){let Q=f4(a6A),B=Math.min(E21,Math.ceil(XZ(A/0.62)*E21));return Q.slice(0,B).join("")}function i6A(A,Q,B,$){return B>=$?A:"".padEnd(Q," ")}function v03({progress:A,foreground:Q,pulseColor:B}){if(A<0.88||A>=1)return Q;let $=XZ((A-0.88)/0.12);return Math.cos($*Math.PI*4)*(1-$)>0.12?B:Q}function y03({stage:A,foreground:Q,dissolveProgress:B}){return new M(VH(`${A}/${I03}`,B),new y({color:Q,dim:!0}))}function x03({stage:A,foreground:Q,keybind:B,revealProgress:$,dissolveProgress:J}){let Y=new y({color:B}),Z=new y({color:Q,dim:!0}),X=A>=GH-1?"Enter":"Space",F=A>=GH-1?" to get started":" to continue",D=n6A(X,$),G=n6A(F,XZ(($*(f4(X).length+f4(F).length)-f4(X).length)/f4(F).length));return new M("",void 0,[new M(VH(D,J),Y),new M(VH(G,J),Z)])}function n6A(A,Q){let B=f4(A),$=Math.min(B.length,Math.ceil(XZ(Q)*B.length));return B.slice(0,$).join("").padEnd(B.length," ")}function eU0(A,Q,B=0){if(Q<=0)return A;let $=B+f4(A.text??"").length,J=A.children?.map((Y)=>{let Z=eU0(Y,Q,$);return $+=f4(Y.toPlainText()).length,Z});return new M(A.text?VH(A.text,Q,B):A.text,A.style,J,A.hyperlink,A.onClick)}function VH(A,Q,B=0){if(Q<=0)return A;return f4(A).map((J,Y)=>{if(J.trim()==="")return J;return A5A(B+Y)<Q?" ":J}).join("")}function A5A(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}c0();O2();function Kw(A,Q){let{colors:B,dim:$}=Q,J=[];if(A.totalCostUSD===null)return J;let Y=A.costBreakdown,Z=Y?.freeUSD??0,X=Y?.paidUSD??0;if(Z===0&&X===0)return J;let D={decimalPlaces:"more-if-tiny",intent:"cost"};if(X===0)J.push(new M(ZK(Z,D),new y({color:B.foreground,dim:$}))),J.push(new M(" (free)",new y({color:B.foreground,dim:$})));else if(Z>0)J.push(new M(ZK(Z,D),new y({color:B.foreground,dim:$}))),J.push(new M(" (free)",new y({color:B.foreground,dim:$}))),J.push(new M(" + ",new y({color:B.foreground,dim:$}))),J.push(new M(ZK(X,D),new y({color:B.foreground,dim:$,bold:!$})));else J.push(new M(ZK(X,D),new y({color:B.foreground,dim:$,bold:!$})));return J}class H21 extends c4{}class z21 extends c4{}function f03(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 b03(A,Q){let B=_0.of(Q),{colors:$}=B,J=Kw(A,{colors:{foreground:$.foreground}}),Y=[];if(J.length>0)Y.push(new M("Total: ",new y({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(`
|
|
5428
5428
|
|
|
5429
5429
|
`)),Y.push(new M("Details: ",new y({color:$.mutedForeground}))),Y.push(new M(A.costBreakdownURL,new y({color:B.app.link})));return new l({text:new M("",void 0,Y)})}function u03(A,Q,B){let $=b03(A,Q);if(!A.costBreakdownURL)return new TA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new K4(()=>{return BA.maybeInvoke(Q,new Z$(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new K4(()=>{return lA(Q,J),"handled"});return new TA({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([[H21,Y],[z21,Z]]),child:new l5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[v1.key("o"),new z21],[v1.key("y"),new H21]]),child:new m4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Q5A(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(f03(J,Y.error),"error",5000),$();return}Q.push(u03(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 h03=250,g03=2000;function m03({ampURL:A,threadID:Q,logPath:B}){return[`Debug thread ${TB(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(`
|
|
5430
|
-
`)}class q21 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 $5A}}class $5A extends k0{editorController=new j8;commandPalette=new Os(this);commandRegistry=new R31;toastController=new FA1;exitHintTimer=new df(this,1000);ideStatus=new p8(this,{});threadNavigationHistory=new w31;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;titleSubscription=null;agentStateSubscription=null;currentTitleText=void 0;currentAgentBusy=!1;currentTerminalTitle=void 0;terminalTitleSpinner=new q6;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)=>X1A({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);setThreadVisibility=(A,Q)=>{return F1A({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService},A,Q)};archiveThread=async(A)=>{let Q=await Ds4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Gs4({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 Vs4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(eB.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(s80(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 N31({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()},h03),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<g03)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?$1A({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((X)=>T81({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:X,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()}},Q5A({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 d31({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 G21({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:()=>{OJ(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((X)=>new m31({onCancel:X,onSelect:(F)=>{this.handleIdeSelection(F),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 k31({commands:ZZ.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 TA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new l({text:new M(QA1({version:"0.0.1778084602-gfd096d",buildTimestamp:"2026-05-06T16:27:03.929Z",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:v1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{BA.maybeInvoke(Y,new Cb)}},...Q,...l0A(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 D21({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=e1.of(A),Z=[new m0({constraints:O1.tight(J.size.width,J.size.height),child:$})];if(this.commandPalette.isEnabled())Z.push(new l4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new P31({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Z.push(T81({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)Z.push(new l4({debugLabel:"NeoWelcomeDialogOverlay",child:new W21({onDismiss:this.dismissNeoWelcome})}));if(Z.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Z.push(new h31({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ae.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Z.push(new g31);return new S3({neoContext:this.widget.neoContext,child:new ZZ({commandRegistry:this.commandRegistry,child:new $w({completionBuilder:this.widget.completionBuilder,child:new u5({controller:this.toastController,child:new BA({actions:this.buildActions(),child:new l5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[v1.ctrl("c"),new UU0],[v1.ctrl("o"),new KU0],[v1.alt("i"),new WU0],[v1.alt("p"),new fI],[v1.ctrl("t"),new HU0]]),child:new m4({debugLabel:"AppShellFocus",child:new DA1({controller:this.toastController,child:new t4({children:Z})})})})})})})})})}buildActions(){let A=new K4(()=>{if(LJ.hasAnyCopyableSelection())return LJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new K4(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new K4(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new K4(()=>{return this.startNewDraftThread(),"handled"}),J=new K4(()=>{return L4.instance.stop(),"handled"}),Y=new K4((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 K4(()=>{return L4.instance.toggleFrameStatsOverlay(),"handled"}),X=new K4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),F=new K4(()=>{let U=this.activeThreadContext?.client.getThreadId();if(!U)return this.toastController.show("No active thread","error",2000),"handled";let K=ex(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 K4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";let U=this.activeThreadContext?.client.getThreadId();if(!U)return"handled";return this.prepareThreadIssueInvestigation(U),"handled"}),G=new K4(()=>{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 K4(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[UU0,A],[Ct,$],[Cb,J],[Z$,Y],[Ot,B],[KU0,Q],[WU0,X],[jt,F],[Rt,D],[Pt,G],[fI,Z],[HU0,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:m03({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:ex(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 kf(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,$=A$(Q),J=MG0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return CG0(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=B5A(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(nZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=B5A(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(Bw);if(this.exitHintTimer.isActive())A.add(Hb);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((X)=>X.type==="text");if(Y&&Y.type==="text")this.widget.history.add(Y.text,Ae.cwd()),this.widget.history.reset();let Z=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,B?BZ(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 $=A$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};MJ((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=gZ0(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{let $=await this.widget.clientPool.reconnectClient(A.client);this.toastController.update(B,`Reconnected ${$}`,"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{let $=await this.widget.clientPool.disconnectClient(A.client);this.toastController.update(B,`Disconnected ${$}`,"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=u31(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=Ae.cwd().replace(Ae.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,Ae.stdout.write(RI(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 B5A(A,Q,B){let $={...A};for(let J of p03(Q,B)){if(!nZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function p03(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}d4();function J5A(A,Q,B,$){let J=kS(A),Y="\x1B[0m",Z="\x1B[34m",X="\x1B[90m",F="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new sY(G,V),K=new y9(42),E=new TI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,H0.default(),K);E.layout(O1.tight(G,V)),E.paint(U,0,0);let W=U.getBuffer().getCells(),H=0;for(let _=0;_<V;_++)if(W[_].some((T)=>T.char!==" ")){H=_;break}let z=V-1;for(let _=V-1;_>=0;_--)if(W[_].some((T)=>T.char!==" ")){z=_;break}function q(_,T){if(!_)return"";if(_.type==="rgb"){let{r:S,g:b,b:h}=_.value;if(B.getColorDepth()>=24)return`\x1B[${T?38:48};2;${S};${b};${h}m`;let x=JR(S,b,h);return`\x1B[${T?38:48};5;${x}m`}return""}let N=[];if(z>=H)for(let _=H;_<=z;_++){let T="";for(let S=0;S<G;S++){let b=W[_][S],h=b.char,x=q(b.style.fg,!0);T+=x+h+"\x1B[0m"}N.push(T)}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 _=0;_<w;_++){let T=" ".repeat(G);if(_>=C&&_<C+I)T=N[_-C];let S=" ",b="";if(_>=O&&_<O+D.length)b=D[_-O];B.write(T+S+b+`
|
|
5430
|
+
`)}class q21 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 $5A}}class $5A extends k0{editorController=new j8;commandPalette=new Os(this);commandRegistry=new R31;toastController=new FA1;exitHintTimer=new df(this,1000);ideStatus=new p8(this,{});threadNavigationHistory=new w31;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;titleSubscription=null;agentStateSubscription=null;currentTitleText=void 0;currentAgentBusy=!1;currentTerminalTitle=void 0;terminalTitleSpinner=new q6;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)=>X1A({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);setThreadVisibility=(A,Q)=>{return F1A({ampURL:this.widget.neoContext.ampURL,configService:this.widget.configService},A,Q)};archiveThread=async(A)=>{let Q=await Ds4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Gs4({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 Vs4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if(eB.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(s80(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 N31({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()},h03),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<g03)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?$1A({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((X)=>T81({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:X,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()}},Q5A({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 d31({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 G21({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:()=>{OJ(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((X)=>new m31({onCancel:X,onSelect:(F)=>{this.handleIdeSelection(F),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 k31({commands:ZZ.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 TA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new l({text:new M(QA1({version:"0.0.1778084963-gfd096d",buildTimestamp:"2026-05-06T16:33:10.737Z",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:v1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{BA.maybeInvoke(Y,new Cb)}},...Q,...l0A(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 D21({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=e1.of(A),Z=[new m0({constraints:O1.tight(J.size.width,J.size.height),child:$})];if(this.commandPalette.isEnabled())Z.push(new l4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new P31({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)Z.push(T81({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)Z.push(new l4({debugLabel:"NeoWelcomeDialogOverlay",child:new W21({onDismiss:this.dismissNeoWelcome})}));if(Z.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)Z.push(new h31({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ae.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)Z.push(new g31);return new S3({neoContext:this.widget.neoContext,child:new ZZ({commandRegistry:this.commandRegistry,child:new $w({completionBuilder:this.widget.completionBuilder,child:new u5({controller:this.toastController,child:new BA({actions:this.buildActions(),child:new l5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[v1.ctrl("c"),new UU0],[v1.ctrl("o"),new KU0],[v1.alt("i"),new WU0],[v1.alt("p"),new fI],[v1.ctrl("t"),new HU0]]),child:new m4({debugLabel:"AppShellFocus",child:new DA1({controller:this.toastController,child:new t4({children:Z})})})})})})})})})}buildActions(){let A=new K4(()=>{if(LJ.hasAnyCopyableSelection())return LJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new K4(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new K4(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new K4(()=>{return this.startNewDraftThread(),"handled"}),J=new K4(()=>{return L4.instance.stop(),"handled"}),Y=new K4((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 K4(()=>{return L4.instance.toggleFrameStatsOverlay(),"handled"}),X=new K4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),F=new K4(()=>{let U=this.activeThreadContext?.client.getThreadId();if(!U)return this.toastController.show("No active thread","error",2000),"handled";let K=ex(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 K4(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";let U=this.activeThreadContext?.client.getThreadId();if(!U)return"handled";return this.prepareThreadIssueInvestigation(U),"handled"}),G=new K4(()=>{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 K4(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[UU0,A],[Ct,$],[Cb,J],[Z$,Y],[Ot,B],[KU0,Q],[WU0,X],[jt,F],[Rt,D],[Pt,G],[fI,Z],[HU0,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:m03({ampURL:this.widget.neoContext.ampURL,threadID:A,logPath:ex(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 kf(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,$=A$(Q),J=MG0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return CG0(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=B5A(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(nZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=B5A(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(Bw);if(this.exitHintTimer.isActive())A.add(Hb);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((X)=>X.type==="text");if(Y&&Y.type==="text")this.widget.history.add(Y.text,Ae.cwd()),this.widget.history.reset();let Z=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,B?BZ(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 $=A$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};MJ((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=gZ0(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{let $=await this.widget.clientPool.reconnectClient(A.client);this.toastController.update(B,`Reconnected ${$}`,"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{let $=await this.widget.clientPool.disconnectClient(A.client);this.toastController.update(B,`Disconnected ${$}`,"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=u31(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=Ae.cwd().replace(Ae.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,Ae.stdout.write(RI(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 B5A(A,Q,B){let $={...A};for(let J of p03(Q,B)){if(!nZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function p03(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}d4();function J5A(A,Q,B,$){let J=kS(A),Y="\x1B[0m",Z="\x1B[34m",X="\x1B[90m",F="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new sY(G,V),K=new y9(42),E=new TI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,H0.default(),K);E.layout(O1.tight(G,V)),E.paint(U,0,0);let W=U.getBuffer().getCells(),H=0;for(let _=0;_<V;_++)if(W[_].some((T)=>T.char!==" ")){H=_;break}let z=V-1;for(let _=V-1;_>=0;_--)if(W[_].some((T)=>T.char!==" ")){z=_;break}function q(_,T){if(!_)return"";if(_.type==="rgb"){let{r:S,g:b,b:h}=_.value;if(B.getColorDepth()>=24)return`\x1B[${T?38:48};2;${S};${b};${h}m`;let x=JR(S,b,h);return`\x1B[${T?38:48};5;${x}m`}return""}let N=[];if(z>=H)for(let _=H;_<=z;_++){let T="";for(let S=0;S<G;S++){let b=W[_][S],h=b.char,x=q(b.style.fg,!0);T+=x+h+"\x1B[0m"}N.push(T)}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 _=0;_<w;_++){let T=" ".repeat(G);if(_>=C&&_<C+I)T=N[_-C];let S=" ",b="";if(_>=O&&_<O+D.length)b=D[_-O];B.write(T+S+b+`
|
|
5431
5431
|
`)}if($)B.write(`
|
|
5432
5432
|
\x1B[90m${$}\x1B[0m
|
|
5433
5433
|
`)}c0();kG0();var d03=2000;function Y5A(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<d03)return;if(J=U,VR())return;if(vD0())yD0();else OX0(V)},Z=(V)=>{if(!Q||!B)return;if(VR()&&!zs()&&!Mf())return;process.stdout.write(lD(`\x1B]777;notify;Amp;${V}\x1B\\`))},X=null,F=null,D=()=>{X?.unsubscribe(),X=null,F=null};return{attach:(V)=>{D(),X=V.subscribe({next:(U)=>{try{let K=F!==null&&sB(F),E=F==="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{F=U}},error:(U)=>{j.debug("Neo notification agent state stream errored",{error:U})}})},detach:D,unsubscribe(){D(),$.unsubscribe()}}}function c03({initialUserInput:A,showNeoWelcome:Q,neoWelcomeDismissed:B}){if(Q)return{show:!0,markDismissedOnDismiss:!0};let $=!A&&!B;return{show:$,markDismissedOnDismiss:$}}async function l03(A){await MJ((Q)=>OG0(Q,A,"interactive"))}async function Z5A(A,Q={}){let{initialThreadID:B,initialUserInput:$,openThreadPickerOnStart:J=!1,observerOnly:Y=!1,initialAgentMode:Z,initialReasoningEffort:X,showNeoWelcome:F=!1}=Q,D=async(I)=>{let w=await A.getThreadFromServer(I);if(!w)return null;return WD0(w)},G=async(I)=>{let w=await A.getThreadFromServer(I);if(!w)throw Error(`Thread ${I} not found`);let C=await aY(I,A.configService,A.apiKey,{usesThreadActors:!0}),T=await TU({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:Tp4(w)}),skipReadyWait:!0});if(T.ok||T.status===409)return;throw Error(`Thread import failed (${T.status}): ${await T.text()}`)},V=new y41(A.rivetEndpoint,A.apiKey,A.configService,{clientID:HI.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 NI({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:l03,readFileSystemDirectory:A.readFileSystemDirectory},D,G),U=await yI(),K=c03({initialUserInput:$,showNeoWelcome:F,neoWelcomeDismissed:U.neoWelcomeDismissed}),E={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(I)=>{let w=await A.getThreadFromServer(I);return w?fV(w):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:Kr,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:Y,sessionAgentMode:Z??U.agentMode,explicitReasoningEffort:X,lastReasoningEffortByMode:U.lastReasoningEffortByMode,lastSpeedByMode:U.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},W=(I,w)=>{return mx({ampURL:A.ampURL,configService:A.configService,threadID:I,signal:w})},H=(I,w)=>{return Vn4({ampURL:A.ampURL,configService:A.configService,threadID:I,signal:w})},z=new AA1,q=Y5A({configService:A.configService}),N=new Set;try{await qs(new q21({clientPool:V,analyzeContextForThread:W,listSkillsForThread:H,completionBuilder:A.completionBuilder,history:new jr,ideManager:z,configService:A.configService,initialThreadID:B,notificationService:q,initialUserInput:$,openThreadPickerOnStart:J,neoContext:E,showNeoWelcome:K.show,onNeoWelcomeDismissed:K.markDismissedOnDismiss?()=>{MJ(Wn4).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 _={id:O,title:C.title().getValue(),agentMode:C.agentMode,archived:N.has(O)},T=`${A.ampURL.replace(/\/$/,"")}/threads/${O}`;J5A(_,T,process.stdout)}}}finally{process.stdout.write(RI("")),q.unsubscribe(),V.dispose(),await A.dispose?.()}process.exit(0)}bd();UE();async function i03(A,Q,B){let $=b20(A);if(!$.success)throw Error(`Invalid permission format: ${$.error.message}`);if($.data.length===0)throw Error("No permission entry provided");let J=oz($.data);if(!J.success){let F=J.error.issues.map((D)=>D.message).join(", ");throw Error(`Invalid permission entry: ${F}`)}let Y=await Q.get("permissions",B)??[],X=[$.data[0],...Y];await Q.set("permissions",X,B)}async function X5A(A){try{let Q=A.args.map((B)=>{if(/[\s/\\*?[\]{}()"]/.test(B))return`"${B}"`;return B}).join(" ");await i03(Q,A.settings,A.scope),A.exit(0)}catch(Q){let B=Q instanceof Error?Q.message:"Unknown error";A.stderr.write(`Error: ${B}
|
|
@@ -7065,7 +7065,7 @@ ${J}`,Q);this.line=B,this.column=$,this.codeblock=J}}/*!
|
|
|
7065
7065
|
`),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 y({color:$.app.keybind,bold:!0})));else Y.push(new M(G,new y({color:B.colorScheme.foreground})));if(Z<J.length-1)Y.push(new M(`
|
|
7066
7066
|
`))}return new m0({decoration:{color:B.colorScheme.background,border:a1.all(new o1($.app.keybind,1,"rounded"))},child:new b0({padding:z0.symmetric(0,1),child:new l({text:new M(void 0,void 0,Y)})})})}}class L91 extends Y8{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:B=null,showAxes:$=!0,colors:J=DE0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=B,this.showAxes=$,this.colors=J}createRenderObject(){return new C91({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 L2A(A,Q,B,$,J,Y,Z){if(Y<=0)return null;switch(A){case"horizontal-bar":{let X=B;return X>=0&&X<Y?X:null}case"bar":case"stacked-bar":{let X=Z?l8:0,F=$-X;if(F<=0)return null;let D=Q-X;if(D<0||D>=F)return null;let G=Math.max(1,Math.floor(F/Y)),V=Math.floor(D/G);return V>=0&&V<Y?V:null}case"line":case"sparkline":case"stacked-area":{let X=Z?l8:0,F=$-X;if(F<=0)return null;let D=Math.max(0,Math.min(F-1,Q-X));if(Y===1)return 0;let G=F/(Y-1),V=Math.round(D/G);return Math.max(0,Math.min(Y-1,V))}default:return null}}function A83(A,Q,B,$,J,Y,Z,X){if(J<=0||Q<0||Q>=J)return null;let F=2;switch(A){case"horizontal-bar":return{x:Math.floor(B/2),y:Q};case"bar":case"stacked-bar":{let D=Y?l8:0,G=B-D,V=$-(Y?F: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=X>0?Z/X:0,W=Math.round((1-E)*(V-1));return{x:K,y:W}}case"line":case"sparkline":case"stacked-area":{let D=Y?l8:0,G=B-D,V=$-(Y?F: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=X>0?Z/X:0,E=Math.round((1-K)*(V-1));return{x:U,y:E}}default:return null}}function Q83(A){let Q=0;for(let B of A)for(let $ of B.points)if($.value>Q)Q=$.value;return Q||1}function B83(A,Q,B,$,J){if(B.length<=1){let X=$(A.value),F=A.meta?` (${A.meta})`:"";return A.label.length+2+X.length+F.length}let Y=A.label.length,Z=0;for(let X of B){let F=X.points[Q];if(!F)continue;Z+=F.value;let D=2+X.name.length+2+$(F.value).length;Y=Math.max(Y,D)}if(J){let X=9+$(Z).length;Y=Math.max(Y,X)}return Y}function $83(A,Q,B,$,J,Y,Z){let X;try{let E=T1.of(A),W=_0.of(A);X={foreground:E.colorScheme.foreground,background:E.colorScheme.background,border:W.app.keybind}}catch{X={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let F=new y({color:X.foreground,bold:!0}),D=new y({color:X.foreground}),G=new y({color:X.foreground,dim:!0}),V=[],U=new y({color:X.foreground,underline:!0}),K=(E,W)=>new M(W,U,void 0,jI(E),()=>{lA(A,E)});if($.length<=1){if(V.push(new M(`${Q.label}: `,F)),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}
|
|
7067
7067
|
`,F));let W=0;for(let H=0;H<$.length;H++){let z=$[H],q=z.points[B];if(!q)continue;W+=q.value;let N=z.color??J[H%J.length]??X.foreground;if(V.push(new M("● ",new y({color:N}))),V.push(new M(`${z.name}: `,G)),q.link)V.push(K(q.link,Y(q.value)));else V.push(new M(Y(q.value),D));if(H<$.length-1||E)V.push(new M(`
|
|
7068
|
-
`))}if(E)V.push(new M(" ",G)),V.push(new M("Total: ",G)),V.push(new M(Y(W),D))}return new m0({decoration:{color:X.background,border:a1.all(new o1(X.border,1,"rounded"))},child:new l({text:new M(void 0,void 0,V)})})}c0();L3();H8();$3();d7();f7();e9();O2();vB();xV();d4();jv();eT();R1();c0();e9();class O91{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.1778084602-gfd096d"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await n80(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 jw extends v0{props;constructor(A){super();this.props=A}createState(){return new O2A}}class O2A extends k0{_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 j2A extends k0{controller=new j8;focusNode=new F6({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=_0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,X=a1.all(new o1(B.foreground,1,"solid")),F=new Q$({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 B1({children:[new m0({decoration:{color:B.background},child:new l({text:new M(">",new y({color:B.foreground}))})}),new k1({child:F})]}),G=new m0({padding:z0.symmetric(1,0),child:new l({text:this.widget.props.title?new M(this.widget.props.title,new y({color:$.command,bold:!0})):new M("",void 0,[new M("Command: ",new y({color:B.foreground})),new M(this.widget.props.commandName,new y({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new M("Enter",new y({color:$.keybind}))),V.push(new M(" to submit, ",new y({color:B.foreground,dim:!0})));V.push(new M("Esc",new y({color:$.keybind}))),V.push(new M(" to cancel",new y({color:B.foreground,dim:!0})));let U=new m0({padding:z0.symmetric(1,0),child:new l({text:new M("",void 0,V)})});return new m0({decoration:{border:X,color:B.background},padding:z0.all(1),child:new f0({children:[G,new W0({height:1}),D,new X5,U]})})}}class He extends v0{props;constructor(A){super();this.props=A}createState(){return new j2A}}vB();class R2A extends k0{controller=new j8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new F6({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>=B7)return!1;let Q=await YF(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=_0.of(A),{colors:B,app:$}=Q,Y=e1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),X=new BG({controller:this.controller,triggers:[new _J],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}),F=new m4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:X}),D=new m0({constraints:new O1({maxHeight:Z}),padding:z0.symmetric(1,0),child:F}),G=new m0({padding:z0.symmetric(1,0),child:new l({text:new M("",void 0,[new M("Command: ",new y({color:B.foreground})),new M(this.widget.props.commandName,new y({color:$.command,bold:!0}))])})}),V=new m0({padding:z0.symmetric(1,0),child:new l({text:this.isConfirmingClearInput?new M("",void 0,[new M("Esc",new y({color:$.keybind})),new M(" again to clear input",new y({color:B.foreground,dim:!0}))]):new M("",void 0,[new M("Press ",new y({color:B.foreground,dim:!0})),new M("Enter",new y({color:$.keybind})),new M(" to submit, ",new y({color:B.foreground,dim:!0})),new M("Esc",new y({color:$.keybind})),new M(" to clear",new y({color:B.foreground,dim:!0}))])})}),U=[G,new W0({height:1}),new k1({child:D}),new W0({height:1}),V];return new m0({decoration:{border:a1.all(new o1(B.foreground,1,"solid")),color:B.background},padding:z0.all(1),child:new f0({children:U})})}}class j91 extends v0{props;constructor(A){super();this.props=A}createState(){return new R2A}}function P2A(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 R91 extends w1{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)=>P2A(J.pubDate).length));return new d6({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,X)=>{let F=_0.of(X),{colors:D}=F,G=F.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(W,H)=>new W0({width:H,child:B1.end([new l({text:new M(W,new y({color:K}))})])});return new m0({decoration:V?{color:V}:void 0,padding:z0.symmetric(2,0),child:new B1({children:[new k1({child:new l({text:new M(J.title,new y({color:U})),overflow:"ellipsis",maxLines:1})}),new W0({width:2}),E(P2A(J.pubDate),B)]})})}})}}class KB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!KB._instance)KB._instance=new KB;return KB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}c0();class _2A extends k0{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=_0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),F=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new d6({title:"Add Label",items:F,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 H=this.currentQuery.trim().toLowerCase();return new m0({decoration:K?{color:K}:void 0,padding:z0.symmetric(2,0),child:new l({text:new M("",void 0,[new M("Create new label: ",new y({color:E})),new M(H,new y({color:E,bold:!0}))])})})}return new m0({decoration:K?{color:K}:void 0,padding:z0.symmetric(2,0),child:new l({text:new M(D.name,new y({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 P91 extends v0{props;constructor(A){super();this.props=A}createState(){return new _2A}}class YG extends v0{props;constructor(A){super();this.props=A}createState(){return new T2A}}class T2A extends k0{_spinner=new q6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=_0.of(A),{colors:B,app:$}=Q,J=a1.all(new o1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new l({textAlign:"center",text:new M("",void 0,[new M(Y,new y({color:$.processing})),new M(" ",void 0),new M(this.widget.props.message,new y({color:B.foreground}))])}),F=[new k1({child:new f0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)F.push(new W0({height:2,child:new m0({padding:z0.symmetric(2,0),child:new l({text:new M("",new y({dim:!0}),[new M("Press ",new y({color:B.foreground})),new M("Esc",new y({color:B.info})),new M(" to cancel",new y({color:B.foreground}))])})})}));let D=new m0({decoration:new x4(B.background,J),child:new W0({width:60,height:7,child:new f0({mainAxisAlignment:"start",children:F})})});if(this.widget.props.onAbort)return new l4({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 DK extends v0{props;constructor(A){super();this.props=A}createState(){return new S2A}}class S2A extends k0{scrollController=new rA;scrollAreaKey=new D2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof b2}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=_0.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=UV0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=a1.all(new o1(Q.colors.border,1,"solid")),Z=new m0({padding:z0.symmetric(1,0),child:new l({text:new M($.title,new y({color:J,bold:!0}))})}),X=this.isWidgetMessage(B)?B.widget:new l({text:new M($.description,new y({color:Q.colors.foreground})),selectable:!0}),F=new k1({child:new Z8({child:new m0({padding:z0.symmetric(1,0),child:new B1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new k1({child:new _A({controller:this.scrollController,autofocus:!0,child:X})}),new K2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new m0({padding:z0.symmetric(1,0),child:new l({text:(()=>{if(this.widget.props.onRetry)return new M("",void 0,[new M("Press ",new y({color:Q.colors.foreground,dim:!0})),new M("R",new y({color:Q.app.keybind})),new M(" to retry, ",new y({color:Q.colors.foreground,dim:!0})),new M("Esc",new y({color:Q.app.keybind})),new M(" to cancel",new y({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new M("",new y({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new y({color:Q.app.keybind}),U=new y({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 y({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new l4({debugLabel:"MessageDialog",child:new t4({fit:"expand",children:[new x1({onClick:()=>{},child:new W0}),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 m0({decoration:{border:Y,color:Q.colors.background},padding:z0.all(1),child:new f0({mainAxisAlignment:"center",children:[Z,new W0({height:1}),F,D]})})})]})})}}L3();t1();class k2A extends v0{props;constructor(A){super();this.props=A}createState(){return new v2A}}class v2A extends k0{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=V1.relativePath(Q,OA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return T5(A)}statusIcon(A){let Q=d8.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=_0.of(A),{app:B}=Q;if(this.plugins.length===0)return new l({text:new M("No plugins found.",new y({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((F)=>F.status==="active").length,Z=this.plugins.reduce((F,D)=>F+D.registeredCommands.length,0),X=this.plugins.reduce((F,D)=>F+D.registeredTools.length,0);if($.push(new M(`${Y}/${J} ${H4(J,"plugin")} active`,new y({bold:!0}))),Z>0||X>0)$.push(new M(` (${Z} ${H4(Z,"command")}, ${X} ${H4(X,"tool")})`,new y({dim:!0})));$.push(new M(`
|
|
7068
|
+
`))}if(E)V.push(new M(" ",G)),V.push(new M("Total: ",G)),V.push(new M(Y(W),D))}return new m0({decoration:{color:X.background,border:a1.all(new o1(X.border,1,"rounded"))},child:new l({text:new M(void 0,void 0,V)})})}c0();L3();H8();$3();d7();f7();e9();O2();vB();xV();d4();jv();eT();R1();c0();e9();class O91{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.1778084963-gfd096d"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await n80(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 jw extends v0{props;constructor(A){super();this.props=A}createState(){return new O2A}}class O2A extends k0{_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 j2A extends k0{controller=new j8;focusNode=new F6({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=_0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,X=a1.all(new o1(B.foreground,1,"solid")),F=new Q$({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 B1({children:[new m0({decoration:{color:B.background},child:new l({text:new M(">",new y({color:B.foreground}))})}),new k1({child:F})]}),G=new m0({padding:z0.symmetric(1,0),child:new l({text:this.widget.props.title?new M(this.widget.props.title,new y({color:$.command,bold:!0})):new M("",void 0,[new M("Command: ",new y({color:B.foreground})),new M(this.widget.props.commandName,new y({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new M("Enter",new y({color:$.keybind}))),V.push(new M(" to submit, ",new y({color:B.foreground,dim:!0})));V.push(new M("Esc",new y({color:$.keybind}))),V.push(new M(" to cancel",new y({color:B.foreground,dim:!0})));let U=new m0({padding:z0.symmetric(1,0),child:new l({text:new M("",void 0,V)})});return new m0({decoration:{border:X,color:B.background},padding:z0.all(1),child:new f0({children:[G,new W0({height:1}),D,new X5,U]})})}}class He extends v0{props;constructor(A){super();this.props=A}createState(){return new j2A}}vB();class R2A extends k0{controller=new j8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new F6({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>=B7)return!1;let Q=await YF(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=_0.of(A),{colors:B,app:$}=Q,Y=e1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),X=new BG({controller:this.controller,triggers:[new _J],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}),F=new m4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:X}),D=new m0({constraints:new O1({maxHeight:Z}),padding:z0.symmetric(1,0),child:F}),G=new m0({padding:z0.symmetric(1,0),child:new l({text:new M("",void 0,[new M("Command: ",new y({color:B.foreground})),new M(this.widget.props.commandName,new y({color:$.command,bold:!0}))])})}),V=new m0({padding:z0.symmetric(1,0),child:new l({text:this.isConfirmingClearInput?new M("",void 0,[new M("Esc",new y({color:$.keybind})),new M(" again to clear input",new y({color:B.foreground,dim:!0}))]):new M("",void 0,[new M("Press ",new y({color:B.foreground,dim:!0})),new M("Enter",new y({color:$.keybind})),new M(" to submit, ",new y({color:B.foreground,dim:!0})),new M("Esc",new y({color:$.keybind})),new M(" to clear",new y({color:B.foreground,dim:!0}))])})}),U=[G,new W0({height:1}),new k1({child:D}),new W0({height:1}),V];return new m0({decoration:{border:a1.all(new o1(B.foreground,1,"solid")),color:B.background},padding:z0.all(1),child:new f0({children:U})})}}class j91 extends v0{props;constructor(A){super();this.props=A}createState(){return new R2A}}function P2A(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 R91 extends w1{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)=>P2A(J.pubDate).length));return new d6({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,X)=>{let F=_0.of(X),{colors:D}=F,G=F.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(W,H)=>new W0({width:H,child:B1.end([new l({text:new M(W,new y({color:K}))})])});return new m0({decoration:V?{color:V}:void 0,padding:z0.symmetric(2,0),child:new B1({children:[new k1({child:new l({text:new M(J.title,new y({color:U})),overflow:"ellipsis",maxLines:1})}),new W0({width:2}),E(P2A(J.pubDate),B)]})})}})}}class KB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!KB._instance)KB._instance=new KB;return KB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}c0();class _2A extends k0{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=_0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),F=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new d6({title:"Add Label",items:F,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 H=this.currentQuery.trim().toLowerCase();return new m0({decoration:K?{color:K}:void 0,padding:z0.symmetric(2,0),child:new l({text:new M("",void 0,[new M("Create new label: ",new y({color:E})),new M(H,new y({color:E,bold:!0}))])})})}return new m0({decoration:K?{color:K}:void 0,padding:z0.symmetric(2,0),child:new l({text:new M(D.name,new y({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 P91 extends v0{props;constructor(A){super();this.props=A}createState(){return new _2A}}class YG extends v0{props;constructor(A){super();this.props=A}createState(){return new T2A}}class T2A extends k0{_spinner=new q6;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(A){let Q=_0.of(A),{colors:B,app:$}=Q,J=a1.all(new o1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new l({textAlign:"center",text:new M("",void 0,[new M(Y,new y({color:$.processing})),new M(" ",void 0),new M(this.widget.props.message,new y({color:B.foreground}))])}),F=[new k1({child:new f0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)F.push(new W0({height:2,child:new m0({padding:z0.symmetric(2,0),child:new l({text:new M("",new y({dim:!0}),[new M("Press ",new y({color:B.foreground})),new M("Esc",new y({color:B.info})),new M(" to cancel",new y({color:B.foreground}))])})})}));let D=new m0({decoration:new x4(B.background,J),child:new W0({width:60,height:7,child:new f0({mainAxisAlignment:"start",children:F})})});if(this.widget.props.onAbort)return new l4({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 DK extends v0{props;constructor(A){super();this.props=A}createState(){return new S2A}}class S2A extends k0{scrollController=new rA;scrollAreaKey=new D2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof b2}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=_0.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=UV0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=a1.all(new o1(Q.colors.border,1,"solid")),Z=new m0({padding:z0.symmetric(1,0),child:new l({text:new M($.title,new y({color:J,bold:!0}))})}),X=this.isWidgetMessage(B)?B.widget:new l({text:new M($.description,new y({color:Q.colors.foreground})),selectable:!0}),F=new k1({child:new Z8({child:new m0({padding:z0.symmetric(1,0),child:new B1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new k1({child:new _A({controller:this.scrollController,autofocus:!0,child:X})}),new K2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new m0({padding:z0.symmetric(1,0),child:new l({text:(()=>{if(this.widget.props.onRetry)return new M("",void 0,[new M("Press ",new y({color:Q.colors.foreground,dim:!0})),new M("R",new y({color:Q.app.keybind})),new M(" to retry, ",new y({color:Q.colors.foreground,dim:!0})),new M("Esc",new y({color:Q.app.keybind})),new M(" to cancel",new y({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new M("",new y({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new y({color:Q.app.keybind}),U=new y({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 y({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new l4({debugLabel:"MessageDialog",child:new t4({fit:"expand",children:[new x1({onClick:()=>{},child:new W0}),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 m0({decoration:{border:Y,color:Q.colors.background},padding:z0.all(1),child:new f0({mainAxisAlignment:"center",children:[Z,new W0({height:1}),F,D]})})})]})})}}L3();t1();class k2A extends v0{props;constructor(A){super();this.props=A}createState(){return new v2A}}class v2A extends k0{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=V1.relativePath(Q,OA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return T5(A)}statusIcon(A){let Q=d8.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=_0.of(A),{app:B}=Q;if(this.plugins.length===0)return new l({text:new M("No plugins found.",new y({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((F)=>F.status==="active").length,Z=this.plugins.reduce((F,D)=>F+D.registeredCommands.length,0),X=this.plugins.reduce((F,D)=>F+D.registeredTools.length,0);if($.push(new M(`${Y}/${J} ${H4(J,"plugin")} active`,new y({bold:!0}))),Z>0||X>0)$.push(new M(` (${Z} ${H4(Z,"command")}, ${X} ${H4(X,"tool")})`,new y({dim:!0})));$.push(new M(`
|
|
7069
7069
|
|
|
7070
7070
|
`));for(let F of this.plugins){let{icon:D,color:G}=this.statusIcon(F.status),V=this.getRelativePath(F.uri);if($.push(new M(`${D} `,new y({color:G}))),$.push(new M(V,new y({bold:!0}))),$.push(new M(` ${F.status}`,new y({dim:!0}))),$.push(new M(`
|
|
7071
7071
|
`)),F.status==="active"&&F.registeredEvents.length>0)$.push(new M(" Events: ",new y({dim:!0}))),$.push(new M(F.registeredEvents.join(", "),new y({color:B.link}))),$.push(new M(`
|
|
@@ -7243,7 +7243,7 @@ ${s.content||""}`:s.content||"",x0=[],Q1=s.baseDir.startsWith("file://")?uE0(s.b
|
|
|
7243
7243
|
`)}function KQA(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"),X=bA4({settings:{url:Y.ampURL,proxy:Z},secrets:{getToken:(D,G)=>Y.secrets.get(D,G)}}),F=await YA.userDisplayBalanceInfo({},{config:X});if(!F.ok){if(F.error.code==="auth-required")process.stderr.write(a0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(a0.red("Error: ")+F.error.message+`
|
|
7244
7244
|
`),process.exit(1)}process.stdout.write(await C73(F.result.displayText)+`
|
|
7245
7245
|
`),process.exit(0)})}var cJ3=A00.join(b$,"logs","headless.log"),SB1=A00.join(Nf,"device-id.json"),lJ3=`cli-tui-${gJA(16).toString("hex")}`;async function iJ3(){for(let A of JL)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(() => I4(Lu(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){bJ.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
|
|
7246
|
-
`)}function nJ3(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",X=!1;A.warn(Y,{name:Z,code:$})}}function p2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")DY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")DY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)DY("internal.model",rJ3(Q.model))}function yJA(A){let Q=A.indexOf(":");if(Q===-1)throw new Z4(`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 Z4(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function aJ3(A){if(A===void 0)return;let Q=A.trim();if(LA4(Q))return Q;throw new Z4(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function oJ3(A,Q){if(cF(A,Q))return;let B=c$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new Z4(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function rJ3(A){if(!A.includes("="))return yJA(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new Z4(`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 Z4(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new Z4(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);yJA(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new Z4("No valid model overrides found in --model flag value.",1);return Q}function sJ3(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 tJ3(A){try{return await mJA(A,"utf-8")}catch{return A}}async function kB1(A,Q,B){let $=sJ3(A,Q);if(!$)return;let J=xA(B)?B.features:[],Y=xA(B)?B.user.email:void 0;if(!TW0(J,RB.HARNESS_SYSTEM_PROMPT)&&!(Y&&y7(Y)))throw new Z4("You are not allowed to do this.",1);DY("systemPrompt",await tJ3($))}function TW0(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function eJ3(A){return A!=="pending"}function WP(A){if(!xA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function AY3(A){let Q=WP(A);if(Q)return Q.id;if(dF(A))throw Error(A.error.message);throw Error("unreachable")}function QY3(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 BY3(A){let $=QY3(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 Z4(`Couldn't connect to the Amp server at ${A}.`,1,$)}function Q00(A,Q){let B=V01(Error(A.error.message));if(B.message===E7.networkOffline||B.message===E7.networkTimeout)return BY3(Q);if(B.message!==E7.internalBug)return new Z4(B.message,1,B.suggestion);return new Z4(A.error.message.replace(/^Error: /,""),1)}var xJA=[{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??rX,description:`Custom settings file path (overrides the default location ${rX})`},{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 ${Kr})`},{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:V9(),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:BL.SMART.key,description:`Set the agent mode (${p$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(p$().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}],fJA=(A)=>("deprecated"in A)&&A.deprecated===!0,$Y3=(A)=>("hidden"in A)&&A.hidden===!0,JY3=(A)=>("default"in A),YY3=(A)=>("default"in A)?A.default:void 0;function RW0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=aJ3(Q.effort);if(B!==void 0)oJ3(Q.mode,B);return B}function ZY3(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((X)=>B.includes(X)||X.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 Z4(E7.unknownCommand(B),1,Z)}}async function SW0(A){return{...A,getThreadEnvironment:yW,getEnvironmentData:(Q,B)=>GD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new gL(A.fileSystem),generateThreadTitle:yG4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>RQ(A.configService),pluginService:A.pluginService}}function pJA(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:yW,getEnvironmentData:(Q,B)=>GD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var PW0=s0.file(dJ3.homedir()),vB1=process.env.XDG_CONFIG_HOME?s0.file(process.env.XDG_CONFIG_HOME):V1.joinPath(PW0,".config");function XY3(A){return FS4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(vD0())yD0();else OX0(Q);let B=VR(),$=zs();if((!B||$||Mf())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(lD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(lD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(VR()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function i8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;WA4("0.0.
|
|
7246
|
+
`)}function nJ3(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",X=!1;A.warn(Y,{name:Z,code:$})}}function p2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")DY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")DY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)DY("internal.model",rJ3(Q.model))}function yJA(A){let Q=A.indexOf(":");if(Q===-1)throw new Z4(`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 Z4(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function aJ3(A){if(A===void 0)return;let Q=A.trim();if(LA4(Q))return Q;throw new Z4(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function oJ3(A,Q){if(cF(A,Q))return;let B=c$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new Z4(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function rJ3(A){if(!A.includes("="))return yJA(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new Z4(`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 Z4(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new Z4(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);yJA(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new Z4("No valid model overrides found in --model flag value.",1);return Q}function sJ3(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 tJ3(A){try{return await mJA(A,"utf-8")}catch{return A}}async function kB1(A,Q,B){let $=sJ3(A,Q);if(!$)return;let J=xA(B)?B.features:[],Y=xA(B)?B.user.email:void 0;if(!TW0(J,RB.HARNESS_SYSTEM_PROMPT)&&!(Y&&y7(Y)))throw new Z4("You are not allowed to do this.",1);DY("systemPrompt",await tJ3($))}function TW0(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function eJ3(A){return A!=="pending"}function WP(A){if(!xA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function AY3(A){let Q=WP(A);if(Q)return Q.id;if(dF(A))throw Error(A.error.message);throw Error("unreachable")}function QY3(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 BY3(A){let $=QY3(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 Z4(`Couldn't connect to the Amp server at ${A}.`,1,$)}function Q00(A,Q){let B=V01(Error(A.error.message));if(B.message===E7.networkOffline||B.message===E7.networkTimeout)return BY3(Q);if(B.message!==E7.internalBug)return new Z4(B.message,1,B.suggestion);return new Z4(A.error.message.replace(/^Error: /,""),1)}var xJA=[{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??rX,description:`Custom settings file path (overrides the default location ${rX})`},{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 ${Kr})`},{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:V9(),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:BL.SMART.key,description:`Set the agent mode (${p$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(p$().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}],fJA=(A)=>("deprecated"in A)&&A.deprecated===!0,$Y3=(A)=>("hidden"in A)&&A.hidden===!0,JY3=(A)=>("default"in A),YY3=(A)=>("default"in A)?A.default:void 0;function RW0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=aJ3(Q.effort);if(B!==void 0)oJ3(Q.mode,B);return B}function ZY3(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((X)=>B.includes(X)||X.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 Z4(E7.unknownCommand(B),1,Z)}}async function SW0(A){return{...A,getThreadEnvironment:yW,getEnvironmentData:(Q,B)=>GD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new gL(A.fileSystem),generateThreadTitle:yG4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>RQ(A.configService),pluginService:A.pluginService}}function pJA(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:yW,getEnvironmentData:(Q,B)=>GD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var PW0=s0.file(dJ3.homedir()),vB1=process.env.XDG_CONFIG_HOME?s0.file(process.env.XDG_CONFIG_HOME):V1.joinPath(PW0,".config");function XY3(A){return FS4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(vD0())yD0();else OX0(Q);let B=VR(),$=zs();if((!B||$||Mf())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(lD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(lD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(VR()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function i8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;WA4("0.0.1778084963-gfd096d");let Y=e80({storage:A.settings,secretStorage:A.secrets,workspaceRoot:g0.of(s0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:PW0,userConfigDir:vB1});S5A(Y);let Z=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(Z.settings)});let X=!1;{let g=await A.secrets.get("apiKey",A.ampURL);if(X=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{V5.write(`No API key found. Starting login flow...
|
|
7247
7247
|
`);let n=await FY3(A),c=await A.secrets.get("apiKey",A.ampURL);if(j.info("Login flow completed",{success:n,storedKeyPresent:Boolean(c),ampURL:A.ampURL}),!n)await mW(),process.exit(1);X=!0}}{let g=await Y.getLatest(),n=g.settings.url,c=g.secrets.isSet?.[n];j.info("Config secrets state after login",{configURL:n,apiKeySet:c?.apiKey??!1})}let F=y1(RQ(Y).pipe(S5(eJ3))),D=$?"pending":await F;if(!$)j.info("Server status resolved",{status:"ready",isAuthenticated:xA(D),isError:dF(D),errorMessage:dF(D)?D.error.message:void 0});let G=F.then((g)=>AY3(g));G.catch(()=>{return});let U=!Q.takeMeBack&&xA(D)&&TW0(D.features,RB.THREAD_ACTORS_TUI)?"all":process.env.PLUGINS??"permissions",{toolService:K,dispose:E}=$S4({configService:Y}),W=new Map,H=()=>W.clear(),z=new Cu0(Y,A.settings.getWorkspaceRootPath()),q=GF4({configService:Y,filesystem:R3}),N=BJ4({configService:Y,trustStore:z,skillMCPServers:q.skillMCPServers,createOAuthProvider:async(g,n,c)=>{let $0=`${g}:${n}`,E0=W.get($0);if(E0)return j.debug("Reusing existing OAuth provider for server",{serverName:g,serverUrl:n}),E0;j.debug("Creating OAuth provider for server",{serverName:g,serverUrl:n});let i=(async()=>{let J0=new GL(A.secrets),Q0=await J0.getClientInfo(g,n),w0=c?.scopes??Q0?.scopes,A0=rd4();j.info("OAuth headless mode check",{useHeadless:A0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:V5.isTTY});let D0;if(A0)D0=A.executeMode?od4():ad4(g);let a=new vy0({storage:J0,serverName:g,serverUrl:n,clientId:c?.clientId??Q0?.clientId,clientSecret:c?.clientSecret??Q0?.clientSecret,authUrl:c?.authUrl??Q0?.authUrl,tokenUrl:c?.tokenUrl??Q0?.tokenUrl,scopes:w0,headlessAuthHandler:D0});return j.debug("OAuth provider created",{serverName:g,serverUrl:n,hasManualClientId:!!(c?.clientId??Q0?.clientId),willUseDCR:!(c?.clientId??Q0?.clientId),scopes:w0,headlessMode:A0,executeMode:A.executeMode}),a})();return W.set($0,i),i}}),I=Co0({configService:Y,filesystem:R3,spawn:lZ0}),w=Q.headless?K5A():void 0,C=w??new AK0({configService:Y}),O=C instanceof AK0?C:void 0;if(O)O.pluginExecutorKind="local";let _=gu0({configService:Y,fileSystem:R3,platform:C,loadGlobalPlugins:H11(Y),pluginFilter:U}),T=eJ4(_),S=[N,I,T],b;if(J)b=new Map;else if(A.executeMode){let g=await vP4({toolService:K,providers:S,initialTimeout:15000});b=g.registrations;for(let[n,c]of g.initErrors)j.warn(`${n} provider initialization slow or failed:`,c)}else b=Mo0({toolService:K,providers:S});if(Q.jetbrains)tM("JetBrains");else if(Q.ide&&yc4())tM("VS Code");else if(Q.ide&&xc4())tM("Neovim");else if(Q.ide){let g=await iJ3();if(g){let n=D20(g.ideName);if(n)tM(n)}}if(A.executeMode)HA4(!0);let h,x=g3.status.pipe(M1((g)=>Boolean(g.connected&&g.authenticated&&g.ideName&&K64(g.ideName))),P4()).subscribe((g)=>{if(g){if(!h)h=K.registerTool(kP4)}else h?.dispose(),h=void 0}),v;if(!A.executeMode){let g=await A.settings.get("fuzzy.alwaysIncludePaths")??[];v=new TD0(process.cwd(),{alwaysIncludePaths:g},!0)}else v=new class extends TD0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let u=new hm0(Ni(Y,{usesThreadActors:!1}),{maxThreads:200});j.info("Starting Amp background services");let m=new O21,d={configService:Y,toolService:K,mcpService:N,skillService:q,toolboxService:I,trustStore:z,threadService:u,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:v,fileSystem:R3,terminal:m,pluginService:_,pluginPlatform:O,headlessPluginPlatform:w,serverStatus:D,serverStatusPromise:F,viewerUserIDPromise:G,hasAPIKeyAtStartup:X};return{...d,async asyncDispose(){if(d.mcpService.hasAuthenticatingClients())j.info("Waiting for OAuth authentication to complete before exit..."),await d.mcpService.waitForAuthentication();for(let g of b.values())g.dispose();await d.mcpService.dispose(),H(),await d.threadService.asyncDispose(),d.configService.unsubscribe(),E(),d.fuzzyServer.dispose(),d.settingsStorage[Symbol.dispose](),x.unsubscribe(),h?.dispose(),await d.pluginService.dispose()}}}async function FY3(A){if(!A.executeMode){if(!await IG0("Would you like to log in to Amp? [(y)es, (n)o]: "))return V5.write(`Login cancelled. Run the command again to retry.
|
|
7248
7248
|
`),!1}return await dJA(A)}async function dJA(A){let Q=gJA(32).toString("hex"),B=await Sf(A.ampURL,Q),$=new AbortController;try{await gF(B,$.signal)}catch(Y){j.error("Error opening browser",{error:Y})}let J=await Sf(A.ampURL,Q,!1);V5.write(`If your browser does not open automatically, visit:
|
|
7249
7249
|
|
|
@@ -7251,7 +7251,7 @@ ${a0.blue.bold(J)}
|
|
|
7251
7251
|
|
|
7252
7252
|
`);try{return await ti4(A.ampURL,Q,A.secrets,$),V5.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(Y){return j.error("Login failed",{error:Y}),bJ.write(`
|
|
7253
7253
|
Login failed: ${Y instanceof Error?Y.message:String(Y)}
|
|
7254
|
-
`),!1}}async function DY3(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new Z4("No Amp API key found. Run `amp login` first.",1);let J=gJ3("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(X)=>Y(X??1))})}function GY3(A){let Q=new AI().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)dj(),process.exit(0);let z=H.originalError??H;pg4(z)}),Ya4(Q,{version:"0.0.
|
|
7254
|
+
`),!1}}async function DY3(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new Z4("No Amp API key found. Run `amp login` first.",1);let J=gJ3("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(X)=>Y(X??1))})}function GY3(A){let Q=new AI().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)dj(),process.exit(0);let z=H.originalError??H;pg4(z)}),Ya4(Q,{version:"0.0.1778084963-gfd096d",buildTimestamp:"2026-05-06T16:33:10.737Z",buildType:"'release'"}),Q.addHelpText("after",Sc4()),Q.configureHelp({formatHelp:kc4}),Q.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let q=z.optsWithGlobals(),N=await n5(q);await NY3(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(H,z)=>{let q=z.optsWithGlobals(),N=await n5(q);await qY3(N,await P11(q,N.settings))}),hg4(Q,n5);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(...H)=>{let z=H.find((w)=>typeof w==="object"&&w!==null&&typeof w.optsWithGlobals==="function")??$,q=H.filter((w)=>w!==z).flatMap((w)=>Array.isArray(w)?w:typeof w==="string"?[w]:[]),N=z.optsWithGlobals(),I=await n5(N);await DY3(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(H,z,q)=>{let N=q.optsWithGlobals(),I=await n5(N);await gd4(H??"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(H,z)=>{let q=z.optsWithGlobals(),N=await n5(q);await md4(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(H)=>{await sl4({raw:H.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(`
|
|
7255
7255
|
`)).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(H,z,q)=>{if(H&&z.apply)throw new Z4("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let N=z.apply??H;if(!N||N.trim().length===0)V5.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.
|
|
7256
7256
|
|
|
7257
7257
|
`),q.outputHelp(),process.exit(0);let I=L2(N)??NJ(N),w=q.optsWithGlobals(),C=await n5(w);p2(q,w);let O=await i8(C,w),_=!1;try{if(z.checkout&&z.skipCheckout)throw new Z4("Choose either --checkout or --skip-checkout, not both.",1);if(dF(O.serverStatus))throw Q00(O.serverStatus,C.ampURL);let T=xA(O.serverStatus)?O.serverStatus.features:void 0;if(!TW0(T,RB.V2))throw new Z4("live-sync is not enabled for your user",1);await mi4({ampURL:C.ampURL,threadId:I,configService:O.configService,threadService:O.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof z.apply==="string",checkoutMode:z.checkout?"always":z.skipCheckout?"never":"prompt",promptForYesNo:IG0}),_=!0}finally{if(await O.asyncDispose(),_)process.exit(0)}});let J=async(H,z,q)=>{e80({storage:z.settings,secretStorage:z.secrets,workspaceRoot:g0.of(s0.file(process.cwd())),defaultAmpURL:z.ampURL,homeDir:PW0,userConfigDir:vB1});let N={...z,executeMode:!1};await _W0(N,{...H,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(H,z)=>{let q=z.optsWithGlobals(),N=await n5(q);await hJA(q,N,z)});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(H,z)=>{let q=z.optsWithGlobals(),N=await n5(q);await TY3(q,N,z)}),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(H,z,q)=>{let N=q.optsWithGlobals(),I=await n5(N);if(z.pick)bJ.write(`${a0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
@@ -7284,8 +7284,8 @@ ${C}
|
|
|
7284
7284
|
`))}),z.args.length>0)ZY3(N,z);await _W0(N,q,z,A)}),Kl4(Q),Q}async function Ou(A,Q){await MJ((B)=>OG0(B,A,Q))}async function bJA(A,Q,B){let $=Date.now(),[J,Y]=await Promise.all([YA.getThreadLinkInfo({thread:A},{config:Q}),B]);if(j.info(`[fetchAndStartThread] 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 Z4(`Cannot resume thread created by another user.
|
|
7285
7285
|
|
|
7286
7286
|
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 cJA(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await BK0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await BK0()).trimEnd(),stdinInput:null}}function lJA(A,Q,B){if(A.streamJson&&!Q)throw new Z4("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new Z4("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new Z4("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new Z4("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 Z4("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new Z4("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 Z4("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 Z4("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"
|
|
7287
|
-
Or pipe via stdin: echo "your message" | amp --execute`)}function VY3(A,Q){if(g34([G80.parse({tool:"*",action:"allow"})]),T34({bypass:!0}),W5A(A.settings))j.debug("Enabling permissions plugin"),Q.registerInternalPlugin({name:"permissions",entryPoint:I21})}async function _W0(A,Q,B,$){if(Q.headless)return UY3(A,Q,B);let J=await i8(A,Q),Y=await J.serverStatusPromise,Z=await J.configService.getLatest(),X=xA(Y)&&TW0(Y.features,RB.THREAD_ACTORS_TUI),F=X&&!Q.takeMeBack;if(Q.showWelcome&&!X)throw await J.asyncDispose(),new Z4("--show-welcome is only available with the new Amp CLI feature flag",1);if(F)return VY3(Z,J.pluginService),KY3(A,Q,B,J);else{if(Q.threadId&&LQ(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 Z4(`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 EY3(A,Q,B,$,{dependencies:J})}}async function UY3(A,Q,B){let $=(z,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=Lt0();j.info("Startup phase",{phase:z,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};p2(B,Q);let J=process.hrtime.bigint(),Y=await i8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(dF(Z))throw Q00(Z,A.ampURL);let X=xA(Z)?Z:null,F=X?.user.email;await kB1(B,Q,Z);let D=WP(Z),G=Ls(Q,D);if(G instanceof Error)g5(G.message);if(X&&!bS(Q.mode,F))throw new Z4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!F||!y7(F)))throw new Z4("Headless executor mode is only available for Amp employees",1);oF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new Z4("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&&!LQ(K))throw new Z4(`Invalid thread ID: ${K}`,1);let E=K?void 0:await PY3({dependencies:Y,apiKey:U,visibility:G??void 0}),W=K??E?.threadId;if(!W)throw new Z4("Failed to resolve headless thread ID",1);let H=await Ac4(W);if(H.status==="already-running")await Y.asyncDispose(),await mW(),process.exit(0);try{await ld4({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 H.release(),await Y.asyncDispose()}await mW(),process.exit(0)}async function KY3(A,Q,B,$){let{userInput:J,stdinInput:Y}=await cJA(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;lJA({...Q,streamJson:Z},A.executeMode,J),p2(B,Q),Sg4(),oF0();let X=Q.threadId&&LQ(Q.threadId)?Q.threadId:void 0,F=Q.observe?L2(Q.observe)??NJ(Q.observe):void 0,D=await $.serverStatusPromise;if(dF(D))throw Q00(D,A.ampURL);let G=await $.secretStorage.get("apiKey",A.ampURL);if(!G)throw new Z4("API key required. Please run `amp login` first.",1);let V=xA(D)&&y7(D.user.email);if(A.executeMode){T41($.mcpService,A.settings);try{let U=RW0(B,Q),K=await yI(),E=X?U:wG0({agentMode:Q.mode,explicitEffort:U,sessionState:K}),W=X?void 0:CG0(await kf($.configService),{agentMode:Q.mode,explicitEffort:U,sessionState:K}),H=await Dd4({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:X,initialSettings:W});if(await Ou(H,"execute"),Q.archive)await $.threadService.archive(H,!0)}finally{await $.asyncDispose()}await mW(),process.exit(0)}else{let U=RW0(B,Q),K=Ni($.configService),E=new ze($.fuzzyServer),W=process.cwd();await Z5A({ampURL:A.ampURL,apiKey:G,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??cX(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:H})=>Ff({fileSystem:$.fileSystem,workspaceRoot:W},H),completionBuilder:E,workspaceRoot:W,listThreads:()=>K.listThreads(),getThreadFromServer:(H)=>K.getThread(H),toolboxes:$.toolboxService.toolboxes,isInternalUser:V,settingsFilePath:$.settingsStorage.getSettingsFilePath()},{initialThreadID:F??X,initialUserInput:J||void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!F,splashOrbVisualStyle:"neo",showNeoWelcome:Q.showWelcome,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:U}),process.exit(0)}}async function EY3(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(Q0,w0)=>{let A0=Number(process.hrtime.bigint()-w0)/1e6,D0=Lt0();j.info("Startup phase",{phase:Q0,phaseMs:Math.round(A0),sinceMainMs:D0===null?void 0:Math.round(D0)})},{userInput:X,stdinInput:F}=await cJA(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;lJA({...Q,streamJson:D},A.executeMode,X),p2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await i8(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&&dF(E))throw Q00(E,A.ampURL);let W=xA(E)?E:null,H=W?.user.email,z=!!(H&&y7(H));if(z)oF0();if(!K)await kB1(B,Q,E);let q=WP(E),N=q?.features??[],I=q?.team??null,w=Ls(Q,q);if(w instanceof Error)g5(w.message);if(W&&!bS(Q.mode,H))throw new Z4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let C=Q.threadId&&LQ(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await SW0(V);Z("runMainThread:createWorkerDeps",G);let _=A.executeMode?void 0:async(Q0)=>Ou(Q0,"interactive"),T={threadService:V.threadService,workerDeps:O,createThread:async(Q0)=>{let w0=K?await V.serverStatusPromise:E,A0=await rF0(A.settings,process.cwd(),WP(w0),w);if(A0 instanceof Error)g5(A0.message);return JQ1(O,{threadMeta:A0?BZ(A0):void 0,agentMode:Q0??Q.mode,onFirstAssistantMessage:_})},validateThreadOwnership:async(Q0,w0)=>{if(w0?.nonBlockingOwnershipCheck){bJA(Q0,V.configService,V.viewerUserIDPromise).catch((A0)=>{if(A0 instanceof Z4){if(w0.onOwnershipError){w0.onOwnershipError(A0,Q0);return}pW(A0,Q0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:A0})});return}try{await bJA(Q0,V.configService,V.viewerUserIDPromise)}catch(A0){if(A0 instanceof Z4)throw A0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:A0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:_,handleError:pW},S=async()=>{try{return DQA(T,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(Q0){if(Q0 instanceof Z4)throw Q0;throw await pW(Q0,Q.threadId),Error("handleError should have called process.exit()")}},b=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let Q0=await V.configService.getLatest(),w0=Tp(Q0),A0=await YA.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(w0)});if(A0.ok)return j.info("User free tier status:",A0),A0.result;return}catch(Q0){j.error("Failed to fetch free tier status:",Q0);return}})(),x=!A.executeMode?new T21:null,v,u=null;if(x)v=x,u=(async()=>{let Q0=K?await V.serverStatusPromise:V.serverStatus;if(dF(Q0))throw Q00(Q0,A.ampURL);await kB1(B,Q,Q0);let w0=process.hrtime.bigint(),A0=await S();if(Z("runMainThread:createThreadPool",w0),x.attach(A0),X){let D0=await y1(A0.threadHandles$);if(!D0)throw new Z4("No active thread is available yet.",1);await D0.sendMessage({content:[{type:"text",text:X}]})}})(),u.catch(async(Q0)=>{let w0=Q0 instanceof Error?Q0:Error(String(Q0));x.setInitError(w0),await pW(Q0,Q.threadId)});else G=process.hrtime.bigint(),v=await S(),Z("runMainThread:createThreadPool",G);let m=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let d=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),XY3({configService:V.configService,threadService:V.threadService,config:d,useNotificationsForService:m,threadViewStates$:()=>v.threadHandles$.pipe(u4((Q0)=>{if(!Q0)return g0.of({});return _6(Q0.thread$,Q0.threadViewState$).pipe(M1(([w0,A0])=>({[w0.id]:A0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){T41(V.mcpService,A.settings);let Q0=RW0(B,Q),w0=await yI(),A0=C?Q0:wG0({agentMode:Q.mode,explicitEffort:Q0,sessionState:w0}),D0={userInput:X,stdinInput:F,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:z,agentMode:Q.mode,reasoningEffort:A0,labels:Q.label},a=await Dm4({threadPool:v,...D0});if(await Ou(a,"execute"),Q.archive)await V.threadService.archive(a,!0);await V.asyncDispose(),process.exit(0)}let g=!1,n=!1;if(Q.jetbrains||Q.ide){await G20();let Q0=await iF({jetbrainsOnly:Q.jetbrains});if(Q0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(Q0.length===1){let w0=Q0[0];if(w0)g3.selectConfig(w0)}else n=!0}G=process.hrtime.bigint();let c=r11("0.0.1778084602-gfd096d",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let $0=new S41(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),X&&A.executeMode){let Q0=await y1(v.threadHandles$);if(!Q0)throw new Z4("No active thread is available yet.",1);await Q0.sendMessage({content:[{type:"text",text:X}]})}G=process.hrtime.bigint();let E0=await yI();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",E0);let i=RW0(B,Q),J0={...E0,launchCount:E0.launchCount+1,lastReasoningEffortByMode:i?{...E0.lastReasoningEffortByMode,[Q.mode]:i}:E0.lastReasoningEffortByMode};MJ((Q0)=>({...Q0,launchCount:Q0.launchCount+1}));try{if(G=process.hrtime.bigint(),await L3A({history:new jr,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:YA,threadPool:v,createSystemPromptDeps:async()=>pJA(V),ideClient:g3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:$0,updateService:c,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:C,showJetBrainsInstaller:g,showIdePickerHint:n,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:lJ3,logFile:{path:$},sessionState:J0,freeTierStatusPromise:b,workspace:I??null,features:N,isInternalUser:z,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-06T16:27:03.929Z"},(Q0)=>new f21({...Q0,threadPool:Q0.threadPool},(w0)=>new BQ1({...w0,threadState:w0.threadState}))),Z("runMainThread:mountApp-returned",G),u)await u}finally{await v.dispose().catch((Q0)=>{j.error("Failed to dispose thread pool during shutdown",Q0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function n5(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)bJ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7288
|
-
`);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 XJ4({get:async(X)=>{if(X!==vc)return;try{let F=await mJA(SB1,"utf-8");return JSON.parse(F).installationID}catch{return}},set:async(X,F)=>{if(X!==vc)return;await mJ3(A00.dirname(SB1),{recursive:!0}),await pJ3(SB1,JSON.stringify({installationID:F},null,2),{mode:384})}},{clientType:"cli",platform:y70()});zA4($);let J=await Kc4({...A,workspaceTrust:{current:!0,changes:Tk0},getHook:process.env.AMP_URL?(X,F)=>{if(X==="url")return Promise.resolve(process.env.AMP_URL);return F()}:void 0});if(A.mcpConfig){let X=await Fn4(A.mcpConfig);J=Dn4(J,X)}let Y=A00.dirname(J.getSettingsFilePath());XS4(Nf,Y),J=o04(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=x7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!az(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:R5A(await P11(A,J))}}function WY3(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(X,F)=>F.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function HY3(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=A00.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?cJ3:Kr));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function zY3(){qf4();let A=WY3(process.argv),Q=HY3(process.argv,A),B=kg4(Q),$=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(nJ3(j),j.info("Starting Amp CLI.",{version:"0.0.
|
|
7287
|
+
Or pipe via stdin: echo "your message" | amp --execute`)}function VY3(A,Q){if(g34([G80.parse({tool:"*",action:"allow"})]),T34({bypass:!0}),W5A(A.settings))j.debug("Enabling permissions plugin"),Q.registerInternalPlugin({name:"permissions",entryPoint:I21})}async function _W0(A,Q,B,$){if(Q.headless)return UY3(A,Q,B);let J=await i8(A,Q),Y=await J.serverStatusPromise,Z=await J.configService.getLatest(),X=xA(Y)&&TW0(Y.features,RB.THREAD_ACTORS_TUI),F=X&&!Q.takeMeBack;if(Q.showWelcome&&!X)throw await J.asyncDispose(),new Z4("--show-welcome is only available with the new Amp CLI feature flag",1);if(F)return VY3(Z,J.pluginService),KY3(A,Q,B,J);else{if(Q.threadId&&LQ(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 Z4(`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 EY3(A,Q,B,$,{dependencies:J})}}async function UY3(A,Q,B){let $=(z,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=Lt0();j.info("Startup phase",{phase:z,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};p2(B,Q);let J=process.hrtime.bigint(),Y=await i8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(dF(Z))throw Q00(Z,A.ampURL);let X=xA(Z)?Z:null,F=X?.user.email;await kB1(B,Q,Z);let D=WP(Z),G=Ls(Q,D);if(G instanceof Error)g5(G.message);if(X&&!bS(Q.mode,F))throw new Z4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!F||!y7(F)))throw new Z4("Headless executor mode is only available for Amp employees",1);oF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new Z4("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&&!LQ(K))throw new Z4(`Invalid thread ID: ${K}`,1);let E=K?void 0:await PY3({dependencies:Y,apiKey:U,visibility:G??void 0}),W=K??E?.threadId;if(!W)throw new Z4("Failed to resolve headless thread ID",1);let H=await Ac4(W);if(H.status==="already-running")await Y.asyncDispose(),await mW(),process.exit(0);try{await ld4({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 H.release(),await Y.asyncDispose()}await mW(),process.exit(0)}async function KY3(A,Q,B,$){let{userInput:J,stdinInput:Y}=await cJA(Q),Z=!!Q.streamJson||!!Q.streamJsonThinking;lJA({...Q,streamJson:Z},A.executeMode,J),p2(B,Q),Sg4(),oF0();let X=Q.threadId&&LQ(Q.threadId)?Q.threadId:void 0,F=Q.observe?L2(Q.observe)??NJ(Q.observe):void 0,D=await $.serverStatusPromise;if(dF(D))throw Q00(D,A.ampURL);let G=await $.secretStorage.get("apiKey",A.ampURL);if(!G)throw new Z4("API key required. Please run `amp login` first.",1);let V=xA(D)&&y7(D.user.email);if(A.executeMode){T41($.mcpService,A.settings);try{let U=RW0(B,Q),K=await yI(),E=X?U:wG0({agentMode:Q.mode,explicitEffort:U,sessionState:K}),W=X?void 0:CG0(await kf($.configService),{agentMode:Q.mode,explicitEffort:U,sessionState:K}),H=await Dd4({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:X,initialSettings:W});if(await Ou(H,"execute"),Q.archive)await $.threadService.archive(H,!0)}finally{await $.asyncDispose()}await mW(),process.exit(0)}else{let U=RW0(B,Q),K=Ni($.configService),E=new ze($.fuzzyServer),W=process.cwd();await Z5A({ampURL:A.ampURL,apiKey:G,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??cX(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:H})=>Ff({fileSystem:$.fileSystem,workspaceRoot:W},H),completionBuilder:E,workspaceRoot:W,listThreads:()=>K.listThreads(),getThreadFromServer:(H)=>K.getThread(H),toolboxes:$.toolboxService.toolboxes,isInternalUser:V,settingsFilePath:$.settingsStorage.getSettingsFilePath()},{initialThreadID:F??X,initialUserInput:J||void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!F,splashOrbVisualStyle:"neo",showNeoWelcome:Q.showWelcome,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:U}),process.exit(0)}}async function EY3(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(Q0,w0)=>{let A0=Number(process.hrtime.bigint()-w0)/1e6,D0=Lt0();j.info("Startup phase",{phase:Q0,phaseMs:Math.round(A0),sinceMainMs:D0===null?void 0:Math.round(D0)})},{userInput:X,stdinInput:F}=await cJA(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;lJA({...Q,streamJson:D},A.executeMode,X),p2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await i8(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&&dF(E))throw Q00(E,A.ampURL);let W=xA(E)?E:null,H=W?.user.email,z=!!(H&&y7(H));if(z)oF0();if(!K)await kB1(B,Q,E);let q=WP(E),N=q?.features??[],I=q?.team??null,w=Ls(Q,q);if(w instanceof Error)g5(w.message);if(W&&!bS(Q.mode,H))throw new Z4(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let C=Q.threadId&&LQ(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await SW0(V);Z("runMainThread:createWorkerDeps",G);let _=A.executeMode?void 0:async(Q0)=>Ou(Q0,"interactive"),T={threadService:V.threadService,workerDeps:O,createThread:async(Q0)=>{let w0=K?await V.serverStatusPromise:E,A0=await rF0(A.settings,process.cwd(),WP(w0),w);if(A0 instanceof Error)g5(A0.message);return JQ1(O,{threadMeta:A0?BZ(A0):void 0,agentMode:Q0??Q.mode,onFirstAssistantMessage:_})},validateThreadOwnership:async(Q0,w0)=>{if(w0?.nonBlockingOwnershipCheck){bJA(Q0,V.configService,V.viewerUserIDPromise).catch((A0)=>{if(A0 instanceof Z4){if(w0.onOwnershipError){w0.onOwnershipError(A0,Q0);return}pW(A0,Q0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:A0})});return}try{await bJA(Q0,V.configService,V.viewerUserIDPromise)}catch(A0){if(A0 instanceof Z4)throw A0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:A0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:_,handleError:pW},S=async()=>{try{return DQA(T,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(Q0){if(Q0 instanceof Z4)throw Q0;throw await pW(Q0,Q.threadId),Error("handleError should have called process.exit()")}},b=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let Q0=await V.configService.getLatest(),w0=Tp(Q0),A0=await YA.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(w0)});if(A0.ok)return j.info("User free tier status:",A0),A0.result;return}catch(Q0){j.error("Failed to fetch free tier status:",Q0);return}})(),x=!A.executeMode?new T21:null,v,u=null;if(x)v=x,u=(async()=>{let Q0=K?await V.serverStatusPromise:V.serverStatus;if(dF(Q0))throw Q00(Q0,A.ampURL);await kB1(B,Q,Q0);let w0=process.hrtime.bigint(),A0=await S();if(Z("runMainThread:createThreadPool",w0),x.attach(A0),X){let D0=await y1(A0.threadHandles$);if(!D0)throw new Z4("No active thread is available yet.",1);await D0.sendMessage({content:[{type:"text",text:X}]})}})(),u.catch(async(Q0)=>{let w0=Q0 instanceof Error?Q0:Error(String(Q0));x.setInitError(w0),await pW(Q0,Q.threadId)});else G=process.hrtime.bigint(),v=await S(),Z("runMainThread:createThreadPool",G);let m=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let d=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),XY3({configService:V.configService,threadService:V.threadService,config:d,useNotificationsForService:m,threadViewStates$:()=>v.threadHandles$.pipe(u4((Q0)=>{if(!Q0)return g0.of({});return _6(Q0.thread$,Q0.threadViewState$).pipe(M1(([w0,A0])=>({[w0.id]:A0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){T41(V.mcpService,A.settings);let Q0=RW0(B,Q),w0=await yI(),A0=C?Q0:wG0({agentMode:Q.mode,explicitEffort:Q0,sessionState:w0}),D0={userInput:X,stdinInput:F,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:z,agentMode:Q.mode,reasoningEffort:A0,labels:Q.label},a=await Dm4({threadPool:v,...D0});if(await Ou(a,"execute"),Q.archive)await V.threadService.archive(a,!0);await V.asyncDispose(),process.exit(0)}let g=!1,n=!1;if(Q.jetbrains||Q.ide){await G20();let Q0=await iF({jetbrainsOnly:Q.jetbrains});if(Q0.length===0){if(Q.jetbrains)g=!await V.configService.get("jetbrains.skipInstall")}else if(Q0.length===1){let w0=Q0[0];if(w0)g3.selectConfig(w0)}else n=!0}G=process.hrtime.bigint();let c=r11("0.0.1778084963-gfd096d",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let $0=new S41(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),X&&A.executeMode){let Q0=await y1(v.threadHandles$);if(!Q0)throw new Z4("No active thread is available yet.",1);await Q0.sendMessage({content:[{type:"text",text:X}]})}G=process.hrtime.bigint();let E0=await yI();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",E0);let i=RW0(B,Q),J0={...E0,launchCount:E0.launchCount+1,lastReasoningEffortByMode:i?{...E0.lastReasoningEffortByMode,[Q.mode]:i}:E0.lastReasoningEffortByMode};MJ((Q0)=>({...Q0,launchCount:Q0.launchCount+1}));try{if(G=process.hrtime.bigint(),await L3A({history:new jr,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:YA,threadPool:v,createSystemPromptDeps:async()=>pJA(V),ideClient:g3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:$0,updateService:c,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:C,showJetBrainsInstaller:g,showIdePickerHint:n,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:lJ3,logFile:{path:$},sessionState:J0,freeTierStatusPromise:b,workspace:I??null,features:N,isInternalUser:z,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-06T16:33:10.737Z"},(Q0)=>new f21({...Q0,threadPool:Q0.threadPool},(w0)=>new BQ1({...w0,threadState:w0.threadState}))),Z("runMainThread:mountApp-returned",G),u)await u}finally{await v.dispose().catch((Q0)=>{j.error("Failed to dispose thread pool during shutdown",Q0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function n5(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)bJ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
7288
|
+
`);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 XJ4({get:async(X)=>{if(X!==vc)return;try{let F=await mJA(SB1,"utf-8");return JSON.parse(F).installationID}catch{return}},set:async(X,F)=>{if(X!==vc)return;await mJ3(A00.dirname(SB1),{recursive:!0}),await pJ3(SB1,JSON.stringify({installationID:F},null,2),{mode:384})}},{clientType:"cli",platform:y70()});zA4($);let J=await Kc4({...A,workspaceTrust:{current:!0,changes:Tk0},getHook:process.env.AMP_URL?(X,F)=>{if(X==="url")return Promise.resolve(process.env.AMP_URL);return F()}:void 0});if(A.mcpConfig){let X=await Fn4(A.mcpConfig);J=Dn4(J,X)}let Y=A00.dirname(J.getSettingsFilePath());XS4(Nf,Y),J=o04(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=x7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!az(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:R5A(await P11(A,J))}}function WY3(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(X,F)=>F.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function HY3(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=A00.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?cJ3:Kr));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function zY3(){qf4();let A=WY3(process.argv),Q=HY3(process.argv,A),B=kg4(Q),$=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(nJ3(j),j.info("Starting Amp CLI.",{version:"0.0.1778084963-gfd096d",buildTimestamp:"2026-05-06T16:33:10.737Z"}),process.platform==="win32"&&ej())Al4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new Z4(E7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await GY3(B).parseAsync(process.argv)}YS4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await zY3().catch(pW)});async function qY3(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"),V5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
7289
7289
|
`);else if(!az(A.ampURL))V5.write(`Logging in to ${new URL(A.ampURL).hostname}
|
|
7290
7290
|
`);let $=process.env.AMP_API_KEY;if($)V5.write(`API key found in environment variable, storing...
|
|
7291
7291
|
`),await Q.set("apiKey",$,A.ampURL),V5.write(`API key successfully stored.
|