@sourcegraph/amp 0.0.1766104774-gcb2601 → 0.0.1766117434-gebf7c3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +9 -9
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -3808,11 +3808,11 @@ Actual: ${X}`)}async function iz8(J,Q,Y){let{execSync:Z}=await import("node:ch
|
|
|
3808
3808
|
${B}`;if(X==="pnpm"&&B.includes("Unable to find the global bin directory"))D+=`
|
|
3809
3809
|
|
|
3810
3810
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
3811
|
-
npm install -g @sourcegraph/amp`;K(Error(D))}},error:(U)=>{if(!H)H=!0,K(Error(`Failed to spawn ${X}: ${U.message}`))},complete:()=>{if(!H)H=!0,V()}})})}N0();N0();async function e91(J,Q){let Z=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Z}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=sz8(J,q),H=W<0,F,U;if(K.time){let B=K.time[J],D=K.time[q],L=Date.now();if(B)F=Math.floor((L-new Date(B).getTime())/3600000);if(D)U=Math.floor((L-new Date(D).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:F,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:F,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function sz8(J,Q){let Y=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Z=Y(J),X=Y(Q),G=Math.max(Z.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Z.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Z.label===X.label)return 0;if(!Z.label&&X.label)return 1;if(Z.label&&!X.label)return-1;if(Z.label&&X.label)return Z.label<X.label?-1:1;return 0}s0();function J51(J,Q){let Y=new d4,Z=Y.pipe(L8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new eK().scoped("update"),G=Z.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await mC(500),Y.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=WI(),W=await e91(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,B=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},F=await t91();if(!K)K=F==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:F,mode:K});if(K==="warn"){if(!H())Y.next("update-available");return}if(!F){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}if(F==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Y.next("update-available");return}try{await Zp(W.latestVersion,F);let U=await nN(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",B),Y.next("updated");else X.warn("success with warning",B),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await mC(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}import{stderr as BW}from"node:process";function yJ6(J){let Q=new KW().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Z)=>{await zy1(Z.force||!1,Z.verbose||!1,"0.0.
|
|
3811
|
+
npm install -g @sourcegraph/amp`;K(Error(D))}},error:(U)=>{if(!H)H=!0,K(Error(`Failed to spawn ${X}: ${U.message}`))},complete:()=>{if(!H)H=!0,V()}})})}N0();N0();async function e91(J,Q){let Z=Q||"https://registry.npmjs.org";try{let X=new AbortController,G=setTimeout(()=>X.abort(),5000),V=await fetch(`${Z}/@sourcegraph/amp`,{signal:X.signal});if(clearTimeout(G),!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let K=await V.json(),q=K["dist-tags"]?.latest;if(!q)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=sz8(J,q),H=W<0,F,U;if(K.time){let B=K.time[J],D=K.time[q],L=Date.now();if(B)F=Math.floor((L-new Date(B).getTime())/3600000);if(D)U=Math.floor((L-new Date(D).getTime())/3600000)}return v.info("NPM version comparison",{currentVersion:J,latestVersion:q,compareResult:W,hasUpdate:H,currentVersionAge:F,latestVersionAge:U}),{hasUpdate:H,latestVersion:q,currentVersion:J,currentVersionAge:F,latestVersionAge:U,source:"npm"}}catch(X){return v.debug("Error checking npm version",{error:X}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function sz8(J,Q){let Y=(V)=>{let[K,q]=V.split("-");return{parts:K?.split(".").map(Number)||[],label:q}},Z=Y(J),X=Y(Q),G=Math.max(Z.parts.length,X.parts.length);for(let V=0;V<G;V++){let K=Z.parts[V]||0,q=X.parts[V]||0;if(K<q)return-1;if(K>q)return 1}if(Z.label===X.label)return 0;if(!Z.label&&X.label)return 1;if(Z.label&&!X.label)return-1;if(Z.label&&X.label)return Z.label<X.label?-1:1;return 0}s0();function J51(J,Q){let Y=new d4,Z=Y.pipe(L8({shouldCountRefs:!1}));return setImmediate(async()=>{let X=new eK().scoped("update"),G=Z.subscribe({next:(V)=>{X.debug("emit new state",V)}});try{let V=process.env.AMP_TEST_UPDATE_STATUS;if(V){X.debug("using fake update status for testing",{status:V}),await mC(500),Y.next(V);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){X.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let K=await Q.get("updates.mode");if(K==="disabled"){X.debug("checking disabled");return}X.debug("checking",{currentVersion:J,mode:K});let q=WI(),W=await e91(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,B=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},F=await t91();if(!K)K=F==="pnpm"?"warn":"auto",X.debug("no configured update mode; selected default based on package manager",{packageManager:F,mode:K});if(K==="warn"){if(!H())Y.next("update-available");return}if(!F){if(X.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}if(F==="binary"&&process.platform==="win32"){if(X.debug("binary auto-update not supported on Windows, falling back to warn mode"),!H())Y.next("update-available");return}try{await Zp(W.latestVersion,F);let U=await nN(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")X.info("success",B),Y.next("updated");else X.warn("success with warning",B),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(V){X.debug("check failed",{error:V})}finally{await mC(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:Z}}import{stderr as BW}from"node:process";function yJ6(J){let Q=new KW().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Z)=>{await zy1(Z.force||!1,Z.verbose||!1,"0.0.1766117434-gebf7c3"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new KW("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Z)=>{await tz8(Z.targetVersion)});J.addCommand(Y)}async function tz8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")BW.write(H6.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
3812
3812
|
|
|
3813
3813
|
`));try{if(!J){BW.write(H6.blue(`Checking for updates...
|
|
3814
|
-
`));let Y=WI(),{hasUpdate:Z,latestVersion:X}=await e91("0.0.
|
|
3815
|
-
`));let V=await nN("0.0.
|
|
3814
|
+
`));let Y=WI(),{hasUpdate:Z,latestVersion:X}=await e91("0.0.1766117434-gebf7c3",Y);if(!Z){BW.write(H6.green(`✓ Amp CLI is already up to date: ${"0.0.1766117434-gebf7c3"} (${"released"} ${"2025-12-19T04:15:38.696Z"}${`, ${PR(new Date("2025-12-19T04:15:38.696Z"))} ago`})
|
|
3815
|
+
`));let V=await nN("0.0.1766117434-gebf7c3");if(V.warning)BW.write(`
|
|
3816
3816
|
`+H6.yellow(V.warning)+`
|
|
3817
3817
|
`);process.exit(0)}if(!X)BW.write(H6.yellow("[WARN] could not find latest version")),process.exit(0);J=X}BW.write(H6.blue(`Updating to version ${J}...
|
|
3818
3818
|
`)),await Zp(J,void 0,(Y)=>{BW.write(H6.dim(`Running: ${Y}
|
|
@@ -4519,7 +4519,7 @@ Ctrl-X, Y, Z to unlock`;if(U){let d=W.text.replace(/`([^`]+)`/g,"$1")+`
|
|
|
4519
4519
|
`,A)])}),S];if(!q&&!U&&W.url){let b=W.url.replace(/^https?:\/\//,"");f.push(new J7({uri:W.url,text:b,style:new Q1({color:Y.secondary,underline:!0})}))}if(C&&!U)f.push(C);let m=new Y0({width:40,child:new v0({crossAxisAlignment:"start",mainAxisSize:"min",children:f})});return j4.child(new U6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new xx1({width:Df1,height:Lf1,agentMode:this.widget.agentMode,glow:this._glow,t:H,fps:0,shockwaves:this._shockwaves,onShockwave:P,...V==="disabled"&&{seed:42}}),new Y0({width:2}),m]}))}}N0();U8();g4();y7();U8();s0();function GP8(J,Q){return`${J}:${Q}`}class Af1{threadService;workers=new Map;threadsMap=new Map;subthreadsMap=new Map;mainThreadSubs=new Map;subthreadsSubs=new Map;workerStatusSubs=new Map;subthreadPatchSubs=new Map;mainThreadObservable;subthreadObservable;workerStatusObservable;emitMainThread=null;emitSubthread=null;emitWorkerStatus=null;constructor(J){this.threadService=J;this.mainThreadObservable=new Q0((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new Q0((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new Q0((Q)=>{return this.emitWorkerStatus=(Y)=>Q.next(Y),()=>{this.emitWorkerStatus=null}})}registerWorker(J){let Q=J.thread.id;if(this.workers.has(Q))this.unregisterWorker(Q);this.threadsMap.set(Q,J.thread),this.subthreadsMap.set(Q,[]),this.workers.set(Q,{state:"initial"});let Y=this.threadService.observePatches(Q).pipe(LL()).subscribe((G)=>{this.threadsMap.set(Q,G);let V=this.subthreadsMap.get(Q)||[],K=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:G,subthreads:V,workerStatus:K})});this.mainThreadSubs.set(Q,Y);let Z=J.status.subscribe((G)=>{if(this.workers.set(Q,G),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:G})});this.workerStatusSubs.set(Q,Z);let X=J.subthreads.subscribe((G)=>{this.subthreadsMap.set(Q,G);for(let V of G){let K=GP8(Q,V.toolUse.id);if(this.subthreadPatchSubs.has(K))continue;let q=this.threadService.observePatches(V.threadID).pipe(LL()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:V})});this.subthreadPatchSubs.set(K,q)}});this.subthreadsSubs.set(Q,X)}unregisterWorker(J){let Q=this.mainThreadSubs.get(J);if(Q)Q.unsubscribe(),this.mainThreadSubs.delete(J);let Y=this.workerStatusSubs.get(J);if(Y)Y.unsubscribe(),this.workerStatusSubs.delete(J);let Z=this.subthreadsSubs.get(J);if(Z)Z.unsubscribe(),this.subthreadsSubs.delete(J);for(let[X,G]of this.subthreadPatchSubs.entries())if(X.startsWith(`${J}:`))G.unsubscribe(),this.subthreadPatchSubs.delete(X);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new Q0((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new Q0((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new Q0((Q)=>{return this.workerStatusObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})})}}get threadViewStates(){let J={};for(let[Q,Y]of this.threadsMap){let Z=this.workers.get(Q);if(Z)J[Q]=CO(Y,Z)}return J}dispose(){for(let J of this.mainThreadSubs.values())J.unsubscribe();for(let J of this.subthreadsSubs.values())J.unsubscribe();for(let J of this.workerStatusSubs.values())J.unsubscribe();for(let J of this.subthreadPatchSubs.values())J.unsubscribe();this.mainThreadSubs.clear(),this.subthreadsSubs.clear(),this.workerStatusSubs.clear(),this.subthreadPatchSubs.clear(),this.workers.clear(),this.threadsMap.clear(),this.subthreadsMap.clear()}}function VP8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Y,subthread:Z}=Q,X=J.subagents[Z.threadID];if(!X){if(X={subThreadID:Y.id,parentToolID:Z.toolUse.id,taskDescription:Z.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=$Q(J.mainThread);X.isCompleted=bV6(W,Z.toolUse.id)}}let G=KP8(Y,X.agentState),V=X.agentState===G?X:{...X,agentState:G},K={...J.tools},q=zS(Y).items.filter((W)=>W.type==="toolResult");for(let W of q)K[W.id]={id:W.id,subthreadID:Y.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[Z.threadID]:V},tools:K,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Y,subthreads:Z,workerStatus:X}=Q,G=$Q(Y),V={...J.subagents};for(let F of Z){let U=V[F.threadID];if(!U)continue;let B=bV6(G,F.toolUse.id);V[F.threadID]={...U,isCompleted:B}}let{items:K}=zS(Y),q=CO(Y,X),W=TU({messages:Y.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:V,items:K,viewState:q,todosList:H,mainThread:Y}}case"worker-status-change":{if(!J.mainThread)return J;let Y=CO(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function zS(J){let Q=[],Y=new Map,Z=new Set;for(let[X,G]of J.messages.entries()){let V=`${G.role}-${X}`;switch(G.role){case"assistant":{let K=G.state.type==="streaming";for(let W of G.content)if(W.type==="tool_use"){if(Y.set(W.id,W),K)Z.add(W.id)}if(G.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:V,message:G});for(let W of G.content)if(W.type==="tool_use"){let H=!1;for(let F=X+1;F<J.messages.length;F++){let U=J.messages[F];if(U){for(let B of U.content)if(B.type==="tool_result"&&B.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:K?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:V,message:G});break;case"user":{let K=G.content.some((q)=>q.type==="text"&&q.text.trim()||q.type==="image");for(let q of G.content)if(q.type==="tool_result"){let W=Y.get(q.toolUseID)??uZ(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 bV6(J,Q){let Y=J.get(Q);return(Y&&O3(Y.run))??!1}function KP8(J,Q){let Y=J.messages.at(-1);if(Y?.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(zS(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(Y&&Y.role==="assistant"&&Y.state.type==="streaming")switch(Y.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 Of1 extends l0{props;constructor(J){super();this.props=J}createState(){return new gV6}}class gV6 extends d0{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 Af1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),Y=Q.mainThread.subscribe((G)=>{this.dispatch({type:"main-thread-patch",thread:G.mainThread,subthreads:G.subthreads,workerStatus:G.workerStatus})});this.subscriptions.push(Y);let Z=Q.subthreads.subscribe((G)=>{this.dispatch({type:"subthread-patch",thread:G.thread,subthread:G.subthread})});this.subscriptions.push(Z);let X=Q.workerStatus.subscribe((G)=>{this.dispatch({type:"worker-status-change",workerStatus:G.status})});this.subscriptions.push(X)}cleanup(){this.subscriptions.forEach((J)=>J.unsubscribe()),this.subscriptions=[]}switchWorker(J){this.cleanup(),this.setState(()=>{this.currentWorker=J}),this.setState(()=>{this.state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null}}),this.setupSubscriptions(J),this.addToRecentThreads(J.thread.id)}dispatch(J){this.setState(()=>{this.state=VP8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((G)=>({toolUse:G.toolUse,toolRun:G.toolRun,subthreadID:G.subthreadID})),Q={};for(let G of Object.values(this.state.subagents)){let V=J.filter((K)=>K.subthreadID===G.subThreadID);Q[G.parentToolID]=V}let Y=(G)=>G===o5||G===L9||G===Xq,Z=new Map;for(let G of this.state.items)if(G.type==="toolResult"&&Y(G.toolUse.name))Z.set(G.toolUse.id,{toolUseId:G.toolUse.id,toolName:G.toolUse.name,toolRun:G.toolResult.run});let X=Array.from(Z.values());for(let{toolUseId:G,toolRun:V}of X){let K=[],q;if(V.status==="in-progress"||V.status==="done"||V.status==="error"||V.status==="cancelled")q=V.progress;if(q){let W=0;for(let H of q)if(H.tool_uses)for(let F of H.tool_uses){let U=`${G}:progress:${W++}`;K.push({toolUse:QP(F.tool_name,F.input,U),toolRun:{status:F.status}})}}Q[G]=K}return{...this.state,subagents:Object.values(this.state.subagents),subagentActiveTools:J,subagentToolsByParentID:Q}}build(J){let Q=this.getThreadData();return this.widget.props.builder(J,Q,this.workerController,(Y)=>this.switchWorker(Y),()=>this.currentWorker,this.recentThreadIDs)}}class If1 extends l0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new mV6}}class mV6 extends d0{build(J){let Y=V6.of(J).colors,{todos:Z,title:X="TODOs"}=this.widget.props;if(!Array.isArray(Z)||Z.length===0)return new Y0({width:0,height:0});let G=Z.map((V)=>this.buildTodoItem(V,Y));return new g0({child:new B6({padding:z0.symmetric(1,0),child:new v0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new _1({text:new l(X,new Q1({bold:!0,color:Y.foreground}))}),...G]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),Z=J.status==="completed",X=new Q1({bold:J.status==="in-progress",color:Q.foreground,dim:Z}),G=new Q1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:Z});return new U6({crossAxisAlignment:"start",children:[new _1({text:new l(Y,X)}),new Y0({width:1}),new a6({child:new _1({text:new l(J.content,G)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class wf1 extends b6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Y,onButtonClick:Z}){super({key:J});this.ad=Q,this.onDismiss=Y,this.onButtonClick=Z}build(J){let Q=V6.of(J),Y=Q.colors.primary,Z=Q.colors.foreground;return new g0({decoration:new T8(void 0,new B4(new W4(Y,1,"rounded"),new W4(Y,1,"rounded"),void 0,new W4(Y,1,"rounded"))),child:new B6({padding:z0.horizontal(1),child:new v0({children:[new U6({crossAxisAlignment:"start",children:[new a6({child:new _1({text:new l(this.ad.content,new Q1({color:Z}))})}),new Y0({width:4}),new J7({uri:"https://ampcode.com/free",text:"Ad",style:new Q1({color:Z,dim:!0})})]}),new U6({crossAxisAlignment:"start",children:[new lx1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:z0.horizontal(1),color:Y,reverse:!0}),new Y0({width:2}),new _1({text:new l(this.ad.destinationUrlHostname,new Q1({color:Z,dim:!0}))})]})]})})})}}class Ef1 extends l0{props;constructor(J){super();this.props=J}createState(){return new uV6(this.props.autofocus??!0)}}class uV6 extends d0{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(K)=>{if(K.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(K.ctrlKey&&K.key==="c"||K.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Y=C4.sizeOf(J),Z=Math.min(60,Y.width-4),X=Y.height-4,G=[];if(this.widget.props.title)G.push(new _1({text:new l(this.widget.props.title,new Q1({bold:!0,color:N1.blue}))}),new Y0({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 Y0({height:1}));let V=[];if(this.widget.props.showCopyOption)V.push(new _1({text:new l("Enter to copy",new Q1({dim:!0}))}));return V.push(new _1({text:new l("Escape to close",new Q1({dim:!0}))})),G.push(new U6({children:V.flatMap((K,q)=>q<V.length-1?[K,new Y0({width:1}),new _1({text:new l("•",new Q1({dim:!0}))}),new Y0({width:1})]:[K]),mainAxisSize:"min"})),new j4({child:new g0({constraints:new O6(Z,Z,0,X),decoration:new T8(N1.default(),new B4(new W4(N1.blue,1,"rounded"),new W4(N1.blue,1,"rounded"),new W4(N1.blue,1,"rounded"),new W4(N1.blue,1,"rounded"))),padding:new z0(2,2,2,2),child:new w8({autofocus:this.autofocus,onKey:Q,child:new v0({children:G,mainAxisSize:"min"})})})})}}function Pf1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Y)=>{if(Y.startsWith('"')&&Y.endsWith('"')||Y.startsWith("'")&&Y.endsWith("'"))return Y.slice(1,-1);return Y})}iH();N0();import{spawn as qP8}from"node:child_process";import{promises as WP8}from"node:fs";function pV6(J){return J.kind==="executable"}function dV6(J){return J.kind==="markdown"}var Hz=50000,cV6=300000;async function Rf1(J,Q,Y,Z={}){let{timeoutMs:X=cV6,signal:G,source:V}=Z;try{let K=await Y.getCommand(J,V);if(!K)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Y.isCommandAvailable(J,V))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(v.debug("Executing command",{commandName:J,filePath:K.filePath,args:Q}),dV6(K))return await HP8(K,Q);else if(pV6(K))return await FP8(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 HP8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await WP8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>Hz?Y.slice(0,Hz)+`
|
|
4520
4520
|
... (output truncated at ${Hz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function FP8(J,Q,Y=cV6,Z){return new Promise((X)=>{let[G,V]=zP8(J,Q);v.debug("Spawning command",{spawnCommand:G,spawnArgs:V.slice(0,10),filePath:J.filePath,timeoutMs:Y});let K=oT0(Z),q=!1,W=setTimeout(()=>{q=!0,K.abort(),v.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=qP8(G,V,{stdio:["pipe","pipe","pipe"],signal:K.signal,detached:!0}),F=[],U=[],B=0;H.stdout?.on("data",(D)=>{let L=D.toString();if(B+=L.length,B<=Hz)F.push(L);else{let A=Hz-(B-L.length);if(A>0)F.push(L.slice(0,A))}}),H.stderr?.on("data",(D)=>{let L=D.toString();if(B+=L.length,B<=Hz)U.push(L);else{let A=Hz-(B-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(D)=>{if(clearTimeout(W),q){X({success:!1,output:F.join(""),error:`Command timed out after ${Y}ms`,exitCode:void 0});return}if(K.signal.aborted){X({success:!1,output:F.join(""),error:"The command was aborted",exitCode:D??void 0});return}let L=D===0||D===1,A=F.join(""),I=U.join(""),E=A;if(!L&&!A.trim()&&I.trim())E=I;else if(I.trim())E+=A?`
|
|
4521
4521
|
${I}`:I;if(B>Hz)E+=`
|
|
4522
|
-
... (output truncated at ${Hz} characters)`;X({success:L,output:E.trim(),error:!L?I.trim()||"Command failed":void 0,exitCode:D??void 0})}),H.on("error",(D)=>{clearTimeout(W);let L=D.message;if(q)L=`Command timed out after ${Y}ms`;else if(D.message.includes("operation was aborted")||D.name==="AbortError")L="The command was aborted";X({success:!1,output:F.join(""),error:L})})})}function zP8(J,Q){let{filePath:Y,interpreter:Z,extension:X}=J;if(process.platform==="win32")return BP8(Y,Z?[...Z]:null,X,Q);else return UP8(Y,Z?[...Z]:null,X,Q)}function UP8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];else return[J,Z]}function BP8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Z]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Z]];case".exe":return[J,Z];default:return[J,Z]}}N0();D$();q7();OR();yH();zQ();MV();nH();kq();U8();Bm();y7();wy();s0();var AK6=Q6(OB(),1);import{writeFile as MK6}from"fs/promises";import DK6 from"path";N0();zQ();class Tf1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1766104774-gcb2601"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Kt(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 US extends l0{props;constructor(J){super();this.props=J}createState(){return new lV6}}class lV6 extends d0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class iV6 extends d0{controller=new DZ;focusNode=new M8({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=V6.of(J),{colors:Y,app:Z}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=B4.all(new W4(Y.foreground,1,"solid")),q=new $z({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(B)=>{let D=B.trim();if(X&&D.length===0)return;this.widget.props.onSubmit(D)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new U6({children:[new g0({decoration:{color:N1.default()},child:new _1({text:new l(">",new Q1({color:Y.foreground}))})}),new a6({child:q})]}),H=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new Q1({color:Y.foreground})),new l(this.widget.props.commandName,new Q1({color:N1.yellow,bold:!0}))])})}),F=[];if(V)F.push(new l("Enter",new Q1({color:Z.keybind}))),F.push(new l(" to submit, ",new Q1({color:Y.foreground,dim:!0})));F.push(new l("Esc",new Q1({color:Z.keybind}))),F.push(new l(" to cancel",new Q1({color:Y.foreground,dim:!0})));let U=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l("",void 0,F)})});return new g0({decoration:{border:K,color:N1.default()},padding:z0.all(1),child:new v0({children:[H,new Y0({height:1}),W,new p5,U]})})}}class Zd extends l0{props;constructor(J){super();this.props=J}createState(){return new iV6}}nH();class nV6 extends d0{controller=new DZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new M8({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>=QB)return!1;let Q=ij(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=V6.of(J),{colors:Y,app:Z}=Q,G=C4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new vI({controller:this.controller,triggers:[new TW],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(B)=>{this.widget.props.onSubmit(B.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:k8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new w8({focusNode:this.focusNode,child:K}),W=new g0({constraints:new O6({maxHeight:V}),padding:z0.symmetric(1,0),child:q}),H=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new Q1({color:Y.foreground})),new l(this.widget.props.commandName,new Q1({color:N1.yellow,bold:!0}))])})}),F=new g0({padding:z0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new Q1({color:Z.keybind})),new l(" again to clear input",new Q1({color:Y.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new Q1({color:Y.foreground,dim:!0})),new l("Enter",new Q1({color:Z.keybind})),new l(" to submit, ",new Q1({color:Y.foreground,dim:!0})),new l("Esc",new Q1({color:Z.keybind})),new l(" to clear",new Q1({color:Y.foreground,dim:!0}))])})}),U=[H,new Y0({height:1}),new a6({child:W}),new Y0({height:1}),F];return new g0({decoration:{border:B4.all(new W4(Y.foreground,1,"solid")),color:N1.default()},padding:z0.all(1),child:new v0({children:U})})}}class Cf1 extends l0{props;constructor(J){super();this.props=J}createState(){return new nV6}}import{isDeepStrictEqual as LP8}from"node:util";var NP8=/[\\/_ +.#"@[({&]/,MP8=/[\\/_ +.#"@[({&]/g,DP8=/[\s-]/,aV6=/[\s-]/g;function k31(J,Q,Y,Z,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Z.charAt(G),W=Y.indexOf(q,X),H=0,F,U,B,D;while(W>=0){if(F=k31(J,Q,Y,Z,W+1,G+1,V),F>H){if(W===X)F*=1;else if(DP8.test(J.charAt(W-1))){if(F*=0.9,D=J.slice(X,W-1).match(aV6),D&&X>0)F*=Math.pow(0.999,D.length)}else if(NP8.test(J.charAt(W-1))){if(F*=0.8,B=J.slice(X,W-1).match(MP8),B&&X>0)F*=Math.pow(0.999,B.length)}else if(F*=0.3,X>0)F*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))F*=0.9999}if(F<0.1&&(Y.charAt(W-1)===Z.charAt(G+1)||Z.charAt(G+1)===Z.charAt(G)&&Y.charAt(W-1)!==Z.charAt(G))){if(U=k31(J,Q,Y,Z,W+1,G+2,V),U*0.1>F)F=U*0.1}if(F>H)H=F;W=Y.indexOf(q,W+1)}return V[K]=H,H}function _31(J){return J.toLowerCase().replace(aV6," ")}function oV6(J,Q){let Y=k31(J,Q,_31(J),_31(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=k31(J,K,_31(J),_31(K),0,0,{});if(q===0)return Y;X+=q,G+=K.length}let V=X/Z.length*0.95;return Math.max(Y,V)}return Y}class BS{}class NS{}class y31{}class x31{}class rV6 extends l0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new sV6}}class sV6 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}function AP8(J,Q){if(J==="")return{matches:!0,score:1};let Y=oV6(Q,J);return{matches:Y>0.15,score:Y}}class JJ extends l0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new tV6}}class tV6 extends d0{controller=new DZ;focusNode;scrollController=new D5;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new M8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),n8.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(!LP8(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 BS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof NS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof y31){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof x31)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Y=Q.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...AP8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,X)=>this.widget.props.sortItems(Z,X,J):(Z,X)=>X.score-Z.score).map((Z)=>Z.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Q)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,Z=Q.size.height;I71(J,{top:Y,bottom:Z},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let Z=Y[J],X=Z?this.widget.props.isItemDisabled?.(Z)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!X){if(Z)this.widget.props.onAccept(Z)}}};build(J){let Q=V6.of(J),{colors:Y}=Q,Z=this.getFilteredItems(),X=B4.all(new W4(Y.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new $z({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Y.foreground,border:null},maxLines:1}),K=new kX({shortcuts:new Map([[new N4("ArrowDown"),new BS],[new N4("ArrowUp"),new NS],[new N4("Tab"),new BS],[new N4("Tab",{shift:!0}),new NS],[new N4("n",{ctrl:!0}),new BS],[new N4("p",{ctrl:!0}),new NS],[new N4("Enter"),new y31],[new N4("Escape"),new x31]]),focusNode:this.focusNode,child:V}),q=new yJ({actions:new Map([[BS,new C8(this.invoke)],[NS,new C8(this.invoke)],[y31,new C8(this.invoke)],[x31,new C8(this.invoke)]]),child:K}),W=new U6({children:[new g0({decoration:{color:N1.default()},child:new _1({text:new l(">",new Q1({color:Y.foreground}))})}),new a6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Y0({height:10,child:new j4({child:new _1({text:new l(L,new Q1({color:Y.foreground}))})})})}else if(Z.length===0&&this.widget.props.emptyStateText)H=new a6({child:new j4({child:new _1({text:new l(this.widget.props.emptyStateText,new Q1({color:Y.foreground,dim:!0}))})})});else{let L=Z.map((A,I)=>{let E=I===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,E,P,J);else{let C=E?N1.yellow:void 0,S=E?N1.black:Y.foreground;R=new g0({decoration:C?{color:C}:void 0,padding:z0.symmetric(2,0),child:new _1({text:new l(this.widget.props.getLabel(A),new Q1({color:S,dim:P}))})})}return new rV6(new z8({onClick:(C)=>this.handleItemClick(I,C.clickCount),child:R}),(C)=>{this.itemContexts[I]=C})});H=new v0({children:L,crossAxisAlignment:"start"})}let F=new a6({child:new z8({onScroll:this.handleScroll,opaque:!1,child:new t9({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l(this.widget.props.title,new Q1({color:N1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Y0({height:1}),F),this.controller.text!==""){let L=Z.length>0?Z[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new g0({padding:z0.vertical(1),child:new j4({child:A})}));else U.push(new Y0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new g0({decoration:{border:X,color:N1.default()},padding:z0.symmetric(1,0),child:new v0({children:U})})}}function eV6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class jf1 extends b6{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>eV6(X.pubDate).length));return new JJ({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=V6.of(K),{colors:W}=q,H=G?N1.yellow:void 0,F=G?N1.black:W.foreground,U=N1.index(8),B=(D,L)=>new Y0({width:L,child:U6.end([new _1({text:new l(D,new Q1({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:z0.symmetric(2,0),child:new U6({children:[new a6({child:new _1({text:new l(X.title,new Q1({color:F})),overflow:"ellipsis",maxLines:1})}),new Y0({width:2}),B(eV6(X.pubDate),Y)]})})}})}}class Sf1 extends l0{createState(){return new JK6}}class JK6 extends d0{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 Q1({color:this.isGreen?N1.green:N1.index(8),bold:!0})),maxLines:1})}}function OP8(J){let Q=new Map,Y=new Map,Z=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Z.set(V.id,K.type);let q=K.threadID,W=Y.get(q)||[];W.push(V),Y.set(q,W)}else X.push(V)}return xX.flatten(X,(V)=>Y.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Z.get(V.item.id)}))}function _f1(J,Q,Y){return new _1({text:new l(`${J}${Q}`,new Q1({color:Y})),maxLines:1})}function IP8(J,Q,Y,Z){return[_f1("+",J,Z.success),p5.horizontal(1),_f1("~",Q,Z.warning),p5.horizontal(1),_f1("-",Y,Z.destructive)]}class v31 extends b6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((F)=>F.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((F)=>F.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],Z=new Set(Y),X=this.props.currentThreadID,G=[...Q].sort((F,U)=>{if(X){if(F.id===X)return-1;if(U.id===X)return 1}let B=Y.indexOf(F.id),D=Y.indexOf(U.id);if(B!==-1&&D!==-1)return B-D;if(B!==-1)return-1;if(D!==-1)return 1;return 0}),V=OP8(G),K=Math.max(0,...V.map((F)=>F.description.timeAgo.length)),q=V6.of(J),W=new B6({padding:z0.symmetric(0,1),child:new j4({child:new _1({text:new l("",new Q1({color:q.colors.foreground,dim:!0}),[new l("Ctrl+T",new Q1({color:N1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new Q1({color:q.colors.foreground,dim:!0}))])})})});return new JJ({items:V,getLabel:(F)=>F.title,onAccept:(F)=>this.props.onSelect?.(F.id),onDismiss:this.props.onDismiss,onSelectionChange:(F)=>{if(this.props.previewController){if(F)this.props.previewController.select(F.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:(F,U,B,D)=>{let L=V6.of(D),{colors:A}=L,I=U?N1.yellow:void 0,E=U?N1.black:A.foreground,P=N1.index(8),R=(r,p)=>new Y0({width:p,child:U6.end([new _1({text:new l(r,new Q1({color:P}))})])}),C=this.props.threadViewStates[F.id],S=[],k=F.relationshipType==="handoff",f=new _71;if(F.depth>0){let r=[],p=F.ancestorsAreLast.slice(1);for(let $1 of p)r.push(new l(f.getAncestorPrefix($1),new Q1({color:f.connectorColor,dim:f.connectorDim})));let a=F.isLast?f.elbow:f.tee,J1=f.getConnectorText(a);r.push(new l(J1,new Q1({color:f.connectorColor,dim:f.connectorDim}))),S.push(new _1({text:new l("",void 0,r)}))}let m=[],b=X===F.id?new l("(current) ",new Q1({color:N1.green})):Z.has(F.id)?new l("(visited) ",new Q1({color:A.foreground,dim:!0})):null;if(b)m.push(new _1({text:b}));if(C){if(C.state==="active"&&(C.interactionState==="tool-running"||C.inferenceState==="running"))m.push(new Sf1),m.push(new Y0({width:1}))}let d=F.title;if(F.relationshipType==="fork"){let r=d.match(/^Forked\((\d+)\): /);if(r)d=d.slice(r[0].length);else while(d.startsWith("Forked: "))d=d.slice(8);m.push(new _1({text:new l("[fork] ",new Q1({color:N1.blue}))}))}else if(k)m.push(new _1({text:new l("[handoff] ",new Q1({color:N1.index(208)}))}));if(m.push(new a6({child:new _1({text:new l(d,new Q1({color:E})),overflow:"ellipsis",maxLines:1})})),m.push(new Y0({width:2})),F.diffStats&&(F.diffStats.added>0||F.diffStats.changed>0||F.diffStats.deleted>0)){let r=U?{success:P,warning:P,destructive:P}:A;m.push(...IP8(F.diffStats.added,F.diffStats.changed,F.diffStats.deleted,r)),m.push(new Y0({width:2}))}return m.push(R(F.description.timeAgo,K)),new g0({decoration:I?{color:I}:void 0,padding:z0.symmetric(2,0),child:new U6({children:[...S,...m]})})}})}}function QK6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class kf1 extends b6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>QK6(X.pubDate).length));return new JJ({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=V6.of(K),{colors:W}=q,H=G?N1.yellow:void 0,F=G?N1.black:W.foreground,U=N1.index(8),B=X.authors.map((L)=>L.name).join(", ")||"Community",D=(L,A)=>new Y0({width:A,child:U6.end([new _1({text:new l(L,new Q1({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:z0.symmetric(2,0),child:new U6({children:[new a6({child:new _1({text:new l(X.title,new Q1({color:F})),overflow:"ellipsis",maxLines:1})}),new Y0({width:2}),new _1({text:new l(B,new Q1({color:U})),maxLines:1}),new Y0({width:2}),D(QK6(X.pubDate),Y)]})})}})}}class yf1 extends b6{props;constructor(J){super();this.props=J}build(){return new j4({child:new _1({text:new l("",void 0,[new l(`Forked to new thread:
|
|
4522
|
+
... (output truncated at ${Hz} characters)`;X({success:L,output:E.trim(),error:!L?I.trim()||"Command failed":void 0,exitCode:D??void 0})}),H.on("error",(D)=>{clearTimeout(W);let L=D.message;if(q)L=`Command timed out after ${Y}ms`;else if(D.message.includes("operation was aborted")||D.name==="AbortError")L="The command was aborted";X({success:!1,output:F.join(""),error:L})})})}function zP8(J,Q){let{filePath:Y,interpreter:Z,extension:X}=J;if(process.platform==="win32")return BP8(Y,Z?[...Z]:null,X,Q);else return UP8(Y,Z?[...Z]:null,X,Q)}function UP8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];else return[J,Z]}function BP8(J,Q,Y,Z){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...Z]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...Z]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...Z]];case".exe":return[J,Z];default:return[J,Z]}}N0();D$();q7();OR();yH();zQ();MV();nH();kq();U8();Bm();y7();wy();s0();var AK6=Q6(OB(),1);import{writeFile as MK6}from"fs/promises";import DK6 from"path";N0();zQ();class Tf1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1766117434-gebf7c3"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Kt(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 US extends l0{props;constructor(J){super();this.props=J}createState(){return new lV6}}class lV6 extends d0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class iV6 extends d0{controller=new DZ;focusNode=new M8({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=V6.of(J),{colors:Y,app:Z}=Q,X=this.widget.props.isRequiredArg??!0,G=this.controller.text.trim().length>0,V=!X||G,K=B4.all(new W4(Y.foreground,1,"solid")),q=new $z({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(B)=>{let D=B.trim();if(X&&D.length===0)return;this.widget.props.onSubmit(D)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new U6({children:[new g0({decoration:{color:N1.default()},child:new _1({text:new l(">",new Q1({color:Y.foreground}))})}),new a6({child:q})]}),H=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new Q1({color:Y.foreground})),new l(this.widget.props.commandName,new Q1({color:N1.yellow,bold:!0}))])})}),F=[];if(V)F.push(new l("Enter",new Q1({color:Z.keybind}))),F.push(new l(" to submit, ",new Q1({color:Y.foreground,dim:!0})));F.push(new l("Esc",new Q1({color:Z.keybind}))),F.push(new l(" to cancel",new Q1({color:Y.foreground,dim:!0})));let U=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l("",void 0,F)})});return new g0({decoration:{border:K,color:N1.default()},padding:z0.all(1),child:new v0({children:[H,new Y0({height:1}),W,new p5,U]})})}}class Zd extends l0{props;constructor(J){super();this.props=J}createState(){return new iV6}}nH();class nV6 extends d0{controller=new DZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new M8({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>=QB)return!1;let Q=ij(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=V6.of(J),{colors:Y,app:Z}=Q,G=C4.of(J).size.height,V=Math.max(Math.floor(G*0.5),10),K=new vI({controller:this.controller,triggers:[new TW],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(B)=>{this.widget.props.onSubmit(B.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:k8.instance.tuiInstance.clipboard,autoOverlayPosition:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),q=new w8({focusNode:this.focusNode,child:K}),W=new g0({constraints:new O6({maxHeight:V}),padding:z0.symmetric(1,0),child:q}),H=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l("",void 0,[new l("Command: ",new Q1({color:Y.foreground})),new l(this.widget.props.commandName,new Q1({color:N1.yellow,bold:!0}))])})}),F=new g0({padding:z0.symmetric(1,0),child:new _1({text:this.isConfirmingClearInput?new l("",void 0,[new l("Esc",new Q1({color:Z.keybind})),new l(" again to clear input",new Q1({color:Y.foreground,dim:!0}))]):new l("",void 0,[new l("Press ",new Q1({color:Y.foreground,dim:!0})),new l("Enter",new Q1({color:Z.keybind})),new l(" to submit, ",new Q1({color:Y.foreground,dim:!0})),new l("Esc",new Q1({color:Z.keybind})),new l(" to clear",new Q1({color:Y.foreground,dim:!0}))])})}),U=[H,new Y0({height:1}),new a6({child:W}),new Y0({height:1}),F];return new g0({decoration:{border:B4.all(new W4(Y.foreground,1,"solid")),color:N1.default()},padding:z0.all(1),child:new v0({children:U})})}}class Cf1 extends l0{props;constructor(J){super();this.props=J}createState(){return new nV6}}import{isDeepStrictEqual as LP8}from"node:util";var NP8=/[\\/_ +.#"@[({&]/,MP8=/[\\/_ +.#"@[({&]/g,DP8=/[\s-]/,aV6=/[\s-]/g;function k31(J,Q,Y,Z,X,G,V){if(G===Q.length){if(X===J.length)return 1;return 0.99}let K=`${X},${G}`;if(V[K]!==void 0)return V[K];let q=Z.charAt(G),W=Y.indexOf(q,X),H=0,F,U,B,D;while(W>=0){if(F=k31(J,Q,Y,Z,W+1,G+1,V),F>H){if(W===X)F*=1;else if(DP8.test(J.charAt(W-1))){if(F*=0.9,D=J.slice(X,W-1).match(aV6),D&&X>0)F*=Math.pow(0.999,D.length)}else if(NP8.test(J.charAt(W-1))){if(F*=0.8,B=J.slice(X,W-1).match(MP8),B&&X>0)F*=Math.pow(0.999,B.length)}else if(F*=0.3,X>0)F*=Math.pow(0.999,W-X);if(J.charAt(W)!==Q.charAt(G))F*=0.9999}if(F<0.1&&(Y.charAt(W-1)===Z.charAt(G+1)||Z.charAt(G+1)===Z.charAt(G)&&Y.charAt(W-1)!==Z.charAt(G))){if(U=k31(J,Q,Y,Z,W+1,G+2,V),U*0.1>F)F=U*0.1}if(F>H)H=F;W=Y.indexOf(q,W+1)}return V[K]=H,H}function _31(J){return J.toLowerCase().replace(aV6," ")}function oV6(J,Q){let Y=k31(J,Q,_31(J),_31(Q),0,0,{}),Z=Q.trim().split(/\s+/);if(Z.length>1){let X=0,G=0;for(let K of Z){let q=k31(J,K,_31(J),_31(K),0,0,{});if(q===0)return Y;X+=q,G+=K.length}let V=X/Z.length*0.95;return Math.max(Y,V)}return Y}class BS{}class NS{}class y31{}class x31{}class rV6 extends l0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new sV6}}class sV6 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}function AP8(J,Q){if(J==="")return{matches:!0,score:1};let Y=oV6(Q,J);return{matches:Y>0.15,score:Y}}class JJ extends l0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new tV6}}class tV6 extends d0{controller=new DZ;focusNode;scrollController=new D5;selectedIndex=0;itemContexts=[];cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new M8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),n8.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(!LP8(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 BS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof NS){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof y31){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof x31)return this.widget.props.onDismiss?.(),"handled";return"ignored"};recomputeFilteredItems(){let J=this.controller.text,Q=this.widget.props.items,Y=Q.filter((Z)=>!this.widget.props.filterItem||this.widget.props.filterItem(Z,J)).map((Z)=>({item:Z,...AP8(J,this.widget.props.getLabel(Z))})).filter((Z)=>Z.matches).sort(this.widget.props.sortItems?(Z,X)=>this.widget.props.sortItems(Z,X,J):(Z,X)=>X.score-Z.score).map((Z)=>Z.item);this.cachedQuery=J,this.cachedItemsRef=Q,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Q)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,Z=Q.size.height;I71(J,{top:Y,bottom:Z},{padding:1})}handleScroll=(J)=>{let Q=this.getFilteredItems();if(Q.length===0)return;if(J.direction==="down")if(this.selectedIndex<Q.length-1)this.selectedIndex++;else return;else if(this.selectedIndex>0)this.selectedIndex--;else return;this.setState(),n8.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)};handleItemClick=(J,Q)=>{let Y=this.getFilteredItems();if(J>=0&&J<Y.length){let Z=Y[J],X=Z?this.widget.props.isItemDisabled?.(Z)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!X){if(Z)this.widget.props.onAccept(Z)}}};build(J){let Q=V6.of(J),{colors:Y}=Q,Z=this.getFilteredItems(),X=B4.all(new W4(Y.foreground,1,"solid")),G=this.widget.props.enabled??!0,V=new $z({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:G,style:{textColor:Y.foreground,border:null},maxLines:1}),K=new kX({shortcuts:new Map([[new N4("ArrowDown"),new BS],[new N4("ArrowUp"),new NS],[new N4("Tab"),new BS],[new N4("Tab",{shift:!0}),new NS],[new N4("n",{ctrl:!0}),new BS],[new N4("p",{ctrl:!0}),new NS],[new N4("Enter"),new y31],[new N4("Escape"),new x31]]),focusNode:this.focusNode,child:V}),q=new yJ({actions:new Map([[BS,new C8(this.invoke)],[NS,new C8(this.invoke)],[y31,new C8(this.invoke)],[x31,new C8(this.invoke)]]),child:K}),W=new U6({children:[new g0({decoration:{color:N1.default()},child:new _1({text:new l(">",new Q1({color:Y.foreground}))})}),new a6({child:q})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new Y0({height:10,child:new j4({child:new _1({text:new l(L,new Q1({color:Y.foreground}))})})})}else if(Z.length===0&&this.widget.props.emptyStateText)H=new a6({child:new j4({child:new _1({text:new l(this.widget.props.emptyStateText,new Q1({color:Y.foreground,dim:!0}))})})});else{let L=Z.map((A,I)=>{let E=I===this.selectedIndex,P=this.widget.props.isItemDisabled?.(A)??!1,R;if(this.widget.props.renderItem)R=this.widget.props.renderItem(A,E,P,J);else{let C=E?N1.yellow:void 0,S=E?N1.black:Y.foreground;R=new g0({decoration:C?{color:C}:void 0,padding:z0.symmetric(2,0),child:new _1({text:new l(this.widget.props.getLabel(A),new Q1({color:S,dim:P}))})})}return new rV6(new z8({onClick:(C)=>this.handleItemClick(I,C.clickCount),child:R}),(C)=>{this.itemContexts[I]=C})});H=new v0({children:L,crossAxisAlignment:"start"})}let F=new a6({child:new z8({onScroll:this.handleScroll,opaque:!1,child:new t9({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l(this.widget.props.title,new Q1({color:N1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new Y0({height:1}),F),this.controller.text!==""){let L=Z.length>0?Z[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new g0({padding:z0.vertical(1),child:new j4({child:A})}));else U.push(new Y0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new g0({decoration:{border:X,color:N1.default()},padding:z0.symmetric(1,0),child:new v0({children:U})})}}function eV6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class jf1 extends b6{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>eV6(X.pubDate).length));return new JJ({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=V6.of(K),{colors:W}=q,H=G?N1.yellow:void 0,F=G?N1.black:W.foreground,U=N1.index(8),B=(D,L)=>new Y0({width:L,child:U6.end([new _1({text:new l(D,new Q1({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:z0.symmetric(2,0),child:new U6({children:[new a6({child:new _1({text:new l(X.title,new Q1({color:F})),overflow:"ellipsis",maxLines:1})}),new Y0({width:2}),B(eV6(X.pubDate),Y)]})})}})}}class Sf1 extends l0{createState(){return new JK6}}class JK6 extends d0{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 Q1({color:this.isGreen?N1.green:N1.index(8),bold:!0})),maxLines:1})}}function OP8(J){let Q=new Map,Y=new Map,Z=new Map,X=[];for(let V of J)Q.set(V.id,V);for(let V of J){let K=V.parentRelationships.find((q)=>q.role==="child"&&Q.has(q.threadID)&&(q.type==="fork"||q.type==="handoff"));if(K){Z.set(V.id,K.type);let q=K.threadID,W=Y.get(q)||[];W.push(V),Y.set(q,W)}else X.push(V)}return xX.flatten(X,(V)=>Y.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Z.get(V.item.id)}))}function _f1(J,Q,Y){return new _1({text:new l(`${J}${Q}`,new Q1({color:Y})),maxLines:1})}function IP8(J,Q,Y,Z){return[_f1("+",J,Z.success),p5.horizontal(1),_f1("~",Q,Z.warning),p5.horizontal(1),_f1("-",Y,Z.destructive)]}class v31 extends b6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((F)=>F.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((F)=>F.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],Z=new Set(Y),X=this.props.currentThreadID,G=[...Q].sort((F,U)=>{if(X){if(F.id===X)return-1;if(U.id===X)return 1}let B=Y.indexOf(F.id),D=Y.indexOf(U.id);if(B!==-1&&D!==-1)return B-D;if(B!==-1)return-1;if(D!==-1)return 1;return 0}),V=OP8(G),K=Math.max(0,...V.map((F)=>F.description.timeAgo.length)),q=V6.of(J),W=new B6({padding:z0.symmetric(0,1),child:new j4({child:new _1({text:new l("",new Q1({color:q.colors.foreground,dim:!0}),[new l("Ctrl+T",new Q1({color:N1.blue,dim:!0})),new l(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new Q1({color:q.colors.foreground,dim:!0}))])})})});return new JJ({items:V,getLabel:(F)=>F.title,onAccept:(F)=>this.props.onSelect?.(F.id),onDismiss:this.props.onDismiss,onSelectionChange:(F)=>{if(this.props.previewController){if(F)this.props.previewController.select(F.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:(F,U,B,D)=>{let L=V6.of(D),{colors:A}=L,I=U?N1.yellow:void 0,E=U?N1.black:A.foreground,P=N1.index(8),R=(r,p)=>new Y0({width:p,child:U6.end([new _1({text:new l(r,new Q1({color:P}))})])}),C=this.props.threadViewStates[F.id],S=[],k=F.relationshipType==="handoff",f=new _71;if(F.depth>0){let r=[],p=F.ancestorsAreLast.slice(1);for(let $1 of p)r.push(new l(f.getAncestorPrefix($1),new Q1({color:f.connectorColor,dim:f.connectorDim})));let a=F.isLast?f.elbow:f.tee,J1=f.getConnectorText(a);r.push(new l(J1,new Q1({color:f.connectorColor,dim:f.connectorDim}))),S.push(new _1({text:new l("",void 0,r)}))}let m=[],b=X===F.id?new l("(current) ",new Q1({color:N1.green})):Z.has(F.id)?new l("(visited) ",new Q1({color:A.foreground,dim:!0})):null;if(b)m.push(new _1({text:b}));if(C){if(C.state==="active"&&(C.interactionState==="tool-running"||C.inferenceState==="running"))m.push(new Sf1),m.push(new Y0({width:1}))}let d=F.title;if(F.relationshipType==="fork"){let r=d.match(/^Forked\((\d+)\): /);if(r)d=d.slice(r[0].length);else while(d.startsWith("Forked: "))d=d.slice(8);m.push(new _1({text:new l("[fork] ",new Q1({color:N1.blue}))}))}else if(k)m.push(new _1({text:new l("[handoff] ",new Q1({color:N1.index(208)}))}));if(m.push(new a6({child:new _1({text:new l(d,new Q1({color:E})),overflow:"ellipsis",maxLines:1})})),m.push(new Y0({width:2})),F.diffStats&&(F.diffStats.added>0||F.diffStats.changed>0||F.diffStats.deleted>0)){let r=U?{success:P,warning:P,destructive:P}:A;m.push(...IP8(F.diffStats.added,F.diffStats.changed,F.diffStats.deleted,r)),m.push(new Y0({width:2}))}return m.push(R(F.description.timeAgo,K)),new g0({decoration:I?{color:I}:void 0,padding:z0.symmetric(2,0),child:new U6({children:[...S,...m]})})}})}}function QK6(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/60000),X=Math.floor(Y/3600000),G=Math.floor(Y/86400000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;return J.toLocaleDateString()}class kf1 extends b6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((X,G)=>G.pubDate.getTime()-X.pubDate.getTime()),Y=Math.max(0,...Q.map((X)=>QK6(X.pubDate).length));return new JJ({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=V6.of(K),{colors:W}=q,H=G?N1.yellow:void 0,F=G?N1.black:W.foreground,U=N1.index(8),B=X.authors.map((L)=>L.name).join(", ")||"Community",D=(L,A)=>new Y0({width:A,child:U6.end([new _1({text:new l(L,new Q1({color:U}))})])});return new g0({decoration:H?{color:H}:void 0,padding:z0.symmetric(2,0),child:new U6({children:[new a6({child:new _1({text:new l(X.title,new Q1({color:F})),overflow:"ellipsis",maxLines:1})}),new Y0({width:2}),new _1({text:new l(B,new Q1({color:U})),maxLines:1}),new Y0({width:2}),D(QK6(X.pubDate),Y)]})})}})}}class yf1 extends b6{props;constructor(J){super();this.props=J}build(){return new j4({child:new _1({text:new l("",void 0,[new l(`Forked to new thread:
|
|
4523
4523
|
|
|
4524
4524
|
`,new Q1({color:N1.white,dim:!0})),new l(`"${this.props.newThreadTitle||"Untitled"}"`,new Q1({color:N1.white}))]),textAlign:"center"})})}}N0();class YK6 extends d0{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 Y=this.widget.props.currentLabels||[],Z=this.labels.some((G)=>G.name===Q),X=Y.includes(Q);return!Z&&!X}build(J){let Q=V6.of(J),{colors:Y}=Q,Z=this.currentQuery.trim().toLowerCase(),X=Z.length>0?this.getValidationError(Z):null,G=this.getAvailableLabels(),K=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...G];return new JJ({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,F)=>{let U=W?N1.yellow:void 0,B=W?N1.black:Y.foreground;if("__isCreateMarker"in q&&q.__isCreateMarker){let L=this.currentQuery.trim().toLowerCase();return new g0({decoration:U?{color:U}:void 0,padding:z0.symmetric(2,0),child:new _1({text:new l("",void 0,[new l("Create new label: ",new Q1({color:B})),new l(L,new Q1({color:B,bold:!0}))])})})}return new g0({decoration:U?{color:U}:void 0,padding:z0.symmetric(2,0),child:new _1({text:new l(q.name,new Q1({color:B}))})})},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 F=W.trim().toLowerCase();return F.length===0||q.name.includes(F)},sortItems:(q,W,H)=>{let F="__isCreateMarker"in q.item&&q.item.__isCreateMarker,U="__isCreateMarker"in W.item&&W.item.__isCreateMarker;if(F&&!U)return-1;if(!F&&U)return 1;return W.score-q.score}})}}class xf1 extends l0{props;constructor(J){super();this.props=J}createState(){return new YK6}}class MS extends l0{props;constructor(J){super();this.props=J}createState(){return new ZK6}}class ZK6 extends d0{_spinner=new DY;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=V6.of(J),{colors:Y}=Q,Z=B4.all(new W4(Y.foreground,1,"solid")),X=this._spinner.toBraille(),G=new _1({textAlign:"center",text:new l("",void 0,[new l(X,new Q1({color:N1.yellow})),new l(" ",void 0),new l(this.widget.props.message,new Q1({color:Y.foreground}))])}),K=[new a6({child:new v0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[G]})})];if(this.widget.props.onAbort)K.push(new Y0({height:2,child:new g0({padding:z0.symmetric(2,0),child:new _1({text:new l("",new Q1({dim:!0}),[new l("Press ",new Q1({color:Y.foreground})),new l("Esc",new Q1({color:Y.info})),new l(" to cancel",new Q1({color:Y.foreground}))])})})}));let q=new g0({decoration:new T8(N1.default(),Z),child:new Y0({width:60,height:7,child:new v0({mainAxisAlignment:"start",children:K})})});if(this.widget.props.onAbort)return new w8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:q});return q}}class hI extends l0{props;constructor(J){super();this.props=J}createState(){return new XK6}}class XK6 extends d0{scrollController=new D5;scrollAreaKey=new wQ("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(J){return J instanceof yX}getViewportHeight(){let Q=this.scrollAreaKey.currentElement?.renderObject;if(Q&&"size"in Q){let Y=Q.size;if(typeof Y.height==="number"&&Y.height>0)return this.viewportHeight=Y.height,Y.height}return this.viewportHeight}build(J){let Q=V6.of(J),Y=this.widget.props.message,Z=(()=>{if(this.isWidgetMessage(Y))return{title:Y.title,type:Y.type};if(Y instanceof Error&&Y.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Y.message};if(Y instanceof Error&&Y.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Y.message};let H=T71(Y);return{title:H.title,type:H.type,description:H.description}})(),X=Z.type==="error"?N1.red:N1.yellow,G=B4.all(new W4(N1.default(),1,"solid")),V=new g0({padding:z0.symmetric(1,0),child:new _1({text:new l(Z.title,new Q1({color:X,bold:!0}))})}),K=this.isWidgetMessage(Y)?Y.widget:new _1({text:new l(Z.description,new Q1({color:N1.default()})),selectable:!0}),q=new a6({child:new Zz({child:new g0({padding:z0.symmetric(1,0),child:new U6({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new a6({child:new t9({controller:this.scrollController,autofocus:!0,child:K})}),new w2({controller:this.scrollController,thumbColor:Q.app.scrollbarThumb,trackColor:Q.app.scrollbarTrack,getScrollInfo:()=>{let H=this.scrollController.maxScrollExtent,F=this.scrollController.offset,U=this.getViewportHeight(),B=H+U;return{totalContentHeight:Math.max(B,0),viewportHeight:Math.max(U,1),scrollOffset:Math.max(F,0)}}})]})})})}),W=new g0({padding:z0.symmetric(1,0),child:new _1({text:this.widget.props.onRetry?new l("",void 0,[new l("Press ",new Q1({color:N1.default(),dim:!0})),new l("R",new Q1({color:N1.yellow})),new l(" to retry, ",new Q1({color:N1.default(),dim:!0})),new l("Esc",new Q1({color:N1.yellow})),new l(" to cancel",new Q1({color:N1.default(),dim:!0}))]):new l("Press any key to close",new Q1({color:N1.default(),dim:!0,italic:!0}))})});return new w8({onKey:(H)=>{if(this.widget.props.onRetry&&H.key==="r")return this.widget.props.onRetry(),"handled";if(H.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new g0({decoration:{border:G,color:N1.default()},padding:z0.all(1),child:new v0({mainAxisAlignment:"center",children:[V,new Y0({height:1}),q,W]})})})}}class vf1 extends b6{build(){return new j4({child:new _1({text:new l("",void 0,[new l(`✓ Thread Shared
|
|
4525
4525
|
|
|
@@ -4628,7 +4628,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
4628
4628
|
`)?`${K}...`:X,W=new Q1({color:N1.index(8)}),H=[new l(q,W)];if(V>0){let F=new Q1({color:Y.success});for(let U=1;U<=V;U++)H.push(new l(" ")),H.push(new l(`[${U}]`,F))}return new B6({padding:z0.only({bottom:0}),child:new U6({crossAxisAlignment:"start",children:[new B6({padding:z0.only({right:1}),child:new _1({text:new l("•",new Q1({color:N1.index(8)}))})}),new a6({child:new _1({text:new l("",void 0,H)})})]})})}}class zg1 extends l0{createState(){return new LH6}}class LH6 extends d0{_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 Q1({color:N1.red}),Y=new Q1({color:this._visible?N1.red:N1.transparent()});return new U6({children:[new _1({text:new l("⏺",Y)}),new Y0({width:1}),new _1({text:new l("Replay",Q)})]})}}class Ug1 extends b6{entry;width;constructor({key:J,entry:Q,width:Y}){super({key:J});this.entry=Q,this.width=Y}build(J){let Y=V6.of(J).colors.mutedForeground,Z=this.entry,X=Z.authors[0]?.name||"Community";if(X.includes("@"))X=X.split("@")[0]??X;let G=" · ",V=50,K=this.truncateToWidth(Z.title,V),q=`${G}${K}`,W=Math.max(1,this.width-q.length-2),H=Z.description.replace(/\s+/g," ").trim(),F=`@${X}: ${H}`,U=this.truncateToWidth(F,W),B=new _1({text:new l(U,new Q1({color:Y,dim:!0}))}),D=new _1({text:new l(q,new Q1({color:Y,dim:!0}))});return new z8({onClick:()=>e2(J,Z.link),cursor:"pointer",child:new Y0({width:this.width,height:1,child:new B6({padding:z0.horizontal(1),child:new U6({children:[new a6({child:new aj(new Y0({width:W,height:1,child:B}))}),D]})})})})}truncateToWidth(J,Q){if(J.length<=Q)return J;return J.slice(0,Q-1)+"…"}}s0();function vj8(J){let Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/3600000),X=Math.floor(Z/24),G=Math.floor(X/7),V=Math.floor(X/30);if(Z<1)return"Just now";if(Z<24)return`${Z}h ago`;if(X<7)return`${X}d ago`;if(G<=4)return`${G}w ago`;return`${V}mo ago`}class Bg1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Y)=>{let Z=this.threadHistoryService.observeThreadList().subscribe((X)=>{Z.unsubscribe(),Y(X)})});return{ok:!0,threads:this.formatThreadSummaries(Q,J)}}catch(Q){return{ok:!1,errorMsg:Q instanceof Error?Q.message:"An unexpected error occurred"}}}observeThreadSummaries(J=""){return this.threadHistoryService.observeHistory().pipe(X6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((Z)=>{if(Z.mainThreadID)return!1;if(!Q.trim())return!0;let X=Z.title?.toLowerCase()||"untitled",G=Z.id.toLowerCase(),V=Q.toLowerCase();return X.includes(V)||G.includes(V)}).map((Z)=>{let X=new Date(Z.userLastInteractedAt),G=vj8(X),V=Z.id.slice(-8),K=Z.env?.initial.trees?.[0]?.uri;return{id:Z.id,title:Z.title||"Untitled",updatedAt:new Date(Z.userLastInteractedAt).toISOString(),description:{timeAgo:G,title:Z.title||"Untitled",shortThreadID:V},diffStats:Z.summaryStats?.diffStats,workspaceURI:K,parentRelationships:Z.parentRelationships,agentMode:Z.agentMode,details:{messageCount:Z.summaryStats?.messageCount}}})}}N0();U8();U8();Cb();function AH6(J){let Q=PM0(J),Y=Array.from(Q.entries()).map(([V,K])=>({path:V,diffStats:K})),Z=am0(J),G=YP(J)?.totalInputTokens??0;return{filesAffected:Y,totalTokens:G,totalCredits:Z}}class Ng1{currentId=null;current=null;statsCache=new Map;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new D5;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)}getCurrentThread(){return this.current}getCurrentStats(){if(!this.current)return null;let J=this.statsCache.get(this.current.id);if(J&&J.version===this.current.v)return J.stats;let Q=AH6(this.current);return this.statsCache.set(this.current.id,{stats:Q,version:this.current.v}),Q}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(LL()).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 OH6(J,Q){switch(J){case"update-available":return[new l("A newer Amp is available. Run ",new Q1({color:Q.foreground,dim:!0})),new l("amp update",new Q1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new l("Update complete, run ",new Q1({color:Q.foreground,dim:!0})),new l("amp update",new Q1({color:Q.warning})),new l(" to see warnings",new Q1({color:Q.foreground,dim:!0}))];case"update-error":return[new l("Update failed, run ",new Q1({color:Q.foreground,dim:!0})),new l("amp update",new Q1({color:Q.warning})),new l(" to see warnings",new Q1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function mj8(J){return new Promise((Q)=>{fj8("git",["branch","--show-current"],{cwd:J},(Y,Z)=>{if(Y){Q(null);return}let X=Z.trim();Q(X||null)})})}class RH6 extends l0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new P21}}class P21 extends d0{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 Ng1;previewThread=null;todoScrollController=(()=>{let J=new D5;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;currentGitBranch=null;messageViewFocusNode=new M8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new M8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;imagePreviewIndex=null;adActionModal=null;threadFeedReader=null;currentThreadFeedEntry=null;threadFeedEntries=[];threadFeedSubscription=null;threadFeedRotationTimer=null;threadFeedHidden=!1;threadFeedTickerQueue=[];hasSubmittedFirstMessage=!1;currentUserInfo=null;newsFeedReader=null;newsFeedEntries=[];newsFeedSubscription=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;handoffController=null;handoffState={isInHandoffMode:!1,isGeneratingHandoff:!1,isConfirmingAbortHandoff:!1,pendingHandoffPrompt:null,spinner:null};pendingMCPServers=[];mcpTrustSubscription=null;pendingOAuthRequest=null;mcpServers=[];mcpServersSubscription=null;agentModeController=null;freeTierStatus={canUseAmpFree:!1};agentModePulseSeq=0;agentModeSlideProgress=null;agentModeSlideTimer=null;updateState="hidden";updateServiceSubscription=null;toastController=new ex1;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 M6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Y=Q.includes("localhost")||Q.includes("127.0.0.1");try{let V=await this.widget.dependencies.internalAPIClient.getUserInfo({},{config:this.widget.dependencies.configService});if(V.ok){let K=V.result,q="user"in K?K.user:K;this.currentUserInfo={username:q.username??void 0,displayName:q.displayName??void 0};let W="ffe10a0c-6c42-41ce-a3a6-38990fd6caf8";if(!Y&&K.team?.id!==W)return}else return}catch(V){v.debug("Failed to fetch user info for thread feed filtering",V);return}let Z="/threads.rss",X=async(V,K)=>{let q=V instanceof Request?V.url:V.toString();return C5(q,K,this.widget.dependencies.configService)},G=Yj1();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,F)=>F.pubDate.getTime()-H.pubDate.getTime());this.threadFeedTickerQueue=[...q,...this.threadFeedTickerQueue];let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}),this.threadFeedReader=new Bx1(G,X,{url:Z}),this.threadFeedSubscription=this.threadFeedReader.stream().subscribe({next:(V)=>{try{let K=this.filterEntries(V);if(K.length>0){this.threadFeedEntries=[...K,...this.threadFeedEntries];let q=[...K].sort((W,H)=>H.pubDate.getTime()-W.pubDate.getTime());if(this.threadFeedTickerQueue=[...q,...this.threadFeedTickerQueue],!this.currentThreadFeedEntry){let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}catch(K){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:Y}=this.currentUserInfo;return J.filter((Z)=>{return!Z.authors.some((X)=>{let G=X.name;if(!G)return!1;return Q&&G===Q||Y&&G===Y||Q&&G.includes(Q)})})}rotateThreadFeed(){if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);this.threadFeedRotationTimer=setInterval(()=>{let J=this.getNextFeedEntry();if(J)this.setState(()=>{this.currentThreadFeedEntry=J})},30000)}resetThreadFeedRotation(){this.rotateThreadFeed()}getNextFeedEntry(){if(this.threadFeedTickerQueue.length>0)return this.threadFeedTickerQueue.shift();return null}async initNewsFeed(){let J=async(Y)=>{return C5(Y,void 0,this.widget.dependencies.configService)},Q=Yj1();this.newsFeedReader=new Ux1(Q,J,"/news.rss"),this.newsFeedSubscription=this.newsFeedReader.stream().subscribe({next:(Y)=>{if(Y.length>0)this.setState(()=>{this.newsFeedEntries=[...Y,...this.newsFeedEntries]})},error:(Y)=>{v.error("News feed error:",Y)}})}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};onThreadSwitch(){this.handoffController?.resetUIState(),this.isMessageViewInSelectionMode=!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.onThreadSwitch(),this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Y,baseWpm:Z}=J,X=Q.messages;for(let G=0;G<X.length;G++){if(this.replayAbortController.signal.aborted)break;let V=X[G];if(!V)continue;if(G>0)await this.replaySleep(J.messageDelayMs);if(V.role==="user"&&Y){let W=V.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
|
|
4629
4629
|
`);if(W)await this.replayTypeMessage(W,Z)}if(V.role==="assistant"){let W=V.content.some((U)=>U.type==="tool_use"),H=X[G+1],F=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&F){let U={...V,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let B=J.thread.id;this.getMessageScrollController(B).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),k8.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Y=J.split(/(?<=\s)/),Z=60000/Q;for(let X of Y){if(this.replayAbortController.signal.aborted)break;if(this.looksLikePastedContent(X.trim())){await this.replaySleep(150),this.textController.text=this.textController.text+X,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{}),await this.replaySleep(300);continue}let G=Z/X.length;for(let V of X){this.textController.text=this.textController.text+V,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let K=0.8+Math.random()*0.4,q=G*K;await this.replaySleep(q)}}}looksLikePastedContent(J){if(/^[a-z][a-z0-9+.-]*:\/\//i.test(J))return!0;if(J.startsWith("/")&&J.length>10)return!0;if(/^[a-z]:\\/i.test(J))return!0;if(/^[a-f0-9]{7,40}$/i.test(J))return!0;if(/^T-[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(J))return!0;return!1}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return this.agentModeController?.getEffectiveMode()??"smart"}isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;if(J.viewState.state!=="active")return!1;if(Boolean(J.viewState.inferenceState==="running"))return!0;let Y=J.items.filter((G)=>G.type==="toolResult").filter((G)=>G.toolResult.run.status==="in-progress"||G.toolResult.run.status==="queued"),Z=J.subagentActiveTools.filter((G)=>G.toolRun.status==="in-progress"||G.toolRun.status==="queued");return[...Y,...Z].length>0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new l(this.submitDisabledHint,new Q1({color:J.foreground,dim:!0}));if(this.isExiting)return new l("Exiting...",new Q1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new l("",void 0,[new l("Ctrl+C",new Q1({color:Q.keybind})),new l(" again to exit",new Q1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new l("",void 0,[new l("Esc",new Q1({color:Q.keybind})),new l(" again to clear input",new Q1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new l("",void 0,[new l("Escape",new Q1({color:Q.keybind})),new l(" to close help",new Q1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let Z=this.getEffectiveAgentMode(),X=E21(Z);return new l("",void 0,[new l("Images aren't supported in ",new Q1({color:J.warning,dim:!1})),new l(Z,new Q1({color:X})),new l(" mode.",new Q1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new l("",void 0,[new l("Esc",new Q1({color:Q.keybind})),new l(" again to cancel",new Q1({color:J.foreground,dim:!0}))]);return new l("",void 0,[new l("Esc",new Q1({color:Q.keybind})),new l(" to cancel",new Q1({color:J.foreground,dim:!0}))])}if(this.statusMessage)return new l(this.statusMessage,new Q1({color:J.foreground,dim:!0}));let Y=OH6(this.updateState,J);if(Y)return new l("",void 0,Y);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Y}=this.widget.dependencies;if(!Q.mainThread?.id)return;let X=Q.mainThread?.messages.findIndex((G)=>G===J);if(X===void 0||X===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),await Y.handle({type:"thread:truncate",fromIndex:X}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(G){v.error("Failed to edit message:",G)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Y,threadSyncService:Z}=this.widget.dependencies,X=Q.mainThread?.id;if(!X)return;let G=Q.mainThread?.messages.findIndex((V)=>V===J);if(G===void 0||G<=0)return;try{let V=await r3.getOrCreateForThread(Y,X),K=await rC(V,Z,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:Y,worker:Z}=this.widget.dependencies,X=Y.mainThread;if(!X)return;let G=X.messages.findIndex((V)=>V.messageId!==void 0&&V.messageId===J.messageId);if(G===-1)return;try{this.cancelBashInvocations(),await Z.cancel(),this.widget.dependencies.history.add(Q);let V=$M(Q);if(V)await Z.handle({type:"thread:truncate",fromIndex:G}),this.invokeBashCommand(V.cmd,{visibility:V.visibility});else{let K=[{type:"text",text:Q}];if(this.imageAttachments.length>0)K.push(...this.imageAttachments);let q={content:K,agentMode:X.agentMode},W=G===0;if(X.agentMode&&!W&&q.agentMode!==X.agentMode){v.error(`Cannot edit message: This thread uses ${X.agentMode} mode. To change mode, create a new thread.`);return}await Z.handle({type:"user:message",message:q,index:G})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(V){v.error("Failed to edit message:",V)}};getAffectedFiles=async(J)=>{let{worker:Q,threadState:Y}=this.widget.dependencies;try{let Z=Y.mainThread;if(!Z)return[];let X=Z.messages.findIndex((V)=>V===J);if(X===-1)return[];return(await Q.getFilesAffectedByTruncation(X)).map(u3)}catch(Z){return v.error("Failed to get affected files:",Z),[]}};textController=new DZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new D5);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let Z=this.searchElementTreeByKey(J.child,Q);if(Z)return Z}if(J?.children)for(let Z of J.children){let X=this.searchElementTreeByKey(Z,Q);if(X)return X}return null}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{this.toastController.show("Selection copied to clipboard","success",2000)}}}updateTerminalTitle(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.title;if(Q!==this.currentTitle){this.currentTitle=Q;let Y=process.cwd().replace(process.env.HOME||"","~"),Z=Q?`amp - ${Q} - ${Y}`:"";process.stdout.write(Cy1(Z))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new G3("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands;paletteConfig;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"&&!this.handoffState.isGeneratingHandoff){this.showCommandPalette(),this.textController.clear();return}let Q=$M(J);this.currentShellModeStatus=this.handoffState.isInHandoffMode?void 0: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}),n8.instance.addPostFrameCallback(()=>{this.autocompleteFocusNode.requestFocus()})};handleIdeSelection=async(J,Q)=>{if(this.widget.dependencies.ideClient.getSelectedConfig()?.pid===J.pid){this.dismissIdePicker();return}try{await this.connectToSelectedIde(J,Q)}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})}this.widget.dependencies.ideClient.selectConfig(J),this.dismissIdePicker()};async connectToSelectedIde(J,Q){await this.widget.dependencies.ideClient.start(J,!0,Q)}previewControllerListener=(J)=>{this.setState(()=>{this.previewThread=J})};showStandaloneThreadPicker=()=>{this.showCommandPalette({type:"standalone",commandId:"continue",onSubmit:()=>{this.threadPreviewController.clear(),this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null}),n8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette)this.autocompleteFocusNode.requestFocus()})},onCancel:()=>{this.exitApplication()}})};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(J){if(this.handoffState.isGeneratingHandoff)return;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 af1(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 sf1(this.widget.dependencies.fuzzyServer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null})};getCommandPaletteContext=(J)=>{let{threadState:Q,recentThreadIDs:Y}=this.widget.dependencies;if(!Q.mainThread)return null;let Z=m0.file(process.cwd()),X=h6(Z);return{recentThreadIDs:Y,currentThreadID:Q.mainThread.id,context:J,worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:Q.mainThread,ampURL:this.widget.dependencies.ampURL,threadService:this.widget.dependencies.threadService,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,skillService:this.widget.dependencies.skillService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let G=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),G},setImageAttachments:(G)=>{this.setState(()=>{this.imageAttachments=G})},editorDispatch:(G)=>{switch(G.type){case"set-input":this.textController.clear(),this.textController.insertText(G.input);break;case"insert-text":this.textController.insertText(G.text);break;case"clear":this.textController.clear();break}},submitMessage:(G)=>{return this.proceedWithUserMessage(G)},exitApp:this.exitApplication,openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},settingsStorage:this.widget.dependencies.settingsStorage,clientId:this.widget.dependencies.clientId,connectedClientsService:this.widget.dependencies.connectedClientsService,mcpService:this.widget.dependencies.mcpService,toolboxService:this.widget.dependencies.toolboxService,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 F=setTimeout(()=>G.abort(new QS("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(F),await this.switchToExistingThread(U),{ok:!0}}catch(U){if(clearTimeout(F),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 Ze({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)},enterHandoffMode:this.enterHandoffMode}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new Bg1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.clustersForPicker=NK6(Q),this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await mj8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Y=Date.now(),Z=`bash-${Y}-${Math.random().toString(36).substring(7)}`,X={cmd:J},G=new AbortController;this.widget.dependencies.worker.invokeBashTool(X,G.signal,Q===XM).subscribe({next:(V)=>{this.setState(()=>{if(this.bashInvocations.find((q)=>q.id===Z))this.bashInvocations=this.bashInvocations.map((q)=>q.id===Z?{...q,toolRun:V}:q);else{let q={id:Z,args:X,toolRun:V,startTime:Y,abortController:G,hidden:Q===XM};this.bashInvocations=[...this.bashInvocations,q]}})},error:()=>this.removeBashInvocation(Z),complete:()=>this.removeBashInvocation(Z)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};showContextDetailOverlay=()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!0}),this.fetchThreadCostInfo()};fetchThreadCostInfo=VY6(()=>{let J=this.widget.dependencies.threadID;this.widget.dependencies.internalAPIClient.threadDisplayCostInfo({threadID:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(Q.ok)this.setState(()=>{this.threadCostInfo=Q.result,this.threadCostInfoThreadID=J})}).catch(()=>{this.setState(()=>{this.threadCostInfo=void 0,this.threadCostInfoThreadID=J})})},150);maybeRefetchThreadCostInfo=(J,Q)=>{let Y=J!==this.threadCostInfoLastUsageLedgerLength,Z=Q==="idle"&&this.lastInferenceState==="running";if(this.threadCostInfoLastUsageLedgerLength=J,this.lastInferenceState=Q,Y||Z)this.fetchThreadCostInfo()};toggleAgentMode=()=>{if(!this.agentModeController)return;if(this.agentModeController.toggle())this.setState(()=>{this.showImageUnsupportedHint=!1,this.agentModePulseSeq++})};startAgentModeSlide=()=>{if(this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer);this.setState(()=>{this.agentModeSlideProgress=0});let J=400,Q=16,Y=Q/J;this.agentModeSlideTimer=setInterval(()=>{this.setState(()=>{if(this.agentModeSlideProgress!==null){if(this.agentModeSlideProgress=Math.min(1,this.agentModeSlideProgress+Y),this.agentModeSlideProgress>=1){if(this.agentModeSlideProgress=null,this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null}}})},Q)};handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!my(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>=QB)return!1;let Y=ij(J);if(typeof Y==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Y]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Y}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};handleImageClick=(J)=>{this.setState(()=>{this.imagePreviewIndex=J})};handleImagePreviewDismiss=()=>{this.setState(()=>{this.imagePreviewIndex=null})};handleImageRemove=(J)=>{this.setState(()=>{this.imageAttachments=this.imageAttachments.filter((Q,Y)=>Y!==J),this.imagePreviewIndex=null})};handleShowMysteryModal=()=>{if(this.mysteriousMessage)this.setState(()=>{this.isShowingMysteriousMessageModal=!0})};handleDestructMysteriousMessage=()=>{if(!this.mysteriousMessage)return;let J=this.mysteriousMessage.id;this.widget.dependencies.internalAPIClient.markAsReadMysteriousMessage({messageId:J},{config:this.widget.dependencies.configService}).then((Q)=>{if(!Q.ok)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)})};enterHandoffMode=()=>{this.handoffController?.enter(),this.dismissPalette()};exitHandoffMode=()=>{this.handoffController?.exit()};submitHandoff=async(J)=>{let Q=this.imageAttachments;if(this.resetHistory(),this.setState(()=>{this.imageAttachments=[]}),!this.handoffController){this.showSubmitDisabledHint("Handoff controller not initialized");return}let Y=await this.handoffController.submit(J,Q);if(!Y.ok&&Y.error.message!=="Cancelled")this.displayMessage=Y.error,this.setState(()=>{})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Y,unlink:Z,rmdir:X,writeFile:G}=await import("node:fs/promises"),{tmpdir:V}=await import("node:os"),K=await import("node:path");try{let q=await Q(K.join(V(),"amp-edit-")),W=K.join(q,"message.amp.md");await G(W,J,"utf-8"),await UG(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")v.error("Failed to read temporary file",H)}try{await Z(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()&&this.imageAttachments.length===0)return;if(this.handoffState.isInHandoffMode){await this.submitHandoff(J);return}let Q=$M(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(()=>{})};handoffListener=(J)=>{this.setState(()=>{this.handoffState=J})};initState(){if(RX.getInstance().interceptConsole(),this.freeTierStatus=this.widget.dependencies.freeTierStatus,this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.handoffController=new Zv1({threadService:this.widget.dependencies.threadService,configService:this.widget.dependencies.configService,getMainThread:()=>this.widget.dependencies.threadState.mainThread,getFilesystemReader:()=>this.widget.dependencies.worker.fs.fileSystemReader(),switchToThread:(Y)=>this.switchToExistingThread(Y)}),this.handoffController.addListener(this.handoffListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();k8.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),k8.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),k8.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{n8.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),M6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y,this.agentModeController=new Ox1({initialCliMode:this.widget.dependencies.initialAgentMode,sessionState:this.widget.dependencies.sessionState??null,freeTierStatus:this.freeTierStatus,initialSettings:Y.settings,config$:this.widget.dependencies.configService.config,getThread:()=>this.widget.dependencies.getCurrentWorker()?.thread??this.widget.dependencies.worker.thread}),this.agentModeController.addListener(this.agentModeListener)}),this.updateGitBranch(),this.balanceInfoSubscription=Y26(async()=>{let Y=await this.widget.dependencies.internalAPIClient.userDisplayBalanceInfo({},{config:this.widget.dependencies.configService});if(!Y.ok)throw Y.error;return Y.result}).subscribe({next:(Y)=>{this.setState(()=>{this.userDisplayBalanceInfo=Y})},error:(Y)=>{v.debug("Failed to fetch user balance info",Y)}}),this.scheduleAdSubscriptionWithIdeReadiness();let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=Y})}),Xy1((Y)=>{this.setState(()=>{this.pendingOAuthRequest=Y})}),this.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Y)=>{this.setState(()=>{this.mcpServers=Y})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Y)=>{let Z=this.isIdeReadyForAdContext();if(this.setState(()=>{this.ideStatus=Y}),!Z&&this.isIdeReadyForAdContext()){if(this.adReadinessTimeout)clearTimeout(this.adReadinessTimeout),this.adReadinessTimeout=null;if(!this.adSubscription)this.subscribeToAds()}}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Y)=>{let Z=this.widget.dependencies.getCurrentWorker();if(!Z){v.warn("No active thread worker found to handle IDE message");return}await new Promise((X)=>setTimeout(X,50)),await Z.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}}),v.debug("Message sent from IDE to agent",{message:Y.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Y)=>{this.textController.insertText(Y),v.debug("Appended text to CLI prompt from IDE",{text:Y.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Y)=>{this.setState(()=>{this.connectedClientsStatus=Y})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Y)=>{this.setState(()=>{this.updateState=Y})}),this.mysteriousMessageSubscription=r51(this.widget.dependencies.configService).pipe(P5((Y)=>Y!=="pending"),X6((Y)=>s51(Y)?Y.mysteriousMessage??null:null),E4((Y,Z)=>Y?.id===Z?.id)).subscribe((Y)=>{this.setState(()=>{if(Y?.id!==this.mysteriousMessage?.id)this.isShowingMysteriousMessageModal=!1;if(this.mysteriousMessage=Y,Y&&!this.mysterySequenceManager)this.mysterySequenceManager=new U71(new Map([[new z71(P21.MYSTERY_SEQUENCE),new fp]])),this.mysteryKeyInterceptorUnsubscribe=k8.instance.addKeyInterceptor((Z)=>{if(!this.mysterySequenceManager)return!1;if(this.isShowingMysteriousMessageModal)return!1;let X=this.mysterySequenceManager.handleKeyEvent(Z);if(X.consumed){if(X.intent)this.handleShowMysteryModal();return this.setState(()=>{this.mysterySequenceProgress=X.progress}),!0}else if(this.mysterySequenceProgress)this.setState(()=>{this.mysterySequenceProgress=null});return!1});else if(!Y)this.mysteryKeyInterceptorUnsubscribe?.(),this.mysteryKeyInterceptorUnsubscribe=null,this.mysterySequenceManager?.dispose(),this.mysterySequenceManager=null,this.mysterySequenceProgress=null})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Y)=>{let Z=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${Z}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showIdePickerHint)this.toastController.show("Use /ide to connect to an IDE","success",5000);else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100);this.initThreadFeed(),this.initNewsFeed()}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener();let Q=this.widget.dependencies.threadID;if(this.threadCostInfoThreadID!==void 0&&this.threadCostInfoThreadID!==Q)this.threadCostInfo=void 0,this.threadCostInfoThreadID=void 0,this.threadCostInfoLastUsageLedgerLength=0,this.fetchThreadCostInfo();let{threadState:Y}=this.widget.dependencies;this.maybeRefetchThreadCostInfo(Y.mainThread?.usageLedger?.events.length??0,Y.viewState.state==="active"?Y.viewState.inferenceState:void 0)}dispose(){if(this.replayAbortController.abort(),this.replayTypingTimer)clearTimeout(this.replayTypingTimer);if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeController)this.agentModeController.removeListener(this.agentModeListener),this.agentModeController.dispose();if(this.handoffController)this.handoffController.removeListener(this.handoffListener),this.handoffController.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(Xy1(null),this.mcpServersSubscription)this.mcpServersSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.newsFeedSubscription)this.newsFeedSubscription.unsubscribe();if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);if(this.agentModeSlideTimer)clearInterval(this.agentModeSlideTimer),this.agentModeSlideTimer=null;if(this.mysteriousMessageSubscription)this.mysteriousMessageSubscription.unsubscribe();if(this.mysteryKeyInterceptorUnsubscribe?.(),this.mysterySequenceManager?.dispose(),this.threadPreviewController.removeListener(this.previewControllerListener),this.threadPreviewController.dispose(),this.toastController.dispose(),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.textController.removeListener(this.textChangeListener);for(let J of this.messageScrollControllers.values())J.dispose();if(this.messageScrollControllers.clear(),process.stdout.write(Cy1("")),this.shouldUseProgressBar())process.stdout.write(EQ6())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,Z=[...J.items.filter((K)=>K.type==="toolResult").map((K)=>({toolUse:K.toolUse,toolRun:K.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((K)=>K.toolRun.status==="blocked-on-user");if(Z.length===0)return null;let X=Z[0],G=X.toolRun.status==="blocked-on-user"?X.toolRun.toAllow??[]:[],V=X.toolRun.status==="blocked-on-user"?X.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:X.toolUse,toAllow:G}],subthreadID:X.subthreadID,reason:V}}shouldUseProgressBar(){return!1}updateProgressBar(){}static AD_READINESS_TIMEOUT_MS=1000;scheduleAdSubscriptionWithIdeReadiness(){if(this.isIdeReadyForAdContext()){this.subscribeToAds();return}this.adReadinessTimeout=setTimeout(()=>{if(this.adReadinessTimeout=null,!this.adSubscription)this.subscribeToAds()},P21.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=ay1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{let J=this.agentModeController?.getMode();return(J&&A9(J)||this.randomAd===null)&&ny1(this.lastUserInteractionTime)},this.widget.dependencies.codebaseContextService,()=>this.widget.dependencies.worker.thread).subscribe({next:(J)=>{if(J){let Q=bj8(16).toString("hex");this.lastAdImpressionId=Q,Promise.resolve().then(() => (w21(),I21)).then(({recordAdEvent:Y})=>{let Z=this.widget.dependencies.worker.thread,X=Z.messages[Z.messages.length-1];Y("viewed",{adId:J.id,advertiserId:J.advertiserId,threadId:Z.id,messageId:X?.messageId,impressionId:Q,placement:"tui",matchType:J.metadata?.matchType,matchedPatterns:J.metadata?.matchedPatterns,candidateAdPoolCount:J.metadata?.candidateAdPoolCount,clientRegion:J.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=J}),n8.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 Y=Q.tools[0]?.useBlock;if(!Y){v.error("No tool use block found in confirmation");return}if(J==="allow-all-session")YV("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 e2(this.context,X);return}if(J==="disable-librarian"){let X=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!X.includes(Xq))await this.widget.dependencies.settingsStorage.set("tools.disable",[...X,Xq],"global")}let Z=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let X={type:"user:tool-input",toolUse:Y.id,value:{accepted:Z}};if(Q.subthreadID)await(await r3.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 Y=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Y)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Y=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Y.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.agentModeController?.setMode("smart"),this.setState(()=>{this.dismissedEphemeralErrorKey=null}),$51({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 UG(Q.getSettingsFilePath())}catch(Y){let Z=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${Z}`)}};cancelStreamingMessage=async()=>{await r3.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let Y=J.messages[Q];if(Y?.role==="user"&&!Y.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Y=!0}=Q;if(Y){let Z=this.widget.dependencies.worker.thread.id;if(Z!==J)this.recordNavigation(Z)}try{v.info(`[switchToExistingThread] Switching to thread: ${J}`);let Z=await this.widget.dependencies.switchToThread(J);if(v.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${Z.thread.agentMode}`),this.widget.dependencies.worker=Z,this.widget.dependencies.threadID=Z.thread.id,this.widget.dependencies.switchWorker(Z),v.info("[switchToExistingThread] Clearing agent mode"),this.agentModeController?.setMode(null),this.onThreadSwitch(),Z.thread.draft)if(v.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof Z.thread.draft==="string")this.textController.insertText(Z.thread.draft);else{let X=Z.thread.draft.filter((K)=>K.type==="text"),G=Z.thread.draft.filter((K)=>K.type==="image"),V=X.map((K)=>K.text).join(`
|
|
4630
4630
|
`);if(V)this.textController.insertText(V);if(G.length>0)this.setState(()=>{this.imageAttachments=G})}}catch(Z){throw v.error("Failed to switch to thread:",J,Z),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.handoffController?.clearPendingPrompt(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Y=V2(Q.thread)===0,Z=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Y&&Z!==Q.thread.agentMode){await this.showErrorMessage(`This thread uses ${Q.thread.agentMode} mode. To change mode, edit the first message or create a new thread.`);return}let X=[{type:"text",text:J}];if(this.imageAttachments.length>0)X.push(...this.imageAttachments);if(Y)this.startAgentModeSlide();if(await Q.handle({type:"user:message",message:{content:X,agentMode:Z}}),Y)$51({agentMode:Z});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),n8.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})};async showErrorMessage(J){this.setState(()=>{this.displayMessage=Error(J)})}exitApplication=async()=>{this.setState(()=>{this.isExiting=!0});let J=this.widget.dependencies.threadState.mainThread;if(J?.messages.length===0){if(J.relationships?.find((Z)=>Z.type==="handoff"&&Z.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();$51({agentMode:Q}).catch((Y)=>{v.warn("Failed to save session state on exit:",Y)}).finally(()=>{k8.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=gj8();if(J===Q)return"~";if(J.startsWith(Q+Id.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(Id.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(Id.sep),"…",Q.slice(-2).join(Id.sep)].join(Id.sep)}build(J){let Q=C4.of(J),Y=V6.of(J),Z=Y.base;this.themeColors=Z;let{colors:X,app:G}=Y;this.themeApp=G;let V=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,K=V.thread.agentMode&&A9(V.thread.agentMode),q=this.widget.dependencies.features.some((v6)=>v6.name===oy1.UBI&&v6.enabled),W=this.widget.dependencies.freeTierStatus.canUseAmpFree&&q,H=(K||W)&&this.randomAd!==null,F=!K&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden,U=Boolean(H),{threadState:B}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let D=this.getCurrentConfirmation(),L=this.widget.dependencies.replayMode,A=Boolean(L),I=B.items,E=B.mainThread||void 0,P=B.subagentToolsByParentID,R=B.todosList;if(A){let v6={...L.thread,messages:this.replayDisplayedMessages};I=zS(v6).items,E=v6,P={};let E6=TU({messages:this.replayDisplayedMessages});R=Array.isArray(E6)?E6:[]}let C=E?.id,S=E,k=A?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),f=(v6)=>new T31({key:new G3(`preview-message-view-${v6.id}`),items:zS(v6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:v6,focusNode:new M8({debugLabel:"PreviewFocus"})}),m=this.previewThread,b=m?m.messages.length>2000?new v0({mainAxisSize:"max",children:[new a6({child:new Y0}),new B6({padding:z0.all(2),child:new j4({child:new _1({text:new l("Thread too long for preview",new Q1({color:X.mutedForeground,dim:!0}))})})})]}):f(m):k?new S31({agentMode:this.getEffectiveAgentMode(),mysteriousMessage:this.mysteriousMessage,mysterySequenceProgress:this.mysterySequenceProgress,onShowMysteryModal:this.handleShowMysteryModal,userDisplayBalanceInfo:this.userDisplayBalanceInfo}):new T31({key:C?new G3(`message-view-${C}`):void 0,items:I,subagentToolsByParentID:P,controller:C?this.getMessageScrollController(C):new D5,autofocus:!1,onCopy:A?void 0:this._handleTextCopy.bind(this),thread:S,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,isInHandoffMode:this.handoffState.isInHandoffMode,completionBuilder:A?void 0:this.getCompletionBuilder()}),d=Math.max(Math.floor(Q.size.height*0.4),12),Y1=this.getCurrentEphemeralError(),r=Q.size.width<40,p=B.mainThread?YP(B.mainThread):void 0,a=N31(J),J1=this.buildBottomWidget(Y1,D,X,Y,B,R,d,U,A,p,Q,a),$1=new p71({threadViewState:B.viewState,threadTokenUsage:p,threadID:C??null,thread:B.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,mcpServers:this.mcpServers,isNarrow:r,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!D,showingEphemeralError:Boolean(B.viewState.state==="active"&&B.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}),o=new k71({bashInvocations:this.bashInvocations}),s=[];if(F&&this.currentThreadFeedEntry)s.push(new Ug1({entry:this.currentThreadFeedEntry,width:Q.size.width}));let n=this.getEffectiveAgentMode(),H1=this.currentShellModeStatus,T1=E21(n),e=!H1?n.length+1:0,M1=Q.capabilities.animationSupport,L1=M1==="disabled"?0:M1==="slow"?30:60,s1=Gq(n)?.uiHints?.fasterAnimation?3:1,R1=L1>0&&this.agentModePulseSeq>0?new X5({children:[J1,new M5({top:0,left:1,right:1,height:1,child:new Vg1({color:T1,trigger:this.agentModePulseSeq,fps:L1,speed:s1,leftOffset:e})})]}):J1;s.push(new a6({child:b}),o);let g1=new X5({children:[new v0({mainAxisSize:"min",children:[H?new wf1({ad:this.randomAd,onButtonClick:async()=>{let v6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (w21(),I21)).then(({recordAdEvent:V8})=>{let u8=this.widget.dependencies.worker.thread,Q2=u8.messages[u8.messages.length-1];V8("clicked",{adId:v6.id,advertiserId:v6.advertiserId,threadId:u8.id,messageId:Q2?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:v6.metadata?.matchType,matchedPatterns:v6.metadata?.matchedPatterns,candidateAdPoolCount:v6.metadata?.candidateAdPoolCount,clientRegion:v6.metadata?.clientRegion})});if(!await e2(this.context,v6.shortDestinationUrl)){let u8=k8.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:u8,url:v6.shortDestinationUrl}})}}}):new Y0({height:0}),new g0({constraints:new O6(0,Q.size.width,0,d),child:R1})]}),U?new M5({top:0,left:0,right:0,child:new jH6({userHeight:this.bottomGridUserHeight,maxHeight:d,onInitializeHeight:(v6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(v6,d)})},onDrag:(v6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(v6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let E6=Math.floor(v6.localPosition.y)-this.bottomGridDragStartY,V8=Math.max(4,this.bottomGridDragStartHeight-E6),u8=Math.min(V8,d),Q2=Math.floor(u8);if(this.bottomGridUserHeight!==Q2)this.setState(()=>{this.bottomGridUserHeight=Q2})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new Y0({height:0})]});s.push(g1,new Y0({height:1,child:new B6({padding:z0.horizontal(1),child:$1})}));let K1=new v0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:s}),U1=A&&L?.showIndicator!==!1?new X5({children:[K1,new M5({top:0,left:0,child:new zg1})]}):K1,F1=new C8(()=>{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.handoffState.isInHandoffMode){if(this.handoffState.isGeneratingHandoff)this.handoffController?.cancelGeneration();else this.exitHandoffMode();return"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.handoffState.isConfirmingAbortHandoff&&this.handoffController){let E6=this.handoffController.getPendingPrompt();return this.textController.clear(),this.setState(()=>{this.imageAttachments=[]}),this.handoffController.confirmAbort().then((V8)=>{if(V8&&E6)this.textController.text=E6,this.handoffController?.clearPendingPrompt()}),"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((E6)=>{v.error("Failed to mark message as interrupted:",E6)}),this.cancelStreamingMessage().catch((E6)=>{v.error("Failed to cancel streaming message:",E6)});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.handoffController?.getEmptyHandoffParentThreadID())return this.handoffController.startAbortConfirmation(),"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"}),w1=new C8(()=>{return this.onExitPressed(),"handled"}),I1=new C8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),h1=new C8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),b1=new C8(()=>{return fJ.instance.toggleAll(),"handled"}),o1=new C8(()=>{return this.widget.dependencies.configService.getLatest().then((v6)=>{YV("internal.showDetailedCosts",!(v6.settings["internal.showDetailedCosts"]??!1))}),"handled"}),x1=new C8(()=>{return k8.instance.toggleFrameStatsOverlay(),"handled"}),r1=new C8(()=>{return k8.instance.tuiInstance.getScreen().markForRefresh(),n8.instance.requestFrame(),"handled"}),V0=new C8(()=>{return this.toggleAgentMode(),"handled"}),c0=new C8(()=>{let E6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:V8}=this.widget.dependencies,u8=V8.mainThread?.id;return u8?this.getMessageScrollController(u8):null})();if(E6){let V8=Math.max(Math.floor(Q.size.height*0.4),10),u8=Q.size.height-V8;E6.animatePageUp(u8,100)}return"handled"}),e0=new C8(()=>{let E6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:V8}=this.widget.dependencies,u8=V8.mainThread?.id;return u8?this.getMessageScrollController(u8):null})();if(E6){let V8=Math.max(Math.floor(Q.size.height*0.4),10),u8=Q.size.height-V8;E6.animatePageDown(u8,100)}return"handled"}),D6=new C8(()=>{let E6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:V8}=this.widget.dependencies,u8=V8.mainThread?.id;return u8?this.getMessageScrollController(u8):null})();if(E6)E6.animateTo(0,100);return"handled"}),A6=new C8(()=>{let E6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:V8}=this.widget.dependencies,u8=V8.mainThread?.id;return u8?this.getMessageScrollController(u8):null})();if(E6)E6.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),F4=new C8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";if(this.handoffState.isInHandoffMode)return"ignored";let{threadState:v6}=this.widget.dependencies;if(!v6.mainThread?.messages.some((V8)=>V8.role==="user"||XP(V8)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),H0=new C8((v6)=>{if(v6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),j0=new C8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return P71().then(async(v6)=>{if(v6)try{this.handleInsertImage(v6)}finally{try{let{unlink:E6}=await import("node:fs/promises");await E6(v6)}catch{}}}),"handled"}),R0=new Map([[N4.ctrl("c"),new Sp],[N4.ctrl("l"),new vp],[N4.ctrl("o"),new A71],[N4.ctrl("v"),new Cp],[N4.alt("s"),new sj],[N4.ctrl("s"),new sj],[N4.alt("p"),new xp],[N4.ctrl("r"),new kp],[N4.alt("d"),new yp],[N4.ctrl("t"),new hp],[N4.key("PageUp"),new N71],[N4.key("PageDown"),new M71],[N4.key("Home"),new D71],[N4.key("End"),new L71],[N4.key("Escape"),new jp],[N4.ctrl("p"),new tj("previous")],[N4.ctrl("n"),new tj("next")],[N4.key("Tab"),new bp]]);if(!e3())R0.set(N4.key("ArrowUp"),new bp);if(!1)R0.set(N4.alt("c"),new _p);let p6=new C8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),W8=new C8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),U4=new C8(()=>{if(this.mysteriousMessage)this.handleShowMysteryModal();return"handled"}),R4=new Map([[jp,F1],[vp,r1],[sj,V0],[A71,p6],[Cp,j0],[_p,I1],[W71,h1],[kp,b1],[yp,o1],[xp,x1],[hp,W8],[Sp,w1],[N71,c0],[M71,e0],[D71,D6],[L71,A6],[bp,F4],[tj,H0],[fp,U4]]),z4=[U1];if(this.isShowingConsoleOverlay)z4.push(new Jb1);if(this.isShowingHelp&&this.paletteConfig)z4.push(new Zb1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)z4.push(new dh1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.isShowingMysteriousMessageModal&&this.mysteriousMessage)z4.push(new Wg1({message:this.mysteriousMessage,onDestruct:this.handleDestructMysteriousMessage}));if(this.adActionModal)z4.push(new Ef1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(v6)=>{let E6=this.adActionModal.url;if(v6==="copy")try{await k8.instance.tuiInstance.clipboard.writeText(E6),this.setState(()=>{this.displayMessage=new LY("Link copied to clipboard")})}catch(V8){v.error("Failed to copy to clipboard",{error:V8}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:v6}=this.widget.dependencies;z4.push(new Kg1({servers:this.pendingMCPServers,onAlwaysTrust:v6.trustAlways.bind(v6),onTrustOnce:v6.trustOnce.bind(v6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:v6.deny.bind(v6)}))}if(this.pendingOAuthRequest)z4.push(new Hg1({request:this.pendingOAuthRequest,onDismiss:()=>{this.setState(()=>{this.pendingOAuthRequest=null})}}));if(this.isShowingFileChangesOverlay)z4.push(new Uv1({threadData:B}));if(this.isShowingContextDetailOverlay){let v6=this.threadCostInfo?.costBreakdownURL;z4.push(new Qb1({thread:B.mainThread??void 0,tokenUsage:p??void 0,costInfo:this.threadCostInfo,onDismiss:()=>{this.setState(()=>{this.isShowingContextDetailOverlay=!1})},onOpenCostBreakdown:v6?()=>{e2(J,v6)}:void 0}))}if(this.isShowingConfirmationOverlay)z4.push(new tf1({details:this.confirmationOverlayContent}));if(this.imagePreviewIndex!==null&&this.imagePreviewIndex<this.imageAttachments.length){let v6=this.imageAttachments[this.imagePreviewIndex];if(v6)z4.push(new j4({child:new nb1({image:v6,imageIndex:this.imagePreviewIndex,onDismiss:this.handleImagePreviewDismiss,onRemove:()=>this.handleImageRemove(this.imagePreviewIndex)})}))}let r6=this.getCommandPaletteContext(J);if(r6&&this.isShowingPalette&&this.paletteConfig)z4.push(new j4({child:new rf1({commandContext:r6,mainThread:B.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})}));if(this.isShowingIdePicker)z4.push(new $b1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let i6=new X5({children:z4});if(this.isShowingJetBrainsInstaller)return new II({child:new yJ({actions:R4,child:new kX({shortcuts:R0,debugLabel:"jetbrains-installer-shortcuts",child:new Gg1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Xz({controller:this.toastController,child:new II({child:new Jv1({controller:this.toastController,child:new yJ({actions:R4,child:new kX({shortcuts:R0,debugLabel:"main-app-shortcuts",child:i6})})})})})}buildScrollableTodoList(J,Q,Y){return new TH6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,Z,X,G,V,K,q,W,H,F){if(J)return new Yb1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new ef1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new qg1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let U=this.handoffState.isInHandoffMode?[]:S71(Z),B=this.agentModeController?.isInRestrictedFreeMode()??!1,D=new vI({key:this.textFieldKey,controller:this.textController,triggers:q?[]:[new TW],completionBuilder:q?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:q?void 0:this.onTextSubmitted,theme:Y,placeholder:q?"Press Ctrl+C to exit":B?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!B&&!this.isShowingStandalonePalette()&&!this.handoffState.isGeneratingHandoff,shellPromptRules:U,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:k8.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,onImageClick:this.handleImageClick,previousThreadId:this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let s=this.previousThreadIdForHint;if(s)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${s} `},onDoubleAtTrigger:q?void 0:()=>{let s=this.textController.text,n=this.textController.cursorPosition,T1=s.slice(0,n).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(T1!==-1){let e=this.textController.text,M1=e.slice(0,T1)+e.slice(T1+2);this.textController.text=M1,this.textController.cursorPosition=T1}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),L=X.mainThread?.queuedMessages??[],A=Array.isArray(G)&&G.length>0,E=Array.isArray(L)&&L.length>0?new Fg1({queuedMessages:L}):void 0,P=A?this.buildScrollableTodoList(G,this.isTextfieldAndAutocompleteFocused&&!B,Z):void 0,R=[],C=this.currentShellModeStatus;if(C)R.push({child:new _1({text:new l(C==="hidden"?"shell mode (incognito)":"shell mode",new Q1({color:C==="hidden"?Z.app.shellModeHidden:Z.app.shellMode}))}),position:"top-left"});if(this.handoffState.isInHandoffMode){let s=new Q1({color:Z.app.handoffMode}),n=this.handoffState.isGeneratingHandoff&&this.handoffState.spinner?new l("",void 0,[new l("handoff ",s),new l(this.handoffState.spinner.toBraille(),s)]):new l("handoff (submit a goal for the new thread)",s);if(R.push({child:new _1({text:n}),position:"top-left"}),this.handoffState.isGeneratingHandoff)R.push({child:new _1({text:new l("",void 0,[new l("Esc",new Q1({color:Z.app.keybind})),new l(" to cancel",new Q1({color:Y.foreground,dim:!0}))])}),position:"bottom-left"})}let k=this.connectedClientsStatus&&this.connectedClientsStatus.enabled?this.connectedClientsStatusExpanded?(this.connectedClientsStatus?.clientID?.length??7)+3:3:0,f=this.handoffController?.getEmptyHandoffParentThreadID()??null,m=this.agentModeController?.getVisibleModes()??[];if(!C&&!this.handoffState.isInHandoffMode&&!f&&m.length>1){let s=this.previewThread,n=s?s.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),H1=E21(n),T1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,e=s??T1.thread,M1=V2(e)>0,L1=this.agentModeSlideProgress!==null,s1,R1,g1=(U1)=>Math.pow(U1,4);if(L1){s1="top-left";let F1=H.size.width-n.length-4-k,w1=g1(this.agentModeSlideProgress);R1=Math.floor(w1*F1)}else if(M1)s1="top-right",R1=k;else s1="top-left",R1=void 0;let K1=M1&&!L1,Z1;if(L1){let U1=g1(this.agentModeSlideProgress??0);Z1=new Q1({color:H1,dim:U1>0.3})}else if(K1)Z1=new Q1({color:Y.foreground,dim:!0});else Z1=new Q1({color:H1});if(s)R.push({child:new _1({text:new l(n,Z1)}),position:s1,offsetX:R1});else{let U1=!M1&&!L1,F1=new _1({text:new l(n,Z1)});R.push({child:U1?new z8({child:F1,onClick:this.toggleAgentMode,cursor:"pointer"}):F1,position:s1,offsetX:R1})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let s=this.connectedClientsStatus,n=s.mode||"disconnected",H1=!!s.errorMessage,T1=s.clientID||"unknown",e,M1;if(H1)e="●",M1=N1.red;else if(n==="presence")e="○",M1=N1.yellow;else if(n==="connected"&&s.connected)e="●",M1=N1.green;else e="○",M1=N1.yellow;let L1=this.connectedClientsStatusExpanded?`${T1} ${e}`:e;R.push({child:new z8({child:new _1({text:new l(L1,new Q1({color:M1}))}),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,d;if(b)d=m0.parse(b).fsPath;else d=process.cwd();let Y1=this.toHomeRelative(d),r=this.shorten(Y1),p=!q&&this.currentGitBranch?`${r} (${this.currentGitBranch})`:r;if(R.push({child:new _1({text:new l(p,new Q1({color:Y.foreground,dim:!0}))}),position:"bottom-right"}),f){let s=this.getEffectiveAgentMode(),n=E21(s);R.push({child:new _1({text:new l(s,new Q1({color:n}))}),position:"top-left"});let H1=this.handoffState.isConfirmingAbortHandoff?" again to abort ":" to abort ";R.push({child:new _1({text:new l("",void 0,[new l("Esc",new Q1({color:Z.app.keybind})),new l(H1,new Q1({color:Y.foreground,dim:!0})),new l("handoff",new Q1({color:Z.app.handoffMode}))])}),position:"bottom-left"})}if(!f&&this.previousThreadIdForHint&&(X.mainThread?.messages.length??0)===0&&this.textController.text.trim()==="")R.push({child:new _1({text:new l("",void 0,[new l("press ",new Q1({color:Y.foreground,dim:!0})),new l("enter",new Q1({color:Z.app.keybind})),new l(" to reference the previous thread",new Q1({color:Y.foreground,dim:!0}))])}),position:"bottom-left"});let J1=this.previewThread,$1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(V2($1.thread)>0&&!C&&!this.handoffState.isInHandoffMode&&!J1){let s=[],n=new Q1({color:Y.foreground,dim:!0}),H1=new l(" · ",n);if(W){let T1=W.totalInputTokens/W.maxInputTokens,e=Math.round(T1*100),M1=Math.max(0,Math.min(e,100)),L1=u71(T1,W.maxInputTokens),s1=n;if(L1==="danger")s1=new Q1({color:Y.destructive});else if(L1==="warning")s1=new Q1({color:Y.warning});else if(L1==="recommendation")s1=new Q1({color:Z.app.recommendation});let R1=Math.round(W.maxInputTokens/1000);s.push(new l(`${M1}% of ${R1}k`,s1))}if(F&&this.threadCostInfo){let T1=p31(this.threadCostInfo,{colors:{foreground:Y.foreground},dim:!0});if(T1.length>0){if(s.length>0)s.push(H1);s.push(...T1)}}if(s.length>0){let T1=new _1({text:new l("",void 0,s)});R.push({child:F?new z8({child:T1,onClick:this.showContextDetailOverlay,cursor:"pointer"}):T1,position:"top-left"})}}return new qv1({leftChild:new a6({child:D}),rightChild1:E,rightChild2:P,maxHeight:V,overlayTexts:R,borderColor:B||!this.isTextfieldAndAutocompleteFocused||this.handoffState.isGeneratingHandoff?N1.index(8):void 0,hasBanner:K,userHeight:this.bottomGridUserHeight,onInitializeHeight:(s)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(s,V)})},onDrag:(s)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(s.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let n=Math.floor(s.localPosition.y)-this.bottomGridDragStartY,H1=Math.max(4,this.bottomGridDragStartHeight-n),T1=Math.min(H1,V),e=Math.floor(T1);if(this.bottomGridUserHeight!==e)this.setState(()=>{this.bottomGridUserHeight=e})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!K})}}async function Ag1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)k8.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let Z=()=>null,G=!1;if(G)process.env.AMP_INSPECTOR_ENABLED="1";let V=new sF(G,1000,J.inspectorPort),K=J.features.find((A)=>A.name===oy1.AMP_CONNECT)?.enabled??!1,q=new Of1({threadService:J.threadService,worker:J.worker,builder:(A,I,E,P,R,C)=>{if(Z=R,J.threadDependencies&&K)Lx1(J.threadDependencies,J.configService,R,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((f)=>{v.error("Failed to start automatic presence:",f)});let S=R(),k={...J,worker:S,threadID:S.thread.id};return new RH6({...k,threadState:I,workerController:E,switchWorker:P,getCurrentWorker:R,recentThreadIDs:C})}}),W=new Wv1({configService:J.configService,child:q}),H=new ch1({configService:J.configService,child:W}),F=new ix1(H),U=new V6({data:ej.fromBaseTheme(BG.default()),child:F});try{await dy1(U,{onRootElementMounted:(A)=>{if(v.info("TUI input ready for user interaction"),G)V.start(A),IZ6(A)}})}finally{if(G)V.stop(),wZ6();if(J.threadDependencies&&K){let{stopGlobalSession:A}=await Promise.resolve().then(() => (Ax1(),MZ6));A()}}let D=Z()?.thread.id||J.threadID,L=await J.threadService.get(D);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${D}`;lZ6(L,A,J.stdout)}}function E21(J){let Y=Gq(J)?.uiHints?.secondaryColor;if(Y)return N1.rgb(Y.r,Y.g,Y.b);return uj8(J)}class TH6 extends l0{props;constructor(J){super();this.props=J}createState(){return new CH6}}class CH6 extends d0{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Y,appTheme:Z}=this.widget.props;return new U6({crossAxisAlignment:"stretch",children:[new a6({child:new t9({controller:Y,autofocus:!1,child:new If1({todos:Q})})}),new w2({controller:Y,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:X,offset:G}=Y,V=this.viewportHeight,K=X+V;return{totalContentHeight:Math.max(K,0),viewportHeight:Math.max(V,1),scrollOffset:Math.max(G,0)}}})]})}updateViewportHeight(){let J=this.getViewportHeight();if(J!==this.viewportHeight)this.viewportHeight=J}getViewportHeight(){let J=this.context.findRenderObject();if(!J)return this.viewportHeight;let Q=(Z,X=0)=>{if(Z&&"size"in Z&&"children"in Z){let G=Z.children||[];for(let V of G){if(V&&"size"in V){let q=V.size;if(typeof q?.height==="number"&&q.height>0)return q.height}let K=Q(V,X+1);if(K>0)return K}}return 0},Y=Q(J);if(Y>0)return Y;if("size"in J){let Z=J.size;if(typeof Z?.height==="number"&&Z.height>0)return Z.height}return this.viewportHeight}}class jH6 extends b6{props;constructor(J){super();this.props=J}build(J){return new z8({child:new Y0({height:1}),cursor:I9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let Z=J.findRenderObject()?.size.height??0;if(Z>0){this.props.onInitializeHeight(Z);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function uj8(J){let Q=0;for(let X=0;X<J.length;X++){let G=J.charCodeAt(X);Q=(Q<<5)-Q+G,Q=Q&Q}let Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],Z=Math.abs(Q)%Y.length;return N1.index(Y[Z])}py1();try{if(process.platform==="win32")await Promise.resolve().then(() => Q6(lS(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){TY.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
4631
|
-
`)}var om1=am1.join(jB0||am1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function Kx8(J){process.emitWarning=function(Q,Y,Z,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Y||"Warning",K=!1;J.warn(G,{name:V,code:Z})}}function TG(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")YV("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")YV("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")YV("model.sonnet",Q.useSonnet)}async function sm1(J){try{await $x8(am1.dirname(om1),{recursive:!0}),await Gx8(om1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function qx8(){try{return(await YB6(om1,"utf-8")).trim()}catch(J){return null}}function Wx8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function Hx8(J){try{let Q=await U5.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 eU6=[{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??qG,description:`Custom settings file path (overrides the default location ${qG})`},{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 ${GI})`},{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:e3(),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:tE.SMART.key,description:`Set the agent mode (${M$().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:M$().map((J)=>J.mode).concat("large")}],JB6=(J)=>("deprecated"in J)&&J.deprecated===!0,Fx8=(J)=>("hidden"in J)&&J.hidden===!0,zx8=(J)=>("default"in J),Ux8=(J)=>("default"in J)?J.default:void 0;function Bx8(J,Q){let Y=Q.args[0],Z=Q.commands.map((G)=>G.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let G=Z.filter((K)=>Y.includes(K)||K.includes(Y)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new f8(KG.unknownCommand(Y),1,V)}}var ZB6=null;function nb5(){return ZB6}function ld(J){return{...J,getThreadEnvironment:y91,vfs:pj0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new sh(J.fileSystem),generateThreadTitle:ne0,deleteThread:(Q)=>J.threadService.delete(Q)}}var tm1=m0.file(Vx8.homedir()),XB6=process.env.XDG_CONFIG_HOME?m0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(tm1,".config");async function mX(J,Q){IA0("0.0.
|
|
4631
|
+
`)}var om1=am1.join(jB0||am1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function Kx8(J){process.emitWarning=function(Q,Y,Z,X){let G=typeof Q==="string"?Q:Q.message||String(Q),V=Y||"Warning",K=!1;J.warn(G,{name:V,code:Z})}}function TG(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")YV("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")YV("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")YV("model.sonnet",Q.useSonnet)}async function sm1(J){try{await $x8(am1.dirname(om1),{recursive:!0}),await Gx8(om1,J,"utf-8")}catch(Q){v.debug("Failed to save last thread ID",Q)}}async function qx8(){try{return(await YB6(om1,"utf-8")).trim()}catch(J){return null}}function Wx8(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}async function Hx8(J){try{let Q=await U5.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 eU6=[{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??qG,description:`Custom settings file path (overrides the default location ${qG})`},{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 ${GI})`},{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:e3(),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:tE.SMART.key,description:`Set the agent mode (${M$().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:M$().map((J)=>J.mode).concat("large")}],JB6=(J)=>("deprecated"in J)&&J.deprecated===!0,Fx8=(J)=>("hidden"in J)&&J.hidden===!0,zx8=(J)=>("default"in J),Ux8=(J)=>("default"in J)?J.default:void 0;function Bx8(J,Q){let Y=Q.args[0],Z=Q.commands.map((G)=>G.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let G=Z.filter((K)=>Y.includes(K)||K.includes(Y)),V="Run amp --help for a list of available commands.";if(G.length>0)V=`Did you mean: ${G.join(", ")}? Or run amp --help for all commands.`;throw new f8(KG.unknownCommand(Y),1,V)}}var ZB6=null;function nb5(){return ZB6}function ld(J){return{...J,getThreadEnvironment:y91,vfs:pj0({os:J.fileSystem},J.configService.config),skillService:J.skillService,fileChangeTrackerStorage:new sh(J.fileSystem),generateThreadTitle:ne0,deleteThread:(Q)=>J.threadService.delete(Q)}}var tm1=m0.file(Vx8.homedir()),XB6=process.env.XDG_CONFIG_HOME?m0.file(process.env.XDG_CONFIG_HOME):n0.joinPath(tm1,".config");async function mX(J,Q){IA0("0.0.1766117434-gebf7c3");let Y=mU1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:Q0.of([m0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:tm1,userConfigDir:XB6}),{initializeCLITelemetry:Z}=await Promise.resolve().then(() => (w21(),I21));Z(Y);let X=await Y.getLatest();v.debug("Global configuration initialized",{settingsKeys:Object.keys(X.settings)});let{toolService:G,dispose:V}=Z86({configService:Y}),K=new Map,q=()=>K.clear(),W=new uD1(Y,J.settings.getWorkspaceRootPath()),H=Zx0({configService:Y,filesystem:o9}),F=Mj0({configService:Y,trustStore:W,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(r,p,a)=>{let J1=`${r}:${p}`,$1=K.get(J1);if($1)return v.debug("Reusing existing OAuth provider for server",{serverName:r,serverUrl:p}),$1;v.debug("Creating OAuth provider for server",{serverName:r,serverUrl:p});let o=(async()=>{let s=new rL(J.secrets),n=await s.getClientInfo(r,p),H1=a?.scopes??n?.scopes,T1=y26();v.info("OAuth headless mode check",{useHeadless:T1,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:$5.isTTY});let e=void 0;if(T1)e=J.executeMode?k26():_26(r);let M1=new fD1({storage:s,serverName:r,serverUrl:p,clientId:a?.clientId??n?.clientId,clientSecret:a?.clientSecret??n?.clientSecret,authUrl:a?.authUrl??n?.authUrl,tokenUrl:a?.tokenUrl??n?.tokenUrl,scopes:H1,headlessAuthHandler:e});return v.debug("OAuth provider created",{serverName:r,serverUrl:p,hasManualClientId:!!(a?.clientId??n?.clientId),willUseDCR:!(a?.clientId??n?.clientId),scopes:H1,headlessMode:T1,executeMode:J.executeMode}),M1})();return K.set(J1,o),o}}),U=Yu({configService:Y,filesystem:o9,spawn:yN,skillToolboxDirs:H.skillToolboxDirs}),{initializeToolProviders:B,startToolProviders:D}=await Promise.resolve().then(() => (tU6(),sU6)),L;if(J.executeMode){let r=await B({toolService:G,providers:[F,U],initialTimeout:15000});L=r.registrations;for(let[p,a]of r.initErrors)v.warn(`${p} provider initialization slow or failed:`,a)}else L=D({toolService:G,providers:[F,U]});if(Q.jetbrains)TP("JetBrains");else if(Q.ide&&FJ6())TP("VS Code");else if(Q.ide&&zJ6())TP("Neovim");if(J.executeMode)wA0(!0);let A,I=v7.status.pipe(X6((r)=>Boolean(r.connected&&r.authenticated)),E4()).subscribe((r)=>{if(r){if(!A)A=G.registerTool(n06)}else A?.dispose(),A=void 0}),E;if(!J.executeMode){let r=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new c91(process.cwd(),{alwaysIncludePaths:r},!0)}else E=new class extends c91{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if($5.write(`No API key found. Starting login flow...
|
|
4632
4632
|
`),!await Nx8(J))await VI(),process.exit(1)}let P=await qx0({isDevelopment:!1}),R=new oj1(P,Y),C=new Zj1(P,{lazy:!0}),S=Q.notifications!==void 0?Q.notifications:!J.executeMode,k=$86({playNotificationSound:async(r)=>{if(S){X86(r);let p=my1(),a=uy1();if((!p||a)&&X.settings["notifications.system.enabled"]!==!1){if(r==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(r==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:R,configService:Y});v.info("Starting Amp background services");let f=oe0({threadService:R,threadHistoryService:C,configService:Y,isExtensionDevelopment:!1}),m;v7.status.subscribe((r)=>{m=r});let b=new Oq1({workspaceRoots:[m0.file(process.cwd())],getCurrentFile:()=>{if(!m?.openFile)return;try{return m0.parse(m.openFile)}catch(r){v.warn("Failed to parse current file URI",{uri:m.openFile,error:r});return}},getOpenFiles:()=>{if(!m?.visibleFiles?.length)return[];let r=m.openFile;return m.visibleFiles.filter((p)=>p!==r).map((p)=>{try{return m0.parse(p)}catch(a){return v.warn("Failed to parse visible file URI",{uri:p,error:a}),null}}).filter((p)=>p!==null)}}),d=new cy1,Y1={codebaseContextService:b,configService:Y,toolService:G,mcpService:F,skillService:H,toolboxService:U,trustStore:W,threadService:R,threadHistoryService:C,threadSyncService:f,threadStorage:P,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:k,fileSystem:Q.jetbrains||Q.ide?gj0:o9,terminal:d};return{...Y1,async asyncDispose(){if(Y1.mcpService.hasAuthenticatingClients())v.info("Waiting for OAuth authentication to complete before exit..."),await Y1.mcpService.waitForAuthentication();for(let r of L.values())r.dispose();await Y1.mcpService.dispose(),q(),await Y1.threadService.asyncDispose(),Y1.configService.unsubscribe(),V(),Y1.fuzzyServer.dispose(),Y1.threadSyncService.dispose(),Y1.settingsStorage[Symbol.dispose](),I.unsubscribe(),A?.dispose()}}}async function Nx8(J){if(!J.executeMode){if(!await Dy1("Would you like to log in to Amp? [(y)es, (n)o]: "))return $5.write(`Login cancelled. Run the command again to retry.
|
|
4633
4633
|
`),!1}return await $B6(J)}async function $B6(J){let Q=Xx8(32).toString("hex"),Y=await My1(J.ampURL,Q),Z=new AbortController;try{await CU(Y,Z.signal)}catch(G){v.error("Error opening browser",{error:G})}let X=await My1(J.ampURL,Q,!1);$5.write(`If your browser does not open automatically, visit:
|
|
4634
4634
|
|
|
@@ -4638,7 +4638,7 @@ ${H6.blue.bold(X)}
|
|
|
4638
4638
|
Login successful! You can now use the Amp CLI.
|
|
4639
4639
|
`),!0}catch(G){return v.error("Login failed",{error:G}),TY.write(`
|
|
4640
4640
|
Login failed: ${G instanceof Error?G.message:String(G)}
|
|
4641
|
-
`),!1}}function Mx8(){let J=new KW().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)Dj(),process.exit(0);let F=H.originalError??H;Q26(F)}),J.option("-V, --version","Print the version number and exit",()=>{let F;try{F=`, ${PR(new Date("2025-12-
|
|
4641
|
+
`),!1}}function Mx8(){let J=new KW().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)Dj(),process.exit(0);let F=H.originalError??H;Q26(F)}),J.option("-V, --version","Print the version number and exit",()=>{let F;try{F=`, ${PR(new Date("2025-12-19T04:15:38.696Z"))} ago`}catch{}$5.write(`0.0.1766117434-gebf7c3 (released 2025-12-19T04:15:38.696Z${F??""})
|
|
4642
4642
|
`),process.exit(0)}),J.addHelpText("after",qJ6()),J.configureHelp({formatHelp:WJ6}),J.command("logout").description("Log out by removing stored API key").action(async(H,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await Ox8(B)}),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,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await Ax8(B,await Gy1(U,B.settings))});let Q=async(H,F,U)=>{mU1({storage:F.settings,secretStorage:F.secrets,workspaceRoots:Q0.of([m0.file(process.cwd())]),defaultAmpURL:F.ampURL,homeDir:tm1,userConfigDir:XB6});let B={...F,executeMode:!1};await rm1(B,{...H,openThreadSwitcher:!0},U)},Y=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await QB6(U,B,F)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await Cx8(U,B,F)}),Y.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,F,U)=>{let B=U.optsWithGlobals(),D=await pJ(B);if(F.pick)TY.write(`${H6.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
4643
4643
|
`);if(F.last||H||D.executeMode)await Tx8(B,D,H,U);else await Q(B,D,U)}),Y.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,F,U)=>{let B=U.optsWithGlobals(),D=await pJ(B);await Rx8(B,D,H,U)}),Y.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,F)=>{let U=F.optsWithGlobals(),B=await pJ(U);await QB6(U,B,F)}),Y.command("search <query>").alias("find").summary("Search threads").description(`Search for threads using a query DSL.
|
|
4644
4644
|
|
|
@@ -4654,8 +4654,8 @@ All matching is case-insensitive. File paths use partial matching.`).option("-n,
|
|
|
4654
4654
|
Or pipe via stdin: echo "your message" | amp --execute`);TG(Y,Q);let V=await mX(J,Q);ZB6=V;let K=ld(V),q=await Hx8(V.configService),W=Wx8(q?.email);if((J.executeMode||Q.streamJson)&&A9(Q.mode)&&!W)throw new f8(`Execute mode is not permitted with --mode '${Q.mode}'`,1);let H=async(b)=>{let d=await YB6(b,"utf-8"),Y1=JSON.parse(d);if(!A$(Y1.id))throw new f8(KG.invalidThreadId);return zJ1(V,{visibility:Z,agentMode:Q.mode,thread:Y1})},F=async(b)=>{if(!A$(b))throw new f8(KG.invalidThreadId);try{let[Y1,r]=await Promise.all([U5.getThreadLinkInfo({thread:b},{config:V.configService}),U5.getUserInfo({},{config:V.configService})]);if(Y1.ok&&r.ok){let p=Y1.result.creatorUserID,a=r.result.id;if(p&&p!==a&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new f8(`Cannot resume thread created by another user.
|
|
4655
4655
|
|
|
4656
4656
|
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(Y1){if(Y1 instanceof f8)throw Y1;v.warn("Failed to validate thread ownership in CLI, allowing to open",{error:Y1})}let d=await V.threadService.get(b)??void 0;return v.info(`[fetchAndStartThread] Loaded thread ${b}, agentMode: ${d?.agentMode??"undefined"}`),zJ1(V,{visibility:Z,agentMode:d?void 0:Q.mode,thread:d})},U=async()=>{try{if(Q.threadId)return F(Q.threadId);else return zJ1(V,{visibility:Z,agentMode:Q.mode})}catch(b){if(b instanceof f8)throw b;throw await pu(b,Q.threadId),Error("handleError should have called process.exit()")}},B=async()=>{return zJ1(V,{visibility:Z,agentMode:Q.mode})};if(Q.format==="jsonl")TY.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
4657
|
-
`),await VI(),process.exit(1);if(J.executeMode&&Q.remote)await eJ6(X,G,V.configService),await V.asyncDispose(),process.exit(0);let D=await U();if(J.executeMode)lJ6(V.mcpService,J.settings),await M26(D,D.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,I=!1;if(Q.jetbrains||Q.ide){await hA0();let b=_P({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let d=b[0];if(d)v7.selectConfig(d)}else I=!0}let E=J51("0.0.
|
|
4658
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,Z=await n26({...J,workspaceTrust:{current:!0,changes:Py},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 dJ6(J.mcpConfig);Z=cJ6(Z,G)}let X=await Z.get("url","global");if(!X)X=dY;if(!jU(X))v.info("Targeting custom Amp server",{ampURL:X});return Z=nM0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:JQ6(await Gy1(J,Z))}}function Dx8(J){let Q={};for(let Y=0;Y<J.length;Y++){let Z=J[Y];if(Z?.startsWith("--")){let G=Z.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Y+1];if(V&&!V.startsWith("--"))Q[G]=V,Y++}}return Q}async function Lx8(){let J=Dx8(process.argv);if(i36({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),Kx8(v),v.info("Starting Amp CLI.",{version:"0.0.
|
|
4657
|
+
`),await VI(),process.exit(1);if(J.executeMode&&Q.remote)await eJ6(X,G,V.configService),await V.asyncDispose(),process.exit(0);let D=await U();if(J.executeMode)lJ6(V.mcpService,J.settings),await M26(D,D.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,I=!1;if(Q.jetbrains||Q.ide){await hA0();let b=_P({jetbrainsOnly:Q.jetbrains});if(b.length===0){if(Q.jetbrains)A=!await V.configService.get("jetbrains.skipInstall")}else if(b.length===1){let d=b[0];if(d)v7.selectConfig(d)}else I=!0}let E=J51("0.0.1766117434-gebf7c3",V.settingsStorage),P=new b41(V.threadStorage),R=Q0.of([m0.file(process.cwd())]),C=Iq1(void 0,R),S=new Q51(V.mcpService,J.settings.getWorkspaceRootPath());if(X)D.handle({type:"user:message",message:{content:[{type:"text",text:X}]}});let f=await(async()=>{try{let b=await U5.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}})(),m=await ZQ6();v.info("Loaded session state:",m),await Ag1({codebaseContextService:V.codebaseContextService,stdout:process.stdout,history:new f91,fuzzyServer:V.fuzzyServer,settingsStorage:V.settingsStorage,threadService:V.threadService,threadHistoryService:V.threadHistoryService,threadSyncService:V.threadSyncService,threadID:D.threadID,threadFuzzyIndexer:P,worker:D,workerDeps:K,skillService:K.skillService,configService:V.configService,internalAPIClient:U5,ampURL:J.ampURL,startNewThread:B,switchToThread:F,ideClient:v7,connectedClientsService:new oo,commandRegistry:C,mcpService:V.mcpService,toolboxService:V.toolboxService,mcpTrustHandler:S,showJetBrainsInstaller:A,showIdePicker:L,showIdePickerHint:I,openThreadSwitcher:Q.openThreadSwitcher,updateService:E,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:m,freeTierStatus:{canUseAmpFree:f.canUseAmpFree},workspace:q?.team??null,features:q?.features??[],isDogfooding:W,threadDependencies:V,initialAgentMode:Y.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await V.asyncDispose(),process.exit(0)}async function pJ(J){if(J.interactive)TY.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
4658
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,Z=await n26({...J,workspaceTrust:{current:!0,changes:Py},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 dJ6(J.mcpConfig);Z=cJ6(Z,G)}let X=await Z.get("url","global");if(!X)X=dY;if(!jU(X))v.info("Targeting custom Amp server",{ampURL:X});return Z=nM0(Z),{executeMode:Q,isTTY:Y,ampURL:X,settings:Z,secrets:JQ6(await Gy1(J,Z))}}function Dx8(J){let Q={};for(let Y=0;Y<J.length;Y++){let Z=J[Y];if(Z?.startsWith("--")){let G=Z.slice(2).replace(/-([a-z])/g,(K,q)=>q.toUpperCase()),V=J[Y+1];if(V&&!V.startsWith("--"))Q[G]=V,Y++}}return Q}async function Lx8(){let J=Dx8(process.argv);if(i36({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),Kx8(v),v.info("Starting Amp CLI.",{version:"0.0.1766117434-gebf7c3",buildTimestamp:"2025-12-19T04:15:38.696Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new f8(KG.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await Mx8().parseAsync(process.argv)}iC1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await Lx8().catch(pu)});async function Ax8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),$5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
4659
4659
|
`);else if(!jU(J.ampURL))$5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
4660
4660
|
`);let Y=process.env.AMP_API_KEY;if(Y)$5.write(`API key found in environment variable, storing...
|
|
4661
4661
|
`),await Q.set("apiKey",Y,J.ampURL),$5.write(`API key successfully stored.
|
|
@@ -4668,7 +4668,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
4668
4668
|
`);else $5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
4669
4669
|
`);process.exit(0)}async function Ix8(J,Q,Y,Z,X){TG(X,J);let G=await mX(Q,J);try{let V=UJ1(Y);if(!V)BJ1(Y);let K=V,q=Z.trim();if(q.length===0)gX("Thread name cannot be empty");if(q.length>256)gX("Thread name cannot exceed 256 characters");if(!(await iS(K,G)).messages.length)gX("Cannot rename an empty thread.");let H=ld(G);await(await r3.getOrCreateForThread(H,K)).handle({type:"title",value:q}),v.info("GOT HERE"),await G.threadSyncService.sync(),v.info("GOT THERE"),$5.write(H6.green(`✓ Thread ${K} renamed to "${q}"
|
|
4670
4670
|
`)),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose();let K=`Failed to rename thread: ${V instanceof Error?V.message:String(V)}`;gX(K)}}async function wx8(J,Q,Y,Z){TG(Z,J);let X=await mX(Q,J);try{let G=UJ1(Y);if(!G)BJ1(Y);let K=await iS(G,X),q=uC(K);$5.write(q+`
|
|
4671
|
-
`),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)}`;gX(V)}}async function Ex8(J,Q,Y,Z,X){TG(X,J);let G=await mX(Q,J);try{let V=await em1(Y),K=await iS(V,G),q=Z.typing!==!1,W=parseInt(Z.wpm||"120",10),H=parseInt(Z.messageDelay||"1000",10),F=parseInt(Z.toolProgressDelay||"800",10),U=parseInt(Z.exitDelay||"3",10)*1000,B=Z.indicator!==!1,D=ld(G),L=K.id;await G.threadStorage.set(L,K);let A=await r3.getOrCreateForThread(D,L);await A.resume();let I=f41.fromWorker(A),E=new b41(G.threadStorage),P=Q0.of([m0.file(process.cwd())]),R=Iq1(void 0,P),C=new Q51(G.mcpService,Q.settings.getWorkspaceRootPath()),S=J51("0.0.
|
|
4671
|
+
`),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)}`;gX(V)}}async function Ex8(J,Q,Y,Z,X){TG(X,J);let G=await mX(Q,J);try{let V=await em1(Y),K=await iS(V,G),q=Z.typing!==!1,W=parseInt(Z.wpm||"120",10),H=parseInt(Z.messageDelay||"1000",10),F=parseInt(Z.toolProgressDelay||"800",10),U=parseInt(Z.exitDelay||"3",10)*1000,B=Z.indicator!==!1,D=ld(G),L=K.id;await G.threadStorage.set(L,K);let A=await r3.getOrCreateForThread(D,L);await A.resume();let I=f41.fromWorker(A),E=new b41(G.threadStorage),P=Q0.of([m0.file(process.cwd())]),R=Iq1(void 0,P),C=new Q51(G.mcpService,Q.settings.getWorkspaceRootPath()),S=J51("0.0.1766117434-gebf7c3",G.settingsStorage),k=Yu({configService:G.configService,filesystem:o9,spawn:yN,skillToolboxDirs:G.skillService.skillToolboxDirs});await Ag1({codebaseContextService:G.codebaseContextService,stdout:process.stdout,history:new f91,fuzzyServer:G.fuzzyServer,settingsStorage:G.settingsStorage,threadService:G.threadService,threadHistoryService:G.threadHistoryService,threadSyncService:G.threadSyncService,threadID:L,threadFuzzyIndexer:E,worker:I,workerDeps:D,skillService:D.skillService,configService:G.configService,internalAPIClient:U5,ampURL:Q.ampURL,startNewThread:async()=>I,switchToThread:async()=>I,ideClient:v7,connectedClientsService:new oo,commandRegistry:R,mcpService:G.mcpService,toolboxService:k,mcpTrustHandler:C,showJetBrainsInstaller:!1,updateService:S,isDogfooding:!1,replayMode:{thread:K,typingEnabled:q,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:F,exitDelayMs:U,showIndicator:B},freeTierStatus:{canUseAmpFree:!0},features:[]}),await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),await pu(V,Y)}}async function Px8(J,Q,Y,Z,X){TG(Z,J);let G=await mX(Q,J);try{let V=UJ1(Y);if(!V)BJ1(Y);let K=V,q=await U5.getUserInfo({},{config:G.configService}),W=q.ok?q.result:null,H=Y51(J,W);if(!H&&!X)gX("Must specify either --visibility or --support");if(H&&X)gX("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)gX(H.message);if(H)await G.threadSyncService.updateThreadMeta(K,Z51(H)),$5.write(H6.green("✓ ")+`Thread ${K} visibility changed to ${H}.
|
|
4672
4672
|
`);if(X){await iS(K,G);let F=typeof X==="string"?X:void 0;await z_0(G.threadService,K,G.configService,F),$5.write(H6.green("✓ ")+`Thread ${K} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
4673
4673
|
`)}await G.asyncDispose(),process.exit(0)}catch(V){await G.asyncDispose(),gX(`Failed to update thread: ${V instanceof Error?V.message:String(V)}`)}}async function Rx8(J,Q,Y,Z){TG(Z,J);let X=await mX(Q,J),G=ld(X);try{let V=await em1(Y),q=(await iS(V,X)).messages.length-1,W=await r3.getOrCreateForThread(G,V),H=await rC(W,X.threadSyncService,q);await Promise.all([X.threadSyncService.uploadThread(V),X.threadSyncService.uploadThread(H)]),await sm1(H),$5.write(`${H}
|
|
4674
4674
|
`),await X.asyncDispose(),process.exit(0)}catch(V){TY.write(`Error forking thread: ${V instanceof Error?V.message:String(V)}
|