@sourcegraph/amp 0.0.1764950485-g0c2b44 → 0.0.1764979300-g324cf3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +10 -10
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -4055,15 +4055,15 @@ Actual: ${X}`)}async function _V8(J,Q,Z){let{execSync:Y}=await import("node:ch
|
|
|
4055
4055
|
${D}`;if(X==="pnpm"&&D.includes("Unable to find the global bin directory"))M+=`
|
|
4056
4056
|
|
|
4057
4057
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4058
|
-
npm install -g @sourcegraph/amp`;K(Error(M))}},error:(U)=>{if(!H)H=!0,K(Error(`Failed to spawn ${X}: ${U.message}`))},complete:()=>{if(!H)H=!0,V()}})})}B0();B0();async function J41(J,Q){let Y=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Y}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=fV8(J,q),H=W<0,z,U;if(K.time){let D=K.time[J],M=K.time[q],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function fV8(J,Q){let Z=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Y=Z(J),X=Z(Q),G=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Y.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}n0();function Q41(J,Q){let Z=new u4,Y=Z.pipe(I8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new HK().scoped("update"),G=Y.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await KR(500),Z.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=jA(),W=await J41(J,q);if(!(W.latestVersion&&W.hasUpdate)){X.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,D=0.5;if(Math.abs(U)<0.5)return X.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await e61();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Z.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Z.next("update-available");return}try{await ng(W.latestVersion,z);let U=await RB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Z.next("updated");else X.warn("success with warning",D),Z.next("updated-with-warning")}catch(U){Z.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await KR(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Pq}from"node:process";function b96(J){let Q=new UA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await pC1(Y.force||!1,Y.verbose||!1,"0.0.
|
|
4058
|
+
npm install -g @sourcegraph/amp`;K(Error(M))}},error:(U)=>{if(!H)H=!0,K(Error(`Failed to spawn ${X}: ${U.message}`))},complete:()=>{if(!H)H=!0,V()}})})}B0();B0();async function J41(J,Q){let Y=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Y}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=fV8(J,q),H=W<0,z,U;if(K.time){let D=K.time[J],M=K.time[q],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function fV8(J,Q){let Z=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Y=Z(J),X=Z(Q),G=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Y.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}n0();function Q41(J,Q){let Z=new u4,Y=Z.pipe(I8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new HK().scoped("update"),G=Y.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await KR(500),Z.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=jA(),W=await J41(J,q);if(!(W.latestVersion&&W.hasUpdate)){X.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,D=0.5;if(Math.abs(U)<0.5)return X.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await e61();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Z.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Z.next("update-available");return}try{await ng(W.latestVersion,z);let U=await RB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Z.next("updated");else X.warn("success with warning",D),Z.next("updated-with-warning")}catch(U){Z.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await KR(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Pq}from"node:process";function b96(J){let Q=new UA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await pC1(Y.force||!1,Y.verbose||!1,"0.0.1764979300-g324cf3"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new UA("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Y)=>{await hV8(Y.targetVersion)});J.addCommand(Z)}async function hV8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Pq.write(_4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4059
4059
|
|
|
4060
4060
|
`));try{if(!J){Pq.write(_4.blue(`Checking for updates...
|
|
4061
|
-
`));let Y=jA(),{hasUpdate:X,latestVersion:G}=await J41("0.0.
|
|
4062
|
-
`));let K=await RB("0.0.
|
|
4061
|
+
`));let Y=jA(),{hasUpdate:X,latestVersion:G}=await J41("0.0.1764979300-g324cf3",Y);if(!X){Pq.write(_4.green(`✓ Amp CLI is already up to date: ${"0.0.1764979300-g324cf3"} (${"released"} ${"2025-12-06T00:07:00.608Z"})
|
|
4062
|
+
`));let K=await RB("0.0.1764979300-g324cf3");if(K.warning)Pq.write(`
|
|
4063
4063
|
`+_4.yellow(K.warning)+`
|
|
4064
4064
|
`);process.exit(0)}if(!G)Pq.write(_4.yellow("[WARN] could not find latest version")),process.exit(0);J=G}Pq.write(_4.blue(`Updating to version ${J}...
|
|
4065
4065
|
`)),await ng(J,void 0,(Y)=>{Pq.write(_4.dim(`Running: ${Y}
|
|
4066
|
-
`))});let Q="released";Pq.write(_4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-
|
|
4066
|
+
`))});let Q="released";Pq.write(_4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-06T00:07:00.608Z"})
|
|
4067
4067
|
`));let Z=await RB(J);if(Z.warning)Pq.write(`
|
|
4068
4068
|
`+_4.yellow(Z.warning)+`
|
|
4069
4069
|
`);process.exit(0)}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);Pq.write(_4.red.bold("Error: ")+Z+`
|
|
@@ -4699,7 +4699,7 @@ Ctrl-X Y Z to unlock`;if(U){let a=W.text.replace(/`([^`]+)`/g,"$1")+`
|
|
|
4699
4699
|
`,A)])}),y];if(!q&&!U&&W.url){let m=W.url.replace(/^https?:\/\//,"");b.push(new u5({uri:W.url,text:m,style:new e({color:Z.secondary,underline:!0})}))}if(k&&!U)b.push(k);let d=new X0({width:40,child:new v0({crossAxisAlignment:"start",mainAxisSize:"min",children:b})});return k4.child(new A6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new zS1({width:mk1,height:uk1,agentMode:this.widget.agentMode,glow:this._glow,t:H,fps:0,shockwaves:this._shockwaves,onShockwave:P,...V==="disabled"&&{seed:42}}),new X0({width:2}),d]}))}}B0();T8();H4();K7();T8();n0();function IM8(J,Q){return`${J}:${Q}`}class pk1{threadService;workers=new Map;threadsMap=new Map;subthreadsMap=new Map;mainThreadSubs=new Map;subthreadsSubs=new Map;workerStatusSubs=new Map;subthreadPatchSubs=new Map;mainThreadObservable;subthreadObservable;workerStatusObservable;emitMainThread=null;emitSubthread=null;emitWorkerStatus=null;constructor(J){this.threadService=J;this.mainThreadObservable=new Q0((Q)=>{return this.emitMainThread=(Z)=>Q.next(Z),()=>{this.emitMainThread=null}}),this.subthreadObservable=new Q0((Q)=>{return this.emitSubthread=(Z)=>Q.next(Z),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new Q0((Q)=>{return this.emitWorkerStatus=(Z)=>Q.next(Z),()=>{this.emitWorkerStatus=null}})}registerWorker(J){let Q=J.thread.id;if(this.workers.has(Q))this.unregisterWorker(Q);this.threadsMap.set(Q,J.thread),this.subthreadsMap.set(Q,[]),this.workers.set(Q,{state:"initial"});let Z=this.threadService.observePatches(Q).pipe(eD()).subscribe((G)=>{this.threadsMap.set(Q,G);let V=this.subthreadsMap.get(Q)||[],K=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:G,subthreads:V,workerStatus:K})});this.mainThreadSubs.set(Q,Z);let Y=J.status.subscribe((G)=>{if(this.workers.set(Q,G),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:G})});this.workerStatusSubs.set(Q,Y);let X=J.subthreads.subscribe((G)=>{this.subthreadsMap.set(Q,G);for(let V of G){let K=IM8(Q,V.toolUse.id);if(this.subthreadPatchSubs.has(K))continue;let q=this.threadService.observePatches(V.threadID).pipe(eD()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:V})});this.subthreadPatchSubs.set(K,q)}});this.subthreadsSubs.set(Q,X)}unregisterWorker(J){let Q=this.mainThreadSubs.get(J);if(Q)Q.unsubscribe(),this.mainThreadSubs.delete(J);let Z=this.workerStatusSubs.get(J);if(Z)Z.unsubscribe(),this.workerStatusSubs.delete(J);let Y=this.subthreadsSubs.get(J);if(Y)Y.unsubscribe(),this.subthreadsSubs.delete(J);for(let[X,G]of this.subthreadPatchSubs.entries())if(X.startsWith(`${J}:`))G.unsubscribe(),this.subthreadPatchSubs.delete(X);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new Q0((Q)=>{return this.mainThreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),subthreads:new Q0((Q)=>{return this.subthreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),workerStatus:new Q0((Q)=>{return this.workerStatusObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})})}}get threadViewStates(){let J={};for(let[Q,Z]of this.threadsMap){let Y=this.workers.get(Q);if(Y)J[Q]=sL(Z,Y)}return J}dispose(){for(let J of this.mainThreadSubs.values())J.unsubscribe();for(let J of this.subthreadsSubs.values())J.unsubscribe();for(let J of this.workerStatusSubs.values())J.unsubscribe();for(let J of this.subthreadPatchSubs.values())J.unsubscribe();this.mainThreadSubs.clear(),this.subthreadsSubs.clear(),this.workerStatusSubs.clear(),this.subthreadPatchSubs.clear(),this.workers.clear(),this.threadsMap.clear(),this.subthreadsMap.clear()}}function PM8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Z,subthread:Y}=Q,X=J.subagents[Y.threadID];if(!X){if(X={subThreadID:Z.id,parentToolID:Y.toolUse.id,taskDescription:Y.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=fJ(J.mainThread);X.isCompleted=RZ6(W,Y.toolUse.id)}}let G=TM8(Z,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=wC(Z).items.filter((W)=>W.type==="toolResult");for(let W of q)K[W.id]={id:W.id,subthreadID:Z.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[Y.threadID]:V},tools:K,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Z,subthreads:Y,workerStatus:X}=Q,G=fJ(Z),V={...J.subagents};for(let z of Y){let U=V[z.threadID];if(!U)continue;let D=RZ6(G,z.toolUse.id);V[z.threadID]={...U,isCompleted:D}}let{items:K}=wC(Z),q=sL(Z,X),W=nE({messages:Z.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:V,items:K,viewState:q,todosList:H,mainThread:Z}}case"worker-status-change":{if(!J.mainThread)return J;let Z=sL(J.mainThread,Q.workerStatus);if(Z===J.viewState)return J;return{...J,viewState:Z}}default:return J}}function wC(J){let Q=[],Z=new Map,Y=new Set;for(let[X,G]of J.messages.entries()){let V=`${G.role}-${X}`;switch(G.role){case"assistant":{let K=G.state.type==="streaming";for(let W of G.content)if(W.type==="tool_use"){if(Z.set(W.id,W),K)Y.add(W.id)}if(G.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:V,message:G});for(let W of G.content)if(W.type==="tool_use"){let H=!1;for(let z=X+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let D of U.content)if(D.type==="tool_result"&&D.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:K?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:V,message:G});break;case"user":{let K=G.content.some((q)=>q.type==="text"&&q.text.trim()||q.type==="image");for(let q of G.content)if(q.type==="tool_result"){let W=Z.get(q.toolUseID)??qY(J,q.toolUseID);if(!W)throw Error(`(bug) tool use ${q.toolUseID} not found`);Q.push({type:"toolResult",id:q.toolUseID,toolUse:W,toolResult:q})}if(K)Q.push({type:"message",id:V,message:G});break}}}return{items:Q}}function RZ6(J,Q){let Z=J.get(Q);return(Z&&X3(Z.run))??!1}function TM8(J,Q){let Z=J.messages.at(-1);if(Z?.content.some((X)=>X.type==="tool_result"&&X.run.status==="blocked-on-user"))return v.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(wC(J).items.some((X)=>X.type==="toolResult"&&X.toolResult.run.status==="in-progress")){let X=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools",{threadID:J.id,startTime:X,hasStartTime:!!X}),{type:"running-tools",startTime:X}}if(Z&&Z.role==="assistant"&&Z.state.type==="streaming")switch(Z.content.at(-1)?.type){case"text":return v.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return v.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let G=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}default:return v.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return v.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class dk1 extends d0{props;constructor(J){super();this.props=J}createState(){return new CZ6}}class CZ6 extends u0{state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null};workerController;subscriptions=[];recentThreadIDs=[];currentWorker;constructor(){super();this.workerController=null,this.currentWorker=null}addToRecentThreads(J){this.setState(()=>{let Q=this.recentThreadIDs.indexOf(J);if(Q!==-1)this.recentThreadIDs.splice(Q,1);if(this.recentThreadIDs.unshift(J),this.recentThreadIDs.length>50)this.recentThreadIDs.pop()})}initState(){let{threadService:J,worker:Q}=this.widget.props;this.workerController=new pk1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),Z=Q.mainThread.subscribe((G)=>{this.dispatch({type:"main-thread-patch",thread:G.mainThread,subthreads:G.subthreads,workerStatus:G.workerStatus})});this.subscriptions.push(Z);let Y=Q.subthreads.subscribe((G)=>{this.dispatch({type:"subthread-patch",thread:G.thread,subthread:G.subthread})});this.subscriptions.push(Y);let X=Q.workerStatus.subscribe((G)=>{this.dispatch({type:"worker-status-change",workerStatus:G.status})});this.subscriptions.push(X)}cleanup(){this.subscriptions.forEach((J)=>J.unsubscribe()),this.subscriptions=[]}switchWorker(J){this.cleanup(),this.setState(()=>{this.currentWorker=J}),this.setState(()=>{this.state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null}}),this.setupSubscriptions(J),this.addToRecentThreads(J.thread.id)}dispatch(J){this.setState(()=>{this.state=PM8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((G)=>({toolUse:G.toolUse,toolRun:G.toolRun,subthreadID:G.subthreadID})),Q={};for(let G of Object.values(this.state.subagents)){let V=J.filter((K)=>K.subthreadID===G.subThreadID);Q[G.parentToolID]=V}let Z=(G)=>G===B5||G===l8||G===KY,Y=new Map;for(let G of this.state.items)if(G.type==="toolResult"&&Z(G.toolUse.name))Y.set(G.toolUse.id,{toolUseId:G.toolUse.id,toolName:G.toolUse.name,toolRun:G.toolResult.run});let X=Array.from(Y.values());for(let{toolUseId:G,toolRun:V}of X){let K=[],q;if(V.status==="in-progress"||V.status==="done"||V.status==="error"||V.status==="cancelled")q=V.progress;if(q){let W=0;for(let H of q)if(H.tool_uses)for(let z of H.tool_uses){let U=`${G}:progress:${W++}`;K.push({toolUse:cE(z.tool_name,z.input,U),toolRun:{status:z.status}})}}Q[G]=K}return{...this.state,subagents:Object.values(this.state.subagents),subagentActiveTools:J,subagentToolsByParentID:Q}}build(J){let Q=this.getThreadData();return this.widget.props.builder(J,Q,this.workerController,(Z)=>this.switchWorker(Z),()=>this.currentWorker,this.recentThreadIDs)}}class ck1 extends d0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new jZ6}}class jZ6 extends u0{build(J){let Z=$6.of(J).colors,{todos:Y,title:X="TODOs"}=this.widget.props;if(!Array.isArray(Y)||Y.length===0)return new X0({width:0,height:0});let G=Y.map((V)=>this.buildTodoItem(V,Z));return new g0({child:new H6({padding:F0.symmetric(1,0),child:new v0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new _1({text:new i(X,new e({bold:!0,color:Z.foreground}))}),...G]})})})}buildTodoItem(J,Q){let Z=this.getStatusIcon(J.status),Y=J.status==="completed",X=new e({bold:J.status==="in-progress",color:Q.foreground,dim:Y}),G=new e({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:Y});return new A6({crossAxisAlignment:"start",children:[new _1({text:new i(Z,X)}),new X0({width:1}),new e6({child:new _1({text:new i(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class lk1 extends R6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Z,onButtonClick:Y}){super({key:J});this.ad=Q,this.onDismiss=Z,this.onButtonClick=Y}build(J){let Q=$6.of(J),Z=Q.colors.primary,Y=Q.colors.foreground;return new g0({decoration:new U8(void 0,new A4(new q4(Z,1,"rounded"),new q4(Z,1,"rounded"),void 0,new q4(Z,1,"rounded"))),child:new H6({padding:F0.horizontal(1),child:new v0({children:[new A6({crossAxisAlignment:"start",children:[new e6({child:new _1({text:new i(this.ad.content,new e({color:Y}))})}),new X0({width:4}),new u5({uri:"https://ampcode.com/free",text:"Ad",style:new e({color:Y,dim:!0})})]}),new A6({crossAxisAlignment:"start",children:[new ES1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:F0.horizontal(1),color:Z,reverse:!0}),new X0({width:2}),new _1({text:new i(this.ad.destinationUrlHostname,new e({color:Y,dim:!0}))})]})]})})})}}class ik1 extends d0{props;constructor(J){super();this.props=J}createState(){return new SZ6(this.props.autofocus??!0)}}class SZ6 extends u0{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(K)=>{if(K.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(K.ctrlKey&&K.key==="c"||K.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Z=f4.sizeOf(J),Y=Math.min(60,Z.width-4),X=Z.height-4,G=[];if(this.widget.props.title)G.push(new _1({text:new i(this.widget.props.title,new e({bold:!0,color:F1.blue}))}),new X0({height:1}));if(this.widget.props.message)G.push(new _1({text:new i(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)G.push(new X0({height:1}));let V=[];if(this.widget.props.showCopyOption)V.push(new _1({text:new i("Enter to copy",new e({dim:!0}))}));return V.push(new _1({text:new i("Escape to close",new e({dim:!0}))})),G.push(new A6({children:V.flatMap((K,q)=>q<V.length-1?[K,new X0({width:1}),new _1({text:new i("•",new e({dim:!0}))}),new X0({width:1})]:[K]),mainAxisSize:"min"})),new k4({child:new g0({constraints:new P6(Y,Y,0,X),decoration:new U8(F1.default(),new A4(new q4(F1.blue,1,"rounded"),new q4(F1.blue,1,"rounded"),new q4(F1.blue,1,"rounded"),new q4(F1.blue,1,"rounded"))),padding:new F0(2,2,2,2),child:new q8({autofocus:this.autofocus,onKey:Q,child:new v0({children:G,mainAxisSize:"min"})})})})}}class T91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,T91.prototype)}}class R91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,R91.prototype)}}function nk1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Z)=>{if(Z.startsWith('"')&&Z.endsWith('"')||Z.startsWith("'")&&Z.endsWith("'"))return Z.slice(1,-1);return Z})}tW();B0();import{spawn as RM8}from"node:child_process";import{promises as CM8}from"node:fs";function _Z6(J){return J.kind==="executable"}function kZ6(J){return J.kind==="markdown"}var Gz=50000,yZ6=300000;async function ak1(J,Q,Z,Y={}){let{timeoutMs:X=yZ6,signal:G,source:V}=Y;try{let K=await Z.getCommand(J,V);if(!K)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Z.isCommandAvailable(J,V))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(v.debug("Executing command",{commandName:J,filePath:K.filePath,args:Q}),kZ6(K))return await jM8(K,Q);else if(_Z6(K))return await SM8(K,Q,X,G);else return{success:!1,output:"",error:"Unsupported command type"}}catch(K){return v.error("Failed to execute command",{commandName:J,error:K}),{success:!1,output:"",error:K instanceof Error?K.message:"Unknown error occurred"}}}async function jM8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await CM8.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>Gz?Z.slice(0,Gz)+`
|
|
4700
4700
|
... (output truncated at ${Gz} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function SM8(J,Q,Z=yZ6,Y){return new Promise((X)=>{let[G,V]=_M8(J,Q);v.debug("Spawning command",{spawnCommand:G,spawnArgs:V.slice(0,10),filePath:J.filePath,timeoutMs:Z});let K=zT0(Y),q=!1,W=setTimeout(()=>{q=!0,K.abort(),v.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),H=RM8(G,V,{stdio:["pipe","pipe","pipe"],signal:K.signal,detached:!0}),z=[],U=[],D=0;H.stdout?.on("data",(M)=>{let L=M.toString();if(D+=L.length,D<=Gz)z.push(L);else{let A=Gz-(D-L.length);if(A>0)z.push(L.slice(0,A))}}),H.stderr?.on("data",(M)=>{let L=M.toString();if(D+=L.length,D<=Gz)U.push(L);else{let A=Gz-(D-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(M)=>{if(clearTimeout(W),q){X({success:!1,output:z.join(""),error:`Command timed out after ${Z}ms`,exitCode:void 0});return}if(K.signal.aborted){X({success:!1,output:z.join(""),error:"The command was aborted",exitCode:M??void 0});return}let L=M===0||M===1,A=z.join(""),E=U.join(""),I=A;if(!L&&!A.trim()&&E.trim())I=E;else if(E.trim())I+=A?`
|
|
4701
4701
|
${E}`:E;if(D>Gz)I+=`
|
|
4702
|
-
... (output truncated at ${Gz} characters)`;X({success:L,output:I.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(q)L=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:z.join(""),error:L})})})}function _M8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return yM8(Z,Y?[...Y]:null,X,Q);else return kM8(Z,Y?[...Y]:null,X,Q)}function kM8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function yM8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Y]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Y]];case".exe":return[J,Y];default:return[J,Y]}}B0();OG();w7();fW();NY();uG();eW();uK();T8();K7();l_();n0();var VY6=q6(RP(),1);import{writeFile as XY6}from"fs/promises";import $Y6 from"path";B0();NY();class ok1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764950485-g0c2b44"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Yr(Q,this.configService)}catch(Q){v.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class EC extends d0{props;constructor(J){super();this.props=J}createState(){return new xZ6}}class xZ6 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Z)=>{this.setState(()=>{this._state=Z(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class vZ6 extends u0{controller=new R$;focusNode=new F8({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=A4.all(new q4(Z.foreground,1,"solid")),q=new lA({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let M=D.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Z.foreground,border:null},maxLines:1}),W=new A6({children:[new g0({decoration:{color:F1.default()},child:new _1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]}),H=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new i("Enter",new e({color:Y.keybind}))),z.push(new i(" to submit, ",new e({color:Z.foreground,dim:!0})));z.push(new i("Esc",new e({color:Y.keybind}))),z.push(new i(" to cancel",new e({color:Z.foreground,dim:!0})));let U=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i("",void 0,z)})});return new g0({decoration:{border:K,color:F1.default()},padding:F0.all(1),child:new v0({children:[H,new X0({height:1}),W,new t9,U]})})}}class C91 extends d0{props;constructor(J){super();this.props=J}createState(){return new vZ6}}eW();class fZ6 extends u0{controller=new R$;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new F8({debugLabel:"CommandMultilinePrompt",onKey:(J)=>{if(J.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=(J)=>{if(this.imageAttachments.length>=oF)return!1;let Q=GC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,G=f4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new XO({controller:this.controller,triggers:[new nB],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Z,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:a8.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new q8({focusNode:this.focusNode,child:K}),W=new g0({constraints:new P6({maxHeight:V}),padding:F0.symmetric(1,0),child:q}),H=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=new g0({padding:F0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new i("",void 0,[new i("Esc",new e({color:Y.keybind})),new i(" again to clear input",new e({color:Z.foreground,dim:!0}))]):new i("",void 0,[new i("Press ",new e({color:Z.foreground,dim:!0})),new i("Enter",new e({color:Y.keybind})),new i(" to submit, ",new e({color:Z.foreground,dim:!0})),new i("Esc",new e({color:Y.keybind})),new i(" to clear",new e({color:Z.foreground,dim:!0}))])})}),U=[H,new X0({height:1}),new e6({child:W}),new X0({height:1}),z];return new g0({decoration:{border:A4.all(new q4(Z.foreground,1,"solid")),color:F1.default()},padding:F0.all(1),child:new v0({children:U})})}}class IC extends d0{props;constructor(J){super();this.props=J}createState(){return new fZ6}}import{isDeepStrictEqual as hM8}from"node:util";var xM8=/[\\/_ +.#"@[({&]/,vM8=/[\\/_ +.#"@[({&]/g,fM8=/[\s-]/,hZ6=/[\s-]/g;function S91(J,Q,Z,Y,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Y.charAt(G),W=Z.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=S91(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(fM8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(hZ6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(xM8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(vM8),D&&X>0)z*=Math.pow(0.999,D.length)}else if(z*=0.3,X>0)z*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))z*=0.9999}if(z<0.1&&(Z.charAt(W-1)===Y.charAt(G+1)||Y.charAt(G+1)===Y.charAt(G)&&Z.charAt(W-1)!==Y.charAt(G))){if(U=S91(J,Q,Z,Y,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Z.indexOf(q,W+1)}return V[K]=H,H}function j91(J){return J.toLowerCase().replace(hZ6," ")}function bZ6(J,Q){let Z=S91(J,Q,j91(J),j91(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=S91(J,K,j91(J),j91(K),0,0,{});if(q===0)return Z;X+=q,G+=K.length}let V=X/Y.length*0.95;return Math.max(Z,V)}return Z}class PC{}class TC{}class _91{}class k91{}class gZ6 extends d0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new mZ6}}class mZ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function bM8(J,Q){if(J==="")return{matches:!0,score:1};let Z=bZ6(Q,J);return{matches:Z>0.15,score:Z}}class dQ extends d0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new uZ6}}class uZ6 extends u0{controller=new R$;focusNode;scrollController=new D7;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new F8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),m8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!hM8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof PC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof TC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof _91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Z=Q[this.selectedIndex];if(Z){if(!(this.widget.props.isItemDisabled?.(Z)??!1))this.widget.props.onAccept(Z)}}return"handled"}if(J instanceof k91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...bM8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,Y)=>this.widget.props.sortItems(Z,Y,J):(Z,Y)=>Y.score-Z.score).map((Z)=>Z.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Z=0,Y=Q.size.height;P81(J,{top:Z,bottom:Y},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),m8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Z=this.getFilteredItems();if(J>=0&&J<Z.length){let Y=Z[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Z[this.selectedIndex]??null);else if(Q===2&&!X){if(Y)this.widget.props.onAccept(Y)}}};build(J){let Q=$6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=A4.all(new q4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new lA({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new lY({shortcuts:new Map([[new G4("ArrowDown"),new PC],[new G4("ArrowUp"),new TC],[new G4("Tab"),new PC],[new G4("Tab",{shift:!0}),new TC],[new G4("n",{ctrl:!0}),new PC],[new G4("p",{ctrl:!0}),new TC],[new G4("Enter"),new _91],[new G4("Escape"),new k91]]),focusNode:this.focusNode,child:V}),q=new $J({actions:new Map([[PC,new O8(this.invoke)],[TC,new O8(this.invoke)],[_91,new O8(this.invoke)],[k91,new O8(this.invoke)]]),child:K}),W=new A6({children:[new g0({decoration:{color:F1.default()},child:new _1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new X0({height:10,child:new k4({child:new _1({text:new i(L,new e({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new e6({child:new k4({child:new _1({text:new i(this.widget.props.emptyStateText,new e({color:Z.foreground,dim:!0}))})})});else{let L=Y.map((A,E)=>{let I=E===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,I,P,J);else{let k=I?F1.yellow:void 0,y=I?F1.black:Z.foreground;R=new g0({decoration:k?{color:k}:void 0,padding:F0.symmetric(2,0),child:new _1({text:new i(this.widget.props.getLabel(A),new e({color:y,dim:P}))})})}return new gZ6(new $8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new v0({children:L,crossAxisAlignment:"start"})}let z=new e6({child:new $8({onScroll:this.handleScroll,opaque:!1,child:new _5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i(this.widget.props.title,new e({color:F1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new X0({height:1}),z),this.controller.text!==""){let L=Y.length>0?Y[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new g0({padding:F0.vertical(1),child:new k4({child:A})}));else U.push(new X0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new g0({decoration:{border:X,color:F1.default()},padding:F0.symmetric(1,0),child:new v0({children:U})})}}class rk1 extends d0{createState(){return new pZ6}}class pZ6 extends u0{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){return new _1({text:new i("●",new e({color:this.isGreen?F1.green:F1.index(8),bold:!0})),maxLines:1})}}function gM8(J){let Q=new Map,Z=new Map,Y=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Y.set(V.id,K.type);let q=K.threadID,W=Z.get(q)||[];W.push(V),Z.set(q,W)}else X.push(V)}return nY.flatten(X,(V)=>Z.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function sk1(J,Q,Z){return new _1({text:new i(`${J}${Q}`,new e({color:Z})),maxLines:1})}function mM8(J,Q,Z,Y){return[sk1("+",J,Y.success),t9.horizontal(1),sk1("~",Q,Y.warning),t9.horizontal(1),sk1("-",Z,Y.destructive)]}class y91 extends R6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Z=this.props.recentThreadIDs||[],Y=this.props.currentThreadID,X=[...Q].sort((H,z)=>{if(Y){if(H.id===Y)return-1;if(z.id===Y)return 1}let U=Z.indexOf(H.id),D=Z.indexOf(z.id);if(U!==-1&&D!==-1)return U-D;if(U!==-1)return-1;if(D!==-1)return 1;return 0}),G=gM8(X),V=Math.max(0,...G.map((H)=>H.description.timeAgo.length)),K=$6.of(J),q=new H6({padding:F0.symmetric(0,1),child:new k4({child:new _1({text:new i("",new e({color:K.colors.foreground,dim:!0}),[new i("Ctrl+T",new e({color:F1.blue,dim:!0})),new i(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new e({color:K.colors.foreground,dim:!0}))])})})});return new dQ({items:G,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:q,renderItem:(H,z,U,D)=>{let M=$6.of(D),{colors:L}=M,A=z?F1.yellow:void 0,E=z?F1.black:L.foreground,I=F1.index(8),P=(X1,t)=>new X0({width:t,child:A6.end([new _1({text:new i(X1,new e({color:I}))})])}),R=this.props.threadViewStates[H.id],k=[],y=H.relationshipType==="handoff",x=new k81;if(H.depth>0){let X1=[],t=H.ancestorsAreLast.slice(1);for(let H1 of t)X1.push(new i(x.getAncestorPrefix(H1),new e({color:x.connectorColor,dim:x.connectorDim})));let p=H.isLast?x.elbow:x.tee,J1=x.getConnectorText(p);X1.push(new i(J1,new e({color:x.connectorColor,dim:x.connectorDim}))),k.push(new _1({text:new i("",void 0,X1)}))}let b=[],d=this.props.currentThreadID===H.id?new i("(current) ",new e({color:F1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new i("(visited) ",new e({color:L.foreground,dim:!0})):null;if(d)b.push(new _1({text:d}));if(R){if(R.state==="active"&&(R.interactionState==="tool-running"||R.interactionState===!1))b.push(new rk1),b.push(new X0({width:1}))}let m=H.title;if(H.relationshipType==="fork"){let X1=m.match(/^Forked\((\d+)\): /);if(X1)m=m.slice(X1[0].length);else while(m.startsWith("Forked: "))m=m.slice(8);b.push(new _1({text:new i("[fork] ",new e({color:F1.blue}))}))}else if(y)b.push(new _1({text:new i("[handoff] ",new e({color:F1.index(208)}))}));if(b.push(new e6({child:new _1({text:new i(m,new e({color:E})),overflow:"ellipsis",maxLines:1})})),b.push(new X0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let X1=z?{success:I,warning:I,destructive:I}:L;b.push(...mM8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,X1)),b.push(new X0({width:2}))}return b.push(P(H.description.timeAgo,V)),new g0({decoration:A?{color:A}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[...k,...b]})})}})}}function dZ6(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class tk1 extends R6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Z=Math.max(0,...Q.map((X)=>dZ6(X.pubDate).length));return new dQ({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=$6.of(K),{colors:W}=q,H=G?F1.yellow:void 0,z=G?F1.black:W.foreground,U=F1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new X0({width:A,child:A6.end([new _1({text:new i(L,new e({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[new e6({child:new _1({text:new i(X.title,new e({color:z})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new _1({text:new i(D,new e({color:U})),maxLines:1}),new X0({width:2}),M(dZ6(X.pubDate),Z)]})})}})}}class ek1 extends R6{props;constructor(J){super();this.props=J}build(){return new k4({child:new _1({text:new i("",void 0,[new i(`Forked to new thread:
|
|
4702
|
+
... (output truncated at ${Gz} characters)`;X({success:L,output:I.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(q)L=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:z.join(""),error:L})})})}function _M8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return yM8(Z,Y?[...Y]:null,X,Q);else return kM8(Z,Y?[...Y]:null,X,Q)}function kM8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function yM8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Y]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Y]];case".exe":return[J,Y];default:return[J,Y]}}B0();OG();w7();fW();NY();uG();eW();uK();T8();K7();l_();n0();var VY6=q6(RP(),1);import{writeFile as XY6}from"fs/promises";import $Y6 from"path";B0();NY();class ok1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764979300-g324cf3"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Yr(Q,this.configService)}catch(Q){v.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class EC extends d0{props;constructor(J){super();this.props=J}createState(){return new xZ6}}class xZ6 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Z)=>{this.setState(()=>{this._state=Z(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class vZ6 extends u0{controller=new R$;focusNode=new F8({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=A4.all(new q4(Z.foreground,1,"solid")),q=new lA({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let M=D.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Z.foreground,border:null},maxLines:1}),W=new A6({children:[new g0({decoration:{color:F1.default()},child:new _1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]}),H=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new i("Enter",new e({color:Y.keybind}))),z.push(new i(" to submit, ",new e({color:Z.foreground,dim:!0})));z.push(new i("Esc",new e({color:Y.keybind}))),z.push(new i(" to cancel",new e({color:Z.foreground,dim:!0})));let U=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i("",void 0,z)})});return new g0({decoration:{border:K,color:F1.default()},padding:F0.all(1),child:new v0({children:[H,new X0({height:1}),W,new t9,U]})})}}class C91 extends d0{props;constructor(J){super();this.props=J}createState(){return new vZ6}}eW();class fZ6 extends u0{controller=new R$;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new F8({debugLabel:"CommandMultilinePrompt",onKey:(J)=>{if(J.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=(J)=>{if(this.imageAttachments.length>=oF)return!1;let Q=GC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,G=f4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new XO({controller:this.controller,triggers:[new nB],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Z,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:a8.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new q8({focusNode:this.focusNode,child:K}),W=new g0({constraints:new P6({maxHeight:V}),padding:F0.symmetric(1,0),child:q}),H=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i("",void 0,[new i("Command: ",new e({color:Z.foreground})),new i(this.widget.props.commandName,new e({color:F1.yellow,bold:!0}))])})}),z=new g0({padding:F0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new i("",void 0,[new i("Esc",new e({color:Y.keybind})),new i(" again to clear input",new e({color:Z.foreground,dim:!0}))]):new i("",void 0,[new i("Press ",new e({color:Z.foreground,dim:!0})),new i("Enter",new e({color:Y.keybind})),new i(" to submit, ",new e({color:Z.foreground,dim:!0})),new i("Esc",new e({color:Y.keybind})),new i(" to clear",new e({color:Z.foreground,dim:!0}))])})}),U=[H,new X0({height:1}),new e6({child:W}),new X0({height:1}),z];return new g0({decoration:{border:A4.all(new q4(Z.foreground,1,"solid")),color:F1.default()},padding:F0.all(1),child:new v0({children:U})})}}class IC extends d0{props;constructor(J){super();this.props=J}createState(){return new fZ6}}import{isDeepStrictEqual as hM8}from"node:util";var xM8=/[\\/_ +.#"@[({&]/,vM8=/[\\/_ +.#"@[({&]/g,fM8=/[\s-]/,hZ6=/[\s-]/g;function S91(J,Q,Z,Y,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Y.charAt(G),W=Z.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=S91(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(fM8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(hZ6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(xM8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(vM8),D&&X>0)z*=Math.pow(0.999,D.length)}else if(z*=0.3,X>0)z*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))z*=0.9999}if(z<0.1&&(Z.charAt(W-1)===Y.charAt(G+1)||Y.charAt(G+1)===Y.charAt(G)&&Z.charAt(W-1)!==Y.charAt(G))){if(U=S91(J,Q,Z,Y,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Z.indexOf(q,W+1)}return V[K]=H,H}function j91(J){return J.toLowerCase().replace(hZ6," ")}function bZ6(J,Q){let Z=S91(J,Q,j91(J),j91(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=S91(J,K,j91(J),j91(K),0,0,{});if(q===0)return Z;X+=q,G+=K.length}let V=X/Y.length*0.95;return Math.max(Z,V)}return Z}class PC{}class TC{}class _91{}class k91{}class gZ6 extends d0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new mZ6}}class mZ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function bM8(J,Q){if(J==="")return{matches:!0,score:1};let Z=bZ6(Q,J);return{matches:Z>0.15,score:Z}}class dQ extends d0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new uZ6}}class uZ6 extends u0{controller=new R$;focusNode;scrollController=new D7;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new F8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),m8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!hM8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof PC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof TC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof _91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Z=Q[this.selectedIndex];if(Z){if(!(this.widget.props.isItemDisabled?.(Z)??!1))this.widget.props.onAccept(Z)}}return"handled"}if(J instanceof k91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...bM8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,Y)=>this.widget.props.sortItems(Z,Y,J):(Z,Y)=>Y.score-Z.score).map((Z)=>Z.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Z=0,Y=Q.size.height;P81(J,{top:Z,bottom:Y},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),m8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Z=this.getFilteredItems();if(J>=0&&J<Z.length){let Y=Z[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Z[this.selectedIndex]??null);else if(Q===2&&!X){if(Y)this.widget.props.onAccept(Y)}}};build(J){let Q=$6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=A4.all(new q4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new lA({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new lY({shortcuts:new Map([[new G4("ArrowDown"),new PC],[new G4("ArrowUp"),new TC],[new G4("Tab"),new PC],[new G4("Tab",{shift:!0}),new TC],[new G4("n",{ctrl:!0}),new PC],[new G4("p",{ctrl:!0}),new TC],[new G4("Enter"),new _91],[new G4("Escape"),new k91]]),focusNode:this.focusNode,child:V}),q=new $J({actions:new Map([[PC,new O8(this.invoke)],[TC,new O8(this.invoke)],[_91,new O8(this.invoke)],[k91,new O8(this.invoke)]]),child:K}),W=new A6({children:[new g0({decoration:{color:F1.default()},child:new _1({text:new i(">",new e({color:Z.foreground}))})}),new e6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new X0({height:10,child:new k4({child:new _1({text:new i(L,new e({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new e6({child:new k4({child:new _1({text:new i(this.widget.props.emptyStateText,new e({color:Z.foreground,dim:!0}))})})});else{let L=Y.map((A,E)=>{let I=E===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,I,P,J);else{let k=I?F1.yellow:void 0,y=I?F1.black:Z.foreground;R=new g0({decoration:k?{color:k}:void 0,padding:F0.symmetric(2,0),child:new _1({text:new i(this.widget.props.getLabel(A),new e({color:y,dim:P}))})})}return new gZ6(new $8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new v0({children:L,crossAxisAlignment:"start"})}let z=new e6({child:new $8({onScroll:this.handleScroll,opaque:!1,child:new _5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i(this.widget.props.title,new e({color:F1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new X0({height:1}),z),this.controller.text!==""){let L=Y.length>0?Y[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new g0({padding:F0.vertical(1),child:new k4({child:A})}));else U.push(new X0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new g0({decoration:{border:X,color:F1.default()},padding:F0.symmetric(1,0),child:new v0({children:U})})}}class rk1 extends d0{createState(){return new pZ6}}class pZ6 extends u0{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){return new _1({text:new i("●",new e({color:this.isGreen?F1.green:F1.index(8),bold:!0})),maxLines:1})}}function gM8(J){let Q=new Map,Z=new Map,Y=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Y.set(V.id,K.type);let q=K.threadID,W=Z.get(q)||[];W.push(V),Z.set(q,W)}else X.push(V)}return nY.flatten(X,(V)=>Z.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function sk1(J,Q,Z){return new _1({text:new i(`${J}${Q}`,new e({color:Z})),maxLines:1})}function mM8(J,Q,Z,Y){return[sk1("+",J,Y.success),t9.horizontal(1),sk1("~",Q,Y.warning),t9.horizontal(1),sk1("-",Z,Y.destructive)]}class y91 extends R6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Z=this.props.recentThreadIDs||[],Y=this.props.currentThreadID,X=[...Q].sort((H,z)=>{if(Y){if(H.id===Y)return-1;if(z.id===Y)return 1}let U=Z.indexOf(H.id),D=Z.indexOf(z.id);if(U!==-1&&D!==-1)return U-D;if(U!==-1)return-1;if(D!==-1)return 1;return 0}),G=gM8(X),V=Math.max(0,...G.map((H)=>H.description.timeAgo.length)),K=$6.of(J),q=new H6({padding:F0.symmetric(0,1),child:new k4({child:new _1({text:new i("",new e({color:K.colors.foreground,dim:!0}),[new i("Ctrl+T",new e({color:F1.blue,dim:!0})),new i(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new e({color:K.colors.foreground,dim:!0}))])})})});return new dQ({items:G,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:q,renderItem:(H,z,U,D)=>{let M=$6.of(D),{colors:L}=M,A=z?F1.yellow:void 0,E=z?F1.black:L.foreground,I=F1.index(8),P=(X1,t)=>new X0({width:t,child:A6.end([new _1({text:new i(X1,new e({color:I}))})])}),R=this.props.threadViewStates[H.id],k=[],y=H.relationshipType==="handoff",x=new k81;if(H.depth>0){let X1=[],t=H.ancestorsAreLast.slice(1);for(let H1 of t)X1.push(new i(x.getAncestorPrefix(H1),new e({color:x.connectorColor,dim:x.connectorDim})));let p=H.isLast?x.elbow:x.tee,J1=x.getConnectorText(p);X1.push(new i(J1,new e({color:x.connectorColor,dim:x.connectorDim}))),k.push(new _1({text:new i("",void 0,X1)}))}let b=[],d=this.props.currentThreadID===H.id?new i("(current) ",new e({color:F1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new i("(visited) ",new e({color:L.foreground,dim:!0})):null;if(d)b.push(new _1({text:d}));if(R){if(R.state==="active"&&(R.interactionState==="tool-running"||R.interactionState===!1))b.push(new rk1),b.push(new X0({width:1}))}let m=H.title;if(H.relationshipType==="fork"){let X1=m.match(/^Forked\((\d+)\): /);if(X1)m=m.slice(X1[0].length);else while(m.startsWith("Forked: "))m=m.slice(8);b.push(new _1({text:new i("[fork] ",new e({color:F1.blue}))}))}else if(y)b.push(new _1({text:new i("[handoff] ",new e({color:F1.index(208)}))}));if(b.push(new e6({child:new _1({text:new i(m,new e({color:E})),overflow:"ellipsis",maxLines:1})})),b.push(new X0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let X1=z?{success:I,warning:I,destructive:I}:L;b.push(...mM8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,X1)),b.push(new X0({width:2}))}return b.push(P(H.description.timeAgo,V)),new g0({decoration:A?{color:A}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[...k,...b]})})}})}}function dZ6(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class tk1 extends R6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Z=Math.max(0,...Q.map((X)=>dZ6(X.pubDate).length));return new dQ({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=$6.of(K),{colors:W}=q,H=G?F1.yellow:void 0,z=G?F1.black:W.foreground,U=F1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new X0({width:A,child:A6.end([new _1({text:new i(L,new e({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:F0.symmetric(2,0),child:new A6({children:[new e6({child:new _1({text:new i(X.title,new e({color:z})),overflow:"ellipsis",maxLines:1})}),new X0({width:2}),new _1({text:new i(D,new e({color:U})),maxLines:1}),new X0({width:2}),M(dZ6(X.pubDate),Z)]})})}})}}class ek1 extends R6{props;constructor(J){super();this.props=J}build(){return new k4({child:new _1({text:new i("",void 0,[new i(`Forked to new thread:
|
|
4703
4703
|
|
|
4704
4704
|
`,new e({color:F1.white,dim:!0})),new i(`"${this.props.newThreadTitle||"Untitled"}"`,new e({color:F1.white}))]),textAlign:"center"})})}}B0();class cZ6 extends u0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let J=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!J.ok){v.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){v.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){if(J.length===0)return null;if(J.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(J))return"Label must be lowercase alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null}buildItemsWithCreateOption(){let J=this.widget.props.currentLabels||[],Z=[...this.labels.filter((Y)=>!J.includes(Y.name))];if(this.currentQuery.trim().length>0&&!this.isLoading){let Y=this.currentQuery.trim().toLowerCase(),X=this.labels.some((V)=>V.name===Y),G=J.includes(Y);if(!X&&!G&&this.isValidLabelName(Y))Z.unshift({id:"__create__",name:Y,createdAt:"",__isCreateMarker:!0})}return Z}build(J){let Q=$6.of(J),{colors:Z}=Q,Y=this.currentQuery.trim().toLowerCase(),X=Y.length>0?this.getValidationError(Y):null;return new dQ({title:"Add Label",items:this.buildItemsWithCreateOption(),getLabel:(G)=>G.name,onAccept:(G)=>{this.widget.props.onSelect(G.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:X||"Type to create a new label",renderItem:(G,V,K,q)=>{let W=V?F1.yellow:void 0,H=V?F1.black:Z.foreground;if("__isCreateMarker"in G&&G.__isCreateMarker)return new g0({decoration:W?{color:W}:void 0,padding:F0.symmetric(2,0),child:new _1({text:new i("",void 0,[new i("Create: ",new e({color:H})),new i(G.name,new e({color:H,bold:!0}))])})});return new g0({decoration:W?{color:W}:void 0,padding:F0.symmetric(2,0),child:new _1({text:new i(G.name,new e({color:H}))})})},filterItem:(G,V)=>{let K=this.currentQuery;if(this.currentQuery=V,K!==V)this.setState();if("__isCreateMarker"in G&&G.__isCreateMarker)return!0;let W=V.trim().toLowerCase();return W.length===0||G.name.includes(W)}})}}class Jy1 extends d0{props;constructor(J){super();this.props=J}createState(){return new cZ6}}class bq extends d0{props;constructor(J){super();this.props=J}createState(){return new lZ6}}class lZ6 extends u0{_spinner=new C$;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(J){let Q=$6.of(J),{colors:Z}=Q,Y=A4.all(new q4(Z.foreground,1,"solid")),X=this._spinner.toBraille(),G=new _1({textAlign:"center",text:new i("",void 0,[new i(X,new e({color:F1.yellow})),new i(" ",void 0),new i(this.widget.props.message,new e({color:Z.foreground}))])}),K=[new e6({child:new v0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[G]})})];if(this.widget.props.onAbort)K.push(new X0({height:2,child:new g0({padding:F0.symmetric(2,0),child:new _1({text:new i("",new e({dim:!0}),[new i("Press ",new e({color:Z.foreground})),new i("Esc",new e({color:Z.info})),new i(" to cancel",new e({color:Z.foreground}))])})})}));let q=new g0({decoration:new U8(F1.default(),Y),child:new X0({width:60,height:7,child:new v0({mainAxisAlignment:"start",children:K})})});if(this.widget.props.onAbort)return new q8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:q});return q}}class wV extends d0{props;constructor(J){super();this.props=J}createState(){return new iZ6}}class iZ6 extends u0{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof AV}build(J){let Q=this.widget.props.message,Z=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let W=C81(Q);return{title:W.title,type:W.type,description:W.description}})(),Y=Z.type==="error"?F1.red:F1.yellow,X=A4.all(new q4(F1.default(),1,"solid")),G=new g0({padding:F0.symmetric(1,0),child:new _1({text:new i(Z.title,new e({color:Y,bold:!0}))})}),V=this.isWidgetMessage(Q)?Q.widget:new _1({text:new i(Z.description,new e({color:F1.default()})),selectable:!0}),K=new e6({child:new pA({child:new g0({padding:F0.symmetric(1,0),child:V})})}),q=new g0({padding:F0.symmetric(1,0),child:new _1({text:this.widget.props.onRetry?new i("",void 0,[new i("Press ",new e({color:F1.default(),dim:!0})),new i("R",new e({color:F1.yellow})),new i(" to retry, ",new e({color:F1.default(),dim:!0})),new i("Esc",new e({color:F1.yellow})),new i(" to cancel",new e({color:F1.default(),dim:!0}))]):new i("Press any key to close",new e({color:F1.default(),dim:!0,italic:!0}))})});return new q8({onKey:(W)=>{if(this.widget.props.onRetry&&W.key==="r")return this.widget.props.onRetry(),"handled";if(W.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!0,child:new g0({decoration:{border:X,color:F1.default()},padding:F0.all(1),child:new v0({mainAxisAlignment:"center",children:[G,new X0({height:1}),K,q]})})})}}class Qy1 extends R6{build(){return new k4({child:new _1({text:new i("",void 0,[new i(`✓ Thread Shared
|
|
4705
4705
|
|
|
@@ -4791,7 +4791,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
4791
4791
|
`)?`${K}...`:X,W=new e({color:F1.index(8)}),H=[new i(q,W)];if(V>0){let z=new e({color:Z.success});for(let U=1;U<=V;U++)H.push(new i(" ")),H.push(new i(`[${U}]`,z))}return new H6({padding:F0.only({bottom:0}),child:new A6({crossAxisAlignment:"start",children:[new H6({padding:F0.only({right:1}),child:new _1({text:new i("•",new e({color:F1.index(8)}))})}),new e6({child:new _1({text:new i("",void 0,H)})})]})})}}class my1 extends d0{createState(){return new JX6}}class JX6 extends u0{_animationTimer;_visible=!0;initState(){super.initState(),this._startAnimation()}dispose(){this._stopAnimation(),super.dispose()}_startAnimation(){this._animationTimer=setInterval(()=>{this.setState(()=>{this._visible=!this._visible})},500)}_stopAnimation(){if(this._animationTimer)clearInterval(this._animationTimer),this._animationTimer=void 0}build(J){let Q=new e({color:F1.red}),Z=new e({color:this._visible?F1.red:F1.transparent()});return new A6({children:[new _1({text:new i("⏺",Z)}),new X0({width:1}),new _1({text:new i("Replay",Q)})]})}}class uy1 extends R6{entry;width;constructor({key:J,entry:Q,width:Z}){super({key:J});this.entry=Q,this.width=Z}build(J){let Z=$6.of(J).colors.mutedForeground,Y=this.entry,X=Y.authors[0]?.name||"Community";if(X.includes("@"))X=X.split("@")[0]??X;let G=" · ",V=50,K=this.truncateToWidth(Y.title,V),q=`${G}${K}`,W=Math.max(1,this.width-q.length-2),H=Y.description.replace(/\s+/g," ").trim(),z=`@${X}: ${H}`,U=this.truncateToWidth(z,W),D=new _1({text:new i(U,new e({color:Z,dim:!0}))}),M=new _1({text:new i(q,new e({color:Z,dim:!0}))});return new $8({onClick:()=>GJ(J,Y.link),cursor:"pointer",child:new X0({width:this.width,height:1,child:new H6({padding:F0.horizontal(1),child:new A6({children:[new e6({child:new bB(new X0({width:W,height:1,child:D}))}),M]})})})})}truncateToWidth(J,Q){if(J.length<=Q)return J;return J.slice(0,Q-1)+"…"}}n0();function XA8(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/3600000),X=Math.floor(Y/24),G=Math.floor(X/7),V=Math.floor(X/30);if(Y<1)return"Just now";if(Y<24)return`${Y}h ago`;if(X<7)return`${X}d ago`;if(G<=4)return`${G}w ago`;return`${V}mo ago`}class py1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Z)=>{let Y=this.threadHistoryService.observeThreadList().subscribe((X)=>{Y.unsubscribe(),Z(X)})});return{ok:!0,threads:this.formatThreadSummaries(Q,J)}}catch(Q){return{ok:!1,errorMsg:Q instanceof Error?Q.message:"An unexpected error occurred"}}}observeThreadSummaries(J=""){return this.threadHistoryService.observeHistory().pipe(Q6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((Y)=>{if(!Q.trim())return!0;let X=Y.title?.toLowerCase()||"untitled",G=Y.id.toLowerCase(),V=Q.toLowerCase();return X.includes(V)||G.includes(V)}).map((Y)=>{let X=new Date(Y.userLastInteractedAt),G=XA8(X),V=Y.id.slice(-8),K=Y.env?.initial.trees?.[0]?.uri;return{id:Y.id,title:Y.title||"Untitled",updatedAt:new Date(Y.userLastInteractedAt).toISOString(),description:{timeAgo:G,title:Y.title||"Untitled",shortThreadID:V},diffStats:Y.summaryStats?.diffStats,workspaceURI:K,parentRelationships:Y.parentRelationships}})}}B0();T8();class dy1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new D7;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){v.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){v.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(eD()).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 QX6(J,Q){switch(J){case"update-available":return[new i("A newer Amp is available. Run ",new e({color:Q.foreground,dim:!0})),new i("amp update",new e({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new i("Update complete, run ",new e({color:Q.foreground,dim:!0})),new i("amp update",new e({color:Q.warning})),new i(" to see warnings",new e({color:Q.foreground,dim:!0}))];case"update-error":return[new i("Update failed, run ",new e({color:Q.foreground,dim:!0})),new i("amp update",new e({color:Q.warning})),new i(" to see warnings",new e({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function qA8(J){return new Promise((Q)=>{GA8("git",["branch","--show-current"],{cwd:J},(Z,Y)=>{if(Z){Q(null);return}let X=Y.trim();Q(X||null)})})}class qX6 extends d0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new ry1}}class ry1 extends u0{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;threadLoadSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;statusMessage=null;statusMessageTimer=null;isShowingHelp=!1;isShowingConsoleOverlay=!1;isShowingMCPStatusModal=!1;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;isShowingContextDetailOverlay=!1;threadCostInfo=void 0;threadCostInfoThreadID=void 0;threadCostInfoLastUsageLedgerLength=0;lastInferenceState=void 0;confirmationOverlayContent="";exitConfirmTimeout=null;clearInputConfirmTimeout=null;cancelProcessingConfirmTimeout=null;historyIndex=-1;historyDraft=null;bashInvocations=[];dismissedEphemeralErrorKey=null;currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;isShowingPalette=!1;paletteShowOptions=null;threadsForPicker=[];clustersForPicker=[];isLoadingThreads=!1;threadPreviewController=new dy1;previewThread=null;planScrollController=(()=>{let J=new D7;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new D7;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new F8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new F8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;adActionModal=null;threadFeedReader=null;currentThreadFeedEntry=null;threadFeedEntries=[];threadFeedSubscription=null;threadFeedRotationTimer=null;threadFeedHidden=!1;threadFeedTickerQueue=[];hasSubmittedFirstMessage=!1;currentUserInfo=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;pendingMCPServers=[];mcpTrustSubscription=null;mcpServers=[];mcpServersSubscription=null;cacheTimerState=null;cacheTimerSubscription=null;agentModeController=null;freeTierStatus=void 0;agentModePulseSeq=0;agentModeSlideProgress=null;agentModeSlideTimer=null;updateState="hidden";updateServiceSubscription=null;toastController=new _S1;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=null;mysteriousMessage=null;isShowingMysteriousMessageModal=!1;mysteriousMessageSubscription=null;mysterySequenceManager=null;mysterySequenceProgress=null;mysteryKeyInterceptorUnsubscribe=null;static MYSTERY_SEQUENCE=["ctrl+x","y","z"];async initThreadFeed(){let J=await V6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Z=Q.includes("localhost")||Q.includes("127.0.0.1");try{let V=await this.widget.dependencies.internalAPIClient.getUserInfo({},{config:this.widget.dependencies.configService});if(V.ok){let K=V.result,q="user"in K?K.user:K;this.currentUserInfo={username:q.username??void 0,displayName:q.displayName??void 0};let W="ffe10a0c-6c42-41ce-a3a6-38990fd6caf8";if(!Z&&K.team?.id!==W)return}else return}catch(V){v.debug("Failed to fetch user info for thread feed filtering",V);return}let Y="/threads.rss",X=async(V,K)=>{let q=V instanceof Request?V.url:V.toString();return a2(q,K,this.widget.dependencies.configService)},G=Yo0();G.get("entries").then((V)=>{if(V){let K=this.filterEntries(V);if(this.threadFeedEntries=K,K.length>0&&!this.currentThreadFeedEntry){let q=[...K].sort((H,z)=>z.pubDate.getTime()-H.pubDate.getTime());this.threadFeedTickerQueue=[...q,...this.threadFeedTickerQueue];let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}),this.threadFeedReader=new nj1(G,X,{url:Y}),this.threadFeedSubscription=this.threadFeedReader.stream().subscribe({next:(V)=>{try{let K=this.filterEntries(V);if(K.length>0){this.threadFeedEntries=[...K,...this.threadFeedEntries];let q=[...K].sort((W,H)=>H.pubDate.getTime()-W.pubDate.getTime());if(this.threadFeedTickerQueue=[...q,...this.threadFeedTickerQueue],!this.currentThreadFeedEntry){let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}catch(K){v.error("Thread feed: error in next handler",K)}},error:(V)=>{v.error("Thread feed error:",V)}}),this.resetThreadFeedRotation()}filterEntries(J){if(!this.currentUserInfo)return J;let{username:Q,displayName:Z}=this.currentUserInfo;return J.filter((Y)=>{return!Y.authors.some((X)=>{let G=X.name;if(!G)return!1;return Q&&G===Q||Z&&G===Z||Q&&G.includes(Q)})})}rotateThreadFeed(){if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);this.threadFeedRotationTimer=setInterval(()=>{let J=this.getNextFeedEntry();if(J)this.setState(()=>{this.currentThreadFeedEntry=J})},30000)}resetThreadFeedRotation(){this.rotateThreadFeed()}getNextFeedEntry(){if(this.threadFeedTickerQueue.length>0)return this.threadFeedTickerQueue.shift();return null}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1,this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Z,baseWpm:Y}=J,X=Q.messages;for(let G=0;G<X.length;G++){if(this.replayAbortController.signal.aborted)break;let V=X[G];if(!V)continue;if(G>0)await this.replaySleep(J.messageDelayMs);if(V.role==="user"&&Z){let W=V.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
|
|
4792
4792
|
`);if(W)await this.replayTypeMessage(W,Y)}if(V.role==="assistant"){let W=V.content.some((U)=>U.type==="tool_use"),H=X[G+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...V,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let D=J.thread.id;this.getMessageScrollController(D).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),V]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,V],this.textController.clear()});let K=J.thread.id;this.getMessageScrollController(K).scrollToBottom()}await this.replaySleep(J.exitDelayMs),a8.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Z=J.split(/(?<=\s)/),Y=60000/Q;for(let X of Z){if(this.replayAbortController.signal.aborted)break;if(this.looksLikePastedContent(X.trim())){await this.replaySleep(150),this.textController.text=this.textController.text+X,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{}),await this.replaySleep(300);continue}let G=Y/X.length;for(let V of X){this.textController.text=this.textController.text+V,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let K=0.8+Math.random()*0.4,q=G*K;await this.replaySleep(q)}}}looksLikePastedContent(J){if(/^[a-z][a-z0-9+.-]*:\/\//i.test(J))return!0;if(J.startsWith("/")&&J.length>10)return!0;if(/^[a-z]:\\/i.test(J))return!0;if(/^[a-f0-9]{7,40}$/i.test(J))return!0;if(/^T-[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(J))return!0;return!1}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return this.agentModeController?.getEffectiveMode()??"smart"}isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;if(J.viewState.state!=="active")return!1;if(Boolean(J.viewState.inferenceState==="running"))return!0;let Z=J.items.filter((G)=>G.type==="toolResult").filter((G)=>G.toolResult.run.status==="in-progress"||G.toolResult.run.status==="queued"),Y=J.subagentActiveTools.filter((G)=>G.toolRun.status==="in-progress"||G.toolRun.status==="queued");return[...Z,...Y].length>0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new i(this.submitDisabledHint,new e({color:J.foreground,dim:!0}));if(this.isExiting)return new i("Exiting...",new e({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new i("",void 0,[new i("Ctrl+C",new e({color:Q.keybind})),new i(" again to exit",new e({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new i("",void 0,[new i("Esc",new e({color:Q.keybind})),new i(" again to clear input",new e({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new i("",void 0,[new i("Escape",new e({color:Q.keybind})),new i(" to close help",new e({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let X=this.getEffectiveAgentMode(),G=oy1(X);return new i("",void 0,[new i("Images aren't supported in ",new e({color:J.warning,dim:!1})),new i(X,new e({color:G})),new i(" mode.",new e({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new i("",void 0,[new i("Esc",new e({color:Q.keybind})),new i(" again to cancel",new e({color:J.foreground,dim:!0}))]);return new i("",void 0,[new i("Esc",new e({color:Q.keybind})),new i(" to cancel",new e({color:J.foreground,dim:!0}))])}if(this.statusMessage)return new i(this.statusMessage,new e({color:J.foreground,dim:!0}));let Z=QX6(this.updateState,J);if(Z)return new i("",void 0,Z);let Y=this.widget.dependencies.worker.thread;if(Y.agentMode==="plan"&&yA(Y))return new i("",void 0,[new i("Ctrl+O",new e({color:Q.keybind})),new i(" → Execute Plan",new e({color:J.foreground,dim:!0}))]);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Z}=this.widget.dependencies;if(!Q.mainThread?.id)return;let X=Q.mainThread?.messages.findIndex((G)=>G===J);if(X===void 0||X===-1)return;try{this.cancelBashInvocations(),await Z.cancel(),await Z.handle({type:"thread:truncate",fromIndex:X}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(G){v.error("Failed to edit message:",G)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Z,threadSyncService:Y}=this.widget.dependencies,X=Q.mainThread?.id;if(!X)return;let G=Q.mainThread?.messages.findIndex((V)=>V===J);if(G===void 0||G<=0)return;try{let V=await Q2.getOrCreateForThread(Z,X),K=await WR(V,Y,G-1);await this.switchToExistingThread(K)}catch(V){v.error("Failed to fork thread:",V),this.showErrorMessage(`Failed to fork thread: ${V}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Z,worker:Y}=this.widget.dependencies,X=Z.mainThread;if(!X)return;let G=X.messages.findIndex((V)=>V.messageId!==void 0&&V.messageId===J.messageId);if(G===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),this.widget.dependencies.history.add(Q);let V=mB(Q);if(V)await Y.handle({type:"thread:truncate",fromIndex:G}),this.invokeBashCommand(V.cmd,{visibility:V.visibility});else{let K=[{type:"text",text:Q}];if(this.imageAttachments.length>0)K.push(...this.imageAttachments);let q={content:K,agentMode:X.agentMode},W=G===0;if(X.agentMode&&!W&&q.agentMode!==X.agentMode){v.error(`Cannot edit message: This thread uses ${X.agentMode} mode. To change mode, create a new thread.`);return}await Y.handle({type:"user:message",message:q,index:G})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(V){v.error("Failed to edit message:",V)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(h2)}catch(Z){return v.error("Failed to get affected files:",Z),[]}};textController=new R$;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new D7);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let Y=this.searchElementTreeByKey(J.child,Q);if(Y)return Y}if(J?.children)for(let Y of J.children){let X=this.searchElementTreeByKey(Y,Q);if(X)return X}return null}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{this.toastController.show("Selection copied to clipboard","success",2000)}}}updateTerminalTitle(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.title;if(Q!==this.currentTitle){this.currentTitle=Q;let Z=process.cwd().replace(process.env.HOME||"","~"),Y=Q?`amp - ${Q} - ${Z}`:"";process.stdout.write(Yj1(Y))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new p7("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands;paletteConfig;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"){this.showCommandPalette(),this.textController.clear();return}let Q=mB(J);this.currentShellModeStatus=Q?.visibility,this.setState(()=>{})};navigateHistoryPrevious=()=>{let J=this.widget.dependencies.history.previous();if(J!==null){if(this.historyIndex===-1)this.historyDraft=this.textController.text;this.historyIndex++,this.textController.text=J,this.textController.moveCursorToStart()}};navigateHistoryNext=()=>{let J=this.widget.dependencies.history.next();if(J!==null)this.historyIndex--,this.textController.text=J,this.textController.moveCursorToEnd();else if(this.historyIndex>-1)this.historyIndex=-1,this.textController.text=this.historyDraft||"",this.textController.moveCursorToEnd(),this.historyDraft=null};resetHistory=()=>{this.widget.dependencies.history.reset(),this.historyIndex=-1,this.historyDraft=null};openJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!0})};dismissJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!1})};openIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!0})};dismissIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!1}),m8.instance.addPostFrameCallback(()=>{this.autocompleteFocusNode.requestFocus()})};handleIdeSelection=async(J,Q)=>{if(this.widget.dependencies.ideClient.getSelectedConfig()?.pid===J.pid){this.dismissIdePicker();return}try{await this.connectToSelectedIde(J,Q)}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Y}`)})}this.widget.dependencies.ideClient.selectConfig(J),this.dismissIdePicker()};async connectToSelectedIde(J,Q){await this.widget.dependencies.ideClient.start(J,!0,Q)}previewControllerListener=(J)=>{this.setState(()=>{this.previewThread=J})};showStandaloneThreadPicker=()=>{this.showCommandPalette({type:"standalone",commandId:"continue",onSubmit:()=>{this.threadPreviewController.clear(),this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null}),m8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette)this.autocompleteFocusNode.requestFocus()})},onCancel:()=>{this.exitApplication()}})};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(J){if(this.setState(()=>{this.isShowingPalette=!this.isShowingPalette,this.paletteShowOptions=J??null}),this.isShowingPalette)this.loadThreadsForPicker()}isShowingStandalonePalette(){return this.isShowingPalette&&this.paletteShowOptions?.type==="standalone"}getPaletteCommands(){if(!this.paletteCommands){if(!this.paletteConfig)throw Error("Config not yet available");this.paletteCommands=new Hy1(this.widget.dependencies.configService,this.widget.dependencies.commandRegistry,(J)=>{this.setState(()=>{this.executingCommand=J})},()=>{this.setState(()=>{this.executingCommand=null})},this.widget.dependencies.isDogfooding,this.paletteConfig)}return this.paletteCommands}getCompletionBuilder(){if(!this.completionBuilder)this.completionBuilder=new Uy1(this.widget.dependencies.fuzzyServer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Z}=this.widget.dependencies;if(!Q.mainThread)return null;let Y=h0.file(process.cwd()),X=E6(Y);return{recentThreadIDs:Z,currentThreadID:Q.mainThread.id,context:J,worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:Q.mainThread,ampURL:this.widget.dependencies.ampURL,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let G=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),G},setImageAttachments:(G)=>{this.setState(()=>{this.imageAttachments=G})},editorDispatch:(G)=>{switch(G.type){case"set-input":this.textController.clear(),this.textController.insertText(G.input);break;case"insert-text":this.textController.insertText(G.text);break;case"clear":this.textController.clear();break}},submitMessage:(G)=>{return this.proceedWithUserMessage(G)},exitApp:this.exitApplication,openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},settingsStorage:this.widget.dependencies.settingsStorage,clientId:this.widget.dependencies.clientId,connectedClientsService:this.widget.dependencies.connectedClientsService,mcpService:this.widget.dependencies.mcpService,startNewThread:async()=>{await this.startAndSwitchToNewThread()},navigateBack:this.navigateBack,navigateForward:this.navigateForward,canNavigateBack:this.threadBackStack.length>0,canNavigateForward:this.threadForwardStack.length>0,canUseAmpFree:this.widget.dependencies.freeTierStatus?.canUseAmpFree??!1,switchToThread:async(G)=>{return await this.switchToExistingThread(G),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),this.widget.dependencies.worker},generateHandoffPrompt:async(G,V,K)=>{let q=this.widget.dependencies.threadState.mainThread?.id;if(!q)throw Error("No active thread");let W=setTimeout(()=>{K.throwIfAborted()},60000);try{let H=await this.widget.dependencies.threadService.generateHandoffPrompt(q,G,V,this.widget.dependencies.configService,K);return clearTimeout(W),H}catch(H){throw clearTimeout(W),H}},handleHandoff:async(G,V)=>{let{goal:K,generatedPrompt:q,images:W}=V;if(!K&&!q)return{ok:!1,error:Error("Either goal or generatedPrompt required")};try{let H=this.widget.dependencies.threadState.mainThread?.id;if(!H)return{ok:!1,error:Error("No active thread")};let z=setTimeout(()=>G.abort(new T91("Handoff took too long and was aborted (timeout: 60s)")),60000);try{let U=await this.widget.dependencies.threadService.createHandoffThread(H,{goal:K,generatedPrompt:q,images:W},this.widget.dependencies.configService,G.signal);return clearTimeout(z),await this.switchToExistingThread(U),{ok:!0}}catch(U){if(clearTimeout(z),U instanceof Error&&(U.name==="AbortError"||U.message.includes("aborted")))throw G.signal.reason;throw U}}catch(H){return v.error("Failed to create handoff thread",H),{ok:!1,error:H instanceof Error?H:Error(String(H))}}},getGuidanceFiles:async(G)=>{if(!Q.mainThread)return[];return(await Ps({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},Q.mainThread,G)).map((K)=>({uri:K.uri,type:K.type}))},openIdePicker:()=>{this.openIdePicker()},getAgentMode:()=>{return this.agentModeController?.getMode()??null},setAgentMode:(G)=>{this.agentModeController?.setMode(G)},toggleAgentMode:this.toggleAgentMode,getEffectiveAgentMode:()=>this.getEffectiveAgentMode(),getEditorText:()=>this.textController.text,workspace:this.widget.dependencies.workspace??null,handleExecutePlan:async()=>{try{let G=Q.mainThread?.id;if(!G){this.setState(()=>{this.displayMessage=Error("No active thread")});return}let V=await this.widget.dependencies.threadService.createPlanExecutionThread(G,"smart");await this.switchToExistingThread(V)}catch(G){v.error("Failed to execute plan",G),this.setState(()=>{this.displayMessage=Error(`Failed to execute plan: ${G instanceof Error?G.message:String(G)}`)})}},planFileManager:this.widget.dependencies.planFileManager,completionBuilder:this.getCompletionBuilder(),threads:this.threadsForPicker,clusters:this.clustersForPicker,previewController:this.threadPreviewController,isLoadingThreads:this.isLoadingThreads,filterByWorkspace:this.filterThreadPickerByWorkspace,currentWorkspace:X,threadViewStates:this.widget.dependencies.workerController.threadViewStates,currentThreadFeedEntry:this.currentThreadFeedEntry,threadFeedEntries:this.threadFeedEntries,threadFeedHidden:this.threadFeedHidden,setThreadFeedHidden:(G)=>{this.setState(()=>{this.threadFeedHidden=G})},showMCPStatusModal:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!0})},internalAPIClient:this.widget.dependencies.internalAPIClient,features:this.widget.dependencies.features??[],showStatusMessage:(G,V=2000)=>{if(this.statusMessageTimer)clearTimeout(this.statusMessageTimer);this.setState(()=>{this.statusMessage=G}),this.statusMessageTimer=setTimeout(()=>{this.setState(()=>{this.statusMessage=null}),this.statusMessageTimer=null},V)}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new py1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=YY6(Q),this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await qA8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Z=Date.now(),Y=`bash-${Z}-${Math.random().toString(36).substring(7)}`,X={cmd:J},G=new AbortController;this.widget.dependencies.worker.invokeBashTool(X,G.signal,Q===gB).subscribe({next:(V)=>{this.setState(()=>{if(this.bashInvocations.find((q)=>q.id===Y))this.bashInvocations=this.bashInvocations.map((q)=>q.id===Y?{...q,toolRun:V}:q);else{let q={id:Y,args:X,toolRun:V,startTime:Z,abortController:G,hidden:Q===gB};this.bashInvocations=[...this.bashInvocations,q]}})},error:()=>this.removeBashInvocation(Y),complete:()=>this.removeBashInvocation(Y)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};showContextDetailOverlay=()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!0}),this.fetchThreadCostInfo()};fetchThreadCostInfo=O76(()=>{let J=this.widget.dependencies.threadID;this.widget.dependencies.internalAPIClient.threadDisplayCostInfo({threadID:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(Q.ok)this.setState(()=>{this.threadCostInfo=Q.result,this.threadCostInfoThreadID=J})}).catch(()=>{this.setState(()=>{this.threadCostInfo=void 0,this.threadCostInfoThreadID=J})})},150);maybeRefetchThreadCostInfo=(J,Q)=>{let Z=J!==this.threadCostInfoLastUsageLedgerLength,Y=Q==="idle"&&this.lastInferenceState==="running";if(this.threadCostInfoLastUsageLedgerLength=J,this.lastInferenceState=Q,Z||Y)this.fetchThreadCostInfo()};toggleAgentMode=()=>{if(!this.agentModeController)return;if(this.agentModeController.toggle())this.setState(()=>{this.showImageUnsupportedHint=!1,this.agentModePulseSeq++})};startAgentModeSlide=()=>{if(this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer);this.setState(()=>{this.agentModeSlideProgress=0});let J=800,Q=16,Z=Q/J;this.agentModeSlideTimer=setInterval(()=>{this.setState(()=>{if(this.agentModeSlideProgress!==null){if(this.agentModeSlideProgress=Math.min(1,this.agentModeSlideProgress+Z),this.agentModeSlideProgress>=1){if(this.agentModeSlideProgress=null,this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null}}})},Q)};handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!Wy(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>=oF)return!1;let Z=GC(J);if(typeof Z==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Z]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Z}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};handleShowMysteryModal=()=>{if(this.mysteriousMessage)this.setState(()=>{this.isShowingMysteriousMessageModal=!0})};handleDestructMysteriousMessage=()=>{if(!this.mysteriousMessage)return;let J=this.mysteriousMessage.id;this.widget.dependencies.internalAPIClient.markAsReadMysteriousMessage({messageId:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(!Q.ok)v.error("Failed to destruct mysterious message",Q.error);else this.setState(()=>{this.mysteriousMessage=null,this.isShowingMysteriousMessageModal=!1})}).catch((Q)=>{v.error("Failed to destruct mysterious message",Q)})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Z,unlink:Y,rmdir:X,writeFile:G}=await import("node:fs/promises"),{tmpdir:V}=await import("node:os"),K=await import("node:path");try{let q=await Q(K.join(V(),"amp-edit-")),W=K.join(q,"message.amp.md");await G(W,J,"utf-8"),await MV(W);try{let H=await Z(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")v.error("Failed to read temporary file",H)}try{await Y(W),await X(q)}catch(H){v.warn("Failed to clean up temporary file",H)}}catch(q){v.error("Error opening editor:",q)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=mB(J);if(Q)if(!Q.cmd){this.showSubmitDisabledHint("No command provided");return}else if(this.isProcessing()){this.showSubmitDisabledHint("Unable to use shell mode while agent is active");return}else{this.invokeBashCommand(Q.cmd,{visibility:Q.visibility}),this.widget.dependencies.history.add(J),this.textController.clear(),this.resetHistory();return}this.textController.clear(),this.resetHistory(),await this.updateGitBranch(),await this.sendUserMessage(J)};agentModeListener=()=>{this.setState(()=>{})};initState(){if(mY.getInstance().interceptConsole(),this.freeTierStatus=this.widget.dependencies.freeTierStatus,this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();a8.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),a8.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),a8.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Z)=>{m8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Z.hasFocus})})}),V6(this.widget.dependencies.configService.config).then((Z)=>{this.paletteConfig=Z,this.agentModeController=new ej1({initialCliMode:this.widget.dependencies.initialAgentMode,sessionState:this.widget.dependencies.sessionState??null,freeTierStatus:this.freeTierStatus?{canUseAmpFree:this.freeTierStatus.canUseAmpFree,eligible:this.freeTierStatus.eligible,workspaceAllowsAmpFree:this.freeTierStatus.workspaceAllowsAmpFree}:void 0,initialSettings:Z.settings,config$:this.widget.dependencies.configService.config,getThread:()=>this.widget.dependencies.getCurrentWorker()?.thread??this.widget.dependencies.worker.thread}),this.agentModeController.addListener(this.agentModeListener)}),this.updateGitBranch(),this.adSubscription=Tj1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let Z=this.agentModeController?.getMode();return(Z&&P9(Z)||this.randomAd===null)&&Pj1(this.lastUserInteractionTime)}).subscribe({next:(Z)=>{if(Z){let Y=VA8(16).toString("hex");this.lastAdImpressionId=Y,Promise.resolve().then(() => (Y51(),Z51)).then(({recordAdEvent:X})=>{let G=this.widget.dependencies.worker.thread,V=G.messages[G.messages.length-1];X("viewed",{adId:Z.id,advertiserId:Z.advertiserId,threadId:G.id,messageId:V?.messageId,impressionId:Y,placement:"tui",matchType:Z.metadata?.matchType,matchedPatterns:Z.metadata?.matchedPatterns,candidateAdPoolCount:Z.metadata?.candidateAdPoolCount,clientRegion:Z.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=Z}),m8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}});let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Z)=>{this.setState(()=>{this.pendingMCPServers=Z})}),this.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Z)=>{this.setState(()=>{this.mcpServers=Z})}),this.cacheTimerSubscription=this.widget.dependencies.worker.cacheTimer.subscribe((Z)=>{this.setState(()=>{this.cacheTimerState=Z})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Z)=>{this.setState(()=>{this.ideStatus=Z})}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Z)=>{let Y=this.widget.dependencies.getCurrentWorker();if(!Y){v.warn("No active thread worker found to handle IDE message");return}await new Promise((X)=>setTimeout(X,50)),await Y.handle({type:"user:message",message:{content:[{type:"text",text:Z}]}}),v.debug("Message sent from IDE to agent",{message:Z.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Z)=>{this.textController.insertText(Z),v.debug("Appended text to CLI prompt from IDE",{text:Z.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Z)=>{this.setState(()=>{this.connectedClientsStatus=Z})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Z)=>{this.setState(()=>{this.updateState=Z})}),this.mysteriousMessageSubscription=w41(this.widget.dependencies.configService).pipe(f5((Z)=>Z!=="pending"),Q6((Z)=>E41(Z)?Z.mysteriousMessage??null:null),N4((Z,Y)=>Z?.id===Y?.id)).subscribe((Z)=>{this.setState(()=>{if(Z?.id!==this.mysteriousMessage?.id)this.isShowingMysteriousMessageModal=!1;if(this.mysteriousMessage=Z,Z&&!this.mysterySequenceManager)this.mysterySequenceManager=new D81(new Map([[new N81(ry1.MYSTERY_SEQUENCE),new Im]])),this.mysteryKeyInterceptorUnsubscribe=a8.instance.addKeyInterceptor((Y)=>{if(!this.mysterySequenceManager)return!1;if(this.isShowingMysteriousMessageModal)return!1;let X=this.mysterySequenceManager.handleKeyEvent(Y);if(X.consumed){if(X.intent)this.handleShowMysteryModal();return this.setState(()=>{this.mysterySequenceProgress=X.progress}),!0}else if(this.mysterySequenceProgress)this.setState(()=>{this.mysterySequenceProgress=null});return!1});else if(!Z)this.mysteryKeyInterceptorUnsubscribe?.(),this.mysteryKeyInterceptorUnsubscribe=null,this.mysterySequenceManager?.dispose(),this.mysterySequenceManager=null,this.mysterySequenceProgress=null})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Z)=>{let Y=Z instanceof Error?Z.message:String(Z);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Y}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showIdePickerHint)this.toastController.show("Use /ide to connect to an IDE","success",5000);else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100);this.initThreadFeed()}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener();let Q=this.widget.dependencies.threadID;if(this.threadCostInfoThreadID!==void 0&&this.threadCostInfoThreadID!==Q)this.threadCostInfo=void 0,this.threadCostInfoThreadID=void 0,this.threadCostInfoLastUsageLedgerLength=0,this.fetchThreadCostInfo();let{threadState:Z}=this.widget.dependencies;this.maybeRefetchThreadCostInfo(Z.mainThread?.usageLedger?.events.length??0,Z.viewState.state==="active"?Z.viewState.inferenceState:void 0)}dispose(){if(this.replayAbortController.abort(),this.replayTypingTimer)clearTimeout(this.replayTypingTimer);if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeController)this.agentModeController.removeListener(this.agentModeListener),this.agentModeController.dispose();if(this.adSubscription)this.adSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(this.mcpServersSubscription)this.mcpServersSubscription.unsubscribe();if(this.cacheTimerSubscription)this.cacheTimerSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);if(this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null;if(this.mysteriousMessageSubscription)this.mysteriousMessageSubscription.unsubscribe();if(this.mysteryKeyInterceptorUnsubscribe?.(),this.mysterySequenceManager?.dispose(),this.threadPreviewController.removeListener(this.previewControllerListener),this.threadPreviewController.dispose(),this.toastController.dispose(),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.textController.removeListener(this.textChangeListener);for(let J of this.messageScrollControllers.values())J.dispose();if(this.messageScrollControllers.clear(),process.stdout.write(Yj1("")),this.shouldUseProgressBar())process.stdout.write(R56())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,Y=[...J.items.filter((K)=>K.type==="toolResult").map((K)=>({toolUse:K.toolUse,toolRun:K.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((K)=>K.toolRun.status==="blocked-on-user");if(Y.length===0)return null;let X=Y[0],G=X.toolRun.status==="blocked-on-user"?X.toolRun.toAllow??[]:[],V=X.toolRun.status==="blocked-on-user"?X.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:X.toolUse,toAllow:G}],subthreadID:X.subthreadID,reason:V}}shouldUseProgressBar(){return!1}updateProgressBar(){}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){v.error("No current tool confirmation found");return}let Z=Q.tools[0]?.useBlock;if(!Z){v.error("No tool use block found in confirmation");return}if(J==="allow-all-session")LG("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(X){if(X&&X instanceof Error)this.setState(()=>{this.displayMessage=X});else v.error("Failed to write dangerouslyAllowAll setting:",X);return}if(J==="always-guarded"){let X=Q.tools[0]?.toAllow??[],G=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],V=[...X,...G];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",V,"global")}if(J==="connect-github"){let X=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();await GJ(this.context,X);return}if(J==="disable-librarian"){let X=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!X.includes(KY))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,KY],"global")}let Y=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let X={type:"user:tool-input",toolUse:Z.id,value:{accepted:Y}};if(Q.subthreadID)await(await Q2.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(X);else await this.widget.dependencies.worker.handle(X)}catch(X){v.error("Failed to send tool confirmation:",X)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Z=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Z)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Z=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Z.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.agentModeController?.setMode("smart"),this.setState(()=>{this.dismissedEphemeralErrorKey=null}),G41({agentMode:"smart"}),await this.startAndSwitchToNewThread();break}case"handoff":{if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);this.showCommandPalette({type:"normal",commandId:"handoff"});break}}this.setState(()=>{})};handleDisplayMessageDismiss=()=>{this.setState(()=>{this.displayMessage=null})};handleMCPTrustOpenSettings=async()=>{let{mcpTrustHandler:J,settingsStorage:Q}=this.widget.dependencies;await J.deny();try{await MV(Q.getSettingsFilePath())}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);await this.showErrorMessage(`Failed to open settings: ${Y}`)}};cancelStreamingMessage=async()=>{await Q2.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let Z=J.messages[Q];if(Z?.role==="user"&&!Z.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Z=!0}=Q;if(Z){let Y=this.widget.dependencies.worker.thread.id;if(Y!==J)this.recordNavigation(Y)}try{v.info(`[switchToExistingThread] Switching to thread: ${J}`);let Y=await this.widget.dependencies.switchToThread(J);if(v.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${Y.thread.agentMode}`),this.widget.dependencies.worker=Y,this.widget.dependencies.threadID=Y.thread.id,this.widget.dependencies.switchWorker(Y),v.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),Y.thread.draft)if(v.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof Y.thread.draft==="string")this.textController.insertText(Y.thread.draft);else{let X=Y.thread.draft.filter((K)=>K.type==="text"),G=Y.thread.draft.filter((K)=>K.type==="image"),V=X.map((K)=>K.text).join(`
|
|
4793
4793
|
`);if(V)this.textController.insertText(V);if(G.length>0)this.setState(()=>{this.imageAttachments=G})}}catch(Y){throw v.error("Failed to switch to thread:",J,Y),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Z=u2(Q.thread)===0,Y=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Z&&Y!==Q.thread.agentMode){await this.showErrorMessage(`This thread uses ${Q.thread.agentMode} mode. To change mode, edit the first message or create a new thread.`);return}let X=[{type:"text",text:J}];if(this.imageAttachments.length>0)X.push(...this.imageAttachments);if(Z)this.startAgentModeSlide();if(await Q.handle({type:"user:message",message:{content:X,agentMode:Y}}),Z)G41({agentMode:Y});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),m8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})};async showErrorMessage(J){this.setState(()=>{this.displayMessage=Error(J)})}exitApplication=async()=>{this.setState(()=>{this.isExiting=!0});let J=this.widget.dependencies.threadState.mainThread;if(J?.messages.length===0){if(J.relationships?.find((Y)=>Y.type==="handoff"&&Y.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();G41({agentMode:Q}).catch((Z)=>{v.warn("Failed to save session state on exit:",Z)}).finally(()=>{a8.instance.stop()})};onExitPressed=()=>{if(this.isConfirmingExit){if(this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;this.exitApplication()}else{if(this.setState(()=>{this.isConfirmingExit=!0}),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout);this.exitConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingExit=!1}),this.exitConfirmTimeout=null},1000)}};toHomeRelative(J){let Q=KA8();if(J===Q)return"~";if(J.startsWith(Q+lm.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(lm.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(lm.sep),"…",Q.slice(-2).join(lm.sep)].join(lm.sep)}build(J){let Q=f4.of(J),Z=$6.of(J),Y=Z.base;this.themeColors=Y;let{colors:X,app:G}=Z;this.themeApp=G;let V=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,K=V.thread.agentMode&&P9(V.thread.agentMode),q=K&&this.randomAd!==null,W=!K&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden,H=Boolean(q),{threadState:z}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let U=this.getCurrentConfirmation(),D=this.widget.dependencies.replayMode,M=Boolean(D),L=z.items,A=z.mainThread||void 0,E=z.subagentToolsByParentID,I=z.todosList;if(M){let g6={...D.thread,messages:this.replayDisplayedMessages};L=wC(g6).items,A=g6,E={};let l6=nE({messages:this.replayDisplayedMessages});I=Array.isArray(l6)?l6:[]}let P=A?.id,R=A,k=M?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),y=(g6)=>new O91({key:new p7(`preview-message-view-${g6.id}`),items:wC(g6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:g6,focusNode:new F8({debugLabel:"PreviewFocus"})}),x=this.previewThread,b=x?x.messages.length>2000?new v0({mainAxisSize:"max",children:[new e6({child:new X0}),new H6({padding:F0.all(2),child:new k4({child:new _1({text:new i("Thread too long for preview",new e({color:X.mutedForeground,dim:!0}))})})})]}):y(x):k?new P91({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal}):new O91({key:P?new p7(`message-view-${P}`):void 0,items:L,subagentToolsByParentID:E,controller:P?this.getMessageScrollController(P):new D7,autofocus:!1,onCopy:M?void 0:this._handleTextCopy.bind(this),thread:R,onMessageEditSubmit:M?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:M?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:M?void 0:this.forkMessage,getAffectedFiles:M?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),d=Math.max(Math.floor(Q.size.height*0.4),12),m=this.getCurrentEphemeralError(),a=Q.size.width<40,X1=z.mainThread?hM0(z.mainThread):void 0,t=q91(J),p=this.buildBottomWidget(m,U,X,Z,z,I,d,H,M,X1,this.cacheTimerState??void 0,Q,t),J1=new v81({threadViewState:z.viewState,threadTokenUsage:X1,threadID:P??null,thread:z.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,mcpServers:this.mcpServers,isNarrow:a,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!U,showingEphemeralError:Boolean(z.viewState.state==="active"&&z.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),H1=new y81({bashInvocations:this.bashInvocations}),U1=[];if(W&&this.currentThreadFeedEntry)U1.push(new uy1({entry:this.currentThreadFeedEntry,width:Q.size.width}));let r=this.getEffectiveAgentMode(),o=this.currentShellModeStatus,l=oy1(r),q1=!o?r.length+1:0,k1=Q.capabilities.animationSupport,s=k1==="disabled"?0:k1==="slow"?30:60,g1=LK(r)?.uiHints?.fasterAnimation?3:1,R1=s>0&&this.agentModePulseSeq>0?new x9({children:[p,new S5({top:0,left:1,right:1,height:1,child:new fy1({color:l,trigger:this.agentModePulseSeq,fps:s,speed:g1,leftOffset:q1})})]}):p;U1.push(new e6({child:b}),H1);let I0=new x9({children:[new v0({mainAxisSize:"min",children:[q?new lk1({ad:this.randomAd,onButtonClick:async()=>{let g6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (Y51(),Z51)).then(({recordAdEvent:B9})=>{let O4=this.widget.dependencies.worker.thread,UJ=O4.messages[O4.messages.length-1];B9("clicked",{adId:g6.id,advertiserId:g6.advertiserId,threadId:O4.id,messageId:UJ?.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})});if(!await GJ(this.context,g6.shortDestinationUrl)){let O4=a8.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:O4,url:g6.shortDestinationUrl}})}}}):new X0({height:0}),new g0({constraints:new P6(0,Q.size.width,0,d),child:R1})]}),H?new S5({top:0,left:0,right:0,child:new zX6({userHeight:this.bottomGridUserHeight,maxHeight:d,onInitializeHeight:(g6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(g6,d)})},onDrag:(g6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(g6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let l6=Math.floor(g6.localPosition.y)-this.bottomGridDragStartY,B9=Math.max(4,this.bottomGridDragStartHeight-l6),O4=Math.min(B9,d),UJ=Math.floor(O4);if(this.bottomGridUserHeight!==UJ)this.setState(()=>{this.bottomGridUserHeight=UJ})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new X0({height:0})]});U1.push(I0,new X0({height:1,child:new H6({padding:F0.horizontal(1),child:J1})}));let P1=new v0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:U1}),z1=M&&D?.showIndicator!==!1?new x9({children:[P1,new S5({top:0,left:0,child:new my1})]}):P1,Z1=new O8(()=>{if(this.isShowingPalette)return this.dismissPalette(),"handled";if(this.isShowingMCPStatusModal)return this.setState(()=>{this.isShowingMCPStatusModal=!1}),"handled";if(this.pendingMCPServers.length>0)return this.widget.dependencies.mcpTrustHandler.deny(),"handled";if(this.getCurrentEphemeralError())return this.handleEphemeralErrorResponse("dismiss"),"handled";if(this.displayMessage)return this.handleDisplayMessageDismiss(),"handled";if(this.isShowingHelp)return this.setState(()=>{this.isShowingHelp=!1}),"handled";if(this.isShowingFileChangesOverlay)return this.setState(()=>{this.isShowingFileChangesOverlay=!1}),"handled";if(this.isShowingContextDetailOverlay)return this.setState(()=>{this.isShowingContextDetailOverlay=!1}),"handled";if(this.isShowingIdePicker)return this.dismissIdePicker(),"handled";if(this.isShowingJetBrainsInstaller)return this.dismissJetBrainsInstaller(),"handled";if(this.isShowingConfirmationOverlay)return this.setState(()=>{this.isShowingConfirmationOverlay=!1,this.confirmationOverlayContent=""}),"handled";if(this.isShowingConsoleOverlay)return this.setState(()=>{this.isShowingConsoleOverlay=!1}),"handled";if(this.textController.hasSelection)return this.textController.clearSelection(),"handled";if(this.isConfirmingClearInput){if(this.textController.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((l6)=>{v.error("Failed to mark message as interrupted:",l6)}),this.cancelStreamingMessage().catch((l6)=>{v.error("Failed to cancel streaming message:",l6)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return v.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),O1=new O8(()=>{return this.onExitPressed(),"handled"}),A1=new O8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),C1=new O8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),S1=new O8(()=>{return WJ.instance.toggleAll(),"handled"}),c1=new O8(()=>{return this.widget.dependencies.configService.getLatest().then((g6)=>{LG("internal.showDetailedCosts",!(g6.settings["internal.showDetailedCosts"]??!1))}),"handled"}),m1=new O8(()=>{return a8.instance.toggleFrameStatsOverlay(),"handled"}),s1=new O8(()=>{return a8.instance.tuiInstance.getScreen().markForRefresh(),m8.instance.requestFrame(),"handled"}),K0=new O8(()=>{return this.toggleAgentMode(),"handled"}),q0=new O8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6){let B9=Math.max(Math.floor(Q.size.height*0.4),10),O4=Q.size.height-B9;l6.animatePageUp(O4,100)}return"handled"}),k0=new O8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6){let B9=Math.max(Math.floor(Q.size.height*0.4),10),O4=Q.size.height-B9;l6.animatePageDown(O4,100)}return"handled"}),v6=new O8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6)l6.animateTo(0,100);return"handled"}),p6=new O8(()=>{let l6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:B9}=this.widget.dependencies,O4=B9.mainThread?.id;return O4?this.getMessageScrollController(O4):null})();if(l6)l6.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),e4=new O8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:g6}=this.widget.dependencies;if(!g6.mainThread?.messages.some((B9)=>B9.role==="user"||iE(B9)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),r8=new O8((g6)=>{if(g6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),a9=new O8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return R81().then(async(g6)=>{if(g6)try{this.handleInsertImage(g6)}finally{try{let{unlink:l6}=await import("node:fs/promises");await l6(g6)}catch{}}}),"handled"}),E0=new Map([[G4.ctrl("c"),new Dm],[G4.ctrl("l"),new wm],[G4.ctrl("o"),new E81],[G4.ctrl("v"),new Bm],[G4.alt("s"),new qC],[G4.ctrl("s"),new qC],[G4.alt("p"),new Om],[G4.ctrl("r"),new Lm],[G4.alt("d"),new Am],[G4.ctrl("t"),new Em],[G4.key("PageUp"),new L81],[G4.key("PageDown"),new A81],[G4.key("Home"),new O81],[G4.key("End"),new w81],[G4.key("Escape"),new Nm],[G4.ctrl("p"),new WC("previous")],[G4.ctrl("n"),new WC("next")],[G4.key("Tab"),new Pm]]);if(!f3())E0.set(G4.key("ArrowUp"),new Pm);if(!1)E0.set(G4.alt("c"),new Mm);let Y4=new O8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),Z8=new O8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),u8=new O8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),Z7=new Map([[Nm,Z1],[wm,s1],[qC,K0],[E81,Y4],[Bm,a9],[Mm,A1],[F81,C1],[Lm,S1],[Am,c1],[Om,m1],[Em,Z8],[Dm,O1],[L81,q0],[A81,k0],[O81,v6],[w81,p6],[Pm,e4],[WC,r8],[Im,u8]]),s8=[z1];if(this.isShowingConsoleOverlay)s8.push(new Dy1);if(this.isShowingHelp&&this.paletteConfig)s8.push(new Ay1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)s8.push(new Hk1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)s8.push(new gy1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)s8.push(new ik1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(g6)=>{let l6=this.adActionModal.url;if(g6==="copy")try{await a8.instance.tuiInstance.clipboard.writeText(l6),this.setState(()=>{this.displayMessage=new iY("Link copied to clipboard")})}catch(B9){v.error("Failed to copy to clipboard",{error:B9}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:g6}=this.widget.dependencies;s8.push(new hy1({servers:this.pendingMCPServers,onAlwaysTrust:g6.trustAlways.bind(g6),onTrustOnce:g6.trustOnce.bind(g6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:g6.deny.bind(g6)}))}if(this.isShowingFileChangesOverlay)s8.push(new pS1({threadData:z}));if(this.isShowingContextDetailOverlay){let g6=this.threadCostInfo?.costBreakdownURL;s8.push(new My1({thread:z.mainThread??void 0,tokenUsage:X1??void 0,cacheTimerState:this.cacheTimerState??void 0,costInfo:this.threadCostInfo,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})},onOpenCostBreakdown:g6?()=>{GJ(J,g6)}:void 0}))}if(this.isShowingConfirmationOverlay)s8.push(new By1({details:this.confirmationOverlayContent}));let Y7=this.getCommandPaletteContext(J);if(Y7&&this.isShowingPalette&&this.paletteConfig)s8.push(new k4({child:new Fy1({commandContext:Y7,mainThread:z.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)s8.push(new wy1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let y5=new x9({children:s8});if(this.isShowingJetBrainsInstaller)return new cA({child:new $J({actions:Z7,child:new lY({shortcuts:E0,debugLabel:"jetbrains-installer-shortcuts",child:new vy1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Zz({controller:this.toastController,child:new cA({child:new kS1({controller:this.toastController,child:new $J({actions:Z7,child:new lY({shortcuts:E0,debugLabel:"main-app-shortcuts",child:y5})})})})})}buildScrollableTodoList(J,Q,Z){return new WX6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Z})}buildBottomWidget(J,Q,Z,Y,X,G,V,K,q,W,H,z,U){if(J)return new Ly1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new Ny1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new by1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let D=_81(Y),M=this.agentModeController?.isInRestrictedFreeMode()??!1,L=new XO({key:this.textFieldKey,controller:this.textController,triggers:q?[]:[new nB],completionBuilder:q?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:q?void 0:this.onTextSubmitted,theme:Z,placeholder:q?"Press Ctrl+C to exit":M?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!M&&!this.isShowingStandalonePalette(),shellPromptRules:D,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:a8.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,previousThreadId:this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let l=this.previousThreadIdForHint;if(l)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${l} `},onDoubleAtTrigger:q?void 0:()=>{let l=this.textController.text,q1=this.textController.cursorPosition,s=l.slice(0,q1).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(s!==-1){let g1=this.textController.text,R1=g1.slice(0,s)+g1.slice(s+2);this.textController.text=R1,this.textController.cursorPosition=s}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),A=X.mainThread?.queuedMessages??[],E=Array.isArray(G)&&G.length>0,I=Array.isArray(A)&&A.length>0,P=X.mainThread?.agentMode==="plan"&&yA(X.mainThread),R,k;if(P){if(R=new bB(new w91({thread:X.mainThread,onExecute:async()=>{let l=this.getCommandPaletteContext();if(l)await this.getPaletteCommands().execute("execute-plan",l,void 0,new AbortController)},onEdit:async()=>{try{let l=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:q1}=await this.widget.dependencies.planFileManager.ensureSync(X.mainThread.id);a8.instance.tuiInstance.suspend();let{execSync:k1}=await import("child_process");k1(`${l} "${q1}"`,{stdio:"inherit"}),a8.instance.tuiInstance.resume()}catch(l){v.error("Failed to edit plan",l),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:Y}),{clipBehavior:"antiAlias"}),I)k=new Q51({queuedMessages:A});else if(E)k=this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!M,Y)}else R=I?new Q51({queuedMessages:A}):void 0,k=E?this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!M,Y):void 0;let y=[],x=this.currentShellModeStatus;if(x)y.push({child:new _1({text:new i(x==="hidden"?"shell mode (incognito)":"shell mode",new e({color:x==="hidden"?Y.app.shellModeHidden:Y.app.shellMode}))}),position:"top-left"});let d=this.connectedClientsStatus&&this.connectedClientsStatus.enabled?this.connectedClientsStatusExpanded?(this.connectedClientsStatus?.clientID?.length??7)+3:3:0,m=this.agentModeController?.getVisibleModes()??[];if(!x&&m.length>1){let l=this.previewThread,q1=l?l.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),k1=oy1(q1),s=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,g1=l??s.thread,R1=u2(g1)>0,I0=this.agentModeSlideProgress!==null,P1,o1;if(I0){P1="top-left";let Z1=z.size.width-q1.length-4-d;o1=Math.floor(this.agentModeSlideProgress*Z1)}else if(R1)P1="top-right",o1=d;else P1="top-left",o1=void 0;if(l)y.push({child:new _1({text:new i(q1,new e({color:k1}))}),position:P1,offsetX:o1});else{let z1=!R1&&!I0,Z1=new _1({text:new i(q1,new e({color:k1}))});y.push({child:z1?new $8({child:Z1,onClick:this.toggleAgentMode,cursor:"pointer"}):Z1,position:P1,offsetX:o1})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let l=this.connectedClientsStatus,q1=l.mode||"disconnected",k1=!!l.errorMessage,s=l.clientID||"unknown",g1,R1;if(k1)g1="●",R1=F1.red;else if(q1==="presence")g1="○",R1=F1.yellow;else if(q1==="connected"&&l.connected)g1="●",R1=F1.green;else g1="○",R1=F1.yellow;let I0=this.connectedClientsStatusExpanded?`${s} ${g1}`:g1;y.push({child:new $8({child:new _1({text:new i(I0,new e({color:R1}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let a=q?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:X.mainThread?.env?.initial.trees?.[0]?.uri,X1;if(a)X1=h0.parse(a).fsPath;else X1=process.cwd();let t=this.toHomeRelative(X1),p=this.shorten(t),J1=!q&&this.currentGitBranch?`${p} (${this.currentGitBranch})`:p;if(y.push({child:new _1({text:new i(J1,new e({color:Z.foreground,dim:!0}))}),position:"bottom-right"}),this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0&&this.textController.text.trim()==="")y.push({child:new _1({text:new i("",void 0,[new i("press ",new e({color:Z.foreground,dim:!0})),new i("enter",new e({color:Y.app.keybind})),new i(" to reference the previous thread",new e({color:Z.foreground,dim:!0}))])}),position:"bottom-left"});let U1=this.previewThread,r=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(u2(r.thread)>0&&!x&&!U1){let l=[],q1=new e({color:Z.foreground,dim:!0}),k1=new i(" · ",q1);if(W){let s=W.totalInputTokens/W.maxInputTokens,g1=Math.round(s*100),R1=Math.max(0,Math.min(g1,100)),I0=x81(s,W.maxInputTokens),P1=q1;if(I0==="danger")P1=new e({color:Z.destructive});else if(I0==="warning")P1=new e({color:Z.warning});else if(I0==="recommendation")P1=new e({color:Y.app.recommendation});let o1=Math.round(W.maxInputTokens/1000);l.push(new i(`${R1}% of ${o1}k`,P1))}if(U&&this.threadCostInfo?.totalCostUSD!=null&&this.threadCostInfo.totalCostUSD>0){if(l.length>0)l.push(k1);if(this.threadCostInfo.isFreeMode)l.push(new i(kA(this.threadCostInfo.totalCostUSD),new e({strikethrough:!0,color:Z.foreground,dim:!0}))),l.push(new i(" free",q1));else l.push(new i(kA(this.threadCostInfo.totalCostUSD),q1))}if(U&&H){let s=X.viewState.state==="active"&&X.viewState.inferenceState==="idle",g1=A76(H,s);if(g1){if(l.length>0)l.push(k1);let R1=q1;if(g1.urgency==="warning")R1=new e({color:Z.warning});l.push(new i(g1.text,R1))}}if(l.length>0){let s=new _1({text:new i("",void 0,l)});y.push({child:U?new $8({child:s,onClick:this.showContextDetailOverlay,cursor:"pointer"}):s,position:"top-left"})}}return new hS1({leftChild:new e6({child:L}),rightChild1:R,rightChild2:k,maxHeight:V,overlayTexts:y,borderColor:M||!this.isTextfieldAndAutocompleteFocused?F1.index(8):void 0,hasBanner:K,userHeight:this.bottomGridUserHeight,onInitializeHeight:(l)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(l,V)})},onDrag:(l)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(l.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let q1=Math.floor(l.localPosition.y)-this.bottomGridDragStartY,k1=Math.max(4,this.bottomGridDragStartHeight-q1),s=Math.min(k1,V),g1=Math.floor(s);if(this.bottomGridUserHeight!==g1)this.setState(()=>{this.bottomGridUserHeight=g1})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!K})}}async function sy1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)a8.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let Y=()=>null,G=!1,V=new rH(G,1000,J.inspectorPort),K=J.features?.find((A)=>A.name==="amp-connect")?.enabled??!1,q=new dk1({threadService:J.threadService,worker:J.worker,builder:(A,E,I,P,R,k)=>{if(Y=R,J.threadDependencies&&K)sj1(J.threadDependencies,J.configService,R,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((b)=>{v.error("Failed to start automatic presence:",b)});let y=R(),x={...J,worker:y,threadID:y.thread.id};return new qX6({...x,threadState:E,workerController:I,switchWorker:P,getCurrentWorker:R,recentThreadIDs:k})}}),W=new bS1({configService:J.configService,child:q}),H=new zk1({configService:J.configService,child:W}),z=new IS1(H),U=new $6({data:HC.fromBaseTheme(T$.default()),child:z});try{await Mj1(U,{onRootElementMounted:(A)=>{if(v.info("TUI input ready for user interaction"),G)V.start(A)}})}finally{if(G)V.stop();if(J.threadDependencies&&K){let{stopGlobalSession:A}=await Promise.resolve().then(() => (tj1(),_36));A()}}let M=Y()?.thread.id||J.threadID,L=await J.threadService.get(M);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${M}`;t36(L,A,J.stdout)}}function oy1(J){let Z=LK(J)?.uiHints?.secondaryColor;if(Z)return F1.rgb(Z.r,Z.g,Z.b);return WA8(J)}class WX6 extends d0{props;constructor(J){super();this.props=J}createState(){return new HX6}}class HX6 extends u0{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Z,appTheme:Y}=this.widget.props;return new A6({crossAxisAlignment:"stretch",children:[new e6({child:new _5({controller:Z,autofocus:!1,child:new ck1({todos:Q})})}),new qJ({controller:Z,thumbColor:Y.app.scrollbarThumb,trackColor:Y.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:X,offset:G}=Z,V=this.viewportHeight,K=X+V;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(V,1),scrollOffset:Math.max(G,0)}}})]})}updateViewportHeight(){let J=this.getViewportHeight();if(J!==this.viewportHeight)this.viewportHeight=J}getViewportHeight(){let J=this.context.findRenderObject();if(!J)return this.viewportHeight;let Q=(Y,X=0)=>{if(Y&&"size"in Y&&"children"in Y){let G=Y.children||[];for(let V of G){if(V&&"size"in V){let q=V.size;if(typeof q?.height==="number"&&q.height>0)return q.height}let K=Q(V,X+1);if(K>0)return K}}return 0},Z=Q(J);if(Z>0)return Z;if("size"in J){let Y=J.size;if(typeof Y?.height==="number"&&Y.height>0)return Y.height}return this.viewportHeight}}class zX6 extends R6{props;constructor(J){super();this.props=J}build(J){return new $8({child:new X0({height:1}),cursor:C9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let Y=J.findRenderObject()?.size.height??0;if(Y>0){this.props.onInitializeHeight(Y);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function WA8(J){let Q=0;for(let X=0;X<J.length;X++){let G=J.charCodeAt(X);Q=(Q<<5)-Q+G,Q=Q&Q}let Z=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],Y=Math.abs(Q)%Z.length;return F1.index(Z[Y])}Dj1();try{if(process.platform==="win32")await Promise.resolve().then(() => q6(lC(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){g$.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
4794
|
-
`)}var Tv1=Pv1.join(ZU0||Pv1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function _I8(J){process.emitWarning=function(Q,Z,Y,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Z||"Warning",K=!1;J.warn(G,{name:V,code:Y})}}function h$(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")LG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")LG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")LG("model.sonnet",Q.useSonnet)}async function Cv1(J){try{await CI8(Pv1.dirname(Tv1),{recursive:!0}),await jI8(Tv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function kI8(){try{return(await gV6(Tv1,"utf-8")).trim()}catch(J){return null}}var fV6=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??A$,description:`Custom settings file path (overrides the default location ${A$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${IC1})`},{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:f3(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"useSonnet",long:"use-sonnet",type:"flag",description:(J)=>J?"Use Claude Sonnet 4.5 instead of Claude Opus 4.5":"Use default model (Claude Opus 4.5)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"(deprecated) Opus 4.5 is now the default in smart mode",hidden:!0,deprecated:!0},{name:"mode",long:"mode",short:"m",type:"option",default:mE.SMART.key,description:`Set the agent mode (${yX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:yX().map((J)=>J.mode)}],hV6=(J)=>("deprecated"in J)&&J.deprecated===!0,yI8=(J)=>("hidden"in J)&&J.hidden===!0,xI8=(J)=>("default"in J),vI8=(J)=>("default"in J)?J.default:void 0;function fI8(J,Q){let Z=Q.args[0],Y=Q.commands.map((G)=>G.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let G=Y.filter((K)=>Z.includes(K)||K.includes(Z)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new P8(L$.unknownCommand(Z),1,V)}}var mV6=null;function yP5(){return mV6}function Uu(J){return{...J,getThreadEnvironment:v61,vfs:BC0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Qv(J.fileSystem),generateThreadTitle:Wo0,deleteThread:(Q)=>J.threadService.delete(Q)}}var jv1=h0.file(SI8.homedir()),uV6=process.env.XDG_CONFIG_HOME?h0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(jv1,".config");async function b$(J,Q){nM0("0.0.
|
|
4794
|
+
`)}var Tv1=Pv1.join(ZU0||Pv1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function _I8(J){process.emitWarning=function(Q,Z,Y,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Z||"Warning",K=!1;J.warn(G,{name:V,code:Y})}}function h$(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")LG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")LG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")LG("model.sonnet",Q.useSonnet)}async function Cv1(J){try{await CI8(Pv1.dirname(Tv1),{recursive:!0}),await jI8(Tv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function kI8(){try{return(await gV6(Tv1,"utf-8")).trim()}catch(J){return null}}var fV6=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??A$,description:`Custom settings file path (overrides the default location ${A$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${IC1})`},{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:f3(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"useSonnet",long:"use-sonnet",type:"flag",description:(J)=>J?"Use Claude Sonnet 4.5 instead of Claude Opus 4.5":"Use default model (Claude Opus 4.5)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"(deprecated) Opus 4.5 is now the default in smart mode",hidden:!0,deprecated:!0},{name:"mode",long:"mode",short:"m",type:"option",default:mE.SMART.key,description:`Set the agent mode (${yX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:yX().map((J)=>J.mode)}],hV6=(J)=>("deprecated"in J)&&J.deprecated===!0,yI8=(J)=>("hidden"in J)&&J.hidden===!0,xI8=(J)=>("default"in J),vI8=(J)=>("default"in J)?J.default:void 0;function fI8(J,Q){let Z=Q.args[0],Y=Q.commands.map((G)=>G.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let G=Y.filter((K)=>Z.includes(K)||K.includes(Z)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new P8(L$.unknownCommand(Z),1,V)}}var mV6=null;function yP5(){return mV6}function Uu(J){return{...J,getThreadEnvironment:v61,vfs:BC0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new Qv(J.fileSystem),generateThreadTitle:Wo0,deleteThread:(Q)=>J.threadService.delete(Q)}}var jv1=h0.file(SI8.homedir()),uV6=process.env.XDG_CONFIG_HOME?h0.file(process.env.XDG_CONFIG_HOME):i0.joinPath(jv1,".config");async function b$(J,Q){nM0("0.0.1764979300-g324cf3");let Z=zz1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Q0.of([h0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:jv1,userConfigDir:uV6}),{initializeCLITelemetry:Y}=await Promise.resolve().then(() => (Y51(),Z51));Y(Z);let X=await Z.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Ne0({configService:Z}),K=new Map,q=()=>K.clear(),W=new RB1(Z,J.settings.getWorkspaceRootPath()),H=wR0({configService:Z,trustStore:W,createOAuthProvider:async(t,p,J1)=>{let H1=`${t}:${p}`,U1=K.get(H1);if(U1)return v.debug("Reusing existing OAuth provider for server",{serverName:t,serverUrl:p}),U1;v.debug("Creating OAuth provider for server",{serverName:t,serverUrl:p});let r=(async()=>{let o=new DM(J.secrets),l=await o.getClientInfo(t,p),q1=J1?.scopes??l?.scopes,k1=new oU1({storage:o,serverName:t,serverUrl:p,clientId:J1?.clientId??l?.clientId,clientSecret:J1?.clientSecret??l?.clientSecret,scopes:q1});return v.debug("OAuth provider created",{serverName:t,serverUrl:p,hasManualClientId:!!(J1?.clientId??l?.clientId),willUseDCR:!(J1?.clientId??l?.clientId),scopes:q1}),k1})();return K.set(H1,r),r}}),z=f01({configService:Z,filesystem:i8,spawn:$A}),{initializeToolProviders:U,startToolProviders:D}=await Promise.resolve().then(() => (vV6(),xV6)),M;if(J.executeMode){let t=await U({toolService:G,providers:[H,z],initialTimeout:15000});M=t.registrations;for(let[p,J1]of t.initErrors)v.warn(`${p} provider initialization slow or failed:`,J1)}else M=D({toolService:G,providers:[H,z]});if(Q.jetbrains)oE("JetBrains");else if(Q.ide&&O96())oE("VS Code");else if(Q.ide&&w96())oE("Neovim");if(J.executeMode)aM0(!0);let L,A=V3.status.pipe(Q6((t)=>Boolean(t.connected&&t.authenticated)),N4()).subscribe((t)=>{if(t){if(!L)L=G.registerTool(qs0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let t=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new i61(process.cwd(),{alwaysIncludePaths:t},!0)}else E=new class extends i61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(D5.write(`No API key found. Starting login flow...
|
|
4795
4795
|
`),!await hI8(J))await TA(),process.exit(1)}let I=await ij0({isDevelopment:!1}),P=new TP1(I,Z),R=new wP1(I,{lazy:!0}),k=new hB1(P,(t,p)=>{let J1=Q2.get(t);if(J1)J1.handle(p).catch((H1)=>{v.error("Failed to apply artifact delta",H1)})}),y=Q.notifications!==void 0?Q.notifications:!J.executeMode,x=Me0({playNotificationSound:async(t)=>{if(y){De0(t);let p=Bj1(),J1=Nj1();if((!p||J1)&&X.settings["notifications.system.enabled"]!==!1){if(t==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(t==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:P,configService:Z});v.info("Starting Amp background services");let b=zo0({threadService:P,threadHistoryService:R,configService:Z,isExtensionDevelopment:!1}),d;V3.status.subscribe((t)=>{d=t});let m=new QG1({workspaceRoots:[h0.file(process.cwd())],getCurrentFile:()=>{if(!d?.openFile)return;try{return h0.parse(d.openFile)}catch(t){v.warn("Failed to parse current file URI",{uri:d.openFile,error:t});return}},getOpenFiles:()=>{if(!d?.visibleFiles?.length)return[];let t=d.openFile;return d.visibleFiles.filter((p)=>p!==t).map((p)=>{try{return h0.parse(p)}catch(J1){return v.warn("Failed to parse visible file URI",{uri:p,error:J1}),null}}).filter((p)=>p!==null)}}),a=new Lj1,X1={codebaseContextService:m,configService:Z,toolService:G,mcpService:H,trustStore:W,threadService:P,threadHistoryService:R,threadSyncService:b,planFileManager:k,threadStorage:I,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:x,fileSystem:Q.jetbrains||Q.ide?zC0:i8,terminal:a};return{...X1,async asyncDispose(){if(X1.mcpService.hasAuthenticatingClients())v.info("Waiting for OAuth authentication to complete before exit..."),await X1.mcpService.waitForAuthentication();for(let t of M.values())t.dispose();await X1.mcpService.dispose(),q(),await X1.threadService.asyncDispose(),X1.configService.unsubscribe(),V(),X1.fuzzyServer.dispose(),X1.threadSyncService.dispose(),X1.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function hI8(J){if(!J.executeMode){if(!await nC1("Would you like to log in to Amp? [(y)es, (n)o]: "))return D5.write(`Login cancelled. Run the command again to retry.
|
|
4796
4796
|
`),!1}return await pV6(J)}async function pV6(J){let Q=RI8(32).toString("hex"),Z=await iC1(J.ampURL,Q),Y=new AbortController;try{await _W(Z,Y.signal)}catch(G){v.error("Error opening browser",{error:G})}let X=await iC1(J.ampURL,Q,!1);D5.write(`If your browser does not open automatically, visit:
|
|
4797
4797
|
|
|
@@ -4801,7 +4801,7 @@ ${_4.blue.bold(X)}
|
|
|
4801
4801
|
Login successful! You can now use the Amp CLI.
|
|
4802
4802
|
`),!0}catch(G){return v.error("Login failed",{error:G}),g$.write(`
|
|
4803
4803
|
Login failed: ${G instanceof Error?G.message:String(G)}
|
|
4804
|
-
`),!1}}function bI8(){let J=new UA().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)_R(),process.exit(0);let z=H.originalError??H;U86(z)}),J.option("-V, --version","Print the version number and exit",()=>{D5.write(`0.0.
|
|
4804
|
+
`),!1}}function bI8(){let J=new UA().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)_R(),process.exit(0);let z=H.originalError??H;U86(z)}),J.option("-V, --version","Print the version number and exit",()=>{D5.write(`0.0.1764979300-g324cf3 (released 2025-12-06T00:07:00.608Z)
|
|
4805
4805
|
`),process.exit(0)}),J.addHelpText("after",M96()),J.configureHelp({formatHelp:L96}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await oQ(U);await pI8(D)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await oQ(U);await uI8(D,await vC1(U,D.settings))});let Q=async(H,z,U)=>{zz1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:Q0.of([h0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:jv1,userConfigDir:uV6});let D={...z,executeMode:!1};await Rv1(D,{...H,openThreadSwitcher:!0},U)},Z=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await oQ(U);await bV6(U,D,z)});Z.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await oQ(U);await oI8(U,D,z)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await oQ(D);if(z.pick)g$.write(`${_4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
4806
4806
|
`);if(z.last||H||M.executeMode)await aI8(D,M,H,U);else await Q(D,M,U)}),Z.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await oQ(D);await nI8(D,M,H,U)}),Z.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await oQ(U);await bV6(U,D,z)}),Z.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, unlisted, workspace, group)").option("--support [message]","Share thread with Amp support for debugging").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await oQ(D);await iI8(D,M,H,U,z.support)}),Z.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(H,z,U,D)=>{let M=D.optsWithGlobals(),L=await oQ(M);await dI8(M,L,H,z,D)}),Z.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await oQ(D);await cI8(D,M,H,U)}),Z.command("replay <threadId>").alias("p").summary("Replay a thread").description("Replay a thread by downloading it and playing through all interactions. User messages are simulated with variable typing speed.").option("--wpm <wpm>","Typing speed in words per minute (default: 120)","120").option("--no-typing","Disable typing simulation and display messages instantly").option("--message-delay <ms>","Delay between messages in milliseconds (default: 1000)","1000").option("--tool-progress-delay <ms>","Delay to show tool in-progress state in milliseconds (default: 800)","800").option("--exit-delay <seconds>","Delay in seconds before exiting after replay completes (default: 3)","3").option("--no-indicator","Hide the replay progress indicator").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await oQ(D);await lI8(D,M,H,z,U)}),V76(J,async(H,z)=>{let U=await oQ(z);h$(H,z);let D=await b$(U,z);return{context:U,mcpService:D.mcpService,toolService:D.toolService,toolServices:D.toolService,configService:D.configService,cleanupTerminal:_R,asyncDispose:D.asyncDispose.bind(D)}}),Z56(J,async(H)=>{let z=H.optsWithGlobals();return await oQ(z)}),i96(J,async(H)=>{let z=await oQ(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{h$(U,H);let D=await b$(z,H);return{mcpService:D.mcpService,settings:z.settings,asyncDispose:D.asyncDispose.bind(D)}}}});function X(H,z,U){let M=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),L=new Mq(z,M),A=vI8(H);if(A)L.default(A);if(L.hidden=yI8(H)||hV6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of fV6)switch(H.type){case"flag":{J.addOption(X(H,`--${H.long}`)),J.addOption(X(H,`--no-${H.long}`,!1));break}case"switch":{J.addOption(X(H,`--${H.long}`,!0));break}default:{J.addOption(X(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}let G=new Mq("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(G);let V=new Mq("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(V);let K=new Mq("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);J.addOption(K);let q=new Mq("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(q);let W=new Mq("--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 Mq("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return U76(J),J.action(async(H,z)=>{let U=H,D=await oQ(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")D5.write(_4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
|
|
4807
4807
|
`)),process.exit(0);if(Object.keys(U).forEach((L)=>{let A=fV6.find((E)=>E.name===L);if(A&&hV6(A)&&!xI8(A))g$.write(_4.yellow(`Warning: '--${L}' flag is deprecated
|
|
@@ -4809,8 +4809,8 @@ Login failed: ${G instanceof Error?G.message:String(G)}
|
|
|
4809
4809
|
Or pipe via stdin: echo "your message" | amp --execute`);h$(Z,Q);let V=await b$(J,Q);mV6=V;let K=Uu(V),q=async(X1)=>{let t=await gV6(X1,"utf-8"),p=JSON.parse(t);if(!xX(p.id))throw new P8(L$.invalidThreadId);return l51(V,{visibility:Y,agentMode:Q.mode,thread:p})},W=async(X1)=>{if(!xX(X1))throw new P8(L$.invalidThreadId);try{let[p,J1]=await Promise.all([X5.getThreadLinkInfo({thread:X1},{config:V.configService}),X5.getUserInfo({},{config:V.configService})]);if(p.ok&&J1.ok){let H1=p.result.creatorUserID,U1=J1.result.id;if(H1&&H1!==U1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new P8(`Cannot resume thread created by another user.
|
|
4810
4810
|
|
|
4811
4811
|
This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}catch(p){if(p instanceof P8)throw p;v.warn("Failed to validate thread ownership in CLI, allowing to open",{error:p})}let t=await V.threadService.get(X1)??void 0;return v.info(`[fetchAndStartThread] Loaded thread ${X1}, agentMode: ${t?.agentMode??"undefined"}`),l51(V,{visibility:Y,agentMode:t?void 0:Q.mode,thread:t})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return l51(V,{visibility:Y,agentMode:Q.mode})}catch(X1){if(X1 instanceof P8)throw X1;throw await yg(X1,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return l51(V,{visibility:Y,agentMode:Q.mode})};if(Q.format==="jsonl")g$.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
4812
|
-
`),await TA(),process.exit(1);if(J.executeMode&&Q.remote)await Y56(X,G,V.configService),await V.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)o96(V.mcpService,J.settings),await j86(U,U.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await V.asyncDispose(),process.exit(0);let D=!1,M=!1,L=!1;if(Q.jetbrains||Q.ide){await KL0();let X1=tE({jetbrainsOnly:Q.jetbrains});if(X1.length===0){if(Q.jetbrains)M=!await V.configService.get("jetbrains.skipInstall")}else if(X1.length===1){let t=X1[0];if(t)V3.selectConfig(t)}else L=!0}let A=Q41("0.0.
|
|
4813
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await Z96({...J,workspaceTrust:{current:!0,changes:n_},getHook:process.env.AMP_URL?(G,V)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return V()}:void 0});if(J.mcpConfig){let G=await n96(J.mcpConfig);Y=a96(Y,G)}let X=await Y.get("url","global");if(!X)X=KZ;if(!DF(X))v.info("Targeting custom Amp server",{ampURL:X});return Y=QB0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:X56(await vC1(J,Y))}}function gI8(J){let Q={};for(let Z=0;Z<J.length;Z++){let Y=J[Z];if(Y?.startsWith("--")){let G=Y.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Z+1];if(V&&!V.startsWith("--"))Q[G]=V,Z++}}return Q}async function mI8(){let J=gI8(process.argv);if($86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),_I8(v),v.info("Starting Amp CLI.",{version:"0.0.
|
|
4812
|
+
`),await TA(),process.exit(1);if(J.executeMode&&Q.remote)await Y56(X,G,V.configService),await V.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)o96(V.mcpService,J.settings),await j86(U,U.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await V.asyncDispose(),process.exit(0);let D=!1,M=!1,L=!1;if(Q.jetbrains||Q.ide){await KL0();let X1=tE({jetbrainsOnly:Q.jetbrains});if(X1.length===0){if(Q.jetbrains)M=!await V.configService.get("jetbrains.skipInstall")}else if(X1.length===1){let t=X1[0];if(t)V3.selectConfig(t)}else L=!0}let A=Q41("0.0.1764979300-g324cf3",V.settingsStorage),E=new W01(V.threadStorage),I=Q0.of([h0.file(process.cwd())]),P=WG1(void 0,I),R=new Z41(V.mcpService,J.settings.getWorkspaceRootPath());if(X)U.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let k=(async()=>{try{let X1=await X5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(X1.ok)return v.info("User free tier status:",X1),X1.result}catch(X1){v.error("Failed to fetch free tier status:",X1)}})(),y=(async()=>{try{let X1=await X5.getUserInfo({},{config:V.configService});if(X1.ok)return X1.result}catch(X1){v.debug("Failed to fetch user workspace info:",X1)}})(),[x,b]=await Promise.all([k,y]),d=b?.email,m=d&&(d.endsWith("@sourcegraph.com")||d.endsWith("@ampcode.com")||d==="auth-bypass-user@example.com"),a=await V56();v.info("Loaded session state:",a),await sy1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,planFileManager:V.planFileManager,threadID:U.threadID,threadFuzzyIndexer:E,worker:U,workerDeps:K,configService:V.configService,internalAPIClient:X5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:V3,connectedClientsService:new gn,commandRegistry:P,mcpService:V.mcpService,mcpTrustHandler:R,showJetBrainsInstaller:M,showIdePicker:D,showIdePickerHint:L,openThreadSwitcher:Q.openThreadSwitcher,updateService:A,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:a,freeTierStatus:x,workspace:b?.team??null,features:b?.features??[],isDogfooding:m||!1,threadDependencies:V,initialAgentMode:Z.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function oQ(J){if(J.interactive)g$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
4813
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await Z96({...J,workspaceTrust:{current:!0,changes:n_},getHook:process.env.AMP_URL?(G,V)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return V()}:void 0});if(J.mcpConfig){let G=await n96(J.mcpConfig);Y=a96(Y,G)}let X=await Y.get("url","global");if(!X)X=KZ;if(!DF(X))v.info("Targeting custom Amp server",{ampURL:X});return Y=QB0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:X56(await vC1(J,Y))}}function gI8(J){let Q={};for(let Z=0;Z<J.length;Z++){let Y=J[Z];if(Y?.startsWith("--")){let G=Y.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Z+1];if(V&&!V.startsWith("--"))Q[G]=V,Z++}}return Q}async function mI8(){let J=gI8(process.argv);if($86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),_I8(v),v.info("Starting Amp CLI.",{version:"0.0.1764979300-g324cf3",buildTimestamp:"2025-12-06T00:07:00.608Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new P8(L$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await bI8().parseAsync(process.argv)}BP1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await mI8().catch(yg)});async function uI8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),D5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
4814
4814
|
`);else if(!DF(J.ampURL))D5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
4815
4815
|
`);let Z=process.env.AMP_API_KEY;if(Z)D5.write(`API key found in environment variable, storing...
|
|
4816
4816
|
`),await Q.set("apiKey",Z,J.ampURL),D5.write(`API key successfully stored.
|
|
@@ -4823,7 +4823,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
4823
4823
|
`);else D5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
4824
4824
|
`);process.exit(0)}async function dI8(J,Q,Z,Y,X){h$(X,J);let G=await b$(Q,J);try{let V=i51(Z);if(!V)n51(Z);let K=V,q=Y.trim();if(q.length===0)f$("Thread name cannot be empty");if(q.length>256)f$("Thread name cannot exceed 256 characters");if(!(await iC(K,G)).messages.length)f$("Cannot rename an empty thread.");let H=Uu(G);await(await Q2.getOrCreateForThread(H,K)).handle({type:"title",value:q}),v.info("GOT HERE"),await G.threadSyncService.sync(),v.info("GOT THERE"),D5.write(_4.green(`✓ Thread ${K} renamed to "${q}"
|
|
4825
4825
|
`)),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose();let K=`Failed to rename thread: ${V instanceof Error?V.message:String(V)}`;f$(K)}}async function cI8(J,Q,Z,Y){h$(Y,J);let X=await b$(Q,J);try{let G=i51(Z);if(!G)n51(Z);let K=await iC(G,X),q=qR(K);D5.write(q+`
|
|
4826
|
-
`),await X.asyncDispose(),process.exit(0)}catch(G){await X.asyncDispose();let V=`Failed to render thread as markdown: ${G instanceof Error?G.message:String(G)}`;f$(V)}}async function lI8(J,Q,Z,Y,X){h$(X,J);let G=await b$(Q,J);try{let V=await Sv1(Z),K=await iC(V,G),q=Y.typing!==!1,W=parseInt(Y.wpm||"120",10),H=parseInt(Y.messageDelay||"1000",10),z=parseInt(Y.toolProgressDelay||"800",10),U=parseInt(Y.exitDelay||"3",10)*1000,D=Y.indicator!==!1,M=Uu(G),L=K.id;await G.threadStorage.set(L,K);let A=await Q2.getOrCreateForThread(M,L);await A.resume();let E=q01.fromWorker(A),I=new W01(G.threadStorage),P=Q0.of([h0.file(process.cwd())]),R=WG1(void 0,P),k=new Z41(G.mcpService,Q.settings.getWorkspaceRootPath()),y=Q41("0.0.
|
|
4826
|
+
`),await X.asyncDispose(),process.exit(0)}catch(G){await X.asyncDispose();let V=`Failed to render thread as markdown: ${G instanceof Error?G.message:String(G)}`;f$(V)}}async function lI8(J,Q,Z,Y,X){h$(X,J);let G=await b$(Q,J);try{let V=await Sv1(Z),K=await iC(V,G),q=Y.typing!==!1,W=parseInt(Y.wpm||"120",10),H=parseInt(Y.messageDelay||"1000",10),z=parseInt(Y.toolProgressDelay||"800",10),U=parseInt(Y.exitDelay||"3",10)*1000,D=Y.indicator!==!1,M=Uu(G),L=K.id;await G.threadStorage.set(L,K);let A=await Q2.getOrCreateForThread(M,L);await A.resume();let E=q01.fromWorker(A),I=new W01(G.threadStorage),P=Q0.of([h0.file(process.cwd())]),R=WG1(void 0,P),k=new Z41(G.mcpService,Q.settings.getWorkspaceRootPath()),y=Q41("0.0.1764979300-g324cf3",G.settingsStorage);await sy1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,planFileManager:G.planFileManager,threadID:L,threadFuzzyIndexer:I,worker:E,workerDeps:M,configService:G.configService,internalAPIClient:X5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:V3,connectedClientsService:new gn,commandRegistry:R,mcpService:G.mcpService,mcpTrustHandler:k,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D}}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await yg(V,Z)}}async function iI8(J,Q,Z,Y,X){h$(Y,J);let G=await b$(Q,J);try{let V=i51(Z);if(!V)n51(Z);let K=V,q=await X5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=Y41(J,W);if(!H&&!X)f$("Must specify either --visibility or --support");if(H&&X)f$("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)f$(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,X41(H)),D5.write(_4.green("✓ ")+`Thread ${K} visibility changed to ${H}.
|
|
4827
4827
|
`);if(X){await iC(K,G);let z=typeof X==="string"?X:void 0;await mj0(G.threadService,K,G.configService,z),D5.write(_4.green("✓ ")+`Thread ${K} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
4828
4828
|
`)}await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),f$(`Failed to update thread: ${V instanceof Error?V.message:String(V)}`)}}async function nI8(J,Q,Z,Y){h$(Y,J);let X=await b$(Q,J),G=Uu(X);try{let V=await Sv1(Z),q=(await iC(V,X)).messages.length-1,W=await Q2.getOrCreateForThread(G,V),H=await WR(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await Cv1(H),D5.write(`${H}
|
|
4829
4829
|
`),await X.asyncDispose(),process.exit(0)}catch(V){g$.write(`Error forking thread: ${V instanceof Error?V.message:String(V)}
|