@sourcegraph/amp 0.0.1764359833-gb488a3 → 0.0.1764360079-gb488a3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +10 -10
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -4157,15 +4157,15 @@ Actual: ${G}`)}async function IV8(J,Q,Y){let{execSync:X}=await import("node:ch
4157
4157
  ${N}`;if(G==="pnpm"&&N.includes("Unable to find the global bin directory"))M+=`
4158
4158
 
4159
4159
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
4160
- npm install -g @sourcegraph/amp`;V(Error(M))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}L0();L0();async function W41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=jV8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],M=V.time[K],L=Date.now();if(N)z=Math.floor((L-new Date(N).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return f.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return f.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function jV8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}o0();function H41(J,Q){let Y=new c4,X=Y.pipe(o8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new TV().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await cU(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=YO(),W=await W41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await K41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await og(W.latestVersion,z);let U=await JN(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await cU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as mK}from"node:process";function C56(J){let Q=new pA().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(X)=>{await wC1(X.force||!1,X.verbose||!1,"0.0.1764359833-gb488a3"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new pA("update").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(X)=>{await SV8(X.targetVersion)});J.addCommand(Y)}async function SV8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")mK.write(h4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4160
+ npm install -g @sourcegraph/amp`;V(Error(M))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}L0();L0();async function W41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=jV8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],M=V.time[K],L=Date.now();if(N)z=Math.floor((L-new Date(N).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return f.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return f.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function jV8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}o0();function H41(J,Q){let Y=new c4,X=Y.pipe(o8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new TV().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await cU(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=YO(),W=await W41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await K41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await og(W.latestVersion,z);let U=await JN(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await cU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as mK}from"node:process";function C56(J){let Q=new pA().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(X)=>{await wC1(X.force||!1,X.verbose||!1,"0.0.1764360079-gb488a3"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new pA("update").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(X)=>{await SV8(X.targetVersion)});J.addCommand(Y)}async function SV8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")mK.write(h4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4161
4161
 
4162
4162
  `));try{if(!J){mK.write(h4.blue(`Checking for updates...
4163
- `));let X=YO(),{hasUpdate:G,latestVersion:Z}=await W41("0.0.1764359833-gb488a3",X);if(!G){mK.write(h4.green(`✓ Amp CLI is already up to date: ${"0.0.1764359833-gb488a3"} (${"released"} ${"2025-11-28T20:02:35.893Z"})
4164
- `));let V=await JN("0.0.1764359833-gb488a3");if(V.warning)mK.write(`
4163
+ `));let X=YO(),{hasUpdate:G,latestVersion:Z}=await W41("0.0.1764360079-gb488a3",X);if(!G){mK.write(h4.green(`✓ Amp CLI is already up to date: ${"0.0.1764360079-gb488a3"} (${"released"} ${"2025-11-28T20:06:33.380Z"})
4164
+ `));let V=await JN("0.0.1764360079-gb488a3");if(V.warning)mK.write(`
4165
4165
  `+h4.yellow(V.warning)+`
4166
4166
  `);process.exit(0)}if(!Z)mK.write(h4.yellow("[WARN] could not find latest version")),process.exit(0);J=Z}mK.write(h4.blue(`Updating to version ${J}...
4167
4167
  `)),await og(J,void 0,(X)=>{mK.write(h4.dim(`Running: ${X}
4168
- `))});let Q="released";mK.write(h4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-11-28T20:02:35.893Z"})
4168
+ `))});let Q="released";mK.write(h4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-11-28T20:06:33.380Z"})
4169
4169
  `));let Y=await JN(J);if(Y.warning)mK.write(`
4170
4170
  `+h4.yellow(Y.warning)+`
4171
4171
  `);process.exit(0)}catch(Q){let Y=Q instanceof Error?Q.message:String(Q);mK.write(h4.red.bold("Error: ")+Y+`
@@ -4781,7 +4781,7 @@ exit code: ${Z}`,new q1({color:X.foreground,dim:!0,italic:!0})));if(q)V.push(new
4781
4781
  `,N),...M])})];if(W.url){let S=W.url.replace(/^https?:\/\//,"");I.push(new Y7({uri:W.url,text:S,style:new q1({color:Y.secondary,underline:!0})}))}let T=new F0({width:40,child:new a0({crossAxisAlignment:"start",mainAxisSize:"min",children:I})});return z8.child(new r6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new uj1({width:YX6,height:XX6,agentMode:this.widget.agentMode,glow:this._glow,t:L,fps:0,shockwaves:this._shockwaves,onShockwave:E,...q==="disabled"&&{seed:42}}),new F0({width:2}),T]}))}}L0();D9();B4();d7();D9();o0();function iM8(J,Q){return`${J}:${Q}`}class Dk1{threadService;workers=new Map;threadsMap=new Map;subthreadsMap=new Map;mainThreadSubs=new Map;subthreadsSubs=new Map;workerStatusSubs=new Map;subthreadPatchSubs=new Map;mainThreadObservable;subthreadObservable;workerStatusObservable;emitMainThread=null;emitSubthread=null;emitWorkerStatus=null;constructor(J){this.threadService=J;this.mainThreadObservable=new X0((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new X0((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new X0((Q)=>{return this.emitWorkerStatus=(Y)=>Q.next(Y),()=>{this.emitWorkerStatus=null}})}registerWorker(J){let Q=J.thread.id;if(this.workers.has(Q))this.unregisterWorker(Q);this.threadsMap.set(Q,J.thread),this.subthreadsMap.set(Q,[]),this.workers.set(Q,{state:"initial"});let Y=this.threadService.observePatches(Q).pipe(IM()).subscribe((Z)=>{this.threadsMap.set(Q,Z);let q=this.subthreadsMap.get(Q)||[],V=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:Z,subthreads:q,workerStatus:V})});this.mainThreadSubs.set(Q,Y);let X=J.status.subscribe((Z)=>{if(this.workers.set(Q,Z),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:Z})});this.workerStatusSubs.set(Q,X);let G=J.subthreads.subscribe((Z)=>{this.subthreadsMap.set(Q,Z);for(let q of Z){let V=iM8(Q,q.toolUse.id);if(this.subthreadPatchSubs.has(V))continue;let K=this.threadService.observePatches(q.threadID).pipe(IM()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:q})});this.subthreadPatchSubs.set(V,K)}});this.subthreadsSubs.set(Q,G)}unregisterWorker(J){let Q=this.mainThreadSubs.get(J);if(Q)Q.unsubscribe(),this.mainThreadSubs.delete(J);let Y=this.workerStatusSubs.get(J);if(Y)Y.unsubscribe(),this.workerStatusSubs.delete(J);let X=this.subthreadsSubs.get(J);if(X)X.unsubscribe(),this.subthreadsSubs.delete(J);for(let[G,Z]of this.subthreadPatchSubs.entries())if(G.startsWith(`${J}:`))Z.unsubscribe(),this.subthreadPatchSubs.delete(G);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new X0((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new X0((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new X0((Q)=>{return this.workerStatusObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})})}}get threadViewStates(){let J={};for(let[Q,Y]of this.threadsMap){let X=this.workers.get(Q);if(X)J[Q]=LA(Y,X)}return J}dispose(){for(let J of this.mainThreadSubs.values())J.unsubscribe();for(let J of this.subthreadsSubs.values())J.unsubscribe();for(let J of this.workerStatusSubs.values())J.unsubscribe();for(let J of this.subthreadPatchSubs.values())J.unsubscribe();this.mainThreadSubs.clear(),this.subthreadsSubs.clear(),this.workerStatusSubs.clear(),this.subthreadPatchSubs.clear(),this.workers.clear(),this.threadsMap.clear(),this.subthreadsMap.clear()}}function nM8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Y,subthread:X}=Q,G=J.subagents[X.threadID];if(!G){if(G={subThreadID:Y.id,parentToolID:X.toolUse.id,taskDescription:X.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=JQ(J.mainThread);G.isCompleted=ZX6(W,X.toolUse.id)}}let Z=aM8(Y,G.agentState),q=G.agentState===Z?G:{...G,agentState:Z},V={...J.tools},K=pC(Y).items.filter((W)=>W.type==="toolResult");for(let W of K)V[W.id]={id:W.id,subthreadID:Y.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[X.threadID]:q},tools:V,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Y,subthreads:X,workerStatus:G}=Q,Z=JQ(Y),q={...J.subagents};for(let z of X){let U=q[z.threadID];if(!U)continue;let N=ZX6(Z,z.toolUse.id);q[z.threadID]={...U,isCompleted:N}}let{items:V}=pC(Y),K=LA(Y,G),W=WI({messages:Y.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:q,items:V,viewState:K,todosList:H,mainThread:Y}}case"worker-status-change":{if(!J.mainThread)return J;let Y=LA(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function pC(J){let Q=[],Y=new Map,X=new Set;for(let[G,Z]of J.messages.entries()){let q=`${Z.role}-${G}`;switch(Z.role){case"assistant":{let V=Z.state.type==="streaming";for(let W of Z.content)if(W.type==="tool_use"){if(Y.set(W.id,W),V)X.add(W.id)}if(Z.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:q,message:Z});for(let W of Z.content)if(W.type==="tool_use"){let H=!1;for(let z=G+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let N of U.content)if(N.type==="tool_result"&&N.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:V?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:q,message:Z});break;case"user":{let V=Z.content.some((K)=>K.type==="text"&&K.text.trim()||K.type==="image");for(let K of Z.content)if(K.type==="tool_result"){let W=Y.get(K.toolUseID)??MX(J,K.toolUseID);if(!W)throw Error(`(bug) tool use ${K.toolUseID} not found`);Q.push({type:"toolResult",id:K.toolUseID,toolUse:W,toolResult:K})}if(V)Q.push({type:"message",id:q,message:Z});break}}}return{items:Q}}function ZX6(J,Q){let Y=J.get(Q);return(Y&&B2(Y.run))??!1}function aM8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((G)=>G.type==="tool_result"&&G.run.status==="blocked-on-user"))return f.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(pC(J).items.some((G)=>G.type==="toolResult"&&G.toolResult.run.status==="in-progress")){let G=Q?.type==="running-tools"?Q.startTime:Date.now();return f.info("Subagent status: running-tools",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}if(Y&&Y.role==="assistant"&&Y.state.type==="streaming")switch(Y.content.at(-1)?.type){case"text":return f.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return f.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let Z=Q?.type==="running-tools"?Q.startTime:Date.now();return f.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:Z,hasStartTime:!!Z}),{type:"running-tools",startTime:Z}}default:return f.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return f.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class Mk1 extends X6{props;constructor(J){super();this.props=J}createState(){return new $X6}}class $X6 extends Q6{state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null};workerController;subscriptions=[];recentThreadIDs=[];currentWorker;constructor(){super();this.workerController=null,this.currentWorker=null}addToRecentThreads(J){this.setState(()=>{let Q=this.recentThreadIDs.indexOf(J);if(Q!==-1)this.recentThreadIDs.splice(Q,1);if(this.recentThreadIDs.unshift(J),this.recentThreadIDs.length>50)this.recentThreadIDs.pop()})}initState(){let{threadService:J,worker:Q}=this.widget.props;this.workerController=new Dk1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),Y=Q.mainThread.subscribe((Z)=>{this.dispatch({type:"main-thread-patch",thread:Z.mainThread,subthreads:Z.subthreads,workerStatus:Z.workerStatus})});this.subscriptions.push(Y);let X=Q.subthreads.subscribe((Z)=>{this.dispatch({type:"subthread-patch",thread:Z.thread,subthread:Z.subthread})});this.subscriptions.push(X);let G=Q.workerStatus.subscribe((Z)=>{this.dispatch({type:"worker-status-change",workerStatus:Z.status})});this.subscriptions.push(G)}cleanup(){this.subscriptions.forEach((J)=>J.unsubscribe()),this.subscriptions=[]}switchWorker(J){this.cleanup(),this.setState(()=>{this.currentWorker=J}),this.setState(()=>{this.state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null}}),this.setupSubscriptions(J),this.addToRecentThreads(J.thread.id)}dispatch(J){this.setState(()=>{this.state=nM8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((Z)=>({toolUse:Z.toolUse,toolRun:Z.toolRun,subthreadID:Z.subthreadID})),Q={};for(let Z of Object.values(this.state.subagents)){let q=J.filter((V)=>V.subthreadID===Z.subThreadID);Q[Z.parentToolID]=q}let Y=(Z)=>Z===s5||Z===q9||Z===DX,X=new Map;for(let Z of this.state.items)if(Z.type==="toolResult"&&Y(Z.toolUse.name))X.set(Z.toolUse.id,{toolUseId:Z.toolUse.id,toolName:Z.toolUse.name,toolRun:Z.toolResult.run});let G=Array.from(X.values());for(let{toolUseId:Z,toolRun:q}of G){let V=[],K;if(q.status==="in-progress"||q.status==="done"||q.status==="error"||q.status==="cancelled")K=q.progress;if(K){let W=0;for(let H of K)if(H.tool_uses)for(let z of H.tool_uses){let U=`${Z}:progress:${W++}`;V.push({toolUse:qI(z.tool_name,z.input,U),toolRun:{status:z.status}})}}Q[Z]=V}return{...this.state,subagents:Object.values(this.state.subagents),subagentActiveTools:J,subagentToolsByParentID:Q}}build(J){let Q=this.getThreadData();return this.widget.props.builder(J,Q,this.workerController,(Y)=>this.switchWorker(Y),()=>this.currentWorker,this.recentThreadIDs)}}class Lk1 extends X6{props;constructor(J){super({key:J.key});this.props=J}createState(){return new qX6}}class qX6 extends Q6{build(J){let Y=L6.of(J).colors,{todos:X,title:G="TODOs"}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new F0({width:0,height:0});let Z=X.map((q)=>this.buildTodoItem(q,Y));return new Y6({child:new d6({padding:_0.symmetric(1,0),child:new a0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new m1({text:new e(G,new q1({bold:!0,color:Y.foreground}))}),...Z]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),X=J.status==="completed",G=new q1({bold:J.status==="in-progress",color:Q.foreground,dim:X}),Z=new q1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:X});return new r6({crossAxisAlignment:"start",children:[new m1({text:new e(Y,G)}),new F0({width:1}),new N4({child:new m1({text:new e(J.content,Z)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class Ak1 extends w6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Y,onButtonClick:X}){super({key:J});this.ad=Q,this.onDismiss=Y,this.onButtonClick=X}build(J){let Q=L6.of(J),Y=Q.colors.primary,X=Q.colors.foreground;return new Y6({decoration:new H8(void 0,new f4(new w4(Y,1,"rounded"),new w4(Y,1,"rounded"),void 0,new w4(Y,1,"rounded"))),child:new d6({padding:_0.horizontal(1),child:new a0({children:[new r6({crossAxisAlignment:"start",children:[new N4({child:new m1({text:new e(this.ad.content,new q1({color:X}))})}),new F0({width:4}),new Y7({uri:"https://ampcode.com/free",text:"Ad",style:new q1({color:X,dim:!0})})]}),new r6({crossAxisAlignment:"start",children:[new ej1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:_0.horizontal(1),color:Y,reverse:!0}),new F0({width:2}),new m1({text:new e(this.ad.destinationUrlHostname,new q1({color:X,dim:!0}))})]})]})})})}}class Ok1 extends X6{props;constructor(J){super();this.props=J}createState(){return new VX6(this.props.autofocus??!0)}}class VX6 extends Q6{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(V)=>{if(V.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(V.ctrlKey&&V.key==="c"||V.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Y=W8.sizeOf(J),X=Math.min(60,Y.width-4),G=Y.height-4,Z=[];if(this.widget.props.title)Z.push(new m1({text:new e(this.widget.props.title,new q1({bold:!0,color:A1.blue}))}),new F0({height:1}));if(this.widget.props.message)Z.push(new m1({text:new e(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)Z.push(new F0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new m1({text:new e("Enter to copy",new q1({dim:!0}))}));return q.push(new m1({text:new e("Escape to close",new q1({dim:!0}))})),Z.push(new r6({children:q.flatMap((V,K)=>K<q.length-1?[V,new F0({width:1}),new m1({text:new e("•",new q1({dim:!0}))}),new F0({width:1})]:[V]),mainAxisSize:"min"})),new z8({child:new Y6({constraints:new t6(X,X,0,G),decoration:new H8(A1.default(),new f4(new w4(A1.blue,1,"rounded"),new w4(A1.blue,1,"rounded"),new w4(A1.blue,1,"rounded"),new w4(A1.blue,1,"rounded"))),padding:new _0(2,2,2,2),child:new Y9({autofocus:this.autofocus,onKey:Q,child:new a0({children:Z,mainAxisSize:"min"})})})})}}class T91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,T91.prototype)}}class C91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,C91.prototype)}}function wk1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Y)=>{if(Y.startsWith('"')&&Y.endsWith('"')||Y.startsWith("'")&&Y.endsWith("'"))return Y.slice(1,-1);return Y})}UU();L0();import{spawn as oM8}from"node:child_process";import{promises as rM8}from"node:fs";function KX6(J){return J.kind==="executable"}function WX6(J){return J.kind==="markdown"}var _z=50000,HX6=300000;async function Ek1(J,Q,Y,X={}){let{timeoutMs:G=HX6,signal:Z,source:q}=X;try{let V=await Y.getCommand(J,q);if(!V)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Y.isCommandAvailable(J,q))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(f.debug("Executing command",{commandName:J,filePath:V.filePath,args:Q}),WX6(V))return await sM8(V,Q);else if(KX6(V))return await tM8(V,Q,G,Z);else return{success:!1,output:"",error:"Unsupported command type"}}catch(V){return f.error("Failed to execute command",{commandName:J,error:V}),{success:!1,output:"",error:V instanceof Error?V.message:"Unknown error occurred"}}}async function sM8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await rM8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>_z?Y.slice(0,_z)+`
4782
4782
  ... (output truncated at ${_z} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function tM8(J,Q,Y=HX6,X){return new Promise((G)=>{let[Z,q]=eM8(J,Q);f.debug("Spawning command",{spawnCommand:Z,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Y});let V=pw0(X),K=!1,W=setTimeout(()=>{K=!0,V.abort(),f.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=oM8(Z,q,{stdio:["pipe","pipe","pipe"],signal:V.signal,detached:!0}),z=[],U=[],N=0;H.stdout?.on("data",(M)=>{let L=M.toString();if(N+=L.length,N<=_z)z.push(L);else{let A=_z-(N-L.length);if(A>0)z.push(L.slice(0,A))}}),H.stderr?.on("data",(M)=>{let L=M.toString();if(N+=L.length,N<=_z)U.push(L);else{let A=_z-(N-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(M)=>{if(clearTimeout(W),K){G({success:!1,output:z.join(""),error:`Command timed out after ${Y}ms`,exitCode:void 0});return}if(V.signal.aborted){G({success:!1,output:z.join(""),error:"The command was aborted",exitCode:M??void 0});return}let L=M===0||M===1,A=z.join(""),E=U.join(""),P=A;if(!L&&!A.trim()&&E.trim())P=E;else if(E.trim())P+=A?`
4783
4783
  ${E}`:E;if(N>_z)P+=`
4784
- ... (output truncated at ${_z} characters)`;G({success:L,output:P.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(K)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";G({success:!1,output:z.join(""),error:L})})})}function eM8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return QL8(Y,X?[...X]:null,G,Q);else return JL8(Y,X?[...X]:null,G,Q)}function JL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function QL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}L0();x$();x3();oW();_X();a$();zH();_H();d7();Vk();o0();var TX6=B6(gP(),1);import{writeFile as IX6}from"fs/promises";import PX6 from"path";L0();_X();class Ik1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;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 J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764359833-gb488a3"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Po(Q,this.configService)}catch(Q){f.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class Pk1 extends X6{props;constructor(J){super();this.props=J}createState(){return new zX6}}class zX6 extends Q6{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class FX6 extends Q6{controller=new mZ;focusNode=new l8({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.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(J){let Q=L6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=f4.all(new w4(Y.foreground,1,"solid")),K=new BO({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(N)=>{let M=N.trim();if(G&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new r6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new e("Enter",new q1({color:X.keybind}))),z.push(new e(" to submit, ",new q1({color:Y.foreground,dim:!0})));z.push(new e("Esc",new q1({color:X.keybind}))),z.push(new e(" to cancel",new q1({color:Y.foreground,dim:!0})));let U=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,z)})});return new Y6({decoration:{border:V,color:A1.default()},padding:_0.all(1),child:new a0({children:[H,new F0({height:1}),W,new n5,U]})})}}class j91 extends X6{props;constructor(J){super();this.props=J}createState(){return new FX6}}zH();class UX6 extends Q6{controller=new mZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new l8({debugLabel:"CommandMultilinePrompt",onKey:(J)=>{if(J.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=(J)=>{if(this.imageAttachments.length>=BU)return!1;let Q=TC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!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(J){let Q=L6.of(J),{colors:Y,app:X}=Q,Z=W8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new CO({controller:this.controller,triggers:[new LN],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(N)=>{this.widget.props.onSubmit(N.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:I9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new Y9({focusNode:this.focusNode,child:V}),W=new Y6({constraints:new t6({maxHeight:q}),padding:_0.symmetric(1,0),child:K}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=new Y6({padding:_0.symmetric(1,0),child:new m1({text:this.isConfirmingClearInput?new e("",void 0,[new e("Esc",new q1({color:X.keybind})),new e(" again to clear input",new q1({color:Y.foreground,dim:!0}))]):new e("",void 0,[new e("Press ",new q1({color:Y.foreground,dim:!0})),new e("Enter",new q1({color:X.keybind})),new e(" to submit, ",new q1({color:Y.foreground,dim:!0})),new e("Esc",new q1({color:X.keybind})),new e(" to clear",new q1({color:Y.foreground,dim:!0}))])})}),U=[H,new F0({height:1}),new N4({child:W}),new F0({height:1}),z];return new Y6({decoration:{border:f4.all(new w4(Y.foreground,1,"solid")),color:A1.default()},padding:_0.all(1),child:new a0({children:U})})}}class dC extends X6{props;constructor(J){super();this.props=J}createState(){return new UX6}}import{isDeepStrictEqual as ZL8}from"node:util";var YL8=/[\\/_ +.#"@[({&]/,XL8=/[\\/_ +.#"@[({&]/g,GL8=/[\s-]/,BX6=/[\s-]/g;function _91(J,Q,Y,X,G,Z,q){if(Z===Q.length){if(G===J.length)return 1;return 0.99}let V=`${G},${Z}`;if(q[V]!==void 0)return q[V];let K=X.charAt(Z),W=Y.indexOf(K,G),H=0,z,U,N,M;while(W>=0){if(z=_91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(GL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(BX6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(YL8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(XL8),N&&G>0)z*=Math.pow(0.999,N.length)}else if(z*=0.3,G>0)z*=Math.pow(0.999,W-G);if(J.charAt(W)!==Q.charAt(Z))z*=0.9999}if(z<0.1&&(Y.charAt(W-1)===X.charAt(Z+1)||X.charAt(Z+1)===X.charAt(Z)&&Y.charAt(W-1)!==X.charAt(Z))){if(U=_91(J,Q,Y,X,W+1,Z+2,q),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(K,W+1)}return q[V]=H,H}function S91(J){return J.toLowerCase().replace(BX6," ")}function NX6(J,Q){let Y=_91(J,Q,S91(J),S91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=_91(J,V,S91(J),S91(V),0,0,{});if(K===0)return Y;G+=K,Z+=V.length}let q=G/X.length*0.95;return Math.max(Y,q)}return Y}class cC{}class lC{}class k91{}class y91{}class DX6 extends X6{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new MX6}}class MX6 extends Q6{build(J){return this.widget.onContext(J),this.widget.child}}function $L8(J,Q){if(J==="")return{matches:!0,score:1};let Y=NX6(Q,J);return{matches:Y>0.15,score:Y}}class rK extends X6{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new LX6}}class LX6 extends Q6{controller=new mZ;focusNode;scrollController=new i3;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new l8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),J9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!ZL8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof cC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof lC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof k91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof y91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...$L8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,X=Q.size.height;S81(J,{top:Y,bottom:X},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),J9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let X=Y[J],G=X?this.widget.props.isItemDisabled?.(X)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!G){if(X)this.widget.props.onAccept(X)}}};build(J){let Q=L6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=f4.all(new w4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new BO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new kq({shortcuts:new Map([[new U4("ArrowDown"),new cC],[new U4("ArrowUp"),new lC],[new U4("Tab"),new cC],[new U4("Tab",{shift:!0}),new lC],[new U4("n",{ctrl:!0}),new cC],[new U4("p",{ctrl:!0}),new lC],[new U4("Enter"),new k91],[new U4("Escape"),new y91]]),focusNode:this.focusNode,child:q}),K=new nQ({actions:new Map([[cC,new Q9(this.invoke)],[lC,new Q9(this.invoke)],[k91,new Q9(this.invoke)],[y91,new Q9(this.invoke)]]),child:V}),W=new r6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new F0({height:10,child:new z8({child:new m1({text:new e(L,new q1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new N4({child:new z8({child:new m1({text:new e(this.widget.props.emptyStateText,new q1({color:Y.foreground,dim:!0}))})})});else{let L=X.map((A,E)=>{let P=E===this.selectedIndex,I=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,P,I,J);else{let S=P?A1.yellow:void 0,y=P?A1.black:Y.foreground;T=new Y6({decoration:S?{color:S}:void 0,padding:_0.symmetric(2,0),child:new m1({text:new e(this.widget.props.getLabel(A),new q1({color:y,dim:I}))})})}return new DX6(new T8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new a0({children:L,crossAxisAlignment:"start"})}let z=new N4({child:new T8({onScroll:this.handleScroll,opaque:!1,child:new R2({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e(this.widget.props.title,new q1({color:A1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new F0({height:1}),z),this.controller.text!==""){let L=X.length>0?X[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new Y6({padding:_0.vertical(1),child:new z8({child:A})}));else U.push(new F0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new Y6({decoration:{border:G,color:A1.default()},padding:_0.symmetric(1,0),child:new a0({children:U})})}}class Rk1 extends X6{createState(){return new AX6}}class AX6 extends Q6{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){return new m1({text:new e("●",new q1({color:this.isGreen?A1.green:A1.index(8),bold:!0})),maxLines:1})}}function qL8(J){let Q=new Map,Y=new Map,X=[];for(let Z of J)Q.set(Z.id,Z);for(let Z of J){let q=Z.parentRelationships.find((V)=>V.role==="child"&&V.type==="fork"&&Q.has(V.threadID));if(q){let V=q.threadID,K=Y.get(V)||[];K.push(Z),Y.set(V,K)}else X.push(Z)}return VG.flatten(X,(Z)=>Y.get(Z.id)).map((Z)=>({...Z.item,depth:Z.depth,isLast:Z.isLast,ancestorsAreLast:Z.ancestorsAreLast}))}function Tk1(J,Q,Y){return new m1({text:new e(`${J}${Q}`,new q1({color:Y})),maxLines:1})}function VL8(J,Q,Y,X){return[Tk1("+",J,X.success),n5.horizontal(1),Tk1("~",Q,X.warning),n5.horizontal(1),Tk1("-",Y,X.destructive)]}class x91 extends w6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],X=this.props.currentThreadID,G=[...Q].sort((H,z)=>{if(X){if(H.id===X)return-1;if(z.id===X)return 1}let U=Y.indexOf(H.id),N=Y.indexOf(z.id);if(U!==-1&&N!==-1)return U-N;if(U!==-1)return-1;if(N!==-1)return 1;return 0}),Z=qL8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=L6.of(J),K=new d6({padding:_0.symmetric(0,1),child:new z8({child:new m1({text:new e("",new q1({color:V.colors.foreground,dim:!0}),[new e("Ctrl+T",new q1({color:A1.blue,dim:!0})),new e(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new q1({color:V.colors.foreground,dim:!0}))])})})});return new rK({items:Z,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:K,renderItem:(H,z,U,N)=>{let M=L6.of(N),{colors:L}=M,A=z?A1.yellow:void 0,E=z?A1.black:L.foreground,P=A1.index(8),I=(g,p)=>new F0({width:p,child:r6.end([new m1({text:new e(g,new q1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[];if(H.depth>0){let g=new f81,p=[],b=H.ancestorsAreLast.slice(1);for(let n of b)p.push(new e(g.getAncestorPrefix(n),new q1({color:g.connectorColor,dim:g.connectorDim})));let l=H.isLast?g.elbow:g.tee,Q1=g.getConnectorText(l);p.push(new e(Q1,new q1({color:g.connectorColor,dim:g.connectorDim}))),S.push(new m1({text:new e("",void 0,p)}))}let y=[],x=this.props.currentThreadID===H.id?new e("(current) ",new q1({color:A1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new e("(visited) ",new q1({color:L.foreground,dim:!0})):null;if(x)y.push(new m1({text:x}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))y.push(new Rk1),y.push(new F0({width:1}))}if(y.push(new N4({child:new m1({text:new e(H.title,new q1({color:E})),overflow:"ellipsis",maxLines:1})})),y.push(new F0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let g=z?{success:P,warning:P,destructive:P}:L;y.push(...VL8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,g)),y.push(new F0({width:2}))}return y.push(I(H.description.timeAgo,q)),new Y6({decoration:A?{color:A}:void 0,padding:_0.symmetric(2,0),child:new r6({children:[...S,...y]})})}})}}function OX6(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/60000),G=Math.floor(Y/3600000),Z=Math.floor(Y/86400000);if(X<1)return"just now";if(X<60)return`${X}m ago`;if(G<24)return`${G}h ago`;if(Z<7)return`${Z}d ago`;return J.toLocaleDateString()}class Ck1 extends w6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((G,Z)=>Z.pubDate.getTime()-G.pubDate.getTime()),Y=Math.max(0,...Q.map((G)=>OX6(G.pubDate).length));return new rK({items:Q,getLabel:(G)=>G.title,onAccept:(G)=>this.props.onSelect?.(G),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(G,Z,q,V)=>{let K=L6.of(V),{colors:W}=K,H=Z?A1.yellow:void 0,z=Z?A1.black:W.foreground,U=A1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new F0({width:A,child:r6.end([new m1({text:new e(L,new q1({color:U}))})])});return new Y6({decoration:H?{color:H}:void 0,padding:_0.symmetric(2,0),child:new r6({children:[new N4({child:new m1({text:new e(G.title,new q1({color:z})),overflow:"ellipsis",maxLines:1})}),new F0({width:2}),new m1({text:new e(N,new q1({color:U})),maxLines:1}),new F0({width:2}),M(OX6(G.pubDate),Y)]})})}})}}class jk1 extends w6{props;constructor(J){super();this.props=J}build(){return new z8({child:new m1({text:new e("",void 0,[new e(`Forked to new thread:
4784
+ ... (output truncated at ${_z} characters)`;G({success:L,output:P.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(K)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";G({success:!1,output:z.join(""),error:L})})})}function eM8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return QL8(Y,X?[...X]:null,G,Q);else return JL8(Y,X?[...X]:null,G,Q)}function JL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function QL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}L0();x$();x3();oW();_X();a$();zH();_H();d7();Vk();o0();var TX6=B6(gP(),1);import{writeFile as IX6}from"fs/promises";import PX6 from"path";L0();_X();class Ik1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;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 J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764360079-gb488a3"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Po(Q,this.configService)}catch(Q){f.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class Pk1 extends X6{props;constructor(J){super();this.props=J}createState(){return new zX6}}class zX6 extends Q6{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class FX6 extends Q6{controller=new mZ;focusNode=new l8({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.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(J){let Q=L6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=f4.all(new w4(Y.foreground,1,"solid")),K=new BO({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(N)=>{let M=N.trim();if(G&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new r6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new e("Enter",new q1({color:X.keybind}))),z.push(new e(" to submit, ",new q1({color:Y.foreground,dim:!0})));z.push(new e("Esc",new q1({color:X.keybind}))),z.push(new e(" to cancel",new q1({color:Y.foreground,dim:!0})));let U=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,z)})});return new Y6({decoration:{border:V,color:A1.default()},padding:_0.all(1),child:new a0({children:[H,new F0({height:1}),W,new n5,U]})})}}class j91 extends X6{props;constructor(J){super();this.props=J}createState(){return new FX6}}zH();class UX6 extends Q6{controller=new mZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new l8({debugLabel:"CommandMultilinePrompt",onKey:(J)=>{if(J.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=(J)=>{if(this.imageAttachments.length>=BU)return!1;let Q=TC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!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(J){let Q=L6.of(J),{colors:Y,app:X}=Q,Z=W8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new CO({controller:this.controller,triggers:[new LN],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(N)=>{this.widget.props.onSubmit(N.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:I9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new Y9({focusNode:this.focusNode,child:V}),W=new Y6({constraints:new t6({maxHeight:q}),padding:_0.symmetric(1,0),child:K}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=new Y6({padding:_0.symmetric(1,0),child:new m1({text:this.isConfirmingClearInput?new e("",void 0,[new e("Esc",new q1({color:X.keybind})),new e(" again to clear input",new q1({color:Y.foreground,dim:!0}))]):new e("",void 0,[new e("Press ",new q1({color:Y.foreground,dim:!0})),new e("Enter",new q1({color:X.keybind})),new e(" to submit, ",new q1({color:Y.foreground,dim:!0})),new e("Esc",new q1({color:X.keybind})),new e(" to clear",new q1({color:Y.foreground,dim:!0}))])})}),U=[H,new F0({height:1}),new N4({child:W}),new F0({height:1}),z];return new Y6({decoration:{border:f4.all(new w4(Y.foreground,1,"solid")),color:A1.default()},padding:_0.all(1),child:new a0({children:U})})}}class dC extends X6{props;constructor(J){super();this.props=J}createState(){return new UX6}}import{isDeepStrictEqual as ZL8}from"node:util";var YL8=/[\\/_ +.#"@[({&]/,XL8=/[\\/_ +.#"@[({&]/g,GL8=/[\s-]/,BX6=/[\s-]/g;function _91(J,Q,Y,X,G,Z,q){if(Z===Q.length){if(G===J.length)return 1;return 0.99}let V=`${G},${Z}`;if(q[V]!==void 0)return q[V];let K=X.charAt(Z),W=Y.indexOf(K,G),H=0,z,U,N,M;while(W>=0){if(z=_91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(GL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(BX6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(YL8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(XL8),N&&G>0)z*=Math.pow(0.999,N.length)}else if(z*=0.3,G>0)z*=Math.pow(0.999,W-G);if(J.charAt(W)!==Q.charAt(Z))z*=0.9999}if(z<0.1&&(Y.charAt(W-1)===X.charAt(Z+1)||X.charAt(Z+1)===X.charAt(Z)&&Y.charAt(W-1)!==X.charAt(Z))){if(U=_91(J,Q,Y,X,W+1,Z+2,q),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(K,W+1)}return q[V]=H,H}function S91(J){return J.toLowerCase().replace(BX6," ")}function NX6(J,Q){let Y=_91(J,Q,S91(J),S91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=_91(J,V,S91(J),S91(V),0,0,{});if(K===0)return Y;G+=K,Z+=V.length}let q=G/X.length*0.95;return Math.max(Y,q)}return Y}class cC{}class lC{}class k91{}class y91{}class DX6 extends X6{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new MX6}}class MX6 extends Q6{build(J){return this.widget.onContext(J),this.widget.child}}function $L8(J,Q){if(J==="")return{matches:!0,score:1};let Y=NX6(Q,J);return{matches:Y>0.15,score:Y}}class rK extends X6{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new LX6}}class LX6 extends Q6{controller=new mZ;focusNode;scrollController=new i3;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new l8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),J9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!ZL8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof cC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof lC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof k91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof y91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...$L8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,X=Q.size.height;S81(J,{top:Y,bottom:X},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),J9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let X=Y[J],G=X?this.widget.props.isItemDisabled?.(X)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!G){if(X)this.widget.props.onAccept(X)}}};build(J){let Q=L6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=f4.all(new w4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new BO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new kq({shortcuts:new Map([[new U4("ArrowDown"),new cC],[new U4("ArrowUp"),new lC],[new U4("Tab"),new cC],[new U4("Tab",{shift:!0}),new lC],[new U4("n",{ctrl:!0}),new cC],[new U4("p",{ctrl:!0}),new lC],[new U4("Enter"),new k91],[new U4("Escape"),new y91]]),focusNode:this.focusNode,child:q}),K=new nQ({actions:new Map([[cC,new Q9(this.invoke)],[lC,new Q9(this.invoke)],[k91,new Q9(this.invoke)],[y91,new Q9(this.invoke)]]),child:V}),W=new r6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new F0({height:10,child:new z8({child:new m1({text:new e(L,new q1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new N4({child:new z8({child:new m1({text:new e(this.widget.props.emptyStateText,new q1({color:Y.foreground,dim:!0}))})})});else{let L=X.map((A,E)=>{let P=E===this.selectedIndex,I=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,P,I,J);else{let S=P?A1.yellow:void 0,y=P?A1.black:Y.foreground;T=new Y6({decoration:S?{color:S}:void 0,padding:_0.symmetric(2,0),child:new m1({text:new e(this.widget.props.getLabel(A),new q1({color:y,dim:I}))})})}return new DX6(new T8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new a0({children:L,crossAxisAlignment:"start"})}let z=new N4({child:new T8({onScroll:this.handleScroll,opaque:!1,child:new R2({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e(this.widget.props.title,new q1({color:A1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new F0({height:1}),z),this.controller.text!==""){let L=X.length>0?X[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new Y6({padding:_0.vertical(1),child:new z8({child:A})}));else U.push(new F0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new Y6({decoration:{border:G,color:A1.default()},padding:_0.symmetric(1,0),child:new a0({children:U})})}}class Rk1 extends X6{createState(){return new AX6}}class AX6 extends Q6{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){return new m1({text:new e("●",new q1({color:this.isGreen?A1.green:A1.index(8),bold:!0})),maxLines:1})}}function qL8(J){let Q=new Map,Y=new Map,X=[];for(let Z of J)Q.set(Z.id,Z);for(let Z of J){let q=Z.parentRelationships.find((V)=>V.role==="child"&&V.type==="fork"&&Q.has(V.threadID));if(q){let V=q.threadID,K=Y.get(V)||[];K.push(Z),Y.set(V,K)}else X.push(Z)}return VG.flatten(X,(Z)=>Y.get(Z.id)).map((Z)=>({...Z.item,depth:Z.depth,isLast:Z.isLast,ancestorsAreLast:Z.ancestorsAreLast}))}function Tk1(J,Q,Y){return new m1({text:new e(`${J}${Q}`,new q1({color:Y})),maxLines:1})}function VL8(J,Q,Y,X){return[Tk1("+",J,X.success),n5.horizontal(1),Tk1("~",Q,X.warning),n5.horizontal(1),Tk1("-",Y,X.destructive)]}class x91 extends w6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],X=this.props.currentThreadID,G=[...Q].sort((H,z)=>{if(X){if(H.id===X)return-1;if(z.id===X)return 1}let U=Y.indexOf(H.id),N=Y.indexOf(z.id);if(U!==-1&&N!==-1)return U-N;if(U!==-1)return-1;if(N!==-1)return 1;return 0}),Z=qL8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=L6.of(J),K=new d6({padding:_0.symmetric(0,1),child:new z8({child:new m1({text:new e("",new q1({color:V.colors.foreground,dim:!0}),[new e("Ctrl+T",new q1({color:A1.blue,dim:!0})),new e(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new q1({color:V.colors.foreground,dim:!0}))])})})});return new rK({items:Z,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:K,renderItem:(H,z,U,N)=>{let M=L6.of(N),{colors:L}=M,A=z?A1.yellow:void 0,E=z?A1.black:L.foreground,P=A1.index(8),I=(g,p)=>new F0({width:p,child:r6.end([new m1({text:new e(g,new q1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[];if(H.depth>0){let g=new f81,p=[],b=H.ancestorsAreLast.slice(1);for(let n of b)p.push(new e(g.getAncestorPrefix(n),new q1({color:g.connectorColor,dim:g.connectorDim})));let l=H.isLast?g.elbow:g.tee,Q1=g.getConnectorText(l);p.push(new e(Q1,new q1({color:g.connectorColor,dim:g.connectorDim}))),S.push(new m1({text:new e("",void 0,p)}))}let y=[],x=this.props.currentThreadID===H.id?new e("(current) ",new q1({color:A1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new e("(visited) ",new q1({color:L.foreground,dim:!0})):null;if(x)y.push(new m1({text:x}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))y.push(new Rk1),y.push(new F0({width:1}))}if(y.push(new N4({child:new m1({text:new e(H.title,new q1({color:E})),overflow:"ellipsis",maxLines:1})})),y.push(new F0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let g=z?{success:P,warning:P,destructive:P}:L;y.push(...VL8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,g)),y.push(new F0({width:2}))}return y.push(I(H.description.timeAgo,q)),new Y6({decoration:A?{color:A}:void 0,padding:_0.symmetric(2,0),child:new r6({children:[...S,...y]})})}})}}function OX6(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/60000),G=Math.floor(Y/3600000),Z=Math.floor(Y/86400000);if(X<1)return"just now";if(X<60)return`${X}m ago`;if(G<24)return`${G}h ago`;if(Z<7)return`${Z}d ago`;return J.toLocaleDateString()}class Ck1 extends w6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((G,Z)=>Z.pubDate.getTime()-G.pubDate.getTime()),Y=Math.max(0,...Q.map((G)=>OX6(G.pubDate).length));return new rK({items:Q,getLabel:(G)=>G.title,onAccept:(G)=>this.props.onSelect?.(G),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(G,Z,q,V)=>{let K=L6.of(V),{colors:W}=K,H=Z?A1.yellow:void 0,z=Z?A1.black:W.foreground,U=A1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new F0({width:A,child:r6.end([new m1({text:new e(L,new q1({color:U}))})])});return new Y6({decoration:H?{color:H}:void 0,padding:_0.symmetric(2,0),child:new r6({children:[new N4({child:new m1({text:new e(G.title,new q1({color:z})),overflow:"ellipsis",maxLines:1})}),new F0({width:2}),new m1({text:new e(N,new q1({color:U})),maxLines:1}),new F0({width:2}),M(OX6(G.pubDate),Y)]})})}})}}class jk1 extends w6{props;constructor(J){super();this.props=J}build(){return new z8({child:new m1({text:new e("",void 0,[new e(`Forked to new thread:
4785
4785
 
4786
4786
  `,new q1({color:A1.white,dim:!0})),new e(`"${this.props.newThreadTitle||"Untitled"}"`,new q1({color:A1.white}))]),textAlign:"center"})})}}class AN extends X6{props;constructor(J){super();this.props=J}createState(){return new wX6}}class wX6 extends Q6{_spinner=new oK;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(J){let Q=L6.of(J),{colors:Y}=Q,X=f4.all(new w4(Y.foreground,1,"solid")),G=this._spinner.toBraille(),Z=new m1({textAlign:"center",text:new e("",void 0,[new e(G,new q1({color:A1.yellow})),new e(" ",void 0),new e(this.widget.props.message,new q1({color:Y.foreground}))])}),V=[new N4({child:new a0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)V.push(new F0({height:2,child:new Y6({padding:_0.symmetric(2,0),child:new m1({text:new e("",new q1({dim:!0}),[new e("Press ",new q1({color:Y.foreground})),new e("Esc",new q1({color:Y.info})),new e(" to cancel",new q1({color:Y.foreground}))])})})}));let K=new Y6({decoration:new H8(A1.default(),X),child:new F0({width:60,height:7,child:new a0({mainAxisAlignment:"start",children:V})})});if(this.widget.props.onAbort)return new Y9({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:K});return K}}class kz extends X6{props;constructor(J){super();this.props=J}createState(){return new EX6}}class EX6 extends Q6{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof lK}build(J){let Q=this.widget.props.message,Y=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let W=y81(Q);return{title:W.title,type:W.type,description:W.description}})(),X=Y.type==="error"?A1.red:A1.yellow,G=f4.all(new w4(A1.default(),1,"solid")),Z=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e(Y.title,new q1({color:X,bold:!0}))})}),q=this.isWidgetMessage(Q)?Q.widget:new m1({text:new e(Y.description,new q1({color:A1.default()})),selectable:!0}),V=new N4({child:new zO({child:new Y6({padding:_0.symmetric(1,0),child:q})})}),K=new Y6({padding:_0.symmetric(1,0),child:new m1({text:this.widget.props.onRetry?new e("",void 0,[new e("Press ",new q1({color:A1.default(),dim:!0})),new e("R",new q1({color:A1.yellow})),new e(" to retry, ",new q1({color:A1.default(),dim:!0})),new e("Esc",new q1({color:A1.yellow})),new e(" to cancel",new q1({color:A1.default(),dim:!0}))]):new e("Press any key to close",new q1({color:A1.default(),dim:!0,italic:!0}))})});return new Y9({onKey:(W)=>{if(this.widget.props.onRetry&&W.key==="r")return this.widget.props.onRetry(),"handled";if(W.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!0,child:new Y6({decoration:{border:G,color:A1.default()},padding:_0.all(1),child:new a0({mainAxisAlignment:"center",children:[Z,new F0({height:1}),V,K]})})})}}class Sk1 extends w6{build(){return new z8({child:new m1({text:new e("",void 0,[new e(`✓ Thread Shared
4787
4787
 
@@ -4865,7 +4865,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
4865
4865
  `)?`${V}...`:G,W=new q1({color:A1.index(8)}),H=[new e(K,W)];if(q>0){let z=new q1({color:Y.success});for(let U=1;U<=q;U++)H.push(new e(" ")),H.push(new e(`[${U}]`,z))}return new d6({padding:_0.only({bottom:0}),child:new r6({crossAxisAlignment:"start",children:[new d6({padding:_0.only({right:1}),child:new m1({text:new e("•",new q1({color:A1.index(8)}))})}),new N4({child:new m1({text:new e("",void 0,H)})})]})})}}class $y1 extends X6{createState(){return new LG6}}class LG6 extends Q6{_animationTimer;_visible=!0;initState(){super.initState(),this._startAnimation()}dispose(){this._stopAnimation(),super.dispose()}_startAnimation(){this._animationTimer=setInterval(()=>{this.setState(()=>{this._visible=!this._visible})},500)}_stopAnimation(){if(this._animationTimer)clearInterval(this._animationTimer),this._animationTimer=void 0}build(J){let Q=new q1({color:A1.red}),Y=new q1({color:this._visible?A1.red:A1.transparent()});return new r6({children:[new m1({text:new e("⏺",Y)}),new F0({width:1}),new m1({text:new e("Replay",Q)})]})}}class qy1 extends w6{entry;constructor({key:J,entry:Q}){super({key:J});this.entry=Q}build(J){let Q=L6.of(J),Y=Q.colors.secondary,X=Q.colors.foreground,G=this.entry.authors.map((Z)=>Z.name).join(", ");return new Y6({decoration:new H8(void 0,new f4(new w4(Y,1,"rounded"),new w4(Y,1,"rounded"),void 0,new w4(Y,1,"rounded"))),child:new d6({padding:_0.horizontal(1),child:new a0({children:[new r6({crossAxisAlignment:"start",children:[new N4({child:new m1({text:new e(this.entry.title,new q1({color:X,bold:!0}))})}),new F0({width:4}),new m1({text:new e(G||"Community",new q1({color:X,dim:!0}))})]}),new r6({crossAxisAlignment:"start",children:[new N4({child:new m1({text:new e(this.truncateDescription(this.entry.description),new q1({color:X,dim:!0}))})}),new F0({width:2}),new Y7({uri:this.entry.link,text:"View Thread",style:new q1({color:Y,underline:!0})})]})]})})})}truncateDescription(J){let Y=J.replace(/\s+/g," ").trim();if(Y.length<=80)return Y;return Y.slice(0,79)+"…"}}o0();function MA8(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/3600000),G=Math.floor(X/24),Z=Math.floor(G/7),q=Math.floor(G/30);if(X<1)return"Just now";if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;if(Z<=4)return`${Z}w ago`;return`${q}mo ago`}class Vy1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Y)=>{let X=this.threadHistoryService.observeThreadList().subscribe((G)=>{X.unsubscribe(),Y(G)})});return{ok:!0,threads:this.formatThreadSummaries(Q,J)}}catch(Q){return{ok:!1,errorMsg:Q instanceof Error?Q.message:"An unexpected error occurred"}}}observeThreadSummaries(J=""){return this.threadHistoryService.observeHistory().pipe(q6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((X)=>{if(!Q.trim())return!0;let G=X.title?.toLowerCase()||"untitled",Z=X.id.toLowerCase(),q=Q.toLowerCase();return G.includes(q)||Z.includes(q)}).map((X)=>{let G=new Date(X.userLastInteractedAt),Z=MA8(G),q=X.id.slice(-8),V=X.env?.initial.trees?.[0]?.uri;return{id:X.id,title:X.title||"Untitled",updatedAt:new Date(X.userLastInteractedAt).toISOString(),description:{timeAgo:Z,title:X.title||"Untitled",shortThreadID:q},diffStats:X.summaryStats?.diffStats,workspaceURI:V,parentRelationships:X.parentRelationships}})}}L0();D9();class Ky1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new i3;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){f.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){f.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(IM()).subscribe((Q)=>{if(this.currentId===J)this.current=Q,this.notifyListeners()})}cancelTimerAndSubscription(){if(this.subscribeTimer)clearTimeout(this.subscribeTimer),this.subscribeTimer=null;if(this.subscription)this.subscription.unsubscribe(),this.subscription=null}notifyListeners(){for(let J of this.listeners)J(this.current)}}function AG6(J,Q){switch(J){case"update-available":return[new e("A newer Amp is available. Run ",new q1({color:Q.foreground,dim:!0})),new e("amp update",new q1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new e("Update complete, run ",new q1({color:Q.foreground,dim:!0})),new e("amp update",new q1({color:Q.warning})),new e(" to see warnings",new q1({color:Q.foreground,dim:!0}))];case"update-error":return[new e("Update failed, run ",new q1({color:Q.foreground,dim:!0})),new e("amp update",new q1({color:Q.warning})),new e(" to see warnings",new q1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function EA8(J){return new Promise((Q)=>{AA8("git",["branch","--show-current"],{cwd:J},(Y,X)=>{if(Y){Q(null);return}let G=X.trim();Q(G||null)})})}class CG6 extends X6{dependencies;constructor(J){super();this.dependencies=J}createState(){return new jG6}}class jG6 extends Q6{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;threadLoadSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;isShowingHelp=!1;isShowingConsoleOverlay=!1;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;isShowingCostBreakdownOverlay=!1;confirmationOverlayContent="";exitConfirmTimeout=null;clearInputConfirmTimeout=null;cancelProcessingConfirmTimeout=null;historyIndex=-1;historyDraft=null;bashInvocations=[];dismissedEphemeralErrorKey=null;currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;isShowingPalette=!1;paletteShowOptions=null;threadsForPicker=[];isLoadingThreads=!1;threadPreviewController=new Ky1;previewThread=null;planScrollController=(()=>{let J=new i3;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new i3;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;agentModePulseSeq=0;currentGitBranch=null;messageViewFocusNode=new l8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new l8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showingCannotToggleMessage=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;adActionModal=null;threadFeedReader=null;currentThreadFeedEntry=null;threadFeedEntries=[];threadFeedSubscription=null;threadFeedRotationTimer=null;threadFeedHidden=!1;threadFeedTickerQueue=[];hasSubmittedFirstMessage=!1;currentUserInfo=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;pendingMCPServers=[];mcpTrustSubscription=null;agentModeSubscription=null;currentAgentMode="smart";inMemoryAgentModeOverride=null;cachedVisibleModes=nG();freeTierStatus=void 0;updateState="hidden";updateServiceSubscription=null;toastController=new qS1;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=null;async initThreadFeed(){let J=await N6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Y=Q.includes("localhost")||Q.includes("127.0.0.1");try{let q=await this.widget.dependencies.internalAPIClient.getUserInfo({},{config:this.widget.dependencies.configService});if(q.ok){let V=q.result,K="user"in V?V.user:V;this.currentUserInfo={username:K.username??void 0,displayName:K.displayName??void 0};let W="ffe10a0c-6c42-41ce-a3a6-38990fd6caf8";if(!Y&&V.team?.id!==W)return}else return}catch(q){f.debug("Failed to fetch user info for thread feed filtering",q);return}let X="/threads.rss",G=async(q,V)=>{let K=q instanceof Request?q.url:q.toString();return HJ(K,V,this.widget.dependencies.configService)},Z=kl0();Z.get("entries").then((q)=>{if(q){let V=this.filterEntries(q);if(this.threadFeedEntries=V,V.length>0&&!this.currentThreadFeedEntry){let K=[...V].sort((H,z)=>z.pubDate.getTime()-H.pubDate.getTime());this.threadFeedTickerQueue=[...K,...this.threadFeedTickerQueue];let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}),this.threadFeedReader=new Ej1(Z,G,{url:X}),this.threadFeedSubscription=this.threadFeedReader.stream().subscribe({next:(q)=>{try{let V=this.filterEntries(q);if(V.length>0){this.threadFeedEntries=[...V,...this.threadFeedEntries];let K=[...V].sort((W,H)=>H.pubDate.getTime()-W.pubDate.getTime());if(this.threadFeedTickerQueue=[...K,...this.threadFeedTickerQueue],!this.currentThreadFeedEntry){let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}catch(V){f.error("Thread feed: error in next handler",V)}},error:(q)=>{f.error("Thread feed error:",q)}}),this.resetThreadFeedRotation()}filterEntries(J){if(!this.currentUserInfo)return J;let{username:Q,displayName:Y}=this.currentUserInfo;return J.filter((X)=>{return!X.authors.some((G)=>{let Z=G.name;if(!Z)return!1;return Q&&Z===Q||Y&&Z===Y||Q&&Z.includes(Q)})})}rotateThreadFeed(){if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);this.threadFeedRotationTimer=setInterval(()=>{let J=this.getNextFeedEntry();if(J)this.setState(()=>{this.currentThreadFeedEntry=J})},30000)}resetThreadFeedRotation(){this.rotateThreadFeed()}getNextFeedEntry(){if(this.threadFeedTickerQueue.length>0)return this.threadFeedTickerQueue.shift();return null}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1,this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Y,baseWpm:X}=J,G=Q.messages;for(let Z=0;Z<G.length;Z++){if(this.replayAbortController.signal.aborted)break;let q=G[Z];if(!q)continue;if(Z>0)await this.replaySleep(J.messageDelayMs);if(q.role==="user"&&Y){let W=q.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
4866
4866
  `);if(W)await this.replayTypeMessage(W,X)}if(q.role==="assistant"){let W=q.content.some((U)=>U.type==="tool_use"),H=G[Z+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...q,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let N=J.thread.id;this.getMessageScrollController(N).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),q]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,q],this.textController.clear()});let V=J.thread.id;this.getMessageScrollController(V).scrollToBottom()}await this.replaySleep(J.exitDelayMs),I9.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Y=J.split(/(?<=\s)/),X=60000/Q;for(let G of Y){if(this.replayAbortController.signal.aborted)break;let Z=X/G.length;for(let q of G){this.textController.text=this.textController.text+q,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let V=0.8+Math.random()*0.4,K=Z*V;await this.replaySleep(K)}}}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return K81(this.widget.dependencies.worker.thread,this.inMemoryAgentModeOverride?{agentMode:this.inMemoryAgentModeOverride}:null,this.freeTierStatus,{"experimental.agentMode":this.currentAgentMode})}isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;if(J.viewState.state!=="active")return!1;if(Boolean(J.viewState.inferenceState==="running"))return!0;let Y=J.items.filter((Z)=>Z.type==="toolResult").filter((Z)=>Z.toolResult.run.status==="in-progress"||Z.toolResult.run.status==="queued"),X=J.subagentActiveTools.filter((Z)=>Z.toolRun.status==="in-progress"||Z.toolRun.status==="queued");return[...Y,...X].length>0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new e(this.submitDisabledHint,new q1({color:J.foreground,dim:!0}));if(this.isExiting)return new e("Exiting...",new q1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new e("",void 0,[new e("Ctrl+C",new q1({color:Q.keybind})),new e(" again to exit",new q1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new e("",void 0,[new e("Esc",new q1({color:Q.keybind})),new e(" again to clear input",new q1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new e("",void 0,[new e("Escape",new q1({color:Q.keybind})),new e(" to close help",new q1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let G=this.getEffectiveAgentMode(),Z=By1(G);return new e("",void 0,[new e("Images aren't supported in ",new q1({color:J.warning,dim:!1})),new e(G,new q1({color:Z})),new e(" mode.",new q1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new e("",void 0,[new e("Esc",new q1({color:Q.keybind})),new e(" again to cancel",new q1({color:J.foreground,dim:!0}))]);return new e("",void 0,[new e("Esc",new q1({color:Q.keybind})),new e(" to cancel",new q1({color:J.foreground,dim:!0}))])}if(this.showingCannotToggleMessage)return new e(this.showingCannotToggleMessage,new q1({color:J.warning,dim:!1}));let Y=AG6(this.updateState,J);if(Y)return new e("",void 0,Y);let X=this.widget.dependencies.worker.thread;if(X.agentMode==="plan"&&ZO(X))return new e("",void 0,[new e("Ctrl+O",new q1({color:Q.keybind})),new e(" → Execute Plan",new q1({color:J.foreground,dim:!0}))]);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Y}=this.widget.dependencies;if(!Q.mainThread?.id)return;let G=Q.mainThread?.messages.findIndex((Z)=>Z===J);if(G===void 0||G===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),await Y.handle({type:"thread:truncate",fromIndex:G}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(Z){f.error("Failed to edit message:",Z)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Y,threadSyncService:X}=this.widget.dependencies,G=Q.mainThread?.id;if(!G)return;let Z=Q.mainThread?.messages.findIndex((q)=>q===J);if(Z===void 0||Z<=0)return;try{let q=await A3.getOrCreateForThread(Y,G),V=await AT(q,X,Z-1);await this.switchToExistingThread(V)}catch(q){f.error("Failed to fork thread:",q),this.showErrorMessage(`Failed to fork thread: ${q}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Y,worker:X}=this.widget.dependencies,G=Y.mainThread;if(!G)return;let Z=G.messages.findIndex((q)=>q.messageId!==void 0&&q.messageId===J.messageId);if(Z===-1)return;try{this.cancelBashInvocations(),await X.cancel(),this.widget.dependencies.history.add(Q);let q=zN(Q);if(q)await X.handle({type:"thread:truncate",fromIndex:Z}),this.invokeBashCommand(q.cmd,{visibility:q.visibility});else{let V=[{type:"text",text:Q}];if(this.imageAttachments.length>0)V.push(...this.imageAttachments);let K={content:V,agentMode:G.agentMode},W=Z===0;if(G.agentMode&&!W&&K.agentMode!==G.agentMode){f.error(`Cannot edit message: This thread uses ${G.agentMode} mode. To change mode, create a new thread.`);return}await X.handle({type:"user:message",message:K,index:Z})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(q){f.error("Failed to edit message:",q)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(GJ)}catch(Y){return f.error("Failed to get affected files:",Y),[]}};textController=new mZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new i3);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let X=this.searchElementTreeByKey(J.child,Q);if(X)return X}if(J?.children)for(let X of J.children){let G=this.searchElementTreeByKey(X,Q);if(G)return G}return null}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{this.toastController.show("Selection copied to clipboard","success",2000)}}}updateTerminalTitle(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.title;if(Q!==this.currentTitle){this.currentTitle=Q;let Y=process.cwd().replace(process.env.HOME||"","~"),X=Q?`amp - ${Q} - ${Y}`:"";process.stdout.write(fC1(X))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new s7("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands;paletteConfig;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"){this.showCommandPalette(),this.textController.clear();return}let Y=zN(J)?.visibility;if(Y!==this.currentShellModeStatus)this.currentShellModeStatus=Y,this.setState(()=>{})};navigateHistoryPrevious=()=>{let J=this.widget.dependencies.history.previous();if(J!==null){if(this.historyIndex===-1)this.historyDraft=this.textController.text;this.historyIndex++,this.textController.text=J,this.textController.moveCursorToStart()}};navigateHistoryNext=()=>{let J=this.widget.dependencies.history.next();if(J!==null)this.historyIndex--,this.textController.text=J,this.textController.moveCursorToEnd();else if(this.historyIndex>-1)this.historyIndex=-1,this.textController.text=this.historyDraft||"",this.textController.moveCursorToEnd(),this.historyDraft=null};resetHistory=()=>{this.widget.dependencies.history.reset(),this.historyIndex=-1,this.historyDraft=null};openJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!0})};dismissJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!1})};openIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!0})};dismissIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!1}),J9.instance.addPostFrameCallback(()=>{this.autocompleteFocusNode.requestFocus()})};handleIdeSelection=async(J,Q)=>{if(this.widget.dependencies.ideClient.getSelectedConfig()?.pid===J.pid){this.dismissIdePicker();return}try{await this.connectToSelectedIde(J,Q)}catch(Y){let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})}this.widget.dependencies.ideClient.selectConfig(J),this.dismissIdePicker()};async connectToSelectedIde(J,Q){await this.widget.dependencies.ideClient.start(J,!0,Q)}previewControllerListener=(J)=>{this.setState(()=>{this.previewThread=J})};showStandaloneThreadPicker=()=>{this.showCommandPalette({type:"standalone",commandId:"continue",onSubmit:()=>{this.threadPreviewController.clear(),this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null}),J9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette)this.autocompleteFocusNode.requestFocus()})},onCancel:()=>{this.exitApplication()}})};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(J){if(this.setState(()=>{this.isShowingPalette=!this.isShowingPalette,this.paletteShowOptions=J??null}),this.isShowingPalette)this.loadThreadsForPicker()}isShowingStandalonePalette(){return this.isShowingPalette&&this.paletteShowOptions?.type==="standalone"}getPaletteCommands(){if(!this.paletteCommands){if(!this.paletteConfig)throw Error("Config not yet available");this.paletteCommands=new kk1(this.widget.dependencies.configService,this.widget.dependencies.commandRegistry,(J)=>{this.setState(()=>{this.executingCommand=J})},()=>{this.setState(()=>{this.executingCommand=null})},this.widget.dependencies.isDogfooding,this.paletteConfig)}return this.paletteCommands}getCompletionBuilder(){if(!this.completionBuilder)this.completionBuilder=new vk1(this.widget.dependencies.fuzzyServer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Y}=this.widget.dependencies;if(!Q.mainThread)return null;let X=i0.file(process.cwd()),G=A6(X);return{recentThreadIDs:Y,currentThreadID:Q.mainThread.id,context:J,worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:Q.mainThread,ampURL:this.widget.dependencies.ampURL,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let Z=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),Z},setImageAttachments:(Z)=>{this.setState(()=>{this.imageAttachments=Z})},editorDispatch:(Z)=>{switch(Z.type){case"set-input":this.textController.clear(),this.textController.insertText(Z.input);break;case"insert-text":this.textController.insertText(Z.text);break;case"clear":this.textController.clear();break}},submitMessage:(Z)=>{return this.proceedWithUserMessage(Z)},exitApp:this.exitApplication,openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},settingsStorage:this.widget.dependencies.settingsStorage,clientId:this.widget.dependencies.clientId,connectedClientsService:this.widget.dependencies.connectedClientsService,mcpService:this.widget.dependencies.mcpService,startNewThread:async()=>{await this.startAndSwitchToNewThread()},navigateBack:this.navigateBack,navigateForward:this.navigateForward,canNavigateBack:this.threadBackStack.length>0,canNavigateForward:this.threadForwardStack.length>0,canUseAmpFree:this.widget.dependencies.freeTierStatus?.canUseAmpFree??!1,switchToThread:async(Z)=>{return await this.switchToExistingThread(Z),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),this.widget.dependencies.worker},generateHandoffPrompt:async(Z,q,V)=>{let K=this.widget.dependencies.threadState.mainThread?.id;if(!K)throw Error("No active thread");let W=setTimeout(()=>{V.throwIfAborted()},60000);try{let H=await this.widget.dependencies.threadService.generateHandoffPrompt(K,Z,q,this.widget.dependencies.configService,V);return clearTimeout(W),H}catch(H){throw clearTimeout(W),H}},handleHandoff:async(Z,q)=>{let{goal:V,generatedPrompt:K,images:W}=q;if(!V&&!K)return{ok:!1,error:Error("Either goal or generatedPrompt required")};try{let H=this.widget.dependencies.threadState.mainThread?.id;if(!H)return{ok:!1,error:Error("No active thread")};let z=setTimeout(()=>Z.abort(new T91("Handoff took too long and was aborted (timeout: 60s)")),60000);try{let U=await this.widget.dependencies.threadService.createHandoffThread(H,{goal:V,generatedPrompt:K,images:W},this.widget.dependencies.configService,Z.signal);return clearTimeout(z),await this.switchToExistingThread(U),{ok:!0}}catch(U){if(clearTimeout(z),U instanceof Error&&(U.name==="AbortError"||U.message.includes("aborted")))throw Z.signal.reason;throw U}}catch(H){return f.error("Failed to create handoff thread",H),{ok:!1,error:H instanceof Error?H:Error(String(H))}}},getGuidanceFiles:async(Z)=>{if(!Q.mainThread)return[];return(await or({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},Q.mainThread,Z)).map((V)=>({uri:V.uri,type:V.type}))},openIdePicker:()=>{this.openIdePicker()},getInMemoryAgentModeOverride:()=>{return this.inMemoryAgentModeOverride},setInMemoryAgentModeOverride:(Z)=>{this.setState(()=>{this.inMemoryAgentModeOverride=Z})},toggleAgentMode:this.toggleAgentMode,getEffectiveAgentMode:()=>this.getEffectiveAgentMode(),getEditorText:()=>this.textController.text,workspace:this.widget.dependencies.workspace??null,handleExecutePlan:async()=>{try{let Z=Q.mainThread?.id;if(!Z){this.setState(()=>{this.displayMessage=Error("No active thread")});return}let q=await this.widget.dependencies.threadService.createPlanExecutionThread(Z,"smart");await this.switchToExistingThread(q)}catch(Z){f.error("Failed to execute plan",Z),this.setState(()=>{this.displayMessage=Error(`Failed to execute plan: ${Z instanceof Error?Z.message:String(Z)}`)})}},planFileManager:this.widget.dependencies.planFileManager,completionBuilder:this.getCompletionBuilder(),threads:this.threadsForPicker,previewController:this.threadPreviewController,isLoadingThreads:this.isLoadingThreads,filterByWorkspace:this.filterThreadPickerByWorkspace,currentWorkspace:G,threadViewStates:this.widget.dependencies.workerController.threadViewStates,currentThreadFeedEntry:this.currentThreadFeedEntry,threadFeedEntries:this.threadFeedEntries,threadFeedHidden:this.threadFeedHidden,setThreadFeedHidden:(Z)=>{this.setState(()=>{this.threadFeedHidden=Z})}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new Vy1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await EA8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Y=Date.now(),X=`bash-${Y}-${Math.random().toString(36).substring(7)}`,G={cmd:J},Z=new AbortController;this.widget.dependencies.worker.invokeBashTool(G,Z.signal,Q===HN).subscribe({next:(q)=>{this.setState(()=>{if(this.bashInvocations.find((K)=>K.id===X))this.bashInvocations=this.bashInvocations.map((K)=>K.id===X?{...K,toolRun:q}:K);else{let K={id:X,args:G,toolRun:q,startTime:Y,abortController:Z,hidden:Q===HN};this.bashInvocations=[...this.bashInvocations,K]}})},error:()=>this.removeBashInvocation(X),complete:()=>this.removeBashInvocation(X)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};toggleAgentMode=()=>{let J=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(f$(J.thread)>0)return;if(this.freeTierStatus?.canUseAmpFree){let X=this.getEffectiveAgentMode(),G=Oi(X,this.cachedVisibleModes);if(G!==X)this.setState(()=>{this.inMemoryAgentModeOverride=G,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1});return}let Q=this.getEffectiveAgentMode(),Y=Oi(Q,this.cachedVisibleModes);if(Y===Q)return;if(this.setState(()=>{this.inMemoryAgentModeOverride=Y,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1}),R5(Y))this.checkAndShowFreeModeModal()};checkAndShowFreeModeModal=()=>{if(this.freeTierStatus?.canUseAmpFree)return;if(this.freeTierStatus){if(!this.freeTierStatus.eligible){this.setState(()=>{this.showingCannotToggleMessage="Amp Free is unavailable. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}else if(!this.freeTierStatus.workspaceAllowsAmpFree){this.setState(()=>{this.showingCannotToggleMessage="Your workspace does not allow Amp Free. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}}};isInRestrictedFreeMode(){if(this.getEffectiveAgentMode()!=="free")return!1;if(this.freeTierStatus?.canUseAmpFree)return!1;return!0}handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!gk(Q)){if(this.imageUnsupportedHintTimer)clearTimeout(this.imageUnsupportedHintTimer);return this.setState(()=>{this.showImageUnsupportedHint=!0}),this.imageUnsupportedHintTimer=setTimeout(()=>{this.setState(()=>{this.showImageUnsupportedHint=!1}),this.imageUnsupportedHintTimer=null},5000),!1}if(this.imageAttachments.length>=BU)return!1;let Y=TC(J);if(typeof Y==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Y]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Y}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Y,unlink:X,rmdir:G,writeFile:Z}=await import("node:fs/promises"),{tmpdir:q}=await import("node:os"),V=await import("node:path");try{let K=await Q(V.join(q(),"amp-edit-")),W=V.join(K,"message.amp.md");await Z(W,J,"utf-8"),await Iz(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")f.error("Failed to read temporary file",H)}try{await X(W),await G(K)}catch(H){f.warn("Failed to clean up temporary file",H)}}catch(K){f.error("Error opening editor:",K)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=zN(J);if(Q)if(!Q.cmd){this.showSubmitDisabledHint("No command provided");return}else if(this.isProcessing()){this.showSubmitDisabledHint("Unable to use shell mode while agent is active");return}else{this.invokeBashCommand(Q.cmd,{visibility:Q.visibility}),this.widget.dependencies.history.add(J),this.textController.clear(),this.resetHistory();return}this.textController.clear(),this.resetHistory(),await this.updateGitBranch(),await this.sendUserMessage(J)};initState(){if(QG.getInstance().interceptConsole(),this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();I9.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),I9.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),I9.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{J9.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),this.freeTierStatus=this.widget.dependencies.freeTierStatus,N6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y;let X=K81(this.widget.dependencies.worker.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,Y.settings);if(f.info(`[initState] Resolved agentMode: ${X}`),this.widget.dependencies.sessionState?.agentMode)this.setState(()=>{this.inMemoryAgentModeOverride=X})}),this.updateGitBranch(),this.adSubscription=Xj1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{return(this.inMemoryAgentModeOverride&&R5(this.inMemoryAgentModeOverride)||this.randomAd===null)&&Yj1(this.lastUserInteractionTime)}).subscribe({next:(Y)=>{if(Y){let X=OA8(16).toString("hex");this.lastAdImpressionId=X,Promise.resolve().then(() => (e91(),t91)).then(({recordAdEvent:G})=>{let Z=this.widget.dependencies.worker.thread,q=Z.messages[Z.messages.length-1];G("viewed",{adId:Y.id,advertiserId:Y.advertiserId,threadId:Z.id,messageId:q?.messageId,impressionId:X,placement:"tui",matchType:Y.metadata?.matchType,matchedPatterns:Y.metadata?.matchedPatterns,candidateAdPoolCount:Y.metadata?.candidateAdPoolCount,clientRegion:Y.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=Y}),J9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}});let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=Y})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Y)=>{this.setState(()=>{this.ideStatus=Y})}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Y)=>{let X=this.widget.dependencies.getCurrentWorker();if(!X){f.warn("No active thread worker found to handle IDE message");return}await new Promise((G)=>setTimeout(G,50)),await X.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}}),f.debug("Message sent from IDE to agent",{message:Y.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Y)=>{this.textController.insertText(Y),f.debug("Appended text to CLI prompt from IDE",{text:Y.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Y)=>{this.setState(()=>{this.connectedClientsStatus=Y})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Y)=>{this.setState(()=>{this.updateState=Y})}),this.agentModeSubscription=this.widget.dependencies.configService.config.subscribe((Y)=>{let X=nG(Y.settings,this.freeTierStatus?.canUseAmpFree);this.setState(()=>{this.cachedVisibleModes=X})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Y)=>{let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100);this.initThreadFeed()}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener()}dispose(){if(this.replayAbortController.abort(),this.replayTypingTimer)clearTimeout(this.replayTypingTimer);if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeSubscription)this.agentModeSubscription.unsubscribe();if(this.adSubscription)this.adSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);if(this.threadPreviewController.removeListener(this.previewControllerListener),this.threadPreviewController.dispose(),this.toastController.dispose(),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.textController.removeListener(this.textChangeListener);for(let J of this.messageScrollControllers.values())J.dispose();if(this.messageScrollControllers.clear(),process.stdout.write(fC1("")),this.shouldUseProgressBar())process.stdout.write(D76())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,X=[...J.items.filter((V)=>V.type==="toolResult").map((V)=>({toolUse:V.toolUse,toolRun:V.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((V)=>V.toolRun.status==="blocked-on-user");if(X.length===0)return null;let G=X[0],Z=G.toolRun.status==="blocked-on-user"?G.toolRun.toAllow??[]:[],q=G.toolRun.status==="blocked-on-user"?G.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:G.toolUse,toAllow:Z}],subthreadID:G.subthreadID,reason:q}}shouldUseProgressBar(){return!1}updateProgressBar(){}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){f.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){f.error("No tool use block found in confirmation");return}if(J==="allow-all-session")T$("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(G){if(G&&G instanceof Error)this.setState(()=>{this.displayMessage=G});else f.error("Failed to write dangerouslyAllowAll setting:",G);return}if(J==="always-guarded"){let G=Q.tools[0]?.toAllow??[],Z=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],q=[...G,...Z];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",q,"global")}if(J==="connect-github"){let G=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();await lY(this.context,G);return}if(J==="disable-librarian"){let G=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!G.includes(DX))await this.widget.dependencies.settingsStorage.set("tools.disable",[...G,DX],"global")}let X=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let G={type:"user:tool-input",toolUse:Y.id,value:{accepted:X}};if(Q.subthreadID)await(await A3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(G);else await this.widget.dependencies.worker.handle(G)}catch(G){f.error("Failed to send tool confirmation:",G)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Y=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Y)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Y=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Y.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.setState(()=>{this.inMemoryAgentModeOverride="smart",this.dismissedEphemeralErrorKey=null}),N41({agentMode:"smart"}),await this.startAndSwitchToNewThread();break}case"handoff":{if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);this.showCommandPalette({type:"normal",commandId:"handoff"});break}}this.setState(()=>{})};handleDisplayMessageDismiss=()=>{this.setState(()=>{this.displayMessage=null})};handleMCPTrustOpenSettings=async()=>{let{mcpTrustHandler:J,settingsStorage:Q}=this.widget.dependencies;await J.deny();try{await Iz(Q.getSettingsFilePath())}catch(Y){let X=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${X}`)}};cancelStreamingMessage=async()=>{await A3.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let Y=J.messages[Q];if(Y?.role==="user"&&!Y.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Y=!0}=Q;if(Y){let X=this.widget.dependencies.worker.thread.id;if(X!==J)this.recordNavigation(X)}try{f.info(`[switchToExistingThread] Switching to thread: ${J}`);let X=await this.widget.dependencies.switchToThread(J);f.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${X.thread.agentMode}`);let G=await this.widget.dependencies.configService.getLatest(),Z=K81(X.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,G.settings);if(f.info(`[switchToExistingThread] Thread ${J} resolved agentMode: ${Z}`),this.widget.dependencies.worker=X,this.widget.dependencies.threadID=X.thread.id,this.widget.dependencies.switchWorker(X),this.setState(()=>{f.info("[switchToExistingThread] Clearing inMemoryAgentModeOverride"),this.inMemoryAgentModeOverride=null}),X.thread.draft)if(f.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof X.thread.draft==="string")this.textController.insertText(X.thread.draft);else{let q=X.thread.draft.filter((W)=>W.type==="text"),V=X.thread.draft.filter((W)=>W.type==="image"),K=q.map((W)=>W.text).join(`
4867
4867
  `);if(K)this.textController.insertText(K);if(V.length>0)this.setState(()=>{this.imageAttachments=V})}}catch(X){throw f.error("Failed to switch to thread:",J,X),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Y=f$(Q.thread)===0,X=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Y&&X!==Q.thread.agentMode){await this.showErrorMessage(`This thread uses ${Q.thread.agentMode} mode. To change mode, edit the first message or create a new thread.`);return}let G=[{type:"text",text:J}];if(this.imageAttachments.length>0)G.push(...this.imageAttachments);if(await Q.handle({type:"user:message",message:{content:G,agentMode:X}}),Y)N41({agentMode:X});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),J9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})};async showErrorMessage(J){this.setState(()=>{this.displayMessage=Error(J)})}exitApplication=async()=>{this.setState(()=>{this.isExiting=!0});let J=this.widget.dependencies.threadState.mainThread;if(J?.messages.length===0){if(J.relationships?.find((X)=>X.type==="handoff"&&X.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();N41({agentMode:Q}).catch((Y)=>{f.warn("Failed to save session state on exit:",Y)}).finally(()=>{I9.instance.stop()})};onExitPressed=()=>{if(this.isConfirmingExit){if(this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;this.exitApplication()}else{if(this.setState(()=>{this.isConfirmingExit=!0}),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout);this.exitConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingExit=!1}),this.exitConfirmTimeout=null},1000)}};toHomeRelative(J){let Q=wA8();if(J===Q)return"~";if(J.startsWith(Q+nm.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(nm.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(nm.sep),"…",Q.slice(-2).join(nm.sep)].join(nm.sep)}build(J){let Q=W8.of(J),Y=L6.of(J),X=Y.base;this.themeColors=X;let{colors:G,app:Z}=Y;this.themeApp=Z;let q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,V=q.thread.agentMode&&R5(q.thread.agentMode),K=V&&this.randomAd!==null,W=!V&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden&&this.hasSubmittedFirstMessage,H=K||W,{threadState:z}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let U=this.getCurrentConfirmation(),N=this.widget.dependencies.replayMode,M=Boolean(N),L=z.items,A=z.mainThread||void 0,E=z.subagentToolsByParentID,P=z.todosList;if(M){let J4={...N.thread,messages:this.replayDisplayedMessages};L=pC(J4).items,A=J4,E={};let k4=WI({messages:this.replayDisplayedMessages});P=Array.isArray(k4)?k4:[]}let I=A?.id,T=A,S=M?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),y=(J4)=>new I91({key:new s7(`preview-message-view-${J4.id}`),items:pC(J4).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:J4,focusNode:new l8({debugLabel:"PreviewFocus"})}),x=this.previewThread,g=x?x.messages.length>2000?new a0({mainAxisSize:"max",children:[new N4({child:new F0}),new d6({padding:_0.all(2),child:new z8({child:new m1({text:new e("Thread too long for preview",new q1({color:G.mutedForeground,dim:!0}))})})})]}):y(x):S?new R91({agentMode:this.getEffectiveAgentMode()}):new I91({key:I?new s7(`message-view-${I}`):void 0,items:L,subagentToolsByParentID:E,controller:I?this.getMessageScrollController(I):new i3,autofocus:!1,onCopy:M?void 0:this._handleTextCopy.bind(this),thread:T,onMessageEditSubmit:M?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:M?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:M?void 0:this.forkMessage,getAffectedFiles:M?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),p=Math.max(Math.floor(Q.size.height*0.4),12),b=this.getCurrentEphemeralError(),l=this.buildBottomWidget(b,U,G,Y,z,P,p,H,M),Q1=Q.size.width<40,n=z.mainThread?cB0(z.mainThread):void 0,u=new g81({threadViewState:z.viewState,threadTokenUsage:n,threadID:I??null,thread:z.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onCostBreakdownClick:()=>{this.setState(()=>{this.isShowingCostBreakdownOverlay=!this.isShowingCostBreakdownOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,isNarrow:Q1,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!U,showingEphemeralError:Boolean(z.viewState.state==="active"&&z.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),s=new b81({bashInvocations:this.bashInvocations}),H1=[],W1=this.getEffectiveAgentMode(),o=this.currentShellModeStatus,r=By1(W1),i=!o?W1.length+1:0,F1=Q.capabilities.animationSupport,y1=F1==="disabled"?0:F1==="slow"?30:60,t=vV(W1)?.uiHints?.fasterAnimation?3:1,h1=y1>0&&this.agentModePulseSeq>0?new H5({children:[l,new R7({top:0,left:1,right:1,height:1,child:new Xy1({color:r,trigger:this.agentModePulseSeq,fps:y1,speed:t,leftOffset:i})})]}):l;H1.push(new N4({child:g}),s);let j1=new H5({children:[new a0({mainAxisSize:"min",children:[K?new Ak1({ad:this.randomAd,onButtonClick:async()=>{let J4=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (e91(),t91)).then(({recordAdEvent:F8})=>{let J8=this.widget.dependencies.worker.thread,C9=J8.messages[J8.messages.length-1];F8("clicked",{adId:J4.id,advertiserId:J4.advertiserId,threadId:J8.id,messageId:C9?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:J4.metadata?.matchType,matchedPatterns:J4.metadata?.matchedPatterns,candidateAdPoolCount:J4.metadata?.candidateAdPoolCount,clientRegion:J4.metadata?.clientRegion})});if(!await lY(this.context,J4.shortDestinationUrl)){let J8=I9.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:J8,url:J4.shortDestinationUrl}})}}}):W?new qy1({entry:this.currentThreadFeedEntry}):new F0({height:0}),new Y6({constraints:new t6(0,Q.size.width,0,p),child:h1})]}),H?new R7({top:0,left:0,right:0,child:new kG6({userHeight:this.bottomGridUserHeight,maxHeight:p,onInitializeHeight:(J4)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(J4,p)})},onDrag:(J4)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(J4.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let k4=Math.floor(J4.localPosition.y)-this.bottomGridDragStartY,F8=Math.max(4,this.bottomGridDragStartHeight-k4),J8=Math.min(F8,p),C9=Math.floor(J8);if(this.bottomGridUserHeight!==C9)this.setState(()=>{this.bottomGridUserHeight=C9})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new F0({height:0})]});H1.push(j1,new F0({height:1,child:new d6({padding:_0.horizontal(1),child:u})}));let w0=new a0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:H1}),C1=M?new H5({children:[w0,new R7({top:0,left:0,child:new $y1})]}):w0,s1=new Q9(()=>{if(this.isShowingPalette)return this.dismissPalette(),"handled";if(this.pendingMCPServers.length>0)return this.widget.dependencies.mcpTrustHandler.deny(),"handled";if(this.getCurrentEphemeralError())return this.handleEphemeralErrorResponse("dismiss"),"handled";if(this.displayMessage)return this.handleDisplayMessageDismiss(),"handled";if(this.isShowingHelp)return this.setState(()=>{this.isShowingHelp=!1}),"handled";if(this.isShowingFileChangesOverlay)return this.setState(()=>{this.isShowingFileChangesOverlay=!1}),"handled";if(this.isShowingCostBreakdownOverlay)return this.setState(()=>{this.isShowingCostBreakdownOverlay=!1}),"handled";if(this.isShowingIdePicker)return this.dismissIdePicker(),"handled";if(this.isShowingJetBrainsInstaller)return this.dismissJetBrainsInstaller(),"handled";if(this.isShowingConfirmationOverlay)return this.setState(()=>{this.isShowingConfirmationOverlay=!1,this.confirmationOverlayContent=""}),"handled";if(this.isShowingConsoleOverlay)return this.setState(()=>{this.isShowingConsoleOverlay=!1}),"handled";if(this.textController.hasSelection)return this.textController.clearSelection(),"handled";if(this.isConfirmingClearInput){if(this.textController.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((k4)=>{f.error("Failed to mark message as interrupted:",k4)}),this.cancelStreamingMessage().catch((k4)=>{f.error("Failed to cancel streaming message:",k4)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return f.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.textController.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"ignored"}),U1=new Q9(()=>{return this.onExitPressed(),"handled"}),Y1=new Q9(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),O1=new Q9(()=>{return RJ.instance.toggleAll(),"handled"}),w1=new Q9(()=>{return this.widget.dependencies.configService.getLatest().then((J4)=>{T$("internal.showCost",!(J4.settings["internal.showCost"]??!0))}),"handled"}),I1=new Q9(()=>{return I9.instance.toggleFrameStatsOverlay(),"handled"}),E1=new Q9(()=>{return I9.instance.tuiInstance.getScreen().markForRefresh(),J9.instance.requestFrame(),"handled"}),d1=new Q9(()=>{return this.toggleAgentMode(),"handled"}),f1=new Q9(()=>{let k4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F8}=this.widget.dependencies,J8=F8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(k4){let F8=Math.max(Math.floor(Q.size.height*0.4),10),J8=Q.size.height-F8;k4.animatePageUp(J8,100)}return"handled"}),r1=new Q9(()=>{let k4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F8}=this.widget.dependencies,J8=F8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(k4){let F8=Math.max(Math.floor(Q.size.height*0.4),10),J8=Q.size.height-F8;k4.animatePageDown(J8,100)}return"handled"}),$0=new Q9(()=>{let k4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F8}=this.widget.dependencies,J8=F8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(k4)k4.animateTo(0,100);return"handled"}),G0=new Q9(()=>{let k4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F8}=this.widget.dependencies,J8=F8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(k4)k4.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),T0=new Q9(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:J4}=this.widget.dependencies;if(!J4.mainThread?.messages.some((F8)=>F8.role==="user"||KI(F8)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),F6=new Q9((J4)=>{if(J4.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),M6=new Q9(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return k81().then(async(J4)=>{if(J4)try{this.handleInsertImage(J4)}finally{try{let{unlink:k4}=await import("node:fs/promises");await k4(J4)}catch{}}}),"handled"}),D4=new Map([[U4.ctrl("c"),new Om],[U4.ctrl("l"),new Rm],[U4.ctrl("o"),new C81],[U4.ctrl("v"),new Lm],[U4.alt("s"),new SC],[U4.ctrl("s"),new SC],[U4.alt("p"),new Pm],[U4.ctrl("r"),new Em],[U4.alt("d"),new Im],[U4.ctrl("t"),new Tm],[U4.key("PageUp"),new I81],[U4.key("PageDown"),new P81],[U4.key("Home"),new R81],[U4.key("End"),new T81],[U4.key("Escape"),new Am],[U4.ctrl("p"),new _C("previous")],[U4.ctrl("n"),new _C("next")],[U4.key("Tab"),new Cm]]);if(!r2())D4.set(U4.key("ArrowUp"),new Cm);if(!1)D4.set(U4.alt("c"),new wm);let k9=new Q9(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),I0=new Q9(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),u0=new Map([[Am,s1],[Rm,E1],[SC,d1],[C81,k9],[Lm,M6],[wm,Y1],[Em,O1],[Im,w1],[Pm,I1],[Tm,I0],[Om,U1],[I81,f1],[P81,r1],[R81,$0],[T81,G0],[Cm,T0],[_C,F6]]),v6=[C1];if(this.isShowingConsoleOverlay)v6.push(new bk1);if(this.isShowingHelp&&this.paletteConfig)v6.push(new uk1({commands:this.getPaletteCommands().getAllCommands()}));if(this.adActionModal)v6.push(new Ok1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(J4)=>{let k4=this.adActionModal.url;if(J4==="copy")try{await I9.instance.tuiInstance.clipboard.writeText(k4),this.setState(()=>{this.displayMessage=new qG("Link copied to clipboard")})}catch(F8){f.error("Failed to copy to clipboard",{error:F8}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:J4}=this.widget.dependencies;v6.push(new Gy1({servers:this.pendingMCPServers,onAlwaysTrust:J4.trustAlways.bind(J4),onTrustOnce:J4.trustOnce.bind(J4),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:J4.deny.bind(J4)}))}if(this.isShowingFileChangesOverlay)v6.push(new wS1({threadData:z}));if(this.isShowingCostBreakdownOverlay&&z.mainThread)v6.push(new gk1({thread:z.mainThread}));if(this.isShowingConfirmationOverlay)v6.push(new hk1({details:this.confirmationOverlayContent}));let e4=this.getCommandPaletteContext(J);if(e4&&this.isShowingPalette&&this.paletteConfig)v6.push(new z8({child:new Y6({constraints:t6.loose(80,20),child:new xk1({commandContext:e4,mainThread:z.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})})}));if(this.isShowingIdePicker)v6.push(new dk1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let k8=new H5({children:v6});if(this.isShowingJetBrainsInstaller)return new UO({child:new nQ({actions:u0,child:new kq({shortcuts:D4,debugLabel:"jetbrains-installer-shortcuts",child:new Yy1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Rz({controller:this.toastController,child:new UO({child:new VS1({controller:this.toastController,child:new nQ({actions:u0,child:new kq({shortcuts:D4,debugLabel:"main-app-shortcuts",child:k8})})})})})}buildScrollableTodoList(J,Q,Y){return new SG6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,X,G,Z,q,V,K){if(J)return new mk1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new fk1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Zy1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let W=h81(X),H=this.isInRestrictedFreeMode(),z=new CO({key:this.textFieldKey,controller:this.textController,triggers:K?[]:[new LN],completionBuilder:K?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:K?void 0:this.onTextSubmitted,theme:Y,placeholder:K?"Press Ctrl+C to exit":H?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!H&&!this.isShowingStandalonePalette(),shellPromptRules:W,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:I9.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,previousThreadId:this.previousThreadIdForHint&&(G.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let p=this.previousThreadIdForHint;if(p)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${p} `},onDoubleAtTrigger:K?void 0:()=>{let p=this.textController.text,b=this.textController.cursorPosition,Q1=p.slice(0,b).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(Q1!==-1){let n=this.textController.text,u=n.slice(0,Q1)+n.slice(Q1+2);this.textController.text=u,this.textController.cursorPosition=Q1}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),U=G.mainThread?.queuedMessages??[],N=Array.isArray(Z)&&Z.length>0,M=Array.isArray(U)&&U.length>0,L=G.mainThread?.agentMode==="plan"&&ZO(G.mainThread),A,E;if(L){if(A=new nj1(new P91({thread:G.mainThread,onExecute:async()=>{let p=this.getCommandPaletteContext();if(p)await this.getPaletteCommands().execute("execute-plan",p,void 0,new AbortController)},onEdit:async()=>{try{let p=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:b}=await this.widget.dependencies.planFileManager.ensureSync(G.mainThread.id);I9.instance.tuiInstance.suspend();let{execSync:l}=await import("child_process");l(`${p} "${b}"`,{stdio:"inherit"}),I9.instance.tuiInstance.resume()}catch(p){f.error("Failed to edit plan",p),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:X}),{clipBehavior:"antiAlias"}),M)E=new s91({queuedMessages:U});else if(N)E=this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!H,X)}else A=M?new s91({queuedMessages:U}):void 0,E=N?this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!H,X):void 0;let P=[],I=this.currentShellModeStatus;if(I)P.push({child:new m1({text:new e(I==="hidden"?"shell mode (incognito)":"shell mode",new q1({color:I==="hidden"?X.app.shellModeHidden:X.app.shellMode}))}),position:"top-left"});if(!I&&this.cachedVisibleModes.length>1){let p=this.previewThread,b=p?p.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),l=By1(b);if(p)P.push({child:new m1({text:new e(b,new q1({color:l}))}),position:"top-left"});else{let Q1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,n=f$(Q1.thread)===0,u=new m1({text:new e(b,new q1({color:l}))});P.push({child:n?new T8({child:u,onClick:this.toggleAgentMode,cursor:"pointer"}):u,position:"top-left"})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let p=this.connectedClientsStatus,b=p.mode||"disconnected",l=!!p.errorMessage,Q1=p.clientID||"unknown",n,u;if(l)n="●",u=A1.red;else if(b==="presence")n="○",u=A1.yellow;else if(b==="connected"&&p.connected)n="●",u=A1.green;else n="○",u=A1.yellow;let s=this.connectedClientsStatusExpanded?`${Q1} ${n}`:n;P.push({child:new T8({child:new m1({text:new e(s,new q1({color:u}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let T=K?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:G.mainThread?.env?.initial.trees?.[0]?.uri,S;if(T)S=i0.parse(T).fsPath;else S=process.cwd();let y=this.toHomeRelative(S),x=this.shorten(y),g=!K&&this.currentGitBranch?`${x} (${this.currentGitBranch})`:x;return P.push({child:new m1({text:new e(g,new q1({color:Y.foreground,dim:!0}))}),position:"bottom-right"}),new FS1({leftChild:new N4({child:z}),rightChild1:A,rightChild2:E,maxHeight:q,overlayTexts:P,borderColor:H||!this.isTextfieldAndAutocompleteFocused?A1.index(8):void 0,hasBanner:V,userHeight:this.bottomGridUserHeight,onInitializeHeight:(p)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(p,q)})},onDrag:(p)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(p.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let b=Math.floor(p.localPosition.y)-this.bottomGridDragStartY,l=Math.max(4,this.bottomGridDragStartHeight-b),Q1=Math.min(l,q),n=Math.floor(Q1);if(this.bottomGridUserHeight!==n)this.setState(()=>{this.bottomGridUserHeight=n})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!V})}}async function Ny1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)I9.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let X=()=>null,Z=!1,q=new Mz(Z,1000,J.inspectorPort),V=J.features?.find((A)=>A.name==="amp-connect")?.enabled??!1,K=new Mk1({threadService:J.threadService,worker:J.worker,builder:(A,E,P,I,T,S)=>{if(X=T,J.threadDependencies&&V)Tj1(J.threadDependencies,J.configService,T,I,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((g)=>{f.error("Failed to start automatic presence:",g)});let y=T(),x={...J,worker:y,threadID:y.thread.id};return new CG6({...x,threadState:E,workerController:P,switchWorker:I,getCurrentWorker:T,recentThreadIDs:S})}}),W=new MS1({configService:J.configService,child:K}),H=new BS1({configService:J.configService,child:W}),z=new JS1(H),U=new L6({data:kC.fromBaseTheme(gZ.default()),child:z});try{await tC1(U,{onRootElementMounted:(A)=>{if(f.info("TUI input ready for user interaction"),Z)q.start(A)}})}finally{if(Z)q.stop();if(J.threadDependencies&&V){let{stopGlobalSession:A}=await Promise.resolve().then(() => (Cj1(),N36));A()}}let M=X()?.thread.id||J.threadID,L=await J.threadService.get(M);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${M}`;f36(L,A,J.stdout)}}function By1(J){let Y=vV(J)?.uiHints?.secondaryColor;if(Y)return A1.rgb(Y.r,Y.g,Y.b);return IA8(J)}class SG6 extends X6{props;constructor(J){super();this.props=J}createState(){return new _G6}}class _G6 extends Q6{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Y,appTheme:X}=this.widget.props;return new r6({crossAxisAlignment:"stretch",children:[new N4({child:new R2({controller:Y,autofocus:!1,child:new Lk1({todos:Q})})}),new WG({controller:Y,thumbColor:X.app.scrollbarThumb,trackColor:X.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:G,offset:Z}=Y,q=this.viewportHeight,V=G+q;return{totalContentHeight:Math.max(V,0),viewportHeight:Math.max(q,1),scrollOffset:Math.max(Z,0)}}})]})}updateViewportHeight(){let J=this.getViewportHeight();if(J!==this.viewportHeight)this.viewportHeight=J}getViewportHeight(){let J=this.context.findRenderObject();if(!J)return this.viewportHeight;let Q=(X,G=0)=>{if(X&&"size"in X&&"children"in X){let Z=X.children||[];for(let q of Z){if(q&&"size"in q){let K=q.size;if(typeof K?.height==="number"&&K.height>0)return K.height}let V=Q(q,G+1);if(V>0)return V}}return 0},Y=Q(J);if(Y>0)return Y;if("size"in J){let X=J.size;if(typeof X?.height==="number"&&X.height>0)return X.height}return this.viewportHeight}}class kG6 extends w6{props;constructor(J){super();this.props=J}build(J){return new T8({child:new F0({height:1}),cursor:n9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let X=J.findRenderObject()?.size.height??0;if(X>0){this.props.onInitializeHeight(X);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function IA8(J){let Q=0;for(let G=0;G<J.length;G++){let Z=J.charCodeAt(G);Q=(Q<<5)-Q+Z,Q=Q&Q}let Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Y.length;return A1.index(Y[X])}sC1();try{if(process.platform==="win32")await Promise.resolve().then(() => B6(Wj(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){oZ.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
4868
- `)}var lx1=cx1.join(OF0||cx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function lI8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function gq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")T$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")T$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")T$("model.sonnet",Q.useSonnet)}async function nx1(J){try{await pI8(cx1.dirname(lx1),{recursive:!0}),await dI8(lx1,J,"utf-8")}catch(Q){f.debug("Failed to save last thread ID",Q)}}async function iI8(){try{return(await GV6(lx1,"utf-8")).trim()}catch(J){return null}}var QV6=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??yZ,description:`Custom settings file path (overrides the default location ${yZ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(f).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${YC1})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","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:r2(),description:(J)=>J?"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:(J)=>J?"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:(J)=>J?"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:"useSonnet",long:"use-sonnet",type:"flag",description:(J)=>J?"Use Claude Sonnet 4.5 instead of Claude Opus 4.5":"Use default model (Claude Opus 4.5)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"(deprecated) Opus 4.5 is now the default in smart mode",hidden:!0,deprecated:!0},{name:"mode",long:"mode",short:"m",type:"option",default:XI.SMART.key,description:`Set the agent mode (${nG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:nG().map((J)=>J.mode)}],YV6=(J)=>("deprecated"in J)&&J.deprecated===!0,nI8=(J)=>("hidden"in J)&&J.hidden===!0,aI8=(J)=>("default"in J),oI8=(J)=>("default"in J)?J.default:void 0;function rI8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new S8(kZ.unknownCommand(Y),1,q)}}var ZV6=null;function KL5(){return ZV6}function Nu(J){return{...J,getThreadEnvironment:l61,vfs:iI0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new fx(J.fileSystem),generateThreadTitle:gl0,deleteThread:(Q)=>J.threadService.delete(Q)}}var ax1=i0.file(cI8.homedir()),$V6=process.env.XDG_CONFIG_HOME?i0.file(process.env.XDG_CONFIG_HOME):s0.joinPath(ax1,".config");async function mq(J,Q){YN0("0.0.1764359833-gb488a3");let Y=Xq1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:X0.of([i0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:ax1,userConfigDir:$V6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (e91(),t91));X(Y);let G=await Y.getLatest();f.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let{toolService:Z,dispose:q}=q16({configService:Y}),V=new Map,K=()=>V.clear(),W=new GU1(Y,J.settings.getWorkspaceRootPath()),H=eE0({configService:Y,trustStore:W,createOAuthProvider:async(n)=>{let u=V.get(n);if(u)return f.debug("Reusing existing OAuth provider for server",{serverName:n}),u;f.debug("Creating OAuth provider for server",{serverName:n});let s=(async()=>{let H1=new dM(J.secrets),W1=await H1.getClientInfo(n),o=new RF1({storage:H1,serverName:n,clientId:W1?.clientId,clientSecret:W1?.clientSecret,scopes:W1?.scopes});return f.debug("OAuth provider created",{serverName:n,hasManualClientId:!!W1?.clientId,willUseDCR:!W1?.clientId}),o})();return V.set(n,s),s}}),z=c01({configService:Y,filesystem:N5,spawn:yA}),{initializeToolProviders:U}=await Promise.resolve().then(() => (JV6(),eq6)),{registrations:N,initErrors:M}=await U({toolService:Z,providers:[H,z],initialTimeout:J.executeMode?15000:5000});for(let[n,u]of M)f.warn(`${n} provider initialization slow or failed:`,u);if(Q.jetbrains)zI("JetBrains");else if(Q.ide&&H56())zI("VS Code");else if(Q.ide&&z56())zI("Neovim");if(J.executeMode)XN0(!0);let L,A=N2.status.pipe(q6((n)=>Boolean(n.connected&&n.authenticated)),x4()).subscribe((n)=>{if(n){if(!L)L=Z.registerTool(is0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode)E=new Y41(process.cwd(),{},!0);else E=new class extends Y41{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(f5.write(`No API key found. Starting login flow...
4868
+ `)}var lx1=cx1.join(OF0||cx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function lI8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function gq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")T$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")T$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")T$("model.sonnet",Q.useSonnet)}async function nx1(J){try{await pI8(cx1.dirname(lx1),{recursive:!0}),await dI8(lx1,J,"utf-8")}catch(Q){f.debug("Failed to save last thread ID",Q)}}async function iI8(){try{return(await GV6(lx1,"utf-8")).trim()}catch(J){return null}}var QV6=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??yZ,description:`Custom settings file path (overrides the default location ${yZ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(f).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${YC1})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","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:r2(),description:(J)=>J?"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:(J)=>J?"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:(J)=>J?"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:"useSonnet",long:"use-sonnet",type:"flag",description:(J)=>J?"Use Claude Sonnet 4.5 instead of Claude Opus 4.5":"Use default model (Claude Opus 4.5)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"(deprecated) Opus 4.5 is now the default in smart mode",hidden:!0,deprecated:!0},{name:"mode",long:"mode",short:"m",type:"option",default:XI.SMART.key,description:`Set the agent mode (${nG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:nG().map((J)=>J.mode)}],YV6=(J)=>("deprecated"in J)&&J.deprecated===!0,nI8=(J)=>("hidden"in J)&&J.hidden===!0,aI8=(J)=>("default"in J),oI8=(J)=>("default"in J)?J.default:void 0;function rI8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new S8(kZ.unknownCommand(Y),1,q)}}var ZV6=null;function KL5(){return ZV6}function Nu(J){return{...J,getThreadEnvironment:l61,vfs:iI0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new fx(J.fileSystem),generateThreadTitle:gl0,deleteThread:(Q)=>J.threadService.delete(Q)}}var ax1=i0.file(cI8.homedir()),$V6=process.env.XDG_CONFIG_HOME?i0.file(process.env.XDG_CONFIG_HOME):s0.joinPath(ax1,".config");async function mq(J,Q){YN0("0.0.1764360079-gb488a3");let Y=Xq1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:X0.of([i0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:ax1,userConfigDir:$V6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (e91(),t91));X(Y);let G=await Y.getLatest();f.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let{toolService:Z,dispose:q}=q16({configService:Y}),V=new Map,K=()=>V.clear(),W=new GU1(Y,J.settings.getWorkspaceRootPath()),H=eE0({configService:Y,trustStore:W,createOAuthProvider:async(n)=>{let u=V.get(n);if(u)return f.debug("Reusing existing OAuth provider for server",{serverName:n}),u;f.debug("Creating OAuth provider for server",{serverName:n});let s=(async()=>{let H1=new dM(J.secrets),W1=await H1.getClientInfo(n),o=new RF1({storage:H1,serverName:n,clientId:W1?.clientId,clientSecret:W1?.clientSecret,scopes:W1?.scopes});return f.debug("OAuth provider created",{serverName:n,hasManualClientId:!!W1?.clientId,willUseDCR:!W1?.clientId}),o})();return V.set(n,s),s}}),z=c01({configService:Y,filesystem:N5,spawn:yA}),{initializeToolProviders:U}=await Promise.resolve().then(() => (JV6(),eq6)),{registrations:N,initErrors:M}=await U({toolService:Z,providers:[H,z],initialTimeout:J.executeMode?15000:5000});for(let[n,u]of M)f.warn(`${n} provider initialization slow or failed:`,u);if(Q.jetbrains)zI("JetBrains");else if(Q.ide&&H56())zI("VS Code");else if(Q.ide&&z56())zI("Neovim");if(J.executeMode)XN0(!0);let L,A=N2.status.pipe(q6((n)=>Boolean(n.connected&&n.authenticated)),x4()).subscribe((n)=>{if(n){if(!L)L=Z.registerTool(is0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode)E=new Y41(process.cwd(),{},!0);else E=new class extends Y41{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(f5.write(`No API key found. Starting login flow...
4869
4869
  `),!await sI8(J))await JO(),process.exit(1)}let P=await ER0({isDevelopment:!1}),I=new $I1(P,Y),T=new QI1(P,{lazy:!0}),S=new UU1(I,(n,u)=>{let s=A3.get(n);if(s)s.handle(u).catch((H1)=>{f.error("Failed to apply artifact delta",H1)})}),y=Q.notifications!==void 0?Q.notifications:!J.executeMode,x=K16({playNotificationSound:async(n)=>{if(y){V16(n);let u=oC1(),s=rC1();if((!u||s)&&G.settings["notifications.system.enabled"]!==!1){if(n==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(n==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:I,configService:Y});f.info("Starting Amp background services");let g=ul0({threadService:I,threadHistoryService:T,configService:Y,isExtensionDevelopment:!1}),p;N2.status.subscribe((n)=>{p=n});let b=new uZ1({workspaceRoots:[i0.file(process.cwd())],getCurrentFile:()=>{if(!p?.openFile)return;try{return i0.parse(p.openFile)}catch(n){f.warn("Failed to parse current file URI",{uri:p.openFile,error:n});return}},getOpenFiles:()=>{if(!p?.visibleFiles?.length)return[];let n=p.openFile;return p.visibleFiles.filter((u)=>u!==n).map((u)=>{try{return i0.parse(u)}catch(s){return f.warn("Failed to parse visible file URI",{uri:u,error:s}),null}}).filter((u)=>u!==null)}}),l=new eC1,Q1={codebaseContextService:b,configService:Y,toolService:Z,mcpService:H,trustStore:W,threadService:I,threadHistoryService:T,threadSyncService:g,planFileManager:S,threadStorage:P,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:x,fileSystem:Q.jetbrains||Q.ide?dI0:N5,terminal:l};return{...Q1,async asyncDispose(){if(Q1.mcpService.hasAuthenticatingClients())f.info("Waiting for OAuth authentication to complete before exit..."),await Q1.mcpService.waitForAuthentication();for(let n of N.values())n.dispose();await Q1.mcpService.dispose(),K(),await Q1.threadService.asyncDispose(),Q1.configService.unsubscribe(),q(),Q1.fuzzyServer.dispose(),Q1.threadSyncService.dispose(),Q1.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function sI8(J){if(!J.executeMode){if(!await TC1("Would you like to log in to Amp? [(y)es, (n)o]: "))return f5.write(`Login cancelled. Run the command again to retry.
4870
4870
  `),!1}return await qV6(J)}async function qV6(J){let Q=uI8(32).toString("hex"),Y=await RC1(J.ampURL,Q),X=new AbortController;try{await SE(Y,X.signal)}catch(Z){f.error("Error opening browser",{error:Z})}let G=await RC1(J.ampURL,Q,!1);f5.write(`If your browser does not open automatically, visit:
4871
4871
 
@@ -4875,7 +4875,7 @@ ${h4.blue.bold(G)}
4875
4875
  Login successful! You can now use the Amp CLI.
4876
4876
  `),!0}catch(Z){return f.error("Login failed",{error:Z}),oZ.write(`
4877
4877
  Login failed: ${Z instanceof Error?Z.message:String(Z)}
4878
- `),!1}}function tI8(){let J=new pA().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)tT(),process.exit(0);let z=H.originalError??H;Z96(z)}),J.option("-V, --version","Print the version number and exit",()=>{f5.write(`0.0.1764359833-gb488a3 (released 2025-11-28T20:02:35.893Z)
4878
+ `),!1}}function tI8(){let J=new pA().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)tT(),process.exit(0);let z=H.originalError??H;Z96(z)}),J.option("-V, --version","Print the version number and exit",()=>{f5.write(`0.0.1764360079-gb488a3 (released 2025-11-28T20:06:33.380Z)
4879
4879
  `),process.exit(0)}),J.addHelpText("after",V56()),J.configureHelp({formatHelp:K56}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await JY(U);await YP8(N)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await JY(U);await QP8(N,await BC1(U,N.settings))});let Q=async(H,z,U)=>{Xq1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:X0.of([i0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:ax1,userConfigDir:$V6});let N={...z,executeMode:!1};await ix1(N,{...H,openThreadSwitcher:!0},U)},Y=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await JY(U);await XV6(U,N,z)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await JY(U);await KP8(U,N,z)}),Y.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await JY(N);if(z.pick)oZ.write(`${h4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
4880
4880
  `);if(z.last||H||M.executeMode)await VP8(N,M,H,U);else await Q(N,M,U)}),Y.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await JY(N);await qP8(N,M,H,U)}),Y.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await JY(U);await XV6(U,N,z)}),Y.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, unlisted, workspace, group)").option("--support [message]","Share thread with Amp support for debugging").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await JY(N);await $P8(N,M,H,U,z.support)}),Y.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(H,z,U,N)=>{let M=N.optsWithGlobals(),L=await JY(M);await XP8(M,L,H,z,N)}),Y.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await JY(N);await GP8(N,M,H,U)}),Y.command("replay <threadId>").alias("p").summary("Replay a thread").description("Replay a thread by downloading it and playing through all interactions. User messages are simulated with variable typing speed.").option("--wpm <wpm>","Typing speed in words per minute (default: 120)","120").option("--no-typing","Disable typing simulation and display messages instantly").option("--message-delay <ms>","Delay between messages in milliseconds (default: 1000)","1000").option("--tool-progress-delay <ms>","Delay to show tool in-progress state in milliseconds (default: 800)","800").option("--exit-delay <seconds>","Delay in seconds before exiting after replay completes (default: 3)","3").option("--no-indicator","Hide the replay progress indicator").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await JY(N);await ZP8(N,M,H,z,U)}),G26(J,async(H,z)=>{let U=await JY(z);gq(H,z);let N=await mq(U,z);return{context:U,mcpService:N.mcpService,toolService:N.toolService,toolServices:N.toolService,configService:N.configService,cleanupTerminal:tT,asyncDispose:N.asyncDispose.bind(N)}}),i56(J,async(H)=>{let z=H.optsWithGlobals();return await JY(z)}),h56(J,async(H)=>{let z=await JY(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{gq(U,H);let N=await mq(z,H);return{mcpService:N.mcpService,settings:z.settings,asyncDispose:N.asyncDispose.bind(N)}}}});function G(H,z,U){let M=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),L=new lB(z,M),A=oI8(H);if(A)L.default(A);if(L.hidden=nI8(H)||YV6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of QV6)switch(H.type){case"flag":{J.addOption(G(H,`--${H.long}`)),J.addOption(G(H,`--no-${H.long}`,!1));break}case"switch":{J.addOption(G(H,`--${H.long}`,!0));break}default:{J.addOption(G(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}let Z=new lB("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(Z);let q=new lB("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(q);let V=new lB("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);J.addOption(V);let K=new lB("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(K);let W=new lB("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(W),process.env.AMP_CONNECT==="1"){let H=new lB("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return J.action(async(H,z)=>{let U=H,N=await JY(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")f5.write(h4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
4881
4881
  `)),process.exit(0);if(Object.keys(U).forEach((M)=>{let L=QV6.find((A)=>A.name===M);if(L&&YV6(L)&&!aI8(L))oZ.write(h4.yellow(`Warning: '--${M}' flag is deprecated
@@ -4883,8 +4883,8 @@ Login failed: ${Z instanceof Error?Z.message:String(Z)}
4883
4883
  Or pipe via stdin: echo "your message" | amp --execute`);gq(Y,Q);let q=await mq(J,Q);ZV6=q;let V=Nu(q),K=async(l)=>{let Q1=await GV6(l,"utf-8"),n=JSON.parse(Q1);if(!h$(n.id))throw new S8(kZ.invalidThreadId);return u51(q,{visibility:X,agentMode:Q.mode,thread:n})},W=async(l)=>{if(!h$(l))throw new S8(kZ.invalidThreadId);try{let[n,u]=await Promise.all([T5.getThreadLinkInfo({thread:l},{config:q.configService}),T5.getUserInfo({},{config:q.configService})]);if(n.ok&&u.ok){let s=n.result.creatorUserID,H1=u.result.id;if(s&&s!==H1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new S8(`Cannot resume thread created by another user.
4884
4884
 
4885
4885
  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.`)}}catch(n){if(n instanceof S8)throw n;f.warn("Failed to validate thread ownership in CLI, allowing to open",{error:n})}let Q1=await q.threadService.get(l)??void 0;return f.info(`[fetchAndStartThread] Loaded thread ${l}, agentMode: ${Q1?.agentMode??"undefined"}`),u51(q,{visibility:X,agentMode:Q1?void 0:Q.mode,thread:Q1})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return u51(q,{visibility:X})}catch(l){if(l instanceof S8)throw l;throw await fg(l,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return u51(q,{visibility:X})};if(Q.format==="jsonl")oZ.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
4886
- `),await JO(),process.exit(1);if(J.executeMode&&Q.remote)await n56(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)g56(q.mcpService,J.settings),await A96(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,M=!1;if(Q.jetbrains||Q.ide){await AM0();let l=CI({jetbrainsOnly:Q.jetbrains});if(l.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(l.length===1){let Q1=l[0];if(Q1)N2.selectConfig(Q1)}else N=!0}let L=H41("0.0.1764359833-gb488a3",q.settingsStorage),A=new f11(q.threadStorage),E=X0.of([i0.file(process.cwd())]),P=tZ1(void 0,E),I=new z41(q.mcpService,J.settings.getWorkspaceRootPath());if(G)U.handle({type:"user:message",message:{content:[{type:"text",text:G}]}});let T=(async()=>{try{let l=await T5.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)});if(l.ok)return f.info("User free tier status:",l),l.result}catch(l){f.error("Failed to fetch free tier status:",l)}})(),S=(async()=>{try{let l=await T5.getUserInfo({},{config:q.configService});if(l.ok)return l.result}catch(l){f.debug("Failed to fetch user workspace info:",l)}})(),[y,x]=await Promise.all([T,S]),g=x?.email,p=g&&(g.endsWith("@sourcegraph.com")||g.endsWith("@ampcode.com")||g==="auth-bypass-user@example.com");if(p)q.toolService.registerTool(os0);let b=await s56();f.info("Loaded session state:",b),await Ny1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new o61,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadHistoryService:q.threadHistoryService,threadSyncService:q.threadSyncService,planFileManager:q.planFileManager,threadID:U.threadID,threadFuzzyIndexer:A,worker:U,workerDeps:V,configService:q.configService,internalAPIClient:T5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:N2,connectedClientsService:new Si,commandRegistry:P,mcpService:q.mcpService,mcpTrustHandler:I,showJetBrainsInstaller:M,showIdePicker:N,openThreadSwitcher:Q.openThreadSwitcher,updateService:L,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:b,freeTierStatus:y,workspace:x?.team??null,features:x?.features??[],isDogfooding:p||!1,threadDependencies:q}),await q.asyncDispose(),process.exit(0)}async function JY(J){if(J.interactive)oZ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4887
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await i96({...J,workspaceTrust:{current:!0,changes:Wk},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await f56(J.mcpConfig);X=b56(X,Z)}let G=await X.get("url","global");if(!G)G=UY;if(!dF(G))f.info("Targeting custom Amp server",{ampURL:G});return X=AU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:a56(await BC1(J,X))}}function eI8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function JP8(){let J=eI8(process.argv);if(r86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),lI8(f),f.info("Starting Amp CLI.",{version:"0.0.1764359833-gb488a3",buildTimestamp:"2025-11-28T20:02:35.893Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new S8(kZ.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await tI8().parseAsync(process.argv)}rE1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await JP8().catch(fg)});async function QP8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),f5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4886
+ `),await JO(),process.exit(1);if(J.executeMode&&Q.remote)await n56(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)g56(q.mcpService,J.settings),await A96(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,M=!1;if(Q.jetbrains||Q.ide){await AM0();let l=CI({jetbrainsOnly:Q.jetbrains});if(l.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(l.length===1){let Q1=l[0];if(Q1)N2.selectConfig(Q1)}else N=!0}let L=H41("0.0.1764360079-gb488a3",q.settingsStorage),A=new f11(q.threadStorage),E=X0.of([i0.file(process.cwd())]),P=tZ1(void 0,E),I=new z41(q.mcpService,J.settings.getWorkspaceRootPath());if(G)U.handle({type:"user:message",message:{content:[{type:"text",text:G}]}});let T=(async()=>{try{let l=await T5.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)});if(l.ok)return f.info("User free tier status:",l),l.result}catch(l){f.error("Failed to fetch free tier status:",l)}})(),S=(async()=>{try{let l=await T5.getUserInfo({},{config:q.configService});if(l.ok)return l.result}catch(l){f.debug("Failed to fetch user workspace info:",l)}})(),[y,x]=await Promise.all([T,S]),g=x?.email,p=g&&(g.endsWith("@sourcegraph.com")||g.endsWith("@ampcode.com")||g==="auth-bypass-user@example.com");if(p)q.toolService.registerTool(os0);let b=await s56();f.info("Loaded session state:",b),await Ny1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new o61,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadHistoryService:q.threadHistoryService,threadSyncService:q.threadSyncService,planFileManager:q.planFileManager,threadID:U.threadID,threadFuzzyIndexer:A,worker:U,workerDeps:V,configService:q.configService,internalAPIClient:T5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:N2,connectedClientsService:new Si,commandRegistry:P,mcpService:q.mcpService,mcpTrustHandler:I,showJetBrainsInstaller:M,showIdePicker:N,openThreadSwitcher:Q.openThreadSwitcher,updateService:L,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:b,freeTierStatus:y,workspace:x?.team??null,features:x?.features??[],isDogfooding:p||!1,threadDependencies:q}),await q.asyncDispose(),process.exit(0)}async function JY(J){if(J.interactive)oZ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4887
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await i96({...J,workspaceTrust:{current:!0,changes:Wk},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await f56(J.mcpConfig);X=b56(X,Z)}let G=await X.get("url","global");if(!G)G=UY;if(!dF(G))f.info("Targeting custom Amp server",{ampURL:G});return X=AU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:a56(await BC1(J,X))}}function eI8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function JP8(){let J=eI8(process.argv);if(r86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),lI8(f),f.info("Starting Amp CLI.",{version:"0.0.1764360079-gb488a3",buildTimestamp:"2025-11-28T20:06:33.380Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new S8(kZ.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await tI8().parseAsync(process.argv)}rE1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await JP8().catch(fg)});async function QP8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),f5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4888
4888
  `);else if(!dF(J.ampURL))f5.write(`Logging in to ${new URL(J.ampURL).hostname}
4889
4889
  `);let Y=process.env.AMP_API_KEY;if(Y)f5.write(`API key found in environment variable, storing...
4890
4890
  `),await Q.set("apiKey",Y,J.ampURL),f5.write(`API key successfully stored.
@@ -4897,7 +4897,7 @@ This thread belongs to a different user and cannot be continued for security rea
4897
4897
  `);else f5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
4898
4898
  `);process.exit(0)}async function XP8(J,Q,Y,X,G){gq(G,J);let Z=await mq(Q,J);try{let q=p51(Y);if(!q)d51(Y);let V=q,K=X.trim();if(K.length===0)aZ("Thread name cannot be empty");if(K.length>256)aZ("Thread name cannot exceed 256 characters");if(!(await Hj(V,Z)).messages.length)aZ("Cannot rename an empty thread.");let H=Nu(Z);await(await A3.getOrCreateForThread(H,V)).handle({type:"title",value:K}),f.info("GOT HERE"),await Z.threadSyncService.sync(),f.info("GOT THERE"),f5.write(h4.green(`✓ Thread ${V} renamed to "${K}"
4899
4899
  `)),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose();let V=`Failed to rename thread: ${q instanceof Error?q.message:String(q)}`;aZ(V)}}async function GP8(J,Q,Y,X){gq(X,J);let G=await mq(Q,J);try{let Z=p51(Y);if(!Z)d51(Y);let V=await Hj(Z,G),K=LT(V);f5.write(K+`
4900
- `),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;aZ(q)}}async function ZP8(J,Q,Y,X,G){gq(G,J);let Z=await mq(Q,J);try{let q=await ox1(Y),V=await Hj(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,M=Nu(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await A3.getOrCreateForThread(M,L);await A.resume();let E=h11.fromWorker(A),P=new f11(Z.threadStorage),I=X0.of([i0.file(process.cwd())]),T=tZ1(void 0,I),S=new z41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=H41("0.0.1764359833-gb488a3",Z.settingsStorage);await Ny1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new o61,fuzzyServer:Z.fuzzyServer,settingsStorage:Z.settingsStorage,threadService:Z.threadService,threadHistoryService:Z.threadHistoryService,threadSyncService:Z.threadSyncService,planFileManager:Z.planFileManager,threadID:L,threadFuzzyIndexer:P,worker:E,workerDeps:M,configService:Z.configService,internalAPIClient:T5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:N2,connectedClientsService:new Si,commandRegistry:T,mcpService:Z.mcpService,mcpTrustHandler:S,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:V,typingEnabled:K,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:N}}),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),await fg(q,Y)}}async function $P8(J,Q,Y,X,G){gq(X,J);let Z=await mq(Q,J);try{let q=p51(Y);if(!q)d51(Y);let V=q,K=await T5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=F41(J,W);if(!H&&!G)aZ("Must specify either --visibility or --support");if(H&&G)aZ("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)aZ(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,U41(H)),f5.write(h4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
4900
+ `),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;aZ(q)}}async function ZP8(J,Q,Y,X,G){gq(G,J);let Z=await mq(Q,J);try{let q=await ox1(Y),V=await Hj(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,M=Nu(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await A3.getOrCreateForThread(M,L);await A.resume();let E=h11.fromWorker(A),P=new f11(Z.threadStorage),I=X0.of([i0.file(process.cwd())]),T=tZ1(void 0,I),S=new z41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=H41("0.0.1764360079-gb488a3",Z.settingsStorage);await Ny1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new o61,fuzzyServer:Z.fuzzyServer,settingsStorage:Z.settingsStorage,threadService:Z.threadService,threadHistoryService:Z.threadHistoryService,threadSyncService:Z.threadSyncService,planFileManager:Z.planFileManager,threadID:L,threadFuzzyIndexer:P,worker:E,workerDeps:M,configService:Z.configService,internalAPIClient:T5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:N2,connectedClientsService:new Si,commandRegistry:T,mcpService:Z.mcpService,mcpTrustHandler:S,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:V,typingEnabled:K,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:N}}),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),await fg(q,Y)}}async function $P8(J,Q,Y,X,G){gq(X,J);let Z=await mq(Q,J);try{let q=p51(Y);if(!q)d51(Y);let V=q,K=await T5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=F41(J,W);if(!H&&!G)aZ("Must specify either --visibility or --support");if(H&&G)aZ("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)aZ(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,U41(H)),f5.write(h4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
4901
4901
  `);if(G){await Hj(V,Z);let z=typeof G==="string"?G:void 0;await DR0(Z.threadService,V,Z.configService,z),f5.write(h4.green("✓ ")+`Thread ${V} has been shared with Amp support. These thread reports will be aggregated and analysed.
4902
4902
  `)}await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),aZ(`Failed to update thread: ${q instanceof Error?q.message:String(q)}`)}}async function qP8(J,Q,Y,X){gq(X,J);let G=await mq(Q,J),Z=Nu(G);try{let q=await ox1(Y),K=(await Hj(q,G)).messages.length-1,W=await A3.getOrCreateForThread(Z,q),H=await AT(W,G.threadSyncService,K);await Promise.all([G.threadSyncService.uploadThread(q),G.threadSyncService.uploadThread(H)]),await nx1(H),f5.write(`${H}
4903
4903
  `),await G.asyncDispose(),process.exit(0)}catch(q){oZ.write(`Error forking thread: ${q instanceof Error?q.message:String(q)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1764359833-gb488a3",
3
+ "version": "0.0.1764360079-gb488a3",
4
4
  "description": "CLI for Amp, the frontier coding agent from Sourcegraph.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {