@sourcegraph/amp 0.0.1766275311-g95fb3f → 0.0.1766290421-g053fa0

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 +9 -9
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -4021,11 +4021,11 @@ Actual: ${X}`)}async function jU8(J,Q,Y){let{execSync:Z}=await import("node:ch
4021
4021
  ${B}`;if(X==="pnpm"&&B.includes("Unable to find the global bin directory"))M+=`
4022
4022
 
4023
4023
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
4024
- npm install -g @sourcegraph/amp`;K(Error(M))}},error:(U)=>{if(!H)H=!0,K(Error(`Failed to spawn ${X}: ${U.message}`))},complete:()=>{if(!H)H=!0,V()}})})}N0();N0();async function V51(J,Q){let Z=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Z}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=xU8(J,q),H=W<0,F,U;if(K.time){let B=K.time[J],M=K.time[q],L=Date.now();if(B)F=Math.floor((L-new Date(B).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:F,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:F,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function xU8(J,Q){let Y=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Z=Y(J),X=Y(Q),G=Math.max(Z.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Z.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Z.label===X.label)return 0;if(!Z.label&&X.label)return 1;if(Z.label&&!X.label)return-1;if(Z.label&&X.label)return Z.label<X.label?-1:1;return 0}s0();function K51(J,Q){let Y=new r4,Z=Y.pipe(U8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new Xq().scoped("update"),G=Z.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await Jj(500),Y.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=Lw(),W=await V51(J,q);if(!(W.latestVersion&&W.hasUpdate)){X.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,B=0.5;if(Math.abs(U)<0.5)return X.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},F=await G51();if(!K)K=F==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:F,mode:K});if(K==="warn"){if(!H())Y.next("update-available");return}if(!F){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}if(F==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Y.next("update-available");return}try{await Hp(W.latestVersion,F);let U=await sN(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",B),Y.next("updated");else X.warn("success with warning",B),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await Jj(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}rs();import{stderr as LW}from"node:process";function iJ6(J){let Q=new tV().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(Z)=>{await Ty1(Z.force||!1,Z.verbose||!1,"0.0.1766275311-g95fb3f"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new tV("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(Z)=>{await vU8(Z.targetVersion)});J.addCommand(Y)}async function vU8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")LW.write(V6.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4024
+ npm install -g @sourcegraph/amp`;K(Error(M))}},error:(U)=>{if(!H)H=!0,K(Error(`Failed to spawn ${X}: ${U.message}`))},complete:()=>{if(!H)H=!0,V()}})})}N0();N0();async function V51(J,Q){let Z=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Z}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=xU8(J,q),H=W<0,F,U;if(K.time){let B=K.time[J],M=K.time[q],L=Date.now();if(B)F=Math.floor((L-new Date(B).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:F,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:F,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function xU8(J,Q){let Y=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Z=Y(J),X=Y(Q),G=Math.max(Z.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Z.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Z.label===X.label)return 0;if(!Z.label&&X.label)return 1;if(Z.label&&!X.label)return-1;if(Z.label&&X.label)return Z.label<X.label?-1:1;return 0}s0();function K51(J,Q){let Y=new r4,Z=Y.pipe(U8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new Xq().scoped("update"),G=Z.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await Jj(500),Y.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=Lw(),W=await V51(J,q);if(!(W.latestVersion&&W.hasUpdate)){X.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,B=0.5;if(Math.abs(U)<0.5)return X.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},F=await G51();if(!K)K=F==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:F,mode:K});if(K==="warn"){if(!H())Y.next("update-available");return}if(!F){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}if(F==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Y.next("update-available");return}try{await Hp(W.latestVersion,F);let U=await sN(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",B),Y.next("updated");else X.warn("success with warning",B),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await Jj(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}rs();import{stderr as LW}from"node:process";function iJ6(J){let Q=new tV().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(Z)=>{await Ty1(Z.force||!1,Z.verbose||!1,"0.0.1766290421-g053fa0"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new tV("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(Z)=>{await vU8(Z.targetVersion)});J.addCommand(Y)}async function vU8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")LW.write(V6.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4025
4025
 
4026
4026
  `));try{if(!J){LW.write(V6.blue(`Checking for updates...
4027
- `));let Y=Lw(),{hasUpdate:Z,latestVersion:X}=await V51("0.0.1766275311-g95fb3f",Y);if(!Z){LW.write(V6.green(`✓ Amp CLI is already up to date: ${"0.0.1766275311-g95fb3f"} (${"released"} ${"2025-12-21T00:06:54.623Z"}${`, ${kR(new Date("2025-12-21T00:06:54.623Z"))} ago`})
4028
- `));let V=await sN("0.0.1766275311-g95fb3f");if(V.warning)LW.write(`
4027
+ `));let Y=Lw(),{hasUpdate:Z,latestVersion:X}=await V51("0.0.1766290421-g053fa0",Y);if(!Z){LW.write(V6.green(`✓ Amp CLI is already up to date: ${"0.0.1766290421-g053fa0"} (${"released"} ${"2025-12-21T04:19:07.702Z"}${`, ${kR(new Date("2025-12-21T04:19:07.702Z"))} ago`})
4028
+ `));let V=await sN("0.0.1766290421-g053fa0");if(V.warning)LW.write(`
4029
4029
  `+V6.yellow(V.warning)+`
4030
4030
  `);process.exit(0)}if(!X)LW.write(V6.yellow("[WARN] could not find latest version")),process.exit(0);J=X}LW.write(V6.blue(`Updating to version ${J}...
4031
4031
  `)),await Hp(J,void 0,(Y)=>{LW.write(V6.dim(`Running: ${Y}
@@ -4745,7 +4745,7 @@ Ctrl-X, Y, Z to unlock`;if(U){let c=W.text.replace(/`([^`]+)`/g,"$1")+`
4745
4745
  `,A)])}),S];if(!q&&!U&&W.url){let b=W.url.replace(/^https?:\/\//,"");f.push(new _5({uri:W.url,text:b,style:new e({color:Y.secondary,underline:!0})}))}if(C&&!U)f.push(C);let m=new Q0({width:40,child:new C0({crossAxisAlignment:"start",mainAxisSize:"min",children:f})});return A4.child(new F6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new dx1({width:zb1,height:Ub1,agentMode:this.widget.agentMode,glow:this._glow,t:H,fps:0,shockwaves:this._shockwaves,onShockwave:P,...V==="disabled"&&{seed:42}}),new Q0({width:2}),m]}))}}N0();B8();x4();L7();B8();s0();function mC8(J,Q){return`${J}:${Q}`}class Bb1{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 Y0((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new Y0((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new Y0((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(PL()).subscribe((G)=>{this.threadsMap.set(Q,G);let V=this.subthreadsMap.get(Q)||[],K=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:G,subthreads:V,workerStatus:K})});this.mainThreadSubs.set(Q,Y);let Z=J.status.subscribe((G)=>{if(this.workers.set(Q,G),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:G})});this.workerStatusSubs.set(Q,Z);let X=J.subthreads.subscribe((G)=>{this.subthreadsMap.set(Q,G);for(let V of G){let K=mC8(Q,V.toolUse.id);if(this.subthreadPatchSubs.has(K))continue;let q=this.threadService.observePatches(V.threadID).pipe(PL()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:V})});this.subthreadPatchSubs.set(K,q)}});this.subthreadsSubs.set(Q,X)}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 Z=this.subthreadsSubs.get(J);if(Z)Z.unsubscribe(),this.subthreadsSubs.delete(J);for(let[X,G]of this.subthreadPatchSubs.entries())if(X.startsWith(`${J}:`))G.unsubscribe(),this.subthreadPatchSubs.delete(X);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new Y0((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new Y0((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new Y0((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 Z=this.workers.get(Q);if(Z)J[Q]=fO(Y,Z)}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 uC8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Y,subthread:Z}=Q,X=J.subagents[Z.threadID];if(!X){if(X={subThreadID:Y.id,parentToolID:Z.toolUse.id,taskDescription:Z.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=VQ(J.mainThread);X.isCompleted=KW6(W,Z.toolUse.id)}}let G=pC8(Y,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=kS(Y).items.filter((W)=>W.type==="toolResult");for(let W of q)K[W.id]={id:W.id,subthreadID:Y.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[Z.threadID]:V},tools:K,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Y,subthreads:Z,workerStatus:X}=Q,G=VQ(Y),V={...J.subagents};for(let F of Z){let U=V[F.threadID];if(!U)continue;let B=KW6(G,F.toolUse.id);V[F.threadID]={...U,isCompleted:B}}let{items:K}=kS(Y),q=fO(Y,X),W=SU({messages:Y.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:V,items:K,viewState:q,todosList:H,mainThread:Y}}case"worker-status-change":{if(!J.mainThread)return J;let Y=fO(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function kS(J){let Q=[],Y=new Map,Z=new Set;for(let[X,G]of J.messages.entries()){let V=`${G.role}-${X}`;switch(G.role){case"assistant":{let K=G.state.type==="streaming";for(let W of G.content)if(W.type==="tool_use"){if(Y.set(W.id,W),K)Z.add(W.id)}if(G.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:V,message:G});for(let W of G.content)if(W.type==="tool_use"){let H=!1;for(let F=X+1;F<J.messages.length;F++){let U=J.messages[F];if(U){for(let B of U.content)if(B.type==="tool_result"&&B.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:K?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:V,message:G});break;case"user":{let K=G.content.some((q)=>q.type==="text"&&q.text.trim()||q.type==="image");for(let q of G.content)if(q.type==="tool_result"){let W=Y.get(q.toolUseID)??dZ(J,q.toolUseID);if(!W)throw Error(`(bug) tool use ${q.toolUseID} not found`);Q.push({type:"toolResult",id:q.toolUseID,toolUse:W,toolResult:q})}if(K)Q.push({type:"message",id:V,message:G});break}}}return{items:Q}}function KW6(J,Q){let Y=J.get(Q);return(Y&&y7(Y.run))??!1}function pC8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((X)=>X.type==="tool_result"&&X.run.status==="blocked-on-user"))return v.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(kS(J).items.some((X)=>X.type==="toolResult"&&X.toolResult.run.status==="in-progress")){let X=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools",{threadID:J.id,startTime:X,hasStartTime:!!X}),{type:"running-tools",startTime:X}}if(Y&&Y.role==="assistant"&&Y.state.type==="streaming")switch(Y.content.at(-1)?.type){case"text":return v.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return v.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let G=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}default:return v.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return v.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class Nb1 extends p0{props;constructor(J){super();this.props=J}createState(){return new qW6}}class qW6 extends m0{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 Bb1(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((G)=>{this.dispatch({type:"main-thread-patch",thread:G.mainThread,subthreads:G.subthreads,workerStatus:G.workerStatus})});this.subscriptions.push(Y);let Z=Q.subthreads.subscribe((G)=>{this.dispatch({type:"subthread-patch",thread:G.thread,subthread:G.subthread})});this.subscriptions.push(Z);let X=Q.workerStatus.subscribe((G)=>{this.dispatch({type:"worker-status-change",workerStatus:G.status})});this.subscriptions.push(X)}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=uC8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((G)=>({toolUse:G.toolUse,toolRun:G.toolRun,subthreadID:G.subthreadID})),Q={};for(let G of Object.values(this.state.subagents)){let V=J.filter((K)=>K.subthreadID===G.subThreadID);Q[G.parentToolID]=V}let Y=(G)=>G===t5||G===A9||G===Kq,Z=new Map;for(let G of this.state.items)if(G.type==="toolResult"&&Y(G.toolUse.name))Z.set(G.toolUse.id,{toolUseId:G.toolUse.id,toolName:G.toolUse.name,toolRun:G.toolResult.run});let X=Array.from(Z.values());for(let{toolUseId:G,toolRun:V}of X){let K=[],q;if(V.status==="in-progress"||V.status==="done"||V.status==="error"||V.status==="cancelled")q=V.progress;if(q){let W=0;for(let H of q)if(H.tool_uses)for(let F of H.tool_uses){let U=`${G}:progress:${W++}`;K.push({toolUse:qP(F.tool_name,F.input,U),toolRun:{status:F.status}})}}Q[G]=K}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 Db1 extends p0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new WW6}}class WW6 extends m0{build(J){let Y=q6.of(J).colors,{todos:Z,title:X="TODOs"}=this.widget.props;if(!Array.isArray(Z)||Z.length===0)return new Q0({width:0,height:0});let G=Z.map((V)=>this.buildTodoItem(V,Y));return new f0({child:new B6({padding:W0.symmetric(1,0),child:new C0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new C1({text:new d(X,new e({bold:!0,color:Y.foreground}))}),...G]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),Z=J.status==="completed",X=new e({bold:J.status==="in-progress",color:Q.foreground,dim:Z}),G=new e({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:Z});return new F6({crossAxisAlignment:"start",children:[new C1({text:new d(Y,X)}),new Q0({width:1}),new a6({child:new C1({text:new d(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class Mb1 extends l6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Y,onButtonClick:Z}){super({key:J});this.ad=Q,this.onDismiss=Y,this.onButtonClick=Z}build(J){let Q=q6.of(J),Y=Q.colors.primary,Z=Q.colors.foreground;return new f0({decoration:new C8(void 0,new z4(new G4(Y,1,"rounded"),new G4(Y,1,"rounded"),void 0,new G4(Y,1,"rounded"))),child:new B6({padding:W0.horizontal(1),child:new C0({children:[new F6({crossAxisAlignment:"start",children:[new a6({child:new C1({text:new d(this.ad.content,new e({color:Z}))})}),new Q0({width:4}),new _5({uri:"https://ampcode.com/free",text:"Ad",style:new e({color:Z,dim:!0})})]}),new F6({crossAxisAlignment:"start",children:[new ex1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:W0.horizontal(1),color:Y,reverse:!0}),new Q0({width:2}),new C1({text:new d(this.ad.destinationUrlHostname,new e({color:Z,dim:!0}))})]})]})})})}}class Lb1 extends p0{props;constructor(J){super();this.props=J}createState(){return new HW6(this.props.autofocus??!0)}}class HW6 extends m0{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(K)=>{if(K.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(K.ctrlKey&&K.key==="c"||K.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Y=E4.sizeOf(J),Z=Math.min(60,Y.width-4),X=Y.height-4,G=[];if(this.widget.props.title)G.push(new C1({text:new d(this.widget.props.title,new e({bold:!0,color:B1.blue}))}),new Q0({height:1}));if(this.widget.props.message)G.push(new C1({text:new d(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)G.push(new Q0({height:1}));let V=[];if(this.widget.props.showCopyOption)V.push(new C1({text:new d("Enter to copy",new e({dim:!0}))}));return V.push(new C1({text:new d("Escape to close",new e({dim:!0}))})),G.push(new F6({children:V.flatMap((K,q)=>q<V.length-1?[K,new Q0({width:1}),new C1({text:new d("•",new e({dim:!0}))}),new Q0({width:1})]:[K]),mainAxisSize:"min"})),new A4({child:new f0({constraints:new M6(Z,Z,0,X),decoration:new C8(B1.default(),new z4(new G4(B1.blue,1,"rounded"),new G4(B1.blue,1,"rounded"),new G4(B1.blue,1,"rounded"),new G4(B1.blue,1,"rounded"))),padding:new W0(2,2,2,2),child:new z8({autofocus:this.autofocus,onKey:Q,child:new C0({children:G,mainAxisSize:"min"})})})})}}function Ab1(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})}oH();N0();import{spawn as dC8}from"node:child_process";import{promises as cC8}from"node:fs";function FW6(J){return J.kind==="executable"}function zW6(J){return J.kind==="markdown"}var Mz=50000,UW6=300000;async function Ob1(J,Q,Y,Z={}){let{timeoutMs:X=UW6,signal:G,source:V}=Z;try{let K=await Y.getCommand(J,V);if(!K)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Y.isCommandAvailable(J,V))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(v.debug("Executing command",{commandName:J,filePath:K.filePath,args:Q}),zW6(K))return await lC8(K,Q);else if(FW6(K))return await nC8(K,Q,X,G);else return{success:!1,output:"",error:"Unsupported command type"}}catch(K){return v.error("Failed to execute command",{commandName:J,error:K}),{success:!1,output:"",error:K instanceof Error?K.message:"Unknown error occurred"}}}async function lC8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await cC8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>Mz?Y.slice(0,Mz)+`
4746
4746
  ... (output truncated at ${Mz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function nC8(J,Q,Y=UW6,Z){return new Promise((X)=>{let[G,V]=iC8(J,Q);v.debug("Spawning command",{spawnCommand:G,spawnArgs:V.slice(0,10),filePath:J.filePath,timeoutMs:Y});let K=KC0(Z),q=!1,W=setTimeout(()=>{q=!0,K.abort(),v.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=dC8(G,V,{stdio:["pipe","pipe","pipe"],signal:K.signal,detached:!0}),F=[],U=[],B=0;H.stdout?.on("data",(M)=>{let L=M.toString();if(B+=L.length,B<=Mz)F.push(L);else{let A=Mz-(B-L.length);if(A>0)F.push(L.slice(0,A))}}),H.stderr?.on("data",(M)=>{let L=M.toString();if(B+=L.length,B<=Mz)U.push(L);else{let A=Mz-(B-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(M)=>{if(clearTimeout(W),q){X({success:!1,output:F.join(""),error:`Command timed out after ${Y}ms`,exitCode:void 0});return}if(K.signal.aborted){X({success:!1,output:F.join(""),error:"The command was aborted",exitCode:M??void 0});return}let L=M===0||M===1,A=F.join(""),w=U.join(""),E=A;if(!L&&!A.trim()&&w.trim())E=w;else if(w.trim())E+=A?`
4747
4747
  ${w}`:w;if(B>Mz)E+=`
4748
- ... (output truncated at ${Mz} characters)`;X({success:L,output:E.trim(),error:!L?w.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(q)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:F.join(""),error:L})})})}function iC8(J,Q){let{filePath:Y,interpreter:Z,extension:X}=J;if(process.platform==="win32")return oC8(Y,Z?[...Z]:null,X,Q);else return aC8(Y,Z?[...Z]:null,X,Q)}function aC8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];else return[J,Z]}function oC8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Z]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Z]];case".exe":return[J,Z];default:return[J,Z]}}N0();ne();A$();q7();CR();hH();NQ();f$();rH();fq();B8();Im();L7();_y();s0();var lW6=Q6(EB(),1);import{writeFile as mW6}from"fs/promises";import uW6 from"path";N0();NQ();class wb1{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.1766275311-g95fb3f"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Ut(Q,this.configService)}catch(Q){v.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 RD extends p0{props;constructor(J){super();this.props=J}createState(){return new BW6}}class BW6 extends m0{_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 NW6 extends m0{controller=new LZ;focusNode=new M8({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=q6.of(J),{colors:Y,app:Z}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=z4.all(new G4(Y.foreground,1,"solid")),q=new qz({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(B)=>{let M=B.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new F6({children:[new f0({decoration:{color:B1.default()},child:new C1({text:new d(">",new e({color:Y.foreground}))})}),new a6({child:q})]}),H=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d("",void 0,[new d("Command: ",new e({color:Y.foreground})),new d(this.widget.props.commandName,new e({color:B1.yellow,bold:!0}))])})}),F=[];if(V)F.push(new d("Enter",new e({color:Z.keybind}))),F.push(new d(" to submit, ",new e({color:Y.foreground,dim:!0})));F.push(new d("Esc",new e({color:Z.keybind}))),F.push(new d(" to cancel",new e({color:Y.foreground,dim:!0})));let U=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d("",void 0,F)})});return new f0({decoration:{border:K,color:B1.default()},padding:W0.all(1),child:new C0({children:[H,new Q0({height:1}),W,new l5,U]})})}}class Ed extends p0{props;constructor(J){super();this.props=J}createState(){return new NW6}}rH();class DW6 extends m0{controller=new LZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new M8({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>=XB)return!1;let Q=YS(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=q6.of(J),{colors:Y,app:Z}=Q,G=E4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new tw({controller:this.controller,triggers:[new vW],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(B)=>{this.widget.props.onSubmit(B.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:E8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new z8({focusNode:this.focusNode,child:K}),W=new f0({constraints:new M6({maxHeight:V}),padding:W0.symmetric(1,0),child:q}),H=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d("",void 0,[new d("Command: ",new e({color:Y.foreground})),new d(this.widget.props.commandName,new e({color:B1.yellow,bold:!0}))])})}),F=new f0({padding:W0.symmetric(1,0),child:new C1({text:this.isConfirmingClearInput?new d("",void 0,[new d("Esc",new e({color:Z.keybind})),new d(" again to clear input",new e({color:Y.foreground,dim:!0}))]):new d("",void 0,[new d("Press ",new e({color:Y.foreground,dim:!0})),new d("Enter",new e({color:Z.keybind})),new d(" to submit, ",new e({color:Y.foreground,dim:!0})),new d("Esc",new e({color:Z.keybind})),new d(" to clear",new e({color:Y.foreground,dim:!0}))])})}),U=[H,new Q0({height:1}),new a6({child:W}),new Q0({height:1}),F];return new f0({decoration:{border:z4.all(new G4(Y.foreground,1,"solid")),color:B1.default()},padding:W0.all(1),child:new C0({children:U})})}}class Ib1 extends p0{props;constructor(J){super();this.props=J}createState(){return new DW6}}import{isDeepStrictEqual as eC8}from"node:util";var rC8=/[\\/_ +.#"@[({&]/,sC8=/[\\/_ +.#"@[({&]/g,tC8=/[\s-]/,MW6=/[\s-]/g;function Z21(J,Q,Y,Z,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Z.charAt(G),W=Y.indexOf(q,X),H=0,F,U,B,M;while(W>=0){if(F=Z21(J,Q,Y,Z,W+1,G+1,V),F>H){if(W===X)F*=1;else if(tC8.test(J.charAt(W-1))){if(F*=0.9,M=J.slice(X,W-1).match(MW6),M&&X>0)F*=Math.pow(0.999,M.length)}else if(rC8.test(J.charAt(W-1))){if(F*=0.8,B=J.slice(X,W-1).match(sC8),B&&X>0)F*=Math.pow(0.999,B.length)}else if(F*=0.3,X>0)F*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))F*=0.9999}if(F<0.1&&(Y.charAt(W-1)===Z.charAt(G+1)||Z.charAt(G+1)===Z.charAt(G)&&Y.charAt(W-1)!==Z.charAt(G))){if(U=Z21(J,Q,Y,Z,W+1,G+2,V),U*0.1>F)F=U*0.1}if(F>H)H=F;W=Y.indexOf(q,W+1)}return V[K]=H,H}function Y21(J){return J.toLowerCase().replace(MW6," ")}function LW6(J,Q){let Y=Z21(J,Q,Y21(J),Y21(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=Z21(J,K,Y21(J),Y21(K),0,0,{});if(q===0)return Y;X+=q,G+=K.length}let V=X/Z.length*0.95;return Math.max(Y,V)}return Y}class yS{}class xS{}class X21{}class $21{}class AW6 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new OW6}}class OW6 extends m0{build(J){return this.widget.onContext(J),this.widget.child}}function Jj8(J,Q){if(J==="")return{matches:!0,score:1};let Y=LW6(Q,J);return{matches:Y>0.15,score:Y}}class QJ extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new wW6}}class wW6 extends m0{controller=new LZ;focusNode;scrollController=new O5;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new M8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.cachedFiltered;this.widget.props.onSelectionChange?.(Q[0]??null)}),this.recomputeFilteredItems();let J=this.cachedFiltered;this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!eC8(J.props.items,this.widget.props.items)){this.recomputeFilteredItems(),this.ensureSelectedItemVisible();let Q=this.cachedFiltered;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 yS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof xS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof X21){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 $21)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Y=Q.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...Jj8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,X)=>this.widget.props.sortItems(Z,X,J):(Z,X)=>X.score-Z.score).map((Z)=>Z.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Q)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,Z=Q.size.height;j71(J,{top:Y,bottom:Z},{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(),n8.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 Z=Y[J],X=Z?this.widget.props.isItemDisabled?.(Z)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!X){if(Z)this.widget.props.onAccept(Z)}}};build(J){let Q=q6.of(J),{colors:Y}=Q,Z=this.getFilteredItems(),X=z4.all(new G4(Y.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new qz({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Y.foreground,border:null},maxLines:1}),K=new xX({shortcuts:new Map([[new D4("ArrowDown"),new yS],[new D4("ArrowUp"),new xS],[new D4("Tab"),new yS],[new D4("Tab",{shift:!0}),new xS],[new D4("n",{ctrl:!0}),new yS],[new D4("p",{ctrl:!0}),new xS],[new D4("Enter"),new X21],[new D4("Escape"),new $21]]),focusNode:this.focusNode,child:V}),q=new yJ({actions:new Map([[yS,new j8(this.invoke)],[xS,new j8(this.invoke)],[X21,new j8(this.invoke)],[$21,new j8(this.invoke)]]),child:K}),W=new F6({children:[new f0({decoration:{color:B1.default()},child:new C1({text:new d(">",new e({color:Y.foreground}))})}),new a6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Q0({height:10,child:new A4({child:new C1({text:new d(L,new e({color:Y.foreground}))})})})}else if(Z.length===0&&this.widget.props.emptyStateText)H=new a6({child:new A4({child:new C1({text:new d(this.widget.props.emptyStateText,new e({color:Y.foreground,dim:!0}))})})});else{let L=Z.map((A,w)=>{let E=w===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,E,P,J);else{let C=E?B1.yellow:void 0,S=E?B1.black:Y.foreground;R=new f0({decoration:C?{color:C}:void 0,padding:W0.symmetric(2,0),child:new C1({text:new d(this.widget.props.getLabel(A),new e({color:S,dim:P}))})})}return new AW6(new L8({onClick:(C)=>this.handleItemClick(w,C.clickCount),child:R}),(C)=>{this.itemContexts[w]=C})});H=new C0({children:L,crossAxisAlignment:"start"})}let F=new a6({child:new L8({onScroll:this.handleScroll,opaque:!1,child:new J5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d(this.widget.props.title,new e({color:B1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Q0({height:1}),F),this.controller.text!==""){let L=Z.length>0?Z[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new f0({padding:W0.vertical(1),child:new A4({child:A})}));else U.push(new Q0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new f0({decoration:{border:X,color:B1.default()},padding:W0.symmetric(1,0),child:new C0({children:U})})}}function IW6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class Eb1 extends l6{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>IW6(X.pubDate).length));return new QJ({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=q6.of(K),{colors:W}=q,H=G?B1.yellow:void 0,F=G?B1.black:W.foreground,U=B1.index(8),B=(M,L)=>new Q0({width:L,child:F6.end([new C1({text:new d(M,new e({color:U}))})])});return new f0({decoration:H?{color:H}:void 0,padding:W0.symmetric(2,0),child:new F6({children:[new a6({child:new C1({text:new d(X.title,new e({color:F})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),B(IW6(X.pubDate),Y)]})})}})}}class Pb1 extends p0{createState(){return new EW6}}class EW6 extends m0{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 C1({text:new d("●",new e({color:this.isGreen?B1.green:B1.index(8),bold:!0})),maxLines:1})}}function Qj8(J){let Q=new Map,Y=new Map,Z=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Z.set(V.id,K.type);let q=K.threadID,W=Y.get(q)||[];W.push(V),Y.set(q,W)}else X.push(V)}return fX.flatten(X,(V)=>Y.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Z.get(V.item.id)}))}function Rb1(J,Q,Y){return new C1({text:new d(`${J}${Q}`,new e({color:Y})),maxLines:1})}function Yj8(J,Q,Y,Z){return[Rb1("+",J,Z.success),l5.horizontal(1),Rb1("~",Q,Z.warning),l5.horizontal(1),Rb1("-",Y,Z.destructive)]}class G21 extends l6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((F)=>F.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((F)=>F.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],Z=new Set(Y),X=this.props.currentThreadID,G=[...Q].sort((F,U)=>{if(X){if(F.id===X)return-1;if(U.id===X)return 1}let B=Y.indexOf(F.id),M=Y.indexOf(U.id);if(B!==-1&&M!==-1)return B-M;if(B!==-1)return-1;if(M!==-1)return 1;return 0}),V=Qj8(G),K=Math.max(0,...V.map((F)=>F.description.timeAgo.length)),q=q6.of(J),W=new B6({padding:W0.symmetric(0,1),child:new A4({child:new C1({text:new d("",new e({color:q.colors.foreground,dim:!0}),[new d("Ctrl+T",new e({color:B1.blue,dim:!0})),new d(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new e({color:q.colors.foreground,dim:!0}))])})})});return new QJ({items:V,getLabel:(F)=>F.title,onAccept:(F)=>this.props.onSelect?.(F.id),onDismiss:this.props.onDismiss,onSelectionChange:(F)=>{if(this.props.previewController){if(F)this.props.previewController.select(F.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:200,footer:this.props.isLoading?void 0:W,renderItem:(F,U,B,M)=>{let L=q6.of(M),{colors:A}=L,w=U?B1.yellow:void 0,E=U?B1.black:A.foreground,P=B1.index(8),R=(r,p)=>new Q0({width:p,child:F6.end([new C1({text:new d(r,new e({color:P}))})])}),C=this.props.threadViewStates[F.id],S=[],k=F.relationshipType==="handoff",f=new Y31;if(F.depth>0){let r=[],p=F.ancestorsAreLast.slice(1);for(let Y1 of p)r.push(new d(f.getAncestorPrefix(Y1),new e({color:f.connectorColor,dim:f.connectorDim})));let s=F.isLast?f.elbow:f.tee,Q1=f.getConnectorText(s);r.push(new d(Q1,new e({color:f.connectorColor,dim:f.connectorDim}))),S.push(new C1({text:new d("",void 0,r)}))}let m=[],b=X===F.id?new d("(current) ",new e({color:B1.green})):Z.has(F.id)?new d("(visited) ",new e({color:A.foreground,dim:!0})):null;if(b)m.push(new C1({text:b}));if(C){if(C.state==="active"&&(C.interactionState==="tool-running"||C.inferenceState==="running"))m.push(new Pb1),m.push(new Q0({width:1}))}let c=F.title;if(F.relationshipType==="fork"){let r=c.match(/^Forked\((\d+)\): /);if(r)c=c.slice(r[0].length);else while(c.startsWith("Forked: "))c=c.slice(8);m.push(new C1({text:new d("[fork] ",new e({color:B1.blue}))}))}else if(k)m.push(new C1({text:new d("[handoff] ",new e({color:B1.index(208)}))}));if(m.push(new a6({child:new C1({text:new d(c,new e({color:E})),overflow:"ellipsis",maxLines:1})})),m.push(new Q0({width:2})),F.diffStats&&(F.diffStats.added>0||F.diffStats.changed>0||F.diffStats.deleted>0)){let r=U?{success:P,warning:P,destructive:P}:A;m.push(...Yj8(F.diffStats.added,F.diffStats.changed,F.diffStats.deleted,r)),m.push(new Q0({width:2}))}return m.push(R(F.description.timeAgo,K)),new f0({decoration:w?{color:w}:void 0,padding:W0.symmetric(2,0),child:new F6({children:[...S,...m]})})}})}}class Tb1 extends l6{props;constructor(J){super();this.props=J}build(){return new A4({child:new C1({text:new d("",void 0,[new d(`Forked to new thread:
4748
+ ... (output truncated at ${Mz} characters)`;X({success:L,output:E.trim(),error:!L?w.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(q)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:F.join(""),error:L})})})}function iC8(J,Q){let{filePath:Y,interpreter:Z,extension:X}=J;if(process.platform==="win32")return oC8(Y,Z?[...Z]:null,X,Q);else return aC8(Y,Z?[...Z]:null,X,Q)}function aC8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];else return[J,Z]}function oC8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Z]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Z]];case".exe":return[J,Z];default:return[J,Z]}}N0();ne();A$();q7();CR();hH();NQ();f$();rH();fq();B8();Im();L7();_y();s0();var lW6=Q6(EB(),1);import{writeFile as mW6}from"fs/promises";import uW6 from"path";N0();NQ();class wb1{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.1766290421-g053fa0"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Ut(Q,this.configService)}catch(Q){v.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 RD extends p0{props;constructor(J){super();this.props=J}createState(){return new BW6}}class BW6 extends m0{_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 NW6 extends m0{controller=new LZ;focusNode=new M8({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=q6.of(J),{colors:Y,app:Z}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=z4.all(new G4(Y.foreground,1,"solid")),q=new qz({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(B)=>{let M=B.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new F6({children:[new f0({decoration:{color:B1.default()},child:new C1({text:new d(">",new e({color:Y.foreground}))})}),new a6({child:q})]}),H=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d("",void 0,[new d("Command: ",new e({color:Y.foreground})),new d(this.widget.props.commandName,new e({color:B1.yellow,bold:!0}))])})}),F=[];if(V)F.push(new d("Enter",new e({color:Z.keybind}))),F.push(new d(" to submit, ",new e({color:Y.foreground,dim:!0})));F.push(new d("Esc",new e({color:Z.keybind}))),F.push(new d(" to cancel",new e({color:Y.foreground,dim:!0})));let U=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d("",void 0,F)})});return new f0({decoration:{border:K,color:B1.default()},padding:W0.all(1),child:new C0({children:[H,new Q0({height:1}),W,new l5,U]})})}}class Ed extends p0{props;constructor(J){super();this.props=J}createState(){return new NW6}}rH();class DW6 extends m0{controller=new LZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new M8({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>=XB)return!1;let Q=YS(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=q6.of(J),{colors:Y,app:Z}=Q,G=E4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new tw({controller:this.controller,triggers:[new vW],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(B)=>{this.widget.props.onSubmit(B.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:E8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new z8({focusNode:this.focusNode,child:K}),W=new f0({constraints:new M6({maxHeight:V}),padding:W0.symmetric(1,0),child:q}),H=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d("",void 0,[new d("Command: ",new e({color:Y.foreground})),new d(this.widget.props.commandName,new e({color:B1.yellow,bold:!0}))])})}),F=new f0({padding:W0.symmetric(1,0),child:new C1({text:this.isConfirmingClearInput?new d("",void 0,[new d("Esc",new e({color:Z.keybind})),new d(" again to clear input",new e({color:Y.foreground,dim:!0}))]):new d("",void 0,[new d("Press ",new e({color:Y.foreground,dim:!0})),new d("Enter",new e({color:Z.keybind})),new d(" to submit, ",new e({color:Y.foreground,dim:!0})),new d("Esc",new e({color:Z.keybind})),new d(" to clear",new e({color:Y.foreground,dim:!0}))])})}),U=[H,new Q0({height:1}),new a6({child:W}),new Q0({height:1}),F];return new f0({decoration:{border:z4.all(new G4(Y.foreground,1,"solid")),color:B1.default()},padding:W0.all(1),child:new C0({children:U})})}}class Ib1 extends p0{props;constructor(J){super();this.props=J}createState(){return new DW6}}import{isDeepStrictEqual as eC8}from"node:util";var rC8=/[\\/_ +.#"@[({&]/,sC8=/[\\/_ +.#"@[({&]/g,tC8=/[\s-]/,MW6=/[\s-]/g;function Z21(J,Q,Y,Z,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Z.charAt(G),W=Y.indexOf(q,X),H=0,F,U,B,M;while(W>=0){if(F=Z21(J,Q,Y,Z,W+1,G+1,V),F>H){if(W===X)F*=1;else if(tC8.test(J.charAt(W-1))){if(F*=0.9,M=J.slice(X,W-1).match(MW6),M&&X>0)F*=Math.pow(0.999,M.length)}else if(rC8.test(J.charAt(W-1))){if(F*=0.8,B=J.slice(X,W-1).match(sC8),B&&X>0)F*=Math.pow(0.999,B.length)}else if(F*=0.3,X>0)F*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))F*=0.9999}if(F<0.1&&(Y.charAt(W-1)===Z.charAt(G+1)||Z.charAt(G+1)===Z.charAt(G)&&Y.charAt(W-1)!==Z.charAt(G))){if(U=Z21(J,Q,Y,Z,W+1,G+2,V),U*0.1>F)F=U*0.1}if(F>H)H=F;W=Y.indexOf(q,W+1)}return V[K]=H,H}function Y21(J){return J.toLowerCase().replace(MW6," ")}function LW6(J,Q){let Y=Z21(J,Q,Y21(J),Y21(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=Z21(J,K,Y21(J),Y21(K),0,0,{});if(q===0)return Y;X+=q,G+=K.length}let V=X/Z.length*0.95;return Math.max(Y,V)}return Y}class yS{}class xS{}class X21{}class $21{}class AW6 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new OW6}}class OW6 extends m0{build(J){return this.widget.onContext(J),this.widget.child}}function Jj8(J,Q){if(J==="")return{matches:!0,score:1};let Y=LW6(Q,J);return{matches:Y>0.15,score:Y}}class QJ extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new wW6}}class wW6 extends m0{controller=new LZ;focusNode;scrollController=new O5;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new M8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.cachedFiltered;this.widget.props.onSelectionChange?.(Q[0]??null)}),this.recomputeFilteredItems();let J=this.cachedFiltered;this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!eC8(J.props.items,this.widget.props.items)){this.recomputeFilteredItems(),this.ensureSelectedItemVisible();let Q=this.cachedFiltered;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 yS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof xS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof X21){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 $21)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Y=Q.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...Jj8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,X)=>this.widget.props.sortItems(Z,X,J):(Z,X)=>X.score-Z.score).map((Z)=>Z.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Q)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,Z=Q.size.height;j71(J,{top:Y,bottom:Z},{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(),n8.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 Z=Y[J],X=Z?this.widget.props.isItemDisabled?.(Z)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!X){if(Z)this.widget.props.onAccept(Z)}}};build(J){let Q=q6.of(J),{colors:Y}=Q,Z=this.getFilteredItems(),X=z4.all(new G4(Y.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new qz({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Y.foreground,border:null},maxLines:1}),K=new xX({shortcuts:new Map([[new D4("ArrowDown"),new yS],[new D4("ArrowUp"),new xS],[new D4("Tab"),new yS],[new D4("Tab",{shift:!0}),new xS],[new D4("n",{ctrl:!0}),new yS],[new D4("p",{ctrl:!0}),new xS],[new D4("Enter"),new X21],[new D4("Escape"),new $21]]),focusNode:this.focusNode,child:V}),q=new yJ({actions:new Map([[yS,new j8(this.invoke)],[xS,new j8(this.invoke)],[X21,new j8(this.invoke)],[$21,new j8(this.invoke)]]),child:K}),W=new F6({children:[new f0({decoration:{color:B1.default()},child:new C1({text:new d(">",new e({color:Y.foreground}))})}),new a6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Q0({height:10,child:new A4({child:new C1({text:new d(L,new e({color:Y.foreground}))})})})}else if(Z.length===0&&this.widget.props.emptyStateText)H=new a6({child:new A4({child:new C1({text:new d(this.widget.props.emptyStateText,new e({color:Y.foreground,dim:!0}))})})});else{let L=Z.map((A,w)=>{let E=w===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,E,P,J);else{let C=E?B1.yellow:void 0,S=E?B1.black:Y.foreground;R=new f0({decoration:C?{color:C}:void 0,padding:W0.symmetric(2,0),child:new C1({text:new d(this.widget.props.getLabel(A),new e({color:S,dim:P}))})})}return new AW6(new L8({onClick:(C)=>this.handleItemClick(w,C.clickCount),child:R}),(C)=>{this.itemContexts[w]=C})});H=new C0({children:L,crossAxisAlignment:"start"})}let F=new a6({child:new L8({onScroll:this.handleScroll,opaque:!1,child:new J5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d(this.widget.props.title,new e({color:B1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Q0({height:1}),F),this.controller.text!==""){let L=Z.length>0?Z[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new f0({padding:W0.vertical(1),child:new A4({child:A})}));else U.push(new Q0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new f0({decoration:{border:X,color:B1.default()},padding:W0.symmetric(1,0),child:new C0({children:U})})}}function IW6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class Eb1 extends l6{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>IW6(X.pubDate).length));return new QJ({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=q6.of(K),{colors:W}=q,H=G?B1.yellow:void 0,F=G?B1.black:W.foreground,U=B1.index(8),B=(M,L)=>new Q0({width:L,child:F6.end([new C1({text:new d(M,new e({color:U}))})])});return new f0({decoration:H?{color:H}:void 0,padding:W0.symmetric(2,0),child:new F6({children:[new a6({child:new C1({text:new d(X.title,new e({color:F})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),B(IW6(X.pubDate),Y)]})})}})}}class Pb1 extends p0{createState(){return new EW6}}class EW6 extends m0{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 C1({text:new d("●",new e({color:this.isGreen?B1.green:B1.index(8),bold:!0})),maxLines:1})}}function Qj8(J){let Q=new Map,Y=new Map,Z=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Z.set(V.id,K.type);let q=K.threadID,W=Y.get(q)||[];W.push(V),Y.set(q,W)}else X.push(V)}return fX.flatten(X,(V)=>Y.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Z.get(V.item.id)}))}function Rb1(J,Q,Y){return new C1({text:new d(`${J}${Q}`,new e({color:Y})),maxLines:1})}function Yj8(J,Q,Y,Z){return[Rb1("+",J,Z.success),l5.horizontal(1),Rb1("~",Q,Z.warning),l5.horizontal(1),Rb1("-",Y,Z.destructive)]}class G21 extends l6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((F)=>F.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((F)=>F.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],Z=new Set(Y),X=this.props.currentThreadID,G=[...Q].sort((F,U)=>{if(X){if(F.id===X)return-1;if(U.id===X)return 1}let B=Y.indexOf(F.id),M=Y.indexOf(U.id);if(B!==-1&&M!==-1)return B-M;if(B!==-1)return-1;if(M!==-1)return 1;return 0}),V=Qj8(G),K=Math.max(0,...V.map((F)=>F.description.timeAgo.length)),q=q6.of(J),W=new B6({padding:W0.symmetric(0,1),child:new A4({child:new C1({text:new d("",new e({color:q.colors.foreground,dim:!0}),[new d("Ctrl+T",new e({color:B1.blue,dim:!0})),new d(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new e({color:q.colors.foreground,dim:!0}))])})})});return new QJ({items:V,getLabel:(F)=>F.title,onAccept:(F)=>this.props.onSelect?.(F.id),onDismiss:this.props.onDismiss,onSelectionChange:(F)=>{if(this.props.previewController){if(F)this.props.previewController.select(F.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:200,footer:this.props.isLoading?void 0:W,renderItem:(F,U,B,M)=>{let L=q6.of(M),{colors:A}=L,w=U?B1.yellow:void 0,E=U?B1.black:A.foreground,P=B1.index(8),R=(r,p)=>new Q0({width:p,child:F6.end([new C1({text:new d(r,new e({color:P}))})])}),C=this.props.threadViewStates[F.id],S=[],k=F.relationshipType==="handoff",f=new Y31;if(F.depth>0){let r=[],p=F.ancestorsAreLast.slice(1);for(let Y1 of p)r.push(new d(f.getAncestorPrefix(Y1),new e({color:f.connectorColor,dim:f.connectorDim})));let s=F.isLast?f.elbow:f.tee,Q1=f.getConnectorText(s);r.push(new d(Q1,new e({color:f.connectorColor,dim:f.connectorDim}))),S.push(new C1({text:new d("",void 0,r)}))}let m=[],b=X===F.id?new d("(current) ",new e({color:B1.green})):Z.has(F.id)?new d("(visited) ",new e({color:A.foreground,dim:!0})):null;if(b)m.push(new C1({text:b}));if(C){if(C.state==="active"&&(C.interactionState==="tool-running"||C.inferenceState==="running"))m.push(new Pb1),m.push(new Q0({width:1}))}let c=F.title;if(F.relationshipType==="fork"){let r=c.match(/^Forked\((\d+)\): /);if(r)c=c.slice(r[0].length);else while(c.startsWith("Forked: "))c=c.slice(8);m.push(new C1({text:new d("[fork] ",new e({color:B1.blue}))}))}else if(k)m.push(new C1({text:new d("[handoff] ",new e({color:B1.index(208)}))}));if(m.push(new a6({child:new C1({text:new d(c,new e({color:E})),overflow:"ellipsis",maxLines:1})})),m.push(new Q0({width:2})),F.diffStats&&(F.diffStats.added>0||F.diffStats.changed>0||F.diffStats.deleted>0)){let r=U?{success:P,warning:P,destructive:P}:A;m.push(...Yj8(F.diffStats.added,F.diffStats.changed,F.diffStats.deleted,r)),m.push(new Q0({width:2}))}return m.push(R(F.description.timeAgo,K)),new f0({decoration:w?{color:w}:void 0,padding:W0.symmetric(2,0),child:new F6({children:[...S,...m]})})}})}}class Tb1 extends l6{props;constructor(J){super();this.props=J}build(){return new A4({child:new C1({text:new d("",void 0,[new d(`Forked to new thread:
4749
4749
 
4750
4750
  `,new e({color:B1.white,dim:!0})),new d(`"${this.props.newThreadTitle||"Untitled"}"`,new e({color:B1.white}))]),textAlign:"center"})})}}N0();class PW6 extends m0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let J=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!J.ok){v.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){v.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){if(J.length===0)return null;if(J.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(J))return"Label must be lowercase alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null&&J.length>0}getAvailableLabels(){let J=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!J.includes(Q.name))}shouldShowCreateMarker(J){if(J.length===0||this.isLoading)return!1;let Q=J.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let Y=this.widget.props.currentLabels||[],Z=this.labels.some((G)=>G.name===Q),X=Y.includes(Q);return!Z&&!X}build(J){let Q=q6.of(J),{colors:Y}=Q,Z=this.currentQuery.trim().toLowerCase(),X=Z.length>0?this.getValidationError(Z):null,G=this.getAvailableLabels(),K=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...G];return new QJ({title:"Add Label",items:K,getLabel:(q)=>{if("__isCreateMarker"in q)return this.currentQuery.trim().toLowerCase();return q.name},onAccept:(q)=>{if("__isCreateMarker"in q)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(q.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:X||"Type to create a new label",renderItem:(q,W,H,F)=>{let U=W?B1.yellow:void 0,B=W?B1.black:Y.foreground;if("__isCreateMarker"in q&&q.__isCreateMarker){let L=this.currentQuery.trim().toLowerCase();return new f0({decoration:U?{color:U}:void 0,padding:W0.symmetric(2,0),child:new C1({text:new d("",void 0,[new d("Create new label: ",new e({color:B})),new d(L,new e({color:B,bold:!0}))])})})}return new f0({decoration:U?{color:U}:void 0,padding:W0.symmetric(2,0),child:new C1({text:new d(q.name,new e({color:B}))})})},filterItem:(q,W)=>{if(this.currentQuery!==W)this.currentQuery=W,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in q&&q.__isCreateMarker)return this.shouldShowCreateMarker(W);let F=W.trim().toLowerCase();return F.length===0||q.name.includes(F)},sortItems:(q,W,H)=>{let F="__isCreateMarker"in q.item&&q.item.__isCreateMarker,U="__isCreateMarker"in W.item&&W.item.__isCreateMarker;if(F&&!U)return-1;if(!F&&U)return 1;return W.score-q.score}})}}class Cb1 extends p0{props;constructor(J){super();this.props=J}createState(){return new PW6}}class TD extends p0{props;constructor(J){super();this.props=J}createState(){return new RW6}}class RW6 extends m0{_spinner=new MY;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=q6.of(J),{colors:Y}=Q,Z=z4.all(new G4(Y.foreground,1,"solid")),X=this._spinner.toBraille(),G=new C1({textAlign:"center",text:new d("",void 0,[new d(X,new e({color:B1.yellow})),new d(" ",void 0),new d(this.widget.props.message,new e({color:Y.foreground}))])}),K=[new a6({child:new C0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[G]})})];if(this.widget.props.onAbort)K.push(new Q0({height:2,child:new f0({padding:W0.symmetric(2,0),child:new C1({text:new d("",new e({dim:!0}),[new d("Press ",new e({color:Y.foreground})),new d("Esc",new e({color:Y.info})),new d(" to cancel",new e({color:Y.foreground}))])})})}));let q=new f0({decoration:new C8(B1.default(),Z),child:new Q0({width:60,height:7,child:new C0({mainAxisAlignment:"start",children:K})})});if(this.widget.props.onAbort)return new z8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:q});return q}}class ew extends p0{props;constructor(J){super();this.props=J}createState(){return new TW6}}class TW6 extends m0{scrollController=new O5;scrollAreaKey=new RQ("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(J){return J instanceof hX}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let Y=Q.size;if(typeof Y.height==="number"&&Y.height>0)return this.viewportHeight=Y.height,Y.height}return this.viewportHeight}build(J){let Q=q6.of(J),Y=this.widget.props.message,Z=(()=>{if(this.isWidgetMessage(Y))return{title:Y.title,type:Y.type};if(Y instanceof Error&&Y.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Y.message};if(Y instanceof Error&&Y.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Y.message};let H=t71(Y);return{title:H.title,type:H.type,description:H.description}})(),X=Z.type==="error"?B1.red:B1.yellow,G=z4.all(new G4(B1.default(),1,"solid")),V=new f0({padding:W0.symmetric(1,0),child:new C1({text:new d(Z.title,new e({color:X,bold:!0}))})}),K=this.isWidgetMessage(Y)?Y.widget:new C1({text:new d(Z.description,new e({color:B1.default()})),selectable:!0}),q=new a6({child:new Vz({child:new f0({padding:W0.symmetric(1,0),child:new F6({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new a6({child:new J5({controller:this.scrollController,autofocus:!0,child:K})}),new R2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let H=this.scrollController.maxScrollExtent,F=this.scrollController.offset,U=this.getViewportHeight(),B=H+U;return{totalContentHeight:Math.max(B,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(F,0)}}})]})})})}),W=new f0({padding:W0.symmetric(1,0),child:new C1({text:this.widget.props.onRetry?new d("",void 0,[new d("Press ",new e({color:B1.default(),dim:!0})),new d("R",new e({color:B1.yellow})),new d(" to retry, ",new e({color:B1.default(),dim:!0})),new d("Esc",new e({color:B1.yellow})),new d(" to cancel",new e({color:B1.default(),dim:!0}))]):new d("Press any key to close",new e({color:B1.default(),dim:!0,italic:!0}))})});return new z8({onKey:(H)=>{if(this.widget.props.onRetry&&H.key==="r")return this.widget.props.onRetry(),"handled";if(H.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new f0({decoration:{border:G,color:B1.default()},padding:W0.all(1),child:new C0({mainAxisAlignment:"center",children:[V,new Q0({height:1}),q,W]})})})}}class jb1 extends l6{build(){return new A4({child:new C1({text:new d("",void 0,[new d(`✓ Thread Shared
4751
4751
 
@@ -4856,7 +4856,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
4856
4856
  `)?`${K}...`:X,W=new e({color:B1.index(8)}),H=[new d(q,W)];if(V>0){let F=new e({color:Y.success});for(let U=1;U<=V;U++)H.push(new d(" ")),H.push(new d(`[${U}]`,F))}return new B6({padding:W0.only({bottom:0}),child:new F6({crossAxisAlignment:"start",children:[new B6({padding:W0.only({right:1}),child:new C1({text:new d("•",new e({color:B1.index(8)}))})}),new a6({child:new C1({text:new d("",void 0,H)})})]})})}}class Ag1 extends p0{createState(){return new gH6}}class gH6 extends m0{_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 e({color:B1.red}),Y=new e({color:this._visible?B1.red:B1.transparent()});return new F6({children:[new C1({text:new d("⏺",Y)}),new Q0({width:1}),new C1({text:new d("Replay",Q)})]})}}s0();function IS8(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/3600000),X=Math.floor(Z/24),G=Math.floor(X/7),V=Math.floor(X/30);if(Z<1)return"Just now";if(Z<24)return`${Z}h ago`;if(X<7)return`${X}d ago`;if(G<=4)return`${G}w ago`;return`${V}mo ago`}class Og1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Y)=>{let Z=this.threadHistoryService.observeThreadList().subscribe((X)=>{Z.unsubscribe(),Y(X)})});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(X6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((Z)=>{if(Z.mainThreadID)return!1;if(!Q.trim())return!0;let X=Z.title?.toLowerCase()||"untitled",G=Z.id.toLowerCase(),V=Q.toLowerCase();return X.includes(V)||G.includes(V)}).map((Z)=>{let X=new Date(Z.userLastInteractedAt),G=IS8(X),V=Z.id.slice(-8),K=Z.env?.initial.trees?.[0]?.uri;return{id:Z.id,title:Z.title||"Untitled",updatedAt:new Date(Z.userLastInteractedAt).toISOString(),description:{timeAgo:G,title:Z.title||"Untitled",shortThreadID:V},diffStats:Z.summaryStats?.diffStats,workspaceURI:K,parentRelationships:Z.parentRelationships,agentMode:Z.agentMode,details:{messageCount:Z.summaryStats?.messageCount}}})}}N0();B8();B8();vb();function mH6(J){let Q=mD0(J),Y=Array.from(Q.entries()).map(([V,K])=>({path:V,diffStats:K})),Z=Gu0(J),G=WP(J)?.totalInputTokens??0;return{filesAffected:Y,totalTokens:G,totalCredits:Z}}class wg1{currentId=null;current=null;statsCache=new Map;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new O5;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){v.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)}getCurrentThread(){return this.current}getCurrentStats(){if(!this.current)return null;let J=this.statsCache.get(this.current.id);if(J&&J.version===this.current.v)return J.stats;let Q=mH6(this.current);return this.statsCache.set(this.current.id,{stats:Q,version:this.current.v}),Q}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){v.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(PL()).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 uH6(J,Q){switch(J){case"update-available":return[new d("A newer Amp is available. Run ",new e({color:Q.foreground,dim:!0})),new d("amp update",new e({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new d("Update complete, run ",new e({color:Q.foreground,dim:!0})),new d("amp update",new e({color:Q.warning})),new d(" to see warnings",new e({color:Q.foreground,dim:!0}))];case"update-error":return[new d("Update failed, run ",new e({color:Q.foreground,dim:!0})),new d("amp update",new e({color:Q.warning})),new d(" to see warnings",new e({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function CS8(J){return new Promise((Q)=>{PS8("git",["branch","--show-current"],{cwd:J},(Y,Z)=>{if(Y){Q(null);return}let X=Z.trim();Q(X||null)})})}class nH6 extends p0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new y21}}class y21 extends m0{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;randomAd=null;adSubscription=null;adReadinessTimeout=null;threadLoadSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;statusMessage=null;statusMessageTimer=null;isShowingHelp=!1;isShowingConsoleOverlay=!1;isShowingMCPStatusModal=!1;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;isShowingContextDetailOverlay=!1;threadCostInfo=void 0;threadCostInfoThreadID=void 0;threadCostInfoLastUsageLedgerLength=0;lastInferenceState=void 0;confirmationOverlayContent="";exitConfirmTimeout=null;clearInputConfirmTimeout=null;cancelProcessingConfirmTimeout=null;historyIndex=-1;historyDraft=null;bashInvocations=[];currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];pendingSkills=[];pendingSkillsSubscription=null;displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;isShowingPalette=!1;paletteShowOptions=null;threadsForPicker=[];clustersForPicker=[];isLoadingThreads=!1;threadPreviewController=new wg1;previewThread=null;todoScrollController=(()=>{let J=new O5;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new M8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new M8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;imagePreviewIndex=null;fileImagePreviewPath=null;adActionModal=null;newsFeedReader=null;newsFeedEntries=[];newsFeedSubscription=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;handoffController=null;handoffState={isInHandoffMode:!1,isGeneratingHandoff:!1,isConfirmingAbortHandoff:!1,pendingHandoffPrompt:null,spinner:null};pendingMCPServers=[];mcpTrustSubscription=null;pendingOAuthRequest=null;mcpServers=[];mcpServersSubscription=null;agentModeController=null;freeTierStatus={canUseAmpFree:!1};agentModePulseSeq=0;agentModeSlideProgress=null;agentModeSlideTimer=null;updateState="hidden";updateServiceSubscription=null;toastController=new Vv1;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=null;mysteriousMessage=null;isShowingMysteriousMessageModal=!1;mysteriousMessageSubscription=null;mysterySequenceManager=null;mysterySequenceProgress=null;mysteryKeyInterceptorUnsubscribe=null;static MYSTERY_SEQUENCE=["ctrl+x","y","z"];userDisplayBalanceInfo=null;balanceInfoSubscription=null;async initNewsFeed(){let J=async(Y)=>{return D5(Y,void 0,this.widget.dependencies.configService)},Q=Yt0();this.newsFeedReader=new jx1(Q,J,"/news.rss"),this.newsFeedSubscription=this.newsFeedReader.stream().subscribe({next:(Y)=>{if(Y.length>0)this.setState(()=>{this.newsFeedEntries=[...Y,...this.newsFeedEntries]})},error:(Y)=>{v.error("News feed error:",Y)}})}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})};onThreadSwitch(){this.handoffController?.resetUIState(),this.isMessageViewInSelectionMode=!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.onThreadSwitch(),this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Y,baseWpm:Z}=J,X=Q.messages;for(let G=0;G<X.length;G++){if(this.replayAbortController.signal.aborted)break;let V=X[G];if(!V)continue;if(G>0)await this.replaySleep(J.messageDelayMs);if(V.role==="user"&&Y){let W=V.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
4857
4857
  `);if(W)await this.replayTypeMessage(W,Z)}if(V.role==="assistant"){let W=V.content.some((U)=>U.type==="tool_use"),H=X[G+1],F=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&F){let U={...V,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let B=J.thread.id;this.getMessageScrollController(B).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),V]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,V],this.textController.clear()});let K=J.thread.id;this.getMessageScrollController(K).scrollToBottom()}await this.replaySleep(J.exitDelayMs),E8.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Y=J.split(/(?<=\s)/),Z=60000/Q;for(let X of Y){if(this.replayAbortController.signal.aborted)break;if(this.looksLikePastedContent(X.trim())){await this.replaySleep(150),this.textController.text=this.textController.text+X,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{}),await this.replaySleep(300);continue}let G=Z/X.length;for(let V of X){this.textController.text=this.textController.text+V,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let K=0.8+Math.random()*0.4,q=G*K;await this.replaySleep(q)}}}looksLikePastedContent(J){if(/^[a-z][a-z0-9+.-]*:\/\//i.test(J))return!0;if(J.startsWith("/")&&J.length>10)return!0;if(/^[a-z]:\\/i.test(J))return!0;if(/^[a-f0-9]{7,40}$/i.test(J))return!0;if(/^T-[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(J))return!0;return!1}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return this.agentModeController?.getEffectiveMode()??"smart"}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((G)=>G.type==="toolResult").filter((G)=>G.toolResult.run.status==="in-progress"||G.toolResult.run.status==="queued"),Z=J.subagentActiveTools.filter((G)=>G.toolRun.status==="in-progress"||G.toolRun.status==="queued");return[...Y,...Z].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 d(this.submitDisabledHint,new e({color:J.foreground,dim:!0}));if(this.isExiting)return new d("Exiting...",new e({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new d("",void 0,[new d("Ctrl+C",new e({color:Q.keybind})),new d(" again to exit",new e({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new d("",void 0,[new d("Esc",new e({color:Q.keybind})),new d(" again to clear input",new e({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new d("",void 0,[new d("Escape",new e({color:Q.keybind})),new d(" to close help",new e({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let Z=this.getEffectiveAgentMode(),X=k21(Z);return new d("",void 0,[new d("Images aren't supported in ",new e({color:J.warning,dim:!1})),new d(Z,new e({color:X})),new d(" mode.",new e({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new d("",void 0,[new d("Esc",new e({color:Q.keybind})),new d(" again to cancel",new e({color:J.foreground,dim:!0}))]);return new d("",void 0,[new d("Esc",new e({color:Q.keybind})),new d(" to cancel",new e({color:J.foreground,dim:!0}))])}if(this.statusMessage)return new d(this.statusMessage,new e({color:J.foreground,dim:!0}));let Y=uH6(this.updateState,J);if(Y)return new d("",void 0,Y);return null}getParentThreadInfo(){let J=this.previewThread??this.widget.dependencies.threadState.mainThread;if(!J)return null;let Q=RL(J).filter((V)=>V.type==="fork"||V.type==="handoff");if(Q.length===0)return null;let Y=Q[0],Z=Y.threadID,G=this.threadsForPicker.find((V)=>V.id===Z)?.title??Z.slice(-8);return{type:Y.type==="handoff"?"handoff":"fork",title:G}}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 X=Q.mainThread?.messages.findIndex((G)=>G===J);if(X===void 0||X===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),await Y.handle({type:"thread:truncate",fromIndex:X}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(G){v.error("Failed to edit message:",G)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Y,threadSyncService:Z}=this.widget.dependencies,X=Q.mainThread?.id;if(!X)return;let G=Q.mainThread?.messages.findIndex((V)=>V===J);if(G===void 0||G<=0)return;try{let V=await s3.getOrCreateForThread(Y,X),K=await qj(V,Z,G-1);await this.switchToExistingThread(K)}catch(V){v.error("Failed to fork thread:",V),this.showErrorMessage(`Failed to fork thread: ${V}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Y,worker:Z}=this.widget.dependencies,X=Y.mainThread;if(!X)return;let G=X.messages.findIndex((V)=>V.messageId!==void 0&&V.messageId===J.messageId);if(G===-1)return;try{this.cancelBashInvocations(),await Z.cancel(),this.widget.dependencies.history.add(Q);let V=UD(Q);if(V)await Z.handle({type:"thread:truncate",fromIndex:G}),this.invokeBashCommand(V.cmd,{visibility:V.visibility});else{let K=[{type:"text",text:Q}];if(this.imageAttachments.length>0)K.push(...this.imageAttachments);let q={content:K,agentMode:X.agentMode},W=G===0;if(X.agentMode&&!W&&q.agentMode!==X.agentMode){v.error(`Cannot edit message: This thread uses ${X.agentMode} mode. To change mode, create a new thread.`);return}await Z.handle({type:"user:message",message:q,index:G})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(V){v.error("Failed to edit message:",V)}};getAffectedFiles=async(J)=>{let{worker:Q,threadState:Y}=this.widget.dependencies;try{let Z=Y.mainThread;if(!Z)return[];let X=Z.messages.findIndex((V)=>V===J);if(X===-1)return[];return(await Q.getFilesAffectedByTruncation(X)).map(u3)}catch(Z){return v.error("Failed to get affected files:",Z),[]}};textController=new LZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new O5);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 Z=this.searchElementTreeByKey(J.child,Q);if(Z)return Z}if(J?.children)for(let Z of J.children){let X=this.searchElementTreeByKey(Z,Q);if(X)return X}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||"","~"),Z=Q?`amp - ${Q} - ${Y}`:"";process.stdout.write(dy1(Z))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new V3("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;paletteCommands;paletteConfig;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"&&!this.handoffState.isGeneratingHandoff){this.showCommandPalette(),this.textController.clear();return}let Q=UD(J);this.currentShellModeStatus=this.handoffState.isInHandoffMode?void 0:Q?.visibility,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}),n8.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 Z=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})}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}),n8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette)this.autocompleteFocusNode.requestFocus()})},onCancel:()=>{this.exitApplication()}})};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(J){if(this.handoffState.isGeneratingHandoff)return;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 pb1(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 lb1(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 Z=u0.file(process.cwd()),X=v6(Z);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,threadService:this.widget.dependencies.threadService,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,skillService:this.widget.dependencies.skillService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let G=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),G},setImageAttachments:(G)=>{this.setState(()=>{this.imageAttachments=G})},editorDispatch:(G)=>{switch(G.type){case"set-input":this.textController.clear(),this.textController.insertText(G.input);break;case"insert-text":this.textController.insertText(G.text);break;case"clear":this.textController.clear();break}},submitMessage:(G)=>{return this.proceedWithUserMessage(G)},exitApp:this.exitApplication,openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},settingsStorage:this.widget.dependencies.settingsStorage,clientId:this.widget.dependencies.clientId,mcpService:this.widget.dependencies.mcpService,toolboxService:this.widget.dependencies.toolboxService,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,switchToThread:async(G)=>{return await this.switchToExistingThread(G),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),this.widget.dependencies.worker},generateHandoffPrompt:async(G,V,K)=>{let q=this.widget.dependencies.threadState.mainThread?.id;if(!q)throw Error("No active thread");let W=setTimeout(()=>{K.throwIfAborted()},60000);try{let H=await this.widget.dependencies.threadService.generateHandoffPrompt(q,G,V,this.widget.dependencies.configService,K,this.widget.dependencies.worker.fs.fileSystemReader());return clearTimeout(W),H}catch(H){throw clearTimeout(W),H}},handleHandoff:async(G,V)=>{let{goal:K,generatedPrompt:q,images:W}=V;if(!K&&!q)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 F=setTimeout(()=>G.abort(new WS("Handoff took too long and was aborted (timeout: 60s)")),60000);try{let U=await this.widget.dependencies.threadService.createHandoffThread(H,{goal:K,generatedPrompt:q,images:W,filesystem:this.widget.dependencies.worker.fs.fileSystemReader()},this.widget.dependencies.configService,G.signal);return clearTimeout(F),await this.switchToExistingThread(U),{ok:!0}}catch(U){if(clearTimeout(F),U instanceof Error&&(U.name==="AbortError"||U.message.includes("aborted")))throw G.signal.reason;throw U}}catch(H){return v.error("Failed to create handoff thread",H),{ok:!1,error:H instanceof Error?H:Error(String(H))}}},getGuidanceFiles:async(G)=>{if(!Q.mainThread)return[];return(await $e({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},Q.mainThread,G)).map((K)=>({uri:K.uri,type:K.type}))},openIdePicker:()=>{this.openIdePicker()},getAgentMode:()=>{return this.agentModeController?.getMode()??null},setAgentMode:(G)=>{this.agentModeController?.setMode(G)},toggleAgentMode:this.toggleAgentMode,getEffectiveAgentMode:()=>this.getEffectiveAgentMode(),getEditorText:()=>this.textController.text,workspace:this.widget.dependencies.workspace??null,completionBuilder:this.getCompletionBuilder(),threads:this.threadsForPicker,clusters:this.clustersForPicker,previewController:this.threadPreviewController,isLoadingThreads:this.isLoadingThreads,filterByWorkspace:this.filterThreadPickerByWorkspace,currentWorkspace:X,threadViewStates:this.widget.dependencies.workerController.threadViewStates,newsFeedEntries:this.newsFeedEntries,showMCPStatusModal:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!0})},internalAPIClient:this.widget.dependencies.internalAPIClient,features:this.widget.dependencies.features,showStatusMessage:(G,V=2000)=>{if(this.statusMessageTimer)clearTimeout(this.statusMessageTimer);this.setState(()=>{this.statusMessage=G}),this.statusMessageTimer=setTimeout(()=>{this.setState(()=>{this.statusMessage=null}),this.statusMessageTimer=null},V)},showToast:(G,V="success",K)=>{this.toastController.show(G,V,K)},enterHandoffMode:this.enterHandoffMode,addPendingSkill:(G)=>{(this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker).addPendingSkill(G)}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new Og1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=gW6(Q),this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await CS8(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(),Z=`bash-${Y}-${Math.random().toString(36).substring(7)}`,X={cmd:J},G=new AbortController;this.widget.dependencies.worker.invokeBashTool(X,G.signal,Q===zD).subscribe({next:(V)=>{this.setState(()=>{if(this.bashInvocations.find((q)=>q.id===Z))this.bashInvocations=this.bashInvocations.map((q)=>q.id===Z?{...q,toolRun:V}:q);else{let q={id:Z,args:X,toolRun:V,startTime:Y,abortController:G,hidden:Q===zD};this.bashInvocations=[...this.bashInvocations,q]}})},error:()=>this.removeBashInvocation(Z),complete:()=>this.removeBashInvocation(Z)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};showContextDetailOverlay=()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!0}),this.fetchThreadCostInfo()};fetchThreadCostInfo=IY6(()=>{let J=this.widget.dependencies.threadID;this.widget.dependencies.internalAPIClient.threadDisplayCostInfo({threadID:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(Q.ok)this.setState(()=>{this.threadCostInfo=Q.result,this.threadCostInfoThreadID=J})}).catch(()=>{this.setState(()=>{this.threadCostInfo=void 0,this.threadCostInfoThreadID=J})})},150);maybeRefetchThreadCostInfo=(J,Q)=>{let Y=J!==this.threadCostInfoLastUsageLedgerLength,Z=Q==="idle"&&this.lastInferenceState==="running";if(this.threadCostInfoLastUsageLedgerLength=J,this.lastInferenceState=Q,Y||Z)this.fetchThreadCostInfo()};toggleAgentMode=()=>{if(!this.agentModeController)return;if(this.agentModeController.toggle())this.setState(()=>{this.showImageUnsupportedHint=!1,this.agentModePulseSeq++})};startAgentModeSlide=()=>{if(this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer);this.setState(()=>{this.agentModeSlideProgress=0});let J=400,Q=16,Y=Q/J;this.agentModeSlideTimer=setInterval(()=>{this.setState(()=>{if(this.agentModeSlideProgress!==null){if(this.agentModeSlideProgress=Math.min(1,this.agentModeSlideProgress+Y),this.agentModeSlideProgress>=1){if(this.agentModeSlideProgress=null,this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null}}})},Q)};handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!iy(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>=XB)return!1;let Y=YS(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)})};handleImageClick=(J)=>{this.setState(()=>{this.imagePreviewIndex=J})};handleImagePreviewDismiss=()=>{this.setState(()=>{this.imagePreviewIndex=null})};handleImageRemove=(J)=>{this.setState(()=>{this.imageAttachments=this.imageAttachments.filter((Q,Y)=>Y!==J),this.imagePreviewIndex=null})};handleShowFileImagePreview=(J)=>{this.setState(()=>{this.fileImagePreviewPath=J})};handleFileImagePreviewDismiss=()=>{this.setState(()=>{this.fileImagePreviewPath=null})};handleShowMysteryModal=()=>{if(this.mysteriousMessage)this.setState(()=>{this.isShowingMysteriousMessageModal=!0})};handleDestructMysteriousMessage=()=>{if(!this.mysteriousMessage)return;let J=this.mysteriousMessage.id;this.widget.dependencies.internalAPIClient.markAsReadMysteriousMessage({messageId:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(!Q.ok)v.error("Failed to destruct mysterious message",Q.error);else this.setState(()=>{this.mysteriousMessage=null,this.isShowingMysteriousMessageModal=!1})}).catch((Q)=>{v.error("Failed to destruct mysterious message",Q)})};enterHandoffMode=()=>{this.handoffController?.enter(),this.dismissPalette()};exitHandoffMode=()=>{this.handoffController?.exit()};submitHandoff=async(J)=>{let Q=this.imageAttachments;if(this.resetHistory(),this.setState(()=>{this.imageAttachments=[]}),!this.handoffController){this.showSubmitDisabledHint("Handoff controller not initialized");return}let Y=await this.handoffController.submit(J,Q);if(!Y.ok&&Y.error.message!=="Cancelled")this.displayMessage=Y.error,this.setState(()=>{})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Y,unlink:Z,rmdir:X,writeFile:G}=await import("node:fs/promises"),{tmpdir:V}=await import("node:os"),K=await import("node:path");try{let q=await Q(K.join(V(),"amp-edit-")),W=K.join(q,"message.amp.md");await G(W,J,"utf-8"),await MG(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")v.error("Failed to read temporary file",H)}try{await Z(W),await X(q)}catch(H){v.warn("Failed to clean up temporary file",H)}}catch(q){v.error("Error opening editor:",q)}};onTextSubmitted=async(J)=>{if(!J.trim()&&this.imageAttachments.length===0)return;if(this.handoffState.isInHandoffMode){await this.submitHandoff(J);return}let Q=UD(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)};agentModeListener=()=>{this.setState(()=>{})};handoffListener=(J)=>{this.setState(()=>{this.handoffState=J})};initState(){if(CX.getInstance().interceptConsole(),this.freeTierStatus=this.widget.dependencies.freeTierStatus,this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.handoffController=new Hv1({threadService:this.widget.dependencies.threadService,configService:this.widget.dependencies.configService,getMainThread:()=>this.widget.dependencies.threadState.mainThread,getFilesystemReader:()=>this.widget.dependencies.worker.fs.fileSystemReader(),switchToThread:(Y)=>this.switchToExistingThread(Y)}),this.handoffController.addListener(this.handoffListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();E8.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),E8.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),E8.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{n8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),D6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y,this.agentModeController=new Sx1({initialCliMode:this.widget.dependencies.initialAgentMode,sessionState:this.widget.dependencies.sessionState??null,freeTierStatus:this.freeTierStatus,initialSettings:Y.settings,config$:this.widget.dependencies.configService.config,getThread:()=>this.widget.dependencies.getCurrentWorker()?.thread??this.widget.dependencies.worker.thread}),this.agentModeController.addListener(this.agentModeListener)}),this.updateGitBranch(),this.loadThreadsForPicker(),this.balanceInfoSubscription=Js0(async()=>{let Y=await this.widget.dependencies.internalAPIClient.userDisplayBalanceInfo({},{config:this.widget.dependencies.configService});if(!Y.ok)throw Y.error;return Y.result}).subscribe({next:(Y)=>{this.setState(()=>{this.userDisplayBalanceInfo=Y})},error:(Y)=>{v.debug("Failed to fetch user balance info",Y)}}),this.scheduleAdSubscriptionWithIdeReadiness();let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=Y})}),My1((Y)=>{this.setState(()=>{this.pendingOAuthRequest=Y})}),this.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Y)=>{this.setState(()=>{this.mcpServers=Y})}),this.pendingSkillsSubscription=this.widget.dependencies.worker.pendingSkills.subscribe((Y)=>{this.setState(()=>{this.pendingSkills=Y})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Y)=>{let Z=this.isIdeReadyForAdContext();if(this.setState(()=>{this.ideStatus=Y}),!Z&&this.isIdeReadyForAdContext()){if(this.adReadinessTimeout)clearTimeout(this.adReadinessTimeout),this.adReadinessTimeout=null;if(!this.adSubscription)this.subscribeToAds()}}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Y)=>{let Z=this.widget.dependencies.getCurrentWorker();if(!Z){v.warn("No active thread worker found to handle IDE message");return}await new Promise((X)=>setTimeout(X,50)),await Z.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}}),v.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),v.debug("Appended text to CLI prompt from IDE",{text:Y.slice(0,100)})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Y)=>{this.setState(()=>{this.updateState=Y})}),this.mysteriousMessageSubscription=dR(this.widget.dependencies.configService).pipe(B5((Y)=>Y!=="pending"),X6((Y)=>cR(Y)?Y.mysteriousMessage??null:null),I4((Y,Z)=>Y?.id===Z?.id)).subscribe((Y)=>{this.setState(()=>{if(Y?.id!==this.mysteriousMessage?.id)this.isShowingMysteriousMessageModal=!1;if(this.mysteriousMessage=Y,Y&&!this.mysterySequenceManager)this.mysterySequenceManager=new O71(new Map([[new A71(y21.MYSTERY_SEQUENCE),new dp]])),this.mysteryKeyInterceptorUnsubscribe=E8.instance.addKeyInterceptor((Z)=>{if(!this.mysterySequenceManager)return!1;if(this.isShowingMysteriousMessageModal)return!1;let X=this.mysterySequenceManager.handleKeyEvent(Z);if(X.consumed){if(X.intent)this.handleShowMysteryModal();return this.setState(()=>{this.mysterySequenceProgress=X.progress}),!0}else if(this.mysterySequenceProgress)this.setState(()=>{this.mysterySequenceProgress=null});return!1});else if(!Y)this.mysteryKeyInterceptorUnsubscribe?.(),this.mysteryKeyInterceptorUnsubscribe=null,this.mysterySequenceManager?.dispose(),this.mysterySequenceManager=null,this.mysterySequenceProgress=null})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Y)=>{let Z=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showIdePickerHint)this.toastController.show("Use /ide to connect to an IDE","success",5000);else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100);this.initNewsFeed()}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener();let Q=this.widget.dependencies.threadID;if(this.threadCostInfoThreadID!==void 0&&this.threadCostInfoThreadID!==Q)this.threadCostInfo=void 0,this.threadCostInfoThreadID=void 0,this.threadCostInfoLastUsageLedgerLength=0,this.fetchThreadCostInfo();let{threadState:Y}=this.widget.dependencies;this.maybeRefetchThreadCostInfo(Y.mainThread?.usageLedger?.events.length??0,Y.viewState.state==="active"?Y.viewState.inferenceState:void 0)}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.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeController)this.agentModeController.removeListener(this.agentModeListener),this.agentModeController.dispose();if(this.handoffController)this.handoffController.removeListener(this.handoffListener),this.handoffController.dispose();if(this.adReadinessTimeout)clearTimeout(this.adReadinessTimeout),this.adReadinessTimeout=null;if(this.adSubscription)this.adSubscription.unsubscribe();if(this.balanceInfoSubscription)this.balanceInfoSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(My1(null),this.mcpServersSubscription)this.mcpServersSubscription.unsubscribe();if(this.pendingSkillsSubscription)this.pendingSkillsSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.newsFeedSubscription)this.newsFeedSubscription.unsubscribe();if(this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null;if(this.mysteriousMessageSubscription)this.mysteriousMessageSubscription.unsubscribe();if(this.mysteryKeyInterceptorUnsubscribe?.(),this.mysterySequenceManager?.dispose(),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(dy1("")),this.shouldUseProgressBar())process.stdout.write(mQ6())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,Z=[...J.items.filter((K)=>K.type==="toolResult").map((K)=>({toolUse:K.toolUse,toolRun:K.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((K)=>K.toolRun.status==="blocked-on-user");if(Z.length===0)return null;let X=Z[0],G=X.toolRun.status==="blocked-on-user"?X.toolRun.toAllow??[]:[],V=X.toolRun.status==="blocked-on-user"?X.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:X.toolUse,toAllow:G}],subthreadID:X.subthreadID,reason:V}}shouldUseProgressBar(){return!1}updateProgressBar(){}static AD_READINESS_TIMEOUT_MS=1000;scheduleAdSubscriptionWithIdeReadiness(){if(this.isIdeReadyForAdContext()){this.subscribeToAds();return}this.adReadinessTimeout=setTimeout(()=>{if(this.adReadinessTimeout=null,!this.adSubscription)this.subscribeToAds()},y21.AD_READINESS_TIMEOUT_MS)}isIdeReadyForAdContext(){let J=this.ideStatus;if(!J||!J.enabled)return!1;return Boolean(J.openFile||J.visibleFiles&&J.visibleFiles.length>0)}subscribeToAds(){if(this.adSubscription)return;this.adSubscription=qx1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let J=this.agentModeController?.getMode();return(J&&O9(J)||this.randomAd===null)&&Kx1(this.lastUserInteractionTime)},this.widget.dependencies.codebaseContextService,()=>this.widget.dependencies.worker.thread).subscribe({next:(J)=>{if(J){let Q=RS8(16).toString("hex");if(this.lastAdImpressionId=Q,Promise.resolve().then(() => (_21(),S21)).then(({recordAdEvent:Y})=>{let Z=this.widget.dependencies.worker.thread,X=Z.messages[Z.messages.length-1];Y("viewed",{adId:J.id,advertiserId:J.advertiserId,threadId:Z.id,messageId:X?.messageId,impressionId:Q,placement:"tui",matchType:J.metadata?.matchType,matchedPatterns:J.metadata?.matchedPatterns,candidateAdPoolCount:J.metadata?.candidateAdPoolCount,clientRegion:J.metadata?.clientRegion})}),J.externalImpressionUrl)this.widget.dependencies.internalAPIClient.recordAdImpression({adId:J.id,externalImpressionUrl:J.externalImpressionUrl},{config:this.widget.dependencies.configService}).catch(()=>{})}this.setState(()=>{this.randomAd=J}),n8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}})}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){v.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){v.error("No tool use block found in confirmation");return}if(J==="allow-all-session")GV("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(X){if(X&&X instanceof Error)this.setState(()=>{this.displayMessage=X});else v.error("Failed to write dangerouslyAllowAll setting:",X);return}if(J==="always-guarded"){let X=Q.tools[0]?.toAllow??[],G=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],V=[...X,...G];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",V,"global")}if(J==="connect-github"){let X=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();await OZ(this.context,X);return}if(J==="disable-librarian"){let X=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!X.includes(Kq))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,Kq],"global")}let Z=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let X={type:"user:tool-input",toolUse:Y.id,value:{accepted:Z}};if(Q.subthreadID)await(await s3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(X);else await this.widget.dependencies.worker.handle(X)}catch(X){v.error("Failed to send tool confirmation:",X)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.widget.dependencies.worker;switch(J){case"retry":await Q.retry();break;case"dismiss":Q.dismissEphemeralError();break;case"new-thread":Q.dismissEphemeralError(),await this.startAndSwitchToNewThread();break;case"new-smart-thread":this.agentModeController?.setMode("smart"),Q.dismissEphemeralError(),z51({agentMode:"smart"}),await this.startAndSwitchToNewThread();break;case"handoff":Q.dismissEphemeralError(),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 MG(Q.getSettingsFilePath())}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${Z}`)}};cancelStreamingMessage=async()=>{await s3.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 Z=this.widget.dependencies.worker.thread.id;if(Z!==J)this.recordNavigation(Z)}try{v.info(`[switchToExistingThread] Switching to thread: ${J}`);let Z=await this.widget.dependencies.switchToThread(J);if(v.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${Z.thread.agentMode}`),this.widget.dependencies.worker=Z,this.widget.dependencies.threadID=Z.thread.id,this.widget.dependencies.switchWorker(Z),v.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),this.onThreadSwitch(),Z.thread.draft)if(v.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof Z.thread.draft==="string")this.textController.insertText(Z.thread.draft);else{let X=Z.thread.draft.filter((K)=>K.type==="text"),G=Z.thread.draft.filter((K)=>K.type==="image"),V=X.map((K)=>K.text).join(`
4858
4858
  `);if(V)this.textController.insertText(V);if(G.length>0)this.setState(()=>{this.imageAttachments=G})}}catch(Z){throw v.error("Failed to switch to thread:",J,Z),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.handoffController?.clearPendingPrompt(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Y=V2(Q.thread)===0,Z=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Y&&Z!==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 X=[{type:"text",text:J}];if(this.imageAttachments.length>0)X.push(...this.imageAttachments);if(Y)this.startAgentModeSlide();if(await Q.handle({type:"user:message",message:{content:X,agentMode:Z}}),Y)z51({agentMode:Z});this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]}),n8.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((Z)=>Z.type==="handoff"&&Z.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();z51({agentMode:Q}).catch((Y)=>{v.warn("Failed to save session state on exit:",Y)}).finally(()=>{E8.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=TS8();if(J===Q)return"~";if(J.startsWith(Q+jd.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(jd.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(jd.sep),"…",Q.slice(-2).join(jd.sep)].join(jd.sep)}build(J){let Q=E4.of(J),Y=q6.of(J),Z=Y.base;this.themeColors=Z;let{colors:X,app:G}=Y;this.themeApp=G;let V=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,K=V.thread.agentMode&&O9(V.thread.agentMode),q=this.widget.dependencies.features.some((_6)=>_6.name===AT.UBI&&_6.enabled),W=this.widget.dependencies.freeTierStatus.canUseAmpFree&&q,H=(K||W)&&this.randomAd!==null,F=Boolean(H),{threadState:U}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let B=this.getCurrentConfirmation(),M=this.widget.dependencies.replayMode,L=Boolean(M),A=U.items,w=U.mainThread||void 0,E=U.subagentToolsByParentID,P=U.todosList;if(L){let _6={...M.thread,messages:this.replayDisplayedMessages};A=kS(_6).items,w=_6,E={};let w6=SU({messages:this.replayDisplayedMessages});P=Array.isArray(w6)?w6:[]}let R=w?.id,C=w,S=L?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),k=(_6)=>new t31({key:new V3(`preview-message-view-${_6.id}`),items:kS(_6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:_6,focusNode:new M8({debugLabel:"PreviewFocus"})}),f=this.previewThread,m=f?f.messages.length>2000?new C0({mainAxisSize:"max",children:[new a6({child:new Q0}),new B6({padding:W0.all(2),child:new A4({child:new C1({text:new d("Thread too long for preview",new e({color:X.mutedForeground,dim:!0}))})})})]}):k(f):S?new Q21({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal,userDisplayBalanceInfo:this.userDisplayBalanceInfo}):new t31({key:R?new V3(`message-view-${R}`):void 0,items:A,subagentToolsByParentID:E,controller:R?this.getMessageScrollController(R):new O5,autofocus:!1,onCopy:L?void 0:this._handleTextCopy.bind(this),thread:C,onMessageEditSubmit:L?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:L?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:L?void 0:this.forkMessage,getAffectedFiles:L?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode,isInHandoffMode:this.handoffState.isInHandoffMode,completionBuilder:L?void 0:this.getCompletionBuilder()}),b=Math.max(Math.floor(Q.size.height*0.4),12),c=this.getCurrentEphemeralError(),Z1=Q.size.width<40,r=U.mainThread?WP(U.mainThread):void 0,p=u31(J),s=this.buildBottomWidget(c,B,X,Y,U,P,b,F,L,r,Q,p),Q1=new z31({threadViewState:U.viewState,threadTokenUsage:r,threadID:R??null,thread:U.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,mcpServers:this.mcpServers,isNarrow:Z1,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!B,showingEphemeralError:Boolean(U.viewState.state==="active"&&U.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandNoun:this.executingCommand?.noun??null,executingCommandVerb:this.executingCommand?.verb??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),Y1=new Z31({bashInvocations:this.bashInvocations}),n=[],o=this.getEffectiveAgentMode(),i=this.currentShellModeStatus,q1=k21(o),T1=!i?o.length+1:0,J1=Q.capabilities.animationSupport,D1=J1==="disabled"?0:J1==="slow"?30:60,L1=XV(o)?.uiHints?.fasterAnimation?3:1,t1=D1>0&&this.agentModePulseSeq>0?new $5({children:[s,new A5({top:0,left:1,right:1,height:1,child:new Ug1({color:q1,trigger:this.agentModePulseSeq,fps:D1,speed:L1,leftOffset:T1})})]}):s;n.push(new a6({child:m}),Y1);let R1=new $5({children:[new C0({mainAxisSize:"min",children:[H?new Mb1({ad:this.randomAd,onButtonClick:async()=>{let _6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (_21(),S21)).then(({recordAdEvent:Z8})=>{let S8=this.widget.dependencies.worker.thread,W3=S8.messages[S8.messages.length-1];Z8("clicked",{adId:_6.id,advertiserId:_6.advertiserId,threadId:S8.id,messageId:W3?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:_6.metadata?.matchType,matchedPatterns:_6.metadata?.matchedPatterns,candidateAdPoolCount:_6.metadata?.candidateAdPoolCount,clientRegion:_6.metadata?.clientRegion})});if(!await OZ(this.context,_6.shortDestinationUrl)){let S8=E8.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:S8,url:_6.shortDestinationUrl}})}}}):new Q0({height:0}),new f0({constraints:new M6(0,Q.size.width,0,b),child:t1})]}),F?new A5({top:0,left:0,right:0,child:new oH6({userHeight:this.bottomGridUserHeight,maxHeight:b,onInitializeHeight:(_6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(_6,b)})},onDrag:(_6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(_6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let w6=Math.floor(_6.localPosition.y)-this.bottomGridDragStartY,Z8=Math.max(4,this.bottomGridDragStartHeight-w6),S8=Math.min(Z8,b),W3=Math.floor(S8);if(this.bottomGridUserHeight!==W3)this.setState(()=>{this.bottomGridUserHeight=W3})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new Q0({height:0})]}),f1=this.getParentThreadInfo();if(f1&&!L){let _6=f1.type==="handoff"?"Handed off from":"Forked from",w6=f1.type==="handoff"?G.handoffMode:X.primary,Z8=40,S8=B9(f1.title),W3=S8.length>40?S8.slice(0,39).join("")+"…":f1.title;n.push(new Q0({height:1,child:new F6({mainAxisAlignment:"end",children:[new L8({cursor:"pointer",onClick:()=>{this.showCommandPalette({type:"standalone",commandId:"thread-map",onSubmit:this.dismissPalette,onCancel:this.dismissPalette})},child:new B6({padding:W0.only({right:2}),child:new C1({text:new d("",void 0,[new d("↳ ",new e({color:w6})),new d(`${_6}: `,new e({color:X.mutedForeground,dim:!0})),new d(W3,new e({color:X.foreground}))])})})})]})}))}n.push(R1,new Q0({height:1,child:new B6({padding:W0.horizontal(1),child:Q1})}));let V1=new C0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:n}),N1=L&&M?.showIndicator!==!1?new $5({children:[V1,new A5({top:0,left:0,child:new Ag1})]}):V1,F1=new j8(()=>{if(this.isShowingPalette)return this.dismissPalette(),"handled";if(this.isShowingMCPStatusModal)return this.setState(()=>{this.isShowingMCPStatusModal=!1}),"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.isShowingContextDetailOverlay)return this.setState(()=>{this.isShowingContextDetailOverlay=!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.handoffState.isInHandoffMode){if(this.handoffState.isGeneratingHandoff)this.handoffController?.cancelGeneration();else this.exitHandoffMode();return"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.handoffState.isConfirmingAbortHandoff&&this.handoffController){let w6=this.handoffController.getPendingPrompt();return this.textController.clear(),this.setState(()=>{this.imageAttachments=[]}),this.handoffController.confirmAbort().then((Z8)=>{if(Z8&&w6)this.textController.text=w6,this.handoffController?.clearPendingPrompt()}),"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((w6)=>{v.error("Failed to mark message as interrupted:",w6)}),this.cancelStreamingMessage().catch((w6)=>{v.error("Failed to cancel streaming message:",w6)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return v.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.handoffController?.getEmptyHandoffParentThreadID())return this.handoffController.startAbortConfirmation(),"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"}),E1=new j8(()=>{return this.onExitPressed(),"handled"}),w1=new j8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),h1=new j8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),g1=new j8(()=>{return bJ.instance.toggleAll(),"handled"}),o1=new j8(()=>{return this.widget.dependencies.configService.getLatest().then((_6)=>{GV("internal.showDetailedCosts",!(_6.settings["internal.showDetailedCosts"]??!1))}),"handled"}),x1=new j8(()=>{return E8.instance.toggleFrameStatsOverlay(),"handled"}),r1=new j8(()=>{return E8.instance.tuiInstance.getScreen().markForRefresh(),n8.instance.requestFrame(),"handled"}),V0=new j8(()=>{return this.toggleAgentMode(),"handled"}),l0=new j8(()=>{let w6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(w6){let Z8=Math.max(Math.floor(Q.size.height*0.4),10),S8=Q.size.height-Z8;w6.animatePageUp(S8,100)}return"handled"}),e0=new j8(()=>{let w6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(w6){let Z8=Math.max(Math.floor(Q.size.height*0.4),10),S8=Q.size.height-Z8;w6.animatePageDown(S8,100)}return"handled"}),L6=new j8(()=>{let w6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(w6)w6.animateTo(0,100);return"handled"}),O6=new j8(()=>{let w6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(w6)w6.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),U4=new j8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";if(this.handoffState.isInHandoffMode)return"ignored";let{threadState:_6}=this.widget.dependencies;if(!_6.mainThread?.messages.some((Z8)=>Z8.role==="user"||FP(Z8)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),F0=new j8((_6)=>{if(_6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),S0=new j8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return k71().then(async(_6)=>{if(_6)try{this.handleInsertImage(_6)}finally{try{let{unlink:w6}=await import("node:fs/promises");await w6(_6)}catch{}}}),"handled"}),R0=new Map([[D4.ctrl("c"),new hp],[D4.ctrl("l"),new up],[D4.ctrl("o"),new T71],[D4.ctrl("v"),new xp],[D4.alt("s"),new GS],[D4.ctrl("s"),new GS],[D4.alt("p"),new mp],[D4.ctrl("r"),new bp],[D4.alt("d"),new gp],[D4.ctrl("t"),new pp],[D4.key("PageUp"),new I71],[D4.key("PageDown"),new E71],[D4.key("Home"),new P71],[D4.key("End"),new R71],[D4.key("Escape"),new vp],[D4.ctrl("p"),new VS("previous")],[D4.ctrl("n"),new VS("next")],[D4.key("Tab"),new cp]]);if(!J2())R0.set(D4.key("ArrowUp"),new cp);if(!1)R0.set(D4.alt("c"),new fp);let u6=new j8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),W8=new j8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),B4=new j8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),C4=new Map([[vp,F1],[up,r1],[GS,V0],[T71,u6],[xp,S0],[fp,w1],[D71,h1],[bp,g1],[gp,o1],[mp,x1],[pp,W8],[hp,E1],[I71,l0],[E71,e0],[P71,L6],[R71,O6],[cp,U4],[VS,F0],[dp,B4]]),F4=[N1];if(this.isShowingConsoleOverlay)F4.push(new ab1);if(this.isShowingHelp&&this.paletteConfig)F4.push(new sb1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)F4.push(new ff1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)F4.push(new Dg1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)F4.push(new Lb1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(_6)=>{let w6=this.adActionModal.url;if(_6==="copy")try{await E8.instance.tuiInstance.clipboard.writeText(w6),this.setState(()=>{this.displayMessage=new AY("Link copied to clipboard")})}catch(Z8){v.error("Failed to copy to clipboard",{error:Z8}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:_6}=this.widget.dependencies;F4.push(new Bg1({servers:this.pendingMCPServers,onAlwaysTrust:_6.trustAlways.bind(_6),onTrustOnce:_6.trustOnce.bind(_6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:_6.deny.bind(_6)}))}if(this.pendingOAuthRequest)F4.push(new Mg1({request:this.pendingOAuthRequest,onDismiss:()=>{this.setState(()=>{this.pendingOAuthRequest=null})}}));if(this.isShowingFileChangesOverlay)F4.push(new qh1({threadData:U}));if(this.isShowingContextDetailOverlay){let _6=this.threadCostInfo?.costBreakdownURL;F4.push(new ob1({thread:U.mainThread??void 0,tokenUsage:r??void 0,costInfo:this.threadCostInfo,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})},onOpenCostBreakdown:_6?()=>{OZ(J,_6)}:void 0}))}if(this.isShowingConfirmationOverlay)F4.push(new nb1({details:this.confirmationOverlayContent}));if(this.imagePreviewIndex!==null&&this.imagePreviewIndex<this.imageAttachments.length){let _6=this.imageAttachments[this.imagePreviewIndex];if(_6)F4.push(new A4({child:new Jg1({image:_6,imageIndex:this.imagePreviewIndex,onDismiss:this.handleImagePreviewDismiss,onRemove:()=>this.handleImageRemove(this.imagePreviewIndex)})}))}if(this.fileImagePreviewPath!==null)F4.push(new A4({child:new Zh1({filePath:this.fileImagePreviewPath,onDismiss:this.handleFileImagePreviewDismiss})}));let r6=this.getCommandPaletteContext(J);if(r6&&this.isShowingPalette&&this.paletteConfig)F4.push(new A4({child:new cb1({commandContext:r6,mainThread:U.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)F4.push(new eb1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let n6=new $5({children:F4});if(this.isShowingJetBrainsInstaller)return new _w({child:new yJ({actions:C4,child:new xX({shortcuts:R0,debugLabel:"jetbrains-installer-shortcuts",child:new zg1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new HS({onShowImagePreview:this.handleShowFileImagePreview,child:new Kz({controller:this.toastController,child:new _w({child:new Kv1({controller:this.toastController,child:new yJ({actions:C4,child:new xX({shortcuts:R0,debugLabel:"main-app-shortcuts",child:n6})})})})})})}buildScrollableTodoList(J,Q,Y){return new iH6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,Z,X,G,V,K,q,W,H,F){if(J)return new rb1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new ib1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Ng1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let U=this.handoffState.isInHandoffMode?[]:Q31(Z),B=this.agentModeController?.isInRestrictedFreeMode()??!1,M=new tw({key:this.textFieldKey,controller:this.textController,triggers:q?[]:[new vW],completionBuilder:q?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:q?void 0:this.onTextSubmitted,theme:Y,placeholder:q?"Press Ctrl+C to exit":B?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!B&&!this.isShowingStandalonePalette()&&!this.handoffState.isGeneratingHandoff,shellPromptRules:U,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:E8.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,onImageClick:this.handleImageClick,previousThreadId:this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let Y1=this.previousThreadIdForHint;if(Y1)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${Y1} `},onDoubleAtTrigger:q?void 0:()=>{let Y1=this.textController.text,n=this.textController.cursorPosition,i=Y1.slice(0,n).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(i!==-1){let q1=this.textController.text,T1=q1.slice(0,i)+q1.slice(i+2);this.textController.text=T1,this.textController.cursorPosition=i}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})},pendingSkills:this.pendingSkills,onClearPendingSkill:(Y1)=>{(this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker).removePendingSkill(Y1)},popSkill:()=>{let Y1=this.pendingSkills[this.pendingSkills.length-1];if(Y1)(this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker).removePendingSkill(Y1.name)}}),L=X.mainThread?.queuedMessages??[],A=Array.isArray(G)&&G.length>0,E=Array.isArray(L)&&L.length>0?new Lg1({queuedMessages:L}):void 0,P=A?this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!B,Z):void 0,R=[],C=this.currentShellModeStatus;if(C)R.push({child:new C1({text:new d(C==="hidden"?"shell mode (incognito)":"shell mode",new e({color:C==="hidden"?Z.app.shellModeHidden:Z.app.shellMode}))}),position:"top-left"});if(this.handoffState.isInHandoffMode){let Y1=new e({color:Z.app.handoffMode}),n=this.handoffState.isGeneratingHandoff&&this.handoffState.spinner?new d("",void 0,[new d("handoff ",Y1),new d(this.handoffState.spinner.toBraille(),Y1)]):new d("handoff (submit a goal for the new thread)",Y1);if(R.push({child:new C1({text:n}),position:"top-left"}),this.handoffState.isGeneratingHandoff)R.push({child:new C1({text:new d("",void 0,[new d("Esc",new e({color:Z.app.keybind})),new d(" to cancel",new e({color:Y.foreground,dim:!0}))])}),position:"bottom-left"})}let S=this.handoffController?.getEmptyHandoffParentThreadID()??null,k=this.agentModeController?.getVisibleModes()??[];if(!C&&!this.handoffState.isInHandoffMode&&!S&&k.length>1){let Y1=this.previewThread,n=Y1?Y1.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),o=k21(n),i=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,q1=Y1??i.thread,T1=V2(q1)>0,J1=this.agentModeSlideProgress!==null,D1,L1,t1=(V1)=>Math.pow(V1,4);if(J1){D1="top-left";let X1=H.size.width-n.length-4,N1=t1(this.agentModeSlideProgress);L1=Math.floor(N1*X1)}else if(T1)D1="top-right",L1=0;else D1="top-left",L1=void 0;let R1=T1&&!J1,f1;if(J1){let V1=t1(this.agentModeSlideProgress??0);f1=new e({color:o,dim:V1>0.3})}else if(R1)f1=new e({color:Y.foreground,dim:!0});else f1=new e({color:o});if(Y1)R.push({child:new C1({text:new d(n,f1)}),position:D1,offsetX:L1});else{let V1=!T1&&!J1,X1=new C1({text:new d(n,f1)});R.push({child:V1?new L8({child:X1,onClick:this.toggleAgentMode,cursor:"pointer"}):X1,position:D1,offsetX:L1})}}let f=q?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:X.mainThread?.env?.initial.trees?.[0]?.uri,m;if(f)m=u0.parse(f).fsPath;else m=process.cwd();let b=this.toHomeRelative(m),c=this.shorten(b),Z1=!q&&this.currentGitBranch?`${c} (${this.currentGitBranch})`:c;if(R.push({child:new C1({text:new d(Z1,new e({color:Y.foreground,dim:!0}))}),position:"bottom-right"}),S){let Y1=this.getEffectiveAgentMode(),n=k21(Y1);R.push({child:new C1({text:new d(Y1,new e({color:n}))}),position:"top-left"});let o=this.handoffState.isConfirmingAbortHandoff?" again to abort ":" to abort ";R.push({child:new C1({text:new d("",void 0,[new d("Esc",new e({color:Z.app.keybind})),new d(o,new e({color:Y.foreground,dim:!0})),new d("handoff",new e({color:Z.app.handoffMode}))])}),position:"bottom-left"})}if(!S&&this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0&&this.textController.text.trim()==="")R.push({child:new C1({text:new d("",void 0,[new d("press ",new e({color:Y.foreground,dim:!0})),new d("enter",new e({color:Z.app.keybind})),new d(" to reference the previous thread",new e({color:Y.foreground,dim:!0}))])}),position:"bottom-left"});let p=this.previewThread,s=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(V2(s.thread)>0&&!C&&!this.handoffState.isInHandoffMode&&!p){let Y1=[],n=new e({color:Y.foreground,dim:!0}),o=new d(" · ",n);if(W){let i=W.totalInputTokens/W.maxInputTokens,q1=Math.round(i*100),T1=Math.max(0,Math.min(q1,100)),J1=F31(i,W.maxInputTokens),D1=n;if(J1==="danger")D1=new e({color:Y.destructive});else if(J1==="warning")D1=new e({color:Y.warning});else if(J1==="recommendation")D1=new e({color:Z.app.recommendation});let L1=Math.round(W.maxInputTokens/1000);Y1.push(new d(`${T1}% of ${L1}k`,D1))}if(F&&this.threadCostInfo){let i=z21(this.threadCostInfo,{colors:{foreground:Y.foreground},dim:!0});if(i.length>0){if(Y1.length>0)Y1.push(o);Y1.push(...i)}}if(Y1.length>0){let i=new C1({text:new d("",void 0,Y1)});R.push({child:F?new L8({child:i,onClick:this.showContextDetailOverlay,cursor:"pointer"}):i,position:"top-left"})}}return new Xh1({leftChild:new a6({child:M}),rightChild1:E,rightChild2:P,maxHeight:V,overlayTexts:R,borderColor:B||!this.isTextfieldAndAutocompleteFocused||this.handoffState.isGeneratingHandoff?B1.index(8):void 0,hasBanner:K,userHeight:this.bottomGridUserHeight,onInitializeHeight:(Y1)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(Y1,V)})},onDrag:(Y1)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(Y1.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let n=Math.floor(Y1.localPosition.y)-this.bottomGridDragStartY,o=Math.max(4,this.bottomGridDragStartHeight-n),i=Math.min(o,V),q1=Math.floor(i);if(this.bottomGridUserHeight!==q1)this.setState(()=>{this.bottomGridUserHeight=q1})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!K})}}async function Rg1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)E8.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let Z=()=>null,G=!1;if(G)process.env.AMP_INSPECTOR_ENABLED="1";let V=new Qz(G,1000,J.inspectorPort),K=new Nb1({threadService:J.threadService,worker:J.worker,builder:(L,A,w,E,P,R)=>{Z=P;let C=P(),S={...J,worker:C,threadID:C.thread.id};return new nH6({...S,threadState:A,workerController:w,switchWorker:E,getCurrentWorker:P,recentThreadIDs:R})}}),q=new $h1({configService:J.configService,child:K}),W=new bf1({configService:J.configService,child:q}),H=new Jv1(W),F=new q6({data:KS.fromBaseTheme(LG.default()),child:H});try{await Xx1(F,{onRootElementMounted:(L)=>{if(v.info("TUI input ready for user interaction"),G)V.start(L),vZ6(L)}})}finally{if(G)V.stop(),hZ6()}let B=Z()?.thread.id||J.threadID,M=await J.threadService.get(B);if(M&&M.messages.length>0){let L=`${J.ampURL.replace(/\/$/,"")}/threads/${B}`;XX6(M,L,J.stdout)}}function k21(J){let Y=XV(J)?.uiHints?.secondaryColor;if(Y)return B1.rgb(Y.r,Y.g,Y.b);return jS8(J)}class iH6 extends p0{props;constructor(J){super();this.props=J}createState(){return new aH6}}class aH6 extends m0{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:Z}=this.widget.props;return new F6({crossAxisAlignment:"stretch",children:[new a6({child:new J5({controller:Y,autofocus:!1,child:new Db1({todos:Q})})}),new R2({controller:Y,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:X,offset:G}=Y,V=this.viewportHeight,K=X+V;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(V,1),scrollOffset:Math.max(G,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=(Z,X=0)=>{if(Z&&"size"in Z&&"children"in Z){let G=Z.children||[];for(let V of G){if(V&&"size"in V){let q=V.size;if(typeof q?.height==="number"&&q.height>0)return q.height}let K=Q(V,X+1);if(K>0)return K}}return 0},Y=Q(J);if(Y>0)return Y;if("size"in J){let Z=J.size;if(typeof Z?.height==="number"&&Z.height>0)return Z.height}return this.viewportHeight}}class oH6 extends l6{props;constructor(J){super();this.props=J}build(J){return new L8({child:new Q0({height:1}),cursor:E9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let Z=J.findRenderObject()?.size.height??0;if(Z>0){this.props.onInitializeHeight(Z);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function jS8(J){let Q=0;for(let X=0;X<J.length;X++){let G=J.charCodeAt(X);Q=(Q<<5)-Q+G,Q=Q&Q}let Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],Z=Math.abs(Q)%Y.length;return B1.index(Y[Z])}Zx1();try{if(process.platform==="win32")await Promise.resolve().then(() => Q6(eS(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){TY.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
4859
- `)}var Qu1=Ju1.join(vB0||Ju1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function rx8(J){process.emitWarning=function(Q,Y,Z,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Y||"Warning",K=!1;J.warn(G,{name:V,code:Z})}}function SG(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")GV("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")GV("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")GV("model.sonnet",Q.useSonnet)}async function Zu1(J){try{await ix8(Ju1.dirname(Qu1),{recursive:!0}),await ax8(Qu1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function sx8(){try{return(await wB6(Qu1,"utf-8")).trim()}catch(J){return null}}function tx8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function ex8(J){try{let Q=await _9.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){v.debug("Failed to fetch user info:",Q)}return}var LB6=[{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??FG,description:`Custom settings file path (overrides the default location ${FG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${Bw})`},{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:J2(),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:VP.SMART.key,description:`Set the agent mode (${L$().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:L$().map((J)=>J.mode).concat("large")}],AB6=(J)=>("deprecated"in J)&&J.deprecated===!0,Jv8=(J)=>("hidden"in J)&&J.hidden===!0,Qv8=(J)=>("default"in J),Yv8=(J)=>("default"in J)?J.default:void 0;function Zv8(J,Q){let Y=Q.args[0],Z=Q.commands.map((G)=>G.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let G=Z.filter((K)=>Y.includes(K)||K.includes(Y)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new b8(HG.unknownCommand(Y),1,V)}}var IB6=null;function qm5(){return IB6}function td(J){return{...J,getThreadEnvironment:p91,vfs:QS0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new Xf(J.fileSystem),generateThreadTitle:F16,deleteThread:(Q)=>J.threadService.delete(Q),getServerStatus:()=>dR(J.configService)}}var Xu1=u0.file(ox8.homedir()),EB6=process.env.XDG_CONFIG_HOME?u0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(Xu1,".config");async function pX(J,Q){fA0("0.0.1766275311-g95fb3f");let Y=rU1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Y0.of([u0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Xu1,userConfigDir:EB6}),{initializeCLITelemetry:Z}=await Promise.resolve().then(() => (_21(),S21));Z(Y);let X=await Y.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=I86({configService:Y}),K=new Map,q=()=>K.clear(),W=new sM1(Y,J.settings.getWorkspaceRootPath()),H=Bx0({configService:Y,filesystem:s9}),F=Sj0({configService:Y,trustStore:W,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(r,p,s)=>{let Q1=`${r}:${p}`,Y1=K.get(Q1);if(Y1)return v.debug("Reusing existing OAuth provider for server",{serverName:r,serverUrl:p}),Y1;v.debug("Creating OAuth provider for server",{serverName:r,serverUrl:p});let n=(async()=>{let o=new ZA(J.secrets),i=await o.getClientInfo(r,p),q1=s?.scopes??i?.scopes,T1=i26();v.info("OAuth headless mode check",{useHeadless:T1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:G5.isTTY});let J1=void 0;if(T1)J1=J.executeMode?n26():l26(r);let D1=new iM1({storage:o,serverName:r,serverUrl:p,clientId:s?.clientId??i?.clientId,clientSecret:s?.clientSecret??i?.clientSecret,authUrl:s?.authUrl??i?.authUrl,tokenUrl:s?.tokenUrl??i?.tokenUrl,scopes:q1,headlessAuthHandler:J1});return v.debug("OAuth provider created",{serverName:r,serverUrl:p,hasManualClientId:!!(s?.clientId??i?.clientId),willUseDCR:!(s?.clientId??i?.clientId),scopes:q1,headlessMode:T1,executeMode:J.executeMode}),D1})();return K.set(Q1,n),n}}),U=Wu({configService:Y,filesystem:s9,spawn:fN,skillToolboxDirs:H.skillToolboxDirs}),{initializeToolProviders:B,startToolProviders:M}=await Promise.resolve().then(() => (MB6(),DB6)),L;if(J.executeMode){let r=await B({toolService:G,providers:[F,U],initialTimeout:15000});L=r.registrations;for(let[p,s]of r.initErrors)v.warn(`${p} provider initialization slow or failed:`,s)}else L=M({toolService:G,providers:[F,U]});if(Q.jetbrains)vP("JetBrains");else if(Q.ide&&RJ6())vP("VS Code");else if(Q.ide&&TJ6())vP("Neovim");if(J.executeMode)bA0(!0);let A,w=v7.status.pipe(X6((r)=>Boolean(r.connected&&r.authenticated)),I4()).subscribe((r)=>{if(r){if(!A)A=G.registerTool(F66)}else A?.dispose(),A=void 0}),E;if(!J.executeMode){let r=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new t91(process.cwd(),{alwaysIncludePaths:r},!0)}else E=new class extends t91{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(G5.write(`No API key found. Starting login flow...
4859
+ `)}var Qu1=Ju1.join(vB0||Ju1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function rx8(J){process.emitWarning=function(Q,Y,Z,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Y||"Warning",K=!1;J.warn(G,{name:V,code:Z})}}function SG(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")GV("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")GV("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")GV("model.sonnet",Q.useSonnet)}async function Zu1(J){try{await ix8(Ju1.dirname(Qu1),{recursive:!0}),await ax8(Qu1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function sx8(){try{return(await wB6(Qu1,"utf-8")).trim()}catch(J){return null}}function tx8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function ex8(J){try{let Q=await _9.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){v.debug("Failed to fetch user info:",Q)}return}var LB6=[{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??FG,description:`Custom settings file path (overrides the default location ${FG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${Bw})`},{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:J2(),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:VP.SMART.key,description:`Set the agent mode (${L$().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:L$().map((J)=>J.mode).concat("large")}],AB6=(J)=>("deprecated"in J)&&J.deprecated===!0,Jv8=(J)=>("hidden"in J)&&J.hidden===!0,Qv8=(J)=>("default"in J),Yv8=(J)=>("default"in J)?J.default:void 0;function Zv8(J,Q){let Y=Q.args[0],Z=Q.commands.map((G)=>G.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let G=Z.filter((K)=>Y.includes(K)||K.includes(Y)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new b8(HG.unknownCommand(Y),1,V)}}var IB6=null;function qm5(){return IB6}function td(J){return{...J,getThreadEnvironment:p91,vfs:QS0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new Xf(J.fileSystem),generateThreadTitle:F16,deleteThread:(Q)=>J.threadService.delete(Q),getServerStatus:()=>dR(J.configService)}}var Xu1=u0.file(ox8.homedir()),EB6=process.env.XDG_CONFIG_HOME?u0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(Xu1,".config");async function pX(J,Q){fA0("0.0.1766290421-g053fa0");let Y=rU1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Y0.of([u0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Xu1,userConfigDir:EB6}),{initializeCLITelemetry:Z}=await Promise.resolve().then(() => (_21(),S21));Z(Y);let X=await Y.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=I86({configService:Y}),K=new Map,q=()=>K.clear(),W=new sM1(Y,J.settings.getWorkspaceRootPath()),H=Bx0({configService:Y,filesystem:s9}),F=Sj0({configService:Y,trustStore:W,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(r,p,s)=>{let Q1=`${r}:${p}`,Y1=K.get(Q1);if(Y1)return v.debug("Reusing existing OAuth provider for server",{serverName:r,serverUrl:p}),Y1;v.debug("Creating OAuth provider for server",{serverName:r,serverUrl:p});let n=(async()=>{let o=new ZA(J.secrets),i=await o.getClientInfo(r,p),q1=s?.scopes??i?.scopes,T1=i26();v.info("OAuth headless mode check",{useHeadless:T1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:G5.isTTY});let J1=void 0;if(T1)J1=J.executeMode?n26():l26(r);let D1=new iM1({storage:o,serverName:r,serverUrl:p,clientId:s?.clientId??i?.clientId,clientSecret:s?.clientSecret??i?.clientSecret,authUrl:s?.authUrl??i?.authUrl,tokenUrl:s?.tokenUrl??i?.tokenUrl,scopes:q1,headlessAuthHandler:J1});return v.debug("OAuth provider created",{serverName:r,serverUrl:p,hasManualClientId:!!(s?.clientId??i?.clientId),willUseDCR:!(s?.clientId??i?.clientId),scopes:q1,headlessMode:T1,executeMode:J.executeMode}),D1})();return K.set(Q1,n),n}}),U=Wu({configService:Y,filesystem:s9,spawn:fN,skillToolboxDirs:H.skillToolboxDirs}),{initializeToolProviders:B,startToolProviders:M}=await Promise.resolve().then(() => (MB6(),DB6)),L;if(J.executeMode){let r=await B({toolService:G,providers:[F,U],initialTimeout:15000});L=r.registrations;for(let[p,s]of r.initErrors)v.warn(`${p} provider initialization slow or failed:`,s)}else L=M({toolService:G,providers:[F,U]});if(Q.jetbrains)vP("JetBrains");else if(Q.ide&&RJ6())vP("VS Code");else if(Q.ide&&TJ6())vP("Neovim");if(J.executeMode)bA0(!0);let A,w=v7.status.pipe(X6((r)=>Boolean(r.connected&&r.authenticated)),I4()).subscribe((r)=>{if(r){if(!A)A=G.registerTool(F66)}else A?.dispose(),A=void 0}),E;if(!J.executeMode){let r=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new t91(process.cwd(),{alwaysIncludePaths:r},!0)}else E=new class extends t91{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(G5.write(`No API key found. Starting login flow...
4860
4860
  `),!await Xv8(J))await Nw(),process.exit(1)}let P=await Ox0({isDevelopment:!1}),R=new qS1(P,Y),C=new Dj1(P,{lazy:!0}),S=Q.notifications!==void 0?Q.notifications:!J.executeMode,k=P86({playNotificationSound:async(r)=>{if(S){E86(r);let p=Qx1(),s=Yx1();if((!p||s)&&X.settings["notifications.system.enabled"]!==!1){if(r==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(r==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:R,configService:Y});v.info("Starting Amp background services");let f=U16({threadService:R,threadHistoryService:C,configService:Y,isExtensionDevelopment:!1}),m;v7.status.subscribe((r)=>{m=r});let b=new _q1({workspaceRoots:[u0.file(process.cwd())],getCurrentFile:()=>{if(!m?.openFile)return;try{return u0.parse(m.openFile)}catch(r){v.warn("Failed to parse current file URI",{uri:m.openFile,error:r});return}},getOpenFiles:()=>{if(!m?.visibleFiles?.length)return[];let r=m.openFile;return m.visibleFiles.filter((p)=>p!==r).map((p)=>{try{return u0.parse(p)}catch(s){return v.warn("Failed to parse visible file URI",{uri:p,error:s}),null}}).filter((p)=>p!==null)}}),c=new $x1,Z1={codebaseContextService:b,configService:Y,toolService:G,mcpService:F,skillService:H,toolboxService:U,trustStore:W,threadService:R,threadHistoryService:C,threadSyncService:f,threadStorage:P,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:k,fileSystem:Q.jetbrains||Q.ide?tj0:s9,terminal:c};return{...Z1,async asyncDispose(){if(Z1.mcpService.hasAuthenticatingClients())v.info("Waiting for OAuth authentication to complete before exit..."),await Z1.mcpService.waitForAuthentication();for(let r of L.values())r.dispose();await Z1.mcpService.dispose(),q(),await Z1.threadService.asyncDispose(),Z1.configService.unsubscribe(),V(),Z1.fuzzyServer.dispose(),Z1.threadSyncService.dispose(),Z1.settingsStorage[Symbol.dispose](),w.unsubscribe(),A?.dispose()}}}async function Xv8(J){if(!J.executeMode){if(!await ky1("Would you like to log in to Amp? [(y)es, (n)o]: "))return G5.write(`Login cancelled. Run the command again to retry.
4861
4861
  `),!1}return await PB6(J)}async function PB6(J){let Q=nx8(32).toString("hex"),Y=await _y1(J.ampURL,Q),Z=new AbortController;try{await _U(Y,Z.signal)}catch(G){v.error("Error opening browser",{error:G})}let X=await _y1(J.ampURL,Q,!1);G5.write(`If your browser does not open automatically, visit:
4862
4862
 
@@ -4866,7 +4866,7 @@ ${V6.blue.bold(X)}
4866
4866
  Login successful! You can now use the Amp CLI.
4867
4867
  `),!0}catch(G){return v.error("Login failed",{error:G}),TY.write(`
4868
4868
  Login failed: ${G instanceof Error?G.message:String(G)}
4869
- `),!1}}function $v8(){let J=new tV().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)_j(),process.exit(0);let F=H.originalError??H;O26(F)}),J.option("-V, --version","Print the version number and exit",()=>{let F;try{F=`, ${kR(new Date("2025-12-21T00:06:54.623Z"))} ago`}catch{}G5.write(`0.0.1766275311-g95fb3f (released 2025-12-21T00:06:54.623Z${F??""})
4869
+ `),!1}}function $v8(){let J=new tV().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)_j(),process.exit(0);let F=H.originalError??H;O26(F)}),J.option("-V, --version","Print the version number and exit",()=>{let F;try{F=`, ${kR(new Date("2025-12-21T04:19:07.702Z"))} ago`}catch{}G5.write(`0.0.1766290421-g053fa0 (released 2025-12-21T04:19:07.702Z${F??""})
4870
4870
  `),process.exit(0)}),J.addHelpText("after",IJ6()),J.configureHelp({formatHelp:EJ6}),J.command("logout").description("Log out by removing stored API key").action(async(H,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await qv8(B)}),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,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await Kv8(B,await Ay1(U,B.settings))});let Q=async(H,F,U)=>{rU1({storage:F.settings,secretStorage:F.secrets,workspaceRoots:Y0.of([u0.file(process.cwd())]),defaultAmpURL:F.ampURL,homeDir:Xu1,userConfigDir:EB6});let B={...F,executeMode:!1};await Yu1(B,{...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,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await OB6(U,B,F)});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,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await Nv8(U,B,F)}),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,F,U)=>{let B=U.optsWithGlobals(),M=await pJ(B);if(F.pick)TY.write(`${V6.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
4871
4871
  `);if(F.last||H||M.executeMode)await Bv8(B,M,H,U);else await Q(B,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,F,U)=>{let B=U.optsWithGlobals(),M=await pJ(B);await Uv8(B,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,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await OB6(U,B,F)}),Y.command("search <query>").alias("find").summary("Search threads").description(`Search for threads using a query DSL.
4872
4872
 
@@ -4882,8 +4882,8 @@ All matching is case-insensitive. File paths use partial matching.`).option("-n,
4882
4882
  Or pipe via stdin: echo "your message" | amp --execute`);SG(Y,Q);let V=await pX(J,Q);IB6=V;let K=td(V),q=await ex8(V.configService),W=tx8(q?.email);if((J.executeMode||Q.streamJson)&&O9(Q.mode)&&!W)throw new b8(`Execute mode is not permitted with --mode '${Q.mode}'`,1);let H=async(b)=>{let c=await wB6(b,"utf-8"),Z1=JSON.parse(c);if(!w$(Z1.id))throw new b8(HG.invalidThreadId);return OJ1(V,{visibility:Z,agentMode:Q.mode,thread:Z1})},F=async(b)=>{if(!w$(b))throw new b8(HG.invalidThreadId);try{let[Z1,r]=await Promise.all([_9.getThreadLinkInfo({thread:b},{config:V.configService}),_9.getUserInfo({},{config:V.configService})]);if(Z1.ok&&r.ok){let p=Z1.result.creatorUserID,s=r.result.id;if(p&&p!==s&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new b8(`Cannot resume thread created by another user.
4883
4883
 
4884
4884
  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(Z1){if(Z1 instanceof b8)throw Z1;v.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Z1})}let c=await V.threadService.get(b)??void 0;return v.info(`[fetchAndStartThread] Loaded thread ${b}, agentMode: ${c?.agentMode??"undefined"}`),OJ1(V,{visibility:Z,agentMode:c?void 0:Q.mode,thread:c})},U=async()=>{try{if(Q.threadId)return F(Q.threadId);else return OJ1(V,{visibility:Z,agentMode:Q.mode})}catch(b){if(b instanceof b8)throw b;throw await ru(b,Q.threadId),Error("handleError should have called process.exit()")}},B=async()=>{return OJ1(V,{visibility:Z,agentMode:Q.mode})};if(Q.format==="jsonl")TY.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
4885
- `),await Nw(),process.exit(1);if(J.executeMode&&Q.remote)await zQ6(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)$Q6(V.mcpService,J.settings),await _26(M,M.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL,W,Q.mode),await V.asyncDispose(),process.exit(0);let L=!1,A=!1,w=!1;if(Q.jetbrains||Q.ide){await oA0();let b=bP({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let c=b[0];if(c)v7.selectConfig(c)}else w=!0}let E=K51("0.0.1766275311-g95fb3f",V.settingsStorage),P=new i41(V.threadStorage),R=Y0.of([u0.file(process.cwd())]),C=kq1(void 0,R),S=new q51(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let f=await(async()=>{try{let b=await _9.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(b.ok)return v.info("User free tier status:",b),b.result}catch(b){throw v.error("Failed to fetch free tier status:",b),b}})(),m=await DQ6();v.info("Loaded session state:",m),await Rg1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new l91,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,threadID:M.threadID,threadFuzzyIndexer:P,worker:M,workerDeps:K,skillService:K.skillService,configService:V.configService,internalAPIClient:_9,ampURL:J.ampURL,startNewThread:B,switchToThread:F,ideClient:v7,commandRegistry:C,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:S,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:w,openThreadSwitcher:Q.openThreadSwitcher,updateService:E,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:m,freeTierStatus:{canUseAmpFree:f.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Y.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function pJ(J){if(J.interactive)TY.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4886
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,Z=await VJ6({...J,workspaceTrust:{current:!0,changes:yy},getHook:process.env.AMP_URL?(G,V)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return V()}:void 0});if(J.mcpConfig){let G=await ZQ6(J.mcpConfig);Z=XQ6(Z,G)}let X=await Z.get("url","global");if(!X)X=dY;if(!kU(X))v.info("Targeting custom Amp server",{ampURL:X});return Z=KM0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:UQ6(await Ay1(J,Z))}}function Gv8(J){let Q={};for(let Y=0;Y<J.length;Y++){let Z=J[Y];if(Z?.startsWith("--")){let G=Z.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Y+1];if(V&&!V.startsWith("--"))Q[G]=V,Y++}}return Q}async function Vv8(){let J=Gv8(process.argv);if(F26({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),rx8(v),v.info("Starting Amp CLI.",{version:"0.0.1766275311-g95fb3f",buildTimestamp:"2025-12-21T00:06:54.623Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new b8(HG.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await $v8().parseAsync(process.argv)}Vj1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await Vv8().catch(ru)});async function Kv8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),G5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4885
+ `),await Nw(),process.exit(1);if(J.executeMode&&Q.remote)await zQ6(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)$Q6(V.mcpService,J.settings),await _26(M,M.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL,W,Q.mode),await V.asyncDispose(),process.exit(0);let L=!1,A=!1,w=!1;if(Q.jetbrains||Q.ide){await oA0();let b=bP({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let c=b[0];if(c)v7.selectConfig(c)}else w=!0}let E=K51("0.0.1766290421-g053fa0",V.settingsStorage),P=new i41(V.threadStorage),R=Y0.of([u0.file(process.cwd())]),C=kq1(void 0,R),S=new q51(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let f=await(async()=>{try{let b=await _9.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(b.ok)return v.info("User free tier status:",b),b.result}catch(b){throw v.error("Failed to fetch free tier status:",b),b}})(),m=await DQ6();v.info("Loaded session state:",m),await Rg1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new l91,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,threadID:M.threadID,threadFuzzyIndexer:P,worker:M,workerDeps:K,skillService:K.skillService,configService:V.configService,internalAPIClient:_9,ampURL:J.ampURL,startNewThread:B,switchToThread:F,ideClient:v7,commandRegistry:C,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:S,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:w,openThreadSwitcher:Q.openThreadSwitcher,updateService:E,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:m,freeTierStatus:{canUseAmpFree:f.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Y.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function pJ(J){if(J.interactive)TY.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4886
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,Z=await VJ6({...J,workspaceTrust:{current:!0,changes:yy},getHook:process.env.AMP_URL?(G,V)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return V()}:void 0});if(J.mcpConfig){let G=await ZQ6(J.mcpConfig);Z=XQ6(Z,G)}let X=await Z.get("url","global");if(!X)X=dY;if(!kU(X))v.info("Targeting custom Amp server",{ampURL:X});return Z=KM0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:UQ6(await Ay1(J,Z))}}function Gv8(J){let Q={};for(let Y=0;Y<J.length;Y++){let Z=J[Y];if(Z?.startsWith("--")){let G=Z.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Y+1];if(V&&!V.startsWith("--"))Q[G]=V,Y++}}return Q}async function Vv8(){let J=Gv8(process.argv);if(F26({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),rx8(v),v.info("Starting Amp CLI.",{version:"0.0.1766290421-g053fa0",buildTimestamp:"2025-12-21T04:19:07.702Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new b8(HG.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await $v8().parseAsync(process.argv)}Vj1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await Vv8().catch(ru)});async function Kv8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),G5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4887
4887
  `);else if(!kU(J.ampURL))G5.write(`Logging in to ${new URL(J.ampURL).hostname}
4888
4888
  `);let Y=process.env.AMP_API_KEY;if(Y)G5.write(`API key found in environment variable, storing...
4889
4889
  `),await Q.set("apiKey",Y,J.ampURL),G5.write(`API key successfully stored.
@@ -4896,7 +4896,7 @@ This thread belongs to a different user and cannot be continued for security rea
4896
4896
  `);else G5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
4897
4897
  `);process.exit(0)}async function Wv8(J,Q,Y,Z,X){SG(X,J);let G=await pX(Q,J);try{let V=wJ1(Y);if(!V)IJ1(Y);let K=V,q=Z.trim();if(q.length===0)uX("Thread name cannot be empty");if(q.length>256)uX("Thread name cannot exceed 256 characters");if(!(await J_(K,G)).messages.length)uX("Cannot rename an empty thread.");let H=td(G);await(await s3.getOrCreateForThread(H,K)).handle({type:"title",value:q}),v.info("GOT HERE"),await G.threadSyncService.sync(),v.info("GOT THERE"),G5.write(V6.green(`✓ Thread ${K} renamed to "${q}"
4898
4898
  `)),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose();let K=`Failed to rename thread: ${V instanceof Error?V.message:String(V)}`;uX(K)}}async function Hv8(J,Q,Y,Z){SG(Z,J);let X=await pX(Q,J);try{let G=wJ1(Y);if(!G)IJ1(Y);let K=await J_(G,X),q=Qj(K);G5.write(q+`
4899
- `),await X.asyncDispose(),process.exit(0)}catch(G){await X.asyncDispose();let V=`Failed to render thread as markdown: ${G instanceof Error?G.message:String(G)}`;uX(V)}}async function Fv8(J,Q,Y,Z,X){SG(X,J);let G=await pX(Q,J);try{let V=await $u1(Y),K=await J_(V,G),q=Z.typing!==!1,W=parseInt(Z.wpm||"120",10),H=parseInt(Z.messageDelay||"1000",10),F=parseInt(Z.toolProgressDelay||"800",10),U=parseInt(Z.exitDelay||"3",10)*1000,B=Z.indicator!==!1,M=td(G),L=K.id;await G.threadStorage.set(L,K);let A=await s3.getOrCreateForThread(M,L);await A.resume();let w=n41.fromWorker(A),E=new i41(G.threadStorage),P=Y0.of([u0.file(process.cwd())]),R=kq1(void 0,P),C=new q51(G.mcpService,Q.settings.getWorkspaceRootPath()),S=K51("0.0.1766275311-g95fb3f",G.settingsStorage),k=Wu({configService:G.configService,filesystem:s9,spawn:fN,skillToolboxDirs:G.skillService.skillToolboxDirs});await Rg1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new l91,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,threadID:L,threadFuzzyIndexer:E,worker:w,workerDeps:M,skillService:M.skillService,configService:G.configService,internalAPIClient:_9,ampURL:Q.ampURL,startNewThread:async()=>w,switchToThread:async()=>w,ideClient:v7,commandRegistry:R,mcpService:G.mcpService,toolboxService:k,mcpTrustHandler:C,showJetBrainsInstaller:!1,updateService:S,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:F,exitDelayMs:U,showIndicator:B},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await ru(V,Y)}}async function zv8(J,Q,Y,Z,X){SG(Z,J);let G=await pX(Q,J);try{let V=wJ1(Y);if(!V)IJ1(Y);let K=V,q=await _9.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=W51(J,W);if(!H&&!X)uX("Must specify either --visibility or --support");if(H&&X)uX("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)uX(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,H51(H)),G5.write(V6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4899
+ `),await X.asyncDispose(),process.exit(0)}catch(G){await X.asyncDispose();let V=`Failed to render thread as markdown: ${G instanceof Error?G.message:String(G)}`;uX(V)}}async function Fv8(J,Q,Y,Z,X){SG(X,J);let G=await pX(Q,J);try{let V=await $u1(Y),K=await J_(V,G),q=Z.typing!==!1,W=parseInt(Z.wpm||"120",10),H=parseInt(Z.messageDelay||"1000",10),F=parseInt(Z.toolProgressDelay||"800",10),U=parseInt(Z.exitDelay||"3",10)*1000,B=Z.indicator!==!1,M=td(G),L=K.id;await G.threadStorage.set(L,K);let A=await s3.getOrCreateForThread(M,L);await A.resume();let w=n41.fromWorker(A),E=new i41(G.threadStorage),P=Y0.of([u0.file(process.cwd())]),R=kq1(void 0,P),C=new q51(G.mcpService,Q.settings.getWorkspaceRootPath()),S=K51("0.0.1766290421-g053fa0",G.settingsStorage),k=Wu({configService:G.configService,filesystem:s9,spawn:fN,skillToolboxDirs:G.skillService.skillToolboxDirs});await Rg1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new l91,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,threadID:L,threadFuzzyIndexer:E,worker:w,workerDeps:M,skillService:M.skillService,configService:G.configService,internalAPIClient:_9,ampURL:Q.ampURL,startNewThread:async()=>w,switchToThread:async()=>w,ideClient:v7,commandRegistry:R,mcpService:G.mcpService,toolboxService:k,mcpTrustHandler:C,showJetBrainsInstaller:!1,updateService:S,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:F,exitDelayMs:U,showIndicator:B},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await ru(V,Y)}}async function zv8(J,Q,Y,Z,X){SG(Z,J);let G=await pX(Q,J);try{let V=wJ1(Y);if(!V)IJ1(Y);let K=V,q=await _9.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=W51(J,W);if(!H&&!X)uX("Must specify either --visibility or --support");if(H&&X)uX("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)uX(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,H51(H)),G5.write(V6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4900
4900
  `);if(X){await J_(K,G);let F=typeof X==="string"?X:void 0;await R_0(G.threadService,K,G.configService,F),G5.write(V6.green("✓ ")+`Thread ${K} has been shared with Amp support. These thread reports will be aggregated and analysed.
4901
4901
  `)}await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),uX(`Failed to update thread: ${V instanceof Error?V.message:String(V)}`)}}async function Uv8(J,Q,Y,Z){SG(Z,J);let X=await pX(Q,J),G=td(X);try{let V=await $u1(Y),q=(await J_(V,X)).messages.length-1,W=await s3.getOrCreateForThread(G,V),H=await qj(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await Zu1(H),G5.write(`${H}
4902
4902
  `),await X.asyncDispose(),process.exit(0)}catch(V){TY.write(`Error forking thread: ${V instanceof Error?V.message:String(V)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1766275311-g95fb3f",
3
+ "version": "0.0.1766290421-g053fa0",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {