@sourcegraph/amp 0.0.1766318478-gf7f645 → 0.0.1766332871-gf7f645

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 G51(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 V51(J,Q){let Y=new r4,Z=Y.pipe(U8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new $q().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 eC(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=Mw(),W=await G51(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 $51();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 Kp(W.latestVersion,F);let U=await rN(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 eC(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}is();import{stderr as LW}from"node:process";function aJ6(J){let Q=new eV().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 Py1(Z.force||!1,Z.verbose||!1,"0.0.1766318478-gf7f645"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new eV("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 G51(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 V51(J,Q){let Y=new r4,Z=Y.pipe(U8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new $q().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 eC(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=Mw(),W=await G51(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 $51();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 Kp(W.latestVersion,F);let U=await rN(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 eC(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}is();import{stderr as LW}from"node:process";function aJ6(J){let Q=new eV().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 Py1(Z.force||!1,Z.verbose||!1,"0.0.1766332871-gf7f645"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new eV("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=Mw(),{hasUpdate:Z,latestVersion:X}=await G51("0.0.1766318478-gf7f645",Y);if(!Z){LW.write(V6.green(`✓ Amp CLI is already up to date: ${"0.0.1766318478-gf7f645"} (${"released"} ${"2025-12-21T12:06:34.067Z"}${`, ${_R(new Date("2025-12-21T12:06:34.067Z"))} ago`})
4028
- `));let V=await rN("0.0.1766318478-gf7f645");if(V.warning)LW.write(`
4027
+ `));let Y=Mw(),{hasUpdate:Z,latestVersion:X}=await G51("0.0.1766332871-gf7f645",Y);if(!Z){LW.write(V6.green(`✓ Amp CLI is already up to date: ${"0.0.1766332871-gf7f645"} (${"released"} ${"2025-12-21T16:06:23.533Z"}${`, ${_R(new Date("2025-12-21T16:06:23.533Z"))} ago`})
4028
+ `));let V=await rN("0.0.1766332871-gf7f645");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 Kp(J,void 0,(Y)=>{LW.write(V6.dim(`Running: ${Y}
@@ -4745,7 +4745,7 @@ Ctrl-X, Y, Z to unlock`;if(U){let l=W.text.replace(/`([^`]+)`/g,"$1")+`
4745
4745
  `,A)])}),S];if(!q&&!U&&W.url){let g=W.url.replace(/^https?:\/\//,"");f.push(new _5({uri:W.url,text:g,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 ux1({width:Hb1,height:Fb1,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 zb1{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(EL()).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(EL()).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]=hO(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=GQ(J.mainThread);X.isCompleted=qW6(W,Z.toolUse.id)}}let G=pC8(Y,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=_S(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=GQ(Y),V={...J.subagents};for(let F of Z){let U=V[F.threadID];if(!U)continue;let B=qW6(G,F.toolUse.id);V[F.threadID]={...U,isCompleted:B}}let{items:K}=_S(Y),q=hO(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=hO(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function _S(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 qW6(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(_S(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 Ub1 extends u0{props;constructor(J){super();this.props=J}createState(){return new WW6}}class WW6 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 zb1(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===qq,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:KP(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 Bb1 extends u0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new HW6}}class HW6 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 Nb1 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 sx1({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 Db1 extends u0{props;constructor(J){super();this.props=J}createState(){return new FW6(this.props.autofocus??!0)}}class FW6 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 D6(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 Mb1(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 zW6(J){return J.kind==="executable"}function UW6(J){return J.kind==="markdown"}var Mz=50000,BW6=300000;async function Lb1(J,Q,Y,Z={}){let{timeoutMs:X=BW6,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}),UW6(K))return await lC8(K,Q);else if(zW6(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=BW6,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=GC0(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();de();A$();q7();TR();hH();BQ();f$();rH();fq();B8();Im();L7();Sy();s0();var nW6=Q6(IB(),1);import{writeFile as uW6}from"fs/promises";import pW6 from"path";N0();BQ();class Ab1{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.1766318478-gf7f645"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Ht(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 PD extends u0{props;constructor(J){super();this.props=J}createState(){return new NW6}}class NW6 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 DW6 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 Od extends u0{props;constructor(J){super();this.props=J}createState(){return new DW6}}rH();class MW6 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=QS(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 sw({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 D6({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 Ob1 extends u0{props;constructor(J){super();this.props=J}createState(){return new MW6}}import{isDeepStrictEqual as eC8}from"node:util";var rC8=/[\\/_ +.#"@[({&]/,sC8=/[\\/_ +.#"@[({&]/g,tC8=/[\s-]/,LW6=/[\s-]/g;function Y21(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=Y21(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(LW6),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=Y21(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 Q21(J){return J.toLowerCase().replace(LW6," ")}function AW6(J,Q){let Y=Y21(J,Q,Q21(J),Q21(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=Y21(J,K,Q21(J),Q21(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 kS{}class yS{}class Z21{}class X21{}class OW6 extends u0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new wW6}}class wW6 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=AW6(Q,J);return{matches:Y>0.15,score:Y}}class YJ extends u0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new IW6}}class IW6 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 kS){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 yS){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 Z21){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 X21)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;C71(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 kS],[new D4("ArrowUp"),new yS],[new D4("Tab"),new kS],[new D4("Tab",{shift:!0}),new yS],[new D4("n",{ctrl:!0}),new kS],[new D4("p",{ctrl:!0}),new yS],[new D4("Enter"),new Z21],[new D4("Escape"),new X21]]),focusNode:this.focusNode,child:V}),q=new yJ({actions:new Map([[kS,new j8(this.invoke)],[yS,new j8(this.invoke)],[Z21,new j8(this.invoke)],[X21,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 OW6(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 EW6(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 wb1 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)=>EW6(X.pubDate).length));return new YJ({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(EW6(X.pubDate),Y)]})})}})}}class Ib1 extends u0{createState(){return new PW6}}class PW6 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 Eb1(J,Q,Y){return new C1({text:new d(`${J}${Q}`,new e({color:Y})),maxLines:1})}function Yj8(J,Q,Y,Z){return[Eb1("+",J,Z.success),l5.horizontal(1),Eb1("~",Q,Z.warning),l5.horizontal(1),Eb1("-",Y,Z.destructive)]}class $21 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 YJ({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=[],_=F.relationshipType==="handoff",f=new Q31;if(F.depth>0){let r=[],p=F.ancestorsAreLast.slice(1);for(let Z1 of p)r.push(new d(f.getAncestorPrefix(Z1),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=[],g=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(g)m.push(new C1({text:g}));if(C){if(C.state==="active"&&(C.interactionState==="tool-running"||C.inferenceState==="running"))m.push(new Ib1),m.push(new Q0({width:1}))}let l=F.title;if(F.relationshipType==="fork"){let r=l.match(/^Forked\((\d+)\): /);if(r)l=l.slice(r[0].length);else while(l.startsWith("Forked: "))l=l.slice(8);m.push(new C1({text:new d("[fork] ",new e({color:B1.blue}))}))}else if(_)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(l,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 Pb1 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();de();A$();q7();TR();hH();BQ();f$();rH();fq();B8();Im();L7();Sy();s0();var nW6=Q6(IB(),1);import{writeFile as uW6}from"fs/promises";import pW6 from"path";N0();BQ();class Ab1{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.1766332871-gf7f645"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Ht(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 PD extends u0{props;constructor(J){super();this.props=J}createState(){return new NW6}}class NW6 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 DW6 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 Od extends u0{props;constructor(J){super();this.props=J}createState(){return new DW6}}rH();class MW6 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=QS(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 sw({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 D6({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 Ob1 extends u0{props;constructor(J){super();this.props=J}createState(){return new MW6}}import{isDeepStrictEqual as eC8}from"node:util";var rC8=/[\\/_ +.#"@[({&]/,sC8=/[\\/_ +.#"@[({&]/g,tC8=/[\s-]/,LW6=/[\s-]/g;function Y21(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=Y21(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(LW6),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=Y21(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 Q21(J){return J.toLowerCase().replace(LW6," ")}function AW6(J,Q){let Y=Y21(J,Q,Q21(J),Q21(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=Y21(J,K,Q21(J),Q21(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 kS{}class yS{}class Z21{}class X21{}class OW6 extends u0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new wW6}}class wW6 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=AW6(Q,J);return{matches:Y>0.15,score:Y}}class YJ extends u0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new IW6}}class IW6 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 kS){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 yS){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 Z21){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 X21)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;C71(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 kS],[new D4("ArrowUp"),new yS],[new D4("Tab"),new kS],[new D4("Tab",{shift:!0}),new yS],[new D4("n",{ctrl:!0}),new kS],[new D4("p",{ctrl:!0}),new yS],[new D4("Enter"),new Z21],[new D4("Escape"),new X21]]),focusNode:this.focusNode,child:V}),q=new yJ({actions:new Map([[kS,new j8(this.invoke)],[yS,new j8(this.invoke)],[Z21,new j8(this.invoke)],[X21,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 OW6(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 EW6(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 wb1 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)=>EW6(X.pubDate).length));return new YJ({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(EW6(X.pubDate),Y)]})})}})}}class Ib1 extends u0{createState(){return new PW6}}class PW6 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 Eb1(J,Q,Y){return new C1({text:new d(`${J}${Q}`,new e({color:Y})),maxLines:1})}function Yj8(J,Q,Y,Z){return[Eb1("+",J,Z.success),l5.horizontal(1),Eb1("~",Q,Z.warning),l5.horizontal(1),Eb1("-",Y,Z.destructive)]}class $21 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 YJ({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=[],_=F.relationshipType==="handoff",f=new Q31;if(F.depth>0){let r=[],p=F.ancestorsAreLast.slice(1);for(let Z1 of p)r.push(new d(f.getAncestorPrefix(Z1),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=[],g=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(g)m.push(new C1({text:g}));if(C){if(C.state==="active"&&(C.interactionState==="tool-running"||C.inferenceState==="running"))m.push(new Ib1),m.push(new Q0({width:1}))}let l=F.title;if(F.relationshipType==="fork"){let r=l.match(/^Forked\((\d+)\): /);if(r)l=l.slice(r[0].length);else while(l.startsWith("Forked: "))l=l.slice(8);m.push(new C1({text:new d("[fork] ",new e({color:B1.blue}))}))}else if(_)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(l,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 Pb1 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 RW6 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 YJ({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 Rb1 extends u0{props;constructor(J){super();this.props=J}createState(){return new RW6}}class RD extends u0{props;constructor(J){super();this.props=J}createState(){return new TW6}}class TW6 extends m0{_spinner=new DY;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 tw extends u0{props;constructor(J){super();this.props=J}createState(){return new CW6}}class CW6 extends m0{scrollController=new O5;scrollAreaKey=new PQ("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=s71(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 T2({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 Tb1 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 Mg1 extends u0{createState(){return new mH6}}class mH6 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 Lg1{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 uH6(J){let Q=bD0(J),Y=Array.from(Q.entries()).map(([V,K])=>({path:V,diffStats:K})),Z=Vu0(J),G=qP(J)?.totalInputTokens??0;return{filesAffected:Y,totalTokens:G,totalCredits:Z}}class Ag1{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=uH6(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(EL()).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 pH6(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 iH6 extends u0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new k21}}class k21 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 Ag1;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 $v1;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=Zt0();this.newsFeedReader=new Tx1(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=_21(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=pH6(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=PL(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 Kj(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=zD(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(uy1(Z))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new G3("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=zD(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 mb1(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 db1(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=d0.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 qS("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 Ye({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 Lg1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=mW6(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===FD).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===FD};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=EY6(()=>{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(!ny(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=QS(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=zD(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 qv1({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})})}),w6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y,this.agentModeController=new Cx1({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=Qs0(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})}),Ny1((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=pR(this.widget.dependencies.configService).pipe(B5((Y)=>Y!=="pending"),X6((Y)=>dR(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 A71(new Map([[new L71(k21.MYSTERY_SEQUENCE),new mp]])),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(Ny1(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(uy1("")),this.shouldUseProgressBar())process.stdout.write(uQ6())}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()},k21.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=Vx1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let J=this.agentModeController?.getMode();return(J&&O9(J)||this.randomAd===null)&&Gx1(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(() => (S21(),j21)).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")VV("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(qq))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,qq],"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(),F51({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=K2(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)F51({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();F51({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+Rd.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(Rd.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(Rd.sep),"…",Q.slice(-2).join(Rd.sep)].join(Rd.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===LT.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=_S(_6).items,w=_6,E={};let O6=SU({messages:this.replayDisplayedMessages});P=Array.isArray(O6)?O6:[]}let R=w?.id,C=w,S=L?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),_=(_6)=>new s31({key:new G3(`preview-message-view-${_6.id}`),items:_S(_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}))})})})]}):_(f):S?new J21({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal,userDisplayBalanceInfo:this.userDisplayBalanceInfo}):new s31({key:R?new G3(`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()}),g=Math.max(Math.floor(Q.size.height*0.4),12),l=this.getCurrentEphemeralError(),Y1=Q.size.width<40,r=U.mainThread?qP(U.mainThread):void 0,p=m31(J),s=this.buildBottomWidget(l,B,X,Y,U,P,g,F,L,r,Q,p),Q1=new F31({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:Y1,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}),Z1=new Y31({bashInvocations:this.bashInvocations}),n=[],o=this.getEffectiveAgentMode(),i=this.currentShellModeStatus,q1=_21(o),T1=!i?o.length+1:0,J1=Q.capabilities.animationSupport,D1=J1==="disabled"?0:J1==="slow"?30:60,L1=$V(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 Fg1({color:q1,trigger:this.agentModePulseSeq,fps:D1,speed:L1,leftOffset:T1})})]}):s;n.push(new a6({child:m}),Z1);let R1=new $5({children:[new C0({mainAxisSize:"min",children:[H?new Nb1({ad:this.randomAd,onButtonClick:async()=>{let _6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (S21(),j21)).then(({recordAdEvent:Z8})=>{let S8=this.widget.dependencies.worker.thread,q3=S8.messages[S8.messages.length-1];Z8("clicked",{adId:_6.id,advertiserId:_6.advertiserId,threadId:S8.id,messageId:q3?.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 D6(0,Q.size.width,0,g),child:t1})]}),F?new A5({top:0,left:0,right:0,child:new rH6({userHeight:this.bottomGridUserHeight,maxHeight:g,onInitializeHeight:(_6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(_6,g)})},onDrag:(_6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(_6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let O6=Math.floor(_6.localPosition.y)-this.bottomGridDragStartY,Z8=Math.max(4,this.bottomGridDragStartHeight-O6),S8=Math.min(Z8,g),q3=Math.floor(S8);if(this.bottomGridUserHeight!==q3)this.setState(()=>{this.bottomGridUserHeight=q3})},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",O6=f1.type==="handoff"?G.handoffMode:X.primary,Z8=40,S8=B9(f1.title),q3=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:O6})),new d(`${_6}: `,new e({color:X.mutedForeground,dim:!0})),new d(q3,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 Mg1})]}):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 O6=this.handoffController.getPendingPrompt();return this.textController.clear(),this.setState(()=>{this.imageAttachments=[]}),this.handoffController.confirmAbort().then((Z8)=>{if(Z8&&O6)this.textController.text=O6,this.handoffController?.clearPendingPrompt()}),"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((O6)=>{v.error("Failed to mark message as interrupted:",O6)}),this.cancelStreamingMessage().catch((O6)=>{v.error("Failed to cancel streaming message:",O6)});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)=>{VV("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 O6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(O6){let Z8=Math.max(Math.floor(Q.size.height*0.4),10),S8=Q.size.height-Z8;O6.animatePageUp(S8,100)}return"handled"}),e0=new j8(()=>{let O6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(O6){let Z8=Math.max(Math.floor(Q.size.height*0.4),10),S8=Q.size.height-Z8;O6.animatePageDown(S8,100)}return"handled"}),M6=new j8(()=>{let O6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(O6)O6.animateTo(0,100);return"handled"}),A6=new j8(()=>{let O6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,S8=Z8.mainThread?.id;return S8?this.getMessageScrollController(S8):null})();if(O6)O6.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"||HP(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 _71().then(async(_6)=>{if(_6)try{this.handleInsertImage(_6)}finally{try{let{unlink:O6}=await import("node:fs/promises");await O6(_6)}catch{}}}),"handled"}),R0=new Map([[D4.ctrl("c"),new yp],[D4.ctrl("l"),new bp],[D4.ctrl("o"),new R71],[D4.ctrl("v"),new _p],[D4.alt("s"),new $S],[D4.ctrl("s"),new $S],[D4.alt("p"),new fp],[D4.ctrl("r"),new vp],[D4.alt("d"),new hp],[D4.ctrl("t"),new gp],[D4.key("PageUp"),new w71],[D4.key("PageDown"),new I71],[D4.key("Home"),new E71],[D4.key("End"),new P71],[D4.key("Escape"),new kp],[D4.ctrl("p"),new GS("previous")],[D4.ctrl("n"),new GS("next")],[D4.key("Tab"),new up]]);if(!J2())R0.set(D4.key("ArrowUp"),new up);if(!1)R0.set(D4.alt("c"),new xp);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([[kp,F1],[bp,r1],[$S,V0],[R71,u6],[_p,S0],[xp,w1],[N71,h1],[vp,g1],[hp,o1],[fp,x1],[gp,W8],[yp,E1],[w71,l0],[I71,e0],[E71,M6],[P71,A6],[up,U4],[GS,F0],[mp,B4]]),F4=[N1];if(this.isShowingConsoleOverlay)F4.push(new nb1);if(this.isShowingHelp&&this.paletteConfig)F4.push(new ob1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)F4.push(new vf1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)F4.push(new Bg1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)F4.push(new Db1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(_6)=>{let O6=this.adActionModal.url;if(_6==="copy")try{await E8.instance.tuiInstance.clipboard.writeText(O6),this.setState(()=>{this.displayMessage=new LY("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 zg1({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 Ng1({request:this.pendingOAuthRequest,onDismiss:()=>{this.setState(()=>{this.pendingOAuthRequest=null})}}));if(this.isShowingFileChangesOverlay)F4.push(new Vh1({threadData:U}));if(this.isShowingContextDetailOverlay){let _6=this.threadCostInfo?.costBreakdownURL;F4.push(new ib1({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 cb1({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 tb1({image:_6,imageIndex:this.imagePreviewIndex,onDismiss:this.handleImagePreviewDismiss,onRemove:()=>this.handleImageRemove(this.imagePreviewIndex)})}))}if(this.fileImagePreviewPath!==null)F4.push(new A4({child:new Qh1({filePath:this.fileImagePreviewPath,onDismiss:this.handleFileImagePreviewDismiss})}));let r6=this.getCommandPaletteContext(J);if(r6&&this.isShowingPalette&&this.paletteConfig)F4.push(new A4({child:new pb1({commandContext:r6,mainThread:U.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)F4.push(new sb1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let n6=new $5({children:F4});if(this.isShowingJetBrainsInstaller)return new Sw({child:new yJ({actions:C4,child:new xX({shortcuts:R0,debugLabel:"jetbrains-installer-shortcuts",child:new Hg1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new WS({onShowImagePreview:this.handleShowFileImagePreview,child:new Kz({controller:this.toastController,child:new Sw({child:new Gv1({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 aH6({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 ab1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new lb1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Ug1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let U=this.handoffState.isInHandoffMode?[]:J31(Z),B=this.agentModeController?.isInRestrictedFreeMode()??!1,M=new sw({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 Z1=this.previousThreadIdForHint;if(Z1)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${Z1} `},onDoubleAtTrigger:q?void 0:()=>{let Z1=this.textController.text,n=this.textController.cursorPosition,i=Z1.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:(Z1)=>{(this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker).removePendingSkill(Z1)},popSkill:()=>{let Z1=this.pendingSkills[this.pendingSkills.length-1];if(Z1)(this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker).removePendingSkill(Z1.name)}}),L=X.mainThread?.queuedMessages??[],A=Array.isArray(G)&&G.length>0,E=Array.isArray(L)&&L.length>0?new Dg1({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 Z1=new e({color:Z.app.handoffMode}),n=this.handoffState.isGeneratingHandoff&&this.handoffState.spinner?new d("",void 0,[new d("handoff ",Z1),new d(this.handoffState.spinner.toBraille(),Z1)]):new d("handoff (submit a goal for the new thread)",Z1);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,_=this.agentModeController?.getVisibleModes()??[];if(!C&&!this.handoffState.isInHandoffMode&&!S&&_.length>1){let Z1=this.previewThread,n=Z1?Z1.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),o=_21(n),i=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,q1=Z1??i.thread,T1=K2(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(Z1)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=d0.parse(f).fsPath;else m=process.cwd();let g=this.toHomeRelative(m),l=this.shorten(g),Y1=!q&&this.currentGitBranch?`${l} (${this.currentGitBranch})`:l;if(R.push({child:new C1({text:new d(Y1,new e({color:Y.foreground,dim:!0}))}),position:"bottom-right"}),S){let Z1=this.getEffectiveAgentMode(),n=_21(Z1);R.push({child:new C1({text:new d(Z1,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(K2(s.thread)>0&&!C&&!this.handoffState.isInHandoffMode&&!p){let Z1=[],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=H31(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);Z1.push(new d(`${T1}% of ${L1}k`,D1))}if(F&&this.threadCostInfo){let i=F21(this.threadCostInfo,{colors:{foreground:Y.foreground},dim:!0});if(i.length>0){if(Z1.length>0)Z1.push(o);Z1.push(...i)}}if(Z1.length>0){let i=new C1({text:new d("",void 0,Z1)});R.push({child:F?new L8({child:i,onClick:this.showContextDetailOverlay,cursor:"pointer"}):i,position:"top-left"})}}return new Yh1({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:(Z1)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(Z1,V)})},onDrag:(Z1)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(Z1.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let n=Math.floor(Z1.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 Eg1(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 Ub1({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 iH6({...S,threadState:A,workerController:w,switchWorker:E,getCurrentWorker:P,recentThreadIDs:R})}}),q=new Zh1({configService:J.configService,child:K}),W=new hf1({configService:J.configService,child:q}),H=new tx1(W),F=new q6({data:VS.fromBaseTheme(LG.default()),child:H});try{await Yx1(F,{onRootElementMounted:(L)=>{if(v.info("TUI input ready for user interaction"),G)V.start(L),hZ6(L)}})}finally{if(G)V.stop(),fZ6()}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}`;$X6(M,L,J.stdout)}}function _21(J){let Y=$V(J)?.uiHints?.secondaryColor;if(Y)return B1.rgb(Y.r,Y.g,Y.b);return jS8(J)}class aH6 extends u0{props;constructor(J){super();this.props=J}createState(){return new oH6}}class oH6 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 Bb1({todos:Q})})}),new T2({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 rH6 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])}Qx1();try{if(process.platform==="win32")await Promise.resolve().then(() => Q6(tS(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){RY.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
4859
- `)}var em1=tm1.join(yB0||tm1.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")VV("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")VV("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")VV("model.sonnet",Q.useSonnet)}async function Qu1(J){try{await ix8(tm1.dirname(em1),{recursive:!0}),await ax8(em1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function sx8(){try{return(await IB6(em1,"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 AB6=[{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 ${Uw})`},{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:GP.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")}],OB6=(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 EB6=null;function Vm5(){return EB6}function od(J){return{...J,getThreadEnvironment:u91,vfs:ej0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new Xf(J.fileSystem),generateThreadTitle:z16,deleteThread:(Q)=>J.threadService.delete(Q),getServerStatus:()=>pR(J.configService)}}var Yu1=d0.file(ox8.homedir()),PB6=process.env.XDG_CONFIG_HOME?d0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(Yu1,".config");async function pX(J,Q){vA0("0.0.1766318478-gf7f645");let Y=oU1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Y0.of([d0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Yu1,userConfigDir:PB6}),{initializeCLITelemetry:Z}=await Promise.resolve().then(() => (S21(),j21));Z(Y);let X=await Y.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=E86({configService:Y}),K=new Map,q=()=>K.clear(),W=new rM1(Y,J.settings.getWorkspaceRootPath()),H=zx0({configService:Y,filesystem:s9}),F=Cj0({configService:Y,trustStore:W,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(r,p,s)=>{let Q1=`${r}:${p}`,Z1=K.get(Q1);if(Z1)return v.debug("Reusing existing OAuth provider for server",{serverName:r,serverUrl:p}),Z1;v.debug("Creating OAuth provider for server",{serverName:r,serverUrl:p});let n=(async()=>{let o=new YA(J.secrets),i=await o.getClientInfo(r,p),q1=s?.scopes??i?.scopes,T1=a26();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?i26():n26(r);let D1=new nM1({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=Ku({configService:Y,filesystem:s9,spawn:hN,skillToolboxDirs:H.skillToolboxDirs}),{initializeToolProviders:B,startToolProviders:M}=await Promise.resolve().then(() => (LB6(),MB6)),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)xP("JetBrains");else if(Q.ide&&TJ6())xP("VS Code");else if(Q.ide&&CJ6())xP("Neovim");if(J.executeMode)hA0(!0);let A,w=v7.status.pipe(X6((r)=>Boolean(r.connected&&r.authenticated)),I4()).subscribe((r)=>{if(r){if(!A)A=G.registerTool(z66)}else A?.dispose(),A=void 0}),E;if(!J.executeMode){let r=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new s91(process.cwd(),{alwaysIncludePaths:r},!0)}else E=new class extends s91{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 em1=tm1.join(yB0||tm1.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")VV("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")VV("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")VV("model.sonnet",Q.useSonnet)}async function Qu1(J){try{await ix8(tm1.dirname(em1),{recursive:!0}),await ax8(em1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function sx8(){try{return(await IB6(em1,"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 AB6=[{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 ${Uw})`},{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:GP.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")}],OB6=(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 EB6=null;function Vm5(){return EB6}function od(J){return{...J,getThreadEnvironment:u91,vfs:ej0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new Xf(J.fileSystem),generateThreadTitle:z16,deleteThread:(Q)=>J.threadService.delete(Q),getServerStatus:()=>pR(J.configService)}}var Yu1=d0.file(ox8.homedir()),PB6=process.env.XDG_CONFIG_HOME?d0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(Yu1,".config");async function pX(J,Q){vA0("0.0.1766332871-gf7f645");let Y=oU1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Y0.of([d0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Yu1,userConfigDir:PB6}),{initializeCLITelemetry:Z}=await Promise.resolve().then(() => (S21(),j21));Z(Y);let X=await Y.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=E86({configService:Y}),K=new Map,q=()=>K.clear(),W=new rM1(Y,J.settings.getWorkspaceRootPath()),H=zx0({configService:Y,filesystem:s9}),F=Cj0({configService:Y,trustStore:W,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(r,p,s)=>{let Q1=`${r}:${p}`,Z1=K.get(Q1);if(Z1)return v.debug("Reusing existing OAuth provider for server",{serverName:r,serverUrl:p}),Z1;v.debug("Creating OAuth provider for server",{serverName:r,serverUrl:p});let n=(async()=>{let o=new YA(J.secrets),i=await o.getClientInfo(r,p),q1=s?.scopes??i?.scopes,T1=a26();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?i26():n26(r);let D1=new nM1({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=Ku({configService:Y,filesystem:s9,spawn:hN,skillToolboxDirs:H.skillToolboxDirs}),{initializeToolProviders:B,startToolProviders:M}=await Promise.resolve().then(() => (LB6(),MB6)),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)xP("JetBrains");else if(Q.ide&&TJ6())xP("VS Code");else if(Q.ide&&CJ6())xP("Neovim");if(J.executeMode)hA0(!0);let A,w=v7.status.pipe(X6((r)=>Boolean(r.connected&&r.authenticated)),I4()).subscribe((r)=>{if(r){if(!A)A=G.registerTool(z66)}else A?.dispose(),A=void 0}),E;if(!J.executeMode){let r=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new s91(process.cwd(),{alwaysIncludePaths:r},!0)}else E=new class extends s91{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 Bw(),process.exit(1)}let P=await Lx0({isDevelopment:!1}),R=new VS1(P,Y),C=new Bj1(P,{lazy:!0}),S=Q.notifications!==void 0?Q.notifications:!J.executeMode,_=R86({playNotificationSound:async(r)=>{if(S){P86(r);let p=ey1(),s=Jx1();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=B16({threadService:R,threadHistoryService:C,configService:Y,isExtensionDevelopment:!1}),m;v7.status.subscribe((r)=>{m=r});let g=new Sq1({workspaceRoots:[d0.file(process.cwd())],getCurrentFile:()=>{if(!m?.openFile)return;try{return d0.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 d0.parse(p)}catch(s){return v.warn("Failed to parse visible file URI",{uri:p,error:s}),null}}).filter((p)=>p!==null)}}),l=new Zx1,Y1={codebaseContextService:g,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:_,fileSystem:Q.jetbrains||Q.ide?rj0:s9,terminal:l};return{...Y1,async asyncDispose(){if(Y1.mcpService.hasAuthenticatingClients())v.info("Waiting for OAuth authentication to complete before exit..."),await Y1.mcpService.waitForAuthentication();for(let r of L.values())r.dispose();await Y1.mcpService.dispose(),q(),await Y1.threadService.asyncDispose(),Y1.configService.unsubscribe(),V(),Y1.fuzzyServer.dispose(),Y1.threadSyncService.dispose(),Y1.settingsStorage[Symbol.dispose](),w.unsubscribe(),A?.dispose()}}}async function Xv8(J){if(!J.executeMode){if(!await Sy1("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 RB6(J)}async function RB6(J){let Q=nx8(32).toString("hex"),Y=await jy1(J.ampURL,Q),Z=new AbortController;try{await _U(Y,Z.signal)}catch(G){v.error("Error opening browser",{error:G})}let X=await jy1(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}),RY.write(`
4868
4868
  Login failed: ${G instanceof Error?G.message:String(G)}
4869
- `),!1}}function $v8(){let J=new eV().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)Sj(),process.exit(0);let F=H.originalError??H;w26(F)}),J.option("-V, --version","Print the version number and exit",()=>{let F;try{F=`, ${_R(new Date("2025-12-21T12:06:34.067Z"))} ago`}catch{}G5.write(`0.0.1766318478-gf7f645 (released 2025-12-21T12:06:34.067Z${F??""})
4869
+ `),!1}}function $v8(){let J=new eV().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)Sj(),process.exit(0);let F=H.originalError??H;w26(F)}),J.option("-V, --version","Print the version number and exit",()=>{let F;try{F=`, ${_R(new Date("2025-12-21T16:06:23.533Z"))} ago`}catch{}G5.write(`0.0.1766332871-gf7f645 (released 2025-12-21T16:06:23.533Z${F??""})
4870
4870
  `),process.exit(0)}),J.addHelpText("after",EJ6()),J.configureHelp({formatHelp:PJ6}),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 My1(U,B.settings))});let Q=async(H,F,U)=>{oU1({storage:F.settings,secretStorage:F.secrets,workspaceRoots:Y0.of([d0.file(process.cwd())]),defaultAmpURL:F.ampURL,homeDir:Yu1,userConfigDir:PB6});let B={...F,executeMode:!1};await Ju1(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 wB6(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)RY.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 wB6(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);EB6=V;let K=od(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(g)=>{let l=await IB6(g,"utf-8"),Y1=JSON.parse(l);if(!w$(Y1.id))throw new b8(HG.invalidThreadId);return AJ1(V,{visibility:Z,agentMode:Q.mode,thread:Y1})},F=async(g)=>{if(!w$(g))throw new b8(HG.invalidThreadId);try{let[Y1,r]=await Promise.all([_9.getThreadLinkInfo({thread:g},{config:V.configService}),_9.getUserInfo({},{config:V.configService})]);if(Y1.ok&&r.ok){let p=Y1.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(Y1){if(Y1 instanceof b8)throw Y1;v.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Y1})}let l=await V.threadService.get(g)??void 0;return v.info(`[fetchAndStartThread] Loaded thread ${g}, agentMode: ${l?.agentMode??"undefined"}`),AJ1(V,{visibility:Z,agentMode:l?void 0:Q.mode,thread:l})},U=async()=>{try{if(Q.threadId)return F(Q.threadId);else return AJ1(V,{visibility:Z,agentMode:Q.mode})}catch(g){if(g instanceof b8)throw g;throw await iu(g,Q.threadId),Error("handleError should have called process.exit()")}},B=async()=>{return AJ1(V,{visibility:Z,agentMode:Q.mode})};if(Q.format==="jsonl")RY.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
4885
- `),await Bw(),process.exit(1);if(J.executeMode&&Q.remote)await UQ6(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)GQ6(V.mcpService,J.settings),await k26(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 iA0();let g=fP({jetbrainsOnly:Q.jetbrains});if(g.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(g.length===1){let l=g[0];if(l)v7.selectConfig(l)}else w=!0}let E=V51("0.0.1766318478-gf7f645",V.settingsStorage),P=new p41(V.threadStorage),R=Y0.of([d0.file(process.cwd())]),C=_q1(void 0,R),S=new K51(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let f=await(async()=>{try{let g=await _9.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(g.ok)return v.info("User free tier status:",g),g.result}catch(g){throw v.error("Failed to fetch free tier status:",g),g}})(),m=await MQ6();v.info("Loaded session state:",m),await Eg1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new c91,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)RY.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 KJ6({...J,workspaceTrust:{current:!0,changes:ky},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 XQ6(J.mcpConfig);Z=$Q6(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=GM0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:BQ6(await My1(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(z26({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.1766318478-gf7f645",buildTimestamp:"2025-12-21T12:06:34.067Z"}),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)}$j1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await Vv8().catch(iu)});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 Bw(),process.exit(1);if(J.executeMode&&Q.remote)await UQ6(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)GQ6(V.mcpService,J.settings),await k26(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 iA0();let g=fP({jetbrainsOnly:Q.jetbrains});if(g.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(g.length===1){let l=g[0];if(l)v7.selectConfig(l)}else w=!0}let E=V51("0.0.1766332871-gf7f645",V.settingsStorage),P=new p41(V.threadStorage),R=Y0.of([d0.file(process.cwd())]),C=_q1(void 0,R),S=new K51(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let f=await(async()=>{try{let g=await _9.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(g.ok)return v.info("User free tier status:",g),g.result}catch(g){throw v.error("Failed to fetch free tier status:",g),g}})(),m=await MQ6();v.info("Loaded session state:",m),await Eg1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new c91,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)RY.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 KJ6({...J,workspaceTrust:{current:!0,changes:ky},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 XQ6(J.mcpConfig);Z=$Q6(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=GM0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:BQ6(await My1(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(z26({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.1766332871-gf7f645",buildTimestamp:"2025-12-21T16:06:23.533Z"}),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)}$j1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await Vv8().catch(iu)});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=OJ1(Y);if(!V)wJ1(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 eS(K,G)).messages.length)uX("Cannot rename an empty thread.");let H=od(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=OJ1(Y);if(!G)wJ1(Y);let K=await eS(G,X),q=Jj(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 Zu1(Y),K=await eS(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=od(G),L=K.id;await G.threadStorage.set(L,K);let A=await s3.getOrCreateForThread(M,L);await A.resume();let w=u41.fromWorker(A),E=new p41(G.threadStorage),P=Y0.of([d0.file(process.cwd())]),R=_q1(void 0,P),C=new K51(G.mcpService,Q.settings.getWorkspaceRootPath()),S=V51("0.0.1766318478-gf7f645",G.settingsStorage),_=Ku({configService:G.configService,filesystem:s9,spawn:hN,skillToolboxDirs:G.skillService.skillToolboxDirs});await Eg1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new c91,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:_,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 iu(V,Y)}}async function zv8(J,Q,Y,Z,X){SG(Z,J);let G=await pX(Q,J);try{let V=OJ1(Y);if(!V)wJ1(Y);let K=V,q=await _9.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=q51(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,W51(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 Zu1(Y),K=await eS(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=od(G),L=K.id;await G.threadStorage.set(L,K);let A=await s3.getOrCreateForThread(M,L);await A.resume();let w=u41.fromWorker(A),E=new p41(G.threadStorage),P=Y0.of([d0.file(process.cwd())]),R=_q1(void 0,P),C=new K51(G.mcpService,Q.settings.getWorkspaceRootPath()),S=V51("0.0.1766332871-gf7f645",G.settingsStorage),_=Ku({configService:G.configService,filesystem:s9,spawn:hN,skillToolboxDirs:G.skillService.skillToolboxDirs});await Eg1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new c91,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:_,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 iu(V,Y)}}async function zv8(J,Q,Y,Z,X){SG(Z,J);let G=await pX(Q,J);try{let V=OJ1(Y);if(!V)wJ1(Y);let K=V,q=await _9.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=q51(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,W51(H)),G5.write(V6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4900
4900
  `);if(X){await eS(K,G);let F=typeof X==="string"?X:void 0;await E_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=od(X);try{let V=await Zu1(Y),q=(await eS(V,X)).messages.length-1,W=await s3.getOrCreateForThread(G,V),H=await Kj(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await Qu1(H),G5.write(`${H}
4902
4902
  `),await X.asyncDispose(),process.exit(0)}catch(V){RY.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.1766318478-gf7f645",
3
+ "version": "0.0.1766332871-gf7f645",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {