@sourcegraph/amp 0.0.1764861743-ga65d12 → 0.0.1764864084-g8f1ea4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +10 -10
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -3998,15 +3998,15 @@ Actual: ${X}`)}async function zK8(J,Q,Z){let{execSync:Y}=await import("node:ch
3998
3998
  ${D}`;if(X==="pnpm"&&D.includes("Unable to find the global bin directory"))M+=`
3999
3999
 
4000
4000
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
4001
- 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 Z41(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=DK8(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 v.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 v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function DK8(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}o0();function Y41(J,Q){let Z=new u4,Y=Z.pipe(E8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new KK().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 VR(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=RA(),W=await Z41(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 Q41();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}try{await rg(W.latestVersion,z);let U=await PB(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 VR(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Iq}from"node:process";function o96(J){let Q=new zA().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 iC1(Y.force||!1,Y.verbose||!1,"0.0.1764861743-ga65d12"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new zA("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 MK8(Y.targetVersion)});J.addCommand(Z)}async function MK8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Iq.write(_4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4001
+ 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 Z41(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=DK8(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 v.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 v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function DK8(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}o0();function Y41(J,Q){let Z=new u4,Y=Z.pipe(E8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new KK().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 VR(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=RA(),W=await Z41(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 Q41();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}try{await rg(W.latestVersion,z);let U=await PB(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 VR(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Iq}from"node:process";function o96(J){let Q=new zA().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 iC1(Y.force||!1,Y.verbose||!1,"0.0.1764864084-g8f1ea4"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new zA("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 MK8(Y.targetVersion)});J.addCommand(Z)}async function MK8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Iq.write(_4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
4002
4002
 
4003
4003
  `));try{if(!J){Iq.write(_4.blue(`Checking for updates...
4004
- `));let Y=RA(),{hasUpdate:X,latestVersion:G}=await Z41("0.0.1764861743-ga65d12",Y);if(!X){Iq.write(_4.green(`✓ Amp CLI is already up to date: ${"0.0.1764861743-ga65d12"} (${"released"} ${"2025-12-04T15:27:49.536Z"})
4005
- `));let K=await PB("0.0.1764861743-ga65d12");if(K.warning)Iq.write(`
4004
+ `));let Y=RA(),{hasUpdate:X,latestVersion:G}=await Z41("0.0.1764864084-g8f1ea4",Y);if(!X){Iq.write(_4.green(`✓ Amp CLI is already up to date: ${"0.0.1764864084-g8f1ea4"} (${"released"} ${"2025-12-04T16:07:11.774Z"})
4005
+ `));let K=await PB("0.0.1764864084-g8f1ea4");if(K.warning)Iq.write(`
4006
4006
  `+_4.yellow(K.warning)+`
4007
4007
  `);process.exit(0)}if(!G)Iq.write(_4.yellow("[WARN] could not find latest version")),process.exit(0);J=G}Iq.write(_4.blue(`Updating to version ${J}...
4008
4008
  `)),await rg(J,void 0,(Y)=>{Iq.write(_4.dim(`Running: ${Y}
4009
- `))});let Q="released";Iq.write(_4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-04T15:27:49.536Z"})
4009
+ `))});let Q="released";Iq.write(_4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-04T16:07:11.774Z"})
4010
4010
  `));let Z=await PB(J);if(Z.warning)Iq.write(`
4011
4011
  `+_4.yellow(Z.warning)+`
4012
4012
  `);process.exit(0)}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);Iq.write(_4.red.bold("Error: ")+Z+`
@@ -4643,7 +4643,7 @@ Ctrl-X Y Z to unlock`;if(U){let o=W.text.replace(/`([^`]+)`/g,"$1")+`
4643
4643
  `,A)])}),y];if(!q&&!U&&W.url){let m=W.url.replace(/^https?:\/\//,"");b.push(new u5({uri:W.url,text:m,style:new e({color:Z.secondary,underline:!0})}))}if(k&&!U)b.push(k);let d=new X0({width:40,child:new v0({crossAxisAlignment:"start",mainAxisSize:"min",children:b})});return f4.child(new A6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new NS1({width:ck1,height:lk1,agentMode:this.widget.agentMode,glow:this._glow,t:H,fps:0,shockwaves:this._shockwaves,onShockwave:P,...V==="disabled"&&{seed:42}}),new X0({width:2}),d]}))}}B0();R8();z4();V7();R8();o0();function $L8(J,Q){return`${J}:${Q}`}class ik1{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 Q0((Q)=>{return this.emitMainThread=(Z)=>Q.next(Z),()=>{this.emitMainThread=null}}),this.subthreadObservable=new Q0((Q)=>{return this.emitSubthread=(Z)=>Q.next(Z),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new Q0((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(tD()).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=$L8(Q,V.toolUse.id);if(this.subthreadPatchSubs.has(K))continue;let q=this.threadService.observePatches(V.threadID).pipe(tD()).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 Q0((Q)=>{return this.mainThreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),subthreads:new Q0((Q)=>{return this.subthreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),workerStatus:new Q0((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]=oL(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 GL8(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=fJ(J.mainThread);X.isCompleted=bZ6(W,Y.toolUse.id)}}let G=VL8(Z,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=wC(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=fJ(Z),V={...J.subagents};for(let z of Y){let U=V[z.threadID];if(!U)continue;let D=bZ6(G,z.toolUse.id);V[z.threadID]={...U,isCompleted:D}}let{items:K}=wC(Z),q=oL(Z,X),W=cE({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=oL(J.mainThread,Q.workerStatus);if(Z===J.viewState)return J;return{...J,viewState:Z}}default:return J}}function wC(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 bZ6(J,Q){let Z=J.get(Q);return(Z&&Y3(Z.run))??!1}function VL8(J,Q){let Z=J.messages.at(-1);if(Z?.content.some((X)=>X.type==="tool_result"&&X.run.status==="blocked-on-user"))return v.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(wC(J).items.some((X)=>X.type==="toolResult"&&X.toolResult.run.status==="in-progress")){let X=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools",{threadID:J.id,startTime:X,hasStartTime:!!X}),{type:"running-tools",startTime:X}}if(Z&&Z.role==="assistant"&&Z.state.type==="streaming")switch(Z.content.at(-1)?.type){case"text":return v.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return v.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let G=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}default:return v.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return v.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class nk1 extends d0{props;constructor(J){super();this.props=J}createState(){return new gZ6}}class gZ6 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 ik1(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=GL8(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===B5||G===l8||G===VY,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:uE(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 ak1 extends d0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new mZ6}}class mZ6 extends u0{build(J){let Z=Y6.of(J).colors,{todos:Y,title:X="TODOs"}=this.widget.props;if(!Array.isArray(Y)||Y.length===0)return new X0({width:0,height:0});let G=Y.map((V)=>this.buildTodoItem(V,Z));return new g0({child:new H6({padding:F0.symmetric(1,0),child:new v0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new k1({text:new i(X,new e({bold:!0,color:Z.foreground}))}),...G]})})})}buildTodoItem(J,Q){let Z=this.getStatusIcon(J.status),Y=J.status==="completed",X=new e({bold:J.status==="in-progress",color:Q.foreground,dim:Y}),G=new e({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:Y});return new A6({crossAxisAlignment:"start",children:[new k1({text:new i(Z,X)}),new X0({width:1}),new e6({child:new k1({text:new i(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class ok1 extends T6{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=Y6.of(J),Z=Q.colors.primary,Y=Q.colors.foreground;return new g0({decoration:new U8(void 0,new A4(new q4(Z,1,"rounded"),new q4(Z,1,"rounded"),void 0,new q4(Z,1,"rounded"))),child:new H6({padding:F0.horizontal(1),child:new v0({children:[new A6({crossAxisAlignment:"start",children:[new e6({child:new k1({text:new i(this.ad.content,new e({color:Y}))})}),new X0({width:4}),new u5({uri:"https://ampcode.com/free",text:"Ad",style:new e({color:Y,dim:!0})})]}),new A6({crossAxisAlignment:"start",children:[new RS1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:F0.horizontal(1),color:Z,reverse:!0}),new X0({width:2}),new k1({text:new i(this.ad.destinationUrlHostname,new e({color:Y,dim:!0}))})]})]})})})}}class rk1 extends d0{props;constructor(J){super();this.props=J}createState(){return new uZ6(this.props.autofocus??!0)}}class uZ6 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=v4.sizeOf(J),Y=Math.min(60,Z.width-4),X=Z.height-4,G=[];if(this.widget.props.title)G.push(new k1({text:new i(this.widget.props.title,new e({bold:!0,color:F1.blue}))}),new X0({height:1}));if(this.widget.props.message)G.push(new k1({text:new i(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)G.push(new X0({height:1}));let V=[];if(this.widget.props.showCopyOption)V.push(new k1({text:new i("Enter to copy",new e({dim:!0}))}));return V.push(new k1({text:new i("Escape to close",new e({dim:!0}))})),G.push(new A6({children:V.flatMap((K,q)=>q<V.length-1?[K,new X0({width:1}),new k1({text:new i("•",new e({dim:!0}))}),new X0({width:1})]:[K]),mainAxisSize:"min"})),new f4({child:new g0({constraints:new I6(Y,Y,0,X),decoration:new U8(F1.default(),new A4(new q4(F1.blue,1,"rounded"),new q4(F1.blue,1,"rounded"),new q4(F1.blue,1,"rounded"),new q4(F1.blue,1,"rounded"))),padding:new F0(2,2,2,2),child:new q8({autofocus:this.autofocus,onKey:Q,child:new v0({children:G,mainAxisSize:"min"})})})})}}class C91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,C91.prototype)}}class j91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,j91.prototype)}}function sk1(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})}rW();B0();import{spawn as KL8}from"node:child_process";import{promises as qL8}from"node:fs";function pZ6(J){return J.kind==="executable"}function dZ6(J){return J.kind==="markdown"}var $z=50000,cZ6=300000;async function tk1(J,Q,Z,Y={}){let{timeoutMs:X=cZ6,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(v.debug("Executing command",{commandName:J,filePath:K.filePath,args:Q}),dZ6(K))return await WL8(K,Q);else if(pZ6(K))return await HL8(K,Q,X,G);else return{success:!1,output:"",error:"Unsupported command type"}}catch(K){return v.error("Failed to execute command",{commandName:J,error:K}),{success:!1,output:"",error:K instanceof Error?K.message:"Unknown error occurred"}}}async function WL8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await qL8.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>$z?Z.slice(0,$z)+`
4644
4644
  ... (output truncated at ${$z} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function HL8(J,Q,Z=cZ6,Y){return new Promise((X)=>{let[G,V]=zL8(J,Q);v.debug("Spawning command",{spawnCommand:G,spawnArgs:V.slice(0,10),filePath:J.filePath,timeoutMs:Z});let K=NT0(Y),q=!1,W=setTimeout(()=>{q=!0,K.abort(),v.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),H=KL8(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<=$z)z.push(L);else{let A=$z-(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<=$z)U.push(L);else{let A=$z-(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?`
4645
4645
  ${E}`:E;if(D>$z)I+=`
4646
- ... (output truncated at ${$z} 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 zL8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return UL8(Z,Y?[...Y]:null,X,Q);else return FL8(Z,Y?[...Y]:null,X,Q)}function FL8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function UL8(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();OG();O7();vW();BY();mG();sW();gK();R8();V7();n_();o0();var MY6=q6(IP(),1);import{writeFile as BY6}from"fs/promises";import NY6 from"path";B0();BY();class ek1{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.1764861743-ga65d12"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Yr(Q,this.configService)}catch(Q){v.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class EC extends d0{props;constructor(J){super();this.props=J}createState(){return new lZ6}}class lZ6 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 iZ6 extends u0{controller=new R$;focusNode=new F8({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=Y6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=A4.all(new q4(Z.foreground,1,"solid")),q=new dA({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 A6({children:[new g0({decoration:{color:F1.default()},child:new k1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]}),H=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new i("Enter",new e({color:Y.keybind}))),z.push(new i(" to submit, ",new e({color:Z.foreground,dim:!0})));z.push(new i("Esc",new e({color:Y.keybind}))),z.push(new i(" to cancel",new e({color:Z.foreground,dim:!0})));let U=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i("",void 0,z)})});return new g0({decoration:{border:K,color:F1.default()},padding:F0.all(1),child:new v0({children:[H,new X0({height:1}),W,new t9,U]})})}}class S91 extends d0{props;constructor(J){super();this.props=J}createState(){return new iZ6}}sW();class nZ6 extends u0{controller=new R$;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new F8({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>=aF)return!1;let Q=GC(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=Y6.of(J),{colors:Z,app:Y}=Q,G=v4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new ZO({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:a8.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new q8({focusNode:this.focusNode,child:K}),W=new g0({constraints:new I6({maxHeight:V}),padding:F0.symmetric(1,0),child:q}),H=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=new g0({padding:F0.symmetric(1,0),child:new k1({text:this.isConfirmingClearInput?new i("",void 0,[new i("Esc",new e({color:Y.keybind})),new i(" again to clear input",new e({color:Z.foreground,dim:!0}))]):new i("",void 0,[new i("Press ",new e({color:Z.foreground,dim:!0})),new i("Enter",new e({color:Y.keybind})),new i(" to submit, ",new e({color:Z.foreground,dim:!0})),new i("Esc",new e({color:Y.keybind})),new i(" to clear",new e({color:Z.foreground,dim:!0}))])})}),U=[H,new X0({height:1}),new e6({child:W}),new X0({height:1}),z];return new g0({decoration:{border:A4.all(new q4(Z.foreground,1,"solid")),color:F1.default()},padding:F0.all(1),child:new v0({children:U})})}}class IC extends d0{props;constructor(J){super();this.props=J}createState(){return new nZ6}}import{isDeepStrictEqual as ML8}from"node:util";var BL8=/[\\/_ +.#"@[({&]/,NL8=/[\\/_ +.#"@[({&]/g,DL8=/[\s-]/,aZ6=/[\s-]/g;function k91(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=k91(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(DL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(aZ6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(BL8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(NL8),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=k91(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 _91(J){return J.toLowerCase().replace(aZ6," ")}function oZ6(J,Q){let Z=k91(J,Q,_91(J),_91(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=k91(J,K,_91(J),_91(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 PC{}class TC{}class y91{}class x91{}class rZ6 extends d0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new sZ6}}class sZ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function LL8(J,Q){if(J==="")return{matches:!0,score:1};let Z=oZ6(Q,J);return{matches:Z>0.15,score:Z}}class dQ extends d0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new tZ6}}class tZ6 extends u0{controller=new R$;focusNode;scrollController=new N7;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new F8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),m8.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(!ML8(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 PC){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 TC){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 y91){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 x91)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,...LL8(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;R81(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(),m8.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=Y6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=A4.all(new q4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new dA({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new cY({shortcuts:new Map([[new G4("ArrowDown"),new PC],[new G4("ArrowUp"),new TC],[new G4("Tab"),new PC],[new G4("Tab",{shift:!0}),new TC],[new G4("n",{ctrl:!0}),new PC],[new G4("p",{ctrl:!0}),new TC],[new G4("Enter"),new y91],[new G4("Escape"),new x91]]),focusNode:this.focusNode,child:V}),q=new $J({actions:new Map([[PC,new A8(this.invoke)],[TC,new A8(this.invoke)],[y91,new A8(this.invoke)],[x91,new A8(this.invoke)]]),child:K}),W=new A6({children:[new g0({decoration:{color:F1.default()},child:new k1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new X0({height:10,child:new f4({child:new k1({text:new i(L,new e({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new e6({child:new f4({child:new k1({text:new i(this.widget.props.emptyStateText,new e({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?F1.yellow:void 0,y=I?F1.black:Z.foreground;R=new g0({decoration:k?{color:k}:void 0,padding:F0.symmetric(2,0),child:new k1({text:new i(this.widget.props.getLabel(A),new e({color:y,dim:P}))})})}return new rZ6(new $8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new v0({children:L,crossAxisAlignment:"start"})}let z=new e6({child:new $8({onScroll:this.handleScroll,opaque:!1,child:new _5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i(this.widget.props.title,new e({color:F1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new X0({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 g0({padding:F0.vertical(1),child:new f4({child:A})}));else U.push(new X0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new g0({decoration:{border:X,color:F1.default()},padding:F0.symmetric(1,0),child:new v0({children:U})})}}class Jy1 extends d0{createState(){return new eZ6}}class eZ6 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 k1({text:new i("●",new e({color:this.isGreen?F1.green:F1.index(8),bold:!0})),maxLines:1})}}function AL8(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 iY.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 Qy1(J,Q,Z){return new k1({text:new i(`${J}${Q}`,new e({color:Z})),maxLines:1})}function OL8(J,Q,Z,Y){return[Qy1("+",J,Y.success),t9.horizontal(1),Qy1("~",Q,Y.warning),t9.horizontal(1),Qy1("-",Z,Y.destructive)]}class v91 extends T6{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=AL8(X),V=Math.max(0,...G.map((H)=>H.description.timeAgo.length)),K=Y6.of(J),q=new H6({padding:F0.symmetric(0,1),child:new f4({child:new k1({text:new i("",new e({color:K.colors.foreground,dim:!0}),[new i("Ctrl+T",new e({color:F1.blue,dim:!0})),new i(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new e({color:K.colors.foreground,dim:!0}))])})})});return new dQ({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=Y6.of(D),{colors:L}=M,A=z?F1.yellow:void 0,E=z?F1.black:L.foreground,I=F1.index(8),P=(X1,t)=>new X0({width:t,child:A6.end([new k1({text:new i(X1,new e({color:I}))})])}),R=this.props.threadViewStates[H.id],k=[],y=H.relationshipType==="handoff",x=new x81;if(H.depth>0){let X1=[],t=H.ancestorsAreLast.slice(1);for(let H1 of t)X1.push(new i(x.getAncestorPrefix(H1),new e({color:x.connectorColor,dim:x.connectorDim})));let p=H.isLast?x.elbow:x.tee,J1=x.getConnectorText(p);X1.push(new i(J1,new e({color:x.connectorColor,dim:x.connectorDim}))),k.push(new k1({text:new i("",void 0,X1)}))}let b=[],d=this.props.currentThreadID===H.id?new i("(current) ",new e({color:F1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new i("(visited) ",new e({color:L.foreground,dim:!0})):null;if(d)b.push(new k1({text:d}));if(R){if(R.state==="active"&&(R.interactionState==="tool-running"||R.interactionState===!1))b.push(new Jy1),b.push(new X0({width:1}))}let m=H.title;if(H.relationshipType==="fork"){let X1=m.match(/^Forked\((\d+)\): /);if(X1)m=m.slice(X1[0].length);else while(m.startsWith("Forked: "))m=m.slice(8);b.push(new k1({text:new i("[fork] ",new e({color:F1.blue}))}))}else if(y)b.push(new k1({text:new i("[handoff] ",new e({color:F1.index(208)}))}));if(b.push(new e6({child:new k1({text:new i(m,new e({color:E})),overflow:"ellipsis",maxLines:1})})),b.push(new X0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let X1=z?{success:I,warning:I,destructive:I}:L;b.push(...OL8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,X1)),b.push(new X0({width:2}))}return b.push(P(H.description.timeAgo,V)),new g0({decoration:A?{color:A}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[...k,...b]})})}})}}function JY6(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 Zy1 extends T6{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)=>JY6(X.pubDate).length));return new dQ({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=Y6.of(K),{colors:W}=q,H=G?F1.yellow:void 0,z=G?F1.black:W.foreground,U=F1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new X0({width:A,child:A6.end([new k1({text:new i(L,new e({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[new e6({child:new k1({text:new i(X.title,new e({color:z})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new k1({text:new i(D,new e({color:U})),maxLines:1}),new X0({width:2}),M(JY6(X.pubDate),Z)]})})}})}}class Yy1 extends T6{props;constructor(J){super();this.props=J}build(){return new f4({child:new k1({text:new i("",void 0,[new i(`Forked to new thread:
4646
+ ... (output truncated at ${$z} 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 zL8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return UL8(Z,Y?[...Y]:null,X,Q);else return FL8(Z,Y?[...Y]:null,X,Q)}function FL8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function UL8(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();OG();O7();vW();BY();mG();sW();gK();R8();V7();n_();o0();var MY6=q6(IP(),1);import{writeFile as BY6}from"fs/promises";import NY6 from"path";B0();BY();class ek1{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.1764864084-g8f1ea4"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Yr(Q,this.configService)}catch(Q){v.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class EC extends d0{props;constructor(J){super();this.props=J}createState(){return new lZ6}}class lZ6 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 iZ6 extends u0{controller=new R$;focusNode=new F8({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=Y6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=A4.all(new q4(Z.foreground,1,"solid")),q=new dA({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 A6({children:[new g0({decoration:{color:F1.default()},child:new k1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]}),H=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new i("Enter",new e({color:Y.keybind}))),z.push(new i(" to submit, ",new e({color:Z.foreground,dim:!0})));z.push(new i("Esc",new e({color:Y.keybind}))),z.push(new i(" to cancel",new e({color:Z.foreground,dim:!0})));let U=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i("",void 0,z)})});return new g0({decoration:{border:K,color:F1.default()},padding:F0.all(1),child:new v0({children:[H,new X0({height:1}),W,new t9,U]})})}}class S91 extends d0{props;constructor(J){super();this.props=J}createState(){return new iZ6}}sW();class nZ6 extends u0{controller=new R$;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new F8({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>=aF)return!1;let Q=GC(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=Y6.of(J),{colors:Z,app:Y}=Q,G=v4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new ZO({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:a8.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new q8({focusNode:this.focusNode,child:K}),W=new g0({constraints:new I6({maxHeight:V}),padding:F0.symmetric(1,0),child:q}),H=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=new g0({padding:F0.symmetric(1,0),child:new k1({text:this.isConfirmingClearInput?new i("",void 0,[new i("Esc",new e({color:Y.keybind})),new i(" again to clear input",new e({color:Z.foreground,dim:!0}))]):new i("",void 0,[new i("Press ",new e({color:Z.foreground,dim:!0})),new i("Enter",new e({color:Y.keybind})),new i(" to submit, ",new e({color:Z.foreground,dim:!0})),new i("Esc",new e({color:Y.keybind})),new i(" to clear",new e({color:Z.foreground,dim:!0}))])})}),U=[H,new X0({height:1}),new e6({child:W}),new X0({height:1}),z];return new g0({decoration:{border:A4.all(new q4(Z.foreground,1,"solid")),color:F1.default()},padding:F0.all(1),child:new v0({children:U})})}}class IC extends d0{props;constructor(J){super();this.props=J}createState(){return new nZ6}}import{isDeepStrictEqual as ML8}from"node:util";var BL8=/[\\/_ +.#"@[({&]/,NL8=/[\\/_ +.#"@[({&]/g,DL8=/[\s-]/,aZ6=/[\s-]/g;function k91(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=k91(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(DL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(aZ6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(BL8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(NL8),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=k91(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 _91(J){return J.toLowerCase().replace(aZ6," ")}function oZ6(J,Q){let Z=k91(J,Q,_91(J),_91(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=k91(J,K,_91(J),_91(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 PC{}class TC{}class y91{}class x91{}class rZ6 extends d0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new sZ6}}class sZ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function LL8(J,Q){if(J==="")return{matches:!0,score:1};let Z=oZ6(Q,J);return{matches:Z>0.15,score:Z}}class dQ extends d0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new tZ6}}class tZ6 extends u0{controller=new R$;focusNode;scrollController=new N7;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new F8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),m8.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(!ML8(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 PC){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 TC){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 y91){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 x91)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,...LL8(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;R81(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(),m8.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=Y6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=A4.all(new q4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new dA({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new cY({shortcuts:new Map([[new G4("ArrowDown"),new PC],[new G4("ArrowUp"),new TC],[new G4("Tab"),new PC],[new G4("Tab",{shift:!0}),new TC],[new G4("n",{ctrl:!0}),new PC],[new G4("p",{ctrl:!0}),new TC],[new G4("Enter"),new y91],[new G4("Escape"),new x91]]),focusNode:this.focusNode,child:V}),q=new $J({actions:new Map([[PC,new A8(this.invoke)],[TC,new A8(this.invoke)],[y91,new A8(this.invoke)],[x91,new A8(this.invoke)]]),child:K}),W=new A6({children:[new g0({decoration:{color:F1.default()},child:new k1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new X0({height:10,child:new f4({child:new k1({text:new i(L,new e({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new e6({child:new f4({child:new k1({text:new i(this.widget.props.emptyStateText,new e({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?F1.yellow:void 0,y=I?F1.black:Z.foreground;R=new g0({decoration:k?{color:k}:void 0,padding:F0.symmetric(2,0),child:new k1({text:new i(this.widget.props.getLabel(A),new e({color:y,dim:P}))})})}return new rZ6(new $8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new v0({children:L,crossAxisAlignment:"start"})}let z=new e6({child:new $8({onScroll:this.handleScroll,opaque:!1,child:new _5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i(this.widget.props.title,new e({color:F1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new X0({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 g0({padding:F0.vertical(1),child:new f4({child:A})}));else U.push(new X0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new g0({decoration:{border:X,color:F1.default()},padding:F0.symmetric(1,0),child:new v0({children:U})})}}class Jy1 extends d0{createState(){return new eZ6}}class eZ6 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 k1({text:new i("●",new e({color:this.isGreen?F1.green:F1.index(8),bold:!0})),maxLines:1})}}function AL8(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 iY.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 Qy1(J,Q,Z){return new k1({text:new i(`${J}${Q}`,new e({color:Z})),maxLines:1})}function OL8(J,Q,Z,Y){return[Qy1("+",J,Y.success),t9.horizontal(1),Qy1("~",Q,Y.warning),t9.horizontal(1),Qy1("-",Z,Y.destructive)]}class v91 extends T6{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=AL8(X),V=Math.max(0,...G.map((H)=>H.description.timeAgo.length)),K=Y6.of(J),q=new H6({padding:F0.symmetric(0,1),child:new f4({child:new k1({text:new i("",new e({color:K.colors.foreground,dim:!0}),[new i("Ctrl+T",new e({color:F1.blue,dim:!0})),new i(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new e({color:K.colors.foreground,dim:!0}))])})})});return new dQ({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=Y6.of(D),{colors:L}=M,A=z?F1.yellow:void 0,E=z?F1.black:L.foreground,I=F1.index(8),P=(X1,t)=>new X0({width:t,child:A6.end([new k1({text:new i(X1,new e({color:I}))})])}),R=this.props.threadViewStates[H.id],k=[],y=H.relationshipType==="handoff",x=new x81;if(H.depth>0){let X1=[],t=H.ancestorsAreLast.slice(1);for(let H1 of t)X1.push(new i(x.getAncestorPrefix(H1),new e({color:x.connectorColor,dim:x.connectorDim})));let p=H.isLast?x.elbow:x.tee,J1=x.getConnectorText(p);X1.push(new i(J1,new e({color:x.connectorColor,dim:x.connectorDim}))),k.push(new k1({text:new i("",void 0,X1)}))}let b=[],d=this.props.currentThreadID===H.id?new i("(current) ",new e({color:F1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new i("(visited) ",new e({color:L.foreground,dim:!0})):null;if(d)b.push(new k1({text:d}));if(R){if(R.state==="active"&&(R.interactionState==="tool-running"||R.interactionState===!1))b.push(new Jy1),b.push(new X0({width:1}))}let m=H.title;if(H.relationshipType==="fork"){let X1=m.match(/^Forked\((\d+)\): /);if(X1)m=m.slice(X1[0].length);else while(m.startsWith("Forked: "))m=m.slice(8);b.push(new k1({text:new i("[fork] ",new e({color:F1.blue}))}))}else if(y)b.push(new k1({text:new i("[handoff] ",new e({color:F1.index(208)}))}));if(b.push(new e6({child:new k1({text:new i(m,new e({color:E})),overflow:"ellipsis",maxLines:1})})),b.push(new X0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let X1=z?{success:I,warning:I,destructive:I}:L;b.push(...OL8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,X1)),b.push(new X0({width:2}))}return b.push(P(H.description.timeAgo,V)),new g0({decoration:A?{color:A}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[...k,...b]})})}})}}function JY6(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 Zy1 extends T6{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)=>JY6(X.pubDate).length));return new dQ({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=Y6.of(K),{colors:W}=q,H=G?F1.yellow:void 0,z=G?F1.black:W.foreground,U=F1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new X0({width:A,child:A6.end([new k1({text:new i(L,new e({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[new e6({child:new k1({text:new i(X.title,new e({color:z})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new k1({text:new i(D,new e({color:U})),maxLines:1}),new X0({width:2}),M(JY6(X.pubDate),Z)]})})}})}}class Yy1 extends T6{props;constructor(J){super();this.props=J}build(){return new f4({child:new k1({text:new i("",void 0,[new i(`Forked to new thread:
4647
4647
 
4648
4648
  `,new e({color:F1.white,dim:!0})),new i(`"${this.props.newThreadTitle||"Untitled"}"`,new e({color:F1.white}))]),textAlign:"center"})})}}B0();class QY6 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){v.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){v.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){if(J.length===0)return null;if(J.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(J))return"Label must be lowercase alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null}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=Y6.of(J),{colors:Z}=Q,Y=this.currentQuery.trim().toLowerCase(),X=Y.length>0?this.getValidationError(Y):null;return new dQ({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?F1.yellow:void 0,H=V?F1.black:Z.foreground;if("__isCreateMarker"in G&&G.__isCreateMarker)return new g0({decoration:W?{color:W}:void 0,padding:F0.symmetric(2,0),child:new k1({text:new i("",void 0,[new i("Create: ",new e({color:H})),new i(G.name,new e({color:H,bold:!0}))])})});return new g0({decoration:W?{color:W}:void 0,padding:F0.symmetric(2,0),child:new k1({text:new i(G.name,new e({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 Xy1 extends d0{props;constructor(J){super();this.props=J}createState(){return new QY6}}class hq extends d0{props;constructor(J){super();this.props=J}createState(){return new ZY6}}class ZY6 extends u0{_spinner=new C$;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=Y6.of(J),{colors:Z}=Q,Y=A4.all(new q4(Z.foreground,1,"solid")),X=this._spinner.toBraille(),G=new k1({textAlign:"center",text:new i("",void 0,[new i(X,new e({color:F1.yellow})),new i(" ",void 0),new i(this.widget.props.message,new e({color:Z.foreground}))])}),K=[new e6({child:new v0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[G]})})];if(this.widget.props.onAbort)K.push(new X0({height:2,child:new g0({padding:F0.symmetric(2,0),child:new k1({text:new i("",new e({dim:!0}),[new i("Press ",new e({color:Z.foreground})),new i("Esc",new e({color:Z.info})),new i(" to cancel",new e({color:Z.foreground}))])})})}));let q=new g0({decoration:new U8(F1.default(),Y),child:new X0({width:60,height:7,child:new v0({mainAxisAlignment:"start",children:K})})});if(this.widget.props.onAbort)return new q8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:q});return q}}class LV extends d0{props;constructor(J){super();this.props=J}createState(){return new YY6}}class YY6 extends u0{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof DV}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=S81(Q);return{title:W.title,type:W.type,description:W.description}})(),Y=Z.type==="error"?F1.red:F1.yellow,X=A4.all(new q4(F1.default(),1,"solid")),G=new g0({padding:F0.symmetric(1,0),child:new k1({text:new i(Z.title,new e({color:Y,bold:!0}))})}),V=this.isWidgetMessage(Q)?Q.widget:new k1({text:new i(Z.description,new e({color:F1.default()})),selectable:!0}),K=new e6({child:new mA({child:new g0({padding:F0.symmetric(1,0),child:V})})}),q=new g0({padding:F0.symmetric(1,0),child:new k1({text:this.widget.props.onRetry?new i("",void 0,[new i("Press ",new e({color:F1.default(),dim:!0})),new i("R",new e({color:F1.yellow})),new i(" to retry, ",new e({color:F1.default(),dim:!0})),new i("Esc",new e({color:F1.yellow})),new i(" to cancel",new e({color:F1.default(),dim:!0}))]):new i("Press any key to close",new e({color:F1.default(),dim:!0,italic:!0}))})});return new q8({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 g0({decoration:{border:X,color:F1.default()},padding:F0.all(1),child:new v0({mainAxisAlignment:"center",children:[G,new X0({height:1}),K,q]})})})}}class $y1 extends T6{build(){return new f4({child:new k1({text:new i("",void 0,[new i(`✓ Thread Shared
4649
4649
 
@@ -4735,7 +4735,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
4735
4735
  `)?`${K}...`:X,W=new e({color:F1.index(8)}),H=[new i(q,W)];if(V>0){let z=new e({color:Z.success});for(let U=1;U<=V;U++)H.push(new i(" ")),H.push(new i(`[${U}]`,z))}return new H6({padding:F0.only({bottom:0}),child:new A6({crossAxisAlignment:"start",children:[new H6({padding:F0.only({right:1}),child:new k1({text:new i("•",new e({color:F1.index(8)}))})}),new e6({child:new k1({text:new i("",void 0,H)})})]})})}}class cy1 extends d0{createState(){return new HX6}}class HX6 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 e({color:F1.red}),Z=new e({color:this._visible?F1.red:F1.transparent()});return new A6({children:[new k1({text:new i("⏺",Z)}),new X0({width:1}),new k1({text:new i("Replay",Q)})]})}}class ly1 extends T6{entry;width;constructor({key:J,entry:Q,width:Z}){super({key:J});this.entry=Q,this.width=Z}build(J){let Z=Y6.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 k1({text:new i(U,new e({color:Z,dim:!0}))}),M=new k1({text:new i(q,new e({color:Z,dim:!0}))});return new $8({onClick:()=>GJ(J,Y.link),cursor:"pointer",child:new X0({width:this.width,height:1,child:new H6({padding:F0.horizontal(1),child:new A6({children:[new e6({child:new fB(new X0({width:W,height:1,child:D}))}),M]})})})})}truncateToWidth(J,Q){if(J.length<=Q)return J;return J.slice(0,Q-1)+"…"}}o0();function gA8(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 iy1{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=gA8(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}})}}B0();R8();class ny1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new N7;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){v.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){v.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(tD()).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 zX6(J,Q){switch(J){case"update-available":return[new i("A newer Amp is available. Run ",new e({color:Q.foreground,dim:!0})),new i("amp update",new e({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new i("Update complete, run ",new e({color:Q.foreground,dim:!0})),new i("amp update",new e({color:Q.warning})),new i(" to see warnings",new e({color:Q.foreground,dim:!0}))];case"update-error":return[new i("Update failed, run ",new e({color:Q.foreground,dim:!0})),new i("amp update",new e({color:Q.warning})),new i(" to see warnings",new e({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function cA8(J){return new Promise((Q)=>{uA8("git",["branch","--show-current"],{cwd:J},(Z,Y)=>{if(Z){Q(null);return}let X=Y.trim();Q(X||null)})})}class AX6 extends d0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new Jx1}}class Jx1 extends u0{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;threadLoadSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;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 ny1;previewThread=null;planScrollController=(()=>{let J=new N7;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new N7;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new F8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new F8({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;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;pendingMCPServers=[];mcpTrustSubscription=null;mcpServers=[];mcpServersSubscription=null;cacheTimerState=null;cacheTimerSubscription=null;agentModeController=null;freeTierStatus=void 0;agentModePulseSeq=0;agentModeSlideProgress=null;agentModeSlideTimer=null;updateState="hidden";updateServiceSubscription=null;toastController=new vS1;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"];async initThreadFeed(){let J=await V6(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){v.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 n2(q,K,this.widget.dependencies.configService)},G=qo0();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 sj1(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){v.error("Thread feed: error in next handler",K)}},error:(V)=>{v.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}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(`
4736
4736
  `);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),a8.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 i(this.submitDisabledHint,new e({color:J.foreground,dim:!0}));if(this.isExiting)return new i("Exiting...",new e({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new i("",void 0,[new i("Ctrl+C",new e({color:Q.keybind})),new i(" again to exit",new e({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new i("",void 0,[new i("Esc",new e({color:Q.keybind})),new i(" again to clear input",new e({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new i("",void 0,[new i("Escape",new e({color:Q.keybind})),new i(" to close help",new e({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let X=this.getEffectiveAgentMode(),G=ey1(X);return new i("",void 0,[new i("Images aren't supported in ",new e({color:J.warning,dim:!1})),new i(X,new e({color:G})),new i(" mode.",new e({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new i("",void 0,[new i("Esc",new e({color:Q.keybind})),new i(" again to cancel",new e({color:J.foreground,dim:!0}))]);return new i("",void 0,[new i("Esc",new e({color:Q.keybind})),new i(" to cancel",new e({color:J.foreground,dim:!0}))])}if(this.statusMessage)return new i(this.statusMessage,new e({color:J.foreground,dim:!0}));let Z=zX6(this.updateState,J);if(Z)return new i("",void 0,Z);let Y=this.widget.dependencies.worker.thread;if(Y.agentMode==="plan"&&_A(Y))return new i("",void 0,[new i("Ctrl+O",new e({color:Q.keybind})),new i(" → Execute Plan",new e({color:J.foreground,dim:!0}))]);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker: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){v.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 J2.getOrCreateForThread(Z,X),K=await qR(V,Y,G-1);await this.switchToExistingThread(K)}catch(V){v.error("Failed to fork thread:",V),this.showErrorMessage(`Failed to fork thread: ${V}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState: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=bB(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){v.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){v.error("Failed to edit message:",V)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(f2)}catch(Z){return v.error("Failed to get affected files:",Z),[]}};textController=new R$;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new N7);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(Vj1(Y))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new u7("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 Z=bB(J)?.visibility;if(Z!==this.currentShellModeStatus)this.currentShellModeStatus=Z,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}),m8.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}),m8.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 By1(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 My1(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=R6(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,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??!1,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 C91("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 v.error("Failed to create handoff thread",H),{ok:!1,error:H instanceof Error?H:Error(String(H))}}},getGuidanceFiles:async(G)=>{if(!Q.mainThread)return[];return(await Ps({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){v.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,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 iy1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=UY6(Q),this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await cA8(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===hB).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===hB};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=k76(()=>{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(!zy(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>=aF)return!1;let Z=GC(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)v.error("Failed to destruct mysterious message",Q.error);else this.setState(()=>{this.mysteriousMessage=null,this.isShowingMysteriousMessageModal=!1})}).catch((Q)=>{v.error("Failed to destruct mysterious message",Q)})};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 BV(W);try{let H=await Z(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")v.error("Failed to read temporary file",H)}try{await Y(W),await X(q)}catch(H){v.warn("Failed to clean up temporary file",H)}}catch(q){v.error("Error opening editor:",q)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=bB(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();a8.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),a8.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),a8.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Z)=>{m8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Z.hasFocus})})}),V6(this.widget.dependencies.configService.config).then((Z)=>{this.paletteConfig=Z,this.agentModeController=new YS1({initialCliMode:this.widget.dependencies.initialAgentMode,sessionState:this.widget.dependencies.sessionState??null,freeTierStatus:this.freeTierStatus?{canUseAmpFree:this.freeTierStatus.canUseAmpFree,eligible:this.freeTierStatus.eligible,workspaceAllowsAmpFree:this.freeTierStatus.workspaceAllowsAmpFree}:void 0,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.adSubscription=Sj1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let Z=this.agentModeController?.getMode();return(Z&&P9(Z)||this.randomAd===null)&&jj1(this.lastUserInteractionTime)}).subscribe({next:(Z)=>{if(Z){let Y=pA8(16).toString("hex");this.lastAdImpressionId=Y,Promise.resolve().then(() => ($51(),X51)).then(({recordAdEvent:X})=>{let G=this.widget.dependencies.worker.thread,V=G.messages[G.messages.length-1];X("viewed",{adId:Z.id,advertiserId:Z.advertiserId,threadId:G.id,messageId:V?.messageId,impressionId:Y,placement:"tui",matchType:Z.metadata?.matchType,matchedPatterns:Z.metadata?.matchedPatterns,candidateAdPoolCount:Z.metadata?.candidateAdPoolCount,clientRegion:Z.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=Z}),m8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}});let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Z)=>{this.setState(()=>{this.pendingMCPServers=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)=>{this.setState(()=>{this.ideStatus=Z})}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Z)=>{let Y=this.widget.dependencies.getCurrentWorker();if(!Y){v.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}]}}),v.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),v.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=I41(this.widget.dependencies.configService).pipe(f5((Z)=>Z!=="pending"),Q6((Z)=>P41(Z)?Z.mysteriousMessage??null:null),N4((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 L81(new Map([[new M81(Jx1.MYSTERY_SEQUENCE),new Rm]])),this.mysteryKeyInterceptorUnsubscribe=a8.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()}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.adSubscription)this.adSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(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.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(Vj1("")),this.shouldUseProgressBar())process.stdout.write(b56())}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(){}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){v.error("No current tool confirmation found");return}let Z=Q.tools[0]?.useBlock;if(!Z){v.error("No tool use block found in confirmation");return}if(J==="allow-all-session")LG("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(X){if(X&&X instanceof Error)this.setState(()=>{this.displayMessage=X});else v.error("Failed to write dangerouslyAllowAll setting:",X);return}if(J==="always-guarded"){let X=Q.tools[0]?.toAllow??[],G=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],V=[...X,...G];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",V,"global")}if(J==="connect-github"){let X=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();await GJ(this.context,X);return}if(J==="disable-librarian"){let X=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!X.includes(VY))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,VY],"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 J2.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(X);else await this.widget.dependencies.worker.handle(X)}catch(X){v.error("Failed to send tool confirmation:",X)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};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}),K41({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 BV(Q.getSettingsFilePath())}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);await this.showErrorMessage(`Failed to open settings: ${Y}`)}};cancelStreamingMessage=async()=>{await J2.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{v.info(`[switchToExistingThread] Switching to thread: ${J}`);let Y=await this.widget.dependencies.switchToThread(J);if(v.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),v.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),Y.thread.draft)if(v.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(`
4737
4737
  `);if(V)this.textController.insertText(V);if(G.length>0)this.setState(()=>{this.imageAttachments=G})}}catch(Y){throw v.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=m2(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)K41({agentMode:Y});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),m8.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();K41({agentMode:Q}).catch((Z)=>{v.warn("Failed to save session state on exit:",Z)}).finally(()=>{a8.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=dA8();if(J===Q)return"~";if(J.startsWith(Q+am.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(am.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(am.sep),"…",Q.slice(-2).join(am.sep)].join(am.sep)}build(J){let Q=v4.of(J),Z=Y6.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=K&&this.randomAd!==null,W=!K&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden,H=Boolean(q),{threadState:z}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let U=this.getCurrentConfirmation(),D=this.widget.dependencies.replayMode,M=Boolean(D),L=z.items,A=z.mainThread||void 0,E=z.subagentToolsByParentID,I=z.todosList;if(M){let b6={...D.thread,messages:this.replayDisplayedMessages};L=wC(b6).items,A=b6,E={};let l6=cE({messages:this.replayDisplayedMessages});I=Array.isArray(l6)?l6:[]}let P=A?.id,R=A,k=M?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),y=(b6)=>new E91({key:new u7(`preview-message-view-${b6.id}`),items:wC(b6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:b6,focusNode:new F8({debugLabel:"PreviewFocus"})}),x=this.previewThread,b=x?x.messages.length>2000?new v0({mainAxisSize:"max",children:[new e6({child:new X0}),new H6({padding:F0.all(2),child:new f4({child:new k1({text:new i("Thread too long for preview",new e({color:X.mutedForeground,dim:!0}))})})})]}):y(x):k?new R91({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal}):new E91({key:P?new u7(`message-view-${P}`):void 0,items:L,subagentToolsByParentID:E,controller:P?this.getMessageScrollController(P):new N7,autofocus:!1,onCopy:M?void 0:this._handleTextCopy.bind(this),thread:R,onMessageEditSubmit:M?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:M?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:M?void 0:this.forkMessage,getAffectedFiles:M?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),d=Math.max(Math.floor(Q.size.height*0.4),12),m=this.getCurrentEphemeralError(),o=Q.size.width<40,X1=z.mainThread?mM0(z.mainThread):void 0,t=H91(J),p=this.buildBottomWidget(m,U,X,Z,z,I,d,H,M,X1,this.cacheTimerState??void 0,Q,t),J1=new h81({threadViewState:z.viewState,threadTokenUsage:X1,threadID:P??null,thread:z.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,mcpServers:this.mcpServers,isNarrow:o,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!U,showingEphemeralError:Boolean(z.viewState.state==="active"&&z.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),H1=new v81({bashInvocations:this.bashInvocations}),U1=[];if(W&&this.currentThreadFeedEntry)U1.push(new ly1({entry:this.currentThreadFeedEntry,width:Q.size.width}));let r=this.getEffectiveAgentMode(),n=this.currentShellModeStatus,l=ey1(r),W1=!n?r.length+1:0,_1=Q.capabilities.animationSupport,s=_1==="disabled"?0:_1==="slow"?30:60,m1=NK(r)?.uiHints?.fasterAnimation?3:1,S1=s>0&&this.agentModePulseSeq>0?new x9({children:[p,new S5({top:0,left:1,right:1,height:1,child:new my1({color:l,trigger:this.agentModePulseSeq,fps:s,speed:m1,leftOffset:W1})})]}):p;U1.push(new e6({child:b}),H1);let I0=new x9({children:[new v0({mainAxisSize:"min",children:[q?new ok1({ad:this.randomAd,onButtonClick:async()=>{let b6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => ($51(),X51)).then(({recordAdEvent:B9})=>{let O4=this.widget.dependencies.worker.thread,UJ=O4.messages[O4.messages.length-1];B9("clicked",{adId:b6.id,advertiserId:b6.advertiserId,threadId:O4.id,messageId:UJ?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:b6.metadata?.matchType,matchedPatterns:b6.metadata?.matchedPatterns,candidateAdPoolCount:b6.metadata?.candidateAdPoolCount,clientRegion:b6.metadata?.clientRegion})});if(!await GJ(this.context,b6.shortDestinationUrl)){let O4=a8.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:O4,url:b6.shortDestinationUrl}})}}}):new X0({height:0}),new g0({constraints:new I6(0,Q.size.width,0,d),child:S1})]}),H?new S5({top:0,left:0,right:0,child:new EX6({userHeight:this.bottomGridUserHeight,maxHeight:d,onInitializeHeight:(b6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(b6,d)})},onDrag:(b6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(b6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let l6=Math.floor(b6.localPosition.y)-this.bottomGridDragStartY,B9=Math.max(4,this.bottomGridDragStartHeight-l6),O4=Math.min(B9,d),UJ=Math.floor(O4);if(this.bottomGridUserHeight!==UJ)this.setState(()=>{this.bottomGridUserHeight=UJ})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new X0({height:0})]});U1.push(I0,new X0({height:1,child:new H6({padding:F0.horizontal(1),child:J1})}));let T1=new v0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:U1}),z1=M&&D?.showIndicator!==!1?new x9({children:[T1,new S5({top:0,left:0,child:new cy1})]}):T1,Z1=new A8(()=>{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((l6)=>{v.error("Failed to mark message as interrupted:",l6)}),this.cancelStreamingMessage().catch((l6)=>{v.error("Failed to cancel streaming message:",l6)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return v.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.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"}),O1=new A8(()=>{return this.onExitPressed(),"handled"}),A1=new A8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),R1=new A8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),j1=new A8(()=>{return WJ.instance.toggleAll(),"handled"}),c1=new A8(()=>{return this.widget.dependencies.configService.getLatest().then((b6)=>{LG("internal.showDetailedCosts",!(b6.settings["internal.showDetailedCosts"]??!1))}),"handled"}),g1=new A8(()=>{return a8.instance.toggleFrameStatsOverlay(),"handled"}),s1=new A8(()=>{return a8.instance.tuiInstance.getScreen().markForRefresh(),m8.instance.requestFrame(),"handled"}),K0=new A8(()=>{return this.toggleAgentMode(),"handled"}),q0=new A8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6){let B9=Math.max(Math.floor(Q.size.height*0.4),10),O4=Q.size.height-B9;l6.animatePageUp(O4,100)}return"handled"}),k0=new A8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6){let B9=Math.max(Math.floor(Q.size.height*0.4),10),O4=Q.size.height-B9;l6.animatePageDown(O4,100)}return"handled"}),v6=new A8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6)l6.animateTo(0,100);return"handled"}),u6=new A8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6)l6.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),e4=new A8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:b6}=this.widget.dependencies;if(!b6.mainThread?.messages.some((B9)=>B9.role==="user"||dE(B9)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),r8=new A8((b6)=>{if(b6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),a9=new A8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return j81().then(async(b6)=>{if(b6)try{this.handleInsertImage(b6)}finally{try{let{unlink:l6}=await import("node:fs/promises");await l6(b6)}catch{}}}),"handled"}),E0=new Map([[G4.ctrl("c"),new Am],[G4.ctrl("l"),new Pm],[G4.ctrl("o"),new P81],[G4.ctrl("v"),new Mm],[G4.alt("s"),new qC],[G4.ctrl("s"),new qC],[G4.alt("p"),new Im],[G4.ctrl("r"),new wm],[G4.alt("d"),new Em],[G4.ctrl("t"),new Tm],[G4.key("PageUp"),new O81],[G4.key("PageDown"),new w81],[G4.key("Home"),new E81],[G4.key("End"),new I81],[G4.key("Escape"),new Lm],[G4.ctrl("p"),new WC("previous")],[G4.ctrl("n"),new WC("next")],[G4.key("Tab"),new Cm]]);if(!v3())E0.set(G4.key("ArrowUp"),new Cm);if(!1)E0.set(G4.alt("c"),new Om);let Y4=new A8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),Z8=new A8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),u8=new A8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),Z7=new Map([[Lm,Z1],[Pm,s1],[qC,K0],[P81,Y4],[Mm,a9],[Om,A1],[B81,R1],[wm,j1],[Em,c1],[Im,g1],[Tm,Z8],[Am,O1],[O81,q0],[w81,k0],[E81,v6],[I81,u6],[Cm,e4],[WC,r8],[Rm,u8]]),s8=[z1];if(this.isShowingConsoleOverlay)s8.push(new Oy1);if(this.isShowingHelp&&this.paletteConfig)s8.push(new Iy1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)s8.push(new Bk1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)s8.push(new dy1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)s8.push(new rk1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(b6)=>{let l6=this.adActionModal.url;if(b6==="copy")try{await a8.instance.tuiInstance.clipboard.writeText(l6),this.setState(()=>{this.displayMessage=new lY("Link copied to clipboard")})}catch(B9){v.error("Failed to copy to clipboard",{error:B9}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:b6}=this.widget.dependencies;s8.push(new uy1({servers:this.pendingMCPServers,onAlwaysTrust:b6.trustAlways.bind(b6),onTrustOnce:b6.trustOnce.bind(b6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:b6.deny.bind(b6)}))}if(this.isShowingFileChangesOverlay)s8.push(new iS1({threadData:z}));if(this.isShowingContextDetailOverlay){let b6=this.threadCostInfo?.costBreakdownURL;s8.push(new wy1({thread:z.mainThread??void 0,tokenUsage:X1??void 0,cacheTimerState:this.cacheTimerState??void 0,costInfo:this.threadCostInfo,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})},onOpenCostBreakdown:b6?()=>{GJ(J,b6)}:void 0}))}if(this.isShowingConfirmationOverlay)s8.push(new Ly1({details:this.confirmationOverlayContent}));let Y7=this.getCommandPaletteContext(J);if(Y7&&this.isShowingPalette&&this.paletteConfig)s8.push(new f4({child:new Dy1({commandContext:Y7,mainThread:z.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)s8.push(new Ty1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let y5=new x9({children:s8});if(this.isShowingJetBrainsInstaller)return new pA({child:new $J({actions:Z7,child:new cY({shortcuts:E0,debugLabel:"jetbrains-installer-shortcuts",child:new gy1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Qz({controller:this.toastController,child:new pA({child:new fS1({controller:this.toastController,child:new $J({actions:Z7,child:new cY({shortcuts:E0,debugLabel:"main-app-shortcuts",child:y5})})})})})}buildScrollableTodoList(J,Q,Z){return new OX6({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 Ey1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new Ay1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new py1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let D=y81(Y),M=this.agentModeController?.isInRestrictedFreeMode()??!1,L=new ZO({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:a8.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 n=this.previousThreadIdForHint;if(n)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${n} `},onDoubleAtTrigger:q?void 0:()=>{let n=this.textController.text,l=this.textController.cursorPosition,_1=n.slice(0,l).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(_1!==-1){let s=this.textController.text,m1=s.slice(0,_1)+s.slice(_1+2);this.textController.text=m1,this.textController.cursorPosition=_1}},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"&&_A(X.mainThread),R,k;if(P){if(R=new fB(new I91({thread:X.mainThread,onExecute:async()=>{let n=this.getCommandPaletteContext();if(n)await this.getPaletteCommands().execute("execute-plan",n,void 0,new AbortController)},onEdit:async()=>{try{let n=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:l}=await this.widget.dependencies.planFileManager.ensureSync(X.mainThread.id);a8.instance.tuiInstance.suspend();let{execSync:W1}=await import("child_process");W1(`${n} "${l}"`,{stdio:"inherit"}),a8.instance.tuiInstance.resume()}catch(n){v.error("Failed to edit plan",n),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:Y}),{clipBehavior:"antiAlias"}),I)k=new Y51({queuedMessages:A});else if(E)k=this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!M,Y)}else R=I?new Y51({queuedMessages:A}):void 0,k=E?this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!M,Y):void 0;let y=[],x=this.currentShellModeStatus;if(x)y.push({child:new k1({text:new i(x==="hidden"?"shell mode (incognito)":"shell mode",new e({color:x==="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,m=this.agentModeController?.getVisibleModes()??[];if(!x&&m.length>1){let n=this.previewThread,l=n?n.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),W1=ey1(l),_1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,s=n??_1.thread,m1=m2(s)>0,S1=this.agentModeSlideProgress!==null,I0,T1;if(S1){I0="top-left";let z1=z.size.width-l.length-4-d;T1=Math.floor(this.agentModeSlideProgress*z1)}else if(m1)I0="top-right",T1=d;else I0="top-left",T1=void 0;if(n)y.push({child:new k1({text:new i(l,new e({color:W1}))}),position:I0,offsetX:T1});else{let r1=!m1&&!S1,z1=new k1({text:new i(l,new e({color:W1}))});y.push({child:r1?new $8({child:z1,onClick:this.toggleAgentMode,cursor:"pointer"}):z1,position:I0,offsetX:T1})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let n=this.connectedClientsStatus,l=n.mode||"disconnected",W1=!!n.errorMessage,_1=n.clientID||"unknown",s,m1;if(W1)s="●",m1=F1.red;else if(l==="presence")s="○",m1=F1.yellow;else if(l==="connected"&&n.connected)s="●",m1=F1.green;else s="○",m1=F1.yellow;let S1=this.connectedClientsStatusExpanded?`${_1} ${s}`:s;y.push({child:new $8({child:new k1({text:new i(S1,new e({color:m1}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let o=q?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:X.mainThread?.env?.initial.trees?.[0]?.uri,X1;if(o)X1=h0.parse(o).fsPath;else X1=process.cwd();let t=this.toHomeRelative(X1),p=this.shorten(t),J1=!q&&this.currentGitBranch?`${p} (${this.currentGitBranch})`:p;y.push({child:new k1({text:new i(J1,new e({color:Z.foreground,dim:!0}))}),position:"bottom-right"});let H1=this.previewThread,U1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(m2(U1.thread)>0&&!x&&!H1){let n=[],l=new e({color:Z.foreground,dim:!0}),W1=new i(" · ",l);if(W){let _1=W.totalInputTokens/W.maxInputTokens,s=Math.round(_1*100),m1=Math.max(0,Math.min(s,100)),S1=f81(_1,W.maxInputTokens),I0=l;if(S1==="danger")I0=new e({color:Z.destructive});else if(S1==="warning")I0=new e({color:Z.warning});else if(S1==="recommendation")I0=new e({color:Y.app.recommendation});let T1=Math.round(W.maxInputTokens/1000);n.push(new i(`${m1}% of ${T1}k`,I0))}if(U&&this.threadCostInfo?.totalCostUSD!=null&&this.threadCostInfo.totalCostUSD>0){if(n.length>0)n.push(W1);if(this.threadCostInfo.isFreeMode)n.push(new i(SA(this.threadCostInfo.totalCostUSD),new e({strikethrough:!0,color:Z.foreground,dim:!0}))),n.push(new i(" free",l));else n.push(new i(SA(this.threadCostInfo.totalCostUSD),l))}if(U&&H){let _1=X.viewState.state==="active"&&X.viewState.inferenceState==="idle",s=_76(H,_1);if(s){if(n.length>0)n.push(W1);let m1=l;if(s.urgency==="warning")m1=new e({color:Z.warning});n.push(new i(s.text,m1))}}if(n.length>0){let _1=new k1({text:new i("",void 0,n)});y.push({child:U?new $8({child:_1,onClick:this.showContextDetailOverlay,cursor:"pointer"}):_1,position:"top-left"})}}return new uS1({leftChild:new e6({child:L}),rightChild1:R,rightChild2:k,maxHeight:V,overlayTexts:y,borderColor:M||!this.isTextfieldAndAutocompleteFocused?F1.index(8):void 0,hasBanner:K,userHeight:this.bottomGridUserHeight,onInitializeHeight:(n)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(n,V)})},onDrag:(n)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(n.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let l=Math.floor(n.localPosition.y)-this.bottomGridDragStartY,W1=Math.max(4,this.bottomGridDragStartHeight-l),_1=Math.min(W1,V),s=Math.floor(_1);if(this.bottomGridUserHeight!==s)this.setState(()=>{this.bottomGridUserHeight=s})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!K})}}async function Qx1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)a8.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let Y=()=>null,G=!1,V=new oH(G,1000,J.inspectorPort),K=J.features?.find((A)=>A.name==="amp-connect")?.enabled??!1,q=new nk1({threadService:J.threadService,worker:J.worker,builder:(A,E,I,P,R,k)=>{if(Y=R,J.threadDependencies&&K)QS1(J.threadDependencies,J.configService,R,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((b)=>{v.error("Failed to start automatic presence:",b)});let y=R(),x={...J,worker:y,threadID:y.thread.id};return new AX6({...x,threadState:E,workerController:I,switchWorker:P,getCurrentWorker:R,recentThreadIDs:k})}}),W=new pS1({configService:J.configService,child:q}),H=new Nk1({configService:J.configService,child:W}),z=new CS1(H),U=new Y6({data:HC.fromBaseTheme(T$.default()),child:z});try{await wj1(U,{onRootElementMounted:(A)=>{if(v.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(() => (ZS1(),p36));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}`;q26(L,A,J.stdout)}}function ey1(J){let Z=NK(J)?.uiHints?.secondaryColor;if(Z)return F1.rgb(Z.r,Z.g,Z.b);return lA8(J)}class OX6 extends d0{props;constructor(J){super();this.props=J}createState(){return new wX6}}class wX6 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 A6({crossAxisAlignment:"stretch",children:[new e6({child:new _5({controller:Z,autofocus:!1,child:new ak1({todos:Q})})}),new qJ({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 EX6 extends T6{props;constructor(J){super();this.props=J}build(J){return new $8({child:new X0({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 lA8(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 F1.index(Z[Y])}Oj1();try{if(process.platform==="win32")await Promise.resolve().then(() => q6(lC(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){g$.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
4738
- `)}var Sv1=jv1.join(GU0||jv1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function zP8(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 h$(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")LG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")LG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")LG("model.sonnet",Q.useSonnet)}async function kv1(J){try{await qP8(jv1.dirname(Sv1),{recursive:!0}),await WP8(Sv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function FP8(){try{return(await rV6(Sv1,"utf-8")).trim()}catch(J){return null}}var nV6=[{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??A$,description:`Custom settings file path (overrides the default location ${A$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${CC1})`},{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:v3(),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:hE.SMART.key,description:`Set the agent mode (${kX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:kX().map((J)=>J.mode)}],aV6=(J)=>("deprecated"in J)&&J.deprecated===!0,UP8=(J)=>("hidden"in J)&&J.hidden===!0,BP8=(J)=>("default"in J),NP8=(J)=>("default"in J)?J.default:void 0;function DP8(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 I8(L$.unknownCommand(Z),1,V)}}var sV6=null;function XT5(){return sV6}function Du(J){return{...J,getThreadEnvironment:h61,vfs:AC0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Yv(J.fileSystem),generateThreadTitle:No0,deleteThread:(Q)=>J.threadService.delete(Q)}}var yv1=h0.file(HP8.homedir()),tV6=process.env.XDG_CONFIG_HOME?h0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(yv1,".config");async function b$(J,Q){sM0("0.0.1764861743-ga65d12");let Z=Uz1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Q0.of([h0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:yv1,userConfigDir:tV6}),{initializeCLITelemetry:Y}=await Promise.resolve().then(() => ($51(),X51));Y(Z);let X=await Z.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Re0({configService:Z}),K=new Map,q=()=>K.clear(),W=new jB1(Z,J.settings.getWorkspaceRootPath()),H=RR0({configService:Z,trustStore:W,createOAuthProvider:async(t,p,J1)=>{let H1=`${t}:${p}`,U1=K.get(H1);if(U1)return v.debug("Reusing existing OAuth provider for server",{serverName:t,serverUrl:p}),U1;v.debug("Creating OAuth provider for server",{serverName:t,serverUrl:p});let r=(async()=>{let n=new NM(J.secrets),l=await n.getClientInfo(t,p),W1=J1?.scopes??l?.scopes,_1=new sU1({storage:n,serverName:t,serverUrl:p,clientId:J1?.clientId??l?.clientId,clientSecret:J1?.clientSecret??l?.clientSecret,scopes:W1});return v.debug("OAuth provider created",{serverName:t,serverUrl:p,hasManualClientId:!!(J1?.clientId??l?.clientId),willUseDCR:!(J1?.clientId??l?.clientId),scopes:W1}),_1})();return K.set(H1,r),r}}),z=v01({configService:Z,filesystem:i8,spawn:ZA}),{initializeToolProviders:U,startToolProviders:D}=await Promise.resolve().then(() => (iV6(),lV6)),M;if(J.executeMode){let t=await U({toolService:G,providers:[H,z],initialTimeout:15000});M=t.registrations;for(let[p,J1]of t.initErrors)v.warn(`${p} provider initialization slow or failed:`,J1)}else M=D({toolService:G,providers:[H,z]});if(Q.jetbrains)iE("JetBrains");else if(Q.ide&&k96())iE("VS Code");else if(Q.ide&&y96())iE("Neovim");if(J.executeMode)tM0(!0);let L,A=V3.status.pipe(Q6((t)=>Boolean(t.connected&&t.authenticated)),N4()).subscribe((t)=>{if(t){if(!L)L=G.registerTool(Bs0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let t=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new a61(process.cwd(),{alwaysIncludePaths:t},!0)}else E=new class extends a61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(D5.write(`No API key found. Starting login flow...
4738
+ `)}var Sv1=jv1.join(GU0||jv1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function zP8(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 h$(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")LG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")LG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")LG("model.sonnet",Q.useSonnet)}async function kv1(J){try{await qP8(jv1.dirname(Sv1),{recursive:!0}),await WP8(Sv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function FP8(){try{return(await rV6(Sv1,"utf-8")).trim()}catch(J){return null}}var nV6=[{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??A$,description:`Custom settings file path (overrides the default location ${A$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${CC1})`},{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:v3(),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:hE.SMART.key,description:`Set the agent mode (${kX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:kX().map((J)=>J.mode)}],aV6=(J)=>("deprecated"in J)&&J.deprecated===!0,UP8=(J)=>("hidden"in J)&&J.hidden===!0,BP8=(J)=>("default"in J),NP8=(J)=>("default"in J)?J.default:void 0;function DP8(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 I8(L$.unknownCommand(Z),1,V)}}var sV6=null;function XT5(){return sV6}function Du(J){return{...J,getThreadEnvironment:h61,vfs:AC0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Yv(J.fileSystem),generateThreadTitle:No0,deleteThread:(Q)=>J.threadService.delete(Q)}}var yv1=h0.file(HP8.homedir()),tV6=process.env.XDG_CONFIG_HOME?h0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(yv1,".config");async function b$(J,Q){sM0("0.0.1764864084-g8f1ea4");let Z=Uz1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Q0.of([h0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:yv1,userConfigDir:tV6}),{initializeCLITelemetry:Y}=await Promise.resolve().then(() => ($51(),X51));Y(Z);let X=await Z.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Re0({configService:Z}),K=new Map,q=()=>K.clear(),W=new jB1(Z,J.settings.getWorkspaceRootPath()),H=RR0({configService:Z,trustStore:W,createOAuthProvider:async(t,p,J1)=>{let H1=`${t}:${p}`,U1=K.get(H1);if(U1)return v.debug("Reusing existing OAuth provider for server",{serverName:t,serverUrl:p}),U1;v.debug("Creating OAuth provider for server",{serverName:t,serverUrl:p});let r=(async()=>{let n=new NM(J.secrets),l=await n.getClientInfo(t,p),W1=J1?.scopes??l?.scopes,_1=new sU1({storage:n,serverName:t,serverUrl:p,clientId:J1?.clientId??l?.clientId,clientSecret:J1?.clientSecret??l?.clientSecret,scopes:W1});return v.debug("OAuth provider created",{serverName:t,serverUrl:p,hasManualClientId:!!(J1?.clientId??l?.clientId),willUseDCR:!(J1?.clientId??l?.clientId),scopes:W1}),_1})();return K.set(H1,r),r}}),z=v01({configService:Z,filesystem:i8,spawn:ZA}),{initializeToolProviders:U,startToolProviders:D}=await Promise.resolve().then(() => (iV6(),lV6)),M;if(J.executeMode){let t=await U({toolService:G,providers:[H,z],initialTimeout:15000});M=t.registrations;for(let[p,J1]of t.initErrors)v.warn(`${p} provider initialization slow or failed:`,J1)}else M=D({toolService:G,providers:[H,z]});if(Q.jetbrains)iE("JetBrains");else if(Q.ide&&k96())iE("VS Code");else if(Q.ide&&y96())iE("Neovim");if(J.executeMode)tM0(!0);let L,A=V3.status.pipe(Q6((t)=>Boolean(t.connected&&t.authenticated)),N4()).subscribe((t)=>{if(t){if(!L)L=G.registerTool(Bs0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let t=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new a61(process.cwd(),{alwaysIncludePaths:t},!0)}else E=new class extends a61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(D5.write(`No API key found. Starting login flow...
4739
4739
  `),!await MP8(J))await IA(),process.exit(1)}let I=await sj0({isDevelopment:!1}),P=new CP1(I,Z),R=new IP1(I,{lazy:!0}),k=new gB1(P,(t,p)=>{let J1=J2.get(t);if(J1)J1.handle(p).catch((H1)=>{v.error("Failed to apply artifact delta",H1)})}),y=Q.notifications!==void 0?Q.notifications:!J.executeMode,x=je0({playNotificationSound:async(t)=>{if(y){Ce0(t);let p=Lj1(),J1=Aj1();if((!p||J1)&&X.settings["notifications.system.enabled"]!==!1){if(t==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(t==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:P,configService:Z});v.info("Starting Amp background services");let b=Mo0({threadService:P,threadHistoryService:R,configService:Z,isExtensionDevelopment:!1}),d;V3.status.subscribe((t)=>{d=t});let m=new YG1({workspaceRoots:[h0.file(process.cwd())],getCurrentFile:()=>{if(!d?.openFile)return;try{return h0.parse(d.openFile)}catch(t){v.warn("Failed to parse current file URI",{uri:d.openFile,error:t});return}},getOpenFiles:()=>{if(!d?.visibleFiles?.length)return[];let t=d.openFile;return d.visibleFiles.filter((p)=>p!==t).map((p)=>{try{return h0.parse(p)}catch(J1){return v.warn("Failed to parse visible file URI",{uri:p,error:J1}),null}}).filter((p)=>p!==null)}}),o=new Ej1,X1={codebaseContextService:m,configService:Z,toolService:G,mcpService:H,trustStore:W,threadService:P,threadHistoryService:R,threadSyncService:b,planFileManager:k,threadStorage:I,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:x,fileSystem:Q.jetbrains||Q.ide?DC0:i8,terminal:o};return{...X1,async asyncDispose(){if(X1.mcpService.hasAuthenticatingClients())v.info("Waiting for OAuth authentication to complete before exit..."),await X1.mcpService.waitForAuthentication();for(let t of M.values())t.dispose();await X1.mcpService.dispose(),q(),await X1.threadService.asyncDispose(),X1.configService.unsubscribe(),V(),X1.fuzzyServer.dispose(),X1.threadSyncService.dispose(),X1.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function MP8(J){if(!J.executeMode){if(!await sC1("Would you like to log in to Amp? [(y)es, (n)o]: "))return D5.write(`Login cancelled. Run the command again to retry.
4740
4740
  `),!1}return await eV6(J)}async function eV6(J){let Q=KP8(32).toString("hex"),Z=await rC1(J.ampURL,Q),Y=new AbortController;try{await SW(Z,Y.signal)}catch(G){v.error("Error opening browser",{error:G})}let X=await rC1(J.ampURL,Q,!1);D5.write(`If your browser does not open automatically, visit:
4741
4741
 
@@ -4745,7 +4745,7 @@ ${_4.blue.bold(X)}
4745
4745
  Login successful! You can now use the Amp CLI.
4746
4746
  `),!0}catch(G){return v.error("Login failed",{error:G}),g$.write(`
4747
4747
  Login failed: ${G instanceof Error?G.message:String(G)}
4748
- `),!1}}function LP8(){let J=new zA().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)_R(),process.exit(0);let z=H.originalError??H;P86(z)}),J.option("-V, --version","Print the version number and exit",()=>{D5.write(`0.0.1764861743-ga65d12 (released 2025-12-04T15:27:49.536Z)
4748
+ `),!1}}function LP8(){let J=new zA().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)_R(),process.exit(0);let z=H.originalError??H;P86(z)}),J.option("-V, --version","Print the version number and exit",()=>{D5.write(`0.0.1764864084-g8f1ea4 (released 2025-12-04T16:07:11.774Z)
4749
4749
  `),process.exit(0)}),J.addHelpText("after",j96()),J.configureHelp({formatHelp:S96}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await oQ(U);await EP8(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 oQ(U);await wP8(D,await gC1(U,D.settings))});let Q=async(H,z,U)=>{Uz1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:Q0.of([h0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:yv1,userConfigDir:tV6});let D={...z,executeMode:!1};await _v1(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 oQ(U);await oV6(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 oQ(U);await SP8(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 oQ(D);if(z.pick)g$.write(`${_4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
4750
4750
  `);if(z.last||H||M.executeMode)await jP8(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 oQ(D);await CP8(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 oQ(U);await oV6(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 oQ(D);await RP8(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 oQ(M);await IP8(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 oQ(D);await PP8(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 oQ(D);await TP8(D,M,H,z,U)}),M76(J,async(H,z)=>{let U=await oQ(z);h$(H,z);let D=await b$(U,z);return{context:U,mcpService:D.mcpService,toolService:D.toolService,toolServices:D.toolService,configService:D.configService,cleanupTerminal:_R,asyncDispose:D.asyncDispose.bind(D)}}),F56(J,async(H)=>{let z=H.optsWithGlobals();return await oQ(z)}),Y56(J,async(H)=>{let z=await oQ(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{h$(U,H);let D=await b$(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 Dq(z,M),A=NP8(H);if(A)L.default(A);if(L.hidden=UP8(H)||aV6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of nV6)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 Dq("-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 Dq("-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 Dq("--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 Dq("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(q);let W=new Dq("--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 Dq("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return P76(J),J.action(async(H,z)=>{let U=H,D=await oQ(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")D5.write(_4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
4751
4751
  `)),process.exit(0);if(Object.keys(U).forEach((L)=>{let A=nV6.find((E)=>E.name===L);if(A&&aV6(A)&&!BP8(A))g$.write(_4.yellow(`Warning: '--${L}' flag is deprecated
@@ -4753,8 +4753,8 @@ Login failed: ${G instanceof Error?G.message:String(G)}
4753
4753
  Or pipe via stdin: echo "your message" | amp --execute`);h$(Z,Q);let V=await b$(J,Q);sV6=V;let K=Du(V),q=async(X1)=>{let t=await rV6(X1,"utf-8"),p=JSON.parse(t);if(!yX(p.id))throw new I8(L$.invalidThreadId);return n51(V,{visibility:Y,agentMode:Q.mode,thread:p})},W=async(X1)=>{if(!yX(X1))throw new I8(L$.invalidThreadId);try{let[p,J1]=await Promise.all([X5.getThreadLinkInfo({thread:X1},{config:V.configService}),X5.getUserInfo({},{config:V.configService})]);if(p.ok&&J1.ok){let H1=p.result.creatorUserID,U1=J1.result.id;if(H1&&H1!==U1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new I8(`Cannot resume thread created by another user.
4754
4754
 
4755
4755
  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(p){if(p instanceof I8)throw p;v.warn("Failed to validate thread ownership in CLI, allowing to open",{error:p})}let t=await V.threadService.get(X1)??void 0;return v.info(`[fetchAndStartThread] Loaded thread ${X1}, agentMode: ${t?.agentMode??"undefined"}`),n51(V,{visibility:Y,agentMode:t?void 0:Q.mode,thread:t})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return n51(V,{visibility:Y,agentMode:Q.mode})}catch(X1){if(X1 instanceof I8)throw X1;throw await fg(X1,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return n51(V,{visibility:Y,agentMode:Q.mode})};if(Q.format==="jsonl")g$.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
4756
- `),await IA(),process.exit(1);if(J.executeMode&&Q.remote)await U56(X,G,V.configService),await V.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)G56(V.mcpService,J.settings),await m86(U,U.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await V.asyncDispose(),process.exit(0);let D=!1,M=!1,L=!1;if(Q.jetbrains||Q.ide){await zL0();let X1=oE({jetbrainsOnly:Q.jetbrains});if(X1.length===0){if(Q.jetbrains)M=!await V.configService.get("jetbrains.skipInstall")}else if(X1.length===1){let t=X1[0];if(t)V3.selectConfig(t)}else L=!0}let A=Y41("0.0.1764861743-ga65d12",V.settingsStorage),E=new q01(V.threadStorage),I=Q0.of([h0.file(process.cwd())]),P=zG1(void 0,I),R=new X41(V.mcpService,J.settings.getWorkspaceRootPath());if(X)U.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let k=(async()=>{try{let X1=await X5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(X1.ok)return v.info("User free tier status:",X1),X1.result}catch(X1){v.error("Failed to fetch free tier status:",X1)}})(),y=(async()=>{try{let X1=await X5.getUserInfo({},{config:V.configService});if(X1.ok)return X1.result}catch(X1){v.debug("Failed to fetch user workspace info:",X1)}})(),[x,b]=await Promise.all([k,y]),d=b?.email,m=d&&(d.endsWith("@sourcegraph.com")||d.endsWith("@ampcode.com")||d==="auth-bypass-user@example.com"),o=await M56();v.info("Loaded session state:",o),await Qx1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new u61,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,planFileManager:V.planFileManager,threadID:U.threadID,threadFuzzyIndexer:E,worker:U,workerDeps:K,configService:V.configService,internalAPIClient:X5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:V3,connectedClientsService:new mn,commandRegistry:P,mcpService:V.mcpService,mcpTrustHandler:R,showJetBrainsInstaller:M,showIdePicker:D,showIdePickerHint:L,openThreadSwitcher:Q.openThreadSwitcher,updateService:A,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:o,freeTierStatus:x,workspace:b?.team??null,features:b?.features??[],isDogfooding:m||!1,threadDependencies:V,initialAgentMode:Z.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function oQ(J){if(J.interactive)g$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4757
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await F96({...J,workspaceTrust:{current:!0,changes:o_},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 X56(J.mcpConfig);Y=$56(Y,G)}let X=await Y.get("url","global");if(!X)X=KZ;if(!NF(X))v.info("Targeting custom Amp server",{ampURL:X});return Y=$B0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:B56(await gC1(J,Y))}}function AP8(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 OP8(){let J=AP8(process.argv);if(N86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),zP8(v),v.info("Starting Amp CLI.",{version:"0.0.1764861743-ga65d12",buildTimestamp:"2025-12-04T15:27:49.536Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new I8(L$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await LP8().parseAsync(process.argv)}DP1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await OP8().catch(fg)});async function wP8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),D5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4756
+ `),await IA(),process.exit(1);if(J.executeMode&&Q.remote)await U56(X,G,V.configService),await V.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)G56(V.mcpService,J.settings),await m86(U,U.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await V.asyncDispose(),process.exit(0);let D=!1,M=!1,L=!1;if(Q.jetbrains||Q.ide){await zL0();let X1=oE({jetbrainsOnly:Q.jetbrains});if(X1.length===0){if(Q.jetbrains)M=!await V.configService.get("jetbrains.skipInstall")}else if(X1.length===1){let t=X1[0];if(t)V3.selectConfig(t)}else L=!0}let A=Y41("0.0.1764864084-g8f1ea4",V.settingsStorage),E=new q01(V.threadStorage),I=Q0.of([h0.file(process.cwd())]),P=zG1(void 0,I),R=new X41(V.mcpService,J.settings.getWorkspaceRootPath());if(X)U.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let k=(async()=>{try{let X1=await X5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(X1.ok)return v.info("User free tier status:",X1),X1.result}catch(X1){v.error("Failed to fetch free tier status:",X1)}})(),y=(async()=>{try{let X1=await X5.getUserInfo({},{config:V.configService});if(X1.ok)return X1.result}catch(X1){v.debug("Failed to fetch user workspace info:",X1)}})(),[x,b]=await Promise.all([k,y]),d=b?.email,m=d&&(d.endsWith("@sourcegraph.com")||d.endsWith("@ampcode.com")||d==="auth-bypass-user@example.com"),o=await M56();v.info("Loaded session state:",o),await Qx1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new u61,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,planFileManager:V.planFileManager,threadID:U.threadID,threadFuzzyIndexer:E,worker:U,workerDeps:K,configService:V.configService,internalAPIClient:X5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:V3,connectedClientsService:new mn,commandRegistry:P,mcpService:V.mcpService,mcpTrustHandler:R,showJetBrainsInstaller:M,showIdePicker:D,showIdePickerHint:L,openThreadSwitcher:Q.openThreadSwitcher,updateService:A,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:o,freeTierStatus:x,workspace:b?.team??null,features:b?.features??[],isDogfooding:m||!1,threadDependencies:V,initialAgentMode:Z.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function oQ(J){if(J.interactive)g$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4757
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await F96({...J,workspaceTrust:{current:!0,changes:o_},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 X56(J.mcpConfig);Y=$56(Y,G)}let X=await Y.get("url","global");if(!X)X=KZ;if(!NF(X))v.info("Targeting custom Amp server",{ampURL:X});return Y=$B0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:B56(await gC1(J,Y))}}function AP8(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 OP8(){let J=AP8(process.argv);if(N86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),zP8(v),v.info("Starting Amp CLI.",{version:"0.0.1764864084-g8f1ea4",buildTimestamp:"2025-12-04T16:07:11.774Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new I8(L$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await LP8().parseAsync(process.argv)}DP1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await OP8().catch(fg)});async function wP8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),D5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4758
4758
  `);else if(!NF(J.ampURL))D5.write(`Logging in to ${new URL(J.ampURL).hostname}
4759
4759
  `);let Z=process.env.AMP_API_KEY;if(Z)D5.write(`API key found in environment variable, storing...
4760
4760
  `),await Q.set("apiKey",Z,J.ampURL),D5.write(`API key successfully stored.
@@ -4767,7 +4767,7 @@ This thread belongs to a different user and cannot be continued for security rea
4767
4767
  `);else D5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
4768
4768
  `);process.exit(0)}async function IP8(J,Q,Z,Y,X){h$(X,J);let G=await b$(Q,J);try{let V=a51(Z);if(!V)o51(Z);let K=V,q=Y.trim();if(q.length===0)f$("Thread name cannot be empty");if(q.length>256)f$("Thread name cannot exceed 256 characters");if(!(await iC(K,G)).messages.length)f$("Cannot rename an empty thread.");let H=Du(G);await(await J2.getOrCreateForThread(H,K)).handle({type:"title",value:q}),v.info("GOT HERE"),await G.threadSyncService.sync(),v.info("GOT THERE"),D5.write(_4.green(`✓ Thread ${K} renamed to "${q}"
4769
4769
  `)),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose();let K=`Failed to rename thread: ${V instanceof Error?V.message:String(V)}`;f$(K)}}async function PP8(J,Q,Z,Y){h$(Y,J);let X=await b$(Q,J);try{let G=a51(Z);if(!G)o51(Z);let K=await iC(G,X),q=KR(K);D5.write(q+`
4770
- `),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)}`;f$(V)}}async function TP8(J,Q,Z,Y,X){h$(X,J);let G=await b$(Q,J);try{let V=await xv1(Z),K=await iC(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=Du(G),L=K.id;await G.threadStorage.set(L,K);let A=await J2.getOrCreateForThread(M,L);await A.resume();let E=K01.fromWorker(A),I=new q01(G.threadStorage),P=Q0.of([h0.file(process.cwd())]),R=zG1(void 0,P),k=new X41(G.mcpService,Q.settings.getWorkspaceRootPath()),y=Y41("0.0.1764861743-ga65d12",G.settingsStorage);await Qx1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new u61,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:X5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:V3,connectedClientsService:new mn,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}}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await fg(V,Z)}}async function RP8(J,Q,Z,Y,X){h$(Y,J);let G=await b$(Q,J);try{let V=a51(Z);if(!V)o51(Z);let K=V,q=await X5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=$41(J,W);if(!H&&!X)f$("Must specify either --visibility or --support");if(H&&X)f$("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)f$(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,G41(H)),D5.write(_4.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4770
+ `),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)}`;f$(V)}}async function TP8(J,Q,Z,Y,X){h$(X,J);let G=await b$(Q,J);try{let V=await xv1(Z),K=await iC(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=Du(G),L=K.id;await G.threadStorage.set(L,K);let A=await J2.getOrCreateForThread(M,L);await A.resume();let E=K01.fromWorker(A),I=new q01(G.threadStorage),P=Q0.of([h0.file(process.cwd())]),R=zG1(void 0,P),k=new X41(G.mcpService,Q.settings.getWorkspaceRootPath()),y=Y41("0.0.1764864084-g8f1ea4",G.settingsStorage);await Qx1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new u61,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:X5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:V3,connectedClientsService:new mn,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}}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await fg(V,Z)}}async function RP8(J,Q,Z,Y,X){h$(Y,J);let G=await b$(Q,J);try{let V=a51(Z);if(!V)o51(Z);let K=V,q=await X5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=$41(J,W);if(!H&&!X)f$("Must specify either --visibility or --support");if(H&&X)f$("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)f$(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,G41(H)),D5.write(_4.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4771
4771
  `);if(X){await iC(K,G);let z=typeof X==="string"?X:void 0;await lj0(G.threadService,K,G.configService,z),D5.write(_4.green("✓ ")+`Thread ${K} has been shared with Amp support. These thread reports will be aggregated and analysed.
4772
4772
  `)}await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),f$(`Failed to update thread: ${V instanceof Error?V.message:String(V)}`)}}async function CP8(J,Q,Z,Y){h$(Y,J);let X=await b$(Q,J),G=Du(X);try{let V=await xv1(Z),q=(await iC(V,X)).messages.length-1,W=await J2.getOrCreateForThread(G,V),H=await qR(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await kv1(H),D5.write(`${H}
4773
4773
  `),await X.asyncDispose(),process.exit(0)}catch(V){g$.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.1764861743-ga65d12",
3
+ "version": "0.0.1764864084-g8f1ea4",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {