@sourcegraph/amp 0.0.1765849453-gf5d317 → 0.0.1765858276-g8d78e4

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
@@ -3858,11 +3858,11 @@ Actual: ${X}`)}async function bQ8(J,Q,Z){let{execSync:Y}=await import("node:ch
3858
3858
  ${D}`;if(X==="pnpm"&&D.includes("Unable to find the global bin directory"))M+=`
3859
3859
 
3860
3860
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
3861
- 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 t61(J,Q){let Y=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Y}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=dQ8(J,q),H=W<0,z,U;if(K.time){let D=K.time[J],M=K.time[q],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function dQ8(J,Q){let Z=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Y=Z(J),X=Z(Q),G=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Y.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}l0();function e61(J,Q){let Z=new x4,Y=Z.pipe(B8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new zK().scoped("update"),G=Y.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await DB(500),Z.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=pA(),W=await t61(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 s61();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Z.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Z.next("update-available");return}if(z==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Z.next("update-available");return}try{await bm(W.latestVersion,z);let U=await yB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Z.next("updated");else X.warn("success with warning",D),Z.next("updated-with-warning")}catch(U){Z.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await DB(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Pq}from"node:process";function i66(J){let Q=new RA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await yC1(Y.force||!1,Y.verbose||!1,"0.0.1765849453-gf5d317"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new RA("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Y)=>{await cQ8(Y.targetVersion)});J.addCommand(Z)}async function cQ8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Pq.write(A6.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
3861
+ 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 t61(J,Q){let Y=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Y}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=dQ8(J,q),H=W<0,z,U;if(K.time){let D=K.time[J],M=K.time[q],L=Date.now();if(D)z=Math.floor((L-new Date(D).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function dQ8(J,Q){let Z=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Y=Z(J),X=Z(Q),G=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Y.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}l0();function e61(J,Q){let Z=new x4,Y=Z.pipe(B8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new zK().scoped("update"),G=Y.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await DB(500),Z.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=pA(),W=await t61(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 s61();if(!K)K=z==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:K});if(K==="warn"){if(!H())Z.next("update-available");return}if(!z){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Z.next("update-available");return}if(z==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Z.next("update-available");return}try{await bm(W.latestVersion,z);let U=await yB(W.latestVersion),D={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",D),Z.next("updated");else X.warn("success with warning",D),Z.next("updated-with-warning")}catch(U){Z.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await DB(5000),Z.next("hidden"),G.unsubscribe(),Z.complete()}}),{state:Y}}import{stderr as Pq}from"node:process";function i66(J){let Q=new RA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await yC1(Y.force||!1,Y.verbose||!1,"0.0.1765858276-g8d78e4"),process.exit()});J.addCommand(Q,{hidden:!0});let Z=new RA("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Y)=>{await cQ8(Y.targetVersion)});J.addCommand(Z)}async function cQ8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Pq.write(A6.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
3862
3862
 
3863
3863
  `));try{if(!J){Pq.write(A6.blue(`Checking for updates...
3864
- `));let Z=pA(),{hasUpdate:Y,latestVersion:X}=await t61("0.0.1765849453-gf5d317",Z);if(!Y){Pq.write(A6.green(`✓ Amp CLI is already up to date: ${"0.0.1765849453-gf5d317"} (${"released"} ${"2025-12-16T01:49:19.931Z"}${`, ${nI(new Date("2025-12-16T01:49:19.931Z"))} ago`})
3865
- `));let V=await yB("0.0.1765849453-gf5d317");if(V.warning)Pq.write(`
3864
+ `));let Z=pA(),{hasUpdate:Y,latestVersion:X}=await t61("0.0.1765858276-g8d78e4",Z);if(!Y){Pq.write(A6.green(`✓ Amp CLI is already up to date: ${"0.0.1765858276-g8d78e4"} (${"released"} ${"2025-12-16T04:16:33.117Z"}${`, ${nI(new Date("2025-12-16T04:16:33.117Z"))} ago`})
3865
+ `));let V=await yB("0.0.1765858276-g8d78e4");if(V.warning)Pq.write(`
3866
3866
  `+A6.yellow(V.warning)+`
3867
3867
  `);process.exit(0)}if(!X)Pq.write(A6.yellow("[WARN] could not find latest version")),process.exit(0);J=X}Pq.write(A6.blue(`Updating to version ${J}...
3868
3868
  `)),await bm(J,void 0,(Z)=>{Pq.write(A6.dim(`Running: ${Z}
@@ -4538,7 +4538,7 @@ Ctrl-X, Y, Z to unlock`;if(U){let a=W.text.replace(/`([^`]+)`/g,"$1")+`
4538
4538
  `,A)])}),y];if(!q&&!U&&W.url){let b=W.url.replace(/^https?:\/\//,"");m.push(new l5({uri:W.url,text:b,style:new t({color:Z.secondary,underline:!0})}))}if(k&&!U)m.push(k);let p=new Z0({width:40,child:new v0({crossAxisAlignment:"start",mainAxisSize:"min",children:m})});return S4.child(new E6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new KS1({width:fk1,height:hk1,agentMode:this.widget.agentMode,glow:this._glow,t:H,fps:0,shockwaves:this._shockwaves,onShockwave:P,...V==="disabled"&&{seed:42}}),new Z0({width:2}),p]}))}}U0();N8();U4();W7();N8();l0();function lz8(J,Q){return`${J}:${Q}`}class bk1{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=(Z)=>Q.next(Z),()=>{this.emitMainThread=null}}),this.subthreadObservable=new t1((Q)=>{return this.emitSubthread=(Z)=>Q.next(Z),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new t1((Q)=>{return this.emitWorkerStatus=(Z)=>Q.next(Z),()=>{this.emitWorkerStatus=null}})}registerWorker(J){let Q=J.thread.id;if(this.workers.has(Q))this.unregisterWorker(Q);this.threadsMap.set(Q,J.thread),this.subthreadsMap.set(Q,[]),this.workers.set(Q,{state:"initial"});let Z=this.threadService.observePatches(Q).pipe($M()).subscribe((G)=>{this.threadsMap.set(Q,G);let V=this.subthreadsMap.get(Q)||[],K=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:G,subthreads:V,workerStatus:K})});this.mainThreadSubs.set(Q,Z);let Y=J.status.subscribe((G)=>{if(this.workers.set(Q,G),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:G})});this.workerStatusSubs.set(Q,Y);let X=J.subthreads.subscribe((G)=>{this.subthreadsMap.set(Q,G);for(let V of G){let K=lz8(Q,V.toolUse.id);if(this.subthreadPatchSubs.has(K))continue;let q=this.threadService.observePatches(V.threadID).pipe($M()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:V})});this.subthreadPatchSubs.set(K,q)}});this.subthreadsSubs.set(Q,X)}unregisterWorker(J){let Q=this.mainThreadSubs.get(J);if(Q)Q.unsubscribe(),this.mainThreadSubs.delete(J);let Z=this.workerStatusSubs.get(J);if(Z)Z.unsubscribe(),this.workerStatusSubs.delete(J);let Y=this.subthreadsSubs.get(J);if(Y)Y.unsubscribe(),this.subthreadsSubs.delete(J);for(let[X,G]of this.subthreadPatchSubs.entries())if(X.startsWith(`${J}:`))G.unsubscribe(),this.subthreadPatchSubs.delete(X);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new t1((Q)=>{return this.mainThreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),subthreads:new t1((Q)=>{return this.subthreadObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})}),workerStatus:new t1((Q)=>{return this.workerStatusObservable.subscribe((Z)=>{if(Z.threadID===J)Q.next(Z)})})}}get threadViewStates(){let J={};for(let[Q,Z]of this.threadsMap){let Y=this.workers.get(Q);if(Y)J[Q]=VA(Z,Y)}return J}dispose(){for(let J of this.mainThreadSubs.values())J.unsubscribe();for(let J of this.subthreadsSubs.values())J.unsubscribe();for(let J of this.workerStatusSubs.values())J.unsubscribe();for(let J of this.subthreadPatchSubs.values())J.unsubscribe();this.mainThreadSubs.clear(),this.subthreadsSubs.clear(),this.workerStatusSubs.clear(),this.subthreadPatchSubs.clear(),this.workers.clear(),this.threadsMap.clear(),this.subthreadsMap.clear()}}function iz8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Z,subthread:Y}=Q,X=J.subagents[Y.threadID];if(!X){if(X={subThreadID:Z.id,parentToolID:Y.toolUse.id,taskDescription:Y.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=uJ(J.mainThread);X.isCompleted=l26(W,Y.toolUse.id)}}let G=nz8(Z,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=kC(Z).items.filter((W)=>W.type==="toolResult");for(let W of q)K[W.id]={id:W.id,subthreadID:Z.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[Y.threadID]:V},tools:K,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Z,subthreads:Y,workerStatus:X}=Q,G=uJ(Z),V={...J.subagents};for(let z of Y){let U=V[z.threadID];if(!U)continue;let D=l26(G,z.toolUse.id);V[z.threadID]={...U,isCompleted:D}}let{items:K}=kC(Z),q=VA(Z,X),W=vF({messages:Z.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:V,items:K,viewState:q,todosList:H,mainThread:Z}}case"worker-status-change":{if(!J.mainThread)return J;let Z=VA(J.mainThread,Q.workerStatus);if(Z===J.viewState)return J;return{...J,viewState:Z}}default:return J}}function kC(J){let Q=[],Z=new Map,Y=new Set;for(let[X,G]of J.messages.entries()){let V=`${G.role}-${X}`;switch(G.role){case"assistant":{let K=G.state.type==="streaming";for(let W of G.content)if(W.type==="tool_use"){if(Z.set(W.id,W),K)Y.add(W.id)}if(G.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:V,message:G});for(let W of G.content)if(W.type==="tool_use"){let H=!1;for(let z=X+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let D of U.content)if(D.type==="tool_result"&&D.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:K?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:V,message:G});break;case"user":{let K=G.content.some((q)=>q.type==="text"&&q.text.trim()||q.type==="image");for(let q of G.content)if(q.type==="tool_result"){let W=Z.get(q.toolUseID)??AY(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 l26(J,Q){let Z=J.get(Q);return(Z&&W3(Z.run))??!1}function nz8(J,Q){let Z=J.messages.at(-1);if(Z?.content.some((X)=>X.type==="tool_result"&&X.run.status==="blocked-on-user"))return v.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(kC(J).items.some((X)=>X.type==="toolResult"&&X.toolResult.run.status==="in-progress")){let X=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools",{threadID:J.id,startTime:X,hasStartTime:!!X}),{type:"running-tools",startTime:X}}if(Z&&Z.role==="assistant"&&Z.state.type==="streaming")switch(Z.content.at(-1)?.type){case"text":return v.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return v.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let G=Q?.type==="running-tools"?Q.startTime:Date.now();return v.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}default:return v.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return v.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class mk1 extends p0{props;constructor(J){super();this.props=J}createState(){return new i26}}class i26 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 bk1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),Z=Q.mainThread.subscribe((G)=>{this.dispatch({type:"main-thread-patch",thread:G.mainThread,subthreads:G.subthreads,workerStatus:G.workerStatus})});this.subscriptions.push(Z);let Y=Q.subthreads.subscribe((G)=>{this.dispatch({type:"subthread-patch",thread:G.thread,subthread:G.subthread})});this.subscriptions.push(Y);let X=Q.workerStatus.subscribe((G)=>{this.dispatch({type:"worker-status-change",workerStatus:G.status})});this.subscriptions.push(X)}cleanup(){this.subscriptions.forEach((J)=>J.unsubscribe()),this.subscriptions=[]}switchWorker(J){this.cleanup(),this.setState(()=>{this.currentWorker=J}),this.setState(()=>{this.state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null}}),this.setupSubscriptions(J),this.addToRecentThreads(J.thread.id)}dispatch(J){this.setState(()=>{this.state=iz8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((G)=>({toolUse:G.toolUse,toolRun:G.toolRun,subthreadID:G.subthreadID})),Q={};for(let G of Object.values(this.state.subagents)){let V=J.filter((K)=>K.subthreadID===G.subThreadID);Q[G.parentToolID]=V}let Z=(G)=>G===M5||G===z9||G===MK,Y=new Map;for(let G of this.state.items)if(G.type==="toolResult"&&Z(G.toolUse.name))Y.set(G.toolUse.id,{toolUseId:G.toolUse.id,toolName:G.toolUse.name,toolRun:G.toolResult.run});let X=Array.from(Y.values());for(let{toolUseId:G,toolRun:V}of X){let K=[],q;if(V.status==="in-progress"||V.status==="done"||V.status==="error"||V.status==="cancelled")q=V.progress;if(q){let W=0;for(let H of q)if(H.tool_uses)for(let z of H.tool_uses){let U=`${G}:progress:${W++}`;K.push({toolUse:iE(z.tool_name,z.input,U),toolRun:{status:z.status}})}}Q[G]=K}return{...this.state,subagents:Object.values(this.state.subagents),subagentActiveTools:J,subagentToolsByParentID:Q}}build(J){let Q=this.getThreadData();return this.widget.props.builder(J,Q,this.workerController,(Z)=>this.switchWorker(Z),()=>this.currentWorker,this.recentThreadIDs)}}class gk1 extends p0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new n26}}class n26 extends u0{build(J){let Z=$6.of(J).colors,{todos:Y,title:X="TODOs"}=this.widget.props;if(!Array.isArray(Y)||Y.length===0)return new Z0({width:0,height:0});let G=Y.map((V)=>this.buildTodoItem(V,Z));return new b0({child:new K6({padding:H0.symmetric(1,0),child:new v0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new _1({text:new l(X,new t({bold:!0,color:Z.foreground}))}),...G]})})})}buildTodoItem(J,Q){let Z=this.getStatusIcon(J.status),Y=J.status==="completed",X=new t({bold:J.status==="in-progress",color:Q.foreground,dim:Y}),G=new t({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:Y});return new E6({crossAxisAlignment:"start",children:[new _1({text:new l(Z,X)}),new Z0({width:1}),new i6({child:new _1({text:new l(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class uk1 extends x6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Z,onButtonClick:Y}){super({key:J});this.ad=Q,this.onDismiss=Z,this.onButtonClick=Y}build(J){let Q=$6.of(J),Z=Q.colors.primary,Y=Q.colors.foreground;return new b0({decoration:new M8(void 0,new B4(new V4(Z,1,"rounded"),new V4(Z,1,"rounded"),void 0,new V4(Z,1,"rounded"))),child:new K6({padding:H0.horizontal(1),child:new v0({children:[new E6({crossAxisAlignment:"start",children:[new i6({child:new _1({text:new l(this.ad.content,new t({color:Y}))})}),new Z0({width:4}),new l5({uri:"https://ampcode.com/free",text:"Ad",style:new t({color:Y,dim:!0})})]}),new E6({crossAxisAlignment:"start",children:[new LS1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:H0.horizontal(1),color:Z,reverse:!0}),new Z0({width:2}),new _1({text:new l(this.ad.destinationUrlHostname,new t({color:Y,dim:!0}))})]})]})})})}}class pk1 extends p0{props;constructor(J){super();this.props=J}createState(){return new a26(this.props.autofocus??!0)}}class a26 extends u0{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(K)=>{if(K.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(K.ctrlKey&&K.key==="c"||K.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Z=j4.sizeOf(J),Y=Math.min(60,Z.width-4),X=Z.height-4,G=[];if(this.widget.props.title)G.push(new _1({text:new l(this.widget.props.title,new t({bold:!0,color:z1.blue}))}),new Z0({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 Z0({height:1}));let V=[];if(this.widget.props.showCopyOption)V.push(new _1({text:new l("Enter to copy",new t({dim:!0}))}));return V.push(new _1({text:new l("Escape to close",new t({dim:!0}))})),G.push(new E6({children:V.flatMap((K,q)=>q<V.length-1?[K,new Z0({width:1}),new _1({text:new l("•",new t({dim:!0}))}),new Z0({width:1})]:[K]),mainAxisSize:"min"})),new S4({child:new b0({constraints:new M6(Y,Y,0,X),decoration:new M8(z1.default(),new B4(new V4(z1.blue,1,"rounded"),new V4(z1.blue,1,"rounded"),new V4(z1.blue,1,"rounded"),new V4(z1.blue,1,"rounded"))),padding:new H0(2,2,2,2),child:new z8({autofocus:this.autofocus,onKey:Q,child:new v0({children:G,mainAxisSize:"min"})})})})}}class j91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,j91.prototype)}}class S91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,S91.prototype)}}function dk1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Z)=>{if(Z.startsWith('"')&&Z.endsWith('"')||Z.startsWith("'")&&Z.endsWith("'"))return Z.slice(1,-1);return Z})}rW();U0();import{spawn as az8}from"node:child_process";import{promises as oz8}from"node:fs";function o26(J){return J.kind==="executable"}function r26(J){return J.kind==="markdown"}var Hz=50000,s26=300000;async function ck1(J,Q,Z,Y={}){let{timeoutMs:X=s26,signal:G,source:V}=Y;try{let K=await Z.getCommand(J,V);if(!K)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Z.isCommandAvailable(J,V))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(v.debug("Executing command",{commandName:J,filePath:K.filePath,args:Q}),r26(K))return await rz8(K,Q);else if(o26(K))return await sz8(K,Q,X,G);else return{success:!1,output:"",error:"Unsupported command type"}}catch(K){return v.error("Failed to execute command",{commandName:J,error:K}),{success:!1,output:"",error:K instanceof Error?K.message:"Unknown error occurred"}}}async function rz8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Z=await oz8.readFile(J.filePath,"utf8");return{success:!0,output:(Z.length>Hz?Z.slice(0,Hz)+`
4539
4539
  ... (output truncated at ${Hz} characters)`:Z).trim(),exitCode:0}}catch(Z){return{success:!1,output:"",error:Z instanceof Error?Z.message:"Failed to read markdown file"}}}async function sz8(J,Q,Z=s26,Y){return new Promise((X)=>{let[G,V]=tz8(J,Q);v.debug("Spawning command",{spawnCommand:G,spawnArgs:V.slice(0,10),filePath:J.filePath,timeoutMs:Z});let K=Kw0(Y),q=!1,W=setTimeout(()=>{q=!0,K.abort(),v.warn("Command execution timed out",{commandName:J.name,timeoutMs:Z})},Z),H=az8(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<=Hz)z.push(L);else{let A=Hz-(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<=Hz)U.push(L);else{let A=Hz-(D-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(M)=>{if(clearTimeout(W),q){X({success:!1,output:z.join(""),error:`Command timed out after ${Z}ms`,exitCode:void 0});return}if(K.signal.aborted){X({success:!1,output:z.join(""),error:"The command was aborted",exitCode:M??void 0});return}let L=M===0||M===1,A=z.join(""),E=U.join(""),I=A;if(!L&&!A.trim()&&E.trim())I=E;else if(E.trim())I+=A?`
4540
4540
  ${E}`:E;if(D>Hz)I+=`
4541
- ... (output truncated at ${Hz} characters)`;X({success:L,output:I.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(q)L=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:z.join(""),error:L})})})}function tz8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return JF8(Z,Y?[...Y]:null,X,Q);else return ez8(Z,Y?[...Y]:null,X,Q)}function ez8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function JF8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Y]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Y]];case".exe":return[J,Y];default:return[J,Y]}}U0();LY();P7();yW();jZ();bG();sW();pK();N8();Tb();W7();x_();l0();var RJ6=q6(dM(),1);import{writeFile as EJ6}from"fs/promises";import IJ6 from"path";U0();jZ();class lk1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1765849453-gf5d317"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await _o(Q,this.configService)}catch(Q){v.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class UO extends p0{props;constructor(J){super();this.props=J}createState(){return new t26}}class t26 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Z)=>{this.setState(()=>{this._state=Z(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class e26 extends u0{controller=new iZ;focusNode=new G8({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=B4.all(new V4(Z.foreground,1,"solid")),q=new Vz({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let M=D.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Z.foreground,border:null},maxLines:1}),W=new E6({children:[new b0({decoration:{color:z1.default()},child:new _1({text:new l(">",new t({color:Z.foreground}))})}),new i6({child:q})]}),H=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new t({color:Z.foreground})),new l(this.widget.props.commandName,new t({color:z1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new l("Enter",new t({color:Y.keybind}))),z.push(new l(" to submit, ",new t({color:Z.foreground,dim:!0})));z.push(new l("Esc",new t({color:Y.keybind}))),z.push(new l(" to cancel",new t({color:Z.foreground,dim:!0})));let U=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l("",void 0,z)})});return new b0({decoration:{border:K,color:z1.default()},padding:H0.all(1),child:new v0({children:[H,new Z0({height:1}),W,new v5,U]})})}}class hg extends p0{props;constructor(J){super();this.props=J}createState(){return new e26}}sW();class JJ6 extends u0{controller=new iZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new G8({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=BC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,G=j4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new FO({controller:this.controller,triggers:[new bq],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Z,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:r8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new z8({focusNode:this.focusNode,child:K}),W=new b0({constraints:new M6({maxHeight:V}),padding:H0.symmetric(1,0),child:q}),H=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new t({color:Z.foreground})),new l(this.widget.props.commandName,new t({color:z1.yellow,bold:!0}))])})}),z=new b0({padding:H0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new t({color:Y.keybind})),new l(" again to clear input",new t({color:Z.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new t({color:Z.foreground,dim:!0})),new l("Enter",new t({color:Y.keybind})),new l(" to submit, ",new t({color:Z.foreground,dim:!0})),new l("Esc",new t({color:Y.keybind})),new l(" to clear",new t({color:Z.foreground,dim:!0}))])})}),U=[H,new Z0({height:1}),new i6({child:W}),new Z0({height:1}),z];return new b0({decoration:{border:B4.all(new V4(Z.foreground,1,"solid")),color:z1.default()},padding:H0.all(1),child:new v0({children:U})})}}class yC extends p0{props;constructor(J){super();this.props=J}createState(){return new JJ6}}import{isDeepStrictEqual as XF8}from"node:util";var QF8=/[\\/_ +.#"@[({&]/,ZF8=/[\\/_ +.#"@[({&]/g,YF8=/[\s-]/,QJ6=/[\s-]/g;function k91(J,Q,Z,Y,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Y.charAt(G),W=Z.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=k91(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(YF8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(QJ6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(QF8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(ZF8),D&&X>0)z*=Math.pow(0.999,D.length)}else if(z*=0.3,X>0)z*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))z*=0.9999}if(z<0.1&&(Z.charAt(W-1)===Y.charAt(G+1)||Y.charAt(G+1)===Y.charAt(G)&&Z.charAt(W-1)!==Y.charAt(G))){if(U=k91(J,Q,Z,Y,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Z.indexOf(q,W+1)}return V[K]=H,H}function _91(J){return J.toLowerCase().replace(QJ6," ")}function ZJ6(J,Q){let Z=k91(J,Q,_91(J),_91(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=k91(J,K,_91(J),_91(K),0,0,{});if(q===0)return Z;X+=q,G+=K.length}let V=X/Y.length*0.95;return Math.max(Z,V)}return Z}class xC{}class vC{}class y91{}class x91{}class YJ6 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new XJ6}}class XJ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function $F8(J,Q){if(J==="")return{matches:!0,score:1};let Z=ZJ6(Q,J);return{matches:Z>0.15,score:Z}}class x2 extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new $J6}}class $J6 extends u0{controller=new iZ;focusNode;scrollController=new Z7;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new G8({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(!XF8(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 xC){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 vC){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 y91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Z=Q[this.selectedIndex];if(Z){if(!(this.widget.props.isItemDisabled?.(Z)??!1))this.widget.props.onAccept(Z)}}return"handled"}if(J instanceof x91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Z=Q.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...$F8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Z.slice(0,this.widget.props.maxRenderItems):Z}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 Z=0,Y=Q.size.height;S81(J,{top:Z,bottom:Y},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Z=this.getFilteredItems();if(J>=0&&J<Z.length){let Y=Z[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Z[this.selectedIndex]??null);else if(Q===2&&!X){if(Y)this.widget.props.onAccept(Y)}}};build(J){let Q=$6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=B4.all(new V4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new Vz({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new ZX({shortcuts:new Map([[new X4("ArrowDown"),new xC],[new X4("ArrowUp"),new vC],[new X4("Tab"),new xC],[new X4("Tab",{shift:!0}),new vC],[new X4("n",{ctrl:!0}),new xC],[new X4("p",{ctrl:!0}),new vC],[new X4("Enter"),new y91],[new X4("Escape"),new x91]]),focusNode:this.focusNode,child:V}),q=new UJ({actions:new Map([[xC,new P8(this.invoke)],[vC,new P8(this.invoke)],[y91,new P8(this.invoke)],[x91,new P8(this.invoke)]]),child:K}),W=new E6({children:[new b0({decoration:{color:z1.default()},child:new _1({text:new l(">",new t({color:Z.foreground}))})}),new i6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Z0({height:10,child:new S4({child:new _1({text:new l(L,new t({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new i6({child:new S4({child:new _1({text:new l(this.widget.props.emptyStateText,new t({color:Z.foreground,dim:!0}))})})});else{let L=Y.map((A,E)=>{let I=E===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,I,P,J);else{let k=I?z1.yellow:void 0,y=I?z1.black:Z.foreground;T=new b0({decoration:k?{color:k}:void 0,padding:H0.symmetric(2,0),child:new _1({text:new l(this.widget.props.getLabel(A),new t({color:y,dim:P}))})})}return new YJ6(new I8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:T}),(k)=>{this.itemContexts[E]=k})});H=new v0({children:L,crossAxisAlignment:"start"})}let z=new i6({child:new I8({onScroll:this.handleScroll,opaque:!1,child:new f5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l(this.widget.props.title,new t({color:z1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Z0({height:1}),z),this.controller.text!==""){let L=Y.length>0?Y[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new b0({padding:H0.vertical(1),child:new S4({child:A})}));else U.push(new Z0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new b0({decoration:{border:X,color:z1.default()},padding:H0.symmetric(1,0),child:new v0({children:U})})}}function GJ6(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class ik1 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()),Z=Math.max(0,...Q.map((X)=>GJ6(X.pubDate).length));return new x2({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 Z0({width:L,child:E6.end([new _1({text:new l(M,new t({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new E6({children:[new i6({child:new _1({text:new l(X.title,new t({color:z})),overflow:"ellipsis",maxLines:1})}),new Z0({width:2}),D(GJ6(X.pubDate),Z)]})})}})}}class nk1 extends p0{createState(){return new VJ6}}class VJ6 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 t({color:this.isGreen?z1.green:z1.index(8),bold:!0})),maxLines:1})}}function GF8(J){let Q=new Map,Z=new Map,Y=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Y.set(V.id,K.type);let q=K.threadID,W=Z.get(q)||[];W.push(V),Z.set(q,W)}else X.push(V)}return YX.flatten(X,(V)=>Z.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function ak1(J,Q,Z){return new _1({text:new l(`${J}${Q}`,new t({color:Z})),maxLines:1})}function VF8(J,Q,Z,Y){return[ak1("+",J,Y.success),v5.horizontal(1),ak1("~",Q,Y.warning),v5.horizontal(1),ak1("-",Z,Y.destructive)]}class v91 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 Z=this.props.recentThreadIDs||[],Y=new Set(Z),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=Z.indexOf(z.id),M=Z.indexOf(U.id);if(D!==-1&&M!==-1)return D-M;if(D!==-1)return-1;if(M!==-1)return 1;return 0}),V=GF8(G),K=Math.max(0,...V.map((z)=>z.description.timeAgo.length)),q=$6.of(J),W=new K6({padding:H0.symmetric(0,1),child:new S4({child:new _1({text:new l("",new t({color:q.colors.foreground,dim:!0}),[new l("Ctrl+T",new t({color:z1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new t({color:q.colors.foreground,dim:!0}))])})})});return new x2({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),T=(J1,c)=>new Z0({width:c,child:E6.end([new _1({text:new l(J1,new t({color:P}))})])}),k=this.props.threadViewStates[z.id],y=[],x=z.relationshipType==="handoff",m=new h81;if(z.depth>0){let J1=[],c=z.ancestorsAreLast.slice(1);for(let F1 of c)J1.push(new l(m.getAncestorPrefix(F1),new t({color:m.connectorColor,dim:m.connectorDim})));let e=z.isLast?m.elbow:m.tee,X1=m.getConnectorText(e);J1.push(new l(X1,new t({color:m.connectorColor,dim:m.connectorDim}))),y.push(new _1({text:new l("",void 0,J1)}))}let p=[],b=X===z.id?new l("(current) ",new t({color:z1.green})):Y.has(z.id)?new l("(visited) ",new t({color:A.foreground,dim:!0})):null;if(b)p.push(new _1({text:b}));if(k){if(k.state==="active"&&(k.interactionState==="tool-running"||k.inferenceState==="running"))p.push(new nk1),p.push(new Z0({width:1}))}let a=z.title;if(z.relationshipType==="fork"){let J1=a.match(/^Forked\((\d+)\): /);if(J1)a=a.slice(J1[0].length);else while(a.startsWith("Forked: "))a=a.slice(8);p.push(new _1({text:new l("[fork] ",new t({color:z1.blue}))}))}else if(x)p.push(new _1({text:new l("[handoff] ",new t({color:z1.index(208)}))}));if(p.push(new i6({child:new _1({text:new l(a,new t({color:I})),overflow:"ellipsis",maxLines:1})})),p.push(new Z0({width:2})),z.diffStats&&(z.diffStats.added>0||z.diffStats.changed>0||z.diffStats.deleted>0)){let J1=U?{success:P,warning:P,destructive:P}:A;p.push(...VF8(z.diffStats.added,z.diffStats.changed,z.diffStats.deleted,J1)),p.push(new Z0({width:2}))}return p.push(T(z.description.timeAgo,K)),new b0({decoration:E?{color:E}:void 0,padding:H0.symmetric(2,0),child:new E6({children:[...y,...p]})})}})}}function KJ6(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class ok1 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()),Z=Math.max(0,...Q.map((X)=>KJ6(X.pubDate).length));return new x2({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 Z0({width:A,child:E6.end([new _1({text:new l(L,new t({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new E6({children:[new i6({child:new _1({text:new l(X.title,new t({color:z})),overflow:"ellipsis",maxLines:1})}),new Z0({width:2}),new _1({text:new l(D,new t({color:U})),maxLines:1}),new Z0({width:2}),M(KJ6(X.pubDate),Z)]})})}})}}class rk1 extends x6{props;constructor(J){super();this.props=J}build(){return new S4({child:new _1({text:new l("",void 0,[new l(`Forked to new thread:
4541
+ ... (output truncated at ${Hz} characters)`;X({success:L,output:I.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(q)L=`Command timed out after ${Z}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";X({success:!1,output:z.join(""),error:L})})})}function tz8(J,Q){let{filePath:Z,interpreter:Y,extension:X}=J;if(process.platform==="win32")return JF8(Z,Y?[...Y]:null,X,Q);else return ez8(Z,Y?[...Y]:null,X,Q)}function ez8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];else return[J,Y]}function JF8(J,Q,Z,Y){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Y]];switch(Z.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Y]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Y]];case".exe":return[J,Y];default:return[J,Y]}}U0();LY();P7();yW();jZ();bG();sW();pK();N8();Tb();W7();x_();l0();var RJ6=q6(dM(),1);import{writeFile as EJ6}from"fs/promises";import IJ6 from"path";U0();jZ();class lk1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Z])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1765858276-g8d78e4"},parameters:{metadata:{count:Z}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await _o(Q,this.configService)}catch(Q){v.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class UO extends p0{props;constructor(J){super();this.props=J}createState(){return new t26}}class t26 extends u0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Z)=>{this.setState(()=>{this._state=Z(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class e26 extends u0{controller=new iZ;focusNode=new G8({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=B4.all(new V4(Z.foreground,1,"solid")),q=new Vz({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let M=D.trim();if(X&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Z.foreground,border:null},maxLines:1}),W=new E6({children:[new b0({decoration:{color:z1.default()},child:new _1({text:new l(">",new t({color:Z.foreground}))})}),new i6({child:q})]}),H=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new t({color:Z.foreground})),new l(this.widget.props.commandName,new t({color:z1.yellow,bold:!0}))])})}),z=[];if(V)z.push(new l("Enter",new t({color:Y.keybind}))),z.push(new l(" to submit, ",new t({color:Z.foreground,dim:!0})));z.push(new l("Esc",new t({color:Y.keybind}))),z.push(new l(" to cancel",new t({color:Z.foreground,dim:!0})));let U=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l("",void 0,z)})});return new b0({decoration:{border:K,color:z1.default()},padding:H0.all(1),child:new v0({children:[H,new Z0({height:1}),W,new v5,U]})})}}class hg extends p0{props;constructor(J){super();this.props=J}createState(){return new e26}}sW();class JJ6 extends u0{controller=new iZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new G8({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=BC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=$6.of(J),{colors:Z,app:Y}=Q,G=j4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new FO({controller:this.controller,triggers:[new bq],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(D)=>{this.widget.props.onSubmit(D.trim(),this.imageAttachments)},theme:Z,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:r8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new z8({focusNode:this.focusNode,child:K}),W=new b0({constraints:new M6({maxHeight:V}),padding:H0.symmetric(1,0),child:q}),H=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new t({color:Z.foreground})),new l(this.widget.props.commandName,new t({color:z1.yellow,bold:!0}))])})}),z=new b0({padding:H0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new t({color:Y.keybind})),new l(" again to clear input",new t({color:Z.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new t({color:Z.foreground,dim:!0})),new l("Enter",new t({color:Y.keybind})),new l(" to submit, ",new t({color:Z.foreground,dim:!0})),new l("Esc",new t({color:Y.keybind})),new l(" to clear",new t({color:Z.foreground,dim:!0}))])})}),U=[H,new Z0({height:1}),new i6({child:W}),new Z0({height:1}),z];return new b0({decoration:{border:B4.all(new V4(Z.foreground,1,"solid")),color:z1.default()},padding:H0.all(1),child:new v0({children:U})})}}class yC extends p0{props;constructor(J){super();this.props=J}createState(){return new JJ6}}import{isDeepStrictEqual as XF8}from"node:util";var QF8=/[\\/_ +.#"@[({&]/,ZF8=/[\\/_ +.#"@[({&]/g,YF8=/[\s-]/,QJ6=/[\s-]/g;function k91(J,Q,Z,Y,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Y.charAt(G),W=Z.indexOf(q,X),H=0,z,U,D,M;while(W>=0){if(z=k91(J,Q,Z,Y,W+1,G+1,V),z>H){if(W===X)z*=1;else if(YF8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(X,W-1).match(QJ6),M&&X>0)z*=Math.pow(0.999,M.length)}else if(QF8.test(J.charAt(W-1))){if(z*=0.8,D=J.slice(X,W-1).match(ZF8),D&&X>0)z*=Math.pow(0.999,D.length)}else if(z*=0.3,X>0)z*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))z*=0.9999}if(z<0.1&&(Z.charAt(W-1)===Y.charAt(G+1)||Y.charAt(G+1)===Y.charAt(G)&&Z.charAt(W-1)!==Y.charAt(G))){if(U=k91(J,Q,Z,Y,W+1,G+2,V),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Z.indexOf(q,W+1)}return V[K]=H,H}function _91(J){return J.toLowerCase().replace(QJ6," ")}function ZJ6(J,Q){let Z=k91(J,Q,_91(J),_91(Q),0,0,{}),Y=Q.trim().split(/\s+/);if(Y.length>1){let X=0,G=0;for(let K of Y){let q=k91(J,K,_91(J),_91(K),0,0,{});if(q===0)return Z;X+=q,G+=K.length}let V=X/Y.length*0.95;return Math.max(Z,V)}return Z}class xC{}class vC{}class y91{}class x91{}class YJ6 extends p0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new XJ6}}class XJ6 extends u0{build(J){return this.widget.onContext(J),this.widget.child}}function $F8(J,Q){if(J==="")return{matches:!0,score:1};let Z=ZJ6(Q,J);return{matches:Z>0.15,score:Z}}class x2 extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new $J6}}class $J6 extends u0{controller=new iZ;focusNode;scrollController=new Z7;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new G8({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(!XF8(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 xC){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 vC){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 y91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Z=Q[this.selectedIndex];if(Z){if(!(this.widget.props.isItemDisabled?.(Z)??!1))this.widget.props.onAccept(Z)}}return"handled"}if(J instanceof x91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Z=Q.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...$F8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Z.slice(0,this.widget.props.maxRenderItems):Z}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 Z=0,Y=Q.size.height;S81(J,{top:Z,bottom:Y},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),S8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Z=this.getFilteredItems();if(J>=0&&J<Z.length){let Y=Z[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Z[this.selectedIndex]??null);else if(Q===2&&!X){if(Y)this.widget.props.onAccept(Y)}}};build(J){let Q=$6.of(J),{colors:Z}=Q,Y=this.getFilteredItems(),X=B4.all(new V4(Z.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new Vz({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Z.foreground,border:null},maxLines:1}),K=new ZX({shortcuts:new Map([[new X4("ArrowDown"),new xC],[new X4("ArrowUp"),new vC],[new X4("Tab"),new xC],[new X4("Tab",{shift:!0}),new vC],[new X4("n",{ctrl:!0}),new xC],[new X4("p",{ctrl:!0}),new vC],[new X4("Enter"),new y91],[new X4("Escape"),new x91]]),focusNode:this.focusNode,child:V}),q=new UJ({actions:new Map([[xC,new P8(this.invoke)],[vC,new P8(this.invoke)],[y91,new P8(this.invoke)],[x91,new P8(this.invoke)]]),child:K}),W=new E6({children:[new b0({decoration:{color:z1.default()},child:new _1({text:new l(">",new t({color:Z.foreground}))})}),new i6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Z0({height:10,child:new S4({child:new _1({text:new l(L,new t({color:Z.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)H=new i6({child:new S4({child:new _1({text:new l(this.widget.props.emptyStateText,new t({color:Z.foreground,dim:!0}))})})});else{let L=Y.map((A,E)=>{let I=E===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,I,P,J);else{let k=I?z1.yellow:void 0,y=I?z1.black:Z.foreground;T=new b0({decoration:k?{color:k}:void 0,padding:H0.symmetric(2,0),child:new _1({text:new l(this.widget.props.getLabel(A),new t({color:y,dim:P}))})})}return new YJ6(new I8({onClick:(k)=>this.handleItemClick(E,k.clickCount),child:T}),(k)=>{this.itemContexts[E]=k})});H=new v0({children:L,crossAxisAlignment:"start"})}let z=new i6({child:new I8({onScroll:this.handleScroll,opaque:!1,child:new f5({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l(this.widget.props.title,new t({color:z1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Z0({height:1}),z),this.controller.text!==""){let L=Y.length>0?Y[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new b0({padding:H0.vertical(1),child:new S4({child:A})}));else U.push(new Z0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new b0({decoration:{border:X,color:z1.default()},padding:H0.symmetric(1,0),child:new v0({children:U})})}}function GJ6(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class ik1 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()),Z=Math.max(0,...Q.map((X)=>GJ6(X.pubDate).length));return new x2({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 Z0({width:L,child:E6.end([new _1({text:new l(M,new t({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new E6({children:[new i6({child:new _1({text:new l(X.title,new t({color:z})),overflow:"ellipsis",maxLines:1})}),new Z0({width:2}),D(GJ6(X.pubDate),Z)]})})}})}}class nk1 extends p0{createState(){return new VJ6}}class VJ6 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 t({color:this.isGreen?z1.green:z1.index(8),bold:!0})),maxLines:1})}}function GF8(J){let Q=new Map,Z=new Map,Y=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Y.set(V.id,K.type);let q=K.threadID,W=Z.get(q)||[];W.push(V),Z.set(q,W)}else X.push(V)}return YX.flatten(X,(V)=>Z.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function ak1(J,Q,Z){return new _1({text:new l(`${J}${Q}`,new t({color:Z})),maxLines:1})}function VF8(J,Q,Z,Y){return[ak1("+",J,Y.success),v5.horizontal(1),ak1("~",Q,Y.warning),v5.horizontal(1),ak1("-",Z,Y.destructive)]}class v91 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 Z=this.props.recentThreadIDs||[],Y=new Set(Z),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=Z.indexOf(z.id),M=Z.indexOf(U.id);if(D!==-1&&M!==-1)return D-M;if(D!==-1)return-1;if(M!==-1)return 1;return 0}),V=GF8(G),K=Math.max(0,...V.map((z)=>z.description.timeAgo.length)),q=$6.of(J),W=new K6({padding:H0.symmetric(0,1),child:new S4({child:new _1({text:new l("",new t({color:q.colors.foreground,dim:!0}),[new l("Ctrl+T",new t({color:z1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new t({color:q.colors.foreground,dim:!0}))])})})});return new x2({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),T=(J1,c)=>new Z0({width:c,child:E6.end([new _1({text:new l(J1,new t({color:P}))})])}),k=this.props.threadViewStates[z.id],y=[],x=z.relationshipType==="handoff",m=new h81;if(z.depth>0){let J1=[],c=z.ancestorsAreLast.slice(1);for(let F1 of c)J1.push(new l(m.getAncestorPrefix(F1),new t({color:m.connectorColor,dim:m.connectorDim})));let e=z.isLast?m.elbow:m.tee,X1=m.getConnectorText(e);J1.push(new l(X1,new t({color:m.connectorColor,dim:m.connectorDim}))),y.push(new _1({text:new l("",void 0,J1)}))}let p=[],b=X===z.id?new l("(current) ",new t({color:z1.green})):Y.has(z.id)?new l("(visited) ",new t({color:A.foreground,dim:!0})):null;if(b)p.push(new _1({text:b}));if(k){if(k.state==="active"&&(k.interactionState==="tool-running"||k.inferenceState==="running"))p.push(new nk1),p.push(new Z0({width:1}))}let a=z.title;if(z.relationshipType==="fork"){let J1=a.match(/^Forked\((\d+)\): /);if(J1)a=a.slice(J1[0].length);else while(a.startsWith("Forked: "))a=a.slice(8);p.push(new _1({text:new l("[fork] ",new t({color:z1.blue}))}))}else if(x)p.push(new _1({text:new l("[handoff] ",new t({color:z1.index(208)}))}));if(p.push(new i6({child:new _1({text:new l(a,new t({color:I})),overflow:"ellipsis",maxLines:1})})),p.push(new Z0({width:2})),z.diffStats&&(z.diffStats.added>0||z.diffStats.changed>0||z.diffStats.deleted>0)){let J1=U?{success:P,warning:P,destructive:P}:A;p.push(...VF8(z.diffStats.added,z.diffStats.changed,z.diffStats.deleted,J1)),p.push(new Z0({width:2}))}return p.push(T(z.description.timeAgo,K)),new b0({decoration:E?{color:E}:void 0,padding:H0.symmetric(2,0),child:new E6({children:[...y,...p]})})}})}}function KJ6(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/60000),X=Math.floor(Z/3600000),G=Math.floor(Z/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class ok1 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()),Z=Math.max(0,...Q.map((X)=>KJ6(X.pubDate).length));return new x2({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 Z0({width:A,child:E6.end([new _1({text:new l(L,new t({color:U}))})])});return new b0({decoration:H?{color:H}:void 0,padding:H0.symmetric(2,0),child:new E6({children:[new i6({child:new _1({text:new l(X.title,new t({color:z})),overflow:"ellipsis",maxLines:1})}),new Z0({width:2}),new _1({text:new l(D,new t({color:U})),maxLines:1}),new Z0({width:2}),M(KJ6(X.pubDate),Z)]})})}})}}class rk1 extends x6{props;constructor(J){super();this.props=J}build(){return new S4({child:new _1({text:new l("",void 0,[new l(`Forked to new thread:
4542
4542
 
4543
4543
  `,new t({color:z1.white,dim:!0})),new l(`"${this.props.newThreadTitle||"Untitled"}"`,new t({color:z1.white}))]),textAlign:"center"})})}}U0();class qJ6 extends u0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let J=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!J.ok){v.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){v.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){if(J.length===0)return null;if(J.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(J))return"Label must be lowercase alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null&&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 Z=this.widget.props.currentLabels||[],Y=this.labels.some((G)=>G.name===Q),X=Z.includes(Q);return!Y&&!X}build(J){let Q=$6.of(J),{colors:Z}=Q,Y=this.currentQuery.trim().toLowerCase(),X=Y.length>0?this.getValidationError(Y):null,G=this.getAvailableLabels(),K=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...G];return new x2({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:Z.foreground;if("__isCreateMarker"in q&&q.__isCreateMarker){let L=this.currentQuery.trim().toLowerCase();return new b0({decoration:U?{color:U}:void 0,padding:H0.symmetric(2,0),child:new _1({text:new l("",void 0,[new l("Create new label: ",new t({color:D})),new l(L,new t({color:D,bold:!0}))])})})}return new b0({decoration:U?{color:U}:void 0,padding:H0.symmetric(2,0),child:new _1({text:new l(q.name,new t({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 sk1 extends p0{props;constructor(J){super();this.props=J}createState(){return new qJ6}}class wV extends p0{props;constructor(J){super();this.props=J}createState(){return new WJ6}}class WJ6 extends u0{_spinner=new $X;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(J){let Q=$6.of(J),{colors:Z}=Q,Y=B4.all(new V4(Z.foreground,1,"solid")),X=this._spinner.toBraille(),G=new _1({textAlign:"center",text:new l("",void 0,[new l(X,new t({color:z1.yellow})),new l(" ",void 0),new l(this.widget.props.message,new t({color:Z.foreground}))])}),K=[new i6({child:new v0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[G]})})];if(this.widget.props.onAbort)K.push(new Z0({height:2,child:new b0({padding:H0.symmetric(2,0),child:new _1({text:new l("",new t({dim:!0}),[new l("Press ",new t({color:Z.foreground})),new l("Esc",new t({color:Z.info})),new l(" to cancel",new t({color:Z.foreground}))])})})}));let q=new b0({decoration:new M8(z1.default(),Y),child:new Z0({width:60,height:7,child:new v0({mainAxisAlignment:"start",children:K})})});if(this.widget.props.onAbort)return new z8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:q});return q}}class EV extends p0{props;constructor(J){super();this.props=J}createState(){return new HJ6}}class HJ6 extends u0{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof AV}build(J){let Q=this.widget.props.message,Z=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let W=y81(Q);return{title:W.title,type:W.type,description:W.description}})(),Y=Z.type==="error"?z1.red:z1.yellow,X=B4.all(new V4(z1.default(),1,"solid")),G=new b0({padding:H0.symmetric(1,0),child:new _1({text:new l(Z.title,new t({color:Y,bold:!0}))})}),V=this.isWidgetMessage(Q)?Q.widget:new _1({text:new l(Z.description,new t({color:z1.default()})),selectable:!0}),K=new i6({child:new Xz({child:new b0({padding:H0.symmetric(1,0),child:V})})}),q=new b0({padding:H0.symmetric(1,0),child:new _1({text:this.widget.props.onRetry?new l("",void 0,[new l("Press ",new t({color:z1.default(),dim:!0})),new l("R",new t({color:z1.yellow})),new l(" to retry, ",new t({color:z1.default(),dim:!0})),new l("Esc",new t({color:z1.yellow})),new l(" to cancel",new t({color:z1.default(),dim:!0}))]):new l("Press any key to close",new t({color:z1.default(),dim:!0,italic:!0}))})});return new z8({onKey:(W)=>{if(this.widget.props.onRetry&&W.key==="r")return this.widget.props.onRetry(),"handled";if(W.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!0,child:new b0({decoration:{border:X,color:z1.default()},padding:H0.all(1),child:new v0({mainAxisAlignment:"center",children:[G,new Z0({height:1}),K,q]})})})}}class tk1 extends x6{build(){return new S4({child:new _1({text:new l("",void 0,[new l(`✓ Thread Shared
4544
4544
 
@@ -4631,7 +4631,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
4631
4631
  `)?`${K}...`:X,W=new t({color:z1.index(8)}),H=[new l(q,W)];if(V>0){let z=new t({color:Z.success});for(let U=1;U<=V;U++)H.push(new l(" ")),H.push(new l(`[${U}]`,z))}return new K6({padding:H0.only({bottom:0}),child:new E6({crossAxisAlignment:"start",children:[new K6({padding:H0.only({right:1}),child:new _1({text:new l("•",new t({color:z1.index(8)}))})}),new i6({child:new _1({text:new l("",void 0,H)})})]})})}}class my1 extends p0{createState(){return new AQ6}}class AQ6 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 t({color:z1.red}),Z=new t({color:this._visible?z1.red:z1.transparent()});return new E6({children:[new _1({text:new l("⏺",Z)}),new Z0({width:1}),new _1({text:new l("Replay",Q)})]})}}class gy1 extends x6{entry;width;constructor({key:J,entry:Q,width:Z}){super({key:J});this.entry=Q,this.width=Z}build(J){let Z=$6.of(J).colors.mutedForeground,Y=this.entry,X=Y.authors[0]?.name||"Community";if(X.includes("@"))X=X.split("@")[0]??X;let G=" · ",V=50,K=this.truncateToWidth(Y.title,V),q=`${G}${K}`,W=Math.max(1,this.width-q.length-2),H=Y.description.replace(/\s+/g," ").trim(),z=`@${X}: ${H}`,U=this.truncateToWidth(z,W),D=new _1({text:new l(U,new t({color:Z,dim:!0}))}),M=new _1({text:new l(q,new t({color:Z,dim:!0}))});return new I8({onClick:()=>y2(J,Y.link),cursor:"pointer",child:new Z0({width:this.width,height:1,child:new K6({padding:H0.horizontal(1),child:new E6({children:[new i6({child:new DC(new Z0({width:W,height:1,child:D}))}),M]})})})})}truncateToWidth(J,Q){if(J.length<=Q)return J;return J.slice(0,Q-1)+"…"}}l0();function PU8(J){let Z=new Date().getTime()-J.getTime(),Y=Math.floor(Z/3600000),X=Math.floor(Y/24),G=Math.floor(X/7),V=Math.floor(X/30);if(Y<1)return"Just now";if(Y<24)return`${Y}h ago`;if(X<7)return`${X}d ago`;if(G<=4)return`${G}w ago`;return`${V}mo ago`}class uy1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Z)=>{let Y=this.threadHistoryService.observeThreadList().subscribe((X)=>{Y.unsubscribe(),Z(X)})});return{ok:!0,threads:this.formatThreadSummaries(Q,J)}}catch(Q){return{ok:!1,errorMsg:Q instanceof Error?Q.message:"An unexpected error occurred"}}}observeThreadSummaries(J=""){return this.threadHistoryService.observeHistory().pipe(J6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((Y)=>{if(!Q.trim())return!0;let X=Y.title?.toLowerCase()||"untitled",G=Y.id.toLowerCase(),V=Q.toLowerCase();return X.includes(V)||G.includes(V)}).map((Y)=>{let X=new Date(Y.userLastInteractedAt),G=PU8(X),V=Y.id.slice(-8),K=Y.env?.initial.trees?.[0]?.uri;return{id:Y.id,title:Y.title||"Untitled",updatedAt:new Date(Y.userLastInteractedAt).toISOString(),description:{timeAgo:G,title:Y.title||"Untitled",shortThreadID:V},diffStats:Y.summaryStats?.diffStats,workspaceURI:K,parentRelationships:Y.parentRelationships,agentMode:Y.agentMode}})}}U0();N8();class py1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new Z7;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){v.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){v.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe($M()).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 OQ6(J,Q){switch(J){case"update-available":return[new l("A newer Amp is available. Run ",new t({color:Q.foreground,dim:!0})),new l("amp update",new t({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new l("Update complete, run ",new t({color:Q.foreground,dim:!0})),new l("amp update",new t({color:Q.warning})),new l(" to see warnings",new t({color:Q.foreground,dim:!0}))];case"update-error":return[new l("Update failed, run ",new t({color:Q.foreground,dim:!0})),new l("amp update",new t({color:Q.warning})),new l(" to see warnings",new t({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function SU8(J){return new Promise((Q)=>{TU8("git",["branch","--show-current"],{cwd:J},(Z,Y)=>{if(Z){Q(null);return}let X=Y.trim();Q(X||null)})})}class RQ6 extends p0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new G51}}class G51 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 py1;previewThread=null;todoScrollController=(()=>{let J=new Z7;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new G8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new G8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;adActionModal=null;threadFeedReader=null;currentThreadFeedEntry=null;threadFeedEntries=[];threadFeedSubscription=null;threadFeedRotationTimer=null;threadFeedHidden=!1;threadFeedTickerQueue=[];hasSubmittedFirstMessage=!1;currentUserInfo=null;newsFeedReader=null;newsFeedEntries=[];newsFeedSubscription=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;pendingMCPServers=[];mcpTrustSubscription=null;pendingOAuthRequest=null;mcpServers=[];mcpServersSubscription=null;cacheTimerState=null;cacheTimerSubscription=null;agentModeController=null;freeTierStatus={canUseAmpFree:!1};agentModePulseSeq=0;agentModeSlideProgress=null;agentModeSlideTimer=null;updateState="hidden";updateServiceSubscription=null;toastController=new TS1;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 H6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Z=Q.includes("localhost")||Q.includes("127.0.0.1");try{let V=await this.widget.dependencies.internalAPIClient.getUserInfo({},{config:this.widget.dependencies.configService});if(V.ok){let K=V.result,q="user"in K?K.user:K;this.currentUserInfo={username:q.username??void 0,displayName:q.displayName??void 0};let W="ffe10a0c-6c42-41ce-a3a6-38990fd6caf8";if(!Z&&K.team?.id!==W)return}else return}catch(V){v.debug("Failed to fetch user info for thread feed filtering",V);return}let Y="/threads.rss",X=async(V,K)=>{let q=V instanceof Request?V.url:V.toString();return g7(q,K,this.widget.dependencies.configService)},G=YP1();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 dj1(G,X,{url:Y}),this.threadFeedSubscription=this.threadFeedReader.stream().subscribe({next:(V)=>{try{let K=this.filterEntries(V);if(K.length>0){this.threadFeedEntries=[...K,...this.threadFeedEntries];let q=[...K].sort((W,H)=>H.pubDate.getTime()-W.pubDate.getTime());if(this.threadFeedTickerQueue=[...q,...this.threadFeedTickerQueue],!this.currentThreadFeedEntry){let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}catch(K){v.error("Thread feed: error in next handler",K)}},error:(V)=>{v.error("Thread feed error:",V)}}),this.resetThreadFeedRotation()}filterEntries(J){if(!this.currentUserInfo)return J;let{username:Q,displayName:Z}=this.currentUserInfo;return J.filter((Y)=>{return!Y.authors.some((X)=>{let G=X.name;if(!G)return!1;return Q&&G===Q||Z&&G===Z||Q&&G.includes(Q)})})}rotateThreadFeed(){if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);this.threadFeedRotationTimer=setInterval(()=>{let J=this.getNextFeedEntry();if(J)this.setState(()=>{this.currentThreadFeedEntry=J})},30000)}resetThreadFeedRotation(){this.rotateThreadFeed()}getNextFeedEntry(){if(this.threadFeedTickerQueue.length>0)return this.threadFeedTickerQueue.shift();return null}async initNewsFeed(){let J=async(Z)=>{return g7(Z,void 0,this.widget.dependencies.configService)},Q=YP1();this.newsFeedReader=new pj1(Q,J,"/news.rss"),this.newsFeedSubscription=this.newsFeedReader.stream().subscribe({next:(Z)=>{if(Z.length>0)this.setState(()=>{this.newsFeedEntries=[...Z,...this.newsFeedEntries]})},error:(Z)=>{v.error("News feed error:",Z)}})}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1,this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Z,baseWpm:Y}=J,X=Q.messages;for(let G=0;G<X.length;G++){if(this.replayAbortController.signal.aborted)break;let V=X[G];if(!V)continue;if(G>0)await this.replaySleep(J.messageDelayMs);if(V.role==="user"&&Z){let W=V.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
4632
4632
  `);if(W)await this.replayTypeMessage(W,Y)}if(V.role==="assistant"){let W=V.content.some((U)=>U.type==="tool_use"),H=X[G+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...V,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let D=J.thread.id;this.getMessageScrollController(D).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),V]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,V],this.textController.clear()});let K=J.thread.id;this.getMessageScrollController(K).scrollToBottom()}await this.replaySleep(J.exitDelayMs),r8.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Z=J.split(/(?<=\s)/),Y=60000/Q;for(let X of Z){if(this.replayAbortController.signal.aborted)break;if(this.looksLikePastedContent(X.trim())){await this.replaySleep(150),this.textController.text=this.textController.text+X,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{}),await this.replaySleep(300);continue}let G=Y/X.length;for(let V of X){this.textController.text=this.textController.text+V,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let K=0.8+Math.random()*0.4,q=G*K;await this.replaySleep(q)}}}looksLikePastedContent(J){if(/^[a-z][a-z0-9+.-]*:\/\//i.test(J))return!0;if(J.startsWith("/")&&J.length>10)return!0;if(/^[a-z]:\\/i.test(J))return!0;if(/^[a-f0-9]{7,40}$/i.test(J))return!0;if(/^T-[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(J))return!0;return!1}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return this.agentModeController?.getEffectiveMode()??"smart"}isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;if(J.viewState.state!=="active")return!1;if(Boolean(J.viewState.inferenceState==="running"))return!0;let Z=J.items.filter((G)=>G.type==="toolResult").filter((G)=>G.toolResult.run.status==="in-progress"||G.toolResult.run.status==="queued"),Y=J.subagentActiveTools.filter((G)=>G.toolRun.status==="in-progress"||G.toolRun.status==="queued");return[...Z,...Y].length>0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new l(this.submitDisabledHint,new t({color:J.foreground,dim:!0}));if(this.isExiting)return new l("Exiting...",new t({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new l("",void 0,[new l("Ctrl+C",new t({color:Q.keybind})),new l(" again to exit",new t({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new l("",void 0,[new l("Esc",new t({color:Q.keybind})),new l(" again to clear input",new t({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new l("",void 0,[new l("Escape",new t({color:Q.keybind})),new l(" to close help",new t({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let Y=this.getEffectiveAgentMode(),X=iy1(Y);return new l("",void 0,[new l("Images aren't supported in ",new t({color:J.warning,dim:!1})),new l(Y,new t({color:X})),new l(" mode.",new t({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new l("",void 0,[new l("Esc",new t({color:Q.keybind})),new l(" again to cancel",new t({color:J.foreground,dim:!0}))]);return new l("",void 0,[new l("Esc",new t({color:Q.keybind})),new l(" to cancel",new t({color:J.foreground,dim:!0}))])}if(this.statusMessage)return new l(this.statusMessage,new t({color:J.foreground,dim:!0}));let Z=OQ6(this.updateState,J);if(Z)return new l("",void 0,Z);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Z}=this.widget.dependencies;if(!Q.mainThread?.id)return;let X=Q.mainThread?.messages.findIndex((G)=>G===J);if(X===void 0||X===-1)return;try{this.cancelBashInvocations(),await Z.cancel(),await Z.handle({type:"thread:truncate",fromIndex:X}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(G){v.error("Failed to edit message:",G)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Z,threadSyncService:Y}=this.widget.dependencies,X=Q.mainThread?.id;if(!X)return;let G=Q.mainThread?.messages.findIndex((V)=>V===J);if(G===void 0||G<=0)return;try{let V=await b3.getOrCreateForThread(Z,X),K=await DT(V,Y,G-1);await this.switchToExistingThread(K)}catch(V){v.error("Failed to fork thread:",V),this.showErrorMessage(`Failed to fork thread: ${V}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Z,worker:Y}=this.widget.dependencies,X=Z.mainThread;if(!X)return;let G=X.messages.findIndex((V)=>V.messageId!==void 0&&V.messageId===J.messageId);if(G===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),this.widget.dependencies.history.add(Q);let V=aB(Q);if(V)await Y.handle({type:"thread:truncate",fromIndex:G}),this.invokeBashCommand(V.cmd,{visibility:V.visibility});else{let K=[{type:"text",text:Q}];if(this.imageAttachments.length>0)K.push(...this.imageAttachments);let q={content:K,agentMode:X.agentMode},W=G===0;if(X.agentMode&&!W&&q.agentMode!==X.agentMode){v.error(`Cannot edit message: This thread uses ${X.agentMode} mode. To change mode, create a new thread.`);return}await Y.handle({type:"user:message",message:q,index:G})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(V){v.error("Failed to edit message:",V)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(j3)}catch(Z){return v.error("Failed to get affected files:",Z),[]}};textController=new iZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new Z7);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let Y=this.searchElementTreeByKey(J.child,Q);if(Y)return Y}if(J?.children)for(let Y of J.children){let X=this.searchElementTreeByKey(Y,Q);if(X)return X}return null}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{this.toastController.show("Selection copied to clipboard","success",2000)}}}updateTerminalTitle(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.title;if(Q!==this.currentTitle){this.currentTitle=Q;let Z=process.cwd().replace(process.env.HOME||"","~"),Y=Q?`amp - ${Q} - ${Z}`:"";process.stdout.write(oC1(Y))}}_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=aB(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(Z){let Y=Z instanceof Error?Z.message:String(Z);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Y}`)})}this.widget.dependencies.ideClient.selectConfig(J),this.dismissIdePicker()};async connectToSelectedIde(J,Q){await this.widget.dependencies.ideClient.start(J,!0,Q)}previewControllerListener=(J)=>{this.setState(()=>{this.previewThread=J})};showStandaloneThreadPicker=()=>{this.showCommandPalette({type:"standalone",commandId:"continue",onSubmit:()=>{this.threadPreviewController.clear(),this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null}),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 Ky1(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 Hy1(this.widget.dependencies.fuzzyServer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Z}=this.widget.dependencies;if(!Q.mainThread)return null;let Y=f0.file(process.cwd()),X=C6(Y);return{recentThreadIDs:Z,currentThreadID:Q.mainThread.id,context:J,worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:Q.mainThread,ampURL:this.widget.dependencies.ampURL,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 j91("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 v.error("Failed to create handoff thread",H),{ok:!1,error:H instanceof Error?H:Error(String(H))}}},getGuidanceFiles:async(G)=>{if(!Q.mainThread)return[];return(await wr({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 uy1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=wJ6(Q),this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await SU8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Z=Date.now(),Y=`bash-${Z}-${Math.random().toString(36).substring(7)}`,X={cmd:J},G=new AbortController;this.widget.dependencies.worker.invokeBashTool(X,G.signal,Q===nB).subscribe({next:(V)=>{this.setState(()=>{if(this.bashInvocations.find((q)=>q.id===Y))this.bashInvocations=this.bashInvocations.map((q)=>q.id===Y?{...q,toolRun:V}:q);else{let q={id:Y,args:X,toolRun:V,startTime:Z,abortController:G,hidden:Q===nB};this.bashInvocations=[...this.bashInvocations,q]}})},error:()=>this.removeBashInvocation(Y),complete:()=>this.removeBashInvocation(Y)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};showContextDetailOverlay=()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!0}),this.fetchThreadCostInfo()};fetchThreadCostInfo=h86(()=>{let J=this.widget.dependencies.threadID;this.widget.dependencies.internalAPIClient.threadDisplayCostInfo({threadID:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(Q.ok)this.setState(()=>{this.threadCostInfo=Q.result,this.threadCostInfoThreadID=J})}).catch(()=>{this.setState(()=>{this.threadCostInfo=void 0,this.threadCostInfoThreadID=J})})},150);maybeRefetchThreadCostInfo=(J,Q)=>{let Z=J!==this.threadCostInfoLastUsageLedgerLength,Y=Q==="idle"&&this.lastInferenceState==="running";if(this.threadCostInfoLastUsageLedgerLength=J,this.lastInferenceState=Q,Z||Y)this.fetchThreadCostInfo()};toggleAgentMode=()=>{if(!this.agentModeController)return;if(this.agentModeController.toggle())this.setState(()=>{this.showImageUnsupportedHint=!1,this.agentModePulseSeq++})};startAgentModeSlide=()=>{if(this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer);this.setState(()=>{this.agentModeSlideProgress=0});let J=400,Q=16,Z=Q/J;this.agentModeSlideTimer=setInterval(()=>{this.setState(()=>{if(this.agentModeSlideProgress!==null){if(this.agentModeSlideProgress=Math.min(1,this.agentModeSlideProgress+Z),this.agentModeSlideProgress>=1){if(this.agentModeSlideProgress=null,this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null}}})},Q)};handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!ek(Q)){if(this.imageUnsupportedHintTimer)clearTimeout(this.imageUnsupportedHintTimer);return this.setState(()=>{this.showImageUnsupportedHint=!0}),this.imageUnsupportedHintTimer=setTimeout(()=>{this.setState(()=>{this.showImageUnsupportedHint=!1}),this.imageUnsupportedHintTimer=null},5000),!1}if(this.imageAttachments.length>=eF)return!1;let Z=BC(J);if(typeof Z==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Z]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Z}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};handleShowMysteryModal=()=>{if(this.mysteriousMessage)this.setState(()=>{this.isShowingMysteriousMessageModal=!0})};handleDestructMysteriousMessage=()=>{if(!this.mysteriousMessage)return;let J=this.mysteriousMessage.id;this.widget.dependencies.internalAPIClient.markAsReadMysteriousMessage({messageId:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(!Q.ok)v.error("Failed to destruct mysterious message",Q.error);else this.setState(()=>{this.mysteriousMessage=null,this.isShowingMysteriousMessageModal=!1})}).catch((Q)=>{v.error("Failed to destruct mysterious message",Q)})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Z,unlink:Y,rmdir:X,writeFile:G}=await import("node:fs/promises"),{tmpdir:V}=await import("node:os"),K=await import("node:path");try{let q=await Q(K.join(V(),"amp-edit-")),W=K.join(q,"message.amp.md");await G(W,J,"utf-8"),await x$(W);try{let H=await Z(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")v.error("Failed to read temporary file",H)}try{await Y(W),await X(q)}catch(H){v.warn("Failed to clean up temporary file",H)}}catch(q){v.error("Error opening editor:",q)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=aB(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(sY.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();r8.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),r8.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),r8.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Z)=>{S8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Z.hasFocus})})}),H6(this.widget.dependencies.configService.config).then((Z)=>{this.paletteConfig=Z,this.agentModeController=new oj1({initialCliMode:this.widget.dependencies.initialAgentMode,sessionState:this.widget.dependencies.sessionState??null,freeTierStatus:this.freeTierStatus,initialSettings:Z.settings,config$:this.widget.dependencies.configService.config,getThread:()=>this.widget.dependencies.getCurrentWorker()?.thread??this.widget.dependencies.worker.thread}),this.agentModeController.addListener(this.agentModeListener)}),this.updateGitBranch(),this.balanceInfoSubscription=N06(async()=>{let Z=await this.widget.dependencies.internalAPIClient.userDisplayBalanceInfo({},{config:this.widget.dependencies.configService});if(!Z.ok)throw Z.error;return Z.result}).subscribe({next:(Z)=>{this.setState(()=>{this.userDisplayBalanceInfo=Z})},error:(Z)=>{v.debug("Failed to fetch user balance info",Z)}}),this.scheduleAdSubscriptionWithIdeReadiness();let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Z)=>{this.setState(()=>{this.pendingMCPServers=Z})}),IC1((Z)=>{this.setState(()=>{this.pendingOAuthRequest=Z})}),this.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Z)=>{this.setState(()=>{this.mcpServers=Z})}),this.cacheTimerSubscription=this.widget.dependencies.worker.cacheTimer.subscribe((Z)=>{this.setState(()=>{this.cacheTimerState=Z})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Z)=>{let Y=this.isIdeReadyForAdContext();if(this.setState(()=>{this.ideStatus=Z}),!Y&&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(Z)=>{let Y=this.widget.dependencies.getCurrentWorker();if(!Y){v.warn("No active thread worker found to handle IDE message");return}await new Promise((X)=>setTimeout(X,50)),await Y.handle({type:"user:message",message:{content:[{type:"text",text:Z}]}}),v.debug("Message sent from IDE to agent",{message:Z.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Z)=>{this.textController.insertText(Z),v.debug("Appended text to CLI prompt from IDE",{text:Z.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Z)=>{this.setState(()=>{this.connectedClientsStatus=Z})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Z)=>{this.setState(()=>{this.updateState=Z})}),this.mysteriousMessageSubscription=X81(this.widget.dependencies.configService).pipe(U5((Z)=>Z!=="pending"),J6((Z)=>$81(Z)?Z.mysteriousMessage??null:null),H4((Z,Y)=>Z?.id===Y?.id)).subscribe((Z)=>{this.setState(()=>{if(Z?.id!==this.mysteriousMessage?.id)this.isShowingMysteriousMessageModal=!1;if(this.mysteriousMessage=Z,Z&&!this.mysterySequenceManager)this.mysterySequenceManager=new w81(new Map([[new O81(G51.MYSTERY_SEQUENCE),new Ag]])),this.mysteryKeyInterceptorUnsubscribe=r8.instance.addKeyInterceptor((Y)=>{if(!this.mysterySequenceManager)return!1;if(this.isShowingMysteriousMessageModal)return!1;let X=this.mysterySequenceManager.handleKeyEvent(Y);if(X.consumed){if(X.intent)this.handleShowMysteryModal();return this.setState(()=>{this.mysterySequenceProgress=X.progress}),!0}else if(this.mysterySequenceProgress)this.setState(()=>{this.mysterySequenceProgress=null});return!1});else if(!Z)this.mysteryKeyInterceptorUnsubscribe?.(),this.mysteryKeyInterceptorUnsubscribe=null,this.mysterySequenceManager?.dispose(),this.mysterySequenceManager=null,this.mysterySequenceProgress=null})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Z)=>{let Y=Z instanceof Error?Z.message:String(Z);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Y}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showIdePickerHint)this.toastController.show("Use /ide to connect to an IDE","success",5000);else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100);this.initThreadFeed(),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:Z}=this.widget.dependencies;this.maybeRefetchThreadCostInfo(Z.mainThread?.usageLedger?.events.length??0,Z.viewState.state==="active"?Z.viewState.inferenceState:void 0)}dispose(){if(this.replayAbortController.abort(),this.replayTypingTimer)clearTimeout(this.replayTypingTimer);if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeController)this.agentModeController.removeListener(this.agentModeListener),this.agentModeController.dispose();if(this.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(IC1(null),this.mcpServersSubscription)this.mcpServersSubscription.unsubscribe();if(this.cacheTimerSubscription)this.cacheTimerSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.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(oC1("")),this.shouldUseProgressBar())process.stdout.write(b46())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,Y=[...J.items.filter((K)=>K.type==="toolResult").map((K)=>({toolUse:K.toolUse,toolRun:K.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((K)=>K.toolRun.status==="blocked-on-user");if(Y.length===0)return null;let X=Y[0],G=X.toolRun.status==="blocked-on-user"?X.toolRun.toAllow??[]:[],V=X.toolRun.status==="blocked-on-user"?X.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:X.toolUse,toAllow:G}],subthreadID:X.subthreadID,reason:V}}shouldUseProgressBar(){return!1}updateProgressBar(){}static AD_READINESS_TIMEOUT_MS=1000;scheduleAdSubscriptionWithIdeReadiness(){if(this.isIdeReadyForAdContext()){this.subscribeToAds();return}this.adReadinessTimeout=setTimeout(()=>{if(this.adReadinessTimeout=null,!this.adSubscription)this.subscribeToAds()},G51.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=Bj1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let J=this.agentModeController?.getMode();return(J&&F9(J)||this.randomAd===null)&&Uj1(this.lastUserInteractionTime)},this.widget.dependencies.codebaseContextService).subscribe({next:(J)=>{if(J){let Q=CU8(16).toString("hex");this.lastAdImpressionId=Q,Promise.resolve().then(() => ($51(),X51)).then(({recordAdEvent:Z})=>{let Y=this.widget.dependencies.worker.thread,X=Y.messages[Y.messages.length-1];Z("viewed",{adId:J.id,advertiserId:J.advertiserId,threadId:Y.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"){v.error("No current tool confirmation found");return}let Z=Q.tools[0]?.useBlock;if(!Z){v.error("No tool use block found in confirmation");return}if(J==="allow-all-session")wG("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(X){if(X&&X instanceof Error)this.setState(()=>{this.displayMessage=X});else v.error("Failed to write dangerouslyAllowAll setting:",X);return}if(J==="always-guarded"){let X=Q.tools[0]?.toAllow??[],G=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],V=[...X,...G];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",V,"global")}if(J==="connect-github"){let X=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();await y2(this.context,X);return}if(J==="disable-librarian"){let X=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!X.includes(MK))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,MK],"global")}let Y=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let X={type:"user:tool-input",toolUse:Z.id,value:{accepted:Y}};if(Q.subthreadID)await(await b3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(X);else await this.widget.dependencies.worker.handle(X)}catch(X){v.error("Failed to send tool confirmation:",X)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Z=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Z)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Z=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Z.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.agentModeController?.setMode("smart"),this.setState(()=>{this.dismissedEphemeralErrorKey=null}),X41({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 x$(Q.getSettingsFilePath())}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);await this.showErrorMessage(`Failed to open settings: ${Y}`)}};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 Z=J.messages[Q];if(Z?.role==="user"&&!Z.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Z=!0}=Q;if(Z){let Y=this.widget.dependencies.worker.thread.id;if(Y!==J)this.recordNavigation(Y)}try{v.info(`[switchToExistingThread] Switching to thread: ${J}`);let Y=await this.widget.dependencies.switchToThread(J);if(v.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${Y.thread.agentMode}`),this.widget.dependencies.worker=Y,this.widget.dependencies.threadID=Y.thread.id,this.widget.dependencies.switchWorker(Y),v.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),Y.thread.draft)if(v.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof Y.thread.draft==="string")this.textController.insertText(Y.thread.draft);else{let X=Y.thread.draft.filter((K)=>K.type==="text"),G=Y.thread.draft.filter((K)=>K.type==="image"),V=X.map((K)=>K.text).join(`
4633
4633
  `);if(V)this.textController.insertText(V);if(G.length>0)this.setState(()=>{this.imageAttachments=G})}}catch(Y){throw v.error("Failed to switch to thread:",J,Y),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Z=o2(Q.thread)===0,Y=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Z&&Y!==Q.thread.agentMode){await this.showErrorMessage(`This thread uses ${Q.thread.agentMode} mode. To change mode, edit the first message or create a new thread.`);return}let X=[{type:"text",text:J}];if(this.imageAttachments.length>0)X.push(...this.imageAttachments);if(Z)this.startAgentModeSlide();if(await Q.handle({type:"user:message",message:{content:X,agentMode:Y}}),Z)X41({agentMode:Y});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((Y)=>Y.type==="handoff"&&Y.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();X41({agentMode:Q}).catch((Z)=>{v.warn("Failed to save session state on exit:",Z)}).finally(()=>{r8.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=jU8();if(J===Q)return"~";if(J.startsWith(Q+pg.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(pg.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(pg.sep),"…",Q.slice(-2).join(pg.sep)].join(pg.sep)}build(J){let Q=j4.of(J),Z=$6.of(J),Y=Z.base;this.themeColors=Y;let{colors:X,app:G}=Z;this.themeApp=G;let V=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,K=V.thread.agentMode&&F9(V.thread.agentMode),q=this.widget.dependencies.features.some((K4)=>K4.name===Ej1.UBI&&K4.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,T=D.todosList;if(A){let K4={...L.thread,messages:this.replayDisplayedMessages};E=kC(K4).items,I=K4,P={};let W4=vF({messages:this.replayDisplayedMessages});T=Array.isArray(W4)?W4:[]}let k=I?.id,y=I,x=A?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),m=(K4)=>new P91({key:new o7(`preview-message-view-${K4.id}`),items:kC(K4).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:K4,focusNode:new G8({debugLabel:"PreviewFocus"})}),p=this.previewThread,b=p?p.messages.length>2000?new v0({mainAxisSize:"max",children:[new i6({child:new Z0}),new K6({padding:H0.all(2),child:new S4({child:new _1({text:new l("Thread too long for preview",new t({color:X.mutedForeground,dim:!0}))})})})]}):m(p):x?new C91({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal,userDisplayBalanceInfo:this.userDisplayBalanceInfo}):new P91({key:k?new o7(`message-view-${k}`):void 0,items:E,subagentToolsByParentID:P,controller:k?this.getMessageScrollController(k):new Z7,autofocus:!1,onCopy:A?void 0:this._handleTextCopy.bind(this),thread:y,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),K1=this.getCurrentEphemeralError(),J1=Q.size.width<40,c=D.mainThread?Bn(D.mainThread):void 0,e=U91(J),X1=this.buildBottomWidget(K1,M,X,Z,D,T,a,U,A,c,this.cacheTimerState??void 0,Q,e),F1=new g81({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:J1,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 b81({bashInvocations:this.bashInvocations}),o=[];if(z&&this.currentThreadFeedEntry)o.push(new gy1({entry:this.currentThreadFeedEntry,width:Q.size.width}));let i=this.getEffectiveAgentMode(),B1=this.currentShellModeStatus,k1=iy1(i),s=!B1?i.length+1:0,f1=Q.capabilities.animationSupport,R1=f1==="disabled"?0:f1==="slow"?30:60,V0=AK(i)?.uiHints?.fasterAnimation?3:1,T1=R1>0&&this.agentModePulseSeq>0?new f9({children:[X1,new x5({top:0,left:1,right:1,height:1,child:new yy1({color:k1,trigger:this.agentModePulseSeq,fps:R1,speed:V0,leftOffset:s})})]}):X1;o.push(new i6({child:b}),r);let r1=new f9({children:[new v0({mainAxisSize:"min",children:[H?new uk1({ad:this.randomAd,onButtonClick:async()=>{let K4=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => ($51(),X51)).then(({recordAdEvent:w9})=>{let J5=this.widget.dependencies.worker.thread,l$=J5.messages[J5.messages.length-1];w9("clicked",{adId:K4.id,advertiserId:K4.advertiserId,threadId:J5.id,messageId:l$?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:K4.metadata?.matchType,matchedPatterns:K4.metadata?.matchedPatterns,candidateAdPoolCount:K4.metadata?.candidateAdPoolCount,clientRegion:K4.metadata?.clientRegion})});if(!await y2(this.context,K4.shortDestinationUrl)){let J5=r8.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:J5,url:K4.shortDestinationUrl}})}}}):new Z0({height:0}),new b0({constraints:new M6(0,Q.size.width,0,a),child:T1})]}),U?new x5({top:0,left:0,right:0,child:new jQ6({userHeight:this.bottomGridUserHeight,maxHeight:a,onInitializeHeight:(K4)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(K4,a)})},onDrag:(K4)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(K4.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let W4=Math.floor(K4.localPosition.y)-this.bottomGridDragStartY,w9=Math.max(4,this.bottomGridDragStartHeight-W4),J5=Math.min(w9,a),l$=Math.floor(J5);if(this.bottomGridUserHeight!==l$)this.setState(()=>{this.bottomGridUserHeight=l$})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new Z0({height:0})]});o.push(r1,new Z0({height:1,child:new K6({padding:H0.horizontal(1),child:F1})}));let U1=new v0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:o}),A1=A&&L?.showIndicator!==!1?new f9({children:[U1,new x5({top:0,left:0,child:new my1})]}):U1,O1=new P8(()=>{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)=>{v.error("Failed to mark message as interrupted:",W4)}),this.cancelStreamingMessage().catch((W4)=>{v.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 v.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),I1=new P8(()=>{return this.onExitPressed(),"handled"}),S1=new P8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),p1=new P8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),m1=new P8(()=>{return DJ.instance.toggleAll(),"handled"}),a1=new P8(()=>{return this.widget.dependencies.configService.getLatest().then((K4)=>{wG("internal.showDetailedCosts",!(K4.settings["internal.showDetailedCosts"]??!1))}),"handled"}),G0=new P8(()=>{return r8.instance.toggleFrameStatsOverlay(),"handled"}),K0=new P8(()=>{return r8.instance.tuiInstance.getScreen().markForRefresh(),S8.instance.requestFrame(),"handled"}),R0=new P8(()=>{return this.toggleAgentMode(),"handled"}),_6=new P8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,J5=w9.mainThread?.id;return J5?this.getMessageScrollController(J5):null})();if(W4){let w9=Math.max(Math.floor(Q.size.height*0.4),10),J5=Q.size.height-w9;W4.animatePageUp(J5,100)}return"handled"}),m6=new P8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,J5=w9.mainThread?.id;return J5?this.getMessageScrollController(J5):null})();if(W4){let w9=Math.max(Math.floor(Q.size.height*0.4),10),J5=Q.size.height-w9;W4.animatePageDown(J5,100)}return"handled"}),v4=new P8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,J5=w9.mainThread?.id;return J5?this.getMessageScrollController(J5):null})();if(W4)W4.animateTo(0,100);return"handled"}),M4=new P8(()=>{let W4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:w9}=this.widget.dependencies,J5=w9.mainThread?.id;return J5?this.getMessageScrollController(J5):null})();if(W4)W4.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),O9=new P8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:K4}=this.widget.dependencies;if(!K4.mainThread?.messages.some((w9)=>w9.role==="user"||aE(w9)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),w0=new P8((K4)=>{if(K4.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),a0=new P8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return k81().then(async(K4)=>{if(K4)try{this.handleInsertImage(K4)}finally{try{let{unlink:W4}=await import("node:fs/promises");await W4(K4)}catch{}}}),"handled"}),s6=new Map([[X4.ctrl("c"),new Fg],[X4.ctrl("l"),new Mg],[X4.ctrl("o"),new C81],[X4.ctrl("v"),new Hg],[X4.alt("s"),new AC],[X4.ctrl("s"),new AC],[X4.alt("p"),new Dg],[X4.ctrl("r"),new Bg],[X4.alt("d"),new Ng],[X4.ctrl("t"),new Lg],[X4.key("PageUp"),new I81],[X4.key("PageDown"),new P81],[X4.key("Home"),new R81],[X4.key("End"),new T81],[X4.key("Escape"),new zg],[X4.ctrl("p"),new OC("previous")],[X4.ctrl("n"),new OC("next")],[X4.key("Tab"),new Og]]);if(!g3())s6.set(X4.key("ArrowUp"),new Og);if(!1)s6.set(X4.alt("c"),new Ug);let d8=new P8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),O7=new P8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),b5=new P8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),$7=new Map([[zg,O1],[Mg,K0],[AC,R0],[C81,d8],[Hg,a0],[Ug,S1],[M81,p1],[Bg,m1],[Ng,a1],[Dg,G0],[Lg,O7],[Fg,I1],[I81,_6],[P81,m6],[R81,v4],[T81,M4],[Og,O9],[OC,w0],[Ag,b5]]),c8=[A1];if(this.isShowingConsoleOverlay)c8.push(new Uy1);if(this.isShowingHelp&&this.paletteConfig)c8.push(new Dy1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)c8.push(new Vk1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)c8.push(new fy1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)c8.push(new pk1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(K4)=>{let W4=this.adActionModal.url;if(K4==="copy")try{await r8.instance.tuiInstance.clipboard.writeText(W4),this.setState(()=>{this.displayMessage=new nZ("Link copied to clipboard")})}catch(w9){v.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:K4}=this.widget.dependencies;c8.push(new xy1({servers:this.pendingMCPServers,onAlwaysTrust:K4.trustAlways.bind(K4),onTrustOnce:K4.trustOnce.bind(K4),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:K4.deny.bind(K4)}))}if(this.pendingOAuthRequest)c8.push(new hy1({request:this.pendingOAuthRequest,onDismiss:()=>{this.setState(()=>{this.pendingOAuthRequest=null})}}));if(this.isShowingFileChangesOverlay)c8.push(new bS1({threadData:D}));if(this.isShowingContextDetailOverlay){let K4=this.threadCostInfo?.costBreakdownURL;c8.push(new By1({thread:D.mainThread??void 0,tokenUsage:c??void 0,cacheTimerState:this.cacheTimerState??void 0,costInfo:this.threadCostInfo,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})},onOpenCostBreakdown:K4?()=>{y2(J,K4)}:void 0}))}if(this.isShowingConfirmationOverlay)c8.push(new zy1({details:this.confirmationOverlayContent}));let l9=this.getCommandPaletteContext(J);if(l9&&this.isShowingPalette&&this.paletteConfig)c8.push(new S4({child:new Wy1({commandContext:l9,mainThread:D.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)c8.push(new Ly1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let Y8=new f9({children:c8});if(this.isShowingJetBrainsInstaller)return new JO({child:new UJ({actions:$7,child:new ZX({shortcuts:s6,debugLabel:"jetbrains-installer-shortcuts",child:new ky1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new $z({controller:this.toastController,child:new JO({child:new CS1({controller:this.toastController,child:new UJ({actions:$7,child:new ZX({shortcuts:s6,debugLabel:"main-app-shortcuts",child:Y8})})})})})}buildScrollableTodoList(J,Q,Z){return new TQ6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Z})}buildBottomWidget(J,Q,Z,Y,X,G,V,K,q,W,H,z,U){if(J)return new Ny1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new Fy1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new vy1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let D=f81(Y),M=this.agentModeController?.isInRestrictedFreeMode()??!1,L=new FO({key:this.textFieldKey,controller:this.textController,triggers:q?[]:[new bq],completionBuilder:q?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:q?void 0:this.onTextSubmitted,theme:Z,placeholder:q?"Press Ctrl+C to exit":M?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!M&&!this.isShowingStandalonePalette(),shellPromptRules:D,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:r8.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,previousThreadId:this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let o=this.previousThreadIdForHint;if(o)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${o} `},onDoubleAtTrigger:q?void 0:()=>{let o=this.textController.text,i=this.textController.cursorPosition,k1=o.slice(0,i).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"attach-plan",onBeforeExecute:()=>{if(k1!==-1){let s=this.textController.text,f1=s.slice(0,k1)+s.slice(k1+2);this.textController.text=f1,this.textController.cursorPosition=k1}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),A=X.mainThread?.queuedMessages??[],E=Array.isArray(G)&&G.length>0,P=Array.isArray(A)&&A.length>0?new by1({queuedMessages:A}):void 0,T=E?this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!M,Y):void 0,k=[],y=this.currentShellModeStatus;if(y)k.push({child:new _1({text:new l(y==="hidden"?"shell mode (incognito)":"shell mode",new t({color:y==="hidden"?Y.app.shellModeHidden:Y.app.shellMode}))}),position:"top-left"});let m=this.connectedClientsStatus&&this.connectedClientsStatus.enabled?this.connectedClientsStatusExpanded?(this.connectedClientsStatus?.clientID?.length??7)+3:3:0,p=this.agentModeController?.getVisibleModes()??[];if(!y&&p.length>1){let o=this.previewThread,i=o?o.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),B1=iy1(i),k1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,s=o??k1.thread,f1=o2(s)>0,R1=this.agentModeSlideProgress!==null,V0,T1,r1=(A1)=>Math.pow(A1,4);if(R1){V0="top-left";let O1=z.size.width-i.length-4-m,I1=r1(this.agentModeSlideProgress);T1=Math.floor(I1*O1)}else if(f1)V0="top-right",T1=m;else V0="top-left",T1=void 0;let U1=f1&&!R1,Z1;if(R1){let A1=r1(this.agentModeSlideProgress??0);Z1=new t({color:B1,dim:A1>0.3})}else if(U1)Z1=new t({color:Z.foreground,dim:!0});else Z1=new t({color:B1});if(o)k.push({child:new _1({text:new l(i,Z1)}),position:V0,offsetX:T1});else{let A1=!f1&&!R1,O1=new _1({text:new l(i,Z1)});k.push({child:A1?new I8({child:O1,onClick:this.toggleAgentMode,cursor:"pointer"}):O1,position:V0,offsetX:T1})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let o=this.connectedClientsStatus,i=o.mode||"disconnected",B1=!!o.errorMessage,k1=o.clientID||"unknown",s,f1;if(B1)s="●",f1=z1.red;else if(i==="presence")s="○",f1=z1.yellow;else if(i==="connected"&&o.connected)s="●",f1=z1.green;else s="○",f1=z1.yellow;let R1=this.connectedClientsStatusExpanded?`${k1} ${s}`:s;k.push({child:new I8({child:new _1({text:new l(R1,new t({color:f1}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let b=q?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:X.mainThread?.env?.initial.trees?.[0]?.uri,a;if(b)a=f0.parse(b).fsPath;else a=process.cwd();let K1=this.toHomeRelative(a),J1=this.shorten(K1),c=!q&&this.currentGitBranch?`${J1} (${this.currentGitBranch})`:J1;if(k.push({child:new _1({text:new l(c,new t({color:Z.foreground,dim:!0}))}),position:"bottom-right"}),this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0&&this.textController.text.trim()==="")k.push({child:new _1({text:new l("",void 0,[new l("press ",new t({color:Z.foreground,dim:!0})),new l("enter",new t({color:Y.app.keybind})),new l(" to reference the previous thread",new t({color:Z.foreground,dim:!0}))])}),position:"bottom-left"});let X1=this.previewThread,F1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(o2(F1.thread)>0&&!y&&!X1){let o=[],i=new t({color:Z.foreground,dim:!0}),B1=new l(" · ",i);if(W){let k1=W.totalInputTokens/W.maxInputTokens,s=Math.round(k1*100),f1=Math.max(0,Math.min(s,100)),R1=m81(k1,W.maxInputTokens),V0=i;if(R1==="danger")V0=new t({color:Z.destructive});else if(R1==="warning")V0=new t({color:Z.warning});else if(R1==="recommendation")V0=new t({color:Y.app.recommendation});let T1=Math.round(W.maxInputTokens/1000);o.push(new l(`${f1}% of ${T1}k`,V0))}if(U&&this.threadCostInfo){let k1=u91(this.threadCostInfo,{colors:{foreground:Z.foreground},dim:!0});if(k1.length>0){if(o.length>0)o.push(B1);o.push(...k1)}}if(U&&H){let k1=X.viewState.state==="active"&&X.viewState.inferenceState==="idle",s=f86(H,k1);if(s){if(o.length>0)o.push(B1);let f1=i;if(s.urgency==="warning")f1=new t({color:Z.warning});o.push(new l(s.text,f1))}}if(o.length>0){let k1=new _1({text:new l("",void 0,o)});k.push({child:U?new I8({child:k1,onClick:this.showContextDetailOverlay,cursor:"pointer"}):k1,position:"top-left"})}}return new yS1({leftChild:new i6({child:L}),rightChild1:P,rightChild2:T,maxHeight:V,overlayTexts:k,borderColor:M||!this.isTextfieldAndAutocompleteFocused?z1.index(8):void 0,hasBanner:K,userHeight:this.bottomGridUserHeight,onInitializeHeight:(o)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(o,V)})},onDrag:(o)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(o.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let i=Math.floor(o.localPosition.y)-this.bottomGridDragStartY,B1=Math.max(4,this.bottomGridDragStartHeight-i),k1=Math.min(B1,V),s=Math.floor(k1);if(this.bottomGridUserHeight!==s)this.setState(()=>{this.bottomGridUserHeight=s})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!K})}}async function ny1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)r8.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let Y=()=>null,G=!1,V=new sH(G,1000,J.inspectorPort),K=J.features.find((A)=>A.name===Ej1.AMP_CONNECT)?.enabled??!1,q=new mk1({threadService:J.threadService,worker:J.worker,builder:(A,E,I,P,T,k)=>{if(Y=T,J.threadDependencies&&K)nj1(J.threadDependencies,J.configService,T,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((m)=>{v.error("Failed to start automatic presence:",m)});let y=T(),x={...J,worker:y,threadID:y.thread.id};return new RQ6({...x,threadState:E,workerController:I,switchWorker:P,getCurrentWorker:T,recentThreadIDs:k})}}),W=new xS1({configService:J.configService,child:q}),H=new Kk1({configService:J.configService,child:W}),z=new AS1(H),U=new $6({data:wC.fromBaseTheme(v$.default()),child:z});try{await Wj1(U,{onRootElementMounted:(A)=>{if(v.info("TUI input ready for user interaction"),G)V.start(A)}})}finally{if(G)V.stop();if(J.threadDependencies&&K){let{stopGlobalSession:A}=await Promise.resolve().then(() => (aj1(),n96));A()}}let M=Y()?.thread.id||J.threadID,L=await J.threadService.get(M);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${M}`;D56(L,A,J.stdout)}}function iy1(J){let Z=AK(J)?.uiHints?.secondaryColor;if(Z)return z1.rgb(Z.r,Z.g,Z.b);return _U8(J)}class TQ6 extends p0{props;constructor(J){super();this.props=J}createState(){return new CQ6}}class CQ6 extends u0{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Z,appTheme:Y}=this.widget.props;return new E6({crossAxisAlignment:"stretch",children:[new i6({child:new f5({controller:Z,autofocus:!1,child:new gk1({todos:Q})})}),new oQ({controller:Z,thumbColor:Y.app.scrollbarThumb,trackColor:Y.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:X,offset:G}=Z,V=this.viewportHeight,K=X+V;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(V,1),scrollOffset:Math.max(G,0)}}})]})}updateViewportHeight(){let J=this.getViewportHeight();if(J!==this.viewportHeight)this.viewportHeight=J}getViewportHeight(){let J=this.context.findRenderObject();if(!J)return this.viewportHeight;let Q=(Y,X=0)=>{if(Y&&"size"in Y&&"children"in Y){let G=Y.children||[];for(let V of G){if(V&&"size"in V){let q=V.size;if(typeof q?.height==="number"&&q.height>0)return q.height}let K=Q(V,X+1);if(K>0)return K}}return 0},Z=Q(J);if(Z>0)return Z;if("size"in J){let Y=J.size;if(typeof Y?.height==="number"&&Y.height>0)return Y.height}return this.viewportHeight}}class jQ6 extends x6{props;constructor(J){super();this.props=J}build(J){return new I8({child:new Z0({height:1}),cursor:j9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let Y=J.findRenderObject()?.size.height??0;if(Y>0){this.props.onInitializeHeight(Y);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function _U8(J){let Q=0;for(let X=0;X<J.length;X++){let G=J.charCodeAt(X);Q=(Q<<5)-Q+G,Q=Q&Q}let Z=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],Y=Math.abs(Q)%Z.length;return z1.index(Z[Y])}qj1();try{if(process.platform==="win32")await Promise.resolve().then(() => q6(Jj(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){QZ.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
4634
- `)}var wv1=Ov1.join(ZW0||Ov1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function tM8(J){process.emitWarning=function(Q,Z,Y,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Z||"Warning",K=!1;J.warn(G,{name:V,code:Y})}}function TV(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")wG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")wG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")wG("model.sonnet",Q.useSonnet)}async function Iv1(J){try{await oM8(Ov1.dirname(wv1),{recursive:!0}),await rM8(wv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function eM8(){try{return(await Z$6(wv1,"utf-8")).trim()}catch(J){return null}}function JL8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function QL8(J){try{let Q=await G5.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){v.debug("Failed to fetch user info:",Q)}return}var eX6=[{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??C$,description:`Custom settings file path (overrides the default location ${C$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${bA})`},{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:g3(),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:vW.SMART.key,description:`Set the agent mode (${pX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:pX().map((J)=>J.mode).concat("large")}],J$6=(J)=>("deprecated"in J)&&J.deprecated===!0,ZL8=(J)=>("hidden"in J)&&J.hidden===!0,YL8=(J)=>("default"in J),XL8=(J)=>("default"in J)?J.default:void 0;function $L8(J,Q){let Z=Q.args[0],Y=Q.commands.map((G)=>G.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let G=Y.filter((K)=>Z.includes(K)||K.includes(Z)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new C8(T$.unknownCommand(Z),1,V)}}var Y$6=null;function $L5(){return Y$6}function Hu(J){let Q=GC0({configService:J.configService,filesystem:J.fileSystem});return{...J,getThreadEnvironment:k61,vfs:eE0({os:J.fileSystem},J.configService.config),skillService:Q,fileChangeTrackerStorage:new Hv(J.fileSystem),generateThreadTitle:Xi0,deleteThread:(Z)=>J.threadService.delete(Z)}}var Pv1=f0.file(sM8.homedir()),X$6=process.env.XDG_CONFIG_HOME?f0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(Pv1,".config");async function c$(J,Q){sU0("0.0.1765849453-gf5d317");let Z=TH1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([f0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Pv1,userConfigDir:X$6}),{initializeCLITelemetry:Y}=await Promise.resolve().then(() => ($51(),X51));Y(Z);let X=await Z.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Dr0({configService:Z}),K=new Map,q=()=>K.clear(),W=new iU1(Z,J.settings.getWorkspaceRootPath()),H=CE0({configService:Z,trustStore:W,createOAuthProvider:async(K1,J1,c)=>{let e=`${K1}:${J1}`,X1=K.get(e);if(X1)return v.debug("Reusing existing OAuth provider for server",{serverName:K1,serverUrl:J1}),X1;v.debug("Creating OAuth provider for server",{serverName:K1,serverUrl:J1});let F1=(async()=>{let r=new TM(J.secrets),o=await r.getClientInfo(K1,J1),i=c?.scopes??o?.scopes,B1=i06();v.info("OAuth headless mode check",{useHeadless:B1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:o9.isTTY});let k1=void 0;if(B1)k1=J.executeMode?l06():c06(K1);let s=new cU1({storage:r,serverName:K1,serverUrl:J1,clientId:c?.clientId??o?.clientId,clientSecret:c?.clientSecret??o?.clientSecret,authUrl:c?.authUrl??o?.authUrl,tokenUrl:c?.tokenUrl??o?.tokenUrl,scopes:i,headlessAuthHandler:k1});return v.debug("OAuth provider created",{serverName:K1,serverUrl:J1,hasManualClientId:!!(c?.clientId??o?.clientId),willUseDCR:!(c?.clientId??o?.clientId),scopes:i,headlessMode:B1,executeMode:J.executeMode}),s})();return K.set(e,F1),F1}}),z=_01({configService:Z,filesystem:p9,spawn:NA}),{initializeToolProviders:U,startToolProviders:D}=await Promise.resolve().then(() => (tX6(),sX6)),M;if(J.executeMode){let K1=await U({toolService:G,providers:[H,z],initialTimeout:15000});M=K1.registrations;for(let[J1,c]of K1.initErrors)v.warn(`${J1} provider initialization slow or failed:`,c)}else M=D({toolService:G,providers:[H,z]});if(Q.jetbrains)rE("JetBrains");else if(Q.ide&&P66())rE("VS Code");else if(Q.ide&&R66())rE("Neovim");if(J.executeMode)tU0(!0);let L,A=R7.status.pipe(J6((K1)=>Boolean(K1.connected&&K1.authenticated)),H4()).subscribe((K1)=>{if(K1){if(!L)L=G.registerTool(Xa0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let K1=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new d61(process.cwd(),{alwaysIncludePaths:K1},!0)}else E=new class extends d61{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...
4634
+ `)}var wv1=Ov1.join(ZW0||Ov1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function tM8(J){process.emitWarning=function(Q,Z,Y,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Z||"Warning",K=!1;J.warn(G,{name:V,code:Y})}}function TV(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")wG("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")wG("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")wG("model.sonnet",Q.useSonnet)}async function Iv1(J){try{await oM8(Ov1.dirname(wv1),{recursive:!0}),await rM8(wv1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function eM8(){try{return(await Z$6(wv1,"utf-8")).trim()}catch(J){return null}}function JL8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function QL8(J){try{let Q=await G5.getUserInfo({},{config:J,signal:AbortSignal.timeout(5000)});if(Q.ok)return Q.result}catch(Q){v.debug("Failed to fetch user info:",Q)}return}var eX6=[{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??C$,description:`Custom settings file path (overrides the default location ${C$})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(v).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${bA})`},{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:g3(),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:vW.SMART.key,description:`Set the agent mode (${pX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:pX().map((J)=>J.mode).concat("large")}],J$6=(J)=>("deprecated"in J)&&J.deprecated===!0,ZL8=(J)=>("hidden"in J)&&J.hidden===!0,YL8=(J)=>("default"in J),XL8=(J)=>("default"in J)?J.default:void 0;function $L8(J,Q){let Z=Q.args[0],Y=Q.commands.map((G)=>G.name());if(Z&&!Z.includes(" ")&&Z.length<30&&!/[./\\]/.test(Z)){let G=Y.filter((K)=>Z.includes(K)||K.includes(Z)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new C8(T$.unknownCommand(Z),1,V)}}var Y$6=null;function $L5(){return Y$6}function Hu(J){let Q=GC0({configService:J.configService,filesystem:J.fileSystem});return{...J,getThreadEnvironment:k61,vfs:eE0({os:J.fileSystem},J.configService.config),skillService:Q,fileChangeTrackerStorage:new Hv(J.fileSystem),generateThreadTitle:Xi0,deleteThread:(Z)=>J.threadService.delete(Z)}}var Pv1=f0.file(sM8.homedir()),X$6=process.env.XDG_CONFIG_HOME?f0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(Pv1,".config");async function c$(J,Q){sU0("0.0.1765858276-g8d78e4");let Z=TH1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:t1.of([f0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Pv1,userConfigDir:X$6}),{initializeCLITelemetry:Y}=await Promise.resolve().then(() => ($51(),X51));Y(Z);let X=await Z.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Dr0({configService:Z}),K=new Map,q=()=>K.clear(),W=new iU1(Z,J.settings.getWorkspaceRootPath()),H=CE0({configService:Z,trustStore:W,createOAuthProvider:async(K1,J1,c)=>{let e=`${K1}:${J1}`,X1=K.get(e);if(X1)return v.debug("Reusing existing OAuth provider for server",{serverName:K1,serverUrl:J1}),X1;v.debug("Creating OAuth provider for server",{serverName:K1,serverUrl:J1});let F1=(async()=>{let r=new TM(J.secrets),o=await r.getClientInfo(K1,J1),i=c?.scopes??o?.scopes,B1=i06();v.info("OAuth headless mode check",{useHeadless:B1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:o9.isTTY});let k1=void 0;if(B1)k1=J.executeMode?l06():c06(K1);let s=new cU1({storage:r,serverName:K1,serverUrl:J1,clientId:c?.clientId??o?.clientId,clientSecret:c?.clientSecret??o?.clientSecret,authUrl:c?.authUrl??o?.authUrl,tokenUrl:c?.tokenUrl??o?.tokenUrl,scopes:i,headlessAuthHandler:k1});return v.debug("OAuth provider created",{serverName:K1,serverUrl:J1,hasManualClientId:!!(c?.clientId??o?.clientId),willUseDCR:!(c?.clientId??o?.clientId),scopes:i,headlessMode:B1,executeMode:J.executeMode}),s})();return K.set(e,F1),F1}}),z=_01({configService:Z,filesystem:p9,spawn:NA}),{initializeToolProviders:U,startToolProviders:D}=await Promise.resolve().then(() => (tX6(),sX6)),M;if(J.executeMode){let K1=await U({toolService:G,providers:[H,z],initialTimeout:15000});M=K1.registrations;for(let[J1,c]of K1.initErrors)v.warn(`${J1} provider initialization slow or failed:`,c)}else M=D({toolService:G,providers:[H,z]});if(Q.jetbrains)rE("JetBrains");else if(Q.ide&&P66())rE("VS Code");else if(Q.ide&&R66())rE("Neovim");if(J.executeMode)tU0(!0);let L,A=R7.status.pipe(J6((K1)=>Boolean(K1.connected&&K1.authenticated)),H4()).subscribe((K1)=>{if(K1){if(!L)L=G.registerTool(Xa0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let K1=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new d61(process.cwd(),{alwaysIncludePaths:K1},!0)}else E=new class extends d61{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...
4635
4635
  `),!await GL8(J))await mA(),process.exit(1)}let I=await zC0({isDevelopment:!1}),P=new NP1(I,Z),T=new XP1(I,{lazy:!0}),k=Q.notifications!==void 0?Q.notifications:!J.executeMode,y=Lr0({playNotificationSound:async(K1)=>{if(k){Mr0(K1);let J1=Vj1(),c=Kj1();if((!J1||c)&&X.settings["notifications.system.enabled"]!==!1){if(K1==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(K1==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:P,configService:Z});v.info("Starting Amp background services");let x=Gi0({threadService:P,threadHistoryService:T,configService:Z,isExtensionDevelopment:!1}),m;R7.status.subscribe((K1)=>{m=K1});let p=new z$1({workspaceRoots:[f0.file(process.cwd())],getCurrentFile:()=>{if(!m?.openFile)return;try{return f0.parse(m.openFile)}catch(K1){v.warn("Failed to parse current file URI",{uri:m.openFile,error:K1});return}},getOpenFiles:()=>{if(!m?.visibleFiles?.length)return[];let K1=m.openFile;return m.visibleFiles.filter((J1)=>J1!==K1).map((J1)=>{try{return f0.parse(J1)}catch(c){return v.warn("Failed to parse visible file URI",{uri:J1,error:c}),null}}).filter((J1)=>J1!==null)}}),b=new Hj1,a={codebaseContextService:p,configService:Z,toolService:G,mcpService:H,trustStore:W,threadService:P,threadHistoryService:T,threadSyncService:x,threadStorage:I,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:y,fileSystem:Q.jetbrains||Q.ide?rE0:p9,terminal:b};return{...a,async asyncDispose(){if(a.mcpService.hasAuthenticatingClients())v.info("Waiting for OAuth authentication to complete before exit..."),await a.mcpService.waitForAuthentication();for(let K1 of M.values())K1.dispose();await a.mcpService.dispose(),q(),await a.threadService.asyncDispose(),a.configService.unsubscribe(),V(),a.fuzzyServer.dispose(),a.threadSyncService.dispose(),a.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function GL8(J){if(!J.executeMode){if(!await bC1("Would you like to log in to Amp? [(y)es, (n)o]: "))return o9.write(`Login cancelled. Run the command again to retry.
4636
4636
  `),!1}return await $$6(J)}async function $$6(J){let Q=aM8(32).toString("hex"),Z=await hC1(J.ampURL,Q),Y=new AbortController;try{await pD(Z,Y.signal)}catch(G){v.error("Error opening browser",{error:G})}let X=await hC1(J.ampURL,Q,!1);o9.write(`If your browser does not open automatically, visit:
4637
4637
 
@@ -4641,7 +4641,7 @@ ${A6.blue.bold(X)}
4641
4641
  Login successful! You can now use the Amp CLI.
4642
4642
  `),!0}catch(G){return v.error("Login failed",{error:G}),QZ.write(`
4643
4643
  Login failed: ${G instanceof Error?G.message:String(G)}
4644
- `),!1}}function VL8(){let J=new RA().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)bT(),process.exit(0);let z=H.originalError??H;B06(z)}),J.option("-V, --version","Print the version number and exit",()=>{let z;try{z=`, ${nI(new Date("2025-12-16T01:49:19.931Z"))} ago`}catch{}o9.write(`0.0.1765849453-gf5d317 (released 2025-12-16T01:49:19.931Z${z??""})
4644
+ `),!1}}function VL8(){let J=new RA().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)bT(),process.exit(0);let z=H.originalError??H;B06(z)}),J.option("-V, --version","Print the version number and exit",()=>{let z;try{z=`, ${nI(new Date("2025-12-16T04:16:33.117Z"))} ago`}catch{}o9.write(`0.0.1765858276-g8d78e4 (released 2025-12-16T04:16:33.117Z${z??""})
4645
4645
  `),process.exit(0)}),J.addHelpText("after",w66()),J.configureHelp({formatHelp:E66}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await zQ(U);await HL8(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 zQ(U);await WL8(D,await RC1(U,D.settings))});let Q=async(H,z,U)=>{TH1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:t1.of([f0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:Pv1,userConfigDir:X$6});let D={...z,executeMode:!1};await Ev1(D,{...H,openThreadSwitcher:!0},U)},Z=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await zQ(U);await Q$6(U,D,z)});Z.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await zQ(U);await ML8(U,D,z)}),Z.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await zQ(D);if(z.pick)QZ.write(`${A6.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
4646
4646
  `);if(z.last||H||M.executeMode)await DL8(D,M,H,U);else await Q(D,M,U)}),Z.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let D=U.optsWithGlobals(),M=await zQ(D);await NL8(D,M,H,U)}),Z.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),D=await zQ(U);await Q$6(U,D,z)}),Z.command("search <query>").alias("find").summary("Search threads").description(`Search for threads using a query DSL.
4647
4647
 
@@ -4657,8 +4657,8 @@ All matching is case-insensitive. File paths use partial matching.`).option("-n,
4657
4657
  Or pipe via stdin: echo "your message" | amp --execute`);TV(Z,Q);let V=await c$(J,Q);Y$6=V;let K=Hu(V),q=await QL8(V.configService),W=JL8(q?.email);if((J.executeMode||Q.streamJson)&&F9(Q.mode)&&!W)throw new C8(`Execute mode is not permitted with --mode '${Q.mode}'`,1);let H=async(b)=>{let a=await Z$6(b,"utf-8"),K1=JSON.parse(a);if(!cX(K1.id))throw new C8(T$.invalidThreadId);return a51(V,{visibility:Y,agentMode:Q.mode,thread:K1})},z=async(b)=>{if(!cX(b))throw new C8(T$.invalidThreadId);try{let[K1,J1]=await Promise.all([G5.getThreadLinkInfo({thread:b},{config:V.configService}),G5.getUserInfo({},{config:V.configService})]);if(K1.ok&&J1.ok){let c=K1.result.creatorUserID,e=J1.result.id;if(c&&c!==e&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new C8(`Cannot resume thread created by another user.
4658
4658
 
4659
4659
  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(K1){if(K1 instanceof C8)throw K1;v.warn("Failed to validate thread ownership in CLI, allowing to open",{error:K1})}let a=await V.threadService.get(b)??void 0;return v.info(`[fetchAndStartThread] Loaded thread ${b}, agentMode: ${a?.agentMode??"undefined"}`),a51(V,{visibility:Y,agentMode:a?void 0:Q.mode,thread:a})},U=async()=>{try{if(Q.threadId)return z(Q.threadId);else return a51(V,{visibility:Y,agentMode:Q.mode})}catch(b){if(b instanceof C8)throw b;throw await Em(b,Q.threadId),Error("handleError should have called process.exit()")}},D=async()=>{return a51(V,{visibility:Y,agentMode:Q.mode})};if(Q.format==="jsonl")QZ.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
4660
- `),await mA(),process.exit(1);if(J.executeMode&&Q.remote)await z46(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)X46(V.mcpService,J.settings),await S06(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 HB0();let b=JI({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let a=b[0];if(a)R7.selectConfig(a)}else E=!0}let I=e61("0.0.1765849453-gf5d317",V.settingsStorage),P=new Q01(V.threadStorage),T=t1.of([f0.file(process.cwd())]),k=O$1(void 0,T),y=new J41(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let m=await(async()=>{try{let b=await G5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(b.ok)return v.info("User free tier status:",b),b.result}catch(b){throw v.error("Failed to fetch free tier status:",b),b}})(),p=await N46();v.info("Loaded session state:",p),await ny1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new f61,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:R7,connectedClientsService:new On,commandRegistry:k,mcpService:V.mcpService,mcpTrustHandler:y,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:E,openThreadSwitcher:Q.openThreadSwitcher,updateService:I,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:p,freeTierStatus:{canUseAmpFree:m.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Z.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function zQ(J){if(J.interactive)QZ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4661
- `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await G66({...J,workspaceTrust:{current:!0,changes:f_},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 Z46(J.mcpConfig);Y=Y46(Y,G)}let X=await Y.get("url","global");if(!X)X=FZ;if(!wF(X))v.info("Targeting custom Amp server",{ampURL:X});return Y=QH0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:F46(await RC1(J,Y))}}function KL8(J){let Q={};for(let Z=0;Z<J.length;Z++){let Y=J[Z];if(Y?.startsWith("--")){let G=Y.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Z+1];if(V&&!V.startsWith("--"))Q[G]=V,Z++}}return Q}async function qL8(){let J=KL8(process.argv);if(G06({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),tM8(v),v.info("Starting Amp CLI.",{version:"0.0.1765849453-gf5d317",buildTimestamp:"2025-12-16T01:49:19.931Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new C8(T$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await VL8().parseAsync(process.argv)}nI1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await qL8().catch(Em)});async function WL8(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}
4660
+ `),await mA(),process.exit(1);if(J.executeMode&&Q.remote)await z46(X,G,V.configService),await V.asyncDispose(),process.exit(0);let M=await U();if(J.executeMode)X46(V.mcpService,J.settings),await S06(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 HB0();let b=JI({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let a=b[0];if(a)R7.selectConfig(a)}else E=!0}let I=e61("0.0.1765858276-g8d78e4",V.settingsStorage),P=new Q01(V.threadStorage),T=t1.of([f0.file(process.cwd())]),k=O$1(void 0,T),y=new J41(V.mcpService,J.settings.getWorkspaceRootPath());if(X)M.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let m=await(async()=>{try{let b=await G5.getUserFreeTierStatus({},{config:V.configService,signal:AbortSignal.timeout(5000)});if(b.ok)return v.info("User free tier status:",b),b.result}catch(b){throw v.error("Failed to fetch free tier status:",b),b}})(),p=await N46();v.info("Loaded session state:",p),await ny1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new f61,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:R7,connectedClientsService:new On,commandRegistry:k,mcpService:V.mcpService,mcpTrustHandler:y,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:E,openThreadSwitcher:Q.openThreadSwitcher,updateService:I,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:p,freeTierStatus:{canUseAmpFree:m.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Z.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function zQ(J){if(J.interactive)QZ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4661
+ `);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Z=process.stdout.isTTY&&process.stderr.isTTY,Y=await G66({...J,workspaceTrust:{current:!0,changes:f_},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 Z46(J.mcpConfig);Y=Y46(Y,G)}let X=await Y.get("url","global");if(!X)X=FZ;if(!wF(X))v.info("Targeting custom Amp server",{ampURL:X});return Y=QH0(Y),{executeMode:Q,isTTY:Z,ampURL:X,settings:Y,secrets:F46(await RC1(J,Y))}}function KL8(J){let Q={};for(let Z=0;Z<J.length;Z++){let Y=J[Z];if(Y?.startsWith("--")){let G=Y.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Z+1];if(V&&!V.startsWith("--"))Q[G]=V,Z++}}return Q}async function qL8(){let J=KL8(process.argv);if(G06({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),tM8(v),v.info("Starting Amp CLI.",{version:"0.0.1765858276-g8d78e4",buildTimestamp:"2025-12-16T04:16:33.117Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new C8(T$.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await VL8().parseAsync(process.argv)}nI1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await qL8().catch(Em)});async function WL8(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}
4662
4662
  `);else if(!wF(J.ampURL))o9.write(`Logging in to ${new URL(J.ampURL).hostname}
4663
4663
  `);let Z=process.env.AMP_API_KEY;if(Z)o9.write(`API key found in environment variable, storing...
4664
4664
  `),await Q.set("apiKey",Z,J.ampURL),o9.write(`API key successfully stored.
@@ -4671,7 +4671,7 @@ This thread belongs to a different user and cannot be continued for security rea
4671
4671
  `);else o9.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
4672
4672
  `);process.exit(0)}async function zL8(J,Q,Z,Y,X){TV(X,J);let G=await c$(Q,J);try{let V=o51(Z);if(!V)r51(Z);let K=V,q=Y.trim();if(q.length===0)KX("Thread name cannot be empty");if(q.length>256)KX("Thread name cannot exceed 256 characters");if(!(await Qj(K,G)).messages.length)KX("Cannot rename an empty thread.");let H=Hu(G);await(await b3.getOrCreateForThread(H,K)).handle({type:"title",value:q}),v.info("GOT HERE"),await G.threadSyncService.sync(),v.info("GOT THERE"),o9.write(A6.green(`✓ Thread ${K} renamed to "${q}"
4673
4673
  `)),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose();let K=`Failed to rename thread: ${V instanceof Error?V.message:String(V)}`;KX(K)}}async function FL8(J,Q,Z,Y){TV(Y,J);let X=await c$(Q,J);try{let G=o51(Z);if(!G)r51(Z);let K=await Qj(G,X),q=UT(K);o9.write(q+`
4674
- `),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)}`;KX(V)}}async function UL8(J,Q,Z,Y,X){TV(X,J);let G=await c$(Q,J);try{let V=await Rv1(Z),K=await Qj(V,G),q=Y.typing!==!1,W=parseInt(Y.wpm||"120",10),H=parseInt(Y.messageDelay||"1000",10),z=parseInt(Y.toolProgressDelay||"800",10),U=parseInt(Y.exitDelay||"3",10)*1000,D=Y.indicator!==!1,M=Hu(G),L=K.id;await G.threadStorage.set(L,K);let A=await b3.getOrCreateForThread(M,L);await A.resume();let E=J01.fromWorker(A),I=new Q01(G.threadStorage),P=t1.of([f0.file(process.cwd())]),T=O$1(void 0,P),k=new J41(G.mcpService,Q.settings.getWorkspaceRootPath()),y=e61("0.0.1765849453-gf5d317",G.settingsStorage);await ny1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new f61,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:R7,connectedClientsService:new On,commandRegistry:T,mcpService:G.mcpService,mcpTrustHandler:k,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await Em(V,Z)}}async function BL8(J,Q,Z,Y,X){TV(Y,J);let G=await c$(Q,J);try{let V=o51(Z);if(!V)r51(Z);let K=V,q=await G5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=Q41(J,W);if(!H&&!X)KX("Must specify either --visibility or --support");if(H&&X)KX("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)KX(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,Z41(H)),o9.write(A6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4674
+ `),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)}`;KX(V)}}async function UL8(J,Q,Z,Y,X){TV(X,J);let G=await c$(Q,J);try{let V=await Rv1(Z),K=await Qj(V,G),q=Y.typing!==!1,W=parseInt(Y.wpm||"120",10),H=parseInt(Y.messageDelay||"1000",10),z=parseInt(Y.toolProgressDelay||"800",10),U=parseInt(Y.exitDelay||"3",10)*1000,D=Y.indicator!==!1,M=Hu(G),L=K.id;await G.threadStorage.set(L,K);let A=await b3.getOrCreateForThread(M,L);await A.resume();let E=J01.fromWorker(A),I=new Q01(G.threadStorage),P=t1.of([f0.file(process.cwd())]),T=O$1(void 0,P),k=new J41(G.mcpService,Q.settings.getWorkspaceRootPath()),y=e61("0.0.1765858276-g8d78e4",G.settingsStorage);await ny1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new f61,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:R7,connectedClientsService:new On,commandRegistry:T,mcpService:G.mcpService,mcpTrustHandler:k,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:D},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await Em(V,Z)}}async function BL8(J,Q,Z,Y,X){TV(Y,J);let G=await c$(Q,J);try{let V=o51(Z);if(!V)r51(Z);let K=V,q=await G5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=Q41(J,W);if(!H&&!X)KX("Must specify either --visibility or --support");if(H&&X)KX("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)KX(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,Z41(H)),o9.write(A6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
4675
4675
  `);if(X){await Qj(K,G);let z=typeof X==="string"?X:void 0;await IP0(G.threadService,K,G.configService,z),o9.write(A6.green("✓ ")+`Thread ${K} has been shared with Amp support. These thread reports will be aggregated and analysed.
4676
4676
  `)}await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),KX(`Failed to update thread: ${V instanceof Error?V.message:String(V)}`)}}async function NL8(J,Q,Z,Y){TV(Y,J);let X=await c$(Q,J),G=Hu(X);try{let V=await Rv1(Z),q=(await Qj(V,X)).messages.length-1,W=await b3.getOrCreateForThread(G,V),H=await DT(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await Iv1(H),o9.write(`${H}
4677
4677
  `),await X.asyncDispose(),process.exit(0)}catch(V){QZ.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.1765849453-gf5d317",
3
+ "version": "0.0.1765858276-g8d78e4",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {