@sourcegraph/amp 0.0.1764619292-gc54d88 → 0.0.1764633707-gc33a68
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
|
@@ -4184,15 +4184,15 @@ Actual: ${G}`)}async function ZK8(J,Q,Y){let{execSync:X}=await import("node:ch
|
|
|
4184
4184
|
${N}`;if(G==="pnpm"&&N.includes("Unable to find the global bin directory"))M+=`
|
|
4185
4185
|
|
|
4186
4186
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4187
|
-
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()}})})}L0();L0();async function N41(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=WK8(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 WK8(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}r0();function D41(J,Q){let Y=new l4,X=Y.pipe(y8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new kV().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 nU(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=qO(),W=await N41(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 B41();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 Gm(W.latestVersion,z);let U=await ZN(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 nU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as cK}from"node:process";function _56(J){let Q=new nA().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 RC1(X.force||!1,X.verbose||!1,"0.0.
|
|
4187
|
+
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()}})})}L0();L0();async function N41(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=WK8(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 WK8(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}r0();function D41(J,Q){let Y=new l4,X=Y.pipe(y8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new kV().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 nU(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=qO(),W=await N41(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 B41();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 Gm(W.latestVersion,z);let U=await ZN(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 nU(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as cK}from"node:process";function _56(J){let Q=new nA().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 RC1(X.force||!1,X.verbose||!1,"0.0.1764633707-gc33a68"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new nA("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 HK8(X.targetVersion)});J.addCommand(Y)}async function HK8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")cK.write(h4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4188
4188
|
|
|
4189
4189
|
`));try{if(!J){cK.write(h4.blue(`Checking for updates...
|
|
4190
|
-
`));let X=qO(),{hasUpdate:G,latestVersion:Z}=await N41("0.0.
|
|
4191
|
-
`));let V=await ZN("0.0.
|
|
4190
|
+
`));let X=qO(),{hasUpdate:G,latestVersion:Z}=await N41("0.0.1764633707-gc33a68",X);if(!G){cK.write(h4.green(`✓ Amp CLI is already up to date: ${"0.0.1764633707-gc33a68"} (${"released"} ${"2025-12-02T00:07:41.799Z"})
|
|
4191
|
+
`));let V=await ZN("0.0.1764633707-gc33a68");if(V.warning)cK.write(`
|
|
4192
4192
|
`+h4.yellow(V.warning)+`
|
|
4193
4193
|
`);process.exit(0)}if(!Z)cK.write(h4.yellow("[WARN] could not find latest version")),process.exit(0);J=Z}cK.write(h4.blue(`Updating to version ${J}...
|
|
4194
4194
|
`)),await Gm(J,void 0,(X)=>{cK.write(h4.dim(`Running: ${X}
|
|
4195
|
-
`))});let Q="released";cK.write(h4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-
|
|
4195
|
+
`))});let Q="released";cK.write(h4.green(`✓ Successfully updated to version ${J} (${Q} ${"2025-12-02T00:07:41.799Z"})
|
|
4196
4196
|
`));let Y=await ZN(J);if(Y.warning)cK.write(`
|
|
4197
4197
|
`+h4.yellow(Y.warning)+`
|
|
4198
4198
|
`);process.exit(0)}catch(Q){let Y=Q instanceof Error?Q.message:String(Q);cK.write(h4.red.bold("Error: ")+Y+`
|
|
@@ -4812,7 +4812,7 @@ exit code: ${Z}`,new Z1({color:X.foreground,dim:!0,italic:!0})));if(q)V.push(new
|
|
|
4812
4812
|
`,N),...M])})];if(W.url){let S=W.url.replace(/^https?:\/\//,"");I.push(new Y7({uri:W.url,text:S,style:new Z1({color:Y.secondary,underline:!0})}))}let T=new W0({width:40,child:new l0({crossAxisAlignment:"start",mainAxisSize:"min",children:I})});return K8.child(new m6({mainAxisAlignment:"center",crossAxisAlignment:"center",mainAxisSize:"min",children:[new lj1({width:HX6,height:zX6,agentMode:this.widget.agentMode,glow:this._glow,t:L,fps:0,shockwaves:this._shockwaves,onShockwave:E,...q==="disabled"&&{seed:42}}),new W0({width:2}),T]}))}}L0();e8();D4();v7();e8();r0();function _L8(J,Q){return`${J}:${Q}`}class Pk1{threadService;workers=new Map;threadsMap=new Map;subthreadsMap=new Map;mainThreadSubs=new Map;subthreadsSubs=new Map;workerStatusSubs=new Map;subthreadPatchSubs=new Map;mainThreadObservable;subthreadObservable;workerStatusObservable;emitMainThread=null;emitSubthread=null;emitWorkerStatus=null;constructor(J){this.threadService=J;this.mainThreadObservable=new 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(jM()).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=_L8(Q,q.toolUse.id);if(this.subthreadPatchSubs.has(V))continue;let K=this.threadService.observePatches(q.threadID).pipe(jM()).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]=IA(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 kL8(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=YQ(J.mainThread);G.isCompleted=UX6(W,X.toolUse.id)}}let Z=yL8(Y,G.agentState),q=G.agentState===Z?G:{...G,agentState:Z},V={...J.tools},K=iC(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=YQ(Y),q={...J.subagents};for(let z of X){let U=q[z.threadID];if(!U)continue;let N=UX6(Z,z.toolUse.id);q[z.threadID]={...U,isCompleted:N}}let{items:V}=iC(Y),K=IA(Y,G),W=NI({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=IA(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function iC(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)??IX(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 UX6(J,Q){let Y=J.get(Q);return(Y&&M2(Y.run))??!1}function yL8(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(iC(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 Rk1 extends e0{props;constructor(J){super();this.props=J}createState(){return new BX6}}class BX6 extends s0{state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null};workerController;subscriptions=[];recentThreadIDs=[];currentWorker;constructor(){super();this.workerController=null,this.currentWorker=null}addToRecentThreads(J){this.setState(()=>{let Q=this.recentThreadIDs.indexOf(J);if(Q!==-1)this.recentThreadIDs.splice(Q,1);if(this.recentThreadIDs.unshift(J),this.recentThreadIDs.length>50)this.recentThreadIDs.pop()})}initState(){let{threadService:J,worker:Q}=this.widget.props;this.workerController=new Pk1(J),this.currentWorker=Q,this.setupSubscriptions(Q),this.addToRecentThreads(Q.thread.id)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),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=kL8(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===EX,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:FI(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 Tk1 extends e0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new NX6}}class NX6 extends s0{build(J){let Y=H6.of(J).colors,{todos:X,title:G="TODOs"}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new W0({width:0,height:0});let Z=X.map((q)=>this.buildTodoItem(q,Y));return new J6({child:new O6({padding:I0.symmetric(1,0),child:new l0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new f1({text:new s(G,new Z1({bold:!0,color:Y.foreground}))}),...Z]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),X=J.status==="completed",G=new Z1({bold:J.status==="in-progress",color:Q.foreground,dim:X}),Z=new Z1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:X});return new m6({crossAxisAlignment:"start",children:[new f1({text:new s(Y,G)}),new W0({width:1}),new F4({child:new f1({text:new s(J.content,Z)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class Ck1 extends A6{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=H6.of(J),Y=Q.colors.primary,X=Q.colors.foreground;return new J6({decoration:new F8(void 0,new x4(new L4(Y,1,"rounded"),new L4(Y,1,"rounded"),void 0,new L4(Y,1,"rounded"))),child:new O6({padding:I0.horizontal(1),child:new l0({children:[new m6({crossAxisAlignment:"start",children:[new F4({child:new f1({text:new s(this.ad.content,new Z1({color:X}))})}),new W0({width:4}),new Y7({uri:"https://ampcode.com/free",text:"Ad",style:new Z1({color:X,dim:!0})})]}),new m6({crossAxisAlignment:"start",children:[new XS1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:I0.horizontal(1),color:Y,reverse:!0}),new W0({width:2}),new f1({text:new s(this.ad.destinationUrlHostname,new Z1({color:X,dim:!0}))})]})]})})})}}class jk1 extends e0{props;constructor(J){super();this.props=J}createState(){return new DX6(this.props.autofocus??!0)}}class DX6 extends s0{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=Z8.sizeOf(J),X=Math.min(60,Y.width-4),G=Y.height-4,Z=[];if(this.widget.props.title)Z.push(new f1({text:new s(this.widget.props.title,new Z1({bold:!0,color:M1.blue}))}),new W0({height:1}));if(this.widget.props.message)Z.push(new f1({text:new s(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)Z.push(new W0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new f1({text:new s("Enter to copy",new Z1({dim:!0}))}));return q.push(new f1({text:new s("Escape to close",new Z1({dim:!0}))})),Z.push(new m6({children:q.flatMap((V,K)=>K<q.length-1?[V,new W0({width:1}),new f1({text:new s("•",new Z1({dim:!0}))}),new W0({width:1})]:[V]),mainAxisSize:"min"})),new K8({child:new J6({constraints:new g6(X,X,0,G),decoration:new F8(M1.default(),new x4(new L4(M1.blue,1,"rounded"),new L4(M1.blue,1,"rounded"),new L4(M1.blue,1,"rounded"),new L4(M1.blue,1,"rounded"))),padding:new I0(2,2,2,2),child:new G9({autofocus:this.autofocus,onKey:Q,child:new l0({children:Z,mainAxisSize:"min"})})})})}}class k91 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,k91.prototype)}}class y91 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,y91.prototype)}}function Sk1(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();L0();import{spawn as xL8}from"node:child_process";import{promises as vL8}from"node:fs";function MX6(J){return J.kind==="executable"}function LX6(J){return J.kind==="markdown"}var yz=50000,AX6=300000;async function _k1(J,Q,Y,X={}){let{timeoutMs:G=AX6,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}),LX6(V))return await fL8(V,Q);else if(MX6(V))return await hL8(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 fL8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await vL8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>yz?Y.slice(0,yz)+`
|
|
4813
4813
|
... (output truncated at ${yz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function hL8(J,Q,Y=AX6,X){return new Promise((G)=>{let[Z,q]=bL8(J,Q);h.debug("Spawning command",{spawnCommand:Z,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Y});let V=ow0(X),K=!1,W=setTimeout(()=>{K=!0,V.abort(),h.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=xL8(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<=yz)z.push(L);else{let A=yz-(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<=yz)U.push(L);else{let A=yz-(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?`
|
|
4814
4814
|
${E}`:E;if(N>yz)P+=`
|
|
4815
|
-
... (output truncated at ${yz} 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 bL8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return mL8(Y,X?[...X]:null,G,Q);else return gL8(Y,X?[...X]:null,G,Q)}function gL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function mL8(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]}}L0();tG();H3();sW();fX();Qq();UH();ZK();e8();v7();zk();r0();var fX6=N6(cP(),1);import{writeFile as yX6}from"fs/promises";import xX6 from"path";L0();fX();class kk1{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.1764619292-gc54d88"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await yo(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 yk1 extends e0{props;constructor(J){super();this.props=J}createState(){return new OX6}}class OX6 extends s0{_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 wX6 extends s0{controller=new nZ;focusNode=new i8({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=H6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=x4.all(new L4(Y.foreground,1,"solid")),K=new AO({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 m6({children:[new J6({decoration:{color:M1.default()},child:new f1({text:new s(">",new Z1({color:Y.foreground}))})}),new F4({child:K})]}),H=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s("",void 0,[new s("Command: ",new Z1({color:Y.foreground})),new s(this.widget.props.commandName,new Z1({color:M1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new s("Enter",new Z1({color:X.keybind}))),z.push(new s(" to submit, ",new Z1({color:Y.foreground,dim:!0})));z.push(new s("Esc",new Z1({color:X.keybind}))),z.push(new s(" to cancel",new Z1({color:Y.foreground,dim:!0})));let U=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s("",void 0,z)})});return new J6({decoration:{border:V,color:M1.default()},padding:I0.all(1),child:new l0({children:[H,new W0({height:1}),W,new Z5,U]})})}}class x91 extends e0{props;constructor(J){super();this.props=J}createState(){return new wX6}}UH();class EX6 extends s0{controller=new nZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new i8({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>=MU)return!1;let Q=SC(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=H6.of(J),{colors:Y,app:X}=Q,Z=Z8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new yO({controller:this.controller,triggers:[new EN],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 J6({constraints:new g6({maxHeight:q}),padding:I0.symmetric(1,0),child:K}),H=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s("",void 0,[new s("Command: ",new Z1({color:Y.foreground})),new s(this.widget.props.commandName,new Z1({color:M1.yellow,bold:!0}))])})}),z=new J6({padding:I0.symmetric(1,0),child:new f1({text:this.isConfirmingClearInput?new s("",void 0,[new s("Esc",new Z1({color:X.keybind})),new s(" again to clear input",new Z1({color:Y.foreground,dim:!0}))]):new s("",void 0,[new s("Press ",new Z1({color:Y.foreground,dim:!0})),new s("Enter",new Z1({color:X.keybind})),new s(" to submit, ",new Z1({color:Y.foreground,dim:!0})),new s("Esc",new Z1({color:X.keybind})),new s(" to clear",new Z1({color:Y.foreground,dim:!0}))])})}),U=[H,new W0({height:1}),new F4({child:W}),new W0({height:1}),z];return new J6({decoration:{border:x4.all(new L4(Y.foreground,1,"solid")),color:M1.default()},padding:I0.all(1),child:new l0({children:U})})}}class nC extends e0{props;constructor(J){super();this.props=J}createState(){return new EX6}}import{isDeepStrictEqual as cL8}from"node:util";var uL8=/[\\/_ +.#"@[({&]/,pL8=/[\\/_ +.#"@[({&]/g,dL8=/[\s-]/,IX6=/[\s-]/g;function f91(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=f91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(dL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(IX6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(uL8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(pL8),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=f91(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 v91(J){return J.toLowerCase().replace(IX6," ")}function PX6(J,Q){let Y=f91(J,Q,v91(J),v91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=f91(J,V,v91(J),v91(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 aC{}class oC{}class h91{}class b91{}class RX6 extends e0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new TX6}}class TX6 extends s0{build(J){return this.widget.onContext(J),this.widget.child}}function lL8(J,Q){if(J==="")return{matches:!0,score:1};let Y=PX6(Q,J);return{matches:Y>0.15,score:Y}}class mq extends e0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new CX6}}class CX6 extends s0{controller=new nZ;focusNode;scrollController=new Y2;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new i8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),X9.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(!cL8(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 aC){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 oC){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 h91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof b91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};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,...lL8(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;f81(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(),X9.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=H6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=x4.all(new L4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new AO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new fq({shortcuts:new Map([[new U4("ArrowDown"),new aC],[new U4("ArrowUp"),new oC],[new U4("Tab"),new aC],[new U4("Tab",{shift:!0}),new oC],[new U4("n",{ctrl:!0}),new aC],[new U4("p",{ctrl:!0}),new oC],[new U4("Enter"),new h91],[new U4("Escape"),new b91]]),focusNode:this.focusNode,child:q}),K=new JY({actions:new Map([[aC,new a8(this.invoke)],[oC,new a8(this.invoke)],[h91,new a8(this.invoke)],[b91,new a8(this.invoke)]]),child:V}),W=new m6({children:[new J6({decoration:{color:M1.default()},child:new f1({text:new s(">",new Z1({color:Y.foreground}))})}),new F4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new W0({height:10,child:new K8({child:new f1({text:new s(L,new Z1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new F4({child:new K8({child:new f1({text:new s(this.widget.props.emptyStateText,new Z1({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?M1.yellow:void 0,y=P?M1.black:Y.foreground;T=new J6({decoration:S?{color:S}:void 0,padding:I0.symmetric(2,0),child:new f1({text:new s(this.widget.props.getLabel(A),new Z1({color:y,dim:I}))})})}return new RX6(new M8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new l0({children:L,crossAxisAlignment:"start"})}let z=new F4({child:new M8({onScroll:this.handleScroll,opaque:!1,child:new F7({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s(this.widget.props.title,new Z1({color:M1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new W0({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 J6({padding:I0.vertical(1),child:new K8({child:A})}));else U.push(new W0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new J6({decoration:{border:G,color:M1.default()},padding:I0.symmetric(1,0),child:new l0({children:U})})}}class xk1 extends e0{createState(){return new jX6}}class jX6 extends s0{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 f1({text:new s("●",new Z1({color:this.isGreen?M1.green:M1.index(8),bold:!0})),maxLines:1})}}function iL8(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 UG.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 vk1(J,Q,Y){return new f1({text:new s(`${J}${Q}`,new Z1({color:Y})),maxLines:1})}function nL8(J,Q,Y,X){return[vk1("+",J,X.success),Z5.horizontal(1),vk1("~",Q,X.warning),Z5.horizontal(1),vk1("-",Y,X.destructive)]}class g91 extends A6{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=iL8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=H6.of(J),K=new O6({padding:I0.symmetric(0,1),child:new K8({child:new f1({text:new s("",new Z1({color:V.colors.foreground,dim:!0}),[new s("Ctrl+T",new Z1({color:M1.blue,dim:!0})),new s(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new Z1({color:V.colors.foreground,dim:!0}))])})})});return new mq({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=H6.of(N),{colors:L}=M,A=z?M1.yellow:void 0,E=z?M1.black:L.foreground,P=M1.index(8),I=(J1,n)=>new W0({width:n,child:m6.end([new f1({text:new s(J1,new Z1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[],y=H.relationshipType==="handoff",x=new d81;if(H.depth>0){let J1=[],n=H.ancestorsAreLast.slice(1);for(let H1 of n)J1.push(new s(x.getAncestorPrefix(H1),new Z1({color:x.connectorColor,dim:x.connectorDim})));let m=H.isLast?x.elbow:x.tee,t=x.getConnectorText(m);J1.push(new s(t,new Z1({color:x.connectorColor,dim:x.connectorDim}))),S.push(new f1({text:new s("",void 0,J1)}))}let g=[],p=this.props.currentThreadID===H.id?new s("(current) ",new Z1({color:M1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new s("(visited) ",new Z1({color:L.foreground,dim:!0})):null;if(p)g.push(new f1({text:p}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))g.push(new xk1),g.push(new W0({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 f1({text:new s("[fork] ",new Z1({color:M1.blue}))}))}else if(y)g.push(new f1({text:new s("[handoff] ",new Z1({color:M1.index(208)}))}));if(g.push(new F4({child:new f1({text:new s(b,new Z1({color:E})),overflow:"ellipsis",maxLines:1})})),g.push(new W0({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(...nL8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,J1)),g.push(new W0({width:2}))}return g.push(I(H.description.timeAgo,q)),new J6({decoration:A?{color:A}:void 0,padding:I0.symmetric(2,0),child:new m6({children:[...S,...g]})})}})}}function SX6(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 fk1 extends A6{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)=>SX6(G.pubDate).length));return new mq({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=H6.of(V),{colors:W}=K,H=Z?M1.yellow:void 0,z=Z?M1.black:W.foreground,U=M1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new W0({width:A,child:m6.end([new f1({text:new s(L,new Z1({color:U}))})])});return new J6({decoration:H?{color:H}:void 0,padding:I0.symmetric(2,0),child:new m6({children:[new F4({child:new f1({text:new s(G.title,new Z1({color:z})),overflow:"ellipsis",maxLines:1})}),new W0({width:2}),new f1({text:new s(N,new Z1({color:U})),maxLines:1}),new W0({width:2}),M(SX6(G.pubDate),Y)]})})}})}}class hk1 extends A6{props;constructor(J){super();this.props=J}build(){return new K8({child:new f1({text:new s("",void 0,[new s(`Forked to new thread:
|
|
4815
|
+
... (output truncated at ${yz} 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 bL8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return mL8(Y,X?[...X]:null,G,Q);else return gL8(Y,X?[...X]:null,G,Q)}function gL8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function mL8(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]}}L0();tG();H3();sW();fX();Qq();UH();ZK();e8();v7();zk();r0();var fX6=N6(cP(),1);import{writeFile as yX6}from"fs/promises";import xX6 from"path";L0();fX();class kk1{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.1764633707-gc33a68"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await yo(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 yk1 extends e0{props;constructor(J){super();this.props=J}createState(){return new OX6}}class OX6 extends s0{_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 wX6 extends s0{controller=new nZ;focusNode=new i8({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=H6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=x4.all(new L4(Y.foreground,1,"solid")),K=new AO({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 m6({children:[new J6({decoration:{color:M1.default()},child:new f1({text:new s(">",new Z1({color:Y.foreground}))})}),new F4({child:K})]}),H=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s("",void 0,[new s("Command: ",new Z1({color:Y.foreground})),new s(this.widget.props.commandName,new Z1({color:M1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new s("Enter",new Z1({color:X.keybind}))),z.push(new s(" to submit, ",new Z1({color:Y.foreground,dim:!0})));z.push(new s("Esc",new Z1({color:X.keybind}))),z.push(new s(" to cancel",new Z1({color:Y.foreground,dim:!0})));let U=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s("",void 0,z)})});return new J6({decoration:{border:V,color:M1.default()},padding:I0.all(1),child:new l0({children:[H,new W0({height:1}),W,new Z5,U]})})}}class x91 extends e0{props;constructor(J){super();this.props=J}createState(){return new wX6}}UH();class EX6 extends s0{controller=new nZ;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new i8({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>=MU)return!1;let Q=SC(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=H6.of(J),{colors:Y,app:X}=Q,Z=Z8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new yO({controller:this.controller,triggers:[new EN],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 J6({constraints:new g6({maxHeight:q}),padding:I0.symmetric(1,0),child:K}),H=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s("",void 0,[new s("Command: ",new Z1({color:Y.foreground})),new s(this.widget.props.commandName,new Z1({color:M1.yellow,bold:!0}))])})}),z=new J6({padding:I0.symmetric(1,0),child:new f1({text:this.isConfirmingClearInput?new s("",void 0,[new s("Esc",new Z1({color:X.keybind})),new s(" again to clear input",new Z1({color:Y.foreground,dim:!0}))]):new s("",void 0,[new s("Press ",new Z1({color:Y.foreground,dim:!0})),new s("Enter",new Z1({color:X.keybind})),new s(" to submit, ",new Z1({color:Y.foreground,dim:!0})),new s("Esc",new Z1({color:X.keybind})),new s(" to clear",new Z1({color:Y.foreground,dim:!0}))])})}),U=[H,new W0({height:1}),new F4({child:W}),new W0({height:1}),z];return new J6({decoration:{border:x4.all(new L4(Y.foreground,1,"solid")),color:M1.default()},padding:I0.all(1),child:new l0({children:U})})}}class nC extends e0{props;constructor(J){super();this.props=J}createState(){return new EX6}}import{isDeepStrictEqual as cL8}from"node:util";var uL8=/[\\/_ +.#"@[({&]/,pL8=/[\\/_ +.#"@[({&]/g,dL8=/[\s-]/,IX6=/[\s-]/g;function f91(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=f91(J,Q,Y,X,W+1,Z+1,q),z>H){if(W===G)z*=1;else if(dL8.test(J.charAt(W-1))){if(z*=0.9,M=J.slice(G,W-1).match(IX6),M&&G>0)z*=Math.pow(0.999,M.length)}else if(uL8.test(J.charAt(W-1))){if(z*=0.8,N=J.slice(G,W-1).match(pL8),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=f91(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 v91(J){return J.toLowerCase().replace(IX6," ")}function PX6(J,Q){let Y=f91(J,Q,v91(J),v91(Q),0,0,{}),X=Q.trim().split(/\s+/);if(X.length>1){let G=0,Z=0;for(let V of X){let K=f91(J,V,v91(J),v91(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 aC{}class oC{}class h91{}class b91{}class RX6 extends e0{child;onContext;constructor(J,Q){super();this.child=J;this.onContext=Q}createState(){return new TX6}}class TX6 extends s0{build(J){return this.widget.onContext(J),this.widget.child}}function lL8(J,Q){if(J==="")return{matches:!0,score:1};let Y=PX6(Q,J);return{matches:Y>0.15,score:Y}}class mq extends e0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new CX6}}class CX6 extends s0{controller=new nZ;focusNode;scrollController=new Y2;selectedIndex=0;itemContexts=[];initState(){this.scrollController.disableFollowMode(),this.focusNode=new i8({debugLabel:this.widget.debugLabel}),this.controller.addListener(()=>{this.selectedIndex=0,this.setState(),X9.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(!cL8(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 aC){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 oC){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 h91){let Q=this.getFilteredItems();if(Q.length>0&&this.selectedIndex<Q.length){let Y=Q[this.selectedIndex];if(Y){if(!(this.widget.props.isItemDisabled?.(Y)??!1))this.widget.props.onAccept(Y)}}return"handled"}if(J instanceof b91)return this.widget.props.onDismiss?.(),"handled";return"ignored"};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,...lL8(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;f81(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(),X9.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=H6.of(J),{colors:Y}=Q,X=this.getFilteredItems(),G=x4.all(new L4(Y.foreground,1,"solid")),Z=this.widget.props.enabled??!0,q=new AO({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:Z,style:{textColor:Y.foreground,border:null},maxLines:1}),V=new fq({shortcuts:new Map([[new U4("ArrowDown"),new aC],[new U4("ArrowUp"),new oC],[new U4("Tab"),new aC],[new U4("Tab",{shift:!0}),new oC],[new U4("n",{ctrl:!0}),new aC],[new U4("p",{ctrl:!0}),new oC],[new U4("Enter"),new h91],[new U4("Escape"),new b91]]),focusNode:this.focusNode,child:q}),K=new JY({actions:new Map([[aC,new a8(this.invoke)],[oC,new a8(this.invoke)],[h91,new a8(this.invoke)],[b91,new a8(this.invoke)]]),child:V}),W=new m6({children:[new J6({decoration:{color:M1.default()},child:new f1({text:new s(">",new Z1({color:Y.foreground}))})}),new F4({child:K})]});this.itemContexts=[];let H;if(this.widget.props.isLoading){let L=this.widget.props.loadingText??"Loading...";H=new W0({height:10,child:new K8({child:new f1({text:new s(L,new Z1({color:Y.foreground}))})})})}else if(X.length===0&&this.widget.props.emptyStateText)H=new F4({child:new K8({child:new f1({text:new s(this.widget.props.emptyStateText,new Z1({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?M1.yellow:void 0,y=P?M1.black:Y.foreground;T=new J6({decoration:S?{color:S}:void 0,padding:I0.symmetric(2,0),child:new f1({text:new s(this.widget.props.getLabel(A),new Z1({color:y,dim:I}))})})}return new RX6(new M8({onClick:(S)=>this.handleItemClick(E,S.clickCount),child:T}),(S)=>{this.itemContexts[E]=S})});H=new l0({children:L,crossAxisAlignment:"start"})}let z=new F4({child:new M8({onScroll:this.handleScroll,opaque:!1,child:new F7({controller:this.scrollController,autofocus:!1,child:H})})}),U=[];if(this.widget.props.title){let L=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s(this.widget.props.title,new Z1({color:M1.yellow,bold:!0}))})});U.push(L)}if(U.push(W,new W0({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 J6({padding:I0.vertical(1),child:new K8({child:A})}));else U.push(new W0({height:3}))}if(this.widget.props.footer)U.push(this.widget.props.footer);return new J6({decoration:{border:G,color:M1.default()},padding:I0.symmetric(1,0),child:new l0({children:U})})}}class xk1 extends e0{createState(){return new jX6}}class jX6 extends s0{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 f1({text:new s("●",new Z1({color:this.isGreen?M1.green:M1.index(8),bold:!0})),maxLines:1})}}function iL8(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 UG.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 vk1(J,Q,Y){return new f1({text:new s(`${J}${Q}`,new Z1({color:Y})),maxLines:1})}function nL8(J,Q,Y,X){return[vk1("+",J,X.success),Z5.horizontal(1),vk1("~",Q,X.warning),Z5.horizontal(1),vk1("-",Y,X.destructive)]}class g91 extends A6{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=iL8(G),q=Math.max(0,...Z.map((H)=>H.description.timeAgo.length)),V=H6.of(J),K=new O6({padding:I0.symmetric(0,1),child:new K8({child:new f1({text:new s("",new Z1({color:V.colors.foreground,dim:!0}),[new s("Ctrl+T",new Z1({color:M1.blue,dim:!0})),new s(this.props.filterByWorkspace?" for all workspaces":" to filter by workspace",new Z1({color:V.colors.foreground,dim:!0}))])})})});return new mq({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=H6.of(N),{colors:L}=M,A=z?M1.yellow:void 0,E=z?M1.black:L.foreground,P=M1.index(8),I=(J1,n)=>new W0({width:n,child:m6.end([new f1({text:new s(J1,new Z1({color:P}))})])}),T=this.props.threadViewStates[H.id],S=[],y=H.relationshipType==="handoff",x=new d81;if(H.depth>0){let J1=[],n=H.ancestorsAreLast.slice(1);for(let H1 of n)J1.push(new s(x.getAncestorPrefix(H1),new Z1({color:x.connectorColor,dim:x.connectorDim})));let m=H.isLast?x.elbow:x.tee,t=x.getConnectorText(m);J1.push(new s(t,new Z1({color:x.connectorColor,dim:x.connectorDim}))),S.push(new f1({text:new s("",void 0,J1)}))}let g=[],p=this.props.currentThreadID===H.id?new s("(current) ",new Z1({color:M1.green})):(this.props.recentThreadIDs||[]).includes(H.id)?new s("(visited) ",new Z1({color:L.foreground,dim:!0})):null;if(p)g.push(new f1({text:p}));if(T){if(T.state==="active"&&(T.interactionState==="tool-running"||T.interactionState===!1))g.push(new xk1),g.push(new W0({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 f1({text:new s("[fork] ",new Z1({color:M1.blue}))}))}else if(y)g.push(new f1({text:new s("[handoff] ",new Z1({color:M1.index(208)}))}));if(g.push(new F4({child:new f1({text:new s(b,new Z1({color:E})),overflow:"ellipsis",maxLines:1})})),g.push(new W0({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(...nL8(H.diffStats.added,H.diffStats.changed,H.diffStats.deleted,J1)),g.push(new W0({width:2}))}return g.push(I(H.description.timeAgo,q)),new J6({decoration:A?{color:A}:void 0,padding:I0.symmetric(2,0),child:new m6({children:[...S,...g]})})}})}}function SX6(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 fk1 extends A6{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)=>SX6(G.pubDate).length));return new mq({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=H6.of(V),{colors:W}=K,H=Z?M1.yellow:void 0,z=Z?M1.black:W.foreground,U=M1.index(8),N=G.authors.map((L)=>L.name).join(", ")||"Community",M=(L,A)=>new W0({width:A,child:m6.end([new f1({text:new s(L,new Z1({color:U}))})])});return new J6({decoration:H?{color:H}:void 0,padding:I0.symmetric(2,0),child:new m6({children:[new F4({child:new f1({text:new s(G.title,new Z1({color:z})),overflow:"ellipsis",maxLines:1})}),new W0({width:2}),new f1({text:new s(N,new Z1({color:U})),maxLines:1}),new W0({width:2}),M(SX6(G.pubDate),Y)]})})}})}}class hk1 extends A6{props;constructor(J){super();this.props=J}build(){return new K8({child:new f1({text:new s("",void 0,[new s(`Forked to new thread:
|
|
4816
4816
|
|
|
4817
4817
|
`,new Z1({color:M1.white,dim:!0})),new s(`"${this.props.newThreadTitle||"Untitled"}"`,new Z1({color:M1.white}))]),textAlign:"center"})})}}class IN extends e0{props;constructor(J){super();this.props=J}createState(){return new _X6}}class _X6 extends s0{_spinner=new aZ;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=H6.of(J),{colors:Y}=Q,X=x4.all(new L4(Y.foreground,1,"solid")),G=this._spinner.toBraille(),Z=new f1({textAlign:"center",text:new s("",void 0,[new s(G,new Z1({color:M1.yellow})),new s(" ",void 0),new s(this.widget.props.message,new Z1({color:Y.foreground}))])}),V=[new F4({child:new l0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)V.push(new W0({height:2,child:new J6({padding:I0.symmetric(2,0),child:new f1({text:new s("",new Z1({dim:!0}),[new s("Press ",new Z1({color:Y.foreground})),new s("Esc",new Z1({color:Y.info})),new s(" to cancel",new Z1({color:Y.foreground}))])})})}));let K=new J6({decoration:new F8(M1.default(),X),child:new W0({width:60,height:7,child:new l0({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 xz extends e0{props;constructor(J){super();this.props=J}createState(){return new kX6}}class kX6 extends s0{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof oK}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=g81(Q);return{title:W.title,type:W.type,description:W.description}})(),X=Y.type==="error"?M1.red:M1.yellow,G=x4.all(new L4(M1.default(),1,"solid")),Z=new J6({padding:I0.symmetric(1,0),child:new f1({text:new s(Y.title,new Z1({color:X,bold:!0}))})}),q=this.isWidgetMessage(Q)?Q.widget:new f1({text:new s(Y.description,new Z1({color:M1.default()})),selectable:!0}),V=new F4({child:new DO({child:new J6({padding:I0.symmetric(1,0),child:q})})}),K=new J6({padding:I0.symmetric(1,0),child:new f1({text:this.widget.props.onRetry?new s("",void 0,[new s("Press ",new Z1({color:M1.default(),dim:!0})),new s("R",new Z1({color:M1.yellow})),new s(" to retry, ",new Z1({color:M1.default(),dim:!0})),new s("Esc",new Z1({color:M1.yellow})),new s(" to cancel",new Z1({color:M1.default(),dim:!0}))]):new s("Press any key to close",new Z1({color:M1.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 J6({decoration:{border:G,color:M1.default()},padding:I0.all(1),child:new l0({mainAxisAlignment:"center",children:[Z,new W0({height:1}),V,K]})})})}}class bk1 extends A6{build(){return new K8({child:new f1({text:new s("",void 0,[new s(`✓ Thread Shared
|
|
4818
4818
|
|
|
@@ -4896,7 +4896,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
4896
4896
|
`)?`${V}...`:G,W=new Z1({color:M1.index(8)}),H=[new s(K,W)];if(q>0){let z=new Z1({color:Y.success});for(let U=1;U<=q;U++)H.push(new s(" ")),H.push(new s(`[${U}]`,z))}return new O6({padding:I0.only({bottom:0}),child:new m6({crossAxisAlignment:"start",children:[new O6({padding:I0.only({right:1}),child:new f1({text:new s("•",new Z1({color:M1.index(8)}))})}),new F4({child:new f1({text:new s("",void 0,H)})})]})})}}class Uy1 extends e0{createState(){return new CG6}}class CG6 extends s0{_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 Z1({color:M1.red}),Y=new Z1({color:this._visible?M1.red:M1.transparent()});return new m6({children:[new f1({text:new s("⏺",Y)}),new W0({width:1}),new f1({text:new s("Replay",Q)})]})}}class By1 extends A6{entry;constructor({key:J,entry:Q}){super({key:J});this.entry=Q}build(J){let Q=H6.of(J),Y=Q.colors.secondary,X=Q.colors.foreground,G=this.entry.authors.map((Z)=>Z.name).join(", ");return new J6({decoration:new F8(void 0,new x4(new L4(Y,1,"rounded"),new L4(Y,1,"rounded"),void 0,new L4(Y,1,"rounded"))),child:new O6({padding:I0.horizontal(1),child:new l0({children:[new m6({crossAxisAlignment:"start",children:[new F4({child:new f1({text:new s(this.entry.title,new Z1({color:X,bold:!0}))})}),new W0({width:4}),new f1({text:new s(G||"Community",new Z1({color:X,dim:!0}))})]}),new m6({crossAxisAlignment:"start",children:[new F4({child:new f1({text:new s(this.truncateDescription(this.entry.description),new Z1({color:X,dim:!0}))})}),new W0({width:2}),new Y7({uri:this.entry.link,text:"View Thread",style:new Z1({color:Y,underline:!0})})]})]})})})}truncateDescription(J){let Y=J.replace(/\s+/g," ").trim();if(Y.length<=80)return Y;return Y.slice(0,79)+"…"}}r0();function XO8(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 Ny1{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(q6((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=XO8(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}})}}L0();e8();class Dy1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new Y2;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(jM()).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 jG6(J,Q){switch(J){case"update-available":return[new s("A newer Amp is available. Run ",new Z1({color:Q.foreground,dim:!0})),new s("amp update",new Z1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new s("Update complete, run ",new Z1({color:Q.foreground,dim:!0})),new s("amp update",new Z1({color:Q.warning})),new s(" to see warnings",new Z1({color:Q.foreground,dim:!0}))];case"update-error":return[new s("Update failed, run ",new Z1({color:Q.foreground,dim:!0})),new s("amp update",new Z1({color:Q.warning})),new s(" to see warnings",new Z1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function VO8(J){return new Promise((Q)=>{ZO8("git",["branch","--show-current"],{cwd:J},(Y,X)=>{if(Y){Q(null);return}let G=X.trim();Q(G||null)})})}class hG6 extends e0{dependencies;constructor(J){super();this.dependencies=J}createState(){return new bG6}}class bG6 extends s0{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;isShowingMCPStatusModal=!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 Dy1;previewThread=null;planScrollController=(()=>{let J=new Y2;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new Y2;return J.followMode=!1,J})();filterThreadPickerByWorkspace=!0;agentModePulseSeq=0;currentGitBranch=null;messageViewFocusNode=new i8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new i8({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;mcpServers=[];mcpServersSubscription=null;agentModeSubscription=null;currentAgentMode;inMemoryAgentModeOverride=null;cachedVisibleModes=sG();freeTierStatus=void 0;updateState="hidden";updateServiceSubscription=null;toastController=new HS1;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=null;async initThreadFeed(){let J=await M6(this.widget.dependencies.configService.config);if(J.settings["feed.enabled"]===!1)this.threadFeedHidden=!0;let Q=J.settings.url,Y=Q.includes("localhost")||Q.includes("127.0.0.1");try{let 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 FJ(K,V,this.widget.dependencies.configService)},Z=bl0();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 Tj1(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(`
|
|
4897
4897
|
`);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;if(this.looksLikePastedContent(G.trim())){await this.replaySleep(150),this.textController.text=this.textController.text+G,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{}),await this.replaySleep(300);continue}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)}}}looksLikePastedContent(J){if(/^[a-z][a-z0-9+.-]*:\/\//i.test(J))return!0;if(J.startsWith("/")&&J.length>10)return!0;if(/^[a-z]:\\/i.test(J))return!0;if(/^[a-f0-9]{7,40}$/i.test(J))return!0;if(/^T-[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(J))return!0;return!1}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return B81(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 s(this.submitDisabledHint,new Z1({color:J.foreground,dim:!0}));if(this.isExiting)return new s("Exiting...",new Z1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new s("",void 0,[new s("Ctrl+C",new Z1({color:Q.keybind})),new s(" again to exit",new Z1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new s("",void 0,[new s("Esc",new Z1({color:Q.keybind})),new s(" again to clear input",new Z1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new s("",void 0,[new s("Escape",new Z1({color:Q.keybind})),new s(" to close help",new Z1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let G=this.getEffectiveAgentMode(),Z=Ey1(G);return new s("",void 0,[new s("Images aren't supported in ",new Z1({color:J.warning,dim:!1})),new s(G,new Z1({color:Z})),new s(" mode.",new Z1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new s("",void 0,[new s("Esc",new Z1({color:Q.keybind})),new s(" again to cancel",new Z1({color:J.foreground,dim:!0}))]);return new s("",void 0,[new s("Esc",new Z1({color:Q.keybind})),new s(" to cancel",new Z1({color:J.foreground,dim:!0}))])}if(this.showingCannotToggleMessage)return new s(this.showingCannotToggleMessage,new Z1({color:J.warning,dim:!1}));let Y=jG6(this.updateState,J);if(Y)return new s("",void 0,Y);let X=this.widget.dependencies.worker.thread;if(X.agentMode==="plan"&&WO(X))return new s("",void 0,[new s("Ctrl+O",new Z1({color:Q.keybind})),new s(" → Execute Plan",new Z1({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 I3.getOrCreateForThread(Y,G),V=await ET(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=NN(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($J)}catch(Y){return h.error("Failed to get affected files:",Y),[]}};textController=new nZ;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new Y2);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(uC1(X))}}_handleTextCopy(J){if(J&&J.length>0)this.toastController.show("Selection copied to clipboard","success",2000)}textFieldKey=new e7("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=NN(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}),X9.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}),X9.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 mk1(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 dk1(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=d0.file(process.cwd()),G=C6(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 k91("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 Xs({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})},showMCPStatusModal:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!0})}}};loadThreadsForPicker(){if(this.threadLoadSubscription)return;this.setState(()=>{this.isLoadingThreads=!0});let J=new Ny1(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 VO8(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===BN).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===BN};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(PX(J.thread)>0)return;if(this.freeTierStatus?.canUseAmpFree){let X=this.getEffectiveAgentMode(),G=Si(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=Si(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(!pk(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>=MU)return!1;let Y=SC(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=NN(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(qG.getInstance().interceptConsole(),this.currentAgentMode=this.widget.dependencies.initialAgentMode??"smart",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)=>{X9.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),this.freeTierStatus=this.widget.dependencies.freeTierStatus,M6(this.widget.dependencies.configService.config).then((Y)=>{this.paletteConfig=Y;let X=B81(this.widget.dependencies.worker.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,Y.settings),Z=this.widget.dependencies.initialAgentMode??X;this.setState(()=>{this.inMemoryAgentModeOverride=Z})}),this.updateGitBranch(),this.adSubscription=qj1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{return(this.inMemoryAgentModeOverride&&$5(this.inMemoryAgentModeOverride)||this.randomAd===null)&&$j1(this.lastUserInteractionTime)}).subscribe({next:(Y)=>{if(Y){let X=$O8(16).toString("hex");this.lastAdImpressionId=X,Promise.resolve().then(() => (G51(),X51)).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}),X9.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.mcpServersSubscription=this.widget.dependencies.mcpService.servers.subscribe((Y)=>{this.setState(()=>{this.mcpServers=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=sG(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.mcpServersSubscription)this.mcpServersSubscription.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(uC1("")),this.shouldUseProgressBar())process.stdout.write(A76())}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")v$("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 sY(this.context,G);return}if(J==="disable-librarian"){let G=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!G.includes(EX))await this.widget.dependencies.settingsStorage.set("tools.disable",[...G,EX],"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 I3.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}),w41({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 I3.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=B81(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(`
|
|
4898
4898
|
`);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=PX(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)w41({agentMode:X});this.scrollMessageViewToBottom(),this.setState(()=>{if(this.imageAttachments=[],!this.hasSubmittedFirstMessage)this.hasSubmittedFirstMessage=!0}),X9.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();w41({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=qO8();if(J===Q)return"~";if(J.startsWith(Q+Xu.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(Xu.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(Xu.sep),"…",Q.slice(-2).join(Xu.sep)].join(Xu.sep)}build(J){let Q=Z8.of(J),Y=H6.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 W4={...N.thread,messages:this.replayDisplayedMessages};L=iC(W4).items,A=W4,E={};let b4=NI({messages:this.replayDisplayedMessages});P=Array.isArray(b4)?b4:[]}let I=A?.id,T=A,S=M?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),y=(W4)=>new j91({key:new e7(`preview-message-view-${W4.id}`),items:iC(W4).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:W4,focusNode:new i8({debugLabel:"PreviewFocus"})}),x=this.previewThread,g=x?x.messages.length>2000?new l0({mainAxisSize:"max",children:[new F4({child:new W0}),new O6({padding:I0.all(2),child:new K8({child:new f1({text:new s("Thread too long for preview",new Z1({color:G.mutedForeground,dim:!0}))})})})]}):y(x):S?new _91({agentMode:this.getEffectiveAgentMode()}):new j91({key:I?new e7(`message-view-${I}`):void 0,items:L,subagentToolsByParentID:E,controller:I?this.getMessageScrollController(I):new Y2,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?tB0(z.mainThread):void 0,m=new l81({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,mcpServers:this.mcpServers,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}),t=new c81({bashInvocations:this.bashInvocations}),H1=[],W1=this.getEffectiveAgentMode(),o=this.currentShellModeStatus,r=Ey1(W1),i=!o?W1.length+1:0,F1=Q.capabilities.animationSupport,y1=F1==="disabled"?0:F1==="slow"?30:60,e=mV(W1)?.uiHints?.fasterAnimation?3:1,h1=y1>0&&this.agentModePulseSeq>0?new H5({children:[l,new j7({top:0,left:1,right:1,height:1,child:new Hy1({color:r,trigger:this.agentModePulseSeq,fps:y1,speed:e,leftOffset:i})})]}):l;H1.push(new F4({child:g}),t);let C1=new H5({children:[new l0({mainAxisSize:"min",children:[K?new Ck1({ad:this.randomAd,onButtonClick:async()=>{let W4=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (G51(),X51)).then(({recordAdEvent:g4})=>{let p6=this.widget.dependencies.worker.thread,Q3=p6.messages[p6.messages.length-1];g4("clicked",{adId:W4.id,advertiserId:W4.advertiserId,threadId:p6.id,messageId:Q3?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:W4.metadata?.matchType,matchedPatterns:W4.metadata?.matchedPatterns,candidateAdPoolCount:W4.metadata?.candidateAdPoolCount,clientRegion:W4.metadata?.clientRegion})});if(!await sY(this.context,W4.shortDestinationUrl)){let p6=I9.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:p6,url:W4.shortDestinationUrl}})}}}):W?new By1({entry:this.currentThreadFeedEntry}):new W0({height:0}),new J6({constraints:new g6(0,Q.size.width,0,p),child:h1})]}),H?new j7({top:0,left:0,right:0,child:new uG6({userHeight:this.bottomGridUserHeight,maxHeight:p,onInitializeHeight:(W4)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(W4,p)})},onDrag:(W4)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(W4.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let b4=Math.floor(W4.localPosition.y)-this.bottomGridDragStartY,g4=Math.max(4,this.bottomGridDragStartHeight-b4),p6=Math.min(g4,p),Q3=Math.floor(p6);if(this.bottomGridUserHeight!==Q3)this.setState(()=>{this.bottomGridUserHeight=Q3})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new W0({height:0})]});H1.push(C1,new W0({height:1,child:new O6({padding:I0.horizontal(1),child:m})}));let w0=new l0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:H1}),s1=M&&N?.showIndicator!==!1?new H5({children:[w0,new j7({top:0,left:0,child:new Uy1})]}):w0,U1=new a8(()=>{if(this.isShowingPalette)return this.dismissPalette(),"handled";if(this.isShowingMCPStatusModal)return this.setState(()=>{this.isShowingMCPStatusModal=!1}),"handled";if(this.pendingMCPServers.length>0)return this.widget.dependencies.mcpTrustHandler.deny(),"handled";if(this.getCurrentEphemeralError())return this.handleEphemeralErrorResponse("dismiss"),"handled";if(this.displayMessage)return this.handleDisplayMessageDismiss(),"handled";if(this.isShowingHelp)return this.setState(()=>{this.isShowingHelp=!1}),"handled";if(this.isShowingFileChangesOverlay)return this.setState(()=>{this.isShowingFileChangesOverlay=!1}),"handled";if(this.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((b4)=>{h.error("Failed to mark message as interrupted:",b4)}),this.cancelStreamingMessage().catch((b4)=>{h.error("Failed to cancel streaming message:",b4)});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 a8(()=>{return this.onExitPressed(),"handled"}),O1=new a8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),w1=new a8(()=>{return this.setState(()=>{this.isShowingMCPStatusModal=!this.isShowingMCPStatusModal}),"handled"}),I1=new a8(()=>{return CJ.instance.toggleAll(),"handled"}),E1=new a8(()=>{return this.widget.dependencies.configService.getLatest().then((W4)=>{v$("internal.showCost",!(W4.settings["internal.showCost"]??!0))}),"handled"}),d1=new a8(()=>{return I9.instance.toggleFrameStatsOverlay(),"handled"}),b1=new a8(()=>{return I9.instance.tuiInstance.getScreen().markForRefresh(),X9.instance.requestFrame(),"handled"}),r1=new a8(()=>{return this.toggleAgentMode(),"handled"}),$0=new a8(()=>{let b4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:g4}=this.widget.dependencies,p6=g4.mainThread?.id;return p6?this.getMessageScrollController(p6):null})();if(b4){let g4=Math.max(Math.floor(Q.size.height*0.4),10),p6=Q.size.height-g4;b4.animatePageUp(p6,100)}return"handled"}),G0=new a8(()=>{let b4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:g4}=this.widget.dependencies,p6=g4.mainThread?.id;return p6?this.getMessageScrollController(p6):null})();if(b4){let g4=Math.max(Math.floor(Q.size.height*0.4),10),p6=Q.size.height-g4;b4.animatePageDown(p6,100)}return"handled"}),C0=new a8(()=>{let b4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:g4}=this.widget.dependencies,p6=g4.mainThread?.id;return p6?this.getMessageScrollController(p6):null})();if(b4)b4.animateTo(0,100);return"handled"}),U6=new a8(()=>{let b4=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:g4}=this.widget.dependencies,p6=g4.mainThread?.id;return p6?this.getMessageScrollController(p6):null})();if(b4)b4.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),L6=new a8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:W4}=this.widget.dependencies;if(!W4.mainThread?.messages.some((g4)=>g4.role==="user"||BI(g4)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),I4=new a8((W4)=>{if(W4.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),a4=new a8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return b81().then(async(W4)=>{if(W4)try{this.handleInsertImage(W4)}finally{try{let{unlink:b4}=await import("node:fs/promises");await b4(W4)}catch{}}}),"handled"}),r8=new Map([[U4.ctrl("c"),new Sm],[U4.ctrl("l"),new fm],[U4.ctrl("o"),new x81],[U4.ctrl("v"),new Cm],[U4.alt("s"),new yC],[U4.ctrl("s"),new yC],[U4.alt("p"),new xm],[U4.ctrl("r"),new km],[U4.alt("d"),new ym],[U4.ctrl("t"),new hm],[U4.key("PageUp"),new S81],[U4.key("PageDown"),new _81],[U4.key("Home"),new k81],[U4.key("End"),new y81],[U4.key("Escape"),new jm],[U4.ctrl("p"),new xC("previous")],[U4.ctrl("n"),new xC("next")],[U4.key("Tab"),new bm]]);if(!e2())r8.set(U4.key("ArrowUp"),new bm);if(!1)r8.set(U4.alt("c"),new _m);r8.set(U4.ctrl("m"),new vm);let u0=new a8(()=>{if(this.isShowingStandalonePalette())return"handled";return this.showCommandPalette(),"handled"}),t6=new a8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),Q8=new Map([[jm,U1],[fm,b1],[yC,r1],[x81,u0],[Cm,a4],[_m,O1],[vm,w1],[km,I1],[ym,E1],[xm,d1],[hm,t6],[Sm,Y1],[S81,$0],[_81,G0],[k81,C0],[y81,U6],[bm,L6],[xC,I4]]),o4=[s1];if(this.isShowingConsoleOverlay)o4.push(new ik1);if(this.isShowingHelp&&this.paletteConfig)o4.push(new ok1({commands:this.getPaletteCommands().getAllCommands()}));if(this.isShowingMCPStatusModal)o4.push(new s_1({servers:this.mcpServers,onDismiss:()=>{this.setState(()=>{this.isShowingMCPStatusModal=!1})}}));if(this.adActionModal)o4.push(new jk1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(W4)=>{let b4=this.adActionModal.url;if(W4==="copy")try{await I9.instance.tuiInstance.clipboard.writeText(b4),this.setState(()=>{this.displayMessage=new FG("Link copied to clipboard")})}catch(g4){h.error("Failed to copy to clipboard",{error:g4}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:W4}=this.widget.dependencies;o4.push(new zy1({servers:this.pendingMCPServers,onAlwaysTrust:W4.trustAlways.bind(W4),onTrustOnce:W4.trustOnce.bind(W4),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:W4.deny.bind(W4)}))}if(this.isShowingFileChangesOverlay)o4.push(new RS1({threadData:z}));if(this.isShowingCostBreakdownOverlay&&z.mainThread)o4.push(new nk1({thread:z.mainThread}));if(this.isShowingConfirmationOverlay)o4.push(new ck1({details:this.confirmationOverlayContent}));let F5=this.getCommandPaletteContext(J);if(F5&&this.isShowingPalette&&this.paletteConfig)o4.push(new K8({child:new J6({constraints:g6.loose(80,20),child:new pk1({commandContext:F5,mainThread:z.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette,showOptions:this.paletteShowOptions??void 0})})}));if(this.isShowingIdePicker)o4.push(new sk1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));let A5=new H5({children:o4});if(this.isShowingJetBrainsInstaller)return new LO({child:new JY({actions:Q8,child:new fq({shortcuts:r8,debugLabel:"jetbrains-installer-shortcuts",child:new Wy1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});return new Cz({controller:this.toastController,child:new LO({child:new zS1({controller:this.toastController,child:new JY({actions:Q8,child:new fq({shortcuts:r8,debugLabel:"main-app-shortcuts",child:A5})})})})})}buildScrollableTodoList(J,Q,Y){return new gG6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,X,G,Z,q,V,K){if(J)return new ak1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new lk1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Fy1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let W=p81(X),H=this.isInRestrictedFreeMode(),z=new yO({key:this.textFieldKey,controller:this.textController,triggers:K?[]:[new EN],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,m=n.slice(0,J1)+n.slice(J1+2);this.textController.text=m,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"&&WO(G.mainThread),A,E;if(L){if(A=new sj1(new S91({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 Y51({queuedMessages:U});else if(N)E=this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!H,X)}else A=M?new Y51({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 f1({text:new s(I==="hidden"?"shell mode (incognito)":"shell mode",new Z1({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=Ey1(b);if(p)P.push({child:new f1({text:new s(b,new Z1({color:l}))}),position:"top-left"});else{let J1=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,n=PX(J1.thread)===0,m=new f1({text:new s(b,new Z1({color:l}))});P.push({child:n?new M8({child:m,onClick:this.toggleAgentMode,cursor:"pointer"}):m,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,m;if(l)n="●",m=M1.red;else if(b==="presence")n="○",m=M1.yellow;else if(b==="connected"&&p.connected)n="●",m=M1.green;else n="○",m=M1.yellow;let t=this.connectedClientsStatusExpanded?`${J1} ${n}`:n;P.push({child:new M8({child:new f1({text:new s(t,new Z1({color:m}))}),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=d0.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 f1({text:new s(g,new Z1({color:Y.foreground,dim:!0}))}),position:"bottom-right"}),new DS1({leftChild:new F4({child:z}),rightChild1:A,rightChild2:E,maxHeight:q,overlayTexts:P,borderColor:H||!this.isTextfieldAndAutocompleteFocused?M1.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 Iy1(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 Rk1({threadService:J.threadService,worker:J.worker,builder:(A,E,P,I,T,S)=>{if(X=T,J.threadDependencies&&V)_j1(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 hG6({...x,threadState:E,workerController:P,switchWorker:I,getCurrentWorker:T,recentThreadIDs:S})}}),W=new wS1({configService:J.configService,child:K}),H=new LS1({configService:J.configService,child:W}),z=new GS1(H),U=new H6({data:vC.fromBaseTheme(iZ.default()),child:z});try{await Yj1(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(() => (kj1(),L36));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}`;m36(L,A,J.stdout)}}function Ey1(J){let Y=mV(J)?.uiHints?.secondaryColor;if(Y)return M1.rgb(Y.r,Y.g,Y.b);return KO8(J)}class gG6 extends e0{props;constructor(J){super();this.props=J}createState(){return new mG6}}class mG6 extends s0{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 m6({crossAxisAlignment:"stretch",children:[new F4({child:new F7({controller:Y,autofocus:!1,child:new Tk1({todos:Q})})}),new YY({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 uG6 extends A6{props;constructor(J){super();this.props=J}build(J){return new M8({child:new W0({height:1}),cursor:l9.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 KO8(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 M1.index(Y[X])}Qj1();try{if(process.platform==="win32")await Promise.resolve().then(() => N6(Uj(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){X$.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
4899
|
-
`)}var ex1=tx1.join(jF0||tx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function SP8(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 cq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")v$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")v$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")v$("model.sonnet",Q.useSonnet)}async function Qv1(J){try{await TP8(tx1.dirname(ex1),{recursive:!0}),await CP8(ex1,J,"utf-8")}catch(Q){h.debug("Failed to save last thread ID",Q)}}async function _P8(){try{return(await UV6(ex1,"utf-8")).trim()}catch(J){return null}}var HV6=[{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??mZ,description:`Custom settings file path (overrides the default location ${mZ})`},{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 ${$C1})`},{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:e2(),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:KI.SMART.key,description:`Set the agent mode (${sG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:sG().map((J)=>J.mode)}],zV6=(J)=>("deprecated"in J)&&J.deprecated===!0,kP8=(J)=>("hidden"in J)&&J.hidden===!0,yP8=(J)=>("default"in J),xP8=(J)=>("default"in J)?J.default:void 0;function vP8(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 S8(gZ.unknownCommand(Y),1,q)}}var BV6=null;function UO5(){return BV6}function Ru(J){return{...J,getThreadEnvironment:s61,vfs:eI0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new px(J.fileSystem),generateThreadTitle:ll0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Yv1=d0.file(jP8.homedir()),NV6=process.env.XDG_CONFIG_HOME?d0.file(process.env.XDG_CONFIG_HOME):o0.joinPath(Yv1,".config");async function lq(J,Q){KN0("0.0.
|
|
4899
|
+
`)}var ex1=tx1.join(jF0||tx1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function SP8(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 cq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")v$("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")v$("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")v$("model.sonnet",Q.useSonnet)}async function Qv1(J){try{await TP8(tx1.dirname(ex1),{recursive:!0}),await CP8(ex1,J,"utf-8")}catch(Q){h.debug("Failed to save last thread ID",Q)}}async function _P8(){try{return(await UV6(ex1,"utf-8")).trim()}catch(J){return null}}var HV6=[{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??mZ,description:`Custom settings file path (overrides the default location ${mZ})`},{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 ${$C1})`},{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:e2(),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:KI.SMART.key,description:`Set the agent mode (${sG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:sG().map((J)=>J.mode)}],zV6=(J)=>("deprecated"in J)&&J.deprecated===!0,kP8=(J)=>("hidden"in J)&&J.hidden===!0,yP8=(J)=>("default"in J),xP8=(J)=>("default"in J)?J.default:void 0;function vP8(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 S8(gZ.unknownCommand(Y),1,q)}}var BV6=null;function UO5(){return BV6}function Ru(J){return{...J,getThreadEnvironment:s61,vfs:eI0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new px(J.fileSystem),generateThreadTitle:ll0,deleteThread:(Q)=>J.threadService.delete(Q)}}var Yv1=d0.file(jP8.homedir()),NV6=process.env.XDG_CONFIG_HOME?d0.file(process.env.XDG_CONFIG_HOME):o0.joinPath(Yv1,".config");async function lq(J,Q){KN0("0.0.1764633707-gc33a68");let Y=Vq1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:X0.of([d0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:Yv1,userConfigDir:NV6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (G51(),X51));X(Y);let G=await Y.getLatest();h.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let{toolService:Z,dispose:q}=W16({configService:Y}),V=new Map,K=()=>V.clear(),W=new WU1(Y,J.settings.getWorkspaceRootPath()),H=$I0({configService:Y,trustStore:W,createOAuthProvider:async(n)=>{let m=V.get(n);if(m)return h.debug("Reusing existing OAuth provider for server",{serverName:n}),m;h.debug("Creating OAuth provider for server",{serverName:n});let t=(async()=>{let H1=new nM(J.secrets),W1=await H1.getClientInfo(n),o=new kF1({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,t),t}}),z=r01({configService:Y,filesystem:M5,spawn:bA}),{initializeToolProviders:U,startToolProviders:N}=await Promise.resolve().then(() => (WV6(),KV6)),M;if(J.executeMode){let n=await U({toolService:Z,providers:[H,z],initialTimeout:15000});M=n.registrations;for(let[m,t]of n.initErrors)h.warn(`${m} provider initialization slow or failed:`,t)}else M=N({toolService:Z,providers:[H,z]});if(Q.jetbrains)MI("JetBrains");else if(Q.ide&&U56())MI("VS Code");else if(Q.ide&&B56())MI("Neovim");if(J.executeMode)WN0(!0);let L,A=A2.status.pipe(q6((n)=>Boolean(n.connected&&n.authenticated)),S4()).subscribe((n)=>{if(n){if(!L)L=Z.registerTool(os0)}else L?.dispose(),L=void 0}),E;if(!J.executeMode)E=new V41(process.cwd(),{},!0);else E=new class extends V41{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(b5.write(`No API key found. Starting login flow...
|
|
4900
4900
|
`),!await fP8(J))await ZO(),process.exit(1)}let P=await SR0({isDevelopment:!1}),I=new WI1(P,Y),T=new ZI1(P,{lazy:!0}),S=new AU1(I,(n,m)=>{let t=I3.get(n);if(t)t.handle(m).catch((H1)=>{h.error("Failed to apply artifact delta",H1)})}),y=Q.notifications!==void 0?Q.notifications:!J.executeMode,x=z16({playNotificationSound:async(n)=>{if(y){H16(n);let m=eC1(),t=Jj1();if((!m||t)&&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=nl0({threadService:I,threadHistoryService:T,configService:Y,isExtensionDevelopment:!1}),p;A2.status.subscribe((n)=>{p=n});let b=new iZ1({workspaceRoots:[d0.file(process.cwd())],getCurrentFile:()=>{if(!p?.openFile)return;try{return d0.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((m)=>m!==n).map((m)=>{try{return d0.parse(m)}catch(t){return h.warn("Failed to parse visible file URI",{uri:m,error:t}),null}}).filter((m)=>m!==null)}}),l=new Xj1,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?rI0:M5,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 M.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 fP8(J){if(!J.executeMode){if(!await _C1("Would you like to log in to Amp? [(y)es, (n)o]: "))return b5.write(`Login cancelled. Run the command again to retry.
|
|
4901
4901
|
`),!1}return await DV6(J)}async function DV6(J){let Q=RP8(32).toString("hex"),Y=await SC1(J.ampURL,Q),X=new AbortController;try{await vE(Y,X.signal)}catch(Z){h.error("Error opening browser",{error:Z})}let G=await SC1(J.ampURL,Q,!1);b5.write(`If your browser does not open automatically, visit:
|
|
4902
4902
|
|
|
@@ -4906,7 +4906,7 @@ ${h4.blue.bold(G)}
|
|
|
4906
4906
|
Login successful! You can now use the Amp CLI.
|
|
4907
4907
|
`),!0}catch(Z){return h.error("Login failed",{error:Z}),X$.write(`
|
|
4908
4908
|
Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
4909
|
-
`),!1}}function hP8(){let J=new nA().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)QC(),process.exit(0);let z=H.originalError??H;V96(z)}),J.option("-V, --version","Print the version number and exit",()=>{b5.write(`0.0.
|
|
4909
|
+
`),!1}}function hP8(){let J=new nA().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)QC(),process.exit(0);let z=H.originalError??H;V96(z)}),J.option("-V, --version","Print the version number and exit",()=>{b5.write(`0.0.1764633707-gc33a68 (released 2025-12-02T00:07:41.799Z)
|
|
4910
4910
|
`),process.exit(0)}),J.addHelpText("after",H56()),J.configureHelp({formatHelp:z56}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),N=await VY(U);await uP8(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 VY(U);await mP8(N,await LC1(U,N.settings))});let Q=async(H,z,U)=>{Vq1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:X0.of([d0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:Yv1,userConfigDir:NV6});let N={...z,executeMode:!1};await Jv1(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 VY(U);await FV6(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 VY(U);await aP8(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 VY(N);if(z.pick)X$.write(`${h4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
4911
4911
|
`);if(z.last||H||M.executeMode)await nP8(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 VY(N);await iP8(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 VY(U);await FV6(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 VY(N);await lP8(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 VY(M);await pP8(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 VY(N);await dP8(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 VY(N);await cP8(N,M,H,z,U)}),q26(J,async(H,z)=>{let U=await VY(z);cq(H,z);let N=await lq(U,z);return{context:U,mcpService:N.mcpService,toolService:N.toolService,toolServices:N.toolService,configService:N.configService,cleanupTerminal:QC,asyncDispose:N.asyncDispose.bind(N)}}),o56(J,async(H)=>{let z=H.optsWithGlobals();return await VY(z)}),g56(J,async(H)=>{let z=await VY(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{cq(U,H);let N=await lq(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 rB(z,M),A=xP8(H);if(A)L.default(A);if(L.hidden=kP8(H)||zV6(H),"choices"in H)L.choices([...H.choices]);return L}for(let H of HV6)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 rB("-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 rB("-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 rB("--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 rB("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(K);let W=new rB("--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 rB("--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 VY(U);if(z.getOptionValueSourceWithGlobals("tryOpus")==="cli")b5.write(h4.yellow(`Opus 4.5 is now the default in Amp's smart mode. Rerun without --try-opus.
|
|
4912
4912
|
`)),process.exit(0);if(Object.keys(U).forEach((M)=>{let L=HV6.find((A)=>A.name===M);if(L&&zV6(L)&&!yP8(L))X$.write(h4.yellow(`Warning: '--${M}' flag is deprecated
|
|
@@ -4914,8 +4914,8 @@ Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
|
4914
4914
|
Or pipe via stdin: echo "your message" | amp --execute`);cq(Y,Q);let q=await lq(J,Q);BV6=q;let V=Ru(q),K=async(l)=>{let J1=await UV6(l,"utf-8"),n=JSON.parse(J1);if(!c$(n.id))throw new S8(gZ.invalidThreadId);return i51(q,{visibility:X,agentMode:Q.mode,thread:n})},W=async(l)=>{if(!c$(l))throw new S8(gZ.invalidThreadId);try{let[n,m]=await Promise.all([C5.getThreadLinkInfo({thread:l},{config:q.configService}),C5.getUserInfo({},{config:q.configService})]);if(n.ok&&m.ok){let t=n.result.creatorUserID,H1=m.result.id;if(t&&t!==H1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new S8(`Cannot resume thread created by another user.
|
|
4915
4915
|
|
|
4916
4916
|
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 S8)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"}`),i51(q,{visibility:X,agentMode:J1?void 0:Q.mode,thread:J1})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return i51(q,{visibility:X,agentMode:Q.mode})}catch(l){if(l instanceof S8)throw l;throw await ig(l,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return i51(q,{visibility:X,agentMode:Q.mode})};if(Q.format==="jsonl")X$.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
4917
|
-
`),await ZO(),process.exit(1);if(J.executeMode&&Q.remote)await r56(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)p56(q.mcpService,J.settings),await E96(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 TM0();let l=xI({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)A2.selectConfig(J1)}else N=!0}let L=D41("0.0.
|
|
4918
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await o96({...J,workspaceTrust:{current:!0,changes:Uk},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 m56(J.mcpConfig);X=u56(X,Z)}let G=await X.get("url","global");if(!G)G=OY;if(!lF(G))h.info("Targeting custom Amp server",{ampURL:G});return X=CU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:s56(await LC1(J,X))}}function bP8(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 gP8(){let J=bP8(process.argv);if(e86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),SP8(h),h.info("Starting Amp CLI.",{version:"0.0.
|
|
4917
|
+
`),await ZO(),process.exit(1);if(J.executeMode&&Q.remote)await r56(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)p56(q.mcpService,J.settings),await E96(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 TM0();let l=xI({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)A2.selectConfig(J1)}else N=!0}let L=D41("0.0.1764633707-gc33a68",q.settingsStorage),A=new c11(q.threadStorage),E=X0.of([d0.file(process.cwd())]),P=X$1(void 0,E),I=new M41(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 C5.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 C5.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(ts0);let b=await J76();h.info("Loaded session state:",b),await Iy1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new Q41,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:C5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:A2,connectedClientsService:new gi,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,initialAgentMode:Y.getOptionValueSourceWithGlobals("mode")==="cli"?Q.mode:void 0}),await q.asyncDispose(),process.exit(0)}async function VY(J){if(J.interactive)X$.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
4918
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await o96({...J,workspaceTrust:{current:!0,changes:Uk},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 m56(J.mcpConfig);X=u56(X,Z)}let G=await X.get("url","global");if(!G)G=OY;if(!lF(G))h.info("Targeting custom Amp server",{ampURL:G});return X=CU0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:s56(await LC1(J,X))}}function bP8(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 gP8(){let J=bP8(process.argv);if(e86({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),SP8(h),h.info("Starting Amp CLI.",{version:"0.0.1764633707-gc33a68",buildTimestamp:"2025-12-02T00:07:41.799Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new S8(gZ.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await hP8().parseAsync(process.argv)}JI1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await gP8().catch(ig)});async function mP8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),b5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
4919
4919
|
`);else if(!lF(J.ampURL))b5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
4920
4920
|
`);let Y=process.env.AMP_API_KEY;if(Y)b5.write(`API key found in environment variable, storing...
|
|
4921
4921
|
`),await Q.set("apiKey",Y,J.ampURL),b5.write(`API key successfully stored.
|
|
@@ -4928,7 +4928,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
4928
4928
|
`);else b5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
4929
4929
|
`);process.exit(0)}async function pP8(J,Q,Y,X,G){cq(G,J);let Z=await lq(Q,J);try{let q=n51(Y);if(!q)a51(Y);let V=q,K=X.trim();if(K.length===0)Y$("Thread name cannot be empty");if(K.length>256)Y$("Thread name cannot exceed 256 characters");if(!(await Bj(V,Z)).messages.length)Y$("Cannot rename an empty thread.");let H=Ru(Z);await(await I3.getOrCreateForThread(H,V)).handle({type:"title",value:K}),h.info("GOT HERE"),await Z.threadSyncService.sync(),h.info("GOT THERE"),b5.write(h4.green(`✓ Thread ${V} renamed to "${K}"
|
|
4930
4930
|
`)),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose();let V=`Failed to rename thread: ${q instanceof Error?q.message:String(q)}`;Y$(V)}}async function dP8(J,Q,Y,X){cq(X,J);let G=await lq(Q,J);try{let Z=n51(Y);if(!Z)a51(Y);let V=await Bj(Z,G),K=wT(V);b5.write(K+`
|
|
4931
|
-
`),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)}`;Y$(q)}}async function cP8(J,Q,Y,X,G){cq(G,J);let Z=await lq(Q,J);try{let q=await Xv1(Y),V=await Bj(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=Ru(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await I3.getOrCreateForThread(M,L);await A.resume();let E=d11.fromWorker(A),P=new c11(Z.threadStorage),I=X0.of([d0.file(process.cwd())]),T=X$1(void 0,I),S=new M41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=D41("0.0.
|
|
4931
|
+
`),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)}`;Y$(q)}}async function cP8(J,Q,Y,X,G){cq(G,J);let Z=await lq(Q,J);try{let q=await Xv1(Y),V=await Bj(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=Ru(Z),L=V.id;await Z.threadStorage.set(L,V);let A=await I3.getOrCreateForThread(M,L);await A.resume();let E=d11.fromWorker(A),P=new c11(Z.threadStorage),I=X0.of([d0.file(process.cwd())]),T=X$1(void 0,I),S=new M41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=D41("0.0.1764633707-gc33a68",Z.settingsStorage);await Iy1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new Q41,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:C5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:A2,connectedClientsService:new gi,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 ig(q,Y)}}async function lP8(J,Q,Y,X,G){cq(X,J);let Z=await lq(Q,J);try{let q=n51(Y);if(!q)a51(Y);let V=q,K=await C5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=L41(J,W);if(!H&&!G)Y$("Must specify either --visibility or --support");if(H&&G)Y$("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)Y$(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,A41(H)),b5.write(h4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
|
|
4932
4932
|
`);if(G){await Bj(V,Z);let z=typeof G==="string"?G:void 0;await IR0(Z.threadService,V,Z.configService,z),b5.write(h4.green("✓ ")+`Thread ${V} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
4933
4933
|
`)}await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),Y$(`Failed to update thread: ${q instanceof Error?q.message:String(q)}`)}}async function iP8(J,Q,Y,X){cq(X,J);let G=await lq(Q,J),Z=Ru(G);try{let q=await Xv1(Y),K=(await Bj(q,G)).messages.length-1,W=await I3.getOrCreateForThread(Z,q),H=await ET(W,G.threadSyncService,K);await Promise.all([G.threadSyncService.uploadThread(q),G.threadSyncService.uploadThread(H)]),await Qv1(H),b5.write(`${H}
|
|
4934
4934
|
`),await G.asyncDispose(),process.exit(0)}catch(q){X$.write(`Error forking thread: ${q instanceof Error?q.message:String(q)}
|