@sourcegraph/amp 0.0.1765368086-g2f819e → 0.0.1765368941-g355c71

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
@@ -4090,11 +4090,11 @@ Actual: ${X}`)}async function $28(J,Q,Z){let{execSync:Y}=await import("node:ch
4090
4090
  ${D}`;if(X==="pnpm"&&D.includes("Unable to find the global bin directory"))M+=`
4091
4091
 
4092
4092
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
4093
- 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()}})})}B0();B0();async function H61(J,Q){let Y=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Y}/@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=W28(J,q),H=W<0,z,U;if(K.time){let D=K.time[J],M=K.time[q],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return x.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(X){return x.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function W28(J,Q){let Z=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Y=Z(J),X=Z(Q),G=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Y.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}i0();function z61(J,Q){let Z=new g4,Y=Z.pipe(P8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new VK().scoped("update"),G=Y.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 oT(500),Z.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=TA(),W=await H61(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,D=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},z=await W61();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Z.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Z.next("update-available");return}if(z==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Z.next("update-available");return}try{await Nm(W.latestVersion,z);let U=await OB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Z.next("updated");else X.warn("success with warning",D),Z.next("updated-with-warning")}catch(U){Z.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await oT(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Lq}from"node:process";function d16(J){let Q=new HA().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(Y)=>{await PR1(Y.force||!1,Y.verbose||!1,"0.0.1765368086-g2f819e"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new HA("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(Y)=>{await H28(Y.targetVersion)});J.addCommand(Z)}async function H28(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Lq.write(z4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4093
+ 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()}})})}B0();B0();async function H61(J,Q){let Y=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Y}/@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=W28(J,q),H=W<0,z,U;if(K.time){let D=K.time[J],M=K.time[q],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return x.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(X){return x.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function W28(J,Q){let Z=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Y=Z(J),X=Z(Q),G=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Y.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}i0();function z61(J,Q){let Z=new g4,Y=Z.pipe(P8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new VK().scoped("update"),G=Y.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 oT(500),Z.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=TA(),W=await H61(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,D=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},z=await W61();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Z.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Z.next("update-available");return}if(z==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Z.next("update-available");return}try{await Nm(W.latestVersion,z);let U=await OB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Z.next("updated");else X.warn("success with warning",D),Z.next("updated-with-warning")}catch(U){Z.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await oT(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Lq}from"node:process";function d16(J){let Q=new HA().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(Y)=>{await PR1(Y.force||!1,Y.verbose||!1,"0.0.1765368941-g355c71"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new HA("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(Y)=>{await H28(Y.targetVersion)});J.addCommand(Z)}async function H28(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Lq.write(z4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4094
4094
 
4095
4095
  `));try{if(!J){Lq.write(z4.blue(`Checking for updates...
4096
- `));let Z=TA(),{hasUpdate:Y,latestVersion:X}=await H61("0.0.1765368086-g2f819e",Z);if(!Y){Lq.write(z4.green(`✓ Amp CLI is already up to date: ${"0.0.1765368086-g2f819e"} (${"released"} ${"2025-12-10T12:06:44.881Z"}${`, ${kI(new Date("2025-12-10T12:06:44.881Z"))} ago`})
4097
- `));let V=await OB("0.0.1765368086-g2f819e");if(V.warning)Lq.write(`
4096
+ `));let Z=TA(),{hasUpdate:Y,latestVersion:X}=await H61("0.0.1765368941-g355c71",Z);if(!Y){Lq.write(z4.green(`✓ Amp CLI is already up to date: ${"0.0.1765368941-g355c71"} (${"released"} ${"2025-12-10T12:20:52.541Z"}${`, ${kI(new Date("2025-12-10T12:20:52.541Z"))} ago`})
4097
+ `));let V=await OB("0.0.1765368941-g355c71");if(V.warning)Lq.write(`
4098
4098
  `+z4.yellow(V.warning)+`
4099
4099
  `);process.exit(0)}if(!X)Lq.write(z4.yellow("[WARN] could not find latest version")),process.exit(0);J=X}Lq.write(z4.blue(`Updating to version ${J}...
4100
4100
  `)),await Nm(J,void 0,(Z)=>{Lq.write(z4.dim(`Running: ${Z}
@@ -4728,7 +4728,7 @@ Ctrl-X, Y, Z to unlock`;if(U){let a=W.text.replace(/`([^`]+)`/g,"$1")+`
4728
4728
  `,A)])}),y];if(!q&&!U&&W.url){let b=W.url.replace(/^https?:\/\//,"");g.push(new i5({uri:W.url,text:b,style:new s({color:Z.secondary,underline:!0})}))}if(k&&!U)g.push(k);let d=new Q0({width:40,child:new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:g})});return C4.child(new B6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new tC1({width:T_1,height:R_1,agentMode:this.widget.agentMode,glow:this._glow,t:H,fps:0,shockwaves:this._shockwaves,onShockwave:P,...V==="disabled"&&{seed:42}}),new Q0({width:2}),d]}))}}B0();R8();H4();H7();R8();i0();function Uq8(J,Q){return`${J}:${Q}`}class C_1{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 t1((Q)=>{return this.emitMainThread=(Z)=>Q.next(Z),()=>{this.emitMainThread=null}}),this.subthreadObservable=new t1((Q)=>{return this.emitSubthread=(Z)=>Q.next(Z),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new t1((Q)=>{return this.emitWorkerStatus=(Z)=>Q.next(Z),()=>{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 Z=this.threadService.observePatches(Q).pipe(oD()).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,Z);let Y=J.status.subscribe((G)=>{if(this.workers.set(Q,G),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:G})});this.workerStatusSubs.set(Q,Y);let X=J.subthreads.subscribe((G)=>{this.subthreadsMap.set(Q,G);for(let V of G){let K=Uq8(Q,V.toolUse.id);if(this.subthreadPatchSubs.has(K))continue;let q=this.threadService.observePatches(V.threadID).pipe(oD()).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 Z=this.workerStatusSubs.get(J);if(Z)Z.unsubscribe(),this.workerStatusSubs.delete(J);let Y=this.subthreadsSubs.get(J);if(Y)Y.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 t1((Q)=>{return this.mainThreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),subthreads:new t1((Q)=>{return this.subthreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),workerStatus:new t1((Q)=>{return this.workerStatusObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})})}}get threadViewStates(){let J={};for(let[Q,Z]of this.threadsMap){let Y=this.workers.get(Q);if(Y)J[Q]=aL(Z,Y)}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 Bq8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Z,subthread:Y}=Q,X=J.subagents[Y.threadID];if(!X){if(X={subThreadID:Z.id,parentToolID:Y.toolUse.id,taskDescription:Y.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=bJ(J.mainThread);X.isCompleted=b76(W,Y.toolUse.id)}}let G=Nq8(Z,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=zC(Z).items.filter((W)=>W.type==="toolResult");for(let W of q)K[W.id]={id:W.id,subthreadID:Z.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[Y.threadID]:V},tools:K,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Z,subthreads:Y,workerStatus:X}=Q,G=bJ(Z),V={...J.subagents};for(let z of Y){let U=V[z.threadID];if(!U)continue;let D=b76(G,z.toolUse.id);V[z.threadID]={...U,isCompleted:D}}let{items:K}=zC(Z),q=aL(Z,X),W=xE({messages:Z.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:V,items:K,viewState:q,todosList:H,mainThread:Z}}case"worker-status-change":{if(!J.mainThread)return J;let Z=aL(J.mainThread,Q.workerStatus);if(Z===J.viewState)return J;return{...J,viewState:Z}}default:return J}}function zC(J){let Q=[],Z=new Map,Y=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(Z.set(W.id,W),K)Y.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 z=X+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let D of U.content)if(D.type==="tool_result"&&D.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=Z.get(q.toolUseID)??qY(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 b76(J,Q){let Z=J.get(Q);return(Z&&V2(Z.run))??!1}function Nq8(J,Q){let Z=J.messages.at(-1);if(Z?.content.some((X)=>X.type==="tool_result"&&X.run.status==="blocked-on-user"))return x.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(zC(J).items.some((X)=>X.type==="toolResult"&&X.toolResult.run.status==="in-progress")){let X=Q?.type==="running-tools"?Q.startTime:Date.now();return x.info("Subagent status: running-tools",{threadID:J.id,startTime:X,hasStartTime:!!X}),{type:"running-tools",startTime:X}}if(Z&&Z.role==="assistant"&&Z.state.type==="streaming")switch(Z.content.at(-1)?.type){case"text":return x.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return x.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 x.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}default:return x.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return x.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class j_1 extends p0{props;constructor(J){super();this.props=J}createState(){return new m76}}class m76 extends u0{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 C_1(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),Z=Q.mainThread.subscribe((G)=>{this.dispatch({type:"main-thread-patch",thread:G.mainThread,subthreads:G.subthreads,workerStatus:G.workerStatus})});this.subscriptions.push(Z);let Y=Q.subthreads.subscribe((G)=>{this.dispatch({type:"subthread-patch",thread:G.thread,subthread:G.subthread})});this.subscriptions.push(Y);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=Bq8(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 Z=(G)=>G===A5||G===n8||G===KY,Y=new Map;for(let G of this.state.items)if(G.type==="toolResult"&&Z(G.toolUse.name))Y.set(G.toolUse.id,{toolUseId:G.toolUse.id,toolName:G.toolUse.name,toolRun:G.toolResult.run});let X=Array.from(Y.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 z of H.tool_uses){let U=`${G}:progress:${W++}`;K.push({toolUse:_E(z.tool_name,z.input,U),toolRun:{status:z.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,(Z)=>this.switchWorker(Z),()=>this.currentWorker,this.recentThreadIDs)}}class S_1 extends p0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new g76}}class g76 extends u0{build(J){let Z=X6.of(J).colors,{todos:Y,title:X="TODOs"}=this.widget.props;if(!Array.isArray(Y)||Y.length===0)return new Q0({width:0,height:0});let G=Y.map((V)=>this.buildTodoItem(V,Z));return new b0({child:new q6({padding:H0.symmetric(1,0),child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new S1({text:new l(X,new s({bold:!0,color:Z.foreground}))}),...G]})})})}buildTodoItem(J,Q){let Z=this.getStatusIcon(J.status),Y=J.status==="completed",X=new s({bold:J.status==="in-progress",color:Q.foreground,dim:Y}),G=new s({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:Y});return new B6({crossAxisAlignment:"start",children:[new S1({text:new l(Z,X)}),new Q0({width:1}),new d6({child:new S1({text:new l(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class __1 extends E6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Z,onButtonClick:Y}){super({key:J});this.ad=Q,this.onDismiss=Z,this.onButtonClick=Y}build(J){let Q=X6.of(J),Z=Q.colors.primary,Y=Q.colors.foreground;return new b0({decoration:new N8(void 0,new F4(new $4(Z,1,"rounded"),new $4(Z,1,"rounded"),void 0,new $4(Z,1,"rounded"))),child:new q6({padding:H0.horizontal(1),child:new x0({children:[new B6({crossAxisAlignment:"start",children:[new d6({child:new S1({text:new l(this.ad.content,new s({color:Y}))})}),new Q0({width:4}),new i5({uri:"https://ampcode.com/free",text:"Ad",style:new s({color:Y,dim:!0})})]}),new B6({crossAxisAlignment:"start",children:[new qj1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:H0.horizontal(1),color:Z,reverse:!0}),new Q0({width:2}),new S1({text:new l(this.ad.destinationUrlHostname,new s({color:Y,dim:!0}))})]})]})})})}}class k_1 extends p0{props;constructor(J){super();this.props=J}createState(){return new u76(this.props.autofocus??!0)}}class u76 extends u0{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"},Z=S4.sizeOf(J),Y=Math.min(60,Z.width-4),X=Z.height-4,G=[];if(this.widget.props.title)G.push(new S1({text:new l(this.widget.props.title,new s({bold:!0,color:H1.blue}))}),new Q0({height:1}));if(this.widget.props.message)G.push(new S1({text:new l(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 S1({text:new l("Enter to copy",new s({dim:!0}))}));return V.push(new S1({text:new l("Escape to close",new s({dim:!0}))})),G.push(new B6({children:V.flatMap((K,q)=>q<V.length-1?[K,new Q0({width:1}),new S1({text:new l("•",new s({dim:!0}))}),new Q0({width:1})]:[K]),mainAxisSize:"min"})),new C4({child:new b0({constraints:new L6(Y,Y,0,X),decoration:new N8(H1.default(),new F4(new $4(H1.blue,1,"rounded"),new $4(H1.blue,1,"rounded"),new $4(H1.blue,1,"rounded"),new $4(H1.blue,1,"rounded"))),padding:new H0(2,2,2,2),child:new z8({autofocus:this.autofocus,onKey:Q,child:new x0({children:G,mainAxisSize:"min"})})})})}}class d81 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,d81.prototype)}}class c81 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,c81.prototype)}}function y_1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Z)=>{if(Z.startsWith('"')&&Z.endsWith('"')||Z.startsWith("'")&&Z.endsWith("'"))return Z.slice(1,-1);return Z})}dW();B0();import{spawn as Dq8}from"node:child_process";import{promises as Mq8}from"node:fs";function p76(J){return J.kind==="executable"}function d76(J){return J.kind==="markdown"}var Jz=50000,c76=300000;async function x_1(J,Q,Z,Y={}){let{timeoutMs:X=c76,signal:G,source:V}=Y;try{let K=await Z.getCommand(J,V);if(!K)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Z.isCommandAvailable(J,V))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(x.debug("Executing command",{commandName:J,filePath:K.filePath,args:Q}),d76(K))return await Lq8(K,Q);else if(p76(K))return await Aq8(K,Q,X,G);else return{success:!1,output:"",error:"Unsupported command type"}}catch(K){return x.error("Failed to execute command",{commandName:J,error:K}),{success:!1,output:"",error:K instanceof Error?K.message:"Unknown error occurred"}}}async function Lq8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await Mq8.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>Jz?Z.slice(0,Jz)+`
4729
4729
  ... (output truncated at ${Jz} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function Aq8(J,Q,Z=c76,Y){return new Promise((X)=>{let[G,V]=Oq8(J,Q);x.debug("Spawning command",{spawnCommand:G,spawnArgs:V.slice(0,10),filePath:J.filePath,timeoutMs:Z});let K=KO0(Y),q=!1,W=setTimeout(()=>{q=!0,K.abort(),x.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),H=Dq8(G,V,{stdio:["pipe","pipe","pipe"],signal:K.signal,detached:!0}),z=[],U=[],D=0;H.stdout?.on("data",(M)=>{let L=M.toString();if(D+=L.length,D<=Jz)z.push(L);else{let A=Jz-(D-L.length);if(A>0)z.push(L.slice(0,A))}}),H.stderr?.on("data",(M)=>{let L=M.toString();if(D+=L.length,D<=Jz)U.push(L);else{let A=Jz-(D-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(M)=>{if(clearTimeout(W),q){X({success:!1,output:z.join(""),error:`Command timed out after ${Z}ms`,exitCode:void 0});return}if(K.signal.aborted){X({success:!1,output:z.join(""),error:"The command was aborted",exitCode:M??void 0});return}let L=M===0||M===1,A=z.join(""),E=U.join(""),I=A;if(!L&&!A.trim()&&E.trim())I=E;else if(E.trim())I+=A?`
4730
4730
  ${E}`:E;if(D>Jz)I+=`
4731
- ... (output truncated at ${Jz} characters)`;X({success:L,output:I.trim(),error:!L?E.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 ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:z.join(""),error:L})})})}function Oq8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return Eq8(Z,Y?[...Y]:null,X,Q);else return wq8(Z,Y?[...Y]:null,X,Q)}function wq8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function Eq8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Y]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Y]];case".exe":return[J,Y];default:return[J,Y]}}B0();FG();T7();HK();NY();xG();cW();fK();R8();H7();B_();i0();var L26=H6(BP(),1);import{writeFile as N26}from"fs/promises";import D26 from"path";B0();NY();class v_1{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,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1765368086-g2f819e"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Wo(Q,this.configService)}catch(Q){x.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 FC extends p0{props;constructor(J){super();this.props=J}createState(){return new l76}}class l76 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Z)=>{this.setState(()=>{this._state=Z(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class i76 extends u0{controller=new bZ;focusNode=new $8({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=X6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=F4.all(new $4(Z.foreground,1,"solid")),q=new rH({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let M=D.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Z.foreground,border:null},maxLines:1}),W=new B6({children:[new b0({decoration:{color:H1.default()},child:new S1({text:new l(">",new s({color:Z.foreground}))})}),new d6({child:q})]}),H=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l("",void 0,[new l("Command: ",new s({color:Z.foreground})),new l(this.widget.props.commandName,new s({color:H1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new l("Enter",new s({color:Y.keybind}))),z.push(new l(" to submit, ",new s({color:Z.foreground,dim:!0})));z.push(new l("Esc",new s({color:Y.keybind}))),z.push(new l(" to cancel",new s({color:Z.foreground,dim:!0})));let U=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l("",void 0,z)})});return new b0({decoration:{border:K,color:H1.default()},padding:H0.all(1),child:new x0({children:[H,new Q0({height:1}),W,new J5,U]})})}}class l81 extends p0{props;constructor(J){super();this.props=J}createState(){return new i76}}cW();class n76 extends u0{controller=new bZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new $8({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>=pF)return!1;let Q=rR(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=X6.of(J),{colors:Z,app:Y}=Q,G=S4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new sA({controller:this.controller,triggers:[new lB],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Z,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:o8.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new z8({focusNode:this.focusNode,child:K}),W=new b0({constraints:new L6({maxHeight:V}),padding:H0.symmetric(1,0),child:q}),H=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l("",void 0,[new l("Command: ",new s({color:Z.foreground})),new l(this.widget.props.commandName,new s({color:H1.yellow,bold:!0}))])})}),z=new b0({padding:H0.symmetric(1,0),child:new S1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new s({color:Y.keybind})),new l(" again to clear input",new s({color:Z.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new s({color:Z.foreground,dim:!0})),new l("Enter",new s({color:Y.keybind})),new l(" to submit, ",new s({color:Z.foreground,dim:!0})),new l("Esc",new s({color:Y.keybind})),new l(" to clear",new s({color:Z.foreground,dim:!0}))])})}),U=[H,new Q0({height:1}),new d6({child:W}),new Q0({height:1}),z];return new b0({decoration:{border:F4.all(new $4(Z.foreground,1,"solid")),color:H1.default()},padding:H0.all(1),child:new x0({children:U})})}}class UC extends p0{props;constructor(J){super();this.props=J}createState(){return new n76}}import{isDeepStrictEqual as Rq8}from"node:util";var Iq8=/[\\/_ +.#"@[({&]/,Pq8=/[\\/_ +.#"@[({&]/g,Tq8=/[\s-]/,a76=/[\s-]/g;function n81(J,Q,Z,Y,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=Y.charAt(G),W=Z.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=n81(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(Tq8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(a76),M&&X>0)z*=Math.pow(0.999,M.length)}else if(Iq8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(Pq8),D&&X>0)z*=Math.pow(0.999,D.length)}else if(z*=0.3,X>0)z*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))z*=0.9999}if(z<0.1&&(Z.charAt(W-1)===Y.charAt(G+1)||Y.charAt(G+1)===Y.charAt(G)&&Z.charAt(W-1)!==Y.charAt(G))){if(U=n81(J,Q,Z,Y,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Z.indexOf(q,W+1)}return V[K]=H,H}function i81(J){return J.toLowerCase().replace(a76," ")}function o76(J,Q){let Z=n81(J,Q,i81(J),i81(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=n81(J,K,i81(J),i81(K),0,0,{});if(q===0)return Z;X+=q,G+=K.length}let V=X/Y.length*0.95;return Math.max(Z,V)}return Z}class BC{}class NC{}class a81{}class o81{}class r76 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new s76}}class s76 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function Cq8(J,Q){if(J==="")return{matches:!0,score:1};let Z=o76(Q,J);return{matches:Z>0.15,score:Z}}class NJ extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new t76}}class t76 extends u0{controller=new bZ;focusNode;scrollController=new l5;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new $8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),u8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!Rq8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof BC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof NC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof a81){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Z=Q[this.selectedIndex];if(Z){if(!(this.widget.props.isItemDisabled?.(Z)??!1))this.widget.props.onAccept(Z)}}return"handled"}if(J instanceof o81)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...Cq8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,Y)=>this.widget.props.sortItems(Z,Y,J):(Z,Y)=>Y.score-Z.score).map((Z)=>Z.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Z=0,Y=Q.size.height;p41(J,{top:Z,bottom:Y},{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(),u8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Z=this.getFilteredItems();if(J>=0&&J<Z.length){let Y=Z[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Z[this.selectedIndex]??null);else if(Q===2&&!X){if(Y)this.widget.props.onAccept(Y)}}};build(J){let Q=X6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=F4.all(new $4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new rH({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new lY({shortcuts:new Map([[new Y4("ArrowDown"),new BC],[new Y4("ArrowUp"),new NC],[new Y4("Tab"),new BC],[new Y4("Tab",{shift:!0}),new NC],[new Y4("n",{ctrl:!0}),new BC],[new Y4("p",{ctrl:!0}),new NC],[new Y4("Enter"),new a81],[new Y4("Escape"),new o81]]),focusNode:this.focusNode,child:V}),q=new HJ({actions:new Map([[BC,new w8(this.invoke)],[NC,new w8(this.invoke)],[a81,new w8(this.invoke)],[o81,new w8(this.invoke)]]),child:K}),W=new B6({children:[new b0({decoration:{color:H1.default()},child:new S1({text:new l(">",new s({color:Z.foreground}))})}),new d6({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 C4({child:new S1({text:new l(L,new s({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new d6({child:new C4({child:new S1({text:new l(this.widget.props.emptyStateText,new s({color:Z.foreground,dim:!0}))})})});else{let L=Y.map((A,E)=>{let I=E===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,I,P,J);else{let k=I?H1.yellow:void 0,y=I?H1.black:Z.foreground;R=new b0({decoration:k?{color:k}:void 0,padding:H0.symmetric(2,0),child:new S1({text:new l(this.widget.props.getLabel(A),new s({color:y,dim:P}))})})}return new r76(new G8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new x0({children:L,crossAxisAlignment:"start"})}let z=new d6({child:new G8({onScroll:this.handleScroll,opaque:!1,child:new q5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l(this.widget.props.title,new s({color:H1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Q0({height:1}),z),this.controller.text!==""){let L=Y.length>0?Y[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new b0({padding:H0.vertical(1),child:new C4({child:A})}));else U.push(new Q0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new b0({decoration:{border:X,color:H1.default()},padding:H0.symmetric(1,0),child:new x0({children:U})})}}function e76(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class f_1 extends E6{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()),Z=Math.max(0,...Q.map((X)=>e76(X.pubDate).length));return new NJ({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=X6.of(K),{colors:W}=q,H=G?H1.yellow:void 0,z=G?H1.black:W.foreground,U=H1.index(8),D=(M,L)=>new Q0({width:L,child:B6.end([new S1({text:new l(M,new s({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new B6({children:[new d6({child:new S1({text:new l(X.title,new s({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),D(e76(X.pubDate),Z)]})})}})}}class h_1 extends p0{createState(){return new J26}}class J26 extends u0{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 S1({text:new l("●",new s({color:this.isGreen?H1.green:H1.index(8),bold:!0})),maxLines:1})}}function jq8(J){let Q=new Map,Z=new Map,Y=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){Y.set(V.id,K.type);let q=K.threadID,W=Z.get(q)||[];W.push(V),Z.set(q,W)}else X.push(V)}return nY.flatten(X,(V)=>Z.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function b_1(J,Q,Z){return new S1({text:new l(`${J}${Q}`,new s({color:Z})),maxLines:1})}function Sq8(J,Q,Z,Y){return[b_1("+",J,Y.success),J5.horizontal(1),b_1("~",Q,Y.warning),J5.horizontal(1),b_1("-",Z,Y.destructive)]}class r81 extends E6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Z=this.props.recentThreadIDs||[],Y=this.props.currentThreadID,X=[...Q].sort((H,z)=>{if(Y){if(H.id===Y)return-1;if(z.id===Y)return 1}let U=Z.indexOf(H.id),D=Z.indexOf(z.id);if(U!==-1&&D!==-1)return U-D;if(U!==-1)return-1;if(D!==-1)return 1;return 0}),G=jq8(X),V=Math.max(0,...G.map((H)=>H.description.timeAgo.length)),K=X6.of(J),q=new q6({padding:H0.symmetric(0,1),child:new C4({child:new S1({text:new l("",new s({color:K.colors.foreground,dim:!0}),[new l("Ctrl+T",new s({color:H1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new s({color:K.colors.foreground,dim:!0}))])})})});return new NJ({items:G,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:q,renderItem:(H,z,U,D)=>{let M=X6.of(D),{colors:L}=M,A=z?H1.yellow:void 0,E=z?H1.black:L.foreground,I=H1.index(8),P=(G1,e)=>new Q0({width:e,child:B6.end([new S1({text:new l(G1,new s({color:I}))})])}),R=this.props.threadViewStates[H.id],k=[],y=H.relationshipType==="handoff",v=new o41;if(H.depth>0){let G1=[],e=H.ancestorsAreLast.slice(1);for(let q1 of e)G1.push(new l(v.getAncestorPrefix(q1),new s({color:v.connectorColor,dim:v.connectorDim})));let c=H.isLast?v.elbow:v.tee,J1=v.getConnectorText(c);G1.push(new l(J1,new s({color:v.connectorColor,dim:v.connectorDim}))),k.push(new S1({text:new l("",void 0,G1)}))}let g=[],d=this.props.currentThreadID===H.id?new l("(current) ",new s({color:H1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new l("(visited) ",new s({color:L.foreground,dim:!0})):null;if(d)g.push(new S1({text:d}));if(R){if(R.state==="active"&&(R.interactionState==="tool-running"||R.interactionState===!1))g.push(new h_1),g.push(new Q0({width:1}))}let b=H.title;if(H.relationshipType==="fork"){let G1=b.match(/^Forked\((\d+)\): /);if(G1)b=b.slice(G1[0].length);else while(b.startsWith("Forked: "))b=b.slice(8);g.push(new S1({text:new l("[fork] ",new s({color:H1.blue}))}))}else if(y)g.push(new S1({text:new l("[handoff] ",new s({color:H1.index(208)}))}));if(H.agentMode==="plan"&&H.hasPlan)g.push(new S1({text:new l("[plan] ",new s({color:H1.magenta}))}));if(g.push(new d6({child:new S1({text:new l(b,new s({color:E})),overflow:"ellipsis",maxLines:1})})),g.push(new Q0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let G1=z?{success:I,warning:I,destructive:I}:L;g.push(...Sq8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,G1)),g.push(new Q0({width:2}))}return g.push(P(H.description.timeAgo,V)),new b0({decoration:A?{color:A}:void 0,padding:H0.symmetric(2,0),child:new B6({children:[...k,...g]})})}})}}function Q26(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class m_1 extends E6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Z=Math.max(0,...Q.map((X)=>Q26(X.pubDate).length));return new NJ({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=X6.of(K),{colors:W}=q,H=G?H1.yellow:void 0,z=G?H1.black:W.foreground,U=H1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new Q0({width:A,child:B6.end([new S1({text:new l(L,new s({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new B6({children:[new d6({child:new S1({text:new l(X.title,new s({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),new S1({text:new l(D,new s({color:U})),maxLines:1}),new Q0({width:2}),M(Q26(X.pubDate),Z)]})})}})}}class g_1 extends E6{props;constructor(J){super();this.props=J}build(){return new C4({child:new S1({text:new l("",void 0,[new l(`Forked to new thread:
4731
+ ... (output truncated at ${Jz} characters)`;X({success:L,output:I.trim(),error:!L?E.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 ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:z.join(""),error:L})})})}function Oq8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return Eq8(Z,Y?[...Y]:null,X,Q);else return wq8(Z,Y?[...Y]:null,X,Q)}function wq8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function Eq8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Y]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Y]];case".exe":return[J,Y];default:return[J,Y]}}B0();FG();T7();HK();NY();xG();cW();fK();R8();H7();B_();i0();var L26=H6(BP(),1);import{writeFile as N26}from"fs/promises";import D26 from"path";B0();NY();class v_1{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,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1765368941-g355c71"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Wo(Q,this.configService)}catch(Q){x.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 FC extends p0{props;constructor(J){super();this.props=J}createState(){return new l76}}class l76 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Z)=>{this.setState(()=>{this._state=Z(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class i76 extends u0{controller=new bZ;focusNode=new $8({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=X6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=F4.all(new $4(Z.foreground,1,"solid")),q=new rH({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let M=D.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Z.foreground,border:null},maxLines:1}),W=new B6({children:[new b0({decoration:{color:H1.default()},child:new S1({text:new l(">",new s({color:Z.foreground}))})}),new d6({child:q})]}),H=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l("",void 0,[new l("Command: ",new s({color:Z.foreground})),new l(this.widget.props.commandName,new s({color:H1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new l("Enter",new s({color:Y.keybind}))),z.push(new l(" to submit, ",new s({color:Z.foreground,dim:!0})));z.push(new l("Esc",new s({color:Y.keybind}))),z.push(new l(" to cancel",new s({color:Z.foreground,dim:!0})));let U=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l("",void 0,z)})});return new b0({decoration:{border:K,color:H1.default()},padding:H0.all(1),child:new x0({children:[H,new Q0({height:1}),W,new J5,U]})})}}class l81 extends p0{props;constructor(J){super();this.props=J}createState(){return new i76}}cW();class n76 extends u0{controller=new bZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new $8({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>=pF)return!1;let Q=rR(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=X6.of(J),{colors:Z,app:Y}=Q,G=S4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new sA({controller:this.controller,triggers:[new lB],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Z,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:o8.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new z8({focusNode:this.focusNode,child:K}),W=new b0({constraints:new L6({maxHeight:V}),padding:H0.symmetric(1,0),child:q}),H=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l("",void 0,[new l("Command: ",new s({color:Z.foreground})),new l(this.widget.props.commandName,new s({color:H1.yellow,bold:!0}))])})}),z=new b0({padding:H0.symmetric(1,0),child:new S1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new s({color:Y.keybind})),new l(" again to clear input",new s({color:Z.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new s({color:Z.foreground,dim:!0})),new l("Enter",new s({color:Y.keybind})),new l(" to submit, ",new s({color:Z.foreground,dim:!0})),new l("Esc",new s({color:Y.keybind})),new l(" to clear",new s({color:Z.foreground,dim:!0}))])})}),U=[H,new Q0({height:1}),new d6({child:W}),new Q0({height:1}),z];return new b0({decoration:{border:F4.all(new $4(Z.foreground,1,"solid")),color:H1.default()},padding:H0.all(1),child:new x0({children:U})})}}class UC extends p0{props;constructor(J){super();this.props=J}createState(){return new n76}}import{isDeepStrictEqual as Rq8}from"node:util";var Iq8=/[\\/_ +.#"@[({&]/,Pq8=/[\\/_ +.#"@[({&]/g,Tq8=/[\s-]/,a76=/[\s-]/g;function n81(J,Q,Z,Y,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=Y.charAt(G),W=Z.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=n81(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(Tq8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(a76),M&&X>0)z*=Math.pow(0.999,M.length)}else if(Iq8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(Pq8),D&&X>0)z*=Math.pow(0.999,D.length)}else if(z*=0.3,X>0)z*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))z*=0.9999}if(z<0.1&&(Z.charAt(W-1)===Y.charAt(G+1)||Y.charAt(G+1)===Y.charAt(G)&&Z.charAt(W-1)!==Y.charAt(G))){if(U=n81(J,Q,Z,Y,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Z.indexOf(q,W+1)}return V[K]=H,H}function i81(J){return J.toLowerCase().replace(a76," ")}function o76(J,Q){let Z=n81(J,Q,i81(J),i81(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=n81(J,K,i81(J),i81(K),0,0,{});if(q===0)return Z;X+=q,G+=K.length}let V=X/Y.length*0.95;return Math.max(Z,V)}return Z}class BC{}class NC{}class a81{}class o81{}class r76 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new s76}}class s76 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function Cq8(J,Q){if(J==="")return{matches:!0,score:1};let Z=o76(Q,J);return{matches:Z>0.15,score:Z}}class NJ extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new t76}}class t76 extends u0{controller=new bZ;focusNode;scrollController=new l5;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new $8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),u8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!Rq8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof BC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof NC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof a81){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Z=Q[this.selectedIndex];if(Z){if(!(this.widget.props.isItemDisabled?.(Z)??!1))this.widget.props.onAccept(Z)}}return"handled"}if(J instanceof o81)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...Cq8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,Y)=>this.widget.props.sortItems(Z,Y,J):(Z,Y)=>Y.score-Z.score).map((Z)=>Z.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Z=0,Y=Q.size.height;p41(J,{top:Z,bottom:Y},{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(),u8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Z=this.getFilteredItems();if(J>=0&&J<Z.length){let Y=Z[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Z[this.selectedIndex]??null);else if(Q===2&&!X){if(Y)this.widget.props.onAccept(Y)}}};build(J){let Q=X6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=F4.all(new $4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new rH({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new lY({shortcuts:new Map([[new Y4("ArrowDown"),new BC],[new Y4("ArrowUp"),new NC],[new Y4("Tab"),new BC],[new Y4("Tab",{shift:!0}),new NC],[new Y4("n",{ctrl:!0}),new BC],[new Y4("p",{ctrl:!0}),new NC],[new Y4("Enter"),new a81],[new Y4("Escape"),new o81]]),focusNode:this.focusNode,child:V}),q=new HJ({actions:new Map([[BC,new w8(this.invoke)],[NC,new w8(this.invoke)],[a81,new w8(this.invoke)],[o81,new w8(this.invoke)]]),child:K}),W=new B6({children:[new b0({decoration:{color:H1.default()},child:new S1({text:new l(">",new s({color:Z.foreground}))})}),new d6({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 C4({child:new S1({text:new l(L,new s({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new d6({child:new C4({child:new S1({text:new l(this.widget.props.emptyStateText,new s({color:Z.foreground,dim:!0}))})})});else{let L=Y.map((A,E)=>{let I=E===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,I,P,J);else{let k=I?H1.yellow:void 0,y=I?H1.black:Z.foreground;R=new b0({decoration:k?{color:k}:void 0,padding:H0.symmetric(2,0),child:new S1({text:new l(this.widget.props.getLabel(A),new s({color:y,dim:P}))})})}return new r76(new G8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new x0({children:L,crossAxisAlignment:"start"})}let z=new d6({child:new G8({onScroll:this.handleScroll,opaque:!1,child:new q5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l(this.widget.props.title,new s({color:H1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Q0({height:1}),z),this.controller.text!==""){let L=Y.length>0?Y[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new b0({padding:H0.vertical(1),child:new C4({child:A})}));else U.push(new Q0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new b0({decoration:{border:X,color:H1.default()},padding:H0.symmetric(1,0),child:new x0({children:U})})}}function e76(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class f_1 extends E6{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()),Z=Math.max(0,...Q.map((X)=>e76(X.pubDate).length));return new NJ({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=X6.of(K),{colors:W}=q,H=G?H1.yellow:void 0,z=G?H1.black:W.foreground,U=H1.index(8),D=(M,L)=>new Q0({width:L,child:B6.end([new S1({text:new l(M,new s({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new B6({children:[new d6({child:new S1({text:new l(X.title,new s({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),D(e76(X.pubDate),Z)]})})}})}}class h_1 extends p0{createState(){return new J26}}class J26 extends u0{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 S1({text:new l("●",new s({color:this.isGreen?H1.green:H1.index(8),bold:!0})),maxLines:1})}}function jq8(J){let Q=new Map,Z=new Map,Y=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){Y.set(V.id,K.type);let q=K.threadID,W=Z.get(q)||[];W.push(V),Z.set(q,W)}else X.push(V)}return nY.flatten(X,(V)=>Z.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function b_1(J,Q,Z){return new S1({text:new l(`${J}${Q}`,new s({color:Z})),maxLines:1})}function Sq8(J,Q,Z,Y){return[b_1("+",J,Y.success),J5.horizontal(1),b_1("~",Q,Y.warning),J5.horizontal(1),b_1("-",Z,Y.destructive)]}class r81 extends E6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Z=this.props.recentThreadIDs||[],Y=this.props.currentThreadID,X=[...Q].sort((H,z)=>{if(Y){if(H.id===Y)return-1;if(z.id===Y)return 1}let U=Z.indexOf(H.id),D=Z.indexOf(z.id);if(U!==-1&&D!==-1)return U-D;if(U!==-1)return-1;if(D!==-1)return 1;return 0}),G=jq8(X),V=Math.max(0,...G.map((H)=>H.description.timeAgo.length)),K=X6.of(J),q=new q6({padding:H0.symmetric(0,1),child:new C4({child:new S1({text:new l("",new s({color:K.colors.foreground,dim:!0}),[new l("Ctrl+T",new s({color:H1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new s({color:K.colors.foreground,dim:!0}))])})})});return new NJ({items:G,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:q,renderItem:(H,z,U,D)=>{let M=X6.of(D),{colors:L}=M,A=z?H1.yellow:void 0,E=z?H1.black:L.foreground,I=H1.index(8),P=(G1,e)=>new Q0({width:e,child:B6.end([new S1({text:new l(G1,new s({color:I}))})])}),R=this.props.threadViewStates[H.id],k=[],y=H.relationshipType==="handoff",v=new o41;if(H.depth>0){let G1=[],e=H.ancestorsAreLast.slice(1);for(let q1 of e)G1.push(new l(v.getAncestorPrefix(q1),new s({color:v.connectorColor,dim:v.connectorDim})));let c=H.isLast?v.elbow:v.tee,J1=v.getConnectorText(c);G1.push(new l(J1,new s({color:v.connectorColor,dim:v.connectorDim}))),k.push(new S1({text:new l("",void 0,G1)}))}let g=[],d=this.props.currentThreadID===H.id?new l("(current) ",new s({color:H1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new l("(visited) ",new s({color:L.foreground,dim:!0})):null;if(d)g.push(new S1({text:d}));if(R){if(R.state==="active"&&(R.interactionState==="tool-running"||R.interactionState===!1))g.push(new h_1),g.push(new Q0({width:1}))}let b=H.title;if(H.relationshipType==="fork"){let G1=b.match(/^Forked\((\d+)\): /);if(G1)b=b.slice(G1[0].length);else while(b.startsWith("Forked: "))b=b.slice(8);g.push(new S1({text:new l("[fork] ",new s({color:H1.blue}))}))}else if(y)g.push(new S1({text:new l("[handoff] ",new s({color:H1.index(208)}))}));if(H.agentMode==="plan"&&H.hasPlan)g.push(new S1({text:new l("[plan] ",new s({color:H1.magenta}))}));if(g.push(new d6({child:new S1({text:new l(b,new s({color:E})),overflow:"ellipsis",maxLines:1})})),g.push(new Q0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let G1=z?{success:I,warning:I,destructive:I}:L;g.push(...Sq8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,G1)),g.push(new Q0({width:2}))}return g.push(P(H.description.timeAgo,V)),new b0({decoration:A?{color:A}:void 0,padding:H0.symmetric(2,0),child:new B6({children:[...k,...g]})})}})}}function Q26(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class m_1 extends E6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Z=Math.max(0,...Q.map((X)=>Q26(X.pubDate).length));return new NJ({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=X6.of(K),{colors:W}=q,H=G?H1.yellow:void 0,z=G?H1.black:W.foreground,U=H1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new Q0({width:A,child:B6.end([new S1({text:new l(L,new s({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new B6({children:[new d6({child:new S1({text:new l(X.title,new s({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),new S1({text:new l(D,new s({color:U})),maxLines:1}),new Q0({width:2}),M(Q26(X.pubDate),Z)]})})}})}}class g_1 extends E6{props;constructor(J){super();this.props=J}build(){return new C4({child:new S1({text:new l("",void 0,[new l(`Forked to new thread:
4732
4732
 
4733
4733
  `,new s({color:H1.white,dim:!0})),new l(`"${this.props.newThreadTitle||"Untitled"}"`,new s({color:H1.white}))]),textAlign:"center"})})}}B0();class Z26 extends u0{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){x.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){x.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}buildItemsWithCreateOption(){let J=this.widget.props.currentLabels||[],Z=[...this.labels.filter((Y)=>!J.includes(Y.name))];if(this.currentQuery.trim().length>0&&!this.isLoading){let Y=this.currentQuery.trim().toLowerCase(),X=this.labels.some((V)=>V.name===Y),G=J.includes(Y);if(!X&&!G&&this.isValidLabelName(Y))Z.unshift({id:"__create__",name:Y,createdAt:"",__isCreateMarker:!0})}return Z}build(J){let Q=X6.of(J),{colors:Z}=Q,Y=this.currentQuery.trim().toLowerCase(),X=Y.length>0?this.getValidationError(Y):null;return new NJ({title:"Add Label",items:this.buildItemsWithCreateOption(),getLabel:(G)=>G.name,onAccept:(G)=>{this.widget.props.onSelect(G.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:X||"Type to create a new label",renderItem:(G,V,K,q)=>{let W=V?H1.yellow:void 0,H=V?H1.black:Z.foreground;if("__isCreateMarker"in G&&G.__isCreateMarker)return new b0({decoration:W?{color:W}:void 0,padding:H0.symmetric(2,0),child:new S1({text:new l("",void 0,[new l("Create: ",new s({color:H})),new l(G.name,new s({color:H,bold:!0}))])})});return new b0({decoration:W?{color:W}:void 0,padding:H0.symmetric(2,0),child:new S1({text:new l(G.name,new s({color:H}))})})},filterItem:(G,V)=>{let K=this.currentQuery;if(this.currentQuery=V,K!==V)this.setState();if("__isCreateMarker"in G&&G.__isCreateMarker)return!0;let W=V.trim().toLowerCase();return W.length===0||G.name.includes(W)}})}}class u_1 extends p0{props;constructor(J){super();this.props=J}createState(){return new Z26}}class yq extends p0{props;constructor(J){super();this.props=J}createState(){return new Y26}}class Y26 extends u0{_spinner=new E$;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=X6.of(J),{colors:Z}=Q,Y=F4.all(new $4(Z.foreground,1,"solid")),X=this._spinner.toBraille(),G=new S1({textAlign:"center",text:new l("",void 0,[new l(X,new s({color:H1.yellow})),new l(" ",void 0),new l(this.widget.props.message,new s({color:Z.foreground}))])}),K=[new d6({child:new x0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[G]})})];if(this.widget.props.onAbort)K.push(new Q0({height:2,child:new b0({padding:H0.symmetric(2,0),child:new S1({text:new l("",new s({dim:!0}),[new l("Press ",new s({color:Z.foreground})),new l("Esc",new s({color:Z.info})),new l(" to cancel",new s({color:Z.foreground}))])})})}));let q=new b0({decoration:new N8(H1.default(),Y),child:new Q0({width:60,height:7,child:new x0({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 DV extends p0{props;constructor(J){super();this.props=J}createState(){return new X26}}class X26 extends u0{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof BV}build(J){let Q=this.widget.props.message,Z=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let W=l41(Q);return{title:W.title,type:W.type,description:W.description}})(),Y=Z.type==="error"?H1.red:H1.yellow,X=F4.all(new $4(H1.default(),1,"solid")),G=new b0({padding:H0.symmetric(1,0),child:new S1({text:new l(Z.title,new s({color:Y,bold:!0}))})}),V=this.isWidgetMessage(Q)?Q.widget:new S1({text:new l(Z.description,new s({color:H1.default()})),selectable:!0}),K=new d6({child:new aH({child:new b0({padding:H0.symmetric(1,0),child:V})})}),q=new b0({padding:H0.symmetric(1,0),child:new S1({text:this.widget.props.onRetry?new l("",void 0,[new l("Press ",new s({color:H1.default(),dim:!0})),new l("R",new s({color:H1.yellow})),new l(" to retry, ",new s({color:H1.default(),dim:!0})),new l("Esc",new s({color:H1.yellow})),new l(" to cancel",new s({color:H1.default(),dim:!0}))]):new l("Press any key to close",new s({color:H1.default(),dim:!0,italic:!0}))})});return new z8({onKey:(W)=>{if(this.widget.props.onRetry&&W.key==="r")return this.widget.props.onRetry(),"handled";if(W.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!0,child:new b0({decoration:{border:X,color:H1.default()},padding:H0.all(1),child:new x0({mainAxisAlignment:"center",children:[G,new Q0({height:1}),K,q]})})})}}class p_1 extends E6{build(){return new C4({child:new S1({text:new l("",void 0,[new l(`✓ Thread Shared
4734
4734
 
@@ -4819,7 +4819,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
4819
4819
  `)?`${K}...`:X,W=new s({color:H1.index(8)}),H=[new l(q,W)];if(V>0){let z=new s({color:Z.success});for(let U=1;U<=V;U++)H.push(new l(" ")),H.push(new l(`[${U}]`,z))}return new q6({padding:H0.only({bottom:0}),child:new B6({crossAxisAlignment:"start",children:[new q6({padding:H0.only({right:1}),child:new S1({text:new l("•",new s({color:H1.index(8)}))})}),new d6({child:new S1({text:new l("",void 0,H)})})]})})}}class Ck1 extends p0{createState(){return new F36}}class F36 extends u0{_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 s({color:H1.red}),Z=new s({color:this._visible?H1.red:H1.transparent()});return new B6({children:[new S1({text:new l("⏺",Z)}),new Q0({width:1}),new S1({text:new l("Replay",Q)})]})}}class jk1 extends E6{entry;width;constructor({key:J,entry:Q,width:Z}){super({key:J});this.entry=Q,this.width=Z}build(J){let Z=X6.of(J).colors.mutedForeground,Y=this.entry,X=Y.authors[0]?.name||"Community";if(X.includes("@"))X=X.split("@")[0]??X;let G=" · ",V=50,K=this.truncateToWidth(Y.title,V),q=`${G}${K}`,W=Math.max(1,this.width-q.length-2),H=Y.description.replace(/\s+/g," ").trim(),z=`@${X}: ${H}`,U=this.truncateToWidth(z,W),D=new S1({text:new l(U,new s({color:Z,dim:!0}))}),M=new S1({text:new l(q,new s({color:Z,dim:!0}))});return new G8({onClick:()=>y3(J,Y.link),cursor:"pointer",child:new Q0({width:this.width,height:1,child:new q6({padding:H0.horizontal(1),child:new B6({children:[new d6({child:new vB(new Q0({width:W,height:1,child:D}))}),M]})})})})}truncateToWidth(J,Q){if(J.length<=Q)return J;return J.slice(0,Q-1)+"…"}}i0();function aW8(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/3600000),X=Math.floor(Y/24),G=Math.floor(X/7),V=Math.floor(X/30);if(Y<1)return"Just now";if(Y<24)return`${Y}h ago`;if(X<7)return`${X}d ago`;if(G<=4)return`${G}w ago`;return`${V}mo ago`}class Sk1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Z)=>{let Y=this.threadHistoryService.observeThreadList().subscribe((X)=>{Y.unsubscribe(),Z(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(Q6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((Y)=>{if(!Q.trim())return!0;let X=Y.title?.toLowerCase()||"untitled",G=Y.id.toLowerCase(),V=Q.toLowerCase();return X.includes(V)||G.includes(V)}).map((Y)=>{let X=new Date(Y.userLastInteractedAt),G=aW8(X),V=Y.id.slice(-8),K=Y.env?.initial.trees?.[0]?.uri;return{id:Y.id,title:Y.title||"Untitled",updatedAt:new Date(Y.userLastInteractedAt).toISOString(),description:{timeAgo:G,title:Y.title||"Untitled",shortThreadID:V},diffStats:Y.summaryStats?.diffStats,workspaceURI:K,parentRelationships:Y.parentRelationships,hasPlan:Y.hasPlan,agentMode:Y.agentMode}})}}B0();R8();class _k1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new l5;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){x.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){x.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(oD()).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 U36(J,Q){switch(J){case"update-available":return[new l("A newer Amp is available. Run ",new s({color:Q.foreground,dim:!0})),new l("amp update",new s({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new l("Update complete, run ",new s({color:Q.foreground,dim:!0})),new l("amp update",new s({color:Q.warning})),new l(" to see warnings",new s({color:Q.foreground,dim:!0}))];case"update-error":return[new l("Update failed, run ",new s({color:Q.foreground,dim:!0})),new l("amp update",new s({color:Q.warning})),new l(" to see warnings",new s({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function eW8(J){return new Promise((Q)=>{rW8("git",["branch","--show-current"],{cwd:J},(Z,Y)=>{if(Z){Q(null);return}let X=Y.trim();Q(X||null)})})}class w36 extends p0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new w91}}class w91 extends u0{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;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=[];dismissedEphemeralErrorKey=null;currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;isShowingPalette=!1;paletteShowOptions=null;threadsForPicker=[];clustersForPicker=[];isLoadingThreads=!1;threadPreviewController=new _k1;previewThread=null;planScrollController=(()=>{let J=new l5;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new l5;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new $8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new $8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;adActionModal=null;threadFeedReader=null;currentThreadFeedEntry=null;threadFeedEntries=[];threadFeedSubscription=null;threadFeedRotationTimer=null;threadFeedHidden=!1;threadFeedTickerQueue=[];hasSubmittedFirstMessage=!1;currentUserInfo=null;newsFeedReader=null;newsFeedEntries=[];newsFeedSubscription=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;pendingMCPServers=[];mcpTrustSubscription=null;pendingOAuthRequest=null;mcpServers=[];mcpServersSubscription=null;cacheTimerState=null;cacheTimerSubscription=null;agentModeController=null;freeTierStatus={canUseAmpFree:!1};agentModePulseSeq=0;agentModeSlideProgress=null;agentModeSlideTimer=null;updateState="hidden";updateServiceSubscription=null;toastController=new Dj1;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 initThreadFeed(){let J=await K6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Z=Q.includes("localhost")||Q.includes("127.0.0.1");try{let V=await this.widget.dependencies.internalAPIClient.getUserInfo({},{config:this.widget.dependencies.configService});if(V.ok){let K=V.result,q="user"in K?K.user:K;this.currentUserInfo={username:q.username??void 0,displayName:q.displayName??void 0};let W="ffe10a0c-6c42-41ce-a3a6-38990fd6caf8";if(!Z&&K.team?.id!==W)return}else return}catch(V){x.debug("Failed to fetch user info for thread feed filtering",V);return}let Y="/threads.rss",X=async(V,K)=>{let q=V instanceof Request?V.url:V.toString();return w3(q,K,this.widget.dependencies.configService)},G=YI1();G.get("entries").then((V)=>{if(V){let K=this.filterEntries(V);if(this.threadFeedEntries=K,K.length>0&&!this.currentThreadFeedEntry){let q=[...K].sort((H,z)=>z.pubDate.getTime()-H.pubDate.getTime());this.threadFeedTickerQueue=[...q,...this.threadFeedTickerQueue];let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}),this.threadFeedReader=new yC1(G,X,{url:Y}),this.threadFeedSubscription=this.threadFeedReader.stream().subscribe({next:(V)=>{try{let K=this.filterEntries(V);if(K.length>0){this.threadFeedEntries=[...K,...this.threadFeedEntries];let q=[...K].sort((W,H)=>H.pubDate.getTime()-W.pubDate.getTime());if(this.threadFeedTickerQueue=[...q,...this.threadFeedTickerQueue],!this.currentThreadFeedEntry){let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}catch(K){x.error("Thread feed: error in next handler",K)}},error:(V)=>{x.error("Thread feed error:",V)}}),this.resetThreadFeedRotation()}filterEntries(J){if(!this.currentUserInfo)return J;let{username:Q,displayName:Z}=this.currentUserInfo;return J.filter((Y)=>{return!Y.authors.some((X)=>{let G=X.name;if(!G)return!1;return Q&&G===Q||Z&&G===Z||Q&&G.includes(Q)})})}rotateThreadFeed(){if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);this.threadFeedRotationTimer=setInterval(()=>{let J=this.getNextFeedEntry();if(J)this.setState(()=>{this.currentThreadFeedEntry=J})},30000)}resetThreadFeedRotation(){this.rotateThreadFeed()}getNextFeedEntry(){if(this.threadFeedTickerQueue.length>0)return this.threadFeedTickerQueue.shift();return null}async initNewsFeed(){let J=async(Z)=>{return w3(Z,void 0,this.widget.dependencies.configService)},Q=YI1();this.newsFeedReader=new kC1(Q,J,"/news.rss"),this.newsFeedSubscription=this.newsFeedReader.stream().subscribe({next:(Z)=>{if(Z.length>0)this.setState(()=>{this.newsFeedEntries=[...Z,...this.newsFeedEntries]})},error:(Z)=>{x.error("News feed error:",Z)}})}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1,this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Z,baseWpm:Y}=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"&&Z){let W=V.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
4820
4820
  `);if(W)await this.replayTypeMessage(W,Y)}if(V.role==="assistant"){let W=V.content.some((U)=>U.type==="tool_use"),H=X[G+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...V,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let D=J.thread.id;this.getMessageScrollController(D).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),o8.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Z=J.split(/(?<=\s)/),Y=60000/Q;for(let X of Z){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=Y/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 Z=J.items.filter((G)=>G.type==="toolResult").filter((G)=>G.toolResult.run.status==="in-progress"||G.toolResult.run.status==="queued"),Y=J.subagentActiveTools.filter((G)=>G.toolRun.status==="in-progress"||G.toolRun.status==="queued");return[...Z,...Y].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 l(this.submitDisabledHint,new s({color:J.foreground,dim:!0}));if(this.isExiting)return new l("Exiting...",new s({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new l("",void 0,[new l("Ctrl+C",new s({color:Q.keybind})),new l(" again to exit",new s({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new l("",void 0,[new l("Esc",new s({color:Q.keybind})),new l(" again to clear input",new s({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new l("",void 0,[new l("Escape",new s({color:Q.keybind})),new l(" to close help",new s({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let X=this.getEffectiveAgentMode(),G=hk1(X);return new l("",void 0,[new l("Images aren't supported in ",new s({color:J.warning,dim:!1})),new l(X,new s({color:G})),new l(" mode.",new s({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new l("",void 0,[new l("Esc",new s({color:Q.keybind})),new l(" again to cancel",new s({color:J.foreground,dim:!0}))]);return new l("",void 0,[new l("Esc",new s({color:Q.keybind})),new l(" to cancel",new s({color:J.foreground,dim:!0}))])}if(this.statusMessage)return new l(this.statusMessage,new s({color:J.foreground,dim:!0}));let Z=U36(this.updateState,J);if(Z)return new l("",void 0,Z);let Y=this.widget.dependencies.worker.thread;if(Y.agentMode==="plan"&&nL(Y))return new l("",void 0,[new l("Use command",new s({color:J.foreground})),new l(" plan: execute",new s({color:Q.command}))]);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Z}=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 Z.cancel(),await Z.handle({type:"thread:truncate",fromIndex:X}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(G){x.error("Failed to edit message:",G)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Z,threadSyncService:Y}=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 Z3.getOrCreateForThread(Z,X),K=await tT(V,Y,G-1);await this.switchToExistingThread(K)}catch(V){x.error("Failed to fork thread:",V),this.showErrorMessage(`Failed to fork thread: ${V}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Z,worker:Y}=this.widget.dependencies,X=Z.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 Y.cancel(),this.widget.dependencies.history.add(Q);let V=hB(Q);if(V)await Y.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){x.error(`Cannot edit message: This thread uses ${X.agentMode} mode. To change mode, create a new thread.`);return}await Y.handle({type:"user:message",message:q,index:G})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(V){x.error("Failed to edit message:",V)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(d3)}catch(Z){return x.error("Failed to get affected files:",Z),[]}};textController=new bZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new l5);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 Y=this.searchElementTreeByKey(J.child,Q);if(Y)return Y}if(J?.children)for(let Y of J.children){let X=this.searchElementTreeByKey(Y,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 Z=process.cwd().replace(process.env.HOME||"","~"),Y=Q?`amp - ${Q} - ${Z}`:"";process.stdout.write(gR1(Y))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new l7("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands;paletteConfig;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"){this.showCommandPalette(),this.textController.clear();return}let Q=hB(J);this.currentShellModeStatus=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}),u8.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(Z){let Y=Z instanceof Error?Z.message:String(Z);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Y}`)})}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}),u8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette)this.autocompleteFocusNode.requestFocus()})},onCancel:()=>{this.exitApplication()}})};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(J){if(this.setState(()=>{this.isShowingPalette=!this.isShowingPalette,this.paletteShowOptions=J??null}),this.isShowingPalette)this.loadThreadsForPicker()}isShowingStandalonePalette(){return this.isShowingPalette&&this.paletteShowOptions?.type==="standalone"}getPaletteCommands(){if(!this.paletteCommands){if(!this.paletteConfig)throw Error("Config not yet available");this.paletteCommands=new t_1(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 Qk1(this.widget.dependencies.fuzzyServer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Z}=this.widget.dependencies;if(!Q.mainThread)return null;let Y=h0.file(process.cwd()),X=T6(Y);return{recentThreadIDs:Z,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,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,connectedClientsService:this.widget.dependencies.connectedClientsService,mcpService:this.widget.dependencies.mcpService,startNewThread:async()=>{await this.startAndSwitchToNewThread()},navigateBack:this.navigateBack,navigateForward:this.navigateForward,canNavigateBack:this.threadBackStack.length>0,canNavigateForward:this.threadForwardStack.length>0,canUseAmpFree:this.widget.dependencies.freeTierStatus.canUseAmpFree,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);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 z=setTimeout(()=>G.abort(new d81("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},this.widget.dependencies.configService,G.signal);return clearTimeout(z),await this.switchToExistingThread(U),{ok:!0}}catch(U){if(clearTimeout(z),U instanceof Error&&(U.name==="AbortError"||U.message.includes("aborted")))throw G.signal.reason;throw U}}catch(H){return x.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 yr({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,handleExecutePlan:async()=>{try{let G=Q.mainThread?.id;if(!G){this.setState(()=>{this.displayMessage=Error("No active thread")});return}let V=await this.widget.dependencies.threadService.createPlanExecutionThread(G,"smart");await this.switchToExistingThread(V)}catch(G){x.error("Failed to execute plan",G),this.setState(()=>{this.displayMessage=Error(`Failed to execute plan: ${G instanceof Error?G.message:String(G)}`)})}},planFileManager:this.widget.dependencies.planFileManager,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,currentThreadFeedEntry:this.currentThreadFeedEntry,threadFeedEntries:this.threadFeedEntries,threadFeedHidden:this.threadFeedHidden,newsFeedEntries:this.newsFeedEntries,setThreadFeedHidden:(G)=>{this.setState(()=>{this.threadFeedHidden=G})},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)}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new Sk1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=B26(Q),this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await eW8(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 Z=Date.now(),Y=`bash-${Z}-${Math.random().toString(36).substring(7)}`,X={cmd:J},G=new AbortController;this.widget.dependencies.worker.invokeBashTool(X,G.signal,Q===fB).subscribe({next:(V)=>{this.setState(()=>{if(this.bashInvocations.find((q)=>q.id===Y))this.bashInvocations=this.bashInvocations.map((q)=>q.id===Y?{...q,toolRun:V}:q);else{let q={id:Y,args:X,toolRun:V,startTime:Z,abortController:G,hidden:Q===fB};this.bashInvocations=[...this.bashInvocations,q]}})},error:()=>this.removeBashInvocation(Y),complete:()=>this.removeBashInvocation(Y)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};showContextDetailOverlay=()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!0}),this.fetchThreadCostInfo()};fetchThreadCostInfo=k66(()=>{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 Z=J!==this.threadCostInfoLastUsageLedgerLength,Y=Q==="idle"&&this.lastInferenceState==="running";if(this.threadCostInfoLastUsageLedgerLength=J,this.lastInferenceState=Q,Z||Y)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=800,Q=16,Z=Q/J;this.agentModeSlideTimer=setInterval(()=>{this.setState(()=>{if(this.agentModeSlideProgress!==null){if(this.agentModeSlideProgress=Math.min(1,this.agentModeSlideProgress+Z),this.agentModeSlideProgress>=1){if(this.agentModeSlideProgress=null,this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null}}})},Q)};handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!xk(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>=pF)return!1;let Z=rR(J);if(typeof Z==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Z]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Z}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};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)x.error("Failed to destruct mysterious message",Q.error);else this.setState(()=>{this.mysteriousMessage=null,this.isShowingMysteriousMessageModal=!1})}).catch((Q)=>{x.error("Failed to destruct mysterious message",Q)})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Z,unlink:Y,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 FV(W);try{let H=await Z(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")x.error("Failed to read temporary file",H)}try{await Y(W),await X(q)}catch(H){x.warn("Failed to clean up temporary file",H)}}catch(q){x.error("Error opening editor:",q)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=hB(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(()=>{})};initState(){if(gY.getInstance().interceptConsole(),this.freeTierStatus=this.widget.dependencies.freeTierStatus,this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();o8.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),o8.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),o8.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Z)=>{u8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Z.hasFocus})})}),K6(this.widget.dependencies.configService.config).then((Z)=>{this.paletteConfig=Z,this.agentModeController=new mC1({initialCliMode:this.widget.dependencies.initialAgentMode,sessionState:this.widget.dependencies.sessionState??null,freeTierStatus:this.freeTierStatus,initialSettings:Z.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.balanceInfoSubscription=Fe0(async()=>{let Z=await this.widget.dependencies.internalAPIClient.userDisplayBalanceInfo({},{config:this.widget.dependencies.configService});if(!Z.ok)throw Z.error;return Z.result}).subscribe({next:(Z)=>{this.setState(()=>{this.userDisplayBalanceInfo=Z})},error:(Z)=>{x.debug("Failed to fetch user balance info",Z)}}),this.scheduleAdSubscriptionWithIdeReadiness();let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Z)=>{this.setState(()=>{this.pendingMCPServers=Z})}),NR1((Z)=>{this.setState(()=>{this.pendingOAuthRequest=Z})}),this.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Z)=>{this.setState(()=>{this.mcpServers=Z})}),this.cacheTimerSubscription=this.widget.dependencies.worker.cacheTimer.subscribe((Z)=>{this.setState(()=>{this.cacheTimerState=Z})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Z)=>{let Y=this.isIdeReadyForAdContext();if(this.setState(()=>{this.ideStatus=Z}),!Y&&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(Z)=>{let Y=this.widget.dependencies.getCurrentWorker();if(!Y){x.warn("No active thread worker found to handle IDE message");return}await new Promise((X)=>setTimeout(X,50)),await Y.handle({type:"user:message",message:{content:[{type:"text",text:Z}]}}),x.debug("Message sent from IDE to agent",{message:Z.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Z)=>{this.textController.insertText(Z),x.debug("Appended text to CLI prompt from IDE",{text:Z.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Z)=>{this.setState(()=>{this.connectedClientsStatus=Z})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Z)=>{this.setState(()=>{this.updateState=Z})}),this.mysteriousMessageSubscription=D41(this.widget.dependencies.configService).pipe(g5((Z)=>Z!=="pending"),Q6((Z)=>M41(Z)?Z.mysteriousMessage??null:null),U4((Z,Y)=>Z?.id===Y?.id)).subscribe((Z)=>{this.setState(()=>{if(Z?.id!==this.mysteriousMessage?.id)this.isShowingMysteriousMessageModal=!1;if(this.mysteriousMessage=Z,Z&&!this.mysterySequenceManager)this.mysterySequenceManager=new x41(new Map([[new y41(w91.MYSTERY_SEQUENCE),new tm]])),this.mysteryKeyInterceptorUnsubscribe=o8.instance.addKeyInterceptor((Y)=>{if(!this.mysterySequenceManager)return!1;if(this.isShowingMysteriousMessageModal)return!1;let X=this.mysterySequenceManager.handleKeyEvent(Y);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(!Z)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((Z)=>{let Y=Z instanceof Error?Z.message:String(Z);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Y}`)})});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.initThreadFeed(),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:Z}=this.widget.dependencies;this.maybeRefetchThreadCostInfo(Z.mainThread?.usageLedger?.events.length??0,Z.viewState.state==="active"?Z.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.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeController)this.agentModeController.removeListener(this.agentModeListener),this.agentModeController.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(NR1(null),this.mcpServersSubscription)this.mcpServersSubscription.unsubscribe();if(this.cacheTimerSubscription)this.cacheTimerSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.newsFeedSubscription)this.newsFeedSubscription.unsubscribe();if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);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(gR1("")),this.shouldUseProgressBar())process.stdout.write(y06())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,Y=[...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(Y.length===0)return null;let X=Y[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()},w91.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=GC1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let J=this.agentModeController?.getMode();return(J&&P9(J)||this.randomAd===null)&&$C1(this.lastUserInteractionTime)},this.widget.dependencies.codebaseContextService).subscribe({next:(J)=>{if(J){let Q=sW8(16).toString("hex");this.lastAdImpressionId=Q,Promise.resolve().then(() => (O91(),A91)).then(({recordAdEvent:Z})=>{let Y=this.widget.dependencies.worker.thread,X=Y.messages[Y.messages.length-1];Z("viewed",{adId:J.id,advertiserId:J.advertiserId,threadId:Y.id,messageId:X?.messageId,impressionId:Q,placement:"tui",matchType:J.metadata?.matchType,matchedPatterns:J.metadata?.matchedPatterns,candidateAdPoolCount:J.metadata?.candidateAdPoolCount,clientRegion:J.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=J}),u8.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"){x.error("No current tool confirmation found");return}let Z=Q.tools[0]?.useBlock;if(!Z){x.error("No tool use block found in confirmation");return}if(J==="allow-all-session")HG("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 x.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 y3(this.context,X);return}if(J==="disable-librarian"){let X=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!X.includes(KY))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,KY],"global")}let Y=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let X={type:"user:tool-input",toolUse:Z.id,value:{accepted:Y}};if(Q.subthreadID)await(await Z3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(X);else await this.widget.dependencies.worker.handle(X)}catch(X){x.error("Failed to send tool confirmation:",X)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Z=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Z)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Z=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Z.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.agentModeController?.setMode("smart"),this.setState(()=>{this.dismissedEphemeralErrorKey=null}),D61({agentMode:"smart"}),await this.startAndSwitchToNewThread();break}case"handoff":{if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);this.showCommandPalette({type:"normal",commandId:"handoff"});break}}this.setState(()=>{})};handleDisplayMessageDismiss=()=>{this.setState(()=>{this.displayMessage=null})};handleMCPTrustOpenSettings=async()=>{let{mcpTrustHandler:J,settingsStorage:Q}=this.widget.dependencies;await J.deny();try{await FV(Q.getSettingsFilePath())}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);await this.showErrorMessage(`Failed to open settings: ${Y}`)}};cancelStreamingMessage=async()=>{await Z3.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 Z=J.messages[Q];if(Z?.role==="user"&&!Z.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Z=!0}=Q;if(Z){let Y=this.widget.dependencies.worker.thread.id;if(Y!==J)this.recordNavigation(Y)}try{x.info(`[switchToExistingThread] Switching to thread: ${J}`);let Y=await this.widget.dependencies.switchToThread(J);if(x.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${Y.thread.agentMode}`),this.widget.dependencies.worker=Y,this.widget.dependencies.threadID=Y.thread.id,this.widget.dependencies.switchWorker(Y),x.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),Y.thread.draft)if(x.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof Y.thread.draft==="string")this.textController.insertText(Y.thread.draft);else{let X=Y.thread.draft.filter((K)=>K.type==="text"),G=Y.thread.draft.filter((K)=>K.type==="image"),V=X.map((K)=>K.text).join(`
4821
4821
  `);if(V)this.textController.insertText(V);if(G.length>0)this.setState(()=>{this.imageAttachments=G})}}catch(Y){throw x.error("Failed to switch to thread:",J,Y),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Z=n3(Q.thread)===0,Y=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Z&&Y!==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(Z)this.startAgentModeSlide();if(await Q.handle({type:"user:message",message:{content:X,agentMode:Y}}),Z)D61({agentMode:Y});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),u8.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((Y)=>Y.type==="handoff"&&Y.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();D61({agentMode:Q}).catch((Z)=>{x.warn("Failed to save session state on exit:",Z)}).finally(()=>{o8.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=tW8();if(J===Q)return"~";if(J.startsWith(Q+Lg.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(Lg.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(Lg.sep),"…",Q.slice(-2).join(Lg.sep)].join(Lg.sep)}build(J){let Q=S4.of(J),Z=X6.of(J),Y=Z.base;this.themeColors=Y;let{colors:X,app:G}=Z;this.themeApp=G;let V=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,K=V.thread.agentMode&&P9(V.thread.agentMode),q=this.widget.dependencies.features.some((G4)=>G4.name===Tm.UBI&&G4.enabled),W=this.widget.dependencies.freeTierStatus.canUseAmpFree&&q,H=(K||W)&&this.randomAd!==null,z=!K&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden,U=Boolean(H),{threadState:D}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let M=this.getCurrentConfirmation(),L=this.widget.dependencies.replayMode,A=Boolean(L),E=D.items,I=D.mainThread||void 0,P=D.subagentToolsByParentID,R=D.todosList;if(A){let G4={...L.thread,messages:this.replayDisplayedMessages};E=zC(G4).items,I=G4,P={};let K4=xE({messages:this.replayDisplayedMessages});R=Array.isArray(K4)?K4:[]}let k=I?.id,y=I,v=A?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),g=(G4)=>new b81({key:new l7(`preview-message-view-${G4.id}`),items:zC(G4).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:G4,focusNode:new $8({debugLabel:"PreviewFocus"})}),d=this.previewThread,b=d?d.messages.length>2000?new x0({mainAxisSize:"max",children:[new d6({child:new Q0}),new q6({padding:H0.all(2),child:new C4({child:new S1({text:new l("Thread too long for preview",new s({color:X.mutedForeground,dim:!0}))})})})]}):g(d):v?new p81({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal,userDisplayBalanceInfo:this.userDisplayBalanceInfo}):new b81({key:k?new l7(`message-view-${k}`):void 0,items:E,subagentToolsByParentID:P,controller:k?this.getMessageScrollController(k):new l5,autofocus:!1,onCopy:A?void 0:this._handleTextCopy.bind(this),thread:y,onMessageEditSubmit:A?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:A?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:A?void 0:this.forkMessage,getAffectedFiles:A?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),a=Math.max(Math.floor(Q.size.height*0.4),12),G1=this.getCurrentEphemeralError(),e=Q.size.width<40,c=D.mainThread?vF0(D.mainThread):void 0,J1=T81(J),q1=this.buildBottomWidget(G1,M,X,Z,D,R,a,U,A,c,this.cacheTimerState??void 0,Q,J1),L1=new t41({threadViewState:D.viewState,threadTokenUsage:c,threadID:k??null,thread:D.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,mcpServers:this.mcpServers,isNarrow:e,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!M,showingEphemeralError:Boolean(D.viewState.state==="active"&&D.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),r=new r41({bashInvocations:this.bashInvocations}),o=[];if(z&&this.currentThreadFeedEntry)o.push(new jk1({entry:this.currentThreadFeedEntry,width:Q.size.width}));let i=this.getEffectiveAgentMode(),z1=this.currentShellModeStatus,k1=hk1(i),t=!z1?i.length+1:0,f1=Q.capabilities.animationSupport,P1=f1==="disabled"?0:f1==="slow"?30:60,I0=BK(i)?.uiHints?.fasterAnimation?3:1,_1=P1>0&&this.agentModePulseSeq>0?new x9({children:[q1,new v5({top:0,left:1,right:1,height:1,child:new Ek1({color:k1,trigger:this.agentModePulseSeq,fps:P1,speed:I0,leftOffset:t})})]}):q1;o.push(new d6({child:b}),r);let o1=new x9({children:[new x0({mainAxisSize:"min",children:[H?new __1({ad:this.randomAd,onButtonClick:async()=>{let G4=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (O91(),A91)).then(({recordAdEvent:O9})=>{let Z5=this.widget.dependencies.worker.thread,y$=Z5.messages[Z5.messages.length-1];O9("clicked",{adId:G4.id,advertiserId:G4.advertiserId,threadId:Z5.id,messageId:y$?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:G4.metadata?.matchType,matchedPatterns:G4.metadata?.matchedPatterns,candidateAdPoolCount:G4.metadata?.candidateAdPoolCount,clientRegion:G4.metadata?.clientRegion})});if(!await y3(this.context,G4.shortDestinationUrl)){let Z5=o8.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:Z5,url:G4.shortDestinationUrl}})}}}):new Q0({height:0}),new b0({constraints:new L6(0,Q.size.width,0,a),child:_1})]}),U?new v5({top:0,left:0,right:0,child:new P36({userHeight:this.bottomGridUserHeight,maxHeight:a,onInitializeHeight:(G4)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(G4,a)})},onDrag:(G4)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(G4.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let K4=Math.floor(G4.localPosition.y)-this.bottomGridDragStartY,O9=Math.max(4,this.bottomGridDragStartHeight-K4),Z5=Math.min(O9,a),y$=Math.floor(Z5);if(this.bottomGridUserHeight!==y$)this.setState(()=>{this.bottomGridUserHeight=y$})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new Q0({height:0})]});o.push(o1,new Q0({height:1,child:new q6({padding:H0.horizontal(1),child:L1})}));let F1=new x0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:o}),w1=A&&L?.showIndicator!==!1?new x9({children:[F1,new v5({top:0,left:0,child:new Ck1})]}):F1,A1=new w8(()=>{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.textController.hasSelection)return this.textController.clearSelection(),"handled";if(this.isConfirmingClearInput){if(this.textController.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((K4)=>{x.error("Failed to mark message as interrupted:",K4)}),this.cancelStreamingMessage().catch((K4)=>{x.error("Failed to cancel streaming message:",K4)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return x.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),R1=new w8(()=>{return this.onExitPressed(),"handled"}),j1=new w8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),d1=new w8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),m1=new w8(()=>{return BJ.instance.toggleAll(),"handled"}),r1=new w8(()=>{return this.widget.dependencies.configService.getLatest().then((G4)=>{HG("internal.showDetailedCosts",!(G4.settings["internal.showDetailedCosts"]??!1))}),"handled"}),K0=new w8(()=>{return o8.instance.toggleFrameStatsOverlay(),"handled"}),q0=new w8(()=>{return o8.instance.tuiInstance.getScreen().markForRefresh(),u8.instance.requestFrame(),"handled"}),k0=new w8(()=>{return this.toggleAgentMode(),"handled"}),v6=new w8(()=>{let K4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:O9}=this.widget.dependencies,Z5=O9.mainThread?.id;return Z5?this.getMessageScrollController(Z5):null})();if(K4){let O9=Math.max(Math.floor(Q.size.height*0.4),10),Z5=Q.size.height-O9;K4.animatePageUp(Z5,100)}return"handled"}),p6=new w8(()=>{let K4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:O9}=this.widget.dependencies,Z5=O9.mainThread?.id;return Z5?this.getMessageScrollController(Z5):null})();if(K4){let O9=Math.max(Math.floor(Q.size.height*0.4),10),Z5=Q.size.height-O9;K4.animatePageDown(Z5,100)}return"handled"}),e4=new w8(()=>{let K4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:O9}=this.widget.dependencies,Z5=O9.mainThread?.id;return Z5?this.getMessageScrollController(Z5):null})();if(K4)K4.animateTo(0,100);return"handled"}),s8=new w8(()=>{let K4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:O9}=this.widget.dependencies,Z5=O9.mainThread?.id;return Z5?this.getMessageScrollController(Z5):null})();if(K4)K4.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),o9=new w8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:G4}=this.widget.dependencies;if(!G4.mainThread?.messages.some((O9)=>O9.role==="user"||yE(O9)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),E0=new w8((G4)=>{if(G4.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),a0=new w8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return c41().then(async(G4)=>{if(G4)try{this.handleInsertImage(G4)}finally{try{let{unlink:K4}=await import("node:fs/promises");await K4(G4)}catch{}}}),"handled"}),s6=new Map([[Y4.ctrl("c"),new lm],[Y4.ctrl("l"),new rm],[Y4.ctrl("o"),new g41],[Y4.ctrl("v"),new dm],[Y4.alt("s"),new JC],[Y4.ctrl("s"),new JC],[Y4.alt("p"),new om],[Y4.ctrl("r"),new nm],[Y4.alt("d"),new am],[Y4.ctrl("t"),new sm],[Y4.key("PageUp"),new f41],[Y4.key("PageDown"),new h41],[Y4.key("Home"),new b41],[Y4.key("End"),new m41],[Y4.key("Escape"),new cm],[Y4.ctrl("p"),new QC("previous")],[Y4.ctrl("n"),new QC("next")],[Y4.key("Tab"),new em]]);if(!h2())s6.set(Y4.key("ArrowUp"),new em);if(!1)s6.set(Y4.alt("c"),new im);let p8=new w8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),w7=new w8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),h5=new w8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),G7=new Map([[cm,A1],[rm,q0],[JC,k0],[g41,p8],[dm,a0],[im,j1],[S41,d1],[nm,m1],[am,r1],[om,K0],[sm,w7],[lm,R1],[f41,v6],[h41,p6],[b41,e4],[m41,s8],[em,o9],[QC,E0],[tm,h5]]),d8=[w1];if(this.isShowingConsoleOverlay)d8.push(new Xk1);if(this.isShowingHelp&&this.paletteConfig)d8.push(new Vk1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)d8.push(new sS1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)d8.push(new Tk1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)d8.push(new k_1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(G4)=>{let K4=this.adActionModal.url;if(G4==="copy")try{await o8.instance.tuiInstance.clipboard.writeText(K4),this.setState(()=>{this.displayMessage=new iY("Link copied to clipboard")})}catch(O9){x.error("Failed to copy to clipboard",{error:O9}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:G4}=this.widget.dependencies;d8.push(new Ik1({servers:this.pendingMCPServers,onAlwaysTrust:G4.trustAlways.bind(G4),onTrustOnce:G4.trustOnce.bind(G4),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:G4.deny.bind(G4)}))}if(this.pendingOAuthRequest)d8.push(new Rk1({request:this.pendingOAuthRequest,onDismiss:()=>{this.setState(()=>{this.pendingOAuthRequest=null})}}));if(this.isShowingFileChangesOverlay)d8.push(new Cj1({threadData:D}));if(this.isShowingContextDetailOverlay){let G4=this.threadCostInfo?.costBreakdownURL;d8.push(new $k1({thread:D.mainThread??void 0,tokenUsage:c??void 0,cacheTimerState:this.cacheTimerState??void 0,costInfo:this.threadCostInfo,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})},onOpenCostBreakdown:G4?()=>{y3(J,G4)}:void 0}))}if(this.isShowingConfirmationOverlay)d8.push(new Zk1({details:this.confirmationOverlayContent}));let d9=this.getCommandPaletteContext(J);if(d9&&this.isShowingPalette&&this.paletteConfig)d8.push(new C4({child:new Jk1({commandContext:d9,mainThread:D.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)d8.push(new qk1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let Z8=new x9({children:d8});if(this.isShowingJetBrainsInstaller)return new bA({child:new HJ({actions:G7,child:new lY({shortcuts:s6,debugLabel:"jetbrains-installer-shortcuts",child:new wk1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new oH({controller:this.toastController,child:new bA({child:new Mj1({controller:this.toastController,child:new HJ({actions:G7,child:new lY({shortcuts:s6,debugLabel:"main-app-shortcuts",child:Z8})})})})})}buildScrollableTodoList(J,Q,Z){return new E36({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Z})}buildBottomWidget(J,Q,Z,Y,X,G,V,K,q,W,H,z,U){if(J)return new Gk1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new Yk1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Pk1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let D=a41(Y),M=this.agentModeController?.isInRestrictedFreeMode()??!1,L=new sA({key:this.textFieldKey,controller:this.textController,triggers:q?[]:[new lB],completionBuilder:q?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:q?void 0:this.onTextSubmitted,theme:Z,placeholder:q?"Press Ctrl+C to exit":M?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!M&&!this.isShowingStandalonePalette(),shellPromptRules:D,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:o8.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,previousThreadId:this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let i=this.previousThreadIdForHint;if(i)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${i} `},onDoubleAtTrigger:q?void 0:()=>{let i=this.textController.text,z1=this.textController.cursorPosition,t=i.slice(0,z1).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"attach-plan",onBeforeExecute:()=>{if(t!==-1){let f1=this.textController.text,P1=f1.slice(0,t)+f1.slice(t+2);this.textController.text=P1,this.textController.cursorPosition=t}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),A=X.mainThread?.queuedMessages??[],E=Array.isArray(G)&&G.length>0,I=Array.isArray(A)&&A.length>0,P=X.mainThread?.agentMode==="plan"&&nL(X.mainThread),R,k;if(P){if(R=new vB(new m81({thread:X.mainThread,onExecute:async()=>{let i=this.getCommandPaletteContext();if(i)await this.getPaletteCommands().execute("execute-plan",i,void 0,new AbortController)},onEdit:async()=>{try{let i=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:z1}=await this.widget.dependencies.planFileManager.ensureSync(X.mainThread.id);o8.instance.tuiInstance.suspend();let{execSync:k1}=await import("child_process");k1(`${i} "${z1}"`,{stdio:"inherit"}),o8.instance.tuiInstance.resume()}catch(i){x.error("Failed to edit plan",i),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:Y}),{clipBehavior:"antiAlias"}),I)k=new L91({queuedMessages:A});else if(E)k=this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!M,Y)}else R=I?new L91({queuedMessages:A}):void 0,k=E?this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!M,Y):void 0;let y=[],v=this.currentShellModeStatus;if(v)y.push({child:new S1({text:new l(v==="hidden"?"shell mode (incognito)":"shell mode",new s({color:v==="hidden"?Y.app.shellModeHidden:Y.app.shellMode}))}),position:"top-left"});let d=this.connectedClientsStatus&&this.connectedClientsStatus.enabled?this.connectedClientsStatusExpanded?(this.connectedClientsStatus?.clientID?.length??7)+3:3:0,b=this.agentModeController?.getVisibleModes()??[];if(!v&&b.length>1){let i=this.previewThread,z1=i?i.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),k1=hk1(z1),t=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,f1=i??t.thread,P1=n3(f1)>0,I0=this.agentModeSlideProgress!==null,_1,o1;if(I0){_1="top-left";let Y1=z.size.width-z1.length-4-d;o1=Math.floor(this.agentModeSlideProgress*Y1)}else if(P1)_1="top-right",o1=d;else _1="top-left",o1=void 0;if(i)y.push({child:new S1({text:new l(z1,new s({color:k1}))}),position:_1,offsetX:o1});else{let F1=!P1&&!I0,Y1=new S1({text:new l(z1,new s({color:k1}))});y.push({child:F1?new G8({child:Y1,onClick:this.toggleAgentMode,cursor:"pointer"}):Y1,position:_1,offsetX:o1})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let i=this.connectedClientsStatus,z1=i.mode||"disconnected",k1=!!i.errorMessage,t=i.clientID||"unknown",f1,P1;if(k1)f1="●",P1=H1.red;else if(z1==="presence")f1="○",P1=H1.yellow;else if(z1==="connected"&&i.connected)f1="●",P1=H1.green;else f1="○",P1=H1.yellow;let I0=this.connectedClientsStatusExpanded?`${t} ${f1}`:f1;y.push({child:new G8({child:new S1({text:new l(I0,new s({color:P1}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let a=q?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:X.mainThread?.env?.initial.trees?.[0]?.uri,G1;if(a)G1=h0.parse(a).fsPath;else G1=process.cwd();let e=this.toHomeRelative(G1),c=this.shorten(e),J1=!q&&this.currentGitBranch?`${c} (${this.currentGitBranch})`:c;if(y.push({child:new S1({text:new l(J1,new s({color:Z.foreground,dim:!0}))}),position:"bottom-right"}),this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0&&this.textController.text.trim()==="")y.push({child:new S1({text:new l("",void 0,[new l("press ",new s({color:Z.foreground,dim:!0})),new l("enter",new s({color:Y.app.keybind})),new l(" to reference the previous thread",new s({color:Z.foreground,dim:!0}))])}),position:"bottom-left"});let L1=this.previewThread,r=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(n3(r.thread)>0&&!v&&!L1){let i=[],z1=new s({color:Z.foreground,dim:!0}),k1=new l(" · ",z1);if(W){let t=W.totalInputTokens/W.maxInputTokens,f1=Math.round(t*100),P1=Math.max(0,Math.min(f1,100)),I0=s41(t,W.maxInputTokens),_1=z1;if(I0==="danger")_1=new s({color:Z.destructive});else if(I0==="warning")_1=new s({color:Z.warning});else if(I0==="recommendation")_1=new s({color:Y.app.recommendation});let o1=Math.round(W.maxInputTokens/1000);i.push(new l(`${P1}% of ${o1}k`,_1))}if(U&&this.threadCostInfo){let t=Z91(this.threadCostInfo,{colors:{foreground:Z.foreground},dim:!0});if(t.length>0){if(i.length>0)i.push(k1);i.push(...t)}}if(U&&H){let t=X.viewState.state==="active"&&X.viewState.inferenceState==="idle",f1=_66(H,t);if(f1){if(i.length>0)i.push(k1);let P1=z1;if(f1.urgency==="warning")P1=new s({color:Z.warning});i.push(new l(f1.text,P1))}}if(i.length>0){let t=new S1({text:new l("",void 0,i)});y.push({child:U?new G8({child:t,onClick:this.showContextDetailOverlay,cursor:"pointer"}):t,position:"top-left"})}}return new Ej1({leftChild:new d6({child:L}),rightChild1:R,rightChild2:k,maxHeight:V,overlayTexts:y,borderColor:M||!this.isTextfieldAndAutocompleteFocused?H1.index(8):void 0,hasBanner:K,userHeight:this.bottomGridUserHeight,onInitializeHeight:(i)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(i,V)})},onDrag:(i)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(i.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let z1=Math.floor(i.localPosition.y)-this.bottomGridDragStartY,k1=Math.max(4,this.bottomGridDragStartHeight-z1),t=Math.min(k1,V),f1=Math.floor(t);if(this.bottomGridUserHeight!==f1)this.setState(()=>{this.bottomGridUserHeight=f1})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!K})}}async function bk1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)o8.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let Y=()=>null,G=!1,V=new uH(G,1000,J.inspectorPort),K=J.features.find((A)=>A.name===Tm.AMP_CONNECT)?.enabled??!1,q=new j_1({threadService:J.threadService,worker:J.worker,builder:(A,E,I,P,R,k)=>{if(Y=R,J.threadDependencies&&K)hC1(J.threadDependencies,J.configService,R,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((g)=>{x.error("Failed to start automatic presence:",g)});let y=R(),v={...J,worker:y,threadID:y.thread.id};return new w36({...v,threadState:E,workerController:I,switchWorker:P,getCurrentWorker:R,recentThreadIDs:k})}}),W=new Ij1({configService:J.configService,child:q}),H=new tS1({configService:J.configService,child:W}),z=new Wj1(H),U=new X6({data:ZC.fromBaseTheme(O$.default()),child:z});try{await QC1(U,{onRootElementMounted:(A)=>{if(x.info("TUI input ready for user interaction"),G)V.start(A)}})}finally{if(G)V.stop();if(J.threadDependencies&&K){let{stopGlobalSession:A}=await Promise.resolve().then(() => (bC1(),p46));A()}}let M=Y()?.thread.id||J.threadID,L=await J.threadService.get(M);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${M}`;q86(L,A,J.stdout)}}function hk1(J){let Z=BK(J)?.uiHints?.secondaryColor;if(Z)return H1.rgb(Z.r,Z.g,Z.b);return JH8(J)}class E36 extends p0{props;constructor(J){super();this.props=J}createState(){return new I36}}class I36 extends u0{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Z,appTheme:Y}=this.widget.props;return new B6({crossAxisAlignment:"stretch",children:[new d6({child:new q5({controller:Z,autofocus:!1,child:new S_1({todos:Q})})}),new UJ({controller:Z,thumbColor:Y.app.scrollbarThumb,trackColor:Y.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:X,offset:G}=Z,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=(Y,X=0)=>{if(Y&&"size"in Y&&"children"in Y){let G=Y.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},Z=Q(J);if(Z>0)return Z;if("size"in J){let Y=J.size;if(typeof Y?.height==="number"&&Y.height>0)return Y.height}return this.viewportHeight}}class P36 extends E6{props;constructor(J){super();this.props=J}build(J){return new G8({child:new Q0({height:1}),cursor:C9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let Y=J.findRenderObject()?.size.height??0;if(Y>0){this.props.onInitializeHeight(Y);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function JH8(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 Z=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],Y=Math.abs(Q)%Z.length;return H1.index(Z[Y])}JC1();try{if(process.platform==="win32")await Promise.resolve().then(() => H6(vC(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){k$.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
4822
- `)}var Fx1=zx1.join(nK0||zx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function OB8(J){process.emitWarning=function(Q,Z,Y,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Z||"Warning",K=!1;J.warn(G,{name:V,code:Y})}}function OV(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")HG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")HG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")HG("model.sonnet",Q.useSonnet)}async function Bx1(J){try{await MB8(zx1.dirname(Fx1),{recursive:!0}),await LB8(Fx1,J,"utf-8")}catch(Q){x.debug("Failed to save last thread ID",Q)}}async function wB8(){try{return(await tZ6(Fx1,"utf-8")).trim()}catch(J){return null}}function EB8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function IB8(J){try{let Q=await V5.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){x.debug("Failed to fetch user info:",Q)}return}var oZ6=[{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??B$,description:`Custom settings file path (overrides the default location ${B$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(x).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${$R1})`},{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:h2(),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:RE.SMART.key,description:`Set the agent mode (${SX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:SX().map((J)=>J.mode).concat("large")}],rZ6=(J)=>("deprecated"in J)&&J.deprecated===!0,PB8=(J)=>("hidden"in J)&&J.hidden===!0,TB8=(J)=>("default"in J),RB8=(J)=>("default"in J)?J.default:void 0;function CB8(J,Q){let Z=Q.args[0],Y=Q.commands.map((G)=>G.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let G=Y.filter((K)=>Z.includes(K)||K.includes(Z)),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 T8(U$.unknownCommand(Z),1,V)}}var eZ6=null;function LB5(){return eZ6}function pg(J){return{...J,getThreadEnvironment:l01,vfs:HE0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Ix(J.fileSystem),generateThreadTitle:Kc0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Nx1=h0.file(AB8.homedir()),JY6=process.env.XDG_CONFIG_HOME?h0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(Nx1,".config");async function wV(J,Q){lF0("0.0.1765368086-g2f819e");let Z=pW1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([h0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Nx1,userConfigDir:JY6}),{initializeCLITelemetry:Y}=await Promise.resolve().then(() => (O91(),A91));Y(Z);let X=await Z.getLatest();x.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Ua0({configService:Z}),K=new Map,q=()=>K.clear(),W=new XU1(Z,J.settings.getWorkspaceRootPath()),H=Mw0({configService:Z,trustStore:W,createOAuthProvider:async(e,c,J1)=>{let q1=`${e}:${c}`,L1=K.get(q1);if(L1)return x.debug("Reusing existing OAuth provider for server",{serverName:e,serverUrl:c}),L1;x.debug("Creating OAuth provider for server",{serverName:e,serverUrl:c});let r=(async()=>{let o=new FM(J.secrets),i=await o.getClientInfo(e,c),z1=J1?.scopes??i?.scopes,k1=de0();x.info("OAuth headless mode check",{useHeadless:k1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:W5.isTTY});let t=void 0;if(k1)t=J.executeMode?pe0():ue0(e);let f1=new RF1({storage:o,serverName:e,serverUrl:c,clientId:J1?.clientId??i?.clientId,clientSecret:J1?.clientSecret??i?.clientSecret,authUrl:J1?.authUrl??i?.authUrl,tokenUrl:J1?.tokenUrl??i?.tokenUrl,scopes:z1,headlessAuthHandler:t});return x.debug("OAuth provider created",{serverName:e,serverUrl:c,hasManualClientId:!!(J1?.clientId??i?.clientId),willUseDCR:!(J1?.clientId??i?.clientId),scopes:z1,headlessMode:k1,executeMode:J.executeMode}),f1})();return K.set(q1,r),r}}),z=i11({configService:Z,filesystem:e9,spawn:ZA}),{initializeToolProviders:U,startToolProviders:D}=await Promise.resolve().then(() => (aZ6(),nZ6)),M;if(J.executeMode){let e=await U({toolService:G,providers:[H,z],initialTimeout:15000});M=e.registrations;for(let[c,J1]of e.initErrors)x.warn(`${c} provider initialization slow or failed:`,J1)}else M=D({toolService:G,providers:[H,z]});if(Q.jetbrains)fE("JetBrains");else if(Q.ide&&w16())fE("VS Code");else if(Q.ide&&E16())fE("Neovim");if(J.executeMode)iF0(!0);let L,A=W2.status.pipe(Q6((e)=>Boolean(e.connected&&e.authenticated)),U4()).subscribe((e)=>{if(e){if(!L)L=G.registerTool(Vi0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let e=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new Z61(process.cwd(),{alwaysIncludePaths:e},!0)}else E=new class extends Z61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(W5.write(`No API key found. Starting login flow...
4822
+ `)}var Fx1=zx1.join(nK0||zx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function OB8(J){process.emitWarning=function(Q,Z,Y,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Z||"Warning",K=!1;J.warn(G,{name:V,code:Y})}}function OV(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")HG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")HG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")HG("model.sonnet",Q.useSonnet)}async function Bx1(J){try{await MB8(zx1.dirname(Fx1),{recursive:!0}),await LB8(Fx1,J,"utf-8")}catch(Q){x.debug("Failed to save last thread ID",Q)}}async function wB8(){try{return(await tZ6(Fx1,"utf-8")).trim()}catch(J){return null}}function EB8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function IB8(J){try{let Q=await V5.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){x.debug("Failed to fetch user info:",Q)}return}var oZ6=[{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??B$,description:`Custom settings file path (overrides the default location ${B$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(x).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${$R1})`},{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:h2(),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:RE.SMART.key,description:`Set the agent mode (${SX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:SX().map((J)=>J.mode).concat("large")}],rZ6=(J)=>("deprecated"in J)&&J.deprecated===!0,PB8=(J)=>("hidden"in J)&&J.hidden===!0,TB8=(J)=>("default"in J),RB8=(J)=>("default"in J)?J.default:void 0;function CB8(J,Q){let Z=Q.args[0],Y=Q.commands.map((G)=>G.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let G=Y.filter((K)=>Z.includes(K)||K.includes(Z)),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 T8(U$.unknownCommand(Z),1,V)}}var eZ6=null;function LB5(){return eZ6}function pg(J){return{...J,getThreadEnvironment:l01,vfs:HE0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Ix(J.fileSystem),generateThreadTitle:Kc0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Nx1=h0.file(AB8.homedir()),JY6=process.env.XDG_CONFIG_HOME?h0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(Nx1,".config");async function wV(J,Q){lF0("0.0.1765368941-g355c71");let Z=pW1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([h0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Nx1,userConfigDir:JY6}),{initializeCLITelemetry:Y}=await Promise.resolve().then(() => (O91(),A91));Y(Z);let X=await Z.getLatest();x.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Ua0({configService:Z}),K=new Map,q=()=>K.clear(),W=new XU1(Z,J.settings.getWorkspaceRootPath()),H=Mw0({configService:Z,trustStore:W,createOAuthProvider:async(e,c,J1)=>{let q1=`${e}:${c}`,L1=K.get(q1);if(L1)return x.debug("Reusing existing OAuth provider for server",{serverName:e,serverUrl:c}),L1;x.debug("Creating OAuth provider for server",{serverName:e,serverUrl:c});let r=(async()=>{let o=new FM(J.secrets),i=await o.getClientInfo(e,c),z1=J1?.scopes??i?.scopes,k1=de0();x.info("OAuth headless mode check",{useHeadless:k1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:W5.isTTY});let t=void 0;if(k1)t=J.executeMode?pe0():ue0(e);let f1=new RF1({storage:o,serverName:e,serverUrl:c,clientId:J1?.clientId??i?.clientId,clientSecret:J1?.clientSecret??i?.clientSecret,authUrl:J1?.authUrl??i?.authUrl,tokenUrl:J1?.tokenUrl??i?.tokenUrl,scopes:z1,headlessAuthHandler:t});return x.debug("OAuth provider created",{serverName:e,serverUrl:c,hasManualClientId:!!(J1?.clientId??i?.clientId),willUseDCR:!(J1?.clientId??i?.clientId),scopes:z1,headlessMode:k1,executeMode:J.executeMode}),f1})();return K.set(q1,r),r}}),z=i11({configService:Z,filesystem:e9,spawn:ZA}),{initializeToolProviders:U,startToolProviders:D}=await Promise.resolve().then(() => (aZ6(),nZ6)),M;if(J.executeMode){let e=await U({toolService:G,providers:[H,z],initialTimeout:15000});M=e.registrations;for(let[c,J1]of e.initErrors)x.warn(`${c} provider initialization slow or failed:`,J1)}else M=D({toolService:G,providers:[H,z]});if(Q.jetbrains)fE("JetBrains");else if(Q.ide&&w16())fE("VS Code");else if(Q.ide&&E16())fE("Neovim");if(J.executeMode)iF0(!0);let L,A=W2.status.pipe(Q6((e)=>Boolean(e.connected&&e.authenticated)),U4()).subscribe((e)=>{if(e){if(!L)L=G.registerTool(Vi0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let e=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new Z61(process.cwd(),{alwaysIncludePaths:e},!0)}else E=new class extends Z61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(W5.write(`No API key found. Starting login flow...
4823
4823
  `),!await jB8(J))await EA(),process.exit(1)}let I=await pI0({isDevelopment:!1}),P=new VI1(I,Z),R=new XI1(I,{lazy:!0}),k=new UU1(P,(e,c)=>{let J1=Z3.get(e);if(J1)J1.handle(c).catch((q1)=>{x.error("Failed to apply artifact delta",q1)})}),y=Q.notifications!==void 0?Q.notifications:!J.executeMode,v=Na0({playNotificationSound:async(e)=>{if(y){Ba0(e);let c=tR1(),J1=eR1();if((!c||J1)&&X.settings["notifications.system.enabled"]!==!1){if(e==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(e==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:P,configService:Z});x.info("Starting Amp background services");let g=Wc0({threadService:P,threadHistoryService:R,configService:Z,isExtensionDevelopment:!1}),d;W2.status.subscribe((e)=>{d=e});let b=new CX1({workspaceRoots:[h0.file(process.cwd())],getCurrentFile:()=>{if(!d?.openFile)return;try{return h0.parse(d.openFile)}catch(e){x.warn("Failed to parse current file URI",{uri:d.openFile,error:e});return}},getOpenFiles:()=>{if(!d?.visibleFiles?.length)return[];let e=d.openFile;return d.visibleFiles.filter((c)=>c!==e).map((c)=>{try{return h0.parse(c)}catch(J1){return x.warn("Failed to parse visible file URI",{uri:c,error:J1}),null}}).filter((c)=>c!==null)}}),a=new ZC1,G1={codebaseContextService:b,configService:Z,toolService:G,mcpService:H,trustStore:W,threadService:P,threadHistoryService:R,threadSyncService:g,planFileManager:k,threadStorage:I,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:v,fileSystem:Q.jetbrains||Q.ide?KE0:e9,terminal:a};return{...G1,async asyncDispose(){if(G1.mcpService.hasAuthenticatingClients())x.info("Waiting for OAuth authentication to complete before exit..."),await G1.mcpService.waitForAuthentication();for(let e of M.values())e.dispose();await G1.mcpService.dispose(),q(),await G1.threadService.asyncDispose(),G1.configService.unsubscribe(),V(),G1.fuzzyServer.dispose(),G1.threadSyncService.dispose(),G1.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function jB8(J){if(!J.executeMode){if(!await SR1("Would you like to log in to Amp? [(y)es, (n)o]: "))return W5.write(`Login cancelled. Run the command again to retry.
4824
4824
  `),!1}return await QY6(J)}async function QY6(J){let Q=DB8(32).toString("hex"),Z=await jR1(J.ampURL,Q),Y=new AbortController;try{await kD(Z,Y.signal)}catch(G){x.error("Error opening browser",{error:G})}let X=await jR1(J.ampURL,Q,!1);W5.write(`If your browser does not open automatically, visit:
4825
4825
 
@@ -4829,7 +4829,7 @@ ${z4.blue.bold(X)}
4829
4829
  Login successful! You can now use the Amp CLI.
4830
4830
  `),!0}catch(G){return x.error("Login failed",{error:G}),k$.write(`
4831
4831
  Login failed: ${G instanceof Error?G.message:String(G)}
4832
- `),!1}}function SB8(){let J=new HA().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)LR(),process.exit(0);let z=H.originalError??H;ze0(z)}),J.option("-V, --version","Print the version number and exit",()=>{let z;try{z=`, ${kI(new Date("2025-12-10T12:06:44.881Z"))} ago`}catch{}W5.write(`0.0.1765368086-g2f819e (released 2025-12-10T12:06:44.881Z${z??""})
4832
+ `),!1}}function SB8(){let J=new HA().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)LR(),process.exit(0);let z=H.originalError??H;ze0(z)}),J.option("-V, --version","Print the version number and exit",()=>{let z;try{z=`, ${kI(new Date("2025-12-10T12:20:52.541Z"))} ago`}catch{}W5.write(`0.0.1765368941-g355c71 (released 2025-12-10T12:20:52.541Z${z??""})
4833
4833
  `),process.exit(0)}),J.addHelpText("after",L16()),J.configureHelp({formatHelp:A16}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await nQ(U);await xB8(D)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await nQ(U);await yB8(D,await MR1(U,D.settings))});let Q=async(H,z,U)=>{pW1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:t1.of([h0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:Nx1,userConfigDir:JY6});let D={...z,executeMode:!1};await Ux1(D,{...H,openThreadSwitcher:!0},U)},Z=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await nQ(U);await sZ6(U,D,z)});Z.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await nQ(U);await uB8(U,D,z)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await nQ(D);if(z.pick)k$.write(`${z4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
4834
4834
  `);if(z.last||H||M.executeMode)await gB8(D,M,H,U);else await Q(D,M,U)}),Z.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await nQ(D);await mB8(D,M,H,U)}),Z.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await nQ(U);await sZ6(U,D,z)}),Z.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, unlisted, workspace, group)").option("--support [message]","Share thread with Amp support for debugging").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await nQ(D);await bB8(D,M,H,U,z.support)}),Z.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(H,z,U,D)=>{let M=D.optsWithGlobals(),L=await nQ(M);await vB8(M,L,H,z,D)}),Z.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await nQ(D);await fB8(D,M,H,U)}),Z.command("replay <threadId>").alias("p").summary("Replay a thread").description("Replay a thread by downloading it and playing through all interactions. User messages are simulated with variable typing speed.").option("--wpm <wpm>","Typing speed in words per minute (default: 120)","120").option("--no-typing","Disable typing simulation and display messages instantly").option("--message-delay <ms>","Delay between messages in milliseconds (default: 1000)","1000").option("--tool-progress-delay <ms>","Delay to show tool in-progress state in milliseconds (default: 800)","800").option("--exit-delay <seconds>","Delay in seconds before exiting after replay completes (default: 3)","3").option("--no-indicator","Hide the replay progress indicator").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await nQ(D);await hB8(D,M,H,z,U)}),F66(J,async(H,z)=>{let U=await nQ(z);OV(H,z);let D=await wV(U,z);return{context:U,mcpService:D.mcpService,toolService:D.toolService,toolServices:D.toolService,configService:D.configService,cleanupTerminal:LR,asyncDispose:D.asyncDispose.bind(D)}}),K06(J,async(H)=>{let z=H.optsWithGlobals();return await nQ(z)}),s16(J,async(H)=>{let z=await nQ(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{OV(U,H);let D=await wV(z,H);return{mcpService:D.mcpService,settings:z.settings,asyncDispose:D.asyncDispose.bind(D)}}}});function X(H,z,U){let M=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),L=new zB(z,M),A=RB8(H);if(A)L.default(A);if(L.hidden=PB8(H)||rZ6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of oZ6)switch(H.type){case"flag":{J.addOption(X(H,`--${H.long}`)),J.addOption(X(H,`--no-${H.long}`,!1));break}case"switch":{J.addOption(X(H,`--${H.long}`,!0));break}default:{J.addOption(X(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}let G=new zB("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(G);let V=new zB("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(V);let K=new zB("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);J.addOption(K);let q=new zB("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(q);let W=new zB("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(W),process.env.AMP_CONNECT==="1"){let H=new zB("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return J.action(async(H,z)=>{let U=H,D=await nQ(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")W5.write(z4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
4835
4835
  `)),process.exit(0);if(Object.keys(U).forEach((M)=>{let L=oZ6.find((A)=>A.name===M);if(L&&rZ6(L)&&!TB8(L))k$.write(z4.yellow(`Warning: '--${M}' flag is deprecated
@@ -4837,8 +4837,8 @@ Login failed: ${G instanceof Error?G.message:String(G)}
4837
4837
  Or pipe via stdin: echo "your message" | amp --execute`);OV(Z,Q);let V=await wV(J,Q);eZ6=V;let K=pg(V),q=await IB8(V.configService),W=EB8(q?.email);if((J.executeMode||Q.streamJson)&&P9(Q.mode)&&!W)throw new T8(`Execute mode is not permitted with --mode '${Q.mode}'`,1);let H=async(b)=>{let a=await tZ6(b,"utf-8"),G1=JSON.parse(a);if(!_X(G1.id))throw new T8(U$.invalidThreadId);return W51(V,{visibility:Y,agentMode:Q.mode,thread:G1})},z=async(b)=>{if(!_X(b))throw new T8(U$.invalidThreadId);try{let[G1,e]=await Promise.all([V5.getThreadLinkInfo({thread:b},{config:V.configService}),V5.getUserInfo({},{config:V.configService})]);if(G1.ok&&e.ok){let c=G1.result.creatorUserID,J1=e.result.id;if(c&&c!==J1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new T8(`Cannot resume thread created by another user.
4838
4838
 
4839
4839
  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(G1){if(G1 instanceof T8)throw G1;x.warn("Failed to validate thread ownership in CLI, allowing to open",{error:G1})}let a=await V.threadService.get(b)??void 0;return x.info(`[fetchAndStartThread] Loaded thread ${b}, agentMode: ${a?.agentMode??"undefined"}`),W51(V,{visibility:Y,agentMode:a?void 0:Q.mode,thread:a})},U=async()=>{try{if(Q.threadId)return z(Q.threadId);else return W51(V,{visibility:Y,agentMode:Q.mode})}catch(b){if(b instanceof T8)throw b;throw await Qm(b,Q.threadId),Error("handleError should have called process.exit()")}},D=async()=>{return W51(V,{visibility:Y,agentMode:Q.mode})};if(Q.format==="jsonl")k$.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
4840
- `),await EA(),process.exit(1);if(J.executeMode&&Q.remote)await q06(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)Q06(V.mcpService,J.settings),await Re0(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,E=!1;if(Q.jetbrains||Q.ide){await GU0();let b=mE({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let a=b[0];if(a)W2.selectConfig(a)}else E=!0}let I=z61("0.0.1765368086-g2f819e",V.settingsStorage),P=new A11(V.threadStorage),R=t1.of([h0.file(process.cwd())]),k=hX1(void 0,R),y=new F61(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let g=await(async()=>{try{let b=await V5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(b.ok)return x.info("User free tier status:",b),b.result}catch(b){throw x.error("Failed to fetch free tier status:",b),b}})(),d=await F06();x.info("Loaded session state:",d),await bk1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new o01,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,planFileManager:V.planFileManager,threadID:M.threadID,threadFuzzyIndexer:P,worker:M,workerDeps:K,configService:V.configService,internalAPIClient:V5,ampURL:J.ampURL,startNewThread:D,switchToThread:z,ideClient:W2,connectedClientsService:new ni,commandRegistry:k,mcpService:V.mcpService,mcpTrustHandler:y,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:E,openThreadSwitcher:Q.openThreadSwitcher,updateService:I,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:d,freeTierStatus:{canUseAmpFree:g.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Z.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function nQ(J){if(J.interactive)k$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4841
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await Y16({...J,workspaceTrust:{current:!0,changes:D_},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 e16(J.mcpConfig);Y=J06(Y,G)}let X=await Y.get("url","global");if(!X)X=$Z;if(!HF(X))x.info("Targeting custom Amp server",{ampURL:X});return Y=iq0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:W06(await MR1(J,Y))}}function _B8(J){let Q={};for(let Z=0;Z<J.length;Z++){let Y=J[Z];if(Y?.startsWith("--")){let G=Y.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Z+1];if(V&&!V.startsWith("--"))Q[G]=V,Z++}}return Q}async function kB8(){let J=_B8(process.argv);if(Ye0({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),OB8(x),x.info("Starting Amp CLI.",{version:"0.0.1765368086-g2f819e",buildTimestamp:"2025-12-10T12:06:44.881Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new T8(U$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await SB8().parseAsync(process.argv)}nE1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await kB8().catch(Qm)});async function yB8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),W5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4840
+ `),await EA(),process.exit(1);if(J.executeMode&&Q.remote)await q06(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)Q06(V.mcpService,J.settings),await Re0(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,E=!1;if(Q.jetbrains||Q.ide){await GU0();let b=mE({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let a=b[0];if(a)W2.selectConfig(a)}else E=!0}let I=z61("0.0.1765368941-g355c71",V.settingsStorage),P=new A11(V.threadStorage),R=t1.of([h0.file(process.cwd())]),k=hX1(void 0,R),y=new F61(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let g=await(async()=>{try{let b=await V5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(b.ok)return x.info("User free tier status:",b),b.result}catch(b){throw x.error("Failed to fetch free tier status:",b),b}})(),d=await F06();x.info("Loaded session state:",d),await bk1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new o01,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,planFileManager:V.planFileManager,threadID:M.threadID,threadFuzzyIndexer:P,worker:M,workerDeps:K,configService:V.configService,internalAPIClient:V5,ampURL:J.ampURL,startNewThread:D,switchToThread:z,ideClient:W2,connectedClientsService:new ni,commandRegistry:k,mcpService:V.mcpService,mcpTrustHandler:y,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:E,openThreadSwitcher:Q.openThreadSwitcher,updateService:I,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:d,freeTierStatus:{canUseAmpFree:g.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Z.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function nQ(J){if(J.interactive)k$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4841
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await Y16({...J,workspaceTrust:{current:!0,changes:D_},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 e16(J.mcpConfig);Y=J06(Y,G)}let X=await Y.get("url","global");if(!X)X=$Z;if(!HF(X))x.info("Targeting custom Amp server",{ampURL:X});return Y=iq0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:W06(await MR1(J,Y))}}function _B8(J){let Q={};for(let Z=0;Z<J.length;Z++){let Y=J[Z];if(Y?.startsWith("--")){let G=Y.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Z+1];if(V&&!V.startsWith("--"))Q[G]=V,Z++}}return Q}async function kB8(){let J=_B8(process.argv);if(Ye0({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),OB8(x),x.info("Starting Amp CLI.",{version:"0.0.1765368941-g355c71",buildTimestamp:"2025-12-10T12:20:52.541Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new T8(U$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await SB8().parseAsync(process.argv)}nE1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await kB8().catch(Qm)});async function yB8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),W5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4842
4842
  `);else if(!HF(J.ampURL))W5.write(`Logging in to ${new URL(J.ampURL).hostname}
4843
4843
  `);let Z=process.env.AMP_API_KEY;if(Z)W5.write(`API key found in environment variable, storing...
4844
4844
  `),await Q.set("apiKey",Z,J.ampURL),W5.write(`API key successfully stored.
@@ -4851,7 +4851,7 @@ This thread belongs to a different user and cannot be continued for security rea
4851
4851
  `);else W5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
4852
4852
  `);process.exit(0)}async function vB8(J,Q,Z,Y,X){OV(X,J);let G=await wV(Q,J);try{let V=H51(Z);if(!V)z51(Z);let K=V,q=Y.trim();if(q.length===0)_$("Thread name cannot be empty");if(q.length>256)_$("Thread name cannot exceed 256 characters");if(!(await fC(K,G)).messages.length)_$("Cannot rename an empty thread.");let H=pg(G);await(await Z3.getOrCreateForThread(H,K)).handle({type:"title",value:q}),x.info("GOT HERE"),await G.threadSyncService.sync(),x.info("GOT THERE"),W5.write(z4.green(`✓ Thread ${K} renamed to "${q}"
4853
4853
  `)),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose();let K=`Failed to rename thread: ${V instanceof Error?V.message:String(V)}`;_$(K)}}async function fB8(J,Q,Z,Y){OV(Y,J);let X=await wV(Q,J);try{let G=H51(Z);if(!G)z51(Z);let K=await fC(G,X),q=rT(K);W5.write(q+`
4854
- `),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)}`;_$(V)}}async function hB8(J,Q,Z,Y,X){OV(X,J);let G=await wV(Q,J);try{let V=await Dx1(Z),K=await fC(V,G),q=Y.typing!==!1,W=parseInt(Y.wpm||"120",10),H=parseInt(Y.messageDelay||"1000",10),z=parseInt(Y.toolProgressDelay||"800",10),U=parseInt(Y.exitDelay||"3",10)*1000,D=Y.indicator!==!1,M=pg(G),L=K.id;await G.threadStorage.set(L,K);let A=await Z3.getOrCreateForThread(M,L);await A.resume();let E=L11.fromWorker(A),I=new A11(G.threadStorage),P=t1.of([h0.file(process.cwd())]),R=hX1(void 0,P),k=new F61(G.mcpService,Q.settings.getWorkspaceRootPath()),y=z61("0.0.1765368086-g2f819e",G.settingsStorage);await bk1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new o01,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,planFileManager:G.planFileManager,threadID:L,threadFuzzyIndexer:I,worker:E,workerDeps:M,configService:G.configService,internalAPIClient:V5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:W2,connectedClientsService:new ni,commandRegistry:R,mcpService:G.mcpService,mcpTrustHandler:k,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await Qm(V,Z)}}async function bB8(J,Q,Z,Y,X){OV(Y,J);let G=await wV(Q,J);try{let V=H51(Z);if(!V)z51(Z);let K=V,q=await V5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=U61(J,W);if(!H&&!X)_$("Must specify either --visibility or --support");if(H&&X)_$("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)_$(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,B61(H)),W5.write(z4.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4854
+ `),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)}`;_$(V)}}async function hB8(J,Q,Z,Y,X){OV(X,J);let G=await wV(Q,J);try{let V=await Dx1(Z),K=await fC(V,G),q=Y.typing!==!1,W=parseInt(Y.wpm||"120",10),H=parseInt(Y.messageDelay||"1000",10),z=parseInt(Y.toolProgressDelay||"800",10),U=parseInt(Y.exitDelay||"3",10)*1000,D=Y.indicator!==!1,M=pg(G),L=K.id;await G.threadStorage.set(L,K);let A=await Z3.getOrCreateForThread(M,L);await A.resume();let E=L11.fromWorker(A),I=new A11(G.threadStorage),P=t1.of([h0.file(process.cwd())]),R=hX1(void 0,P),k=new F61(G.mcpService,Q.settings.getWorkspaceRootPath()),y=z61("0.0.1765368941-g355c71",G.settingsStorage);await bk1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new o01,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,planFileManager:G.planFileManager,threadID:L,threadFuzzyIndexer:I,worker:E,workerDeps:M,configService:G.configService,internalAPIClient:V5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:W2,connectedClientsService:new ni,commandRegistry:R,mcpService:G.mcpService,mcpTrustHandler:k,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await Qm(V,Z)}}async function bB8(J,Q,Z,Y,X){OV(Y,J);let G=await wV(Q,J);try{let V=H51(Z);if(!V)z51(Z);let K=V,q=await V5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=U61(J,W);if(!H&&!X)_$("Must specify either --visibility or --support");if(H&&X)_$("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)_$(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,B61(H)),W5.write(z4.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4855
4855
  `);if(X){await fC(K,G);let z=typeof X==="string"?X:void 0;await fI0(G.threadService,K,G.configService,z),W5.write(z4.green("✓ ")+`Thread ${K} has been shared with Amp support. These thread reports will be aggregated and analysed.
4856
4856
  `)}await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),_$(`Failed to update thread: ${V instanceof Error?V.message:String(V)}`)}}async function mB8(J,Q,Z,Y){OV(Y,J);let X=await wV(Q,J),G=pg(X);try{let V=await Dx1(Z),q=(await fC(V,X)).messages.length-1,W=await Z3.getOrCreateForThread(G,V),H=await tT(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await Bx1(H),W5.write(`${H}
4857
4857
  `),await X.asyncDispose(),process.exit(0)}catch(V){k$.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.1765368086-g2f819e",
3
+ "version": "0.0.1765368941-g355c71",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {