@sourcegraph/amp 0.0.1780932011-gc0dbaf → 0.0.1780942552-g0295b6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +9 -9
  2. package/package.json +2 -2
package/dist/main.js CHANGED
@@ -2672,7 +2672,7 @@ ${B}`}async function _06(A,Q){if(!Q?.forceExternal&&Q?.onShowImagePreview&&Sz4(A
2672
2672
  `).length,E=new E0({text:new g(A,new A0({color:$}))});if(B<=W80)return E;return new y0({width:1/0,height:W80,child:new vB({autofocus:!1,controller:Q,child:E})})}function $$6(){return new Map([[wA.key("PageUp"),new C80],[wA.key("PageDown"),new ug0],[wA.ctrl("u"),new C80],[wA.shift("Home"),new Mg0],[wA.shift("End"),new Og0]])}function B$6(A,Q,$){return Math.max(Q,Math.min(A,$))}var Lg0=8,ZN4=1,FN4=Lg0-1;class jg0 extends G4{}class Rg0 extends G4{}class H80 extends G4{}class N80 extends G4{}class Pg0 extends G4{}class Tg0 extends G4{}class vg0 extends d0{props;constructor(A){super(A.key===void 0?{}:{key:A.key});this.props=A}createState(){return new XN4}}class XN4 extends m0{messageScroll=new a6;initState(){super.initState(),this.messageScroll.followMode=!1,this.messageScroll.jumpTo(0)}dispose(){this.messageScroll.dispose(),super.dispose()}build(A){let Q=this.widget.props,$=E$6(Q,this.messageScroll),B=D$6(Q.options.message),E=B?new N4({actions:this.buildScrollActions(),child:new rQ({debugLabel:"SelectDialogScrollShortcuts",shortcuts:U$6(),child:$})}):$,D=[{keys:["↑/↓","j/k"],label:"move"},{keys:["Enter"],label:"select"}];if(B)D.push({keys:["Ctrl+E","Ctrl+Y"],label:"scroll"});return D.push({keys:["Esc"],label:"cancel"}),new D1({header:Q.options.title,minWidth:64,maxWidth:80,footer:D,autofocus:!1,onDismiss:Q.onCancel,child:E})}buildScrollActions(){let A=(Q)=>{let $=Y$6(this.messageScroll.offset+Q,0,this.messageScroll.maxScrollExtent);this.messageScroll.jumpTo($)};return new Map([[jg0,new cA(()=>A(-ZN4))],[Rg0,new cA(()=>A(ZN4))],[H80,new cA(()=>A(-FN4))],[N80,new cA(()=>A(FN4))],[Pg0,new cA(()=>this.messageScroll.jumpTo(0))],[Tg0,new cA(()=>this.messageScroll.jumpTo(this.messageScroll.maxScrollExtent))]])}}function E$6(A,Q){let $=A.options.options.map((E)=>({value:E,label:E})),B=Math.max(0,$.findIndex((E)=>E.value===A.options.initialValue));return new xX({options:$,selectedIndex:B,body:J$6(A.options.message,Q),onSelect:(E)=>{if(E===null){A.onCancel();return}A.onSelect(E)},padding:c0.all(0),showBorder:!1,showDismissalMessage:!1,enableMouseInteraction:!0,wrapOptions:!0})}function D$6(A){if(A===void 0)return!1;return A.split(`
2673
2673
  `).length>Lg0}function J$6(A,Q){if(A===void 0)return;let $=A.split(`
2674
2674
  `).length,B=Math.min($,Lg0);return new y0({width:1/0,height:B,child:new vB({autofocus:!1,controller:Q,child:new E0({text:new g(A)})})})}function U$6(){return new Map([[wA.key("PageUp"),new H80],[wA.key("PageDown"),new N80],[wA.ctrl("u"),new H80],[wA.ctrl("d"),new N80],[wA.ctrl("y"),new jg0],[wA.ctrl("e"),new Rg0],[wA.shift("Home"),new Pg0],[wA.shift("End"),new Tg0]])}function Y$6(A,Q,$){return Math.max(Q,Math.min(A,$))}var Z$6=3,F$6=2097152,X$6=new ZB("PluginDialogOverlay");function q80(A,Q,$){if($!==void 0)return{type:"response",id:A,error:$};if(Q===void 0)return{type:"response",id:A};return{type:"response",id:A,result:Q}}function I$6(A){let Q=new TextEncoder().encode(JSON.stringify(A)).byteLength;if(Q<=F$6)return;throw Error(`thread.messages response is too large (${Q} bytes). Request fewer messages.`)}class _g0{options;unregisterPluginCommands=null;pluginCommandSubscriptions=[];pluginErrorToastKeys=new Set;activeDialog=null;queuedDialogs=[];resolvingDialog=null;pendingOwnerUIRequests=new Map;pendingActorUIRequests=new Map;stateBackedRequestIDs=new Set;pluginUIRespondRequestCounter=0;statusItems=new Map;blockingConfirmDialog=!1;disposed=!1;constructor(A){this.options=A}init(){this.disposed=!1,this.configurePluginPlatform(),this.subscribePluginCommands()}dispose(){this.disposed=!0,this.unregisterPluginCommands?.(),this.unregisterPluginCommands=null;for(let A of this.pluginCommandSubscriptions)A.unsubscribe();this.pluginCommandSubscriptions=[],this.cancelOwnerUIRequests(),this.cancelPendingDialogs(),this.statusItems.clear(),this.clearPluginPlatformStatusHandlers()}handlePluginMessage(A,Q){let $=A.message;if($.type==="response"){this.cancelOwnerUIRequest($.id),this.cancelActorUIRequest($.id);return}if($.type==="event"){if(this.handlePluginUIStateEvent($,Q))return;this.handlePluginEvent($);return}if(this.stateBackedRequestIDs.has($.id))return;if(!q30($.method)){if($.method==="thread.messages")this.handleThreadMessagesRequest($,Q);return}this.handleOwnerUIRequest($,Q)}cancelOwnerUIRequests(){let A=[...this.pendingOwnerUIRequests.values(),...this.pendingActorUIRequests.values()];this.pendingOwnerUIRequests.clear(),this.pendingActorUIRequests.clear(),this.stateBackedRequestIDs.clear();for(let Q of A)Q.abort()}hasBlockingDialog(){return this.activeDialog!==null}hasBlockingConfirmDialog(){return this.activeDialog?.kind==="confirm"}buildDialogLayers(){let A=this.activeDialog;if(!A)return[];return[new E6({key:X$6,debugLabel:"PluginDialogOverlay",autofocus:!1,canRequestFocus:!0,child:this.buildActiveDialog(A)})]}buildActiveDialog(A){switch(A.kind){case"input":return new Ml({key:new WK(A),header:A.options.title??"Input",helpText:A.options.helpText,initialValue:A.options.initialValue,isRequired:!1,onSubmit:(Q)=>this.resolveInputDialog(A,Q),onDismiss:()=>this.resolveInputDialog(A,void 0)});case"confirm":return new wg0({key:new WK(A),options:A.options,onConfirm:()=>this.resolveConfirmDialog(A,!0),onCancel:()=>this.resolveConfirmDialog(A,!1)});case"select":return new vg0({key:new WK(A),options:A.options,onSelect:(Q)=>this.resolveSelectDialog(A,Q),onCancel:()=>this.resolveSelectDialog(A,void 0)})}}getStatusItems(){return[...this.statusItems.values()].flatMap((A)=>A.value===void 0?[]:[{pluginURI:A.pluginURI,id:A.id,value:A.value}])}configurePluginPlatform(){let A=this.options.context.pluginPlatform;if(!A)return;if(A.showToast=(Q)=>this.options.toastController.show(Q,"success"),A.showOpenedURLToast=(Q)=>{this.options.toastController.show(`Opened URL: ${Q}`,"success",8000)},A.appendToThreadHandler=this.options.context.observerOnly?async()=>{throw Error("thread.append is only available from an executor-owned plugin runtime")}:this.options.appendToThread,this.options.readThreadMessages)A.readThreadMessagesHandler=this.readThreadMessages;if(this.options.readThreadTitle)A.readThreadTitleHandler=this.readThreadTitle;if(this.options.subscribeThreadTitle)A.subscribeThreadTitleHandler=this.subscribeThreadTitle;A.runAgentHandler=this.options.context.observerOnly?async()=>{throw Error("agent.run is only available from an executor-owned plugin runtime")}:this.options.runAgent??(async()=>{throw Error("agent.run is not available in this context")}),A.showInputDialog=this.showInputDialog,A.showConfirmDialog=this.showConfirmDialog,A.showSelectDialog=this.showSelectDialog,A.createStatusItemHandler=this.createStatusItem,A.updateStatusItemHandler=this.updateStatusItem,A.removeStatusItemHandler=this.removeStatusItem}handlePluginEvent(A){if(A.event!=="ui.notify")return;let Q=A.data;if(typeof Q.message==="string")this.options.toastController.show(Q.message,"success")}async handleThreadMessagesRequest(A,Q){try{let{options:$,threadID:B}=this.parseThreadMessagesRequestParams(A.params),E=await this.readThreadMessages($,B);I$6(E),Q(q80(A.id,E))}catch($){Q(q80(A.id,void 0,$ instanceof Error?$.message:String($)))}}parseThreadMessagesRequestParams(A){if(!A||typeof A!=="object")return{options:void 0,threadID:void 0};let Q=A;return{options:Q.options,threadID:typeof Q.threadID==="string"?Q.threadID:void 0}}async handleOwnerUIRequest(A,Q){let $=new AbortController;this.pendingOwnerUIRequests.set(A.id,$);try{let B=await this.dispatchOwnerUIRequest(A,$.signal);if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(q80(A.id,B))}catch(B){if(this.pendingOwnerUIRequests.get(A.id)!==$)return;this.pendingOwnerUIRequests.delete(A.id),Q(q80(A.id,void 0,B instanceof Error?B.message:String(B)))}}dispatchOwnerUIRequest(A,Q){switch(A.method){case"ui.input":return this.showInputDialog(A.params.options,Q);case"ui.confirm":return this.showConfirmDialog(A.params.options,Q);case"ui.select":return this.showSelectDialog(A.params.options,Q);default:throw Error(`Unknown owner UI request method: ${A.method}`)}}cancelOwnerUIRequest(A){let Q=this.pendingOwnerUIRequests.get(A);if(!Q)return;this.pendingOwnerUIRequests.delete(A),Q.abort()}cancelActorUIRequest(A){let Q=this.pendingActorUIRequests.get(A);if(!Q)return;this.pendingActorUIRequests.delete(A),Q.abort()}buildPluginUIRespondRequest(A,Q,$){this.pluginUIRespondRequestCounter+=1;let B={requestId:A};if($!==void 0)B.error=$;else if(Q!==void 0)B.result=Q;return{type:"request",id:`plugin-ui-respond-${A}-${this.pluginUIRespondRequestCounter}`,method:"plugin.ui.respond",params:B}}async handleActorUIRequest(A,Q){let $=new AbortController;this.pendingActorUIRequests.set(A.requestId,$);let B={type:"request",id:A.requestId,method:A.method,params:A.params};try{let E=await this.dispatchOwnerUIRequest(B,$.signal);if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,E))}catch(E){if(this.pendingActorUIRequests.get(A.requestId)!==$)return;this.pendingActorUIRequests.delete(A.requestId),Q(this.buildPluginUIRespondRequest(A.requestId,void 0,E instanceof Error?E.message:String(E)))}}upsertActorUIState(A,Q){if(this.stateBackedRequestIDs.add(A.requestId),A.status!=="pending"){this.cancelActorUIRequest(A.requestId);return}if(this.pendingActorUIRequests.has(A.requestId))return;this.handleActorUIRequest(A,Q)}handlePluginUISnapshot(A,Q){let $=new Set(A.requests.map((B)=>B.requestId));for(let B of this.pendingActorUIRequests.keys())if(!$.has(B))this.cancelActorUIRequest(B);for(let B of this.stateBackedRequestIDs)if(!$.has(B))this.stateBackedRequestIDs.delete(B);for(let B of A.requests)this.upsertActorUIState(B,Q)}handlePluginUIRequestAdded(A,Q){this.upsertActorUIState(A.request,Q)}handlePluginUIRequestSettled(A,Q){this.upsertActorUIState(A.request,Q)}handlePluginUIRequestRemoved(A){this.cancelActorUIRequest(A.requestId),this.stateBackedRequestIDs.delete(A.requestId)}handlePluginUIStateEvent(A,Q){if(A.event==="plugin.ui.snapshot"){let $=gZ4.safeParse(A.data);if($.success)this.handlePluginUISnapshot($.data,Q);return!0}if(A.event==="plugin.ui.request_added"){let $=mZ4.safeParse(A.data);if($.success)this.handlePluginUIRequestAdded($.data,Q);return!0}if(A.event==="plugin.ui.request_settled"){let $=dZ4.safeParse(A.data);if($.success)this.handlePluginUIRequestSettled($.data,Q);return!0}if(A.event==="plugin.ui.request_removed"){let $=cZ4.safeParse(A.data);if($.success)this.handlePluginUIRequestRemoved($.data);return!0}return!1}clearPluginPlatformStatusHandlers(){let A=this.options.context.pluginPlatform;if(!A)return;if(A.readThreadMessagesHandler===this.readThreadMessages)A.readThreadMessagesHandler=null;if(A.readThreadTitleHandler===this.readThreadTitle)A.readThreadTitleHandler=null;if(A.subscribeThreadTitleHandler===this.subscribeThreadTitle)A.subscribeThreadTitleHandler=null;if(A.createStatusItemHandler===this.createStatusItem)A.createStatusItemHandler=null;if(A.updateStatusItemHandler===this.updateStatusItem)A.updateStatusItemHandler=null;if(A.removeStatusItemHandler===this.removeStatusItem)A.removeStatusItemHandler=null;if(A.runAgentHandler===this.options.runAgent)A.runAgentHandler=null}subscribePluginCommands(){let A=this.options.context.pluginService;if(!A)return;this.refreshPluginCommands(A.commands.list()),this.pluginCommandSubscriptions=[A.plugins.subscribe((Q)=>{this.removeInactivePluginStatusItems(Q),this.showNewPluginErrorToasts(Q),this.refreshPluginCommands(A.commands.list())}),A.commands.changed.subscribe(()=>{this.refreshPluginCommands(A.commands.list())})]}refreshPluginCommands(A){this.unregisterPluginCommands?.();let $=A.map((B)=>this.createPluginCommand(B)).map((B)=>this.options.commandRegistry.register(B));this.unregisterPluginCommands=()=>{for(let B of $)B()}}showNewPluginErrorToasts(A){let Q=new Set;for(let $ of A){if($.status!=="error")continue;if(Lh($.errorMessage))continue;let B=`${$.uri.toString()}
2675
- ${$.errorMessage??""}`;if(Q.add(B),this.pluginErrorToastKeys.has(B))continue;this.options.toastController.show(this.formatPluginErrorToast($),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter((B)=>B.status==="active").map((B)=>B.uri.toString())),$=[];for(let[B,E]of this.statusItems){if(Q.has(E.pluginURI))continue;$.push(B)}if($.length===0)return;this.updateStatusItemState(()=>{for(let B of $)this.statusItems.delete(B)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.context.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.context.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(E){S.error("Neo plugin command failed",{error:E,command:A}),this.options.toastController.show(E instanceof Error?E.message:String(E),"error",5000)}}}}showInputDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"input",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showConfirmDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(!1);return}let B={kind:"confirm",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showSelectDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"select",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),E={pluginURI:A,id:Q};if($!==void 0)E.value=$;this.statusItems.set(B,E)})};updateStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:$})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};readThreadMessages=(A,Q)=>{let $=this.options.readThreadMessages;if(!$)return Promise.reject(Error("thread.messages is not available - no active thread"));return $(A,Q)};readThreadTitle=(A)=>{let Q=this.options.readThreadTitle;if(!Q)return Promise.reject(Error("thread.title is not available - no active thread"));return Q(A)};subscribeThreadTitle=(A,Q)=>{let $=this.options.subscribeThreadTitle;if(!$)throw Error("thread.title.subscribe is not available - no active thread");return $(A,Q)};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[],this.resolvingDialog=null,this.emitBlockingConfirmDialogChange();for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.abortUnsubscribe(),A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}abortDialog(A){if(this.activeDialog===A){this.advanceDialog(),this.cancelDialog(A);return}let Q=this.queuedDialogs.indexOf(A);if(Q===-1)return;this.updateDialogState(()=>{this.queuedDialogs.splice(Q,1)}),this.cancelDialog(A)}enqueueDialog(A){if(this.activeDialog){if(this.queuedDialogs.push(A),this.resolvingDialog===this.activeDialog)this.advanceResolvingDialog(this.activeDialog);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A}),this.emitBlockingConfirmDialogChange()}resolveInputDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveConfirmDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveSelectDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveDialog(A,Q){if(this.activeDialog!==A||this.resolvingDialog===A)return;this.resolvingDialog=A,A.abortUnsubscribe(),Q(),this.scheduleResolvingDialogAdvance(A,Z$6)}scheduleResolvingDialogAdvance(A,Q){cQ.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"PluginIntegration.advanceDialog")}advanceResolvingDialog(A){if(this.resolvingDialog===A)this.resolvingDialog=null;if(this.activeDialog!==A)return;this.advanceDialog()}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A();this.emitBlockingConfirmDialogChange()}emitBlockingConfirmDialogChange(){let A=this.hasBlockingConfirmDialog();if(A===this.blockingConfirmDialog)return;this.blockingConfirmDialog=A,this.options.onBlockingConfirmDialogChange?.(A)}}a0();import{spawnSync as G$6}from"node:child_process";import X9 from"node:process";var IN4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function Ol(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else K1.instance.stop()}var V$6=M4("amp.relaunch",{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],defaultKey:X9.env.NODE_ENV==="development"&&X9.platform==="darwin"?"meta+r":void 0,status:{type:"enabled"},sortBoost:90},(A,{dismiss:Q})=>{Q(),Ol(A)});function GN4(A){return V$6.bind(A)}function K$6(A,Q){let{command:$,args:B}=z$6(A),E=X9.execve,D=X9.platform==="win32"||!E,J=D?"spawnSync":"execve";if(S.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:J}),D){let U=G$6($,B,{cwd:Q,env:X9.env,stdio:"inherit"});if(U.error)return S.error("Failed to relaunch Amp",{error:U.error}),1;return U.status??1}try{if(X9.chdir(Q),$.includes("/"))return E($,[$,...B],X9.env);return E("/usr/bin/env",["env",$,...B],X9.env)}catch(U){return S.error("Failed to relaunch Amp",{error:U}),1}}class Sg0{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{S.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return K$6(this.requestedThreadIDs,A)}}function z$6(A){let Q=A.length>0?["threads","continue",...A]:[],$=W$6(X9.argv),B=H$6();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let E=X9.argv[1],D=E&&C$6(E)?[E]:[];return{command:X9.execPath,args:[...D,...$,...Q]}}function W$6(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let E=$[B];if(!E?.startsWith("--"))continue;let[D,J]=E.split("=",2);if(!D)continue;let U=D.slice(2),Y=U.startsWith("no-")?U.slice(3):U;if(IN4.booleans.has(Y)){Q.push(E);continue}if(!IN4.options.has(U))continue;if(J!==void 0){Q.push(E);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(E,Z),B+=1}return Q}function C$6(A){return A!==X9.execPath&&!A.startsWith("/$bunfs/")}function H$6(){if(X9.env.NODE_ENV!=="development")return null;let A=X9.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=N$6(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function N$6(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every(($)=>typeof $==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var q$6=48;class kg0{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new ql({width:q$6,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keymapKey:"Ctrl+O",command:"amp: relaunch",confirmShortcut:"Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}import{readFile as O$6}from"node:fs/promises";import xg0 from"node:os";var w$6=["command","args","url","transport","_target"];function fg0(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function u$6(A){if(typeof A!=="string")return A;let Q=A.indexOf("?");return Q===-1?A:A.slice(0,Q)}function M$6(A){if(!fg0(A))return A;let Q={};for(let[$,B]of Object.entries(A)){if(!fg0(B)){Q[$]=B;continue}let E={};for(let D of w$6){if(!(D in B))continue;E[D]=D==="url"?u$6(B[D]):B[D]}Q[$]=E}return Q}function VN4(A){let Q=LO(A,[],{allowTrailingComma:!0});if(!fg0(Q))return qP(A);let $={...Q};for(let B of Object.keys($))if(B==="mcpServers"||B==="amp.mcpServers")$[B]=M$6($[B]);return qP(JSON.stringify($,null,2))}F$();function L$6(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function KN4(A,Q,$=qP){try{return{path:Q,contents:$(await O$6(A,"utf8"))}}catch{return null}}async function w80(A,Q){let $=[],B=L$6(),E=await L4.getThread({thread:Q},{config:A.configService}),D=E.ok?E.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(nD(D),null,2)});let J=await KN4(kP(Q),`${B}/logs/${Q}.log`);if(J)$.push(J);let U=await KN4(A.settingsFilePath,`${B}/settings/global.json`,VN4);if(U)$.push(U);let Y=await sY()??"unknown",Z=await L4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1780932011-gc0dbaf",clientOS:`${xg0.platform()} ${xg0.release()} ${xg0.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class yg0{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.backStack.pop();this.forwardStack.push(Q)}}}}var j$6=86400000;class bg0{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let $=(this.options.minimumOpenDurationMs??j$6)-(Date.now()-this.openedAt);if($>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},$),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>Ol(this.options))}}class gg0 extends A4{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((E)=>E.status.type!=="hidden"),$=P$6(Q),B="";return new D1({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:c0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new j5({items:Q,showBorder:!1,getLabel:(E)=>{let D=hg0(E);return E.keywords&&E.keywords.length>0?`${D} ${E.keywords.join(" ").toLowerCase()}`:D},onQueryChange:(E)=>{B=E},sortItems:(E,D,J)=>{B=J;let U=J.trim().toLowerCase();if(U===""){let V=E.item.status.type==="disabled"?1:0,K=D.item.status.type==="disabled"?1:0;if(V!==K)return V-K;let z=E.item.sortBoost??0,W=D.item.sortBoost??0;if(z!==W)return W-z;let C=E.item.noun?.toLowerCase()??"",H=D.item.noun?.toLowerCase()??"";if(C!==H)return C<H?-1:1;return 0}let Y=zN4(E.item,U),Z=zN4(D.item,U);if(Y!==Z)return Y?-1:1;let F=Nq(E.item.verb.toLowerCase(),J),X=Nq(D.item.verb.toLowerCase(),J);if(F!==X)return X-F;let I=Nq(hg0(E.item),J),G=Nq(hg0(D.item),J);if(I!==G)return G-I;return D.score-E.score},isItemDisabled:(E)=>E.status.type==="disabled",buildDisabledReasonWidget:(E,D)=>{if(E.status.type!=="disabled")return;let{colors:J}=e0.of(D);return new E0({text:new g(E.status.reason,new A0({color:J.mutedForeground,dim:!0})),textAlign:"center",maxLines:1,overflow:"ellipsis"})},renderItem:(E,D,J,U)=>new WN4({command:E,shortcuts:u80(E,this.props.keymapShortcuts),isSelected:D,isDisabled:J,categoryWidth:$,query:B,buildContext:U}),onAccept:(E)=>{this.props.onAccept(E)},onDismiss:this.props.onDismiss})})}}class WN4 extends A4{props;constructor(A){super();this.props=A}build(A){let{command:Q,shortcuts:$,isSelected:B,isDisabled:E,categoryWidth:D,query:J,buildContext:U}=this.props,Y=e0.of(U),{colors:Z,app:F}=Y,X=B?F.selectionBackground:void 0,I=B?F.selectionForeground:Z.foreground,G=B?I:Z.mutedForeground,V=new E0({text:new g(Q.noun?.toLowerCase()??"",new A0({color:G,dim:E||!B})),textAlign:"right",maxLines:1,overflow:"ellipsis"}),K=Q.verb.toLowerCase();if(E)K+=" (unavailable)";let z=R$6(Q,J);if(z)K+=` (alias: ${z})`;let W=new E0({text:new g(K,new A0({color:I,bold:!0,dim:E})),maxLines:1,overflow:"ellipsis"}),C=[{child:V,fixedWidth:D},{child:W,expanded:!0}];if($.length>0)C.push({child:T$6($,Y,E)});return new CN4({columns:C,padding:c0.horizontal(1),backgroundColor:X})}}function hg0(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function zN4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function R$6(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function P$6(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,OA($.noun)):Q},0)}function T$6(A,Q,$){let{app:B}=Q,E=new A0({color:B.keybind,bold:!0,dim:$}),D=[];for(let J=0;J<A.length;J++){if(J>0)D.push(new g(", ",E));D.push(new g(iN(A[J]),E))}return E0.spans(D)}class CN4 extends A4{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:E}=this.props,D=[];for(let U=0;U<Q.length;U++){let Y=Q[U];if(U>0&&$>0)D.push(new y0({width:$}));if(Y.fixedWidth!==void 0)D.push(new y0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)D.push(new j4({child:Y.child}));else D.push(Y.child)}let J=new RA({crossAxisAlignment:"start",children:D});if(!B&&!E)return J;return new VA({decoration:E?{color:E}:void 0,padding:B,child:J})}}class mg0{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#$(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#$()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q,$=new Oq,B=()=>{}){let E=this.findByID(A);if(!E||E.status.type!=="enabled")return!1;return E.run($,Q,B),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class sB extends sQ{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=sB.maybeOf(A);if(!Q)throw Error("No CommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(sB)?.commandRegistry??null}}function u80(A,Q){let $=A.id?Q.get(A.id)??[]:[];if(!A.shortcut)return $;return new Set(Array.from(Q.values()).flatMap((E)=>E.map((D)=>oc(D).toString()))).has(A.shortcut.toString())?$:[...$,A.shortcut]}class dg0 extends d0{keymapShortcuts;onDismiss;constructor(A){super();this.keymapShortcuts=A.keymapShortcuts??new Map,this.onDismiss=A.onDismiss}createState(){return new HN4}}class HN4 extends m0{modalStack=new Oq;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=sB.of(this.context);this.commandRegistry=A,A.addListener(this.onCommandsChanged)})}dispose(){this.commandRegistry?.removeListener(this.onCommandsChanged),this.commandRegistry=null,super.dispose()}onCommandsChanged=()=>{this.setState()};build(A){let Q=sB.of(A).commands,$=new gg0({commands:Q,keymapShortcuts:this.widget.keymapShortcuts,onAccept:(B)=>{B.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new tp({root:$,controller:this.modalStack})}}var NN4=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],qN4=[{description:"Page scroll",methods:[{keys:["Pg Up"]},{keys:["Pg Down"]}]},{description:"Half-page scroll",methods:[{input:"K",keys:["Alt"]},{input:"J",keys:["Alt"]}]},{description:"Mouse wheel scroll",methods:[{keys:["Mouse Wheel"]}]},{description:"Jump to first message",methods:[{keys:["Home"]}]},{description:"Jump to bottom of screen",methods:[{keys:["End"]}]},{description:"Navigate to previous messages",methods:[{keys:["Tab"]},{keys:["Shift","Tab"]}]}];class M80 extends A4{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=F4.of(A).size.width<50,B=[];for(let E of this.items){let[D,J]=this.renderRow(E),U;if($)U=new JA({crossAxisAlignment:"start",mainAxisSize:"min",children:[D,new mA({padding:c0.only({left:4}),child:J})]});else U=new RA({crossAxisAlignment:"start",children:[new j4({flex:1,child:D}),new y0({width:1}),new j4({flex:1,child:J})]});B.push(new mA({padding:c0.horizontal(6),child:U}))}return new JA({crossAxisAlignment:"start",mainAxisSize:"min",children:B})}}function wN4(A){let Q=[...A.keys];if(A.input)Q.push(A.input);return RX(Q.join("+"))}function O80(A){return A.replaceAll("Opt","Alt").replaceAll("Cmd","Meta").replaceAll("←","ArrowLeft").replaceAll("→","ArrowRight").replaceAll("↑","ArrowUp").replaceAll("↓","ArrowDown").replaceAll("Pg Up","PageUp").replaceAll("Pg Down","PageDown")}function v$6(A){let Q=wN4(A);return Q.includes("Ctrl/Cmd")?[O80(Q.replace("Ctrl/Cmd","Ctrl")),O80(Q.replace("Ctrl/Cmd","Cmd"))]:[O80(Q)]}class cg0 extends A4{commands;keymapShortcuts;onDismiss;constructor(A){super();this.commands=A.commands,this.keymapShortcuts=A.keymapShortcuts,this.onDismiss=A.onDismiss}build(A){let Q=e0.of(A),{colors:$,app:B}=Q,E=F4.of(A),D=new A0({color:$.secondary,bold:!0}),J=new A0({color:B.keybind}),U=new A0({color:B.command}),Y=new A0({color:$.foreground}),Z=Math.max(40,Math.min(80,E.size.width-4)),X=[...this.commands.filter((z)=>{let W=z.noun?.toLowerCase();return W!=="dev"&&W!=="debug"&&z.status.type!=="hidden"})].sort((z,W)=>{let C=(z.noun??"").toLowerCase(),H=(W.noun??"").toLowerCase(),N=C.localeCompare(H);if(N!==0)return N;return z.verb.toLowerCase().localeCompare(W.verb.toLowerCase())}),I=(z)=>{let W=z.methods.map((C)=>wN4(C)).join(", ");return[new E0({text:new g(W,J)}),new E0({text:new g(z.description,Y)})]},G=new Set(Array.from(this.keymapShortcuts.values()).flatMap((z)=>z.map((W)=>O80(iN(oc(W)))))),V=(z)=>z.flatMap((W)=>{let C=W.methods.filter((H)=>v$6(H).every((N)=>!G.has(N)));return C.length>0?[{...W,methods:C}]:[]}),K=new vB({autofocus:!0,child:new VA({constraints:new U4(Z,Z,0,Number.POSITIVE_INFINITY),child:new JA({crossAxisAlignment:"start",mainAxisSize:"min",children:[new mA({padding:c0.horizontal(2),child:new E0({text:new g(`Editor Shortcuts
2675
+ ${$.errorMessage??""}`;if(Q.add(B),this.pluginErrorToastKeys.has(B))continue;this.options.toastController.show(this.formatPluginErrorToast($),"error",8000)}this.pluginErrorToastKeys=Q}removeInactivePluginStatusItems(A){let Q=new Set(A.filter((B)=>B.status==="active").map((B)=>B.uri.toString())),$=[];for(let[B,E]of this.statusItems){if(Q.has(E.pluginURI))continue;$.push(B)}if($.length===0)return;this.updateStatusItemState(()=>{for(let B of $)this.statusItems.delete(B)})}formatPluginErrorToast(A){let Q=A.uri.toString();return`Plugin failed: ${Q.split("/").pop()??Q}. See logs: ${this.options.context.logFilePath}`}createPluginCommand(A){return{id:A.id,noun:A.category,verb:A.title,description:A.description??`Run plugin command ${A.category}: ${A.title}`,status:A.availability,run:async(Q,$,B)=>{B();try{await this.options.context.pluginService?.commands.execute(A.pluginName,A.id,{threadID:this.options.getActiveThreadID()})}catch(E){S.error("Neo plugin command failed",{error:E,command:A}),this.options.toastController.show(E instanceof Error?E.message:String(E),"error",5000)}}}}showInputDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"input",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showConfirmDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(!1);return}let B={kind:"confirm",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};showSelectDialog=(A,Q)=>{return new Promise(($)=>{if(this.disposed||!this.options.state.mounted||Q?.aborted){$(void 0);return}let B={kind:"select",options:A,resolve:$,abortUnsubscribe:()=>{}};B.abortUnsubscribe=iG(Q,()=>this.abortDialog(B)),this.enqueueDialog(B)})};createStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{let B=this.statusItemKey(A,Q),E={pluginURI:A,id:Q};if($!==void 0)E.value=$;this.statusItems.set(B,E)})};updateStatusItem=(A,Q,$)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.set(this.statusItemKey(A,Q),{pluginURI:A,id:Q,value:$})})};removeStatusItem=(A,Q)=>{if(this.disposed)return;this.updateStatusItemState(()=>{this.statusItems.delete(this.statusItemKey(A,Q))})};readThreadMessages=(A,Q)=>{let $=this.options.readThreadMessages;if(!$)return Promise.reject(Error("thread.messages is not available - no active thread"));return $(A,Q)};readThreadTitle=(A)=>{let Q=this.options.readThreadTitle;if(!Q)return Promise.reject(Error("thread.title is not available - no active thread"));return Q(A)};subscribeThreadTitle=(A,Q)=>{let $=this.options.subscribeThreadTitle;if(!$)throw Error("thread.title.subscribe is not available - no active thread");return $(A,Q)};updateStatusItemState(A){if(this.options.state.mounted)this.options.state.setState(A);else A()}statusItemKey(A,Q){return`${A}\x00${Q}`}cancelPendingDialogs(){let A=[];if(this.activeDialog)A.push(this.activeDialog);A.push(...this.queuedDialogs),this.activeDialog=null,this.queuedDialogs=[],this.resolvingDialog=null,this.emitBlockingConfirmDialogChange();for(let Q of A)this.cancelDialog(Q)}cancelDialog(A){switch(A.abortUnsubscribe(),A.kind){case"input":A.resolve(void 0);return;case"confirm":A.resolve(!1);return;case"select":A.resolve(void 0);return}}abortDialog(A){if(this.activeDialog===A){this.advanceDialog(),this.cancelDialog(A);return}let Q=this.queuedDialogs.indexOf(A);if(Q===-1)return;this.updateDialogState(()=>{this.queuedDialogs.splice(Q,1)}),this.cancelDialog(A)}enqueueDialog(A){if(this.activeDialog){if(this.queuedDialogs.push(A),this.resolvingDialog===this.activeDialog)this.advanceResolvingDialog(this.activeDialog);return}this.options.commandPalette.disable(),this.options.state.setState(()=>{this.activeDialog=A}),this.emitBlockingConfirmDialogChange()}resolveInputDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveConfirmDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveSelectDialog(A,Q){this.resolveDialog(A,()=>A.resolve(Q))}resolveDialog(A,Q){if(this.activeDialog!==A||this.resolvingDialog===A)return;this.resolvingDialog=A,A.abortUnsubscribe(),Q(),this.scheduleResolvingDialogAdvance(A,Z$6)}scheduleResolvingDialogAdvance(A,Q){cQ.instance.addPostFrameCallback(()=>{if(this.activeDialog!==A)return;if(this.queuedDialogs.length>0||Q<=1){this.advanceResolvingDialog(A);return}this.scheduleResolvingDialogAdvance(A,Q-1)},"PluginIntegration.advanceDialog")}advanceResolvingDialog(A){if(this.resolvingDialog===A)this.resolvingDialog=null;if(this.activeDialog!==A)return;this.advanceDialog()}advanceDialog(){this.updateDialogState(()=>{this.activeDialog=this.queuedDialogs.shift()??null})}updateDialogState(A){if(this.options.state.mounted)this.options.state.setState(A);else A();this.emitBlockingConfirmDialogChange()}emitBlockingConfirmDialogChange(){let A=this.hasBlockingConfirmDialog();if(A===this.blockingConfirmDialog)return;this.blockingConfirmDialog=A,this.options.onBlockingConfirmDialogChange?.(A)}}a0();import{spawnSync as G$6}from"node:child_process";import X9 from"node:process";var IN4={options:new Set(["settings-file","log-level","log-file","mcp-config"]),booleans:new Set(["color","dangerously-allow-all","ide","jetbrains","neo-orb","notifications"])};function Ol(A){let Q=A.getRelaunchThreadIDs();if(A.onRelaunchRequested?.(Q),A.stop)A.stop();else K1.instance.stop()}var V$6=M4("amp.relaunch",{noun:"amp",verb:"Relaunch (Quit & Reopen)",description:"Quit, reopen Amp, and resume active threads",keywords:["restart","update"],defaultKey:X9.env.NODE_ENV==="development"&&X9.platform==="darwin"?"meta+r":void 0,status:{type:"enabled"},sortBoost:90},(A,{dismiss:Q})=>{Q(),Ol(A)});function GN4(A){return V$6.bind(A)}function K$6(A,Q){let{command:$,args:B}=z$6(A),E=X9.execve,D=X9.platform==="win32"||!E,J=D?"spawnSync":"execve";if(S.info("Relaunching Amp; threads will be resumed",{threadIDs:A,relaunchMethod:J}),D){let U=G$6($,B,{cwd:Q,env:X9.env,stdio:"inherit"});if(U.error)return S.error("Failed to relaunch Amp",{error:U.error}),1;return U.status??1}try{if(X9.chdir(Q),$.includes("/"))return E($,[$,...B],X9.env);return E("/usr/bin/env",["env",$,...B],X9.env)}catch(U){return S.error("Failed to relaunch Amp",{error:U}),1}}class Sg0{relaunchRequested=!1;requestedThreadIDs=[];request=(A)=>{S.info("Relaunch requested; threads will be resumed",{threadIDs:A}),this.relaunchRequested=!0,this.requestedThreadIDs=A};get shouldShowExitSummary(){return!this.relaunchRequested}relaunchIfRequested(A){if(!this.relaunchRequested)return;return K$6(this.requestedThreadIDs,A)}}function z$6(A){let Q=A.length>0?["threads","continue",...A]:[],$=W$6(X9.argv),B=H$6();if(B)return{command:B.command,args:[...B.args,...$,...Q]};let E=X9.argv[1],D=E&&C$6(E)?[E]:[];return{command:X9.execPath,args:[...D,...$,...Q]}}function W$6(A){let Q=[],$=A.slice(2);for(let B=0;B<$.length;B+=1){let E=$[B];if(!E?.startsWith("--"))continue;let[D,J]=E.split("=",2);if(!D)continue;let U=D.slice(2),Y=U.startsWith("no-")?U.slice(3):U;if(IN4.booleans.has(Y)){Q.push(E);continue}if(!IN4.options.has(U))continue;if(J!==void 0){Q.push(E);continue}let Z=$[B+1];if(Z===void 0||Z.startsWith("--"))continue;Q.push(E,Z),B+=1}return Q}function C$6(A){return A!==X9.execPath&&!A.startsWith("/$bunfs/")}function H$6(){if(X9.env.NODE_ENV!=="development")return null;let A=X9.env.AMP_DEV_RELAUNCH_COMMAND?.trim();if(!A)return null;let Q=N$6(A),$=Q[0];if(!$)return null;return{command:$,args:Q.slice(1)}}function N$6(A){if(A.startsWith("["))try{let Q=JSON.parse(A);if(Array.isArray(Q)&&Q.every(($)=>typeof $==="string"))return Q}catch{return[]}return A.split(/\s+/).filter(Boolean)}var q$6=48;class kg0{visible=!1;onClick=void 0;listeners=new Set;show(A){this.visible=!0,this.onClick=A,this.notifyListeners()}activate(){this.onClick?.()}get isVisible(){return this.visible}dismiss(){this.visible=!1,this.onClick=void 0,this.notifyListeners()}addListener(A){this.listeners.add(A)}removeListener(A){this.listeners.delete(A)}buildComplexToast(){if(!this.visible||!this.onClick)return null;return new ql({width:q$6,title:"Relaunch to Update Amp",message:"Your threads will resume.",variant:"success",mouseBehavior:"click-anywhere",action:{keymapKey:"Ctrl+O",command:"amp: relaunch",confirmShortcut:"Enter",label:"relaunch",onAction:()=>this.activate()}})}notifyListeners(){for(let A of this.listeners)A()}}import{readFile as O$6}from"node:fs/promises";import xg0 from"node:os";var w$6=["command","args","url","transport","_target"];function fg0(A){return typeof A==="object"&&A!==null&&!Array.isArray(A)}function u$6(A){if(typeof A!=="string")return A;let Q=A.indexOf("?");return Q===-1?A:A.slice(0,Q)}function M$6(A){if(!fg0(A))return A;let Q={};for(let[$,B]of Object.entries(A)){if(!fg0(B)){Q[$]=B;continue}let E={};for(let D of w$6){if(!(D in B))continue;E[D]=D==="url"?u$6(B[D]):B[D]}Q[$]=E}return Q}function VN4(A){let Q=LO(A,[],{allowTrailingComma:!0});if(!fg0(Q))return qP(A);let $={...Q};for(let B of Object.keys($))if(B==="mcpServers"||B==="amp.mcpServers")$[B]=M$6($[B]);return qP(JSON.stringify($,null,2))}F$();function L$6(A=new Date){return A.toISOString().replaceAll("-","").replaceAll(":","").slice(0,15)+"Z"}async function KN4(A,Q,$=qP){try{return{path:Q,contents:$(await O$6(A,"utf8"))}}catch{return null}}async function w80(A,Q){let $=[],B=L$6(),E=await L4.getThread({thread:Q},{config:A.configService}),D=E.ok?E.result.thread.data:null;$.push({path:`${B}/thread.json`,contents:JSON.stringify(nD(D),null,2)});let J=await KN4(kP(Q),`${B}/logs/${Q}.log`);if(J)$.push(J);let U=await KN4(A.settingsFilePath,`${B}/settings/global.json`,VN4);if(U)$.push(U);let Y=await sY()??"unknown",Z=await L4.sendReport({threadID:Q,files:$,metadata:{clientVersion:"0.0.1780942552-g0295b6",clientOS:`${xg0.platform()} ${xg0.release()} ${xg0.arch()}`,installMethod:Y}},{config:A.configService});if(!Z.ok)throw Error(`Failed to submit report: ${Z.error.message}`);return Z.result.reportID}class yg0{backStack=[];forwardStack=[];canNavigateBack(){return this.backStack.length>0}canNavigateForward(){return this.forwardStack.length>0}recordNavigation(A){if(!A)return;this.backStack.push(A),this.forwardStack.length=0}startBackNavigation(A){let Q=this.backStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.forwardStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.forwardStack.pop();this.backStack.push(Q)}}}startForwardNavigation(A){let Q=this.forwardStack.pop();if(!Q)return null;let $=Boolean(A);if(A)this.backStack.push(A);return{targetThreadID:Q,rollback:()=>{if($)this.backStack.pop();this.forwardStack.push(Q)}}}}var j$6=86400000;class bg0{options;subscription=null;relaunchNotificationShown=!1;relaunchNotificationPending=!1;relaunchNotificationTimer=null;openedAt=Date.now();constructor(A){this.options=A}init(){if(this.subscription=this.options.updateService?.state.subscribe((A)=>{this.handleUpdateState(A)})??null,process.env.DEV_SHOW_RELAUNCH_NOTIF_ON_STARTUP==="1")this.showUpdateRelaunchNotification(!0)}dispose(){if(this.subscription?.unsubscribe(),this.subscription=null,this.relaunchNotificationTimer)clearTimeout(this.relaunchNotificationTimer),this.relaunchNotificationTimer=null}handleUpdateState(A){if(A!=="updated")return;this.showUpdateRelaunchNotification()}showUpdateRelaunchNotification(A=!1){if(this.relaunchNotificationShown)return;let $=(this.options.minimumOpenDurationMs??j$6)-(Date.now()-this.openedAt);if($>0&&!A){if(this.relaunchNotificationPending=!0,!this.relaunchNotificationTimer)this.relaunchNotificationTimer=setTimeout(()=>{if(this.relaunchNotificationTimer=null,!this.relaunchNotificationPending)return;this.relaunchNotificationPending=!1,this.showUpdateRelaunchNotification()},$),this.relaunchNotificationTimer.unref();return}this.relaunchNotificationPending=!1,this.relaunchNotificationShown=!0,this.options.relaunchNotificationController.show(()=>Ol(this.options))}}class gg0 extends A4{props;constructor(A){super();this.props=A}build(A){let Q=this.props.commands.filter((E)=>E.status.type!=="hidden"),$=P$6(Q),B="";return new D1({header:"Command Palette",autofocus:!1,barrierOpaque:!1,chromePadding:c0.only({left:1,top:1,right:1}),footer:"none",onDismiss:this.props.onDismiss,child:new j5({items:Q,showBorder:!1,getLabel:(E)=>{let D=hg0(E);return E.keywords&&E.keywords.length>0?`${D} ${E.keywords.join(" ").toLowerCase()}`:D},onQueryChange:(E)=>{B=E},sortItems:(E,D,J)=>{B=J;let U=J.trim().toLowerCase();if(U===""){let V=E.item.status.type==="disabled"?1:0,K=D.item.status.type==="disabled"?1:0;if(V!==K)return V-K;let z=E.item.sortBoost??0,W=D.item.sortBoost??0;if(z!==W)return W-z;let C=E.item.noun?.toLowerCase()??"",H=D.item.noun?.toLowerCase()??"";if(C!==H)return C<H?-1:1;return 0}let Y=zN4(E.item,U),Z=zN4(D.item,U);if(Y!==Z)return Y?-1:1;let F=Nq(E.item.verb.toLowerCase(),J),X=Nq(D.item.verb.toLowerCase(),J);if(F!==X)return X-F;let I=Nq(hg0(E.item),J),G=Nq(hg0(D.item),J);if(I!==G)return G-I;return D.score-E.score},isItemDisabled:(E)=>E.status.type==="disabled",buildDisabledReasonWidget:(E,D)=>{if(E.status.type!=="disabled")return;let{colors:J}=e0.of(D);return new E0({text:new g(E.status.reason,new A0({color:J.mutedForeground,dim:!0})),textAlign:"center",maxLines:1,overflow:"ellipsis"})},renderItem:(E,D,J,U)=>new WN4({command:E,shortcuts:u80(E,this.props.keymapShortcuts),isSelected:D,isDisabled:J,categoryWidth:$,query:B,buildContext:U}),onAccept:(E)=>{this.props.onAccept(E)},onDismiss:this.props.onDismiss})})}}class WN4 extends A4{props;constructor(A){super();this.props=A}build(A){let{command:Q,shortcuts:$,isSelected:B,isDisabled:E,categoryWidth:D,query:J,buildContext:U}=this.props,Y=e0.of(U),{colors:Z,app:F}=Y,X=B?F.selectionBackground:void 0,I=B?F.selectionForeground:Z.foreground,G=B?I:Z.mutedForeground,V=new E0({text:new g(Q.noun?.toLowerCase()??"",new A0({color:G,dim:E||!B})),textAlign:"right",maxLines:1,overflow:"ellipsis"}),K=Q.verb.toLowerCase();if(E)K+=" (unavailable)";let z=R$6(Q,J);if(z)K+=` (alias: ${z})`;let W=new E0({text:new g(K,new A0({color:I,bold:!0,dim:E})),maxLines:1,overflow:"ellipsis"}),C=[{child:V,fixedWidth:D},{child:W,expanded:!0}];if($.length>0)C.push({child:T$6($,Y,E)});return new CN4({columns:C,padding:c0.horizontal(1),backgroundColor:X})}}function hg0(A){return A.noun?`${A.noun.toLowerCase()} ${A.verb.toLowerCase()}`:A.verb.toLowerCase()}function zN4(A,Q){return A.keywords?.some(($)=>$.trim().toLowerCase()===Q)??!1}function R$6(A,Q){let $=Q.trim().toLowerCase();if($==="")return;return A.keywords?.find((B)=>B.trim().toLowerCase()===$)}function P$6(A){return A.reduce((Q,$)=>{return $.noun?Math.max(Q,OA($.noun)):Q},0)}function T$6(A,Q,$){let{app:B}=Q,E=new A0({color:B.keybind,bold:!0,dim:$}),D=[];for(let J=0;J<A.length;J++){if(J>0)D.push(new g(", ",E));D.push(new g(iN(A[J]),E))}return E0.spans(D)}class CN4 extends A4{props;constructor(A){super();this.props=A}build(A){let{columns:Q,gap:$=2,padding:B,backgroundColor:E}=this.props,D=[];for(let U=0;U<Q.length;U++){let Y=Q[U];if(U>0&&$>0)D.push(new y0({width:$}));if(Y.fixedWidth!==void 0)D.push(new y0({width:Y.fixedWidth,child:Y.child}));else if(Y.expanded)D.push(new j4({child:Y.child}));else D.push(Y.child)}let J=new RA({crossAxisAlignment:"start",children:D});if(!B&&!E)return J;return new VA({decoration:E?{color:E}:void 0,padding:B,child:J})}}class mg0{#A=[];#Q=new Set;get commands(){return this.#A}register(A){return this.#A.push(A),this.#$(),()=>{let Q=this.#A.indexOf(A);if(Q===-1)return;this.#A.splice(Q,1),this.#$()}}findByID(A){return this.#A.find((Q)=>Q.id===A)}runByID(A,Q,$=new Oq,B=()=>{}){let E=this.findByID(A);if(!E||E.status.type!=="enabled")return!1;return E.run($,Q,B),!0}addListener(A){this.#Q.add(A)}removeListener(A){this.#Q.delete(A)}#$(){for(let A of this.#Q)A()}}class sB extends sQ{commandRegistry;constructor({commandRegistry:A,child:Q}){super({child:Q});this.commandRegistry=A}updateShouldNotify(A){return!1}static of(A){let Q=sB.maybeOf(A);if(!Q)throw Error("No CommandRegistryProvider found in widget tree");return Q}static maybeOf(A){return A.dependOnInheritedWidgetOfExactType(sB)?.commandRegistry??null}}function u80(A,Q){let $=A.id?Q.get(A.id)??[]:[];if(!A.shortcut)return $;return new Set(Array.from(Q.values()).flatMap((E)=>E.map((D)=>oc(D).toString()))).has(A.shortcut.toString())?$:[...$,A.shortcut]}class dg0 extends d0{keymapShortcuts;onDismiss;constructor(A){super();this.keymapShortcuts=A.keymapShortcuts??new Map,this.onDismiss=A.onDismiss}createState(){return new HN4}}class HN4 extends m0{modalStack=new Oq;commandRegistry=null;initState(){super.initState(),queueMicrotask(()=>{if(!this.mounted)return;let A=sB.of(this.context);this.commandRegistry=A,A.addListener(this.onCommandsChanged)})}dispose(){this.commandRegistry?.removeListener(this.onCommandsChanged),this.commandRegistry=null,super.dispose()}onCommandsChanged=()=>{this.setState()};build(A){let Q=sB.of(A).commands,$=new gg0({commands:Q,keymapShortcuts:this.widget.keymapShortcuts,onAccept:(B)=>{B.run(this.modalStack,A,this.widget.onDismiss)},onDismiss:()=>{if(this.modalStack.canPop)this.modalStack.pop();else this.widget.onDismiss()}});return new tp({root:$,controller:this.modalStack})}}var NN4=[{description:"Move cursor up/down",methods:[{keys:["↑"]},{keys:["↓"]}]},{description:"Move cursor left/right",methods:[{keys:["←"]},{keys:["→"]},{input:"B",keys:["Ctrl"]},{input:"F",keys:["Ctrl"]}]},{description:"Insert newline",methods:[{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!0},{description:"Insert newline",methods:[{keys:["Enter"]},{keys:["Shift","Enter"]},{keys:["Alt","Enter"]},{input:"J",keys:["Ctrl"]}],submitOnEnterOnly:!1},{description:"Submit message",methods:[{keys:["Enter"]}],submitOnEnterOnly:!0},{description:"Submit message",methods:[{keys:["Ctrl/Cmd","Enter"]}],submitOnEnterOnly:!1},{description:"Clear input",methods:[{keys:["Escape"]}]},{description:"Edit prompt in $EDITOR",methods:[{input:"G",keys:["Ctrl"]}]},{description:"Navigate history (previous/next)",methods:[{input:"P",keys:["Ctrl"]},{input:"N",keys:["Ctrl"]}]},{description:"Jump to start of line",methods:[{keys:["Cmd","←"]},{input:"A",keys:["Ctrl"]}]},{description:"Jump to end of line",methods:[{keys:["Cmd","→"]},{input:"E",keys:["Ctrl"]}]},{description:"Jump to previous word",methods:[{keys:["Alt","←"]},{keys:["Ctrl","←"]},{input:"B",keys:["Alt"]}]},{description:"Jump to next word",methods:[{keys:["Alt","→"]},{keys:["Ctrl","→"]},{input:"F",keys:["Alt"]}]},{description:"Delete character backward",methods:[{keys:["Backspace"]},{input:"H",keys:["Ctrl"]}]},{description:"Delete word backward",methods:[{keys:["Alt","Backspace"]},{input:"W",keys:["Ctrl"]}]},{description:"Delete character forward",methods:[{keys:["Delete"]},{input:"D",keys:["Ctrl"]}]},{description:"Delete to start of line",methods:[{keys:["Cmd","Backspace"]},{input:"U",keys:["Ctrl"]}]},{description:"Delete to end of line",methods:[{input:"K",keys:["Ctrl"]}]},{description:"Yank (paste deleted text)",methods:[{input:"Y",keys:["Ctrl"]}]},{description:"Paste image from clipboard",methods:[{input:"V",keys:["Ctrl"]}]},{description:"Switch agent mode",methods:[{input:"S",keys:["Ctrl"]}]},{description:"Toggle reasoning effort",methods:[{input:"D",keys:["Alt"]}]},{description:"Open command palette",methods:[{input:"O",keys:["Ctrl"]}]},{description:"Mention files",methods:[{keys:["@"]}]},{description:"Mention threads",methods:[{keys:["@@"]}]},{description:"Show prompt history",methods:[{input:"R",keys:["Ctrl"]}]},{description:"Toggle inline shortcuts help",methods:[{keys:["?"]}]},{description:"Toggle thinking/dense view",methods:[{input:"T",keys:["Alt"]}]}],qN4=[{description:"Page scroll",methods:[{keys:["Pg Up"]},{keys:["Pg Down"]}]},{description:"Half-page scroll",methods:[{input:"K",keys:["Alt"]},{input:"J",keys:["Alt"]}]},{description:"Mouse wheel scroll",methods:[{keys:["Mouse Wheel"]}]},{description:"Jump to first message",methods:[{keys:["Home"]}]},{description:"Jump to bottom of screen",methods:[{keys:["End"]}]},{description:"Navigate to previous messages",methods:[{keys:["Tab"]},{keys:["Shift","Tab"]}]}];class M80 extends A4{items;renderRow;constructor({items:A,renderRow:Q}){super();this.items=A,this.renderRow=Q}build(A){let $=F4.of(A).size.width<50,B=[];for(let E of this.items){let[D,J]=this.renderRow(E),U;if($)U=new JA({crossAxisAlignment:"start",mainAxisSize:"min",children:[D,new mA({padding:c0.only({left:4}),child:J})]});else U=new RA({crossAxisAlignment:"start",children:[new j4({flex:1,child:D}),new y0({width:1}),new j4({flex:1,child:J})]});B.push(new mA({padding:c0.horizontal(6),child:U}))}return new JA({crossAxisAlignment:"start",mainAxisSize:"min",children:B})}}function wN4(A){let Q=[...A.keys];if(A.input)Q.push(A.input);return RX(Q.join("+"))}function O80(A){return A.replaceAll("Opt","Alt").replaceAll("Cmd","Meta").replaceAll("←","ArrowLeft").replaceAll("→","ArrowRight").replaceAll("↑","ArrowUp").replaceAll("↓","ArrowDown").replaceAll("Pg Up","PageUp").replaceAll("Pg Down","PageDown")}function v$6(A){let Q=wN4(A);return Q.includes("Ctrl/Cmd")?[O80(Q.replace("Ctrl/Cmd","Ctrl")),O80(Q.replace("Ctrl/Cmd","Cmd"))]:[O80(Q)]}class cg0 extends A4{commands;keymapShortcuts;onDismiss;constructor(A){super();this.commands=A.commands,this.keymapShortcuts=A.keymapShortcuts,this.onDismiss=A.onDismiss}build(A){let Q=e0.of(A),{colors:$,app:B}=Q,E=F4.of(A),D=new A0({color:$.secondary,bold:!0}),J=new A0({color:B.keybind}),U=new A0({color:B.command}),Y=new A0({color:$.foreground}),Z=Math.max(40,Math.min(80,E.size.width-4)),X=[...this.commands.filter((z)=>{let W=z.noun?.toLowerCase();return W!=="dev"&&W!=="debug"&&z.status.type!=="hidden"})].sort((z,W)=>{let C=(z.noun??"").toLowerCase(),H=(W.noun??"").toLowerCase(),N=C.localeCompare(H);if(N!==0)return N;return z.verb.toLowerCase().localeCompare(W.verb.toLowerCase())}),I=(z)=>{let W=z.methods.map((C)=>wN4(C)).join(", ");return[new E0({text:new g(W,J)}),new E0({text:new g(z.description,Y)})]},G=new Set(Array.from(this.keymapShortcuts.values()).flatMap((z)=>z.map((W)=>O80(iN(oc(W)))))),V=(z)=>z.flatMap((W)=>{let C=W.methods.filter((H)=>v$6(H).every((N)=>!G.has(N)));return C.length>0?[{...W,methods:C}]:[]}),K=new vB({autofocus:!0,child:new VA({constraints:new U4(Z,Z,0,Number.POSITIVE_INFINITY),child:new JA({crossAxisAlignment:"start",mainAxisSize:"min",children:[new mA({padding:c0.horizontal(2),child:new E0({text:new g(`Editor Shortcuts
2676
2676
  `,D)})}),new M80({items:V(NN4).filter((z)=>z.submitOnEnterOnly===void 0||z.submitOnEnterOnly===!0),renderRow:I}),new y0({height:1}),new mA({padding:c0.horizontal(2),child:new E0({text:new g(`Scrolling & Navigation
2677
2677
  `,D)})}),new M80({items:V(qN4),renderRow:I}),new y0({height:1}),new mA({padding:c0.horizontal(2),child:new E0({text:new g(`Command Palette Commands
2678
2678
  `,D)})}),new M80({items:X,renderRow:(z)=>{let W=z.noun?`${z.noun}: ${z.verb}`:z.verb,H=u80(z,this.keymapShortcuts).map(iN).join(", ");return[new E0({text:H?new g("",void 0,[new g(W,U),new g(` ${H}`,J)]):new g(W,U)}),new E0({text:new g(z.description,Y)})]}}),new y0({height:1})]})})});return new D1({header:"Amp CLI — Help & Keymap",minWidth:Z,maxWidth:Z,maxHeight:E.size.height,autofocus:!1,footer:[{keys:["Esc"],label:"close"},{keys:["↑↓","j/k"],label:"scroll"}],onDismiss:this.onDismiss,child:K})}}class zT extends sQ{completionBuilder;constructor({completionBuilder:A,child:Q}){super({child:Q});this.completionBuilder=A}updateShouldNotify(A){return!1}static of(A){let Q=A.dependOnInheritedWidgetOfExactType(zT);if(!Q)throw Error("No CompletionBuilderProvider found in widget tree");return Q.completionBuilder}}var _$6=250,S$6=2000;class pg0 extends d0{configReloadEvents;toastController;child;constructor(A){super();this.configReloadEvents=A.configReloadEvents,this.toastController=A.toastController,this.child=A.child}createState(){return new uN4}}class uN4 extends m0{subscription=null;toastTimer=null;pendingToastType=null;lastToast=null;initState(){this.subscribeToConfigReloadEvents()}didUpdateWidget(A){if(A.configReloadEvents===this.widget.configReloadEvents)return;this.clearPendingToast(),this.subscribeToConfigReloadEvents()}dispose(){this.subscription?.unsubscribe(),this.subscription=null,this.clearPendingToast(),super.dispose()}build(A){return this.widget.child}subscribeToConfigReloadEvents(){this.subscription?.unsubscribe(),this.subscription=this.widget.configReloadEvents.subscribe((A)=>{this.scheduleToast(A)})}scheduleToast(A){if(this.pendingToastType=k$6(this.pendingToastType,A),this.toastTimer)clearTimeout(this.toastTimer);this.toastTimer=setTimeout(()=>{if(!this.mounted)return;this.flushToast()},_$6),this.toastTimer.unref()}flushToast(){let A=this.pendingToastType;if(this.clearPendingToast(),!A)return;let Q=Date.now();if(f$6(this.lastToast,A,Q))return;this.lastToast={type:A,shownAt:Q},x$6(this.widget.toastController,A)}clearPendingToast(){if(this.toastTimer)clearTimeout(this.toastTimer),this.toastTimer=null;this.pendingToastType=null}}function k$6(A,Q){return A==="failed"||Q.type==="failed"?"failed":"succeeded"}function f$6(A,Q,$){return A?.type===Q&&$-A.shownAt<S$6}function x$6(A,Q){switch(Q){case"succeeded":A.show("Config reloaded","success",1500);break;case"failed":A.show("Config reload failed","error",5000);break}}class MQ extends sQ{context;constructor({context:A,child:Q}){super({child:Q});this.context=A}updateShouldNotify(A){return!1}static of(A){let Q=A.dependOnInheritedWidgetOfExactType(MQ);if(!Q)throw Error("No ContextProvider found in widget tree");return Q.context}}a0();c9();var j80=80,y$6=15,b$6=1,MN4=-j80,h$6=16,g$6=sy0(j80,j80);function ON4({ampURL:A,threadID:Q,logPath:$}){return[`Debug thread ${gG(new URL(A),Q).toString()} (cli log: ${$}). Start with the CLI log, actor logs, and Rivet DB/inspector as sources of truth. Read thread-actors/docs/debugging-actors.md and thread-actors/scripts/README.md. For dev, actor logs are in .amp/in/thread-actors.json.log; for staging/prod, logs are in gcloud.`,"","Problem: "].join(`
@@ -2807,7 +2807,7 @@ Ctrl-X, Y, Z to unlock`;if(this.widget.centerContent)H=this.widget.centerContent
2807
2807
  `));if(U.tools.length===0)J.push(new g(` └─ No tools available
2808
2808
  `,E));else for(let F of U.tools)O26(J,F,$);J.push(new g(`
2809
2809
  `))}return J}function O26(A,Q,$){let{colors:B,app:E}=$,D=L26(Q.status,$);if(A.push(new g(` ${D.icon} `,new A0({color:D.color}))),A.push(new g(Q.name,new A0({color:Q.status==="pending"?B.warning:E.command}))),Q.status==="pending")A.push(new g(" discovering...",new A0({color:B.foreground,dim:!0})));else if(Q.description)A.push(new g(` ${WL4(Q.description,50)}`,new A0({color:B.foreground,dim:!0})));if(Q.error)A.push(new g(` ${WL4(Q.error,40)}`,new A0({color:E.toolError})));A.push(new g(`
2810
- `))}function L26(A,Q){let{colors:$,app:B}=Q;switch(A){case"pending":return{icon:"◌",color:$.warning};case"registered":return{icon:"•",color:$.mutedForeground};case"failed":return{icon:"✗",color:B.toolError};case"duplicate":return{icon:"◇",color:$.warning};default:return{icon:"?",color:$.foreground}}}function WL4(A,Q){let $=A.replace(/\s+/g," ").trim();if(OA($)<=Q)return $;let B="...",E=OA(B);if(Q<=E)return o7(B,Q);return`${o7($,Q-E,!0,"")}${B}`}var yc0="https://ampcode.com/news/neo",bc0=[{title:"Meet the new Amp CLI",body:[]},{title:"Rebuilt From The Ground Up",body:["Same close-up terminal workflow. Completely different underneath."]},{title:"Just Keep Typing",body:["Context is summarized automatically at ~90%.","No handoff flow. No context percentage to babysit."]},{title:"Queueing and Steering",body:["Sending a message now queues by default instead of cancelling tools.","Use steering when you want the agent to see something sooner."]},{title:"Remote Control",body:["Start a thread in the CLI, then keep going from ampcode.com.","Watch live updates and queue follow-ups from any device."]},{title:"Customize Amp with Amp",body:[{text:"Amp now has a ",linkText:"complete plugin API",href:"https://ampcode.com/manual/plugin-api",textAfter:"."},"Add tools, commands, control UI, and hook into events."]},{title:"Permissions",body:[{text:"By default (when no ",highlightText:"amp.permissions",textAfterHighlight:" setting is present), Amp no longer asks for confirmation before running any tools and commands. And you can now implement your own custom permission logic with ",linkText:"plugins",href:"https://ampcode.com/manual/plugin-api",textAfter:"."}]},{title:null,body:["Check out the full news post for more:",{text:yc0,href:yc0}]}];function j26(A){return[{title:"Upgrade your Amp CLI",body:[{text:"This npm-based distribution of Amp CLI has been deprecated. To use the ",linkText:"new Amp CLI",href:yc0,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function R26(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var fT=50,lq=40,fc0=1000,P26=420,T26=760,v26=-250,_26=1100,g90=33,qL4=0.999,S26=2.1,k26=720,f26=420,PL4="Meet the new",TL4="Amp",vL4="CLI",hc0=eA(PL4).length,x26=eA(TL4).length,y26=eA(vL4).length,m90={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},wL4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},uL4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},ML4=[m90,wL4,uL4,m90,wL4,uL4,m90],b26=m90;class gc0 extends d0{onDismiss;onQuit;animationProgress;animationsEnabled;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.animationsEnabled=A.animationsEnabled??!0,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??R26(),this.introStages=this.variant==="npm-migration"?j26(this.binaryInstallCommand):bc0,this.dismissible=this.variant!=="npm-migration"}createState(){return new _L4}}class _L4 extends m0{startedAt=performance.now();animationTimer=null;stageTransitionTimer=null;firstStageTitleTimer=null;firstStageHintTimer=null;firstStageRevealTimer=null;firstStageTitleRevealStartedAt=null;firstStageHintRevealStartedAt=null;stageTransitionStartedAt=performance.now();animationStartProgress=0;animationTargetProgress=1;animationDurationMs=fc0;onAnimationComplete=null;animationProgress=0;introStage=0;previousIntroStage=null;stageTransitionProgress=1;stageTransitionDirection=1;firstStageTitleVisible=!1;firstStageHintVisible=!1;firstStageTitleRevealProgress=0;firstStageHintRevealProgress=0;dismissTimer=null;dismissStartedAt=performance.now();dismissProgress=0;isDismissing=!1;splashOrbGlow=new P5(42);initState(){super.initState(),this.startAnimationIfNeeded()}didUpdateWidget(A){if(super.didUpdateWidget(A),A.animationProgress!==this.widget.animationProgress||A.animationsEnabled!==this.widget.animationsEnabled)this.startAnimationIfNeeded()}dispose(){this.stopAnimation(),this.stopStageTransitionTimer(),this.stopFirstStageRevealTimers(),this.stopDismissAnimation(),super.dispose()}startAnimationIfNeeded(){if(this.stopAnimation(),this.stopFirstStageRevealTimers(),this.widget.animationProgress!==void 0){this.animationProgress=LE(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=qL4,this.firstStageHintVisible=this.animationProgress>=qL4,this.firstStageTitleRevealProgress=this.firstStageTitleVisible?1:0,this.firstStageHintRevealProgress=this.firstStageHintVisible?1:0;return}if(!this.widget.animationsEnabled){this.stopStageTransitionTimer(),this.stopDismissAnimation(),this.animationProgress=1,this.isDismissing=!1,this.dismissProgress=0,this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1,this.previousIntroStage=null,this.stageTransitionProgress=1;return}if(this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0,this.startProgressAnimation({from:0,to:1,durationMs:fc0,onComplete:()=>{if(!this.widget.dismissible)this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1})}}),this.widget.dismissible)this.startFirstStageRevealSequence()}startDismissAnimation(){if(this.isDismissing)return;if(!this.widget.animationsEnabled){this.widget.onDismiss();return}this.stopFirstStageRevealTimers(),this.stopStageTransitionTimer(),this.dismissStartedAt=performance.now(),this.setState(()=>{this.isDismissing=!0,this.dismissProgress=0}),this.dismissTimer=setInterval(()=>{let A=performance.now()-this.dismissStartedAt,Q=LE(A/T26);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},g90)}canNavigateIntroStage(){if(this.isDismissing)return!1;if(!this.firstStageHintVisible)return!1;if(this.introStage===0&&this.firstStageHintRevealProgress<1)return!1;return!0}advanceIntroStage(){if(!this.canNavigateIntroStage())return;if(this.isFinalIntroStage()){if(this.widget.dismissible)this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.widget.dismissible||!this.canNavigateIntroStage()||!this.isFinalIntroStage())return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.isFinalIntroStage())return;this.moveIntroStage(1)}goToPreviousIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<=0)return;this.moveIntroStage(-1)}isFinalIntroStage(){return this.introStage>=this.widget.introStages.length-1}moveIntroStage(A){let Q=this.introStage+A;if(this.stopStageTransitionTimer(),this.stageTransitionStartedAt=performance.now(),this.setState(()=>{this.previousIntroStage=this.introStage,this.introStage=Q,this.stageTransitionDirection=A}),this.widget.animationProgress!==void 0||!this.widget.animationsEnabled){this.setState(()=>{this.previousIntroStage=null,this.stageTransitionProgress=1});return}this.setState(()=>{this.stageTransitionProgress=0}),this.stageTransitionTimer=setInterval(()=>{let $=performance.now()-this.stageTransitionStartedAt,B=LE($/P26);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},g90)}startProgressAnimation({from:A,to:Q,durationMs:$,onComplete:B}){this.stopAnimation(),this.startedAt=performance.now(),this.animationStartProgress=A,this.animationTargetProgress=Q,this.animationDurationMs=$,this.onAnimationComplete=B,this.animationProgress=A,this.animationTimer=setInterval(()=>{let E=performance.now()-this.startedAt,D=LE(E/this.animationDurationMs),J=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*xT(D);if(this.setState(()=>{this.animationProgress=J}),D>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},g90)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null}stopStageTransitionTimer(){if(this.stageTransitionTimer)clearInterval(this.stageTransitionTimer),this.stageTransitionTimer=null}startFirstStageRevealSequence(){if(this.stopFirstStageRevealTimers(),!this.widget.animationsEnabled){this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1});return}this.setState(()=>{this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0});let A=Math.max(0,fc0+v26),Q=A+_26;this.firstStageTitleTimer=setTimeout(()=>{this.firstStageTitleRevealStartedAt=performance.now(),this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageTitleRevealProgress=0}),this.startFirstStageRevealTimer()},A),this.firstStageHintTimer=setTimeout(()=>{this.firstStageHintRevealStartedAt=performance.now(),this.setState(()=>{this.firstStageHintVisible=!0,this.firstStageHintRevealProgress=0}),this.startFirstStageRevealTimer()},Q)}startFirstStageRevealTimer(){if(this.firstStageRevealTimer)return;this.firstStageRevealTimer=setInterval(()=>{let A=performance.now(),Q=this.firstStageTitleRevealStartedAt?LE((A-this.firstStageTitleRevealStartedAt)/k26):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?LE((A-this.firstStageHintRevealStartedAt)/f26):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},g90)}stopFirstStageRevealTimers(){if(this.stopFirstStageRevealTimer(),this.firstStageTitleRevealStartedAt=null,this.firstStageHintRevealStartedAt=null,this.firstStageTitleTimer)clearTimeout(this.firstStageTitleTimer),this.firstStageTitleTimer=null;if(this.firstStageHintTimer)clearTimeout(this.firstStageHintTimer),this.firstStageHintTimer=null}stopFirstStageRevealTimer(){if(this.firstStageRevealTimer)clearInterval(this.firstStageRevealTimer),this.firstStageRevealTimer=null}stopDismissAnimation(){if(this.dismissTimer)clearInterval(this.dismissTimer),this.dismissTimer=null}currentOrbPalette(){let A=OL4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:LL4(OL4(this.previousIntroStage),A,xT(this.stageTransitionProgress));return this.dismissProgress>0?LL4(Q,b26,xT(this.dismissProgress)):Q}build(A){let Q=x4.of(A).colorScheme,$=e0.of(A),B=this.currentOrbPalette(),E=e7(1,"deep",B),D=F4.of(A).size,U=this.widget.animationProgress??this.animationProgress,Y=Math.max(D.width/fT,D.height/lq)*S26,Z=Y+(1-Y)*U,F=xT(this.dismissProgress),X=Math.max(fT,Math.round(fT*Z)),I=Math.max(lq,Math.round(lq*Z)),G=Math.round((D.width-X)/2),V=Math.round((D.height-I)/2),K=Math.max(0,Math.floor((D.width-fT)/2)),z=-Math.floor(lq/2),W=Math.round(G+(K-G)*U),C=Math.round(V+(z-V)*U),H=W+X/2,N=C+I/2,w=h26({dismissProgress:this.dismissProgress,easedDismissProgress:F,introOrbScale:Z,normalOrbCenterX:H,normalOrbCenterY:N,size:D}),u=Math.max(fT,Math.round(fT*w.orbScale)),L=Math.max(lq,Math.round(lq*w.orbScale)),R=w.orbCenterX,_=w.orbCenterY,v=Math.round(R-u/2),f=Math.round(_-L/2),h=Math.max(3,Math.min(D.height-5,Math.floor(lq/2)+2)),x=Math.max(h+3,D.height-3),P=w.textDissolveProgress,k=this.isFinalIntroStage()?w.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&P<1,d=c&&this.firstStageHintVisible,b=d&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),p=this.introStage===0?this.firstStageTitleRevealProgress:1,n=this.introStage===0?this.firstStageHintRevealProgress:1,a=Math.max(24,Math.min(74,D.width-4)),X0=Math.min(12,Math.max(8,D.height-h-6)),$0=Math.max(0,Math.floor((D.width-a)/2)),Z0=Math.max(0,Math.min(D.height-X0,Math.floor(D.height*0.55-X0/2))),v0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new yK({width:u,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new yK({width:u,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new E6({autofocus:!0,canRequestFocus:!0,debugLabel:"WelcomeTakeover",onKey:(J0)=>{if(J0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&J0.key==="c"&&J0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&J0.key==="q")return this.widget.onQuit?.(),"handled";if((J0.key===" "||J0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(J0.key==="Escape"||J0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(J0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(J0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new t1({fit:"expand",children:[new SL4({color:Q.background,dissolveProgress:k}),new t1({fit:"expand",children:[new oA({onClick:()=>{},child:y0.expand()}),new m1({left:v,top:f,width:u,height:L,child:v0}),...c?[new m1({left:$0,top:Z0,width:a,height:X0,child:m26({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:a,height:X0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:E,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:p,dissolveProgress:P,context:A})})]:[],...d?[...b?[new m1({left:$0,top:Math.max(0,x-1),width:a,height:1,child:new E0({text:n26({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:P}),textAlign:"center"})})]:[],new m1({left:$0,top:x,width:a,height:1,child:o26({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:n,dissolveProgress:P,context:A})})]:[]]})]})})}}class SL4 extends XB{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new kL4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class kL4 extends bA{color;dissolveProgress;constructor(A,Q){super();this.color=A,this.dissolveProgress=Q}update(A,Q){this.color=A,this.dissolveProgress=Q,this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;aA(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,$=0){let B=Math.floor(Q+this.offset.x),E=Math.floor($+this.offset.y),D=Math.floor(this.size.width),J=Math.floor(this.size.height),U={bg:this.color},Y=LE(this.dissolveProgress);if(Y<=0){A.fill(B,E,D,J," ",U);return}if(Y>=1)return;for(let Z=0;Z<J;Z++)for(let F=0;F<D;F++)if(!g26(F,Z,D,J,Y))A.fill(B+F,E+Z,1,1," ",U)}}function LE(A){return Math.min(1,Math.max(0,A))}function xT(A){return 1-(1-A)**3}function OL4(A){return ML4[A]??ML4[0]}function LL4(A,Q,$){return{primary:qq(A.primary,Q.primary,$),secondary:qq(A.secondary,Q.secondary,$)}}function h26({dismissProgress:A,easedDismissProgress:Q,introOrbScale:$,normalOrbCenterX:B,normalOrbCenterY:E,size:D}){return{orbScale:$+($*0.86-$)*Q,orbCenterX:B+(D.width*0.54-B)*Q,orbCenterY:E-D.height*0.44*Q,textDissolveProgress:LE(A/0.52),backdropDissolveProgress:xT(LE((A-0.12)/0.88))}}function g26(A,Q,$,B,E){let D=B<=1?0:Q/(B-1),J=fL4(A+Q*Math.max(1,$));return(1-D)*0.72+J*0.28<E}function m26({introStages:A,stage:Q,previousStage:$,progress:B,direction:E,width:D,height:J,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V}){if($===null||B>=1)return xc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V});let K=xT(B),z=E*Math.round((1-K)*D),W=-E*Math.round(K*D);return new Zq(new t1({fit:"expand",children:[new m1({left:W,top:0,width:D,height:J,child:xc0({introStages:A,stage:$,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:$===0?1:I,dissolveProgress:G,context:V})}),new m1({left:z,top:0,width:D,height:J,child:xc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V})})]}))}function xc0({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:E,link:D,keybind:J,titleRevealProgress:U,dissolveProgress:Y,context:Z}){let F=A[Q]??A[0]??bc0[0],X=new A0({color:E,bold:!0}),I=new A0({color:$}),G=A===bc0&&Q===0,V=[...F.title===null?[]:[new E0({text:G?d90(p26({progress:U,foreground:E,pulseColor:E}),Y):new g($8(F.title,Y),X),textAlign:"center"})],...F.body.length>0?[d26()]:[],...F.body.map((K)=>c26(K,I,B,D,J,Y,Z))];return new pQ({child:new mA({padding:c0.horizontal(1),child:new JA({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:V})})})}function d26(){return y0.height(1)}function c26(A,Q,$,B,E,D,J){if(typeof A==="string")return new E0({text:new g($8(A,D),Q),textAlign:"center"});if("codeBlock"in A)return new M5({onCopy:(U,Y)=>{if(Y)$Q.success(J,"Copied to clipboard",2000)},child:new JA({mainAxisSize:"min",children:A.codeBlock.map((U)=>new E0({text:new g($8(U,D),new A0({color:E})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let U=new E0({text:new g("",void 0,[new g($8(A.text,D),new A0({color:$,dim:!0})),new g($8(A.keybind,D,eA(A.text).length),new A0({color:E}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new pQ({child:new M5({child:U})});return U}if("highlightText"in A){let U=t$.createSpan(A.href,A.linkText,new A0({color:B,underline:!0})),Y=lX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(A.highlightText,new A0({color:E})),new g(A.textAfterHighlight,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{W$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new E0({text:d90(Z,D),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new JA({mainAxisSize:"min",children:[new E0({text:new g($8(A.text,D),Q),textAlign:"center"}),new pQ({child:new RA({mainAxisSize:"min",children:[t$.createWidget(J,A.href,$8(A.linkText,D),new A0({color:B,underline:!0})),new E0({text:new g($8(A.textAfter,D),Q)})]})})]});let U=t$.createSpan(A.href,A.linkText,new A0({color:B,underline:!0})),Y=lX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{W$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new E0({text:d90(Z,D),textAlign:"center"})}if(D>0)return new E0({text:new g($8(A.text,D),new A0({color:B,underline:!0})),textAlign:"center"});return new pQ({child:t$.createWidget(J,A.href,A.text,new A0({color:B,underline:!0}))})}function p26({progress:A,foreground:Q,pulseColor:$}){let B=new A0({color:Q,bold:!0}),E=new A0({color:i26({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new g("",void 0,[new g(l26(A).padEnd(hc0," "),B),new g(" ",B),new g(jL4(TL4,x26,A,0.72),B),new g(" ",B),new g(jL4(vL4,y26,A,0.88),E)])}function l26(A){let Q=eA(PL4),$=Math.min(hc0,Math.ceil(LE(A/0.62)*hc0));return Q.slice(0,$).join("")}function jL4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function i26({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=LE((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function n26({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new g($8(`${A}/${Q}`,B),new A0({color:$,dim:!0}))}function a26({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}){let J=new A0({color:B}),U=new A0({color:$,dim:!0}),Y=Q?A?"Enter":"Space":"Esc",Z=Q?A?" to get started":" to continue":" to quit",F="",X="",I=`${Z}`;if(!Q)return new g("",void 0,[new g(Y,J),new g(Z,U),new g("",J),new g("",U)]);let G=RL4(Y,E),V=RL4(I,LE((E*(eA(Y).length+eA(I).length)-eA(Y).length)/eA(I).length));return new g("",void 0,[new g($8(G,D),J),new g($8(V.slice(0,Z.length),D),U),new g($8(V.slice(Z.length,Z.length+0),D),J),new g($8(V.slice(Z.length+0),D),U)])}function o26({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D,context:J}){if(Q)return new E0({text:a26({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}),textAlign:"center"});let U=new A0({color:B}),Y=new A0({color:$,dim:!0});return new M5({onCopy:(Z,F)=>{if(F)$Q.success(J,"Copied to clipboard",2000)},child:new E0({text:new g("",void 0,[new g("q",U),new g(" to quit",Y)]),textAlign:"center",selectable:!0})})}function RL4(A,Q){let $=eA(A),B=Math.min($.length,Math.ceil(LE(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function d90(A,Q,$=0){if(Q<=0)return A;let B=$+eA(A.text??"").length,E=A.children?.map((D)=>{let J=d90(D,Q,B);return B+=eA(D.toPlainText()).length,J});return new g(A.text?$8(A.text,Q,$):A.text,A.style,E,A.hyperlink,A.onClick)}function $8(A,Q,$=0){if(Q<=0)return A;return eA(A).map((E,D)=>{if(E.trim()==="")return E;return fL4($+D)<Q?" ":E}).join("")}function fL4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}function s26(A){let $=A.observer.protocolMessages().filter((B)=>B.role==="assistant").at(-1);if(!$)return null;return $.content.filter((B)=>B.type==="text").map((B)=>B.text).join("")}function xL4(A){A.client.cancelAgentLoop().catch((Q)=>{S.warn("Failed to cancel plugin agent run",{error:Q})})}function t26(A,Q={}){return new Promise(($,B)=>{if(Q.signal?.aborted){xL4(A),B(Error("Agent run cancelled"));return}let E=!1,D=null,J=setTimeout(()=>{D?.(),Y.unsubscribe(),B(Error("Timed out waiting for agent response"))},Q.timeoutMs??600000),U=()=>{clearTimeout(J),Y.unsubscribe(),xL4(A),B(Error("Agent run cancelled"))};if(Q.signal!==void 0)Q.signal.addEventListener("abort",U,{once:!0}),D=()=>Q.signal?.removeEventListener("abort",U);let Y=A.observer.agentState().subscribe((Z)=>{if(g3(Z)){E=!0;return}if(!E)return;let F=s26(A);if(F===null)return;clearTimeout(J),D?.(),Y.unsubscribe(),$(F)})})}var e26=M4("thread.switch",{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100},(A,{controller:Q,dismiss:$})=>{Q.pushWithDismiss((B)=>Rd0({activeThreadID:A.getActiveThreadID(),loadThreads:A.loadThreads,loadThreadTail:A.appContext.loadThreadTail,onSelectThread:A.onSwitchThread,onDismiss:B,onThreadSelected:$}))}),AU6=M4("thread.switchToPrevious",{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],status:(A)=>A.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},(A,{dismiss:Q})=>{A.navigateBack(),Q()}),QU6=M4("thread.switchToNext",{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],status:(A)=>A.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},(A,{dismiss:Q})=>{A.navigateForward(),Q()}),$U6=M4("thread.archiveInactive",{noun:null,verb:"Archive Inactive Threads Older than 72h",description:"Archive inactive threads older than 72h",status:{type:"enabled"}},async(A,{context:Q,dismiss:$})=>{let B=$Q.maybeOf(Q),E=await A.archiveInactiveThreads();if($(),E)B?.show(E.message,"error")}),BU6=M4("mcp.info",{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"}},(A,{controller:Q,dismiss:$})=>{Q.push(new um0({mcpServers:A.appContext.mcpServers,onDismiss:$}))}),EU6=M4("toolbox.list",{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"}},(A,{controller:Q})=>{Q.pushWithDismiss(($)=>new kc0({toolboxes:A.appContext.toolboxes,onDismiss:$}))}),DU6=M4("news.open",{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"}},async(A,{context:Q,dismiss:$})=>{try{await W$(Q,"https://ampcode.com/chronicle")}finally{$()}}),JU6=M4("settings.openInEditor",{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"}},(A)=>{qK(A.appContext.settingsFilePath).catch((Q)=>{S.error("Failed to open settings file in editor",{error:Q})})}),UU6=M4("ide.connect",{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"}},(A,{controller:Q,dismiss:$})=>{Q.pushWithDismiss((B)=>new wm0({onCancel:B,onSelect:(E)=>{A.handleIdeSelection(E),$()}}))}),YU6=M4("amp.help",{noun:"amp",verb:"help",description:"Show help & keymaps",keywords:["manual","?"],status:{type:"enabled"}},(A,{controller:Q,context:$,dismiss:B})=>{Q.push(new cg0({commands:sB.of($).commands,keymapShortcuts:A.getKeymapShortcuts(),onDismiss:B}))}),ZU6=M4("amp.showWelcome",{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"}},(A,{dismiss:Q})=>{Q(),A.showWelcome()}),FU6=M4("amp.endCredits",{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"}},(A,{dismiss:Q})=>{Q(),A.showEndCredits()}),XU6=M4("amp.showVersion",{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"}},(A,{controller:Q,dismiss:$})=>{Q.push(new D1({header:"Amp Version",maxWidth:72,onDismiss:$,child:new E0({text:new g(Z50({version:"0.0.1780932011-gc0dbaf",buildTimestamp:"2026-06-08T15:25:00.456Z",buildType:"release"}))})}))}),IU6=M4("amp.quit",{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],status:{type:"enabled"}},(A,{context:Q})=>{N4.maybeInvoke(Q,new TK)});class mc0 extends d0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showWelcome;welcomeVariant;onWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;observeThreadSummaries;openThreadPickerOnStart;workspaceSettingsFilePath;context;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showWelcome=A.showWelcome??!1,this.welcomeVariant=A.welcomeVariant??"intro",this.onWelcomeDismissed=A.onWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.observeThreadSummaries=A.observeThreadSummaries,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.context=A.context}createState(){return new bL4}}class bL4 extends m0{editorController=new EZ;commandPalette=new gy0(this);commandRegistry=new mg0;keymapCommandRunner=new Ih0(this.commandRegistry,()=>this.context);toastController=new oy0;relaunchNotificationController=new kg0;exitHintTimer=new Kp(this,1000);ideStatus=new c3(this,{});threadNavigationHistory=new yg0;appShortcutManager=new ac;keymapController=new Dy0({runCommand:(A)=>this.keymapCommandRunner.run(A),getCommandDescription:(A)=>{let Q=this.commandRegistry.findByID(A);return Q?.status.type==="enabled"?Q.description:null},onBindingsChange:()=>{if(this.syncAppShortcutManager(),this.mounted)this.setState()},onHintChange:()=>{if(this.mounted)this.setState()}});draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;welcomeVisible=!1;endCreditsVisible=!1;invadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new kl;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;editorFocusNode=new a7({debugLabel:"EditorPanel"});loadThreads=async()=>{return this.widget.context.listThreads()};focusEditor=()=>{this.editorFocusNode.requestFocus()};focusEditorAfterNextFrame(){cQ.instance.addPostFrameCallback(()=>{if(!this.mounted)return;this.focusEditor()},"Neo focus editor")}analyzeContextForThread=async(A,Q)=>{return AI4({ampURL:this.widget.context.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};onSelectSidebarThread=async(A)=>{this.focusEditor(),await this.onSwitchThread(A)};threadListSidebar=new Sc0({state:this,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.context.workspaceRoot,loadThreads:this.loadThreads,observeThreadSummaries:()=>this.widget.observeThreadSummaries(),archiveThread:(A)=>this.archiveThread(A),onSelectThread:this.onSelectSidebarThread,focusMainContent:this.focusEditor,getInitialVisible:()=>this.widget.context.threadListSidebarVisible});sendFeedbackReport=async(A)=>w80({configService:this.widget.configService,settingsFilePath:this.widget.context.settingsFilePath},A);archiveThread=async(A)=>{let Q=await hz4({configService:this.widget.configService},A);if(Q===null){let $=this.activeThreadContext?.client.getThreadId()??null;if(this.widget.clientPool.disconnectThread(A),this.widget.onThreadArchived?.(A),$===A)this.startNewDraftThread()}return Q};archiveInactiveThreads=async()=>{let A=await gz4({configService:this.widget.configService});if(A instanceof Error)return A;let Q=this.activeThreadContext?.client.getThreadId()??null;for(let $ of A.threadIDs)this.widget.clientPool.disconnectThread($),this.widget.onThreadArchived?.($);if(Q&&A.threadIDs.includes(Q))this.startNewDraftThread();return this.toastController.show(`Archived ${A.archivedCount} ${Y1(A.archivedCount,"thread")}`),null};addThreadLabel=async(A,Q)=>{let $=await bW4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await hW4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(jX.getInstance().interceptConsole(),this.invadersHighScore=this.widget.context.invadersHighScore??0,this.syncAppShortcutManager(),this.keymapController.connect(($)=>K1.instance.addKeyInterceptor($,{position:"front"})),this.notices=new Wg0(this.widget.configService,($)=>this.setState($)),cQ.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showWelcome)this.welcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(S.error("Neo failed to connect to thread",{threadID:$,error:B}),!$)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe(($)=>{this.keymapController.sync($.settings.keymap??{}),this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(j00($.settings)))}),this.updateRelaunchIntegration=new bg0({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let $={};if(A)$.initialUserInput=A;this.connectToInitialThreads(Q,$)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.context.sessionAgentMode);this.pluginIntegration=new _g0({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,context:this.widget.context,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,readThreadMessages:this.readPluginThreadMessages,readThreadTitle:this.readPluginThreadTitle,subscribeThreadTitle:this.subscribePluginThreadTitle,runAgent:this.runPluginAgent,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new Vh0({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=K1.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}createCommands(){let A={appContext:this.widget.context,archiveInactiveThreads:this.archiveInactiveThreads,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSwitchThread:this.onSwitchThread,canNavigateBack:()=>this.threadNavigationHistory.canNavigateBack(),canNavigateForward:()=>this.threadNavigationHistory.canNavigateForward(),navigateBack:()=>this.navigateBack(),navigateForward:()=>this.navigateForward(),handleIdeSelection:this.handleIdeSelection,getKeymapShortcuts:()=>this.keymapController.getShortcuts(),showWelcome:()=>this.showWelcome(),showEndCredits:()=>this.showEndCredits()},Q=this.widget.context.pluginService?DN4({pluginService:this.widget.context.pluginService,workspaceRoot:this.widget.context.workspaceRoot,logFilePath:this.widget.context.logFilePath,toastController:this.toastController}):[];return[GN4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),e26.bind(A),...this.threadListSidebar.commands(),AU6.bind(A),$U6.bind(A),Uw4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),QU6.bind(A),BU6.bind(A),EU6.bind(A),DU6.bind(A),JU6.bind(A),UU6.bind(A),YU6.bind(A),ZU6.bind(A),FU6.bind(A),XU6.bind(A),IU6.bind(A),...Q,...kW4(this.widget.context.logFilePath)]}registerAppCommands(){let Q=this.createCommands().map(($)=>this.commandRegistry.register($));return()=>{for(let $ of Q)$()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,E=new jc0({initialAgentMode:this.widget.context.sessionAgentMode,initialPluginAgentModeKey:this.widget.context.initialPluginAgentModeKey,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,editorFocusNode:this.editorFocusNode,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:$,statusItems:this.pluginIntegration?.getStatusItems()??[],pluginConfirmationBlocked:this.pluginIntegration?.hasBlockingConfirmDialog()??!1,notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.welcomeVisible?null:B,onDismissNotice:(V)=>this.notices.dismiss(V)}),D=F4.of(A),J=D.capabilities.animationSupport!=="disabled",U=this.threadListSidebar.visibleWidth(),Y=Math.max(0,D.size.width-U),F=[new VA({constraints:U4.tight(D.size.width,D.size.height),child:this.threadListSidebar.buildBody(E)})];if(this.commandPalette.isEnabled())F.push(new E6({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new dg0({keymapShortcuts:this.keymapController.getShortcuts(),onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.welcomeVisible)F.push(Rd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.welcomeVisible)F.push(new E6({debugLabel:"WelcomeDialogOverlay",child:new gc0({onDismiss:this.dismissWelcome,onQuit:()=>K1.instance.stop(),animationsEnabled:J,variant:this.widget.welcomeVariant})}));let X=this.executorAlreadyConnectedDialog;if(X)F.push(new E6({debugLabel:"ExecutorAlreadyConnectedDialogOverlay",child:new Hm0({details:X.details,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(F.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),F.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.context.isInternalUser)F.push(new lg0({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:c90.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,observerSnapshot$:this.activeThreadContext?.observer.observerSnapshot()??null}));if(this.focusDebugVisible)F.push(new Nm0);if(this.endCreditsVisible)F.push(new Gm0({onComplete:this.completeEndCredits,highScore:this.invadersHighScore,onHighScoreChange:this.updateInvadersHighScore}));let I=this.keymapController.getHint(),G=k70(this.exitHintTimer.isActive()?{key:"Ctrl+C",description:"confirm quit",showCancelHint:!1}:I?{key:I.leader,description:"...",options:I.options}:null);if(G)F.push(G);return new MQ({context:this.widget.context,child:new sB({commandRegistry:this.commandRegistry,child:new zT({completionBuilder:this.widget.completionBuilder,child:new $Q({controller:this.toastController,child:new N4({actions:this.buildActions(),child:new rQ({debugLabel:"AppShortcuts",shortcuts:this.buildShortcuts(),manager:this.appShortcutManager,child:this.keymapCommandRunner.captureContext(new VQ({debugLabel:"AppShellFocus",canRequestFocus:!1,skipTraversal:!0,child:new ry0({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.welcomeVisible?[this.notices]:[]],child:new pg0({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new wq({left:U,width:Y,child:this.keymapCommandRunner.buildModalStack(new t1({children:F}))})})})}))})})})})})})}buildShortcuts(){let A=new Map,Q=new Set,$=(E,D)=>{A.set(E,D),Q.add(E.toString())},B=(E,D)=>{if(Q.has(E.toString()))return;$(E,D)};for(let E of this.keymapController.getBindings())if(E.activator instanceof wA)$(E.activator,new u70(E.commandID));B(wA.ctrl("c"),new N70),B(wA.ctrl("o"),new w70),B(wA.alt("i"),new O70),B(wA.alt("p"),new cc),B(wA.ctrl("."),new R70),B(wA.ctrl("t"),new v70);for(let[E,D]of this.threadListSidebar.shortcutEntries())B(E,D);if(c90.env.NODE_ENV==="development"&&c90.platform==="darwin")B(wA.meta("r"),new q70);return A}syncAppShortcutManager(){for(let A of this.appShortcutManager.getAllShortcuts().keys())this.appShortcutManager.removeShortcut(A);for(let[A,Q]of this.buildShortcuts())this.appShortcutManager.addShortcut(A,Q)}buildActions(){let A=new cA(()=>{if(b2.hasAnyCopyableSelection())return b2.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new cA(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new cA(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new cA((G)=>{return this.keymapCommandRunner.run(G.commandID)?"handled":"ignored"}),E=new cA(()=>{return this.startNewDraftThread(),"handled"}),D=new cA(()=>{return K1.instance.stop(),"handled"}),J=new cA(()=>{return Ol({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),U=new cA((G)=>{if(!G.text)return"ignored";return K1.instance.tuiInstance.clipboard.writeText(G.text).then((V)=>{if(V.ok)this.toastController.show(G.successMessage,"success",2000);else this.toastController.show(`${G.failureMessage}: ${V.userFacingErrorMessage}`,"error",4000)}).catch((V)=>{S.error("Failed to copy Neo text to clipboard",{error:V}),this.toastController.show(G.failureMessage,"error",2000)}),"handled"}),Y=new cA(()=>{return K1.instance.toggleFrameStatsOverlay(),"handled"}),Z=new cA(()=>this.notices.dismissCurrent()?"handled":"ignored"),F=new cA(()=>{if(!this.widget.context.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),X=LN4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,context:this.widget.context,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),I=new cA(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[N70,A],[uq,E],[TK,D],[q70,J],[IB,U],[sp,$],[u70,B],[w70,Q],[O70,F],...this.threadListSidebar.actionEntries(),[R70,Z],...X,[cc,Y],[v70,I]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.cancelOwnerUIRequests(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),this.syncEmptyThreadPluginConfirmationTitle(),A.prompt!==void 0)this.editorController.text=A.prompt;this.focusEditorAfterNextFrame()}syncEmptyThreadPluginConfirmationTitle=()=>{this.emptyThreadTerminalTitleController.setPluginConfirmationBlocked(this.activeThreadContext===null&&(this.pluginIntegration?.hasBlockingConfirmDialog()??!1))};closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await bP(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){S.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.context.sessionAgentMode,$=A,B=nN(Q),E=E50(this.widget.context,Q);if(B!==void 0&&E!==void 0)$={...$,[B]:E};return $50($,{agentMode:Q,explicitEffort:this.widget.context.explicitReasoningEffort,sessionState:this.widget.context})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=yL4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(g9(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=yL4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(PK);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),K1.instance.stop();else this.exitHintTimer.activate()};dismissWelcome=()=>{if(!this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!1}),this.widget.onWelcomeDismissed?.()};updateInvadersHighScore=(A)=>{if(A<=this.invadersHighScore)return;this.setState(()=>{this.invadersHighScore=A}),eD((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{S.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showWelcome=()=>{if(this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!0})};showEndCredits=()=>{if(this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!0})};completeEndCredits=()=>{if(!this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!1})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={details:{existingExecutorInfo:A.existingExecutorInfo,existingExecutorURL:this.executorAlreadyConnectedURL(A.existingExecutorInfo)},resolve:($)=>{Q($==="watch"?"observe":"disconnect")}}})})}executorAlreadyConnectedURL(A){if(A?.executorType!=="sandbox")return null;let Q=this.connectingToThreadID??this.activeThreadContext?.client.getThreadId()??null;if(!Q)return null;return`${this.widget.context.ampURL.replace(/\/$/,"")}/threads/${Q}`}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")K1.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1}),this.focusEditorAfterNextFrame()};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B,E,D)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),U=A.find(C00);if(U)this.widget.history.add(U.text,c90.cwd()),this.widget.history.reset();let Y=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),Z=$??Y??null,F=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,Z??void 0,E,D);if(this.sendUserMessage(F,A,E?void 0:Q,E?void 0:B),!E)this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings);this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(F)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.context.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.context.lastReasoningEffortByMode={...this.widget.context.lastReasoningEffortByMode??{},[A]:$};let B=nN(A),E=B?Q[B]:void 0;if(E!==void 0)this.widget.context.lastSpeedByMode={...this.widget.context.lastSpeedByMode??{},[A]:E};eD((D)=>{let J={...D,agentMode:A};if($!==void 0)J={...J,lastReasoningEffortByMode:{...J.lastReasoningEffortByMode??{},[A]:$}};if(E!==void 0)J={...J,lastSpeedByMode:{...J.lastSpeedByMode??{},[A]:E}};return J}).catch((D)=>{S.warn("Failed to persist Neo session defaults for new message",{error:D instanceof Error?D.message:String(D)})})}sendUserMessage(A,Q,$,B,E){let D=A50(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let $ of this.widget.clientPool.activeThreadIDs)A.add($);return[...A]};appendPluginMessagesToThread=async(A,Q,$)=>{let B=this.activeThreadContext;if(!B){if(Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}throw Error("appendToThread is not available - no active thread")}let E=B.client.getThreadId();if(Q&&E!==Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}for(let D of A)this.sendUserMessage(B,[{type:"text",text:D.content}],void 0,void 0,$)};readPluginThreadMessages=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.messages is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.messages is only available for the active thread");return PoA(ToA($.observer.protocolMessages()),A)};readPluginThreadTitle=async(A)=>{let Q=this.activeThreadContext;if(!Q)throw Error("thread.title is not available - no active thread");let $=Q.client.getThreadId();if(A&&$!==A)throw Error("thread.title is only available for the active thread");return Q.observer.title().getValue()??null};subscribePluginThreadTitle=(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.title.subscribe is not available - no active thread");let B=$.client.getThreadId();if(A&&B!==A)throw Error("thread.title.subscribe is only available for the active thread");return $.observer.title().subscribe((E)=>{Q.next(E??null)})};runPluginAgent=async(A,Q,$)=>{await this.ensureDraftThreadSettingsInitialized();let B=this.widget.clientPool.createNewThread(this.widget.context.sessionAgentMode,this.draftThreadSettings,void 0,A,Q.agentModeDisplay,Q.parentThreadID,{trackAsLastActive:!1,executorClientID:iY.parse(`neo-subagent-${r26()}`)});this.sendUserMessage(B,[{type:"text",text:Q.message}]);try{let E=await t26(B,{timeoutMs:Q.timeoutMs,signal:$}),D=B.client.getThreadId();return D?{threadID:D,text:E}:{text:E}}finally{this.widget.clientPool.disconnect(B)}};async connectToExistingThread(A,Q={}){let $=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let B=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:(E)=>this.promptExecutorAlreadyConnected(E)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(S.error("Failed to load thread",{error:B,threadID:A}),this.toastController.show(`Failed to load ${A}: ${B instanceof Error?B.message:String(B)}`,"error",4000),Q.rethrowError)throw B}finally{this.setState(()=>{this.connectingToThreadID=null})}}async connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let $=this.widget.initialThreadIDs.filter((B)=>B!==A);await Promise.all($.map((B)=>this.resumeBackgroundThread(B)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){S.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q,agentModeDisplay:$}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q,agentModeDisplay:$}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage(B,(E)=>{A.sendPluginMessage(E)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...B]}}},(E)=>{A.sendPluginMessage(E)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){S.error("Failed to connect to IDE",{error:Q});let $=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${$}`,"error",4000)}};dispose(){if(this.keymapController.dispose(),this.keymapCommandRunner.dispose(),this.unregisterCommands?.(),this.unregisterCommands=null,this.threadListSidebar.dispose(),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.emptyThreadTerminalTitleController.dispose(),this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),this.editorFocusNode.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.welcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function yL4(A,Q,$){let B={...A};for(let E of GU6(Q,$)){if(!g9(A[E],Q[E]))continue;let D=$[E];if(D===void 0)delete B[E];else B[E]=D}return B}function GU6(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}function hL4(){return tX4()}function CU6(A,Q){let $=HU6(A,Q),B=new Map(A.map((J)=>[J.id,J.description])),E=Object.entries($),D=E.map(([J,U],Y)=>{let Z=Y===E.length-1?"":",",F=` ${JSON.stringify(J)}: ${JSON.stringify(U)}${Z}`,I=` // ${(J==="leader"?"Leader key for <leader> shortcuts":B.get(J)??"Configured, not discovered").replaceAll(/[\r\n\u2028\u2029]/g," ")}`;return U===null?R0.dim(F+I):F+R0.dim(I)});return D.unshift("{"),D.push("}"),D.join(`
2810
+ `))}function L26(A,Q){let{colors:$,app:B}=Q;switch(A){case"pending":return{icon:"◌",color:$.warning};case"registered":return{icon:"•",color:$.mutedForeground};case"failed":return{icon:"✗",color:B.toolError};case"duplicate":return{icon:"◇",color:$.warning};default:return{icon:"?",color:$.foreground}}}function WL4(A,Q){let $=A.replace(/\s+/g," ").trim();if(OA($)<=Q)return $;let B="...",E=OA(B);if(Q<=E)return o7(B,Q);return`${o7($,Q-E,!0,"")}${B}`}var yc0="https://ampcode.com/news/neo",bc0=[{title:"Meet the new Amp CLI",body:[]},{title:"Rebuilt From The Ground Up",body:["Same close-up terminal workflow. Completely different underneath."]},{title:"Just Keep Typing",body:["Context is summarized automatically at ~90%.","No handoff flow. No context percentage to babysit."]},{title:"Queueing and Steering",body:["Sending a message now queues by default instead of cancelling tools.","Use steering when you want the agent to see something sooner."]},{title:"Remote Control",body:["Start a thread in the CLI, then keep going from ampcode.com.","Watch live updates and queue follow-ups from any device."]},{title:"Customize Amp with Amp",body:[{text:"Amp now has a ",linkText:"complete plugin API",href:"https://ampcode.com/manual/plugin-api",textAfter:"."},"Add tools, commands, control UI, and hook into events."]},{title:"Permissions",body:[{text:"By default (when no ",highlightText:"amp.permissions",textAfterHighlight:" setting is present), Amp no longer asks for confirmation before running any tools and commands. And you can now implement your own custom permission logic with ",linkText:"plugins",href:"https://ampcode.com/manual/plugin-api",textAfter:"."}]},{title:null,body:["Check out the full news post for more:",{text:yc0,href:yc0}]}];function j26(A){return[{title:"Upgrade your Amp CLI",body:[{text:"This npm-based distribution of Amp CLI has been deprecated. To use the ",linkText:"new Amp CLI",href:yc0,textAfter:" you'll need to switch to the binary install:",linkWidget:!0},"",{codeBlock:["npm uninstall -g @sourcegraph/amp",A]}]}]}function R26(){if(process.platform==="win32")return'powershell -c "irm https://ampcode.com/install.ps1 | iex"';return"curl -fsSL https://ampcode.com/install.sh | bash"}var fT=50,lq=40,fc0=1000,P26=420,T26=760,v26=-250,_26=1100,g90=33,qL4=0.999,S26=2.1,k26=720,f26=420,PL4="Meet the new",TL4="Amp",vL4="CLI",hc0=eA(PL4).length,x26=eA(TL4).length,y26=eA(vL4).length,m90={primary:{r:140,g:38,b:0},secondary:{r:255,g:225,b:102}},wL4={primary:{r:10,g:42,b:18},secondary:{r:200,g:230,b:68}},uL4={primary:{r:18,g:0,b:107},secondary:{r:103,g:255,b:168}},ML4=[m90,wL4,uL4,m90,wL4,uL4,m90],b26=m90;class gc0 extends d0{onDismiss;onQuit;animationProgress;animationsEnabled;variant;binaryInstallCommand;introStages;dismissible;constructor(A){super();this.onDismiss=A.onDismiss,this.onQuit=A.onQuit,this.animationProgress=A.animationProgress,this.animationsEnabled=A.animationsEnabled??!0,this.variant=A.variant??"intro",this.binaryInstallCommand=A.binaryInstallCommand??R26(),this.introStages=this.variant==="npm-migration"?j26(this.binaryInstallCommand):bc0,this.dismissible=this.variant!=="npm-migration"}createState(){return new _L4}}class _L4 extends m0{startedAt=performance.now();animationTimer=null;stageTransitionTimer=null;firstStageTitleTimer=null;firstStageHintTimer=null;firstStageRevealTimer=null;firstStageTitleRevealStartedAt=null;firstStageHintRevealStartedAt=null;stageTransitionStartedAt=performance.now();animationStartProgress=0;animationTargetProgress=1;animationDurationMs=fc0;onAnimationComplete=null;animationProgress=0;introStage=0;previousIntroStage=null;stageTransitionProgress=1;stageTransitionDirection=1;firstStageTitleVisible=!1;firstStageHintVisible=!1;firstStageTitleRevealProgress=0;firstStageHintRevealProgress=0;dismissTimer=null;dismissStartedAt=performance.now();dismissProgress=0;isDismissing=!1;splashOrbGlow=new P5(42);initState(){super.initState(),this.startAnimationIfNeeded()}didUpdateWidget(A){if(super.didUpdateWidget(A),A.animationProgress!==this.widget.animationProgress||A.animationsEnabled!==this.widget.animationsEnabled)this.startAnimationIfNeeded()}dispose(){this.stopAnimation(),this.stopStageTransitionTimer(),this.stopFirstStageRevealTimers(),this.stopDismissAnimation(),super.dispose()}startAnimationIfNeeded(){if(this.stopAnimation(),this.stopFirstStageRevealTimers(),this.widget.animationProgress!==void 0){this.animationProgress=LE(this.widget.animationProgress),this.firstStageTitleVisible=this.animationProgress>=qL4,this.firstStageHintVisible=this.animationProgress>=qL4,this.firstStageTitleRevealProgress=this.firstStageTitleVisible?1:0,this.firstStageHintRevealProgress=this.firstStageHintVisible?1:0;return}if(!this.widget.animationsEnabled){this.stopStageTransitionTimer(),this.stopDismissAnimation(),this.animationProgress=1,this.isDismissing=!1,this.dismissProgress=0,this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1,this.previousIntroStage=null,this.stageTransitionProgress=1;return}if(this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0,this.startProgressAnimation({from:0,to:1,durationMs:fc0,onComplete:()=>{if(!this.widget.dismissible)this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1})}}),this.widget.dismissible)this.startFirstStageRevealSequence()}startDismissAnimation(){if(this.isDismissing)return;if(!this.widget.animationsEnabled){this.widget.onDismiss();return}this.stopFirstStageRevealTimers(),this.stopStageTransitionTimer(),this.dismissStartedAt=performance.now(),this.setState(()=>{this.isDismissing=!0,this.dismissProgress=0}),this.dismissTimer=setInterval(()=>{let A=performance.now()-this.dismissStartedAt,Q=LE(A/T26);if(this.setState(()=>{this.dismissProgress=Q}),Q>=1)this.stopDismissAnimation(),this.widget.onDismiss()},g90)}canNavigateIntroStage(){if(this.isDismissing)return!1;if(!this.firstStageHintVisible)return!1;if(this.introStage===0&&this.firstStageHintRevealProgress<1)return!1;return!0}advanceIntroStage(){if(!this.canNavigateIntroStage())return;if(this.isFinalIntroStage()){if(this.widget.dismissible)this.startDismissAnimation();return}this.moveIntroStage(1)}dismissFromFinalIntroStage(){if(!this.widget.dismissible||!this.canNavigateIntroStage()||!this.isFinalIntroStage())return!1;return this.startDismissAnimation(),!0}nextIntroStage(){if(!this.canNavigateIntroStage()||this.isFinalIntroStage())return;this.moveIntroStage(1)}goToPreviousIntroStage(){if(!this.canNavigateIntroStage()||this.introStage<=0)return;this.moveIntroStage(-1)}isFinalIntroStage(){return this.introStage>=this.widget.introStages.length-1}moveIntroStage(A){let Q=this.introStage+A;if(this.stopStageTransitionTimer(),this.stageTransitionStartedAt=performance.now(),this.setState(()=>{this.previousIntroStage=this.introStage,this.introStage=Q,this.stageTransitionDirection=A}),this.widget.animationProgress!==void 0||!this.widget.animationsEnabled){this.setState(()=>{this.previousIntroStage=null,this.stageTransitionProgress=1});return}this.setState(()=>{this.stageTransitionProgress=0}),this.stageTransitionTimer=setInterval(()=>{let $=performance.now()-this.stageTransitionStartedAt,B=LE($/P26);if(this.setState(()=>{if(this.stageTransitionProgress=B,B>=1)this.previousIntroStage=null}),B>=1)this.stopStageTransitionTimer()},g90)}startProgressAnimation({from:A,to:Q,durationMs:$,onComplete:B}){this.stopAnimation(),this.startedAt=performance.now(),this.animationStartProgress=A,this.animationTargetProgress=Q,this.animationDurationMs=$,this.onAnimationComplete=B,this.animationProgress=A,this.animationTimer=setInterval(()=>{let E=performance.now()-this.startedAt,D=LE(E/this.animationDurationMs),J=this.animationStartProgress+(this.animationTargetProgress-this.animationStartProgress)*xT(D);if(this.setState(()=>{this.animationProgress=J}),D>=1)this.stopAnimation(),this.onAnimationComplete?.(),this.onAnimationComplete=null},g90)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null}stopStageTransitionTimer(){if(this.stageTransitionTimer)clearInterval(this.stageTransitionTimer),this.stageTransitionTimer=null}startFirstStageRevealSequence(){if(this.stopFirstStageRevealTimers(),!this.widget.animationsEnabled){this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageHintVisible=!0,this.firstStageTitleRevealProgress=1,this.firstStageHintRevealProgress=1});return}this.setState(()=>{this.firstStageTitleVisible=!1,this.firstStageHintVisible=!1,this.firstStageTitleRevealProgress=0,this.firstStageHintRevealProgress=0});let A=Math.max(0,fc0+v26),Q=A+_26;this.firstStageTitleTimer=setTimeout(()=>{this.firstStageTitleRevealStartedAt=performance.now(),this.setState(()=>{this.firstStageTitleVisible=!0,this.firstStageTitleRevealProgress=0}),this.startFirstStageRevealTimer()},A),this.firstStageHintTimer=setTimeout(()=>{this.firstStageHintRevealStartedAt=performance.now(),this.setState(()=>{this.firstStageHintVisible=!0,this.firstStageHintRevealProgress=0}),this.startFirstStageRevealTimer()},Q)}startFirstStageRevealTimer(){if(this.firstStageRevealTimer)return;this.firstStageRevealTimer=setInterval(()=>{let A=performance.now(),Q=this.firstStageTitleRevealStartedAt?LE((A-this.firstStageTitleRevealStartedAt)/k26):this.firstStageTitleRevealProgress,$=this.firstStageHintRevealStartedAt?LE((A-this.firstStageHintRevealStartedAt)/f26):this.firstStageHintRevealProgress;if(this.setState(()=>{this.firstStageTitleRevealProgress=Q,this.firstStageHintRevealProgress=$}),Q>=1&&$>=1)this.stopFirstStageRevealTimer()},g90)}stopFirstStageRevealTimers(){if(this.stopFirstStageRevealTimer(),this.firstStageTitleRevealStartedAt=null,this.firstStageHintRevealStartedAt=null,this.firstStageTitleTimer)clearTimeout(this.firstStageTitleTimer),this.firstStageTitleTimer=null;if(this.firstStageHintTimer)clearTimeout(this.firstStageHintTimer),this.firstStageHintTimer=null}stopFirstStageRevealTimer(){if(this.firstStageRevealTimer)clearInterval(this.firstStageRevealTimer),this.firstStageRevealTimer=null}stopDismissAnimation(){if(this.dismissTimer)clearInterval(this.dismissTimer),this.dismissTimer=null}currentOrbPalette(){let A=OL4(this.introStage),Q=this.previousIntroStage===null||this.stageTransitionProgress>=1?A:LL4(OL4(this.previousIntroStage),A,xT(this.stageTransitionProgress));return this.dismissProgress>0?LL4(Q,b26,xT(this.dismissProgress)):Q}build(A){let Q=x4.of(A).colorScheme,$=e0.of(A),B=this.currentOrbPalette(),E=e7(1,"deep",B),D=F4.of(A).size,U=this.widget.animationProgress??this.animationProgress,Y=Math.max(D.width/fT,D.height/lq)*S26,Z=Y+(1-Y)*U,F=xT(this.dismissProgress),X=Math.max(fT,Math.round(fT*Z)),I=Math.max(lq,Math.round(lq*Z)),G=Math.round((D.width-X)/2),V=Math.round((D.height-I)/2),K=Math.max(0,Math.floor((D.width-fT)/2)),z=-Math.floor(lq/2),W=Math.round(G+(K-G)*U),C=Math.round(V+(z-V)*U),H=W+X/2,N=C+I/2,w=h26({dismissProgress:this.dismissProgress,easedDismissProgress:F,introOrbScale:Z,normalOrbCenterX:H,normalOrbCenterY:N,size:D}),u=Math.max(fT,Math.round(fT*w.orbScale)),L=Math.max(lq,Math.round(lq*w.orbScale)),R=w.orbCenterX,_=w.orbCenterY,v=Math.round(R-u/2),f=Math.round(_-L/2),h=Math.max(3,Math.min(D.height-5,Math.floor(lq/2)+2)),x=Math.max(h+3,D.height-3),P=w.textDissolveProgress,k=this.isFinalIntroStage()?w.backdropDissolveProgress:0,c=this.firstStageTitleVisible&&P<1,d=c&&this.firstStageHintVisible,b=d&&this.widget.dismissible&&this.introStage>0&&!this.isFinalIntroStage(),p=this.introStage===0?this.firstStageTitleRevealProgress:1,n=this.introStage===0?this.firstStageHintRevealProgress:1,a=Math.max(24,Math.min(74,D.width-4)),X0=Math.min(12,Math.max(8,D.height-h-6)),$0=Math.max(0,Math.floor((D.width-a)/2)),Z0=Math.max(0,Math.min(D.height-X0,Math.floor(D.height*0.55-X0/2))),v0=this.widget.animationProgress!==void 0||!this.widget.animationsEnabled?new yK({width:u,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,seed:42,fps:0,onClick:()=>{}}):new yK({width:u,height:L,agentMode:"deep",glyphSet:"dotField",backgroundColor:Q.background,primaryColor:B.primary,secondaryColor:B.secondary,glow:this.splashOrbGlow,onClick:()=>{}});return new E6({autofocus:!0,canRequestFocus:!0,debugLabel:"WelcomeTakeover",onKey:(J0)=>{if(J0.key==="Enter")return this.advanceIntroStage(),"handled";if(!this.widget.dismissible&&J0.key==="c"&&J0.ctrlKey)return this.widget.onQuit?.(),"handled";if(!this.widget.dismissible&&J0.key==="q")return this.widget.onQuit?.(),"handled";if((J0.key===" "||J0.key==="Space")&&!this.isFinalIntroStage())return this.advanceIntroStage(),"handled";if(J0.key==="Escape"||J0.key==="Esc"){if(!this.widget.dismissible)return this.widget.onQuit?.(),"handled";return this.dismissFromFinalIntroStage()?"handled":"ignored"}if(J0.key==="ArrowRight")return this.nextIntroStage(),"handled";if(J0.key==="ArrowLeft")return this.goToPreviousIntroStage(),"handled";return"ignored"},child:new t1({fit:"expand",children:[new SL4({color:Q.background,dissolveProgress:k}),new t1({fit:"expand",children:[new oA({onClick:()=>{},child:y0.expand()}),new m1({left:v,top:f,width:u,height:L,child:v0}),...c?[new m1({left:$0,top:Z0,width:a,height:X0,child:m26({introStages:this.widget.introStages,stage:this.introStage,previousStage:this.previousIntroStage,progress:this.stageTransitionProgress,direction:this.stageTransitionDirection,width:a,height:X0,foreground:Q.foreground,mutedForeground:Q.mutedForeground,accent:E,link:$.app.link,keybind:$.app.keybind,titleRevealProgress:p,dissolveProgress:P,context:A})})]:[],...d?[...b?[new m1({left:$0,top:Math.max(0,x-1),width:a,height:1,child:new E0({text:n26({stage:this.introStage,featureStageCount:Math.max(0,this.widget.introStages.length-2),foreground:Q.mutedForeground,dissolveProgress:P}),textAlign:"center"})})]:[],new m1({left:$0,top:x,width:a,height:1,child:o26({finalStage:this.isFinalIntroStage(),dismissible:this.widget.dismissible,foreground:Q.mutedForeground,keybind:$.app.keybind,revealProgress:n,dissolveProgress:P,context:A})})]:[]]})]})})}}class SL4 extends XB{color;dissolveProgress;constructor({color:A,dissolveProgress:Q}){super();this.color=A,this.dissolveProgress=Q}createRenderObject(){return new kL4(this.color,this.dissolveProgress)}updateRenderObject(A){A.update(this.color,this.dissolveProgress)}}class kL4 extends bA{color;dissolveProgress;constructor(A,Q){super();this.color=A,this.dissolveProgress=Q}update(A,Q){this.color=A,this.dissolveProgress=Q,this.markNeedsPaint()}performLayout(){let A=this._lastConstraints;aA(!!A,"performLayout called without constraints");let Q=A.constrain(A.biggest.width,A.biggest.height);this.setSize(Q.width,Q.height),super.performLayout()}paint(A,Q=0,$=0){let B=Math.floor(Q+this.offset.x),E=Math.floor($+this.offset.y),D=Math.floor(this.size.width),J=Math.floor(this.size.height),U={bg:this.color},Y=LE(this.dissolveProgress);if(Y<=0){A.fill(B,E,D,J," ",U);return}if(Y>=1)return;for(let Z=0;Z<J;Z++)for(let F=0;F<D;F++)if(!g26(F,Z,D,J,Y))A.fill(B+F,E+Z,1,1," ",U)}}function LE(A){return Math.min(1,Math.max(0,A))}function xT(A){return 1-(1-A)**3}function OL4(A){return ML4[A]??ML4[0]}function LL4(A,Q,$){return{primary:qq(A.primary,Q.primary,$),secondary:qq(A.secondary,Q.secondary,$)}}function h26({dismissProgress:A,easedDismissProgress:Q,introOrbScale:$,normalOrbCenterX:B,normalOrbCenterY:E,size:D}){return{orbScale:$+($*0.86-$)*Q,orbCenterX:B+(D.width*0.54-B)*Q,orbCenterY:E-D.height*0.44*Q,textDissolveProgress:LE(A/0.52),backdropDissolveProgress:xT(LE((A-0.12)/0.88))}}function g26(A,Q,$,B,E){let D=B<=1?0:Q/(B-1),J=fL4(A+Q*Math.max(1,$));return(1-D)*0.72+J*0.28<E}function m26({introStages:A,stage:Q,previousStage:$,progress:B,direction:E,width:D,height:J,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V}){if($===null||B>=1)return xc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V});let K=xT(B),z=E*Math.round((1-K)*D),W=-E*Math.round(K*D);return new Zq(new t1({fit:"expand",children:[new m1({left:W,top:0,width:D,height:J,child:xc0({introStages:A,stage:$,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:$===0?1:I,dissolveProgress:G,context:V})}),new m1({left:z,top:0,width:D,height:J,child:xc0({introStages:A,stage:Q,foreground:U,mutedForeground:Y,accent:Z,link:F,keybind:X,titleRevealProgress:I,dissolveProgress:G,context:V})})]}))}function xc0({introStages:A,stage:Q,foreground:$,mutedForeground:B,accent:E,link:D,keybind:J,titleRevealProgress:U,dissolveProgress:Y,context:Z}){let F=A[Q]??A[0]??bc0[0],X=new A0({color:E,bold:!0}),I=new A0({color:$}),G=A===bc0&&Q===0,V=[...F.title===null?[]:[new E0({text:G?d90(p26({progress:U,foreground:E,pulseColor:E}),Y):new g($8(F.title,Y),X),textAlign:"center"})],...F.body.length>0?[d26()]:[],...F.body.map((K)=>c26(K,I,B,D,J,Y,Z))];return new pQ({child:new mA({padding:c0.horizontal(1),child:new JA({crossAxisAlignment:"stretch",mainAxisAlignment:"center",mainAxisSize:"min",children:V})})})}function d26(){return y0.height(1)}function c26(A,Q,$,B,E,D,J){if(typeof A==="string")return new E0({text:new g($8(A,D),Q),textAlign:"center"});if("codeBlock"in A)return new M5({onCopy:(U,Y)=>{if(Y)$Q.success(J,"Copied to clipboard",2000)},child:new JA({mainAxisSize:"min",children:A.codeBlock.map((U)=>new E0({text:new g($8(U,D),new A0({color:E})),textAlign:"center",selectable:!0}))})});if("keybind"in A){let U=new E0({text:new g("",void 0,[new g($8(A.text,D),new A0({color:$,dim:!0})),new g($8(A.keybind,D,eA(A.text).length),new A0({color:E}))]),textAlign:"center",selectable:"selectable"in A?A.selectable:!1});if("selectable"in A)return new pQ({child:new M5({child:U})});return U}if("highlightText"in A){let U=t$.createSpan(A.href,A.linkText,new A0({color:B,underline:!0})),Y=lX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(A.highlightText,new A0({color:E})),new g(A.textAfterHighlight,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{W$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new E0({text:d90(Z,D),textAlign:"center"})}if("linkText"in A){if(A.linkWidget)return new JA({mainAxisSize:"min",children:[new E0({text:new g($8(A.text,D),Q),textAlign:"center"}),new pQ({child:new RA({mainAxisSize:"min",children:[t$.createWidget(J,A.href,$8(A.linkText,D),new A0({color:B,underline:!0})),new E0({text:new g($8(A.textAfter,D),Q)})]})})]});let U=t$.createSpan(A.href,A.linkText,new A0({color:B,underline:!0})),Y=lX.of(J),Z=new g("",void 0,[new g(A.text,Q),new g(U.text,U.style,U.children,U.hyperlink,()=>{W$(J,A.href,{forceExternal:!1,onShowImagePreview:Y})}),new g(A.textAfter,Q)]);return new E0({text:d90(Z,D),textAlign:"center"})}if(D>0)return new E0({text:new g($8(A.text,D),new A0({color:B,underline:!0})),textAlign:"center"});return new pQ({child:t$.createWidget(J,A.href,A.text,new A0({color:B,underline:!0}))})}function p26({progress:A,foreground:Q,pulseColor:$}){let B=new A0({color:Q,bold:!0}),E=new A0({color:i26({progress:A,foreground:Q,pulseColor:$}),bold:!0});return new g("",void 0,[new g(l26(A).padEnd(hc0," "),B),new g(" ",B),new g(jL4(TL4,x26,A,0.72),B),new g(" ",B),new g(jL4(vL4,y26,A,0.88),E)])}function l26(A){let Q=eA(PL4),$=Math.min(hc0,Math.ceil(LE(A/0.62)*hc0));return Q.slice(0,$).join("")}function jL4(A,Q,$,B){return $>=B?A:"".padEnd(Q," ")}function i26({progress:A,foreground:Q,pulseColor:$}){if(A<0.88||A>=1)return Q;let B=LE((A-0.88)/0.12);return Math.cos(B*Math.PI*4)*(1-B)>0.12?$:Q}function n26({stage:A,featureStageCount:Q,foreground:$,dissolveProgress:B}){return new g($8(`${A}/${Q}`,B),new A0({color:$,dim:!0}))}function a26({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}){let J=new A0({color:B}),U=new A0({color:$,dim:!0}),Y=Q?A?"Enter":"Space":"Esc",Z=Q?A?" to get started":" to continue":" to quit",F="",X="",I=`${Z}`;if(!Q)return new g("",void 0,[new g(Y,J),new g(Z,U),new g("",J),new g("",U)]);let G=RL4(Y,E),V=RL4(I,LE((E*(eA(Y).length+eA(I).length)-eA(Y).length)/eA(I).length));return new g("",void 0,[new g($8(G,D),J),new g($8(V.slice(0,Z.length),D),U),new g($8(V.slice(Z.length,Z.length+0),D),J),new g($8(V.slice(Z.length+0),D),U)])}function o26({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D,context:J}){if(Q)return new E0({text:a26({finalStage:A,dismissible:Q,foreground:$,keybind:B,revealProgress:E,dissolveProgress:D}),textAlign:"center"});let U=new A0({color:B}),Y=new A0({color:$,dim:!0});return new M5({onCopy:(Z,F)=>{if(F)$Q.success(J,"Copied to clipboard",2000)},child:new E0({text:new g("",void 0,[new g("q",U),new g(" to quit",Y)]),textAlign:"center",selectable:!0})})}function RL4(A,Q){let $=eA(A),B=Math.min($.length,Math.ceil(LE(Q)*$.length));return $.slice(0,B).join("").padEnd($.length," ")}function d90(A,Q,$=0){if(Q<=0)return A;let B=$+eA(A.text??"").length,E=A.children?.map((D)=>{let J=d90(D,Q,B);return B+=eA(D.toPlainText()).length,J});return new g(A.text?$8(A.text,Q,$):A.text,A.style,E,A.hyperlink,A.onClick)}function $8(A,Q,$=0){if(Q<=0)return A;return eA(A).map((E,D)=>{if(E.trim()==="")return E;return fL4($+D)<Q?" ":E}).join("")}function fL4(A){let Q=Math.sin((A+1)*12.9898)*43758.5453;return Q-Math.floor(Q)}function s26(A){let $=A.observer.protocolMessages().filter((B)=>B.role==="assistant").at(-1);if(!$)return null;return $.content.filter((B)=>B.type==="text").map((B)=>B.text).join("")}function xL4(A){A.client.cancelAgentLoop().catch((Q)=>{S.warn("Failed to cancel plugin agent run",{error:Q})})}function t26(A,Q={}){return new Promise(($,B)=>{if(Q.signal?.aborted){xL4(A),B(Error("Agent run cancelled"));return}let E=!1,D=null,J=setTimeout(()=>{D?.(),Y.unsubscribe(),B(Error("Timed out waiting for agent response"))},Q.timeoutMs??600000),U=()=>{clearTimeout(J),Y.unsubscribe(),xL4(A),B(Error("Agent run cancelled"))};if(Q.signal!==void 0)Q.signal.addEventListener("abort",U,{once:!0}),D=()=>Q.signal?.removeEventListener("abort",U);let Y=A.observer.agentState().subscribe((Z)=>{if(g3(Z)){E=!0;return}if(!E)return;let F=s26(A);if(F===null)return;clearTimeout(J),D?.(),Y.unsubscribe(),$(F)})})}var e26=M4("thread.switch",{noun:"thread",verb:"switch",description:"Switch to existing thread",keywords:["resume"],status:{type:"enabled"},sortBoost:100},(A,{controller:Q,dismiss:$})=>{Q.pushWithDismiss((B)=>Rd0({activeThreadID:A.getActiveThreadID(),loadThreads:A.loadThreads,loadThreadTail:A.appContext.loadThreadTail,onSelectThread:A.onSwitchThread,onDismiss:B,onThreadSelected:$}))}),AU6=M4("thread.switchToPrevious",{noun:"thread",verb:"switch to previous",description:"Switch to previous thread",keywords:["back"],status:(A)=>A.canNavigateBack()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to previous with no previous thread"}},(A,{dismiss:Q})=>{A.navigateBack(),Q()}),QU6=M4("thread.switchToNext",{noun:"thread",verb:"switch to next",description:"Switch to next thread",keywords:["forward"],status:(A)=>A.canNavigateForward()?{type:"enabled"}:{type:"disabled",reason:"Cannot use thread: switch to next with no next thread"}},(A,{dismiss:Q})=>{A.navigateForward(),Q()}),$U6=M4("thread.archiveInactive",{noun:null,verb:"Archive Inactive Threads Older than 72h",description:"Archive inactive threads older than 72h",status:{type:"enabled"}},async(A,{context:Q,dismiss:$})=>{let B=$Q.maybeOf(Q),E=await A.archiveInactiveThreads();if($(),E)B?.show(E.message,"error")}),BU6=M4("mcp.info",{noun:"mcp",verb:"info",description:"Show MCP servers and tools",status:{type:"enabled"}},(A,{controller:Q,dismiss:$})=>{Q.push(new um0({mcpServers:A.appContext.mcpServers,onDismiss:$}))}),EU6=M4("toolbox.list",{noun:"toolbox",verb:"list",description:"List all toolboxes and their tools",status:{type:"enabled"}},(A,{controller:Q})=>{Q.pushWithDismiss(($)=>new kc0({toolboxes:A.appContext.toolboxes,onDismiss:$}))}),DU6=M4("news.open",{noun:"news",verb:"open",description:"Open Amp Chronicle in browser",keywords:["chronicle","blog","announcements"],status:{type:"enabled"}},async(A,{context:Q,dismiss:$})=>{try{await W$(Q,"https://ampcode.com/chronicle")}finally{$()}}),JU6=M4("settings.openInEditor",{noun:"settings",verb:"open in editor",description:"Open CLI settings in $EDITOR",keywords:["config"],status:{type:"enabled"}},(A)=>{qK(A.appContext.settingsFilePath).catch((Q)=>{S.error("Failed to open settings file in editor",{error:Q})})}),UU6=M4("ide.connect",{noun:"IDE",verb:"connect",description:"Connect to an IDE",keywords:["vscode","cursor","jetbrains"],status:{type:"enabled"}},(A,{controller:Q,dismiss:$})=>{Q.pushWithDismiss((B)=>new wm0({onCancel:B,onSelect:(E)=>{A.handleIdeSelection(E),$()}}))}),YU6=M4("amp.help",{noun:"amp",verb:"help",description:"Show help & keymaps",keywords:["manual","?"],status:{type:"enabled"}},(A,{controller:Q,context:$,dismiss:B})=>{Q.push(new cg0({commands:sB.of($).commands,keymapShortcuts:A.getKeymapShortcuts(),onDismiss:B}))}),ZU6=M4("amp.showWelcome",{noun:"amp",verb:"show welcome",description:"Show the welcome message again",status:{type:"enabled"}},(A,{dismiss:Q})=>{Q(),A.showWelcome()}),FU6=M4("amp.endCredits",{noun:"amp",verb:"end credits",description:"Roll the full-screen Amp credits",status:{type:"enabled"}},(A,{dismiss:Q})=>{Q(),A.showEndCredits()}),XU6=M4("amp.showVersion",{noun:"amp",verb:"show version",description:"Show current Amp version",keywords:["v"],status:{type:"enabled"}},(A,{controller:Q,dismiss:$})=>{Q.push(new D1({header:"Amp Version",maxWidth:72,onDismiss:$,child:new E0({text:new g(Z50({version:"0.0.1780942552-g0295b6",buildTimestamp:"2026-06-08T18:21:11.038Z",buildType:"release"}))})}))}),IU6=M4("amp.quit",{noun:"amp",verb:"quit",description:"Exit application",keywords:["exit","close","bye"],status:{type:"enabled"}},(A,{context:Q})=>{N4.maybeInvoke(Q,new TK)});class mc0 extends d0{listSkillsForThread;clientPool;completionBuilder;history;ideManager;configService;updateService;initialThreadIDs;showWelcome;welcomeVariant;onWelcomeDismissed;notificationService;mcpTrustHandler;onThreadArchived;onActiveThreadChange;onRelaunchRequested;onFirstFrame;initialUserInput;getDefaultNewThreadVisibility;observeThreadSummaries;openThreadPickerOnStart;workspaceSettingsFilePath;context;constructor(A){super();this.listSkillsForThread=A.listSkillsForThread,this.clientPool=A.clientPool,this.completionBuilder=A.completionBuilder,this.history=A.history,this.ideManager=A.ideManager,this.configService=A.configService,this.updateService=A.updateService,this.initialThreadIDs=A.initialThreadIDs??[],this.showWelcome=A.showWelcome??!1,this.welcomeVariant=A.welcomeVariant??"intro",this.onWelcomeDismissed=A.onWelcomeDismissed,this.notificationService=A.notificationService,this.mcpTrustHandler=A.mcpTrustHandler,this.onThreadArchived=A.onThreadArchived,this.onActiveThreadChange=A.onActiveThreadChange,this.onRelaunchRequested=A.onRelaunchRequested,this.onFirstFrame=A.onFirstFrame,this.initialUserInput=A.initialUserInput,this.getDefaultNewThreadVisibility=A.getDefaultNewThreadVisibility,this.observeThreadSummaries=A.observeThreadSummaries,this.openThreadPickerOnStart=A.openThreadPickerOnStart??!1,this.workspaceSettingsFilePath=A.workspaceSettingsFilePath,this.context=A.context}createState(){return new bL4}}class bL4 extends m0{editorController=new EZ;commandPalette=new gy0(this);commandRegistry=new mg0;keymapCommandRunner=new Ih0(this.commandRegistry,()=>this.context);toastController=new oy0;relaunchNotificationController=new kg0;exitHintTimer=new Kp(this,1000);ideStatus=new c3(this,{});threadNavigationHistory=new yg0;appShortcutManager=new ac;keymapController=new Dy0({runCommand:(A)=>this.keymapCommandRunner.run(A),getCommandDescription:(A)=>{let Q=this.commandRegistry.findByID(A);return Q?.status.type==="enabled"?Q.description:null},onBindingsChange:()=>{if(this.syncAppShortcutManager(),this.mounted)this.setState()},onHintChange:()=>{if(this.mounted)this.setState()}});draftThreadSettings={};draftThreadSettingsSeed={};hasDraftThreadSettingsSeed=!1;draftThreadSettingsInitPromise=null;activeThreadContext=null;activeThreadIDSubscription=null;activePluginMessageSubscription=null;activePluginUIRequestsSubscription=null;connectionErrorsSubscription=null;configSubscription=null;connectingToThreadID=null;executorAlreadyConnectedDialog=null;switchThreadPickerVisible=!1;welcomeVisible=!1;endCreditsVisible=!1;invadersHighScore=0;debugOverlayVisible=!1;focusDebugVisible=!1;unregisterCommands=null;emptyThreadTerminalTitleController=new kl;pluginIntegration=null;mcpTrustIntegration=null;updateRelaunchIntegration=null;noticesPollingTimeout=null;notices;editorFocusNode=new a7({debugLabel:"EditorPanel"});loadThreads=async()=>{return this.widget.context.listThreads()};focusEditor=()=>{this.editorFocusNode.requestFocus()};focusEditorAfterNextFrame(){cQ.instance.addPostFrameCallback(()=>{if(!this.mounted)return;this.focusEditor()},"Neo focus editor")}analyzeContextForThread=async(A,Q)=>{return AI4({ampURL:this.widget.context.ampURL,configService:this.widget.configService,threadID:A,signal:Q})};onSwitchThread=(A)=>{return this.connectToExistingThread(A,{recordNavigation:!0,rethrowError:!0})};onSelectSidebarThread=async(A)=>{this.focusEditor(),await this.onSwitchThread(A)};threadListSidebar=new Sc0({state:this,isBlocked:()=>this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal(),getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,getWorkspaceRoot:()=>this.widget.context.workspaceRoot,loadThreads:this.loadThreads,observeThreadSummaries:()=>this.widget.observeThreadSummaries(),archiveThread:(A)=>this.archiveThread(A),onSelectThread:this.onSelectSidebarThread,focusMainContent:this.focusEditor,getInitialVisible:()=>this.widget.context.threadListSidebarVisible});sendFeedbackReport=async(A)=>w80({configService:this.widget.configService,settingsFilePath:this.widget.context.settingsFilePath},A);archiveThread=async(A)=>{let Q=await hz4({configService:this.widget.configService},A);if(Q===null){let $=this.activeThreadContext?.client.getThreadId()??null;if(this.widget.clientPool.disconnectThread(A),this.widget.onThreadArchived?.(A),$===A)this.startNewDraftThread()}return Q};archiveInactiveThreads=async()=>{let A=await gz4({configService:this.widget.configService});if(A instanceof Error)return A;let Q=this.activeThreadContext?.client.getThreadId()??null;for(let $ of A.threadIDs)this.widget.clientPool.disconnectThread($),this.widget.onThreadArchived?.($);if(Q&&A.threadIDs.includes(Q))this.startNewDraftThread();return this.toastController.show(`Archived ${A.archivedCount} ${Y1(A.archivedCount,"thread")}`),null};addThreadLabel=async(A,Q)=>{let $=await bW4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};removeThreadLabel=async(A,Q)=>{let $=await hW4({configService:this.widget.configService},A,Q);if($ instanceof Error)return $;return this.toastController.show($.message,$.type,2000),null};initState(){if(jX.getInstance().interceptConsole(),this.invadersHighScore=this.widget.context.invadersHighScore??0,this.syncAppShortcutManager(),this.keymapController.connect(($)=>K1.instance.addKeyInterceptor($,{position:"front"})),this.notices=new Wg0(this.widget.configService,($)=>this.setState($)),cQ.instance.addPostFrameCallback(()=>{setTimeout(()=>this.widget.onFirstFrame?.(),0),this.noticesPollingTimeout=setTimeout(()=>{this.noticesPollingTimeout=null,this.notices.startPolling()},500)},"Neo notices polling"),this.widget.showWelcome)this.welcomeVisible=!0;if(this.connectionErrorsSubscription=this.widget.clientPool.connectionErrors$.subscribe(({threadID:$,error:B})=>{if(S.error("Neo failed to connect to thread",{threadID:$,error:B}),!$)this.toastController.show(`Connection failed: ${B.message}`,"error",4000)}),this.configSubscription=this.widget.configService.config.subscribe(($)=>{this.keymapController.sync($.settings.keymap??{}),this.applyDraftThreadSettingsSeed(this.applySessionDefaultsToThreadSettings(j00($.settings)))}),this.updateRelaunchIntegration=new bg0({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested,relaunchNotificationController:this.relaunchNotificationController,updateService:this.widget.updateService}),this.updateRelaunchIntegration.init(),this.ideStatus.subscribe(this.widget.ideManager.status),this.widget.openThreadPickerOnStart)this.switchThreadPickerVisible=!0;this.ensureDraftThreadSettingsInitialized();let A=this.widget.initialUserInput,Q=this.widget.initialThreadIDs[0];if(Q){let $={};if(A)$.initialUserInput=A;this.connectToInitialThreads(Q,$)}else if(A)this.onNewThread([{type:"text",text:A}],this.widget.context.sessionAgentMode);this.pluginIntegration=new _g0({state:this,commandPalette:this.commandPalette,commandRegistry:this.commandRegistry,toastController:this.toastController,context:this.widget.context,getActiveThreadID:this.getActiveThreadID,appendToThread:this.appendPluginMessagesToThread,readThreadMessages:this.readPluginThreadMessages,readThreadTitle:this.readPluginThreadTitle,subscribeThreadTitle:this.subscribePluginThreadTitle,runAgent:this.runPluginAgent,onBlockingConfirmDialogChange:this.syncEmptyThreadPluginConfirmationTitle}),this.pluginIntegration.init(),this.mcpTrustIntegration=new Vh0({state:this,mcpTrustHandler:this.widget.mcpTrustHandler,toastController:this.toastController,workspaceSettingsFilePath:this.widget.workspaceSettingsFilePath}),this.mcpTrustIntegration.init(),this.unregisterCommands=this.registerAppCommands(),queueMicrotask(()=>{if(!this.mounted)return;this.replayEarlyInputToEditor()})}replayEarlyInputToEditor(){let A=K1.instance.tuiInstance.getEarlyInputText();if(!A)return;this.editorController.insertText(A)}createCommands(){let A={appContext:this.widget.context,archiveInactiveThreads:this.archiveInactiveThreads,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,onSwitchThread:this.onSwitchThread,canNavigateBack:()=>this.threadNavigationHistory.canNavigateBack(),canNavigateForward:()=>this.threadNavigationHistory.canNavigateForward(),navigateBack:()=>this.navigateBack(),navigateForward:()=>this.navigateForward(),handleIdeSelection:this.handleIdeSelection,getKeymapShortcuts:()=>this.keymapController.getShortcuts(),showWelcome:()=>this.showWelcome(),showEndCredits:()=>this.showEndCredits()},Q=this.widget.context.pluginService?DN4({pluginService:this.widget.context.pluginService,workspaceRoot:this.widget.context.workspaceRoot,logFilePath:this.widget.context.logFilePath,toastController:this.toastController}):[];return[GN4({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),e26.bind(A),...this.threadListSidebar.commands(),AU6.bind(A),$U6.bind(A),Uw4({configService:this.widget.configService,getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??void 0,toastController:this.toastController}),QU6.bind(A),BU6.bind(A),EU6.bind(A),DU6.bind(A),JU6.bind(A),UU6.bind(A),YU6.bind(A),ZU6.bind(A),FU6.bind(A),XU6.bind(A),IU6.bind(A),...Q,...kW4(this.widget.context.logFilePath)]}registerAppCommands(){let Q=this.createCommands().map(($)=>this.commandRegistry.register($));return()=>{for(let $ of Q)$()}}build(A){let Q=this.buildHints(),$=this.ideStatus.getValue(),B=this.notices.current,E=new jc0({initialAgentMode:this.widget.context.sessionAgentMode,initialPluginAgentModeKey:this.widget.context.initialPluginAgentModeKey,analyzeContextForThread:this.analyzeContextForThread,listSkillsForThread:this.widget.listSkillsForThread,threadContext:this.activeThreadContext,draftThreadSettings:this.draftThreadSettings,editorController:this.editorController,editorFocusNode:this.editorFocusNode,history:this.widget.history,updateDraftThreadSettings:this.updateDraftThreadSettings,onNewThread:this.onNewThread,sendFeedbackReport:this.sendFeedbackReport,archiveThread:this.archiveThread,addThreadLabel:this.addThreadLabel,removeThreadLabel:this.removeThreadLabel,configService:this.widget.configService,hints:Q,ideStatus:$,statusItems:this.pluginIntegration?.getStatusItems()??[],pluginConfirmationBlocked:this.pluginIntegration?.hasBlockingConfirmDialog()??!1,notificationService:this.widget.notificationService,notice:this.activeThreadContext||this.welcomeVisible?null:B,onDismissNotice:(V)=>this.notices.dismiss(V)}),D=F4.of(A),J=D.capabilities.animationSupport!=="disabled",U=this.threadListSidebar.visibleWidth(),Y=Math.max(0,D.size.width-U),F=[new VA({constraints:U4.tight(D.size.width,D.size.height),child:this.threadListSidebar.buildBody(E)})];if(this.commandPalette.isEnabled())F.push(new E6({debugLabel:"CommandPaletteOverlay",onFocusChange:this.closeCommandPaletteOnFocusLoss,child:new dg0({keymapShortcuts:this.keymapController.getShortcuts(),onDismiss:this.commandPalette.disable})}));if(this.switchThreadPickerVisible&&!this.welcomeVisible)F.push(Rd0({activeThreadID:this.activeThreadContext?.client.getThreadId()??null,loadThreads:this.loadThreads,loadThreadTail:this.widget.context.loadThreadTail,onSelectThread:this.onSwitchThread,onDismiss:this.closeSwitchThreadPicker,onThreadSelected:this.closeSwitchThreadPicker}));if(this.welcomeVisible)F.push(new E6({debugLabel:"WelcomeDialogOverlay",child:new gc0({onDismiss:this.dismissWelcome,onQuit:()=>K1.instance.stop(),animationsEnabled:J,variant:this.widget.welcomeVariant})}));let X=this.executorAlreadyConnectedDialog;if(X)F.push(new E6({debugLabel:"ExecutorAlreadyConnectedDialogOverlay",child:new Hm0({details:X.details,onChoice:this.handleExecutorAlreadyConnectedChoice})}));if(F.push(...this.mcpTrustIntegration?.buildDialogLayers()??[]),F.push(...this.pluginIntegration?.buildDialogLayers()??[]),this.widget.context.isInternalUser)F.push(new lg0({top:this.focusDebugVisible?33:1,visible:this.debugOverlayVisible,pid:c90.pid,activeThreadID:this.activeThreadContext?.client.getThreadId()??null,observerSnapshot$:this.activeThreadContext?.observer.observerSnapshot()??null}));if(this.focusDebugVisible)F.push(new Nm0);if(this.endCreditsVisible)F.push(new Gm0({onComplete:this.completeEndCredits,highScore:this.invadersHighScore,onHighScoreChange:this.updateInvadersHighScore}));let I=this.keymapController.getHint(),G=k70(this.exitHintTimer.isActive()?{key:"Ctrl+C",description:"confirm quit",showCancelHint:!1}:I?{key:I.leader,description:"...",options:I.options}:null);if(G)F.push(G);return new MQ({context:this.widget.context,child:new sB({commandRegistry:this.commandRegistry,child:new zT({completionBuilder:this.widget.completionBuilder,child:new $Q({controller:this.toastController,child:new N4({actions:this.buildActions(),child:new rQ({debugLabel:"AppShortcuts",shortcuts:this.buildShortcuts(),manager:this.appShortcutManager,child:this.keymapCommandRunner.captureContext(new VQ({debugLabel:"AppShellFocus",canRequestFocus:!1,skipTraversal:!0,child:new ry0({controller:this.toastController,complexToastControllers:[this.relaunchNotificationController,...B&&this.activeThreadContext&&!this.welcomeVisible?[this.notices]:[]],child:new pg0({configReloadEvents:this.widget.configService.configReloadEvents,toastController:this.toastController,child:new wq({left:U,width:Y,child:this.keymapCommandRunner.buildModalStack(new t1({children:F}))})})})}))})})})})})})}buildShortcuts(){let A=new Map,Q=new Set,$=(E,D)=>{A.set(E,D),Q.add(E.toString())},B=(E,D)=>{if(Q.has(E.toString()))return;$(E,D)};for(let E of this.keymapController.getBindings())if(E.activator instanceof wA)$(E.activator,new u70(E.commandID));B(wA.ctrl("c"),new N70),B(wA.ctrl("o"),new w70),B(wA.alt("i"),new O70),B(wA.alt("p"),new cc),B(wA.ctrl("."),new R70),B(wA.ctrl("t"),new v70);for(let[E,D]of this.threadListSidebar.shortcutEntries())B(E,D);if(c90.env.NODE_ENV==="development"&&c90.platform==="darwin")B(wA.meta("r"),new q70);return A}syncAppShortcutManager(){for(let A of this.appShortcutManager.getAllShortcuts().keys())this.appShortcutManager.removeShortcut(A);for(let[A,Q]of this.buildShortcuts())this.appShortcutManager.addShortcut(A,Q)}buildActions(){let A=new cA(()=>{if(b2.hasAnyCopyableSelection())return b2.tryCopyAnyActiveSelection(),"handled";return this.onExitPressed(),"handled"}),Q=new cA(()=>{if(!this.commandPalette.isEnabled()&&this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.toggle(),"handled"}),$=new cA(()=>{if(this.commandPalette.isEnabled()||this.hasBlockingTopLevelModal())return"ignored";return this.commandPalette.enable(),"handled"}),B=new cA((G)=>{return this.keymapCommandRunner.run(G.commandID)?"handled":"ignored"}),E=new cA(()=>{return this.startNewDraftThread(),"handled"}),D=new cA(()=>{return K1.instance.stop(),"handled"}),J=new cA(()=>{return Ol({getRelaunchThreadIDs:this.getRelaunchThreadIDs,onRelaunchRequested:this.widget.onRelaunchRequested}),"handled"}),U=new cA((G)=>{if(!G.text)return"ignored";return K1.instance.tuiInstance.clipboard.writeText(G.text).then((V)=>{if(V.ok)this.toastController.show(G.successMessage,"success",2000);else this.toastController.show(`${G.failureMessage}: ${V.userFacingErrorMessage}`,"error",4000)}).catch((V)=>{S.error("Failed to copy Neo text to clipboard",{error:V}),this.toastController.show(G.failureMessage,"error",2000)}),"handled"}),Y=new cA(()=>{return K1.instance.toggleFrameStatsOverlay(),"handled"}),Z=new cA(()=>this.notices.dismissCurrent()?"handled":"ignored"),F=new cA(()=>{if(!this.widget.context.isInternalUser)return"ignored";return this.setState(()=>{this.debugOverlayVisible=!this.debugOverlayVisible}),"handled"}),X=LN4({getActiveThreadID:()=>this.activeThreadContext?.client.getThreadId()??null,context:this.widget.context,toastController:this.toastController,startNewDraftThread:this.startNewDraftThread,sendFeedbackReport:this.sendFeedbackReport}),I=new cA(()=>{return this.setState(()=>{this.focusDebugVisible=!this.focusDebugVisible}),"handled"});return new Map([[N70,A],[uq,E],[TK,D],[q70,J],[IB,U],[sp,$],[u70,B],[w70,Q],[O70,F],...this.threadListSidebar.actionEntries(),[R70,Z],...X,[cc,Y],[v70,I]])}startNewDraftThread(A={}){let Q=this.activeThreadContext?.client.getThreadId();if(this.commandPalette.disable(),this.threadNavigationHistory.recordNavigation(Q),this.setState(()=>{if(this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.cancelOwnerUIRequests(),this.activeThreadContext=null,this.connectingToThreadID=null,A.hideDebugOverlay)this.debugOverlayVisible=!1}),this.widget.onActiveThreadChange?.(null),this.syncEmptyThreadPluginConfirmationTitle(),A.prompt!==void 0)this.editorController.text=A.prompt;this.focusEditorAfterNextFrame()}syncEmptyThreadPluginConfirmationTitle=()=>{this.emptyThreadTerminalTitleController.setPluginConfirmationBlocked(this.activeThreadContext===null&&(this.pluginIntegration?.hasBlockingConfirmDialog()??!1))};closeCommandPaletteOnFocusLoss=(A)=>{if(A||!this.commandPalette.isEnabled())return;this.commandPalette.disable()};ensureDraftThreadSettingsInitialized(){if(this.hasDraftThreadSettingsSeed)return Promise.resolve();if(!this.draftThreadSettingsInitPromise)this.draftThreadSettingsInitPromise=this.initDraftThreadSettings();return this.draftThreadSettingsInitPromise}async initDraftThreadSettings(){try{let A=this.applySessionDefaultsToThreadSettings(await bP(this.widget.configService));this.applyDraftThreadSettingsSeed(A)}catch(A){S.warn("Failed to initialize Neo draft thread settings",{error:A instanceof Error?A.message:String(A)})}}applySessionDefaultsToThreadSettings(A){let Q=this.widget.context.sessionAgentMode,$=A,B=nN(Q),E=E50(this.widget.context,Q);if(B!==void 0&&E!==void 0)$={...$,[B]:E};return $50($,{agentMode:Q,explicitEffort:this.widget.context.explicitReasoningEffort,sessionState:this.widget.context})}applyDraftThreadSettingsSeed(A){if(!this.mounted)return;if(!this.hasDraftThreadSettingsSeed){this.setState(()=>{this.hasDraftThreadSettingsSeed=!0,this.draftThreadSettings=yL4(this.draftThreadSettings,{},A),this.draftThreadSettingsSeed={...A}});return}if(g9(this.draftThreadSettingsSeed,A))return;this.setState(()=>{this.draftThreadSettings=yL4(this.draftThreadSettings,this.draftThreadSettingsSeed,A),this.draftThreadSettingsSeed={...A}})}buildHints(){let A=new Set;if(this.connectingToThreadID)A.add(PK);return A}onExitPressed=()=>{if(this.exitHintTimer.isActive())this.exitHintTimer.clear(),K1.instance.stop();else this.exitHintTimer.activate()};dismissWelcome=()=>{if(!this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!1}),this.widget.onWelcomeDismissed?.()};updateInvadersHighScore=(A)=>{if(A<=this.invadersHighScore)return;this.setState(()=>{this.invadersHighScore=A}),eD((Q)=>({...Q,neoInvadersHighScore:Math.max(Q.neoInvadersHighScore,A)})).catch((Q)=>{S.warn("Failed to save Neo Invaders high score",{error:Q instanceof Error?Q.message:String(Q)})})};showWelcome=()=>{if(this.welcomeVisible)return;this.setState(()=>{this.welcomeVisible=!0})};showEndCredits=()=>{if(this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!0})};completeEndCredits=()=>{if(!this.endCreditsVisible)return;this.setState(()=>{this.endCreditsVisible=!1})};promptExecutorAlreadyConnected(A){return new Promise((Q)=>{this.setState(()=>{this.executorAlreadyConnectedDialog={details:{existingExecutorInfo:A.existingExecutorInfo,existingExecutorURL:this.executorAlreadyConnectedURL(A.existingExecutorInfo)},resolve:($)=>{Q($==="watch"?"observe":"disconnect")}}})})}executorAlreadyConnectedURL(A){if(A?.executorType!=="sandbox")return null;let Q=this.connectingToThreadID??this.activeThreadContext?.client.getThreadId()??null;if(!Q)return null;return`${this.widget.context.ampURL.replace(/\/$/,"")}/threads/${Q}`}handleExecutorAlreadyConnectedChoice=(A)=>{if(this.resolveExecutorAlreadyConnectedDialog(A),A==="exit")K1.instance.stop()};resolveExecutorAlreadyConnectedDialog(A){let Q=this.executorAlreadyConnectedDialog;if(!Q)return;this.setState(()=>{this.executorAlreadyConnectedDialog=null}),Q.resolve(A)}closeSwitchThreadPicker=()=>{if(!this.switchThreadPickerVisible)return;this.setState(()=>{this.switchThreadPickerVisible=!1}),this.focusEditorAfterNextFrame()};updateDraftThreadSettings=(A)=>{this.setState(()=>{this.draftThreadSettings=A(this.draftThreadSettings)})};onNewThread=async(A,Q,$=null,B,E,D)=>{await this.ensureDraftThreadSettingsInitialized();let J=this.activeThreadContext?.client.getThreadId(),U=A.find(C00);if(U)this.widget.history.add(U.text,c90.cwd()),this.widget.history.reset();let Y=$?void 0:await this.widget.getDefaultNewThreadVisibility?.(),Z=$??Y??null,F=this.widget.clientPool.createNewThread(Q,this.draftThreadSettings,Z??void 0,E,D);if(this.sendUserMessage(F,A,E?void 0:Q,E?void 0:B),!E)this.rememberSessionDefaultsForNewMessage(Q,this.draftThreadSettings);this.threadNavigationHistory.recordNavigation(J),this.setActiveClient(F)};rememberSessionDefaultsForNewMessage(A,Q){this.widget.context.sessionAgentMode=A;let $=Q["reasoning.effort"];if($!==void 0)this.widget.context.lastReasoningEffortByMode={...this.widget.context.lastReasoningEffortByMode??{},[A]:$};let B=nN(A),E=B?Q[B]:void 0;if(E!==void 0)this.widget.context.lastSpeedByMode={...this.widget.context.lastSpeedByMode??{},[A]:E};eD((D)=>{let J={...D,agentMode:A};if($!==void 0)J={...J,lastReasoningEffortByMode:{...J.lastReasoningEffortByMode??{},[A]:$}};if(E!==void 0)J={...J,lastSpeedByMode:{...J.lastSpeedByMode??{},[A]:E}};return J}).catch((D)=>{S.warn("Failed to persist Neo session defaults for new message",{error:D instanceof Error?D.message:String(D)})})}sendUserMessage(A,Q,$,B,E){let D=A50(this.ideStatus.getValue());if(B===void 0){A.client.sendUserMessage(Q,$,{steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})});return}A.client.sendUserMessage(Q,$,{reasoningEffort:B,steer:E?.steer,userState:D}).catch((J)=>{S.warn("Failed to send user message",{error:J})})}getActiveThreadID=()=>{return this.activeThreadContext?.client.getThreadId()??void 0};getRelaunchThreadIDs=()=>{let A=new Set,Q=this.getActiveThreadID();if(Q)A.add(Q);for(let $ of this.widget.clientPool.activeThreadIDs)A.add($);return[...A]};appendPluginMessagesToThread=async(A,Q,$)=>{let B=this.activeThreadContext;if(!B){if(Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}throw Error("appendToThread is not available - no active thread")}let E=B.client.getThreadId();if(Q&&E!==Q){for(let D of A)await this.widget.clientPool.appendUserMessageToThread(Q,D.content,$);return}for(let D of A)this.sendUserMessage(B,[{type:"text",text:D.content}],void 0,void 0,$)};readPluginThreadMessages=async(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.messages is not available - no active thread");let B=$.client.getThreadId();if(Q&&B!==Q)throw Error("thread.messages is only available for the active thread");return PoA(ToA($.observer.protocolMessages()),A)};readPluginThreadTitle=async(A)=>{let Q=this.activeThreadContext;if(!Q)throw Error("thread.title is not available - no active thread");let $=Q.client.getThreadId();if(A&&$!==A)throw Error("thread.title is only available for the active thread");return Q.observer.title().getValue()??null};subscribePluginThreadTitle=(A,Q)=>{let $=this.activeThreadContext;if(!$)throw Error("thread.title.subscribe is not available - no active thread");let B=$.client.getThreadId();if(A&&B!==A)throw Error("thread.title.subscribe is only available for the active thread");return $.observer.title().subscribe((E)=>{Q.next(E??null)})};runPluginAgent=async(A,Q,$)=>{await this.ensureDraftThreadSettingsInitialized();let B=this.widget.clientPool.createNewThread(this.widget.context.sessionAgentMode,this.draftThreadSettings,void 0,A,Q.agentModeDisplay,Q.parentThreadID,{trackAsLastActive:!1,executorClientID:iY.parse(`neo-subagent-${r26()}`)});this.sendUserMessage(B,[{type:"text",text:Q.message}]);try{let E=await t26(B,{timeoutMs:Q.timeoutMs,signal:$}),D=B.client.getThreadId();return D?{threadID:D,text:E}:{text:E}}finally{this.widget.clientPool.disconnect(B)}};async connectToExistingThread(A,Q={}){let $=this.activeThreadContext?.client.getThreadId();this.setState(()=>{this.connectingToThreadID=A});try{let B=await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:(E)=>this.promptExecutorAlreadyConnected(E)});if(this.setActiveClient(B),Q.recordNavigation&&$!==A)this.threadNavigationHistory.recordNavigation($);if(Q.initialUserInput)this.sendUserMessage(B,[{type:"text",text:Q.initialUserInput}])}catch(B){if(S.error("Failed to load thread",{error:B,threadID:A}),this.toastController.show(`Failed to load ${A}: ${B instanceof Error?B.message:String(B)}`,"error",4000),Q.rethrowError)throw B}finally{this.setState(()=>{this.connectingToThreadID=null})}}async connectToInitialThreads(A,Q={}){await this.connectToExistingThread(A,Q);let $=this.widget.initialThreadIDs.filter((B)=>B!==A);await Promise.all($.map((B)=>this.resumeBackgroundThread(B)))}async resumeBackgroundThread(A){try{await this.widget.clientPool.connectToThread(A,{observerOnly:this.widget.context.observerOnly,onExecutorAlreadyConnected:async()=>"observe"})}catch(Q){S.error("Failed to resume background thread",{error:Q,threadID:A}),this.toastController.show(`Failed to resume ${A}: ${Q instanceof Error?Q.message:String(Q)}`,"error",4000)}}async navigateBack(){let A=this.threadNavigationHistory.startBackNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateForward(){let A=this.threadNavigationHistory.startForwardNavigation(this.activeThreadContext?.client.getThreadId());if(!A)return;await this.navigateToThread(A)}async navigateToThread(A){try{await this.connectToExistingThread(A.targetThreadID,{rethrowError:!0})}catch{A.rollback()}}setActiveClient({client:A,observer:Q,agentModeDisplay:$}){this.setState(()=>{this.activeThreadContext={client:A,observer:Q,agentModeDisplay:$}}),this.syncEmptyThreadPluginConfirmationTitle(),this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=Q.threadID().subscribe((B)=>{this.widget.onActiveThreadChange?.(B)}),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription?.unsubscribe(),this.pluginIntegration?.cancelOwnerUIRequests(),this.activePluginMessageSubscription=Q.pluginMessages().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage(B,(E)=>{A.sendPluginMessage(E)})}),this.activePluginUIRequestsSubscription=Q.pluginUIRequests().subscribe((B)=>{this.pluginIntegration?.handlePluginMessage({type:"plugin_message",message:{type:"event",event:"plugin.ui.snapshot",data:{requests:[...B]}}},(E)=>{A.sendPluginMessage(E)})})}handleIdeSelection=async(A)=>{try{await this.widget.ideManager.connect(A)}catch(Q){S.error("Failed to connect to IDE",{error:Q});let $=Q instanceof Error?Q.message:String(Q);this.toastController.show(`IDE connection failed: ${$}`,"error",4000)}};dispose(){if(this.keymapController.dispose(),this.keymapCommandRunner.dispose(),this.unregisterCommands?.(),this.unregisterCommands=null,this.threadListSidebar.dispose(),this.activePluginMessageSubscription?.unsubscribe(),this.activePluginMessageSubscription=null,this.activePluginUIRequestsSubscription?.unsubscribe(),this.activePluginUIRequestsSubscription=null,this.pluginIntegration?.dispose(),this.pluginIntegration=null,this.emptyThreadTerminalTitleController.dispose(),this.mcpTrustIntegration?.dispose(),this.mcpTrustIntegration=null,this.updateRelaunchIntegration?.dispose(),this.updateRelaunchIntegration=null,this.activeThreadIDSubscription?.unsubscribe(),this.activeThreadIDSubscription=null,this.noticesPollingTimeout)clearTimeout(this.noticesPollingTimeout),this.noticesPollingTimeout=null;this.connectionErrorsSubscription?.unsubscribe(),this.configSubscription?.unsubscribe(),this.configSubscription=null,this.notices.dispose(),this.widget.notificationService.detach(),this.toastController.dispose(),this.editorFocusNode.dispose(),super.dispose()}hasBlockingTopLevelModal(){return this.switchThreadPickerVisible||this.executorAlreadyConnectedDialog!==null||this.welcomeVisible||(this.mcpTrustIntegration?.hasBlockingDialog()??!1)||this.endCreditsVisible||(this.pluginIntegration?.hasBlockingDialog()??!1)}}function yL4(A,Q,$){let B={...A};for(let E of GU6(Q,$)){if(!g9(A[E],Q[E]))continue;let D=$[E];if(D===void 0)delete B[E];else B[E]=D}return B}function GU6(...A){return Array.from(new Set(A.flatMap((Q)=>Object.keys(Q))))}function hL4(){return tX4()}function CU6(A,Q){let $=HU6(A,Q),B=new Map(A.map((J)=>[J.id,J.description])),E=Object.entries($),D=E.map(([J,U],Y)=>{let Z=Y===E.length-1?"":",",F=` ${JSON.stringify(J)}: ${JSON.stringify(U)}${Z}`,I=` // ${(J==="leader"?"Leader key for <leader> shortcuts":B.get(J)??"Configured, not discovered").replaceAll(/[\r\n\u2028\u2029]/g," ")}`;return U===null?R0.dim(F+I):F+R0.dim(I)});return D.unshift("{"),D.push("}"),D.join(`
2811
2811
  `)+`
2812
2812
  `}function HU6(A,Q){let $=Ey0(Q),B=Q.leader,E={leader:B===null||typeof B==="string"&&f2(B)?B:$y0};for(let D of A){let J=$.filter((Y)=>Y.commandID===D.id).map((Y)=>Y.key),U=D.defaultKey?[...J,D.defaultKey]:J;if(U.length===0)E[D.id]=null;if(U.length===1)E[D.id]=U[0];if(U.length>1)E[D.id]=U}for(let[D,J]of Object.entries(Q)){if(D==="leader"||E[D]!==void 0)continue;E[D]=J}return E}async function NU6(A){await KU6(WU6.dirname(A),{recursive:!0});try{await zU6(A,`{
2813
2813
  }
@@ -2967,13 +2967,13 @@ ${K}`))}},error:(V)=>{if(!G)G=!0,Z(Error(`Failed to spawn brew: ${V.message}`))}
2967
2967
  ${K}`;if(J==="pnpm"&&K.includes("Unable to find the global bin directory"))z+=`
2968
2968
 
2969
2969
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
2970
- npm install -g ${D}`;Z(Error(z))}},error:(V)=>{if(!I)I=!0,Z(Error(`Failed to spawn ${J}: ${V.message}`))},complete:()=>{if(!I)I=!0,Y()}})})}a0();gA();a0();import{readFile as gF6,realpath as mF6}from"node:fs/promises";import{dirname as fR4,join as dF6}from"node:path";async function xR4(A){switch(A){case"binary":case"brew":return cF6(Ii());case"npm":case"pnpm":case"yarn":case"bun":return pF6()}}async function cF6(A){let Q=await CK(A,["--version"],5000);if(Q.reason!=="success")return S.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function pF6(){try{let A=process.argv[1];if(!A)return null;let Q=await mF6(A),$=fR4(fR4(Q));return await lF6(dF6($,"package.json"))}catch(A){return S.debug("failed to read installed version from package.json",{error:A}),null}}async function lF6(A){let Q=await gF6(A,"utf8"),$=JSON.parse(Q);if(!$.name||!Ky0($.name))return S.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}a0();import{spawn as iF6}from"node:child_process";function Lp0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return S.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var GE0=null,Vi=null;function yR4(A){return new Promise((Q)=>{let $=iF6("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(E)=>{B+=E.toString()}),$.on("close",(E,D)=>{if(E!==0||D==="SIGTERM"){Q(null);return}let J=B.trim();Q(J&&J!=="undefined"?J:null)}),$.on("error",()=>{Q(null)})})}async function VE0(){if(GE0)return GE0;if(Vi)return Vi;Vi=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Lp0(A);let Q=await yR4("@sourcegraph:registry");if(Q)return Lp0(Q);let $=await yR4("registry");if($)return Lp0($);return"https://registry.npmjs.org"})();try{return GE0=await Vi,GE0}finally{Vi=null}}var nF6=3600000,aF6=5000;function jp0(A,Q,$={}){let B=new R4,E=B.pipe(S$({shouldCountRefs:!1})),D=$.startDelayMs??0,J=$.checkIntervalMs??nF6,U=!1,Y=()=>{U=!0};return setImmediate(async()=>{let Z=S.getChild("update");if(D>0){if(await LV(D),U)return}let F=E.subscribe({next:(I)=>{Z.debug("emit new state",I)}}),X=A;try{while(!U){let I=await oF6(X,Q,Z,B);if(I.stop)return;if(I.updatedTo)X=I.updatedTo;if(I.emittedVisibleState){if(await LV(aF6),U)return;B.next("hidden")}if(J<=0)return;let G=1000,V=J;while(V>0&&!U){let K=Math.min(G,V);await LV(K),V-=K}}}finally{F.unsubscribe(),B.complete()}}),{state:E,dispose:Y}}async function oF6(A,Q,$,B){let E={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),E.stop=!0,E;let D=await Q.get("updates.mode");if(D==="disabled")return $.debug("checking disabled"),E.stop=!0,E;let J=await sY(),U=J==="binary"||J==="brew",Y=U?void 0:await HK();$.debug("checking",{currentVersion:A,mode:D,packageManager:J,isBinaryDistribution:U,npmPackageName:Y});let Z;if(U)Z=await J50(A);else{let I=await VE0();Z=await D50(A,I,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),E;let F=(I)=>{B.next(I),E.emittedVisibleState=!0};if(J){let I=await xR4(J);if(I&&rc(I,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:I,latestVersion:Z.latestVersion}),E.updatedTo=I,rc(A,I)<0){let G=await PX(I),V={from:A,to:I,externallyUpdated:!0,...G};if(G.status==="same")$.info("on-disk already updated by another instance",V),F("updated");else $.warn("on-disk already updated by another instance, with PATH warning",V),F("updated-with-warning")}return E}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let I=Z.currentVersionAge-Z.latestVersionAge,G=0.5;if(Math.abs(I)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:I}),!0}return!1};if(!D)D=J==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:J,mode:D});if(J==="brew"){if(!X())F("update-available-brew");return E}if(J==="binary"&&process.execPath!==Ii()){if($.debug("non-standard binary path, showing warning"),!X())F("update-available-unrecognized-path");return E}if(D==="warn"){if(!X())F("update-available");return E}if(!J){if($.debug("auto-update not supported, falling back to warn mode"),!X())F("update-available");return E}try{await Gi(Z.latestVersion,J),E.updatedTo=Z.latestVersion;let I=await PX(Z.latestVersion),G={from:Z.currentVersion,to:Z.latestVersion,...I};if(I.status==="same")$.info("success",G),F("updated");else $.warn("success with warning",G),F("updated-with-warning")}catch(I){F("update-error")}return E}catch(D){return $.debug("check failed",{error:D}),E}}Vg();import{stderr as IJ}from"node:process";function bR4(A){let Q=new MX().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(B)=>{await Np0(B.force||!1,B.verbose||!1,"0.0.1780932011-gc0dbaf"),process.exit()});A.addCommand(Q,{hidden:!0});let $=new MX("update").alias("up").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(B)=>{await tF6(B.targetVersion)});A.addCommand($)}function rF6(A){let Q=Boolean(A.isTTY),$=0,B=!1;function E(){if(!Q||!B)return;A.write(`
2970
+ npm install -g ${D}`;Z(Error(z))}},error:(V)=>{if(!I)I=!0,Z(Error(`Failed to spawn ${J}: ${V.message}`))},complete:()=>{if(!I)I=!0,Y()}})})}a0();gA();a0();import{readFile as gF6,realpath as mF6}from"node:fs/promises";import{dirname as fR4,join as dF6}from"node:path";async function xR4(A){switch(A){case"binary":case"brew":return cF6(Ii());case"npm":case"pnpm":case"yarn":case"bun":return pF6()}}async function cF6(A){let Q=await CK(A,["--version"],5000);if(Q.reason!=="success")return S.debug("failed to read version from binary",{binaryPath:A,result:Q}),null;return Q.output.trim().split(/\s+/)[0]||null}async function pF6(){try{let A=process.argv[1];if(!A)return null;let Q=await mF6(A),$=fR4(fR4(Q));return await lF6(dF6($,"package.json"))}catch(A){return S.debug("failed to read installed version from package.json",{error:A}),null}}async function lF6(A){let Q=await gF6(A,"utf8"),$=JSON.parse(Q);if(!$.name||!Ky0($.name))return S.debug("package.json name mismatch",{pkgJsonPath:A,name:$.name}),null;return $.version||null}a0();import{spawn as iF6}from"node:child_process";function Lp0(A){if(A=A.replace(/\/$/,""),!A.startsWith("http://")&&!A.startsWith("https://"))A=`https://${A}`;try{return new URL(A),A}catch{return S.warn(`Invalid registry URL: ${A}, falling back to npmjs.org`),"https://registry.npmjs.org"}}var GE0=null,Vi=null;function yR4(A){return new Promise((Q)=>{let $=iF6("npm",["config","get",A],{stdio:["ignore","pipe","ignore"],timeout:5000,shell:process.platform==="win32"}),B="";$.stdout.on("data",(E)=>{B+=E.toString()}),$.on("close",(E,D)=>{if(E!==0||D==="SIGTERM"){Q(null);return}let J=B.trim();Q(J&&J!=="undefined"?J:null)}),$.on("error",()=>{Q(null)})})}async function VE0(){if(GE0)return GE0;if(Vi)return Vi;Vi=(async()=>{let A=process.env.NPM_CONFIG_REGISTRY??process.env.npm_config_registry;if(A)return Lp0(A);let Q=await yR4("@sourcegraph:registry");if(Q)return Lp0(Q);let $=await yR4("registry");if($)return Lp0($);return"https://registry.npmjs.org"})();try{return GE0=await Vi,GE0}finally{Vi=null}}var nF6=3600000,aF6=5000;function jp0(A,Q,$={}){let B=new R4,E=B.pipe(S$({shouldCountRefs:!1})),D=$.startDelayMs??0,J=$.checkIntervalMs??nF6,U=!1,Y=()=>{U=!0};return setImmediate(async()=>{let Z=S.getChild("update");if(D>0){if(await LV(D),U)return}let F=E.subscribe({next:(I)=>{Z.debug("emit new state",I)}}),X=A;try{while(!U){let I=await oF6(X,Q,Z,B);if(I.stop)return;if(I.updatedTo)X=I.updatedTo;if(I.emittedVisibleState){if(await LV(aF6),U)return;B.next("hidden")}if(J<=0)return;let G=1000,V=J;while(V>0&&!U){let K=Math.min(G,V);await LV(K),V-=K}}}finally{F.unsubscribe(),B.complete()}}),{state:E,dispose:Y}}async function oF6(A,Q,$,B){let E={stop:!1,emittedVisibleState:!1};try{if(process.env.AMP_SKIP_UPDATE_CHECK==="1")return $.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable"),E.stop=!0,E;let D=await Q.get("updates.mode");if(D==="disabled")return $.debug("checking disabled"),E.stop=!0,E;let J=await sY(),U=J==="binary"||J==="brew",Y=U?void 0:await HK();$.debug("checking",{currentVersion:A,mode:D,packageManager:J,isBinaryDistribution:U,npmPackageName:Y});let Z;if(U)Z=await J50(A);else{let I=await VE0();Z=await D50(A,I,Y)}if(!(Z.latestVersion&&Z.hasUpdate))return $.debug("no update available"),E;let F=(I)=>{B.next(I),E.emittedVisibleState=!0};if(J){let I=await xR4(J);if(I&&rc(I,Z.latestVersion)>=0){if($.debug("on-disk version already up to date",{currentVersion:A,installedVersion:I,latestVersion:Z.latestVersion}),E.updatedTo=I,rc(A,I)<0){let G=await PX(I),V={from:A,to:I,externallyUpdated:!0,...G};if(G.status==="same")$.info("on-disk already updated by another instance",V),F("updated");else $.warn("on-disk already updated by another instance, with PATH warning",V),F("updated-with-warning")}return E}}let X=()=>{if(Z.currentVersionAge!==void 0&&Z.latestVersionAge!==void 0){let I=Z.currentVersionAge-Z.latestVersionAge,G=0.5;if(Math.abs(I)<0.5)return $.debug("versions too close together, suppressing update warning",{currentVersionAge:Z.currentVersionAge,latestVersionAge:Z.latestVersionAge,ageDifferenceHours:I}),!0}return!1};if(!D)D=J==="pnpm"?"warn":"auto",$.debug("no configured update mode; selected default based on package manager",{packageManager:J,mode:D});if(J==="brew"){if(!X())F("update-available-brew");return E}if(J==="binary"&&process.execPath!==Ii()){if($.debug("non-standard binary path, showing warning"),!X())F("update-available-unrecognized-path");return E}if(D==="warn"){if(!X())F("update-available");return E}if(!J){if($.debug("auto-update not supported, falling back to warn mode"),!X())F("update-available");return E}try{await Gi(Z.latestVersion,J),E.updatedTo=Z.latestVersion;let I=await PX(Z.latestVersion),G={from:Z.currentVersion,to:Z.latestVersion,...I};if(I.status==="same")$.info("success",G),F("updated");else $.warn("success with warning",G),F("updated-with-warning")}catch(I){F("update-error")}return E}catch(D){return $.debug("check failed",{error:D}),E}}Vg();import{stderr as IJ}from"node:process";function bR4(A){let Q=new MX().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(B)=>{await Np0(B.force||!1,B.verbose||!1,"0.0.1780942552-g0295b6"),process.exit()});A.addCommand(Q,{hidden:!0});let $=new MX("update").alias("up").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(B)=>{await tF6(B.targetVersion)});A.addCommand($)}function rF6(A){let Q=Boolean(A.isTTY),$=0,B=!1;function E(){if(!Q||!B)return;A.write(`
2971
2971
  `),B=!1,$=0}function D(J){if(!Q)return;let U=J.padEnd($," ");A.write(`\r${U}`),B=!0,$=U.length}return{flushProgressLine:E,renderProgress:D}}function sF6(A){if(A.source==="npm"&&A.latestVersionAge!==void 0&&A.latestVersionAge>36)IJ.write(R0.yellow(`The latest Amp CLI version reported by npm is older than expected. Be aware that you may be using an npm proxy with a corporate policy to delay package updates.
2972
2972
  `))}async function tF6(A){let $=process.platform==="win32"&&rN()?{currentExecutablePath:process.execPath}:void 0,{flushProgressLine:B,renderProgress:E}=rF6(IJ);if(process.env.AMP_SKIP_UPDATE_CHECK==="1")IJ.write(R0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
2973
2973
 
2974
2974
  `));try{if(!A){IJ.write(R0.blue(`Checking for updates...
2975
- `));let U=!1,Y;if(rN()){let Z=await J50("0.0.1780932011-gc0dbaf");U=Z.hasUpdate,Y=Z.latestVersion}else{let Z=await VE0(),F=await HK(),X=await D50("0.0.1780932011-gc0dbaf",Z,F);sF6(X),U=X.hasUpdate,Y=X.latestVersion}if(!U){let Z=sc("0.0.1780932011-gc0dbaf"),F=Z?.age?`released ${Z.age} ago`:`built ${MV(new Date("2026-06-08T15:25:00.456Z"))} ago`;IJ.write(R0.green(`✓ Amp is already up to date on version ${"0.0.1780932011-gc0dbaf"} (${F})
2976
- `));let X=await PX("0.0.1780932011-gc0dbaf",$);if(X.warning)IJ.write(`
2975
+ `));let U=!1,Y;if(rN()){let Z=await J50("0.0.1780942552-g0295b6");U=Z.hasUpdate,Y=Z.latestVersion}else{let Z=await VE0(),F=await HK(),X=await D50("0.0.1780942552-g0295b6",Z,F);sF6(X),U=X.hasUpdate,Y=X.latestVersion}if(!U){let Z=sc("0.0.1780942552-g0295b6"),F=Z?.age?`released ${Z.age} ago`:`built ${MV(new Date("2026-06-08T18:21:11.038Z"))} ago`;IJ.write(R0.green(`✓ Amp is already up to date on version ${"0.0.1780942552-g0295b6"} (${F})
2976
+ `));let X=await PX("0.0.1780942552-g0295b6",$);if(X.warning)IJ.write(`
2977
2977
  `+R0.yellow(X.warning)+`
2978
2978
  `);process.exit(0)}if(!Y)IJ.write(R0.yellow("[WARN] could not find latest version")),process.exit(0);A=Y}IJ.write(R0.blue(`Updating to version ${A}...
2979
2979
  `)),await Gi(A,void 0,(U)=>{B(),IJ.write(R0.dim(`Running: ${U}
@@ -4948,7 +4948,7 @@ Start Amp from a smaller directory.`};function eX(A,Q){if(!tj4())return;S.debug(
4948
4948
  `)}function Dv4(A,Q){A.command("usage").description("Show your current Amp usage and credit balance").action(async($,B)=>{let E=B.optsWithGlobals(),D=await Q(E),J=await cT(D),U=await L4.userDisplayBalanceInfo({},{config:J});if(!U.ok){if(U.error.code==="auth-required")process.stderr.write(R0.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(R0.red("Error: ")+U.error.message+`
4949
4949
  `),process.exit(1)}process.stdout.write(await _z6(U.result.displayText)+`
4950
4950
  `),process.exit(0)})}var $q6=oi.join(oU,"logs","headless.log"),xi0=oi.join(sy,"device-id.json");jX4();async function Bq6(){let A=await Promise.all(pC.map(async(Q)=>{try{return{query:Q,hasConfigs:(await Q.listConfigs()).length>0}}catch($){return S.debug("Failed to detect query-based IDE integration",{ideName:Q.ideName,error:$}),{query:Q,hasConfigs:!1}}}));for(let Q of A)if(Q.hasConfigs)return Q.query;return}function _k4(){Bq6().then((A)=>{if(A){let Q=d00(A.ideName);if(Q)yC(Q)}})}try{if(process.platform==="win32")await Promise.resolve().then(() => k4(Hv(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(A){C7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${A}
4951
- `)}function Eq6(A){process.emitWarning=(Q,$,B,E)=>{let D=typeof Q==="string"?Q:Q.message||String(Q),J=$||"Warning",U=!1;A.warn(D,{name:J,code:B})}}function _B(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")_00("dangerouslyAllowAll",Q.dangerouslyAllowAll)}function Dq6(A,Q){if(!p9(Q))return;if(!uC(Q.user.email)){if(A.model)throw new GA("The --model flag is only available for Amp employees.",1);_00("internal.model",void 0);return}if(A.model)_00("internal.model",Yq6(A.model))}function Lk4(A){let Q=A.indexOf(":");if(Q===-1)throw new GA(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let $=A.slice(0,Q).trim(),B=A.slice(Q+1).trim();if(!$||!B)throw new GA(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function Jq6(A){if(A===void 0)return;let Q=A.trim();if(ry(Q))return Q;throw new GA(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Uq6(A,Q){if(gC(A))return;throw new GA(`Reasoning effort "${Q}" is not available for ${A} mode.`,1)}function Yq6(A){if(!A.includes("="))return Lk4(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let E=B.indexOf("=");if(E===-1)throw new GA(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let D=B.slice(0,E).trim(),J=B.slice(E+1).trim();if(!D)throw new GA(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!J)throw new GA(`Missing model value for mode "${D}". Expected "${D}=provider:model".`,1);Lk4(J),Q[D]=J}if(Object.keys(Q).length===0)throw new GA("No valid model overrides found in --model flag value.",1);return Q}function qD0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new b30(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new b30(`${Q} must be an integer <= ${$.max}`);return B}function Zq6(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}async function Fq6(A,Q){let $=await L4.getUserInfo({},{config:A});return $.ok?Zq6($.result.features,Q):!1}function Xq6(A){return A!=="pending"}function Iw(A){if(!p9(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function Iq6(A){let Q=Iw(A);if(Q)return Q.id;if(bC(A))throw Error(A.error.message);throw Error("unreachable")}function Gq6(A){try{let Q=new URL(A);return Q.hostname==="localhost"||Q.hostname==="127.0.0.1"}catch{return A.includes("localhost")||A.includes("127.0.0.1")}}function Vq6(A){let B=Gq6(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new GA(`Couldn't connect to the Amp server at ${A}.`,1,B)}function hi0(A,Q){let $=pc0(Error(A.error.message));if($.message===C3.networkOffline||$.message===C3.networkTimeout)return Vq6(Q);if($.message!==C3.internalBug)return new GA($.message,1,$.suggestion);return new GA(A.error.message.replace(/^Error: /,""),1)}async function Kq6(){if(process.versions.bun)return!1;try{return await sY()==="npm"}catch(A){return S.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var jk4=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH or with AMP_FORCE_BEL; enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??eJ,description:`Custom settings file path (overrides the default location ${eJ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(S).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${mc})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","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:E9(),description:(A)=>A?"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:(A)=>A?"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:(A)=>A?"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:"mode",long:"mode",short:"m",type:"option",default:i9.SMART.key,description:`Set the agent mode (${BY({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Show migration instructions for the removed legacy runtime",hidden:!0},{name:"orb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],Rk4=(A)=>("deprecated"in A)&&A.deprecated===!0,zq6=(A)=>("hidden"in A)&&A.hidden===!0,Wq6=(A)=>("default"in A),Cq6=(A)=>("default"in A)?A.default:void 0;function Pk4(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=Jq6(Q.effort);if($!==void 0){if(ri(Q.mode))Uq6(Q.mode,$)}return $}var Hq6="Amp Neo is now Amp and available to everyone. If you need to finish work in the old Amp, you can use an older version. For instructions on how to do that and more information: https://ampcode.com/news/drop-the-neo";function ri(A){return Object.values(i9).some((Q)=>Q.key===A)}function Nq6(A,Q){if(ri(A))return A;throw new GA(`${Q} does not support plugin-defined agent modes`,1)}function Sk4(A,Q){if(ri(Q))return{agentMode:Q};let $=A.agentModes.list().find((E)=>E.key===Q||E.label===Q);if(!$){let E=BY({}).map((U)=>U.mode).join(", "),D=A.agentModes.list().map((U)=>U.label).join(", "),J=D?` Plugin modes: ${D}.`:"";throw new GA(`Unknown agent mode '${Q}'. Built-in modes: ${E}.${J}`,1)}let B={label:$.label};if($.color!==void 0)B.color=$.color;return{agentMode:i9.SMART.key,agent:$.agent,agentModeDisplay:B,pluginAgentModeKey:$.key}}async function qq6(A,Q,$){if(A.getOptionValueSourceWithGlobals("mode")!=="cli")return;return await Q.initialized,Sk4(Q,$)}function wq6(A,Q){let $=Q.args[0],B=Q.commands.map((D)=>D.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let D=B.filter((U)=>$.includes(U)||U.includes($)),J="Run amp --help for a list of available commands.";if(D.length>0)J=`Did you mean: ${D.join(", ")}? Or run amp --help for all commands.`;throw new GA(C3.unknownCommand($),1,J)}}var wD0=g0.file(Qq6.homedir()),yi0=process.env.XDG_CONFIG_HOME?g0.file(process.env.XDG_CONFIG_HOME):BA.joinPath(wD0,".config");async function e$(A,Q,$){let B=$?.deferAuth??!1,E=$?.skipToolProviders??!1;abA("0.0.1780932011-gc0dbaf");let D=f00({storage:A.settings,secretStorage:A.secrets,workspaceRoot:process.cwd(),defaultAmpURL:A.ampURL,homeDir:wD0,userConfigDir:yi0}),J=A.secrets.get("apiKey",A.ampURL),U=rO(D),Y=null,Z=()=>{return},F=new Promise((l)=>{Z=l}),X=J.then(async(l)=>{if(!l&&!B)await F;return Y??=U.subscribe(()=>{}),a4(U.pipe(U5(Xq6)))});X.catch(()=>{return}),fT4(D);let I=await D.getLatest();S.debug("Global configuration initialized",{settingsKeys:Object.keys(I.settings)});let G=!1;{let l=await J;if(G=Boolean(l),S.info("API key lookup before login",{found:Boolean(l),ampURL:A.ampURL,deferAuth:B}),!l)if(B)S.info("No API key found, continuing startup with deferred auth");else{fQ.write(`No API key found. Starting login flow...
4951
+ `)}function Eq6(A){process.emitWarning=(Q,$,B,E)=>{let D=typeof Q==="string"?Q:Q.message||String(Q),J=$||"Warning",U=!1;A.warn(D,{name:J,code:B})}}function _B(A,Q){if(A.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")_00("dangerouslyAllowAll",Q.dangerouslyAllowAll)}function Dq6(A,Q){if(!p9(Q))return;if(!uC(Q.user.email)){if(A.model)throw new GA("The --model flag is only available for Amp employees.",1);_00("internal.model",void 0);return}if(A.model)_00("internal.model",Yq6(A.model))}function Lk4(A){let Q=A.indexOf(":");if(Q===-1)throw new GA(`Invalid model format "${A}". Expected "provider:model" (e.g., "anthropic:claude-sonnet-4-20250514").`,1);let $=A.slice(0,Q).trim(),B=A.slice(Q+1).trim();if(!$||!B)throw new GA(`Invalid model format "${A}". Both provider and model must be non-empty (e.g., "anthropic:claude-sonnet-4-20250514").`,1)}function Jq6(A){if(A===void 0)return;let Q=A.trim();if(ry(Q))return Q;throw new GA(`Invalid effort "${A}". Expected one of: none, minimal, low, medium, high, xhigh, max.`,1)}function Uq6(A,Q){if(gC(A))return;throw new GA(`Reasoning effort "${Q}" is not available for ${A} mode.`,1)}function Yq6(A){if(!A.includes("="))return Lk4(A),A;let Q={};for(let $ of A.split(",")){let B=$.trim();if(!B)continue;let E=B.indexOf("=");if(E===-1)throw new GA(`Invalid mode-specific model entry "${B}". Expected "mode=provider:model" (e.g., "smart=anthropic:claude-sonnet-4-20250514").`,1);let D=B.slice(0,E).trim(),J=B.slice(E+1).trim();if(!D)throw new GA(`Missing mode name in "${B}". Expected "mode=provider:model".`,1);if(!J)throw new GA(`Missing model value for mode "${D}". Expected "${D}=provider:model".`,1);Lk4(J),Q[D]=J}if(Object.keys(Q).length===0)throw new GA("No valid model overrides found in --model flag value.",1);return Q}function qD0(A,Q,$){let B=Number(A);if(!Number.isInteger(B)||B<$.min)throw new b30(`${Q} must be an integer >= ${$.min}`);if($.max!==void 0&&B>$.max)throw new b30(`${Q} must be an integer <= ${$.max}`);return B}function Zq6(A,Q){return A?.some(($)=>$.name===Q&&$.enabled)??!1}async function Fq6(A,Q){let $=await L4.getUserInfo({},{config:A});return $.ok?Zq6($.result.features,Q):!1}function Xq6(A){return A!=="pending"}function Iw(A){if(!p9(A))return null;return{...A.user,features:A.features??[],team:A.workspace??void 0}}function Iq6(A){let Q=Iw(A);if(Q)return Q.id;if(bC(A))throw Error(A.error.message);throw Error("unreachable")}function Gq6(A){try{let Q=new URL(A);return Q.hostname==="localhost"||Q.hostname==="127.0.0.1"}catch{return A.includes("localhost")||A.includes("127.0.0.1")}}function Vq6(A){let B=Gq6(A)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new GA(`Couldn't connect to the Amp server at ${A}.`,1,B)}function hi0(A,Q){let $=pc0(Error(A.error.message));if($.message===C3.networkOffline||$.message===C3.networkTimeout)return Vq6(Q);if($.message!==C3.internalBug)return new GA($.message,1,$.suggestion);return new GA(A.error.message.replace(/^Error: /,""),1)}async function Kq6(){if(process.versions.bun)return!1;try{return await sY()==="npm"}catch(A){return S.debug("Failed to detect package manager for Neo npm migration welcome",{error:A}),!1}}var jk4=[{name:"notifications",long:"notifications",type:"flag",description:(A)=>`${A?"Enable":"Disable"} notification alerts (audio locally, terminal bell over SSH or with AMP_FORCE_BEL; enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(A)=>`${A?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??eJ,description:`Custom settings file path (overrides the default location ${eJ})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(S).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${mc})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","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:E9(),description:(A)=>A?"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:(A)=>A?"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:(A)=>A?"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:"mode",long:"mode",short:"m",type:"option",default:i9.SMART.key,description:`Set the agent mode (${BY({}).map((A)=>A.mode).join(", ")}) — controls the model, system prompt, and tool selection`},{name:"effort",long:"effort",type:"option",description:"Set reasoning effort for the new thread, when supported by the selected mode",choices:["none","minimal","low","medium","high","xhigh","max"]},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Show migration instructions for the removed legacy runtime",hidden:!0},{name:"orb",long:"neo-orb",type:"switch",description:"Use the experimental Neo splash orb",hidden:!0},{name:"hideWelcome",long:"hide-welcome",type:"switch",description:"Skip the welcome experience on startup",hidden:!0},{name:"showWelcome",long:"show-welcome",type:"switch",description:"Show the welcome experience on startup",hidden:!0},{name:"observe",long:"observe",type:"option",description:"Open the Neo TUI as an observer of an existing thread (thread ID or URL)",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless thread-actor executor (no TUI). Optionally provide a thread ID to connect to existing thread, otherwise create one.",hidden:!0},{name:"model",long:"model",type:"option",description:'Override the model. Use "provider:model" for all modes, or "mode=provider:model,mode=provider:model" for mode-specific overrides',hidden:!0}],Rk4=(A)=>("deprecated"in A)&&A.deprecated===!0,zq6=(A)=>("hidden"in A)&&A.hidden===!0,Wq6=(A)=>("default"in A),Cq6=(A)=>("default"in A)?A.default:void 0;function Pk4(A,Q){if(A.getOptionValueSourceWithGlobals("effort")!=="cli")return;let $=Jq6(Q.effort);if($!==void 0){if(ri(Q.mode))Uq6(Q.mode,$)}return $}var Hq6="Amp Neo is now Amp and available to everyone. If you need to finish work in the old Amp, you can use an older version. For instructions on how to do that and more information: https://ampcode.com/news/drop-the-neo";function ri(A){return Object.values(i9).some((Q)=>Q.key===A)}function Nq6(A,Q){if(ri(A))return A;throw new GA(`${Q} does not support plugin-defined agent modes`,1)}function Sk4(A,Q){if(ri(Q))return{agentMode:Q};let $=A.agentModes.list().find((E)=>E.key===Q||E.label===Q);if(!$){let E=BY({}).map((U)=>U.mode).join(", "),D=A.agentModes.list().map((U)=>U.label).join(", "),J=D?` Plugin modes: ${D}.`:"";throw new GA(`Unknown agent mode '${Q}'. Built-in modes: ${E}.${J}`,1)}let B={label:$.label};if($.color!==void 0)B.color=$.color;return{agentMode:i9.SMART.key,agent:$.agent,agentModeDisplay:B,pluginAgentModeKey:$.key}}async function qq6(A,Q,$){if(A.getOptionValueSourceWithGlobals("mode")!=="cli")return;return await Q.initialized,Sk4(Q,$)}function wq6(A,Q){let $=Q.args[0],B=Q.commands.map((D)=>D.name());if($&&!$.includes(" ")&&$.length<30&&!/[./\\]/.test($)){let D=B.filter((U)=>$.includes(U)||U.includes($)),J="Run amp --help for a list of available commands.";if(D.length>0)J=`Did you mean: ${D.join(", ")}? Or run amp --help for all commands.`;throw new GA(C3.unknownCommand($),1,J)}}var wD0=g0.file(Qq6.homedir()),yi0=process.env.XDG_CONFIG_HOME?g0.file(process.env.XDG_CONFIG_HOME):BA.joinPath(wD0,".config");async function e$(A,Q,$){let B=$?.deferAuth??!1,E=$?.skipToolProviders??!1;abA("0.0.1780942552-g0295b6");let D=f00({storage:A.settings,secretStorage:A.secrets,workspaceRoot:process.cwd(),defaultAmpURL:A.ampURL,homeDir:wD0,userConfigDir:yi0}),J=A.secrets.get("apiKey",A.ampURL),U=rO(D),Y=null,Z=()=>{return},F=new Promise((l)=>{Z=l}),X=J.then(async(l)=>{if(!l&&!B)await F;return Y??=U.subscribe(()=>{}),a4(U.pipe(U5(Xq6)))});X.catch(()=>{return}),fT4(D);let I=await D.getLatest();S.debug("Global configuration initialized",{settingsKeys:Object.keys(I.settings)});let G=!1;{let l=await J;if(G=Boolean(l),S.info("API key lookup before login",{found:Boolean(l),ampURL:A.ampURL,deferAuth:B}),!l)if(B)S.info("No API key found, continuing startup with deferred auth");else{fQ.write(`No API key found. Starting login flow...
4952
4952
  `);let i=await uq6(A),t=await A.secrets.get("apiKey",A.ampURL);if(S.info("Login flow completed",{success:i,storedKeyPresent:Boolean(t),ampURL:A.ampURL}),!i)await oY(),process.exit(1);G=!0,Z()}}{let l=await D.getLatest(),i=l.settings.url,t=l.secrets.isSet?.[i];S.info("Config secrets state after login",{configURL:i,apiKeySet:t?.apiKey??!1})}let V=B?"pending":await X;if(!B)S.info("Server status resolved",{status:"ready",isAuthenticated:p9(V),isError:bC(V),errorMessage:bC(V)?V.error.message:void 0});Dq6(Q,V);let K=X.then((l)=>Iq6(l));K.catch(()=>{return});let z=p9(V),W=!1;if(process.env.AMP_DISABLE_PLUGINS==="1")S.warn("Ignoring AMP_DISABLE_PLUGINS outside development");let C=W?"off":"all",{toolService:H,dispose:N}=QJ4({configService:D}),w=new Map,u=()=>w.clear(),L=new $O0(D,A.settings.getWorkspaceRootPath()),R=EeA({configService:D}),_=process.env.AMP_EXECUTOR==="sandbox";if(_)S.warn("Not initializing MCP servers because Amp is running as a sandbox executor");let v=eaA({configService:D,trustStore:L,skillMCPServers:R.skillMCPServers,uploadImageAttachments:z,disableMCPServers:_,createOAuthProvider:async(l,i,t)=>{let s=`${l}:${i}`,B0=w.get(s);if(B0)return S.debug("Reusing existing OAuth provider for server",{serverName:l,serverUrl:i}),B0;S.debug("Creating OAuth provider for server",{serverName:l,serverUrl:i});let Q0=(async()=>{let V0=new sC(A.secrets),G0=await V0.getClientInfo(l,i),q0=t?.scopes??G0?.scopes,I0=KR4();S.info("OAuth headless mode check",{useHeadless:I0,executeMode:A.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:fQ.isTTY});let u0;if(I0)u0=A.executeMode?VR4():GR4(l);let S0=new aq0({storage:V0,serverName:l,serverUrl:i,clientId:t?.clientId??G0?.clientId,clientSecret:t?.clientSecret??G0?.clientSecret,authUrl:t?.authUrl??G0?.authUrl,tokenUrl:t?.tokenUrl??G0?.tokenUrl,scopes:q0,headlessAuthHandler:u0});return S.debug("OAuth provider created",{serverName:l,serverUrl:i,hasManualClientId:!!(t?.clientId??G0?.clientId),willUseDCR:!(t?.clientId??G0?.clientId),scopes:q0,headlessMode:I0,executeMode:A.executeMode}),S0})();return w.set(s,Q0),Q0}}),f=Qj0({configService:D,spawn:wQ0}),h=Q.headless?rP4():void 0,x=h??new PE0({configService:D}),P=x instanceof PE0?x:void 0;if(P)P.pluginExecutorKind="local";let k=new H4(null),c=null,d=z&&!W?[...AT4(I.settings)?[{name:"permissions",entryPoint:op0}]:[],{name:"thread-visibility",entryPoint:BT4(D,()=>X.then(Iw),()=>c,(l)=>{c=l}),alwaysLoad:!0}]:[],b=zO0({configService:D,platform:x,loadGlobalPlugins:Fp0(D),pluginFilter:C,activeThread$:k,internalPlugins:d}),p=i90((l)=>{S.info("Reloading plugins after signal",{signal:l}),b.reload()},process.platform==="win32"?["SIGBREAK"]:["SIGHUP"]),n=eoA(b),a=[v,f,n],X0;if(E)X0=new Map;else if(A.executeMode){let l=await T04({toolService:H,providers:a,initialTimeout:15000});X0=l.registrations;for(let[i,t]of l.initErrors)S.warn(`${i} provider initialization slow or failed:`,t)}else X0=$j0({toolService:H,providers:a});if(Q.jetbrains)yC("JetBrains");else if(Q.ide&&jI4())yC("VS Code");else if(Q.ide&&RI4())yC("Neovim");else if(Q.ide&&A.executeMode)_k4();if(A.executeMode)obA(!0);let $0,Z0=v3.status.pipe(tA((l)=>Boolean(l.connected&&l.authenticated&&l.ideName&&shA(l.ideName))),FQ()).subscribe((l)=>{if(l){if(!$0)$0=H.registerTool(P04)}else $0?.dispose(),$0=void 0}),K0;if(!A.executeMode){let l=await A.settings.get("fuzzy.alwaysIncludePaths")??[];K0=new UE0(process.cwd(),{alwaysIncludePaths:l},!0)}else K0=new class extends UE0{async start(){}async query(){return[]}async queryCompletions(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let v0=Ug(D);S.info("Starting Amp background services");let J0=new Dl0,W0={configService:D,toolService:H,mcpService:v,skillService:R,toolboxService:f,trustStore:L,threadRemote:v0,setThreadMeta:v0.setThreadMeta,secretStorage:A.secrets,settingsStorage:A.settings,fuzzyServer:K0,terminal:J0,pluginService:b,pluginPlatform:P,headlessPluginPlatform:h,activeThread$:k,serverStatus:V,serverStatusPromise:X,viewerUserIDPromise:K,hasAPIKeyAtStartup:G,consumeDraftNewThreadVisibility:()=>{let l=c;return c=null,l}};return{...W0,async asyncDispose(){if(p.dispose(),W0.mcpService.hasAuthenticatingClients())S.info("Waiting for OAuth authentication to complete before exit..."),await W0.mcpService.waitForAuthentication();for(let l of X0.values())l.dispose();await W0.mcpService.dispose(),u(),W0.configService.unsubscribe(),Y?.unsubscribe(),N(),W0.fuzzyServer.dispose(),W0.settingsStorage[Symbol.dispose](),Z0.unsubscribe(),$0?.dispose(),await W0.pluginService.dispose()}}}async function uq6(A){if(!A.executeMode){if(!await LE0("Would you like to log in to Amp? [(y)es, (n)o]: "))return fQ.write(`Login cancelled. Run the command again to retry.
4953
4953
  `),!1}return await kk4(A)}async function kk4(A){let Q=sN6(32).toString("hex"),$=await dp0(A.ampURL,Q),B=new AbortController;try{await aJ($,B.signal)}catch(D){S.error("Error opening browser",{error:D})}let E=await dp0(A.ampURL,Q,!1);fQ.write(`If your browser does not open automatically, visit:
4954
4954
 
@@ -4956,7 +4956,7 @@ ${R0.blue.bold(E)}
4956
4956
 
4957
4957
  `);try{return await vP4(A.ampURL,Q,A.secrets,B),fQ.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(D){return S.error("Login failed",{error:D}),C7.write(`
4958
4958
  Login failed: ${D instanceof Error?D.message:String(D)}
4959
- `),!1}}async function Mq6(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new GA("No Amp API key found. Run `amp login` first.",1);let E=rN6("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((D,J)=>{E.on("error",J),E.on("close",(U)=>D(U??1))})}function Oq6(A){let Q=new MX().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, unlisted, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)eK(),process.exit(0);let N=H.originalError??H;nL4(N)}),CI4(Q,{version:"0.0.1780932011-gc0dbaf",buildTimestamp:"2026-06-08T15:25:00.456Z",buildType:"release"}),Q.addHelpText("after",wR4()),Q.configureHelp({formatHelp:uR4}),Q.command("logout").description("Log out by removing stored API key").action(async(H,N)=>{let w=N.optsWithGlobals(),u=await nQ(w);await xq6(u)}),Q.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,N)=>{let w=N.optsWithGlobals(),u=await nQ(w);await fq6(u,await ep0(w,u.settings))}),KT4(Q,nQ);let B=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...H)=>{let N=H.find((R)=>typeof R==="object"&&R!==null&&typeof R.optsWithGlobals==="function")??B,w=H.filter((R)=>R!==N).flatMap((R)=>Array.isArray(R)?R:typeof R==="string"?[R]:[]),u=N.optsWithGlobals(),L=await nQ(u);await Mq6(L.ampURL,L.secrets,w),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(H,N,w)=>{let u=w.optsWithGlobals(),L=await nQ(u);await QR4(H??"get",L.ampURL,L.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit [args...]",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements Git signing helper interfaces. Used inside sandboxes for commit signing.").allowUnknownOption(!0).allowExcessArguments(!0).action(async(H,N,w)=>{let u=w.optsWithGlobals(),L=await nQ(u);await BR4(L,H),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(H)=>{await QP4({raw:H.raw===!0}),process.exit(process.exitCode??0)}),Av4(Q,{createContext:nQ,createThreadDependencies:e$,initializeCLIOverrides:_B}),Q.command("live-sync [threadIDOrURL]",{hidden:!0}).summary("Mirror live DTW thread changes into the current checkout").description("Experimental: watch a v2 thread URL or ID and mirror its live working-tree changes into your local checkout, or apply the current snapshot once and exit.").addHelpText("after",["","Examples:"," amp live-sync T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync --apply T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync https://ampcode.com/threads/T-5928a90d-d53b-488f-a829-4e36442142ee"].join(`
4959
+ `),!1}}async function Mq6(A,Q,$){let B=await Q.get("apiKey",A);if(!B)throw new GA("No Amp API key found. Run `amp login` first.",1);let E=rN6("curl",["-H",`Authorization: Bearer ${B}`,...$],{stdio:"inherit"});process.exitCode=await new Promise((D,J)=>{E.on("error",J),E.on("close",(U)=>D(U??1))})}function Oq6(A){let Q=new MX().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, unlisted, workspace, group)").configureOutput({writeErr:()=>{}});Q.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)eK(),process.exit(0);let N=H.originalError??H;nL4(N)}),CI4(Q,{version:"0.0.1780942552-g0295b6",buildTimestamp:"2026-06-08T18:21:11.038Z",buildType:"release"}),Q.addHelpText("after",wR4()),Q.configureHelp({formatHelp:uR4}),Q.command("logout").description("Log out by removing stored API key").action(async(H,N)=>{let w=N.optsWithGlobals(),u=await nQ(w);await xq6(u)}),Q.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,N)=>{let w=N.optsWithGlobals(),u=await nQ(w);await fq6(u,await ep0(w,u.settings))}),KT4(Q,nQ);let B=Q.command("internal",{hidden:!0}).description("Internal commands").command("curl [args...]").description("Internal: run curl with the current Amp API key as a bearer token").allowUnknownOption(!0).allowExcessArguments(!0).action(async(...H)=>{let N=H.find((R)=>typeof R==="object"&&R!==null&&typeof R.optsWithGlobals==="function")??B,w=H.filter((R)=>R!==N).flatMap((R)=>Array.isArray(R)?R:typeof R==="string"?[R]:[]),u=N.optsWithGlobals(),L=await nQ(u);await Mq6(L.ampURL,L.secrets,w),process.exit(process.exitCode??0)});Q.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(H,N,w)=>{let u=w.optsWithGlobals(),L=await nQ(u);await QR4(H??"get",L.ampURL,L.secrets),process.exit(process.exitCode??0)}),Q.command("sign-commit [args...]",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements Git signing helper interfaces. Used inside sandboxes for commit signing.").allowUnknownOption(!0).allowExcessArguments(!0).action(async(H,N,w)=>{let u=w.optsWithGlobals(),L=await nQ(u);await BR4(L,H),process.exit(process.exitCode??0)}),Q.command("keyboard-tester",{hidden:!0}).summary("Keyboard input tester").description("Internal: stream parsed terminal input events as JSONL.").option("--raw","Log raw incoming terminal bytes before parsing").action(async(H)=>{await QP4({raw:H.raw===!0}),process.exit(process.exitCode??0)}),Av4(Q,{createContext:nQ,createThreadDependencies:e$,initializeCLIOverrides:_B}),Q.command("live-sync [threadIDOrURL]",{hidden:!0}).summary("Mirror live DTW thread changes into the current checkout").description("Experimental: watch a v2 thread URL or ID and mirror its live working-tree changes into your local checkout, or apply the current snapshot once and exit.").addHelpText("after",["","Examples:"," amp live-sync T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync --apply T-5928a90d-d53b-488f-a829-4e36442142ee"," amp live-sync https://ampcode.com/threads/T-5928a90d-d53b-488f-a829-4e36442142ee"].join(`
4960
4960
  `)).option("--apply <threadIDOrURL>","Apply the current DTW thread snapshot once and exit").option("--checkout","Automatically check out the thread commit when it differs").option("--skip-checkout","Skip the startup checkout prompt when commits differ").action(async(H,N,w)=>{if(H&&N.apply)throw new GA("Choose either a positional thread ID/URL or --apply <thread-id>, not both.",1);let u=N.apply??H;if(!u||u.trim().length===0)fQ.write(`live-sync watches a v2 thread and mirrors its live changes locally. Use --apply <thread-id> to materialize the current snapshot once and exit.
4961
4961
 
4962
4962
  `),w.outputHelp(),process.exit(0);let L=X5(u)??B8(u),R=w.optsWithGlobals(),_=await nQ(R);_B(w,R);let v=await e$(_,R),f=!1;try{if(N.checkout&&N.skipCheckout)throw new GA("Choose either --checkout or --skip-checkout, not both.",1);if(bC(v.serverStatus))throw hi0(v.serverStatus,_.ampURL);await HP4({ampURL:_.ampURL,threadId:L,configService:v.configService,threadSnapshotReader:{get:v.threadRemote.getThread},apiKey:process.env.AMP_API_KEY,applyOnce:typeof N.apply==="string",checkoutMode:N.checkout?"always":N.skipCheckout?"never":"prompt",promptForYesNo:LE0}),f=!0}finally{if(await v.asyncDispose(),f)process.exit(0)}});let E=async(H,N,w)=>{f00({storage:N.settings,secretStorage:N.secrets,workspaceRoot:process.cwd(),defaultAmpURL:N.ampURL,homeDir:wD0,userConfigDir:yi0});let u={...N,executeMode:!1};await bi0(u,{...H,openThreadSwitcher:!0},w)},D=Q.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").option("--include-archived","Include archived threads in the list").option("--limit <number>","Maximum number of threads to return",(H)=>qD0(H,"--limit",{min:1,max:500})).option("--offset <number>","Number of threads to skip",(H)=>qD0(H,"--offset",{min:0})).action(async(H,N)=>{let w=N.optsWithGlobals(),u=await nQ(w);await vk4(w,u,N)});D.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, unlisted, workspace, group)").action(async(H,N)=>{let w=N.optsWithGlobals(),u=await nQ(w);await oq6(w,u,N)}),D.command("continue [threadIDOrURLs...]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, interactive mode shows a picker. Use --last to continue the last thread for the current mode directly. When multiple thread are given, all are resumed and the first is shown in the foreground.").option("--last","Continue the last thread for the current mode directly").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,N,w)=>{let u=w.optsWithGlobals(),L=await nQ(u),R=Array.isArray(H)?H:[];if(N.pick)C7.write(`${R0.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
@@ -4981,8 +4981,8 @@ ${_}
4981
4981
 
4982
4982
  `)},async input(){return},async confirm(){return!1},async select(){return},async ask(){return{result:"uncertain",probability:0.5,reason:"AI not available"}}},loadGlobalPlugins:Fp0(u),pluginFilter:process.env.PLUGINS??"all"}),asyncDispose:async()=>{}}}),qT4(Q,async(H)=>{let N=H.optsWithGlobals(),w=await nQ(N);_B(H,N);let u=await e$(w,N),L=await u.secretStorage.get("apiKey",w.ampURL);if(!L)throw await u.asyncDispose(),new GA("API key required. Please run `amp login` first.",1);return{configService:u.configService,actorOptions:{apiKey:L,ampURL:w.ampURL,workspaceRoot:process.cwd(),dependencies:u},cleanupTerminal:eK,asyncDispose:u.asyncDispose.bind(u)}}),MT4(Q,async(H)=>{let N=H.optsWithGlobals(),w=await nQ(N);_B(H,N);let u=await e$(w,N),L=await u.secretStorage.get("apiKey",w.ampURL);if(!L)throw await u.asyncDispose(),new GA("API key required. Please run `amp login` first.",1);return{configService:u.configService,actorOptions:{apiKey:L,ampURL:w.ampURL,workspaceRoot:process.cwd(),dependencies:u},cleanupTerminal:eK,asyncDispose:u.asyncDispose.bind(u)}}),_T4(Q,async(H)=>{let N=H.optsWithGlobals(),w=await nQ(N);_B(H,N);let u=await e$(w,N);return{settings:w.settings,configService:u.configService,skillService:u.skillService,asyncDispose:u.asyncDispose.bind(u)}}),lP4(Q,async(H)=>{let N=H.optsWithGlobals();return await nQ(N)}),yP4(Q,async(H)=>{let N=await nQ(H);return{settings:N.settings,secretStorage:N.secrets,getThreadDeps:async(w)=>{_B(w,H);let u=await e$(N,H);return{mcpService:u.mcpService,settings:N.settings,asyncDispose:u.asyncDispose.bind(u)}}}}),MX4(Q,nQ),gL4(Q,async(H)=>lH0(await Al0(H))),Dv4(Q,nQ),ST4(Q,nQ);function Z(H,N,w){let L=typeof H.description==="string"?H.description:w===void 0?H.description(!0):H.description(w),R=new sD(N,L),_=Cq6(H);if(_)R.default(_);if(R.hidden=zq6(H)||Rk4(H),"choices"in H&&Array.isArray(H.choices))if("hiddenChoices"in H){let v=[...H.choices],f=Array.isArray(H.hiddenChoices)?H.hiddenChoices:[],h=new Set([...v,...f]);R.argParser((x)=>{if(!h.has(x))throw new b30(`Allowed choices are ${v.join(", ")}.`);return x})}else R.choices([...H.choices]);return R}for(let H of jk4){switch(H.type){case"flag":{Q.addOption(Z(H,`--${H.long}`)),Q.addOption(Z(H,`--no-${H.long}`,!1));break}case"switch":{Q.addOption(Z(H,`--${H.long}`,!0));break}case"optional-option":{Q.addOption(Z(H,`${"short"in H?`-${H.short}, `:""}--${H.long} [value]`));break}default:{Q.addOption(Z(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}if("aliases"in H&&Array.isArray(H.aliases))for(let N of H.aliases){let w=new sD(`--${N}`,H.description);w.hidden=!0,w.implies({[H.name]:!0}),Q.addOption(w)}}Q.hook("preAction",(H,N)=>{let w=N.optsWithGlobals();if(w.takeMeBack)J6(Hq6);if(w.archive&&!process.env.AMP_SDK_VERSION)J6("--archive is now the default and has been removed. Rerun without --archive. (If you want to not archive, use --no-archive-after-execute.)")});let F=new sD("-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);Q.addOption(F);let X=new sD("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp(!0);Q.addOption(X);let I=new sD("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);Q.addOption(I);let G=new sD("--stream-json-thinking","Include thinking blocks in stream JSON output (non-Claude Code extension). Implies --stream-json.").default(!1);Q.addOption(G);let V=new sD("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);Q.addOption(V);let K=new sD("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);Q.addOption(K);let z=new sD("--no-archive-after-execute","When used with --execute on a new thread, leave the thread unarchived after the command finishes.");Q.addOption(z);let W=new sD("--archive").default(!1).hideHelp(!0);Q.addOption(W);let C=new sD("-l, --label <label>","When used with --execute, add a label to the thread. Repeat the flag for multiple labels.").argParser((H,N)=>{if(N===void 0)return[H];return[...N,H]});return Q.addOption(C),Q.action(async(H,N)=>{let w=H,u=await nQ(w);if(Object.keys(w).forEach((L)=>{let R=jk4.find((_)=>_.name===L);if(R&&Rk4(R)&&!Wq6(R))C7.write(R0.yellow(`Warning: '--${L}' flag is deprecated
4983
4983
  `))}),N.args.length>0)wq6(u,N);await bi0(u,w,N)}),bR4(Q),Q}async function fk4(A,Q){await eD(($)=>hP($,A,Q))}async function Lq6(A){if(A.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof A.execute==="string"){let Q=(await Ql0()).trimEnd();return{userInput:A.execute,stdinInput:Q||null}}return{userInput:(await Ql0()).trimEnd(),stdinInput:null}}function jq6(A,Q,$){if(A.remote&&!Q)throw new GA("The -r/--remote flag requires --execute mode",1,'Use: amp --remote --execute "your message"');if(A.streamJson&&!Q)throw new GA("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(A.streamJsonInput&&!Q)throw new GA("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(A.streamJsonInput&&!A.streamJson)throw new GA("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(A.stats&&A.streamJson)throw new GA("The --stats and --stream-json flags are mutually exclusive output formats",1,'Use one or the other: amp --execute "your message" --stats OR amp --execute "your message" --stream-json');if(A.stats&&!Q)throw new GA("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(A.archiveAfterExecute===!1&&!Q)throw new GA("The --no-archive-after-execute flag requires --execute mode",1,'Use: amp --execute "your message" --no-archive-after-execute');if(A.streamJsonInput&&typeof A.execute==="string"&&A.execute.trim()!=="")throw new GA("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"},{"type":"image","source":{"type":"base64","media_type":"image/png","data":"..."}}]}}' | amp --execute --stream-json --stream-json-input`);if(Q&&$===""&&!A.streamJsonInput&&!A.headless)throw new GA("User message must be provided through stdin or as argument when using execute mode",1,`Either pass a message as an argument: amp --execute "your message"
4984
- Or pipe via stdin: echo "your message" | amp --execute`)}function Rq6(){wdA([S00.parse({tool:"*",action:"allow"})]),rmA({bypass:!0})}function Pq6(A){if(A.threadId&&!S7(A.threadId))delete A.threadId}async function bi0(A,Q,$){if(Q.headless)return Tq6(A,Q,$);let B=await e$(A,Q);if(Q.showWelcome&&Q.hideWelcome)throw await B.asyncDispose(),new GA("Cannot use --show-welcome and --hide-welcome together",1);let E=!A.executeMode&&await Kq6();return Rq6(),Pq6(Q),vq6(A,Q,$,B,{showNpmMigrationWelcome:E})}async function Tq6(A,Q,$){let B=(z,W)=>{let C=Number(process.hrtime.bigint()-W)/1e6,H=LX4();S.info("Startup phase",{phase:z,phaseMs:Math.round(C),sinceMainMs:H===null?void 0:Math.round(H)})};_B($,Q);let E=process.hrtime.bigint(),D=await e$(A,Q);B("runMainThread:createThreadDependencies",E);let{serverStatus:J}=D;if(bC(J))throw hi0(J,A.ampURL);let U=p9(J)?J:null,Y=U?.user.email,Z=Iw(J),F=Ci(Q,Z);if(F instanceof Error)J6(F.message);if(U&&ri(Q.mode)&&!u00(Q.mode,Y))throw new GA(`Agent mode '${Q.mode}' is only available for Amp employees`,1);rx0();let X=await D.secretStorage.get("apiKey",A.ampURL);if(!X)throw new GA("API key required for headless mode. Please run `amp login` first.",1);let I=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(I&&!S7(I))throw new GA(`Invalid thread ID: ${I}`,1);let G=I?void 0:await nq6({dependencies:D,apiKey:X,visibility:F??void 0}),V=I??G?.threadId;if(!V)throw new GA("Failed to resolve headless thread ID",1);let K=await HR4(V);if(K.status==="already-running")await D.asyncDispose(),await oY(),process.exit(0);try{await UR4({ampURL:A.ampURL,apiKey:X,workspaceRoot:process.cwd(),threadId:V,ownerUserId:G?.ownerUserId,threadVersion:G?.threadVersion,agentMode:G?.agentMode,initialToolDiscovery:Promise.all([D.mcpService.initialized,D.toolboxService.initialized,D.pluginService.initialized]).then(()=>{return}),configService:D.configService,mcpService:D.mcpService,toolService:D.toolService,skillService:D.skillService,pluginService:D.pluginService,pluginPlatform:D.headlessPluginPlatform,setActiveThreadID:(z)=>D.activeThread$.next(z)})}finally{await K.release(),await D.asyncDispose()}await oY(),process.exit(0)}async function vq6(A,Q,$,B,E){let{userInput:D,stdinInput:J}=await Lq6(Q),U=!!Q.streamJson||!!Q.streamJsonThinking;jq6({...Q,streamJson:U},A.executeMode,D),_B($,Q),SX4(),rx0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),F=Q.observe?X5(Q.observe)??B8(Q.observe):void 0,X=await B.serverStatusPromise;if(bC(X))throw hi0(X,A.ampURL);let I=Iw(X),G=()=>Fq6(B.configService,pkA.V2_LOCAL_THREAD_CHANGES),V=Ci(Q,I);if(V instanceof Error)J6(V.message);if(A.executeMode&&Q.remote){if(!ri(Q.mode))throw new GA("Remote execute mode does not support plugin-defined agent modes",1);if(!p9(X)||!uC(X.user.email))throw new GA("Remote execute mode is only available for Amp employees",1);await YT4(D,J,B.configService,Q.mode),await B.asyncDispose(),await oY(),process.exit(0)}let K=null,z=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let N=await p90(A.settings,process.cwd(),I,V);if(N instanceof Error)J6(N.message);return N})(),K},W=await B.secretStorage.get("apiKey",A.ampURL);if(!W)throw new GA("API key required. Please run `amp login` first.",1);let C=p9(X)&&uC(X.user.email);if(A.executeMode){if(Z.length>1)throw new GA("Execute mode can only resume one thread.",1);mP4(B.mcpService,A.settings);try{await B.pluginService.initialized;let H=Sk4(B.pluginService,Q.mode),N=Pk4($,Q),w=await aN(),u=Y?N:Zy0({agentMode:H.agentMode,explicitEffort:N,sessionState:w}),L=Y?void 0:$50(await bP(B.configService),{agentMode:H.agentMode,explicitEffort:N,sessionState:w}),R=Y?void 0:await z(),{threadID:_}=await dT({apiKey:W,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:D,stdinInput:J,stats:!!Q.stats,streamJson:U,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:H.agentMode,reasoningEffort:H.agent?void 0:u,agent:H.agent,labels:Q.label,initialThreadID:Y,initialThreadMeta:R,initialSettings:L});if(await fk4(_,"execute"),Q.archive||!Y&&Q.archiveAfterExecute!==!1)await B.threadRemote.archiveThread(_,!0)}finally{await B.asyncDispose()}await oY(),process.exit(0)}else{let H=Pk4($,Q),N=await qq6($,B.pluginService,Q.mode),w=E.showNpmMigrationWelcome?"npm-migration":"intro",u=jp0("0.0.1780932011-gc0dbaf",B.settingsStorage,{startDelayMs:3000}),L=new cp0(B.mcpService,A.settings.getWorkspaceRootPath()),R=Ug(B.configService),_=new Zl0(B.fuzzyServer),v=process.cwd();await oR4({ampURL:A.ampURL,apiKey:W,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??Y7(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:f})=>bT({workspaceRoot:v},f),canUseV2LocalThreadChanges:G,completionBuilder:_,updateService:u,workspaceRoot:v,listThreads:()=>R.listThreads(),getThreadFromServer:(f)=>R.getThread(f),getThreadTail:async(f,h)=>{let x=await L4.getThreadTail({thread:f,limit:h},{config:B.configService});if(!x.ok){if(x.error.code==="thread-not-found")return null;throw Error(x.error.message??x.error.code)}return{...x.result.thread.data,messages:x.result.messages}},toolboxes:B.toolboxService.toolboxes,isInternalUser:C,settingsFilePath:B.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:B.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:L,setActiveThreadID:(f)=>B.activeThread$.next(f),dispose:()=>{return L.dispose(),u.dispose(),B.asyncDispose()}},{initialThreadIDs:F?[F]:Z,initialUserInput:D||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?_k4:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!F,hideWelcome:!!Q.hideWelcome,showWelcome:Q.showWelcome,welcomeVariant:w,initialAgentMode:N?.agentMode,initialPluginAgentModeKey:N?.pluginAgentModeKey,initialReasoningEffort:H}),process.exit(0)}}async function nQ(A){if(S.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)C7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4985
- `);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;S.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await EoA({get:async(U)=>{if(U!==Ch)return;try{let Y=await eN6(xi0,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(U,Y)=>{if(U!==Ch)return;await tN6(oi.dirname(xi0),{recursive:!0}),await Aq6(xi0,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:r40()});rbA(B);let E=await Al0({...A,workspaceTrust:{current:!0,changes:Fy},getHook:process.env.AMP_URL?(U,Y)=>{if(U==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let U=await hP4(A.mcpConfig);E=gP4(E,U)}let D=oi.dirname(E.getSettingsFilePath());DJ4(sy,D),E=lH0(E);let J=await E.get("url","admin")??await E.get("url","global");if(!J)J=S8;if(S.info("Resolved Amp URL",{ampURL:J,settingsFile:E.getSettingsFilePath(),workspaceRoot:E.getWorkspaceRootPath()}),!cO(J))S.info("Targeting custom Amp server",{ampURL:J});return{executeMode:Q,isTTY:$,ampURL:J,settings:E,secrets:OT4(await ep0(A,E))}}function _q6(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let D=B.slice(2).replace(/-([a-z])/g,(U,Y)=>Y.toUpperCase()),J=A[$+1];if(J&&!J.startsWith("--"))Q[D]=J,$++}}return Q}function Sq6(A,Q){let $=A.includes("--headless")||A.some((E)=>E.startsWith("--headless=")),B=oi.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?$q6:mc));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function kq6(){OX4();let A=_q6(process.argv),Q=Sq6(process.argv,A),$=kX4(Q);cB0("silent");let B=process.argv.includes("--no-color"),E=process.argv.includes("--color"),D=process.stdout.isTTY&&process.stderr.isTTY;if(B||!E&&!D)R0.level=0;if(Eq6(S),S.info("Starting Amp CLI.",{version:"0.0.1780932011-gc0dbaf",buildTimestamp:"2026-06-08T15:25:00.456Z"}),process.platform==="win32"&&rN())SR4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new GA(C3.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await Oq6($).parseAsync(process.argv)}BJ4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await kq6().catch(l90)});async function fq6(A,Q){let $=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!$)await A.settings.set("url",process.env.AMP_URL,"global"),fQ.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4984
+ Or pipe via stdin: echo "your message" | amp --execute`)}function Rq6(){wdA([S00.parse({tool:"*",action:"allow"})]),rmA({bypass:!0})}function Pq6(A){if(A.threadId&&!S7(A.threadId))delete A.threadId}async function bi0(A,Q,$){if(Q.headless)return Tq6(A,Q,$);let B=await e$(A,Q);if(Q.showWelcome&&Q.hideWelcome)throw await B.asyncDispose(),new GA("Cannot use --show-welcome and --hide-welcome together",1);let E=!A.executeMode&&await Kq6();return Rq6(),Pq6(Q),vq6(A,Q,$,B,{showNpmMigrationWelcome:E})}async function Tq6(A,Q,$){let B=(z,W)=>{let C=Number(process.hrtime.bigint()-W)/1e6,H=LX4();S.info("Startup phase",{phase:z,phaseMs:Math.round(C),sinceMainMs:H===null?void 0:Math.round(H)})};_B($,Q);let E=process.hrtime.bigint(),D=await e$(A,Q);B("runMainThread:createThreadDependencies",E);let{serverStatus:J}=D;if(bC(J))throw hi0(J,A.ampURL);let U=p9(J)?J:null,Y=U?.user.email,Z=Iw(J),F=Ci(Q,Z);if(F instanceof Error)J6(F.message);if(U&&ri(Q.mode)&&!u00(Q.mode,Y))throw new GA(`Agent mode '${Q.mode}' is only available for Amp employees`,1);rx0();let X=await D.secretStorage.get("apiKey",A.ampURL);if(!X)throw new GA("API key required for headless mode. Please run `amp login` first.",1);let I=typeof Q.headless==="string"&&Q.headless!=="true"?Q.headless:void 0;if(I&&!S7(I))throw new GA(`Invalid thread ID: ${I}`,1);let G=I?void 0:await nq6({dependencies:D,apiKey:X,visibility:F??void 0}),V=I??G?.threadId;if(!V)throw new GA("Failed to resolve headless thread ID",1);let K=await HR4(V);if(K.status==="already-running")await D.asyncDispose(),await oY(),process.exit(0);try{await UR4({ampURL:A.ampURL,apiKey:X,workspaceRoot:process.cwd(),threadId:V,ownerUserId:G?.ownerUserId,threadVersion:G?.threadVersion,agentMode:G?.agentMode,initialToolDiscovery:Promise.all([D.mcpService.initialized,D.toolboxService.initialized,D.pluginService.initialized]).then(()=>{return}),configService:D.configService,mcpService:D.mcpService,toolService:D.toolService,skillService:D.skillService,pluginService:D.pluginService,pluginPlatform:D.headlessPluginPlatform,setActiveThreadID:(z)=>D.activeThread$.next(z)})}finally{await K.release(),await D.asyncDispose()}await oY(),process.exit(0)}async function vq6(A,Q,$,B,E){let{userInput:D,stdinInput:J}=await Lq6(Q),U=!!Q.streamJson||!!Q.streamJsonThinking;jq6({...Q,streamJson:U},A.executeMode,D),_B($,Q),SX4(),rx0();let Y=Q.threadId,Z=Q.resumeThreadIDs??(Y?[Y]:[]),F=Q.observe?X5(Q.observe)??B8(Q.observe):void 0,X=await B.serverStatusPromise;if(bC(X))throw hi0(X,A.ampURL);let I=Iw(X),G=()=>Fq6(B.configService,pkA.V2_LOCAL_THREAD_CHANGES),V=Ci(Q,I);if(V instanceof Error)J6(V.message);if(A.executeMode&&Q.remote){if(!ri(Q.mode))throw new GA("Remote execute mode does not support plugin-defined agent modes",1);if(!p9(X)||!uC(X.user.email))throw new GA("Remote execute mode is only available for Amp employees",1);await YT4(D,J,B.configService,Q.mode),await B.asyncDispose(),await oY(),process.exit(0)}let K=null,z=async()=>{let H=B.consumeDraftNewThreadVisibility();if(H!==null)return H;return K??=(async()=>{let N=await p90(A.settings,process.cwd(),I,V);if(N instanceof Error)J6(N.message);return N})(),K},W=await B.secretStorage.get("apiKey",A.ampURL);if(!W)throw new GA("API key required. Please run `amp login` first.",1);let C=p9(X)&&uC(X.user.email);if(A.executeMode){if(Z.length>1)throw new GA("Execute mode can only resume one thread.",1);mP4(B.mcpService,A.settings);try{await B.pluginService.initialized;let H=Sk4(B.pluginService,Q.mode),N=Pk4($,Q),w=await aN(),u=Y?N:Zy0({agentMode:H.agentMode,explicitEffort:N,sessionState:w}),L=Y?void 0:$50(await bP(B.configService),{agentMode:H.agentMode,explicitEffort:N,sessionState:w}),R=Y?void 0:await z(),{threadID:_}=await dT({apiKey:W,ampURL:A.ampURL,workspaceRoot:process.cwd(),dependencies:B,userInput:D,stdinInput:J,stats:!!Q.stats,streamJson:U,streamJsonThinking:!!Q.streamJsonThinking,streamJsonInput:!!Q.streamJsonInput,stdin:process.stdin,agentMode:H.agentMode,reasoningEffort:H.agent?void 0:u,agent:H.agent,labels:Q.label,initialThreadID:Y,initialThreadMeta:R,initialSettings:L});if(await fk4(_,"execute"),Q.archive||!Y&&Q.archiveAfterExecute!==!1)await B.threadRemote.archiveThread(_,!0)}finally{await B.asyncDispose()}await oY(),process.exit(0)}else{let H=Pk4($,Q),N=await qq6($,B.pluginService,Q.mode),w=E.showNpmMigrationWelcome?"npm-migration":"intro",u=jp0("0.0.1780942552-g0295b6",B.settingsStorage,{startDelayMs:3000}),L=new cp0(B.mcpService,A.settings.getWorkspaceRootPath()),R=Ug(B.configService),_=new Zl0(B.fuzzyServer),v=process.cwd();await oR4({ampURL:A.ampURL,apiKey:W,rivetEndpoint:process.env.RIVET_PUBLIC_ENDPOINT??Y7(A.ampURL),configService:B.configService,toolService:B.toolService,pluginPlatform:B.pluginPlatform,pluginService:B.pluginService,skillService:B.skillService,mcpService:B.mcpService,readFileSystemDirectory:({uri:f})=>bT({workspaceRoot:v},f),canUseV2LocalThreadChanges:G,completionBuilder:_,updateService:u,workspaceRoot:v,listThreads:()=>R.listThreads(),getThreadFromServer:(f)=>R.getThread(f),getThreadTail:async(f,h)=>{let x=await L4.getThreadTail({thread:f,limit:h},{config:B.configService});if(!x.ok){if(x.error.code==="thread-not-found")return null;throw Error(x.error.message??x.error.code)}return{...x.result.thread.data,messages:x.result.messages}},toolboxes:B.toolboxService.toolboxes,isInternalUser:C,settingsFilePath:B.settingsStorage.getSettingsFilePath(),workspaceSettingsFilePath:B.settingsStorage.getWorkspaceSettingsPath(),mcpTrustHandler:L,setActiveThreadID:(f)=>B.activeThread$.next(f),dispose:()=>{return L.dispose(),u.dispose(),B.asyncDispose()}},{initialThreadIDs:F?[F]:Z,initialUserInput:D||void 0,getDefaultNewThreadVisibility:z,onFirstFrame:Q.ide?_k4:void 0,openThreadPickerOnStart:Q.openThreadSwitcher,observerOnly:!!F,hideWelcome:!!Q.hideWelcome,showWelcome:Q.showWelcome,welcomeVariant:w,initialAgentMode:N?.agentMode,initialPluginAgentModeKey:N?.pluginAgentModeKey,initialReasoningEffort:H}),process.exit(0)}}async function nQ(A){if(S.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),A.interactive)C7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
4985
+ `);let Q=!!A.execute||!process.stdout.isTTY&&!A.streamJson,$=process.stdout.isTTY&&process.stderr.isTTY;S.info("Execution mode resolved",{executeMode:Q,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:A.streamJson,executeFlag:A.execute});let B=await EoA({get:async(U)=>{if(U!==Ch)return;try{let Y=await eN6(xi0,"utf-8");return JSON.parse(Y).installationID}catch{return}},set:async(U,Y)=>{if(U!==Ch)return;await tN6(oi.dirname(xi0),{recursive:!0}),await Aq6(xi0,JSON.stringify({installationID:Y},null,2),{mode:384})}},{clientType:"cli",platform:r40()});rbA(B);let E=await Al0({...A,workspaceTrust:{current:!0,changes:Fy},getHook:process.env.AMP_URL?(U,Y)=>{if(U==="url")return Promise.resolve(process.env.AMP_URL);return Y()}:void 0});if(A.mcpConfig){let U=await hP4(A.mcpConfig);E=gP4(E,U)}let D=oi.dirname(E.getSettingsFilePath());DJ4(sy,D),E=lH0(E);let J=await E.get("url","admin")??await E.get("url","global");if(!J)J=S8;if(S.info("Resolved Amp URL",{ampURL:J,settingsFile:E.getSettingsFilePath(),workspaceRoot:E.getWorkspaceRootPath()}),!cO(J))S.info("Targeting custom Amp server",{ampURL:J});return{executeMode:Q,isTTY:$,ampURL:J,settings:E,secrets:OT4(await ep0(A,E))}}function _q6(A){let Q={};for(let $=0;$<A.length;$++){let B=A[$];if(B?.startsWith("--")){let D=B.slice(2).replace(/-([a-z])/g,(U,Y)=>Y.toUpperCase()),J=A[$+1];if(J&&!J.startsWith("--"))Q[D]=J,$++}}return Q}function Sq6(A,Q){let $=A.includes("--headless")||A.some((E)=>E.startsWith("--headless=")),B=oi.resolve(Q.logFile??process.env.AMP_LOG_FILE??($?$q6:mc));return{logLevel:Q.logLevel??process.env.AMP_LOG_LEVEL??"info",logFile:B}}async function kq6(){OX4();let A=_q6(process.argv),Q=Sq6(process.argv,A),$=kX4(Q);cB0("silent");let B=process.argv.includes("--no-color"),E=process.argv.includes("--color"),D=process.stdout.isTTY&&process.stderr.isTTY;if(B||!E&&!D)R0.level=0;if(Eq6(S),S.info("Starting Amp CLI.",{version:"0.0.1780942552-g0295b6",buildTimestamp:"2026-06-08T18:21:11.038Z"}),process.platform==="win32"&&rN())SR4();if(parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new GA(C3.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await Oq6($).parseAsync(process.argv)}BJ4().startActiveSpan("main",async(A)=>{process.on("exit",()=>A.end()),await kq6().catch(l90)});async function fq6(A,Q){let $=A.ampURL.includes("localhost")||A.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!$)await A.settings.set("url",process.env.AMP_URL,"global"),fQ.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
4986
4986
  `);else if(!cO(A.ampURL))fQ.write(`Logging in to ${new URL(A.ampURL).hostname}
4987
4987
  `);let B=process.env.AMP_API_KEY;if(B)fQ.write(`API key found in environment variable, storing...
4988
4988
  `),await Q.set("apiKey",B,A.ampURL),fQ.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1780932011-gc0dbaf",
3
+ "version": "0.0.1780942552-g0295b6",
4
4
  "description": "Renamed to @ampcode/cli - see https://ampcode.com/news/npm-package-changes",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -8,7 +8,7 @@
8
8
  "amp": "node_modules/@ampcode/cli/bin/amp.exe"
9
9
  },
10
10
  "dependencies": {
11
- "@ampcode/cli": "0.0.1780932011-gc0dbaf"
11
+ "@ampcode/cli": "0.0.1780942552-g0295b6"
12
12
  },
13
13
  "files": [
14
14
  "dist/main.js",