@sourcegraph/amp 0.0.1778871988-gfebe7f → 0.0.1778876600-gb6c4d8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +23 -23
  2. package/package.json +2 -2
package/dist/main.js CHANGED
@@ -990,7 +990,7 @@ Example: To use the web-browser skill for interacting with web pages, call this
990
990
 
991
991
  # Diagrams
992
992
 
993
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
993
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
994
994
 
995
995
  Example:
996
996
  \`\`\`diagram
@@ -1088,7 +1088,7 @@ Use ${u8} when you need understanding outside the local workspace: dependency in
1088
1088
 
1089
1089
  ## Diagrams
1090
1090
 
1091
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
1091
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
1092
1092
 
1093
1093
  Example:
1094
1094
  \`\`\`diagram
@@ -1232,7 +1232,7 @@ For example, if the user asks for a link to \`~/src/app/routes/(app)/threads/+pa
1232
1232
 
1233
1233
  ## Diagrams
1234
1234
 
1235
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
1235
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
1236
1236
 
1237
1237
  Example:
1238
1238
  \`\`\`diagram
@@ -1352,7 +1352,7 @@ Avoid duplicating work that subagents are already doing. When a subagent finishe
1352
1352
  </using_subagents>
1353
1353
 
1354
1354
  <diagrams>
1355
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
1355
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
1356
1356
 
1357
1357
  Example:
1358
1358
  \`\`\`diagram
@@ -1536,7 +1536,7 @@ Avoid duplicating work that subagents are already doing. When a subagent finishe
1536
1536
 
1537
1537
  ## Diagrams
1538
1538
 
1539
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
1539
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
1540
1540
 
1541
1541
  Example:
1542
1542
  \`\`\`diagram
@@ -1591,7 +1591,7 @@ When writing tests, you NEVER assume specific test framework or test script. Che
1591
1591
  # Diagrams
1592
1592
 
1593
1593
  - When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response.
1594
- - Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
1594
+ - Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
1595
1595
 
1596
1596
  Example:
1597
1597
  \`\`\`diagram
@@ -1997,7 +1997,7 @@ Order: Typecheck → Lint → Tests → Build.
1997
1997
  # Diagrams
1998
1998
 
1999
1999
  - When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response.
2000
- - Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
2000
+ - Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
2001
2001
 
2002
2002
  Example:
2003
2003
  \`\`\`diagram
@@ -2230,7 +2230,7 @@ Order: Typecheck → Lint → Tests → Build.
2230
2230
  # Diagrams
2231
2231
 
2232
2232
  - When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response.
2233
- - Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
2233
+ - Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
2234
2234
 
2235
2235
  Example:
2236
2236
  \`\`\`diagram
@@ -2359,7 +2359,7 @@ When making changes to files, first understand the file's code conventions. Mimi
2359
2359
 
2360
2360
  ## Diagrams
2361
2361
 
2362
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
2362
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
2363
2363
 
2364
2364
  Example:
2365
2365
  \`\`\`diagram
@@ -2435,7 +2435,7 @@ Always link when mentioning files.
2435
2435
 
2436
2436
  # Diagrams
2437
2437
 
2438
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
2438
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
2439
2439
 
2440
2440
  Example:
2441
2441
  \`\`\`diagram
@@ -2465,7 +2465,7 @@ For any coding task that involves thoroughly searching or understanding the code
2465
2465
 
2466
2466
  # Diagrams
2467
2467
 
2468
- When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. There is no Mermaid tool or renderer: do not write Mermaid syntax such as \`graph TD\` or \`sequenceDiagram\`, and do not use \`mermaid\` code fences. Keep diagrams readable in monospaced text.
2468
+ When a diagram would explain architecture, workflows, data flow, state transitions, or relationships better than prose alone, create it with a \`diagram\` code block in your response. Use plain text or box-drawing characters, preferably rounded-corner boxes (\`╭\`, \`╮\`, \`╰\`, \`╯\`), inside \`diagram\` blocks. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
2469
2469
 
2470
2470
  Example:
2471
2471
  \`\`\`diagram
@@ -2788,7 +2788,7 @@ IMPORTANT: Only invoke this tool when the user explicitly asks to use the "${C30
2788
2788
  ## When NOT to use this tool
2789
2789
 
2790
2790
  - Do NOT use automatically for UI mockups, diagrams, or icons—only unless explicitly requested by user
2791
- - For diagrams—write a plain-text box-drawing \`diagram\` code block with rounded-corner boxes where possible; there is no Mermaid tool or renderer, so do not write Mermaid syntax or \`mermaid\` code fences
2791
+ - For diagrams—write a plain-text box-drawing \`diagram\` code block with rounded-corner boxes where possible. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
2792
2792
  - For analyzing existing images—use the "${E30}" tool instead
2793
2793
 
2794
2794
  ## Example Scenarios
@@ -4274,7 +4274,7 @@ Guidelines:
4274
4274
  - Search for patterns and related code across multiple repositories
4275
4275
  - Use commit search to understand how code evolved over time
4276
4276
  - Focus on thorough understanding and comprehensive explanation across repositories
4277
- - When diagrams are useful, write plain-text box-drawing diagrams in \`diagram\` code blocks with rounded-corner boxes where possible; there is no Mermaid tool or renderer, so do not write Mermaid syntax or \`mermaid\` code fences
4277
+ - When diagrams are useful, write plain-text box-drawing diagrams in \`diagram\` code blocks with rounded-corner boxes where possible. Keep diagrams readable when rendered as monospaced text. Only write Mermaid syntax for diagrams if the user explicitly asks for Mermaid diagrams.
4278
4278
 
4279
4279
  ## Tool usage guidelines
4280
4280
  You should use all available tools to thoroughly explore the codebase before answering.
@@ -5410,12 +5410,12 @@ ${z}`))}},error:(E)=>{if(!K)K=!0,D(Error(`Failed to spawn brew: ${E.message}`))}
5410
5410
  ${z}`;if(Z==="pnpm"&&z.includes("Unable to find the global bin directory"))W+=`
5411
5411
 
5412
5412
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
5413
- npm install -g ${Y}`;D(Error(W))}},error:(E)=>{if(!U)U=!0,D(Error(`Failed to spawn ${Z}: ${E.message}`))},complete:()=>{if(!U)U=!0,X()}})})}d0();d0();Xz();var zw5="@ampcode/cli";async function WX0(A,Q,B=zw5){let J=`${Q||"https://registry.npmjs.org"}/${B}/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let F=await fetch(J,{signal:Y.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let X=await F.json(),D=X.version??X["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=Po(A,D),V=G<0,U,K;if(X.time){let E=X.time[A],z=X.time[D],W=Date.now();if(E)U=Math.floor((W-new Date(E).getTime())/3600000);if(z)K=Math.floor((W-new Date(z).getTime())/3600000)}return j.info("NPM version comparison",{currentVersion:A,latestVersion:D,compareResult:G,hasUpdate:V,currentVersionAge:U,latestVersionAge:K}),{hasUpdate:V,latestVersion:D,currentVersion:A,currentVersionAge:U,latestVersionAge:K,source:"npm"}}catch(F){return j.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var Ww5="https://static.ampcode.com/cli/cli-version.txt";async function HX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Ww5}?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=Po(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 Hw5=604800000;function Xu4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let B=Date.now()-Q;if(B>Hw5)return{ageMs:B};return null}function Po(A,Q){let B=(Z)=>{let[F,X]=Z.split("-");return{parts:F?.split(".").map(Number)||[],label:X}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let F=$.parts[Z]||0,X=J.parts[Z]||0;if(F<X)return-1;if(F>X)return 1}if($.label===J.label)return 0;if(!$.label&&J.label)return 1;if($.label&&!J.label)return-1;if($.label&&J.label)return $.label<J.label?-1:1;return 0}function _o(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?MF(B):void 0;return{sha:$,timestamp:B,age:J}}catch{return null}}O1();d0();import{readFile as qw5,realpath as Nw5}from"node:fs/promises";import{dirname as Du4,join as Iw5}from"node:path";async function Gu4(A){switch(A){case"binary":case"brew":return ww5(jo());case"npm":case"pnpm":case"yarn":case"bun":return Cw5()}}async function ww5(A){let Q=await DI(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function Cw5(){try{let A=process.argv[1];if(!A)return null;let Q=await Nw5(A),B=Du4(Du4(Q));return await Mw5(Iw5(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Mw5(A){let Q=await qw5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!Ke0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}d0();import{spawn as Lw5}from"node:child_process";function Ie0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return j.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var qX0=null,To=null;function Vu4(A){return new Promise((Q)=>{let B=Lw5("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),$="";B.stdout.on("data",(J)=>{$+=J.toString()}),B.on("close",(J,Y)=>{if(J!==0||Y==="SIGTERM"){Q(null);return}let Z=$.trim();Q(Z&&Z!=="undefined"?Z:null)}),B.on("error",()=>{Q(null)})})}async function NX0(){if(qX0)return qX0;if(To)return To;To=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Ie0(A);let Q=await Vu4("@sourcegraph:registry");if(Q)return Ie0(Q);let B=await Vu4("registry");if(B)return Ie0(B);return"https://registry.npmjs.org"})();try{return qX0=await To,qX0}finally{To=null}}var Ow5=3600000,jw5=5000;function IX0(A,Q,B={}){let $=new g4,J=$.pipe(tA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Ow5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await sV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await Rw5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await sV(jw5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await sV(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function Rw5(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 PU(),F=Z==="binary"||Z==="brew",X=F?void 0:await GI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await HX0(A);else{let U=await NX0();D=await WX0(A,U,X)}if(!(D.latestVersion&&D.hasUpdate))return B.debug("no update available"),J;let G=(U)=>{$.next(U),J.emittedVisibleState=!0};if(Z){let U=await Gu4(Z);if(U&&Po(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,Po(A,U)<0){let K=await yz(U),E={from:A,to:U,externallyUpdated:!0,...K};if(K.status==="same")B.info("on-disk already updated by another instance",E),G("updated");else B.warn("on-disk already updated by another instance, with PATH warning",E),G("updated-with-warning")}return J}}let V=()=>{if(D.currentVersionAge!==void 0&&D.latestVersionAge!==void 0){let U=D.currentVersionAge-D.latestVersionAge,K=0.5;if(Math.abs(U)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:D.currentVersionAge,latestVersionAge:D.latestVersionAge,ageDifferenceHours:U}),!0}return!1};if(!Y)Y=Z==="pnpm"?"warn":"auto",B.debug("no configured update mode; selected default based on package manager",{packageManager:Z,mode:Y});if(Z==="brew"){if(!V())G("update-available-brew");return J}if(Z==="binary"&&process.execPath!==jo()){if(B.debug("non-standard binary path, showing warning"),!V())G("update-available-unrecognized-path");return J}if(Y==="warn"){if(!V())G("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!V())G("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!V())G("update-available");return J}try{await Ro(D.latestVersion,Z),J.updatedTo=D.latestVersion;let U=await yz(D.latestVersion),K={from:D.currentVersion,to:D.latestVersion,...U};if(U.status==="same")B.info("success",K),G("updated");else B.warn("success with warning",K),G("updated-with-warning")}catch(U){G("update-error")}return J}catch(Y){return B.debug("check failed",{error:Y}),J}}Xz();import{stderr as fD}from"node:process";function Uu4(A){let Q=new mN().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async($)=>{await Ve0($.force||!1,$.verbose||!1,"0.0.1778871988-gfebe7f"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new mN("update").alias("up").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async($)=>{await _w5($.targetVersion)});A.addCommand(B)}function Pw5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
5413
+ npm install -g ${Y}`;D(Error(W))}},error:(E)=>{if(!U)U=!0,D(Error(`Failed to spawn ${Z}: ${E.message}`))},complete:()=>{if(!U)U=!0,X()}})})}d0();d0();Xz();var zw5="@ampcode/cli";async function WX0(A,Q,B=zw5){let J=`${Q||"https://registry.npmjs.org"}/${B}/latest`,Y=new AbortController,Z=setTimeout(()=>Y.abort(),5000);try{let F=await fetch(J,{signal:Y.signal});if(!F.ok)return{hasUpdate:!1,currentVersion:A,source:"npm"};let X=await F.json(),D=X.version??X["dist-tags"]?.latest;if(!D)return{hasUpdate:!1,currentVersion:A,source:"npm"};let G=Po(A,D),V=G<0,U,K;if(X.time){let E=X.time[A],z=X.time[D],W=Date.now();if(E)U=Math.floor((W-new Date(E).getTime())/3600000);if(z)K=Math.floor((W-new Date(z).getTime())/3600000)}return j.info("NPM version comparison",{currentVersion:A,latestVersion:D,compareResult:G,hasUpdate:V,currentVersionAge:U,latestVersionAge:K}),{hasUpdate:V,latestVersion:D,currentVersion:A,currentVersionAge:U,latestVersionAge:K,source:"npm"}}catch(F){return j.debug("Error checking npm version",{error:F}),{hasUpdate:!1,currentVersion:A,source:"npm"}}finally{clearTimeout(Z)}}var Ww5="https://static.ampcode.com/cli/cli-version.txt";async function HX0(A){let Q=new AbortController,B=setTimeout(()=>Q.abort(),5000);try{let $=await fetch(`${Ww5}?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=Po(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 Hw5=604800000;function Xu4(A){if(!A)return null;let Q=typeof A==="number"?A:new Date(A).getTime();if(isNaN(Q))return null;let B=Date.now()-Q;if(B>Hw5)return{ageMs:B};return null}function Po(A,Q){let B=(Z)=>{let[F,X]=Z.split("-");return{parts:F?.split(".").map(Number)||[],label:X}},$=B(A),J=B(Q),Y=Math.max($.parts.length,J.parts.length);for(let Z=0;Z<Y;Z++){let F=$.parts[Z]||0,X=J.parts[Z]||0;if(F<X)return-1;if(F>X)return 1}if($.label===J.label)return 0;if(!$.label&&J.label)return 1;if($.label&&!J.label)return-1;if($.label&&J.label)return $.label<J.label?-1:1;return 0}function _o(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?MF(B):void 0;return{sha:$,timestamp:B,age:J}}catch{return null}}O1();d0();import{readFile as qw5,realpath as Nw5}from"node:fs/promises";import{dirname as Du4,join as Iw5}from"node:path";async function Gu4(A){switch(A){case"binary":case"brew":return ww5(jo());case"npm":case"pnpm":case"yarn":case"bun":return Cw5()}}async function ww5(A){let Q=await DI(A,["--version"],5000);if(Q.reason!=="success")return j.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function Cw5(){try{let A=process.argv[1];if(!A)return null;let Q=await Nw5(A),B=Du4(Du4(Q));return await Mw5(Iw5(B,"package.json"))}catch(A){return j.debug("failed to read installed version from package.json",{error:A}),null}}async function Mw5(A){let Q=await qw5(A,"utf8"),B=JSON.parse(Q);if(!B.name||!Ke0(B.name))return j.debug("package.json name mismatch",{pkgJsonPath:A,name:B.name}),null;return B.version||null}d0();import{spawn as Lw5}from"node:child_process";function Ie0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return j.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var qX0=null,To=null;function Vu4(A){return new Promise((Q)=>{let B=Lw5("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),$="";B.stdout.on("data",(J)=>{$+=J.toString()}),B.on("close",(J,Y)=>{if(J!==0||Y==="SIGTERM"){Q(null);return}let Z=$.trim();Q(Z&&Z!=="undefined"?Z:null)}),B.on("error",()=>{Q(null)})})}async function NX0(){if(qX0)return qX0;if(To)return To;To=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Ie0(A);let Q=await Vu4("@sourcegraph:registry");if(Q)return Ie0(Q);let B=await Vu4("registry");if(B)return Ie0(B);return"https://registry.npmjs.org"})();try{return qX0=await To,qX0}finally{To=null}}var Ow5=3600000,jw5=5000;function IX0(A,Q,B={}){let $=new g4,J=$.pipe(tA({shouldCountRefs:!1})),Y=B.startDelayMs??0,Z=B.checkIntervalMs??Ow5,F=!1,X=()=>{F=!0};return setImmediate(async()=>{let D=j.getChild("update");if(Y>0){if(await sV(Y),F)return}let G=J.subscribe({next:(U)=>{D.debug("emit new state",U)}}),V=A;try{while(!F){let U=await Rw5(V,Q,D,$);if(U.stop)return;if(U.updatedTo)V=U.updatedTo;if(U.emittedVisibleState){if(await sV(jw5),F)return;$.next("hidden")}if(Z<=0)return;let K=1000,E=Z;while(E>0&&!F){let z=Math.min(K,E);await sV(z),E-=z}}}finally{G.unsubscribe(),$.complete()}}),{state:J,dispose:X}}async function Rw5(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 PU(),F=Z==="binary"||Z==="brew",X=F?void 0:await GI();B.debug("checking",{currentVersion:A,mode:Y,packageManager:Z,isBinaryDistribution:F,npmPackageName:X});let D;if(F)D=await HX0(A);else{let U=await NX0();D=await WX0(A,U,X)}if(!(D.latestVersion&&D.hasUpdate))return B.debug("no update available"),J;let G=(U)=>{$.next(U),J.emittedVisibleState=!0};if(Z){let U=await Gu4(Z);if(U&&Po(U,D.latestVersion)>=0){if(B.debug("on-disk version already up to date",{currentVersion:A,installedVersion:U,latestVersion:D.latestVersion}),J.updatedTo=U,Po(A,U)<0){let K=await yz(U),E={from:A,to:U,externallyUpdated:!0,...K};if(K.status==="same")B.info("on-disk already updated by another instance",E),G("updated");else B.warn("on-disk already updated by another instance, with PATH warning",E),G("updated-with-warning")}return J}}let V=()=>{if(D.currentVersionAge!==void 0&&D.latestVersionAge!==void 0){let U=D.currentVersionAge-D.latestVersionAge,K=0.5;if(Math.abs(U)<0.5)return B.debug("versions too close together, suppressing update warning",{currentVersionAge:D.currentVersionAge,latestVersionAge:D.latestVersionAge,ageDifferenceHours:U}),!0}return!1};if(!Y)Y=Z==="pnpm"?"warn":"auto",B.debug("no configured update mode; selected default based on package manager",{packageManager:Z,mode:Y});if(Z==="brew"){if(!V())G("update-available-brew");return J}if(Z==="binary"&&process.execPath!==jo()){if(B.debug("non-standard binary path, showing warning"),!V())G("update-available-unrecognized-path");return J}if(Y==="warn"){if(!V())G("update-available");return J}if(!Z){if(B.debug("auto-update not supported, falling back to warn mode"),!V())G("update-available");return J}if(Z==="binary"&&process.platform==="win32"){if(B.debug("binary auto-update not supported on Windows, falling back to warn mode"),!V())G("update-available");return J}try{await Ro(D.latestVersion,Z),J.updatedTo=D.latestVersion;let U=await yz(D.latestVersion),K={from:D.currentVersion,to:D.latestVersion,...U};if(U.status==="same")B.info("success",K),G("updated");else B.warn("success with warning",K),G("updated-with-warning")}catch(U){G("update-error")}return J}catch(Y){return B.debug("check failed",{error:Y}),J}}Xz();import{stderr as fD}from"node:process";function Uu4(A){let Q=new mN().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async($)=>{await Ve0($.force||!1,$.verbose||!1,"0.0.1778876600-gb6c4d8"),process.exit()});A.addCommand(Q,{hidden:!0});let B=new mN("update").alias("up").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async($)=>{await _w5($.targetVersion)});A.addCommand(B)}function Pw5(A){let Q=Boolean(A.isTTY),B=0,$=!1;function J(){if(!Q||!$)return;A.write(`
5414
5414
  `),$=!1,B=0}function Y(Z){if(!Q)return;let F=Z.padEnd(B," ");A.write(`\r${F}`),$=!0,B=F.length}return{flushProgressLine:J,renderProgress:Y}}async function _w5(A){let B=process.platform==="win32"&&jj()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:$,renderProgress:J}=Pw5(fD);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")fD.write(a0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
5415
5415
 
5416
5416
  `));try{if(!A){fD.write(a0.blue(`Checking for updates...
5417
- `));let F=!1,X;if(jj()){let D=await HX0("0.0.1778871988-gfebe7f");F=D.hasUpdate,X=D.latestVersion}else{let D=await NX0(),G=await GI(),V=await WX0("0.0.1778871988-gfebe7f",D,G);F=V.hasUpdate,X=V.latestVersion}if(!F){let D=_o("0.0.1778871988-gfebe7f"),G=D?.age?`released ${D.age} ago`:`built ${MF(new Date("2026-05-15T19:10:43.549Z"))} ago`;fD.write(a0.green(`✓ Amp is already up to date on version ${"0.0.1778871988-gfebe7f"} (${G})
5418
- `));let V=await yz("0.0.1778871988-gfebe7f",B);if(V.warning)fD.write(`
5417
+ `));let F=!1,X;if(jj()){let D=await HX0("0.0.1778876600-gb6c4d8");F=D.hasUpdate,X=D.latestVersion}else{let D=await NX0(),G=await GI(),V=await WX0("0.0.1778876600-gb6c4d8",D,G);F=V.hasUpdate,X=V.latestVersion}if(!F){let D=_o("0.0.1778876600-gb6c4d8"),G=D?.age?`released ${D.age} ago`:`built ${MF(new Date("2026-05-15T20:27:13.265Z"))} ago`;fD.write(a0.green(`✓ Amp is already up to date on version ${"0.0.1778876600-gb6c4d8"} (${G})
5418
+ `));let V=await yz("0.0.1778876600-gb6c4d8",B);if(V.warning)fD.write(`
5419
5419
  `+a0.yellow(V.warning)+`
5420
5420
  `);process.exit(0)}if(!X)fD.write(a0.yellow("[WARN] could not find latest version")),process.exit(0);A=X}fD.write(a0.blue(`Updating to version ${A}...
5421
5421
  `)),await Ro(A,void 0,(F)=>{$(),fD.write(a0.dim(`Running: ${F}
@@ -5823,7 +5823,7 @@ ${$}`).join(`
5823
5823
  `).length,J=new p({text:new C(A,new v({color:B}))});if($<=bG0)return J;return new E0({width:1/0,height:bG0,child:new l9({autofocus:!1,controller:Q,child:J})})}function kx5(){return new Map([[M1.key("PageUp"),new uG0],[M1.key("PageDown"),new s41],[M1.ctrl("u"),new uG0],[M1.shift("Home"),new t41],[M1.shift("End"),new e41]])}function Sx5(A,Q,B){return Math.max(Q,Math.min(A,B))}var AA1=8,wn4=1,Cn4=AA1-1;class QA1 extends L4{}class BA1 extends L4{}class hG0 extends L4{}class gG0 extends L4{}class $A1 extends L4{}class JA1 extends L4{}class YA1 extends T0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new Mn4}}class Mn4 extends _0{messageScroll=new xA;initState(){super.initState(),this.messageScroll.followMode=!1,this.messageScroll.jumpTo(0)}dispose(){this.messageScroll.dispose(),super.dispose()}build(A){let Q=this.widget.props,B=vx5(Q,this.messageScroll),$=yx5(Q.options.message),J=$?new l4({actions:this.buildScrollActions(),child:new Y5({debugLabel:"NeoSelectDialogScrollShortcuts",shortcuts:fx5(),child:B})}):B,Y=[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"}];if($)Y.push({keys:["Ctrl+E","Ctrl+Y"],label:"scroll"});return Y.push({keys:["Esc"],label:"cancel"}),new CA({header:Q.options.title,minWidth:64,maxWidth:80,footer:Y,autofocus:!1,onDismiss:Q.onCancel,child:J})}buildScrollActions(){let A=(Q)=>{let B=bx5(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo(B)};return new Map([[QA1,new p1(()=>A(-wn4))],[BA1,new p1(()=>A(wn4))],[hG0,new p1(()=>A(-Cn4))],[gG0,new p1(()=>A(Cn4))],[$A1,new p1(()=>this.messageScroll.jumpTo(0))],[JA1,new p1(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function vx5(A,Q){let B=A.options.options.map((J)=>({value:J,label:J})),$=Math.max(0,B.findIndex((J)=>J.value===A.options.initialValue));return new E2({options:B,selectedIndex:$,body:xx5(A.options.message,Q),onSelect:(J)=>{if(J===null){A.onCancel();return}A.onSelect(J)},padding:K0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!1})}function yx5(A){if(A===void 0)return!1;return A.split(`
5824
5824
  `).length>AA1}function xx5(A,Q){if(A===void 0)return;let B=A.split(`
5825
5825
  `).length,$=Math.min(B,AA1);return new E0({width:1/0,height:$,child:new l9({autofocus:!1,controller:Q,child:new p({text:new C(A)})})})}function fx5(){return new Map([[M1.key("PageUp"),new hG0],[M1.key("PageDown"),new gG0],[M1.ctrl("u"),new hG0],[M1.ctrl("d"),new gG0],[M1.ctrl("y"),new QA1],[M1.ctrl("e"),new BA1],[M1.shift("Home"),new $A1],[M1.shift("End"),new JA1]])}function bx5(A,Q,B){return Math.max(Q,Math.min(A,B))}class ZA1{options;unregisterPluginCommands=null;pluginCommandSubscriptions=[];pluginErrorToastKeys=new Set;activeDialog=null;queuedDialogs=[];statusItems=new Map;disposed=!1;constructor(A){this.options=A}init(){this.disposed=!1,this.configurePluginPlatform(),this.subscribePluginCommands()}dispose(){this.disposed=!0,this.unregisterPluginCommands?.(),this.unregisterPluginCommands=null;for(let A of this.pluginCommandSubscriptions)A.unsubscribe();this.pluginCommandSubscriptions=[],this.cancelPendingDialogs(),this.statusItems.clear(),this.clearPluginPlatformStatusHandlers()}hasBlockingDialog(){return this.activeDialog!==null}buildDialogLayers(){let A=this.activeDialog;if(!A)return[];switch(A.kind){case"input":return[new Ks({key:new bz(A),header:A.options.title??"Input",helpText:A.options.helpText,initialValue:A.options.initialValue,isRequired:!1,onSubmit:(Q)=>this.resolveInputDialog(A,Q),onDismiss:()=>this.resolveInputDialog(A,void 0)})];case"confirm":return[new r41({key:new bz(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)})];case"select":return[new YA1({key:new bz(A),options:A.options,onSelect:(Q)=>this.resolveSelectDialog(A,Q),onCancel:()=>this.resolveSelectDialog(A,void 0)})]}}getStatusItems(){return[...this.statusItems.values()].flatMap((A)=>A.value===void 0?[]:[{pluginURI:A.pluginURI,id:A.id,value:A.value}])}configurePluginPlatform(){let A=this.options.neoContext.pluginPlatform;if(!A)return;A.showToast=(Q)=>this.options.toastController.show(Q,"success"),A.showOpenedURLToast=(Q)=>{this.options.toastController.show(`Opened URL: ${Q}`,"success",8000)},A.appendToThreadHandler=this.options.neoContext.observerOnly?async()=>{throw Error("thread.append is only available from an executor-owned plugin runtime")}:this.options.appendToThread,A.showInputDialog=this.showInputDialog,A.showConfirmDialog=this.showConfirmDialog,A.showSelectDialog=this.showSelectDialog,A.createStatusItemHandler=this.createStatusItem,A.updateStatusItemHandler=this.updateStatusItem,A.removeStatusItemHandler=this.removeStatusItem}clearPluginPlatformStatusHandlers(){let A=this.options.neoContext.pluginPlatform;if(!A)return;if(A.createStatusItemHandler===this.createStatusItem)A.createStatusItemHandler=null;if(A.updateStatusItemHandler===this.updateStatusItem)A.updateStatusItemHandler=null;if(A.removeStatusItemHandler===this.removeStatusItem)A.removeStatusItemHandler=null}subscribePluginCommands(){let A=this.options.neoContext.pluginService;if(!A)return;this.refreshPluginCommands(A.commands.list()),this.pluginCommandSubscriptions=[A.plugins.subscribe((Q)=>{this.removeInactivePluginStatusItems(Q),this.showNewPluginErrorToasts(Q),this.refreshPluginCommands(A.commands.list())}),A.commands.changed.subscribe(()=>{this.refreshPluginCommands(A.commands.list())})]}refreshPluginCommands(A){this.unregisterPluginCommands?.();let B=A.map(($)=>this.createPluginCommand($)).map(($)=>this.options.commandRegistry.register($));this.unregisterPluginCommands=()=>{for(let $ of B)$()}}showNewPluginErrorToasts(A){let Q=new Set;for(let B of A){if(B.status!=="error")continue;if(sd(B.errorMessage))continue;let $=`${B.uri.toString()}
5826
- ${B.errorMessage??""}`;if(Q.add($),this.pluginErrorToastKeys.has($))continue;this.options.toastController.show(this.formatPluginErrorToast(B),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter(($)=>$.status==="active").map(($)=>$.uri.toString())),B=[];for(let[$,J]of this.statusItems){if(Q.has(J.pluginURI))continue;B.push($)}if(B.length===0)return;this.updateStatusItemState(()=>{for(let $ of B)this.statusItems.delete($)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,keywords:["plugin",A.pluginName,A.id],status:A.availability,run:async(Q,B,$)=>{$();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(J){j.error("Neo plugin command failed",{error:J,command:A}),this.options.toastController.show(J instanceof Error?J.message:String(J),"error",5000)}}}}showInputDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"input",options:A,resolve:Q})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(!1);return}this.enqueueDialog({kind:"confirm",options:A,resolve:Q})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"select",options:A,resolve:Q})})};createStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let $=this.statusItemKey(A,Q),J={pluginURI:A,id:Q};if(B!==void 0)J.value=B;this.statusItems.set($,J)})};updateStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:B})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[];for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}enqueueDialog(A){if(this.activeDialog){this.queuedDialogs.push(A);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A})}resolveInputDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveConfirmDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveSelectDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}wl();A2();import{readFile as ux5}from"node:fs/promises";import FA1 from"node:os";function hx5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ln4(A,Q){try{return{path:Q,contents:rh0(await ux5(A,"utf8"))}}catch{return null}}async function mG0(A,Q){let B=[],$=hx5(),J=await r4.getThread({thread:Q},{config:A.configService}),Y=J.ok?J.result.thread.data:null;B.push({path:`${$}/thread.json`,contents:JSON.stringify(XJ(Y),null,2)});let Z=await Ln4(Xx(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await Ln4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await PU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778871988-gfebe7f",clientOS:`${FA1.platform()} ${FA1.release()} ${FA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class XA1{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.backStack.pop();this.forwardStack.push(Q)}}}}class pG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new DA1(this.offstage)}updateRenderObject(A){if(A instanceof DA1)A.offstage=this.offstage}}class DA1 extends Y4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;H4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class Es{_state=null;_attach(A){this._state=A}_detach(){this._state=null}push(A){this._state?.push(A)}pushWithDismiss(A){this._state?.pushWithDismiss(A)}pop(){return this._state?.pop()??!1}get canPop(){return this._state?.canPop??!1}}class GA1 extends T0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new On4}}class On4 extends _0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new Sj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new Sj,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 pG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new i4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new pG0({key:$.key,offstage:!J,child:Y}))}return new $A({fit:"expand",children:Q})}}class UA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=gx5(Q);return new CA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new X5({items:Q,showBorder:!1,getLabel:($)=>{let J=VA1($);return $.keywords&&$.keywords.length>0?`${J} ${$.keywords.join(" ").toLowerCase()}`:J},sortItems:($,J,Y)=>{if(Y===""){let G=$.item.status.type==="disabled"?1:0,V=J.item.status.type==="disabled"?1:0;if(G!==V)return G-V;let U=$.item.sortBoost??0,K=J.item.sortBoost??0;if(U!==K)return K-U;let E=$.item.noun?.toLowerCase()??"",z=J.item.noun?.toLowerCase()??"";if(E!==z)return E<z?-1:1;return 0}let Z=sj($.item.verb.toLowerCase(),Y),F=sj(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=sj(VA1($.item),Y),D=sj(VA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=P0.of(J);return new p({text:new C($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new jn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class jn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=P0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new C(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:mx5(Q.shortcut,Z,$)});return new Rn4({columns:z,padding:K0.horizontal(1),backgroundColor:D})}}function VA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function gx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,y4(B.noun)):Q},0)}function mx5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class Rn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let F=0;F<Q.length;F++){let X=Q[F];if(F>0&&B>0)Y.push(new E0({width:B}));if(X.fixedWidth!==void 0)Y.push(new E0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new _1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new g0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class KA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#B(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#B()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let B=this.findByID(A);if(!B||B.status.type!=="enabled")return!1;return B.run(new Es,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class K9 extends U6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=K9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(K9)?.commandRegistry??null}}class EA1 extends T0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Pn4}}class Pn4 extends _0{modalStack=new Es;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=K9.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=K9.of(A).commands,B=new UA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new GA1({root:B,controller:this.modalStack})}}var zA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],WA1=[{description:"Page scroll",methods:[{keys:["Pg Up"]},{keys:["Pg Down"]}]},{description:"Half-page scroll",methods:[{input:"K",keys:["Alt"]},{input:"J",keys:["Alt"]}]},{description:"Mouse wheel scroll",methods:[{keys:["Mouse Wheel"]}]},{description:"Jump to first message",methods:[{keys:["Home"]}]},{description:"Jump to bottom of screen",methods:[{keys:["End"]}]},{description:"Navigate to previous messages",methods:[{keys:["Tab"]},{keys:["Shift","Tab"]}]}];class dG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=a1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new x0({padding:K0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new E0({width:1}),new _1({flex:1,child:X})]});Y.push(new x0({padding:K0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class HA1 extends T0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new _n4}}class _n4 extends _0{scrollController;initState(){this.scrollController=new xA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=L1.of(A).colorScheme,J=P0.of(A).app,Y=a1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,z=K-4,W=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let P=O.noun?.toLowerCase();return P!=="dev"&&P!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,P)=>{let T=(O.noun??"").toLowerCase(),k=(P.noun??"").toLowerCase(),y=T.localeCompare(k);if(y!==0)return y;let g=O.verb.toLowerCase(),u=P.verb.toLowerCase(),S=g.localeCompare(u);if(S!==0)return S;return O.id.localeCompare(P.id)}),I=new fA({autofocus:!0,controller:this.scrollController,child:new g0({constraints:new I1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new t1({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
5826
+ ${B.errorMessage??""}`;if(Q.add($),this.pluginErrorToastKeys.has($))continue;this.options.toastController.show(this.formatPluginErrorToast(B),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter(($)=>$.status==="active").map(($)=>$.uri.toString())),B=[];for(let[$,J]of this.statusItems){if(Q.has(J.pluginURI))continue;B.push($)}if(B.length===0)return;this.updateStatusItemState(()=>{for(let $ of B)this.statusItems.delete($)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.neoContext.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,keywords:["plugin",A.pluginName,A.id],status:A.availability,run:async(Q,B,$)=>{$();try{await this.options.neoContext.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(J){j.error("Neo plugin command failed",{error:J,command:A}),this.options.toastController.show(J instanceof Error?J.message:String(J),"error",5000)}}}}showInputDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"input",options:A,resolve:Q})})};showConfirmDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(!1);return}this.enqueueDialog({kind:"confirm",options:A,resolve:Q})})};showSelectDialog=(A)=>{return new Promise((Q)=>{if(this.disposed||!this.options.state.mounted){Q(void 0);return}this.enqueueDialog({kind:"select",options:A,resolve:Q})})};createStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let $=this.statusItemKey(A,Q),J={pluginURI:A,id:Q};if(B!==void 0)J.value=B;this.statusItems.set($,J)})};updateStatusItem=(A,Q,B)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:B})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[];for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}enqueueDialog(A){if(this.activeDialog){this.queuedDialogs.push(A);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A})}resolveInputDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveConfirmDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}resolveSelectDialog(A,Q){if(this.activeDialog!==A)return;this.advanceDialog(),A.resolve(Q)}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}}wl();A2();import{readFile as ux5}from"node:fs/promises";import FA1 from"node:os";function hx5(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function Ln4(A,Q){try{return{path:Q,contents:rh0(await ux5(A,"utf8"))}}catch{return null}}async function mG0(A,Q){let B=[],$=hx5(),J=await r4.getThread({thread:Q},{config:A.configService}),Y=J.ok?J.result.thread.data:null;B.push({path:`${$}/thread.json`,contents:JSON.stringify(XJ(Y),null,2)});let Z=await Ln4(Xx(Q),`${$}/logs/${Q}.log`);if(Z)B.push(Z);let F=await Ln4(A.settingsFilePath,`${$}/settings/global.json`);if(F)B.push(F);let X=await PU()??"unknown",D=await r4.sendReport({threadID:Q,files:B,metadata:{clientVersion:"0.0.1778876600-gb6c4d8",clientOS:`${FA1.platform()} ${FA1.release()} ${FA1.arch()}`,installMethod:X}},{config:A.configService});if(!D.ok)throw Error(`Failed to submit report: ${D.error.message}`);return D.result.reportID}class XA1{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let B=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if(B)this.backStack.pop();this.forwardStack.push(Q)}}}}class pG0 extends w5{offstage;constructor({key:A,offstage:Q=!0,child:B}){super({key:A,child:B});this.offstage=Q}createRenderObject(){return new DA1(this.offstage)}updateRenderObject(A){if(A instanceof DA1)A.offstage=this.offstage}}class DA1 extends Y4{_offstage;constructor(A){super();this._offstage=A}get offstage(){return this._offstage}set offstage(A){if(A===this._offstage)return;this._offstage=A,this.markNeedsLayout()}getMinIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicWidth(A)??0}getMaxIntrinsicWidth(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicWidth(A)??0}getMinIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMinIntrinsicHeight(A)??0}getMaxIntrinsicHeight(A){if(this._offstage)return 0;return this.children[0]?.getMaxIntrinsicHeight(A)??0}performLayout(){let A=this._lastConstraints;H4(!!A,"performLayout called without constraints");let Q=this.children[0];if(this._offstage){if(this.setSize(0,0),Q)Q.layout(A),Q.setOffset(0,0)}else if(Q){Q.layout(A);let B=A.constrain(Q.size.width,Q.size.height);this.setSize(B.width,B.height),Q.setOffset(0,0)}else{let B=A.smallest;this.setSize(B.width,B.height)}super.performLayout()}paint(A,Q,B){if(this._offstage)return;super.paint(A,Q,B)}hitTest(A,Q,B,$){if(this._offstage)return!1;return super.hitTest(A,Q,B,$)}}class Es{_state=null;_attach(A){this._state=A}_detach(){this._state=null}push(A){this._state?.push(A)}pushWithDismiss(A){this._state?.pushWithDismiss(A)}pop(){return this._state?.pop()??!1}get canPop(){return this._state?.canPop??!1}}class GA1 extends T0{root;controller;constructor(A){super();this.root=A.root,this.controller=A.controller}createState(){return new On4}}class On4 extends _0{entries=[];initState(){this.widget.controller._attach(this)}didUpdateWidget(A){if(A.controller!==this.widget.controller)A.controller._detach(),this.widget.controller._attach(this)}dispose(){this.widget.controller._detach(),super.dispose()}push(A){let Q=new Sj,B=this.makeScopedDismiss(Q);this.setState(()=>{this.entries.push({key:Q,widget:A,dismiss:B})})}pushWithDismiss(A){let Q=new Sj,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 pG0({offstage:this.entries.length>0,child:this.widget.root}));for(let B=0;B<this.entries.length;B++){let $=this.entries[B],J=B===this.entries.length-1,Y=J?new i4({autofocus:!0,debugLabel:`ModalStackEntry[${B}]`,onKey:(Z)=>{if(Z.key!=="Escape")return"ignored";return $.dismiss(),"handled"},child:$.widget}):$.widget;Q.push(new pG0({key:$.key,offstage:!J,child:Y}))}return new $A({fit:"expand",children:Q})}}class UA1 extends H1{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter(($)=>$.status.type!=="hidden"),B=gx5(Q);return new CA({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:K0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new X5({items:Q,showBorder:!1,getLabel:($)=>{let J=VA1($);return $.keywords&&$.keywords.length>0?`${J} ${$.keywords.join(" ").toLowerCase()}`:J},sortItems:($,J,Y)=>{if(Y===""){let G=$.item.status.type==="disabled"?1:0,V=J.item.status.type==="disabled"?1:0;if(G!==V)return G-V;let U=$.item.sortBoost??0,K=J.item.sortBoost??0;if(U!==K)return K-U;let E=$.item.noun?.toLowerCase()??"",z=J.item.noun?.toLowerCase()??"";if(E!==z)return E<z?-1:1;return 0}let Z=sj($.item.verb.toLowerCase(),Y),F=sj(J.item.verb.toLowerCase(),Y);if(Z!==F)return F-Z;let X=sj(VA1($.item),Y),D=sj(VA1(J.item),Y);if(X!==D)return D-X;return J.score-$.score},isItemDisabled:($)=>$.status.type==="disabled",buildDisabledReasonWidget:($,J)=>{if($.status.type!=="disabled")return;let{colors:Y}=P0.of(J);return new p({text:new C($.status.reason,new v({color:Y.mutedForeground,dim:!0})),textAlign:"center"})},renderItem:($,J,Y,Z)=>new jn4({command:$,isSelected:J,isDisabled:Y,categoryWidth:B,buildContext:Z}),onAccept:($)=>{this.props.onAccept($)},onDismiss:this.props.onDismiss})})}}class jn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{command:Q,isSelected:B,isDisabled:$,categoryWidth:J,buildContext:Y}=this.props,Z=P0.of(Y),{colors:F,app:X}=Z,D=B?X.selectionBackground:void 0,G=B?X.selectionForeground:F.foreground,V=B?G:F.mutedForeground,U=new p({text:new C(Q.noun?.toLowerCase()??"",new v({color:V,dim:$||!B})),textAlign:"right"}),K=[new C(Q.verb.toLowerCase(),new v({color:G,bold:!0,dim:$}))];if($)K.push(new C(" (unavailable)",new v({color:G,dim:!0})));let E=p.spans(K),z=[{child:U,fixedWidth:J},{child:E,expanded:!0}];if(Q.shortcut)z.push({child:mx5(Q.shortcut,Z,$)});return new Rn4({columns:z,padding:K0.horizontal(1),backgroundColor:D})}}function VA1(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function gx5(A){return A.reduce((Q,B)=>{return B.noun?Math.max(Q,y4(B.noun)):Q},0)}function mx5(A,Q,B){let{colors:$,app:J}=Q,Y=new v({color:$.mutedForeground,dim:B}),Z=[];for(let F of A.modifiers()){if(Z.length>0)Z.push(new C(" ",Y));Z.push(new C(F,new v({color:J.keybind,bold:!0,dim:B})))}if(Z.length>0)Z.push(new C(" ",Y));return Z.push(new C(A.key,new v({color:J.keybind,bold:!0,dim:B}))),p.spans(Z)}class Rn4 extends H1{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:B=2,padding:$,backgroundColor:J}=this.props,Y=[];for(let F=0;F<Q.length;F++){let X=Q[F];if(F>0&&B>0)Y.push(new E0({width:B}));if(X.fixedWidth!==void 0)Y.push(new E0({width:X.fixedWidth,child:X.child}));else if(X.expanded)Y.push(new _1({child:X.child}));else Y.push(X.child)}let Z=new s0({crossAxisAlignment:"start",children:Y});if(!$&&!J)return Z;return new g0({decoration:J?{color:J}:void 0,padding:$,child:Z})}}class KA1{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#B(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#B()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q){let B=this.findByID(A);if(!B||B.status.type!=="enabled")return!1;return B.run(new Es,Q,()=>{}),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#B(){for(let A of this.#Q)A()}}class K9 extends U6{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=K9.maybeOf(A);if(!Q)throw Error("No NeoCommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(K9)?.commandRegistry??null}}class EA1 extends T0{onDismiss;constructor(A){super();this.onDismiss=A.onDismiss}createState(){return new Pn4}}class Pn4 extends _0{modalStack=new Es;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=K9.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=K9.of(A).commands,B=new UA1({commands:Q,onAccept:($)=>{$.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new GA1({root:B,controller:this.modalStack})}}var zA1=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],WA1=[{description:"Page scroll",methods:[{keys:["Pg Up"]},{keys:["Pg Down"]}]},{description:"Half-page scroll",methods:[{input:"K",keys:["Alt"]},{input:"J",keys:["Alt"]}]},{description:"Mouse wheel scroll",methods:[{keys:["Mouse Wheel"]}]},{description:"Jump to first message",methods:[{keys:["Home"]}]},{description:"Jump to bottom of screen",methods:[{keys:["End"]}]},{description:"Navigate to previous messages",methods:[{keys:["Tab"]},{keys:["Shift","Tab"]}]}];class dG0 extends H1{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let B=a1.of(A).size.width,$=50,J=B<50,Y=[];for(let Z of this.items){let[F,X]=this.renderRow(Z),D;if(J)D=new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[F,new x0({padding:K0.only({left:4}),child:X})]});else D=new s0({crossAxisAlignment:"start",children:[new _1({flex:1,child:F}),new E0({width:1}),new _1({flex:1,child:X})]});Y.push(new x0({padding:K0.horizontal(6),child:D}))}return new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:Y})}}class HA1 extends T0{commands;submitOnEnter;constructor({key:A,commands:Q,submitOnEnter:B}){super(A?{key:A}:{});this.commands=Q,this.submitOnEnter=B??!0}createState(){return new _n4}}class _n4 extends _0{scrollController;initState(){this.scrollController=new xA,this.scrollController.disableFollowMode(),this.scrollController.jumpTo(0)}dispose(){}build(A){let B=L1.of(A).colorScheme,J=P0.of(A).app,Y=a1.of(A),Z=new v({color:B.primary,bold:!0}),F=new v({color:B.secondary,bold:!0}),X=new v({color:J.keybind}),D=new v({color:J.command}),G=new v({color:B.foreground}),V=new v({color:B.foreground}),U=Y.size.width,K=Y.size.height,E=U-4,z=K-4,W=Math.max(40,Math.min(80,E)),H=new Set(["permissions-disable"]),N=[...this.widget.commands.filter((O)=>{let P=O.noun?.toLowerCase();return P!=="dev"&&P!=="debug"&&!O.id.startsWith("debug-")&&!H.has(O.id)})].sort((O,P)=>{let T=(O.noun??"").toLowerCase(),k=(P.noun??"").toLowerCase(),y=T.localeCompare(k);if(y!==0)return y;let g=O.verb.toLowerCase(),u=P.verb.toLowerCase(),S=g.localeCompare(u);if(S!==0)return S;return O.id.localeCompare(P.id)}),I=new fA({autofocus:!0,controller:this.scrollController,child:new g0({constraints:new I1(W,W,0,Number.POSITIVE_INFINITY),child:new y0({crossAxisAlignment:"start",mainAxisSize:"min",children:[new t1({child:new p({text:new C(`Amp CLI - Help & Keyboard Shortcuts
5827
5827
  `,Z)})}),new E0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Editor Shortcuts
5828
5828
  `,F)})}),new dG0({items:zA1.filter((O)=>O.submitOnEnterOnly===void 0||O.submitOnEnterOnly===this.widget.submitOnEnter),renderRow:(O)=>{let P=[];for(let k of O.methods){let y=this.buildCleanKeyCombination(k);P.push(y)}let T=P.join(", ");return[new p({text:new C(T,X)}),new p({text:new C(O.description,G)})]}}),new E0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Scrolling & Navigation
5829
5829
  `,F)})}),new dG0({items:WA1,renderRow:(O)=>{let P=[];for(let k of O.methods){let y=this.buildCleanKeyCombination(k);P.push(y)}let T=P.join(", ");return[new p({text:new C(T,X)}),new p({text:new C(O.description,G)})]}}),new E0({height:1}),new x0({padding:K0.horizontal(2),child:new p({text:new C(`Command Palette Commands
@@ -5922,7 +5922,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)g=this.widget.centerContent
5922
5922
  `))}return Z}function Ym5(A,Q,B){let{colors:$,app:J}=B,Y=Zm5(Q.status,B);if(A.push(new C(` ${Y.icon} `,new v({color:Y.color}))),A.push(new C(Q.name,new v({color:Q.status==="pending"?$.warning:J.command}))),Q.status==="pending")A.push(new C(" discovering...",new v({color:$.foreground,dim:!0})));else if(Q.description)A.push(new C(` ${Xs4(Q.description,50)}`,new v({color:$.foreground,dim:!0})));if(Q.error)A.push(new C(` ${Xs4(Q.error,40)}`,new v({color:J.toolError})));A.push(new C(`
5923
5923
  `))}function Zm5(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 Xs4(A,Q){let B=A.replace(/\s+/g," ").trim();if(y4(B)<=Q)return B;let $="...",J=y4($);if(Q<=J)return IJ($,Q);return`${IJ(B,Q-J,!0,"")}${$}`}var B51="https://ampcode.com/news/neo",$51=[{title:"Meet the new Amp CLI",body:[]},{title:"Rebuilt From The Ground Up",body:["Same close-up terminal workflow. Completely different underneath."]},{title:"Just Keep Typing",body:["Context is summarized automatically at ~90%.","No handoff flow. No context percentage to babysit."]},{title:"Queueing and Steering",body:["Sending a message now queues by default instead of cancelling tools.","Use steering when you want the agent to see something sooner."]},{title:"Remote Control",body:["Start a thread in the CLI, then keep going from ampcode.com.","Watch live updates and queue follow-ups from any device."]},{title:"Customize Amp with Amp",body:[{text:"Amp now has a ",linkText:"complete plugin API",href:"https://ampcode.com/manual/plugin-api",textAfter:"."},"Add tools, commands, control UI, and hook into events."]},{title:"Permissions",body:[{text:"By default (when no ",highlightText:"amp.permissions",textAfterHighlight:" setting is present), Amp no longer asks for confirmation before running any tools and commands. And you can now implement your own custom permission logic with ",linkText:"plugins",href:"https://ampcode.com/manual/plugin-api",textAfter:"."}]},{title:null,body:["Check out the full news post for more:",{text:B51,href:B51},"","",{text:"Need old Amp for a bit? Use ",keybind:"amp --take-me-back"}]}];function Fm5(A){return[{title:"Upgrade your Amp CLI",body:[{text:"This npm-based distribution of Amp CLI has been deprecated. To use the ",linkText:"new Amp CLI",href:B51,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function Xm5(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var gf=50,ER=40,A51=1000,Dm5=420,Gm5=760,Vm5=-250,Um5=1100,NV0=33,Us4=0.999,Km5=2.1,Em5=720,zm5=420,Is4="Meet the new",ws4="Amp",Cs4="CLI",J51=C4(Is4).length,Wm5=C4(ws4).length,Hm5=C4(Cs4).length,IV0={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},Ks4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},Es4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},zs4=[IV0,Ks4,Es4,IV0,Ks4,Es4,IV0],qm5=IV0;class Y51 extends T0{onDismiss;onQuit;animationProgress;animationsEnabled;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.animationsEnabled=A.animationsEnabled??!0,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??Xm5(),this.introStages=this.variant==="npm-migration"?Fm5(this.binaryInstallCommand):$51,this.dismissible=this.variant!=="npm-migration"}createState(){return new Ms4}}class Ms4 extends _0{startedAt=performance.now();animationTimer=null;stageTransitionTimer=null;firstStageTitleTimer=null;firstStageHintTimer=null;firstStageRevealTimer=null;firstStageTitleRevealStartedAt=null;firstStageHintRevealStartedAt=null;stageTransitionStartedAt=performance.now();animationStartProgress=0;animationTargetProgress=1;animationDurationMs=A51;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 h9(42);initState(){super.initState(),this.startAnimationIfNeeded()}didUpdateWidget(A){if(super.didUpdateWidget(A),A.animationProgress!==this.widget.animationProgress||A.animationsEnabled!==this.widget.animationsEnabled)this.startAnimationIfNeeded()}dispose(){this.stopAnimation(),this.stopStageTransitionTimer(),this.stopFirstStageRevealTimers(),this.stopDismissAnimation(),super.dispose()}startAnimationIfNeeded(){if(this.stopAnimation(),this.stopFirstStageRevealTimers(),this.widget.animationProgress!==void 0){this.animationProgress=$Z(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=Us4,this.firstStageHintVisible=this.animationProgress>=Us4,this.firstStageTitleRevealProgress=this.firstStageTitleVisible?1:0,this.firstStageHintRevealProgress=this.firstStageHintVisible?1:0;return}if(!this.widget.animationsEnabled){this.stopStageTransitionTimer(),this.stopDismissAnimation(),this.animationProgress=1,this.isDismissing=!1,this.dismissProgress=0,this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1,this.previousIntroStage=null,this.stageTransitionProgress=1;return}if(this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0,this.startProgressAnimation({from:0,to:1,durationMs:A51,onComplete:()=>{if(!this.widget.dismissible)this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1})}}),this.widget.dismissible)this.startFirstStageRevealSequence()}startDismissAnimation(){if(this.isDismissing)return;if(!this.widget.animationsEnabled){this.widget.onDismiss();return}this.stopFirstStageRevealTimers(),this.stopStageTransitionTimer(),this.dismissStartedAt=performance.now(),this.setState(()=>{this.isDismissing=!0,this.dismissProgress=0}),this.dismissTimer=setInterval(()=>{let A=performance.now()-this.dismissStartedAt,Q=$Z(A/Gm5);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},NV0)}canNavigateIntroStage(){if(this.isDismissing)return!1;if(!this.firstStageHintVisible)return!1;if(this.introStage===0&&this.firstStageHintRevealProgress<1)return!1;return!0}advanceIntroStage(){if(!this.canNavigateIntroStage())return;if(this.isFinalIntroStage()){if(this.widget.dismissible)this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.widget.dismissible||!this.canNavigateIntroStage()||!this.isFinalIntroStage())return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.isFinalIntroStage())return;this.moveIntroStage(1)}goToPreviousIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<=0)return;this.moveIntroStage(-1)}isFinalIntroStage(){return this.introStage>=this.widget.introStages.length-1}moveIntroStage(A){let Q=this.introStage+A;if(this.stopStageTransitionTimer(),this.stageTransitionStartedAt=performance.now(),this.setState(()=>{this.previousIntroStage=this.introStage,this.introStage=Q,this.stageTransitionDirection=A}),this.widget.animationProgress!==void 0||!this.widget.animationsEnabled){this.setState(()=>{this.previousIntroStage=null,this.stageTransitionProgress=1});return}this.setState(()=>{this.stageTransitionProgress=0}),this.stageTransitionTimer=setInterval(()=>{let B=performance.now()-this.stageTransitionStartedAt,$=$Z(B/Dm5);if(this.setState(()=>{if(this.stageTransitionProgress=$,$>=1)this.previousIntroStage=null}),$>=1)this.stopStageTransitionTimer()},NV0)}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=$Z(J/this.animationDurationMs),Z=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*mf(Y);if(this.setState(()=>{this.animationProgress=Z}),Y>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},NV0)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null}stopStageTransitionTimer(){if(this.stageTransitionTimer)clearInterval(this.stageTransitionTimer),this.stageTransitionTimer=null}startFirstStageRevealSequence(){if(this.stopFirstStageRevealTimers(),!this.widget.animationsEnabled){this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1});return}this.setState(()=>{this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0});let A=Math.max(0,A51+Vm5),Q=A+Um5;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?$Z((A-this.firstStageTitleRevealStartedAt)/Em5):this.firstStageTitleRevealProgress,B=this.firstStageHintRevealStartedAt?$Z((A-this.firstStageHintRevealStartedAt)/zm5):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=B}),Q>=1&&B>=1)this.stopFirstStageRevealTimer()},NV0)}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=Ws4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:Hs4(Ws4(this.previousIntroStage),A,mf(this.stageTransitionProgress));return this.dismissProgress>0?Hs4(Q,qm5,mf(this.dismissProgress)):Q}build(A){let Q=L1.of(A).colorScheme,B=P0.of(A),$=this.currentOrbPalette(),J=BB(1,"frontier",$),Y=a1.of(A).size,F=this.widget.animationProgress??this.animationProgress,X=Math.max(Y.width/gf,Y.height/ER)*Km5,D=X+(1-X)*F,G=mf(this.dismissProgress),V=Math.max(gf,Math.round(gf*D)),U=Math.max(ER,Math.round(ER*D)),K=Math.round((Y.width-V)/2),E=Math.round((Y.height-U)/2),z=Math.max(0,Math.floor((Y.width-gf)/2)),W=-Math.floor(ER/2),H=Math.round(K+(z-K)*F),q=Math.round(E+(W-E)*F),N=H+V/2,I=q+U/2,w=Nm5({dismissProgress:this.dismissProgress,easedDismissProgress:G,introOrbScale:D,normalOrbCenterX:N,normalOrbCenterY:I,size:Y}),L=Math.max(gf,Math.round(gf*w.orbScale)),O=Math.max(ER,Math.round(ER*w.orbScale)),P=w.orbCenterX,T=w.orbCenterY,k=Math.round(P-L/2),y=Math.round(T-O/2),g=Math.max(3,Math.min(Y.height-5,Math.floor(ER/2)+2)),u=Math.max(g+3,Y.height-3),S=w.textDissolveProgress,f=this.isFinalIntroStage()?w.backdropDissolveProgress:0,d=this.firstStageTitleVisible&&S<1,c=d&&this.firstStageHintVisible,h=c&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),i=this.introStage===0?this.firstStageTitleRevealProgress:1,r=this.introStage===0?this.firstStageHintRevealProgress:1,s=Math.max(24,Math.min(74,Y.width-4)),I0=Math.min(12,Math.max(8,Y.height-g-6)),X0=Math.max(0,Math.floor((Y.width-s)/2)),U0=Math.max(0,Math.min(Y.height-I0,Math.floor(Y.height*0.55-I0/2))),j0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new vx({width:L,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new vx({width:L,height:O,agentMode:"frontier",visualStyle:"neo",neoGlyphSet:"dotField",backgroundColor:Q.background,primaryColor:$.primary,secondaryColor:$.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new i4({autofocus:!0,canRequestFocus:!0,debugLabel:"NeoWelcomeTakeover",onKey:(B0)=>{if(B0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&B0.key==="c"&&B0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&B0.key==="q")return this.widget.onQuit?.(),"handled";if((B0.key===" "||B0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(B0.key==="Escape"||B0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(B0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(B0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new $A({fit:"expand",children:[new Ls4({color:Q.background,dissolveProgress:f}),new $A({fit:"expand",children:[new k1({onClick:()=>{},child:E0.expand()}),new zA({left:k,top:y,width:L,height:O,child:j0}),...d?[new zA({left:X0,top:U0,width:s,height:I0,child:wm5({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:s,height:I0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:J,link:B.app.link,keybind:B.app.keybind,titleRevealProgress:i,dissolveProgress:S,context:A})})]:[],...c?[...h?[new zA({left:X0,top:Math.max(0,u-1),width:s,height:1,child:new p({text:Rm5({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:S}),textAlign:"center"})})]:[],new zA({left:X0,top:u,width:s,height:1,child:_m5({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:B.app.keybind,revealProgress:r,dissolveProgress:S,context:A})})]:[]]})]})})}}class Ls4 extends U8{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new Os4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class Os4 extends Y4{color;dissolveProgress;constructor(A,Q){super();this.color=A,this.dissolveProgress=Q}update(A,Q){this.color=A,this.dissolveProgress=Q,this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;H4(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,B=0){let $=Math.floor(Q+this.offset.x),J=Math.floor(B+this.offset.y),Y=Math.floor(this.size.width),Z=Math.floor(this.size.height),F={bg:this.color},X=$Z(this.dissolveProgress);if(X<=0){A.fill($,J,Y,Z," ",F);return}if(X>=1)return;for(let D=0;D<Z;D++)for(let G=0;G<Y;G++)if(!Im5(G,D,Y,Z,X))A.fill($+G,J+D,1,1," ",F)}}function $Z(A){return Math.min(1,Math.max(0,A))}function mf(A){return 1-(1-A)**3}function Ws4(A){return zs4[A]??zs4[0]}function Hs4(A,Q,B){return{primary:vj(A.primary,Q.primary,B),secondary:vj(A.secondary,Q.secondary,B)}}function Nm5({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:$Z(A/0.52),backdropDissolveProgress:mf($Z((A-0.12)/0.88))}}function Im5(A,Q,B,$,J){let Y=$<=1?0:Q/($-1),Z=js4(A+Q*Math.max(1,B));return(1-Y)*0.72+Z*0.28<J}function wm5({introStages:A,stage:Q,previousStage:B,progress:$,direction:J,width:Y,height:Z,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E}){if(B===null||$>=1)return Q51({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E});let z=mf($),W=J*Math.round((1-z)*Y),H=-J*Math.round(z*Y);return new mz(new $A({fit:"expand",children:[new zA({left:H,top:0,width:Y,height:Z,child:Q51({introStages:A,stage:B,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:B===0?1:U,dissolveProgress:K,context:E})}),new zA({left:W,top:0,width:Y,height:Z,child:Q51({introStages:A,stage:Q,foreground:F,mutedForeground:X,accent:D,link:G,keybind:V,titleRevealProgress:U,dissolveProgress:K,context:E})})]}))}function Q51({introStages:A,stage:Q,foreground:B,mutedForeground:$,accent:J,link:Y,keybind:Z,titleRevealProgress:F,dissolveProgress:X,context:D}){let G=A[Q]??A[0]??$51[0],V=new v({color:J,bold:!0}),U=new v({color:B}),K=A===$51&&Q===0,E=[...G.title===null?[]:[new p({text:K?wV0(Lm5({progress:F,foreground:J,pulseColor:J}),X):new C(G$(G.title,X),V),textAlign:"center"})],...G.body.length>0?[Cm5()]:[],...G.body.map((z)=>Mm5(z,U,$,Y,Z,X,D))];return new t1({child:new x0({padding:K0.horizontal(1),child:new y0({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:E})})})}function Cm5(){return E0.height(1)}function Mm5(A,Q,B,$,J,Y,Z){if(typeof A==="string")return new p({text:new C(G$(A,Y),Q),textAlign:"center"});if("codeBlock"in A)return new D3({onCopy:(F,X)=>{if(X)m5.success(Z,"Copied to clipboard",2000)},child:new y0({mainAxisSize:"min",children:A.codeBlock.map((F)=>new p({text:new C(G$(F,Y),new v({color:J})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let F=new p({text:new C("",void 0,[new C(G$(A.text,Y),new v({color:B,dim:!0})),new C(G$(A.keybind,Y,C4(A.text).length),new v({color:J}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new t1({child:new D3({child:F})});return F}if("highlightText"in A){let F=DA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=sD.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(A.highlightText,new v({color:J})),new C(A.textAfterHighlight,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{aA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:wV0(D,Y),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new y0({mainAxisSize:"min",children:[new p({text:new C(G$(A.text,Y),Q),textAlign:"center"}),new t1({child:new s0({mainAxisSize:"min",children:[DA.createWidget(Z,A.href,G$(A.linkText,Y),new v({color:$,underline:!0})),new p({text:new C(G$(A.textAfter,Y),Q)})]})})]});let F=DA.createSpan(A.href,A.linkText,new v({color:$,underline:!0})),X=sD.of(Z),D=new C("",void 0,[new C(A.text,Q),new C(F.text,F.style,F.children,F.hyperlink,()=>{aA(Z,A.href,{forceExternal:!1,onShowImagePreview:X})}),new C(A.textAfter,Q)]);return new p({text:wV0(D,Y),textAlign:"center"})}if(Y>0)return new p({text:new C(G$(A.text,Y),new v({color:$,underline:!0})),textAlign:"center"});return new t1({child:DA.createWidget(Z,A.href,A.text,new v({color:$,underline:!0}))})}function Lm5({progress:A,foreground:Q,pulseColor:B}){let $=new v({color:Q,bold:!0}),J=new v({color:jm5({progress:A,foreground:Q,pulseColor:B}),bold:!0});return new C("",void 0,[new C(Om5(A).padEnd(J51," "),$),new C(" ",$),new C(qs4(ws4,Wm5,A,0.72),$),new C(" ",$),new C(qs4(Cs4,Hm5,A,0.88),J)])}function Om5(A){let Q=C4(Is4),B=Math.min(J51,Math.ceil($Z(A/0.62)*J51));return Q.slice(0,B).join("")}function qs4(A,Q,B,$){return B>=$?A:"".padEnd(Q," ")}function jm5({progress:A,foreground:Q,pulseColor:B}){if(A<0.88||A>=1)return Q;let $=$Z((A-0.88)/0.12);return Math.cos($*Math.PI*4)*(1-$)>0.12?B:Q}function Rm5({stage:A,featureStageCount:Q,foreground:B,dissolveProgress:$}){return new C(G$(`${A}/${Q}`,$),new v({color:B,dim:!0}))}function Pm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}){let Z=new v({color:$}),F=new v({color:B,dim:!0}),X=Q?A?"Enter":"Space":"Esc",D=Q?A?" to get started":" to continue":" to quit, or use ",G=Q?"":"amp --take-me-back",V=Q?"":" to use the old version",U=`${D}${G}${V}`;if(!Q)return new C("",void 0,[new C(X,Z),new C(D,F),new C(G,Z),new C(V,F)]);let K=Ns4(X,J),E=Ns4(U,$Z((J*(C4(X).length+C4(U).length)-C4(X).length)/C4(U).length));return new C("",void 0,[new C(G$(K,Y),Z),new C(G$(E.slice(0,D.length),Y),F),new C(G$(E.slice(D.length,D.length+G.length),Y),Z),new C(G$(E.slice(D.length+G.length),Y),F)])}function _m5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y,context:Z}){if(Q)return new p({text:Pm5({finalStage:A,dismissible:Q,foreground:B,keybind:$,revealProgress:J,dissolveProgress:Y}),textAlign:"center"});let F=new v({color:$}),X=new v({color:B,dim:!0});return new D3({onCopy:(D,G)=>{if(G)m5.success(Z,"Copied to clipboard",2000)},child:new p({text:new C("",void 0,[new C("q",F),new C(" to quit, or use ",X),new C("amp --take-me-back",F),new C(" to use the old version",X)]),textAlign:"center",selectable:!0})})}function Ns4(A,Q){let B=C4(A),$=Math.min(B.length,Math.ceil($Z(Q)*B.length));return B.slice(0,$).join("").padEnd(B.length," ")}function wV0(A,Q,B=0){if(Q<=0)return A;let $=B+C4(A.text??"").length,J=A.children?.map((Y)=>{let Z=wV0(Y,Q,$);return $+=C4(Y.toPlainText()).length,Z});return new C(A.text?G$(A.text,Q,B):A.text,A.style,J,A.hyperlink,A.onClick)}function G$(A,Q,B=0){if(Q<=0)return A;return C4(A).map((J,Y)=>{if(J.trim()==="")return J;return js4(B+Y)<Q?" ":J}).join("")}function js4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}d0();A2();function iI(A,Q){let{colors:B,dim:$}=Q,J=[];if(A.totalCostUSD===null)return J;let Y=A.costBreakdown,Z=Y?.freeUSD??0,F=Y?.paidUSD??0;if(Z===0&&F===0)return J;let D={decimalPlaces:"more-if-tiny",intent:"cost"};if(F===0)J.push(new C(aU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new C(" (free)",new v({color:B.foreground,dim:$})));else if(Z>0)J.push(new C(aU(Z,D),new v({color:B.foreground,dim:$}))),J.push(new C(" (free)",new v({color:B.foreground,dim:$}))),J.push(new C(" + ",new v({color:B.foreground,dim:$}))),J.push(new C(aU(F,D),new v({color:B.foreground,dim:$,bold:!$})));else J.push(new C(aU(F,D),new v({color:B.foreground,dim:$,bold:!$})));return J}class Z51 extends L4{}class F51 extends L4{}function Tm5(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 km5(A,Q){let B=P0.of(Q),{colors:$}=B,J=iI(A,{colors:{foreground:$.foreground}}),Y=[];if(J.length>0)Y.push(new C("Total: ",new v({color:$.mutedForeground}))),Y.push(...J);else if(A.totalCostUSD===null)Y.push(new C("Usage information is currently unavailable."));else Y.push(new C("No usage recorded for this thread yet."));if(A.costBreakdownURL)Y.push(new C(`
5924
5924
 
5925
- `)),Y.push(new C("Details: ",new v({color:$.mutedForeground}))),Y.push(new C(A.costBreakdownURL,new v({color:B.app.link})));return new p({text:new C("",void 0,Y)})}function Sm5(A,Q,B){let $=km5(A,Q);if(!A.costBreakdownURL)return new CA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new p1(()=>{return l4.maybeInvoke(Q,new c9(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new p1(()=>{return aA(Q,J),"handled"});return new CA({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 l4({actions:new Map([[Z51,Y],[F51,Z]]),child:new Y5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[M1.key("o"),new F51],[M1.key("y"),new Z51]]),child:new p4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Rs4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["usage","credits","billing","spend"],get status(){return A.getActiveThreadID()?{type:"enabled"}:{type:"disabled",reason:"No active thread"}},run:async(Q,B,$)=>{let J=A.getActiveThreadID();if(!J)return;try{let Y=await r4.threadDisplayCostInfo({threadID:J},{config:A.configService});if(!Y.ok){A.toastController.show(Tm5(J,Y.error),"error",5000),$();return}Q.push(Sm5(Y.result,B,$))}catch(Y){j.error("Failed to load Neo thread cost",{error:Y,threadID:J}),A.toastController.show(`Failed to show thread cost: ${Y instanceof Error?Y.message:String(Y)}`,"error",5000),$()}}}}class X51 extends T0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;workspaceSettingsFilePath;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.neoContext=A.neoContext}createState(){return new Ts4}}class Ts4 extends _0{editorController=new _8;commandPalette=new j01(this);commandRegistry=new KA1;toastController=new k01;exitHintTimer=new Ur(this,1000);ideStatus=new K2(this,{});threadNavigationHistory=new XA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;mcpTrustIntegration=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>mG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Gc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Vc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};removeThreadLabel=async(A,Q)=>{let B=await Uc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if($$.getInstance().interceptConsole(),this.notices=new n41(this.widget.configService,(Q)=>this.setState(Q)),this.notices.startPolling(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(x30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new ZA1({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread}),this.pluginIntegration.init(),this.mcpTrustIntegration=new i41({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=q4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Hn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>Q61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:Z}))}},{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(J,Y,Z)=>{A.navigateBack(),Z()}},Rs4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(J,Y,Z)=>{A.navigateForward(),Z()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new OA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:Z}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(J)=>{J.pushWithDismiss((Y)=>new e61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await aA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{JB(this.widget.neoContext.settingsFilePath).catch((J)=>{j.error("Failed to open settings file in editor",{error:J})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains","editor","attach"],status:{type:"enabled"},run:(J,Y,Z)=>{J.pushWithDismiss((F)=>new MA1({onCancel:F,onSelect:(X)=>{this.handleIdeSelection(X),Z()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new qA1({commands:K9.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 CA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(GD0({version:"0.0.1778871988-gfebe7f",buildTimestamp:"2026-05-15T19:10:43.549Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:M1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{l4.maybeInvoke(Y,new Mf)}},...Q,...An4(this.widget.neoContext.logFilePath)].map((J)=>this.commandRegistry.register(J));return()=>{for(let J of $)J()}}build(A){let Q=this.buildHints(),B=this.ideStatus.getValue(),$=this.notices.current,J=new t61({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(G)=>this.notices.dismiss(G)}),Y=a1.of(A),Z=Y.capabilities.animationSupport!=="disabled",X=[new g0({constraints:I1.tight(Y.size.width,Y.size.height),child:J})];if(this.commandPalette.isEnabled())X.push(new i4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new EA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)X.push(Q61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)X.push(new i4({debugLabel:"NeoWelcomeDialogOverlay",child:new Y51({onDismiss:this.dismissNeoWelcome,onQuit:()=>q4.instance.stop(),animationsEnabled:Z,variant:this.widget.neoWelcomeVariant})}));let D=this.executorAlreadyConnectedDialog;if(D)X.push(new i4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new wA1({existingExecutorPid:D.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(X.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),X.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)X.push(new IA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ps4.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)X.push(new CA1);if($&&this.activeThreadContext&&!this.neoWelcomeVisible)X.push(Jn4($,()=>this.notices.dismiss($.key)));return new A8({neoContext:this.widget.neoContext,child:new K9({commandRegistry:this.commandRegistry,child:new jf({completionBuilder:this.widget.completionBuilder,child:new m5({controller:this.toastController,child:new l4({actions:this.buildActions(),child:new Y5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[M1.ctrl("c"),new jG0],[M1.ctrl("o"),new RG0],[M1.alt("i"),new _G0],[M1.alt("p"),new wI],[M1.ctrl("."),new kG0],[M1.ctrl("t"),new yG0]]),child:new p4({debugLabel:"AppShellFocus",child:new S01({controller:this.toastController,child:new NA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new $A({children:X})})})})})})})})})})}buildActions(){let A=new p1(()=>{if(LJ.hasAnyCopyableSelection())return LJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new p1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new p1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new p1(()=>{return this.startNewDraftThread(),"handled"}),J=new p1(()=>{return q4.instance.stop(),"handled"}),Y=new p1((V)=>{if(!V.text)return"ignored";return q4.instance.tuiInstance.clipboard.writeText(V.text).then((U)=>{if(U.ok)this.toastController.show(V.successMessage,"success",2000);else this.toastController.show(`${V.failureMessage}: ${U.userFacingErrorMessage}`,"error",4000)}).catch((U)=>{j.error("Failed to copy Neo text to clipboard",{error:U}),this.toastController.show(V.failureMessage,"error",2000)}),"handled"}),Z=new p1(()=>{return q4.instance.toggleFrameStatsOverlay(),"handled"}),F=new p1(()=>this.notices.dismissCurrent()?"handled":"ignored"),X=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),D=vn4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),G=new p1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[jG0,A],[Zs,$],[Mf,J],[c9,Y],[Ds,B],[RG0,Q],[_G0,X],[kG0,F],...D,[wI,Z],[yG0,G]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),A.prompt!==void 0)this.editorController.text=A.prompt}closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await gx(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,$=J$(Q),J=eX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return tX0(B,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=_s4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(pZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=_s4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(bI);if(this.exitHintTimer.isActive())A.add(qf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),q4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:(B)=>{Q(B==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")q4.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,B=null,$)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),Y=A.find(R30);if(Y)this.widget.history.add(Y.text,Ps4.cwd()),this.widget.history.reset();let Z=B?void 0:await this.widget.getDefaultNewThreadVisibility?.(),F=B??Z??null,X=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,F??void 0);this.sendUserMessage(X,A,Q,$),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(X)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let B=Q["reasoning.effort"];if(B!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:B};let $=J$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};$B((Y)=>{let Z={...Y,agentMode:A};if(B!==void 0)Z={...Z,lastReasoningEffortByMode:{...Z.lastReasoningEffortByMode??{},[A]:B}};if(J!==void 0)Z={...Z,lastSpeedByMode:{...Z.lastSpeedByMode??{},[A]:J}};return Z}).catch((Y)=>{j.warn("Failed to persist Neo session defaults for new message",{error:Y instanceof Error?Y.message:String(Y)})})}sendUserMessage(A,Q,B,$){let J=_Y0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(J)=>this.promptExecutorAlreadyConnected(J)});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function _s4(A,Q,B){let $={...A};for(let J of vm5(Q,B)){if(!pZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function vm5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function ks4(A,Q,B,$){let J=tT(A),Y="\x1B[0m",Z="\x1B[34m",F="\x1B[90m",X="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new rY(G,V),K=new h9(42),E=new WI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,z0.default(),K);E.layout(I1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let P=0;P<V;P++)if(z[P].some((T)=>T.char!==" ")){W=P;break}let H=V-1;for(let P=V-1;P>=0;P--)if(z[P].some((T)=>T.char!==" ")){H=P;break}function q(P,T){if(!P)return"";if(P.type==="rgb"){let{r:k,g:y,b:g}=P.value;if(B.getColorDepth()>=24)return`\x1B[${T?38:48};2;${k};${y};${g}m`;let u=Tj(k,y,g);return`\x1B[${T?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let P=W;P<=H;P++){let T="";for(let k=0;k<G;k++){let y=z[P][k],g=y.char,u=q(y.style.fg,!0);T+=u+g+"\x1B[0m"}N.push(T)}let I=N.length,w=Math.max(I,D.length),L=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let P=0;P<w;P++){let T=" ".repeat(G);if(P>=L&&P<L+I)T=N[P-L];let k=" ",y="";if(P>=O&&P<O+D.length)y=D[P-O];B.write(T+k+y+`
5925
+ `)),Y.push(new C("Details: ",new v({color:$.mutedForeground}))),Y.push(new C(A.costBreakdownURL,new v({color:B.app.link})));return new p({text:new C("",void 0,Y)})}function Sm5(A,Q,B){let $=km5(A,Q);if(!A.costBreakdownURL)return new CA({header:"Thread Cost",minWidth:80,maxWidth:100,onDismiss:B,child:$});let J=A.costBreakdownURL,Y=new p1(()=>{return l4.maybeInvoke(Q,new c9(J,"Cost breakdown URL copied to clipboard","Failed to copy cost breakdown URL")),"handled"}),Z=new p1(()=>{return aA(Q,J),"handled"});return new CA({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 l4({actions:new Map([[Z51,Y],[F51,Z]]),child:new Y5({debugLabel:"ThreadCostShortcuts",shortcuts:new Map([[M1.key("o"),new F51],[M1.key("y"),new Z51]]),child:new p4({autofocus:!0,debugLabel:"ThreadCostBody",child:$})})})})}function Rs4(A){return{noun:"thread",verb:"show cost",description:"Show usage cost for the active thread",keywords:["usage","credits","billing","spend"],get status(){return A.getActiveThreadID()?{type:"enabled"}:{type:"disabled",reason:"No active thread"}},run:async(Q,B,$)=>{let J=A.getActiveThreadID();if(!J)return;try{let Y=await r4.threadDisplayCostInfo({threadID:J},{config:A.configService});if(!Y.ok){A.toastController.show(Tm5(J,Y.error),"error",5000),$();return}Q.push(Sm5(Y.result,B,$))}catch(Y){j.error("Failed to load Neo thread cost",{error:Y,threadID:J}),A.toastController.show(`Failed to show thread cost: ${Y instanceof Error?Y.message:String(Y)}`,"error",5000),$()}}}}class X51 extends T0{analyzeContextForThread;listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;initialThreadID;showNeoWelcome;neoWelcomeVariant;onNeoWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;initialUserInput;getDefaultNewThreadVisibility;openThreadPickerOnStart;workspaceSettingsFilePath;neoContext;constructor(A){super();this.analyzeContextForThread=A.analyzeContextForThread,this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.initialThreadID=A.initialThreadID,this.showNeoWelcome=A.showNeoWelcome??!1,this.neoWelcomeVariant=A.neoWelcomeVariant??"intro",this.onNeoWelcomeDismissed=A.onNeoWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.neoContext=A.neoContext}createState(){return new Ts4}}class Ts4 extends _0{editorController=new _8;commandPalette=new j01(this);commandRegistry=new KA1;toastController=new k01;exitHintTimer=new Ur(this,1000);ideStatus=new K2(this,{});threadNavigationHistory=new XA1;draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;neoWelcomeVisible=!1;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;pluginIntegration=null;mcpTrustIntegration=null;notices;loadThreads=async()=>{return this.widget.neoContext.listThreads()};onSwitchThread=(A)=>{this.connectToExistingThread(A,{recordNavigation:!0})};sendFeedbackReport=async(A)=>mG0({configService:this.widget.configService,settingsFilePath:this.widget.neoContext.settingsFilePath},A);archiveThread=async(A)=>{let Q=await Gc4({configService:this.widget.configService},A);if(Q===null)this.widget.onThreadArchived?.(A);return Q};addThreadLabel=async(A,Q)=>{let B=await Vc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};removeThreadLabel=async(A,Q)=>{let B=await Uc4({configService:this.widget.configService},A,Q);if(B instanceof Error)return B;return this.toastController.show(B.message,B.type,2000),null};initState(){if($$.getInstance().interceptConsole(),this.notices=new n41(this.widget.configService,(Q)=>this.setState(Q)),this.notices.startPolling(),this.widget.showNeoWelcome)this.neoWelcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:Q,error:B})=>{if(j.error("Neo failed to connect to thread",{threadID:Q,error:B}),!Q)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe((Q)=>{this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(x30(Q.settings)))}),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput;if(this.widget.initialThreadID){let Q={};if(A)Q.initialUserInput=A;this.connectToExistingThread(this.widget.initialThreadID,Q)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.neoContext.sessionAgentMode);this.pluginIntegration=new ZA1({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,neoContext:this.widget.neoContext,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread}),this.pluginIntegration.init(),this.mcpTrustIntegration=new i41({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=q4.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}registerAppCommands(){let A=this,Q=this.widget.neoContext.pluginService?Hn4({pluginService:this.widget.neoContext.pluginService,workspaceRoot:this.widget.neoContext.workspaceRoot,logFilePath:this.widget.neoContext.logFilePath,toastController:this.toastController}):[],$=[{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["recent","history","open","resume","change"],status:{type:"enabled"},sortBoost:100,run:(J,Y,Z)=>{J.pushWithDismiss((F)=>Q61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:F,onThreadSelected:Z}))}},{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],get status(){return A.threadNavigationHistory.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},run:(J,Y,Z)=>{A.navigateBack(),Z()}},Rs4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],get status(){return A.threadNavigationHistory.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},run:(J,Y,Z)=>{A.navigateForward(),Z()}},{noun:"mcp",verb:"info",description:"Show MCP servers and tools",keywords:["servers","tools","plugins","integrations"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new OA1({mcpServers:this.widget.neoContext.mcpServers,onDismiss:Z}))}},{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",keywords:["tools","toolbox"],status:{type:"enabled"},run:(J)=>{J.pushWithDismiss((Y)=>new e61({toolboxes:this.widget.neoContext.toolboxes,onDismiss:Y}))}},{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","updates","blog","announcements"],status:{type:"enabled"},run:async(J,Y,Z)=>{try{await aA(Y,"https://ampcode.com/chronicle")}finally{Z()}}},{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config","preferences","edit"],status:{type:"enabled"},run:()=>{JB(this.widget.neoContext.settingsFilePath).catch((J)=>{j.error("Failed to open settings file in editor",{error:J})})}},{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains","editor","attach"],status:{type:"enabled"},run:(J,Y,Z)=>{J.pushWithDismiss((F)=>new MA1({onCancel:F,onSelect:(X)=>{this.handleIdeSelection(X),Z()}}))}},{noun:"amp",verb:"help",description:"Show help & keyboard shortcuts",keywords:["shortcuts","keybindings","docs","manual","?"],status:{type:"enabled"},run:(J,Y,Z)=>{J.push(new qA1({commands:K9.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 CA({header:"Amp Version",maxWidth:72,onDismiss:Z,child:new p({text:new C(GD0({version:"0.0.1778876600-gb6c4d8",buildTimestamp:"2026-05-15T20:27:13.265Z",buildType:"release"}))})}))}},{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","leave","bye"],shortcut:M1.ctrl("c"),status:{type:"enabled"},run:(J,Y)=>{l4.maybeInvoke(Y,new Mf)}},...Q,...An4(this.widget.neoContext.logFilePath)].map((J)=>this.commandRegistry.register(J));return()=>{for(let J of $)J()}}build(A){let Q=this.buildHints(),B=this.ideStatus.getValue(),$=this.notices.current,J=new t61({initialAgentMode:this.widget.neoContext.sessionAgentMode,analyzeContextForThread:this.widget.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:B,statusItems:this.pluginIntegration?.getStatusItems()??[],notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.neoWelcomeVisible?null:$,onDismissNotice:(G)=>this.notices.dismiss(G)}),Y=a1.of(A),Z=Y.capabilities.animationSupport!=="disabled",X=[new g0({constraints:I1.tight(Y.size.width,Y.size.height),child:J})];if(this.commandPalette.isEnabled())X.push(new i4({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new EA1({onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.neoWelcomeVisible)X.push(Q61({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.neoWelcomeVisible)X.push(new i4({debugLabel:"NeoWelcomeDialogOverlay",child:new Y51({onDismiss:this.dismissNeoWelcome,onQuit:()=>q4.instance.stop(),animationsEnabled:Z,variant:this.widget.neoWelcomeVariant})}));let D=this.executorAlreadyConnectedDialog;if(D)X.push(new i4({debugLabel:"NeoExecutorAlreadyConnectedDialogOverlay",child:new wA1({existingExecutorPid:D.existingExecutorPid,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(X.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),X.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.neoContext.isInternalUser)X.push(new IA1({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:Ps4.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,connectionInfo$:this.activeThreadContext?.observer.connectionInfo()??null}));if(this.focusDebugVisible)X.push(new CA1);if($&&this.activeThreadContext&&!this.neoWelcomeVisible)X.push(Jn4($,()=>this.notices.dismiss($.key)));return new A8({neoContext:this.widget.neoContext,child:new K9({commandRegistry:this.commandRegistry,child:new jf({completionBuilder:this.widget.completionBuilder,child:new m5({controller:this.toastController,child:new l4({actions:this.buildActions(),child:new Y5({debugLabel:"NeoAppShortcuts",shortcuts:new Map([[M1.ctrl("c"),new jG0],[M1.ctrl("o"),new RG0],[M1.alt("i"),new _G0],[M1.alt("p"),new wI],[M1.ctrl("."),new kG0],[M1.ctrl("t"),new yG0]]),child:new p4({debugLabel:"AppShellFocus",child:new S01({controller:this.toastController,child:new NA1({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new $A({children:X})})})})})})})})})})}buildActions(){let A=new p1(()=>{if(LJ.hasAnyCopyableSelection())return LJ.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new p1(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),B=new p1(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),$=new p1(()=>{return this.startNewDraftThread(),"handled"}),J=new p1(()=>{return q4.instance.stop(),"handled"}),Y=new p1((V)=>{if(!V.text)return"ignored";return q4.instance.tuiInstance.clipboard.writeText(V.text).then((U)=>{if(U.ok)this.toastController.show(V.successMessage,"success",2000);else this.toastController.show(`${V.failureMessage}: ${U.userFacingErrorMessage}`,"error",4000)}).catch((U)=>{j.error("Failed to copy Neo text to clipboard",{error:U}),this.toastController.show(V.failureMessage,"error",2000)}),"handled"}),Z=new p1(()=>{return q4.instance.toggleFrameStatsOverlay(),"handled"}),F=new p1(()=>this.notices.dismissCurrent()?"handled":"ignored"),X=new p1(()=>{if(!this.widget.neoContext.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),D=vn4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,neoContext:this.widget.neoContext,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),G=new p1(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[jG0,A],[Zs,$],[Mf,J],[c9,Y],[Ds,B],[RG0,Q],[_G0,X],[kG0,F],...D,[wI,Z],[yG0,G]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),A.prompt!==void 0)this.editorController.text=A.prompt}closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await gx(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,$=J$(Q),J=eX0(this.widget.neoContext,Q);if($!==void 0&&J!==void 0)B={...B,[$]:J};return tX0(B,{agentMode:Q,explicitEffort:this.widget.neoContext.explicitReasoningEffort,sessionState:this.widget.neoContext})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=_s4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(pZ(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=_s4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(bI);if(this.exitHintTimer.isActive())A.add(qf);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),q4.instance.stop();else this.exitHintTimer.activate()};dismissNeoWelcome=()=>{if(!this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!1}),this.widget.onNeoWelcomeDismissed?.()};showNeoWelcome=()=>{if(this.neoWelcomeVisible)return;this.setState(()=>{this.neoWelcomeVisible=!0})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={existingExecutorPid:A.existingExecutorPid,resolve:(B)=>{Q(B==="watch"?"observe":"disconnect")}}})})}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")q4.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1})};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,B=null,$)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),Y=A.find(R30);if(Y)this.widget.history.add(Y.text,Ps4.cwd()),this.widget.history.reset();let Z=B?void 0:await this.widget.getDefaultNewThreadVisibility?.(),F=B??Z??null,X=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,F??void 0);this.sendUserMessage(X,A,Q,$),this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings),this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(X)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.neoContext.sessionAgentMode=A;let B=Q["reasoning.effort"];if(B!==void 0)this.widget.neoContext.lastReasoningEffortByMode={...this.widget.neoContext.lastReasoningEffortByMode??{},[A]:B};let $=J$(A),J=$?Q[$]:void 0;if(J!==void 0)this.widget.neoContext.lastSpeedByMode={...this.widget.neoContext.lastSpeedByMode??{},[A]:J};$B((Y)=>{let Z={...Y,agentMode:A};if(B!==void 0)Z={...Z,lastReasoningEffortByMode:{...Z.lastReasoningEffortByMode??{},[A]:B}};if(J!==void 0)Z={...Z,lastSpeedByMode:{...Z.lastSpeedByMode??{},[A]:J}};return Z}).catch((Y)=>{j.warn("Failed to persist Neo session defaults for new message",{error:Y instanceof Error?Y.message:String(Y)})})}sendUserMessage(A,Q,B,$){let J=_Y0(this.ideStatus.getValue());if($===void 0){A.client.sendUserMessage(Q,B,{userState:J});return}A.client.sendUserMessage(Q,B,{reasoningEffort:$,userState:J})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};appendPluginMessagesToThread=async(A,Q)=>{let B=this.activeThreadContext;if(!B)throw Error("appendToThread is not available - no active thread");let $=B.client.getThreadId();if(Q&&$!==Q)throw Error("thread.append is only available for the active executor thread");for(let J of A)this.sendUserMessage(B,[{type:"text",text:J.content}])};async connectToExistingThread(A,Q={}){let B=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let $=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.neoContext.observerOnly,onExecutorAlreadyConnected:(J)=>this.promptExecutorAlreadyConnected(J)});if(this.setActiveClient($),Q.recordNavigation&&B!==A)this.threadNavigationHistory.recordNavigation(B);if(Q.initialUserInput)this.sendUserMessage($,[{type:"text",text:Q.initialUserInput}])}catch($){if(j.error("Failed to load thread",{error:$,threadID:A}),this.toastController.show(`Failed to load ${A}: ${$ instanceof Error?$.message:String($)}`,"error",4000),Q.rethrowError)throw $}finally{this.setState(()=>{this.connectingToThreadID=null})}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q}}),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){j.error("Failed to connect to IDE",{error:Q});let B=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${B}`,"error",4000)}};dispose(){this.unregisterCommands?.(),this.unregisterCommands=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.neoWelcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function _s4(A,Q,B){let $={...A};for(let J of vm5(Q,B)){if(!pZ(A[J],Q[J]))continue;let Y=B[J];if(Y===void 0)delete $[J];else $[J]=Y}return $}function vm5(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}c4();function ks4(A,Q,B,$){let J=tT(A),Y="\x1B[0m",Z="\x1B[34m",F="\x1B[90m",X="\x1B[2m",D=[];if(A.archived)D.push("\x1B[90m\x1B[2mArchived\x1B[0m");D.push(`${J}`),D.push(`\x1B[34m${Q}\x1B[0m`),D.push(`\x1B[90mamp threads continue ${A.id}\x1B[0m`);let G=14,V=7,U=new rY(G,V),K=new h9(42),E=new WI(G,V,G,V,G,V,0,A.agentMode??"smart","intensity","classic","braille",void 0,void 0,z0.default(),K);E.layout(I1.tight(G,V)),E.paint(U,0,0);let z=U.getBuffer().getCells(),W=0;for(let P=0;P<V;P++)if(z[P].some((T)=>T.char!==" ")){W=P;break}let H=V-1;for(let P=V-1;P>=0;P--)if(z[P].some((T)=>T.char!==" ")){H=P;break}function q(P,T){if(!P)return"";if(P.type==="rgb"){let{r:k,g:y,b:g}=P.value;if(B.getColorDepth()>=24)return`\x1B[${T?38:48};2;${k};${y};${g}m`;let u=Tj(k,y,g);return`\x1B[${T?38:48};5;${u}m`}return""}let N=[];if(H>=W)for(let P=W;P<=H;P++){let T="";for(let k=0;k<G;k++){let y=z[P][k],g=y.char,u=q(y.style.fg,!0);T+=u+g+"\x1B[0m"}N.push(T)}let I=N.length,w=Math.max(I,D.length),L=Math.floor((w-I)/2),O=Math.floor((w-D.length)/2);for(let P=0;P<w;P++){let T=" ".repeat(G);if(P>=L&&P<L+I)T=N[P-L];let k=" ",y="";if(P>=O&&P<O+D.length)y=D[P-O];B.write(T+k+y+`
5926
5926
  `)}if($)B.write(`
5927
5927
  \x1B[90m${$}\x1B[0m
5928
5928
  `)}d0();FD0();var ym5=2000,xm5="Agent is ready",fm5="Waiting for approval";function Ss4(A){let Q=!0,B=!0,$=A.configService.config.subscribe((z)=>{Q=z.settings["notifications.enabled"]??!0,B=z.settings["notifications.system.enabled"]!==!1}),J=0,Y=(z)=>{if(!Q)return;let W=Date.now();if(W-J<ym5)return;if(J=W,bj())return;if(YX0())ZX0();else zZ0(z)},Z=(z)=>{if(!Q||!B)return;if(bj()&&!Jr()&&!Tx())return;process.stdout.write(uD(`\x1B]777;notify;Amp;${z}\x1B\\`))},F=()=>{Y("idle"),Z(xm5)},X=()=>{Y("requires-user-input"),Z(fm5)},D=(z)=>z?.attempt===void 0||z.attempt===0,G=null,V=null,U=null,K=()=>{G?.unsubscribe(),V?.unsubscribe(),G=null,V=null,U=null};return{attach:(z,W)=>{if(K(),W)V=W.subscribe({next:(H)=>{if(H===null)return;if(!D(H))return;F()},error:(H)=>{j.debug("Neo notification active error stream errored",{error:H})}});G=z.subscribe({next:(H)=>{try{let q=U!==null&&oQ(U),N=U==="awaiting_approval",I=q||N;if(H==="awaiting_approval"&&!N)X();else if(H==="idle"&&I)F()}catch(q){j.debug("Neo notification handling failed",{error:q})}finally{U=H}},error:(H)=>{j.debug("Neo notification agent state stream errored",{error:H})}})},detach:K,unsubscribe(){K(),$.unsubscribe()}}}function bm5({initialUserInput:A,showNeoWelcome:Q,hideNeoWelcome:B,neoWelcomeVariant:$,neoWelcomeDismissed:J}){if(B)return{show:!1,markDismissedOnDismiss:!1};if($==="npm-migration")return{show:!0,markDismissedOnDismiss:!1};if(Q)return{show:!0,markDismissedOnDismiss:!0};let Y=!A&&!J;return{show:Y,markDismissedOnDismiss:Y}}async function um5(A){await $B((Q)=>mx(Q,A,"interactive"))}async function vs4(A,Q={}){let{initialThreadID:B,initialUserInput:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:Y=!1,observerOnly:Z=!1,initialAgentMode:F,initialReasoningEffort:X,showNeoWelcome:D=!1,hideNeoWelcome:G=!1,neoWelcomeVariant:V="intro"}=Q,U=V==="npm-migration",K=async(T)=>{let k=await A.getThreadFromServer(T);if(!k)return null;return cF0(k)},E=async(T)=>{let k=await A.getThreadFromServer(T);if(!k)throw Error(`Thread ${T} not found`);let y=await x9(T,A.configService,A.apiKey,{usesThreadActors:!0}),S=await MU({endpoint:A.rivetEndpoint,poolName:y.poolName}).threadActor.getOrCreate([T],{params:{wsToken:y.wsToken},createWithInput:{threadId:y.threadId,threadVersion:y.threadVersion,ownerUserId:y.ownerUserId,...y.agentMode?{agentMode:y.agentMode}:{}}}).fetch("/import",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({thread:gx4(k)}),skipReadyWait:!0});if(!S.ok&&S.status!==409)throw Error(`Thread import failed (${S.status}): ${await S.text()}`);try{await Kv4(T,A.configService,A.apiKey,{executorType:"local-client"})}catch(f){j.warn("failed to mark thread as imported on server",{threadID:T,error:f instanceof Error?f.message:String(f)})}},z=new $01(A.rivetEndpoint,A.apiKey,A.configService,{clientID:AI.parse(`neo-${crypto.randomUUID()}`),toolService:A.toolService,skillService:A.skillService,requestPluginToolCall:(T)=>A.pluginService.event.toolCall(T),requestPluginToolResult:(T)=>A.pluginService.event.toolResult(T),pluginService:A.pluginService,invokeTool:async(T,k)=>{let y=typeof k.args==="object"&&k.args!==null?k.args:{},g=await JI({toolName:k.toolName,configService:A.configService,toolService:A.toolService,mcpService:A.mcpService,skillService:A.skillService,toolUseID:k.toolCallId,threadId:T});return A.toolService.invokeTool(k.toolName,{args:y},g)},persistLastThreadID:um5,readFileSystemDirectory:A.readFileSystemDirectory},K,E),W=await gz(),H=bm5({initialUserInput:$,showNeoWelcome:D,hideNeoWelcome:G,neoWelcomeVariant:V,neoWelcomeDismissed:W.neoWelcomeDismissed}),q={ampURL:A.ampURL,configService:A.configService,getThreadMarkdown:async(T)=>{let k=await A.getThreadFromServer(T);return k?kV(k):null},isInternalUser:A.isInternalUser,listThreads:A.listThreads,logFilePath:na,mcpServers:A.mcpService.servers,pluginPlatform:A.pluginPlatform,pluginService:A.pluginService,toolboxes:A.toolboxes,observerOnly:U?!1:Z,sessionAgentMode:F??W.agentMode,explicitReasoningEffort:X,lastReasoningEffortByMode:W.lastReasoningEffortByMode,lastSpeedByMode:W.lastSpeedByMode,settingsFilePath:A.settingsFilePath,splashOrbVisualStyle:Q.splashOrbVisualStyle??"neo",workspaceRoot:A.workspaceRoot},N=(T,k)=>{return Jx({ampURL:A.ampURL,configService:A.configService,threadID:T,signal:k})},I=(T,k)=>{return Gg4({ampURL:A.ampURL,configService:A.configService,threadID:T,signal:k})},w=new M01,L=Ss4({configService:A.configService}),O=await A.configService.getLatest();q4.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:O.settings["terminal.animation"]===!1}});let P=new Set;try{await Yr(new X51({clientPool:z,analyzeContextForThread:N,listSkillsForThread:I,completionBuilder:A.completionBuilder,history:new Ko,ideManager:w,configService:A.configService,initialThreadID:U?void 0:B,notificationService:L,mcpTrustHandler:A.mcpTrustHandler,initialUserInput:U?void 0:$,getDefaultNewThreadVisibility:J,openThreadPickerOnStart:U?!1:Y,workspaceSettingsFilePath:A.workspaceSettingsFilePath,neoContext:q,showNeoWelcome:H.show,neoWelcomeVariant:V,onActiveThreadChange:A.setActiveThreadID,onNeoWelcomeDismissed:H.markDismissedOnDismiss?()=>{$B(Eg4).catch((k)=>{j.warn("Failed to mark Neo welcome as dismissed",{error:k})})}:void 0,onThreadArchived:(k)=>{P.add(k)}}));let T=z.lastActiveObservingClient;if(T){let{client:k,observer:y}=T,g=k.getThreadId();if(g){let u={id:g,title:y.title().getValue(),agentMode:y.agentMode,archived:P.has(g)},S=`${A.ampURL.replace(/\/$/,"")}/threads/${g}`;ks4(u,S,process.stdout)}}}finally{process.stdout.write(KI("")),L.unsubscribe(),z.dispose(),await A.dispose?.()}process.exit(0)}Y3();function pf(A){let Q=[],B={meta:{visibility:"private",sharedGroupIDs:[]}};if(A.workspace?.disablePrivateThreads)B.disabledReason="Disabled by workspace policy";if(Q.push(B),A.workspace?.groups&&A.workspace.groups.length>0){let Z={meta:{visibility:"private",shareWithAllCreatorGroups:!0}};if(A.creatorIsViewer===!1)Z.disabledReason="Can only be set by thread creator";Q.push(Z)}if(A.workspace)Q.push({meta:{visibility:"thread_workspace_shared"}});let $=A.workspace?.disablePublicSharing?"Disabled by workspace policy":void 0,J={meta:{visibility:"public_unlisted"}},Y={meta:{visibility:"public_discoverable"}};if($)J.disabledReason=$,Y.disabledReason=$;return Q.push(J,Y),Q}function ys4(A){if(A.visibility!=="private")return!0;if("shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups)return!0;return"sharedGroupIDs"in A&&A.sharedGroupIDs.length>0}function zR(A,Q={}){switch(A.visibility){case"thread_workspace_shared":return{text:"Workspace",description:"Visible to all members of the workspace"};case"public_discoverable":return{text:"Public",description:"Visible on public profile & publicly searchable"};case"public_unlisted":return{text:"Unlisted",description:"Visible to anyone on the Internet who has the link"};case"private":{let B="shareWithAllCreatorGroups"in A&&A.shareWithAllCreatorGroups,J=(B?Q.workspace?.groups.map((Y)=>Y.id)??[]:("sharedGroupIDs"in A)?A.sharedGroupIDs:[]).reduce((Y,Z)=>{let F=Q.workspace?.groups.find((X)=>X.id===Z)?.name;if(F)Y.push(`'${F}'`);return Y},[]);if(J.length>0)return{text:"Group",description:`Shared with ${X4(J.length,"group")} ${J.join(", ")} and workspace admins`};if(B)return{text:"Group",description:"Shared with creator groups and workspace admins"};return{text:"Private",description:Q.workspace?"Only visible to you and workspace admins":"Only you can see this thread"}}}}function CV0(A){if(A.visibility==="private")return"shareWithAllCreatorGroups"in A?"group":"private";if(A.visibility==="thread_workspace_shared")return"workspace";if(A.visibility==="public_unlisted")return"unlisted";return"public"}function df(A,Q=null){let B=A!==null&&typeof A==="object"&&"visibility"in A?A.visibility:void 0;if(!B||typeof B!=="string")return;let J=pf({workspace:Q?.team??void 0}).filter((Y)=>!Y.disabledReason).map((Y)=>CV0(Y.meta));if(J.includes(B))return hm5(B);if(B==="group"&&!J.includes("group")){if(Q?.team?.groups!==void 0)return Error(`Group visibility is not available. You are not a member of any group in this workspace.
@@ -7681,7 +7681,7 @@ ${J}`,Q);this.line=B,this.column=$,this.codeblock=J}}/*!
7681
7681
  `),Y=[];for(let Z=0;Z<J.length;Z++){let D=J[Z].replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|HAVING|LIMIT|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON|AND|OR|AS|IN|NOT|NULL|IS|BETWEEN|LIKE|EXISTS|UNION|DISTINCT|COUNT|SUM|AVG|MIN|MAX|DATE|TIMESTAMP_TRUNC|TIMESTAMP_SUB|CURRENT_TIMESTAMP|INTERVAL|CASE|WHEN|THEN|ELSE|END|WITH|INSERT|UPDATE|DELETE|SET|VALUES|INTO|CREATE|ALTER|DROP|TRUE|FALSE|ASC|DESC)\b/gi,"\x00$1\x01").split(/(\x00[^\x01]+\x01)/);for(let G of D)if(G.startsWith("\x00")&&G.endsWith("\x01"))Y.push(new C(G.slice(1,-1),new v({color:$.app.keybind,bold:!0})));else Y.push(new C(G,new v({color:B.colorScheme.foreground})));if(Z<J.length-1)Y.push(new C(`
7682
7682
  `))}return new g0({decoration:{color:B.colorScheme.background,border:d1.all(new c1($.app.keybind,1,"rounded"))},child:new x0({padding:K0.symmetric(0,1),child:new p({text:new C(void 0,void 0,Y)})})})}}class H31 extends U8{chartData;highlightIndex;showAxes;colors;constructor({key:A,chartData:Q,highlightIndex:B=null,showAxes:$=!0,colors:J=bU0}){super(A?{key:A}:{});this.chartData=Q,this.highlightIndex=B,this.showAxes=$,this.colors=J}createRenderObject(){return new z31({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 Z1A(A,Q,B,$,J,Y,Z){if(Y<=0)return null;switch(A){case"horizontal-bar":{let F=B;return F>=0&&F<Y?F:null}case"bar":case"stacked-bar":{let F=Z?n8:0,X=$-F;if(X<=0)return null;let D=Q-F;if(D<0||D>=X)return null;let G=Math.max(1,Math.floor(X/Y)),V=Math.floor(D/G);return V>=0&&V<Y?V:null}case"line":case"sparkline":case"stacked-area":{let F=Z?n8:0,X=$-F;if(X<=0)return null;let D=Math.max(0,Math.min(X-1,Q-F));if(Y===1)return 0;let G=X/(Y-1),V=Math.round(D/G);return Math.max(0,Math.min(Y-1,V))}default:return null}}function en5(A,Q,B,$,J,Y,Z,F){if(J<=0||Q<0||Q>=J)return null;let X=2;switch(A){case"horizontal-bar":return{x:Math.floor(B/2),y:Q};case"bar":case"stacked-bar":{let D=Y?n8:0,G=B-D,V=$-(Y?X:0);if(G<=0||V<=0)return null;let U=Math.max(1,Math.floor(G/J)),K=D+Q*U+Math.floor(U/2),E=F>0?Z/F:0,z=Math.round((1-E)*(V-1));return{x:K,y:z}}case"line":case"sparkline":case"stacked-area":{let D=Y?n8:0,G=B-D,V=$-(Y?X:0);if(G<=0||V<=0)return null;let U=J>1?D+Math.round(Q/(J-1)*(G-1)):D+Math.floor(G/2),K=F>0?Z/F:0,E=Math.round((1-K)*(V-1));return{x:U,y:E}}default:return null}}function Aa5(A){let Q=0;for(let B of A)for(let $ of B.points)if($.value>Q)Q=$.value;return Q||1}function Qa5(A,Q,B,$,J){if(B.length<=1){let F=$(A.value),X=A.meta?` (${A.meta})`:"";return A.label.length+2+F.length+X.length}let Y=A.label.length,Z=0;for(let F of B){let X=F.points[Q];if(!X)continue;Z+=X.value;let D=2+F.name.length+2+$(X.value).length;Y=Math.max(Y,D)}if(J){let F=9+$(Z).length;Y=Math.max(Y,F)}return Y}function Ba5(A,Q,B,$,J,Y,Z){let F;try{let E=L1.of(A),z=P0.of(A);F={foreground:E.colorScheme.foreground,background:E.colorScheme.background,border:z.app.keybind}}catch{F={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let X=new v({color:F.foreground,bold:!0}),D=new v({color:F.foreground}),G=new v({color:F.foreground,dim:!0}),V=[],U=new v({color:F.foreground,underline:!0}),K=(E,z)=>new C(z,U,void 0,xz(E),()=>{aA(A,E)});if($.length<=1){if(V.push(new C(`${Q.label}: `,X)),Q.link)V.push(K(Q.link,Y(Q.value)));else V.push(new C(Y(Q.value),D));if(Q.meta)V.push(new C(` (${Q.meta})`,G))}else{let E=Z==="stacked-bar"||Z==="stacked-area";V.push(new C(`${Q.label}
7683
7683
  `,X));let z=0;for(let W=0;W<$.length;W++){let H=$[W],q=H.points[B];if(!q)continue;z+=q.value;let N=H.color??J[W%J.length]??F.foreground;if(V.push(new C("● ",new v({color:N}))),V.push(new C(`${H.name}: `,G)),q.link)V.push(K(q.link,Y(q.value)));else V.push(new C(Y(q.value),D));if(W<$.length-1||E)V.push(new C(`
7684
- `))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new g0({decoration:{color:F.background,border:d1.all(new c1(F.border,1,"rounded"))},child:new p({text:new C(void 0,void 0,V)})})}d0();function F1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}Y3();k3();Z3();l7();u7();$7();A2();i7();TV();c4();dS();NT();O1();d0();$7();class q31{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.1778871988-gfebe7f"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await k30(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 Yw extends T0{props;constructor(A){super();this.props=A}createState(){return new X1A}}class X1A extends _0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class D1A extends _0{controller=new _8;focusNode=new B6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=d1.all(new c1(B.foreground,1,"solid")),X=new Y$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new s0({children:[new g0({decoration:{color:B.background},child:new p({text:new C(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new g0({padding:K0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new v({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new v({color:$.keybind}))),V.push(new C(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new C("Esc",new v({color:$.keybind}))),V.push(new C(" to cancel",new v({color:B.foreground,dim:!0})));let U=new g0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new g0({decoration:{border:F,color:B.background},padding:K0.all(1),child:new y0({children:[G,new E0({height:1}),D,new Z5,U]})})}}class ss extends T0{props;constructor(A){super();this.props=A}createState(){return new D1A}}i7();class G1A extends _0{controller=new _8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new B6({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>=w9)return!1;let Q=await lU(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,Y=a1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new sz({controller:this.controller,triggers:[new eF],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:q4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new p4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new g0({constraints:new I1({maxHeight:Z}),padding:K0.symmetric(1,0),child:X}),G=new g0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new g0({padding:K0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new v({color:$.keybind})),new C(" again to clear input",new v({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new v({color:B.foreground,dim:!0})),new C("Enter",new v({color:$.keybind})),new C(" to submit, ",new v({color:B.foreground,dim:!0})),new C("Esc",new v({color:$.keybind})),new C(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new E0({height:1}),new _1({child:D}),new E0({height:1}),V];return new g0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:K0.all(1),child:new y0({children:U})})}}class N31 extends T0{props;constructor(A){super();this.props=A}createState(){return new G1A}}function V1A(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 I31 extends H1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((J,Y)=>Y.pubDate.getTime()-J.pubDate.getTime()),B=Math.max(0,...Q.map((J)=>V1A(J.pubDate).length));return new X5({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=P0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(z,W)=>new E0({width:W,child:s0.end([new p({text:new C(z,new v({color:K}))})])});return new g0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new _1({child:new p({text:new C(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new E0({width:2}),E(V1A(J.pubDate),B)]})})}})}}class WB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!WB._instance)WB._instance=new WB;return WB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}d0();class U1A extends _0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=P0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new X5({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new g0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new v({color:E})),new C(W,new v({color:E,bold:!0}))])})})}return new g0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class w31 extends T0{props;constructor(A){super();this.props=A}createState(){return new U1A}}class QG extends T0{props;constructor(A){super();this.props=A}createState(){return new K1A}}class K1A extends _0{_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=P0.of(A),{colors:B,app:$}=Q,J=d1.all(new c1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new C("",void 0,[new C(Y,new v({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new E0({height:2,child:new g0({padding:K0.symmetric(2,0),child:new p({text:new C("",new v({dim:!0}),[new C("Press ",new v({color:B.foreground})),new C("Esc",new v({color:B.info})),new C(" to cancel",new v({color:B.foreground}))])})})}));let D=new g0({decoration:new T4(B.background,J),child:new E0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new i4({debugLabel:"LoadingDialog",child:new p4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class sU extends T0{props;constructor(A){super();this.props=A}createState(){return new E1A}}class E1A extends _0{scrollController=new xA;scrollAreaKey=new G2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof h2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=P0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=gD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=d1.all(new c1(Q.colors.border,1,"solid")),Z=new g0({padding:K0.symmetric(1,0),child:new p({text:new C($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new D3({child:new g0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new fA({controller:this.scrollController,autofocus:!0,child:F})}),new W2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new g0({padding:K0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new v({color:Q.colors.foreground,dim:!0})),new C("R",new v({color:Q.app.keybind})),new C(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new C("Esc",new v({color:Q.app.keybind})),new C(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new C("",U,[new C("Press ",U),new C("Escape",V),new C(" to close • Use ",U),new C("↑↓",V),new C(" or ",U),new C("j/k",V),new C(" to scroll",U)])}return new C("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new i4({debugLabel:"MessageDialog",child:new $A({fit:"expand",children:[new k1({onClick:()=>{},child:new E0}),new p4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new g0({decoration:{border:Y,color:Q.colors.background},padding:K0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new E0({height:1}),X,D]})})})]})})}}Y3();e1();class z1A extends T0{props;constructor(A){super();this.props=A}createState(){return new W1A}}class W1A extends _0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=r0.file(this.widget.props.cwd),B=Y1.relativePath(Q,TA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return v5(A)}statusIcon(A){let Q=l8.default(),{colors:B,app:$}=Q;switch(A){case"loading":return{icon:"◌",color:B.warning};case"active":return{icon:"✓",color:$.toolSuccess};case"error":return{icon:"✗",color:$.toolError}}}build(A){let Q=P0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new C(`${Y}/${J} ${X4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${X4(Z,"command")}, ${F} ${X4(F,"tool")})`,new v({dim:!0})));$.push(new C(`
7684
+ `))}if(E)V.push(new C(" ",G)),V.push(new C("Total: ",G)),V.push(new C(Y(z),D))}return new g0({decoration:{color:F.background,border:d1.all(new c1(F.border,1,"rounded"))},child:new p({text:new C(void 0,void 0,V)})})}d0();function F1A(A){return A.length===0?A:A[0].toLowerCase()+A.slice(1)}Y3();k3();Z3();l7();u7();$7();A2();i7();TV();c4();dS();NT();O1();d0();$7();class q31{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.1778876600-gb6c4d8"},parameters:{metadata:{count:B}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(A);await k30(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 Yw extends T0{props;constructor(A){super();this.props=A}createState(){return new X1A}}class X1A extends _0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(A){let Q=(B)=>{this.setState(()=>{this._state=B(this._state)})};return this.widget.props.builder(A,Q,this._state)}}class D1A extends _0{controller=new _8;focusNode=new B6({debugLabel:"CommandArgumentPrompt",onKey:(A)=>{if(A.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,J=this.widget.props.isRequiredArg??!0,Y=this.controller.text.trim().length>0,Z=!J||Y,F=d1.all(new c1(B.foreground,1,"solid")),X=new Y$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(K)=>{let E=K.trim();if(J&&E.length===0)return;this.widget.props.onSubmit(E)},autofocus:!0,style:{textColor:B.foreground,border:null},maxLines:1}),D=new s0({children:[new g0({decoration:{color:B.background},child:new p({text:new C(">",new v({color:B.foreground}))})}),new _1({child:X})]}),G=new g0({padding:K0.symmetric(1,0),child:new p({text:this.widget.props.title?new C(this.widget.props.title,new v({color:$.command,bold:!0})):new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=[];if(Z)V.push(new C("Enter",new v({color:$.keybind}))),V.push(new C(" to submit, ",new v({color:B.foreground,dim:!0})));V.push(new C("Esc",new v({color:$.keybind}))),V.push(new C(" to cancel",new v({color:B.foreground,dim:!0})));let U=new g0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,V)})});return new g0({decoration:{border:F,color:B.background},padding:K0.all(1),child:new y0({children:[G,new E0({height:1}),D,new Z5,U]})})}}class ss extends T0{props;constructor(A){super();this.props=A}createState(){return new D1A}}i7();class G1A extends _0{controller=new _8;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new B6({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>=w9)return!1;let Q=await lU(A);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,A]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(A){let Q=P0.of(A),{colors:B,app:$}=Q,Y=a1.of(A).size.height,Z=Math.max(Math.floor(Y*0.5),10),F=new sz({controller:this.controller,triggers:[new eF],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:q4.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),X=new p4({debugLabel:"CommandMultilinePrompt",focusNode:this.focusNode,child:F}),D=new g0({constraints:new I1({maxHeight:Z}),padding:K0.symmetric(1,0),child:X}),G=new g0({padding:K0.symmetric(1,0),child:new p({text:new C("",void 0,[new C("Command: ",new v({color:B.foreground})),new C(this.widget.props.commandName,new v({color:$.command,bold:!0}))])})}),V=new g0({padding:K0.symmetric(1,0),child:new p({text:this.isConfirmingClearInput?new C("",void 0,[new C("Esc",new v({color:$.keybind})),new C(" again to clear input",new v({color:B.foreground,dim:!0}))]):new C("",void 0,[new C("Press ",new v({color:B.foreground,dim:!0})),new C("Enter",new v({color:$.keybind})),new C(" to submit, ",new v({color:B.foreground,dim:!0})),new C("Esc",new v({color:$.keybind})),new C(" to clear",new v({color:B.foreground,dim:!0}))])})}),U=[G,new E0({height:1}),new _1({child:D}),new E0({height:1}),V];return new g0({decoration:{border:d1.all(new c1(B.foreground,1,"solid")),color:B.background},padding:K0.all(1),child:new y0({children:U})})}}class N31 extends T0{props;constructor(A){super();this.props=A}createState(){return new G1A}}function V1A(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 I31 extends H1{props;debugLabel="NewsFeedPicker";constructor(A){super();this.props=A}build(A){let Q=[...this.props.entries].sort((J,Y)=>Y.pubDate.getTime()-J.pubDate.getTime()),B=Math.max(0,...Q.map((J)=>V1A(J.pubDate).length));return new X5({items:Q,getLabel:(J)=>J.title,onAccept:(J)=>this.props.onSelect?.(J),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(J,Y,Z,F)=>{let X=P0.of(F),{colors:D}=X,G=X.app,V=Y?G.selectionBackground:void 0,U=Y?G.selectionForeground:D.foreground,K=D.mutedForeground,E=(z,W)=>new E0({width:W,child:s0.end([new p({text:new C(z,new v({color:K}))})])});return new g0({decoration:V?{color:V}:void 0,padding:K0.symmetric(2,0),child:new s0({children:[new _1({child:new p({text:new C(J.title,new v({color:U})),overflow:"ellipsis",maxLines:1})}),new E0({width:2}),E(V1A(J.pubDate),B)]})})}})}}class WB{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!WB._instance)WB._instance=new WB;return WB._instance}get allExpanded(){return this._allExpanded}setAllExpanded(A){if(this._allExpanded===A)return;this._allExpanded=A,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(A){return this._listeners.add(A),()=>this.removeListener(A)}removeListener(A){this._listeners.delete(A)}_notifyListeners(){for(let A of this._listeners)A()}}d0();class U1A extends _0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let A=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!A.ok){j.error("Failed to load labels",A.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=A.result,this.isLoading=!1,this.setState()}catch(A){j.error("Failed to load labels",A),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(A){let Q=A.trim().toLowerCase();if(Q.length===0)return null;if(Q.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Q))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(A){return this.getValidationError(A)===null&&A.length>0}getAvailableLabels(){let A=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!A.includes(Q.name))}shouldShowCreateMarker(A){if(A.length===0||this.isLoading)return!1;let Q=A.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let B=this.widget.props.currentLabels||[],$=this.labels.some((Y)=>Y.name===Q),J=B.includes(Q);return!$&&!J}build(A){let Q=P0.of(A),{app:B,colors:$}=Q,J=this.currentQuery.trim().toLowerCase(),Y=J.length>0?this.getValidationError(J):null,Z=this.getAvailableLabels(),X=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...Z];return new X5({title:"Add Label",items:X,getLabel:(D)=>{if("__isCreateMarker"in D)return this.currentQuery.trim().toLowerCase();return D.name},onAccept:(D)=>{if("__isCreateMarker"in D)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(D.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:Y||"Type to create a new label",renderItem:(D,G,V,U)=>{let K=G?B.selectionBackground:void 0,E=G?B.selectionForeground:$.foreground;if("__isCreateMarker"in D&&D.__isCreateMarker){let W=this.currentQuery.trim().toLowerCase();return new g0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C("",void 0,[new C("Create new label: ",new v({color:E})),new C(W,new v({color:E,bold:!0}))])})})}return new g0({decoration:K?{color:K}:void 0,padding:K0.symmetric(2,0),child:new p({text:new C(D.name,new v({color:E}))})})},filterItem:(D,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in D&&D.__isCreateMarker)return this.shouldShowCreateMarker(G);let U=G.trim().toLowerCase();return U.length===0||D.name.includes(U)},sortItems:(D,G,V)=>{let U="__isCreateMarker"in D.item&&D.item.__isCreateMarker,K="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(U&&!K)return-1;if(!U&&K)return 1;return G.score-D.score}})}}class w31 extends T0{props;constructor(A){super();this.props=A}createState(){return new U1A}}class QG extends T0{props;constructor(A){super();this.props=A}createState(){return new K1A}}class K1A extends _0{_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=P0.of(A),{colors:B,app:$}=Q,J=d1.all(new c1(B.foreground,1,"solid")),Y=this._spinner.toBraille(),Z=new p({textAlign:"center",text:new C("",void 0,[new C(Y,new v({color:$.processing})),new C(" ",void 0),new C(this.widget.props.message,new v({color:B.foreground}))])}),X=[new _1({child:new y0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)X.push(new E0({height:2,child:new g0({padding:K0.symmetric(2,0),child:new p({text:new C("",new v({dim:!0}),[new C("Press ",new v({color:B.foreground})),new C("Esc",new v({color:B.info})),new C(" to cancel",new v({color:B.foreground}))])})})}));let D=new g0({decoration:new T4(B.background,J),child:new E0({width:60,height:7,child:new y0({mainAxisAlignment:"start",children:X})})});if(this.widget.props.onAbort)return new i4({debugLabel:"LoadingDialog",child:new p4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:D})});return D}}class sU extends T0{props;constructor(A){super();this.props=A}createState(){return new E1A}}class E1A extends _0{scrollController=new xA;scrollAreaKey=new G2("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(A){return A instanceof h2}resolveFooterStyle(A){if(this.isWidgetMessage(A))return A.footerStyle;return"default"}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let B=Q.size;if(typeof B.height==="number"&&B.height>0)return this.viewportHeight=B.height,B.height}return this.viewportHeight}build(A){let Q=P0.of(A),B=this.widget.props.message,$=(()=>{if(this.isWidgetMessage(B))return{title:B.title,type:B.type};if(B instanceof Error&&B.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:B.message};if(B instanceof Error&&B.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:B.message};let G=gD0(B);return{title:G.title,type:G.type,description:G.description}})(),J=$.type==="error"?Q.app.toolError:Q.app.command,Y=d1.all(new c1(Q.colors.border,1,"solid")),Z=new g0({padding:K0.symmetric(1,0),child:new p({text:new C($.title,new v({color:J,bold:!0}))})}),F=this.isWidgetMessage(B)?B.widget:new p({text:new C($.description,new v({color:Q.colors.foreground})),selectable:!0}),X=new _1({child:new D3({child:new g0({padding:K0.symmetric(1,0),child:new s0({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new _1({child:new fA({controller:this.scrollController,autofocus:!0,child:F})}),new W2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,V=this.scrollController.offset,U=this.getViewportHeight(),K=G+U;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(V,0)}}})]})})})}),D=new g0({padding:K0.symmetric(1,0),child:new p({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new v({color:Q.colors.foreground,dim:!0})),new C("R",new v({color:Q.app.keybind})),new C(" to retry, ",new v({color:Q.colors.foreground,dim:!0})),new C("Esc",new v({color:Q.app.keybind})),new C(" to cancel",new v({color:Q.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new v({color:Q.colors.foreground,dim:!0}));if(G==="help"){let V=new v({color:Q.app.keybind}),U=new v({color:Q.colors.foreground,dim:!0});return new C("",U,[new C("Press ",U),new C("Escape",V),new C(" to close • Use ",U),new C("↑↓",V),new C(" or ",U),new C("j/k",V),new C(" to scroll",U)])}return new C("Press any key to close",new v({color:Q.colors.foreground,dim:!0,italic:!0}))})()})});return new i4({debugLabel:"MessageDialog",child:new $A({fit:"expand",children:[new k1({onClick:()=>{},child:new E0}),new p4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new g0({decoration:{border:Y,color:Q.colors.background},padding:K0.all(1),child:new y0({mainAxisAlignment:"center",children:[Z,new E0({height:1}),X,D]})})})]})})}}Y3();e1();class z1A extends T0{props;constructor(A){super();this.props=A}createState(){return new W1A}}class W1A extends _0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((A)=>{this.plugins=A,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(A){let Q=r0.file(this.widget.props.cwd),B=Y1.relativePath(Q,TA(A));if(B!==null&&B!==""&&B!==".."&&!B.startsWith("../"))return B;return v5(A)}statusIcon(A){let Q=l8.default(),{colors:B,app:$}=Q;switch(A){case"loading":return{icon:"◌",color:B.warning};case"active":return{icon:"✓",color:$.toolSuccess};case"error":return{icon:"✗",color:$.toolError}}}build(A){let Q=P0.of(A),{app:B}=Q;if(this.plugins.length===0)return new p({text:new C("No plugins found.",new v({dim:!0}))});let $=[],J=this.plugins.length,Y=this.plugins.filter((X)=>X.status==="active").length,Z=this.plugins.reduce((X,D)=>X+D.registeredCommands.length,0),F=this.plugins.reduce((X,D)=>X+D.registeredTools.length,0);if($.push(new C(`${Y}/${J} ${X4(J,"plugin")} active`,new v({bold:!0}))),Z>0||F>0)$.push(new C(` (${Z} ${X4(Z,"command")}, ${F} ${X4(F,"tool")})`,new v({dim:!0})));$.push(new C(`
7685
7685
 
7686
7686
  `));for(let X of this.plugins){let{icon:D,color:G}=this.statusIcon(X.status),V=this.getRelativePath(X.uri);if($.push(new C(`${D} `,new v({color:G}))),$.push(new C(V,new v({bold:!0}))),$.push(new C(` ${X.status}`,new v({dim:!0}))),$.push(new C(`
7687
7687
  `)),X.status==="active"&&X.registeredEvents.length>0)$.push(new C(" Events: ",new v({dim:!0}))),$.push(new C(X.registeredEvents.join(", "),new v({color:B.link}))),$.push(new C(`
@@ -7859,7 +7859,7 @@ ${t.content||""}`:t.content||"",f0=[],u0=t.baseDir.startsWith("file://")?UK0(t.b
7859
7859
  `)}function tAA(A,Q){A.command("usage").description("Show your current Amp usage and credit balance").action(async(B,$)=>{let J=$.optsWithGlobals(),Y=await Q(J),Z=await Y.settings.get("proxy"),F=L04({settings:{url:Y.ampURL,proxy:Z},secrets:{getToken:(D,G)=>Y.secrets.get(D,G)}}),X=await r4.userDisplayBalanceInfo({},{config:F});if(!X.ok){if(X.error.code==="auth-required")process.stderr.write(a0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(a0.red("Error: ")+X.error.message+`
7860
7860
  `),process.exit(1)}process.stdout.write(await ws5(X.result.displayText)+`
7861
7861
  `),process.exit(0)})}var d13=xt.join(g$,"logs","headless.log"),L91=xt.join(Rx,"device-id.json"),c13=`cli-tui-${R8A(16).toString("hex")}`;async function l13(){for(let A of hM)try{if((await A.listConfigs()).length>0)return A}catch(Q){j.debug("Failed to detect query-based IDE integration",{ideName:A.ideName,error:Q})}return}try{if(process.platform==="win32")await Promise.resolve().then(() => v4(vb(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){HB.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
7862
- `)}function i13(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function N2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")FY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")FY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)FY("internal.model",o13(Q.model))}function N8A(A){let Q=A.indexOf(":");if(Q===-1)throw new s1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new s1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function n13(A){if(A===void 0)return;let Q=A.trim();if(V04(Q))return Q;throw new s1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function a13(A,Q){if(w8(A,Q))return;let B=n$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new s1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function o13(A){if(!A.includes("="))return N8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new s1(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new s1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new s1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);N8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new s1("No valid model overrides found in --model flag value.",1);return Q}function r13(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 s13(A){try{return await P8A(A,"utf-8")}catch{return A}}async function O91(A,Q,B){let $=r13(A,Q);if(!$)return;let J=gA(B)?B.features:[],Y=gA(B)?B.user.email:void 0;if(!ut(J,SB.HARNESS_SYSTEM_PROMPT)&&!(Y&&f7(Y)))throw new s1("You are not allowed to do this.",1);FY("systemPrompt",await s13($))}function ut(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function t13(A){return A!=="pending"}function qW(A){if(!gA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function e13(A){let Q=qW(A);if(Q)return Q.id;if(uX(A))throw Error(A.error.message);throw Error("unreachable")}function A43(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 Q43(A){let $=A43(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new s1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function ft(A,Q){let B=Us0(Error(A.error.message));if(B.message===H7.networkOffline||B.message===H7.networkTimeout)return Q43(Q);if(B.message!==H7.internalBug)return new s1(B.message,1,B.suggestion);return new s1(A.error.message.replace(/^Error: /,""),1)}async function B43(){if(process.versions.bun)return!1;try{return await PU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var I8A=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH or with AMP_FORCE_BEL; enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??dF,description:`Custom settings file path (overrides the default location ${dF})`},{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 ${na})`},{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:bM.SMART.key,description:`Set the agent mode (${l$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(l$().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],w8A=(A)=>("deprecated"in A)&&A.deprecated===!0,$43=(A)=>("hidden"in A)&&A.hidden===!0,J43=(A)=>("default"in A),Y43=(A)=>("default"in A)?A.default:void 0;function QE0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=n13(Q.effort);if(B!==void 0)a13(Q.mode,B);return B}function Z43(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new s1(H7.unknownCommand(B),1,Z)}}async function JE0(A){return{...A,getThreadEnvironment:SD,getEnvironmentData:(Q,B)=>JD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new CL(A.fileSystem),generateThreadTitle:CF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>_Q(A.configService),pluginService:A.pluginService}}function _8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:SD,getEnvironmentData:(Q,B)=>JD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var BE0=r0.file(p13.homedir()),j91=process.env.XDG_CONFIG_HOME?r0.file(process.env.XDG_CONFIG_HOME):Y1.joinPath(BE0,".config");function F43(A){return rR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(YX0())ZX0();else zZ0(Q);let B=bj(),$=Jr();if((!B||$||Tx())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(uD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(uD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(bj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function y8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;B04("0.0.1778871988-gfebe7f");let Y=b30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:m0.of(r0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:BE0,userConfigDir:j91});Dt4(Y);let Z=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(Z.settings)});let F=!1;{let s=await A.secrets.get("apiKey",A.ampURL);if(F=Boolean(s),j.info("API key lookup before login",{found:Boolean(s),ampURL:A.ampURL,deferAuth:$}),!s)if($)j.info("No API key found, continuing startup with deferred auth");else{r6.write(`No API key found. Starting login flow...
7862
+ `)}function i13(A){process.emitWarning=(Q,B,$,J)=>{let Y=typeof Q==="string"?Q:Q.message||String(Q),Z=B||"Warning",F=!1;A.warn(Y,{name:Z,code:$})}}function N2(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")FY("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(A.getOptionValueSourceWithGlobals("mode")==="cli")FY("experimental.agentMode",Q.mode);if(A.getOptionValueSourceWithGlobals("model")==="cli"&&Q.model)FY("internal.model",o13(Q.model))}function N8A(A){let Q=A.indexOf(":");if(Q===-1)throw new s1(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let B=A.slice(0,Q).trim(),$=A.slice(Q+1).trim();if(!B||!$)throw new s1(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function n13(A){if(A===void 0)return;let Q=A.trim();if(V04(Q))return Q;throw new s1(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function a13(A,Q){if(w8(A,Q))return;let B=n$(A)?.levels,$=B?` Allowed for ${A}: ${B.join(", ")}.`:"";throw new s1(`Reasoning effort "${Q}" is not available for ${A} mode.${$}`,1)}function o13(A){if(!A.includes("="))return N8A(A),A;let Q={};for(let B of A.split(",")){let $=B.trim();if(!$)continue;let J=$.indexOf("=");if(J===-1)throw new s1(`Invalid mode-specific model entry "${$}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let Y=$.slice(0,J).trim(),Z=$.slice(J+1).trim();if(!Y)throw new s1(`Missing mode name in "${$}". Expected "mode=provider:model".`,1);if(!Z)throw new s1(`Missing model value for mode "${Y}". Expected "${Y}=provider:model".`,1);N8A(Z),Q[Y]=Z}if(Object.keys(Q).length===0)throw new s1("No valid model overrides found in --model flag value.",1);return Q}function r13(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 s13(A){try{return await P8A(A,"utf-8")}catch{return A}}async function O91(A,Q,B){let $=r13(A,Q);if(!$)return;let J=gA(B)?B.features:[],Y=gA(B)?B.user.email:void 0;if(!ut(J,SB.HARNESS_SYSTEM_PROMPT)&&!(Y&&f7(Y)))throw new s1("You are not allowed to do this.",1);FY("systemPrompt",await s13($))}function ut(A,Q){return A?.some((B)=>B.name===Q&&B.enabled)??!1}function t13(A){return A!=="pending"}function qW(A){if(!gA(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function e13(A){let Q=qW(A);if(Q)return Q.id;if(uX(A))throw Error(A.error.message);throw Error("unreachable")}function A43(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 Q43(A){let $=A43(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new s1(`Couldn't connect to the Amp server at ${A}.`,1,$)}function ft(A,Q){let B=Us0(Error(A.error.message));if(B.message===H7.networkOffline||B.message===H7.networkTimeout)return Q43(Q);if(B.message!==H7.internalBug)return new s1(B.message,1,B.suggestion);return new s1(A.error.message.replace(/^Error: /,""),1)}async function B43(){if(process.versions.bun)return!1;try{return await PU()==="npm"}catch(A){return j.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var I8A=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH or with AMP_FORCE_BEL; enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??dF,description:`Custom settings file path (overrides the default location ${dF})`},{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 ${na})`},{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:bM.SMART.key,description:`Set the agent mode (${l$({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:Array.from(new Set(l$().map((A)=>A.mode))),hiddenChoices:["frontier"]},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable thread-actors mode and use the legacy worker runtime",hidden:!0},{name:"neoOrb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],w8A=(A)=>("deprecated"in A)&&A.deprecated===!0,$43=(A)=>("hidden"in A)&&A.hidden===!0,J43=(A)=>("default"in A),Y43=(A)=>("default"in A)?A.default:void 0;function QE0(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let B=n13(Q.effort);if(B!==void 0)a13(Q.mode,B);return B}function Z43(A,Q){let B=Q.args[0],$=Q.commands.map((Y)=>Y.name());if(B&&!B.includes(" ")&&B.length<30&&!/[./\\]/.test(B)){let Y=$.filter((F)=>B.includes(F)||F.includes(B)),Z="Run amp --help for a list of available commands.";if(Y.length>0)Z=`Did you mean: ${Y.join(", ")}? Or run amp --help for all commands.`;throw new s1(H7.unknownCommand(B),1,Z)}}async function JE0(A){return{...A,getThreadEnvironment:SD,getEnvironmentData:(Q,B)=>JD({filesystem:A.fileSystem},Q,B),osFileSystem:A.fileSystem,skillService:A.skillService,fileChangeTrackerStorage:new CL(A.fileSystem),generateThreadTitle:CF4,deleteThread:(Q)=>A.threadService.delete(Q),getServerStatus:()=>_Q(A.configService),pluginService:A.pluginService}}function _8A(A){return{toolService:A.toolService,configService:A.configService,skillService:A.skillService,getThreadEnvironment:SD,getEnvironmentData:(Q,B)=>JD({filesystem:A.fileSystem},Q,B),filesystem:A.fileSystem,threadService:A.threadService}}var BE0=r0.file(p13.homedir()),j91=process.env.XDG_CONFIG_HOME?r0.file(process.env.XDG_CONFIG_HOME):Y1.joinPath(BE0,".config");function F43(A){return rR4({playNotificationSound:async(Q)=>{if(A.useNotificationsForService){if(YX0())ZX0();else zZ0(Q);let B=bj(),$=Jr();if((!B||$||Tx())&&A.config.settings["notifications.system.enabled"]!==!1){if(Q==="idle")process.stdout.write(uD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Q==="requires-user-input")process.stdout.write(uD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(bj()),threadService:A.threadService,configService:A.configService,threadViewStates$:A.threadViewStates$})}async function y8(A,Q,B){let $=B?.deferAuth??!1,J=B?.skipToolProviders??!1;B04("0.0.1778876600-gb6c4d8");let Y=b30({storage:A.settings,secretStorage:A.secrets,workspaceRoot:m0.of(r0.file(process.cwd())),defaultAmpURL:A.ampURL,homeDir:BE0,userConfigDir:j91});Dt4(Y);let Z=await Y.getLatest();j.debug("Global configuration initialized",{settingsKeys:Object.keys(Z.settings)});let F=!1;{let s=await A.secrets.get("apiKey",A.ampURL);if(F=Boolean(s),j.info("API key lookup before login",{found:Boolean(s),ampURL:A.ampURL,deferAuth:$}),!s)if($)j.info("No API key found, continuing startup with deferred auth");else{r6.write(`No API key found. Starting login flow...
7863
7863
  `);let I0=await X43(A),X0=await A.secrets.get("apiKey",A.ampURL);if(j.info("Login flow completed",{success:I0,storedKeyPresent:Boolean(X0),ampURL:A.ampURL}),!I0)await _z(),process.exit(1);F=!0}}{let s=await Y.getLatest(),I0=s.settings.url,X0=s.secrets.isSet?.[I0];j.info("Config secrets state after login",{configURL:I0,apiKeySet:X0?.apiKey??!1})}let X=T1(_Q(Y).pipe(A5(t13))),D=$?"pending":await X;if(!$)j.info("Server status resolved",{status:"ready",isAuthenticated:gA(D),isError:uX(D),errorMessage:uX(D)?D.error.message:void 0});let G=X.then((s)=>e13(s));G.catch(()=>{return});let V=!Q.takeMeBack&&gA(D)&&ut(D.features,SB.THREAD_ACTORS_TUI),U=V?"all":process.env.PLUGINS??"permissions",{toolService:K,dispose:E}=lR4({configService:Y}),z=new Map,W=()=>z.clear(),H=new af0(Y,A.settings.getWorkspaceRootPath()),q=rJ4({configService:Y,filesystem:y3}),N=g74({configService:Y,trustStore:H,skillMCPServers:q.skillMCPServers,uploadImageAttachments:V,createOAuthProvider:async(s,I0,X0)=>{let U0=`${s}:${I0}`,G0=z.get(U0);if(G0)return j.debug("Reusing existing OAuth provider for server",{serverName:s,serverUrl:I0}),G0;j.debug("Creating OAuth provider for server",{serverName:s,serverUrl:I0});let j0=(async()=>{let B0=new lM(A.secrets),M0=await B0.getClientInfo(s,I0),n=X0?.scopes??M0?.scopes,a=sf4();j.info("OAuth headless mode check",{useHeadless:a,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:r6.isTTY});let t;if(a)t=A.executeMode?rf4():of4(s);let e=new Jv0({storage:B0,serverName:s,serverUrl:I0,clientId:X0?.clientId??M0?.clientId,clientSecret:X0?.clientSecret??M0?.clientSecret,authUrl:X0?.authUrl??M0?.authUrl,tokenUrl:X0?.tokenUrl??M0?.tokenUrl,scopes:n,headlessAuthHandler:t});return j.debug("OAuth provider created",{serverName:s,serverUrl:I0,hasManualClientId:!!(X0?.clientId??M0?.clientId),willUseDCR:!(X0?.clientId??M0?.clientId),scopes:n,headlessMode:a,executeMode:A.executeMode}),e})();return z.set(U0,j0),j0}}),I=tn0({configService:Y,filesystem:y3,spawn:yY0}),w=Q.headless?ms4():void 0,L=w??new MV0({configService:Y}),O=L instanceof MV0?L:void 0;if(O)O.pluginExecutorKind="local";let P=new n1(null),T=null,k=V?[...cs4(Z.settings)?[{name:"permissions",entryPoint:U51}]:[],{name:"thread-visibility",entryPoint:ns4(Y,()=>X.then(qW),()=>T,(s)=>{T=s}),alwaysLoad:!0}]:[],y=Ub0({configService:Y,fileSystem:y3,platform:L,loadGlobalPlugins:ct0(Y),pluginFilter:U,activeThread$:P,internalPlugins:k}),g=gQ4(y),u=[N,I,g],S;if(J)S=new Map;else if(A.executeMode){let s=await wO4({toolService:K,providers:u,initialTimeout:15000});S=s.registrations;for(let[I0,X0]of s.initErrors)j.warn(`${I0} provider initialization slow or failed:`,X0)}else S=en0({toolService:K,providers:u});if(Q.jetbrains)SM("JetBrains");else if(Q.ide&&bb4())SM("VS Code");else if(Q.ide&&ub4())SM("Neovim");else if(Q.ide){let s=await l13();if(s){let I0=n30(s.ideName);if(I0)SM(I0)}}if(A.executeMode)$04(!0);let f,d=l3.status.pipe(q1((s)=>Boolean(s.connected&&s.authenticated&&s.ideName&&A14(s.ideName))),R4()).subscribe((s)=>{if(s){if(!f)f=K.registerTool(IO4)}else f?.dispose(),f=void 0}),c;if(!A.executeMode){let s=await A.settings.get("fuzzy.alwaysIncludePaths")??[];c=new BX0(process.cwd(),{alwaysIncludePaths:s},!0)}else c=new class extends BX0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let h=new Ug0(_l(Y,{usesThreadActors:!1}),{maxThreads:200});j.info("Starting Amp background services");let i=new H51,r={configService:Y,toolService:K,mcpService:N,skillService:q,toolboxService:I,trustStore:H,threadService:h,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:c,fileSystem:y3,terminal:i,pluginService:y,pluginPlatform:O,headlessPluginPlatform:w,activeThread$:P,serverStatus:D,serverStatusPromise:X,viewerUserIDPromise:G,hasAPIKeyAtStartup:F,consumeDraftNewThreadVisibility:()=>{let s=T;return T=null,s}};return{...r,async asyncDispose(){if(r.mcpService.hasAuthenticatingClients())j.info("Waiting for OAuth authentication to complete before exit..."),await r.mcpService.waitForAuthentication();for(let s of S.values())s.dispose();await r.mcpService.dispose(),W(),await r.threadService.asyncDispose(),r.configService.unsubscribe(),E(),r.fuzzyServer.dispose(),r.settingsStorage[Symbol.dispose](),d.unsubscribe(),f?.dispose(),await r.pluginService.dispose()}}}async function X43(A){if(!A.executeMode){if(!await oX0("Would you like to log in to Amp? [(y)es, (n)o]: "))return r6.write(`Login cancelled. Run the command again to retry.
7864
7864
  `),!1}return await T8A(A)}async function T8A(A){let Q=R8A(32).toString("hex"),B=await hx(A.ampURL,Q),$=new AbortController;try{await xX(B,$.signal)}catch(Y){j.error("Error opening browser",{error:Y})}let J=await hx(A.ampURL,Q,!1);r6.write(`If your browser does not open automatically, visit:
7865
7865
 
@@ -7867,7 +7867,7 @@ ${a0.blue.bold(J)}
7867
7867
 
7868
7868
  `);try{return await sh4(A.ampURL,Q,A.secrets,$),r6.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(Y){return j.error("Login failed",{error:Y}),HB.write(`
7869
7869
  Login failed: ${Y instanceof Error?Y.message:String(Y)}
7870
- `),!1}}async function D43(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new s1("No Amp API key found. Run `amp login` first.",1);let J=h13("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(F)=>Y(F??1))})}function G43(A){let Q=new mN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)Wj(),process.exit(0);let H=W.originalError??W;Sv4(H)}),Ym4(Q,{version:"0.0.1778871988-gfebe7f",buildTimestamp:"2026-05-15T19:10:43.549Z",buildType:"release"}),Q.addHelpText("after",yb4()),Q.configureHelp({formatHelp:xb4}),Q.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await N43(N)}),Q.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await q43(N,await Be0(q,N.settings))}),_v4(Q,d5);let $=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...W)=>{let H=W.find((w)=>typeof w==="object"&&w!==null&&typeof w.optsWithGlobals==="function")??$,q=W.filter((w)=>w!==H).flatMap((w)=>Array.isArray(w)?w:typeof w==="string"?[w]:[]),N=H.optsWithGlobals(),I=await d5(N);await D43(I.ampURL,I.secrets,q),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(W,H,q)=>{let N=q.optsWithGlobals(),I=await d5(N);await mf4(W??"get",I.ampURL,I.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await pf4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(W)=>{await ru4({raw:W.raw===!0}),process.exit(process.exitCode??0)}),Q.command("live-sync [threadIDOrURL]",{hidden:!0}).summary("Mirror live DTW thread changes into the current checkout").description("Experimental: watch a v2 thread URL or ID and mirror its live working-tree changes into your local checkout, or apply the current snapshot once and exit.").addHelpText("after",["","Examples:"," amp live-sync T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync --apply T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync https://ampcode.com/threads/T-5928a90d-d53b-488f-a829-4e36442142ee"].join(`
7870
+ `),!1}}async function D43(A,Q,B){let $=await Q.get("apiKey",A);if(!$)throw new s1("No Amp API key found. Run `amp login` first.",1);let J=h13("curl",["-H",`Authorization: Bearer ${$}`,...B],{stdio:"inherit"});process.exitCode=await new Promise((Y,Z)=>{J.on("error",Z),J.on("close",(F)=>Y(F??1))})}function G43(A){let Q=new mN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((W)=>{if(W.code==="commander.help"||W.code==="commander.version"||W.exitCode===0)Wj(),process.exit(0);let H=W.originalError??W;Sv4(H)}),Ym4(Q,{version:"0.0.1778876600-gb6c4d8",buildTimestamp:"2026-05-15T20:27:13.265Z",buildType:"release"}),Q.addHelpText("after",yb4()),Q.configureHelp({formatHelp:xb4}),Q.command("logout").description("Log out by removing stored API key").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await N43(N)}),Q.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await q43(N,await Be0(q,N.settings))}),_v4(Q,d5);let $=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...W)=>{let H=W.find((w)=>typeof w==="object"&&w!==null&&typeof w.optsWithGlobals==="function")??$,q=W.filter((w)=>w!==H).flatMap((w)=>Array.isArray(w)?w:typeof w==="string"?[w]:[]),N=H.optsWithGlobals(),I=await d5(N);await D43(I.ampURL,I.secrets,q),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(W,H,q)=>{let N=q.optsWithGlobals(),I=await d5(N);await mf4(W??"get",I.ampURL,I.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await pf4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(W)=>{await ru4({raw:W.raw===!0}),process.exit(process.exitCode??0)}),Q.command("live-sync [threadIDOrURL]",{hidden:!0}).summary("Mirror live DTW thread changes into the current checkout").description("Experimental: watch a v2 thread URL or ID and mirror its live working-tree changes into your local checkout, or apply the current snapshot once and exit.").addHelpText("after",["","Examples:"," amp live-sync T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync --apply T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync https://ampcode.com/threads/T-5928a90d-d53b-488f-a829-4e36442142ee"].join(`
7871
7871
  `)).option("--apply <threadIDOrURL>","Apply the current DTW thread snapshot once and exit").option("--checkout","Automatically check out the thread commit when it differs").option("--skip-checkout","Skip the startup checkout prompt when commits differ").action(async(W,H,q)=>{if(W&&H.apply)throw new s1("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let N=H.apply??W;if(!N||N.trim().length===0)r6.write(`live-sync watches a v2 thread and mirrors its live changes locally. Use --apply <thread-id> to materialize the current snapshot once and exit.
7872
7872
 
7873
7873
  `),q.outputHelp(),process.exit(0);let I=t8(N)??eB(N),w=q.optsWithGlobals(),L=await d5(w);N2(q,w);let O=await y8(L,w),P=!1;try{if(H.checkout&&H.skipCheckout)throw new s1("Choose either --checkout or --skip-checkout, not both.",1);if(uX(O.serverStatus))throw ft(O.serverStatus,L.ampURL);let T=gA(O.serverStatus)?O.serverStatus.features:void 0;if(!ut(T,SB.V2))throw new s1("live-sync is not enabled for your user",1);await gh4({ampURL:L.ampURL,threadId:I,configService:O.configService,threadService:O.threadService,apiKey:process.env.AMP_API_KEY,applyOnce:typeof H.apply==="string",checkoutMode:H.checkout?"always":H.skipCheckout?"never":"prompt",promptForYesNo:oX0}),P=!0}finally{if(await O.asyncDispose(),P)process.exit(0)}});let J=async(W,H,q)=>{b30({storage:H.settings,secretStorage:H.secrets,workspaceRoot:m0.of(r0.file(process.cwd())),defaultAmpURL:H.ampURL,homeDir:BE0,userConfigDir:j91});let N={...H,executeMode:!1};await $E0(N,{...W,openThreadSwitcher:!0},q,A)},Y=Q.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").option("--include-archived","Include archived threads in the list").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await j8A(q,N,H)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(W,H)=>{let q=H.optsWithGlobals(),N=await d5(q);await k43(q,N,H)}),Y.command("continue [threadIDOrURL]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, interactive mode shows a picker. Use --last to continue the last thread for the current mode directly.").option("--last","Continue the last thread for the current mode directly").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(W,H,q)=>{let N=q.optsWithGlobals(),I=await d5(N);if(H.pick)HB.write(`${a0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
@@ -7900,8 +7900,8 @@ ${L}
7900
7900
  `))}),H.args.length>0)Z43(N,H);await $E0(N,q,H,A)}),Uu4(Q),Q}async function bt(A,Q){await $B((B)=>mx(B,A,Q))}async function C8A(A,Q,B){let $=Date.now(),[J,Y]=await Promise.all([r4.getThreadLinkInfo({thread:A},{config:Q}),B]);if(j.getChild("fetchAndStartThread").info(`Ownership check in ${Date.now()-$}ms`),J.ok){let Z=J.result.creatorUserID;if(Z&&Z!==Y&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new s1(`Cannot resume thread created by another user.
7901
7901
 
7902
7902
  This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}async function k8A(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await RV0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await RV0()).trimEnd(),stdinInput:null}}function S8A(A,Q,B){if(A.streamJson&&!Q)throw new s1("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new s1("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new s1("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new s1("The --stats and --stream-json flags are mutually exclusive output formats",1,'Use one or the other: amp --execute "your message" --stats OR amp --execute "your message" --stream-json');if(A.stats&&!Q)throw new s1("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archive&&!Q)throw new s1("The --archive flag requires --execute mode",1,'Use: amp --execute "your message" --archive');if(A.streamJsonInput&&typeof A.execute==="string"&&A.execute.trim()!=="")throw new s1("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"},{"type":"image","source":{"type":"base64","media_type":"image/png","data":"..."}}]}}' | amp --execute --stream-json --stream-json-input`);if(Q&&B===""&&!A.streamJsonInput&&!A.headless)throw new s1("User message must be provided through stdin or as argument when using execute mode",1,`Either pass a message as an argument: amp --execute "your message"
7903
- Or pipe via stdin: echo "your message" | amp --execute`)}function V43(){hA4([i50.parse({tool:"*",action:"allow"})]),HA4({bypass:!0})}async function $E0(A,Q,B,$){if(Q.headless)return U43(A,Q,B);let J=await y8(A,Q),Y=await J.serverStatusPromise,Z=gA(Y)&&ut(Y.features,SB.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new s1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new s1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await B43();return V43(),K43(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&N9(Q.threadId)){let X=await r4.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(X?.ok&&X.result.usesThreadActors)throw await J.asyncDispose(),new s1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return E43(A,Q,B,$,{dependencies:J})}}async function U43(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=$s0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};N2(B,Q);let J=process.hrtime.bigint(),Y=await y8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(uX(Z))throw ft(Z,A.ampURL);let F=gA(Z)?Z:null,X=F?.user.email;await O91(B,Q,Z);let D=qW(Z),G=df(Q,D);if(G instanceof Error)V5(G.message);if(F&&!fM(Q.mode,X))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!f7(X)))throw new s1("Headless executor mode is only available for Amp employees",1);qF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new s1("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!N9(K))throw new s1(`Invalid thread ID: ${K}`,1);let E=K?void 0:await _43({dependencies:Y,apiKey:U,visibility:G??void 0}),z=K??E?.threadId;if(!z)throw new s1("Failed to resolve headless thread ID",1);let W=await Qb4(z);if(W.status==="already-running")await Y.asyncDispose(),await _z(),process.exit(0);try{await if4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:z,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await _z(),process.exit(0)}async function K43(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await k8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;S8A({...Q,streamJson:F},A.executeMode,Y),N2(B,Q),Cv4(),qF0();let X=Q.threadId&&N9(Q.threadId)?Q.threadId:void 0,D=Q.observe?t8(Q.observe)??eB(Q.observe):void 0,G=await $.serverStatusPromise;if(uX(G))throw ft(G,A.ampURL);let V=qW(G),U=df(Q,V);if(U instanceof Error)V5(U.message);let K=null,E=async()=>{let H=$.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let q=await aa(A.settings,process.cwd(),V,U);if(q instanceof Error)V5(q.message);return q})(),K},z=await $.secretStorage.get("apiKey",A.ampURL);if(!z)throw new s1("API key required. Please run `amp login` first.",1);let W=gA(G)&&f7(G.user.email);if(A.executeMode){A01($.mcpService,A.settings);try{let H=QE0(B,Q),q=await gz(),N=X?H:sX0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),I=X?void 0:tX0(await gx($.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),w=X?void 0:await E(),L=await Nf4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:X,initialThreadMeta:w,initialSettings:I});if(await bt(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await _z(),process.exit(0)}else{let H=QE0(B,Q),q=J.showNpmMigrationWelcome?"npm-migration":"intro",N=IX0("0.0.1778871988-gfebe7f",$.settingsStorage,{startDelayMs:3000}),I=new rX0($.mcpService,A.settings.getWorkspaceRootPath()),w=_l($.configService),L=new ts($.fuzzyServer),O=process.cwd();await vs4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??gF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:P})=>qx({fileSystem:$.fileSystem,workspaceRoot:O},P),completionBuilder:L,workspaceRoot:O,listThreads:()=>w.listThreads(),getThreadFromServer:(P)=>w.getThread(P),toolboxes:$.toolboxService.toolboxes,isInternalUser:W,settingsFilePath:$.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:$.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:I,setActiveThreadID:(P)=>$.activeThread$.next(P),dispose:()=>{return I.dispose(),N.dispose(),$.asyncDispose()}},{initialThreadID:D??X,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function E43(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(G0,j0)=>{let B0=Number(process.hrtime.bigint()-j0)/1e6,M0=$s0();j.info("Startup phase",{phase:G0,phaseMs:Math.round(B0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:F,stdinInput:X}=await k8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;S8A({...Q,streamJson:D},A.executeMode,F),N2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await y8(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&&uX(E))throw ft(E,A.ampURL);let z=gA(E)?E:null,W=z?.user.email,H=!!(W&&f7(W));if(H)qF0();if(!K)await O91(B,Q,E);let q=qW(E),N=q?.features??[],I=q?.team??null,w=df(Q,q);if(w instanceof Error)V5(w.message);if(z&&!fM(Q.mode,W))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let L=Q.threadId&&N9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await JE0(V);Z("runMainThread:createWorkerDeps",G);let P=A.executeMode?void 0:async(G0)=>bt(G0,"interactive"),T={threadService:V.threadService,workerDeps:O,createThread:async(G0)=>{let j0=K?await V.serverStatusPromise:E,B0=await aa(A.settings,process.cwd(),qW(j0),w);if(B0 instanceof Error)V5(B0.message);return s81(O,{threadMeta:B0,agentMode:G0??Q.mode,onFirstAssistantMessage:P})},validateThreadOwnership:async(G0,j0)=>{if(j0?.nonBlockingOwnershipCheck){C8A(G0,V.configService,V.viewerUserIDPromise).catch((B0)=>{if(B0 instanceof s1){if(j0.onOwnershipError){j0.onOwnershipError(B0,G0);return}Tz(B0,G0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})});return}try{await C8A(G0,V.configService,V.viewerUserIDPromise)}catch(B0){if(B0 instanceof s1)throw B0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:P,handleError:Tz},k=async()=>{try{return aAA(T,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(G0){if(G0 instanceof s1)throw G0;throw await Tz(G0,Q.threadId),Error("handleError should have called process.exit()")}},y=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let G0=await V.configService.getLatest(),j0=bm(G0),B0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(j0)});if(B0.ok)return j.info("User free tier status:",B0),B0.result;return}catch(G0){j.error("Failed to fetch free tier status:",G0);return}})(),u=!A.executeMode?new C51:null,S,f=null;if(u)S=u,f=(async()=>{let G0=K?await V.serverStatusPromise:V.serverStatus;if(uX(G0))throw ft(G0,A.ampURL);await O91(B,Q,G0);let j0=process.hrtime.bigint(),B0=await k();if(Z("runMainThread:createThreadPool",j0),u.attach(B0),F){let M0=await T1(B0.threadHandles$);if(!M0)throw new s1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(G0)=>{let j0=G0 instanceof Error?G0:Error(String(G0));u.setInitError(j0),await Tz(G0,Q.threadId)});else G=process.hrtime.bigint(),S=await k(),Z("runMainThread:createThreadPool",G);let d=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let c=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),F43({configService:V.configService,threadService:V.threadService,config:c,useNotificationsForService:d,threadViewStates$:()=>S.threadHandles$.pipe(x4((G0)=>{if(!G0)return m0.of({});return L6(G0.thread$,G0.threadViewState$).pipe(q1(([j0,B0])=>({[j0.id]:B0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){A01(V.mcpService,A.settings);let G0=QE0(B,Q),j0=await gz(),B0=L?G0:sX0({agentMode:Q.mode,explicitEffort:G0,sessionState:j0}),M0={userInput:F,stdinInput:X,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:H,agentMode:Q.mode,reasoningEffort:B0,labels:Q.label},n=await ev4({threadPool:S,...M0});if(await bt(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let h=!1,i=!1;if(Q.jetbrains||Q.ide){await a30();let G0=await gX({jetbrainsOnly:Q.jetbrains});if(G0.length===0){if(Q.jetbrains)h=!await V.configService.get("jetbrains.skipInstall")}else if(G0.length===1){let j0=G0[0];if(j0)l3.selectConfig(j0)}else i=!0}G=process.hrtime.bigint();let r=IX0("0.0.1778871988-gfebe7f",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let s=new rX0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let G0=await T1(S.threadHandles$);if(!G0)throw new s1("No active thread is available yet.",1);await G0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let I0=await gz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",I0);let X0=QE0(B,Q),U0={...I0,launchCount:I0.launchCount+1,lastReasoningEffortByMode:X0?{...I0.lastReasoningEffortByMode,[Q.mode]:X0}:I0.lastReasoningEffortByMode};$B((G0)=>({...G0,launchCount:G0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Ze4({history:new Ko,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:S,createSystemPromptDeps:async()=>_8A(V),ideClient:l3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:s,updateService:r,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:L,showJetBrainsInstaller:h,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:c13,logFile:{path:$},sessionState:U0,freeTierStatusPromise:y,workspace:I??null,features:N,isInternalUser:H,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-15T19:10:43.549Z"},(G0)=>new _51({...G0,threadPool:G0.threadPool},(j0)=>new o81({...j0,threadState:j0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await S.dispose().catch((G0)=>{j.error("Failed to dispose thread pool during shutdown",G0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function d5(A){if(j.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)HB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7904
- `);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 l74({get:async(F)=>{if(F!==pd)return;try{let X=await P8A(L91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==pd)return;await g13(xt.dirname(L91),{recursive:!0}),await m13(L91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:I90()});J04($);let J=await Wb4({...A,workspaceTrust:{current:!0,changes:um},getHook:process.env.AMP_URL?(F,X)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return X()}:void 0});if(A.mcpConfig){let F=await Fg4(A.mcpConfig);J=Xg4(J,F)}let Y=xt.dirname(J.getSettingsFilePath());oR4(Rx,Y),J=bs1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=b7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!fH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:Yt4(await Be0(A,J))}}function z43(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(F,X)=>X.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function W43(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=xt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?d13:na));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function H43(){Wv4();let A=z43(process.argv),Q=W43(process.argv,A),B=Mv4(Q);pZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(i13(j),j.info("Starting Amp CLI.",{version:"0.0.1778871988-gfebe7f",buildTimestamp:"2026-05-15T19:10:43.549Z"}),process.platform==="win32"&&jj())Zu4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new s1(H7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await G43(B).parseAsync(process.argv)}nR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await H43().catch(Tz)});async function q43(A,Q){let B=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!B)await A.settings.set("url",process.env.AMP_URL,"global"),r6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7903
+ Or pipe via stdin: echo "your message" | amp --execute`)}function V43(){hA4([i50.parse({tool:"*",action:"allow"})]),HA4({bypass:!0})}async function $E0(A,Q,B,$){if(Q.headless)return U43(A,Q,B);let J=await y8(A,Q),Y=await J.serverStatusPromise,Z=gA(Y)&&ut(Y.features,SB.THREAD_ACTORS_TUI),F=Z&&!Q.takeMeBack;if(Q.showWelcome&&Q.hideWelcome)throw await J.asyncDispose(),new s1("Cannot use --show-welcome and --hide-welcome together",1);if(Q.showWelcome&&!Z)throw await J.asyncDispose(),new s1("--show-welcome is only available with the new Amp CLI feature flag",1);if(F){let X=!A.executeMode&&await B43();return V43(),K43(A,Q,B,J,{showNpmMigrationWelcome:X})}else{if(Q.threadId&&N9(Q.threadId)){let X=await r4.getThreadLinkInfo({thread:Q.threadId},{config:J.configService}).catch(()=>null);if(X?.ok&&X.result.usesThreadActors)throw await J.asyncDispose(),new s1(`Thread ${Q.threadId} was created with the Neo TUI and cannot be continued in the legacy CLI.`,1,"Re-run without --take-me-back to continue this thread.")}return E43(A,Q,B,$,{dependencies:J})}}async function U43(A,Q,B){let $=(H,q)=>{let N=Number(process.hrtime.bigint()-q)/1e6,I=$s0();j.info("Startup phase",{phase:H,phaseMs:Math.round(N),sinceMainMs:I===null?void 0:Math.round(I)})};N2(B,Q);let J=process.hrtime.bigint(),Y=await y8(A,Q);$("runMainThread:createThreadDependencies",J);let{serverStatus:Z}=Y;if(uX(Z))throw ft(Z,A.ampURL);let F=gA(Z)?Z:null,X=F?.user.email;await O91(B,Q,Z);let D=qW(Z),G=df(Q,D);if(G instanceof Error)V5(G.message);if(F&&!fM(Q.mode,X))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);if(process.env.AMP_EXECUTOR!=="1"&&(!X||!f7(X)))throw new s1("Headless executor mode is only available for Amp employees",1);qF0();let U=await Y.secretStorage.get("apiKey",A.ampURL);if(!U)throw new s1("API key required for headless mode. Please run `amp login` first.",1);let K=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(K&&!N9(K))throw new s1(`Invalid thread ID: ${K}`,1);let E=K?void 0:await _43({dependencies:Y,apiKey:U,visibility:G??void 0}),z=K??E?.threadId;if(!z)throw new s1("Failed to resolve headless thread ID",1);let W=await Qb4(z);if(W.status==="already-running")await Y.asyncDispose(),await _z(),process.exit(0);try{await if4({ampURL:A.ampURL,apiKey:U,workspaceRoot:process.cwd(),threadId:z,ownerUserId:E?.ownerUserId,threadVersion:E?.threadVersion,agentMode:E?.agentMode,initialToolDiscovery:Promise.all([Y.mcpService.initialized,Y.toolboxService.initialized,Y.pluginService.initialized]).then(()=>{return}),configService:Y.configService,mcpService:Y.mcpService,toolService:Y.toolService,skillService:Y.skillService,fileSystem:Y.fileSystem,pluginService:Y.pluginService,pluginPlatform:Y.headlessPluginPlatform})}finally{await W.release(),await Y.asyncDispose()}await _z(),process.exit(0)}async function K43(A,Q,B,$,J){let{userInput:Y,stdinInput:Z}=await k8A(Q),F=!!Q.streamJson||!!Q.streamJsonThinking;S8A({...Q,streamJson:F},A.executeMode,Y),N2(B,Q),Cv4(),qF0();let X=Q.threadId&&N9(Q.threadId)?Q.threadId:void 0,D=Q.observe?t8(Q.observe)??eB(Q.observe):void 0,G=await $.serverStatusPromise;if(uX(G))throw ft(G,A.ampURL);let V=qW(G),U=df(Q,V);if(U instanceof Error)V5(U.message);let K=null,E=async()=>{let H=$.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let q=await aa(A.settings,process.cwd(),V,U);if(q instanceof Error)V5(q.message);return q})(),K},z=await $.secretStorage.get("apiKey",A.ampURL);if(!z)throw new s1("API key required. Please run `amp login` first.",1);let W=gA(G)&&f7(G.user.email);if(A.executeMode){A01($.mcpService,A.settings);try{let H=QE0(B,Q),q=await gz(),N=X?H:sX0({agentMode:Q.mode,explicitEffort:H,sessionState:q}),I=X?void 0:tX0(await gx($.configService),{agentMode:Q.mode,explicitEffort:H,sessionState:q}),w=X?void 0:await E(),L=await Nf4({apiKey:z,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:$,userInput:Y,stdinInput:Z,stats:!!Q.stats,streamJson:F,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:Q.mode,reasoningEffort:N,labels:Q.label,initialThreadID:X,initialThreadMeta:w,initialSettings:I});if(await bt(L,"execute"),Q.archive)await $.threadService.archive(L,!0)}finally{await $.asyncDispose()}await _z(),process.exit(0)}else{let H=QE0(B,Q),q=J.showNpmMigrationWelcome?"npm-migration":"intro",N=IX0("0.0.1778876600-gb6c4d8",$.settingsStorage,{startDelayMs:3000}),I=new rX0($.mcpService,A.settings.getWorkspaceRootPath()),w=_l($.configService),L=new ts($.fuzzyServer),O=process.cwd();await vs4({ampURL:A.ampURL,apiKey:z,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??gF(A.ampURL),configService:$.configService,toolService:$.toolService,pluginPlatform:$.pluginPlatform,pluginService:$.pluginService,skillService:$.skillService,mcpService:$.mcpService,readFileSystemDirectory:({uri:P})=>qx({fileSystem:$.fileSystem,workspaceRoot:O},P),completionBuilder:L,workspaceRoot:O,listThreads:()=>w.listThreads(),getThreadFromServer:(P)=>w.getThread(P),toolboxes:$.toolboxService.toolboxes,isInternalUser:W,settingsFilePath:$.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:$.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:I,setActiveThreadID:(P)=>$.activeThread$.next(P),dispose:()=>{return I.dispose(),N.dispose(),$.asyncDispose()}},{initialThreadID:D??X,initialUserInput:Y||void 0,getDefaultNewThreadVisibility:E,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!D,splashOrbVisualStyle:"neo",hideNeoWelcome:!!Q.hideWelcome,showNeoWelcome:Q.showWelcome,neoWelcomeVariant:q,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,initialReasoningEffort:H}),process.exit(0)}}async function E43(A,Q,B,$,J){let Y=process.hrtime.bigint(),Z=(G0,j0)=>{let B0=Number(process.hrtime.bigint()-j0)/1e6,M0=$s0();j.info("Startup phase",{phase:G0,phaseMs:Math.round(B0),sinceMainMs:M0===null?void 0:Math.round(M0)})},{userInput:F,stdinInput:X}=await k8A(Q),D=!!Q.streamJson||!!Q.streamJsonThinking;S8A({...Q,streamJson:D},A.executeMode,F),N2(B,Q);let G=process.hrtime.bigint(),V=J?.dependencies??await y8(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&&uX(E))throw ft(E,A.ampURL);let z=gA(E)?E:null,W=z?.user.email,H=!!(W&&f7(W));if(H)qF0();if(!K)await O91(B,Q,E);let q=qW(E),N=q?.features??[],I=q?.team??null,w=df(Q,q);if(w instanceof Error)V5(w.message);if(z&&!fM(Q.mode,W))throw new s1(`Agent mode '${Q.mode}' is only available for Amp employees`,1);let L=Q.threadId&&N9(Q.threadId)?Q.threadId:void 0;G=process.hrtime.bigint();let O=await JE0(V);Z("runMainThread:createWorkerDeps",G);let P=A.executeMode?void 0:async(G0)=>bt(G0,"interactive"),T={threadService:V.threadService,workerDeps:O,createThread:async(G0)=>{let j0=K?await V.serverStatusPromise:E,B0=await aa(A.settings,process.cwd(),qW(j0),w);if(B0 instanceof Error)V5(B0.message);return s81(O,{threadMeta:B0,agentMode:G0??Q.mode,onFirstAssistantMessage:P})},validateThreadOwnership:async(G0,j0)=>{if(j0?.nonBlockingOwnershipCheck){C8A(G0,V.configService,V.viewerUserIDPromise).catch((B0)=>{if(B0 instanceof s1){if(j0.onOwnershipError){j0.onOwnershipError(B0,G0);return}Tz(B0,G0);return}j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})});return}try{await C8A(G0,V.configService,V.viewerUserIDPromise)}catch(B0){if(B0 instanceof s1)throw B0;j.warn("Failed to validate thread ownership in CLI, allowing to open",{error:B0})}},switchThreadVisibility:w,switchThreadAgentMode:Q.mode,onFirstAssistantMessage:P,handleError:Tz},k=async()=>{try{return aAA(T,Q.threadId,{nonBlockingOwnershipCheck:Q.nonBlockingThreadOwnershipCheck})}catch(G0){if(G0 instanceof s1)throw G0;throw await Tz(G0,Q.threadId),Error("handleError should have called process.exit()")}},y=(async()=>{if(K){j.info("Skipping initial free tier status fetch until auth is complete");return}try{let G0=await V.configService.getLatest(),j0=bm(G0),B0=await r4.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(j0)});if(B0.ok)return j.info("User free tier status:",B0),B0.result;return}catch(G0){j.error("Failed to fetch free tier status:",G0);return}})(),u=!A.executeMode?new C51:null,S,f=null;if(u)S=u,f=(async()=>{let G0=K?await V.serverStatusPromise:V.serverStatus;if(uX(G0))throw ft(G0,A.ampURL);await O91(B,Q,G0);let j0=process.hrtime.bigint(),B0=await k();if(Z("runMainThread:createThreadPool",j0),u.attach(B0),F){let M0=await T1(B0.threadHandles$);if(!M0)throw new s1("No active thread is available yet.",1);await M0.sendMessage({content:[{type:"text",text:F}]})}})(),f.catch(async(G0)=>{let j0=G0 instanceof Error?G0:Error(String(G0));u.setInitError(j0),await Tz(G0,Q.threadId)});else G=process.hrtime.bigint(),S=await k(),Z("runMainThread:createThreadPool",G);let d=Q.notifications!==void 0?Q.notifications:!A.executeMode;G=process.hrtime.bigint();let c=await V.configService.getLatest();if(Z("runMainThread:configService.getLatest",G),G=process.hrtime.bigint(),F43({configService:V.configService,threadService:V.threadService,config:c,useNotificationsForService:d,threadViewStates$:()=>S.threadHandles$.pipe(x4((G0)=>{if(!G0)return m0.of({});return L6(G0.thread$,G0.threadViewState$).pipe(q1(([j0,B0])=>({[j0.id]:B0})))}))}),Z("runMainThread:createCliNotificationService",G),A.executeMode){A01(V.mcpService,A.settings);let G0=QE0(B,Q),j0=await gz(),B0=L?G0:sX0({agentMode:Q.mode,explicitEffort:G0,sessionState:j0}),M0={userInput:F,stdinInput:X,dependencies:V,streamJson:D,streamJsonInput:!!Q.streamJsonInput,streamJsonThinking:!!Q.streamJsonThinking,stats:!!Q.stats,ampURL:A.ampURL,isInternalUser:H,agentMode:Q.mode,reasoningEffort:B0,labels:Q.label},n=await ev4({threadPool:S,...M0});if(await bt(n,"execute"),Q.archive)await V.threadService.archive(n,!0);await V.asyncDispose(),process.exit(0)}let h=!1,i=!1;if(Q.jetbrains||Q.ide){await a30();let G0=await gX({jetbrainsOnly:Q.jetbrains});if(G0.length===0){if(Q.jetbrains)h=!await V.configService.get("jetbrains.skipInstall")}else if(G0.length===1){let j0=G0[0];if(j0)l3.selectConfig(j0)}else i=!0}G=process.hrtime.bigint();let r=IX0("0.0.1778876600-gb6c4d8",V.settingsStorage,{startDelayMs:3000});Z("runMainThread:createUpdateService",G),G=process.hrtime.bigint();let s=new rX0(V.mcpService,A.settings.getWorkspaceRootPath());if(Z("runMainThread:createMcpTrustHandler",G),F&&A.executeMode){let G0=await T1(S.threadHandles$);if(!G0)throw new s1("No active thread is available yet.",1);await G0.sendMessage({content:[{type:"text",text:F}]})}G=process.hrtime.bigint();let I0=await gz();Z("runMainThread:loadSessionState",G),j.info("Loaded session state:",I0);let X0=QE0(B,Q),U0={...I0,launchCount:I0.launchCount+1,lastReasoningEffortByMode:X0?{...I0.lastReasoningEffortByMode,[Q.mode]:X0}:I0.lastReasoningEffortByMode};$B((G0)=>({...G0,launchCount:G0.launchCount+1}));try{if(G=process.hrtime.bigint(),await Ze4({history:new Ko,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,skillService:V.skillService,configService:V.configService,secretStorage:V.secretStorage,internalAPIClient:r4,threadPool:S,createSystemPromptDeps:async()=>_8A(V),ideClient:l3,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:s,updateService:r,pluginPlatform:V.pluginPlatform,pluginService:V.pluginService},{initialServerStatus:V.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:V.hasAPIKeyAtStartup,ampURL:A.ampURL,startupThreadID:L,showJetBrainsInstaller:h,showIdePickerHint:i,openThreadSwitcher:Q.openThreadSwitcher,jetbrainsMode:Q.jetbrains,clientId:c13,logFile:{path:$},sessionState:U0,freeTierStatusPromise:y,workspace:I??null,features:N,isInternalUser:H,initialAgentMode:B.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0,splashOrbVisualStyle:Q.neoOrb?"neo":"classic",buildTimestamp:"2026-05-15T20:27:13.265Z"},(G0)=>new _51({...G0,threadPool:G0.threadPool},(j0)=>new o81({...j0,threadState:j0.threadState}))),Z("runMainThread:mountApp-returned",G),f)await f}finally{await S.dispose().catch((G0)=>{j.error("Failed to dispose thread pool during shutdown",G0)})}await V.asyncDispose(),Z("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function d5(A){if(j.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)HB.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7904
+ `);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 l74({get:async(F)=>{if(F!==pd)return;try{let X=await P8A(L91,"utf-8");return JSON.parse(X).installationID}catch{return}},set:async(F,X)=>{if(F!==pd)return;await g13(xt.dirname(L91),{recursive:!0}),await m13(L91,JSON.stringify({installationID:X},null,2),{mode:384})}},{clientType:"cli",platform:I90()});J04($);let J=await Wb4({...A,workspaceTrust:{current:!0,changes:um},getHook:process.env.AMP_URL?(F,X)=>{if(F==="url")return Promise.resolve(process.env.AMP_URL);return X()}:void 0});if(A.mcpConfig){let F=await Fg4(A.mcpConfig);J=Xg4(J,F)}let Y=xt.dirname(J.getSettingsFilePath());oR4(Rx,Y),J=bs1(J);let Z=await J.get("url","admin")??await J.get("url","global");if(!Z)Z=b7;if(j.info("Resolved Amp URL",{ampURL:Z,settingsFile:J.getSettingsFilePath(),workspaceRoot:J.getWorkspaceRootPath()}),!fH(Z))j.info("Targeting custom Amp server",{ampURL:Z});return{executeMode:Q,isTTY:B,ampURL:Z,settings:J,secrets:Yt4(await Be0(A,J))}}function z43(A){let Q={};for(let B=0;B<A.length;B++){let $=A[B];if($?.startsWith("--")){let Y=$.slice(2).replace(/-([a-z])/g,(F,X)=>X.toUpperCase()),Z=A[B+1];if(Z&&!Z.startsWith("--"))Q[Y]=Z,B++}}return Q}function W43(A,Q){let B=A.includes("--headless")||A.some((J)=>J.startsWith("--headless=")),$=xt.resolve(Q.logFile??process.env.AMP_LOG_FILE??(B?d13:na));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:$}}async function H43(){Wv4();let A=z43(process.argv),Q=W43(process.argv,A),B=Mv4(Q);pZ0("silent");let $=process.argv.includes("--no-color"),J=process.argv.includes("--color"),Y=process.stdout.isTTY&&process.stderr.isTTY;if($||!J&&!Y)a0.level=0;if(i13(j),j.info("Starting Amp CLI.",{version:"0.0.1778876600-gb6c4d8",buildTimestamp:"2026-05-15T20:27:13.265Z"}),process.platform==="win32"&&jj())Zu4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new s1(H7.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await G43(B).parseAsync(process.argv)}nR4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await H43().catch(Tz)});async function q43(A,Q){let B=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!B)await A.settings.set("url",process.env.AMP_URL,"global"),r6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7905
7905
  `);else if(!fH(A.ampURL))r6.write(`Logging in to ${new URL(A.ampURL).hostname}
7906
7906
  `);let $=process.env.AMP_API_KEY;if($)r6.write(`API key found in environment variable, storing...
7907
7907
  `),await Q.set("apiKey",$,A.ampURL),r6.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1778871988-gfebe7f",
3
+ "version": "0.0.1778876600-gb6c4d8",
4
4
  "description": "Renamed to @ampcode/cli - see https://ampcode.com/news/npm-package-changes",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -8,7 +8,7 @@
8
8
  "amp": "node_modules/@ampcode/cli/bin/amp.exe"
9
9
  },
10
10
  "dependencies": {
11
- "@ampcode/cli": "0.0.1778871988-gfebe7f"
11
+ "@ampcode/cli": "0.0.1778876600-gb6c4d8"
12
12
  },
13
13
  "files": [
14
14
  "dist/main.js",