@sourcegraph/amp 0.0.1764336008-gc6abaf → 0.0.1764336207-gc6abaf
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
|
@@ -4118,15 +4118,15 @@ Actual: ${G}`)}async function OZ8(J,Q,Y){let{execSync:X}=await import("node:ch
|
|
|
4118
4118
|
${D}`;if(G==="pnpm"&&D.includes("Unable to find the global bin directory"))M+=`
|
|
4119
4119
|
|
|
4120
4120
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4121
|
-
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()}})})}L0();L0();async function T61(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=TZ8(J,K),H=W<0,z,U;if(V.time){let D=V.time[J],M=V.time[K],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return h.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 h.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function TZ8(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}r0();function R61(J,Q){let Y=new d4,X=Y.pipe(a8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new wV().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 fU(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=uA(),W=await T61(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,D=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 P61();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 wg(W.latestVersion,z);let U=await lB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",D),Y.next("updated");else G.warn("success with warning",D),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await fU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as kK}from"node:process";function j86(J){let Q=new RA().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 AR1(X.force||!1,X.verbose||!1,"0.0.
|
|
4121
|
+
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()}})})}L0();L0();async function T61(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=TZ8(J,K),H=W<0,z,U;if(V.time){let D=V.time[J],M=V.time[K],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return h.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 h.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function TZ8(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}r0();function R61(J,Q){let Y=new d4,X=Y.pipe(a8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new wV().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 fU(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=uA(),W=await T61(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,D=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 P61();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 wg(W.latestVersion,z);let U=await lB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",D),Y.next("updated");else G.warn("success with warning",D),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await fU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as kK}from"node:process";function j86(J){let Q=new RA().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 AR1(X.force||!1,X.verbose||!1,"0.0.1764336207-gc6abaf"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new RA("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 RZ8(X.targetVersion)});J.addCommand(Y)}async function RZ8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")kK.write(f4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4122
4122
|
|
|
4123
4123
|
`));try{if(!J){kK.write(f4.blue(`Checking for updates...
|
|
4124
|
-
`));let X=uA(),{hasUpdate:G,latestVersion:Z}=await T61("0.0.
|
|
4125
|
-
`));let V=await lB("0.0.
|
|
4124
|
+
`));let X=uA(),{hasUpdate:G,latestVersion:Z}=await T61("0.0.1764336207-gc6abaf",X);if(!G){kK.write(f4.green(`✓ Amp CLI is already up to date: ${"0.0.1764336207-gc6abaf"} (${"released"} ${"2025-11-28T13:28:43.087Z"})
|
|
4125
|
+
`));let V=await lB("0.0.1764336207-gc6abaf");if(V.warning)kK.write(`
|
|
4126
4126
|
`+f4.yellow(V.warning)+`
|
|
4127
4127
|
`);process.exit(0)}if(!Z)kK.write(f4.yellow("[WARN] could not find latest version")),process.exit(0);J=Z}kK.write(f4.blue(`Updating to version ${J}...
|
|
4128
4128
|
`)),await wg(J,void 0,(X)=>{kK.write(f4.dim(`Running: ${X}
|
|
4129
|
-
`))});let Q="released";kK.write(f4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-11-28T13:
|
|
4129
|
+
`))});let Q="released";kK.write(f4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-11-28T13:28:43.087Z"})
|
|
4130
4130
|
`));let Y=await lB(J);if(Y.warning)kK.write(`
|
|
4131
4131
|
`+f4.yellow(Y.warning)+`
|
|
4132
4132
|
`);process.exit(0)}catch(Q){let Y=Q instanceof Error?Q.message:String(Q);kK.write(f4.red.bold("Error: ")+Y+`
|
|
@@ -4740,7 +4740,7 @@ exit code: ${Z}`,new K1({color:X.foreground,dim:!0,italic:!0})));if(q)V.push(new
|
|
|
4740
4740
|
`,D),...M])})];if(W.url){let R=W.url.replace(/^https?:\/\//,"");P.push(new H7({uri:W.url,text:R,style:new K1({color:Y.secondary,underline:!0})}))}let I=new F0({width:40,child:new a0({crossAxisAlignment:"start",mainAxisSize:"min",children:P})});return H8.child(new Q4({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new gC1({width:KQ6,height:WQ6,agentMode:this.widget.agentMode,glow:this._glow,t:L,fps:0,...q==="disabled"&&{seed:42}}),new F0({width:2}),I]}))}}L0();D9();M4();m7();D9();r0();function oB8(J,Q){return`${J}:${Q}`}class D_1{threadService;workers=new Map;threadsMap=new Map;subthreadsMap=new Map;mainThreadSubs=new Map;subthreadsSubs=new Map;workerStatusSubs=new Map;subthreadPatchSubs=new Map;mainThreadObservable;subthreadObservable;workerStatusObservable;emitMainThread=null;emitSubthread=null;emitWorkerStatus=null;constructor(J){this.threadService=J;this.mainThreadObservable=new 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(UM()).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=oB8(Q,q.toolUse.id);if(this.subthreadPatchSubs.has(V))continue;let K=this.threadService.observePatches(q.threadID).pipe(UM()).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]=VA(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 rB8(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=oJ(J.mainThread);G.isCompleted=zQ6(W,X.toolUse.id)}}let Z=sB8(Y,G.agentState),q=G.agentState===Z?G:{...G,agentState:Z},V={...J.tools},K=CC(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=oJ(Y),q={...J.subagents};for(let z of X){let U=q[z.threadID];if(!U)continue;let D=zQ6(Z,z.toolUse.id);q[z.threadID]={...U,isCompleted:D}}let{items:V}=CC(Y),K=VA(Y,G),W=oE({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=VA(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function CC(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 D of U.content)if(D.type==="tool_result"&&D.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status: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)??UX(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 zQ6(J,Q){let Y=J.get(Q);return(Y&&F2(Y.run))??!1}function sB8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((G)=>G.type==="tool_result"&&G.run.status==="blocked-on-user"))return h.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(CC(J).items.some((G)=>G.type==="toolResult"&&G.toolResult.run.status==="in-progress")){let G=Q?.type==="running-tools"?Q.startTime:Date.now();return h.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 h.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return h.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 h.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:Z,hasStartTime:!!Z}),{type:"running-tools",startTime:Z}}default:return h.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return h.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class M_1 extends Y6{props;constructor(J){super();this.props=J}createState(){return new FQ6}}class FQ6 extends J6{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 D_1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),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=rB8(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===r5||Z===q9||Z===FX,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:iE(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 L_1 extends Y6{props;constructor(J){super({key:J.key});this.props=J}createState(){return new UQ6}}class UQ6 extends J6{build(J){let Y=O6.of(J).colors,{todos:X,title:G="TODOs"}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new F0({width:0,height:0});let Z=X.map((q)=>this.buildTodoItem(q,Y));return new Q6({child:new d6({padding:_0.symmetric(1,0),child:new a0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new u1({text:new J1(G,new K1({bold:!0,color:Y.foreground}))}),...Z]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),X=J.status==="completed",G=new K1({bold:J.status==="in-progress",color:Q.foreground,dim:X}),Z=new K1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:X});return new Q4({crossAxisAlignment:"start",children:[new u1({text:new J1(Y,G)}),new F0({width:1}),new B4({child:new u1({text:new J1(J.content,Z)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class A_1 extends _6{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=O6.of(J),Y=Q.colors.primary,X=Q.colors.foreground;return new Q6({decoration:new B8(void 0,new h4(new w4(Y,1,"rounded"),new w4(Y,1,"rounded"),void 0,new w4(Y,1,"rounded"))),child:new d6({padding:_0.horizontal(1),child:new a0({children:[new Q4({crossAxisAlignment:"start",children:[new B4({child:new u1({text:new J1(this.ad.content,new K1({color:X}))})}),new F0({width:4}),new H7({uri:"https://ampcode.com/free",text:"Ad",style:new K1({color:X,dim:!0})})]}),new Q4({crossAxisAlignment:"start",children:[new sC1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:_0.horizontal(1),color:Y,reverse:!0}),new F0({width:2}),new u1({text:new J1(this.ad.destinationUrlHostname,new K1({color:X,dim:!0}))})]})]})})})}}class O_1 extends Y6{props;constructor(J){super();this.props=J}createState(){return new BQ6(this.props.autofocus??!0)}}class BQ6 extends J6{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=W8.sizeOf(J),X=Math.min(60,Y.width-4),G=Y.height-4,Z=[];if(this.widget.props.title)Z.push(new u1({text:new J1(this.widget.props.title,new K1({bold:!0,color:O1.blue}))}),new F0({height:1}));if(this.widget.props.message)Z.push(new u1({text:new J1(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)Z.push(new F0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new u1({text:new J1("Enter to copy",new K1({dim:!0}))}));return q.push(new u1({text:new J1("Escape to close",new K1({dim:!0}))})),Z.push(new Q4({children:q.flatMap((V,K)=>K<q.length-1?[V,new F0({width:1}),new u1({text:new J1("•",new K1({dim:!0}))}),new F0({width:1})]:[V]),mainAxisSize:"min"})),new H8({child:new Q6({constraints:new r6(X,X,0,G),decoration:new B8(O1.default(),new h4(new w4(O1.blue,1,"rounded"),new w4(O1.blue,1,"rounded"),new w4(O1.blue,1,"rounded"),new w4(O1.blue,1,"rounded"))),padding:new _0(2,2,2,2),child:new Q9({autofocus:this.autofocus,onKey:Q,child:new a0({children:Z,mainAxisSize:"min"})})})})}}class n81 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,n81.prototype)}}class a81 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,a81.prototype)}}function w_1(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})}$U();L0();import{spawn as tB8}from"node:child_process";import{promises as eB8}from"node:fs";function NQ6(J){return J.kind==="executable"}function DQ6(J){return J.kind==="markdown"}var wz=50000,MQ6=300000;async function E_1(J,Q,Y,X={}){let{timeoutMs:G=MQ6,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(h.debug("Executing command",{commandName:J,filePath:V.filePath,args:Q}),DQ6(V))return await JN8(V,Q);else if(NQ6(V))return await QN8(V,Q,G,Z);else return{success:!1,output:"",error:"Unsupported command type"}}catch(V){return h.error("Failed to execute command",{commandName:J,error:V}),{success:!1,output:"",error:V instanceof Error?V.message:"Unknown error occurred"}}}async function JN8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await eB8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>wz?Y.slice(0,wz)+`
|
|
4741
4741
|
... (output truncated at ${wz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function QN8(J,Q,Y=MQ6,X){return new Promise((G)=>{let[Z,q]=YN8(J,Q);h.debug("Spawning command",{spawnCommand:Z,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Y});let V=mO0(X),K=!1,W=setTimeout(()=>{K=!0,V.abort(),h.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=tB8(Z,q,{stdio:["pipe","pipe","pipe"],signal:V.signal,detached:!0}),z=[],U=[],D=0;H.stdout?.on("data",(M)=>{let L=M.toString();if(D+=L.length,D<=wz)z.push(L);else{let A=wz-(D-L.length);if(A>0)z.push(L.slice(0,A))}}),H.stderr?.on("data",(M)=>{let L=M.toString();if(D+=L.length,D<=wz)U.push(L);else{let A=wz-(D-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?`
|
|
4742
4742
|
${E}`:E;if(D>wz)P+=`
|
|
4743
|
-
... (output truncated at ${wz} 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 YN8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return GN8(Y,X?[...X]:null,G,Q);else return XN8(Y,X?[...X]:null,G,Q)}function XN8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function GN8(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]}}L0();C$();S3();uW();TX();d$();XH();wH();m7();l_();r0();var CQ6=D6(PP(),1);import{writeFile as PQ6}from"fs/promises";import TQ6 from"path";L0();TX();class I_1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.
|
|
4743
|
+
... (output truncated at ${wz} 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 YN8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return GN8(Y,X?[...X]:null,G,Q);else return XN8(Y,X?[...X]:null,G,Q)}function XN8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function GN8(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]}}L0();C$();S3();uW();TX();d$();XH();wH();m7();l_();r0();var CQ6=D6(PP(),1);import{writeFile as PQ6}from"fs/promises";import TQ6 from"path";L0();TX();class I_1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764336207-gc6abaf"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await sa(Q,this.configService)}catch(Q){h.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 P_1 extends Y6{props;constructor(J){super();this.props=J}createState(){return new LQ6}}class LQ6 extends J6{_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 AQ6 extends J6{controller=new xZ;focusNode=new d8({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=O6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=h4.all(new w4(Y.foreground,1,"solid")),K=new JO({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let M=D.trim();if(G&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new Q4({children:[new Q6({decoration:{color:O1.default()},child:new u1({text:new J1(">",new K1({color:Y.foreground}))})}),new B4({child:K})]}),H=new Q6({padding:_0.symmetric(1,0),child:new u1({text:new J1("",void 0,[new J1("Command: ",new K1({color:Y.foreground})),new J1(this.widget.props.commandName,new K1({color:O1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new J1("Enter",new K1({color:X.keybind}))),z.push(new J1(" to submit, ",new K1({color:Y.foreground,dim:!0})));z.push(new J1("Esc",new K1({color:X.keybind}))),z.push(new J1(" to cancel",new K1({color:Y.foreground,dim:!0})));let U=new Q6({padding:_0.symmetric(1,0),child:new u1({text:new J1("",void 0,z)})});return new Q6({decoration:{border:V,color:O1.default()},padding:_0.all(1),child:new a0({children:[H,new F0({height:1}),W,new i5,U]})})}}class o81 extends Y6{props;constructor(J){super();this.props=J}createState(){return new AQ6}}XH();class OQ6 extends J6{controller=new xZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new d8({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>=qU)return!1;let Q=WC(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=O6.of(J),{colors:Y,app:X}=Q,Z=W8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new FO({controller:this.controller,triggers:[new KN],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:I9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new Q9({focusNode:this.focusNode,child:V}),W=new Q6({constraints:new r6({maxHeight:q}),padding:_0.symmetric(1,0),child:K}),H=new Q6({padding:_0.symmetric(1,0),child:new u1({text:new J1("",void 0,[new J1("Command: ",new K1({color:Y.foreground})),new J1(this.widget.props.commandName,new K1({color:O1.yellow,bold:!0}))])})}),z=new Q6({padding:_0.symmetric(1,0),child:new u1({text:this.isConfirmingClearInput?new J1("",void 0,[new J1("Esc",new K1({color:X.keybind})),new J1(" again to clear input",new K1({color:Y.foreground,dim:!0}))]):new J1("",void 0,[new J1("Press ",new K1({color:Y.foreground,dim:!0})),new J1("Enter",new K1({color:X.keybind})),new J1(" to submit, ",new K1({color:Y.foreground,dim:!0})),new J1("Esc",new K1({color:X.keybind})),new J1(" to clear",new K1({color:Y.foreground,dim:!0}))])})}),U=[H,new F0({height:1}),new B4({child:W}),new F0({height:1}),z];return new Q6({decoration:{border:h4.all(new w4(Y.foreground,1,"solid")),color:O1.default()},padding:_0.all(1),child:new a0({children:U})})}}class jC extends Y6{props;constructor(J){super();this.props=J}createState(){return new OQ6}}function wQ6(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 T_1 extends _6{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)=>wQ6(G.pubDate).length));return new hK({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=O6.of(V),{colors:W}=K,H=Z?O1.yellow:void 0,z=Z?O1.black:W.foreground,U=O1.index(8),D=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new F0({width:A,child:Q4.end([new u1({text:new J1(L,new K1({color:U}))})])});return new Q6({decoration:H?{color:H}:void 0,padding:_0.symmetric(2,0),child:new Q4({children:[new B4({child:new u1({text:new J1(G.title,new K1({color:z})),overflow:"ellipsis",maxLines:1})}),new F0({width:2}),new u1({text:new J1(D,new K1({color:U})),maxLines:1}),new F0({width:2}),M(wQ6(G.pubDate),Y)]})})}})}}class R_1 extends _6{props;constructor(J){super();this.props=J}build(){return new H8({child:new u1({text:new J1("",void 0,[new J1(`Forked to new thread:
|
|
4744
4744
|
|
|
4745
4745
|
`,new K1({color:O1.white,dim:!0})),new J1(`"${this.props.newThreadTitle||"Untitled"}"`,new K1({color:O1.white}))]),textAlign:"center"})})}}class WN extends Y6{props;constructor(J){super();this.props=J}createState(){return new EQ6}}class EQ6 extends J6{_spinner=new pK;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=O6.of(J),{colors:Y}=Q,X=h4.all(new w4(Y.foreground,1,"solid")),G=this._spinner.toBraille(),Z=new u1({textAlign:"center",text:new J1("",void 0,[new J1(G,new K1({color:O1.yellow})),new J1(" ",void 0),new J1(this.widget.props.message,new K1({color:Y.foreground}))])}),V=[new B4({child:new a0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)V.push(new F0({height:2,child:new Q6({padding:_0.symmetric(2,0),child:new u1({text:new J1("",new K1({dim:!0}),[new J1("Press ",new K1({color:Y.foreground})),new J1("Esc",new K1({color:Y.info})),new J1(" to cancel",new K1({color:Y.foreground}))])})})}));let K=new Q6({decoration:new B8(O1.default(),X),child:new F0({width:60,height:7,child:new a0({mainAxisAlignment:"start",children:V})})});if(this.widget.props.onAbort)return new Q9({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:K});return K}}class Ez extends Y6{props;constructor(J){super();this.props=J}createState(){return new IQ6}}class IQ6 extends J6{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof bK}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=J81(Q);return{title:W.title,type:W.type,description:W.description}})(),X=Y.type==="error"?O1.red:O1.yellow,G=h4.all(new w4(O1.default(),1,"solid")),Z=new Q6({padding:_0.symmetric(1,0),child:new u1({text:new J1(Y.title,new K1({color:X,bold:!0}))})}),q=this.isWidgetMessage(Q)?Q.widget:new u1({text:new J1(Y.description,new K1({color:O1.default()})),selectable:!0}),V=new B4({child:new sA({child:new Q6({padding:_0.symmetric(1,0),child:q})})}),K=new Q6({padding:_0.symmetric(1,0),child:new u1({text:this.widget.props.onRetry?new J1("",void 0,[new J1("Press ",new K1({color:O1.default(),dim:!0})),new J1("R",new K1({color:O1.yellow})),new J1(" to retry, ",new K1({color:O1.default(),dim:!0})),new J1("Esc",new K1({color:O1.yellow})),new J1(" to cancel",new K1({color:O1.default(),dim:!0}))]):new J1("Press any key to close",new K1({color:O1.default(),dim:!0,italic:!0}))})});return new Q9({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 Q6({decoration:{border:G,color:O1.default()},padding:_0.all(1),child:new a0({mainAxisAlignment:"center",children:[Z,new F0({height:1}),V,K]})})})}}class C_1 extends _6{build(){return new H8({child:new u1({text:new J1("",void 0,[new J1(`✓ Thread Shared
|
|
4746
4746
|
|
|
@@ -4824,7 +4824,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
4824
4824
|
`)?`${V}...`:G,W=new K1({color:O1.index(8)}),H=[new J1(K,W)];if(q>0){let z=new K1({color:Y.success});for(let U=1;U<=q;U++)H.push(new J1(" ")),H.push(new J1(`[${U}]`,z))}return new d6({padding:_0.only({bottom:0}),child:new Q4({crossAxisAlignment:"start",children:[new d6({padding:_0.only({right:1}),child:new u1({text:new J1("•",new K1({color:O1.index(8)}))})}),new B4({child:new u1({text:new J1("",void 0,H)})})]})})}}class Gk1 extends Y6{createState(){return new AY6}}class AY6 extends J6{_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 K1({color:O1.red}),Y=new K1({color:this._visible?O1.red:O1.transparent()});return new Q4({children:[new u1({text:new J1("⏺",Y)}),new F0({width:1}),new u1({text:new J1("Replay",Q)})]})}}class Zk1 extends _6{entry;constructor({key:J,entry:Q}){super({key:J});this.entry=Q}build(J){let Q=O6.of(J),Y=Q.colors.secondary,X=Q.colors.foreground,G=this.entry.authors.map((Z)=>Z.name).join(", ");return new Q6({decoration:new B8(void 0,new h4(new w4(Y,1,"rounded"),new w4(Y,1,"rounded"),void 0,new w4(Y,1,"rounded"))),child:new d6({padding:_0.horizontal(1),child:new a0({children:[new Q4({crossAxisAlignment:"start",children:[new B4({child:new u1({text:new J1(this.entry.title,new K1({color:X,bold:!0}))})}),new F0({width:4}),new u1({text:new J1(G||"Community",new K1({color:X,dim:!0}))})]}),new Q4({crossAxisAlignment:"start",children:[new B4({child:new u1({text:new J1(this.truncateDescription(this.entry.description),new K1({color:X,dim:!0}))})}),new F0({width:2}),new H7({uri:this.entry.link,text:"View Thread",style:new K1({color:Y,underline:!0})})]})]})})})}truncateDescription(J){let Y=J.replace(/\s+/g," ").trim();if(Y.length<=80)return Y;return Y.slice(0,79)+"…"}}r0();function UD8(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 $k1{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(q6((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=UD8(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}})}}L0();D9();class qk1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new u3;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){h.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){h.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(UM()).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 OY6(J,Q){switch(J){case"update-available":return[new J1("A newer Amp is available. Run ",new K1({color:Q.foreground,dim:!0})),new J1("amp update",new K1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new J1("Update complete, run ",new K1({color:Q.foreground,dim:!0})),new J1("amp update",new K1({color:Q.warning})),new J1(" to see warnings",new K1({color:Q.foreground,dim:!0}))];case"update-error":return[new J1("Update failed, run ",new K1({color:Q.foreground,dim:!0})),new J1("amp update",new K1({color:Q.warning})),new J1(" to see warnings",new K1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function LD8(J){return new Promise((Q)=>{ND8("git",["branch","--show-current"],{cwd:J},(Y,X)=>{if(Y){Q(null);return}let G=X.trim();Q(G||null)})})}class jY6 extends Y6{dependencies;constructor(J){super();this.dependencies=J}createState(){return new SY6}}class SY6 extends J6{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;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;isShowingCostBreakdownOverlay=!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;paletteInitialCommandId=null;threadsForPicker=[];isLoadingThreads=!1;threadPreviewController=new qk1;previewThread=null;planScrollController=(()=>{let J=new u3;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new u3;return J.followMode=!1,J})();isShowingStandaloneThreadPicker=!1;filterThreadPickerByWorkspace=!0;agentModePulseSeq=0;currentGitBranch=null;messageViewFocusNode=new d8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new d8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showingCannotToggleMessage=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;agentModeSubscription=null;currentAgentMode="smart";inMemoryAgentModeOverride=null;cachedVisibleModes=uG();freeTierStatus=void 0;updateState="hidden";updateServiceSubscription=null;toastController=new Zj1;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=null;async initThreadFeed(){let J=await B6(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){h.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 $J(K,V,this.widget.dependencies.configService)},Z=_c0();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 OC1(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){h.error("Thread feed: error in next handler",V)}},error:(q)=>{h.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(`
|
|
4825
4825
|
`);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 D=J.thread.id;this.getMessageScrollController(D).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),I9.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;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)}}}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return P41(this.widget.dependencies.worker.thread,this.inMemoryAgentModeOverride?{agentMode:this.inMemoryAgentModeOverride}:null,this.freeTierStatus,{"experimental.agentMode":this.currentAgentMode})}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 J1(this.submitDisabledHint,new K1({color:J.foreground,dim:!0}));if(this.isExiting)return new J1("Exiting...",new K1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new J1("",void 0,[new J1("Ctrl+C",new K1({color:Q.keybind})),new J1(" again to exit",new K1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new J1("",void 0,[new J1("Esc",new K1({color:Q.keybind})),new J1(" again to clear input",new K1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new J1("",void 0,[new J1("Escape",new K1({color:Q.keybind})),new J1(" to close help",new K1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let G=this.getEffectiveAgentMode(),Z=Fk1(G);return new J1("",void 0,[new J1("Images aren't supported in ",new K1({color:J.warning,dim:!1})),new J1(G,new K1({color:Z})),new J1(" mode.",new K1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new J1("",void 0,[new J1("Esc",new K1({color:Q.keybind})),new J1(" again to cancel",new K1({color:J.foreground,dim:!0}))]);return new J1("",void 0,[new J1("Esc",new K1({color:Q.keybind})),new J1(" to cancel",new K1({color:J.foreground,dim:!0}))])}if(this.showingCannotToggleMessage)return new J1(this.showingCannotToggleMessage,new K1({color:J.warning,dim:!1}));let Y=OY6(this.updateState,J);if(Y)return new J1("",void 0,Y);let X=this.widget.dependencies.worker.thread;if(X.agentMode==="plan"&&cA(X))return new J1("",void 0,[new J1("Ctrl+O",new K1({color:Q.keybind})),new J1(" → Execute Plan",new K1({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){h.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 N3.getOrCreateForThread(Y,G),V=await ZR(q,X,Z-1);await this.switchToExistingThread(V)}catch(q){h.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=YN(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){h.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){h.error("Failed to edit message:",q)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(e3)}catch(Y){return h.error("Failed to get affected files:",Y),[]}};textController=new xZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new u3);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(vR1(X))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new a7("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands=null;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"){this.showCommandPalette(),this.textController.clear();return}let Y=YN(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}),e8.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.loadThreadsForPicker(),this.setState(()=>{this.isShowingStandaloneThreadPicker=!0})};dismissStandaloneThreadPicker=()=>{this.exitApplication()};handleStandaloneThreadSelect=async(J)=>{try{await this.switchToExistingThread(J,{recordInNavigationHistory:!1}),this.threadPreviewController.clear(),this.setState(()=>{this.isShowingStandaloneThreadPicker=!1}),e8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingStandaloneThreadPicker)this.autocompleteFocusNode.requestFocus()})}catch(Q){h.error("Failed to switch thread:",Q),this.showErrorMessage(`Failed to switch thread: ${Q}`)}};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(J){if(this.setState(()=>{this.isShowingPalette=!this.isShowingPalette,this.paletteInitialCommandId=J??null}),this.isShowingPalette)this.loadThreadsForPicker()}getPaletteCommands(){if(!this.paletteCommands)this.paletteCommands=new S_1(this.widget.dependencies.configService,this.widget.dependencies.commandRegistry,(J)=>{this.setState(()=>{this.executingCommand=J})},()=>{this.setState(()=>{this.executingCommand=null})},this.widget.dependencies.isDogfooding);return this.paletteCommands}getCompletionBuilder(){if(!this.completionBuilder)this.completionBuilder=new y_1(this.widget.dependencies.fuzzyServer,this.widget.dependencies.threadFuzzyIndexer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteInitialCommandId=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Y}=this.widget.dependencies;if(!Q.mainThread)return null;let X=n0.file(process.cwd()),G=A6(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 n81("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 h.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 wr({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()},getInMemoryAgentModeOverride:()=>{return this.inMemoryAgentModeOverride},setInMemoryAgentModeOverride:(Z)=>{this.setState(()=>{this.inMemoryAgentModeOverride=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){h.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})}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new $k1(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 LD8(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===QN).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===QN};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})};toggleAgentMode=()=>{let J=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(_$(J.thread)>0)return;if(this.freeTierStatus?.canUseAmpFree){let X=this.getEffectiveAgentMode(),G=nl(X,this.cachedVisibleModes);if(G!==X)this.setState(()=>{this.inMemoryAgentModeOverride=G,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1});return}let Q=this.getEffectiveAgentMode(),Y=nl(Q,this.cachedVisibleModes);if(Y===Q)return;if(this.setState(()=>{this.inMemoryAgentModeOverride=Y,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1}),I5(Y))this.checkAndShowFreeModeModal()};checkAndShowFreeModeModal=()=>{if(this.freeTierStatus?.canUseAmpFree)return;if(this.freeTierStatus){if(!this.freeTierStatus.eligible){this.setState(()=>{this.showingCannotToggleMessage="Amp Free is unavailable. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}else if(!this.freeTierStatus.workspaceAllowsAmpFree){this.setState(()=>{this.showingCannotToggleMessage="Your workspace does not allow Amp Free. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}}};isInRestrictedFreeMode(){if(this.getEffectiveAgentMode()!=="free")return!1;if(this.freeTierStatus?.canUseAmpFree)return!1;return!0}handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!wk(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>=qU)return!1;let Y=WC(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)})};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 Bz(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")h.error("Failed to read temporary file",H)}try{await X(W),await G(K)}catch(H){h.warn("Failed to clean up temporary file",H)}}catch(K){h.error("Error opening editor:",K)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=YN(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)};initState(){if(oX.getInstance().interceptConsole(),this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();I9.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),I9.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),I9.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{e8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),this.freeTierStatus=this.widget.dependencies.freeTierStatus,B6(this.widget.dependencies.configService.config).then((Y)=>{let X=P41(this.widget.dependencies.worker.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,Y.settings);if(h.info(`[initState] Resolved agentMode: ${X}`),this.widget.dependencies.sessionState?.agentMode)this.setState(()=>{this.inMemoryAgentModeOverride=X})}),this.updateGitBranch(),this.adSubscription=QC1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{return(this.inMemoryAgentModeOverride&&I5(this.inMemoryAgentModeOverride)||this.randomAd===null)&&JC1(this.lastUserInteractionTime)}).subscribe({next:(Y)=>{if(Y){let X=DD8(16).toString("hex");this.lastAdImpressionId=X,Promise.resolve().then(() => (U91(),F91)).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}),e8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingStandaloneThreadPicker&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}});let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=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){h.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}]}}),h.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),h.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.agentModeSubscription=this.widget.dependencies.configService.config.subscribe((Y)=>{let X=uG(Y.settings,this.freeTierStatus?.canUseAmpFree);this.setState(()=>{this.cachedVisibleModes=X})}),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.agentModeSubscription)this.agentModeSubscription.unsubscribe();if(this.adSubscription)this.adSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);if(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(vR1("")),this.shouldUseProgressBar())process.stdout.write(M96())}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"){h.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){h.error("No tool use block found in confirmation");return}if(J==="allow-all-session")O$("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 h.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 uY(this.context,G);return}if(J==="disable-librarian"){let G=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!G.includes(FX))await this.widget.dependencies.settingsStorage.set("tools.disable",[...G,FX],"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 N3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(G);else await this.widget.dependencies.worker.handle(G)}catch(G){h.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.setState(()=>{this.inMemoryAgentModeOverride="smart",this.dismissedEphemeralErrorKey=null}),k61({agentMode:"smart"}),await this.startAndSwitchToNewThread();break}case"handoff":{if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);this.showCommandPalette("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 Bz(Q.getSettingsFilePath())}catch(Y){let X=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${X}`)}};cancelStreamingMessage=async()=>{await N3.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{h.info(`[switchToExistingThread] Switching to thread: ${J}`);let X=await this.widget.dependencies.switchToThread(J);h.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${X.thread.agentMode}`);let G=await this.widget.dependencies.configService.getLatest(),Z=P41(X.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,G.settings);if(h.info(`[switchToExistingThread] Thread ${J} resolved agentMode: ${Z}`),this.widget.dependencies.worker=X,this.widget.dependencies.threadID=X.thread.id,this.widget.dependencies.switchWorker(X),this.setState(()=>{h.info("[switchToExistingThread] Clearing inMemoryAgentModeOverride"),this.inMemoryAgentModeOverride=null}),X.thread.draft)if(h.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof X.thread.draft==="string")this.textController.insertText(X.thread.draft);else{let q=X.thread.draft.filter((W)=>W.type==="text"),V=X.thread.draft.filter((W)=>W.type==="image"),K=q.map((W)=>W.text).join(`
|
|
4826
4826
|
`);if(K)this.textController.insertText(K);if(V.length>0)this.setState(()=>{this.imageAttachments=V})}}catch(X){throw h.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=_$(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(await Q.handle({type:"user:message",message:{content:G,agentMode:X}}),Y)k61({agentMode:X});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),e8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingStandaloneThreadPicker&&!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();k61({agentMode:Q}).catch((Y)=>{h.warn("Failed to save session state on exit:",Y)}).finally(()=>{I9.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=MD8();if(J===Q)return"~";if(J.startsWith(Q+Mm.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(Mm.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(Mm.sep),"…",Q.slice(-2).join(Mm.sep)].join(Mm.sep)}build(J){let Q=W8.of(J),Y=O6.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&&I5(q.thread.agentMode),K=V&&this.randomAd!==null,W=!V&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden&&this.hasSubmittedFirstMessage,H=K||W,{threadState:z}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let U=this.getCurrentConfirmation(),D=this.widget.dependencies.replayMode,M=Boolean(D),L=z.items,A=z.mainThread||void 0,E=z.subagentToolsByParentID,P=z.todosList;if(M){let i6={...D.thread,messages:this.replayDisplayedMessages};L=CC(i6).items,A=i6,E={};let P4=oE({messages:this.replayDisplayedMessages});P=Array.isArray(P4)?P4:[]}let I=A?.id,R=A,S=M?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),y=(i6)=>new c81({key:new a7(`preview-message-view-${i6.id}`),items:CC(i6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:i6,focusNode:new d8({debugLabel:"PreviewFocus"})}),x=this.previewThread,g=x?x.messages.length>2000?new a0({mainAxisSize:"max",children:[new B4({child:new F0}),new d6({padding:_0.all(2),child:new H8({child:new u1({text:new J1("Thread too long for preview",new K1({color:G.mutedForeground,dim:!0}))})})})]}):y(x):S?new i81({agentMode:this.getEffectiveAgentMode()}):new c81({key:I?new a7(`message-view-${I}`):void 0,items:L,subagentToolsByParentID:E,controller:I?this.getMessageScrollController(I):new u3,autofocus:!1,onCopy:M?void 0:this._handleTextCopy.bind(this),thread:R,onMessageEditSubmit:M?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:M?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:M?void 0:this.forkMessage,getAffectedFiles:M?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),p=Math.max(Math.floor(Q.size.height*0.4),12),b=this.getCurrentEphemeralError(),i=this.buildBottomWidget(b,U,G,Y,z,P,p,H,M),Y1=Q.size.width<40,n=z.mainThread?pU0(z.mainThread):void 0,m=new Z81({threadViewState:z.viewState,threadTokenUsage:n,threadID:I??null,thread:z.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onCostBreakdownClick:()=>{this.setState(()=>{this.isShowingCostBreakdownOverlay=!this.isShowingCostBreakdownOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,isNarrow:Y1,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}),s=new G81({bashInvocations:this.bashInvocations}),H1=[],W1=this.getEffectiveAgentMode(),o=this.currentShellModeStatus,r=Fk1(W1),l=!o?W1.length+1:0,F1=Q.capabilities.animationSupport,y1=F1==="disabled"?0:F1==="slow"?30:60,t=SV(W1)?.uiHints?.fasterAnimation?3:1,f1=y1>0&&this.agentModePulseSeq>0?new B5({children:[i,new r7({top:0,left:1,right:1,height:1,child:new Qk1({color:r,trigger:this.agentModePulseSeq,fps:y1,speed:t,leftOffset:l})})]}):i;H1.push(new B4({child:g}),s);let j1=new B5({children:[new a0({mainAxisSize:"min",children:[K?new A_1({ad:this.randomAd,onButtonClick:async()=>{let i6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (U91(),F91)).then(({recordAdEvent:z8})=>{let J8=this.widget.dependencies.worker.thread,C9=J8.messages[J8.messages.length-1];z8("clicked",{adId:i6.id,advertiserId:i6.advertiserId,threadId:J8.id,messageId:C9?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:i6.metadata?.matchType,matchedPatterns:i6.metadata?.matchedPatterns,candidateAdPoolCount:i6.metadata?.candidateAdPoolCount,clientRegion:i6.metadata?.clientRegion})});if(!await uY(this.context,i6.shortDestinationUrl)){let J8=I9.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:J8,url:i6.shortDestinationUrl}})}}}):W?new Zk1({entry:this.currentThreadFeedEntry}):new F0({height:0}),new Q6({constraints:new r6(0,Q.size.width,0,p),child:f1})]}),H?new r7({top:0,left:0,right:0,child:new yY6({userHeight:this.bottomGridUserHeight,maxHeight:p,onInitializeHeight:(i6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(i6,p)})},onDrag:(i6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(i6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let P4=Math.floor(i6.localPosition.y)-this.bottomGridDragStartY,z8=Math.max(4,this.bottomGridDragStartHeight-P4),J8=Math.min(z8,p),C9=Math.floor(J8);if(this.bottomGridUserHeight!==C9)this.setState(()=>{this.bottomGridUserHeight=C9})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new F0({height:0})]});H1.push(j1,new F0({height:1,child:new d6({padding:_0.horizontal(1),child:m})}));let w0=new a0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:H1}),C1=M?new B5({children:[w0,new r7({top:0,left:0,child:new Gk1})]}):w0,s1=new J9(()=>{if(this.isShowingPalette)return this.dismissPalette(),"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.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((P4)=>{h.error("Failed to mark message as interrupted:",P4)}),this.cancelStreamingMessage().catch((P4)=>{h.error("Failed to cancel streaming message:",P4)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return h.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"}),U1=new J9(()=>{return this.onExitPressed(),"handled"}),Q1=new J9(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),A1=new J9(()=>{return OJ.instance.toggleAll(),"handled"}),w1=new J9(()=>{return this.widget.dependencies.configService.getLatest().then((i6)=>{O$("internal.showCost",!(i6.settings["internal.showCost"]??!0))}),"handled"}),I1=new J9(()=>{return I9.instance.toggleFrameStatsOverlay(),"handled"}),E1=new J9(()=>{return I9.instance.tuiInstance.getScreen().markForRefresh(),e8.instance.requestFrame(),"handled"}),d1=new J9(()=>{return this.toggleAgentMode(),"handled"}),h1=new J9(()=>{let P4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:z8}=this.widget.dependencies,J8=z8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(P4){let z8=Math.max(Math.floor(Q.size.height*0.4),10),J8=Q.size.height-z8;P4.animatePageUp(J8,100)}return"handled"}),r1=new J9(()=>{let P4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:z8}=this.widget.dependencies,J8=z8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(P4){let z8=Math.max(Math.floor(Q.size.height*0.4),10),J8=Q.size.height-z8;P4.animatePageDown(J8,100)}return"handled"}),$0=new J9(()=>{let P4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:z8}=this.widget.dependencies,J8=z8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(P4)P4.animateTo(0,100);return"handled"}),G0=new J9(()=>{let P4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:z8}=this.widget.dependencies,J8=z8.mainThread?.id;return J8?this.getMessageScrollController(J8):null})();if(P4)P4.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),R0=new J9(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:i6}=this.widget.dependencies;if(!i6.mainThread?.messages.some((z8)=>z8.role==="user"||aE(z8)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),F6=new J9((i6)=>{if(i6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),M6=new J9(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return e41().then(async(i6)=>{if(i6)try{this.handleInsertImage(i6)}finally{try{let{unlink:P4}=await import("node:fs/promises");await P4(i6)}catch{}}}),"handled"}),N4=new Map([[U4.ctrl("c"),new ig],[U4.ctrl("l"),new sg],[U4.ctrl("o"),new c41],[U4.ctrl("v"),new cg],[U4.alt("s"),new FC],[U4.ctrl("s"),new FC],[U4.alt("p"),new rg],[U4.ctrl("r"),new ag],[U4.alt("d"),new og],[U4.ctrl("t"),new tg],[U4.key("PageUp"),new m41],[U4.key("PageDown"),new u41],[U4.key("Home"),new p41],[U4.key("End"),new d41],[U4.key("Escape"),new lg],[U4.ctrl("p"),new UC("previous")],[U4.ctrl("n"),new UC("next")],[U4.key("Tab"),new eg]]);if(!n2())N4.set(U4.key("ArrowUp"),new eg);if(!1)N4.set(U4.alt("c"),new ng);let k9=new J9(()=>{if(this.isShowingStandaloneThreadPicker)return"handled";return this.showCommandPalette(),"handled"}),I0=new J9(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),u0=new Map([[lg,s1],[sg,E1],[FC,d1],[c41,k9],[cg,M6],[ng,Q1],[ag,A1],[og,w1],[rg,I1],[tg,I0],[ig,U1],[m41,h1],[u41,r1],[p41,$0],[d41,G0],[eg,R0],[UC,F6]]),k6=[C1];if(this.isShowingConsoleOverlay)k6.push(new f_1);if(this.isShowingHelp){let i6=this.getPaletteCommands().getAllCommands();k6.push(new g_1({commands:i6}))}if(this.adActionModal)k6.push(new O_1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(i6)=>{let P4=this.adActionModal.url;if(i6==="copy")try{await I9.instance.tuiInstance.clipboard.writeText(P4),this.setState(()=>{this.displayMessage=new YG("Link copied to clipboard")})}catch(z8){h.error("Failed to copy to clipboard",{error:z8}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:i6}=this.widget.dependencies;k6.push(new Yk1({servers:this.pendingMCPServers,onAlwaysTrust:i6.trustAlways.bind(i6),onTrustOnce:i6.trustOnce.bind(i6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:i6.deny.bind(i6)}))}if(this.isShowingFileChangesOverlay)k6.push(new wj1({threadData:z}));if(this.isShowingCostBreakdownOverlay&&z.mainThread)k6.push(new h_1({thread:z.mainThread}));if(this.isShowingConfirmationOverlay)k6.push(new x_1({details:this.confirmationOverlayContent}));let e4=this.getCommandPaletteContext(J);if(e4&&this.isShowingPalette)k6.push(new H8({child:new Q6({constraints:r6.loose(80,20),child:new k_1({commandContext:e4,mainThread:z.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,initialCommandId:this.paletteInitialCommandId??void 0})})}));if(this.isShowingIdePicker)k6.push(new u_1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));if(this.isShowingStandaloneThreadPicker){let i6=n0.file(process.cwd()),P4=A6(i6);k6.push(new H8({child:new Q6({constraints:r6.loose(80,20),child:new LC({threads:this.threadsForPicker,title:"Continue Thread",onSelect:this.handleStandaloneThreadSelect,onDismiss:this.dismissStandaloneThreadPicker,previewController:this.threadPreviewController,isLoading:this.isLoadingThreads,currentWorkspaceURI:P4,filterByWorkspace:this.filterThreadPickerByWorkspace,threadViewStates:this.widget.dependencies.workerController.threadViewStates,recentThreadIDs:this.widget.dependencies.recentThreadIDs,currentThreadID:this.widget.dependencies.threadState.mainThread?.id})})}))}let k8=new B5({children:k6});if(this.isShowingJetBrainsInstaller)return new eA({child:new pQ({actions:u0,child:new Rq({shortcuts:N4,debugLabel:"jetbrains-installer-shortcuts",child:new Jk1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Dz({controller:this.toastController,child:new eA({child:new $j1({controller:this.toastController,child:new pQ({actions:u0,child:new Rq({shortcuts:N4,debugLabel:"main-app-shortcuts",child:k8})})})})})}buildScrollableTodoList(J,Q,Y){return new _Y6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,X,G,Z,q,V,K){if(J)return new b_1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new v_1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Xk1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let W=X81(X),H=this.isInRestrictedFreeMode(),z=new FO({key:this.textFieldKey,controller:this.textController,triggers:K?[]:[new KN],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":H?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!H&&!this.isShowingStandaloneThreadPicker,shellPromptRules:W,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandaloneThreadPicker&&!this.isShowingIdePicker,clipboard:I9.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 p=this.previousThreadIdForHint;if(p)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${p} `}}),U=G.mainThread?.queuedMessages??[],D=Array.isArray(Z)&&Z.length>0,M=Array.isArray(U)&&U.length>0,L=G.mainThread?.agentMode==="plan"&&cA(G.mainThread),A,E;if(L){if(A=new uC1(new l81({thread:G.mainThread,onExecute:async()=>{let p=this.getCommandPaletteContext();if(p)await this.getPaletteCommands().execute("execute-plan",p,void 0,new AbortController)},onEdit:async()=>{try{let p=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:b}=await this.widget.dependencies.planFileManager.ensureSync(G.mainThread.id);I9.instance.tuiInstance.suspend();let{execSync:i}=await import("child_process");i(`${p} "${b}"`,{stdio:"inherit"}),I9.instance.tuiInstance.resume()}catch(p){h.error("Failed to edit plan",p),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:X}),{clipBehavior:"antiAlias"}),M)E=new z91({queuedMessages:U});else if(D)E=this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!H,X)}else A=M?new z91({queuedMessages:U}):void 0,E=D?this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!H,X):void 0;let P=[],I=this.currentShellModeStatus;if(I)P.push({text:new J1(I==="hidden"?"shell mode (incognito)":"shell mode",new K1({color:I==="hidden"?X.app.shellModeHidden:X.app.shellMode})),position:"top-left"});if(!I&&this.cachedVisibleModes.length>1){let p=this.previewThread,b=p?p.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),i=Fk1(b);if(p)P.push({text:new J1(b,new K1({color:i})),position:"top-left",offsetY:0});else{let Y1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,n=_$(Y1.thread)===0,m=new J1(b,new K1({color:i}));P.push({text:m,position:"top-left",offsetY:0,onClick:n?this.toggleAgentMode:void 0})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let p=this.connectedClientsStatus,b=p.mode||"disconnected",i=!!p.errorMessage,Y1=p.clientID||"unknown",n,m;if(i)n="●",m=O1.red;else if(b==="presence")n="○",m=O1.yellow;else if(b==="connected"&&p.connected)n="●",m=O1.green;else n="○",m=O1.yellow;let s=this.connectedClientsStatusExpanded?`${Y1} ${n}`:n;P.push({text:new J1(s,new K1({color:m})),position:"top-right",offsetX:-2,offsetY:0,onClick:this.toggleConnectedClientsStatus})}let R=K?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:G.mainThread?.env?.initial.trees?.[0]?.uri,S;if(R)S=n0.parse(R).fsPath;else S=process.cwd();let y=this.toHomeRelative(S),x=this.shorten(y),g=!K&&this.currentGitBranch?`${x} (${this.currentGitBranch})`:x;return P.push({text:new J1(g,new K1({color:Y.foreground,dim:!0})),position:"bottom-right"}),new Fj1({leftChild:new B4({child:z}),rightChild1:A,rightChild2:E,maxHeight:q,overlayTexts:P,borderColor:H||!this.isTextfieldAndAutocompleteFocused?O1.index(8):void 0,hasBanner:V,userHeight:this.bottomGridUserHeight,onInitializeHeight:(p)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(p,q)})},onDrag:(p)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(p.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let b=Math.floor(p.localPosition.y)-this.bottomGridDragStartY,i=Math.max(4,this.bottomGridDragStartHeight-b),Y1=Math.min(i,q),n=Math.floor(Y1);if(this.bottomGridUserHeight!==n)this.setState(()=>{this.bottomGridUserHeight=n})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!V})}}async function Uk1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)I9.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let X=()=>null,Z=!1,q=new Kz(Z,1000,J.inspectorPort),V=J.features?.find((A)=>A.name==="amp-connect")?.enabled??!1,K=new M_1({threadService:J.threadService,worker:J.worker,builder:(A,E,P,I,R,S)=>{if(X=R,J.threadDependencies&&V)PC1(J.threadDependencies,J.configService,R,I,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((g)=>{h.error("Failed to start automatic presence:",g)});let y=R(),x={...J,worker:y,threadID:y.thread.id};return new jY6({...x,threadState:E,workerController:P,switchWorker:I,getCurrentWorker:R,recentThreadIDs:S})}}),W=new Mj1({configService:J.configService,child:K}),H=new Bj1({configService:J.configService,child:W}),z=new tC1(H),U=new O6({data:BC.fromBaseTheme(yZ.default()),child:z});try{await rR1(U,{onRootElementMounted:(A)=>{if(h.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(() => (TC1(),D76));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}`;g76(L,A,J.stdout)}}function Fk1(J){let Y=SV(J)?.uiHints?.secondaryColor;if(Y)return O1.rgb(Y.r,Y.g,Y.b);return AD8(J)}class _Y6 extends Y6{props;constructor(J){super();this.props=J}createState(){return new kY6}}class kY6 extends J6{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 Q4({crossAxisAlignment:"stretch",children:[new B4({child:new E2({controller:Y,autofocus:!1,child:new L_1({todos:Q})})}),new GG({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 yY6 extends _6{props;constructor(J){super();this.props=J}build(J){return new _8({child:new F0({height:1}),cursor:n9.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 AD8(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 O1.index(Y[X])}oR1();try{if(process.platform==="win32")await Promise.resolve().then(() => D6(aC(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){dZ.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
4827
|
-
`)}var dy1=py1.join(Lz0||py1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function uO8(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 xq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")O$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")O$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")O$("model.sonnet",Q.useSonnet)}async function ly1(J){try{await bO8(py1.dirname(dy1),{recursive:!0}),await gO8(dy1,J,"utf-8")}catch(Q){h.debug("Failed to save last thread ID",Q)}}async function pO8(){try{return(await Z$6(dy1,"utf-8")).trim()}catch(J){return null}}var Y$6=[{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??RZ,description:`Custom settings file path (overrides the default location ${RZ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(h).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${JR1})`},{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:n2(),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:pE.SMART.key,description:`Set the agent mode (${uG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:uG().map((J)=>J.mode)}],X$6=(J)=>("deprecated"in J)&&J.deprecated===!0,dO8=(J)=>("hidden"in J)&&J.hidden===!0,cO8=(J)=>("default"in J),lO8=(J)=>("default"in J)?J.default:void 0;function iO8(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 j8(TZ.unknownCommand(Y),1,q)}}var $$6=null;function GU5(){return $$6}function um(J){return{...J,getThreadEnvironment:q61,vfs:cE0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Ax(J.fileSystem),generateThreadTitle:bc0,deleteThread:(Q)=>J.threadService.delete(Q)}}var iy1=n0.file(mO8.homedir()),q$6=process.env.XDG_CONFIG_HOME?n0.file(process.env.XDG_CONFIG_HOME):Z6.joinPath(iy1,".config");async function vq(J,Q){JB0("0.0.
|
|
4827
|
+
`)}var dy1=py1.join(Lz0||py1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function uO8(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 xq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")O$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")O$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")O$("model.sonnet",Q.useSonnet)}async function ly1(J){try{await bO8(py1.dirname(dy1),{recursive:!0}),await gO8(dy1,J,"utf-8")}catch(Q){h.debug("Failed to save last thread ID",Q)}}async function pO8(){try{return(await Z$6(dy1,"utf-8")).trim()}catch(J){return null}}var Y$6=[{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??RZ,description:`Custom settings file path (overrides the default location ${RZ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(h).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${JR1})`},{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:n2(),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:pE.SMART.key,description:`Set the agent mode (${uG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:uG().map((J)=>J.mode)}],X$6=(J)=>("deprecated"in J)&&J.deprecated===!0,dO8=(J)=>("hidden"in J)&&J.hidden===!0,cO8=(J)=>("default"in J),lO8=(J)=>("default"in J)?J.default:void 0;function iO8(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 j8(TZ.unknownCommand(Y),1,q)}}var $$6=null;function GU5(){return $$6}function um(J){return{...J,getThreadEnvironment:q61,vfs:cE0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Ax(J.fileSystem),generateThreadTitle:bc0,deleteThread:(Q)=>J.threadService.delete(Q)}}var iy1=n0.file(mO8.homedir()),q$6=process.env.XDG_CONFIG_HOME?n0.file(process.env.XDG_CONFIG_HOME):Z6.joinPath(iy1,".config");async function vq(J,Q){JB0("0.0.1764336207-gc6abaf");let Y=D$1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:X0.of([n0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:iy1,userConfigDir:q$6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (U91(),F91));X(Y);let G=await Y.getLatest();h.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let{toolService:Z,dispose:q}=Vt0({configService:Y}),V=new Map,K=()=>V.clear(),W=new MF1(Y,J.settings.getWorkspaceRootPath()),H=sw0({configService:Y,trustStore:W,createOAuthProvider:async(n)=>{let m=V.get(n);if(m)return h.debug("Reusing existing OAuth provider for server",{serverName:n}),m;h.debug("Creating OAuth provider for server",{serverName:n});let s=(async()=>{let H1=new yM(J.secrets),W1=await H1.getClientInfo(n),o=new mz1({storage:H1,serverName:n,clientId:W1?.clientId,clientSecret:W1?.clientSecret,scopes:W1?.scopes});return h.debug("OAuth provider created",{serverName:n,hasManualClientId:!!W1?.clientId,willUseDCR:!W1?.clientId}),o})();return V.set(n,s),s}}),z=D01({configService:Y,filesystem:U5,spawn:wA}),{initializeToolProviders:U}=await Promise.resolve().then(() => (Q$6(),J$6)),{registrations:D,initErrors:M}=await U({toolService:Z,providers:[H,z],initialTimeout:J.executeMode?15000:5000});for(let[n,m]of M)h.warn(`${n} provider initialization slow or failed:`,m);if(Q.jetbrains)sE("JetBrains");else if(Q.ide&&z86())sE("VS Code");else if(Q.ide&&F86())sE("Neovim");if(J.executeMode)QB0(!0);let L,A=U2.status.pipe(q6((n)=>Boolean(n.connected&&n.authenticated)),x4()).subscribe((n)=>{if(n){if(!L)L=Z.registerTool(lr0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode)E=new M61(process.cwd(),{},!0);else E=new class extends M61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(f5.write(`No API key found. Starting login flow...
|
|
4828
4828
|
`),!await nO8(J))await gA(),process.exit(1)}let P=await OP0({isDevelopment:!1}),I=new AE1(P,Y),R=new BE1(P,{lazy:!0}),S=new CF1(I,(n,m)=>{let s=N3.get(n);if(s)s.handle(m).catch((H1)=>{h.error("Failed to apply artifact delta",H1)})}),y=Q.notifications!==void 0?Q.notifications:!J.executeMode,x=Wt0({playNotificationSound:async(n)=>{if(y){Kt0(n);let m=nR1(),s=aR1();if((!m||s)&&G.settings["notifications.system.enabled"]!==!1){if(n==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(n==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:I,configService:Y});h.info("Starting Amp background services");let g=mc0({threadService:I,threadHistoryService:R,configService:Y,isExtensionDevelopment:!1}),p;U2.status.subscribe((n)=>{p=n});let b=new YZ1({workspaceRoots:[n0.file(process.cwd())],getCurrentFile:()=>{if(!p?.openFile)return;try{return n0.parse(p.openFile)}catch(n){h.warn("Failed to parse current file URI",{uri:p.openFile,error:n});return}},getOpenFiles:()=>{if(!p?.visibleFiles?.length)return[];let n=p.openFile;return p.visibleFiles.filter((m)=>m!==n).map((m)=>{try{return n0.parse(m)}catch(s){return h.warn("Failed to parse visible file URI",{uri:m,error:s}),null}}).filter((m)=>m!==null)}}),i=new sR1,Y1={codebaseContextService:b,configService:Y,toolService:Z,mcpService:H,trustStore:W,threadService:I,threadHistoryService:R,threadSyncService:g,planFileManager:S,threadStorage:P,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:x,fileSystem:Q.jetbrains||Q.ide?uE0:U5,terminal:i};return{...Y1,async asyncDispose(){if(Y1.mcpService.hasAuthenticatingClients())h.info("Waiting for OAuth authentication to complete before exit..."),await Y1.mcpService.waitForAuthentication();for(let n of D.values())n.dispose();await Y1.mcpService.dispose(),K(),await Y1.threadService.asyncDispose(),Y1.configService.unsubscribe(),q(),Y1.fuzzyServer.dispose(),Y1.threadSyncService.dispose(),Y1.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function nO8(J){if(!J.executeMode){if(!await PR1("Would you like to log in to Amp? [(y)es, (n)o]: "))return f5.write(`Login cancelled. Run the command again to retry.
|
|
4829
4829
|
`),!1}return await V$6(J)}async function V$6(J){let Q=hO8(32).toString("hex"),Y=await IR1(J.ampURL,Q),X=new AbortController;try{await BE(Y,X.signal)}catch(Z){h.error("Error opening browser",{error:Z})}let G=await IR1(J.ampURL,Q,!1);f5.write(`If your browser does not open automatically, visit:
|
|
4830
4830
|
|
|
@@ -4834,7 +4834,7 @@ ${f4.blue.bold(G)}
|
|
|
4834
4834
|
Login successful! You can now use the Amp CLI.
|
|
4835
4835
|
`),!0}catch(Z){return h.error("Login failed",{error:Z}),dZ.write(`
|
|
4836
4836
|
Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
4837
|
-
`),!1}}function aO8(){let J=new RA().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)vR(),process.exit(0);let z=H.originalError??H;$46(z)}),J.option("-V, --version","Print the version number and exit",()=>{f5.write(`0.0.
|
|
4837
|
+
`),!1}}function aO8(){let J=new RA().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)vR(),process.exit(0);let z=H.originalError??H;$46(z)}),J.option("-V, --version","Print the version number and exit",()=>{f5.write(`0.0.1764336207-gc6abaf (released 2025-11-28T13:28:43.087Z)
|
|
4838
4838
|
`),process.exit(0)}),J.addHelpText("after",K86()),J.configureHelp({formatHelp:W86}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await rQ(U);await tO8(D)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await rQ(U);await sO8(D,await FR1(U,D.settings))});let Q=async(H,z,U)=>{D$1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:X0.of([n0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:iy1,userConfigDir:q$6});let D={...z,executeMode:!1};await cy1(D,{...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(),D=await rQ(U);await G$6(U,D,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(),D=await rQ(U);await Zw8(U,D,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 D=U.optsWithGlobals(),M=await rQ(D);if(z.pick)dZ.write(`${f4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
4839
4839
|
`);if(z.last||H||M.executeMode)await Gw8(D,M,H,U);else await Q(D,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 D=U.optsWithGlobals(),M=await rQ(D);await Xw8(D,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(),D=await rQ(U);await G$6(U,D,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 D=U.optsWithGlobals(),M=await rQ(D);await Yw8(D,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,D)=>{let M=D.optsWithGlobals(),L=await rQ(M);await eO8(M,L,H,z,D)}),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 D=U.optsWithGlobals(),M=await rQ(D);await Jw8(D,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 D=U.optsWithGlobals(),M=await rQ(D);await Qw8(D,M,H,z,U)}),Z56(J,async(H,z)=>{let U=await rQ(z);xq(H,z);let D=await vq(U,z);return{context:U,mcpService:D.mcpService,toolService:D.toolService,toolServices:D.toolService,configService:D.configService,cleanupTerminal:vR,asyncDispose:D.asyncDispose.bind(D)}}),n86(J,async(H)=>{let z=H.optsWithGlobals();return await rQ(z)}),h86(J,async(H)=>{let z=await rQ(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{xq(U,H);let D=await vq(z,H);return{mcpService:D.mcpService,settings:z.settings,asyncDispose:D.asyncDispose.bind(D)}}}});function G(H,z,U){let M=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),L=new fB(z,M),A=lO8(H);if(A)L.default(A);if(L.hidden=dO8(H)||X$6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of Y$6)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 fB("-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 fB("-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 fB("--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 fB("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(K);let W=new fB("--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 fB("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return J.action(async(H,z)=>{let U=H,D=await rQ(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")f5.write(f4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
|
|
4840
4840
|
`)),process.exit(0);if(Object.keys(U).forEach((M)=>{let L=Y$6.find((A)=>A.name===M);if(L&&X$6(L)&&!cO8(L))dZ.write(f4.yellow(`Warning: '--${M}' flag is deprecated
|
|
@@ -4842,8 +4842,8 @@ Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
|
4842
4842
|
Or pipe via stdin: echo "your message" | amp --execute`);xq(Y,Q);let q=await vq(J,Q);$$6=q;let V=um(q),K=async(i)=>{let Y1=await Z$6(i,"utf-8"),n=JSON.parse(Y1);if(!S$(n.id))throw new j8(TZ.invalidThreadId);return Y51(q,{visibility:X,agentMode:Q.mode,thread:n})},W=async(i)=>{if(!S$(i))throw new j8(TZ.invalidThreadId);try{let[n,m]=await Promise.all([P5.getThreadLinkInfo({thread:i},{config:q.configService}),P5.getUserInfo({},{config:q.configService})]);if(n.ok&&m.ok){let s=n.result.creatorUserID,H1=m.result.id;if(s&&s!==H1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new j8(`Cannot resume thread created by another user.
|
|
4843
4843
|
|
|
4844
4844
|
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(n){if(n instanceof j8)throw n;h.warn("Failed to validate thread ownership in CLI, allowing to open",{error:n})}let Y1=await q.threadService.get(i)??void 0;return h.info(`[fetchAndStartThread] Loaded thread ${i}, agentMode: ${Y1?.agentMode??"undefined"}`),Y51(q,{visibility:X,agentMode:Y1?void 0:Q.mode,thread:Y1})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return Y51(q,{visibility:X})}catch(i){if(i instanceof j8)throw i;throw await Wg(i,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return Y51(q,{visibility:X})};if(Q.format==="jsonl")dZ.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
4845
|
-
`),await gA(),process.exit(1);if(J.executeMode&&Q.remote)await a86(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)m86(q.mcpService,J.settings),await O46(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let D=!1,M=!1;if(Q.jetbrains||Q.ide){await MD0();let i=FI({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let Y1=i[0];if(Y1)U2.selectConfig(Y1)}else D=!0}let L=R61("0.0.
|
|
4846
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await n46({...J,workspaceTrust:{current:!0,changes:n_},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 b86(J.mcpConfig);X=g86(X,Z)}let G=await X.get("url","global");if(!G)G=WY;if(!xF(G))h.info("Targeting custom Amp server",{ampURL:G});return X=MF0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:o86(await FR1(J,X))}}function oO8(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 rO8(){let J=oO8(process.argv);if(s66({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),uO8(h),h.info("Starting Amp CLI.",{version:"0.0.
|
|
4845
|
+
`),await gA(),process.exit(1);if(J.executeMode&&Q.remote)await a86(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)m86(q.mcpService,J.settings),await O46(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let D=!1,M=!1;if(Q.jetbrains||Q.ide){await MD0();let i=FI({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let Y1=i[0];if(Y1)U2.selectConfig(Y1)}else D=!0}let L=R61("0.0.1764336207-gc6abaf",q.settingsStorage),A=new W11(q.threadStorage),E=X0.of([n0.file(process.cwd())]),P=FZ1(void 0,E),I=new C61(q.mcpService,J.settings.getWorkspaceRootPath());if(G)U.handle({type:"user:message",message:{content:[{type:"text",text:G}]}});let R=(async()=>{try{let i=await P5.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)});if(i.ok)return h.info("User free tier status:",i),i.result}catch(i){h.error("Failed to fetch free tier status:",i)}})(),S=(async()=>{try{let i=await P5.getUserInfo({},{config:q.configService});if(i.ok)return i.result}catch(i){h.debug("Failed to fetch user workspace info:",i)}})(),[y,x]=await Promise.all([R,S]),g=x?.email,p=g&&(g.endsWith("@sourcegraph.com")||g.endsWith("@ampcode.com")||g==="auth-bypass-user@example.com");if(p)q.toolService.registerTool(ar0);let b=await t86();h.info("Loaded session state:",b),await Uk1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new H61,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:P5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:U2,connectedClientsService:new Yi,commandRegistry:P,mcpService:q.mcpService,mcpTrustHandler:I,showJetBrainsInstaller:M,showIdePicker:D,openThreadSwitcher:Q.openThreadSwitcher,updateService:L,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:b,freeTierStatus:y,workspace:x?.team??null,features:x?.features??[],isDogfooding:p||!1,threadDependencies:q}),await q.asyncDispose(),process.exit(0)}async function rQ(J){if(J.interactive)dZ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
4846
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await n46({...J,workspaceTrust:{current:!0,changes:n_},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 b86(J.mcpConfig);X=g86(X,Z)}let G=await X.get("url","global");if(!G)G=WY;if(!xF(G))h.info("Targeting custom Amp server",{ampURL:G});return X=MF0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:o86(await FR1(J,X))}}function oO8(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 rO8(){let J=oO8(process.argv);if(s66({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),uO8(h),h.info("Starting Amp CLI.",{version:"0.0.1764336207-gc6abaf",buildTimestamp:"2025-11-28T13:28:43.087Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new j8(TZ.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await aO8().parseAsync(process.argv)}WE1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await rO8().catch(Wg)});async function sO8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),f5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
4847
4847
|
`);else if(!xF(J.ampURL))f5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
4848
4848
|
`);let Y=process.env.AMP_API_KEY;if(Y)f5.write(`API key found in environment variable, storing...
|
|
4849
4849
|
`),await Q.set("apiKey",Y,J.ampURL),f5.write(`API key successfully stored.
|
|
@@ -4856,7 +4856,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
4856
4856
|
`);else f5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
4857
4857
|
`);process.exit(0)}async function eO8(J,Q,Y,X,G){xq(G,J);let Z=await vq(Q,J);try{let q=X51(Y);if(!q)G51(Y);let V=q,K=X.trim();if(K.length===0)pZ("Thread name cannot be empty");if(K.length>256)pZ("Thread name cannot exceed 256 characters");if(!(await oC(V,Z)).messages.length)pZ("Cannot rename an empty thread.");let H=um(Z);await(await N3.getOrCreateForThread(H,V)).handle({type:"title",value:K}),h.info("GOT HERE"),await Z.threadSyncService.sync(),h.info("GOT THERE"),f5.write(f4.green(`✓ Thread ${V} renamed to "${K}"
|
|
4858
4858
|
`)),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose();let V=`Failed to rename thread: ${q instanceof Error?q.message:String(q)}`;pZ(V)}}async function Jw8(J,Q,Y,X){xq(X,J);let G=await vq(Q,J);try{let Z=X51(Y);if(!Z)G51(Y);let V=await oC(Z,G),K=GR(V);f5.write(K+`
|
|
4859
|
-
`),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)}`;pZ(q)}}async function Qw8(J,Q,Y,X,G){xq(G,J);let Z=await vq(Q,J);try{let q=await ny1(Y),V=await oC(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,D=X.indicator!==!1,M=um(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await N3.getOrCreateForThread(M,L);await A.resume();let E=K11.fromWorker(A),P=new W11(Z.threadStorage),I=X0.of([n0.file(process.cwd())]),R=FZ1(void 0,I),S=new C61(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=R61("0.0.
|
|
4859
|
+
`),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)}`;pZ(q)}}async function Qw8(J,Q,Y,X,G){xq(G,J);let Z=await vq(Q,J);try{let q=await ny1(Y),V=await oC(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,D=X.indicator!==!1,M=um(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await N3.getOrCreateForThread(M,L);await A.resume();let E=K11.fromWorker(A),P=new W11(Z.threadStorage),I=X0.of([n0.file(process.cwd())]),R=FZ1(void 0,I),S=new C61(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=R61("0.0.1764336207-gc6abaf",Z.settingsStorage);await Uk1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new H61,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:P5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:U2,connectedClientsService:new Yi,commandRegistry:R,mcpService:Z.mcpService,mcpTrustHandler:S,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:V,typingEnabled:K,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D}}),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),await Wg(q,Y)}}async function Yw8(J,Q,Y,X,G){xq(X,J);let Z=await vq(Q,J);try{let q=X51(Y);if(!q)G51(Y);let V=q,K=await P5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=j61(J,W);if(!H&&!G)pZ("Must specify either --visibility or --support");if(H&&G)pZ("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)pZ(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,S61(H)),f5.write(f4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
|
|
4860
4860
|
`);if(G){await oC(V,Z);let z=typeof G==="string"?G:void 0;await BP0(Z.threadService,V,Z.configService,z),f5.write(f4.green("✓ ")+`Thread ${V} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
4861
4861
|
`)}await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),pZ(`Failed to update thread: ${q instanceof Error?q.message:String(q)}`)}}async function Xw8(J,Q,Y,X){xq(X,J);let G=await vq(Q,J),Z=um(G);try{let q=await ny1(Y),K=(await oC(q,G)).messages.length-1,W=await N3.getOrCreateForThread(Z,q),H=await ZR(W,G.threadSyncService,K);await Promise.all([G.threadSyncService.uploadThread(q),G.threadSyncService.uploadThread(H)]),await ly1(H),f5.write(`${H}
|
|
4862
4862
|
`),await G.asyncDispose(),process.exit(0)}catch(q){dZ.write(`Error forking thread: ${q instanceof Error?q.message:String(q)}
|