@sourcegraph/amp 0.0.1764071137-g09969f → 0.0.1764072094-g8a3bd1
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 +9 -9
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -4375,11 +4375,11 @@ Actual: ${G}`)}async function cX8(J,Q,Y){let{execSync:X}=await import("node:ch
|
|
|
4375
4375
|
${N}`;if(G==="pnpm"&&N.includes("Unable to find the global bin directory"))O+=`
|
|
4376
4376
|
|
|
4377
4377
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4378
|
-
npm install -g @sourcegraph/amp`;V(Error(O))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}H0();H0();async function P61(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=rX8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],O=V.time[K],M=Date.now();if(N)z=Math.floor((M-new Date(N).getTime())/3600000);if(O)U=Math.floor((M-new Date(O).getTime())/3600000)}return x.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 x.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function rX8(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}g0();function T61(J,Q){let Y=new b4,X=Y.pipe(p8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new qV().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 MU(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=kL(),W=await P61(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await I61();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 Xu(W.latestVersion,z);let U=await _B(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await MU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as LK}from"node:process";function A96(J){let Q=new OL().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 XR1(X.force||!1,X.verbose||!1,"0.0.
|
|
4378
|
+
npm install -g @sourcegraph/amp`;V(Error(O))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}H0();H0();async function P61(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=rX8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],O=V.time[K],M=Date.now();if(N)z=Math.floor((M-new Date(N).getTime())/3600000);if(O)U=Math.floor((M-new Date(O).getTime())/3600000)}return x.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 x.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function rX8(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}g0();function T61(J,Q){let Y=new b4,X=Y.pipe(p8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new qV().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 MU(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=kL(),W=await P61(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await I61();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 Xu(W.latestVersion,z);let U=await _B(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await MU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as LK}from"node:process";function A96(J){let Q=new OL().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 XR1(X.force||!1,X.verbose||!1,"0.0.1764072094-g8a3bd1"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new OL("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 oX8(X.targetVersion)});J.addCommand(Y)}async function oX8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")LK.write(C4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4379
4379
|
|
|
4380
4380
|
`));try{if(!J){LK.write(C4.blue(`Checking for updates...
|
|
4381
|
-
`));let Y=kL(),{hasUpdate:X,latestVersion:G}=await P61("0.0.
|
|
4382
|
-
`));let Z=await _B("0.0.
|
|
4381
|
+
`));let Y=kL(),{hasUpdate:X,latestVersion:G}=await P61("0.0.1764072094-g8a3bd1",Y);if(!X){LK.write(C4.green(`✓ Amp CLI is already up to date.
|
|
4382
|
+
`));let Z=await _B("0.0.1764072094-g8a3bd1");if(Z.warning)LK.write(`
|
|
4383
4383
|
`+C4.yellow(Z.warning)+`
|
|
4384
4384
|
`);process.exit(0)}if(!G)LK.write(C4.yellow("[WARN] could not find latest version")),process.exit(0);J=G}LK.write(C4.blue(`Updating to version ${J}...
|
|
4385
4385
|
`)),await Xu(J,void 0,(Y)=>{LK.write(C4.dim(`Running: ${Y}
|
|
@@ -5001,7 +5001,7 @@ exit code: ${Z}`,new U1({color:X.foreground,dim:!0,italic:!0})));if(q)V.push(new
|
|
|
5001
5001
|
`,O),...M],w=[new l1({text:new Q1("",void 0,L)})];if(W.url){let P=W.url.replace(/^https?:\/\//,"");w.push(new G4({children:[new l1({text:new Q1("See more: ",O)}),new f3({uri:W.url,text:P,style:new U1({color:Y.secondary,underline:!0})})]}))}let I=new l0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:w});return $8.child(new e0({constraints:new d6(40,120,0,1/0),child:new G4({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[new F4({flex:1,child:new YC1({width:40,height:40,agentMode:this.agentMode,...V&&{primaryColor:{r:100,g:20,b:20},secondaryColor:{r:255,g:60,b:70}},fps:q==="fast"?60:q==="slow"?15:0,...q==="disabled"&&{seed:42,t:3}})}),new N0({width:1}),new F4({flex:2,child:I})]})}))}}H0();V9();q4();V5();V9();g0();function wz8(J,Q){return`${J}:${Q}`}class jj1{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 J0((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new J0((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new J0((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(JO()).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=wz8(Q,q.toolUse.id);if(this.subthreadPatchSubs.has(V))continue;let K=this.threadService.observePatches(q.threadID).pipe(JO()).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 J0((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new J0((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new J0((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]=JL(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 Iz8(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=lJ(J.mainThread);G.isCompleted=dJ6(W,X.toolUse.id)}}let Z=Pz8(Y,G.agentState),q=G.agentState===Z?G:{...G,agentState:Z},V={...J.tools},K=XC(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=lJ(Y),q={...J.subagents};for(let z of X){let U=q[z.threadID];if(!U)continue;let N=dJ6(Z,z.toolUse.id);q[z.threadID]={...U,isCompleted:N}}let{items:V}=XC(Y),K=JL(Y,G),W=uw({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=JL(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function XC(J){let Q=[],Y=new Map,X=new Set;for(let[G,Z]of J.messages.entries()){let q=`${Z.role}-${G}`;switch(Z.role){case"assistant":{let V=Z.state.type==="streaming";for(let W of Z.content)if(W.type==="tool_use"){if(Y.set(W.id,W),V)X.add(W.id)}if(Z.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:q,message:Z});for(let W of Z.content)if(W.type==="tool_use"){let H=!1;for(let z=G+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let N of U.content)if(N.type==="tool_result"&&N.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:V?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:q,message:Z});break;case"user":{if(Z.content.some((K)=>K.type==="text"&&K.text.trim()||K.type==="image"))Q.push({type:"message",id:q,message:Z});for(let K of Z.content)if(K.type==="tool_result"){let W=Y.get(K.toolUseID)??V$(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})}break}}}return{items:Q}}function dJ6(J,Q){let Y=J.get(Q);return(Y&&Z7(Y.run))??!1}function Pz8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((G)=>G.type==="tool_result"&&G.run.status==="blocked-on-user"))return x.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(XC(J).items.some((G)=>G.type==="toolResult"&&G.toolResult.run.status==="in-progress")){let G=Q?.type==="running-tools"?Q.startTime:Date.now();return x.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 x.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return x.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let Z=Q?.type==="running-tools"?Q.startTime:Date.now();return x.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:Z,hasStartTime:!!Z}),{type:"running-tools",startTime:Z}}default:return x.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return x.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class _j1 extends Q6{props;constructor(J){super();this.props=J}createState(){return new cJ6}}class cJ6 extends J6{state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null};workerController;subscriptions=[];currentWorker;constructor(){super();this.workerController=null,this.currentWorker=null}initState(){let{threadService:J,worker:Q}=this.widget.props;this.workerController=new jj1(J),this.currentWorker=Q,this.setupSubscriptions(Q)}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)}dispatch(J){this.setState(()=>{this.state=Iz8(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===n5||Z===t8||Z===Cw||Z===TF||Z===RF||Z===Sw||Z===jw||Z===q$,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:fw(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)}}class kj1 extends Q6{props;constructor(J){super({key:J.key});this.props=J}createState(){return new lJ6}}class lJ6 extends J6{build(J){let Y=x6.of(J).colors,{todos:X,title:G="TODOs"}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new N0({width:0,height:0});let Z=X.map((q)=>this.buildTodoItem(q,Y));return new e0({child:new g6({padding:_0.symmetric(1,0),child:new l0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new l1({text:new Q1(G,new U1({bold:!0,color:Y.foreground}))}),...Z]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),X=J.status==="completed",G=new U1({bold:J.status==="in-progress",color:Q.foreground,dim:X}),Z=new U1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:X});return new G4({crossAxisAlignment:"start",children:[new l1({text:new Q1(Y,G)}),new N0({width:1}),new F4({child:new l1({text:new Q1(J.content,Z)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class yj1 extends T6{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=x6.of(J),Y=Q.colors.primary,X=Q.colors.foreground;return new e0({decoration:new P8(void 0,new i4(new S4(Y,1,"rounded"),new S4(Y,1,"rounded"),void 0,new S4(Y,1,"rounded"))),child:new g6({padding:_0.horizontal(1),child:new l0({children:[new G4({crossAxisAlignment:"start",children:[new F4({child:new l1({text:new Q1(this.ad.content,new U1({color:X}))})}),new N0({width:4}),new f3({uri:"https://ampcode.com/free",text:"Ad",style:new U1({color:X,dim:!0}),onError:(G)=>{}})]}),new G4({crossAxisAlignment:"start",children:[new UC1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:_0.horizontal(1),color:Y,reverse:!0}),new N0({width:2}),new l1({text:new Q1(this.ad.destinationUrlHostname,new U1({color:X,dim:!0}))})]})]})})})}}class vj1 extends Q6{props;constructor(J){super();this.props=J}createState(){return new iJ6(this.props.autofocus??!0)}}class iJ6 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=q8.sizeOf(J),X=Math.min(60,Y.width-4),G=Y.height-4,Z=[];if(this.widget.props.title)Z.push(new l1({text:new Q1(this.widget.props.title,new U1({bold:!0,color:M1.blue}))}),new N0({height:1}));if(this.widget.props.message)Z.push(new l1({text:new Q1(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)Z.push(new N0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new l1({text:new Q1("Enter to copy",new U1({dim:!0}))}));return q.push(new l1({text:new Q1("Escape to close",new U1({dim:!0}))})),Z.push(new G4({children:q.flatMap((V,K)=>K<q.length-1?[V,new N0({width:1}),new l1({text:new Q1("•",new U1({dim:!0}))}),new N0({width:1})]:[V]),mainAxisSize:"min"})),new $8({child:new e0({constraints:new d6(X,X,0,G),decoration:new P8(M1.default(),new i4(new S4(M1.blue,1,"rounded"),new S4(M1.blue,1,"rounded"),new S4(M1.blue,1,"rounded"),new S4(M1.blue,1,"rounded"))),padding:new _0(2,2,2,2),child:new a8({autofocus:this.autofocus,onKey:Q,child:new l0({children:Z,mainAxisSize:"min"})})})})}}class U81 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,U81.prototype)}}class B81 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,B81.prototype)}}function xj1(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})}yF();H0();import{spawn as Tz8}from"node:child_process";import{promises as Rz8}from"node:fs";function nJ6(J){return J.kind==="executable"}function aJ6(J){return J.kind==="markdown"}var Xz=50000,rJ6=300000;async function fj1(J,Q,Y,X={}){let{timeoutMs:G=rJ6,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(x.debug("Executing command",{commandName:J,filePath:V.filePath,args:Q}),aJ6(V))return await Cz8(V,Q);else if(nJ6(V))return await Sz8(V,Q,G,Z);else return{success:!1,output:"",error:"Unsupported command type"}}catch(V){return x.error("Failed to execute command",{commandName:J,error:V}),{success:!1,output:"",error:V instanceof Error?V.message:"Unknown error occurred"}}}async function Cz8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await Rz8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>Xz?Y.slice(0,Xz)+`
|
|
5002
5002
|
... (output truncated at ${Xz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function Sz8(J,Q,Y=rJ6,X){return new Promise((G)=>{let[Z,q]=jz8(J,Q);x.debug("Spawning command",{spawnCommand:Z,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Y});let V=EN0(X),K=!1,W=setTimeout(()=>{K=!0,V.abort(),x.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=Tz8(Z,q,{stdio:["pipe","pipe","pipe"],signal:V.signal,detached:!0}),z=[],U=[],N=0;H.stdout?.on("data",(O)=>{let M=O.toString();if(N+=M.length,N<=Xz)z.push(M);else{let L=Xz-(N-M.length);if(L>0)z.push(M.slice(0,L))}}),H.stderr?.on("data",(O)=>{let M=O.toString();if(N+=M.length,N<=Xz)U.push(M);else{let L=Xz-(N-M.length);if(L>0)U.push(M.slice(0,L))}}),H.on("close",(O)=>{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:O??void 0});return}let M=O===0||O===1,L=z.join(""),w=U.join(""),I=L;if(!M&&!L.trim()&&w.trim())I=w;else if(w.trim())I+=L?`
|
|
5003
5003
|
${w}`:w;if(N>Xz)I+=`
|
|
5004
|
-
... (output truncated at ${Xz} characters)`;G({success:M,output:I.trim(),error:!M?w.trim()||"Command failed":void 0,exitCode:O??void 0})}),H.on("error",(O)=>{clearTimeout(W);let M=O.message;if(K)M=`Command timed out after ${Y}ms`;else if(O.message.includes("operation was aborted")||O.name==="AbortError")M="The command was aborted";G({success:!1,output:z.join(""),error:M})})})}function jz8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return kz8(Y,X?[...X]:null,G,Q);else return _z8(Y,X?[...X]:null,G,Q)}function _z8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function kz8(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]}}H0();pZ();R5();SW();mZ();gZ();MV();zH();Ze();V5();L_();g0();var XQ6=q6(zU(),1);import{writeFile as QQ6}from"fs/promises";import YQ6 from"path";H0();mZ();class hj1{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.
|
|
5004
|
+
... (output truncated at ${Xz} characters)`;G({success:M,output:I.trim(),error:!M?w.trim()||"Command failed":void 0,exitCode:O??void 0})}),H.on("error",(O)=>{clearTimeout(W);let M=O.message;if(K)M=`Command timed out after ${Y}ms`;else if(O.message.includes("operation was aborted")||O.name==="AbortError")M="The command was aborted";G({success:!1,output:z.join(""),error:M})})})}function jz8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return kz8(Y,X?[...X]:null,G,Q);else return _z8(Y,X?[...X]:null,G,Q)}function _z8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function kz8(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]}}H0();pZ();R5();SW();mZ();gZ();MV();zH();Ze();V5();L_();g0();var XQ6=q6(zU(),1);import{writeFile as QQ6}from"fs/promises";import YQ6 from"path";H0();mZ();class hj1{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.1764072094-g8a3bd1"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Lo(Q,this.configService)}catch(Q){x.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class bj1 extends Q6{props;constructor(J){super();this.props=J}createState(){return new oJ6}}class oJ6 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 sJ6 extends J6{controller=new PG;focusNode=new u8({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Q=x6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=i4.all(new S4(Y.foreground,1,"solid")),K=new pL({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(N)=>{let O=N.trim();if(G&&O.length===0)return;this.widget.props.onSubmit(O)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new G4({children:[new e0({decoration:{color:M1.default()},child:new l1({text:new Q1(">",new U1({color:Y.foreground}))})}),new F4({child:K})]}),H=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1("",void 0,[new Q1("Command: ",new U1({color:Y.foreground})),new Q1(this.widget.props.commandName,new U1({color:M1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new Q1("Enter",new U1({color:X.keybind}))),z.push(new Q1(" to submit, ",new U1({color:Y.foreground,dim:!0})));z.push(new Q1("Esc",new U1({color:X.keybind}))),z.push(new Q1(" to cancel",new U1({color:Y.foreground,dim:!0})));let U=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1("",void 0,z)})});return new e0({decoration:{border:V,color:M1.default()},padding:_0.all(1),child:new l0({children:[H,new N0({height:1}),W,new g5,U]})})}}class N81 extends Q6{props;constructor(J){super();this.props=J}createState(){return new sJ6}}MV();class tJ6 extends J6{controller=new PG;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new u8({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>=xF)return!1;let Q=mR(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=x6.of(J),{colors:Y,app:X}=Q,Z=q8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new $A({controller:this.controller,triggers:[new nB],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(N)=>{this.widget.props.onSubmit(N.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:N9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new a8({focusNode:this.focusNode,child:V}),W=new e0({constraints:new d6({maxHeight:q}),padding:_0.symmetric(1,0),child:K}),H=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1("",void 0,[new Q1("Command: ",new U1({color:Y.foreground})),new Q1(this.widget.props.commandName,new U1({color:M1.yellow,bold:!0}))])})}),z=new e0({padding:_0.symmetric(1,0),child:new l1({text:this.isConfirmingClearInput?new Q1("",void 0,[new Q1("Esc",new U1({color:X.keybind})),new Q1(" again to clear input",new U1({color:Y.foreground,dim:!0}))]):new Q1("",void 0,[new Q1("Press ",new U1({color:Y.foreground,dim:!0})),new Q1("Enter",new U1({color:X.keybind})),new Q1(" to submit, ",new U1({color:Y.foreground,dim:!0})),new Q1("Esc",new U1({color:X.keybind})),new Q1(" to clear",new U1({color:Y.foreground,dim:!0}))])})}),U=[H,new N0({height:1}),new F4({child:W}),new N0({height:1}),z];return new e0({decoration:{border:i4.all(new S4(Y.foreground,1,"solid")),color:M1.default()},padding:_0.all(1),child:new l0({children:U})})}}class XA extends Q6{props;constructor(J){super();this.props=J}createState(){return new tJ6}}class uj1 extends T6{props;constructor(J){super();this.props=J}build(){return new $8({child:new l1({text:new Q1("",void 0,[new Q1(`Forked to new thread:
|
|
5005
5005
|
|
|
5006
5006
|
`,new U1({color:M1.white,dim:!0})),new Q1(`"${this.props.newThreadTitle||"Untitled"}"`,new U1({color:M1.white}))]),textAlign:"center"})})}}class Gz extends Q6{props;constructor(J){super();this.props=J}createState(){return new eJ6}}class eJ6 extends J6{_spinner=new SK;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(J){let Q=x6.of(J),{colors:Y}=Q,X=i4.all(new S4(Y.foreground,1,"solid")),G=this._spinner.toBraille(),Z=new l1({textAlign:"center",text:new Q1("",void 0,[new Q1(G,new U1({color:M1.yellow})),new Q1(" ",void 0),new Q1(this.widget.props.message,new U1({color:Y.foreground}))])}),V=[new F4({child:new l0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)V.push(new N0({height:2,child:new e0({padding:_0.symmetric(2,0),child:new l1({text:new Q1("",new U1({dim:!0}),[new Q1("Press ",new U1({color:Y.foreground})),new Q1("Esc",new U1({color:Y.info})),new Q1(" to cancel",new U1({color:Y.foreground}))])})})}));let K=new e0({decoration:new P8(M1.default(),X),child:new N0({width:60,height:7,child:new l0({mainAxisAlignment:"start",children:V})})});if(this.widget.props.onAbort)return new a8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:K});return K}}class Zz extends Q6{props;constructor(J){super();this.props=J}createState(){return new JQ6}}class JQ6 extends J6{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof PK}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=E41(Q);return{title:W.title,type:W.type,description:W.description}})(),X=Y.type==="error"?M1.red:M1.yellow,G=i4.all(new S4(M1.default(),1,"solid")),Z=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1(Y.title,new U1({color:X,bold:!0}))})}),q=this.isWidgetMessage(Q)?Q.widget:new l1({text:new Q1(Y.description,new U1({color:M1.default()})),selectable:!0}),V=new F4({child:new uL({child:new e0({padding:_0.symmetric(1,0),child:q})})}),K=new e0({padding:_0.symmetric(1,0),child:new l1({text:this.widget.props.onRetry?new Q1("",void 0,[new Q1("Press ",new U1({color:M1.default(),dim:!0})),new Q1("R",new U1({color:M1.yellow})),new Q1(" to retry, ",new U1({color:M1.default(),dim:!0})),new Q1("Esc",new U1({color:M1.yellow})),new Q1(" to cancel",new U1({color:M1.default(),dim:!0}))]):new Q1("Press any key to close",new U1({color:M1.default(),dim:!0,italic:!0}))})});return new a8({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 e0({decoration:{border:G,color:M1.default()},padding:_0.all(1),child:new l0({mainAxisAlignment:"center",children:[Z,new N0({height:1}),V,K]})})})}}class gj1 extends T6{build(){return new $8({child:new l1({text:new Q1("",void 0,[new Q1(`✓ Thread Shared
|
|
5007
5007
|
|
|
@@ -5087,7 +5087,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
5087
5087
|
`)?`${V}...`:G,W=new U1({color:M1.index(8)}),H=[new Q1(K,W)];if(q>0){let z=new U1({color:Y.success});for(let U=1;U<=q;U++)H.push(new Q1(" ")),H.push(new Q1(`[${U}]`,z))}return new g6({padding:_0.only({bottom:0}),child:new G4({crossAxisAlignment:"start",children:[new g6({padding:_0.only({right:1}),child:new l1({text:new Q1("•",new U1({color:M1.index(8)}))})}),new F4({child:new l1({text:new Q1("",void 0,H)})})]})})}}class N_1 extends Q6{createState(){return new oQ6}}class oQ6 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 U1({color:M1.red}),Y=new U1({color:this._visible?M1.red:M1.transparent()});return new G4({children:[new l1({text:new Q1("⏺",Y)}),new N0({width:1}),new l1({text:new Q1("Replay",Q)})]})}}function pF8(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 D_1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{return{ok:!0,threads:(await new Promise((G)=>{let Z=this.threadHistoryService.observeThreadList().subscribe((q)=>{Z.unsubscribe(),G(q)})})).filter((G)=>{if(!J.trim())return!0;let Z=G.title?.toLowerCase()||"untitled",q=G.id.toLowerCase(),V=J.toLowerCase();return Z.includes(V)||q.includes(V)}).map((G)=>{let Z=new Date(G.userLastInteractedAt),q=pF8(Z),V=G.id.slice(-8),K=G.env?.initial.trees?.[0]?.uri;return{id:G.id,title:G.title||"Untitled",updatedAt:new Date(G.userLastInteractedAt).toISOString(),description:{timeAgo:q,title:G.title||"Untitled",shortThreadID:V},diffStats:G.summaryStats?.diffStats,workspaceURI:K,parentRelationships:G.parentRelationships}})}}catch(Q){return{ok:!1,errorMsg:Q instanceof Error?Q.message:"An unexpected error occurred"}}}}H0();V9();class O_1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new x3;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){x.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){x.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(JO()).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 sQ6(J,Q){switch(J){case"update-available":return[new Q1("A newer Amp is available. Run ",new U1({color:Q.foreground,dim:!0})),new Q1("amp update",new U1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new Q1("Update complete, run ",new U1({color:Q.foreground,dim:!0})),new Q1("amp update",new U1({color:Q.warning})),new Q1(" to see warnings",new U1({color:Q.foreground,dim:!0}))];case"update-error":return[new Q1("Update failed, run ",new U1({color:Q.foreground,dim:!0})),new Q1("amp update",new U1({color:Q.warning})),new Q1(" to see warnings",new U1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function nF8(J){return new Promise((Q)=>{cF8("git",["branch","--show-current"],{cwd:J},(Y,X)=>{if(Y){Q(null);return}let G=X.trim();Q(G||null)})})}class QY6 extends Q6{dependencies;constructor(J){super();this.dependencies=J}createState(){return new YY6}}class YY6 extends J6{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;copyMessageTimer=null;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;threadsForPicker=[];isLoadingThreads=!1;threadPreviewController=new O_1;previewThread=null;planScrollController=(()=>{let J=new x3;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new x3;return J.followMode=!1,J})();showingSelectionCopiedHint=!1;isShowingStandaloneThreadPicker=!1;filterThreadPickerByWorkspace=!0;agentModePulseSeq=0;currentGitBranch=null;messageViewFocusNode=new u8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new u8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showingCannotToggleMessage=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;adActionModal=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;pendingMCPServers=[];mcpTrustSubscription=null;agentModeSubscription=null;currentAgentMode="smart";hasToggledAgentMode=!1;inMemoryAgentModeOverride=null;cachedVisibleModes=KG();freeTierStatus=void 0;tryOpus=!1;updateState="hidden";updateServiceSubscription=null;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=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}),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(`
|
|
5088
5088
|
`);if(W)await this.replayTypeMessage(W,X)}if(q.role==="assistant"){let W=q.content.some((U)=>U.type==="tool_use"),H=G[Z+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...q,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let N=J.thread.id;this.getMessageScrollController(N).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),q]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,q],this.textController.clear()});let V=J.thread.id;this.getMessageScrollController(V).scrollToBottom()}await this.replaySleep(J.exitDelayMs),N9.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 a61(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 Q1(this.submitDisabledHint,new U1({color:J.foreground,dim:!0}));if(this.isExiting)return new Q1("Exiting...",new U1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new Q1("",void 0,[new Q1("Ctrl+C",new U1({color:Q.keybind})),new Q1(" again to exit",new U1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new Q1("",void 0,[new Q1("Esc",new U1({color:Q.keybind})),new Q1(" again to clear input",new U1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new Q1("",void 0,[new Q1("Escape",new U1({color:Q.keybind})),new Q1(" to close help",new U1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let G=this.getEffectiveAgentMode(),Z=E_1(G,this.tryOpus);return new Q1("",void 0,[new Q1("Images aren't supported in ",new U1({color:J.warning,dim:!1})),new Q1(G,new U1({color:Z})),new Q1(" mode.",new U1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new Q1("",void 0,[new Q1("Esc",new U1({color:Q.keybind})),new Q1(" again to cancel",new U1({color:J.foreground,dim:!0}))]);return new Q1("",void 0,[new Q1("Esc",new U1({color:Q.keybind})),new Q1(" to cancel",new U1({color:J.foreground,dim:!0}))])}if(this.showingSelectionCopiedHint)return new Q1("Selection copied to clipboard",new U1({color:J.foreground,dim:!0}));if(this.showingCannotToggleMessage)return new Q1(this.showingCannotToggleMessage,new U1({color:J.warning,dim:!1}));let Y=sQ6(this.updateState,J);if(Y)return new Q1("",void 0,Y);let X=this.widget.dependencies.worker.thread;if(X.agentMode==="plan"&&xL(X))return new Q1("",void 0,[new Q1("Ctrl+O",new U1({color:Q.keybind})),new Q1(" → Execute Plan",new U1({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){x.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 Z3.getOrCreateForThread(Y,G),V=await HR(q,X,Z-1);await this.switchToExistingThread(V)}catch(q){x.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=uB(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){x.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){x.error("Failed to edit message:",q)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(a3)}catch(Y){return x.error("Failed to get affected files:",Y),[]}};textController=new PG;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new x3);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=()=>{if(this.copyMessageTimer)clearTimeout(this.copyMessageTimer);this.setState(()=>{this.showingSelectionCopiedHint=!0}),this.copyMessageTimer=setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1}),this.copyMessageTimer=null},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(MR1(X))}}_handleTextCopy(J){if(J&&J.length>0){if(this.setState(()=>{this.showingSelectionCopiedHint=!0}),this.copyMessageTimer)clearTimeout(this.copyMessageTimer);this.copyMessageTimer=setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1}),this.copyMessageTimer=null},2000)}}textFieldKey=new p2("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=uB(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}),B9.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}),B9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingStandaloneThreadPicker)this.autocompleteFocusNode.requestFocus()})}catch(Q){x.error("Failed to switch thread:",Q),this.showErrorMessage(`Failed to switch thread: ${Q}`)}};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(){if(this.setState(()=>{this.isShowingPalette=!this.isShowingPalette}),this.isShowingPalette)this.loadThreadsForPicker()}getPaletteCommands(){if(!this.paletteCommands)this.paletteCommands=new pj1(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 lj1(this.widget.dependencies.fuzzyServer,this.widget.dependencies.threadFuzzyIndexer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1})};getCommandPaletteContext=()=>{let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return null;let Q=p0.file(process.cwd()),Y=F6(Q);return{worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:J.mainThread,ampURL:this.widget.dependencies.ampURL,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let X=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),X},setImageAttachments:(X)=>{this.setState(()=>{this.imageAttachments=X})},editorDispatch:(X)=>{switch(X.type){case"set-input":this.textController.clear(),this.textController.insertText(X.input);break;case"insert-text":this.textController.insertText(X.text);break;case"clear":this.textController.clear();break}},submitMessage:(X)=>{return this.proceedWithUserMessage(X)},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(X)=>{return await this.switchToExistingThread(X),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),this.widget.dependencies.worker},generateHandoffPrompt:async(X,G,Z)=>{let q=this.widget.dependencies.threadState.mainThread?.id;if(!q)throw Error("No active thread");let V=setTimeout(()=>{Z.throwIfAborted()},60000);try{let K=await this.widget.dependencies.threadService.generateHandoffPrompt(q,X,G,this.widget.dependencies.configService,Z);return clearTimeout(V),K}catch(K){throw clearTimeout(V),K}},handleHandoff:async(X,G)=>{let{goal:Z,generatedPrompt:q,images:V}=G;if(!Z&&!q)return{ok:!1,error:Error("Either goal or generatedPrompt required")};try{let K=this.widget.dependencies.threadState.mainThread?.id;if(!K)return{ok:!1,error:Error("No active thread")};let W=setTimeout(()=>X.abort(new U81("Handoff took too long and was aborted (timeout: 60s)")),60000);try{let H=await this.widget.dependencies.threadService.createHandoffThread(K,{goal:Z,generatedPrompt:q,images:V},this.widget.dependencies.configService,X.signal);return clearTimeout(W),await this.switchToExistingThread(H),{ok:!0}}catch(H){if(clearTimeout(W),H instanceof Error&&(H.name==="AbortError"||H.message.includes("aborted")))throw X.signal.reason;throw H}}catch(K){return x.error("Failed to create handoff thread",K),{ok:!1,error:K instanceof Error?K:Error(String(K))}}},getGuidanceFiles:async(X)=>{if(!J.mainThread)return[];return(await jr({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},J.mainThread,X)).map((Z)=>({uri:Z.uri,type:Z.type}))},openIdePicker:()=>{this.openIdePicker()},getInMemoryAgentModeOverride:()=>{return this.inMemoryAgentModeOverride},setInMemoryAgentModeOverride:(X)=>{this.setState(()=>{this.inMemoryAgentModeOverride=X,this.hasToggledAgentMode=!0})},toggleAgentMode:this.toggleAgentMode,getEffectiveAgentMode:()=>this.getEffectiveAgentMode(),getEditorText:()=>this.textController.text,workspace:this.widget.dependencies.workspace??null,handleExecutePlan:async()=>{try{let X=J.mainThread?.id;if(!X){this.setState(()=>{this.displayMessage=Error("No active thread")});return}let G=await this.widget.dependencies.threadService.createPlanExecutionThread(X,"smart");await this.switchToExistingThread(G)}catch(X){x.error("Failed to execute plan",X),this.setState(()=>{this.displayMessage=Error(`Failed to execute plan: ${X instanceof Error?X.message:String(X)}`)})}},planFileManager:this.widget.dependencies.planFileManager,completionBuilder:this.getCompletionBuilder(),threads:this.threadsForPicker,previewController:this.threadPreviewController,isLoadingThreads:this.isLoadingThreads,filterByWorkspace:this.filterThreadPickerByWorkspace,currentWorkspace:Y,threadViewStates:this.widget.dependencies.workerController.threadViewStates}};async loadThreadsForPicker(){if(this.isLoadingThreads)return;this.setState(()=>{this.isLoadingThreads=!0});try{let Q=await new D_1(this.widget.dependencies.threadHistoryService).fetchThreadSummaries();if(Q.ok)this.setState(()=>{this.threadsForPicker=Q.threads})}finally{this.setState(()=>{this.isLoadingThreads=!1})}}updateGitBranch=async()=>{let J=await nF8(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===bB).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===bB};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(OZ(J.thread)>0)return;if(this.freeTierStatus?.canUseAmpFree){let X=this.getEffectiveAgentMode(),G=Qb(X,this.cachedVisibleModes);if(G!==X)this.setState(()=>{this.hasToggledAgentMode=!0,this.inMemoryAgentModeOverride=G,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1});return}let Q=this.getEffectiveAgentMode(),Y=Qb(Q,this.cachedVisibleModes);if(Y===Q)return;if(this.setState(()=>{this.hasToggledAgentMode=!0,this.inMemoryAgentModeOverride=Y,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1}),K5(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(!Rh(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>=xF)return!1;let Y=mR(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 sH(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")x.error("Failed to read temporary file",H)}try{await X(W),await G(K)}catch(H){x.warn("Failed to clean up temporary file",H)}}catch(K){x.error("Error opening editor:",K)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=uB(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(d$.getInstance().interceptConsole(),this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();N9.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),N9.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),N9.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{B9.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),this.freeTierStatus=this.widget.dependencies.freeTierStatus,H6(this.widget.dependencies.configService.config).then((Y)=>{let X=a61(this.widget.dependencies.worker.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,Y.settings);if(x.info(`[initState] Resolved agentMode: ${X}`),this.widget.dependencies.sessionState?.agentMode)this.setState(()=>{this.inMemoryAgentModeOverride=X})}),this.updateGitBranch(),this.adSubscription=uR1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{return(this.inMemoryAgentModeOverride&&K5(this.inMemoryAgentModeOverride)||this.randomAd===null)&&bR1(this.lastUserInteractionTime)}).subscribe({next:(Y)=>{if(Y){let X=lF8(16).toString("hex");this.lastAdImpressionId=X,Promise.resolve().then(() => (x81(),v81)).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}),B9.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){x.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}]}}),x.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),x.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=KG(Y.settings,this.freeTierStatus?.canUseAmpFree);this.setState(()=>{this.cachedVisibleModes=X,this.tryOpus=Y.settings.tryOpus??!1})}),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)}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.threadPreviewController.removeListener(this.previewControllerListener),this.threadPreviewController.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(MR1("")),this.shouldUseProgressBar())process.stdout.write(W56())}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"){x.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){x.error("No tool use block found in confirmation");return}if(J==="allow-all-session")jX("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 x.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();try{await mJ(G)}catch(Z){x.error("Failed to open settings page:",Z),await this.showErrorMessage(`Cannot open browser. Please go to ${G} to connect to GitHub`)}return}if(J==="disable-librarian"){let G=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!G.includes(q$))await this.widget.dependencies.settingsStorage.set("tools.disable",[...G,q$],"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 Z3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(G);else await this.widget.dependencies.worker.handle(G)}catch(G){x.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}),_61({agentMode:"smart"}),await this.startAndSwitchToNewThread();break}}this.setState(()=>{})};handleDisplayMessageDismiss=()=>{this.setState(()=>{this.displayMessage=null})};handleMCPTrustOpenSettings=async()=>{let{mcpTrustHandler:J,settingsStorage:Q}=this.widget.dependencies;await J.deny();try{await sH(Q.getSettingsFilePath())}catch(Y){let X=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${X}`)}};cancelStreamingMessage=async()=>{await Z3.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let 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{x.info(`[switchToExistingThread] Switching to thread: ${J}`);let X=await this.widget.dependencies.switchToThread(J);x.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${X.thread.agentMode}`);let G=await this.widget.dependencies.configService.getLatest(),Z=a61(X.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,G.settings);if(x.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(()=>{x.info("[switchToExistingThread] Clearing inMemoryAgentModeOverride"),this.inMemoryAgentModeOverride=null}),X.thread.draft)if(x.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(`
|
|
5089
5089
|
`);if(K)this.textController.insertText(K);if(V.length>0)this.setState(()=>{this.imageAttachments=V})}}catch(X){throw x.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=OZ(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)_61({agentMode:X});this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]}),B9.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();_61({agentMode:Q}).catch((Y)=>{x.warn("Failed to save session state on exit:",Y)}).finally(()=>{N9.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=iF8();if(J===Q)return"~";if(J.startsWith(Q+su.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(su.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(su.sep),"…",Q.slice(-2).join(su.sep)].join(su.sep)}build(J){let Q=q8.of(J),Y=x6.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&&K5(q.thread.agentMode)&&this.randomAd!==null,{threadState:K}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let W=this.getCurrentConfirmation(),H=this.widget.dependencies.replayMode,z=Boolean(H),U=K.items,N=K.mainThread||void 0,O=K.subagentToolsByParentID,M=K.todosList;if(z){let G6={...H.thread,messages:this.replayDisplayedMessages};U=XC(G6).items,N=G6,O={};let o6=uw({messages:this.replayDisplayedMessages});M=Array.isArray(o6)?o6:[]}let L=N?.id,w=N,I=z?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),P=(G6)=>new H81({key:new p2(`preview-message-view-${G6.id}`),items:XC(G6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:G6,focusNode:new u8({debugLabel:"PreviewFocus"})}),R=this.previewThread,j=R?R.messages.length>2000?new l0({mainAxisSize:"max",children:[new F4({child:new N0}),new g6({padding:_0.all(2),child:new $8({child:new l1({text:new Q1("Thread too long for preview",new U1({color:G.mutedForeground,dim:!0}))})})})]}):P(R):I?new F81({agentMode:this.getEffectiveAgentMode(),tryOpus:this.tryOpus}):new H81({key:L?new p2(`message-view-${L}`):void 0,items:U,subagentToolsByParentID:O,controller:L?this.getMessageScrollController(L):new x3,autofocus:!1,onCopy:z?void 0:this._handleTextCopy.bind(this),thread:w,onMessageEditSubmit:z?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:z?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:z?void 0:this.forkMessage,getAffectedFiles:z?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),y=Math.max(Math.floor(Q.size.height*0.4),12),f=this.getCurrentEphemeralError(),g=this.buildBottomWidget(f,W,G,Y,K,M,y,V?this.randomAd:null,z),p=Q.size.width<40,b=K.mainThread?rF0(K.mainThread):void 0,i=new R41({threadViewState:K.viewState,threadTokenUsage:b,threadID:L??null,thread:K.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:p,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!W,showingEphemeralError:Boolean(K.viewState.state==="active"&&K.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),J1=new T41({bashInvocations:this.bashInvocations}),n=[],m=this.getEffectiveAgentMode(),s=this.currentShellModeStatus,q1=E_1(m,this.tryOpus),W1=!s?m.length+1:0,r=Q.capabilities.animationSupport,o=r==="disabled"?0:r==="slow"?30:60,l=KK(m)?.uiHints?.fasterAnimation?3:1,z1=o>0&&this.agentModePulseSeq>0?new t5({children:[g,new v3({top:0,left:1,right:1,height:1,child:new F_1({color:q1,trigger:this.agentModePulseSeq,fps:o,speed:l,leftOffset:W1})})]}):g;n.push(new F4({child:j}),J1);let j1=new t5({children:[new l0({mainAxisSize:"min",children:[V?new yj1({ad:this.randomAd,onButtonClick:async()=>{let G6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (x81(),v81)).then(({recordAdEvent:o6})=>{let h4=this.widget.dependencies.worker.thread,s4=h4.messages[h4.messages.length-1];o6("clicked",{adId:G6.id,advertiserId:G6.advertiserId,threadId:h4.id,messageId:s4?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:G6.metadata?.matchType,matchedPatterns:G6.metadata?.matchedPatterns,candidateAdPoolCount:G6.metadata?.candidateAdPoolCount,clientRegion:G6.metadata?.clientRegion})});try{await mJ(G6.shortDestinationUrl)}catch(o6){let s4=N9.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:s4,url:G6.shortDestinationUrl}})}}}):new N0({height:0}),new e0({constraints:new d6(0,Q.size.width,0,y),child:z1})]}),V?new v3({top:0,left:0,right:0,child:new GY6({userHeight:this.bottomGridUserHeight,maxHeight:y,onInitializeHeight:(G6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(G6,y)})},onDrag:(G6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(G6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let o6=Math.floor(G6.localPosition.y)-this.bottomGridDragStartY,h4=Math.max(4,this.bottomGridDragStartHeight-o6),s4=Math.min(h4,y),d5=Math.floor(s4);if(this.bottomGridUserHeight!==d5)this.setState(()=>{this.bottomGridUserHeight=d5})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new N0({height:0})]});n.push(j1,new N0({height:1,child:new g6({padding:_0.horizontal(1),child:i})}));let t=new l0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:n}),y1=z?new t5({children:[t,new v3({top:0,left:0,child:new N_1})]}):t,R1=new n8(()=>{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((o6)=>{x.error("Failed to mark message as interrupted:",o6)}),this.cancelStreamingMessage().catch((o6)=>{x.error("Failed to cancel streaming message:",o6)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return x.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),D0=new n8(()=>{return this.onExitPressed(),"handled"}),T1=new n8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),a1=new n8(()=>{return NJ.instance.toggleAll(),"handled"}),F1=new n8(()=>{return this.widget.dependencies.configService.getLatest().then((G6)=>{jX("internal.showCost",!(G6.settings["internal.showCost"]??!0))}),"handled"}),Y1=new n8(()=>{return N9.instance.toggleFrameStatsOverlay(),"handled"}),O1=new n8(()=>{return N9.instance.tuiInstance.getScreen().markForRefresh(),B9.instance.requestFrame(),"handled"}),L1=new n8(()=>{return this.toggleAgentMode(),"handled"}),E1=new n8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:h4}=this.widget.dependencies,s4=h4.mainThread?.id;return s4?this.getMessageScrollController(s4):null})();if(o6){let h4=Math.max(Math.floor(Q.size.height*0.4),10),s4=Q.size.height-h4;o6.animatePageUp(s4,100)}return"handled"}),A1=new n8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:h4}=this.widget.dependencies,s4=h4.mainThread?.id;return s4?this.getMessageScrollController(s4):null})();if(o6){let h4=Math.max(Math.floor(Q.size.height*0.4),10),s4=Q.size.height-h4;o6.animatePageDown(s4,100)}return"handled"}),u1=new n8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:h4}=this.widget.dependencies,s4=h4.mainThread?.id;return s4?this.getMessageScrollController(s4):null})();if(o6)o6.animateTo(0,100);return"handled"}),v1=new n8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:h4}=this.widget.dependencies,s4=h4.mainThread?.id;return s4?this.getMessageScrollController(s4):null})();if(o6)o6.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),n1=new n8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:G6}=this.widget.dependencies;if(!G6.mainThread?.messages.some((h4)=>h4.role==="user"||bw(h4)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),$0=new n8((G6)=>{if(G6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),Q0=new n8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return A41().then(async(G6)=>{if(G6)try{this.handleInsertImage(G6)}finally{try{let{unlink:o6}=await import("node:fs/promises");await o6(G6)}catch{}}}),"handled"}),A0=new Map([[K4.ctrl("c"),new Pu],[K4.ctrl("l"),new ju],[K4.ctrl("o"),new H41],[K4.ctrl("v"),new wu],[K4.alt("s"),new dR],[K4.ctrl("s"),new dR],[K4.alt("p"),new Su],[K4.ctrl("r"),new Ru],[K4.alt("d"),new Cu],[K4.ctrl("t"),new _u],[K4.key("PageUp"),new q41],[K4.key("PageDown"),new V41],[K4.key("Home"),new K41],[K4.key("End"),new W41],[K4.key("Escape"),new Iu],[K4.ctrl("p"),new cR("previous")],[K4.ctrl("n"),new cR("next")],[K4.key("Tab"),new ku]]);if(!u7())A0.set(K4.key("ArrowUp"),new ku);if(!1)A0.set(K4.alt("c"),new Tu);let U6=new n8(()=>{if(this.isShowingStandaloneThreadPicker)return"handled";return this.showCommandPalette(),"handled"}),B4=new n8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),f4=new Map([[Iu,R1],[ju,O1],[dR,L1],[H41,U6],[wu,Q0],[Tu,T1],[Ru,a1],[Cu,F1],[Su,Y1],[_u,B4],[Pu,D0],[q41,E1],[V41,A1],[K41,u1],[W41,v1],[ku,n1],[cR,$0]]),V8=[y1];if(this.isShowingConsoleOverlay)V8.push(new aj1);if(this.isShowingHelp){let G6=this.getPaletteCommands().getAllCommands();V8.push(new sj1({commands:G6}))}if(this.adActionModal)V8.push(new vj1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(G6)=>{let o6=this.adActionModal.url;if(G6==="copy")try{await N9.instance.tuiInstance.clipboard.writeText(o6),this.setState(()=>{this.displayMessage=new a$("Link copied to clipboard")})}catch(h4){x.error("Failed to copy to clipboard",{error:h4}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:G6}=this.widget.dependencies;V8.push(new U_1({servers:this.pendingMCPServers,onAlwaysTrust:G6.trustAlways.bind(G6),onTrustOnce:G6.trustOnce.bind(G6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:G6.deny.bind(G6)}))}if(this.isShowingFileChangesOverlay)V8.push(new xC1({threadData:K}));if(this.isShowingCostBreakdownOverlay&&K.mainThread)V8.push(new rj1({thread:K.mainThread}));if(this.isShowingConfirmationOverlay)V8.push(new ij1({details:this.confirmationOverlayContent}));let M0=this.getCommandPaletteContext();if(M0&&this.isShowingPalette)V8.push(new $8({child:new e0({constraints:d6.loose(80,20),child:new cj1({commandContext:M0,mainThread:K.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette})})}));if(this.isShowingIdePicker)V8.push(new ej1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));if(this.isShowingStandaloneThreadPicker){let G6=p0.file(process.cwd()),o6=F6(G6);V8.push(new $8({child:new e0({constraints:d6.loose(80,20),child:new rR({threads:this.threadsForPicker,title:"Continue Thread",onSelect:this.handleStandaloneThreadSelect,onDismiss:this.dismissStandaloneThreadPicker,previewController:this.threadPreviewController,isLoading:this.isLoadingThreads,currentWorkspaceURI:o6,filterByWorkspace:this.filterThreadPickerByWorkspace,threadViewStates:this.widget.dependencies.workerController.threadViewStates})})}))}let x0=new t5({children:V8});if(this.isShowingJetBrainsInstaller)return new mL({child:new xQ({actions:f4,child:new Fq({shortcuts:A0,debugLabel:"jetbrains-installer-shortcuts",child:new z_1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});let c6=new gB({onError:(G6)=>{this.showErrorMessage(G6.message)},child:x0});return new mL({child:new xQ({actions:f4,child:new Fq({shortcuts:A0,debugLabel:"main-app-shortcuts",child:c6})})})}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 oj1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new nj1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new B_1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let W=X.app,H=P41(X),z=this.isInRestrictedFreeMode(),U=new $A({key:this.textFieldKey,controller:this.textController,triggers:K?[]:[new nB],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":z?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!z&&!this.isShowingStandaloneThreadPicker,shellPromptRules:H,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandaloneThreadPicker&&!this.isShowingIdePicker,clipboard:N9.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage}),N=G.mainThread?.queuedMessages??[],O=Array.isArray(Z)&&Z.length>0,M=Array.isArray(N)&&N.length>0,L=G.mainThread?.agentMode==="plan"&&xL(G.mainThread),w,I;if(L){if(w=new XC1(new z81({thread:G.mainThread,onExecute:async()=>{let b=this.getCommandPaletteContext();if(b)await this.getPaletteCommands().execute("execute-plan",b,void 0,new AbortController)},onEdit:async()=>{try{let b=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:i}=await this.widget.dependencies.planFileManager.ensureSync(G.mainThread.id);N9.instance.tuiInstance.suspend();let{execSync:J1}=await import("child_process");J1(`${b} "${i}"`,{stdio:"inherit"}),N9.instance.tuiInstance.resume()}catch(b){x.error("Failed to edit plan",b),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:X}),{clipBehavior:"antiAlias"}),M)I=new y81({queuedMessages:N});else if(O)I=this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!z,X)}else w=M?new y81({queuedMessages:N}):void 0,I=O?this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!z,X):void 0;let P=[],R=this.currentShellModeStatus;if(R)P.push({text:new Q1(R==="hidden"?"shell mode (incognito)":"shell mode",new U1({color:R==="hidden"?X.app.shellModeHidden:X.app.shellMode})),position:"top-left"});if(!R&&this.cachedVisibleModes.length>1){let b=this.previewThread,i=b?b.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),J1=E_1(i,this.tryOpus);if(b)P.push({text:new Q1(i,new U1({color:J1})),position:"top-left",offsetY:0});else{let m=Qb(i,this.cachedVisibleModes)!==i,s=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,q1=OZ(s.thread)===0,r=z||!this.hasToggledAgentMode&&m&&q1?new Q1("",void 0,[new Q1(i,new U1({color:J1})),new Q1(" (click or ",new U1({color:Y.foreground,dim:!0})),new Q1("Ctrl+S",new U1({color:W.keybind})),new Q1(" to switch)",new U1({color:Y.foreground,dim:!0}))]):new Q1(i,new U1({color:J1}));P.push({text:r,position:"top-left",offsetY:0,onClick:q1?this.toggleAgentMode:void 0})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let b=this.connectedClientsStatus,i=b.mode||"disconnected",J1=!!b.errorMessage,n=b.clientID||"unknown",m,s;if(J1)m="●",s=M1.red;else if(i==="presence")m="○",s=M1.yellow;else if(i==="connected"&&b.connected)m="●",s=M1.green;else m="○",s=M1.yellow;let q1=this.connectedClientsStatusExpanded?`${n} ${m}`:m;P.push({text:new Q1(q1,new U1({color:s})),position:"top-right",offsetX:-2,offsetY:0,onClick:this.toggleConnectedClientsStatus})}let j=K?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:G.mainThread?.env?.initial.trees?.[0]?.uri,y;if(j)y=p0.parse(j).fsPath;else y=process.cwd();let f=this.toHomeRelative(y),g=this.shorten(f),p=!K&&this.currentGitBranch?`${g} (${this.currentGitBranch})`:g;return P.push({text:new Q1(p,new U1({color:Y.foreground,dim:!0})),position:"bottom-right"}),new TC1({leftChild:new F4({child:U}),rightChild1:w,rightChild2:I,maxHeight:q,overlayTexts:P,borderColor:z||!this.isTextfieldAndAutocompleteFocused?M1.index(8):void 0,hasBanner:V!==null,userHeight:this.bottomGridUserHeight,onInitializeHeight:(b)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(b,q)})},onDrag:(b)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(b.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let i=Math.floor(b.localPosition.y)-this.bottomGridDragStartY,J1=Math.max(4,this.bottomGridDragStartHeight-i),n=Math.min(J1,q),m=Math.floor(n);if(this.bottomGridUserHeight!==m)this.setState(()=>{this.bottomGridUserHeight=m})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:V===null})}}async function w_1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)N9.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let X=()=>null,Z=!1,q=new rH(Z,1000,J.inspectorPort),V=J.features?.find((L)=>L.name==="amp-connect")?.enabled??!1,K=new _j1({threadService:J.threadService,worker:J.worker,builder:(L,w,I,P,R)=>{if(X=R,J.threadDependencies&&V)dR1(J.threadDependencies,J.configService,R,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((g)=>{x.error("Failed to start automatic presence:",g)});let j=R(),y=j.thread.id,f={...J,worker:j,threadID:y};return new QY6({...f,threadState:w,workerController:I,switchWorker:P,getCurrentWorker:R})}}),W=new _C1({configService:J.configService,child:K}),H=new CC1({configService:J.configService,child:W}),z=new BC1(H),U=new x6({data:iR.fromBaseTheme(IG.default()),child:z});try{await vR1(U,{onRootElementMounted:(L)=>{if(x.info("TUI input ready for user interaction"),Z)q.start(L)}})}finally{if(Z)q.stop();if(J.threadDependencies&&V){let{stopGlobalSession:L}=await Promise.resolve().then(() => (cR1(),Y26));L()}}let O=X()?.thread.id||J.threadID,M=await J.threadService.get(O);if(M&&M.messages.length>0){let L=`${J.ampURL.replace(/\/$/,"")}/threads/${O}`;I26(M,L,J.stdout)}}function E_1(J,Q){return J==="smart"?Q?M1.rgb(255,60,70):M1.rgb(145,119,199):J==="rush"?M1.rgb(228,180,2):K5(J)?M1.rgb(0,184,255):J==="plan"?M1.rgb(153,102,255):aF8(J)}class $Y6 extends Q6{props;constructor(J){super();this.props=J}createState(){return new XY6}}class XY6 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 G4({crossAxisAlignment:"stretch",children:[new F4({child:new D7({controller:Y,autofocus:!1,child:new kj1({todos:Q})})}),new o$({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 GY6 extends T6{props;constructor(J){super();this.props=J}build(J){return new I8({child:new N0({height:1}),cursor:h9.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 aF8(J){let Q=0;for(let G=0;G<J.length;G++){let Z=J.charCodeAt(G);Q=(Q<<5)-Q+Z,Q=Q&Q}let Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Y.length;return M1.index(Y[X])}yR1();try{if(process.platform==="win32")await Promise.resolve().then(() => q6(wC(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){vG.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
5090
|
-
`)}var tk1=sk1.join(CH0||sk1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function DO8(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 Mq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")jX("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")jX("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("tryOpus")==="cli"&&Q.tryOpus)jX("tryOpus",!0);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")jX("model.sonnet",Q.useSonnet)}async function Jy1(J){try{await UO8(sk1.dirname(tk1),{recursive:!0}),await BO8(tk1,J,"utf-8")}catch(Q){x.debug("Failed to save last thread ID",Q)}}async function OO8(){try{return(await _G6(tk1,"utf-8")).trim()}catch(J){return null}}var CG6=[{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??MG,description:`Custom settings file path (overrides the default location ${MG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(x).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${bT1})`},{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:u7(),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 Gemini 3":"Use default model (Gemini 3)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"Try Claude Opus 4.5 in Amp's smart mode",hidden:!1},{name:"mode",long:"mode",short:"m",type:"option",default:nT.SMART.key,description:`Set the agent mode (${KG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:KG().map((J)=>J.mode)}],SG6=(J)=>("deprecated"in J)&&J.deprecated===!0,MO8=(J)=>("hidden"in J)&&J.hidden===!0,LO8=(J)=>("default"in J),AO8=(J)=>("default"in J)?J.default:void 0;function EO8(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 A8(OG.unknownCommand(Y),1,q)}}var kG6=null;function oq5(){return kG6}function Lg(J){return{...J,getThreadEnvironment:Z61,vfs:cN0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Eh(J.fileSystem),generateThreadTitle:ot0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Qy1=p0.file(NO8.homedir()),yG6=process.env.XDG_CONFIG_HOME?p0.file(process.env.XDG_CONFIG_HOME):t0.joinPath(Qy1,".config");async function Lq(J,Q){qU0("0.0.
|
|
5090
|
+
`)}var tk1=sk1.join(CH0||sk1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function DO8(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 Mq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")jX("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")jX("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("tryOpus")==="cli"&&Q.tryOpus)jX("tryOpus",!0);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")jX("model.sonnet",Q.useSonnet)}async function Jy1(J){try{await UO8(sk1.dirname(tk1),{recursive:!0}),await BO8(tk1,J,"utf-8")}catch(Q){x.debug("Failed to save last thread ID",Q)}}async function OO8(){try{return(await _G6(tk1,"utf-8")).trim()}catch(J){return null}}var CG6=[{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??MG,description:`Custom settings file path (overrides the default location ${MG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(x).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${bT1})`},{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:u7(),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 Gemini 3":"Use default model (Gemini 3)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"Try Claude Opus 4.5 in Amp's smart mode",hidden:!1},{name:"mode",long:"mode",short:"m",type:"option",default:nT.SMART.key,description:`Set the agent mode (${KG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:KG().map((J)=>J.mode)}],SG6=(J)=>("deprecated"in J)&&J.deprecated===!0,MO8=(J)=>("hidden"in J)&&J.hidden===!0,LO8=(J)=>("default"in J),AO8=(J)=>("default"in J)?J.default:void 0;function EO8(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 A8(OG.unknownCommand(Y),1,q)}}var kG6=null;function oq5(){return kG6}function Lg(J){return{...J,getThreadEnvironment:Z61,vfs:cN0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Eh(J.fileSystem),generateThreadTitle:ot0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Qy1=p0.file(NO8.homedir()),yG6=process.env.XDG_CONFIG_HOME?p0.file(process.env.XDG_CONFIG_HOME):t0.joinPath(Qy1,".config");async function Lq(J,Q){qU0("0.0.1764072094-g8a3bd1");let Y=Gw1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:J0.of([p0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Qy1,userConfigDir:yG6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (x81(),v81));X(Y);let G=await Y.getLatest();x.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let Z=new eM({configService:Y}),q=new Map,V=()=>q.clear(),K=new yI1(Y,J.settings.getWorkspaceRootPath()),W=Rt0({configService:Y,trustStore:K,createOAuthProvider:async(J1)=>{let n=q.get(J1);if(n)return x.debug("Reusing existing OAuth provider for server",{serverName:J1}),n;x.debug("Creating OAuth provider for server",{serverName:J1});let m=(async()=>{let s=new NL(J.secrets),q1=await s.getClientInfo(J1),W1=new DI1({storage:s,serverName:J1,clientId:q1?.clientId,clientSecret:q1?.clientSecret,scopes:q1?.scopes});return x.debug("OAuth provider created",{serverName:J1,hasManualClientId:!!q1?.clientId,willUseDCR:!q1?.clientId}),W1})();return q.set(J1,m),m}}),H=L11({configService:Y,filesystem:W5,spawn:HL}),{initializeToolProviders:z}=await Promise.resolve().then(() => (RG6(),TG6)),{registrations:U,initErrors:N}=await z({toolServices:Z,providers:[W,H],initialTimeout:J.executeMode?15000:5000});for(let[J1,n]of N)x.warn(`${J1} provider initialization slow or failed:`,n);if(Q.jetbrains)mw("JetBrains");else if(Q.ide&&X96())mw("VS Code");else if(Q.ide&&G96())mw("Neovim");if(J.executeMode)VU0(!0);let O,M=z7.status.pipe(o0((J1)=>Boolean(J1.connected&&J1.authenticated)),I4()).subscribe((J1)=>{if(J1){if(!O)O=Z.registerTool(JT)}else O?.dispose(),O=void 0}),L;if(!J.executeMode)L=new D61(process.cwd(),{},!0);else L=new class extends D61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(p5.write(`No API key found. Starting login flow...
|
|
5091
5091
|
`),!await wO8(J))await jL(),process.exit(1)}let w=await pt0({isDevelopment:!1}),I=new uI1(w,Y),P=new fI1(w,{lazy:!0}),R=new vI1(I,(J1,n)=>{let m=Z3.get(J1);if(m)m.handle(n).catch((s)=>{x.error("Failed to apply artifact delta",s)})}),j=Q.notifications!==void 0?Q.notifications:!J.executeMode,y=$e0({playNotificationSound:async(J1)=>{if(j){Ye0(J1);let n=_R1(),m=kR1();if((!n||m)&&G.settings["notifications.system.enabled"]!==!1){if(J1==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(J1==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:I,configService:Y});x.info("Starting Amp background services");let f=tt0({threadService:I,threadHistoryService:P,configService:Y,isExtensionDevelopment:!1}),g;z7.status.subscribe((J1)=>{g=J1});let p=new wX1({workspaceRoots:[p0.file(process.cwd())],getCurrentFile:()=>{if(!g?.openFile)return;try{return p0.parse(g.openFile)}catch(J1){x.warn("Failed to parse current file URI",{uri:g.openFile,error:J1});return}},getOpenFiles:()=>{if(!g?.visibleFiles?.length)return[];let J1=g.openFile;return g.visibleFiles.filter((n)=>n!==J1).map((n)=>{try{return p0.parse(n)}catch(m){return x.warn("Failed to parse visible file URI",{uri:n,error:m}),null}}).filter((n)=>n!==null)}}),b=new xR1,i={codebaseContextService:p,configService:Y,toolServices:Z,mcpService:W,trustStore:K,threadService:I,threadHistoryService:P,threadSyncService:f,planFileManager:R,threadStorage:w,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:L,notificationService:y,fileSystem:Q.jetbrains||Q.ide?ft0:W5,terminal:b};return{...i,async asyncDispose(){for(let J1 of U.values())J1.dispose();await i.mcpService.dispose(),V(),await i.threadService.asyncDispose(),i.configService.unsubscribe(),i.toolServices.dispose(),i.fuzzyServer.dispose(),i.threadSyncService.dispose(),i.settingsStorage[Symbol.dispose](),M.unsubscribe(),O?.dispose()}}}async function wO8(J){if(!J.executeMode){if(!await KR1("Would you like to log in to Amp? [(y)es, (n)o]: "))return p5.write(`Login cancelled. Run the command again to retry.
|
|
5092
5092
|
`),!1}return await vG6(J)}async function vG6(J){let Q=FO8(32).toString("hex"),Y=await VR1(J.ampURL,Q),X=new AbortController;try{await mJ(Y,X.signal)}catch(Z){x.error("Error opening browser",{error:Z})}let G=await VR1(J.ampURL,Q,!1);p5.write(`If your browser does not open automatically, visit:
|
|
5093
5093
|
|
|
@@ -5097,15 +5097,15 @@ ${C4.blue.bold(G)}
|
|
|
5097
5097
|
Login successful! You can now use the Amp CLI.
|
|
5098
5098
|
`),!0}catch(Z){return x.error("Login failed",{error:Z}),vG.write(`
|
|
5099
5099
|
Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
5100
|
-
`),!1}}function IO8(){let J=new OL().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)PR(),process.exit(0);let z=H.originalError??H;e46(z)}),J.option("-V, --version","Print the version number and exit",()=>{p5.write(`0.0.
|
|
5100
|
+
`),!1}}function IO8(){let J=new OL().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)PR(),process.exit(0);let z=H.originalError??H;e46(z)}),J.option("-V, --version","Print the version number and exit",()=>{p5.write(`0.0.1764072094-g8a3bd1 (released 2025-11-25T12:06:41.355Z)
|
|
5101
5101
|
`),process.exit(0)}),J.addHelpText("after",Q96()),J.configureHelp({formatHelp:Y96}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await dQ(U);await CO8(N)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await dQ(U);await RO8(N,await sT1(U,N.settings))});let Q=async(H,z,U)=>{Gw1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:J0.of([p0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:Qy1,userConfigDir:yG6});let N={...z,executeMode:!1};await ek1(N,{...H,openThreadSwitcher:!0},U)},Y=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await dQ(U);await jG6(U,N,z)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await dQ(U);await xO8(U,N,z)}),Y.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let N=U.optsWithGlobals(),O=await dQ(N);if(z.pick)vG.write(`${C4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
5102
5102
|
`);if(z.last||H||O.executeMode)await vO8(N,O,H,U);else await Q(N,O,U)}),Y.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),O=await dQ(N);await yO8(N,O,H,U)}),Y.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await dQ(U);await jG6(U,N,z)}),Y.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, unlisted, workspace, group)").option("--support [message]","Share thread with Amp support for debugging").action(async(H,z,U)=>{let N=U.optsWithGlobals(),O=await dQ(N);await kO8(N,O,H,U,z.support)}),Y.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(H,z,U,N)=>{let O=N.optsWithGlobals(),M=await dQ(O);await SO8(O,M,H,z,N)}),Y.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),O=await dQ(N);await jO8(N,O,H,U)}),Y.command("replay <threadId>").alias("p").summary("Replay a thread").description("Replay a thread by downloading it and playing through all interactions. User messages are simulated with variable typing speed.").option("--wpm <wpm>","Typing speed in words per minute (default: 120)","120").option("--no-typing","Disable typing simulation and display messages instantly").option("--message-delay <ms>","Delay between messages in milliseconds (default: 1000)","1000").option("--tool-progress-delay <ms>","Delay to show tool in-progress state in milliseconds (default: 800)","800").option("--exit-delay <seconds>","Delay in seconds before exiting after replay completes (default: 3)","3").option("--no-indicator","Hide the replay progress indicator").action(async(H,z,U)=>{let N=U.optsWithGlobals(),O=await dQ(N);await _O8(N,O,H,z,U)}),s56(J,async(H,z)=>{let U=await dQ(z);Mq(H,z);let N=await Lq(U,z);return{context:U,mcpService:N.mcpService,toolService:N.toolServices,toolServices:N.toolServices,configService:N.configService,cleanupTerminal:PR,asyncDispose:N.asyncDispose.bind(N)}}),u96(J,async(H)=>{let z=H.optsWithGlobals();return await dQ(z)}),S96(J,async(H)=>{let z=await dQ(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{Mq(U,H);let N=await Lq(z,H);return{mcpService:N.mcpService,settings:z.settings,asyncDispose:N.asyncDispose.bind(N)}}}});function G(H,z,U){let O=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),M=new EB(z,O),L=AO8(H);if(L)M.default(L);if(M.hidden=MO8(H)||SG6(H),"choices"in H)M.choices([...H.choices]);return M}for(let H of CG6)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 EB("-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 EB("-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 EB("--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 EB("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(K);let W=new EB("--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 EB("--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,N=await dQ(U);if(Object.keys(U).forEach((O)=>{let M=CG6.find((L)=>L.name===O);if(M&&SG6(M)&&!LO8(M))vG.write(C4.yellow(`Warning: '--${O}' flag is deprecated
|
|
5103
5103
|
`))}),z.args.length>0)EO8(N,z);await ek1(N,U,z)}),A96(J),J}async function w91(J,Q){let{thread:Y,visibility:X}=Q,G=Y?.id??NZ(),Z=Lg(J);if(Y)await J.threadStorage.set(G,Y);let q=await Z3.getOrCreateForThread(Z,G),V=await J.threadStorage.get(G);if(Q.agentMode&&!V?.agentMode&&OZ(q.thread)===0)await q.handle({type:"agent-mode",mode:Q.agentMode});if(X)await J.threadSyncService.updateThreadMeta(G,S61(X));let K=J.threadService.observe(G).subscribe(async(W)=>{if(t3(W,"assistant"))await Jy1(G),K.unsubscribe()});return await q.resume(),q}async function ek1(J,Q,Y){let X=C61(Q);if(X instanceof Error)yG(X.message);let G,Z=null;if(Q.streamJsonInput)G="";else if(typeof Q.execute==="string"){G=Q.execute;let i=(await WR1()).trimEnd();if(i)Z=i}else G=(await WR1()).trimEnd();if(Q.remote&&!J.executeMode)throw new A8("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new A8("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new A8("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new A8("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if((J.executeMode||Q.streamJson)&&K5(Q.mode))throw new A8(`Execute mode is not permitted with --mode '${Q.mode}'`,1);if(Q.stats&&!J.executeMode)throw new A8("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(Q.streamJsonInput&&typeof Q.execute==="string"&&Q.execute.trim()!=="")throw new A8("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"}]}}' | amp --execute --stream-json --stream-json-input`);if(J.executeMode&&G===""&&!Q.streamJsonInput)throw new A8("User message must be provided through stdin or as argument when using execute mode",1,`Either pass a message as an argument: amp --execute "your message"
|
|
5104
5104
|
Or pipe via stdin: echo "your message" | amp --execute`);Mq(Y,Q);let q=await Lq(J,Q);kG6=q;let V=Lg(q),K=async(i)=>{let J1=await _G6(i,"utf-8"),n=JSON.parse(J1);if(!DZ(n.id))throw new A8(OG.invalidThreadId);return w91(q,{visibility:X,agentMode:Q.mode,thread:n})},W=async(i)=>{if(!DZ(i))throw new A8(OG.invalidThreadId);try{let[n,m]=await Promise.all([O5.getThreadLinkInfo({thread:i},{config:q.configService}),O5.getUserInfo({},{config:q.configService})]);if(n.ok&&m.ok){let s=n.result.creatorUserID,q1=m.result.id;if(s&&s!==q1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new A8(`Cannot resume thread created by another user.
|
|
5105
5105
|
|
|
5106
5106
|
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 A8)throw n;x.warn("Failed to validate thread ownership in CLI, allowing to open",{error:n})}let J1=await q.threadService.get(i)??void 0;return x.info(`[fetchAndStartThread] Loaded thread ${i}, agentMode: ${J1?.agentMode??"undefined"}`),w91(q,{visibility:X,agentMode:J1?void 0:Q.mode,thread:J1})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return w91(q,{visibility:X})}catch(i){if(i instanceof A8)throw i;throw await ib(i,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return w91(q,{visibility:X})};if(Q.format==="jsonl")vG.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
5107
|
-
`),await jL(),process.exit(1);if(J.executeMode&&Q.remote)await g96(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)k96(q.mcpService,J.settings),await F86(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,O=!1;if(Q.jetbrains||Q.ide){await Ux0();let i=eP({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)O=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let J1=i[0];if(J1)z7.selectConfig(J1)}else N=!0}let M=T61("0.0.
|
|
5108
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await u86({...J,workspaceTrust:{current:!0,changes:E_},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 j96(J.mcpConfig);X=_96(X,Z)}let G=await X.get("url","global");if(!G)G=$Y;if(!BF(G))x.info("Targeting custom Amp server",{ampURL:G});return X=Rz0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:m96(await sT1(J,X))}}function PO8(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 TO8(){let J=PO8(process.argv);if(c46({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),DO8(x),x.info("Starting Amp CLI.",{version:"0.0.
|
|
5107
|
+
`),await jL(),process.exit(1);if(J.executeMode&&Q.remote)await g96(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)k96(q.mcpService,J.settings),await F86(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,O=!1;if(Q.jetbrains||Q.ide){await Ux0();let i=eP({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)O=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let J1=i[0];if(J1)z7.selectConfig(J1)}else N=!0}let M=T61("0.0.1764072094-g8a3bd1",q.settingsStorage),L=new R01(q.threadStorage),w=J0.of([p0.file(process.cwd())]),I=xX1(void 0,w),P=new R61(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 O5.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)});if(i.ok)return x.info("User free tier status:",i),i.result}catch(i){x.error("Failed to fetch free tier status:",i)}})(),j=(async()=>{try{let i=await O5.getUserInfo({},{config:q.configService});if(i.ok)return i.result}catch(i){x.debug("Failed to fetch user workspace info:",i)}})(),[y,f]=await Promise.all([R,j]),g=f?.email,p=g&&(g.endsWith("@sourcegraph.com")||g.endsWith("@ampcode.com")||g==="auth-bypass-user@example.com");if(p)q.toolServices.registerTool(Qe0);let b=await c96();x.info("Loaded session state:",b),await w_1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new W61,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadHistoryService:q.threadHistoryService,threadSyncService:q.threadSyncService,planFileManager:q.planFileManager,threadID:U.threadID,threadFuzzyIndexer:L,worker:U,workerDeps:V,configService:q.configService,internalAPIClient:O5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:z7,connectedClientsService:new T11,commandRegistry:I,mcpService:q.mcpService,mcpTrustHandler:P,showJetBrainsInstaller:O,showIdePicker:N,openThreadSwitcher:Q.openThreadSwitcher,updateService:M,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:b,freeTierStatus:y,workspace:f?.team??null,features:f?.features??[],isDogfooding:p||!1,threadDependencies:q}),await q.asyncDispose(),process.exit(0)}async function dQ(J){if(J.interactive)vG.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
5108
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await u86({...J,workspaceTrust:{current:!0,changes:E_},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 j96(J.mcpConfig);X=_96(X,Z)}let G=await X.get("url","global");if(!G)G=$Y;if(!BF(G))x.info("Targeting custom Amp server",{ampURL:G});return X=Rz0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:m96(await sT1(J,X))}}function PO8(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 TO8(){let J=PO8(process.argv);if(c46({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),DO8(x),x.info("Starting Amp CLI.",{version:"0.0.1764072094-g8a3bd1",buildTimestamp:"2025-11-25T12:06:41.355Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new A8(OG.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await IO8().parseAsync(process.argv)}yA1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await TO8().catch(ib)});async function RO8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),p5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
5109
5109
|
`);else if(!BF(J.ampURL))p5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
5110
5110
|
`);let Y=process.env.AMP_API_KEY;if(Y)p5.write(`API key found in environment variable, storing...
|
|
5111
5111
|
`),await Q.set("apiKey",Y,J.ampURL),p5.write(`API key successfully stored.
|
|
@@ -5118,7 +5118,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
5118
5118
|
`);else p5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
5119
5119
|
`);process.exit(0)}async function SO8(J,Q,Y,X,G){Mq(G,J);let Z=await Lq(Q,J);try{let q=I91(Y);if(!q)P91(Y);let V=q,K=X.trim();if(K.length===0)yG("Thread name cannot be empty");if(K.length>256)yG("Thread name cannot exceed 256 characters");if(!(await IC(V,Z)).messages.length)yG("Cannot rename an empty thread.");let H=Lg(Z);await(await Z3.getOrCreateForThread(H,V)).handle({type:"title",value:K}),x.info("GOT HERE"),await Z.threadSyncService.sync(),x.info("GOT THERE"),p5.write(C4.green(`✓ Thread ${V} renamed to "${K}"
|
|
5120
5120
|
`)),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose();let V=`Failed to rename thread: ${q instanceof Error?q.message:String(q)}`;yG(V)}}async function jO8(J,Q,Y,X){Mq(X,J);let G=await Lq(Q,J);try{let Z=I91(Y);if(!Z)P91(Y);let V=await IC(Z,G),K=IT(V);p5.write(K+`
|
|
5121
|
-
`),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)}`;yG(q)}}async function _O8(J,Q,Y,X,G){Mq(G,J);let Z=await Lq(Q,J);try{let q=await Yy1(Y),V=await IC(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,O=Lg(Z),M=V.id;await Z.threadStorage.set(M,V);let L=await Z3.getOrCreateForThread(O,M);await L.resume();let w=T01.fromWorker(L),I=new R01(Z.threadStorage),P=J0.of([p0.file(process.cwd())]),R=xX1(void 0,P),j=new R61(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=T61("0.0.
|
|
5121
|
+
`),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)}`;yG(q)}}async function _O8(J,Q,Y,X,G){Mq(G,J);let Z=await Lq(Q,J);try{let q=await Yy1(Y),V=await IC(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,O=Lg(Z),M=V.id;await Z.threadStorage.set(M,V);let L=await Z3.getOrCreateForThread(O,M);await L.resume();let w=T01.fromWorker(L),I=new R01(Z.threadStorage),P=J0.of([p0.file(process.cwd())]),R=xX1(void 0,P),j=new R61(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=T61("0.0.1764072094-g8a3bd1",Z.settingsStorage);await w_1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new W61,fuzzyServer:Z.fuzzyServer,settingsStorage:Z.settingsStorage,threadService:Z.threadService,threadHistoryService:Z.threadHistoryService,threadSyncService:Z.threadSyncService,planFileManager:Z.planFileManager,threadID:M,threadFuzzyIndexer:I,worker:w,workerDeps:O,configService:Z.configService,internalAPIClient:O5,ampURL:Q.ampURL,startNewThread:async()=>w,switchToThread:async()=>w,ideClient:z7,connectedClientsService:new T11,commandRegistry:R,mcpService:Z.mcpService,mcpTrustHandler:j,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:V,typingEnabled:K,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:N}}),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),await ib(q,Y)}}async function kO8(J,Q,Y,X,G){Mq(X,J);let Z=await Lq(Q,J);try{let q=I91(Y);if(!q)P91(Y);let V=q,K=await O5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=C61(J,W);if(!H&&!G)yG("Must specify either --visibility or --support");if(H&&G)yG("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)yG(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,S61(H)),p5.write(C4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
|
|
5122
5122
|
`);if(G){await IC(V,Z);let z=typeof G==="string"?G:void 0;await Hk0(Z.threadService,V,Z.configService,z),p5.write(C4.green("✓ ")+`Thread ${V} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
5123
5123
|
`)}await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),yG(`Failed to update thread: ${q instanceof Error?q.message:String(q)}`)}}async function yO8(J,Q,Y,X){Mq(X,J);let G=await Lq(Q,J),Z=Lg(G);try{let q=await Yy1(Y),K=(await IC(q,G)).messages.length-1,W=await Z3.getOrCreateForThread(Z,q),H=await HR(W,G.threadSyncService,K);await Promise.all([G.threadSyncService.uploadThread(q),G.threadSyncService.uploadThread(H)]),await Jy1(H),p5.write(`${H}
|
|
5124
5124
|
`),await G.asyncDispose(),process.exit(0)}catch(q){vG.write(`Error forking thread: ${q instanceof Error?q.message:String(q)}
|