@sourcegraph/amp 0.0.1765940986-gbb0819 → 0.0.1765944507-gbb0819

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +9 -9
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -3839,11 +3839,11 @@ Actual: ${X}`)}async function SY8(J,Q,Y){let{execSync:Z}=await import("node:ch
3839
3839
  ${D}`;if(X==="pnpm"&&D.includes("Unable to find the global bin directory"))M+=`
3840
3840
 
3841
3841
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
3842
- 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()}})})}U0();U0();async function Y41(J,Q){let Z=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Z}/@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=vY8(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 y.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 y.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function vY8(J,Q){let Y=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Z=Y(J),X=Y(Q),G=Math.max(Z.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Z.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Z.label===X.label)return 0;if(!Z.label&&X.label)return 1;if(Z.label&&!X.label)return-1;if(Z.label&&X.label)return Z.label<X.label?-1:1;return 0}a0();function Z41(J,Q){let Y=new x4,Z=Y.pipe(B8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new UK().scoped("update"),G=Z.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 DN(500),Y.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=uA(),W=await Y41(J,q);if(!(W.latestVersion&&W.hasUpdate)){X.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,D=0.5;if(Math.abs(U)<0.5)return X.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await Q41();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Y.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}if(z==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Y.next("update-available");return}try{await um(W.latestVersion,z);let U=await yN(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Y.next("updated");else X.warn("success with warning",D),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await DN(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}import{stderr as jq}from"node:process";function n46(J){let Q=new PA().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(Z)=>{await Nj1(Z.force||!1,Z.verbose||!1,"0.0.1765940986-gbb0819"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new PA("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(Z)=>{await hY8(Z.targetVersion)});J.addCommand(Y)}async function hY8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")jq.write(O6.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
3842
+ 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()}})})}U0();U0();async function Y41(J,Q){let Z=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Z}/@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=vY8(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 y.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 y.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function vY8(J,Q){let Y=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Z=Y(J),X=Y(Q),G=Math.max(Z.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Z.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Z.label===X.label)return 0;if(!Z.label&&X.label)return 1;if(Z.label&&!X.label)return-1;if(Z.label&&X.label)return Z.label<X.label?-1:1;return 0}a0();function Z41(J,Q){let Y=new x4,Z=Y.pipe(B8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new UK().scoped("update"),G=Z.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 DN(500),Y.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=uA(),W=await Y41(J,q);if(!(W.latestVersion&&W.hasUpdate)){X.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,D=0.5;if(Math.abs(U)<0.5)return X.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await Q41();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Y.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}if(z==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Y.next("update-available");return}try{await um(W.latestVersion,z);let U=await yN(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Y.next("updated");else X.warn("success with warning",D),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await DN(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}import{stderr as jq}from"node:process";function n46(J){let Q=new PA().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(Z)=>{await Nj1(Z.force||!1,Z.verbose||!1,"0.0.1765944507-gbb0819"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new PA("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(Z)=>{await hY8(Z.targetVersion)});J.addCommand(Y)}async function hY8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")jq.write(O6.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
3843
3843
 
3844
3844
  `));try{if(!J){jq.write(O6.blue(`Checking for updates...
3845
- `));let Y=uA(),{hasUpdate:Z,latestVersion:X}=await Y41("0.0.1765940986-gbb0819",Y);if(!Z){jq.write(O6.green(`✓ Amp CLI is already up to date: ${"0.0.1765940986-gbb0819"} (${"released"} ${"2025-12-17T03:15:06.932Z"}${`, ${oI(new Date("2025-12-17T03:15:06.932Z"))} ago`})
3846
- `));let V=await yN("0.0.1765940986-gbb0819");if(V.warning)jq.write(`
3845
+ `));let Y=uA(),{hasUpdate:Z,latestVersion:X}=await Y41("0.0.1765944507-gbb0819",Y);if(!Z){jq.write(O6.green(`✓ Amp CLI is already up to date: ${"0.0.1765944507-gbb0819"} (${"released"} ${"2025-12-17T04:13:40.363Z"}${`, ${oI(new Date("2025-12-17T04:13:40.363Z"))} ago`})
3846
+ `));let V=await yN("0.0.1765944507-gbb0819");if(V.warning)jq.write(`
3847
3847
  `+O6.yellow(V.warning)+`
3848
3848
  `);process.exit(0)}if(!X)jq.write(O6.yellow("[WARN] could not find latest version")),process.exit(0);J=X}jq.write(O6.blue(`Updating to version ${J}...
3849
3849
  `)),await um(J,void 0,(Y)=>{jq.write(O6.dim(`Running: ${Y}
@@ -4517,7 +4517,7 @@ Ctrl-X, Y, Z to unlock`;if(U){let a=W.text.replace(/`([^`]+)`/g,"$1")+`
4517
4517
  `,A)])}),x];if(!q&&!U&&W.url){let m=W.url.replace(/^https?:\/\//,"");b.push(new c5({uri:W.url,text:m,style:new J1({color:Y.secondary,underline:!0})}))}if(k&&!U)b.push(k);let u=new Q0({width:40,child:new x0({crossAxisAlignment:"start",mainAxisSize:"min",children:b})});return D4.child(new B6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new fS1({width:Oy1,height:wy1,agentMode:this.widget.agentMode,glow:this._glow,t:H,fps:0,shockwaves:this._shockwaves,onShockwave:P,...V==="disabled"&&{seed:42}}),new Q0({width:2}),u]}))}}U0();D8();_4();I7();D8();a0();function gF8(J,Q){return`${J}:${Q}`}class Ey1{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 t1((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new t1((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new t1((Q)=>{return this.emitWorkerStatus=(Y)=>Q.next(Y),()=>{this.emitWorkerStatus=null}})}registerWorker(J){let Q=J.thread.id;if(this.workers.has(Q))this.unregisterWorker(Q);this.threadsMap.set(Q,J.thread),this.subthreadsMap.set(Q,[]),this.workers.set(Q,{state:"initial"});let Y=this.threadService.observePatches(Q).pipe(XM()).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,Y);let Z=J.status.subscribe((G)=>{if(this.workers.set(Q,G),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:G})});this.workerStatusSubs.set(Q,Z);let X=J.subthreads.subscribe((G)=>{this.subthreadsMap.set(Q,G);for(let V of G){let K=gF8(Q,V.toolUse.id);if(this.subthreadPatchSubs.has(K))continue;let q=this.threadService.observePatches(V.threadID).pipe(XM()).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 Y=this.workerStatusSubs.get(J);if(Y)Y.unsubscribe(),this.workerStatusSubs.delete(J);let Z=this.subthreadsSubs.get(J);if(Z)Z.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 t1((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new t1((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new t1((Q)=>{return this.workerStatusObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})})}}get threadViewStates(){let J={};for(let[Q,Y]of this.threadsMap){let Z=this.workers.get(Q);if(Z)J[Q]=GA(Y,Z)}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 uF8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Y,subthread:Z}=Q,X=J.subagents[Z.threadID];if(!X){if(X={subThreadID:Y.id,parentToolID:Z.toolUse.id,taskDescription:Z.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=pJ(J.mainThread);X.isCompleted=oJ6(W,Z.toolUse.id)}}let G=pF8(Y,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=xC(Y).items.filter((W)=>W.type==="toolResult");for(let W of q)K[W.id]={id:W.id,subthreadID:Y.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[Z.threadID]:V},tools:K,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Y,subthreads:Z,workerStatus:X}=Q,G=pJ(Y),V={...J.subagents};for(let z of Z){let U=V[z.threadID];if(!U)continue;let D=oJ6(G,z.toolUse.id);V[z.threadID]={...U,isCompleted:D}}let{items:K}=xC(Y),q=GA(Y,X),W=vF({messages:Y.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:V,items:K,viewState:q,todosList:H,mainThread:Y}}case"worker-status-change":{if(!J.mainThread)return J;let Y=GA(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function xC(J){let Q=[],Y=new Map,Z=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(Y.set(W.id,W),K)Z.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=Y.get(q.toolUseID)??OZ(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 oJ6(J,Q){let Y=J.get(Q);return(Y&&W3(Y.run))??!1}function pF8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((X)=>X.type==="tool_result"&&X.run.status==="blocked-on-user"))return y.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(xC(J).items.some((X)=>X.type==="toolResult"&&X.toolResult.run.status==="in-progress")){let X=Q?.type==="running-tools"?Q.startTime:Date.now();return y.info("Subagent status: running-tools",{threadID:J.id,startTime:X,hasStartTime:!!X}),{type:"running-tools",startTime:X}}if(Y&&Y.role==="assistant"&&Y.state.type==="streaming")switch(Y.content.at(-1)?.type){case"text":return y.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return y.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 y.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}default:return y.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return y.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class Iy1 extends p0{props;constructor(J){super();this.props=J}createState(){return new rJ6}}class rJ6 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 Ey1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),Y=Q.mainThread.subscribe((G)=>{this.dispatch({type:"main-thread-patch",thread:G.mainThread,subthreads:G.subthreads,workerStatus:G.workerStatus})});this.subscriptions.push(Y);let Z=Q.subthreads.subscribe((G)=>{this.dispatch({type:"subthread-patch",thread:G.thread,subthread:G.subthread})});this.subscriptions.push(Z);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=uF8(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 Y=(G)=>G===m5||G===H9||G===wK,Z=new Map;for(let G of this.state.items)if(G.type==="toolResult"&&Y(G.toolUse.name))Z.set(G.toolUse.id,{toolUseId:G.toolUse.id,toolName:G.toolUse.name,toolRun:G.toolResult.run});let X=Array.from(Z.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:aE(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,(Y)=>this.switchWorker(Y),()=>this.currentWorker,this.recentThreadIDs)}}class Py1 extends p0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new sJ6}}class sJ6 extends u0{build(J){let Y=$6.of(J).colors,{todos:Z,title:X="TODOs"}=this.widget.props;if(!Array.isArray(Z)||Z.length===0)return new Q0({width:0,height:0});let G=Z.map((V)=>this.buildTodoItem(V,Y));return new f0({child:new q6({padding:W0.symmetric(1,0),child:new x0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new _1({text:new l(X,new J1({bold:!0,color:Y.foreground}))}),...G]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),Z=J.status==="completed",X=new J1({bold:J.status==="in-progress",color:Q.foreground,dim:Z}),G=new J1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:Z});return new B6({crossAxisAlignment:"start",children:[new _1({text:new l(Y,X)}),new Q0({width:1}),new c6({child:new _1({text:new l(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class Ty1 extends x6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Y,onButtonClick:Z}){super({key:J});this.ad=Q,this.onDismiss=Y,this.onButtonClick=Z}build(J){let Q=$6.of(J),Y=Q.colors.primary,Z=Q.colors.foreground;return new f0({decoration:new L8(void 0,new q4(new X4(Y,1,"rounded"),new X4(Y,1,"rounded"),void 0,new X4(Y,1,"rounded"))),child:new q6({padding:W0.horizontal(1),child:new x0({children:[new B6({crossAxisAlignment:"start",children:[new c6({child:new _1({text:new l(this.ad.content,new J1({color:Z}))})}),new Q0({width:4}),new c5({uri:"https://ampcode.com/free",text:"Ad",style:new J1({color:Z,dim:!0})})]}),new B6({crossAxisAlignment:"start",children:[new aS1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:W0.horizontal(1),color:Y,reverse:!0}),new Q0({width:2}),new _1({text:new l(this.ad.destinationUrlHostname,new J1({color:Z,dim:!0}))})]})]})})})}}class Ry1 extends p0{props;constructor(J){super();this.props=J}createState(){return new tJ6(this.props.autofocus??!0)}}class tJ6 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"},Y=E4.sizeOf(J),Z=Math.min(60,Y.width-4),X=Y.height-4,G=[];if(this.widget.props.title)G.push(new _1({text:new l(this.widget.props.title,new J1({bold:!0,color:z1.blue}))}),new Q0({height:1}));if(this.widget.props.message)G.push(new _1({text:new l(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)G.push(new Q0({height:1}));let V=[];if(this.widget.props.showCopyOption)V.push(new _1({text:new l("Enter to copy",new J1({dim:!0}))}));return V.push(new _1({text:new l("Escape to close",new J1({dim:!0}))})),G.push(new B6({children:V.flatMap((K,q)=>q<V.length-1?[K,new Q0({width:1}),new _1({text:new l("•",new J1({dim:!0}))}),new Q0({width:1})]:[K]),mainAxisSize:"min"})),new D4({child:new f0({constraints:new N6(Z,Z,0,X),decoration:new L8(z1.default(),new q4(new X4(z1.blue,1,"rounded"),new X4(z1.blue,1,"rounded"),new X4(z1.blue,1,"rounded"),new X4(z1.blue,1,"rounded"))),padding:new W0(2,2,2,2),child:new X8({autofocus:this.autofocus,onKey:Q,child:new x0({children:G,mainAxisSize:"min"})})})})}}class y91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,y91.prototype)}}class x91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,x91.prototype)}}function Cy1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Y)=>{if(Y.startsWith('"')&&Y.endsWith('"')||Y.startsWith("'")&&Y.endsWith("'"))return Y.slice(1,-1);return Y})}tW();U0();import{spawn as dF8}from"node:child_process";import{promises as cF8}from"node:fs";function eJ6(J){return J.kind==="executable"}function JQ6(J){return J.kind==="markdown"}var Fz=50000,QQ6=300000;async function jy1(J,Q,Y,Z={}){let{timeoutMs:X=QQ6,signal:G,source:V}=Z;try{let K=await Y.getCommand(J,V);if(!K)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Y.isCommandAvailable(J,V))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(y.debug("Executing command",{commandName:J,filePath:K.filePath,args:Q}),JQ6(K))return await lF8(K,Q);else if(eJ6(K))return await iF8(K,Q,X,G);else return{success:!1,output:"",error:"Unsupported command type"}}catch(K){return y.error("Failed to execute command",{commandName:J,error:K}),{success:!1,output:"",error:K instanceof Error?K.message:"Unknown error occurred"}}}async function lF8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await cF8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>Fz?Y.slice(0,Fz)+`
4518
4518
  ... (output truncated at ${Fz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function iF8(J,Q,Y=QQ6,Z){return new Promise((X)=>{let[G,V]=nF8(J,Q);y.debug("Spawning command",{spawnCommand:G,spawnArgs:V.slice(0,10),filePath:J.filePath,timeoutMs:Y});let K=WE0(Z),q=!1,W=setTimeout(()=>{q=!0,K.abort(),y.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=dF8(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<=Fz)z.push(L);else{let A=Fz-(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<=Fz)U.push(L);else{let A=Fz-(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 ${Y}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?`
4519
4519
  ${E}`:E;if(D>Fz)I+=`
4520
- ... (output truncated at ${Fz} 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 ${Y}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 nF8(J,Q){let{filePath:Y,interpreter:Z,extension:X}=J;if(process.platform==="win32")return oF8(Y,Z?[...Z]:null,X,Q);else return aF8(Y,Z?[...Z]:null,X,Q)}function aF8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];else return[J,Z]}function oF8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Z]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Z]];case".exe":return[J,Z];default:return[J,Z]}}U0();cX();P7();hW();_Y();gG();eW();iK();D8();Sb();I7();f_();a0();var SQ6=K6(pM(),1);import{writeFile as RQ6}from"fs/promises";import CQ6 from"path";U0();_Y();class Sy1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1765940986-gbb0819"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await fo(Q,this.configService)}catch(Q){y.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 UO extends p0{props;constructor(J){super();this.props=J}createState(){return new YQ6}}class YQ6 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class ZQ6 extends u0{controller=new aY;focusNode=new V8({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:Y,app:Z}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=q4.all(new X4(Y.foreground,1,"solid")),q=new Kz({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:Y.foreground,border:null},maxLines:1}),W=new B6({children:[new f0({decoration:{color:z1.default()},child:new _1({text:new l(">",new J1({color:Y.foreground}))})}),new c6({child:q})]}),H=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new J1({color:Y.foreground})),new l(this.widget.props.commandName,new J1({color:z1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new l("Enter",new J1({color:Z.keybind}))),z.push(new l(" to submit, ",new J1({color:Y.foreground,dim:!0})));z.push(new l("Esc",new J1({color:Z.keybind}))),z.push(new l(" to cancel",new J1({color:Y.foreground,dim:!0})));let U=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l("",void 0,z)})});return new f0({decoration:{border:K,color:z1.default()},padding:W0.all(1),child:new x0({children:[H,new Q0({height:1}),W,new _5,U]})})}}class gg extends p0{props;constructor(J){super();this.props=J}createState(){return new ZQ6}}eW();class XQ6 extends u0{controller=new aY;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new V8({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>=eF)return!1;let Q=UC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=$6.of(J),{colors:Y,app:Z}=Q,G=E4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new FO({controller:this.controller,triggers:[new uq],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:C8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new X8({focusNode:this.focusNode,child:K}),W=new f0({constraints:new N6({maxHeight:V}),padding:W0.symmetric(1,0),child:q}),H=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new J1({color:Y.foreground})),new l(this.widget.props.commandName,new J1({color:z1.yellow,bold:!0}))])})}),z=new f0({padding:W0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new J1({color:Z.keybind})),new l(" again to clear input",new J1({color:Y.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new J1({color:Y.foreground,dim:!0})),new l("Enter",new J1({color:Z.keybind})),new l(" to submit, ",new J1({color:Y.foreground,dim:!0})),new l("Esc",new J1({color:Z.keybind})),new l(" to clear",new J1({color:Y.foreground,dim:!0}))])})}),U=[H,new Q0({height:1}),new c6({child:W}),new Q0({height:1}),z];return new f0({decoration:{border:q4.all(new X4(Y.foreground,1,"solid")),color:z1.default()},padding:W0.all(1),child:new x0({children:U})})}}class vC extends p0{props;constructor(J){super();this.props=J}createState(){return new XQ6}}import{isDeepStrictEqual as eF8}from"node:util";var rF8=/[\\/_ +.#"@[({&]/,sF8=/[\\/_ +.#"@[({&]/g,tF8=/[\s-]/,$Q6=/[\s-]/g;function h91(J,Q,Y,Z,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=Z.charAt(G),W=Y.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=h91(J,Q,Y,Z,W+1,G+1,V),z>H){if(W===X)z*=1;else if(tF8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match($Q6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(rF8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(sF8),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&&(Y.charAt(W-1)===Z.charAt(G+1)||Z.charAt(G+1)===Z.charAt(G)&&Y.charAt(W-1)!==Z.charAt(G))){if(U=h91(J,Q,Y,Z,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(q,W+1)}return V[K]=H,H}function v91(J){return J.toLowerCase().replace($Q6," ")}function GQ6(J,Q){let Y=h91(J,Q,v91(J),v91(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=h91(J,K,v91(J),v91(K),0,0,{});if(q===0)return Y;X+=q,G+=K.length}let V=X/Z.length*0.95;return Math.max(Y,V)}return Y}class hC{}class fC{}class f91{}class b91{}class VQ6 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new KQ6}}class KQ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function JU8(J,Q){if(J==="")return{matches:!0,score:1};let Y=GQ6(Q,J);return{matches:Y>0.15,score:Y}}class v2 extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new qQ6}}class qQ6 extends u0{controller=new aY;focusNode;scrollController=new k5;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new V8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.cachedFiltered;this.widget.props.onSelectionChange?.(Q[0]??null)}),this.recomputeFilteredItems();let J=this.cachedFiltered;this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!eF8(J.props.items,this.widget.props.items)){this.recomputeFilteredItems(),this.ensureSelectedItemVisible();let Q=this.cachedFiltered;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 hC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof fC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof f91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof b91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Y=Q.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...JU8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,X)=>this.widget.props.sortItems(Z,X,J):(Z,X)=>X.score-Z.score).map((Z)=>Z.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Q)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,Z=Q.size.height;P81(J,{top:Y,bottom:Z},{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(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let Z=Y[J],X=Z?this.widget.props.isItemDisabled?.(Z)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!X){if(Z)this.widget.props.onAccept(Z)}}};build(J){let Q=$6.of(J),{colors:Y}=Q,Z=this.getFilteredItems(),X=q4.all(new X4(Y.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new Kz({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Y.foreground,border:null},maxLines:1}),K=new ZX({shortcuts:new Map([[new $4("ArrowDown"),new hC],[new $4("ArrowUp"),new fC],[new $4("Tab"),new hC],[new $4("Tab",{shift:!0}),new fC],[new $4("n",{ctrl:!0}),new hC],[new $4("p",{ctrl:!0}),new fC],[new $4("Enter"),new f91],[new $4("Escape"),new b91]]),focusNode:this.focusNode,child:V}),q=new UJ({actions:new Map([[hC,new E8(this.invoke)],[fC,new E8(this.invoke)],[f91,new E8(this.invoke)],[b91,new E8(this.invoke)]]),child:K}),W=new B6({children:[new f0({decoration:{color:z1.default()},child:new _1({text:new l(">",new J1({color:Y.foreground}))})}),new c6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Q0({height:10,child:new D4({child:new _1({text:new l(L,new J1({color:Y.foreground}))})})})}else if(Z.length===0&&this.widget.props.emptyStateText)H=new c6({child:new D4({child:new _1({text:new l(this.widget.props.emptyStateText,new J1({color:Y.foreground,dim:!0}))})})});else{let L=Z.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?z1.yellow:void 0,x=I?z1.black:Y.foreground;R=new f0({decoration:k?{color:k}:void 0,padding:W0.symmetric(2,0),child:new _1({text:new l(this.widget.props.getLabel(A),new J1({color:x,dim:P}))})})}return new VQ6(new F8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new x0({children:L,crossAxisAlignment:"start"})}let z=new c6({child:new F8({onScroll:this.handleScroll,opaque:!1,child:new q5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l(this.widget.props.title,new J1({color:z1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Q0({height:1}),z),this.controller.text!==""){let L=Z.length>0?Z[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new f0({padding:W0.vertical(1),child:new D4({child:A})}));else U.push(new Q0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new f0({decoration:{border:X,color:z1.default()},padding:W0.symmetric(1,0),child:new x0({children:U})})}}function WQ6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class _y1 extends x6{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>WQ6(X.pubDate).length));return new v2({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=$6.of(K),{colors:W}=q,H=G?z1.yellow:void 0,z=G?z1.black:W.foreground,U=z1.index(8),D=(M,L)=>new Q0({width:L,child:B6.end([new _1({text:new l(M,new J1({color:U}))})])});return new f0({decoration:H?{color:H}:void 0,padding:W0.symmetric(2,0),child:new B6({children:[new c6({child:new _1({text:new l(X.title,new J1({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),D(WQ6(X.pubDate),Y)]})})}})}}class ky1 extends p0{createState(){return new HQ6}}class HQ6 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 l("●",new J1({color:this.isGreen?z1.green:z1.index(8),bold:!0})),maxLines:1})}}function QU8(J){let Q=new Map,Y=new Map,Z=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){Z.set(V.id,K.type);let q=K.threadID,W=Y.get(q)||[];W.push(V),Y.set(q,W)}else X.push(V)}return XX.flatten(X,(V)=>Y.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Z.get(V.item.id)}))}function yy1(J,Q,Y){return new _1({text:new l(`${J}${Q}`,new J1({color:Y})),maxLines:1})}function YU8(J,Q,Y,Z){return[yy1("+",J,Z.success),_5.horizontal(1),yy1("~",Q,Z.warning),_5.horizontal(1),yy1("-",Y,Z.destructive)]}class m91 extends x6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((z)=>z.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((z)=>z.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],Z=new Set(Y),X=this.props.currentThreadID,G=[...Q].sort((z,U)=>{if(X){if(z.id===X)return-1;if(U.id===X)return 1}let D=Y.indexOf(z.id),M=Y.indexOf(U.id);if(D!==-1&&M!==-1)return D-M;if(D!==-1)return-1;if(M!==-1)return 1;return 0}),V=QU8(G),K=Math.max(0,...V.map((z)=>z.description.timeAgo.length)),q=$6.of(J),W=new q6({padding:W0.symmetric(0,1),child:new D4({child:new _1({text:new l("",new J1({color:q.colors.foreground,dim:!0}),[new l("Ctrl+T",new J1({color:z1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new J1({color:q.colors.foreground,dim:!0}))])})})});return new v2({items:V,getLabel:(z)=>z.title,onAccept:(z)=>this.props.onSelect?.(z.id),onDismiss:this.props.onDismiss,onSelectionChange:(z)=>{if(this.props.previewController){if(z)this.props.previewController.select(z.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:200,footer:this.props.isLoading?void 0:W,renderItem:(z,U,D,M)=>{let L=$6.of(M),{colors:A}=L,E=U?z1.yellow:void 0,I=U?z1.black:A.foreground,P=z1.index(8),R=(s,c)=>new Q0({width:c,child:B6.end([new _1({text:new l(s,new J1({color:P}))})])}),k=this.props.threadViewStates[z.id],x=[],h=z.relationshipType==="handoff",b=new y81;if(z.depth>0){let s=[],c=z.ancestorsAreLast.slice(1);for(let B1 of c)s.push(new l(b.getAncestorPrefix(B1),new J1({color:b.connectorColor,dim:b.connectorDim})));let t=z.isLast?b.elbow:b.tee,W1=b.getConnectorText(t);s.push(new l(W1,new J1({color:b.connectorColor,dim:b.connectorDim}))),x.push(new _1({text:new l("",void 0,s)}))}let u=[],m=X===z.id?new l("(current) ",new J1({color:z1.green})):Z.has(z.id)?new l("(visited) ",new J1({color:A.foreground,dim:!0})):null;if(m)u.push(new _1({text:m}));if(k){if(k.state==="active"&&(k.interactionState==="tool-running"||k.inferenceState==="running"))u.push(new ky1),u.push(new Q0({width:1}))}let a=z.title;if(z.relationshipType==="fork"){let s=a.match(/^Forked\((\d+)\): /);if(s)a=a.slice(s[0].length);else while(a.startsWith("Forked: "))a=a.slice(8);u.push(new _1({text:new l("[fork] ",new J1({color:z1.blue}))}))}else if(h)u.push(new _1({text:new l("[handoff] ",new J1({color:z1.index(208)}))}));if(u.push(new c6({child:new _1({text:new l(a,new J1({color:I})),overflow:"ellipsis",maxLines:1})})),u.push(new Q0({width:2})),z.diffStats&&(z.diffStats.added>0||z.diffStats.changed>0||z.diffStats.deleted>0)){let s=U?{success:P,warning:P,destructive:P}:A;u.push(...YU8(z.diffStats.added,z.diffStats.changed,z.diffStats.deleted,s)),u.push(new Q0({width:2}))}return u.push(R(z.description.timeAgo,K)),new f0({decoration:E?{color:E}:void 0,padding:W0.symmetric(2,0),child:new B6({children:[...x,...u]})})}})}}function zQ6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class xy1 extends x6{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()),Y=Math.max(0,...Q.map((X)=>zQ6(X.pubDate).length));return new v2({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?z1.yellow:void 0,z=G?z1.black:W.foreground,U=z1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new Q0({width:A,child:B6.end([new _1({text:new l(L,new J1({color:U}))})])});return new f0({decoration:H?{color:H}:void 0,padding:W0.symmetric(2,0),child:new B6({children:[new c6({child:new _1({text:new l(X.title,new J1({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),new _1({text:new l(D,new J1({color:U})),maxLines:1}),new Q0({width:2}),M(zQ6(X.pubDate),Y)]})})}})}}class vy1 extends x6{props;constructor(J){super();this.props=J}build(){return new D4({child:new _1({text:new l("",void 0,[new l(`Forked to new thread:
4520
+ ... (output truncated at ${Fz} 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 ${Y}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 nF8(J,Q){let{filePath:Y,interpreter:Z,extension:X}=J;if(process.platform==="win32")return oF8(Y,Z?[...Z]:null,X,Q);else return aF8(Y,Z?[...Z]:null,X,Q)}function aF8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];else return[J,Z]}function oF8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Z]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Z]];case".exe":return[J,Z];default:return[J,Z]}}U0();cX();P7();hW();_Y();gG();eW();iK();D8();Sb();I7();f_();a0();var SQ6=K6(pM(),1);import{writeFile as RQ6}from"fs/promises";import CQ6 from"path";U0();_Y();class Sy1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1765944507-gbb0819"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await fo(Q,this.configService)}catch(Q){y.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 UO extends p0{props;constructor(J){super();this.props=J}createState(){return new YQ6}}class YQ6 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class ZQ6 extends u0{controller=new aY;focusNode=new V8({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:Y,app:Z}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=q4.all(new X4(Y.foreground,1,"solid")),q=new Kz({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:Y.foreground,border:null},maxLines:1}),W=new B6({children:[new f0({decoration:{color:z1.default()},child:new _1({text:new l(">",new J1({color:Y.foreground}))})}),new c6({child:q})]}),H=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new J1({color:Y.foreground})),new l(this.widget.props.commandName,new J1({color:z1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new l("Enter",new J1({color:Z.keybind}))),z.push(new l(" to submit, ",new J1({color:Y.foreground,dim:!0})));z.push(new l("Esc",new J1({color:Z.keybind}))),z.push(new l(" to cancel",new J1({color:Y.foreground,dim:!0})));let U=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l("",void 0,z)})});return new f0({decoration:{border:K,color:z1.default()},padding:W0.all(1),child:new x0({children:[H,new Q0({height:1}),W,new _5,U]})})}}class gg extends p0{props;constructor(J){super();this.props=J}createState(){return new ZQ6}}eW();class XQ6 extends u0{controller=new aY;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new V8({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>=eF)return!1;let Q=UC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=$6.of(J),{colors:Y,app:Z}=Q,G=E4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new FO({controller:this.controller,triggers:[new uq],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:C8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new X8({focusNode:this.focusNode,child:K}),W=new f0({constraints:new N6({maxHeight:V}),padding:W0.symmetric(1,0),child:q}),H=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new J1({color:Y.foreground})),new l(this.widget.props.commandName,new J1({color:z1.yellow,bold:!0}))])})}),z=new f0({padding:W0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new J1({color:Z.keybind})),new l(" again to clear input",new J1({color:Y.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new J1({color:Y.foreground,dim:!0})),new l("Enter",new J1({color:Z.keybind})),new l(" to submit, ",new J1({color:Y.foreground,dim:!0})),new l("Esc",new J1({color:Z.keybind})),new l(" to clear",new J1({color:Y.foreground,dim:!0}))])})}),U=[H,new Q0({height:1}),new c6({child:W}),new Q0({height:1}),z];return new f0({decoration:{border:q4.all(new X4(Y.foreground,1,"solid")),color:z1.default()},padding:W0.all(1),child:new x0({children:U})})}}class vC extends p0{props;constructor(J){super();this.props=J}createState(){return new XQ6}}import{isDeepStrictEqual as eF8}from"node:util";var rF8=/[\\/_ +.#"@[({&]/,sF8=/[\\/_ +.#"@[({&]/g,tF8=/[\s-]/,$Q6=/[\s-]/g;function h91(J,Q,Y,Z,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=Z.charAt(G),W=Y.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=h91(J,Q,Y,Z,W+1,G+1,V),z>H){if(W===X)z*=1;else if(tF8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match($Q6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(rF8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(sF8),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&&(Y.charAt(W-1)===Z.charAt(G+1)||Z.charAt(G+1)===Z.charAt(G)&&Y.charAt(W-1)!==Z.charAt(G))){if(U=h91(J,Q,Y,Z,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(q,W+1)}return V[K]=H,H}function v91(J){return J.toLowerCase().replace($Q6," ")}function GQ6(J,Q){let Y=h91(J,Q,v91(J),v91(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=h91(J,K,v91(J),v91(K),0,0,{});if(q===0)return Y;X+=q,G+=K.length}let V=X/Z.length*0.95;return Math.max(Y,V)}return Y}class hC{}class fC{}class f91{}class b91{}class VQ6 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new KQ6}}class KQ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function JU8(J,Q){if(J==="")return{matches:!0,score:1};let Y=GQ6(Q,J);return{matches:Y>0.15,score:Y}}class v2 extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new qQ6}}class qQ6 extends u0{controller=new aY;focusNode;scrollController=new k5;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new V8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.cachedFiltered;this.widget.props.onSelectionChange?.(Q[0]??null)}),this.recomputeFilteredItems();let J=this.cachedFiltered;this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!eF8(J.props.items,this.widget.props.items)){this.recomputeFilteredItems(),this.ensureSelectedItemVisible();let Q=this.cachedFiltered;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 hC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof fC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof f91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof b91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Y=Q.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...JU8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,X)=>this.widget.props.sortItems(Z,X,J):(Z,X)=>X.score-Z.score).map((Z)=>Z.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Q)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,Z=Q.size.height;P81(J,{top:Y,bottom:Z},{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(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let Z=Y[J],X=Z?this.widget.props.isItemDisabled?.(Z)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!X){if(Z)this.widget.props.onAccept(Z)}}};build(J){let Q=$6.of(J),{colors:Y}=Q,Z=this.getFilteredItems(),X=q4.all(new X4(Y.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new Kz({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Y.foreground,border:null},maxLines:1}),K=new ZX({shortcuts:new Map([[new $4("ArrowDown"),new hC],[new $4("ArrowUp"),new fC],[new $4("Tab"),new hC],[new $4("Tab",{shift:!0}),new fC],[new $4("n",{ctrl:!0}),new hC],[new $4("p",{ctrl:!0}),new fC],[new $4("Enter"),new f91],[new $4("Escape"),new b91]]),focusNode:this.focusNode,child:V}),q=new UJ({actions:new Map([[hC,new E8(this.invoke)],[fC,new E8(this.invoke)],[f91,new E8(this.invoke)],[b91,new E8(this.invoke)]]),child:K}),W=new B6({children:[new f0({decoration:{color:z1.default()},child:new _1({text:new l(">",new J1({color:Y.foreground}))})}),new c6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Q0({height:10,child:new D4({child:new _1({text:new l(L,new J1({color:Y.foreground}))})})})}else if(Z.length===0&&this.widget.props.emptyStateText)H=new c6({child:new D4({child:new _1({text:new l(this.widget.props.emptyStateText,new J1({color:Y.foreground,dim:!0}))})})});else{let L=Z.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?z1.yellow:void 0,x=I?z1.black:Y.foreground;R=new f0({decoration:k?{color:k}:void 0,padding:W0.symmetric(2,0),child:new _1({text:new l(this.widget.props.getLabel(A),new J1({color:x,dim:P}))})})}return new VQ6(new F8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:R}),(k)=>{this.itemContexts[E]=k})});H=new x0({children:L,crossAxisAlignment:"start"})}let z=new c6({child:new F8({onScroll:this.handleScroll,opaque:!1,child:new q5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l(this.widget.props.title,new J1({color:z1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Q0({height:1}),z),this.controller.text!==""){let L=Z.length>0?Z[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new f0({padding:W0.vertical(1),child:new D4({child:A})}));else U.push(new Q0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new f0({decoration:{border:X,color:z1.default()},padding:W0.symmetric(1,0),child:new x0({children:U})})}}function WQ6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class _y1 extends x6{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>WQ6(X.pubDate).length));return new v2({items:Q,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,G,V,K)=>{let q=$6.of(K),{colors:W}=q,H=G?z1.yellow:void 0,z=G?z1.black:W.foreground,U=z1.index(8),D=(M,L)=>new Q0({width:L,child:B6.end([new _1({text:new l(M,new J1({color:U}))})])});return new f0({decoration:H?{color:H}:void 0,padding:W0.symmetric(2,0),child:new B6({children:[new c6({child:new _1({text:new l(X.title,new J1({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),D(WQ6(X.pubDate),Y)]})})}})}}class ky1 extends p0{createState(){return new HQ6}}class HQ6 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 l("●",new J1({color:this.isGreen?z1.green:z1.index(8),bold:!0})),maxLines:1})}}function QU8(J){let Q=new Map,Y=new Map,Z=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){Z.set(V.id,K.type);let q=K.threadID,W=Y.get(q)||[];W.push(V),Y.set(q,W)}else X.push(V)}return XX.flatten(X,(V)=>Y.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Z.get(V.item.id)}))}function yy1(J,Q,Y){return new _1({text:new l(`${J}${Q}`,new J1({color:Y})),maxLines:1})}function YU8(J,Q,Y,Z){return[yy1("+",J,Z.success),_5.horizontal(1),yy1("~",Q,Z.warning),_5.horizontal(1),yy1("-",Y,Z.destructive)]}class m91 extends x6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((z)=>z.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((z)=>z.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],Z=new Set(Y),X=this.props.currentThreadID,G=[...Q].sort((z,U)=>{if(X){if(z.id===X)return-1;if(U.id===X)return 1}let D=Y.indexOf(z.id),M=Y.indexOf(U.id);if(D!==-1&&M!==-1)return D-M;if(D!==-1)return-1;if(M!==-1)return 1;return 0}),V=QU8(G),K=Math.max(0,...V.map((z)=>z.description.timeAgo.length)),q=$6.of(J),W=new q6({padding:W0.symmetric(0,1),child:new D4({child:new _1({text:new l("",new J1({color:q.colors.foreground,dim:!0}),[new l("Ctrl+T",new J1({color:z1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new J1({color:q.colors.foreground,dim:!0}))])})})});return new v2({items:V,getLabel:(z)=>z.title,onAccept:(z)=>this.props.onSelect?.(z.id),onDismiss:this.props.onDismiss,onSelectionChange:(z)=>{if(this.props.previewController){if(z)this.props.previewController.select(z.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:200,footer:this.props.isLoading?void 0:W,renderItem:(z,U,D,M)=>{let L=$6.of(M),{colors:A}=L,E=U?z1.yellow:void 0,I=U?z1.black:A.foreground,P=z1.index(8),R=(s,c)=>new Q0({width:c,child:B6.end([new _1({text:new l(s,new J1({color:P}))})])}),k=this.props.threadViewStates[z.id],x=[],h=z.relationshipType==="handoff",b=new y81;if(z.depth>0){let s=[],c=z.ancestorsAreLast.slice(1);for(let B1 of c)s.push(new l(b.getAncestorPrefix(B1),new J1({color:b.connectorColor,dim:b.connectorDim})));let t=z.isLast?b.elbow:b.tee,W1=b.getConnectorText(t);s.push(new l(W1,new J1({color:b.connectorColor,dim:b.connectorDim}))),x.push(new _1({text:new l("",void 0,s)}))}let u=[],m=X===z.id?new l("(current) ",new J1({color:z1.green})):Z.has(z.id)?new l("(visited) ",new J1({color:A.foreground,dim:!0})):null;if(m)u.push(new _1({text:m}));if(k){if(k.state==="active"&&(k.interactionState==="tool-running"||k.inferenceState==="running"))u.push(new ky1),u.push(new Q0({width:1}))}let a=z.title;if(z.relationshipType==="fork"){let s=a.match(/^Forked\((\d+)\): /);if(s)a=a.slice(s[0].length);else while(a.startsWith("Forked: "))a=a.slice(8);u.push(new _1({text:new l("[fork] ",new J1({color:z1.blue}))}))}else if(h)u.push(new _1({text:new l("[handoff] ",new J1({color:z1.index(208)}))}));if(u.push(new c6({child:new _1({text:new l(a,new J1({color:I})),overflow:"ellipsis",maxLines:1})})),u.push(new Q0({width:2})),z.diffStats&&(z.diffStats.added>0||z.diffStats.changed>0||z.diffStats.deleted>0)){let s=U?{success:P,warning:P,destructive:P}:A;u.push(...YU8(z.diffStats.added,z.diffStats.changed,z.diffStats.deleted,s)),u.push(new Q0({width:2}))}return u.push(R(z.description.timeAgo,K)),new f0({decoration:E?{color:E}:void 0,padding:W0.symmetric(2,0),child:new B6({children:[...x,...u]})})}})}}function zQ6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class xy1 extends x6{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()),Y=Math.max(0,...Q.map((X)=>zQ6(X.pubDate).length));return new v2({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?z1.yellow:void 0,z=G?z1.black:W.foreground,U=z1.index(8),D=X.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new Q0({width:A,child:B6.end([new _1({text:new l(L,new J1({color:U}))})])});return new f0({decoration:H?{color:H}:void 0,padding:W0.symmetric(2,0),child:new B6({children:[new c6({child:new _1({text:new l(X.title,new J1({color:z})),overflow:"ellipsis",maxLines:1})}),new Q0({width:2}),new _1({text:new l(D,new J1({color:U})),maxLines:1}),new Q0({width:2}),M(zQ6(X.pubDate),Y)]})})}})}}class vy1 extends x6{props;constructor(J){super();this.props=J}build(){return new D4({child:new _1({text:new l("",void 0,[new l(`Forked to new thread:
4521
4521
 
4522
4522
  `,new J1({color:z1.white,dim:!0})),new l(`"${this.props.newThreadTitle||"Untitled"}"`,new J1({color:z1.white}))]),textAlign:"center"})})}}U0();class FQ6 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){y.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){y.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&&J.length>0}getAvailableLabels(){let J=this.widget.props.currentLabels||[];return this.labels.filter((Q)=>!J.includes(Q.name))}shouldShowCreateMarker(J){if(J.length===0||this.isLoading)return!1;let Q=J.trim().toLowerCase();if(!this.isValidLabelName(Q))return!1;let Y=this.widget.props.currentLabels||[],Z=this.labels.some((G)=>G.name===Q),X=Y.includes(Q);return!Z&&!X}build(J){let Q=$6.of(J),{colors:Y}=Q,Z=this.currentQuery.trim().toLowerCase(),X=Z.length>0?this.getValidationError(Z):null,G=this.getAvailableLabels(),K=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...G];return new v2({title:"Add Label",items:K,getLabel:(q)=>{if("__isCreateMarker"in q)return this.currentQuery.trim().toLowerCase();return q.name},onAccept:(q)=>{if("__isCreateMarker"in q)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(q.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:X||"Type to create a new label",renderItem:(q,W,H,z)=>{let U=W?z1.yellow:void 0,D=W?z1.black:Y.foreground;if("__isCreateMarker"in q&&q.__isCreateMarker){let L=this.currentQuery.trim().toLowerCase();return new f0({decoration:U?{color:U}:void 0,padding:W0.symmetric(2,0),child:new _1({text:new l("",void 0,[new l("Create new label: ",new J1({color:D})),new l(L,new J1({color:D,bold:!0}))])})})}return new f0({decoration:U?{color:U}:void 0,padding:W0.symmetric(2,0),child:new _1({text:new l(q.name,new J1({color:D}))})})},filterItem:(q,W)=>{if(this.currentQuery!==W)this.currentQuery=W,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in q&&q.__isCreateMarker)return this.shouldShowCreateMarker(W);let z=W.trim().toLowerCase();return z.length===0||q.name.includes(z)},sortItems:(q,W,H)=>{let z="__isCreateMarker"in q.item&&q.item.__isCreateMarker,U="__isCreateMarker"in W.item&&W.item.__isCreateMarker;if(z&&!U)return-1;if(!z&&U)return 1;return W.score-q.score}})}}class hy1 extends p0{props;constructor(J){super();this.props=J}createState(){return new FQ6}}class IV extends p0{props;constructor(J){super();this.props=J}createState(){return new UQ6}}class UQ6 extends u0{_spinner=new GX;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:Y}=Q,Z=q4.all(new X4(Y.foreground,1,"solid")),X=this._spinner.toBraille(),G=new _1({textAlign:"center",text:new l("",void 0,[new l(X,new J1({color:z1.yellow})),new l(" ",void 0),new l(this.widget.props.message,new J1({color:Y.foreground}))])}),K=[new c6({child:new x0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[G]})})];if(this.widget.props.onAbort)K.push(new Q0({height:2,child:new f0({padding:W0.symmetric(2,0),child:new _1({text:new l("",new J1({dim:!0}),[new l("Press ",new J1({color:Y.foreground})),new l("Esc",new J1({color:Y.info})),new l(" to cancel",new J1({color:Y.foreground}))])})})}));let q=new f0({decoration:new L8(z1.default(),Z),child:new Q0({width:60,height:7,child:new x0({mainAxisAlignment:"start",children:K})})});if(this.widget.props.onAbort)return new X8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:q});return q}}class PV extends p0{props;constructor(J){super();this.props=J}createState(){return new NQ6}}class NQ6 extends u0{scrollController=new k5;scrollAreaKey=new lY("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(J){return J instanceof OV}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let Y=Q.size;if(typeof Y.height==="number"&&Y.height>0)return this.viewportHeight=Y.height,Y.height}return this.viewportHeight}build(J){let Q=$6.of(J),Y=this.widget.props.message,Z=(()=>{if(this.isWidgetMessage(Y))return{title:Y.title,type:Y.type};if(Y instanceof Error&&Y.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Y.message};if(Y instanceof Error&&Y.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Y.message};let H=j81(Y);return{title:H.title,type:H.type,description:H.description}})(),X=Z.type==="error"?z1.red:z1.yellow,G=q4.all(new X4(z1.default(),1,"solid")),V=new f0({padding:W0.symmetric(1,0),child:new _1({text:new l(Z.title,new J1({color:X,bold:!0}))})}),K=this.isWidgetMessage(Y)?Y.widget:new _1({text:new l(Z.description,new J1({color:z1.default()})),selectable:!0}),q=new c6({child:new $z({child:new f0({padding:W0.symmetric(1,0),child:new B6({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new c6({child:new q5({controller:this.scrollController,autofocus:!0,child:K})}),new MJ({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let H=this.scrollController.maxScrollExtent,z=this.scrollController.offset,U=this.getViewportHeight(),D=H+U;return{totalContentHeight:Math.max(D,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(z,0)}}})]})})})}),W=new f0({padding:W0.symmetric(1,0),child:new _1({text:this.widget.props.onRetry?new l("",void 0,[new l("Press ",new J1({color:z1.default(),dim:!0})),new l("R",new J1({color:z1.yellow})),new l(" to retry, ",new J1({color:z1.default(),dim:!0})),new l("Esc",new J1({color:z1.yellow})),new l(" to cancel",new J1({color:z1.default(),dim:!0}))]):new l("Press any key to close",new J1({color:z1.default(),dim:!0,italic:!0}))})});return new X8({onKey:(H)=>{if(this.widget.props.onRetry&&H.key==="r")return this.widget.props.onRetry(),"handled";if(H.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new f0({decoration:{border:G,color:z1.default()},padding:W0.all(1),child:new x0({mainAxisAlignment:"center",children:[V,new Q0({height:1}),q,W]})})})}}class fy1 extends x6{build(){return new D4({child:new _1({text:new l("",void 0,[new l(`✓ Thread Shared
4523
4523
 
@@ -4603,7 +4603,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
4603
4603
  `)?`${K}...`:X,W=new J1({color:z1.index(8)}),H=[new l(q,W)];if(V>0){let z=new J1({color:Y.success});for(let U=1;U<=V;U++)H.push(new l(" ")),H.push(new l(`[${U}]`,z))}return new q6({padding:W0.only({bottom:0}),child:new B6({crossAxisAlignment:"start",children:[new q6({padding:W0.only({right:1}),child:new _1({text:new l("•",new J1({color:z1.index(8)}))})}),new c6({child:new _1({text:new l("",void 0,H)})})]})})}}class Rx1 extends p0{createState(){return new jY6}}class jY6 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 J1({color:z1.red}),Y=new J1({color:this._visible?z1.red:z1.transparent()});return new B6({children:[new _1({text:new l("⏺",Y)}),new Q0({width:1}),new _1({text:new l("Replay",Q)})]})}}class Cx1 extends x6{entry;width;constructor({key:J,entry:Q,width:Y}){super({key:J});this.entry=Q,this.width=Y}build(J){let Y=$6.of(J).colors.mutedForeground,Z=this.entry,X=Z.authors[0]?.name||"Community";if(X.includes("@"))X=X.split("@")[0]??X;let G=" · ",V=50,K=this.truncateToWidth(Z.title,V),q=`${G}${K}`,W=Math.max(1,this.width-q.length-2),H=Z.description.replace(/\s+/g," ").trim(),z=`@${X}: ${H}`,U=this.truncateToWidth(z,W),D=new _1({text:new l(U,new J1({color:Y,dim:!0}))}),M=new _1({text:new l(q,new J1({color:Y,dim:!0}))});return new F8({onClick:()=>x2(J,Z.link),cursor:"pointer",child:new Q0({width:this.width,height:1,child:new q6({padding:W0.horizontal(1),child:new B6({children:[new c6({child:new BC(new Q0({width:W,height:1,child:D}))}),M]})})})})}truncateToWidth(J,Q){if(J.length<=Q)return J;return J.slice(0,Q-1)+"…"}}a0();function AN8(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/3600000),X=Math.floor(Z/24),G=Math.floor(X/7),V=Math.floor(X/30);if(Z<1)return"Just now";if(Z<24)return`${Z}h ago`;if(X<7)return`${X}d ago`;if(G<=4)return`${G}w ago`;return`${V}mo ago`}class jx1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Y)=>{let Z=this.threadHistoryService.observeThreadList().subscribe((X)=>{Z.unsubscribe(),Y(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((Z)=>{if(!Q.trim())return!0;let X=Z.title?.toLowerCase()||"untitled",G=Z.id.toLowerCase(),V=Q.toLowerCase();return X.includes(V)||G.includes(V)}).map((Z)=>{let X=new Date(Z.userLastInteractedAt),G=AN8(X),V=Z.id.slice(-8),K=Z.env?.initial.trees?.[0]?.uri;return{id:Z.id,title:Z.title||"Untitled",updatedAt:new Date(Z.userLastInteractedAt).toISOString(),description:{timeAgo:G,title:Z.title||"Untitled",shortThreadID:V},diffStats:Z.summaryStats?.diffStats,workspaceURI:K,parentRelationships:Z.parentRelationships,agentMode:Z.agentMode}})}}U0();D8();class Sx1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new k5;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){y.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){y.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(XM()).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 SY6(J,Q){switch(J){case"update-available":return[new l("A newer Amp is available. Run ",new J1({color:Q.foreground,dim:!0})),new l("amp update",new J1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new l("Update complete, run ",new J1({color:Q.foreground,dim:!0})),new l("amp update",new J1({color:Q.warning})),new l(" to see warnings",new J1({color:Q.foreground,dim:!0}))];case"update-error":return[new l("Update failed, run ",new J1({color:Q.foreground,dim:!0})),new l("amp update",new J1({color:Q.warning})),new l(" to see warnings",new J1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function PN8(J){return new Promise((Q)=>{wN8("git",["branch","--show-current"],{cwd:J},(Y,Z)=>{if(Y){Q(null);return}let X=Z.trim();Q(X||null)})})}class vY6 extends p0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new W51}}class W51 extends u0{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;adReadinessTimeout=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 Sx1;previewThread=null;todoScrollController=(()=>{let J=new k5;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new V8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new V8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;imagePreviewIndex=null;adActionModal=null;threadFeedReader=null;currentThreadFeedEntry=null;threadFeedEntries=[];threadFeedSubscription=null;threadFeedRotationTimer=null;threadFeedHidden=!1;threadFeedTickerQueue=[];hasSubmittedFirstMessage=!1;currentUserInfo=null;newsFeedReader=null;newsFeedEntries=[];newsFeedSubscription=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;pendingMCPServers=[];mcpTrustSubscription=null;pendingOAuthRequest=null;mcpServers=[];mcpServersSubscription=null;agentModeController=null;freeTierStatus={canUseAmpFree:!1};agentModePulseSeq=0;agentModeSlideProgress=null;agentModeSlideTimer=null;updateState="hidden";updateServiceSubscription=null;toastController=new Y_1;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"];userDisplayBalanceInfo=null;balanceInfoSubscription=null;async initThreadFeed(){let J=await F6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Y=Q.includes("localhost")||Q.includes("127.0.0.1");try{let 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(!Y&&K.team?.id!==W)return}else return}catch(V){y.debug("Failed to fetch user info for thread feed filtering",V);return}let Z="/threads.rss",X=async(V,K)=>{let q=V instanceof Request?V.url:V.toString();return u7(q,K,this.widget.dependencies.configService)},G=mP1();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 MS1(G,X,{url:Z}),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){y.error("Thread feed: error in next handler",K)}},error:(V)=>{y.error("Thread feed error:",V)}}),this.resetThreadFeedRotation()}filterEntries(J){if(!this.currentUserInfo)return J;let{username:Q,displayName:Y}=this.currentUserInfo;return J.filter((Z)=>{return!Z.authors.some((X)=>{let G=X.name;if(!G)return!1;return Q&&G===Q||Y&&G===Y||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}async initNewsFeed(){let J=async(Y)=>{return u7(Y,void 0,this.widget.dependencies.configService)},Q=mP1();this.newsFeedReader=new DS1(Q,J,"/news.rss"),this.newsFeedSubscription=this.newsFeedReader.stream().subscribe({next:(Y)=>{if(Y.length>0)this.setState(()=>{this.newsFeedEntries=[...Y,...this.newsFeedEntries]})},error:(Y)=>{y.error("News feed error:",Y)}})}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1,this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Y,baseWpm:Z}=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"&&Y){let W=V.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
4604
4604
  `);if(W)await this.replayTypeMessage(W,Z)}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),C8.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Y=J.split(/(?<=\s)/),Z=60000/Q;for(let X of Y){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=Z/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 Y=J.items.filter((G)=>G.type==="toolResult").filter((G)=>G.toolResult.run.status==="in-progress"||G.toolResult.run.status==="queued"),Z=J.subagentActiveTools.filter((G)=>G.toolRun.status==="in-progress"||G.toolRun.status==="queued");return[...Y,...Z].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 l(this.submitDisabledHint,new J1({color:J.foreground,dim:!0}));if(this.isExiting)return new l("Exiting...",new J1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new l("",void 0,[new l("Ctrl+C",new J1({color:Q.keybind})),new l(" again to exit",new J1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new l("",void 0,[new l("Esc",new J1({color:Q.keybind})),new l(" again to clear input",new J1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new l("",void 0,[new l("Escape",new J1({color:Q.keybind})),new l(" to close help",new J1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let Z=this.getEffectiveAgentMode(),X=xx1(Z);return new l("",void 0,[new l("Images aren't supported in ",new J1({color:J.warning,dim:!1})),new l(Z,new J1({color:X})),new l(" mode.",new J1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new l("",void 0,[new l("Esc",new J1({color:Q.keybind})),new l(" again to cancel",new J1({color:J.foreground,dim:!0}))]);return new l("",void 0,[new l("Esc",new J1({color:Q.keybind})),new l(" to cancel",new J1({color:J.foreground,dim:!0}))])}if(this.statusMessage)return new l(this.statusMessage,new J1({color:J.foreground,dim:!0}));let Y=SY6(this.updateState,J);if(Y)return new l("",void 0,Y);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Y}=this.widget.dependencies;if(!Q.mainThread?.id)return;let X=Q.mainThread?.messages.findIndex((G)=>G===J);if(X===void 0||X===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),await Y.handle({type:"thread:truncate",fromIndex:X}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(G){y.error("Failed to edit message:",G)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Y,threadSyncService:Z}=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 b3.getOrCreateForThread(Y,X),K=await LR(V,Z,G-1);await this.switchToExistingThread(K)}catch(V){y.error("Failed to fork thread:",V),this.showErrorMessage(`Failed to fork thread: ${V}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Y,worker:Z}=this.widget.dependencies,X=Y.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 Z.cancel(),this.widget.dependencies.history.add(Q);let V=cN(Q);if(V)await Z.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){y.error(`Cannot edit message: This thread uses ${X.agentMode} mode. To change mode, create a new thread.`);return}await Z.handle({type:"user:message",message:q,index:G})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(V){y.error("Failed to edit message:",V)}};getAffectedFiles=async(J)=>{let{worker:Q,threadState:Y}=this.widget.dependencies;try{let Z=Y.mainThread;if(!Z)return[];let X=Z.messages.findIndex((V)=>V===J);if(X===-1)return[];return(await Q.getFilesAffectedByTruncation(X)).map(w7)}catch(Z){return y.error("Failed to get affected files:",Z),[]}};textController=new aY;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new k5);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 Z=this.searchElementTreeByKey(J.child,Q);if(Z)return Z}if(J?.children)for(let Z of J.children){let X=this.searchElementTreeByKey(Z,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 Y=process.cwd().replace(process.env.HOME||"","~"),Z=Q?`amp - ${Q} - ${Y}`:"";process.stdout.write(_j1(Z))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new o7("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=cN(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}),S8.instance.addPostFrameCallback(()=>{this.autocompleteFocusNode.requestFocus()})};handleIdeSelection=async(J,Q)=>{if(this.widget.dependencies.ideClient.getSelectedConfig()?.pid===J.pid){this.dismissIdePicker();return}try{await this.connectToSelectedIde(J,Q)}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})}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}),S8.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 ny1(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 ry1(this.widget.dependencies.fuzzyServer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Y}=this.widget.dependencies;if(!Q.mainThread)return null;let Z=b0.file(process.cwd()),X=R6(Z);return{recentThreadIDs:Y,currentThreadID:Q.mainThread.id,context:J,worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:Q.mainThread,ampURL:this.widget.dependencies.ampURL,threadService:this.widget.dependencies.threadService,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,skillService:this.widget.dependencies.skillService,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,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,this.widget.dependencies.worker.fs.fileSystemReader());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 y91("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,filesystem:this.widget.dependencies.worker.fs.fileSystemReader()},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 y.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 Cr({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,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,newsFeedEntries:this.newsFeedEntries,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)},showToast:(G,V="success",K)=>{this.toastController.show(G,V,K)}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new jx1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=TQ6(Q),this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await PN8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Y=Date.now(),Z=`bash-${Y}-${Math.random().toString(36).substring(7)}`,X={cmd:J},G=new AbortController;this.widget.dependencies.worker.invokeBashTool(X,G.signal,Q===dN).subscribe({next:(V)=>{this.setState(()=>{if(this.bashInvocations.find((q)=>q.id===Z))this.bashInvocations=this.bashInvocations.map((q)=>q.id===Z?{...q,toolRun:V}:q);else{let q={id:Z,args:X,toolRun:V,startTime:Y,abortController:G,hidden:Q===dN};this.bashInvocations=[...this.bashInvocations,q]}})},error:()=>this.removeBashInvocation(Z),complete:()=>this.removeBashInvocation(Z)})};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=w96(()=>{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 Y=J!==this.threadCostInfoLastUsageLedgerLength,Z=Q==="idle"&&this.lastInferenceState==="running";if(this.threadCostInfoLastUsageLedgerLength=J,this.lastInferenceState=Q,Y||Z)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=400,Q=16,Y=Q/J;this.agentModeSlideTimer=setInterval(()=>{this.setState(()=>{if(this.agentModeSlideProgress!==null){if(this.agentModeSlideProgress=Math.min(1,this.agentModeSlideProgress+Y),this.agentModeSlideProgress>=1){if(this.agentModeSlideProgress=null,this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null}}})},Q)};handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!Qy(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>=eF)return!1;let Y=UC(J);if(typeof Y==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Y]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Y}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};handleImageClick=(J)=>{this.setState(()=>{this.imagePreviewIndex=J})};handleImagePreviewDismiss=()=>{this.setState(()=>{this.imagePreviewIndex=null})};handleImageRemove=(J)=>{this.setState(()=>{this.imageAttachments=this.imageAttachments.filter((Q,Y)=>Y!==J),this.imagePreviewIndex=null})};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)y.error("Failed to destruct mysterious message",Q.error);else this.setState(()=>{this.mysteriousMessage=null,this.isShowingMysteriousMessageModal=!1})}).catch((Q)=>{y.error("Failed to destruct mysterious message",Q)})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Y,unlink:Z,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 h$(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")y.error("Failed to read temporary file",H)}try{await Z(W),await X(q)}catch(H){y.warn("Failed to clean up temporary file",H)}}catch(q){y.error("Error opening editor:",q)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=cN(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(tZ.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();C8.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),C8.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),C8.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{S8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),F6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y,this.agentModeController=new IS1({initialCliMode:this.widget.dependencies.initialAgentMode,sessionState:this.widget.dependencies.sessionState??null,freeTierStatus:this.freeTierStatus,initialSettings:Y.settings,config$:this.widget.dependencies.configService.config,getThread:()=>this.widget.dependencies.getCurrentWorker()?.thread??this.widget.dependencies.worker.thread}),this.agentModeController.addListener(this.agentModeListener)}),this.updateGitBranch(),this.balanceInfoSubscription=B66(async()=>{let Y=await this.widget.dependencies.internalAPIClient.userDisplayBalanceInfo({},{config:this.widget.dependencies.configService});if(!Y.ok)throw Y.error;return Y.result}).subscribe({next:(Y)=>{this.setState(()=>{this.userDisplayBalanceInfo=Y})},error:(Y)=>{y.debug("Failed to fetch user balance info",Y)}}),this.scheduleAdSubscriptionWithIdeReadiness();let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=Y})}),Gj1((Y)=>{this.setState(()=>{this.pendingOAuthRequest=Y})}),this.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Y)=>{this.setState(()=>{this.mcpServers=Y})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Y)=>{let Z=this.isIdeReadyForAdContext();if(this.setState(()=>{this.ideStatus=Y}),!Z&&this.isIdeReadyForAdContext()){if(this.adReadinessTimeout)clearTimeout(this.adReadinessTimeout),this.adReadinessTimeout=null;if(!this.adSubscription)this.subscribeToAds()}}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Y)=>{let Z=this.widget.dependencies.getCurrentWorker();if(!Z){y.warn("No active thread worker found to handle IDE message");return}await new Promise((X)=>setTimeout(X,50)),await Z.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}}),y.debug("Message sent from IDE to agent",{message:Y.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Y)=>{this.textController.insertText(Y),y.debug("Appended text to CLI prompt from IDE",{text:Y.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Y)=>{this.setState(()=>{this.connectedClientsStatus=Y})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Y)=>{this.setState(()=>{this.updateState=Y})}),this.mysteriousMessageSubscription=e41(this.widget.dependencies.configService).pipe(B5((Y)=>Y!=="pending"),Q6((Y)=>J81(Y)?Y.mysteriousMessage??null:null),U4((Y,Z)=>Y?.id===Z?.id)).subscribe((Y)=>{this.setState(()=>{if(Y?.id!==this.mysteriousMessage?.id)this.isShowingMysteriousMessageModal=!1;if(this.mysteriousMessage=Y,Y&&!this.mysterySequenceManager)this.mysterySequenceManager=new D81(new Map([[new B81(W51.MYSTERY_SEQUENCE),new Og]])),this.mysteryKeyInterceptorUnsubscribe=C8.instance.addKeyInterceptor((Z)=>{if(!this.mysterySequenceManager)return!1;if(this.isShowingMysteriousMessageModal)return!1;let X=this.mysterySequenceManager.handleKeyEvent(Z);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(!Y)this.mysteryKeyInterceptorUnsubscribe?.(),this.mysteryKeyInterceptorUnsubscribe=null,this.mysterySequenceManager?.dispose(),this.mysterySequenceManager=null,this.mysterySequenceProgress=null})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Y)=>{let Z=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})});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(),this.initNewsFeed()}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:Y}=this.widget.dependencies;this.maybeRefetchThreadCostInfo(Y.mainThread?.usageLedger?.events.length??0,Y.viewState.state==="active"?Y.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.adReadinessTimeout)clearTimeout(this.adReadinessTimeout),this.adReadinessTimeout=null;if(this.adSubscription)this.adSubscription.unsubscribe();if(this.balanceInfoSubscription)this.balanceInfoSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(Gj1(null),this.mcpServersSubscription)this.mcpServersSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.newsFeedSubscription)this.newsFeedSubscription.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(_j1("")),this.shouldUseProgressBar())process.stdout.write(m86())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,Z=[...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(Z.length===0)return null;let X=Z[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(){}static AD_READINESS_TIMEOUT_MS=1000;scheduleAdSubscriptionWithIdeReadiness(){if(this.isIdeReadyForAdContext()){this.subscribeToAds();return}this.adReadinessTimeout=setTimeout(()=>{if(this.adReadinessTimeout=null,!this.adSubscription)this.subscribeToAds()},W51.AD_READINESS_TIMEOUT_MS)}isIdeReadyForAdContext(){let J=this.ideStatus;if(!J||!J.enabled)return!1;return Boolean(J.openFile||J.visibleFiles&&J.visibleFiles.length>0)}subscribeToAds(){if(this.adSubscription)return;this.adSubscription=sj1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let J=this.agentModeController?.getMode();return(J&&z9(J)||this.randomAd===null)&&rj1(this.lastUserInteractionTime)},this.widget.dependencies.codebaseContextService).subscribe({next:(J)=>{if(J){let Q=EN8(16).toString("hex");this.lastAdImpressionId=Q,Promise.resolve().then(() => (q51(),K51)).then(({recordAdEvent:Y})=>{let Z=this.widget.dependencies.worker.thread,X=Z.messages[Z.messages.length-1];Y("viewed",{adId:J.id,advertiserId:J.advertiserId,threadId:Z.id,messageId:X?.messageId,impressionId:Q,placement:"tui",matchType:J.metadata?.matchType,matchedPatterns:J.metadata?.matchedPatterns,candidateAdPoolCount:J.metadata?.candidateAdPoolCount,clientRegion:J.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=J}),S8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}})}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){y.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){y.error("No tool use block found in confirmation");return}if(J==="allow-all-session")IG("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 y.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 x2(this.context,X);return}if(J==="disable-librarian"){let X=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!X.includes(wK))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,wK],"global")}let Z=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let X={type:"user:tool-input",toolUse:Y.id,value:{accepted:Z}};if(Q.subthreadID)await(await b3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(X);else await this.widget.dependencies.worker.handle(X)}catch(X){y.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 Y=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Y)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Y=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Y.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.agentModeController?.setMode("smart"),this.setState(()=>{this.dismissedEphemeralErrorKey=null}),K41({agentMode:"smart"}),await this.startAndSwitchToNewThread();break}case"handoff":{if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);this.showCommandPalette({type:"normal",commandId:"handoff"});break}}this.setState(()=>{})};handleDisplayMessageDismiss=()=>{this.setState(()=>{this.displayMessage=null})};handleMCPTrustOpenSettings=async()=>{let{mcpTrustHandler:J,settingsStorage:Q}=this.widget.dependencies;await J.deny();try{await h$(Q.getSettingsFilePath())}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${Z}`)}};cancelStreamingMessage=async()=>{await b3.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let Y=J.messages[Q];if(Y?.role==="user"&&!Y.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Y=!0}=Q;if(Y){let Z=this.widget.dependencies.worker.thread.id;if(Z!==J)this.recordNavigation(Z)}try{y.info(`[switchToExistingThread] Switching to thread: ${J}`);let Z=await this.widget.dependencies.switchToThread(J);if(y.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${Z.thread.agentMode}`),this.widget.dependencies.worker=Z,this.widget.dependencies.threadID=Z.thread.id,this.widget.dependencies.switchWorker(Z),y.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),Z.thread.draft)if(y.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof Z.thread.draft==="string")this.textController.insertText(Z.thread.draft);else{let X=Z.thread.draft.filter((K)=>K.type==="text"),G=Z.thread.draft.filter((K)=>K.type==="image"),V=X.map((K)=>K.text).join(`
4605
4605
  `);if(V)this.textController.insertText(V);if(G.length>0)this.setState(()=>{this.imageAttachments=G})}}catch(Z){throw y.error("Failed to switch to thread:",J,Z),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Y=r2(Q.thread)===0,Z=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Y&&Z!==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(Y)this.startAgentModeSlide();if(await Q.handle({type:"user:message",message:{content:X,agentMode:Z}}),Y)K41({agentMode:Z});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),S8.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((Z)=>Z.type==="handoff"&&Z.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();K41({agentMode:Q}).catch((Y)=>{y.warn("Failed to save session state on exit:",Y)}).finally(()=>{C8.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=IN8();if(J===Q)return"~";if(J.startsWith(Q+lg.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(lg.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(lg.sep),"…",Q.slice(-2).join(lg.sep)].join(lg.sep)}build(J){let Q=E4.of(J),Y=$6.of(J),Z=Y.base;this.themeColors=Z;let{colors:X,app:G}=Y;this.themeApp=G;let V=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,K=V.thread.agentMode&&z9(V.thread.agentMode),q=this.widget.dependencies.features.some((Z4)=>Z4.name===tj1.UBI&&Z4.enabled),W=this.widget.dependencies.freeTierStatus.canUseAmpFree&&q,H=(K||W)&&this.randomAd!==null,z=!K&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden,U=Boolean(H),{threadState:D}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let M=this.getCurrentConfirmation(),L=this.widget.dependencies.replayMode,A=Boolean(L),E=D.items,I=D.mainThread||void 0,P=D.subagentToolsByParentID,R=D.todosList;if(A){let Z4={...L.thread,messages:this.replayDisplayedMessages};E=xC(Z4).items,I=Z4,P={};let W4=vF({messages:this.replayDisplayedMessages});R=Array.isArray(W4)?W4:[]}let k=I?.id,x=I,h=A?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),b=(Z4)=>new j91({key:new o7(`preview-message-view-${Z4.id}`),items:xC(Z4).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:Z4,focusNode:new V8({debugLabel:"PreviewFocus"})}),u=this.previewThread,m=u?u.messages.length>2000?new x0({mainAxisSize:"max",children:[new c6({child:new Q0}),new q6({padding:W0.all(2),child:new D4({child:new _1({text:new l("Thread too long for preview",new J1({color:X.mutedForeground,dim:!0}))})})})]}):b(u):h?new k91({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal,userDisplayBalanceInfo:this.userDisplayBalanceInfo}):new j91({key:k?new o7(`message-view-${k}`):void 0,items:E,subagentToolsByParentID:P,controller:k?this.getMessageScrollController(k):new k5,autofocus:!1,onCopy:A?void 0:this._handleTextCopy.bind(this),thread:x,onMessageEditSubmit:A?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:A?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:A?void 0:this.forkMessage,getAffectedFiles:A?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode,completionBuilder:A?void 0:this.getCompletionBuilder()}),a=Math.max(Math.floor(Q.size.height*0.4),12),G1=this.getCurrentEphemeralError(),s=Q.size.width<40,c=D.mainThread?Dn(D.mainThread):void 0,t=M91(J),W1=this.buildBottomWidget(G1,M,X,Y,D,R,a,U,A,c,Q,t),B1=new c81({threadViewState:D.viewState,threadTokenUsage:c,threadID:k??null,thread:D.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,mcpServers:this.mcpServers,isNarrow:s,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!M,showingEphemeralError:Boolean(D.viewState.state==="active"&&D.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandNoun:this.executingCommand?.noun??null,executingCommandVerb:this.executingCommand?.verb??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),r=new x81({bashInvocations:this.bashInvocations}),o=[];if(z&&this.currentThreadFeedEntry)o.push(new Cx1({entry:this.currentThreadFeedEntry,width:Q.size.width}));let i=this.getEffectiveAgentMode(),U1=this.currentShellModeStatus,k1=xx1(i),e=!U1?i.length+1:0,h1=Q.capabilities.animationSupport,T1=h1==="disabled"?0:h1==="slow"?30:60,q0=IK(i)?.uiHints?.fasterAnimation?3:1,S1=T1>0&&this.agentModePulseSeq>0?new f9({children:[W1,new S5({top:0,left:1,right:1,height:1,child:new Ox1({color:k1,trigger:this.agentModePulseSeq,fps:T1,speed:q0,leftOffset:e})})]}):W1;o.push(new c6({child:m}),r);let o1=new f9({children:[new x0({mainAxisSize:"min",children:[H?new Ty1({ad:this.randomAd,onButtonClick:async()=>{let Z4=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (q51(),K51)).then(({recordAdEvent:w9})=>{let e9=this.widget.dependencies.worker.thread,n$=e9.messages[e9.messages.length-1];w9("clicked",{adId:Z4.id,advertiserId:Z4.advertiserId,threadId:e9.id,messageId:n$?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:Z4.metadata?.matchType,matchedPatterns:Z4.metadata?.matchedPatterns,candidateAdPoolCount:Z4.metadata?.candidateAdPoolCount,clientRegion:Z4.metadata?.clientRegion})});if(!await x2(this.context,Z4.shortDestinationUrl)){let e9=C8.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:e9,url:Z4.shortDestinationUrl}})}}}):new Q0({height:0}),new f0({constraints:new N6(0,Q.size.width,0,a),child:S1})]}),U?new S5({top:0,left:0,right:0,child:new bY6({userHeight:this.bottomGridUserHeight,maxHeight:a,onInitializeHeight:(Z4)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(Z4,a)})},onDrag:(Z4)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(Z4.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let W4=Math.floor(Z4.localPosition.y)-this.bottomGridDragStartY,w9=Math.max(4,this.bottomGridDragStartHeight-W4),e9=Math.min(w9,a),n$=Math.floor(e9);if(this.bottomGridUserHeight!==n$)this.setState(()=>{this.bottomGridUserHeight=n$})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new Q0({height:0})]});o.push(o1,new Q0({height:1,child:new q6({padding:W0.horizontal(1),child:B1})}));let F1=new x0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:o}),A1=A&&L?.showIndicator!==!1?new f9({children:[F1,new S5({top:0,left:0,child:new Rx1})]}):F1,O1=new E8(()=>{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((W4)=>{y.error("Failed to mark message as interrupted:",W4)}),this.cancelStreamingMessage().catch((W4)=>{y.error("Failed to cancel streaming message:",W4)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return y.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"}),I1=new E8(()=>{return this.onExitPressed(),"handled"}),C1=new E8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),u1=new E8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),f1=new E8(()=>{return LJ.instance.toggleAll(),"handled"}),a1=new E8(()=>{return this.widget.dependencies.configService.getLatest().then((Z4)=>{IG("internal.showDetailedCosts",!(Z4.settings["internal.showDetailedCosts"]??!1))}),"handled"}),G0=new E8(()=>{return C8.instance.toggleFrameStatsOverlay(),"handled"}),V0=new E8(()=>{return C8.instance.tuiInstance.getScreen().markForRefresh(),S8.instance.requestFrame(),"handled"}),T0=new E8(()=>{return this.toggleAgentMode(),"handled"}),_6=new E8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,e9=w9.mainThread?.id;return e9?this.getMessageScrollController(e9):null})();if(W4){let w9=Math.max(Math.floor(Q.size.height*0.4),10),e9=Q.size.height-w9;W4.animatePageUp(e9,100)}return"handled"}),m6=new E8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,e9=w9.mainThread?.id;return e9?this.getMessageScrollController(e9):null})();if(W4){let w9=Math.max(Math.floor(Q.size.height*0.4),10),e9=Q.size.height-w9;W4.animatePageDown(e9,100)}return"handled"}),v4=new E8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,e9=w9.mainThread?.id;return e9?this.getMessageScrollController(e9):null})();if(W4)W4.animateTo(0,100);return"handled"}),M4=new E8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,e9=w9.mainThread?.id;return e9?this.getMessageScrollController(e9):null})();if(W4)W4.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),O9=new E8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:Z4}=this.widget.dependencies;if(!Z4.mainThread?.messages.some((w9)=>w9.role==="user"||rE(w9)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),w0=new E8((Z4)=>{if(Z4.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),o0=new E8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return R81().then(async(Z4)=>{if(Z4)try{this.handleInsertImage(Z4)}finally{try{let{unlink:W4}=await import("node:fs/promises");await W4(Z4)}catch{}}}),"handled"}),s6=new Map([[$4.ctrl("c"),new Ug],[$4.ctrl("l"),new Lg],[$4.ctrl("o"),new E81],[$4.ctrl("v"),new zg],[$4.alt("s"),new LC],[$4.ctrl("s"),new LC],[$4.alt("p"),new Mg],[$4.ctrl("r"),new Bg],[$4.alt("d"),new Dg],[$4.ctrl("t"),new Ag],[$4.key("PageUp"),new L81],[$4.key("PageDown"),new A81],[$4.key("Home"),new O81],[$4.key("End"),new w81],[$4.key("Escape"),new Fg],[$4.ctrl("p"),new AC("previous")],[$4.ctrl("n"),new AC("next")],[$4.key("Tab"),new wg]]);if(!u3())s6.set($4.key("ArrowUp"),new wg);if(!1)s6.set($4.alt("c"),new Ng);let l8=new E8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),L7=new E8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),v5=new E8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),G7=new Map([[Fg,O1],[Lg,V0],[LC,T0],[E81,l8],[zg,o0],[Ng,C1],[F81,u1],[Bg,f1],[Dg,a1],[Mg,G0],[Ag,L7],[Ug,I1],[L81,_6],[A81,m6],[O81,v4],[w81,M4],[wg,O9],[AC,w0],[Og,v5]]),m8=[A1];if(this.isShowingConsoleOverlay)m8.push(new ey1);if(this.isShowingHelp&&this.paletteConfig)m8.push(new Yx1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)m8.push(new ik1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)m8.push(new Ix1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)m8.push(new Ry1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(Z4)=>{let W4=this.adActionModal.url;if(Z4==="copy")try{await C8.instance.tuiInstance.clipboard.writeText(W4),this.setState(()=>{this.displayMessage=new oY("Link copied to clipboard")})}catch(w9){y.error("Failed to copy to clipboard",{error:w9}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:Z4}=this.widget.dependencies;m8.push(new wx1({servers:this.pendingMCPServers,onAlwaysTrust:Z4.trustAlways.bind(Z4),onTrustOnce:Z4.trustOnce.bind(Z4),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:Z4.deny.bind(Z4)}))}if(this.pendingOAuthRequest)m8.push(new Px1({request:this.pendingOAuthRequest,onDismiss:()=>{this.setState(()=>{this.pendingOAuthRequest=null})}}));if(this.isShowingFileChangesOverlay)m8.push(new B_1({threadData:D}));if(this.isShowingContextDetailOverlay){let Z4=this.threadCostInfo?.costBreakdownURL;m8.push(new Jx1({thread:D.mainThread??void 0,tokenUsage:c??void 0,costInfo:this.threadCostInfo,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})},onOpenCostBreakdown:Z4?()=>{x2(J,Z4)}:void 0}))}if(this.isShowingConfirmationOverlay)m8.push(new sy1({details:this.confirmationOverlayContent}));if(this.imagePreviewIndex!==null&&this.imagePreviewIndex<this.imageAttachments.length){let Z4=this.imageAttachments[this.imagePreviewIndex];if(Z4)m8.push(new D4({child:new Vx1({image:Z4,imageIndex:this.imagePreviewIndex,onDismiss:this.handleImagePreviewDismiss,onRemove:()=>this.handleImageRemove(this.imagePreviewIndex)})}))}let l9=this.getCommandPaletteContext(J);if(l9&&this.isShowingPalette&&this.paletteConfig)m8.push(new D4({child:new oy1({commandContext:l9,mainThread:D.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)m8.push(new Xx1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let Z8=new f9({children:m8});if(this.isShowingJetBrainsInstaller)return new eA({child:new UJ({actions:G7,child:new ZX({shortcuts:s6,debugLabel:"jetbrains-installer-shortcuts",child:new Ax1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Gz({controller:this.toastController,child:new eA({child:new Z_1({controller:this.toastController,child:new UJ({actions:G7,child:new ZX({shortcuts:s6,debugLabel:"main-app-shortcuts",child:Z8})})})})})}buildScrollableTodoList(J,Q,Y){return new hY6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,Z,X,G,V,K,q,W,H,z){if(J)return new Qx1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new ty1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Ex1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let U=k81(Z),D=this.agentModeController?.isInRestrictedFreeMode()??!1,M=new FO({key:this.textFieldKey,controller:this.textController,triggers:q?[]:[new uq],completionBuilder:q?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:q?void 0:this.onTextSubmitted,theme:Y,placeholder:q?"Press Ctrl+C to exit":D?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!D&&!this.isShowingStandalonePalette(),shellPromptRules:U,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:C8.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,onImageClick:this.handleImageClick,previousThreadId:this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let r=this.previousThreadIdForHint;if(r)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${r} `},onDoubleAtTrigger:q?void 0:()=>{let r=this.textController.text,o=this.textController.cursorPosition,U1=r.slice(0,o).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(U1!==-1){let k1=this.textController.text,e=k1.slice(0,U1)+k1.slice(U1+2);this.textController.text=e,this.textController.cursorPosition=U1}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),L=X.mainThread?.queuedMessages??[],A=Array.isArray(G)&&G.length>0,I=Array.isArray(L)&&L.length>0?new Tx1({queuedMessages:L}):void 0,P=A?this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!D,Z):void 0,R=[],k=this.currentShellModeStatus;if(k)R.push({child:new _1({text:new l(k==="hidden"?"shell mode (incognito)":"shell mode",new J1({color:k==="hidden"?Z.app.shellModeHidden:Z.app.shellMode}))}),position:"top-left"});let h=this.connectedClientsStatus&&this.connectedClientsStatus.enabled?this.connectedClientsStatusExpanded?(this.connectedClientsStatus?.clientID?.length??7)+3:3:0,b=this.agentModeController?.getVisibleModes()??[];if(!k&&b.length>1){let r=this.previewThread,o=r?r.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),i=xx1(o),U1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,k1=r??U1.thread,e=r2(k1)>0,h1=this.agentModeSlideProgress!==null,T1,q0,S1=(Z1)=>Math.pow(Z1,4);if(h1){T1="top-left";let A1=H.size.width-o.length-4-h,O1=S1(this.agentModeSlideProgress);q0=Math.floor(O1*A1)}else if(e)T1="top-right",q0=h;else T1="top-left",q0=void 0;let o1=e&&!h1,F1;if(h1){let Z1=S1(this.agentModeSlideProgress??0);F1=new J1({color:i,dim:Z1>0.3})}else if(o1)F1=new J1({color:Y.foreground,dim:!0});else F1=new J1({color:i});if(r)R.push({child:new _1({text:new l(o,F1)}),position:T1,offsetX:q0});else{let Z1=!e&&!h1,A1=new _1({text:new l(o,F1)});R.push({child:Z1?new F8({child:A1,onClick:this.toggleAgentMode,cursor:"pointer"}):A1,position:T1,offsetX:q0})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let r=this.connectedClientsStatus,o=r.mode||"disconnected",i=!!r.errorMessage,U1=r.clientID||"unknown",k1,e;if(i)k1="●",e=z1.red;else if(o==="presence")k1="○",e=z1.yellow;else if(o==="connected"&&r.connected)k1="●",e=z1.green;else k1="○",e=z1.yellow;let h1=this.connectedClientsStatusExpanded?`${U1} ${k1}`:k1;R.push({child:new F8({child:new _1({text:new l(h1,new J1({color:e}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let u=q?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:X.mainThread?.env?.initial.trees?.[0]?.uri,m;if(u)m=b0.parse(u).fsPath;else m=process.cwd();let a=this.toHomeRelative(m),G1=this.shorten(a),s=!q&&this.currentGitBranch?`${G1} (${this.currentGitBranch})`:G1;if(R.push({child:new _1({text:new l(s,new J1({color:Y.foreground,dim:!0}))}),position:"bottom-right"}),this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0&&this.textController.text.trim()==="")R.push({child:new _1({text:new l("",void 0,[new l("press ",new J1({color:Y.foreground,dim:!0})),new l("enter",new J1({color:Z.app.keybind})),new l(" to reference the previous thread",new J1({color:Y.foreground,dim:!0}))])}),position:"bottom-left"});let t=this.previewThread,W1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(r2(W1.thread)>0&&!k&&!t){let r=[],o=new J1({color:Y.foreground,dim:!0}),i=new l(" · ",o);if(W){let U1=W.totalInputTokens/W.maxInputTokens,k1=Math.round(U1*100),e=Math.max(0,Math.min(k1,100)),h1=d81(U1,W.maxInputTokens),T1=o;if(h1==="danger")T1=new J1({color:Y.destructive});else if(h1==="warning")T1=new J1({color:Y.warning});else if(h1==="recommendation")T1=new J1({color:Z.app.recommendation});let q0=Math.round(W.maxInputTokens/1000);r.push(new l(`${e}% of ${q0}k`,T1))}if(z&&this.threadCostInfo){let U1=l91(this.threadCostInfo,{colors:{foreground:Y.foreground},dim:!0});if(U1.length>0){if(r.length>0)r.push(i);r.push(...U1)}}if(r.length>0){let U1=new _1({text:new l("",void 0,r)});R.push({child:z?new F8({child:U1,onClick:this.showContextDetailOverlay,cursor:"pointer"}):U1,position:"top-left"})}}return new H_1({leftChild:new c6({child:M}),rightChild1:I,rightChild2:P,maxHeight:V,overlayTexts:R,borderColor:D||!this.isTextfieldAndAutocompleteFocused?z1.index(8):void 0,hasBanner:K,userHeight:this.bottomGridUserHeight,onInitializeHeight:(r)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(r,V)})},onDrag:(r)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(r.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let o=Math.floor(r.localPosition.y)-this.bottomGridDragStartY,i=Math.max(4,this.bottomGridDragStartHeight-o),U1=Math.min(i,V),k1=Math.floor(U1);if(this.bottomGridUserHeight!==k1)this.setState(()=>{this.bottomGridUserHeight=k1})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!K})}}async function vx1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)C8.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let Z=()=>null,G=!1,V=new eH(G,1000,J.inspectorPort),K=J.features.find((A)=>A.name===tj1.AMP_CONNECT)?.enabled??!1,q=new Iy1({threadService:J.threadService,worker:J.worker,builder:(A,E,I,P,R,k)=>{if(Z=R,J.threadDependencies&&K)wS1(J.threadDependencies,J.configService,R,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((b)=>{y.error("Failed to start automatic presence:",b)});let x=R(),h={...J,worker:x,threadID:x.thread.id};return new vY6({...h,threadState:E,workerController:I,switchWorker:P,getCurrentWorker:R,recentThreadIDs:k})}}),W=new z_1({configService:J.configService,child:q}),H=new nk1({configService:J.configService,child:W}),z=new oS1(H),U=new $6({data:OC.fromBaseTheme(f$.default()),child:z});try{await ij1(U,{onRootElementMounted:(A)=>{if(y.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(() => (ES1(),k56));A()}}let M=Z()?.thread.id||J.threadID,L=await J.threadService.get(M);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${M}`;Y76(L,A,J.stdout)}}function xx1(J){let Y=IK(J)?.uiHints?.secondaryColor;if(Y)return z1.rgb(Y.r,Y.g,Y.b);return TN8(J)}class hY6 extends p0{props;constructor(J){super();this.props=J}createState(){return new fY6}}class fY6 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:Y,appTheme:Z}=this.widget.props;return new B6({crossAxisAlignment:"stretch",children:[new c6({child:new q5({controller:Y,autofocus:!1,child:new Py1({todos:Q})})}),new MJ({controller:Y,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:X,offset:G}=Y,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=(Z,X=0)=>{if(Z&&"size"in Z&&"children"in Z){let G=Z.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},Y=Q(J);if(Y>0)return Y;if("size"in J){let Z=J.size;if(typeof Z?.height==="number"&&Z.height>0)return Z.height}return this.viewportHeight}}class bY6 extends x6{props;constructor(J){super();this.props=J}build(J){return new F8({child:new Q0({height:1}),cursor:j9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let Z=J.findRenderObject()?.size.height??0;if(Z>0){this.props.onInitializeHeight(Z);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function TN8(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 Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],Z=Math.abs(Q)%Y.length;return z1.index(Y[Z])}lj1();try{if(process.platform==="win32")await Promise.resolve().then(() => K6(Zj(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){XY.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
4606
- `)}var Wh1=qh1.join(cW0||qh1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function nL8(J){process.emitWarning=function(Q,Y,Z,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Y||"Warning",K=!1;J.warn(G,{name:V,code:Z})}}function jV(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")IG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")IG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")IG("model.sonnet",Q.useSonnet)}async function zh1(J){try{await cL8(qh1.dirname(Wh1),{recursive:!0}),await lL8(Wh1,J,"utf-8")}catch(Q){y.debug("Failed to save last thread ID",Q)}}async function aL8(){try{return(await HG6(Wh1,"utf-8")).trim()}catch(J){return null}}function oL8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function rL8(J){try{let Q=await G5.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){y.debug("Failed to fetch user info:",Q)}return}var KG6=[{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??_$,description:`Custom settings file path (overrides the default location ${_$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(y).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${fA})`},{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:u3(),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:lE.SMART.key,description:`Set the agent mode (${dX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:dX().map((J)=>J.mode).concat("large")}],qG6=(J)=>("deprecated"in J)&&J.deprecated===!0,sL8=(J)=>("hidden"in J)&&J.hidden===!0,tL8=(J)=>("default"in J),eL8=(J)=>("default"in J)?J.default:void 0;function JA8(J,Q){let Y=Q.args[0],Z=Q.commands.map((G)=>G.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let G=Z.filter((K)=>Y.includes(K)||K.includes(Y)),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 T8(S$.unknownCommand(Y),1,V)}}var zG6=null;function EA5(){return zG6}function Uu(J){return{...J,getThreadEnvironment:h61,vfs:ZP0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new Fv(J.fileSystem),generateThreadTitle:Kn0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Fh1=b0.file(iL8.homedir()),FG6=process.env.XDG_CONFIG_HOME?b0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(Fh1,".config");async function i$(J,Q){vN0("0.0.1765940986-gbb0819");let Y=jH1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([b0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Fh1,userConfigDir:FG6}),{initializeCLITelemetry:Z}=await Promise.resolve().then(() => (q51(),K51));Z(Y);let X=await Y.getLatest();y.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Ds0({configService:Y}),K=new Map,q=()=>K.clear(),W=new jN1(Y,J.settings.getWorkspaceRootPath()),H=Wj0({configService:Y,filesystem:x9}),z=kI0({configService:Y,trustStore:W,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(s,c,t)=>{let W1=`${s}:${c}`,B1=K.get(W1);if(B1)return y.debug("Reusing existing OAuth provider for server",{serverName:s,serverUrl:c}),B1;y.debug("Creating OAuth provider for server",{serverName:s,serverUrl:c});let r=(async()=>{let o=new TM(J.secrets),i=await o.getClientInfo(s,c),U1=t?.scopes??i?.scopes,k1=n66();y.info("OAuth headless mode check",{useHeadless:k1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:o9.isTTY});let e=void 0;if(k1)e=J.executeMode?i66():l66(s);let h1=new PN1({storage:o,serverName:s,serverUrl:c,clientId:t?.clientId??i?.clientId,clientSecret:t?.clientSecret??i?.clientSecret,authUrl:t?.authUrl??i?.authUrl,tokenUrl:t?.tokenUrl??i?.tokenUrl,scopes:U1,headlessAuthHandler:e});return y.debug("OAuth provider created",{serverName:s,serverUrl:c,hasManualClientId:!!(t?.clientId??i?.clientId),willUseDCR:!(t?.clientId??i?.clientId),scopes:U1,headlessMode:k1,executeMode:J.executeMode}),h1})();return K.set(W1,r),r}}),U=h01({configService:Y,filesystem:x9,spawn:NA}),{initializeToolProviders:D,startToolProviders:M}=await Promise.resolve().then(() => (VG6(),GG6)),L;if(J.executeMode){let s=await D({toolService:G,providers:[z,U],initialTimeout:15000});L=s.registrations;for(let[c,t]of s.initErrors)y.warn(`${c} provider initialization slow or failed:`,t)}else L=M({toolService:G,providers:[z,U]});if(Q.jetbrains)tE("JetBrains");else if(Q.ide&&T46())tE("VS Code");else if(Q.ide&&R46())tE("Neovim");if(J.executeMode)hN0(!0);let A,E=T7.status.pipe(Q6((s)=>Boolean(s.connected&&s.authenticated)),U4()).subscribe((s)=>{if(s){if(!A)A=G.registerTool(Ko0)}else A?.dispose(),A=void 0}),I;if(!J.executeMode){let s=await J.settings.get("fuzzy.alwaysIncludePaths")??[];I=new n61(process.cwd(),{alwaysIncludePaths:s},!0)}else I=new class extends n61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(o9.write(`No API key found. Starting login flow...
4606
+ `)}var Wh1=qh1.join(cW0||qh1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function nL8(J){process.emitWarning=function(Q,Y,Z,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Y||"Warning",K=!1;J.warn(G,{name:V,code:Z})}}function jV(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")IG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")IG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")IG("model.sonnet",Q.useSonnet)}async function zh1(J){try{await cL8(qh1.dirname(Wh1),{recursive:!0}),await lL8(Wh1,J,"utf-8")}catch(Q){y.debug("Failed to save last thread ID",Q)}}async function aL8(){try{return(await HG6(Wh1,"utf-8")).trim()}catch(J){return null}}function oL8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function rL8(J){try{let Q=await G5.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){y.debug("Failed to fetch user info:",Q)}return}var KG6=[{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??_$,description:`Custom settings file path (overrides the default location ${_$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(y).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${fA})`},{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:u3(),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:lE.SMART.key,description:`Set the agent mode (${dX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:dX().map((J)=>J.mode).concat("large")}],qG6=(J)=>("deprecated"in J)&&J.deprecated===!0,sL8=(J)=>("hidden"in J)&&J.hidden===!0,tL8=(J)=>("default"in J),eL8=(J)=>("default"in J)?J.default:void 0;function JA8(J,Q){let Y=Q.args[0],Z=Q.commands.map((G)=>G.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let G=Z.filter((K)=>Y.includes(K)||K.includes(Y)),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 T8(S$.unknownCommand(Y),1,V)}}var zG6=null;function EA5(){return zG6}function Uu(J){return{...J,getThreadEnvironment:h61,vfs:ZP0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new Fv(J.fileSystem),generateThreadTitle:Kn0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Fh1=b0.file(iL8.homedir()),FG6=process.env.XDG_CONFIG_HOME?b0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(Fh1,".config");async function i$(J,Q){vN0("0.0.1765944507-gbb0819");let Y=jH1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([b0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Fh1,userConfigDir:FG6}),{initializeCLITelemetry:Z}=await Promise.resolve().then(() => (q51(),K51));Z(Y);let X=await Y.getLatest();y.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Ds0({configService:Y}),K=new Map,q=()=>K.clear(),W=new jN1(Y,J.settings.getWorkspaceRootPath()),H=Wj0({configService:Y,filesystem:x9}),z=kI0({configService:Y,trustStore:W,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(s,c,t)=>{let W1=`${s}:${c}`,B1=K.get(W1);if(B1)return y.debug("Reusing existing OAuth provider for server",{serverName:s,serverUrl:c}),B1;y.debug("Creating OAuth provider for server",{serverName:s,serverUrl:c});let r=(async()=>{let o=new TM(J.secrets),i=await o.getClientInfo(s,c),U1=t?.scopes??i?.scopes,k1=n66();y.info("OAuth headless mode check",{useHeadless:k1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:o9.isTTY});let e=void 0;if(k1)e=J.executeMode?i66():l66(s);let h1=new PN1({storage:o,serverName:s,serverUrl:c,clientId:t?.clientId??i?.clientId,clientSecret:t?.clientSecret??i?.clientSecret,authUrl:t?.authUrl??i?.authUrl,tokenUrl:t?.tokenUrl??i?.tokenUrl,scopes:U1,headlessAuthHandler:e});return y.debug("OAuth provider created",{serverName:s,serverUrl:c,hasManualClientId:!!(t?.clientId??i?.clientId),willUseDCR:!(t?.clientId??i?.clientId),scopes:U1,headlessMode:k1,executeMode:J.executeMode}),h1})();return K.set(W1,r),r}}),U=h01({configService:Y,filesystem:x9,spawn:NA}),{initializeToolProviders:D,startToolProviders:M}=await Promise.resolve().then(() => (VG6(),GG6)),L;if(J.executeMode){let s=await D({toolService:G,providers:[z,U],initialTimeout:15000});L=s.registrations;for(let[c,t]of s.initErrors)y.warn(`${c} provider initialization slow or failed:`,t)}else L=M({toolService:G,providers:[z,U]});if(Q.jetbrains)tE("JetBrains");else if(Q.ide&&T46())tE("VS Code");else if(Q.ide&&R46())tE("Neovim");if(J.executeMode)hN0(!0);let A,E=T7.status.pipe(Q6((s)=>Boolean(s.connected&&s.authenticated)),U4()).subscribe((s)=>{if(s){if(!A)A=G.registerTool(Ko0)}else A?.dispose(),A=void 0}),I;if(!J.executeMode){let s=await J.settings.get("fuzzy.alwaysIncludePaths")??[];I=new n61(process.cwd(),{alwaysIncludePaths:s},!0)}else I=new class extends n61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(o9.write(`No API key found. Starting login flow...
4607
4607
  `),!await QA8(J))await bA(),process.exit(1)}let P=await Bj0({isDevelopment:!1}),R=new tP1(P,Y),k=new gP1(P,{lazy:!0}),x=Q.notifications!==void 0?Q.notifications:!J.executeMode,h=Ls0({playNotificationSound:async(s)=>{if(x){Ms0(s);let c=dj1(),t=cj1();if((!c||t)&&X.settings["notifications.system.enabled"]!==!1){if(s==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(s==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:R,configService:Y});y.info("Starting Amp background services");let b=Wn0({threadService:R,threadHistoryService:k,configService:Y,isExtensionDevelopment:!1}),u;T7.status.subscribe((s)=>{u=s});let m=new B$1({workspaceRoots:[b0.file(process.cwd())],getCurrentFile:()=>{if(!u?.openFile)return;try{return b0.parse(u.openFile)}catch(s){y.warn("Failed to parse current file URI",{uri:u.openFile,error:s});return}},getOpenFiles:()=>{if(!u?.visibleFiles?.length)return[];let s=u.openFile;return u.visibleFiles.filter((c)=>c!==s).map((c)=>{try{return b0.parse(c)}catch(t){return y.warn("Failed to parse visible file URI",{uri:c,error:t}),null}}).filter((c)=>c!==null)}}),a=new nj1,G1={codebaseContextService:m,configService:Y,toolService:G,mcpService:z,skillService:H,trustStore:W,threadService:R,threadHistoryService:k,threadSyncService:b,threadStorage:P,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:I,notificationService:h,fileSystem:Q.jetbrains||Q.ide?JP0:x9,terminal:a};return{...G1,async asyncDispose(){if(G1.mcpService.hasAuthenticatingClients())y.info("Waiting for OAuth authentication to complete before exit..."),await G1.mcpService.waitForAuthentication();for(let s of L.values())s.dispose();await G1.mcpService.dispose(),q(),await G1.threadService.asyncDispose(),G1.configService.unsubscribe(),V(),G1.fuzzyServer.dispose(),G1.threadSyncService.dispose(),G1.settingsStorage[Symbol.dispose](),E.unsubscribe(),A?.dispose()}}}async function QA8(J){if(!J.executeMode){if(!await Aj1("Would you like to log in to Amp? [(y)es, (n)o]: "))return o9.write(`Login cancelled. Run the command again to retry.
4608
4608
  `),!1}return await UG6(J)}async function UG6(J){let Q=dL8(32).toString("hex"),Y=await Lj1(J.ampURL,Q),Z=new AbortController;try{await EF(Y,Z.signal)}catch(G){y.error("Error opening browser",{error:G})}let X=await Lj1(J.ampURL,Q,!1);o9.write(`If your browser does not open automatically, visit:
4609
4609
 
@@ -4613,7 +4613,7 @@ ${O6.blue.bold(X)}
4613
4613
  Login successful! You can now use the Amp CLI.
4614
4614
  `),!0}catch(G){return y.error("Login failed",{error:G}),XY.write(`
4615
4615
  Login failed: ${G instanceof Error?G.message:String(G)}
4616
- `),!1}}function YA8(){let J=new PA().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)gR(),process.exit(0);let z=H.originalError??H;N66(z)}),J.option("-V, --version","Print the version number and exit",()=>{let z;try{z=`, ${oI(new Date("2025-12-17T03:15:06.932Z"))} ago`}catch{}o9.write(`0.0.1765940986-gbb0819 (released 2025-12-17T03:15:06.932Z${z??""})
4616
+ `),!1}}function YA8(){let J=new PA().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)gR(),process.exit(0);let z=H.originalError??H;N66(z)}),J.option("-V, --version","Print the version number and exit",()=>{let z;try{z=`, ${oI(new Date("2025-12-17T04:13:40.363Z"))} ago`}catch{}o9.write(`0.0.1765944507-gbb0819 (released 2025-12-17T04:13:40.363Z${z??""})
4617
4617
  `),process.exit(0)}),J.addHelpText("after",E46()),J.configureHelp({formatHelp:I46}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await UQ(U);await GA8(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 UQ(U);await $A8(D,await Kj1(U,D.settings))});let Q=async(H,z,U)=>{jH1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:t1.of([b0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:Fh1,userConfigDir:FG6});let D={...z,executeMode:!1};await Hh1(D,{...H,openThreadSwitcher:!0},U)},Y=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await UQ(U);await WG6(U,D,z)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await UQ(U);await FA8(U,D,z)}),Y.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await UQ(D);if(z.pick)XY.write(`${O6.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
4618
4618
  `);if(z.last||H||M.executeMode)await zA8(D,M,H,U);else await Q(D,M,U)}),Y.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await UQ(D);await HA8(D,M,H,U)}),Y.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await UQ(U);await WG6(U,D,z)}),Y.command("search <query>").alias("find").summary("Search threads").description(`Search for threads using a query DSL.
4619
4619
 
@@ -4629,8 +4629,8 @@ All matching is case-insensitive. File paths use partial matching.`).option("-n,
4629
4629
  Or pipe via stdin: echo "your message" | amp --execute`);jV(Y,Q);let V=await i$(J,Q);zG6=V;let K=Uu(V),q=await rL8(V.configService),W=oL8(q?.email);if((J.executeMode||Q.streamJson)&&z9(Q.mode)&&!W)throw new T8(`Execute mode is not permitted with --mode '${Q.mode}'`,1);let H=async(m)=>{let a=await HG6(m,"utf-8"),G1=JSON.parse(a);if(!iX(G1.id))throw new T8(S$.invalidThreadId);return t51(V,{visibility:Z,agentMode:Q.mode,thread:G1})},z=async(m)=>{if(!iX(m))throw new T8(S$.invalidThreadId);try{let[G1,s]=await Promise.all([G5.getThreadLinkInfo({thread:m},{config:V.configService}),G5.getUserInfo({},{config:V.configService})]);if(G1.ok&&s.ok){let c=G1.result.creatorUserID,t=s.result.id;if(c&&c!==t&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new T8(`Cannot resume thread created by another user.
4630
4630
 
4631
4631
  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(G1){if(G1 instanceof T8)throw G1;y.warn("Failed to validate thread ownership in CLI, allowing to open",{error:G1})}let a=await V.threadService.get(m)??void 0;return y.info(`[fetchAndStartThread] Loaded thread ${m}, agentMode: ${a?.agentMode??"undefined"}`),t51(V,{visibility:Z,agentMode:a?void 0:Q.mode,thread:a})},U=async()=>{try{if(Q.threadId)return z(Q.threadId);else return t51(V,{visibility:Z,agentMode:Q.mode})}catch(m){if(m instanceof T8)throw m;throw await Tm(m,Q.threadId),Error("handleError should have called process.exit()")}},D=async()=>{return t51(V,{visibility:Z,agentMode:Q.mode})};if(Q.format==="jsonl")XY.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
4632
- `),await bA(),process.exit(1);if(J.executeMode&&Q.remote)await F86(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)$86(V.mcpService,J.settings),await _66(M,M.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL,W,Q.mode),await V.asyncDispose(),process.exit(0);let L=!1,A=!1,E=!1;if(Q.jetbrains||Q.ide){await oN0();let m=YI({jetbrainsOnly:Q.jetbrains});if(m.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(m.length===1){let a=m[0];if(a)T7.selectConfig(a)}else E=!0}let I=Z41("0.0.1765940986-gbb0819",V.settingsStorage),P=new G01(V.threadStorage),R=t1.of([b0.file(process.cwd())]),k=P$1(void 0,R),x=new X41(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let b=await(async()=>{try{let m=await G5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(m.ok)return y.info("User free tier status:",m),m.result}catch(m){throw y.error("Failed to fetch free tier status:",m),m}})(),u=await D86();y.info("Loaded session state:",u),await vx1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,threadID:M.threadID,threadFuzzyIndexer:P,worker:M,workerDeps:K,skillService:K.skillService,configService:V.configService,internalAPIClient:G5,ampURL:J.ampURL,startNewThread:D,switchToThread:z,ideClient:T7,connectedClientsService:new En,commandRegistry:k,mcpService:V.mcpService,mcpTrustHandler:x,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:E,openThreadSwitcher:Q.openThreadSwitcher,updateService:I,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:u,freeTierStatus:{canUseAmpFree:b.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Y.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function UQ(J){if(J.interactive)XY.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4633
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,Z=await V46({...J,workspaceTrust:{current:!0,changes:m_},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 Z86(J.mcpConfig);Z=X86(Z,G)}let X=await Z.get("url","global");if(!X)X=BY;if(!IF(X))y.info("Targeting custom Amp server",{ampURL:X});return Z=dH0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:U86(await Kj1(J,Z))}}function ZA8(J){let Q={};for(let Y=0;Y<J.length;Y++){let Z=J[Y];if(Z?.startsWith("--")){let G=Z.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Y+1];if(V&&!V.startsWith("--"))Q[G]=V,Y++}}return Q}async function XA8(){let J=ZA8(process.argv);if(G66({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),nL8(y),y.info("Starting Amp CLI.",{version:"0.0.1765940986-gbb0819",buildTimestamp:"2025-12-17T03:15:06.932Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new T8(S$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await YA8().parseAsync(process.argv)}jP1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await XA8().catch(Tm)});async function $A8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),o9.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4632
+ `),await bA(),process.exit(1);if(J.executeMode&&Q.remote)await F86(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)$86(V.mcpService,J.settings),await _66(M,M.threadID,X,G,V,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL,W,Q.mode),await V.asyncDispose(),process.exit(0);let L=!1,A=!1,E=!1;if(Q.jetbrains||Q.ide){await oN0();let m=YI({jetbrainsOnly:Q.jetbrains});if(m.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(m.length===1){let a=m[0];if(a)T7.selectConfig(a)}else E=!0}let I=Z41("0.0.1765944507-gbb0819",V.settingsStorage),P=new G01(V.threadStorage),R=t1.of([b0.file(process.cwd())]),k=P$1(void 0,R),x=new X41(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let b=await(async()=>{try{let m=await G5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(m.ok)return y.info("User free tier status:",m),m.result}catch(m){throw y.error("Failed to fetch free tier status:",m),m}})(),u=await D86();y.info("Loaded session state:",u),await vx1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,threadID:M.threadID,threadFuzzyIndexer:P,worker:M,workerDeps:K,skillService:K.skillService,configService:V.configService,internalAPIClient:G5,ampURL:J.ampURL,startNewThread:D,switchToThread:z,ideClient:T7,connectedClientsService:new En,commandRegistry:k,mcpService:V.mcpService,mcpTrustHandler:x,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:E,openThreadSwitcher:Q.openThreadSwitcher,updateService:I,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:u,freeTierStatus:{canUseAmpFree:b.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Y.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function UQ(J){if(J.interactive)XY.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4633
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,Z=await V46({...J,workspaceTrust:{current:!0,changes:m_},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 Z86(J.mcpConfig);Z=X86(Z,G)}let X=await Z.get("url","global");if(!X)X=BY;if(!IF(X))y.info("Targeting custom Amp server",{ampURL:X});return Z=dH0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:U86(await Kj1(J,Z))}}function ZA8(J){let Q={};for(let Y=0;Y<J.length;Y++){let Z=J[Y];if(Z?.startsWith("--")){let G=Z.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Y+1];if(V&&!V.startsWith("--"))Q[G]=V,Y++}}return Q}async function XA8(){let J=ZA8(process.argv);if(G66({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),nL8(y),y.info("Starting Amp CLI.",{version:"0.0.1765944507-gbb0819",buildTimestamp:"2025-12-17T04:13:40.363Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new T8(S$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await YA8().parseAsync(process.argv)}jP1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await XA8().catch(Tm)});async function $A8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),o9.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4634
4634
  `);else if(!IF(J.ampURL))o9.write(`Logging in to ${new URL(J.ampURL).hostname}
4635
4635
  `);let Y=process.env.AMP_API_KEY;if(Y)o9.write(`API key found in environment variable, storing...
4636
4636
  `),await Q.set("apiKey",Y,J.ampURL),o9.write(`API key successfully stored.
@@ -4643,7 +4643,7 @@ This thread belongs to a different user and cannot be continued for security rea
4643
4643
  `);else o9.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
4644
4644
  `);process.exit(0)}async function VA8(J,Q,Y,Z,X){jV(X,J);let G=await i$(Q,J);try{let V=e51(Y);if(!V)J71(Y);let K=V,q=Z.trim();if(q.length===0)qX("Thread name cannot be empty");if(q.length>256)qX("Thread name cannot exceed 256 characters");if(!(await Xj(K,G)).messages.length)qX("Cannot rename an empty thread.");let H=Uu(G);await(await b3.getOrCreateForThread(H,K)).handle({type:"title",value:q}),y.info("GOT HERE"),await G.threadSyncService.sync(),y.info("GOT THERE"),o9.write(O6.green(`✓ Thread ${K} renamed to "${q}"
4645
4645
  `)),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose();let K=`Failed to rename thread: ${V instanceof Error?V.message:String(V)}`;qX(K)}}async function KA8(J,Q,Y,Z){jV(Z,J);let X=await i$(Q,J);try{let G=e51(Y);if(!G)J71(Y);let K=await Xj(G,X),q=BR(K);o9.write(q+`
4646
- `),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)}`;qX(V)}}async function qA8(J,Q,Y,Z,X){jV(X,J);let G=await i$(Q,J);try{let V=await Uh1(Y),K=await Xj(V,G),q=Z.typing!==!1,W=parseInt(Z.wpm||"120",10),H=parseInt(Z.messageDelay||"1000",10),z=parseInt(Z.toolProgressDelay||"800",10),U=parseInt(Z.exitDelay||"3",10)*1000,D=Z.indicator!==!1,M=Uu(G),L=K.id;await G.threadStorage.set(L,K);let A=await b3.getOrCreateForThread(M,L);await A.resume();let E=$01.fromWorker(A),I=new G01(G.threadStorage),P=t1.of([b0.file(process.cwd())]),R=P$1(void 0,P),k=new X41(G.mcpService,Q.settings.getWorkspaceRootPath()),x=Z41("0.0.1765940986-gbb0819",G.settingsStorage);await vx1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,threadID:L,threadFuzzyIndexer:I,worker:E,workerDeps:M,skillService:M.skillService,configService:G.configService,internalAPIClient:G5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:T7,connectedClientsService:new En,commandRegistry:R,mcpService:G.mcpService,mcpTrustHandler:k,showJetBrainsInstaller:!1,updateService:x,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await Tm(V,Y)}}async function WA8(J,Q,Y,Z,X){jV(Z,J);let G=await i$(Q,J);try{let V=e51(Y);if(!V)J71(Y);let K=V,q=await G5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=$41(J,W);if(!H&&!X)qX("Must specify either --visibility or --support");if(H&&X)qX("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)qX(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,G41(H)),o9.write(O6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4646
+ `),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)}`;qX(V)}}async function qA8(J,Q,Y,Z,X){jV(X,J);let G=await i$(Q,J);try{let V=await Uh1(Y),K=await Xj(V,G),q=Z.typing!==!1,W=parseInt(Z.wpm||"120",10),H=parseInt(Z.messageDelay||"1000",10),z=parseInt(Z.toolProgressDelay||"800",10),U=parseInt(Z.exitDelay||"3",10)*1000,D=Z.indicator!==!1,M=Uu(G),L=K.id;await G.threadStorage.set(L,K);let A=await b3.getOrCreateForThread(M,L);await A.resume();let E=$01.fromWorker(A),I=new G01(G.threadStorage),P=t1.of([b0.file(process.cwd())]),R=P$1(void 0,P),k=new X41(G.mcpService,Q.settings.getWorkspaceRootPath()),x=Z41("0.0.1765944507-gbb0819",G.settingsStorage);await vx1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,threadID:L,threadFuzzyIndexer:I,worker:E,workerDeps:M,skillService:M.skillService,configService:G.configService,internalAPIClient:G5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:T7,connectedClientsService:new En,commandRegistry:R,mcpService:G.mcpService,mcpTrustHandler:k,showJetBrainsInstaller:!1,updateService:x,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await Tm(V,Y)}}async function WA8(J,Q,Y,Z,X){jV(Z,J);let G=await i$(Q,J);try{let V=e51(Y);if(!V)J71(Y);let K=V,q=await G5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=$41(J,W);if(!H&&!X)qX("Must specify either --visibility or --support");if(H&&X)qX("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)qX(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,G41(H)),o9.write(O6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4647
4647
  `);if(X){await Xj(K,G);let z=typeof X==="string"?X:void 0;await CT0(G.threadService,K,G.configService,z),o9.write(O6.green("✓ ")+`Thread ${K} has been shared with Amp support. These thread reports will be aggregated and analysed.
4648
4648
  `)}await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),qX(`Failed to update thread: ${V instanceof Error?V.message:String(V)}`)}}async function HA8(J,Q,Y,Z){jV(Z,J);let X=await i$(Q,J),G=Uu(X);try{let V=await Uh1(Y),q=(await Xj(V,X)).messages.length-1,W=await b3.getOrCreateForThread(G,V),H=await LR(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await zh1(H),o9.write(`${H}
4649
4649
  `),await X.asyncDispose(),process.exit(0)}catch(V){XY.write(`Error forking thread: ${V instanceof Error?V.message:String(V)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1765940986-gbb0819",
3
+ "version": "0.0.1765944507-gbb0819",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {