@sourcegraph/amp 0.0.1764475877-g5fdda7 → 0.0.1764504080-gf1c679
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +10 -10
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -4159,15 +4159,15 @@ Actual: ${G}`)}async function yV8(J,Q,Y){let{execSync:X}=await import("node:ch
|
|
|
4159
4159
|
${N}`;if(G==="pnpm"&&N.includes("Unable to find the global bin directory"))M+=`
|
|
4160
4160
|
|
|
4161
4161
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4162
|
-
npm install -g @sourcegraph/amp`;V(Error(M))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}M0();M0();async function z41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=bV8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],M=V.time[K],L=Date.now();if(N)z=Math.floor((L-new Date(N).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return h.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return h.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function bV8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}a0();function F41(J,Q){let Y=new i4,X=Y.pipe(x8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new _V().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await cU(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=ZO(),W=await z41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await H41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await tg(W.latestVersion,z);let U=await YN(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await cU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as dK}from"node:process";function S56(J){let Q=new lA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(X)=>{await IC1(X.force||!1,X.verbose||!1,"0.0.
|
|
4162
|
+
npm install -g @sourcegraph/amp`;V(Error(M))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}M0();M0();async function z41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=bV8(J,K),H=W<0,z,U;if(V.time){let N=V.time[J],M=V.time[K],L=Date.now();if(N)z=Math.floor((L-new Date(N).getTime())/3600000);if(M)U=Math.floor((L-new Date(M).getTime())/3600000)}return h.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return h.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function bV8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}a0();function F41(J,Q){let Y=new i4,X=Y.pipe(x8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new _V().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await cU(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=ZO(),W=await z41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,N=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await H41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await tg(W.latestVersion,z);let U=await YN(W.latestVersion),N={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",N),Y.next("updated");else G.warn("success with warning",N),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await cU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as dK}from"node:process";function S56(J){let Q=new lA().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(X)=>{await IC1(X.force||!1,X.verbose||!1,"0.0.1764504080-gf1c679"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new lA("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(X)=>{await gV8(X.targetVersion)});J.addCommand(Y)}async function gV8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")dK.write(h4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4163
4163
|
|
|
4164
4164
|
`));try{if(!J){dK.write(h4.blue(`Checking for updates...
|
|
4165
|
-
`));let X=ZO(),{hasUpdate:G,latestVersion:Z}=await z41("0.0.
|
|
4166
|
-
`));let V=await YN("0.0.
|
|
4165
|
+
`));let X=ZO(),{hasUpdate:G,latestVersion:Z}=await z41("0.0.1764504080-gf1c679",X);if(!G){dK.write(h4.green(`✓ Amp CLI is already up to date: ${"0.0.1764504080-gf1c679"} (${"released"} ${"2025-11-30T12:06:56.791Z"})
|
|
4166
|
+
`));let V=await YN("0.0.1764504080-gf1c679");if(V.warning)dK.write(`
|
|
4167
4167
|
`+h4.yellow(V.warning)+`
|
|
4168
4168
|
`);process.exit(0)}if(!Z)dK.write(h4.yellow("[WARN] could not find latest version")),process.exit(0);J=Z}dK.write(h4.blue(`Updating to version ${J}...
|
|
4169
4169
|
`)),await tg(J,void 0,(X)=>{dK.write(h4.dim(`Running: ${X}
|
|
4170
|
-
`))});let Q="released";dK.write(h4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-11-
|
|
4170
|
+
`))});let Q="released";dK.write(h4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-11-30T12:06:56.791Z"})
|
|
4171
4171
|
`));let Y=await YN(J);if(Y.warning)dK.write(`
|
|
4172
4172
|
`+h4.yellow(Y.warning)+`
|
|
4173
4173
|
`);process.exit(0)}catch(Q){let Y=Q instanceof Error?Q.message:String(Q);dK.write(h4.red.bold("Error: ")+Y+`
|
|
@@ -4783,7 +4783,7 @@ exit code: ${Z}`,new q1({color:X.foreground,dim:!0,italic:!0})));if(q)V.push(new
|
|
|
4783
4783
|
`,N),...M])})];if(W.url){let S=W.url.replace(/^https?:\/\//,"");I.push(new Y7({uri:W.url,text:S,style:new q1({color:Y.secondary,underline:!0})}))}let T=new F0({width:40,child:new o0({crossAxisAlignment:"start",mainAxisSize:"min",children:I})});return F8.child(new s6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new dj1({width:ZX6,height:$X6,agentMode:this.widget.agentMode,glow:this._glow,t:L,fps:0,shockwaves:this._shockwaves,onShockwave:E,...q==="disabled"&&{seed:42}}),new F0({width:2}),T]}))}}M0();t8();B4();y7();t8();a0();function YL8(J,Q){return`${J}:${Q}`}class Ak1{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 X0((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new X0((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new X0((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(RM()).subscribe((Z)=>{this.threadsMap.set(Q,Z);let q=this.subthreadsMap.get(Q)||[],V=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:Z,subthreads:q,workerStatus:V})});this.mainThreadSubs.set(Q,Y);let X=J.status.subscribe((Z)=>{if(this.workers.set(Q,Z),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:Z})});this.workerStatusSubs.set(Q,X);let G=J.subthreads.subscribe((Z)=>{this.subthreadsMap.set(Q,Z);for(let q of Z){let V=YL8(Q,q.toolUse.id);if(this.subthreadPatchSubs.has(V))continue;let K=this.threadService.observePatches(q.threadID).pipe(RM()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:q})});this.subthreadPatchSubs.set(V,K)}});this.subthreadsSubs.set(Q,G)}unregisterWorker(J){let Q=this.mainThreadSubs.get(J);if(Q)Q.unsubscribe(),this.mainThreadSubs.delete(J);let Y=this.workerStatusSubs.get(J);if(Y)Y.unsubscribe(),this.workerStatusSubs.delete(J);let X=this.subthreadsSubs.get(J);if(X)X.unsubscribe(),this.subthreadsSubs.delete(J);for(let[G,Z]of this.subthreadPatchSubs.entries())if(G.startsWith(`${J}:`))Z.unsubscribe(),this.subthreadPatchSubs.delete(G);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new X0((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new X0((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new X0((Q)=>{return this.workerStatusObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})})}}get threadViewStates(){let J={};for(let[Q,Y]of this.threadsMap){let X=this.workers.get(Q);if(X)J[Q]=wA(Y,X)}return J}dispose(){for(let J of this.mainThreadSubs.values())J.unsubscribe();for(let J of this.subthreadsSubs.values())J.unsubscribe();for(let J of this.workerStatusSubs.values())J.unsubscribe();for(let J of this.subthreadPatchSubs.values())J.unsubscribe();this.mainThreadSubs.clear(),this.subthreadsSubs.clear(),this.workerStatusSubs.clear(),this.subthreadPatchSubs.clear(),this.workers.clear(),this.threadsMap.clear(),this.subthreadsMap.clear()}}function XL8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Y,subthread:X}=Q,G=J.subagents[X.threadID];if(!G){if(G={subThreadID:Y.id,parentToolID:X.toolUse.id,taskDescription:X.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=QQ(J.mainThread);G.isCompleted=VX6(W,X.toolUse.id)}}let Z=GL8(Y,G.agentState),q=G.agentState===Z?G:{...G,agentState:Z},V={...J.tools},K=dC(Y).items.filter((W)=>W.type==="toolResult");for(let W of K)V[W.id]={id:W.id,subthreadID:Y.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[X.threadID]:q},tools:V,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Y,subthreads:X,workerStatus:G}=Q,Z=QQ(Y),q={...J.subagents};for(let z of X){let U=q[z.threadID];if(!U)continue;let N=VX6(Z,z.toolUse.id);q[z.threadID]={...U,isCompleted:N}}let{items:V}=dC(Y),K=wA(Y,G),W=FI({messages:Y.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:q,items:V,viewState:K,todosList:H,mainThread:Y}}case"worker-status-change":{if(!J.mainThread)return J;let Y=wA(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function dC(J){let Q=[],Y=new Map,X=new Set;for(let[G,Z]of J.messages.entries()){let q=`${Z.role}-${G}`;switch(Z.role){case"assistant":{let V=Z.state.type==="streaming";for(let W of Z.content)if(W.type==="tool_use"){if(Y.set(W.id,W),V)X.add(W.id)}if(Z.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:q,message:Z});for(let W of Z.content)if(W.type==="tool_use"){let H=!1;for(let z=G+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let N of U.content)if(N.type==="tool_result"&&N.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:V?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:q,message:Z});break;case"user":{let V=Z.content.some((K)=>K.type==="text"&&K.text.trim()||K.type==="image");for(let K of Z.content)if(K.type==="tool_result"){let W=Y.get(K.toolUseID)??EX(J,K.toolUseID);if(!W)throw Error(`(bug) tool use ${K.toolUseID} not found`);Q.push({type:"toolResult",id:K.toolUseID,toolUse:W,toolResult:K})}if(V)Q.push({type:"message",id:q,message:Z});break}}}return{items:Q}}function VX6(J,Q){let Y=J.get(Q);return(Y&&B2(Y.run))??!1}function GL8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((G)=>G.type==="tool_result"&&G.run.status==="blocked-on-user"))return h.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(dC(J).items.some((G)=>G.type==="toolResult"&&G.toolResult.run.status==="in-progress")){let G=Q?.type==="running-tools"?Q.startTime:Date.now();return h.info("Subagent status: running-tools",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}if(Y&&Y.role==="assistant"&&Y.state.type==="streaming")switch(Y.content.at(-1)?.type){case"text":return h.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return h.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let Z=Q?.type==="running-tools"?Q.startTime:Date.now();return h.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:Z,hasStartTime:!!Z}),{type:"running-tools",startTime:Z}}default:return h.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return h.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class Ok1 extends X6{props;constructor(J){super();this.props=J}createState(){return new KX6}}class KX6 extends Q6{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 Ak1(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((Z)=>{this.dispatch({type:"main-thread-patch",thread:Z.mainThread,subthreads:Z.subthreads,workerStatus:Z.workerStatus})});this.subscriptions.push(Y);let X=Q.subthreads.subscribe((Z)=>{this.dispatch({type:"subthread-patch",thread:Z.thread,subthread:Z.subthread})});this.subscriptions.push(X);let G=Q.workerStatus.subscribe((Z)=>{this.dispatch({type:"worker-status-change",workerStatus:Z.status})});this.subscriptions.push(G)}cleanup(){this.subscriptions.forEach((J)=>J.unsubscribe()),this.subscriptions=[]}switchWorker(J){this.cleanup(),this.setState(()=>{this.currentWorker=J}),this.setState(()=>{this.state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null}}),this.setupSubscriptions(J),this.addToRecentThreads(J.thread.id)}dispatch(J){this.setState(()=>{this.state=XL8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((Z)=>({toolUse:Z.toolUse,toolRun:Z.toolRun,subthreadID:Z.subthreadID})),Q={};for(let Z of Object.values(this.state.subagents)){let q=J.filter((V)=>V.subthreadID===Z.subThreadID);Q[Z.parentToolID]=q}let Y=(Z)=>Z===s5||Z===V9||Z===wX,X=new Map;for(let Z of this.state.items)if(Z.type==="toolResult"&&Y(Z.toolUse.name))X.set(Z.toolUse.id,{toolUseId:Z.toolUse.id,toolName:Z.toolUse.name,toolRun:Z.toolResult.run});let G=Array.from(X.values());for(let{toolUseId:Z,toolRun:q}of G){let V=[],K;if(q.status==="in-progress"||q.status==="done"||q.status==="error"||q.status==="cancelled")K=q.progress;if(K){let W=0;for(let H of K)if(H.tool_uses)for(let z of H.tool_uses){let U=`${Z}:progress:${W++}`;V.push({toolUse:WI(z.tool_name,z.input,U),toolRun:{status:z.status}})}}Q[Z]=V}return{...this.state,subagents:Object.values(this.state.subagents),subagentActiveTools:J,subagentToolsByParentID:Q}}build(J){let Q=this.getThreadData();return this.widget.props.builder(J,Q,this.workerController,(Y)=>this.switchWorker(Y),()=>this.currentWorker,this.recentThreadIDs)}}class wk1 extends X6{props;constructor(J){super({key:J.key});this.props=J}createState(){return new WX6}}class WX6 extends Q6{build(J){let Y=L6.of(J).colors,{todos:X,title:G="TODOs"}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new F0({width:0,height:0});let Z=X.map((q)=>this.buildTodoItem(q,Y));return new Y6({child:new p6({padding:_0.symmetric(1,0),child:new o0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new m1({text:new e(G,new q1({bold:!0,color:Y.foreground}))}),...Z]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),X=J.status==="completed",G=new q1({bold:J.status==="in-progress",color:Q.foreground,dim:X}),Z=new q1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:X});return new s6({crossAxisAlignment:"start",children:[new m1({text:new e(Y,G)}),new F0({width:1}),new N4({child:new m1({text:new e(J.content,Z)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class Ek1 extends w6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Y,onButtonClick:X}){super({key:J});this.ad=Q,this.onDismiss=Y,this.onButtonClick=X}build(J){let Q=L6.of(J),Y=Q.colors.primary,X=Q.colors.foreground;return new Y6({decoration:new z8(void 0,new b4(new w4(Y,1,"rounded"),new w4(Y,1,"rounded"),void 0,new w4(Y,1,"rounded"))),child:new p6({padding:_0.horizontal(1),child:new o0({children:[new s6({crossAxisAlignment:"start",children:[new N4({child:new m1({text:new e(this.ad.content,new q1({color:X}))})}),new F0({width:4}),new Y7({uri:"https://ampcode.com/free",text:"Ad",style:new q1({color:X,dim:!0})})]}),new s6({crossAxisAlignment:"start",children:[new QS1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:_0.horizontal(1),color:Y,reverse:!0}),new F0({width:2}),new m1({text:new e(this.ad.destinationUrlHostname,new q1({color:X,dim:!0}))})]})]})})})}}class Ik1 extends X6{props;constructor(J){super();this.props=J}createState(){return new HX6(this.props.autofocus??!0)}}class HX6 extends Q6{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(V)=>{if(V.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(V.ctrlKey&&V.key==="c"||V.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Y=H8.sizeOf(J),X=Math.min(60,Y.width-4),G=Y.height-4,Z=[];if(this.widget.props.title)Z.push(new m1({text:new e(this.widget.props.title,new q1({bold:!0,color:A1.blue}))}),new F0({height:1}));if(this.widget.props.message)Z.push(new m1({text:new e(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)Z.push(new F0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new m1({text:new e("Enter to copy",new q1({dim:!0}))}));return q.push(new m1({text:new e("Escape to close",new q1({dim:!0}))})),Z.push(new s6({children:q.flatMap((V,K)=>K<q.length-1?[V,new F0({width:1}),new m1({text:new e("•",new q1({dim:!0}))}),new F0({width:1})]:[V]),mainAxisSize:"min"})),new F8({child:new Y6({constraints:new i6(X,X,0,G),decoration:new z8(A1.default(),new b4(new w4(A1.blue,1,"rounded"),new w4(A1.blue,1,"rounded"),new w4(A1.blue,1,"rounded"),new w4(A1.blue,1,"rounded"))),padding:new _0(2,2,2,2),child:new G9({autofocus:this.autofocus,onKey:Q,child:new o0({children:Z,mainAxisSize:"min"})})})})}}class j91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,j91.prototype)}}class S91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,S91.prototype)}}function Pk1(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})}FH();M0();import{spawn as ZL8}from"node:child_process";import{promises as $L8}from"node:fs";function zX6(J){return J.kind==="executable"}function FX6(J){return J.kind==="markdown"}var kz=50000,UX6=300000;async function Rk1(J,Q,Y,X={}){let{timeoutMs:G=UX6,signal:Z,source:q}=X;try{let V=await Y.getCommand(J,q);if(!V)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Y.isCommandAvailable(J,q))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(h.debug("Executing command",{commandName:J,filePath:V.filePath,args:Q}),FX6(V))return await qL8(V,Q);else if(zX6(V))return await VL8(V,Q,G,Z);else return{success:!1,output:"",error:"Unsupported command type"}}catch(V){return h.error("Failed to execute command",{commandName:J,error:V}),{success:!1,output:"",error:V instanceof Error?V.message:"Unknown error occurred"}}}async function qL8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await $L8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>kz?Y.slice(0,kz)+`
|
|
4784
4784
|
... (output truncated at ${kz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function VL8(J,Q,Y=UX6,X){return new Promise((G)=>{let[Z,q]=KL8(J,Q);h.debug("Spawning command",{spawnCommand:Z,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Y});let V=cw0(X),K=!1,W=setTimeout(()=>{K=!0,V.abort(),h.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=ZL8(Z,q,{stdio:["pipe","pipe","pipe"],signal:V.signal,detached:!0}),z=[],U=[],N=0;H.stdout?.on("data",(M)=>{let L=M.toString();if(N+=L.length,N<=kz)z.push(L);else{let A=kz-(N-L.length);if(A>0)z.push(L.slice(0,A))}}),H.stderr?.on("data",(M)=>{let L=M.toString();if(N+=L.length,N<=kz)U.push(L);else{let A=kz-(N-L.length);if(A>0)U.push(L.slice(0,A))}}),H.on("close",(M)=>{if(clearTimeout(W),K){G({success:!1,output:z.join(""),error:`Command timed out after ${Y}ms`,exitCode:void 0});return}if(V.signal.aborted){G({success:!1,output:z.join(""),error:"The command was aborted",exitCode:M??void 0});return}let L=M===0||M===1,A=z.join(""),E=U.join(""),P=A;if(!L&&!A.trim()&&E.trim())P=E;else if(E.trim())P+=A?`
|
|
4785
4785
|
${E}`:E;if(N>kz)P+=`
|
|
4786
|
-
... (output truncated at ${kz} characters)`;G({success:L,output:P.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(K)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";G({success:!1,output:z.join(""),error:L})})})}function KL8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return HL8(Y,X?[...X]:null,G,Q);else return WL8(Y,X?[...X]:null,G,Q)}function WL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function HL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}M0();g$();K3();sW();xX();Jq();UH();GK();t8();y7();Kk();a0();var SX6=N6(pP(),1);import{writeFile as TX6}from"fs/promises";import CX6 from"path";M0();xX();class Tk1{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.1764475877-g5fdda7"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Co(Q,this.configService)}catch(Q){h.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 Ck1 extends X6{props;constructor(J){super();this.props=J}createState(){return new BX6}}class BX6 extends Q6{_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 NX6 extends Q6{controller=new cZ;focusNode=new n8({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=L6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=b4.all(new w4(Y.foreground,1,"solid")),K=new MO({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(N)=>{let M=N.trim();if(G&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new s6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new e("Enter",new q1({color:X.keybind}))),z.push(new e(" to submit, ",new q1({color:Y.foreground,dim:!0})));z.push(new e("Esc",new q1({color:X.keybind}))),z.push(new e(" to cancel",new q1({color:Y.foreground,dim:!0})));let U=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,z)})});return new Y6({decoration:{border:V,color:A1.default()},padding:_0.all(1),child:new o0({children:[H,new F0({height:1}),W,new n5,U]})})}}class _91 extends X6{props;constructor(J){super();this.props=J}createState(){return new NX6}}UH();class DX6 extends Q6{controller=new cZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new n8({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>=BU)return!1;let Q=CC(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=L6.of(J),{colors:Y,app:X}=Q,Z=H8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new _O({controller:this.controller,triggers:[new ON],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(N)=>{this.widget.props.onSubmit(N.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:I9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new G9({focusNode:this.focusNode,child:V}),W=new Y6({constraints:new i6({maxHeight:q}),padding:_0.symmetric(1,0),child:K}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=new Y6({padding:_0.symmetric(1,0),child:new m1({text:this.isConfirmingClearInput?new e("",void 0,[new e("Esc",new q1({color:X.keybind})),new e(" again to clear input",new q1({color:Y.foreground,dim:!0}))]):new e("",void 0,[new e("Press ",new q1({color:Y.foreground,dim:!0})),new e("Enter",new q1({color:X.keybind})),new e(" to submit, ",new q1({color:Y.foreground,dim:!0})),new e("Esc",new q1({color:X.keybind})),new e(" to clear",new q1({color:Y.foreground,dim:!0}))])})}),U=[H,new F0({height:1}),new N4({child:W}),new F0({height:1}),z];return new Y6({decoration:{border:b4.all(new w4(Y.foreground,1,"solid")),color:A1.default()},padding:_0.all(1),child:new o0({children:U})})}}class cC extends X6{props;constructor(J){super();this.props=J}createState(){return new DX6}}import{isDeepStrictEqual as BL8}from"node:util";var zL8=/[\\/_ +.#"@[({&]/,FL8=/[\\/_ +.#"@[({&]/g,UL8=/[\s-]/,MX6=/[\s-]/g;function y91(J,Q,Y,X,G,Z,q){if(Z===Q.length){if(G===J.length)return 1;return 0.99}let V=`${G},${Z}`;if(q[V]!==void 0)return q[V];let K=X.charAt(Z),W=Y.indexOf(K,G),H=0,z,U,N,M;while(W>=0){if(z=y91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(UL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(MX6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(zL8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(FL8),N&&G>0)z*=Math.pow(0.999,N.length)}else if(z*=0.3,G>0)z*=Math.pow(0.999,W-G);if(J.charAt(W)!==Q.charAt(Z))z*=0.9999}if(z<0.1&&(Y.charAt(W-1)===X.charAt(Z+1)||X.charAt(Z+1)===X.charAt(Z)&&Y.charAt(W-1)!==X.charAt(Z))){if(U=y91(J,Q,Y,X,W+1,Z+2,q),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(K,W+1)}return q[V]=H,H}function k91(J){return J.toLowerCase().replace(MX6," ")}function LX6(J,Q){let Y=y91(J,Q,k91(J),k91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=y91(J,V,k91(J),k91(V),0,0,{});if(K===0)return Y;G+=K,Z+=V.length}let q=G/X.length*0.95;return Math.max(Y,q)}return Y}class lC{}class iC{}class x91{}class v91{}class AX6 extends X6{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new OX6}}class OX6 extends Q6{build(J){return this.widget.onContext(J),this.widget.child}}function NL8(J,Q){if(J==="")return{matches:!0,score:1};let Y=LX6(Q,J);return{matches:Y>0.15,score:Y}}class gq extends X6{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new wX6}}class wX6 extends Q6{controller=new cZ;focusNode;scrollController=new n3;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new n8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),Y9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!BL8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof lC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof iC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof x91){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 v91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...NL8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,X=Q.size.height;k81(J,{top:Y,bottom:X},{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(),Y9.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 X=Y[J],G=X?this.widget.props.isItemDisabled?.(X)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!G){if(X)this.widget.props.onAccept(X)}}};build(J){let Q=L6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=b4.all(new w4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new MO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new vq({shortcuts:new Map([[new U4("ArrowDown"),new lC],[new U4("ArrowUp"),new iC],[new U4("Tab"),new lC],[new U4("Tab",{shift:!0}),new iC],[new U4("n",{ctrl:!0}),new lC],[new U4("p",{ctrl:!0}),new iC],[new U4("Enter"),new x91],[new U4("Escape"),new v91]]),focusNode:this.focusNode,child:q}),K=new eQ({actions:new Map([[lC,new X9(this.invoke)],[iC,new X9(this.invoke)],[x91,new X9(this.invoke)],[v91,new X9(this.invoke)]]),child:V}),W=new s6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new F0({height:10,child:new F8({child:new m1({text:new e(L,new q1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new N4({child:new F8({child:new m1({text:new e(this.widget.props.emptyStateText,new q1({color:Y.foreground,dim:!0}))})})});else{let L=X.map((A,E)=>{let P=E===this.selectedIndex,I=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,P,I,J);else{let S=P?A1.yellow:void 0,y=P?A1.black:Y.foreground;T=new Y6({decoration:S?{color:S}:void 0,padding:_0.symmetric(2,0),child:new m1({text:new e(this.widget.props.getLabel(A),new q1({color:y,dim:I}))})})}return new AX6(new T8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new o0({children:L,crossAxisAlignment:"start"})}let z=new N4({child:new T8({onScroll:this.handleScroll,opaque:!1,child:new T2({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e(this.widget.props.title,new q1({color:A1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new F0({height:1}),z),this.controller.text!==""){let L=X.length>0?X[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new Y6({padding:_0.vertical(1),child:new F8({child:A})}));else U.push(new F0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new Y6({decoration:{border:G,color:A1.default()},padding:_0.symmetric(1,0),child:new o0({children:U})})}}class jk1 extends X6{createState(){return new EX6}}class EX6 extends Q6{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 m1({text:new e("●",new q1({color:this.isGreen?A1.green:A1.index(8),bold:!0})),maxLines:1})}}function DL8(J){let Q=new Map,Y=new Map,X=new Map,G=[];for(let q of J)Q.set(q.id,q);for(let q of J){let V=q.parentRelationships.find((K)=>K.role==="child"&&Q.has(K.threadID));if(V){X.set(q.id,V.type);let K=V.threadID,W=Y.get(K)||[];W.push(q),Y.set(K,W)}else G.push(q)}return zG.flatten(G,(q)=>Y.get(q.id)).map((q)=>({...q.item,depth:q.depth,isLast:q.isLast,ancestorsAreLast:q.ancestorsAreLast,relationshipType:X.get(q.item.id)}))}function Sk1(J,Q,Y){return new m1({text:new e(`${J}${Q}`,new q1({color:Y})),maxLines:1})}function ML8(J,Q,Y,X){return[Sk1("+",J,X.success),n5.horizontal(1),Sk1("~",Q,X.warning),n5.horizontal(1),Sk1("-",Y,X.destructive)]}class f91 extends w6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],X=this.props.currentThreadID,G=[...Q].sort((H,z)=>{if(X){if(H.id===X)return-1;if(z.id===X)return 1}let U=Y.indexOf(H.id),N=Y.indexOf(z.id);if(U!==-1&&N!==-1)return U-N;if(U!==-1)return-1;if(N!==-1)return 1;return 0}),Z=DL8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=L6.of(J),K=new p6({padding:_0.symmetric(0,1),child:new F8({child:new m1({text:new e("",new q1({color:V.colors.foreground,dim:!0}),[new e("Ctrl+T",new q1({color:A1.blue,dim:!0})),new e(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new q1({color:V.colors.foreground,dim:!0}))])})})});return new gq({items:Z,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:K,renderItem:(H,z,U,N)=>{let M=L6.of(N),{colors:L}=M,A=z?A1.yellow:void 0,E=z?A1.black:L.foreground,P=A1.index(8),I=(J1,n)=>new F0({width:n,child:s6.end([new m1({text:new e(J1,new q1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[],y=H.relationshipType==="handoff",x=new g81;if(H.depth>0){let J1=[],n=H.ancestorsAreLast.slice(1);for(let H1 of n)J1.push(new e(x.getAncestorPrefix(H1),new q1({color:x.connectorColor,dim:x.connectorDim})));let u=H.isLast?x.elbow:x.tee,s=x.getConnectorText(u);J1.push(new e(s,new q1({color:x.connectorColor,dim:x.connectorDim}))),S.push(new m1({text:new e("",void 0,J1)}))}let g=[],p=this.props.currentThreadID===H.id?new e("(current) ",new q1({color:A1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new e("(visited) ",new q1({color:L.foreground,dim:!0})):null;if(p)g.push(new m1({text:p}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))g.push(new jk1),g.push(new F0({width:1}))}let b=H.title;if(H.relationshipType==="fork"){let J1=b.match(/^Forked\((\d+)\): /);if(J1)b=b.slice(J1[0].length);else while(b.startsWith("Forked: "))b=b.slice(8);g.push(new m1({text:new e("[fork] ",new q1({color:A1.blue}))}))}else if(y)g.push(new m1({text:new e("[handoff] ",new q1({color:A1.index(208)}))}));if(g.push(new N4({child:new m1({text:new e(b,new q1({color:E})),overflow:"ellipsis",maxLines:1})})),g.push(new F0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let J1=z?{success:P,warning:P,destructive:P}:L;g.push(...ML8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,J1)),g.push(new F0({width:2}))}return g.push(I(H.description.timeAgo,q)),new Y6({decoration:A?{color:A}:void 0,padding:_0.symmetric(2,0),child:new s6({children:[...S,...g]})})}})}}function IX6(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/60000),G=Math.floor(Y/3600000),Z=Math.floor(Y/86400000);if(X<1)return"just now";if(X<60)return`${X}m ago`;if(G<24)return`${G}h ago`;if(Z<7)return`${Z}d ago`;return J.toLocaleDateString()}class _k1 extends w6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((G,Z)=>Z.pubDate.getTime()-G.pubDate.getTime()),Y=Math.max(0,...Q.map((G)=>IX6(G.pubDate).length));return new gq({items:Q,getLabel:(G)=>G.title,onAccept:(G)=>this.props.onSelect?.(G),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(G,Z,q,V)=>{let K=L6.of(V),{colors:W}=K,H=Z?A1.yellow:void 0,z=Z?A1.black:W.foreground,U=A1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new F0({width:A,child:s6.end([new m1({text:new e(L,new q1({color:U}))})])});return new Y6({decoration:H?{color:H}:void 0,padding:_0.symmetric(2,0),child:new s6({children:[new N4({child:new m1({text:new e(G.title,new q1({color:z})),overflow:"ellipsis",maxLines:1})}),new F0({width:2}),new m1({text:new e(N,new q1({color:U})),maxLines:1}),new F0({width:2}),M(IX6(G.pubDate),Y)]})})}})}}class kk1 extends w6{props;constructor(J){super();this.props=J}build(){return new F8({child:new m1({text:new e("",void 0,[new e(`Forked to new thread:
|
|
4786
|
+
... (output truncated at ${kz} characters)`;G({success:L,output:P.trim(),error:!L?E.trim()||"Command failed":void 0,exitCode:M??void 0})}),H.on("error",(M)=>{clearTimeout(W);let L=M.message;if(K)L=`Command timed out after ${Y}ms`;else if(M.message.includes("operation was aborted")||M.name==="AbortError")L="The command was aborted";G({success:!1,output:z.join(""),error:L})})})}function KL8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return HL8(Y,X?[...X]:null,G,Q);else return WL8(Y,X?[...X]:null,G,Q)}function WL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function HL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}M0();g$();K3();sW();xX();Jq();UH();GK();t8();y7();Kk();a0();var SX6=N6(pP(),1);import{writeFile as TX6}from"fs/promises";import CX6 from"path";M0();xX();class Tk1{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.1764504080-gf1c679"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await Co(Q,this.configService)}catch(Q){h.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 Ck1 extends X6{props;constructor(J){super();this.props=J}createState(){return new BX6}}class BX6 extends Q6{_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 NX6 extends Q6{controller=new cZ;focusNode=new n8({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=L6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=b4.all(new w4(Y.foreground,1,"solid")),K=new MO({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(N)=>{let M=N.trim();if(G&&M.length===0)return;this.widget.props.onSubmit(M)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new s6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new e("Enter",new q1({color:X.keybind}))),z.push(new e(" to submit, ",new q1({color:Y.foreground,dim:!0})));z.push(new e("Esc",new q1({color:X.keybind}))),z.push(new e(" to cancel",new q1({color:Y.foreground,dim:!0})));let U=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,z)})});return new Y6({decoration:{border:V,color:A1.default()},padding:_0.all(1),child:new o0({children:[H,new F0({height:1}),W,new n5,U]})})}}class _91 extends X6{props;constructor(J){super();this.props=J}createState(){return new NX6}}UH();class DX6 extends Q6{controller=new cZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new n8({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>=BU)return!1;let Q=CC(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=L6.of(J),{colors:Y,app:X}=Q,Z=H8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new _O({controller:this.controller,triggers:[new ON],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(N)=>{this.widget.props.onSubmit(N.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:I9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new G9({focusNode:this.focusNode,child:V}),W=new Y6({constraints:new i6({maxHeight:q}),padding:_0.symmetric(1,0),child:K}),H=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e("",void 0,[new e("Command: ",new q1({color:Y.foreground})),new e(this.widget.props.commandName,new q1({color:A1.yellow,bold:!0}))])})}),z=new Y6({padding:_0.symmetric(1,0),child:new m1({text:this.isConfirmingClearInput?new e("",void 0,[new e("Esc",new q1({color:X.keybind})),new e(" again to clear input",new q1({color:Y.foreground,dim:!0}))]):new e("",void 0,[new e("Press ",new q1({color:Y.foreground,dim:!0})),new e("Enter",new q1({color:X.keybind})),new e(" to submit, ",new q1({color:Y.foreground,dim:!0})),new e("Esc",new q1({color:X.keybind})),new e(" to clear",new q1({color:Y.foreground,dim:!0}))])})}),U=[H,new F0({height:1}),new N4({child:W}),new F0({height:1}),z];return new Y6({decoration:{border:b4.all(new w4(Y.foreground,1,"solid")),color:A1.default()},padding:_0.all(1),child:new o0({children:U})})}}class cC extends X6{props;constructor(J){super();this.props=J}createState(){return new DX6}}import{isDeepStrictEqual as BL8}from"node:util";var zL8=/[\\/_ +.#"@[({&]/,FL8=/[\\/_ +.#"@[({&]/g,UL8=/[\s-]/,MX6=/[\s-]/g;function y91(J,Q,Y,X,G,Z,q){if(Z===Q.length){if(G===J.length)return 1;return 0.99}let V=`${G},${Z}`;if(q[V]!==void 0)return q[V];let K=X.charAt(Z),W=Y.indexOf(K,G),H=0,z,U,N,M;while(W>=0){if(z=y91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(UL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(MX6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(zL8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(FL8),N&&G>0)z*=Math.pow(0.999,N.length)}else if(z*=0.3,G>0)z*=Math.pow(0.999,W-G);if(J.charAt(W)!==Q.charAt(Z))z*=0.9999}if(z<0.1&&(Y.charAt(W-1)===X.charAt(Z+1)||X.charAt(Z+1)===X.charAt(Z)&&Y.charAt(W-1)!==X.charAt(Z))){if(U=y91(J,Q,Y,X,W+1,Z+2,q),U*0.1>z)z=U*0.1}if(z>H)H=z;W=Y.indexOf(K,W+1)}return q[V]=H,H}function k91(J){return J.toLowerCase().replace(MX6," ")}function LX6(J,Q){let Y=y91(J,Q,k91(J),k91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=y91(J,V,k91(J),k91(V),0,0,{});if(K===0)return Y;G+=K,Z+=V.length}let q=G/X.length*0.95;return Math.max(Y,q)}return Y}class lC{}class iC{}class x91{}class v91{}class AX6 extends X6{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new OX6}}class OX6 extends Q6{build(J){return this.widget.onContext(J),this.widget.child}}function NL8(J,Q){if(J==="")return{matches:!0,score:1};let Y=LX6(Q,J);return{matches:Y>0.15,score:Y}}class gq extends X6{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new wX6}}class wX6 extends Q6{controller=new cZ;focusNode;scrollController=new n3;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new n8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),Y9.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[0]??null)});let J=this.getFilteredItems();this.widget.props.onSelectionChange?.(J[0]??null),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!BL8(J.props.items,this.widget.props.items)){this.ensureSelectedItemVisible();let Q=this.getFilteredItems();this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null)}}dispose(){this.widget.props.onSelectionChange?.(null),this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof lC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length-1)this.selectedIndex++,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof iC){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex>0)this.selectedIndex--,this.setState(),this.ensureSelectedItemVisible(),this.widget.props.onSelectionChange?.(Q[this.selectedIndex]??null);return"handled"}if(J instanceof x91){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 v91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};getFilteredItems(){let J=this.controller.text,Q=this.widget.props.items.filter((Y)=>!this.widget.props.filterItem||this.widget.props.filterItem(Y,J)).map((Y)=>({item:Y,...NL8(J,this.widget.props.getLabel(Y))})).filter((Y)=>Y.matches).sort(this.widget.props.sortItems?(Y,X)=>this.widget.props.sortItems(Y,X,J):(Y,X)=>X.score-Y.score).map((Y)=>Y.item);if(this.widget.props.maxRenderItems)return Q.slice(0,this.widget.props.maxRenderItems);return Q}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Q=J.findRenderObject();if(!Q)return;let Y=0,X=Q.size.height;k81(J,{top:Y,bottom:X},{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(),Y9.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 X=Y[J],G=X?this.widget.props.isItemDisabled?.(X)??!1:!1;if(Q===1)this.selectedIndex=J,this.setState(),this.widget.props.onSelectionChange?.(Y[this.selectedIndex]??null);else if(Q===2&&!G){if(X)this.widget.props.onAccept(X)}}};build(J){let Q=L6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=b4.all(new w4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new MO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new vq({shortcuts:new Map([[new U4("ArrowDown"),new lC],[new U4("ArrowUp"),new iC],[new U4("Tab"),new lC],[new U4("Tab",{shift:!0}),new iC],[new U4("n",{ctrl:!0}),new lC],[new U4("p",{ctrl:!0}),new iC],[new U4("Enter"),new x91],[new U4("Escape"),new v91]]),focusNode:this.focusNode,child:q}),K=new eQ({actions:new Map([[lC,new X9(this.invoke)],[iC,new X9(this.invoke)],[x91,new X9(this.invoke)],[v91,new X9(this.invoke)]]),child:V}),W=new s6({children:[new Y6({decoration:{color:A1.default()},child:new m1({text:new e(">",new q1({color:Y.foreground}))})}),new N4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new F0({height:10,child:new F8({child:new m1({text:new e(L,new q1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new N4({child:new F8({child:new m1({text:new e(this.widget.props.emptyStateText,new q1({color:Y.foreground,dim:!0}))})})});else{let L=X.map((A,E)=>{let P=E===this.selectedIndex,I=this.widget.props.isItemDisabled?.(A)??!1,T;if(this.widget.props.renderItem)T=this.widget.props.renderItem(A,P,I,J);else{let S=P?A1.yellow:void 0,y=P?A1.black:Y.foreground;T=new Y6({decoration:S?{color:S}:void 0,padding:_0.symmetric(2,0),child:new m1({text:new e(this.widget.props.getLabel(A),new q1({color:y,dim:I}))})})}return new AX6(new T8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new o0({children:L,crossAxisAlignment:"start"})}let z=new N4({child:new T8({onScroll:this.handleScroll,opaque:!1,child:new T2({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e(this.widget.props.title,new q1({color:A1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new F0({height:1}),z),this.controller.text!==""){let L=X.length>0?X[this.selectedIndex]:void 0,A=L&&this.widget.props.buildDisabledReasonWidget?.(L);if(A)U.push(new Y6({padding:_0.vertical(1),child:new F8({child:A})}));else U.push(new F0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new Y6({decoration:{border:G,color:A1.default()},padding:_0.symmetric(1,0),child:new o0({children:U})})}}class jk1 extends X6{createState(){return new EX6}}class EX6 extends Q6{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 m1({text:new e("●",new q1({color:this.isGreen?A1.green:A1.index(8),bold:!0})),maxLines:1})}}function DL8(J){let Q=new Map,Y=new Map,X=new Map,G=[];for(let q of J)Q.set(q.id,q);for(let q of J){let V=q.parentRelationships.find((K)=>K.role==="child"&&Q.has(K.threadID));if(V){X.set(q.id,V.type);let K=V.threadID,W=Y.get(K)||[];W.push(q),Y.set(K,W)}else G.push(q)}return zG.flatten(G,(q)=>Y.get(q.id)).map((q)=>({...q.item,depth:q.depth,isLast:q.isLast,ancestorsAreLast:q.ancestorsAreLast,relationshipType:X.get(q.item.id)}))}function Sk1(J,Q,Y){return new m1({text:new e(`${J}${Q}`,new q1({color:Y})),maxLines:1})}function ML8(J,Q,Y,X){return[Sk1("+",J,X.success),n5.horizontal(1),Sk1("~",Q,X.warning),n5.horizontal(1),Sk1("-",Y,X.destructive)]}class f91 extends w6{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}build(J){let Q=this.props.filterByWorkspace&&this.props.currentWorkspaceURI?this.props.threads.filter((H)=>H.workspaceURI===this.props.currentWorkspaceURI):this.props.threads;if(this.props.excludeCurrentThread&&this.props.currentThreadID)Q=Q.filter((H)=>H.id!==this.props.currentThreadID);let Y=this.props.recentThreadIDs||[],X=this.props.currentThreadID,G=[...Q].sort((H,z)=>{if(X){if(H.id===X)return-1;if(z.id===X)return 1}let U=Y.indexOf(H.id),N=Y.indexOf(z.id);if(U!==-1&&N!==-1)return U-N;if(U!==-1)return-1;if(N!==-1)return 1;return 0}),Z=DL8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=L6.of(J),K=new p6({padding:_0.symmetric(0,1),child:new F8({child:new m1({text:new e("",new q1({color:V.colors.foreground,dim:!0}),[new e("Ctrl+T",new q1({color:A1.blue,dim:!0})),new e(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new q1({color:V.colors.foreground,dim:!0}))])})})});return new gq({items:Z,getLabel:(H)=>H.title,onAccept:(H)=>this.props.onSelect?.(H.id),onDismiss:this.props.onDismiss,onSelectionChange:(H)=>{if(this.props.previewController){if(H)this.props.previewController.select(H.id)}},title:this.props.title,isLoading:this.props.isLoading,loadingText:"Loading threads...",emptyStateText:"No threads match your filter",maxRenderItems:1000,footer:this.props.isLoading?void 0:K,renderItem:(H,z,U,N)=>{let M=L6.of(N),{colors:L}=M,A=z?A1.yellow:void 0,E=z?A1.black:L.foreground,P=A1.index(8),I=(J1,n)=>new F0({width:n,child:s6.end([new m1({text:new e(J1,new q1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[],y=H.relationshipType==="handoff",x=new g81;if(H.depth>0){let J1=[],n=H.ancestorsAreLast.slice(1);for(let H1 of n)J1.push(new e(x.getAncestorPrefix(H1),new q1({color:x.connectorColor,dim:x.connectorDim})));let u=H.isLast?x.elbow:x.tee,s=x.getConnectorText(u);J1.push(new e(s,new q1({color:x.connectorColor,dim:x.connectorDim}))),S.push(new m1({text:new e("",void 0,J1)}))}let g=[],p=this.props.currentThreadID===H.id?new e("(current) ",new q1({color:A1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new e("(visited) ",new q1({color:L.foreground,dim:!0})):null;if(p)g.push(new m1({text:p}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))g.push(new jk1),g.push(new F0({width:1}))}let b=H.title;if(H.relationshipType==="fork"){let J1=b.match(/^Forked\((\d+)\): /);if(J1)b=b.slice(J1[0].length);else while(b.startsWith("Forked: "))b=b.slice(8);g.push(new m1({text:new e("[fork] ",new q1({color:A1.blue}))}))}else if(y)g.push(new m1({text:new e("[handoff] ",new q1({color:A1.index(208)}))}));if(g.push(new N4({child:new m1({text:new e(b,new q1({color:E})),overflow:"ellipsis",maxLines:1})})),g.push(new F0({width:2})),H.diffStats&&(H.diffStats.added>0||H.diffStats.changed>0||H.diffStats.deleted>0)){let J1=z?{success:P,warning:P,destructive:P}:L;g.push(...ML8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,J1)),g.push(new F0({width:2}))}return g.push(I(H.description.timeAgo,q)),new Y6({decoration:A?{color:A}:void 0,padding:_0.symmetric(2,0),child:new s6({children:[...S,...g]})})}})}}function IX6(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/60000),G=Math.floor(Y/3600000),Z=Math.floor(Y/86400000);if(X<1)return"just now";if(X<60)return`${X}m ago`;if(G<24)return`${G}h ago`;if(Z<7)return`${Z}d ago`;return J.toLocaleDateString()}class _k1 extends w6{props;debugLabel="ThreadFeedPicker";constructor(J){super();this.props=J}build(J){let Q=[...this.props.entries].sort((G,Z)=>Z.pubDate.getTime()-G.pubDate.getTime()),Y=Math.max(0,...Q.map((G)=>IX6(G.pubDate).length));return new gq({items:Q,getLabel:(G)=>G.title,onAccept:(G)=>this.props.onSelect?.(G),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No thread feed entries available",maxRenderItems:100,renderItem:(G,Z,q,V)=>{let K=L6.of(V),{colors:W}=K,H=Z?A1.yellow:void 0,z=Z?A1.black:W.foreground,U=A1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new F0({width:A,child:s6.end([new m1({text:new e(L,new q1({color:U}))})])});return new Y6({decoration:H?{color:H}:void 0,padding:_0.symmetric(2,0),child:new s6({children:[new N4({child:new m1({text:new e(G.title,new q1({color:z})),overflow:"ellipsis",maxLines:1})}),new F0({width:2}),new m1({text:new e(N,new q1({color:U})),maxLines:1}),new F0({width:2}),M(IX6(G.pubDate),Y)]})})}})}}class kk1 extends w6{props;constructor(J){super();this.props=J}build(){return new F8({child:new m1({text:new e("",void 0,[new e(`Forked to new thread:
|
|
4787
4787
|
|
|
4788
4788
|
`,new q1({color:A1.white,dim:!0})),new e(`"${this.props.newThreadTitle||"Untitled"}"`,new q1({color:A1.white}))]),textAlign:"center"})})}}class wN extends X6{props;constructor(J){super();this.props=J}createState(){return new PX6}}class PX6 extends Q6{_spinner=new tK;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=L6.of(J),{colors:Y}=Q,X=b4.all(new w4(Y.foreground,1,"solid")),G=this._spinner.toBraille(),Z=new m1({textAlign:"center",text:new e("",void 0,[new e(G,new q1({color:A1.yellow})),new e(" ",void 0),new e(this.widget.props.message,new q1({color:Y.foreground}))])}),V=[new N4({child:new o0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)V.push(new F0({height:2,child:new Y6({padding:_0.symmetric(2,0),child:new m1({text:new e("",new q1({dim:!0}),[new e("Press ",new q1({color:Y.foreground})),new e("Esc",new q1({color:Y.info})),new e(" to cancel",new q1({color:Y.foreground}))])})})}));let K=new Y6({decoration:new z8(A1.default(),X),child:new F0({width:60,height:7,child:new o0({mainAxisAlignment:"start",children:V})})});if(this.widget.props.onAbort)return new G9({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:K});return K}}class yz extends X6{props;constructor(J){super();this.props=J}createState(){return new RX6}}class RX6 extends Q6{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof aK}build(J){let Q=this.widget.props.message,Y=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let W=v81(Q);return{title:W.title,type:W.type,description:W.description}})(),X=Y.type==="error"?A1.red:A1.yellow,G=b4.all(new w4(A1.default(),1,"solid")),Z=new Y6({padding:_0.symmetric(1,0),child:new m1({text:new e(Y.title,new q1({color:X,bold:!0}))})}),q=this.isWidgetMessage(Q)?Q.widget:new m1({text:new e(Y.description,new q1({color:A1.default()})),selectable:!0}),V=new N4({child:new BO({child:new Y6({padding:_0.symmetric(1,0),child:q})})}),K=new Y6({padding:_0.symmetric(1,0),child:new m1({text:this.widget.props.onRetry?new e("",void 0,[new e("Press ",new q1({color:A1.default(),dim:!0})),new e("R",new q1({color:A1.yellow})),new e(" to retry, ",new q1({color:A1.default(),dim:!0})),new e("Esc",new q1({color:A1.yellow})),new e(" to cancel",new q1({color:A1.default(),dim:!0}))]):new e("Press any key to close",new q1({color:A1.default(),dim:!0,italic:!0}))})});return new G9({onKey:(W)=>{if(this.widget.props.onRetry&&W.key==="r")return this.widget.props.onRetry(),"handled";if(W.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!0,child:new Y6({decoration:{border:G,color:A1.default()},padding:_0.all(1),child:new o0({mainAxisAlignment:"center",children:[Z,new F0({height:1}),V,K]})})})}}class yk1 extends w6{build(){return new F8({child:new m1({text:new e("",void 0,[new e(`✓ Thread Shared
|
|
4789
4789
|
|
|
@@ -4867,7 +4867,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
4867
4867
|
`)?`${V}...`:G,W=new q1({color:A1.index(8)}),H=[new e(K,W)];if(q>0){let z=new q1({color:Y.success});for(let U=1;U<=q;U++)H.push(new e(" ")),H.push(new e(`[${U}]`,z))}return new p6({padding:_0.only({bottom:0}),child:new s6({crossAxisAlignment:"start",children:[new p6({padding:_0.only({right:1}),child:new m1({text:new e("•",new q1({color:A1.index(8)}))})}),new N4({child:new m1({text:new e("",void 0,H)})})]})})}}class Ky1 extends X6{createState(){return new wG6}}class wG6 extends Q6{_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:A1.red}),Y=new q1({color:this._visible?A1.red:A1.transparent()});return new s6({children:[new m1({text:new e("⏺",Y)}),new F0({width:1}),new m1({text:new e("Replay",Q)})]})}}class Wy1 extends w6{entry;constructor({key:J,entry:Q}){super({key:J});this.entry=Q}build(J){let Q=L6.of(J),Y=Q.colors.secondary,X=Q.colors.foreground,G=this.entry.authors.map((Z)=>Z.name).join(", ");return new Y6({decoration:new z8(void 0,new b4(new w4(Y,1,"rounded"),new w4(Y,1,"rounded"),void 0,new w4(Y,1,"rounded"))),child:new p6({padding:_0.horizontal(1),child:new o0({children:[new s6({crossAxisAlignment:"start",children:[new N4({child:new m1({text:new e(this.entry.title,new q1({color:X,bold:!0}))})}),new F0({width:4}),new m1({text:new e(G||"Community",new q1({color:X,dim:!0}))})]}),new s6({crossAxisAlignment:"start",children:[new N4({child:new m1({text:new e(this.truncateDescription(this.entry.description),new q1({color:X,dim:!0}))})}),new F0({width:2}),new Y7({uri:this.entry.link,text:"View Thread",style:new q1({color:Y,underline:!0})})]})]})})})}truncateDescription(J){let Y=J.replace(/\s+/g," ").trim();if(Y.length<=80)return Y;return Y.slice(0,79)+"…"}}a0();function CA8(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/3600000),G=Math.floor(X/24),Z=Math.floor(G/7),q=Math.floor(G/30);if(X<1)return"Just now";if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;if(Z<=4)return`${Z}w ago`;return`${q}mo ago`}class Hy1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{let Q=await new Promise((Y)=>{let X=this.threadHistoryService.observeThreadList().subscribe((G)=>{X.unsubscribe(),Y(G)})});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($6((Q)=>this.formatThreadSummaries(Q,J)))}formatThreadSummaries(J,Q){return J.filter((X)=>{if(!Q.trim())return!0;let G=X.title?.toLowerCase()||"untitled",Z=X.id.toLowerCase(),q=Q.toLowerCase();return G.includes(q)||Z.includes(q)}).map((X)=>{let G=new Date(X.userLastInteractedAt),Z=CA8(G),q=X.id.slice(-8),V=X.env?.initial.trees?.[0]?.uri;return{id:X.id,title:X.title||"Untitled",updatedAt:new Date(X.userLastInteractedAt).toISOString(),description:{timeAgo:Z,title:X.title||"Untitled",shortThreadID:q},diffStats:X.summaryStats?.diffStats,workspaceURI:V,parentRelationships:X.parentRelationships}})}}M0();t8();class zy1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new n3;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){h.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){h.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(RM()).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 EG6(J,Q){switch(J){case"update-available":return[new e("A newer Amp is available. Run ",new q1({color:Q.foreground,dim:!0})),new e("amp update",new q1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new e("Update complete, run ",new q1({color:Q.foreground,dim:!0})),new e("amp update",new q1({color:Q.warning})),new e(" to see warnings",new q1({color:Q.foreground,dim:!0}))];case"update-error":return[new e("Update failed, run ",new q1({color:Q.foreground,dim:!0})),new e("amp update",new q1({color:Q.warning})),new e(" to see warnings",new q1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function yA8(J){return new Promise((Q)=>{SA8("git",["branch","--show-current"],{cwd:J},(Y,X)=>{if(Y){Q(null);return}let G=X.trim();Q(G||null)})})}class _G6 extends X6{dependencies;constructor(J){super();this.dependencies=J}createState(){return new kG6}}class kG6 extends Q6{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;threadLoadSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;isShowingHelp=!1;isShowingConsoleOverlay=!1;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;isShowingCostBreakdownOverlay=!1;confirmationOverlayContent="";exitConfirmTimeout=null;clearInputConfirmTimeout=null;cancelProcessingConfirmTimeout=null;historyIndex=-1;historyDraft=null;bashInvocations=[];dismissedEphemeralErrorKey=null;currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;isShowingPalette=!1;paletteShowOptions=null;threadsForPicker=[];isLoadingThreads=!1;threadPreviewController=new zy1;previewThread=null;planScrollController=(()=>{let J=new n3;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new n3;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;agentModePulseSeq=0;currentGitBranch=null;messageViewFocusNode=new n8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new n8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showingCannotToggleMessage=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;adActionModal=null;threadFeedReader=null;currentThreadFeedEntry=null;threadFeedEntries=[];threadFeedSubscription=null;threadFeedRotationTimer=null;threadFeedHidden=!1;threadFeedTickerQueue=[];hasSubmittedFirstMessage=!1;currentUserInfo=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;previousThreadIdForHint=null;pendingMCPServers=[];mcpTrustSubscription=null;agentModeSubscription=null;currentAgentMode="smart";inMemoryAgentModeOverride=null;cachedVisibleModes=rG();freeTierStatus=void 0;updateState="hidden";updateServiceSubscription=null;toastController=new KS1;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=null;async initThreadFeed(){let J=await F6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Y=Q.includes("localhost")||Q.includes("127.0.0.1");try{let q=await this.widget.dependencies.internalAPIClient.getUserInfo({},{config:this.widget.dependencies.configService});if(q.ok){let V=q.result,K="user"in V?V.user:V;this.currentUserInfo={username:K.username??void 0,displayName:K.displayName??void 0};let W="ffe10a0c-6c42-41ce-a3a6-38990fd6caf8";if(!Y&&V.team?.id!==W)return}else return}catch(q){h.debug("Failed to fetch user info for thread feed filtering",q);return}let X="/threads.rss",G=async(q,V)=>{let K=q instanceof Request?q.url:q.toString();return zJ(K,V,this.widget.dependencies.configService)},Z=xl0();Z.get("entries").then((q)=>{if(q){let V=this.filterEntries(q);if(this.threadFeedEntries=V,V.length>0&&!this.currentThreadFeedEntry){let K=[...V].sort((H,z)=>z.pubDate.getTime()-H.pubDate.getTime());this.threadFeedTickerQueue=[...K,...this.threadFeedTickerQueue];let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}),this.threadFeedReader=new Pj1(Z,G,{url:X}),this.threadFeedSubscription=this.threadFeedReader.stream().subscribe({next:(q)=>{try{let V=this.filterEntries(q);if(V.length>0){this.threadFeedEntries=[...V,...this.threadFeedEntries];let K=[...V].sort((W,H)=>H.pubDate.getTime()-W.pubDate.getTime());if(this.threadFeedTickerQueue=[...K,...this.threadFeedTickerQueue],!this.currentThreadFeedEntry){let W=this.getNextFeedEntry();if(W)this.setState(()=>{this.currentThreadFeedEntry=W})}}}catch(V){h.error("Thread feed: error in next handler",V)}},error:(q)=>{h.error("Thread feed error:",q)}}),this.resetThreadFeedRotation()}filterEntries(J){if(!this.currentUserInfo)return J;let{username:Q,displayName:Y}=this.currentUserInfo;return J.filter((X)=>{return!X.authors.some((G)=>{let Z=G.name;if(!Z)return!1;return Q&&Z===Q||Y&&Z===Y||Q&&Z.includes(Q)})})}rotateThreadFeed(){if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);this.threadFeedRotationTimer=setInterval(()=>{let J=this.getNextFeedEntry();if(J)this.setState(()=>{this.currentThreadFeedEntry=J})},30000)}resetThreadFeedRotation(){this.rotateThreadFeed()}getNextFeedEntry(){if(this.threadFeedTickerQueue.length>0)return this.threadFeedTickerQueue.shift();return null}recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1,this.previousThreadIdForHint=J}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Y,baseWpm:X}=J,G=Q.messages;for(let Z=0;Z<G.length;Z++){if(this.replayAbortController.signal.aborted)break;let q=G[Z];if(!q)continue;if(Z>0)await this.replaySleep(J.messageDelayMs);if(q.role==="user"&&Y){let W=q.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
|
|
4868
4868
|
`);if(W)await this.replayTypeMessage(W,X)}if(q.role==="assistant"){let W=q.content.some((U)=>U.type==="tool_use"),H=G[Z+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...q,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let N=J.thread.id;this.getMessageScrollController(N).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),q]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,q],this.textController.clear()});let V=J.thread.id;this.getMessageScrollController(V).scrollToBottom()}await this.replaySleep(J.exitDelayMs),I9.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Y=J.split(/(?<=\s)/),X=60000/Q;for(let G of Y){if(this.replayAbortController.signal.aborted)break;let Z=X/G.length;for(let q of G){this.textController.text=this.textController.text+q,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let V=0.8+Math.random()*0.4,K=Z*V;await this.replaySleep(K)}}}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return H81(this.widget.dependencies.worker.thread,this.inMemoryAgentModeOverride?{agentMode:this.inMemoryAgentModeOverride}:null,this.freeTierStatus,{"experimental.agentMode":this.currentAgentMode})}isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;if(J.viewState.state!=="active")return!1;if(Boolean(J.viewState.inferenceState==="running"))return!0;let Y=J.items.filter((Z)=>Z.type==="toolResult").filter((Z)=>Z.toolResult.run.status==="in-progress"||Z.toolResult.run.status==="queued"),X=J.subagentActiveTools.filter((Z)=>Z.toolRun.status==="in-progress"||Z.toolRun.status==="queued");return[...Y,...X].length>0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new e(this.submitDisabledHint,new q1({color:J.foreground,dim:!0}));if(this.isExiting)return new e("Exiting...",new q1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new e("",void 0,[new e("Ctrl+C",new q1({color:Q.keybind})),new e(" again to exit",new q1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new e("",void 0,[new e("Esc",new q1({color:Q.keybind})),new e(" again to clear input",new q1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new e("",void 0,[new e("Escape",new q1({color:Q.keybind})),new e(" to close help",new q1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let G=this.getEffectiveAgentMode(),Z=My1(G);return new e("",void 0,[new e("Images aren't supported in ",new q1({color:J.warning,dim:!1})),new e(G,new q1({color:Z})),new e(" mode.",new q1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new e("",void 0,[new e("Esc",new q1({color:Q.keybind})),new e(" again to cancel",new q1({color:J.foreground,dim:!0}))]);return new e("",void 0,[new e("Esc",new q1({color:Q.keybind})),new e(" to cancel",new q1({color:J.foreground,dim:!0}))])}if(this.showingCannotToggleMessage)return new e(this.showingCannotToggleMessage,new q1({color:J.warning,dim:!1}));let Y=EG6(this.updateState,J);if(Y)return new e("",void 0,Y);let X=this.widget.dependencies.worker.thread;if(X.agentMode==="plan"&&VO(X))return new e("",void 0,[new e("Ctrl+O",new q1({color:Q.keybind})),new e(" → Execute Plan",new q1({color:J.foreground,dim:!0}))]);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Y}=this.widget.dependencies;if(!Q.mainThread?.id)return;let G=Q.mainThread?.messages.findIndex((Z)=>Z===J);if(G===void 0||G===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),await Y.handle({type:"thread:truncate",fromIndex:G}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(Z){h.error("Failed to edit message:",Z)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Y,threadSyncService:X}=this.widget.dependencies,G=Q.mainThread?.id;if(!G)return;let Z=Q.mainThread?.messages.findIndex((q)=>q===J);if(Z===void 0||Z<=0)return;try{let q=await w3.getOrCreateForThread(Y,G),V=await OT(q,X,Z-1);await this.switchToExistingThread(V)}catch(q){h.error("Failed to fork thread:",q),this.showErrorMessage(`Failed to fork thread: ${q}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Y,worker:X}=this.widget.dependencies,G=Y.mainThread;if(!G)return;let Z=G.messages.findIndex((q)=>q.messageId!==void 0&&q.messageId===J.messageId);if(Z===-1)return;try{this.cancelBashInvocations(),await X.cancel(),this.widget.dependencies.history.add(Q);let q=UN(Q);if(q)await X.handle({type:"thread:truncate",fromIndex:Z}),this.invokeBashCommand(q.cmd,{visibility:q.visibility});else{let V=[{type:"text",text:Q}];if(this.imageAttachments.length>0)V.push(...this.imageAttachments);let K={content:V,agentMode:G.agentMode},W=Z===0;if(G.agentMode&&!W&&K.agentMode!==G.agentMode){h.error(`Cannot edit message: This thread uses ${G.agentMode} mode. To change mode, create a new thread.`);return}await X.handle({type:"user:message",message:K,index:Z})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(q){h.error("Failed to edit message:",q)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(ZJ)}catch(Y){return h.error("Failed to get affected files:",Y),[]}};textController=new cZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new n3);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let X=this.searchElementTreeByKey(J.child,Q);if(X)return X}if(J?.children)for(let X of J.children){let G=this.searchElementTreeByKey(X,Q);if(G)return G}return null}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{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||"","~"),X=Q?`amp - ${Q} - ${Y}`:"";process.stdout.write(gC1(X))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new s7("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands;paletteConfig;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"){this.showCommandPalette(),this.textController.clear();return}let Y=UN(J)?.visibility;if(Y!==this.currentShellModeStatus)this.currentShellModeStatus=Y,this.setState(()=>{})};navigateHistoryPrevious=()=>{let J=this.widget.dependencies.history.previous();if(J!==null){if(this.historyIndex===-1)this.historyDraft=this.textController.text;this.historyIndex++,this.textController.text=J,this.textController.moveCursorToStart()}};navigateHistoryNext=()=>{let J=this.widget.dependencies.history.next();if(J!==null)this.historyIndex--,this.textController.text=J,this.textController.moveCursorToEnd();else if(this.historyIndex>-1)this.historyIndex=-1,this.textController.text=this.historyDraft||"",this.textController.moveCursorToEnd(),this.historyDraft=null};resetHistory=()=>{this.widget.dependencies.history.reset(),this.historyIndex=-1,this.historyDraft=null};openJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!0})};dismissJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!1})};openIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!0})};dismissIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!1}),Y9.instance.addPostFrameCallback(()=>{this.autocompleteFocusNode.requestFocus()})};handleIdeSelection=async(J,Q)=>{if(this.widget.dependencies.ideClient.getSelectedConfig()?.pid===J.pid){this.dismissIdePicker();return}try{await this.connectToSelectedIde(J,Q)}catch(Y){let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})}this.widget.dependencies.ideClient.selectConfig(J),this.dismissIdePicker()};async connectToSelectedIde(J,Q){await this.widget.dependencies.ideClient.start(J,!0,Q)}previewControllerListener=(J)=>{this.setState(()=>{this.previewThread=J})};showStandaloneThreadPicker=()=>{this.showCommandPalette({type:"standalone",commandId:"continue",onSubmit:()=>{this.threadPreviewController.clear(),this.setState(()=>{this.isShowingPalette=!1,this.paletteShowOptions=null}),Y9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette)this.autocompleteFocusNode.requestFocus()})},onCancel:()=>{this.exitApplication()}})};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(J){if(this.setState(()=>{this.isShowingPalette=!this.isShowingPalette,this.paletteShowOptions=J??null}),this.isShowingPalette)this.loadThreadsForPicker()}isShowingStandalonePalette(){return this.isShowingPalette&&this.paletteShowOptions?.type==="standalone"}getPaletteCommands(){if(!this.paletteCommands){if(!this.paletteConfig)throw Error("Config not yet available");this.paletteCommands=new vk1(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 bk1(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 X=i0.file(process.cwd()),G=A6(X);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,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let Z=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),Z},setImageAttachments:(Z)=>{this.setState(()=>{this.imageAttachments=Z})},editorDispatch:(Z)=>{switch(Z.type){case"set-input":this.textController.clear(),this.textController.insertText(Z.input);break;case"insert-text":this.textController.insertText(Z.text);break;case"clear":this.textController.clear();break}},submitMessage:(Z)=>{return this.proceedWithUserMessage(Z)},exitApp:this.exitApplication,openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},settingsStorage:this.widget.dependencies.settingsStorage,clientId:this.widget.dependencies.clientId,connectedClientsService:this.widget.dependencies.connectedClientsService,mcpService:this.widget.dependencies.mcpService,startNewThread:async()=>{await this.startAndSwitchToNewThread()},navigateBack:this.navigateBack,navigateForward:this.navigateForward,canNavigateBack:this.threadBackStack.length>0,canNavigateForward:this.threadForwardStack.length>0,canUseAmpFree:this.widget.dependencies.freeTierStatus?.canUseAmpFree??!1,switchToThread:async(Z)=>{return await this.switchToExistingThread(Z),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),this.widget.dependencies.worker},generateHandoffPrompt:async(Z,q,V)=>{let K=this.widget.dependencies.threadState.mainThread?.id;if(!K)throw Error("No active thread");let W=setTimeout(()=>{V.throwIfAborted()},60000);try{let H=await this.widget.dependencies.threadService.generateHandoffPrompt(K,Z,q,this.widget.dependencies.configService,V);return clearTimeout(W),H}catch(H){throw clearTimeout(W),H}},handleHandoff:async(Z,q)=>{let{goal:V,generatedPrompt:K,images:W}=q;if(!V&&!K)return{ok:!1,error:Error("Either goal or generatedPrompt required")};try{let H=this.widget.dependencies.threadState.mainThread?.id;if(!H)return{ok:!1,error:Error("No active thread")};let z=setTimeout(()=>Z.abort(new j91("Handoff took too long and was aborted (timeout: 60s)")),60000);try{let U=await this.widget.dependencies.threadService.createHandoffThread(H,{goal:V,generatedPrompt:K,images:W},this.widget.dependencies.configService,Z.signal);return clearTimeout(z),await this.switchToExistingThread(U),{ok:!0}}catch(U){if(clearTimeout(z),U instanceof Error&&(U.name==="AbortError"||U.message.includes("aborted")))throw Z.signal.reason;throw U}}catch(H){return h.error("Failed to create handoff thread",H),{ok:!1,error:H instanceof Error?H:Error(String(H))}}},getGuidanceFiles:async(Z)=>{if(!Q.mainThread)return[];return(await tr({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},Q.mainThread,Z)).map((V)=>({uri:V.uri,type:V.type}))},openIdePicker:()=>{this.openIdePicker()},getInMemoryAgentModeOverride:()=>{return this.inMemoryAgentModeOverride},setInMemoryAgentModeOverride:(Z)=>{this.setState(()=>{this.inMemoryAgentModeOverride=Z})},toggleAgentMode:this.toggleAgentMode,getEffectiveAgentMode:()=>this.getEffectiveAgentMode(),getEditorText:()=>this.textController.text,workspace:this.widget.dependencies.workspace??null,handleExecutePlan:async()=>{try{let Z=Q.mainThread?.id;if(!Z){this.setState(()=>{this.displayMessage=Error("No active thread")});return}let q=await this.widget.dependencies.threadService.createPlanExecutionThread(Z,"smart");await this.switchToExistingThread(q)}catch(Z){h.error("Failed to execute plan",Z),this.setState(()=>{this.displayMessage=Error(`Failed to execute plan: ${Z instanceof Error?Z.message:String(Z)}`)})}},planFileManager:this.widget.dependencies.planFileManager,completionBuilder:this.getCompletionBuilder(),threads:this.threadsForPicker,previewController:this.threadPreviewController,isLoadingThreads:this.isLoadingThreads,filterByWorkspace:this.filterThreadPickerByWorkspace,currentWorkspace:G,threadViewStates:this.widget.dependencies.workerController.threadViewStates,currentThreadFeedEntry:this.currentThreadFeedEntry,threadFeedEntries:this.threadFeedEntries,threadFeedHidden:this.threadFeedHidden,setThreadFeedHidden:(Z)=>{this.setState(()=>{this.threadFeedHidden=Z})}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new Hy1(this.widget.dependencies.threadHistoryService);this.threadLoadSubscription=J.observeThreadSummaries("").subscribe({next:(Q)=>{this.setState(()=>{this.threadsForPicker=Q,this.isLoadingThreads=!1})},error:()=>{this.setState(()=>{this.isLoadingThreads=!1})}})}updateGitBranch=async()=>{let J=await yA8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Y=Date.now(),X=`bash-${Y}-${Math.random().toString(36).substring(7)}`,G={cmd:J},Z=new AbortController;this.widget.dependencies.worker.invokeBashTool(G,Z.signal,Q===FN).subscribe({next:(q)=>{this.setState(()=>{if(this.bashInvocations.find((K)=>K.id===X))this.bashInvocations=this.bashInvocations.map((K)=>K.id===X?{...K,toolRun:q}:K);else{let K={id:X,args:G,toolRun:q,startTime:Y,abortController:Z,hidden:Q===FN};this.bashInvocations=[...this.bashInvocations,K]}})},error:()=>this.removeBashInvocation(X),complete:()=>this.removeBashInvocation(X)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};toggleAgentMode=()=>{let J=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(p$(J.thread)>0)return;if(this.freeTierStatus?.canUseAmpFree){let X=this.getEffectiveAgentMode(),G=Ii(X,this.cachedVisibleModes);if(G!==X)this.setState(()=>{this.inMemoryAgentModeOverride=G,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1});return}let Q=this.getEffectiveAgentMode(),Y=Ii(Q,this.cachedVisibleModes);if(Y===Q)return;if(this.setState(()=>{this.inMemoryAgentModeOverride=Y,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1}),$5(Y))this.checkAndShowFreeModeModal()};checkAndShowFreeModeModal=()=>{if(this.freeTierStatus?.canUseAmpFree)return;if(this.freeTierStatus){if(!this.freeTierStatus.eligible){this.setState(()=>{this.showingCannotToggleMessage="Amp Free is unavailable. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}else if(!this.freeTierStatus.workspaceAllowsAmpFree){this.setState(()=>{this.showingCannotToggleMessage="Your workspace does not allow Amp Free. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}}};isInRestrictedFreeMode(){if(this.getEffectiveAgentMode()!=="free")return!1;if(this.freeTierStatus?.canUseAmpFree)return!1;return!0}handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!mk(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>=BU)return!1;let Y=CC(J);if(typeof Y==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Y]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Y}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Y,unlink:X,rmdir:G,writeFile:Z}=await import("node:fs/promises"),{tmpdir:q}=await import("node:os"),V=await import("node:path");try{let K=await Q(V.join(q(),"amp-edit-")),W=V.join(K,"message.amp.md");await Z(W,J,"utf-8"),await Pz(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")h.error("Failed to read temporary file",H)}try{await X(W),await G(K)}catch(H){h.warn("Failed to clean up temporary file",H)}}catch(K){h.error("Error opening editor:",K)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=UN(J);if(Q)if(!Q.cmd){this.showSubmitDisabledHint("No command provided");return}else if(this.isProcessing()){this.showSubmitDisabledHint("Unable to use shell mode while agent is active");return}else{this.invokeBashCommand(Q.cmd,{visibility:Q.visibility}),this.widget.dependencies.history.add(J),this.textController.clear(),this.resetHistory();return}this.textController.clear(),this.resetHistory(),await this.updateGitBranch(),await this.sendUserMessage(J)};initState(){if(ZG.getInstance().interceptConsole(),this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();I9.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),I9.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),I9.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{Y9.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),this.freeTierStatus=this.widget.dependencies.freeTierStatus,F6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y;let X=H81(this.widget.dependencies.worker.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,Y.settings);if(h.info(`[initState] Resolved agentMode: ${X}`),this.widget.dependencies.sessionState?.agentMode)this.setState(()=>{this.inMemoryAgentModeOverride=X})}),this.updateGitBranch(),this.adSubscription=Zj1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{return(this.inMemoryAgentModeOverride&&$5(this.inMemoryAgentModeOverride)||this.randomAd===null)&&Gj1(this.lastUserInteractionTime)}).subscribe({next:(Y)=>{if(Y){let X=_A8(16).toString("hex");this.lastAdImpressionId=X,Promise.resolve().then(() => (Q51(),J51)).then(({recordAdEvent:G})=>{let Z=this.widget.dependencies.worker.thread,q=Z.messages[Z.messages.length-1];G("viewed",{adId:Y.id,advertiserId:Y.advertiserId,threadId:Z.id,messageId:q?.messageId,impressionId:X,placement:"tui",matchType:Y.metadata?.matchType,matchedPatterns:Y.metadata?.matchedPatterns,candidateAdPoolCount:Y.metadata?.candidateAdPoolCount,clientRegion:Y.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=Y}),Y9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}});let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=Y})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Y)=>{this.setState(()=>{this.ideStatus=Y})}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Y)=>{let X=this.widget.dependencies.getCurrentWorker();if(!X){h.warn("No active thread worker found to handle IDE message");return}await new Promise((G)=>setTimeout(G,50)),await X.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}}),h.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),h.debug("Appended text to CLI prompt from IDE",{text:Y.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Y)=>{this.setState(()=>{this.connectedClientsStatus=Y})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Y)=>{this.setState(()=>{this.updateState=Y})}),this.agentModeSubscription=this.widget.dependencies.configService.config.subscribe((Y)=>{let X=rG(Y.settings,this.freeTierStatus?.canUseAmpFree);this.setState(()=>{this.cachedVisibleModes=X})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Y)=>{let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100);this.initThreadFeed()}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener()}dispose(){if(this.replayAbortController.abort(),this.replayTypingTimer)clearTimeout(this.replayTypingTimer);if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeSubscription)this.agentModeSubscription.unsubscribe();if(this.adSubscription)this.adSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(this.threadLoadSubscription)this.threadLoadSubscription.unsubscribe();if(this.threadFeedSubscription)this.threadFeedSubscription.unsubscribe();if(this.threadFeedRotationTimer)clearInterval(this.threadFeedRotationTimer);if(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(gC1("")),this.shouldUseProgressBar())process.stdout.write(L76())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,X=[...J.items.filter((V)=>V.type==="toolResult").map((V)=>({toolUse:V.toolUse,toolRun:V.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((V)=>V.toolRun.status==="blocked-on-user");if(X.length===0)return null;let G=X[0],Z=G.toolRun.status==="blocked-on-user"?G.toolRun.toAllow??[]:[],q=G.toolRun.status==="blocked-on-user"?G.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:G.toolUse,toAllow:Z}],subthreadID:G.subthreadID,reason:q}}shouldUseProgressBar(){return!1}updateProgressBar(){}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){h.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){h.error("No tool use block found in confirmation");return}if(J==="allow-all-session")_$("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(G){if(G&&G instanceof Error)this.setState(()=>{this.displayMessage=G});else h.error("Failed to write dangerouslyAllowAll setting:",G);return}if(J==="always-guarded"){let G=Q.tools[0]?.toAllow??[],Z=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],q=[...G,...Z];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",q,"global")}if(J==="connect-github"){let G=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();await rY(this.context,G);return}if(J==="disable-librarian"){let G=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!G.includes(wX))await this.widget.dependencies.settingsStorage.set("tools.disable",[...G,wX],"global")}let X=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let G={type:"user:tool-input",toolUse:Y.id,value:{accepted:X}};if(Q.subthreadID)await(await w3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(G);else await this.widget.dependencies.worker.handle(G)}catch(G){h.error("Failed to send tool confirmation:",G)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Y=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Y)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Y=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Y.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.setState(()=>{this.inMemoryAgentModeOverride="smart",this.dismissedEphemeralErrorKey=null}),M41({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 Pz(Q.getSettingsFilePath())}catch(Y){let X=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${X}`)}};cancelStreamingMessage=async()=>{await w3.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let Y=J.messages[Q];if(Y?.role==="user"&&!Y.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Y=!0}=Q;if(Y){let X=this.widget.dependencies.worker.thread.id;if(X!==J)this.recordNavigation(X)}try{h.info(`[switchToExistingThread] Switching to thread: ${J}`);let X=await this.widget.dependencies.switchToThread(J);h.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${X.thread.agentMode}`);let G=await this.widget.dependencies.configService.getLatest(),Z=H81(X.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,G.settings);if(h.info(`[switchToExistingThread] Thread ${J} resolved agentMode: ${Z}`),this.widget.dependencies.worker=X,this.widget.dependencies.threadID=X.thread.id,this.widget.dependencies.switchWorker(X),this.setState(()=>{h.info("[switchToExistingThread] Clearing inMemoryAgentModeOverride"),this.inMemoryAgentModeOverride=null}),X.thread.draft)if(h.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof X.thread.draft==="string")this.textController.insertText(X.thread.draft);else{let q=X.thread.draft.filter((W)=>W.type==="text"),V=X.thread.draft.filter((W)=>W.type==="image"),K=q.map((W)=>W.text).join(`
|
|
4869
4869
|
`);if(K)this.textController.insertText(K);if(V.length>0)this.setState(()=>{this.imageAttachments=V})}}catch(X){throw h.error("Failed to switch to thread:",J,X),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Y=p$(Q.thread)===0,X=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Y&&X!==Q.thread.agentMode){await this.showErrorMessage(`This thread uses ${Q.thread.agentMode} mode. To change mode, edit the first message or create a new thread.`);return}let G=[{type:"text",text:J}];if(this.imageAttachments.length>0)G.push(...this.imageAttachments);if(await Q.handle({type:"user:message",message:{content:G,agentMode:X}}),Y)M41({agentMode:X});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),Y9.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((X)=>X.type==="handoff"&&X.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();M41({agentMode:Q}).catch((Y)=>{h.warn("Failed to save session state on exit:",Y)}).finally(()=>{I9.instance.stop()})};onExitPressed=()=>{if(this.isConfirmingExit){if(this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;this.exitApplication()}else{if(this.setState(()=>{this.isConfirmingExit=!0}),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout);this.exitConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingExit=!1}),this.exitConfirmTimeout=null},1000)}};toHomeRelative(J){let Q=kA8();if(J===Q)return"~";if(J.startsWith(Q+rm.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(rm.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(rm.sep),"…",Q.slice(-2).join(rm.sep)].join(rm.sep)}build(J){let Q=H8.of(J),Y=L6.of(J),X=Y.base;this.themeColors=X;let{colors:G,app:Z}=Y;this.themeApp=Z;let q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,V=q.thread.agentMode&&$5(q.thread.agentMode),K=V&&this.randomAd!==null,W=!V&&this.currentThreadFeedEntry!==null&&!this.threadFeedHidden&&this.hasSubmittedFirstMessage,H=K||W,{threadState:z}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let U=this.getCurrentConfirmation(),N=this.widget.dependencies.replayMode,M=Boolean(N),L=z.items,A=z.mainThread||void 0,E=z.subagentToolsByParentID,P=z.todosList;if(M){let J4={...N.thread,messages:this.replayDisplayedMessages};L=dC(J4).items,A=J4,E={};let o4=FI({messages:this.replayDisplayedMessages});P=Array.isArray(o4)?o4:[]}let I=A?.id,T=A,S=M?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),y=(J4)=>new R91({key:new s7(`preview-message-view-${J4.id}`),items:dC(J4).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:J4,focusNode:new n8({debugLabel:"PreviewFocus"})}),x=this.previewThread,g=x?x.messages.length>2000?new o0({mainAxisSize:"max",children:[new N4({child:new F0}),new p6({padding:_0.all(2),child:new F8({child:new m1({text:new e("Thread too long for preview",new q1({color:G.mutedForeground,dim:!0}))})})})]}):y(x):S?new C91({agentMode:this.getEffectiveAgentMode()}):new R91({key:I?new s7(`message-view-${I}`):void 0,items:L,subagentToolsByParentID:E,controller:I?this.getMessageScrollController(I):new n3,autofocus:!1,onCopy:M?void 0:this._handleTextCopy.bind(this),thread:T,onMessageEditSubmit:M?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:M?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:M?void 0:this.forkMessage,getAffectedFiles:M?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),p=Math.max(Math.floor(Q.size.height*0.4),12),b=this.getCurrentEphemeralError(),l=this.buildBottomWidget(b,U,G,Y,z,P,p,H,M),J1=Q.size.width<40,n=z.mainThread?nB0(z.mainThread):void 0,u=new u81({threadViewState:z.viewState,threadTokenUsage:n,threadID:I??null,thread:z.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onCostBreakdownClick:()=>{this.setState(()=>{this.isShowingCostBreakdownOverlay=!this.isShowingCostBreakdownOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,isNarrow:J1,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!U,showingEphemeralError:Boolean(z.viewState.state==="active"&&z.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),s=new m81({bashInvocations:this.bashInvocations}),H1=[],W1=this.getEffectiveAgentMode(),o=this.currentShellModeStatus,r=My1(W1),i=!o?W1.length+1:0,F1=Q.capabilities.animationSupport,y1=F1==="disabled"?0:F1==="slow"?30:60,t=gV(W1)?.uiHints?.fasterAnimation?3:1,f1=y1>0&&this.agentModePulseSeq>0?new H5({children:[l,new T7({top:0,left:1,right:1,height:1,child:new $y1({color:r,trigger:this.agentModePulseSeq,fps:y1,speed:t,leftOffset:i})})]}):l;H1.push(new N4({child:g}),s);let C1=new H5({children:[new o0({mainAxisSize:"min",children:[K?new Ek1({ad:this.randomAd,onButtonClick:async()=>{let J4=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (Q51(),J51)).then(({recordAdEvent:Z8})=>{let v4=this.widget.dependencies.worker.thread,M4=v4.messages[v4.messages.length-1];Z8("clicked",{adId:J4.id,advertiserId:J4.advertiserId,threadId:v4.id,messageId:M4?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:J4.metadata?.matchType,matchedPatterns:J4.metadata?.matchedPatterns,candidateAdPoolCount:J4.metadata?.candidateAdPoolCount,clientRegion:J4.metadata?.clientRegion})});if(!await rY(this.context,J4.shortDestinationUrl)){let v4=I9.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:v4,url:J4.shortDestinationUrl}})}}}):W?new Wy1({entry:this.currentThreadFeedEntry}):new F0({height:0}),new Y6({constraints:new i6(0,Q.size.width,0,p),child:f1})]}),H?new T7({top:0,left:0,right:0,child:new vG6({userHeight:this.bottomGridUserHeight,maxHeight:p,onInitializeHeight:(J4)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(J4,p)})},onDrag:(J4)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(J4.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let o4=Math.floor(J4.localPosition.y)-this.bottomGridDragStartY,Z8=Math.max(4,this.bottomGridDragStartHeight-o4),v4=Math.min(Z8,p),M4=Math.floor(v4);if(this.bottomGridUserHeight!==M4)this.setState(()=>{this.bottomGridUserHeight=M4})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new F0({height:0})]});H1.push(C1,new F0({height:1,child:new p6({padding:_0.horizontal(1),child:u})}));let w0=new o0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:H1}),s1=M&&N?.showIndicator!==!1?new H5({children:[w0,new T7({top:0,left:0,child:new Ky1})]}):w0,U1=new X9(()=>{if(this.isShowingPalette)return this.dismissPalette(),"handled";if(this.pendingMCPServers.length>0)return this.widget.dependencies.mcpTrustHandler.deny(),"handled";if(this.getCurrentEphemeralError())return this.handleEphemeralErrorResponse("dismiss"),"handled";if(this.displayMessage)return this.handleDisplayMessageDismiss(),"handled";if(this.isShowingHelp)return this.setState(()=>{this.isShowingHelp=!1}),"handled";if(this.isShowingFileChangesOverlay)return this.setState(()=>{this.isShowingFileChangesOverlay=!1}),"handled";if(this.isShowingCostBreakdownOverlay)return this.setState(()=>{this.isShowingCostBreakdownOverlay=!1}),"handled";if(this.isShowingIdePicker)return this.dismissIdePicker(),"handled";if(this.isShowingJetBrainsInstaller)return this.dismissJetBrainsInstaller(),"handled";if(this.isShowingConfirmationOverlay)return this.setState(()=>{this.isShowingConfirmationOverlay=!1,this.confirmationOverlayContent=""}),"handled";if(this.isShowingConsoleOverlay)return this.setState(()=>{this.isShowingConsoleOverlay=!1}),"handled";if(this.textController.hasSelection)return this.textController.clearSelection(),"handled";if(this.isConfirmingClearInput){if(this.textController.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((o4)=>{h.error("Failed to mark message as interrupted:",o4)}),this.cancelStreamingMessage().catch((o4)=>{h.error("Failed to cancel streaming message:",o4)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return h.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),Y1=new X9(()=>{return this.onExitPressed(),"handled"}),O1=new X9(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),w1=new X9(()=>{return TJ.instance.toggleAll(),"handled"}),I1=new X9(()=>{return this.widget.dependencies.configService.getLatest().then((J4)=>{_$("internal.showCost",!(J4.settings["internal.showCost"]??!0))}),"handled"}),E1=new X9(()=>{return I9.instance.toggleFrameStatsOverlay(),"handled"}),d1=new X9(()=>{return I9.instance.tuiInstance.getScreen().markForRefresh(),Y9.instance.requestFrame(),"handled"}),h1=new X9(()=>{return this.toggleAgentMode(),"handled"}),r1=new X9(()=>{let o4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,v4=Z8.mainThread?.id;return v4?this.getMessageScrollController(v4):null})();if(o4){let Z8=Math.max(Math.floor(Q.size.height*0.4),10),v4=Q.size.height-Z8;o4.animatePageUp(v4,100)}return"handled"}),$0=new X9(()=>{let o4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,v4=Z8.mainThread?.id;return v4?this.getMessageScrollController(v4):null})();if(o4){let Z8=Math.max(Math.floor(Q.size.height*0.4),10),v4=Q.size.height-Z8;o4.animatePageDown(v4,100)}return"handled"}),G0=new X9(()=>{let o4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,v4=Z8.mainThread?.id;return v4?this.getMessageScrollController(v4):null})();if(o4)o4.animateTo(0,100);return"handled"}),T0=new X9(()=>{let o4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:Z8}=this.widget.dependencies,v4=Z8.mainThread?.id;return v4?this.getMessageScrollController(v4):null})();if(o4)o4.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),U6=new X9(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:J4}=this.widget.dependencies;if(!J4.mainThread?.messages.some((Z8)=>Z8.role==="user"||zI(Z8)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),M6=new X9((J4)=>{if(J4.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),E4=new X9(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return x81().then(async(J4)=>{if(J4)try{this.handleInsertImage(J4)}finally{try{let{unlink:o4}=await import("node:fs/promises");await o4(J4)}catch{}}}),"handled"}),m4=new Map([[U4.ctrl("c"),new Im],[U4.ctrl("l"),new jm],[U4.ctrl("o"),new S81],[U4.ctrl("v"),new wm],[U4.alt("s"),new _C],[U4.ctrl("s"),new _C],[U4.alt("p"),new Cm],[U4.ctrl("r"),new Rm],[U4.alt("d"),new Tm],[U4.ctrl("t"),new Sm],[U4.key("PageUp"),new R81],[U4.key("PageDown"),new T81],[U4.key("Home"),new C81],[U4.key("End"),new j81],[U4.key("Escape"),new Em],[U4.ctrl("p"),new kC("previous")],[U4.ctrl("n"),new kC("next")],[U4.key("Tab"),new _m]]);if(!t2())m4.set(U4.key("ArrowUp"),new _m);if(!1)m4.set(U4.alt("c"),new Pm);let I0=new X9(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),u0=new X9(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),o6=new Map([[Em,U1],[jm,d1],[_C,h1],[S81,I0],[wm,E4],[Pm,O1],[Rm,w1],[Tm,I1],[Cm,E1],[Sm,u0],[Im,Y1],[R81,r1],[T81,$0],[C81,G0],[j81,T0],[_m,U6],[kC,M6]]),P4=[s1];if(this.isShowingConsoleOverlay)P4.push(new uk1);if(this.isShowingHelp&&this.paletteConfig)P4.push(new ck1({commands:this.getPaletteCommands().getAllCommands()}));if(this.adActionModal)P4.push(new Ik1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(J4)=>{let o4=this.adActionModal.url;if(J4==="copy")try{await I9.instance.tuiInstance.clipboard.writeText(o4),this.setState(()=>{this.displayMessage=new HG("Link copied to clipboard")})}catch(Z8){h.error("Failed to copy to clipboard",{error:Z8}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:J4}=this.widget.dependencies;P4.push(new qy1({servers:this.pendingMCPServers,onAlwaysTrust:J4.trustAlways.bind(J4),onTrustOnce:J4.trustOnce.bind(J4),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:J4.deny.bind(J4)}))}if(this.isShowingFileChangesOverlay)P4.push(new IS1({threadData:z}));if(this.isShowingCostBreakdownOverlay&&z.mainThread)P4.push(new pk1({thread:z.mainThread}));if(this.isShowingConfirmationOverlay)P4.push(new gk1({details:this.confirmationOverlayContent}));let j8=this.getCommandPaletteContext(J);if(j8&&this.isShowingPalette&&this.paletteConfig)P4.push(new F8({child:new Y6({constraints:i6.loose(80,20),child:new hk1({commandContext:j8,mainThread:z.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})})}));if(this.isShowingIdePicker)P4.push(new ik1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let L5=new H5({children:P4});if(this.isShowingJetBrainsInstaller)return new DO({child:new eQ({actions:o6,child:new vq({shortcuts:m4,debugLabel:"jetbrains-installer-shortcuts",child:new Zy1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Tz({controller:this.toastController,child:new DO({child:new WS1({controller:this.toastController,child:new eQ({actions:o6,child:new vq({shortcuts:m4,debugLabel:"main-app-shortcuts",child:L5})})})})})}buildScrollableTodoList(J,Q,Y){return new yG6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,X,G,Z,q,V,K){if(J)return new dk1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new mk1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Vy1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let W=b81(X),H=this.isInRestrictedFreeMode(),z=new _O({key:this.textFieldKey,controller:this.textController,triggers:K?[]:[new ON],completionBuilder:K?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:K?void 0:this.onTextSubmitted,theme:Y,placeholder:K?"Press Ctrl+C to exit":H?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!H&&!this.isShowingStandalonePalette(),shellPromptRules:W,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandalonePalette()&&!this.isShowingIdePicker,clipboard:I9.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage,previousThreadId:this.previousThreadIdForHint&&(G.mainThread?.messages.length??0)===0?this.previousThreadIdForHint:void 0,onPreviousThreadHintAccepted:()=>{let p=this.previousThreadIdForHint;if(p)this.setState(()=>{this.previousThreadIdForHint=null}),this.textController.text=`following: @${p} `},onDoubleAtTrigger:K?void 0:()=>{let p=this.textController.text,b=this.textController.cursorPosition,J1=p.slice(0,b).lastIndexOf("@@");this.showCommandPalette({type:"standalone",commandId:"mention-thread",onBeforeExecute:()=>{if(J1!==-1){let n=this.textController.text,u=n.slice(0,J1)+n.slice(J1+2);this.textController.text=u,this.textController.cursorPosition=J1}},onSubmit:()=>{this.dismissPalette()},onCancel:()=>{this.dismissPalette()}})}}),U=G.mainThread?.queuedMessages??[],N=Array.isArray(Z)&&Z.length>0,M=Array.isArray(U)&&U.length>0,L=G.mainThread?.agentMode==="plan"&&VO(G.mainThread),A,E;if(L){if(A=new oj1(new T91({thread:G.mainThread,onExecute:async()=>{let p=this.getCommandPaletteContext();if(p)await this.getPaletteCommands().execute("execute-plan",p,void 0,new AbortController)},onEdit:async()=>{try{let p=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:b}=await this.widget.dependencies.planFileManager.ensureSync(G.mainThread.id);I9.instance.tuiInstance.suspend();let{execSync:l}=await import("child_process");l(`${p} "${b}"`,{stdio:"inherit"}),I9.instance.tuiInstance.resume()}catch(p){h.error("Failed to edit plan",p),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:X}),{clipBehavior:"antiAlias"}),M)E=new e91({queuedMessages:U});else if(N)E=this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!H,X)}else A=M?new e91({queuedMessages:U}):void 0,E=N?this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!H,X):void 0;let P=[],I=this.currentShellModeStatus;if(I)P.push({child:new m1({text:new e(I==="hidden"?"shell mode (incognito)":"shell mode",new q1({color:I==="hidden"?X.app.shellModeHidden:X.app.shellMode}))}),position:"top-left"});if(!I&&this.cachedVisibleModes.length>1){let p=this.previewThread,b=p?p.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),l=My1(b);if(p)P.push({child:new m1({text:new e(b,new q1({color:l}))}),position:"top-left"});else{let J1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,n=p$(J1.thread)===0,u=new m1({text:new e(b,new q1({color:l}))});P.push({child:n?new T8({child:u,onClick:this.toggleAgentMode,cursor:"pointer"}):u,position:"top-left"})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let p=this.connectedClientsStatus,b=p.mode||"disconnected",l=!!p.errorMessage,J1=p.clientID||"unknown",n,u;if(l)n="●",u=A1.red;else if(b==="presence")n="○",u=A1.yellow;else if(b==="connected"&&p.connected)n="●",u=A1.green;else n="○",u=A1.yellow;let s=this.connectedClientsStatusExpanded?`${J1} ${n}`:n;P.push({child:new T8({child:new m1({text:new e(s,new q1({color:u}))}),onClick:this.toggleConnectedClientsStatus,cursor:"pointer"}),position:"top-right",offsetX:-2})}let T=K?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:G.mainThread?.env?.initial.trees?.[0]?.uri,S;if(T)S=i0.parse(T).fsPath;else S=process.cwd();let y=this.toHomeRelative(S),x=this.shorten(y),g=!K&&this.currentGitBranch?`${x} (${this.currentGitBranch})`:x;return P.push({child:new m1({text:new e(g,new q1({color:Y.foreground,dim:!0}))}),position:"bottom-right"}),new BS1({leftChild:new N4({child:z}),rightChild1:A,rightChild2:E,maxHeight:q,overlayTexts:P,borderColor:H||!this.isTextfieldAndAutocompleteFocused?A1.index(8):void 0,hasBanner:V,userHeight:this.bottomGridUserHeight,onInitializeHeight:(p)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(p,q)})},onDrag:(p)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(p.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let b=Math.floor(p.localPosition.y)-this.bottomGridDragStartY,l=Math.max(4,this.bottomGridDragStartHeight-b),J1=Math.min(l,q),n=Math.floor(J1);if(this.bottomGridUserHeight!==n)this.setState(()=>{this.bottomGridUserHeight=n})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:!V})}}async function Ly1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)I9.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let X=()=>null,Z=!1,q=new Lz(Z,1000,J.inspectorPort),V=J.features?.find((A)=>A.name==="amp-connect")?.enabled??!1,K=new Ok1({threadService:J.threadService,worker:J.worker,builder:(A,E,P,I,T,S)=>{if(X=T,J.threadDependencies&&V)jj1(J.threadDependencies,J.configService,T,I,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((g)=>{h.error("Failed to start automatic presence:",g)});let y=T(),x={...J,worker:y,threadID:y.thread.id};return new _G6({...x,threadState:E,workerController:P,switchWorker:I,getCurrentWorker:T,recentThreadIDs:S})}}),W=new AS1({configService:J.configService,child:K}),H=new DS1({configService:J.configService,child:W}),z=new YS1(H),U=new L6({data:yC.fromBaseTheme(dZ.default()),child:z});try{await Jj1(U,{onRootElementMounted:(A)=>{if(h.info("TUI input ready for user interaction"),Z)q.start(A)}})}finally{if(Z)q.stop();if(J.threadDependencies&&V){let{stopGlobalSession:A}=await Promise.resolve().then(() => (Sj1(),M36));A()}}let M=X()?.thread.id||J.threadID,L=await J.threadService.get(M);if(L&&L.messages.length>0){let A=`${J.ampURL.replace(/\/$/,"")}/threads/${M}`;g36(L,A,J.stdout)}}function My1(J){let Y=gV(J)?.uiHints?.secondaryColor;if(Y)return A1.rgb(Y.r,Y.g,Y.b);return xA8(J)}class yG6 extends X6{props;constructor(J){super();this.props=J}createState(){return new xG6}}class xG6 extends Q6{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Y,appTheme:X}=this.widget.props;return new s6({crossAxisAlignment:"stretch",children:[new N4({child:new T2({controller:Y,autofocus:!1,child:new wk1({todos:Q})})}),new UG({controller:Y,thumbColor:X.app.scrollbarThumb,trackColor:X.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:G,offset:Z}=Y,q=this.viewportHeight,V=G+q;return{totalContentHeight:Math.max(V,0),viewportHeight:Math.max(q,1),scrollOffset:Math.max(Z,0)}}})]})}updateViewportHeight(){let J=this.getViewportHeight();if(J!==this.viewportHeight)this.viewportHeight=J}getViewportHeight(){let J=this.context.findRenderObject();if(!J)return this.viewportHeight;let Q=(X,G=0)=>{if(X&&"size"in X&&"children"in X){let Z=X.children||[];for(let q of Z){if(q&&"size"in q){let K=q.size;if(typeof K?.height==="number"&&K.height>0)return K.height}let V=Q(q,G+1);if(V>0)return V}}return 0},Y=Q(J);if(Y>0)return Y;if("size"in J){let X=J.size;if(typeof X?.height==="number"&&X.height>0)return X.height}return this.viewportHeight}}class vG6 extends w6{props;constructor(J){super();this.props=J}build(J){return new T8({child:new F0({height:1}),cursor:i9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let X=J.findRenderObject()?.size.height??0;if(X>0){this.props.onInitializeHeight(X);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function xA8(J){let Q=0;for(let G=0;G<J.length;G++){let Z=J.charCodeAt(G);Q=(Q<<5)-Q+Z,Q=Q&Q}let Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Y.length;return A1.index(Y[X])}eC1();try{if(process.platform==="win32")await Promise.resolve().then(() => N6(Hj(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){eZ.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
4870
|
-
`)}var ax1=nx1.join(IF0||nx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function QP8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function dq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")_$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")_$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")_$("model.sonnet",Q.useSonnet)}async function rx1(J){try{await tI8(nx1.dirname(ax1),{recursive:!0}),await eI8(ax1,J,"utf-8")}catch(Q){h.debug("Failed to save last thread ID",Q)}}async function YP8(){try{return(await qV6(ax1,"utf-8")).trim()}catch(J){return null}}var GV6=[{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??hZ,description:`Custom settings file path (overrides the default location ${hZ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(h).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${GC1})`},{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:t2(),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:$I.SMART.key,description:`Set the agent mode (${rG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:rG().map((J)=>J.mode)}],ZV6=(J)=>("deprecated"in J)&&J.deprecated===!0,XP8=(J)=>("hidden"in J)&&J.hidden===!0,GP8=(J)=>("default"in J),ZP8=(J)=>("default"in J)?J.default:void 0;function $P8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new _8(fZ.unknownCommand(Y),1,q)}}var VV6=null;function uL5(){return VV6}function Lu(J){return{...J,getThreadEnvironment:n61,vfs:aI0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new gx(J.fileSystem),generateThreadTitle:ul0,deleteThread:(Q)=>J.threadService.delete(Q)}}var sx1=i0.file(JP8.homedir()),KV6=process.env.XDG_CONFIG_HOME?i0.file(process.env.XDG_CONFIG_HOME):s0.joinPath(sx1,".config");async function cq(J,Q){GN0("0.0.
|
|
4870
|
+
`)}var ax1=nx1.join(IF0||nx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function QP8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function dq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")_$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")_$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")_$("model.sonnet",Q.useSonnet)}async function rx1(J){try{await tI8(nx1.dirname(ax1),{recursive:!0}),await eI8(ax1,J,"utf-8")}catch(Q){h.debug("Failed to save last thread ID",Q)}}async function YP8(){try{return(await qV6(ax1,"utf-8")).trim()}catch(J){return null}}var GV6=[{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??hZ,description:`Custom settings file path (overrides the default location ${hZ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(h).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${GC1})`},{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:t2(),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:$I.SMART.key,description:`Set the agent mode (${rG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:rG().map((J)=>J.mode)}],ZV6=(J)=>("deprecated"in J)&&J.deprecated===!0,XP8=(J)=>("hidden"in J)&&J.hidden===!0,GP8=(J)=>("default"in J),ZP8=(J)=>("default"in J)?J.default:void 0;function $P8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new _8(fZ.unknownCommand(Y),1,q)}}var VV6=null;function uL5(){return VV6}function Lu(J){return{...J,getThreadEnvironment:n61,vfs:aI0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new gx(J.fileSystem),generateThreadTitle:ul0,deleteThread:(Q)=>J.threadService.delete(Q)}}var sx1=i0.file(JP8.homedir()),KV6=process.env.XDG_CONFIG_HOME?i0.file(process.env.XDG_CONFIG_HOME):s0.joinPath(sx1,".config");async function cq(J,Q){GN0("0.0.1764504080-gf1c679");let Y=Zq1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:X0.of([i0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:sx1,userConfigDir:KV6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (Q51(),J51));X(Y);let G=await Y.getLatest();h.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let{toolService:Z,dispose:q}=K16({configService:Y}),V=new Map,K=()=>V.clear(),W=new $U1(Y,J.settings.getWorkspaceRootPath()),H=QI0({configService:Y,trustStore:W,createOAuthProvider:async(n)=>{let u=V.get(n);if(u)return h.debug("Reusing existing OAuth provider for server",{serverName:n}),u;h.debug("Creating OAuth provider for server",{serverName:n});let s=(async()=>{let H1=new lM(J.secrets),W1=await H1.getClientInfo(n),o=new CF1({storage:H1,serverName:n,clientId:W1?.clientId,clientSecret:W1?.clientSecret,scopes:W1?.scopes});return h.debug("OAuth provider created",{serverName:n,hasManualClientId:!!W1?.clientId,willUseDCR:!W1?.clientId}),o})();return V.set(n,s),s}}),z=i01({configService:Y,filesystem:N5,spawn:fA}),{initializeToolProviders:U}=await Promise.resolve().then(() => (XV6(),YV6)),{registrations:N,initErrors:M}=await U({toolService:Z,providers:[H,z],initialTimeout:J.executeMode?15000:5000});for(let[n,u]of M)h.warn(`${n} provider initialization slow or failed:`,u);if(Q.jetbrains)BI("JetBrains");else if(Q.ide&&F56())BI("VS Code");else if(Q.ide&&U56())BI("Neovim");if(J.executeMode)ZN0(!0);let L,A=D2.status.pipe($6((n)=>Boolean(n.connected&&n.authenticated)),S4()).subscribe((n)=>{if(n){if(!L)L=Z.registerTool(as0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode)E=new G41(process.cwd(),{},!0);else E=new class extends G41{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(h5.write(`No API key found. Starting login flow...
|
|
4871
4871
|
`),!await qP8(J))await XO(),process.exit(1)}let P=await PR0({isDevelopment:!1}),I=new VI1(P,Y),T=new XI1(P,{lazy:!0}),S=new NU1(I,(n,u)=>{let s=w3.get(n);if(s)s.handle(u).catch((H1)=>{h.error("Failed to apply artifact delta",H1)})}),y=Q.notifications!==void 0?Q.notifications:!J.executeMode,x=H16({playNotificationSound:async(n)=>{if(y){W16(n);let u=sC1(),s=tC1();if((!u||s)&&G.settings["notifications.system.enabled"]!==!1){if(n==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(n==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:I,configService:Y});h.info("Starting Amp background services");let g=dl0({threadService:I,threadHistoryService:T,configService:Y,isExtensionDevelopment:!1}),p;D2.status.subscribe((n)=>{p=n});let b=new dZ1({workspaceRoots:[i0.file(process.cwd())],getCurrentFile:()=>{if(!p?.openFile)return;try{return i0.parse(p.openFile)}catch(n){h.warn("Failed to parse current file URI",{uri:p.openFile,error:n});return}},getOpenFiles:()=>{if(!p?.visibleFiles?.length)return[];let n=p.openFile;return p.visibleFiles.filter((u)=>u!==n).map((u)=>{try{return i0.parse(u)}catch(s){return h.warn("Failed to parse visible file URI",{uri:u,error:s}),null}}).filter((u)=>u!==null)}}),l=new Qj1,J1={codebaseContextService:b,configService:Y,toolService:Z,mcpService:H,trustStore:W,threadService:I,threadHistoryService:T,threadSyncService:g,planFileManager:S,threadStorage:P,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,notificationService:x,fileSystem:Q.jetbrains||Q.ide?lI0:N5,terminal:l};return{...J1,async asyncDispose(){if(J1.mcpService.hasAuthenticatingClients())h.info("Waiting for OAuth authentication to complete before exit..."),await J1.mcpService.waitForAuthentication();for(let n of N.values())n.dispose();await J1.mcpService.dispose(),K(),await J1.threadService.asyncDispose(),J1.configService.unsubscribe(),q(),J1.fuzzyServer.dispose(),J1.threadSyncService.dispose(),J1.settingsStorage[Symbol.dispose](),A.unsubscribe(),L?.dispose()}}}async function qP8(J){if(!J.executeMode){if(!await jC1("Would you like to log in to Amp? [(y)es, (n)o]: "))return h5.write(`Login cancelled. Run the command again to retry.
|
|
4872
4872
|
`),!1}return await WV6(J)}async function WV6(J){let Q=sI8(32).toString("hex"),Y=await CC1(J.ampURL,Q),X=new AbortController;try{await yE(Y,X.signal)}catch(Z){h.error("Error opening browser",{error:Z})}let G=await CC1(J.ampURL,Q,!1);h5.write(`If your browser does not open automatically, visit:
|
|
4873
4873
|
|
|
@@ -4877,7 +4877,7 @@ ${h4.blue.bold(G)}
|
|
|
4877
4877
|
Login successful! You can now use the Amp CLI.
|
|
4878
4878
|
`),!0}catch(Z){return h.error("Login failed",{error:Z}),eZ.write(`
|
|
4879
4879
|
Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
4880
|
-
`),!1}}function VP8(){let J=new lA().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)eT(),process.exit(0);let z=H.originalError??H;q96(z)}),J.option("-V, --version","Print the version number and exit",()=>{h5.write(`0.0.
|
|
4880
|
+
`),!1}}function VP8(){let J=new lA().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)eT(),process.exit(0);let z=H.originalError??H;q96(z)}),J.option("-V, --version","Print the version number and exit",()=>{h5.write(`0.0.1764504080-gf1c679 (released 2025-11-30T12:06:56.791Z)
|
|
4881
4881
|
`),process.exit(0)}),J.addHelpText("after",W56()),J.configureHelp({formatHelp:H56}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await $Y(U);await zP8(N)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await $Y(U);await HP8(N,await DC1(U,N.settings))});let Q=async(H,z,U)=>{Zq1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:X0.of([i0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:sx1,userConfigDir:KV6});let N={...z,executeMode:!1};await ox1(N,{...H,openThreadSwitcher:!0},U)},Y=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await $Y(U);await $V6(U,N,z)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await $Y(U);await LP8(U,N,z)}),Y.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await $Y(N);if(z.pick)eZ.write(`${h4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
4882
4882
|
`);if(z.last||H||M.executeMode)await MP8(N,M,H,U);else await Q(N,M,U)}),Y.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await $Y(N);await DP8(N,M,H,U)}),Y.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await $Y(U);await $V6(U,N,z)}),Y.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, unlisted, workspace, group)").option("--support [message]","Share thread with Amp support for debugging").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await $Y(N);await NP8(N,M,H,U,z.support)}),Y.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(H,z,U,N)=>{let M=N.optsWithGlobals(),L=await $Y(M);await FP8(M,L,H,z,N)}),Y.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await $Y(N);await UP8(N,M,H,U)}),Y.command("replay <threadId>").alias("p").summary("Replay a thread").description("Replay a thread by downloading it and playing through all interactions. User messages are simulated with variable typing speed.").option("--wpm <wpm>","Typing speed in words per minute (default: 120)","120").option("--no-typing","Disable typing simulation and display messages instantly").option("--message-delay <ms>","Delay between messages in milliseconds (default: 1000)","1000").option("--tool-progress-delay <ms>","Delay to show tool in-progress state in milliseconds (default: 800)","800").option("--exit-delay <seconds>","Delay in seconds before exiting after replay completes (default: 3)","3").option("--no-indicator","Hide the replay progress indicator").action(async(H,z,U)=>{let N=U.optsWithGlobals(),M=await $Y(N);await BP8(N,M,H,z,U)}),$26(J,async(H,z)=>{let U=await $Y(z);dq(H,z);let N=await cq(U,z);return{context:U,mcpService:N.mcpService,toolService:N.toolService,toolServices:N.toolService,configService:N.configService,cleanupTerminal:eT,asyncDispose:N.asyncDispose.bind(N)}}),a56(J,async(H)=>{let z=H.optsWithGlobals();return await $Y(z)}),b56(J,async(H)=>{let z=await $Y(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{dq(U,H);let N=await cq(z,H);return{mcpService:N.mcpService,settings:z.settings,asyncDispose:N.asyncDispose.bind(N)}}}});function G(H,z,U){let M=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),L=new nB(z,M),A=ZP8(H);if(A)L.default(A);if(L.hidden=XP8(H)||ZV6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of GV6)switch(H.type){case"flag":{J.addOption(G(H,`--${H.long}`)),J.addOption(G(H,`--no-${H.long}`,!1));break}case"switch":{J.addOption(G(H,`--${H.long}`,!0));break}default:{J.addOption(G(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}let Z=new nB("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(Z);let q=new nB("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(q);let V=new nB("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);J.addOption(V);let K=new nB("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(K);let W=new nB("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(W),process.env.AMP_CONNECT==="1"){let H=new nB("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return J.action(async(H,z)=>{let U=H,N=await $Y(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")h5.write(h4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
|
|
4883
4883
|
`)),process.exit(0);if(Object.keys(U).forEach((M)=>{let L=GV6.find((A)=>A.name===M);if(L&&ZV6(L)&&!GP8(L))eZ.write(h4.yellow(`Warning: '--${M}' flag is deprecated
|
|
@@ -4885,8 +4885,8 @@ Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
|
4885
4885
|
Or pipe via stdin: echo "your message" | amp --execute`);dq(Y,Q);let q=await cq(J,Q);VV6=q;let V=Lu(q),K=async(l)=>{let J1=await qV6(l,"utf-8"),n=JSON.parse(J1);if(!u$(n.id))throw new _8(fZ.invalidThreadId);return d51(q,{visibility:X,agentMode:Q.mode,thread:n})},W=async(l)=>{if(!u$(l))throw new _8(fZ.invalidThreadId);try{let[n,u]=await Promise.all([T5.getThreadLinkInfo({thread:l},{config:q.configService}),T5.getUserInfo({},{config:q.configService})]);if(n.ok&&u.ok){let s=n.result.creatorUserID,H1=u.result.id;if(s&&s!==H1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new _8(`Cannot resume thread created by another user.
|
|
4886
4886
|
|
|
4887
4887
|
This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}catch(n){if(n instanceof _8)throw n;h.warn("Failed to validate thread ownership in CLI, allowing to open",{error:n})}let J1=await q.threadService.get(l)??void 0;return h.info(`[fetchAndStartThread] Loaded thread ${l}, agentMode: ${J1?.agentMode??"undefined"}`),d51(q,{visibility:X,agentMode:J1?void 0:Q.mode,thread:J1})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return d51(q,{visibility:X})}catch(l){if(l instanceof _8)throw l;throw await mg(l,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return d51(q,{visibility:X})};if(Q.format==="jsonl")eZ.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
4888
|
-
`),await XO(),process.exit(1);if(J.executeMode&&Q.remote)await o56(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)u56(q.mcpService,J.settings),await w96(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,M=!1;if(Q.jetbrains||Q.ide){await wM0();let l=_I({jetbrainsOnly:Q.jetbrains});if(l.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(l.length===1){let J1=l[0];if(J1)D2.selectConfig(J1)}else N=!0}let L=F41("0.0.
|
|
4889
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await a96({...J,workspaceTrust:{current:!0,changes:Hk},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await g56(J.mcpConfig);X=m56(X,Z)}let G=await X.get("url","global");if(!G)G=AY;if(!cF(G))h.info("Targeting custom Amp server",{ampURL:G});return X=EU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:r56(await DC1(J,X))}}function KP8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function WP8(){let J=KP8(process.argv);if(t86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),QP8(h),h.info("Starting Amp CLI.",{version:"0.0.
|
|
4888
|
+
`),await XO(),process.exit(1);if(J.executeMode&&Q.remote)await o56(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)u56(q.mcpService,J.settings),await w96(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let N=!1,M=!1;if(Q.jetbrains||Q.ide){await wM0();let l=_I({jetbrainsOnly:Q.jetbrains});if(l.length===0){if(Q.jetbrains)M=!await q.configService.get("jetbrains.skipInstall")}else if(l.length===1){let J1=l[0];if(J1)D2.selectConfig(J1)}else N=!0}let L=F41("0.0.1764504080-gf1c679",q.settingsStorage),A=new g11(q.threadStorage),E=X0.of([i0.file(process.cwd())]),P=J$1(void 0,E),I=new U41(q.mcpService,J.settings.getWorkspaceRootPath());if(G)U.handle({type:"user:message",message:{content:[{type:"text",text:G}]}});let T=(async()=>{try{let l=await T5.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)});if(l.ok)return h.info("User free tier status:",l),l.result}catch(l){h.error("Failed to fetch free tier status:",l)}})(),S=(async()=>{try{let l=await T5.getUserInfo({},{config:q.configService});if(l.ok)return l.result}catch(l){h.debug("Failed to fetch user workspace info:",l)}})(),[y,x]=await Promise.all([T,S]),g=x?.email,p=g&&(g.endsWith("@sourcegraph.com")||g.endsWith("@ampcode.com")||g==="auth-bypass-user@example.com");if(p)q.toolService.registerTool(ss0);let b=await e56();h.info("Loaded session state:",b),await Ly1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new s61,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadHistoryService:q.threadHistoryService,threadSyncService:q.threadSyncService,planFileManager:q.planFileManager,threadID:U.threadID,threadFuzzyIndexer:A,worker:U,workerDeps:V,configService:q.configService,internalAPIClient:T5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:D2,connectedClientsService:new yi,commandRegistry:P,mcpService:q.mcpService,mcpTrustHandler:I,showJetBrainsInstaller:M,showIdePicker:N,openThreadSwitcher:Q.openThreadSwitcher,updateService:L,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:b,freeTierStatus:y,workspace:x?.team??null,features:x?.features??[],isDogfooding:p||!1,threadDependencies:q}),await q.asyncDispose(),process.exit(0)}async function $Y(J){if(J.interactive)eZ.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
4889
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await a96({...J,workspaceTrust:{current:!0,changes:Hk},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await g56(J.mcpConfig);X=m56(X,Z)}let G=await X.get("url","global");if(!G)G=AY;if(!cF(G))h.info("Targeting custom Amp server",{ampURL:G});return X=EU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:r56(await DC1(J,X))}}function KP8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function WP8(){let J=KP8(process.argv);if(t86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),QP8(h),h.info("Starting Amp CLI.",{version:"0.0.1764504080-gf1c679",buildTimestamp:"2025-11-30T12:06:56.791Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new _8(fZ.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await VP8().parseAsync(process.argv)}tE1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await WP8().catch(mg)});async function HP8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),h5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
4890
4890
|
`);else if(!cF(J.ampURL))h5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
4891
4891
|
`);let Y=process.env.AMP_API_KEY;if(Y)h5.write(`API key found in environment variable, storing...
|
|
4892
4892
|
`),await Q.set("apiKey",Y,J.ampURL),h5.write(`API key successfully stored.
|
|
@@ -4899,7 +4899,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
4899
4899
|
`);else h5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
4900
4900
|
`);process.exit(0)}async function FP8(J,Q,Y,X,G){dq(G,J);let Z=await cq(Q,J);try{let q=c51(Y);if(!q)l51(Y);let V=q,K=X.trim();if(K.length===0)tZ("Thread name cannot be empty");if(K.length>256)tZ("Thread name cannot exceed 256 characters");if(!(await zj(V,Z)).messages.length)tZ("Cannot rename an empty thread.");let H=Lu(Z);await(await w3.getOrCreateForThread(H,V)).handle({type:"title",value:K}),h.info("GOT HERE"),await Z.threadSyncService.sync(),h.info("GOT THERE"),h5.write(h4.green(`✓ Thread ${V} renamed to "${K}"
|
|
4901
4901
|
`)),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose();let V=`Failed to rename thread: ${q instanceof Error?q.message:String(q)}`;tZ(V)}}async function UP8(J,Q,Y,X){dq(X,J);let G=await cq(Q,J);try{let Z=c51(Y);if(!Z)l51(Y);let V=await zj(Z,G),K=AT(V);h5.write(K+`
|
|
4902
|
-
`),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;tZ(q)}}async function BP8(J,Q,Y,X,G){dq(G,J);let Z=await cq(Q,J);try{let q=await tx1(Y),V=await zj(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,M=Lu(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await w3.getOrCreateForThread(M,L);await A.resume();let E=b11.fromWorker(A),P=new g11(Z.threadStorage),I=X0.of([i0.file(process.cwd())]),T=J$1(void 0,I),S=new U41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=F41("0.0.
|
|
4902
|
+
`),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;tZ(q)}}async function BP8(J,Q,Y,X,G){dq(G,J);let Z=await cq(Q,J);try{let q=await tx1(Y),V=await zj(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,N=X.indicator!==!1,M=Lu(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await w3.getOrCreateForThread(M,L);await A.resume();let E=b11.fromWorker(A),P=new g11(Z.threadStorage),I=X0.of([i0.file(process.cwd())]),T=J$1(void 0,I),S=new U41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=F41("0.0.1764504080-gf1c679",Z.settingsStorage);await Ly1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new s61,fuzzyServer:Z.fuzzyServer,settingsStorage:Z.settingsStorage,threadService:Z.threadService,threadHistoryService:Z.threadHistoryService,threadSyncService:Z.threadSyncService,planFileManager:Z.planFileManager,threadID:L,threadFuzzyIndexer:P,worker:E,workerDeps:M,configService:Z.configService,internalAPIClient:T5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:D2,connectedClientsService:new yi,commandRegistry:T,mcpService:Z.mcpService,mcpTrustHandler:S,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:V,typingEnabled:K,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:N}}),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),await mg(q,Y)}}async function NP8(J,Q,Y,X,G){dq(X,J);let Z=await cq(Q,J);try{let q=c51(Y);if(!q)l51(Y);let V=q,K=await T5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=B41(J,W);if(!H&&!G)tZ("Must specify either --visibility or --support");if(H&&G)tZ("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)tZ(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,N41(H)),h5.write(h4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
|
|
4903
4903
|
`);if(G){await zj(V,Z);let z=typeof G==="string"?G:void 0;await LR0(Z.threadService,V,Z.configService,z),h5.write(h4.green("✓ ")+`Thread ${V} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
4904
4904
|
`)}await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),tZ(`Failed to update thread: ${q instanceof Error?q.message:String(q)}`)}}async function DP8(J,Q,Y,X){dq(X,J);let G=await cq(Q,J),Z=Lu(G);try{let q=await tx1(Y),K=(await zj(q,G)).messages.length-1,W=await w3.getOrCreateForThread(Z,q),H=await OT(W,G.threadSyncService,K);await Promise.all([G.threadSyncService.uploadThread(q),G.threadSyncService.uploadThread(H)]),await rx1(H),h5.write(`${H}
|
|
4905
4905
|
`),await G.asyncDispose(),process.exit(0)}catch(q){eZ.write(`Error forking thread: ${q instanceof Error?q.message:String(q)}
|