@sourcegraph/amp 0.0.1764759077-g35efa6 → 0.0.1764763292-ge365ee
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.
- package/dist/main.js +10 -10
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -4017,15 +4017,15 @@ Actual: ${G}`)}async function uK8(J,Q,Y){let{execSync:X}=await import("node:ch
|
|
|
4017
4017
|
${N}`;if(G==="pnpm"&&N.includes("Unable to find the global bin directory"))M+=`
|
|
4018
4018
|
|
|
4019
4019
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4020
|
-
npm install -g @sourcegraph/amp`;V(Error(M))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}N0();N0();async function I41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=iK8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],M=V.time[K],L=Date.now();if(N)z=Math.floor((L-new Date(N).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return v.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function iK8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}e0();function P41(J,Q){let Y=new i4,X=Y.pipe(j8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new kV().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await _T(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=KO(),W=await I41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await E41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await Um(W.latestVersion,z);let U=await ZN(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await _T(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as aK}from"node:process";function Q76(J){let Q=new oA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(X)=>{await mC1(X.force||!1,X.verbose||!1,"0.0.
|
|
4020
|
+
npm install -g @sourcegraph/amp`;V(Error(M))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}N0();N0();async function I41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=iK8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],M=V.time[K],L=Date.now();if(N)z=Math.floor((L-new Date(N).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return v.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function iK8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}e0();function P41(J,Q){let Y=new i4,X=Y.pipe(j8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new kV().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await _T(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=KO(),W=await I41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await E41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await Um(W.latestVersion,z);let U=await ZN(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await _T(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as aK}from"node:process";function Q76(J){let Q=new oA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(X)=>{await mC1(X.force||!1,X.verbose||!1,"0.0.1764763292-ge365ee"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new oA("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(X)=>{await nK8(X.targetVersion)});J.addCommand(Y)}async function nK8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")aK.write(g4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4021
4021
|
|
|
4022
4022
|
`));try{if(!J){aK.write(g4.blue(`Checking for updates...
|
|
4023
|
-
`));let X=KO(),{hasUpdate:G,latestVersion:Z}=await I41("0.0.
|
|
4024
|
-
`));let V=await ZN("0.0.
|
|
4023
|
+
`));let X=KO(),{hasUpdate:G,latestVersion:Z}=await I41("0.0.1764763292-ge365ee",X);if(!G){aK.write(g4.green(`✓ Amp CLI is already up to date: ${"0.0.1764763292-ge365ee"} (${"released"} ${"2025-12-03T12:07:04.808Z"})
|
|
4024
|
+
`));let V=await ZN("0.0.1764763292-ge365ee");if(V.warning)aK.write(`
|
|
4025
4025
|
`+g4.yellow(V.warning)+`
|
|
4026
4026
|
`);process.exit(0)}if(!Z)aK.write(g4.yellow("[WARN] could not find latest version")),process.exit(0);J=Z}aK.write(g4.blue(`Updating to version ${J}...
|
|
4027
4027
|
`)),await Um(J,void 0,(X)=>{aK.write(g4.dim(`Running: ${X}
|
|
4028
|
-
`))});let Q="released";aK.write(g4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-
|
|
4028
|
+
`))});let Q="released";aK.write(g4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-03T12:07:04.808Z"})
|
|
4029
4029
|
`));let Y=await ZN(J);if(Y.warning)aK.write(`
|
|
4030
4030
|
`+g4.yellow(Y.warning)+`
|
|
4031
4031
|
`);process.exit(0)}catch(Q){let Y=Q instanceof Error?Q.message:String(Q);aK.write(g4.red.bold("Error: ")+Y+`
|
|
@@ -4657,7 +4657,7 @@ exit code: ${Z}`,new X1({color:X.foreground,dim:!0,italic:!0})));if(q)V.push(new
|
|
|
4657
4657
|
`,M),...L])})];if(H.url){let x=H.url.replace(/^https?:\/\//,"");S.push(new y7({uri:H.url,text:x,style:new X1({color:Y.secondary,underline:!0})}))}if(T)S.push(new $0({height:1})),S.push(T);let k=new $0({width:40,child:new d0({crossAxisAlignment:"start",mainAxisSize:"min",children:S})});return f4.child(new h6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new KS1({width:bk1,height:gk1,agentMode:this.widget.agentMode,glow:this._glow,t:A,fps:0,shockwaves:this._shockwaves,onShockwave:P,...q==="disabled"&&{seed:42}}),new $0({width:2}),k]}))}}N0();a8();A4();g7();a8();e0();function aA8(J,Q){return`${J}:${Q}`}class mk1{threadService;workers=new Map;threadsMap=new Map;subthreadsMap=new Map;mainThreadSubs=new Map;subthreadsSubs=new Map;workerStatusSubs=new Map;subthreadPatchSubs=new Map;mainThreadObservable;subthreadObservable;workerStatusObservable;emitMainThread=null;emitSubthread=null;emitWorkerStatus=null;constructor(J){this.threadService=J;this.mainThreadObservable=new X0((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new X0((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new X0((Q)=>{return this.emitWorkerStatus=(Y)=>Q.next(Y),()=>{this.emitWorkerStatus=null}})}registerWorker(J){let Q=J.thread.id;if(this.workers.has(Q))this.unregisterWorker(Q);this.threadsMap.set(Q,J.thread),this.subthreadsMap.set(Q,[]),this.workers.set(Q,{state:"initial"});let Y=this.threadService.observePatches(Q).pipe(SM()).subscribe((Z)=>{this.threadsMap.set(Q,Z);let q=this.subthreadsMap.get(Q)||[],V=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:Z,subthreads:q,workerStatus:V})});this.mainThreadSubs.set(Q,Y);let X=J.status.subscribe((Z)=>{if(this.workers.set(Q,Z),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:Z})});this.workerStatusSubs.set(Q,X);let G=J.subthreads.subscribe((Z)=>{this.subthreadsMap.set(Q,Z);for(let q of Z){let V=aA8(Q,q.toolUse.id);if(this.subthreadPatchSubs.has(V))continue;let K=this.threadService.observePatches(q.threadID).pipe(SM()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:q})});this.subthreadPatchSubs.set(V,K)}});this.subthreadsSubs.set(Q,G)}unregisterWorker(J){let Q=this.mainThreadSubs.get(J);if(Q)Q.unsubscribe(),this.mainThreadSubs.delete(J);let Y=this.workerStatusSubs.get(J);if(Y)Y.unsubscribe(),this.workerStatusSubs.delete(J);let X=this.subthreadsSubs.get(J);if(X)X.unsubscribe(),this.subthreadsSubs.delete(J);for(let[G,Z]of this.subthreadPatchSubs.entries())if(G.startsWith(`${J}:`))Z.unsubscribe(),this.subthreadPatchSubs.delete(G);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new X0((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new X0((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new X0((Q)=>{return this.workerStatusObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})})}}get threadViewStates(){let J={};for(let[Q,Y]of this.threadsMap){let X=this.workers.get(Q);if(X)J[Q]=RA(Y,X)}return J}dispose(){for(let J of this.mainThreadSubs.values())J.unsubscribe();for(let J of this.subthreadsSubs.values())J.unsubscribe();for(let J of this.workerStatusSubs.values())J.unsubscribe();for(let J of this.subthreadPatchSubs.values())J.unsubscribe();this.mainThreadSubs.clear(),this.subthreadsSubs.clear(),this.workerStatusSubs.clear(),this.subthreadPatchSubs.clear(),this.workers.clear(),this.threadsMap.clear(),this.subthreadsMap.clear()}}function oA8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Y,subthread:X}=Q,G=J.subagents[X.threadID];if(!G){if(G={subThreadID:Y.id,parentToolID:X.toolUse.id,taskDescription:X.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=ZQ(J.mainThread);G.isCompleted=aX6(W,X.toolUse.id)}}let Z=rA8(Y,G.agentState),q=G.agentState===Z?G:{...G,agentState:Z},V={...J.tools},K=Gj(Y).items.filter((W)=>W.type==="toolResult");for(let W of K)V[W.id]={id:W.id,subthreadID:Y.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[X.threadID]:q},tools:V,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Y,subthreads:X,workerStatus:G}=Q,Z=ZQ(Y),q={...J.subagents};for(let z of X){let U=q[z.threadID];if(!U)continue;let N=aX6(Z,z.toolUse.id);q[z.threadID]={...U,isCompleted:N}}let{items:V}=Gj(Y),K=RA(Y,G),W=MI({messages:Y.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:q,items:V,viewState:K,todosList:H,mainThread:Y}}case"worker-status-change":{if(!J.mainThread)return J;let Y=RA(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function Gj(J){let Q=[],Y=new Map,X=new Set;for(let[G,Z]of J.messages.entries()){let q=`${Z.role}-${G}`;switch(Z.role){case"assistant":{let V=Z.state.type==="streaming";for(let W of Z.content)if(W.type==="tool_use"){if(Y.set(W.id,W),V)X.add(W.id)}if(Z.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:q,message:Z});for(let W of Z.content)if(W.type==="tool_use"){let H=!1;for(let z=G+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let N of U.content)if(N.type==="tool_result"&&N.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:V?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:q,message:Z});break;case"user":{let V=Z.content.some((K)=>K.type==="text"&&K.text.trim()||K.type==="image");for(let K of Z.content)if(K.type==="tool_result"){let W=Y.get(K.toolUseID)??_X(J,K.toolUseID);if(!W)throw Error(`(bug) tool use ${K.toolUseID} not found`);Q.push({type:"toolResult",id:K.toolUseID,toolUse:W,toolResult:K})}if(V)Q.push({type:"message",id:q,message:Z});break}}}return{items:Q}}function aX6(J,Q){let Y=J.get(Q);return(Y&&O2(Y.run))??!1}function rA8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((G)=>G.type==="tool_result"&&G.run.status==="blocked-on-user"))return v.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(Gj(J).items.some((G)=>G.type==="toolResult"&&G.toolResult.run.status==="in-progress")){let G=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}if(Y&&Y.role==="assistant"&&Y.state.type==="streaming")switch(Y.content.at(-1)?.type){case"text":return 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 Z=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:Z,hasStartTime:!!Z}),{type:"running-tools",startTime:Z}}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 uk1 extends o0{props;constructor(J){super();this.props=J}createState(){return new oX6}}class oX6 extends a0{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 mk1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),Y=Q.mainThread.subscribe((Z)=>{this.dispatch({type:"main-thread-patch",thread:Z.mainThread,subthreads:Z.subthreads,workerStatus:Z.workerStatus})});this.subscriptions.push(Y);let X=Q.subthreads.subscribe((Z)=>{this.dispatch({type:"subthread-patch",thread:Z.thread,subthread:Z.subthread})});this.subscriptions.push(X);let G=Q.workerStatus.subscribe((Z)=>{this.dispatch({type:"worker-status-change",workerStatus:Z.status})});this.subscriptions.push(G)}cleanup(){this.subscriptions.forEach((J)=>J.unsubscribe()),this.subscriptions=[]}switchWorker(J){this.cleanup(),this.setState(()=>{this.currentWorker=J}),this.setState(()=>{this.state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null}}),this.setupSubscriptions(J),this.addToRecentThreads(J.thread.id)}dispatch(J){this.setState(()=>{this.state=oA8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((Z)=>({toolUse:Z.toolUse,toolRun:Z.toolRun,subthreadID:Z.subthreadID})),Q={};for(let Z of Object.values(this.state.subagents)){let q=J.filter((V)=>V.subthreadID===Z.subThreadID);Q[Z.parentToolID]=q}let Y=(Z)=>Z===Q7||Z===V9||Z===jX,X=new Map;for(let Z of this.state.items)if(Z.type==="toolResult"&&Y(Z.toolUse.name))X.set(Z.toolUse.id,{toolUseId:Z.toolUse.id,toolName:Z.toolUse.name,toolRun:Z.toolResult.run});let G=Array.from(X.values());for(let{toolUseId:Z,toolRun:q}of G){let V=[],K;if(q.status==="in-progress"||q.status==="done"||q.status==="error"||q.status==="cancelled")K=q.progress;if(K){let W=0;for(let H of K)if(H.tool_uses)for(let z of H.tool_uses){let U=`${Z}:progress:${W++}`;V.push({toolUse:BI(z.tool_name,z.input,U),toolRun:{status:z.status}})}}Q[Z]=V}return{...this.state,subagents:Object.values(this.state.subagents),subagentActiveTools:J,subagentToolsByParentID:Q}}build(J){let Q=this.getThreadData();return this.widget.props.builder(J,Q,this.workerController,(Y)=>this.switchWorker(Y),()=>this.currentWorker,this.recentThreadIDs)}}class pk1 extends o0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new rX6}}class rX6 extends a0{build(J){let Y=W6.of(J).colors,{todos:X,title:G="TODOs"}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new $0({width:0,height:0});let Z=X.map((q)=>this.buildTodoItem(q,Y));return new t0({child:new z6({padding:L0.symmetric(1,0),child:new d0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new x1({text:new s(G,new X1({bold:!0,color:Y.foreground}))}),...Z]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),X=J.status==="completed",G=new X1({bold:J.status==="in-progress",color:Q.foreground,dim:X}),Z=new X1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:X});return new h6({crossAxisAlignment:"start",children:[new x1({text:new s(Y,G)}),new $0({width:1}),new G4({child:new x1({text:new s(J.content,Z)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class dk1 extends j6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Y,onButtonClick:X}){super({key:J});this.ad=Q,this.onDismiss=Y,this.onButtonClick=X}build(J){let Q=W6.of(J),Y=Q.colors.primary,X=Q.colors.foreground;return new t0({decoration:new H8(void 0,new T4(new D4(Y,1,"rounded"),new D4(Y,1,"rounded"),void 0,new D4(Y,1,"rounded"))),child:new z6({padding:L0.horizontal(1),child:new d0({children:[new h6({crossAxisAlignment:"start",children:[new G4({child:new x1({text:new s(this.ad.content,new X1({color:X}))})}),new $0({width:4}),new y7({uri:"https://ampcode.com/free",text:"Ad",style:new X1({color:X,dim:!0})})]}),new h6({crossAxisAlignment:"start",children:[new AS1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:L0.horizontal(1),color:Y,reverse:!0}),new $0({width:2}),new x1({text:new s(this.ad.destinationUrlHostname,new X1({color:X,dim:!0}))})]})]})})})}}class ck1 extends o0{props;constructor(J){super();this.props=J}createState(){return new sX6(this.props.autofocus??!0)}}class sX6 extends a0{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(V)=>{if(V.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(V.ctrlKey&&V.key==="c"||V.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Y=u4.sizeOf(J),X=Math.min(60,Y.width-4),G=Y.height-4,Z=[];if(this.widget.props.title)Z.push(new x1({text:new s(this.widget.props.title,new X1({bold:!0,color:M1.blue}))}),new $0({height:1}));if(this.widget.props.message)Z.push(new x1({text:new s(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)Z.push(new $0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new x1({text:new s("Enter to copy",new X1({dim:!0}))}));return q.push(new x1({text:new s("Escape to close",new X1({dim:!0}))})),Z.push(new h6({children:q.flatMap((V,K)=>K<q.length-1?[V,new $0({width:1}),new x1({text:new s("•",new X1({dim:!0}))}),new $0({width:1})]:[V]),mainAxisSize:"min"})),new f4({child:new t0({constraints:new P6(X,X,0,G),decoration:new H8(M1.default(),new T4(new D4(M1.blue,1,"rounded"),new D4(M1.blue,1,"rounded"),new D4(M1.blue,1,"rounded"),new D4(M1.blue,1,"rounded"))),padding:new L0(2,2,2,2),child:new R8({autofocus:this.autofocus,onKey:Q,child:new d0({children:Z,mainAxisSize:"min"})})})})}}function sA8(J){let Q=Math.floor(J/60),Y=J%60;if(Q===0)return`${Y}s`;return`${Q}:${Y.toString().padStart(2,"0")}`}function tA8(J){if(J<0.01)return"<$0.01";return`$${J.toFixed(2)}`}function eA8(J){if(J<=60)return"~ 1m";if(J<=120)return"~ 2m";if(J<=300)return"~ 5m";return"~ 10m"}function tX6(J,Q={}){if(J.secondsRemaining===null)return null;if(J.secondsRemaining===0)return{text:"cache expired",urgency:"expired"};let Y=J.secondsRemaining<=60,X=Q.isIdle!==!1&&Y,G=X?sA8(J.secondsRemaining):eA8(J.secondsRemaining),Z=tA8(J.potentialSavingsUSD);if(Q.isNarrow)return{text:G,urgency:X?"warning":"normal"};if(Q.prominent&&X)return{text:`${G} left - respond now to save up to ${Z}`,urgency:"warning"};return{text:`${G} (save up to ${Z})`,urgency:X?"warning":"normal"}}class l91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,l91.prototype)}}class i91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,i91.prototype)}}function lk1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Y)=>{if(Y.startsWith('"')&&Y.endsWith('"')||Y.startsWith("'")&&Y.endsWith("'"))return Y.slice(1,-1);return Y})}AH();N0();import{spawn as JO8}from"node:child_process";import{promises as QO8}from"node:fs";function eX6(J){return J.kind==="executable"}function JG6(J){return J.kind==="markdown"}var vz=50000,QG6=300000;async function ik1(J,Q,Y,X={}){let{timeoutMs:G=QG6,signal:Z,source:q}=X;try{let V=await Y.getCommand(J,q);if(!V)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Y.isCommandAvailable(J,q))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(v.debug("Executing command",{commandName:J,filePath:V.filePath,args:Q}),JG6(V))return await YO8(V,Q);else if(eX6(V))return await XO8(V,Q,G,Z);else return{success:!1,output:"",error:"Unsupported command type"}}catch(V){return v.error("Failed to execute command",{commandName:J,error:V}),{success:!1,output:"",error:V instanceof Error?V.message:"Unknown error occurred"}}}async function YO8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await QO8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>vz?Y.slice(0,vz)+`
|
|
4658
4658
|
... (output truncated at ${vz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function XO8(J,Q,Y=QG6,X){return new Promise((G)=>{let[Z,q]=GO8(J,Q);v.debug("Spawning command",{spawnCommand:Z,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Y});let V=NE0(X),K=!1,W=setTimeout(()=>{K=!0,V.abort(),v.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=JO8(Z,q,{stdio:["pipe","pipe","pipe"],signal:V.signal,detached:!0}),z=[],U=[],N=0;H.stdout?.on("data",(M)=>{let L=M.toString();if(N+=L.length,N<=vz)z.push(L);else{let A=vz-(N-L.length);if(A>0)z.push(L.slice(0,A))}}),H.stderr?.on("data",(M)=>{let L=M.toString();if(N+=L.length,N<=vz)U.push(L);else{let A=vz-(N-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(M)=>{if(clearTimeout(W),K){G({success:!1,output:z.join(""),error:`Command timed out after ${Y}ms`,exitCode:void 0});return}if(V.signal.aborted){G({success:!1,output:z.join(""),error:"The command was aborted",exitCode:M??void 0});return}let L=M===0||M===1,A=z.join(""),E=U.join(""),P=A;if(!L&&!A.trim()&&E.trim())P=E;else if(E.trim())P+=A?`
|
|
4659
4659
|
${E}`:E;if(N>vz)P+=`
|
|
4660
|
-
... (output truncated at ${vz} characters)`;G({success:L,output:P.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(K)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";G({success:!1,output:z.join(""),error:L})})})}function GO8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return $O8(Y,X?[...X]:null,G,Q);else return ZO8(Y,X?[...X]:null,G,Q)}function ZO8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function $O8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}N0();l$();s7();ZH();pX();Xq();OH();VK();a8();g7();Ik();e0();var DG6=M6(lP(),1);import{writeFile as UG6}from"fs/promises";import BG6 from"path";N0();pX();class nk1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764759077-g35efa6"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await po(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 ak1 extends o0{props;constructor(J){super();this.props=J}createState(){return new YG6}}class YG6 extends a0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class XG6 extends a0{controller=new aZ;focusNode=new k8({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=W6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=T4.all(new D4(Y.foreground,1,"solid")),K=new wO({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(N)=>{let M=N.trim();if(G&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new h6({children:[new t0({decoration:{color:M1.default()},child:new x1({text:new s(">",new X1({color:Y.foreground}))})}),new G4({child:K})]}),H=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s("",void 0,[new s("Command: ",new X1({color:Y.foreground})),new s(this.widget.props.commandName,new X1({color:M1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new s("Enter",new X1({color:X.keybind}))),z.push(new s(" to submit, ",new X1({color:Y.foreground,dim:!0})));z.push(new s("Esc",new X1({color:X.keybind}))),z.push(new s(" to cancel",new X1({color:Y.foreground,dim:!0})));let U=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s("",void 0,z)})});return new t0({decoration:{border:V,color:M1.default()},padding:L0.all(1),child:new d0({children:[H,new $0({height:1}),W,new M5,U]})})}}class n91 extends o0{props;constructor(J){super();this.props=J}createState(){return new XG6}}OH();class GG6 extends a0{controller=new aZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new k8({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>=AU)return!1;let Q=uC(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=W6.of(J),{colors:Y,app:X}=Q,Z=u4.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new vO({controller:this.controller,triggers:[new IN],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(N)=>{this.widget.props.onSubmit(N.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:H9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new R8({focusNode:this.focusNode,child:V}),W=new t0({constraints:new P6({maxHeight:q}),padding:L0.symmetric(1,0),child:K}),H=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s("",void 0,[new s("Command: ",new X1({color:Y.foreground})),new s(this.widget.props.commandName,new X1({color:M1.yellow,bold:!0}))])})}),z=new t0({padding:L0.symmetric(1,0),child:new x1({text:this.isConfirmingClearInput?new s("",void 0,[new s("Esc",new X1({color:X.keybind})),new s(" again to clear input",new X1({color:Y.foreground,dim:!0}))]):new s("",void 0,[new s("Press ",new X1({color:Y.foreground,dim:!0})),new s("Enter",new X1({color:X.keybind})),new s(" to submit, ",new X1({color:Y.foreground,dim:!0})),new s("Esc",new X1({color:X.keybind})),new s(" to clear",new X1({color:Y.foreground,dim:!0}))])})}),U=[H,new $0({height:1}),new G4({child:W}),new $0({height:1}),z];return new t0({decoration:{border:T4.all(new D4(Y.foreground,1,"solid")),color:M1.default()},padding:L0.all(1),child:new d0({children:U})})}}class Zj extends o0{props;constructor(J){super();this.props=J}createState(){return new GG6}}import{isDeepStrictEqual as WO8}from"node:util";var qO8=/[\\/_ +.#"@[({&]/,VO8=/[\\/_ +.#"@[({&]/g,KO8=/[\s-]/,ZG6=/[\s-]/g;function o91(J,Q,Y,X,G,Z,q){if(Z===Q.length){if(G===J.length)return 1;return 0.99}let V=`${G},${Z}`;if(q[V]!==void 0)return q[V];let K=X.charAt(Z),W=Y.indexOf(K,G),H=0,z,U,N,M;while(W>=0){if(z=o91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(KO8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(ZG6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(qO8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(VO8),N&&G>0)z*=Math.pow(0.999,N.length)}else if(z*=0.3,G>0)z*=Math.pow(0.999,W-G);if(J.charAt(W)!==Q.charAt(Z))z*=0.9999}if(z<0.1&&(Y.charAt(W-1)===X.charAt(Z+1)||X.charAt(Z+1)===X.charAt(Z)&&Y.charAt(W-1)!==X.charAt(Z))){if(U=o91(J,Q,Y,X,W+1,Z+2,q),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(K,W+1)}return q[V]=H,H}function a91(J){return J.toLowerCase().replace(ZG6," ")}function $G6(J,Q){let Y=o91(J,Q,a91(J),a91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=o91(J,V,a91(J),a91(V),0,0,{});if(K===0)return Y;G+=K,Z+=V.length}let q=G/X.length*0.95;return Math.max(Y,q)}return Y}class $j{}class qj{}class r91{}class s91{}class qG6 extends o0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new VG6}}class VG6 extends a0{build(J){return this.widget.onContext(J),this.widget.child}}function HO8(J,Q){if(J==="")return{matches:!0,score:1};let Y=$G6(Q,J);return{matches:Y>0.15,score:Y}}class pq extends o0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new KG6}}class KG6 extends a0{controller=new aZ;focusNode;scrollController=new k7;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new k8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),G9.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(!WO8(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 $j){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 qj){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 r91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof s91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...HO8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,X=Q.size.height;i81(J,{top:Y,bottom:X},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),G9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let X=Y[J],G=X?this.widget.props.isItemDisabled?.(X)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!G){if(X)this.widget.props.onAccept(X)}}};build(J){let Q=W6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=T4.all(new D4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new wO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new mq({shortcuts:new Map([[new U4("ArrowDown"),new $j],[new U4("ArrowUp"),new qj],[new U4("Tab"),new $j],[new U4("Tab",{shift:!0}),new qj],[new U4("n",{ctrl:!0}),new $j],[new U4("p",{ctrl:!0}),new qj],[new U4("Enter"),new r91],[new U4("Escape"),new s91]]),focusNode:this.focusNode,child:q}),K=new KY({actions:new Map([[$j,new b8(this.invoke)],[qj,new b8(this.invoke)],[r91,new b8(this.invoke)],[s91,new b8(this.invoke)]]),child:V}),W=new h6({children:[new t0({decoration:{color:M1.default()},child:new x1({text:new s(">",new X1({color:Y.foreground}))})}),new G4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new $0({height:10,child:new f4({child:new x1({text:new s(L,new X1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new G4({child:new f4({child:new x1({text:new s(this.widget.props.emptyStateText,new X1({color:Y.foreground,dim:!0}))})})});else{let L=X.map((A,E)=>{let P=E===this.selectedIndex,I=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,P,I,J);else{let S=P?M1.yellow:void 0,k=P?M1.black:Y.foreground;T=new t0({decoration:S?{color:S}:void 0,padding:L0.symmetric(2,0),child:new x1({text:new s(this.widget.props.getLabel(A),new X1({color:k,dim:I}))})})}return new qG6(new U8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new d0({children:L,crossAxisAlignment:"start"})}let z=new G4({child:new U8({onScroll:this.handleScroll,opaque:!1,child:new o5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s(this.widget.props.title,new X1({color:M1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new $0({height:1}),z),this.controller.text!==""){let L=X.length>0?X[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new t0({padding:L0.vertical(1),child:new f4({child:A})}));else U.push(new $0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new t0({decoration:{border:G,color:M1.default()},padding:L0.symmetric(1,0),child:new d0({children:U})})}}class ok1 extends o0{createState(){return new WG6}}class WG6 extends a0{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 x1({text:new s("●",new X1({color:this.isGreen?M1.green:M1.index(8),bold:!0})),maxLines:1})}}function zO8(J){let Q=new Map,Y=new Map,X=new Map,G=[];for(let q of J)Q.set(q.id,q);for(let q of J){let V=q.parentRelationships.find((K)=>K.role==="child"&&Q.has(K.threadID));if(V){X.set(q.id,V.type);let K=V.threadID,W=Y.get(K)||[];W.push(q),Y.set(K,W)}else G.push(q)}return DG.flatten(G,(q)=>Y.get(q.id)).map((q)=>({...q.item,depth:q.depth,isLast:q.isLast,ancestorsAreLast:q.ancestorsAreLast,relationshipType:X.get(q.item.id)}))}function rk1(J,Q,Y){return new x1({text:new s(`${J}${Q}`,new X1({color:Y})),maxLines:1})}function FO8(J,Q,Y,X){return[rk1("+",J,X.success),M5.horizontal(1),rk1("~",Q,X.warning),M5.horizontal(1),rk1("-",Y,X.destructive)]}class t91 extends j6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],X=this.props.currentThreadID,G=[...Q].sort((H,z)=>{if(X){if(H.id===X)return-1;if(z.id===X)return 1}let U=Y.indexOf(H.id),N=Y.indexOf(z.id);if(U!==-1&&N!==-1)return U-N;if(U!==-1)return-1;if(N!==-1)return 1;return 0}),Z=zO8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=W6.of(J),K=new z6({padding:L0.symmetric(0,1),child:new f4({child:new x1({text:new s("",new X1({color:V.colors.foreground,dim:!0}),[new s("Ctrl+T",new X1({color:M1.blue,dim:!0})),new s(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new X1({color:V.colors.foreground,dim:!0}))])})})});return new pq({items:Z,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:K,renderItem:(H,z,U,N)=>{let M=W6.of(N),{colors:L}=M,A=z?M1.yellow:void 0,E=z?M1.black:L.foreground,P=M1.index(8),I=(Q1,o)=>new $0({width:o,child:h6.end([new x1({text:new s(Q1,new X1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[],k=H.relationshipType==="handoff",x=new e81;if(H.depth>0){let Q1=[],o=H.ancestorsAreLast.slice(1);for(let H1 of o)Q1.push(new s(x.getAncestorPrefix(H1),new X1({color:x.connectorColor,dim:x.connectorDim})));let u=H.isLast?x.elbow:x.tee,e=x.getConnectorText(u);Q1.push(new s(e,new X1({color:x.connectorColor,dim:x.connectorDim}))),S.push(new x1({text:new s("",void 0,Q1)}))}let b=[],p=this.props.currentThreadID===H.id?new s("(current) ",new X1({color:M1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new s("(visited) ",new X1({color:L.foreground,dim:!0})):null;if(p)b.push(new x1({text:p}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))b.push(new ok1),b.push(new $0({width:1}))}let g=H.title;if(H.relationshipType==="fork"){let Q1=g.match(/^Forked\((\d+)\): /);if(Q1)g=g.slice(Q1[0].length);else while(g.startsWith("Forked: "))g=g.slice(8);b.push(new x1({text:new s("[fork] ",new X1({color:M1.blue}))}))}else if(k)b.push(new x1({text:new s("[handoff] ",new X1({color:M1.index(208)}))}));if(b.push(new G4({child:new x1({text:new s(g,new X1({color:E})),overflow:"ellipsis",maxLines:1})})),b.push(new $0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let Q1=z?{success:P,warning:P,destructive:P}:L;b.push(...FO8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,Q1)),b.push(new $0({width:2}))}return b.push(I(H.description.timeAgo,q)),new t0({decoration:A?{color:A}:void 0,padding:L0.symmetric(2,0),child:new h6({children:[...S,...b]})})}})}}function HG6(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/60000),G=Math.floor(Y/3600000),Z=Math.floor(Y/86400000);if(X<1)return"just now";if(X<60)return`${X}m ago`;if(G<24)return`${G}h ago`;if(Z<7)return`${Z}d ago`;return J.toLocaleDateString()}class sk1 extends j6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((G,Z)=>Z.pubDate.getTime()-G.pubDate.getTime()),Y=Math.max(0,...Q.map((G)=>HG6(G.pubDate).length));return new pq({items:Q,getLabel:(G)=>G.title,onAccept:(G)=>this.props.onSelect?.(G),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(G,Z,q,V)=>{let K=W6.of(V),{colors:W}=K,H=Z?M1.yellow:void 0,z=Z?M1.black:W.foreground,U=M1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new $0({width:A,child:h6.end([new x1({text:new s(L,new X1({color:U}))})])});return new t0({decoration:H?{color:H}:void 0,padding:L0.symmetric(2,0),child:new h6({children:[new G4({child:new x1({text:new s(G.title,new X1({color:z})),overflow:"ellipsis",maxLines:1})}),new $0({width:2}),new x1({text:new s(N,new X1({color:U})),maxLines:1}),new $0({width:2}),M(HG6(G.pubDate),Y)]})})}})}}class tk1 extends j6{props;constructor(J){super();this.props=J}build(){return new f4({child:new x1({text:new s("",void 0,[new s(`Forked to new thread:
|
|
4660
|
+
... (output truncated at ${vz} characters)`;G({success:L,output:P.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(K)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";G({success:!1,output:z.join(""),error:L})})})}function GO8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return $O8(Y,X?[...X]:null,G,Q);else return ZO8(Y,X?[...X]:null,G,Q)}function ZO8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function $O8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}N0();l$();s7();ZH();pX();Xq();OH();VK();a8();g7();Ik();e0();var DG6=M6(lP(),1);import{writeFile as UG6}from"fs/promises";import BG6 from"path";N0();pX();class nk1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764763292-ge365ee"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await po(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 ak1 extends o0{props;constructor(J){super();this.props=J}createState(){return new YG6}}class YG6 extends a0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class XG6 extends a0{controller=new aZ;focusNode=new k8({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=W6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=T4.all(new D4(Y.foreground,1,"solid")),K=new wO({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(N)=>{let M=N.trim();if(G&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new h6({children:[new t0({decoration:{color:M1.default()},child:new x1({text:new s(">",new X1({color:Y.foreground}))})}),new G4({child:K})]}),H=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s("",void 0,[new s("Command: ",new X1({color:Y.foreground})),new s(this.widget.props.commandName,new X1({color:M1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new s("Enter",new X1({color:X.keybind}))),z.push(new s(" to submit, ",new X1({color:Y.foreground,dim:!0})));z.push(new s("Esc",new X1({color:X.keybind}))),z.push(new s(" to cancel",new X1({color:Y.foreground,dim:!0})));let U=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s("",void 0,z)})});return new t0({decoration:{border:V,color:M1.default()},padding:L0.all(1),child:new d0({children:[H,new $0({height:1}),W,new M5,U]})})}}class n91 extends o0{props;constructor(J){super();this.props=J}createState(){return new XG6}}OH();class GG6 extends a0{controller=new aZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new k8({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>=AU)return!1;let Q=uC(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=W6.of(J),{colors:Y,app:X}=Q,Z=u4.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new vO({controller:this.controller,triggers:[new IN],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(N)=>{this.widget.props.onSubmit(N.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:H9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new R8({focusNode:this.focusNode,child:V}),W=new t0({constraints:new P6({maxHeight:q}),padding:L0.symmetric(1,0),child:K}),H=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s("",void 0,[new s("Command: ",new X1({color:Y.foreground})),new s(this.widget.props.commandName,new X1({color:M1.yellow,bold:!0}))])})}),z=new t0({padding:L0.symmetric(1,0),child:new x1({text:this.isConfirmingClearInput?new s("",void 0,[new s("Esc",new X1({color:X.keybind})),new s(" again to clear input",new X1({color:Y.foreground,dim:!0}))]):new s("",void 0,[new s("Press ",new X1({color:Y.foreground,dim:!0})),new s("Enter",new X1({color:X.keybind})),new s(" to submit, ",new X1({color:Y.foreground,dim:!0})),new s("Esc",new X1({color:X.keybind})),new s(" to clear",new X1({color:Y.foreground,dim:!0}))])})}),U=[H,new $0({height:1}),new G4({child:W}),new $0({height:1}),z];return new t0({decoration:{border:T4.all(new D4(Y.foreground,1,"solid")),color:M1.default()},padding:L0.all(1),child:new d0({children:U})})}}class Zj extends o0{props;constructor(J){super();this.props=J}createState(){return new GG6}}import{isDeepStrictEqual as WO8}from"node:util";var qO8=/[\\/_ +.#"@[({&]/,VO8=/[\\/_ +.#"@[({&]/g,KO8=/[\s-]/,ZG6=/[\s-]/g;function o91(J,Q,Y,X,G,Z,q){if(Z===Q.length){if(G===J.length)return 1;return 0.99}let V=`${G},${Z}`;if(q[V]!==void 0)return q[V];let K=X.charAt(Z),W=Y.indexOf(K,G),H=0,z,U,N,M;while(W>=0){if(z=o91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(KO8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(ZG6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(qO8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(VO8),N&&G>0)z*=Math.pow(0.999,N.length)}else if(z*=0.3,G>0)z*=Math.pow(0.999,W-G);if(J.charAt(W)!==Q.charAt(Z))z*=0.9999}if(z<0.1&&(Y.charAt(W-1)===X.charAt(Z+1)||X.charAt(Z+1)===X.charAt(Z)&&Y.charAt(W-1)!==X.charAt(Z))){if(U=o91(J,Q,Y,X,W+1,Z+2,q),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(K,W+1)}return q[V]=H,H}function a91(J){return J.toLowerCase().replace(ZG6," ")}function $G6(J,Q){let Y=o91(J,Q,a91(J),a91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=o91(J,V,a91(J),a91(V),0,0,{});if(K===0)return Y;G+=K,Z+=V.length}let q=G/X.length*0.95;return Math.max(Y,q)}return Y}class $j{}class qj{}class r91{}class s91{}class qG6 extends o0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new VG6}}class VG6 extends a0{build(J){return this.widget.onContext(J),this.widget.child}}function HO8(J,Q){if(J==="")return{matches:!0,score:1};let Y=$G6(Q,J);return{matches:Y>0.15,score:Y}}class pq extends o0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new KG6}}class KG6 extends a0{controller=new aZ;focusNode;scrollController=new k7;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new k8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),G9.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(!WO8(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 $j){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 qj){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 r91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof s91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...HO8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,X=Q.size.height;i81(J,{top:Y,bottom:X},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),G9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let X=Y[J],G=X?this.widget.props.isItemDisabled?.(X)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!G){if(X)this.widget.props.onAccept(X)}}};build(J){let Q=W6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=T4.all(new D4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new wO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new mq({shortcuts:new Map([[new U4("ArrowDown"),new $j],[new U4("ArrowUp"),new qj],[new U4("Tab"),new $j],[new U4("Tab",{shift:!0}),new qj],[new U4("n",{ctrl:!0}),new $j],[new U4("p",{ctrl:!0}),new qj],[new U4("Enter"),new r91],[new U4("Escape"),new s91]]),focusNode:this.focusNode,child:q}),K=new KY({actions:new Map([[$j,new b8(this.invoke)],[qj,new b8(this.invoke)],[r91,new b8(this.invoke)],[s91,new b8(this.invoke)]]),child:V}),W=new h6({children:[new t0({decoration:{color:M1.default()},child:new x1({text:new s(">",new X1({color:Y.foreground}))})}),new G4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new $0({height:10,child:new f4({child:new x1({text:new s(L,new X1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new G4({child:new f4({child:new x1({text:new s(this.widget.props.emptyStateText,new X1({color:Y.foreground,dim:!0}))})})});else{let L=X.map((A,E)=>{let P=E===this.selectedIndex,I=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,P,I,J);else{let S=P?M1.yellow:void 0,k=P?M1.black:Y.foreground;T=new t0({decoration:S?{color:S}:void 0,padding:L0.symmetric(2,0),child:new x1({text:new s(this.widget.props.getLabel(A),new X1({color:k,dim:I}))})})}return new qG6(new U8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new d0({children:L,crossAxisAlignment:"start"})}let z=new G4({child:new U8({onScroll:this.handleScroll,opaque:!1,child:new o5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s(this.widget.props.title,new X1({color:M1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new $0({height:1}),z),this.controller.text!==""){let L=X.length>0?X[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new t0({padding:L0.vertical(1),child:new f4({child:A})}));else U.push(new $0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new t0({decoration:{border:G,color:M1.default()},padding:L0.symmetric(1,0),child:new d0({children:U})})}}class ok1 extends o0{createState(){return new WG6}}class WG6 extends a0{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 x1({text:new s("●",new X1({color:this.isGreen?M1.green:M1.index(8),bold:!0})),maxLines:1})}}function zO8(J){let Q=new Map,Y=new Map,X=new Map,G=[];for(let q of J)Q.set(q.id,q);for(let q of J){let V=q.parentRelationships.find((K)=>K.role==="child"&&Q.has(K.threadID));if(V){X.set(q.id,V.type);let K=V.threadID,W=Y.get(K)||[];W.push(q),Y.set(K,W)}else G.push(q)}return DG.flatten(G,(q)=>Y.get(q.id)).map((q)=>({...q.item,depth:q.depth,isLast:q.isLast,ancestorsAreLast:q.ancestorsAreLast,relationshipType:X.get(q.item.id)}))}function rk1(J,Q,Y){return new x1({text:new s(`${J}${Q}`,new X1({color:Y})),maxLines:1})}function FO8(J,Q,Y,X){return[rk1("+",J,X.success),M5.horizontal(1),rk1("~",Q,X.warning),M5.horizontal(1),rk1("-",Y,X.destructive)]}class t91 extends j6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],X=this.props.currentThreadID,G=[...Q].sort((H,z)=>{if(X){if(H.id===X)return-1;if(z.id===X)return 1}let U=Y.indexOf(H.id),N=Y.indexOf(z.id);if(U!==-1&&N!==-1)return U-N;if(U!==-1)return-1;if(N!==-1)return 1;return 0}),Z=zO8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=W6.of(J),K=new z6({padding:L0.symmetric(0,1),child:new f4({child:new x1({text:new s("",new X1({color:V.colors.foreground,dim:!0}),[new s("Ctrl+T",new X1({color:M1.blue,dim:!0})),new s(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new X1({color:V.colors.foreground,dim:!0}))])})})});return new pq({items:Z,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:K,renderItem:(H,z,U,N)=>{let M=W6.of(N),{colors:L}=M,A=z?M1.yellow:void 0,E=z?M1.black:L.foreground,P=M1.index(8),I=(Q1,o)=>new $0({width:o,child:h6.end([new x1({text:new s(Q1,new X1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[],k=H.relationshipType==="handoff",x=new e81;if(H.depth>0){let Q1=[],o=H.ancestorsAreLast.slice(1);for(let H1 of o)Q1.push(new s(x.getAncestorPrefix(H1),new X1({color:x.connectorColor,dim:x.connectorDim})));let u=H.isLast?x.elbow:x.tee,e=x.getConnectorText(u);Q1.push(new s(e,new X1({color:x.connectorColor,dim:x.connectorDim}))),S.push(new x1({text:new s("",void 0,Q1)}))}let b=[],p=this.props.currentThreadID===H.id?new s("(current) ",new X1({color:M1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new s("(visited) ",new X1({color:L.foreground,dim:!0})):null;if(p)b.push(new x1({text:p}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))b.push(new ok1),b.push(new $0({width:1}))}let g=H.title;if(H.relationshipType==="fork"){let Q1=g.match(/^Forked\((\d+)\): /);if(Q1)g=g.slice(Q1[0].length);else while(g.startsWith("Forked: "))g=g.slice(8);b.push(new x1({text:new s("[fork] ",new X1({color:M1.blue}))}))}else if(k)b.push(new x1({text:new s("[handoff] ",new X1({color:M1.index(208)}))}));if(b.push(new G4({child:new x1({text:new s(g,new X1({color:E})),overflow:"ellipsis",maxLines:1})})),b.push(new $0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let Q1=z?{success:P,warning:P,destructive:P}:L;b.push(...FO8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,Q1)),b.push(new $0({width:2}))}return b.push(I(H.description.timeAgo,q)),new t0({decoration:A?{color:A}:void 0,padding:L0.symmetric(2,0),child:new h6({children:[...S,...b]})})}})}}function HG6(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/60000),G=Math.floor(Y/3600000),Z=Math.floor(Y/86400000);if(X<1)return"just now";if(X<60)return`${X}m ago`;if(G<24)return`${G}h ago`;if(Z<7)return`${Z}d ago`;return J.toLocaleDateString()}class sk1 extends j6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((G,Z)=>Z.pubDate.getTime()-G.pubDate.getTime()),Y=Math.max(0,...Q.map((G)=>HG6(G.pubDate).length));return new pq({items:Q,getLabel:(G)=>G.title,onAccept:(G)=>this.props.onSelect?.(G),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(G,Z,q,V)=>{let K=W6.of(V),{colors:W}=K,H=Z?M1.yellow:void 0,z=Z?M1.black:W.foreground,U=M1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new $0({width:A,child:h6.end([new x1({text:new s(L,new X1({color:U}))})])});return new t0({decoration:H?{color:H}:void 0,padding:L0.symmetric(2,0),child:new h6({children:[new G4({child:new x1({text:new s(G.title,new X1({color:z})),overflow:"ellipsis",maxLines:1})}),new $0({width:2}),new x1({text:new s(N,new X1({color:U})),maxLines:1}),new $0({width:2}),M(HG6(G.pubDate),Y)]})})}})}}class tk1 extends j6{props;constructor(J){super();this.props=J}build(){return new f4({child:new x1({text:new s("",void 0,[new s(`Forked to new thread:
|
|
4661
4661
|
|
|
4662
4662
|
`,new X1({color:M1.white,dim:!0})),new s(`"${this.props.newThreadTitle||"Untitled"}"`,new X1({color:M1.white}))]),textAlign:"center"})})}}class PN extends o0{props;constructor(J){super();this.props=J}createState(){return new zG6}}class zG6 extends a0{_spinner=new oZ;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=W6.of(J),{colors:Y}=Q,X=T4.all(new D4(Y.foreground,1,"solid")),G=this._spinner.toBraille(),Z=new x1({textAlign:"center",text:new s("",void 0,[new s(G,new X1({color:M1.yellow})),new s(" ",void 0),new s(this.widget.props.message,new X1({color:Y.foreground}))])}),V=[new G4({child:new d0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)V.push(new $0({height:2,child:new t0({padding:L0.symmetric(2,0),child:new x1({text:new s("",new X1({dim:!0}),[new s("Press ",new X1({color:Y.foreground})),new s("Esc",new X1({color:Y.info})),new s(" to cancel",new X1({color:Y.foreground}))])})})}));let K=new t0({decoration:new H8(M1.default(),X),child:new $0({width:60,height:7,child:new d0({mainAxisAlignment:"start",children:V})})});if(this.widget.props.onAbort)return new R8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:K});return K}}class fz extends o0{props;constructor(J){super();this.props=J}createState(){return new FG6}}class FG6 extends a0{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof YW}build(J){let Q=this.widget.props.message,Y=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let W=o81(Q);return{title:W.title,type:W.type,description:W.description}})(),X=Y.type==="error"?M1.red:M1.yellow,G=T4.all(new D4(M1.default(),1,"solid")),Z=new t0({padding:L0.symmetric(1,0),child:new x1({text:new s(Y.title,new X1({color:X,bold:!0}))})}),q=this.isWidgetMessage(Q)?Q.widget:new x1({text:new s(Y.description,new X1({color:M1.default()})),selectable:!0}),V=new G4({child:new LO({child:new t0({padding:L0.symmetric(1,0),child:q})})}),K=new t0({padding:L0.symmetric(1,0),child:new x1({text:this.widget.props.onRetry?new s("",void 0,[new s("Press ",new X1({color:M1.default(),dim:!0})),new s("R",new X1({color:M1.yellow})),new s(" to retry, ",new X1({color:M1.default(),dim:!0})),new s("Esc",new X1({color:M1.yellow})),new s(" to cancel",new X1({color:M1.default(),dim:!0}))]):new s("Press any key to close",new X1({color:M1.default(),dim:!0,italic:!0}))})});return new R8({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 t0({decoration:{border:G,color:M1.default()},padding:L0.all(1),child:new d0({mainAxisAlignment:"center",children:[Z,new $0({height:1}),V,K]})})})}}class ek1 extends j6{build(){return new f4({child:new x1({text:new s("",void 0,[new s(`✓ Thread Shared
|
|
4663
4663
|
|
|
@@ -4758,7 +4758,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
4758
4758
|
`)?`${V}...`:G,W=new X1({color:M1.index(8)}),H=[new s(K,W)];if(q>0){let z=new X1({color:Y.success});for(let U=1;U<=q;U++)H.push(new s(" ")),H.push(new s(`[${U}]`,z))}return new z6({padding:L0.only({bottom:0}),child:new h6({crossAxisAlignment:"start",children:[new z6({padding:L0.only({right:1}),child:new x1({text:new s("•",new X1({color:M1.index(8)}))})}),new G4({child:new x1({text:new s("",void 0,H)})})]})})}}class _y1 extends o0{createState(){return new FZ6}}class FZ6 extends a0{_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 X1({color:M1.red}),Y=new X1({color:this._visible?M1.red:M1.transparent()});return new h6({children:[new x1({text:new s("⏺",Y)}),new $0({width:1}),new x1({text:new s("Replay",Q)})]})}}class ky1 extends j6{entry;width;constructor({key:J,entry:Q,width:Y}){super({key:J});this.entry=Q,this.width=Y}build(J){let Y=W6.of(J).colors.mutedForeground,X=this.entry,G=X.authors[0]?.name||"Community";if(G.includes("@"))G=G.split("@")[0]??G;let Z=" · ",q=50,V=this.truncateToWidth(X.title,q),K=`${Z}${V}`,W=Math.max(1,this.width-K.length-2),H=X.description.replace(/\s+/g," ").trim(),z=`@${G}: ${H}`,U=this.truncateToWidth(z,W),N=new x1({text:new s(U,new X1({color:Y,dim:!0}))}),M=new x1({text:new s(K,new X1({color:Y,dim:!0}))});return new U8({onClick:()=>IQ(J,X.link),cursor:"pointer",child:new $0({width:this.width,height:1,child:new z6({padding:L0.horizontal(1),child:new h6({children:[new G4({child:new bm(new $0({width:W,height:1,child:N}))}),M]})})})})}truncateToWidth(J,Q){if(J.length<=Q)return J;return J.slice(0,Q-1)+"…"}}e0();function Iw8(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/3600000),G=Math.floor(X/24),Z=Math.floor(G/7),q=Math.floor(G/30);if(X<1)return"Just now";if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;if(Z<=4)return`${Z}w ago`;return`${q}mo ago`}class yy1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Y)=>{let X=this.threadHistoryService.observeThreadList().subscribe((G)=>{X.unsubscribe(),Y(G)})});return{ok:!0,threads:this.formatThreadSummaries(Q,J)}}catch(Q){return{ok:!1,errorMsg:Q instanceof Error?Q.message:"An unexpected error occurred"}}}observeThreadSummaries(J=""){return this.threadHistoryService.observeHistory().pipe($6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((X)=>{if(!Q.trim())return!0;let G=X.title?.toLowerCase()||"untitled",Z=X.id.toLowerCase(),q=Q.toLowerCase();return G.includes(q)||Z.includes(q)}).map((X)=>{let G=new Date(X.userLastInteractedAt),Z=Iw8(G),q=X.id.slice(-8),V=X.env?.initial.trees?.[0]?.uri;return{id:X.id,title:X.title||"Untitled",updatedAt:new Date(X.userLastInteractedAt).toISOString(),description:{timeAgo:Z,title:X.title||"Untitled",shortThreadID:q},diffStats:X.summaryStats?.diffStats,workspaceURI:V,parentRelationships:X.parentRelationships}})}}N0();a8();class xy1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new k7;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(SM()).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 UZ6(J,Q){switch(J){case"update-available":return[new s("A newer Amp is available. Run ",new X1({color:Q.foreground,dim:!0})),new s("amp update",new X1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new s("Update complete, run ",new X1({color:Q.foreground,dim:!0})),new s("amp update",new X1({color:Q.warning})),new s(" to see warnings",new X1({color:Q.foreground,dim:!0}))];case"update-error":return[new s("Update failed, run ",new X1({color:Q.foreground,dim:!0})),new s("amp update",new X1({color:Q.warning})),new s(" to see warnings",new X1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function jw8(J){return new Promise((Q)=>{Rw8("git",["branch","--show-current"],{cwd:J},(Y,X)=>{if(Y){Q(null);return}let G=X.trim();Q(G||null)})})}class wZ6 extends o0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new uy1}}class uy1 extends a0{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;threadLoadSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;isShowingHelp=!1;isShowingConsoleOverlay=!1;isShowingMCPStatusModal=!1;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;isShowingCostBreakdownOverlay=!1;isShowingContextDetailOverlay=!1;confirmationOverlayContent="";exitConfirmTimeout=null;clearInputConfirmTimeout=null;cancelProcessingConfirmTimeout=null;historyIndex=-1;historyDraft=null;bashInvocations=[];dismissedEphemeralErrorKey=null;currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;isShowingPalette=!1;paletteShowOptions=null;threadsForPicker=[];isLoadingThreads=!1;threadPreviewController=new xy1;previewThread=null;planScrollController=(()=>{let J=new k7;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new k7;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new k8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new k8({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 CS1;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 D6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Y=Q.includes("localhost")||Q.includes("127.0.0.1");try{let q=await this.widget.dependencies.internalAPIClient.getUserInfo({},{config:this.widget.dependencies.configService});if(q.ok){let V=q.result,K="user"in V?V.user:V;this.currentUserInfo={username:K.username??void 0,displayName:K.displayName??void 0};let W="ffe10a0c-6c42-41ce-a3a6-38990fd6caf8";if(!Y&&V.team?.id!==W)return}else return}catch(q){v.debug("Failed to fetch user info for thread feed filtering",q);return}let X="/threads.rss",G=async(q,V)=>{let K=q instanceof Request?q.url:q.toString();return NJ(K,V,this.widget.dependencies.configService)},Z=Hi0();Z.get("entries").then((q)=>{if(q){let V=this.filterEntries(q);if(this.threadFeedEntries=V,V.length>0&&!this.currentThreadFeedEntry){let K=[...V].sort((H,z)=>z.pubDate.getTime()-H.pubDate.getTime());this.threadFeedTickerQueue=[...K,...this.threadFeedTickerQueue];let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}),this.threadFeedReader=new cj1(Z,G,{url:X}),this.threadFeedSubscription=this.threadFeedReader.stream().subscribe({next:(q)=>{try{let V=this.filterEntries(q);if(V.length>0){this.threadFeedEntries=[...V,...this.threadFeedEntries];let K=[...V].sort((W,H)=>H.pubDate.getTime()-W.pubDate.getTime());if(this.threadFeedTickerQueue=[...K,...this.threadFeedTickerQueue],!this.currentThreadFeedEntry){let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}catch(V){v.error("Thread feed: error in next handler",V)}},error:(q)=>{v.error("Thread feed error:",q)}}),this.resetThreadFeedRotation()}filterEntries(J){if(!this.currentUserInfo)return J;let{username:Q,displayName:Y}=this.currentUserInfo;return J.filter((X)=>{return!X.authors.some((G)=>{let Z=G.name;if(!Z)return!1;return Q&&Z===Q||Y&&Z===Y||Q&&Z.includes(Q)})})}rotateThreadFeed(){if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);this.threadFeedRotationTimer=setInterval(()=>{let J=this.getNextFeedEntry();if(J)this.setState(()=>{this.currentThreadFeedEntry=J})},30000)}resetThreadFeedRotation(){this.rotateThreadFeed()}getNextFeedEntry(){if(this.threadFeedTickerQueue.length>0)return this.threadFeedTickerQueue.shift();return null}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1,this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Y,baseWpm:X}=J,G=Q.messages;for(let Z=0;Z<G.length;Z++){if(this.replayAbortController.signal.aborted)break;let q=G[Z];if(!q)continue;if(Z>0)await this.replaySleep(J.messageDelayMs);if(q.role==="user"&&Y){let W=q.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
|
|
4759
4759
|
`);if(W)await this.replayTypeMessage(W,X)}if(q.role==="assistant"){let W=q.content.some((U)=>U.type==="tool_use"),H=G[Z+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...q,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let N=J.thread.id;this.getMessageScrollController(N).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),q]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,q],this.textController.clear()});let V=J.thread.id;this.getMessageScrollController(V).scrollToBottom()}await this.replaySleep(J.exitDelayMs),H9.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Y=J.split(/(?<=\s)/),X=60000/Q;for(let G of Y){if(this.replayAbortController.signal.aborted)break;if(this.looksLikePastedContent(G.trim())){await this.replaySleep(150),this.textController.text=this.textController.text+G,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{}),await this.replaySleep(300);continue}let Z=X/G.length;for(let q of G){this.textController.text=this.textController.text+q,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let V=0.8+Math.random()*0.4,K=Z*V;await this.replaySleep(K)}}}looksLikePastedContent(J){if(/^[a-z][a-z0-9+.-]*:\/\//i.test(J))return!0;if(J.startsWith("/")&&J.length>10)return!0;if(/^[a-z]:\\/i.test(J))return!0;if(/^[a-f0-9]{7,40}$/i.test(J))return!0;if(/^T-[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(J))return!0;return!1}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return this.agentModeController?.getEffectiveMode()??"smart"}isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;if(J.viewState.state!=="active")return!1;if(Boolean(J.viewState.inferenceState==="running"))return!0;let Y=J.items.filter((Z)=>Z.type==="toolResult").filter((Z)=>Z.toolResult.run.status==="in-progress"||Z.toolResult.run.status==="queued"),X=J.subagentActiveTools.filter((Z)=>Z.toolRun.status==="in-progress"||Z.toolRun.status==="queued");return[...Y,...X].length>0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new s(this.submitDisabledHint,new X1({color:J.foreground,dim:!0}));if(this.isExiting)return new s("Exiting...",new X1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new s("",void 0,[new s("Ctrl+C",new X1({color:Q.keybind})),new s(" again to exit",new X1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new s("",void 0,[new s("Esc",new X1({color:Q.keybind})),new s(" again to clear input",new X1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new s("",void 0,[new s("Escape",new X1({color:Q.keybind})),new s(" to close help",new X1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let G=this.getEffectiveAgentMode(),Z=my1(G);return new s("",void 0,[new s("Images aren't supported in ",new X1({color:J.warning,dim:!1})),new s(G,new X1({color:Z})),new s(" mode.",new X1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new s("",void 0,[new s("Esc",new X1({color:Q.keybind})),new s(" again to cancel",new X1({color:J.foreground,dim:!0}))]);return new s("",void 0,[new s("Esc",new X1({color:Q.keybind})),new s(" to cancel",new X1({color:J.foreground,dim:!0}))])}let Y=UZ6(this.updateState,J);if(Y)return new s("",void 0,Y);let X=this.widget.dependencies.worker.thread;if(X.agentMode==="plan"&&zO(X))return new s("",void 0,[new s("Ctrl+O",new X1({color:Q.keybind})),new s(" → Execute Plan",new X1({color:J.foreground,dim:!0}))]);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Y}=this.widget.dependencies;if(!Q.mainThread?.id)return;let G=Q.mainThread?.messages.findIndex((Z)=>Z===J);if(G===void 0||G===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),await Y.handle({type:"thread:truncate",fromIndex:G}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(Z){v.error("Failed to edit message:",Z)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Y,threadSyncService:X}=this.widget.dependencies,G=Q.mainThread?.id;if(!G)return;let Z=Q.mainThread?.messages.findIndex((q)=>q===J);if(Z===void 0||Z<=0)return;try{let q=await R3.getOrCreateForThread(Y,G),V=await kT(q,X,Z-1);await this.switchToExistingThread(V)}catch(q){v.error("Failed to fork thread:",q),this.showErrorMessage(`Failed to fork thread: ${q}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Y,worker:X}=this.widget.dependencies,G=Y.mainThread;if(!G)return;let Z=G.messages.findIndex((q)=>q.messageId!==void 0&&q.messageId===J.messageId);if(Z===-1)return;try{this.cancelBashInvocations(),await X.cancel(),this.widget.dependencies.history.add(Q);let q=DN(Q);if(q)await X.handle({type:"thread:truncate",fromIndex:Z}),this.invokeBashCommand(q.cmd,{visibility:q.visibility});else{let V=[{type:"text",text:Q}];if(this.imageAttachments.length>0)V.push(...this.imageAttachments);let K={content:V,agentMode:G.agentMode},W=Z===0;if(G.agentMode&&!W&&K.agentMode!==G.agentMode){v.error(`Cannot edit message: This thread uses ${G.agentMode} mode. To change mode, create a new thread.`);return}await X.handle({type:"user:message",message:K,index:Z})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(q){v.error("Failed to edit message:",q)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(KJ)}catch(Y){return v.error("Failed to get affected files:",Y),[]}};textController=new aZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new k7);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let X=this.searchElementTreeByKey(J.child,Q);if(X)return X}if(J?.children)for(let X of J.children){let G=this.searchElementTreeByKey(X,Q);if(G)return G}return null}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{this.toastController.show("Selection copied to clipboard","success",2000)}}}updateTerminalTitle(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.title;if(Q!==this.currentTitle){this.currentTitle=Q;let Y=process.cwd().replace(process.env.HOME||"","~"),X=Q?`amp - ${Q} - ${Y}`:"";process.stdout.write(Qj1(X))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new Z2("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands;paletteConfig;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"){this.showCommandPalette(),this.textController.clear();return}let Y=DN(J)?.visibility;if(Y!==this.currentShellModeStatus)this.currentShellModeStatus=Y,this.setState(()=>{})};navigateHistoryPrevious=()=>{let J=this.widget.dependencies.history.previous();if(J!==null){if(this.historyIndex===-1)this.historyDraft=this.textController.text;this.historyIndex++,this.textController.text=J,this.textController.moveCursorToStart()}};navigateHistoryNext=()=>{let J=this.widget.dependencies.history.next();if(J!==null)this.historyIndex--,this.textController.text=J,this.textController.moveCursorToEnd();else if(this.historyIndex>-1)this.historyIndex=-1,this.textController.text=this.historyDraft||"",this.textController.moveCursorToEnd(),this.historyDraft=null};resetHistory=()=>{this.widget.dependencies.history.reset(),this.historyIndex=-1,this.historyDraft=null};openJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!0})};dismissJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!1})};openIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!0})};dismissIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!1}),G9.instance.addPostFrameCallback(()=>{this.autocompleteFocusNode.requestFocus()})};handleIdeSelection=async(J,Q)=>{if(this.widget.dependencies.ideClient.getSelectedConfig()?.pid===J.pid){this.dismissIdePicker();return}try{await this.connectToSelectedIde(J,Q)}catch(Y){let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})}this.widget.dependencies.ideClient.selectConfig(J),this.dismissIdePicker()};async connectToSelectedIde(J,Q){await this.widget.dependencies.ideClient.start(J,!0,Q)}previewControllerListener=(J)=>{this.setState(()=>{this.previewThread=J})};showStandaloneThreadPicker=()=>{this.showCommandPalette({type:"standalone",commandId:"continue",onSubmit:()=>{this.threadPreviewController.clear(),this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null}),G9.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 Qy1(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 Gy1(this.widget.dependencies.fuzzyServer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Y}=this.widget.dependencies;if(!Q.mainThread)return null;let X=u0.file(process.cwd()),G=C6(X);return{recentThreadIDs:Y,currentThreadID:Q.mainThread.id,context:J,worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:Q.mainThread,ampURL:this.widget.dependencies.ampURL,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let Z=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),Z},setImageAttachments:(Z)=>{this.setState(()=>{this.imageAttachments=Z})},editorDispatch:(Z)=>{switch(Z.type){case"set-input":this.textController.clear(),this.textController.insertText(Z.input);break;case"insert-text":this.textController.insertText(Z.text);break;case"clear":this.textController.clear();break}},submitMessage:(Z)=>{return this.proceedWithUserMessage(Z)},exitApp:this.exitApplication,openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},settingsStorage:this.widget.dependencies.settingsStorage,clientId:this.widget.dependencies.clientId,connectedClientsService:this.widget.dependencies.connectedClientsService,mcpService:this.widget.dependencies.mcpService,startNewThread:async()=>{await this.startAndSwitchToNewThread()},navigateBack:this.navigateBack,navigateForward:this.navigateForward,canNavigateBack:this.threadBackStack.length>0,canNavigateForward:this.threadForwardStack.length>0,canUseAmpFree:this.widget.dependencies.freeTierStatus?.canUseAmpFree??!1,switchToThread:async(Z)=>{return await this.switchToExistingThread(Z),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),this.widget.dependencies.worker},generateHandoffPrompt:async(Z,q,V)=>{let K=this.widget.dependencies.threadState.mainThread?.id;if(!K)throw Error("No active thread");let W=setTimeout(()=>{V.throwIfAborted()},60000);try{let H=await this.widget.dependencies.threadService.generateHandoffPrompt(K,Z,q,this.widget.dependencies.configService,V);return clearTimeout(W),H}catch(H){throw clearTimeout(W),H}},handleHandoff:async(Z,q)=>{let{goal:V,generatedPrompt:K,images:W}=q;if(!V&&!K)return{ok:!1,error:Error("Either goal or generatedPrompt required")};try{let H=this.widget.dependencies.threadState.mainThread?.id;if(!H)return{ok:!1,error:Error("No active thread")};let z=setTimeout(()=>Z.abort(new l91("Handoff took too long and was aborted (timeout: 60s)")),60000);try{let U=await this.widget.dependencies.threadService.createHandoffThread(H,{goal:V,generatedPrompt:K,images:W},this.widget.dependencies.configService,Z.signal);return clearTimeout(z),await this.switchToExistingThread(U),{ok:!0}}catch(U){if(clearTimeout(z),U instanceof Error&&(U.name==="AbortError"||U.message.includes("aborted")))throw Z.signal.reason;throw U}}catch(H){return v.error("Failed to create handoff thread",H),{ok:!1,error:H instanceof Error?H:Error(String(H))}}},getGuidanceFiles:async(Z)=>{if(!Q.mainThread)return[];return(await Hs({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},Q.mainThread,Z)).map((V)=>({uri:V.uri,type:V.type}))},openIdePicker:()=>{this.openIdePicker()},getAgentMode:()=>{return this.agentModeController?.getMode()??null},setAgentMode:(Z)=>{this.agentModeController?.setMode(Z)},toggleAgentMode:this.toggleAgentMode,getEffectiveAgentMode:()=>this.getEffectiveAgentMode(),getEditorText:()=>this.textController.text,workspace:this.widget.dependencies.workspace??null,handleExecutePlan:async()=>{try{let Z=Q.mainThread?.id;if(!Z){this.setState(()=>{this.displayMessage=Error("No active thread")});return}let q=await this.widget.dependencies.threadService.createPlanExecutionThread(Z,"smart");await this.switchToExistingThread(q)}catch(Z){v.error("Failed to execute plan",Z),this.setState(()=>{this.displayMessage=Error(`Failed to execute plan: ${Z instanceof Error?Z.message:String(Z)}`)})}},planFileManager:this.widget.dependencies.planFileManager,completionBuilder:this.getCompletionBuilder(),threads:this.threadsForPicker,previewController:this.threadPreviewController,isLoadingThreads:this.isLoadingThreads,filterByWorkspace:this.filterThreadPickerByWorkspace,currentWorkspace:G,threadViewStates:this.widget.dependencies.workerController.threadViewStates,currentThreadFeedEntry:this.currentThreadFeedEntry,threadFeedEntries:this.threadFeedEntries,threadFeedHidden:this.threadFeedHidden,setThreadFeedHidden:(Z)=>{this.setState(()=>{this.threadFeedHidden=Z})},showMCPStatusModal:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!0})}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new yy1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await jw8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Y=Date.now(),X=`bash-${Y}-${Math.random().toString(36).substring(7)}`,G={cmd:J},Z=new AbortController;this.widget.dependencies.worker.invokeBashTool(G,Z.signal,Q===NN).subscribe({next:(q)=>{this.setState(()=>{if(this.bashInvocations.find((K)=>K.id===X))this.bashInvocations=this.bashInvocations.map((K)=>K.id===X?{...K,toolRun:q}:K);else{let K={id:X,args:G,toolRun:q,startTime:Y,abortController:Z,hidden:Q===NN};this.bashInvocations=[...this.bashInvocations,K]}})},error:()=>this.removeBashInvocation(X),complete:()=>this.removeBashInvocation(X)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};showContextDetailOverlay=()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!0})};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,Y=Q/J;this.agentModeSlideTimer=setInterval(()=>{this.setState(()=>{if(this.agentModeSlideProgress!==null){if(this.agentModeSlideProgress=Math.min(1,this.agentModeSlideProgress+Y),this.agentModeSlideProgress>=1){if(this.agentModeSlideProgress=null,this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null}}})},Q)};handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!ek(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>=AU)return!1;let Y=uC(J);if(typeof Y==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Y]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Y}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};handleShowMysteryModal=()=>{if(this.mysteriousMessage)this.setState(()=>{this.isShowingMysteriousMessageModal=!0})};handleCloseMysteryModal=()=>{this.setState(()=>{this.isShowingMysteriousMessageModal=!1})};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:Y,unlink:X,rmdir:G,writeFile:Z}=await import("node:fs/promises"),{tmpdir:q}=await import("node:os"),V=await import("node:path");try{let K=await Q(V.join(q(),"amp-edit-")),W=V.join(K,"message.amp.md");await Z(W,J,"utf-8"),await hq(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")v.error("Failed to read temporary file",H)}try{await X(W),await G(K)}catch(H){v.warn("Failed to clean up temporary file",H)}}catch(K){v.error("Error opening editor:",K)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=DN(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(zG.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();H9.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),H9.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),H9.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{G9.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),D6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y,this.agentModeController=new rj1({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:Y.settings,config$:this.widget.dependencies.configService.config,getThread:()=>this.widget.dependencies.getCurrentWorker()?.thread??this.widget.dependencies.worker.thread}),this.agentModeController.addListener(this.agentModeListener)}),this.updateGitBranch(),this.adSubscription=Ij1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let Y=this.agentModeController?.getMode();return(Y&&$5(Y)||this.randomAd===null)&&Ej1(this.lastUserInteractionTime)}).subscribe({next:(Y)=>{if(Y){let X=Tw8(16).toString("hex");this.lastAdImpressionId=X,Promise.resolve().then(() => (M51(),D51)).then(({recordAdEvent:G})=>{let Z=this.widget.dependencies.worker.thread,q=Z.messages[Z.messages.length-1];G("viewed",{adId:Y.id,advertiserId:Y.advertiserId,threadId:Z.id,messageId:q?.messageId,impressionId:X,placement:"tui",matchType:Y.metadata?.matchType,matchedPatterns:Y.metadata?.matchedPatterns,candidateAdPoolCount:Y.metadata?.candidateAdPoolCount,clientRegion:Y.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=Y}),G9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}});let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=Y})}),this.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Y)=>{this.setState(()=>{this.mcpServers=Y})}),this.cacheTimerSubscription=this.widget.dependencies.worker.cacheTimer.subscribe((Y)=>{this.setState(()=>{this.cacheTimerState=Y})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Y)=>{this.setState(()=>{this.ideStatus=Y})}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Y)=>{let X=this.widget.dependencies.getCurrentWorker();if(!X){v.warn("No active thread worker found to handle IDE message");return}await new Promise((G)=>setTimeout(G,50)),await X.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}}),v.debug("Message sent from IDE to agent",{message:Y.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Y)=>{this.textController.insertText(Y),v.debug("Appended text to CLI prompt from IDE",{text:Y.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Y)=>{this.setState(()=>{this.connectedClientsStatus=Y})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Y)=>{this.setState(()=>{this.updateState=Y})}),this.mysteriousMessageSubscription=i41(this.widget.dependencies.configService).pipe(J7((Y)=>Y!=="pending"),$6((Y)=>n41(Y)?Y.mysteriousMessage??null:null),P4((Y,X)=>Y?.id===X?.id)).subscribe((Y)=>{this.setState(()=>{if(Y?.id!==this.mysteriousMessage?.id)this.isShowingMysteriousMessageModal=!1;if(this.mysteriousMessage=Y,Y&&!this.mysterySequenceManager)this.mysterySequenceManager=new b81(new Map([[new h81(uy1.MYSTERY_SEQUENCE),new rm]])),this.mysteryKeyInterceptorUnsubscribe=H9.instance.addKeyInterceptor((X)=>{if(!this.mysterySequenceManager)return!1;if(this.isShowingMysteriousMessageModal)return!1;let G=this.mysterySequenceManager.handleKeyEvent(X);if(G.consumed){if(G.intent)this.handleShowMysteryModal();return this.setState(()=>{this.mysterySequenceProgress=G.progress}),!0}else if(this.mysterySequenceProgress)this.setState(()=>{this.mysterySequenceProgress=null});return!1});else if(!Y)this.mysteryKeyInterceptorUnsubscribe?.(),this.mysteryKeyInterceptorUnsubscribe=null,this.mysterySequenceManager?.dispose(),this.mysterySequenceManager=null,this.mysterySequenceProgress=null})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Y)=>{let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100);this.initThreadFeed()}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener()}dispose(){if(this.replayAbortController.abort(),this.replayTypingTimer)clearTimeout(this.replayTypingTimer);if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.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(Qj1("")),this.shouldUseProgressBar())process.stdout.write(c76())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,X=[...J.items.filter((V)=>V.type==="toolResult").map((V)=>({toolUse:V.toolUse,toolRun:V.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((V)=>V.toolRun.status==="blocked-on-user");if(X.length===0)return null;let G=X[0],Z=G.toolRun.status==="blocked-on-user"?G.toolRun.toAllow??[]:[],q=G.toolRun.status==="blocked-on-user"?G.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:G.toolUse,toAllow:Z}],subthreadID:G.subthreadID,reason:q}}shouldUseProgressBar(){return!1}updateProgressBar(){}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){v.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){v.error("No tool use block found in confirmation");return}if(J==="allow-all-session")b$("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(G){if(G&&G instanceof Error)this.setState(()=>{this.displayMessage=G});else v.error("Failed to write dangerouslyAllowAll setting:",G);return}if(J==="always-guarded"){let G=Q.tools[0]?.toAllow??[],Z=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],q=[...G,...Z];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",q,"global")}if(J==="connect-github"){let G=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();await IQ(this.context,G);return}if(J==="disable-librarian"){let G=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!G.includes(jX))await this.widget.dependencies.settingsStorage.set("tools.disable",[...G,jX],"global")}let X=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let G={type:"user:tool-input",toolUse:Y.id,value:{accepted:X}};if(Q.subthreadID)await(await R3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(G);else await this.widget.dependencies.worker.handle(G)}catch(G){v.error("Failed to send tool confirmation:",G)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Y=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Y)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Y=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Y.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.agentModeController?.setMode("smart"),this.setState(()=>{this.dismissedEphemeralErrorKey=null}),S41({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 hq(Q.getSettingsFilePath())}catch(Y){let X=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${X}`)}};cancelStreamingMessage=async()=>{await R3.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let Y=J.messages[Q];if(Y?.role==="user"&&!Y.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Y=!0}=Q;if(Y){let X=this.widget.dependencies.worker.thread.id;if(X!==J)this.recordNavigation(X)}try{v.info(`[switchToExistingThread] Switching to thread: ${J}`);let X=await this.widget.dependencies.switchToThread(J);if(v.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${X.thread.agentMode}`),this.widget.dependencies.worker=X,this.widget.dependencies.threadID=X.thread.id,this.widget.dependencies.switchWorker(X),v.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),X.thread.draft)if(v.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof X.thread.draft==="string")this.textController.insertText(X.thread.draft);else{let G=X.thread.draft.filter((V)=>V.type==="text"),Z=X.thread.draft.filter((V)=>V.type==="image"),q=G.map((V)=>V.text).join(`
|
|
4760
4760
|
`);if(q)this.textController.insertText(q);if(Z.length>0)this.setState(()=>{this.imageAttachments=Z})}}catch(X){throw v.error("Failed to switch to thread:",J,X),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Y=FJ(Q.thread)===0,X=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Y&&X!==Q.thread.agentMode){await this.showErrorMessage(`This thread uses ${Q.thread.agentMode} mode. To change mode, edit the first message or create a new thread.`);return}let G=[{type:"text",text:J}];if(this.imageAttachments.length>0)G.push(...this.imageAttachments);if(Y)this.startAgentModeSlide();if(await Q.handle({type:"user:message",message:{content:G,agentMode:X}}),Y)S41({agentMode:X});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),G9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})};async showErrorMessage(J){this.setState(()=>{this.displayMessage=Error(J)})}exitApplication=async()=>{this.setState(()=>{this.isExiting=!0});let J=this.widget.dependencies.threadState.mainThread;if(J?.messages.length===0){if(J.relationships?.find((X)=>X.type==="handoff"&&X.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();S41({agentMode:Q}).catch((Y)=>{v.warn("Failed to save session state on exit:",Y)}).finally(()=>{H9.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=Cw8();if(J===Q)return"~";if(J.startsWith(Q+Bu.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(Bu.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(Bu.sep),"…",Q.slice(-2).join(Bu.sep)].join(Bu.sep)}build(J){let Q=u4.of(J),Y=W6.of(J),X=Y.base;this.themeColors=X;let{colors:G,app:Z}=Y;this.themeApp=Z;let q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,V=q.thread.agentMode&&$5(q.thread.agentMode),K=V&&this.randomAd!==null,W=!V&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden,H=Boolean(K),{threadState:z}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let U=this.getCurrentConfirmation(),N=this.widget.dependencies.replayMode,M=Boolean(N),L=z.items,A=z.mainThread||void 0,E=z.subagentToolsByParentID,P=z.todosList;if(M){let n6={...N.thread,messages:this.replayDisplayedMessages};L=Gj(n6).items,A=n6,E={};let x6=MI({messages:this.replayDisplayedMessages});P=Array.isArray(x6)?x6:[]}let I=A?.id,T=A,S=M?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),k=(n6)=>new u91({key:new Z2(`preview-message-view-${n6.id}`),items:Gj(n6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:n6,focusNode:new k8({debugLabel:"PreviewFocus"})}),x=this.previewThread,b=x?x.messages.length>2000?new d0({mainAxisSize:"max",children:[new G4({child:new $0}),new z6({padding:L0.all(2),child:new f4({child:new x1({text:new s("Thread too long for preview",new X1({color:G.mutedForeground,dim:!0}))})})})]}):k(x):S?new c91({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal}):new u91({key:I?new Z2(`message-view-${I}`):void 0,items:L,subagentToolsByParentID:E,controller:I?this.getMessageScrollController(I):new k7,autofocus:!1,onCopy:M?void 0:this._handleTextCopy.bind(this),thread:T,onMessageEditSubmit:M?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:M?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:M?void 0:this.forkMessage,getAffectedFiles:M?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),p=Math.max(Math.floor(Q.size.height*0.4),12),g=this.getCurrentEphemeralError(),i=Q.size.width<40,Q1=z.mainThread?LN0(z.mainThread):void 0,o=yz(J),u=this.buildBottomWidget(g,U,G,Y,z,P,p,H,M,Q1,this.cacheTimerState??void 0,Q,o),e=new Y91({threadViewState:z.viewState,threadTokenUsage:Q1,threadID:I??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:i,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 J91({bashInvocations:this.bashInvocations}),V1=[];if(W&&this.currentThreadFeedEntry)V1.push(new ky1({entry:this.currentThreadFeedEntry,width:Q.size.width}));let n=this.getEffectiveAgentMode(),t=this.currentShellModeStatus,l=my1(n),K1=!t?n.length+1:0,k1=Q.capabilities.animationSupport,J1=k1==="disabled"?0:k1==="slow"?30:60,f1=uV(n)?.uiHints?.fasterAnimation?3:1,I1=J1>0&&this.agentModePulseSeq>0?new t9({children:[u,new $7({top:0,left:1,right:1,height:1,child:new Ty1({color:l,trigger:this.agentModePulseSeq,fps:J1,speed:f1,leftOffset:K1})})]}):u;V1.push(new G4({child:b}),H1);let E0=new t9({children:[new d0({mainAxisSize:"min",children:[K?new dk1({ad:this.randomAd,onButtonClick:async()=>{let n6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (M51(),D51)).then(({recordAdEvent:F9})=>{let w4=this.widget.dependencies.worker.thread,j3=w4.messages[w4.messages.length-1];F9("clicked",{adId:n6.id,advertiserId:n6.advertiserId,threadId:w4.id,messageId:j3?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:n6.metadata?.matchType,matchedPatterns:n6.metadata?.matchedPatterns,candidateAdPoolCount:n6.metadata?.candidateAdPoolCount,clientRegion:n6.metadata?.clientRegion})});if(!await IQ(this.context,n6.shortDestinationUrl)){let w4=H9.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:w4,url:n6.shortDestinationUrl}})}}}):new $0({height:0}),new t0({constraints:new P6(0,Q.size.width,0,p),child:I1})]}),H?new $7({top:0,left:0,right:0,child:new PZ6({userHeight:this.bottomGridUserHeight,maxHeight:p,onInitializeHeight:(n6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(n6,p)})},onDrag:(n6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(n6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let x6=Math.floor(n6.localPosition.y)-this.bottomGridDragStartY,F9=Math.max(4,this.bottomGridDragStartHeight-x6),w4=Math.min(F9,p),j3=Math.floor(w4);if(this.bottomGridUserHeight!==j3)this.setState(()=>{this.bottomGridUserHeight=j3})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new $0({height:0})]});V1.push(E0,new $0({height:1,child:new z6({padding:L0.horizontal(1),child:e})}));let T1=new d0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:V1}),U1=M&&N?.showIndicator!==!1?new t9({children:[T1,new $7({top:0,left:0,child:new _y1})]}):T1,Y1=new b8(()=>{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.isShowingCostBreakdownOverlay)return this.setState(()=>{this.isShowingCostBreakdownOverlay=!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((x6)=>{v.error("Failed to mark message as interrupted:",x6)}),this.cancelStreamingMessage().catch((x6)=>{v.error("Failed to cancel streaming message:",x6)});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 b8(()=>{return this.onExitPressed(),"handled"}),w1=new b8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),P1=new b8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),E1=new b8(()=>{return _J.instance.toggleAll(),"handled"}),d1=new b8(()=>{return this.widget.dependencies.configService.getLatest().then((n6)=>{b$("internal.showCost",!(n6.settings["internal.showCost"]??!0))}),"handled"}),b1=new b8(()=>{return H9.instance.toggleFrameStatsOverlay(),"handled"}),r1=new b8(()=>{return H9.instance.tuiInstance.getScreen().markForRefresh(),G9.instance.requestFrame(),"handled"}),q0=new b8(()=>{return this.toggleAgentMode(),"handled"}),G0=new b8(()=>{let x6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F9}=this.widget.dependencies,w4=F9.mainThread?.id;return w4?this.getMessageScrollController(w4):null})();if(x6){let F9=Math.max(Math.floor(Q.size.height*0.4),10),w4=Q.size.height-F9;x6.animatePageUp(w4,100)}return"handled"}),C0=new b8(()=>{let x6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F9}=this.widget.dependencies,w4=F9.mainThread?.id;return w4?this.getMessageScrollController(w4):null})();if(x6){let F9=Math.max(Math.floor(Q.size.height*0.4),10),w4=Q.size.height-F9;x6.animatePageDown(w4,100)}return"handled"}),B6=new b8(()=>{let x6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F9}=this.widget.dependencies,w4=F9.mainThread?.id;return w4?this.getMessageScrollController(w4):null})();if(x6)x6.animateTo(0,100);return"handled"}),A6=new b8(()=>{let x6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:F9}=this.widget.dependencies,w4=F9.mainThread?.id;return w4?this.getMessageScrollController(w4):null})();if(x6)x6.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),C4=new b8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:n6}=this.widget.dependencies;if(!n6.mainThread?.messages.some((F9)=>F9.role==="user"||DI(F9)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),o4=new b8((n6)=>{if(n6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),_9=new b8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return a81().then(async(n6)=>{if(n6)try{this.handleInsertImage(n6)}finally{try{let{unlink:x6}=await import("node:fs/promises");await x6(n6)}catch{}}}),"handled"}),I0=new Map([[U4.ctrl("c"),new pm],[U4.ctrl("l"),new am],[U4.ctrl("o"),new c81],[U4.ctrl("v"),new mm],[U4.alt("s"),new lC],[U4.ctrl("s"),new lC],[U4.alt("p"),new im],[U4.ctrl("r"),new cm],[U4.alt("d"),new lm],[U4.ctrl("t"),new om],[U4.key("PageUp"),new m81],[U4.key("PageDown"),new u81],[U4.key("Home"),new p81],[U4.key("End"),new d81],[U4.key("Escape"),new um],[U4.ctrl("p"),new iC("previous")],[U4.ctrl("n"),new iC("next")],[U4.key("Tab"),new sm]]);if(!Y3())I0.set(U4.key("ArrowUp"),new sm);if(!1)I0.set(U4.alt("c"),new dm);I0.set(U4.ctrl("m"),new nm);let e6=new b8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),Z8=new b8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),y8=new b8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),z5=new Map([[um,Y1],[am,r1],[lC,q0],[c81,e6],[mm,_9],[dm,w1],[nm,P1],[cm,E1],[lm,d1],[im,b1],[om,Z8],[pm,O1],[m81,G0],[u81,C0],[p81,B6],[d81,A6],[sm,C4],[iC,o4],[rm,y8]]),x8=[U1];if(this.isShowingConsoleOverlay)x8.push(new qy1);if(this.isShowingHelp&&this.paletteConfig)x8.push(new Hy1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)x8.push(new Vk1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)x8.push(new Sy1({message:this.mysteriousMessage,onClose:this.handleCloseMysteryModal,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)x8.push(new ck1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(n6)=>{let x6=this.adActionModal.url;if(n6==="copy")try{await H9.instance.tuiInstance.clipboard.writeText(x6),this.setState(()=>{this.displayMessage=new NG("Link copied to clipboard")})}catch(F9){v.error("Failed to copy to clipboard",{error:F9}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:n6}=this.widget.dependencies;x8.push(new Cy1({servers:this.pendingMCPServers,onAlwaysTrust:n6.trustAlways.bind(n6),onTrustOnce:n6.trustOnce.bind(n6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:n6.deny.bind(n6)}))}if(this.isShowingFileChangesOverlay)x8.push(new gS1({threadData:z}));if(this.isShowingCostBreakdownOverlay&&z.mainThread)x8.push(new Ky1({thread:z.mainThread}));if(this.isShowingContextDetailOverlay)x8.push(new Vy1({thread:z.mainThread??void 0,tokenUsage:Q1??void 0,cacheTimerState:this.cacheTimerState??void 0,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})}}));if(this.isShowingConfirmationOverlay)x8.push(new Zy1({details:this.confirmationOverlayContent}));let s5=this.getCommandPaletteContext(J);if(s5&&this.isShowingPalette&&this.paletteConfig)x8.push(new f4({child:new t0({constraints:P6.loose(80,20),child:new Xy1({commandContext:s5,mainThread:z.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})})}));if(this.isShowingIdePicker)x8.push(new Fy1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let C5=new t9({children:x8});if(this.isShowingJetBrainsInstaller)return new OO({child:new KY({actions:z5,child:new mq({shortcuts:I0,debugLabel:"jetbrains-installer-shortcuts",child:new Ry1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Sz({controller:this.toastController,child:new OO({child:new jS1({controller:this.toastController,child:new KY({actions:z5,child:new mq({shortcuts:I0,debugLabel:"main-app-shortcuts",child:C5})})})})})}buildScrollableTodoList(J,Q,Y){return new EZ6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,X,G,Z,q,V,K,W,H,z,U){if(J)return new Wy1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new $y1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new jy1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let N=t81(X),M=this.agentModeController?.isInRestrictedFreeMode()??!1,L=new vO({key:this.textFieldKey,controller:this.textController,triggers:K?[]:[new IN],completionBuilder:K?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:K?void 0:this.onTextSubmitted,theme:Y,placeholder:K?"Press Ctrl+C to exit":M?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!M&&!this.isShowingStandalonePalette(),shellPromptRules:N,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:H9.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,previousThreadId:this.previousThreadIdForHint&&(G.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let n=this.previousThreadIdForHint;if(n)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${n} `},onDoubleAtTrigger:K?void 0:()=>{let n=this.textController.text,t=this.textController.cursorPosition,K1=n.slice(0,t).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(K1!==-1){let k1=this.textController.text,J1=k1.slice(0,K1)+k1.slice(K1+2);this.textController.text=J1,this.textController.cursorPosition=K1}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),A=G.mainThread?.queuedMessages??[],E=Array.isArray(Z)&&Z.length>0,P=Array.isArray(A)&&A.length>0,I=G.mainThread?.agentMode==="plan"&&zO(G.mainThread),T,S;if(I){if(T=new bm(new p91({thread:G.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:t}=await this.widget.dependencies.planFileManager.ensureSync(G.mainThread.id);H9.instance.tuiInstance.suspend();let{execSync:l}=await import("child_process");l(`${n} "${t}"`,{stdio:"inherit"}),H9.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:X}),{clipBehavior:"antiAlias"}),P)S=new N51({queuedMessages:A});else if(E)S=this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!M,X)}else T=P?new N51({queuedMessages:A}):void 0,S=E?this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!M,X):void 0;let k=[],x=this.currentShellModeStatus;if(x)k.push({child:new x1({text:new s(x==="hidden"?"shell mode (incognito)":"shell mode",new X1({color:x==="hidden"?X.app.shellModeHidden:X.app.shellMode}))}),position:"top-left"});let p=this.connectedClientsStatus&&this.connectedClientsStatus.enabled?this.connectedClientsStatusExpanded?(this.connectedClientsStatus?.clientID?.length??7)+3:3:0,g=this.agentModeController?.getVisibleModes()??[];if(!x&&g.length>1){let n=this.previewThread,t=n?n.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),l=my1(t),K1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,k1=FJ(K1.thread)>0,J1=this.agentModeSlideProgress!==null,f1,I1;if(J1){f1="top-left";let T1=z.size.width-t.length-4-p;I1=Math.floor(this.agentModeSlideProgress*T1)}else if(k1)f1="top-right",I1=p;else f1="top-left",I1=void 0;if(n)k.push({child:new x1({text:new s(t,new X1({color:l}))}),position:f1,offsetX:I1});else{let E0=!k1&&!J1,T1=new x1({text:new s(t,new X1({color:l}))});k.push({child:E0?new U8({child:T1,onClick:this.toggleAgentMode,cursor:"pointer"}):T1,position:f1,offsetX:I1})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let n=this.connectedClientsStatus,t=n.mode||"disconnected",l=!!n.errorMessage,K1=n.clientID||"unknown",k1,J1;if(l)k1="●",J1=M1.red;else if(t==="presence")k1="○",J1=M1.yellow;else if(t==="connected"&&n.connected)k1="●",J1=M1.green;else k1="○",J1=M1.yellow;let f1=this.connectedClientsStatusExpanded?`${K1} ${k1}`:k1;k.push({child:new U8({child:new x1({text:new s(f1,new X1({color:J1}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let i=K?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:G.mainThread?.env?.initial.trees?.[0]?.uri,Q1;if(i)Q1=u0.parse(i).fsPath;else Q1=process.cwd();let o=this.toHomeRelative(Q1),u=this.shorten(o),e=!K&&this.currentGitBranch?`${u} (${this.currentGitBranch})`:u;k.push({child:new x1({text:new s(e,new X1({color:Y.foreground,dim:!0}))}),position:"bottom-right"});let H1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(FJ(H1.thread)>0&&!x){let n=[],t=new X1({color:Y.foreground,dim:!0}),l=new s(" · ",t);if(U&&G.mainThread){let K1=pt(G.mainThread);if(K1>0)n.push(new s(gq(K1),t))}if(W){if(n.length>0)n.push(l);let K1=W.totalInputTokens/W.maxInputTokens,k1=Math.round(K1*100),J1=Math.max(0,Math.min(k1,100)),f1=Q91(K1,W.maxInputTokens),I1=t;if(f1==="danger")I1=new X1({color:Y.destructive});else if(f1==="warning")I1=new X1({color:Y.warning});else if(f1==="recommendation")I1=new X1({color:X.app.recommendation});n.push(new s(`${J1}%`,I1))}if(U&&H){let K1=G.viewState.state==="active"&&G.viewState.inferenceState==="idle",k1=tX6(H,{isNarrow:!0,isIdle:K1});if(k1){if(n.length>0)n.push(l);let J1=t;if(k1.urgency==="warning")J1=new X1({color:Y.warning});n.push(new s(k1.text,J1))}}if(n.length>0){let K1=new x1({text:new s("",void 0,n)});k.push({child:U?new U8({child:K1,onClick:this.showContextDetailOverlay,cursor:"pointer"}):K1,position:"top-left"})}}return new xS1({leftChild:new G4({child:L}),rightChild1:T,rightChild2:S,maxHeight:q,overlayTexts:k,borderColor:M||!this.isTextfieldAndAutocompleteFocused?M1.index(8):void 0,hasBanner:V,userHeight:this.bottomGridUserHeight,onInitializeHeight:(n)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(n,q)})},onDrag:(n)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(n.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let t=Math.floor(n.localPosition.y)-this.bottomGridDragStartY,l=Math.max(4,this.bottomGridDragStartHeight-t),K1=Math.min(l,q),k1=Math.floor(K1);if(this.bottomGridUserHeight!==k1)this.setState(()=>{this.bottomGridUserHeight=k1})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!V})}}async function py1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)H9.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let X=()=>null,Z=!1,q=new Iz(Z,1000,J.inspectorPort),V=J.features?.find((A)=>A.name==="amp-connect")?.enabled??!1,K=new uk1({threadService:J.threadService,worker:J.worker,builder:(A,E,P,I,T,S)=>{if(X=T,J.threadDependencies&&V)aj1(J.threadDependencies,J.configService,T,I,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((b)=>{v.error("Failed to start automatic presence:",b)});let k=T(),x={...J,worker:k,threadID:k.thread.id};return new wZ6({...x,threadState:E,workerController:P,switchWorker:I,getCurrentWorker:T,recentThreadIDs:S})}}),W=new vS1({configService:J.configService,child:K}),H=new Wk1({configService:J.configService,child:W}),z=new OS1(H),U=new W6({data:nC.fromBaseTheme(nZ.default()),child:z});try{await Nj1(U,{onRootElementMounted:(A)=>{if(v.info("TUI input ready for user interaction"),Z)q.start(A)}})}finally{if(Z)q.stop();if(J.threadDependencies&&V){let{stopGlobalSession:A}=await Promise.resolve().then(() => (oj1(),t36));A()}}let M=X()?.thread.id||J.threadID,L=await J.threadService.get(M);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${M}`;LJ6(L,A,J.stdout)}}function my1(J){let Y=uV(J)?.uiHints?.secondaryColor;if(Y)return M1.rgb(Y.r,Y.g,Y.b);return Sw8(J)}class EZ6 extends o0{props;constructor(J){super();this.props=J}createState(){return new IZ6}}class IZ6 extends a0{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Y,appTheme:X}=this.widget.props;return new h6({crossAxisAlignment:"stretch",children:[new G4({child:new o5({controller:Y,autofocus:!1,child:new pk1({todos:Q})})}),new SJ({controller:Y,thumbColor:X.app.scrollbarThumb,trackColor:X.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:G,offset:Z}=Y,q=this.viewportHeight,V=G+q;return{totalContentHeight:Math.max(V,0),viewportHeight:Math.max(q,1),scrollOffset:Math.max(Z,0)}}})]})}updateViewportHeight(){let J=this.getViewportHeight();if(J!==this.viewportHeight)this.viewportHeight=J}getViewportHeight(){let J=this.context.findRenderObject();if(!J)return this.viewportHeight;let Q=(X,G=0)=>{if(X&&"size"in X&&"children"in X){let Z=X.children||[];for(let q of Z){if(q&&"size"in q){let K=q.size;if(typeof K?.height==="number"&&K.height>0)return K.height}let V=Q(q,G+1);if(V>0)return V}}return 0},Y=Q(J);if(Y>0)return Y;if("size"in J){let X=J.size;if(typeof X?.height==="number"&&X.height>0)return X.height}return this.viewportHeight}}class PZ6 extends j6{props;constructor(J){super();this.props=J}build(J){return new U8({child:new $0({height:1}),cursor:i9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let X=J.findRenderObject()?.size.height??0;if(X>0){this.props.onInitializeHeight(X);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function Sw8(J){let Q=0;for(let G=0;G<J.length;G++){let Z=J.charCodeAt(G);Q=(Q<<5)-Q+Z,Q=Q&Q}let Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Y.length;return M1.index(Y[X])}Bj1();try{if(process.platform==="win32")await Promise.resolve().then(() => M6(Rj(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){$$.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
4761
|
-
`)}var Dv1=Nv1.join(nF0||Nv1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function sR8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function G$(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")b$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")b$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")b$("model.sonnet",Q.useSonnet)}async function Lv1(J){try{await aR8(Nv1.dirname(Dv1),{recursive:!0}),await oR8(Dv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function tR8(){try{return(await tV6(Dv1,"utf-8")).trim()}catch(J){return null}}var oV6=[{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??uZ,description:`Custom settings file path (overrides the default location ${uZ})`},{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 ${AC1})`},{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:Y3(),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:HI.SMART.key,description:`Set the agent mode (${eG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:eG().map((J)=>J.mode)}],rV6=(J)=>("deprecated"in J)&&J.deprecated===!0,eR8=(J)=>("hidden"in J)&&J.hidden===!0,JT8=(J)=>("default"in J),QT8=(J)=>("default"in J)?J.default:void 0;function YT8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new S8(mZ.unknownCommand(Y),1,q)}}var eV6=null;function VI5(){return eV6}function bu(J){return{...J,getThreadEnvironment:Z41,vfs:AP0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Yv(J.fileSystem),generateThreadTitle:Mi0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Av1=u0.file(rR8.homedir()),JK6=process.env.XDG_CONFIG_HOME?u0.file(process.env.XDG_CONFIG_HOME):s0.joinPath(Av1,".config");async function Z$(J,Q){SN0("0.0.
|
|
4761
|
+
`)}var Dv1=Nv1.join(nF0||Nv1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function sR8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function G$(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")b$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")b$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")b$("model.sonnet",Q.useSonnet)}async function Lv1(J){try{await aR8(Nv1.dirname(Dv1),{recursive:!0}),await oR8(Dv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function tR8(){try{return(await tV6(Dv1,"utf-8")).trim()}catch(J){return null}}var oV6=[{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??uZ,description:`Custom settings file path (overrides the default location ${uZ})`},{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 ${AC1})`},{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:Y3(),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:HI.SMART.key,description:`Set the agent mode (${eG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:eG().map((J)=>J.mode)}],rV6=(J)=>("deprecated"in J)&&J.deprecated===!0,eR8=(J)=>("hidden"in J)&&J.hidden===!0,JT8=(J)=>("default"in J),QT8=(J)=>("default"in J)?J.default:void 0;function YT8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new S8(mZ.unknownCommand(Y),1,q)}}var eV6=null;function VI5(){return eV6}function bu(J){return{...J,getThreadEnvironment:Z41,vfs:AP0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Yv(J.fileSystem),generateThreadTitle:Mi0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Av1=u0.file(rR8.homedir()),JK6=process.env.XDG_CONFIG_HOME?u0.file(process.env.XDG_CONFIG_HOME):s0.joinPath(Av1,".config");async function Z$(J,Q){SN0("0.0.1764763292-ge365ee");let Y=Eq1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:X0.of([u0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Av1,userConfigDir:JK6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (M51(),D51));X(Y);let G=await Y.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let{toolService:Z,dispose:q}=x16({configService:Y}),V=new Map,K=()=>V.clear(),W=new IU1(Y,J.settings.getWorkspaceRootPath()),H=TI0({configService:Y,trustStore:W,createOAuthProvider:async(o,u)=>{let e=V.get(o);if(e)return v.debug("Reusing existing OAuth provider for server",{serverName:o}),e;v.debug("Creating OAuth provider for server",{serverName:o});let H1=(async()=>{let V1=new aM(J.secrets),n=await V1.getClientInfo(o),t=u?.scopes??n?.scopes,l=new iF1({storage:V1,serverName:o,clientId:u?.clientId??n?.clientId,clientSecret:u?.clientSecret??n?.clientSecret,scopes:t});return v.debug("OAuth provider created",{serverName:o,hasManualClientId:!!(u?.clientId??n?.clientId),willUseDCR:!(u?.clientId??n?.clientId),scopes:t}),l})();return V.set(o,H1),H1}}),z=X61({configService:Y,filesystem:K9,spawn:gA}),{initializeToolProviders:U,startToolProviders:N}=await Promise.resolve().then(() => (aV6(),nV6)),M;if(J.executeMode){let o=await U({toolService:Z,providers:[H,z],initialTimeout:15000});M=o.registrations;for(let[u,e]of o.initErrors)v.warn(`${u} provider initialization slow or failed:`,e)}else M=N({toolService:Z,providers:[H,z]});if(Q.jetbrains)AI("JetBrains");else if(Q.ide&&b56())AI("VS Code");else if(Q.ide&&g56())AI("Neovim");if(J.executeMode)_N0(!0);let L,A=I2.status.pipe($6((o)=>Boolean(o.connected&&o.authenticated)),P4()).subscribe((o)=>{if(o){if(!L)L=Z.registerTool(wt0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode)E=new N41(process.cwd(),{},!0);else E=new class extends N41{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(b5.write(`No API key found. Starting login flow...
|
|
4762
4762
|
`),!await XT8(J))await qO(),process.exit(1)}let P=await sR0({isDevelopment:!1}),I=new EI1(P,Y),T=new LI1(P,{lazy:!0}),S=new xU1(I,(o,u)=>{let e=R3.get(o);if(e)e.handle(u).catch((H1)=>{v.error("Failed to apply artifact delta",H1)})}),k=Q.notifications!==void 0?Q.notifications:!J.executeMode,x=f16({playNotificationSound:async(o)=>{if(k){v16(o);let u=Fj1(),e=Uj1();if((!u||e)&&G.settings["notifications.system.enabled"]!==!1){if(o==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(o==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:I,configService:Y});v.info("Starting Amp background services");let b=Ai0({threadService:I,threadHistoryService:T,configService:Y,isExtensionDevelopment:!1}),p;I2.status.subscribe((o)=>{p=o});let g=new $$1({workspaceRoots:[u0.file(process.cwd())],getCurrentFile:()=>{if(!p?.openFile)return;try{return u0.parse(p.openFile)}catch(o){v.warn("Failed to parse current file URI",{uri:p.openFile,error:o});return}},getOpenFiles:()=>{if(!p?.visibleFiles?.length)return[];let o=p.openFile;return p.visibleFiles.filter((u)=>u!==o).map((u)=>{try{return u0.parse(u)}catch(e){return v.warn("Failed to parse visible file URI",{uri:u,error:e}),null}}).filter((u)=>u!==null)}}),i=new Dj1,Q1={codebaseContextService:g,configService:Y,toolService:Z,mcpService:H,trustStore:W,threadService:I,threadHistoryService:T,threadSyncService:b,planFileManager:S,threadStorage:P,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:x,fileSystem:Q.jetbrains||Q.ide?DP0:K9,terminal:i};return{...Q1,async asyncDispose(){if(Q1.mcpService.hasAuthenticatingClients())v.info("Waiting for OAuth authentication to complete before exit..."),await Q1.mcpService.waitForAuthentication();for(let o of M.values())o.dispose();await Q1.mcpService.dispose(),K(),await Q1.threadService.asyncDispose(),Q1.configService.unsubscribe(),q(),Q1.fuzzyServer.dispose(),Q1.threadSyncService.dispose(),Q1.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function XT8(J){if(!J.executeMode){if(!await lC1("Would you like to log in to Amp? [(y)es, (n)o]: "))return b5.write(`Login cancelled. Run the command again to retry.
|
|
4763
4763
|
`),!1}return await QK6(J)}async function QK6(J){let Q=nR8(32).toString("hex"),Y=await cC1(J.ampURL,Q),X=new AbortController;try{await QH(Y,X.signal)}catch(Z){v.error("Error opening browser",{error:Z})}let G=await cC1(J.ampURL,Q,!1);b5.write(`If your browser does not open automatically, visit:
|
|
4764
4764
|
|
|
@@ -4768,7 +4768,7 @@ ${g4.blue.bold(G)}
|
|
|
4768
4768
|
Login successful! You can now use the Amp CLI.
|
|
4769
4769
|
`),!0}catch(Z){return v.error("Login failed",{error:Z}),$$.write(`
|
|
4770
4770
|
Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
4771
|
-
`),!1}}function GT8(){let J=new oA().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)HC(),process.exit(0);let z=H.originalError??H;k96(z)}),J.option("-V, --version","Print the version number and exit",()=>{b5.write(`0.0.
|
|
4771
|
+
`),!1}}function GT8(){let J=new oA().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)HC(),process.exit(0);let z=H.originalError??H;k96(z)}),J.option("-V, --version","Print the version number and exit",()=>{b5.write(`0.0.1764763292-ge365ee (released 2025-12-03T12:07:04.808Z)
|
|
4772
4772
|
`),process.exit(0)}),J.addHelpText("after",v56()),J.configureHelp({formatHelp:f56}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await NY(U);await VT8(N)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await NY(U);await qT8(N,await yC1(U,N.settings))});let Q=async(H,z,U)=>{Eq1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:X0.of([u0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:Av1,userConfigDir:JK6});let N={...z,executeMode:!1};await Mv1(N,{...H,openThreadSwitcher:!0},U)},Y=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await NY(U);await sV6(U,N,z)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await NY(U);await BT8(U,N,z)}),Y.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await NY(N);if(z.pick)$$.write(`${g4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
4773
4773
|
`);if(z.last||H||M.executeMode)await UT8(N,M,H,U);else await Q(N,M,U)}),Y.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await NY(N);await FT8(N,M,H,U)}),Y.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await NY(U);await sV6(U,N,z)}),Y.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, unlisted, workspace, group)").option("--support [message]","Share thread with Amp support for debugging").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await NY(N);await zT8(N,M,H,U,z.support)}),Y.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(H,z,U,N)=>{let M=N.optsWithGlobals(),L=await NY(M);await KT8(M,L,H,z,N)}),Y.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await NY(N);await WT8(N,M,H,U)}),Y.command("replay <threadId>").alias("p").summary("Replay a thread").description("Replay a thread by downloading it and playing through all interactions. User messages are simulated with variable typing speed.").option("--wpm <wpm>","Typing speed in words per minute (default: 120)","120").option("--no-typing","Disable typing simulation and display messages instantly").option("--message-delay <ms>","Delay between messages in milliseconds (default: 1000)","1000").option("--tool-progress-delay <ms>","Delay to show tool in-progress state in milliseconds (default: 800)","800").option("--exit-delay <seconds>","Delay in seconds before exiting after replay completes (default: 3)","3").option("--no-indicator","Hide the replay progress indicator").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await NY(N);await HT8(N,M,H,z,U)}),_26(J,async(H,z)=>{let U=await NY(z);G$(H,z);let N=await Z$(U,z);return{context:U,mcpService:N.mcpService,toolService:N.toolService,toolServices:N.toolService,configService:N.configService,cleanupTerminal:HC,asyncDispose:N.asyncDispose.bind(N)}}),L76(J,async(H)=>{let z=H.optsWithGlobals();return await NY(z)}),K76(J,async(H)=>{let z=await NY(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{G$(U,H);let N=await Z$(z,H);return{mcpService:N.mcpService,settings:z.settings,asyncDispose:N.asyncDispose.bind(N)}}}});function G(H,z,U){let M=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),L=new uK(z,M),A=QT8(H);if(A)L.default(A);if(L.hidden=eR8(H)||rV6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of oV6)switch(H.type){case"flag":{J.addOption(G(H,`--${H.long}`)),J.addOption(G(H,`--no-${H.long}`,!1));break}case"switch":{J.addOption(G(H,`--${H.long}`,!0));break}default:{J.addOption(G(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}let Z=new uK("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(Z);let q=new uK("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(q);let V=new uK("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);J.addOption(V);let K=new uK("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(K);let W=new uK("--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 uK("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return b26(J),J.action(async(H,z)=>{let U=H,N=await NY(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")b5.write(g4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
|
|
4774
4774
|
`)),process.exit(0);if(Object.keys(U).forEach((L)=>{let A=oV6.find((E)=>E.name===L);if(A&&rV6(A)&&!JT8(A))$$.write(g4.yellow(`Warning: '--${L}' flag is deprecated
|
|
@@ -4776,8 +4776,8 @@ Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
|
4776
4776
|
Or pipe via stdin: echo "your message" | amp --execute`);G$(Y,Q);let q=await Z$(J,Q);eV6=q;let V=bu(q),K=async(i)=>{let Q1=await tV6(i,"utf-8"),o=JSON.parse(Q1);if(!n$(o.id))throw new S8(mZ.invalidThreadId);return $71(q,{visibility:X,agentMode:Q.mode,thread:o})},W=async(i)=>{if(!n$(i))throw new S8(mZ.invalidThreadId);try{let[o,u]=await Promise.all([R5.getThreadLinkInfo({thread:i},{config:q.configService}),R5.getUserInfo({},{config:q.configService})]);if(o.ok&&u.ok){let e=o.result.creatorUserID,H1=u.result.id;if(e&&e!==H1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new S8(`Cannot resume thread created by another user.
|
|
4777
4777
|
|
|
4778
4778
|
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(o){if(o instanceof S8)throw o;v.warn("Failed to validate thread ownership in CLI, allowing to open",{error:o})}let Q1=await q.threadService.get(i)??void 0;return v.info(`[fetchAndStartThread] Loaded thread ${i}, agentMode: ${Q1?.agentMode??"undefined"}`),$71(q,{visibility:X,agentMode:Q1?void 0:Q.mode,thread:Q1})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return $71(q,{visibility:X,agentMode:Q.mode})}catch(i){if(i instanceof S8)throw i;throw await Ym(i,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return $71(q,{visibility:X,agentMode:Q.mode})};if(Q.format==="jsonl")$$.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
4779
|
-
`),await qO(),process.exit(1);if(J.executeMode&&Q.remote)await A76(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)z76(q.mcpService,J.settings),await n96(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,M=!1;if(Q.jetbrains||Q.ide){await aM0();let i=vI({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let Q1=i[0];if(Q1)I2.selectConfig(Q1)}else N=!0}let L=P41("0.0.
|
|
4780
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await L56({...J,workspaceTrust:{current:!0,changes:Rk},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await W76(J.mcpConfig);X=H76(X,Z)}let G=await X.get("url","global");if(!G)G=jY;if(!iF(G))v.info("Targeting custom Amp server",{ampURL:G});return X=iU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:O76(await yC1(J,X))}}function ZT8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function $T8(){let J=ZT8(process.argv);if(E96({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),sR8(v),v.info("Starting Amp CLI.",{version:"0.0.
|
|
4779
|
+
`),await qO(),process.exit(1);if(J.executeMode&&Q.remote)await A76(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)z76(q.mcpService,J.settings),await n96(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,M=!1;if(Q.jetbrains||Q.ide){await aM0();let i=vI({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let Q1=i[0];if(Q1)I2.selectConfig(Q1)}else N=!0}let L=P41("0.0.1764763292-ge365ee",q.settingsStorage),A=new r11(q.threadStorage),E=X0.of([u0.file(process.cwd())]),P=D$1(void 0,E),I=new R41(q.mcpService,J.settings.getWorkspaceRootPath());if(G)U.handle({type:"user:message",message:{content:[{type:"text",text:G}]}});let T=(async()=>{try{let i=await R5.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)});if(i.ok)return v.info("User free tier status:",i),i.result}catch(i){v.error("Failed to fetch free tier status:",i)}})(),S=(async()=>{try{let i=await R5.getUserInfo({},{config:q.configService});if(i.ok)return i.result}catch(i){v.debug("Failed to fetch user workspace info:",i)}})(),[k,x]=await Promise.all([T,S]),b=x?.email,p=b&&(b.endsWith("@sourcegraph.com")||b.endsWith("@ampcode.com")||b==="auth-bypass-user@example.com"),g=await I76();v.info("Loaded session state:",g),await py1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new K41,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadHistoryService:q.threadHistoryService,threadSyncService:q.threadSyncService,planFileManager:q.planFileManager,threadID:U.threadID,threadFuzzyIndexer:A,worker:U,workerDeps:V,configService:q.configService,internalAPIClient:R5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:I2,connectedClientsService:new ai,commandRegistry:P,mcpService:q.mcpService,mcpTrustHandler:I,showJetBrainsInstaller:M,showIdePicker:N,openThreadSwitcher:Q.openThreadSwitcher,updateService:L,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:g,freeTierStatus:k,workspace:x?.team??null,features:x?.features??[],isDogfooding:p||!1,threadDependencies:q,initialAgentMode:Y.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await q.asyncDispose(),process.exit(0)}async function NY(J){if(J.interactive)$$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
4780
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await L56({...J,workspaceTrust:{current:!0,changes:Rk},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await W76(J.mcpConfig);X=H76(X,Z)}let G=await X.get("url","global");if(!G)G=jY;if(!iF(G))v.info("Targeting custom Amp server",{ampURL:G});return X=iU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:O76(await yC1(J,X))}}function ZT8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function $T8(){let J=ZT8(process.argv);if(E96({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),sR8(v),v.info("Starting Amp CLI.",{version:"0.0.1764763292-ge365ee",buildTimestamp:"2025-12-03T12:07:04.808Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new S8(mZ.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await GT8().parseAsync(process.argv)}zI1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await $T8().catch(Ym)});async function qT8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),b5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
4781
4781
|
`);else if(!iF(J.ampURL))b5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
4782
4782
|
`);let Y=process.env.AMP_API_KEY;if(Y)b5.write(`API key found in environment variable, storing...
|
|
4783
4783
|
`),await Q.set("apiKey",Y,J.ampURL),b5.write(`API key successfully stored.
|
|
@@ -4790,7 +4790,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
4790
4790
|
`);else b5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
4791
4791
|
`);process.exit(0)}async function KT8(J,Q,Y,X,G){G$(G,J);let Z=await Z$(Q,J);try{let q=q71(Y);if(!q)V71(Y);let V=q,K=X.trim();if(K.length===0)X$("Thread name cannot be empty");if(K.length>256)X$("Thread name cannot exceed 256 characters");if(!(await Tj(V,Z)).messages.length)X$("Cannot rename an empty thread.");let H=bu(Z);await(await R3.getOrCreateForThread(H,V)).handle({type:"title",value:K}),v.info("GOT HERE"),await Z.threadSyncService.sync(),v.info("GOT THERE"),b5.write(g4.green(`✓ Thread ${V} renamed to "${K}"
|
|
4792
4792
|
`)),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose();let V=`Failed to rename thread: ${q instanceof Error?q.message:String(q)}`;X$(V)}}async function WT8(J,Q,Y,X){G$(X,J);let G=await Z$(Q,J);try{let Z=q71(Y);if(!Z)V71(Y);let V=await Tj(Z,G),K=ST(V);b5.write(K+`
|
|
4793
|
-
`),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;X$(q)}}async function HT8(J,Q,Y,X,G){G$(G,J);let Z=await Z$(Q,J);try{let q=await Ov1(Y),V=await Tj(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,M=bu(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await R3.getOrCreateForThread(M,L);await A.resume();let E=o11.fromWorker(A),P=new r11(Z.threadStorage),I=X0.of([u0.file(process.cwd())]),T=D$1(void 0,I),S=new R41(Z.mcpService,Q.settings.getWorkspaceRootPath()),k=P41("0.0.
|
|
4793
|
+
`),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;X$(q)}}async function HT8(J,Q,Y,X,G){G$(G,J);let Z=await Z$(Q,J);try{let q=await Ov1(Y),V=await Tj(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,M=bu(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await R3.getOrCreateForThread(M,L);await A.resume();let E=o11.fromWorker(A),P=new r11(Z.threadStorage),I=X0.of([u0.file(process.cwd())]),T=D$1(void 0,I),S=new R41(Z.mcpService,Q.settings.getWorkspaceRootPath()),k=P41("0.0.1764763292-ge365ee",Z.settingsStorage);await py1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new K41,fuzzyServer:Z.fuzzyServer,settingsStorage:Z.settingsStorage,threadService:Z.threadService,threadHistoryService:Z.threadHistoryService,threadSyncService:Z.threadSyncService,planFileManager:Z.planFileManager,threadID:L,threadFuzzyIndexer:P,worker:E,workerDeps:M,configService:Z.configService,internalAPIClient:R5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:I2,connectedClientsService:new ai,commandRegistry:T,mcpService:Z.mcpService,mcpTrustHandler:S,showJetBrainsInstaller:!1,updateService:k,isDogfooding:!1,replayMode:{thread:V,typingEnabled:K,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:N}}),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),await Ym(q,Y)}}async function zT8(J,Q,Y,X,G){G$(X,J);let Z=await Z$(Q,J);try{let q=q71(Y);if(!q)V71(Y);let V=q,K=await R5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=T41(J,W);if(!H&&!G)X$("Must specify either --visibility or --support");if(H&&G)X$("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)X$(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,C41(H)),b5.write(g4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
|
|
4794
4794
|
`);if(G){await Tj(V,Z);let z=typeof G==="string"?G:void 0;await lR0(Z.threadService,V,Z.configService,z),b5.write(g4.green("✓ ")+`Thread ${V} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
4795
4795
|
`)}await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),X$(`Failed to update thread: ${q instanceof Error?q.message:String(q)}`)}}async function FT8(J,Q,Y,X){G$(X,J);let G=await Z$(Q,J),Z=bu(G);try{let q=await Ov1(Y),K=(await Tj(q,G)).messages.length-1,W=await R3.getOrCreateForThread(Z,q),H=await kT(W,G.threadSyncService,K);await Promise.all([G.threadSyncService.uploadThread(q),G.threadSyncService.uploadThread(H)]),await Lv1(H),b5.write(`${H}
|
|
4796
4796
|
`),await G.asyncDispose(),process.exit(0)}catch(q){$$.write(`Error forking thread: ${q instanceof Error?q.message:String(q)}
|