@sourcegraph/amp 0.0.1774339849-g374434 → 0.0.1774341467-g86d7fe

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.js +9 -9
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -4655,7 +4655,7 @@ ${U9(Lx5)}
4655
4655
  `);if(K!==-1)Z=pW4(Z,X,Y,K);return Y+Z+X};Object.defineProperties(ql.prototype,Hk);var zf5=ql(),tt8=ql({level:cW4?cW4.level:0});var c0=zf5;var GD4=G4(VD4(),1),{program:Ke8,createCommand:Ve8,createArgument:Ge8,createOption:Fe8,CommanderError:FD4,InvalidArgumentError:ze8,InvalidOptionArgumentError:qe8,Command:eN,Argument:Ue8,Option:LG,Help:We8}=GD4.default;dX();D4();w1();g0();L3();M$();b2();Kc();b3();XK();KJ();TV();MC();QQ();tB();hA();f4();g0();b2();var cf5=4;function lf5(J){return Math.ceil(J.length/cf5)}function zD4(J,Z,Q,Y){let X=J.thread.messages.length>0?qp(J.thread):[{role:"user",content:"x"}];while(X.length>0&&X.at(-1)?.role==="assistant")X=X.slice(0,-1);X=S90(X);let K=_M(J.tools);return{client:Z,model:Q,headers:Y,systemPrompt:J.systemPrompt,messages:X,tools:K,toolSpecs:J.tools}}async function Bk(J,Z,Q,Y){try{return(await J.messages.countTokens({model:Z,messages:Y.messages??[{role:"user",content:"x"}],...Y.tools&&Y.tools.length>0?{tools:Y.tools}:{},...Y.system&&Y.system.length>0?{system:Y.system}:{},thinking:{type:"enabled",budget_tokens:1e4}},{headers:Q})).input_tokens}catch(X){P.warn("countTokens failed, falling back to estimate",{error:X});let K=JSON.stringify(Y.messages??[]),V=JSON.stringify(Y.tools??[]),G=JSON.stringify(Y.system??[]);return lf5(K+V+G)}}var qD4={async count(J,Z){switch(Z.kind){case"full":return Bk(J.client,J.model,J.headers,{messages:J.messages,tools:J.tools,system:J.systemPrompt});case"no_messages":return Bk(J.client,J.model,J.headers,{tools:J.tools,system:J.systemPrompt});case"no_tools":return Bk(J.client,J.model,J.headers,{messages:J.messages,system:J.systemPrompt});case"system_only":return Bk(J.client,J.model,J.headers,{system:J.systemPrompt});case"tools_only":return Bk(J.client,J.model,J.headers,{tools:_M(Z.tools),system:J.systemPrompt});case"text":return Bk(J.client,J.model,J.headers,{messages:[{role:"user",content:Z.text}]})}}};qc();function if5(J){return J.map((Z)=>Z.text).join(`
4656
4656
 
4657
4657
  `)}function nf5(J,Z){let Y=[...Fc(J)];while(Y.length>0){let X=Y.at(-1);if(X&&typeof X==="object"&&"type"in X&&X.type==="message"&&"role"in X&&X.role==="assistant")Y.pop();else break}return[{role:"system",content:Z},...Y]}function UD4(J){return J.map(zc)}async function Wl(J,Z){return(await J.client.responses.inputTokens.count({model:J.model,input:Z.input,...Z.tools.length>0?{tools:Z.tools}:{}})).input_tokens}function WD4(J,Z,Q){let Y=if5(J.systemPrompt),X;if(J.thread.messages.length>0)X=nf5(J.thread,Y);else X=[{role:"system",content:Y},{type:"message",role:"user",content:"x"}];let K=[{role:"system",content:Y},{type:"message",role:"user",content:"x"}],V=UD4(J.tools);return{client:Z,model:Q,systemPromptContent:Y,fullInput:X,systemOnlyInput:K,tools:V}}var DD4={async count(J,Z){switch(Z.kind){case"full":return Wl(J,{input:J.fullInput,tools:J.tools});case"no_messages":return Wl(J,{input:J.systemOnlyInput,tools:J.tools});case"no_tools":return Wl(J,{input:J.fullInput,tools:[]});case"system_only":return Wl(J,{input:J.systemOnlyInput,tools:[]});case"tools_only":return Wl(J,{input:J.systemOnlyInput,tools:UD4(Z.tools)});case"text":return(await J.client.responses.inputTokens.count({model:J.model,input:Z.text})).input_tokens}}};async function az(J,Z){if(J.provider==="anthropic")return qD4.count(J.ctx,Z);return DD4.count(J.ctx,Z)}async function OZ0(J,Z,Q){let{onProgress:Y}=J,X=8,K=0,V=(X0)=>{K++,Y?.(X0,K,8)};if(V("Initializing..."),J.mcpInitialized)await J.mcpInitialized,await new Promise((X0)=>setTimeout(X0,100));let G=await J.configService.getLatest(Q),F=f8(Z),z,q;if(J.agentModeOverride&&F===0)q=J.agentModeOverride,z=uX(q);else{let X0=HJ(G.settings,Z);z=X0.model,q=X0.agentMode}P.debug("Context analyzer model selection",{agentModeOverride:J.agentModeOverride,humanMsgCount:F,threadAgentMode:Z.agentMode,resolvedAgentMode:q,selectedModel:z});let{provider:U,model:W}=dF(z),D=U==="anthropic"&&Yv0(q,W),H=Z7(Z),B=O$(z),N=B.displayName,w=U==="anthropic"?T90(W,{enableLargeContext:D}):B.contextWindow-B.maxOutputTokens;P.debug("Context analysis model spec",{modelName:W,provider:U,modelDisplayName:N,maxContextTokens:w,lastUsageModel:H?.model}),V("Building system prompt...");let{systemPrompt:L,tools:O}=await pz(J.buildSystemPromptDeps,Z,{enableTaskList:!1,enableTask:!0,enableOracle:!0},{model:W,provider:U,agentMode:q},Q),E=O.filter((X0)=>X0.source==="builtin"),M=O.filter((X0)=>typeof X0.source==="object"&&("mcp"in X0.source)),A=O.filter((X0)=>typeof X0.source==="object"&&("toolbox"in X0.source)),j=[...E,...M,...A];P.debug("Context analysis tools breakdown",{totalTools:j.length,builtinCount:E.length,mcpCount:M.length,toolboxCount:A.length});let S=(await Gz({...J.buildSystemPromptDeps,configService:J.configService},Z,Q)).filter((X0)=>X0.type==="project"||X0.type==="parent"||X0.type==="user"||X0.type==="mentioned"),_=[];for(let X0 of Z.messages)if(X0.role==="user"){for(let t of X0.content)if(t.type==="tool_result"&&t.run?.status==="done"){let K0=t.run.result;if(typeof K0==="object"&&K0!==null&&"discoveredGuidanceFiles"in K0&&Array.isArray(K0.discoveredGuidanceFiles)){for(let L0 of K0.discoveredGuidanceFiles)if(L0.content)_.push({uri:L0.uri,content:L0.content})}}if(X0.discoveredGuidanceFiles){for(let t of X0.discoveredGuidanceFiles)if(t.content)_.push({uri:t.uri,content:t.content})}}let f={thread:Z,systemPrompt:L,tools:j},m=F7(J.workersServiceAuthToken),x;if(U==="openai"){let X0={...m??{},...y2(),...k2(Z),[q2]:"amp.context-analyze","x-amp-override-provider":"openai"},t=await _N({configService:J.configService},Q,{defaultHeaders:X0});x={provider:"openai",ctx:WD4(f,t,W)}}else{let X0=await MQ({configService:J.configService},Q,m?{defaultHeaders:m}:void 0),t={...WT(G.settings,{id:Z.id,agentMode:q},W,void 0,{enableLargeContext:D}),...m??{},[q2]:"amp.context-analyze","x-amp-override-provider":"anthropic"};x={provider:"anthropic",ctx:zD4(f,X0,OW(W),t)}}V("Counting total tokens...");let T=await az(x,{kind:"full"});V("Counting messages...");let u=await az(x,{kind:"no_messages"});V("Counting tools...");let p=await az(x,{kind:"no_tools"});V("Counting system prompt...");let d=await az(x,{kind:"system_only"});V("Counting AGENTS.md files...");let h=[];if(S.length>0){let X0=await Promise.all(S.map(async(t)=>{let K0=await az(x,{kind:"text",text:t.content});return{uri:t.uri,tokens:K0}}));h.push(...X0)}let n=h.reduce((X0,t)=>X0+t.tokens,0),c=[],s=0;if(_.length>0){let X0=await Promise.all(_.map(async(t)=>{let K0=c_([{uri:t.uri,lineCount:t.content.split(`
4658
- `).length,content:t.content}]),L0=await az(x,{kind:"text",text:K0});return{uri:t.uri,tokens:L0}}));c.push(...X0),s=c.reduce((t,K0)=>t+K0.tokens,0)}let z0=T-u,a=Math.max(0,z0-s),q0=T-p,w0=Math.max(0,d-n),F0=q0,$0=0,W0=[];if(M.length>0&&(E.length>0||A.length>0)){let t=await az(x,{kind:"tools_only",tools:[...E,...A]}),K0=await az(x,{kind:"system_only"}),L0=t-K0;$0=q0-L0,F0=L0}else if(M.length>0)$0=q0,F0=0;if(V("Finalizing..."),M.length>0){let X0=new Map;for(let K0 of M){let V0=K0.source.mcp,B0=X0.get(V0)??[];B0.push(K0),X0.set(V0,B0)}let t=await Promise.all(Array.from(X0.entries()).map(async([K0,L0])=>{let V0=await az(x,{kind:"tools_only",tools:L0}),B0=await az(x,{kind:"system_only"});return{server:K0,tokens:V0-B0}}));W0.push(...t)}let i=[];i.push({name:"System prompt",tokens:w0,percentage:w0/w*100});let o=A.length>0?"Builtin + toolbox tools":"Builtin tools";i.push({name:o,tokens:F0,percentage:F0/w*100});let e=[...h,...c],Q0=n+s;if(e.length>0){let X0=null,t=Z.env?.initial?.trees?.find((V0)=>V0.uri!==void 0)?.uri??null;if(t)X0=t;else{let V0=await M1(J.configService.workspaceRoot,Q);if(V0)X0=c1(V0)}let K0={workspaceFolders:X0?[X0]:null,isWindows:pF().os==="windows",homeDir:J.configService.homeDir?c1(J.configService.homeDir):void 0},L0=e.map((V0)=>({name:t8(V0.uri,K0),tokens:V0.tokens,percentage:V0.tokens/w*100}));i.push({name:"AGENTS.md files",tokens:Q0,percentage:Q0/w*100,children:L0})}if(M.length>0){let X0=W0.map((t)=>({name:t.server,tokens:t.tokens,percentage:t.tokens/w*100}));i.push({name:"MCP tools",tokens:$0,percentage:$0/w*100,children:X0.length>1?X0:void 0})}if(Z.messages.length>0)i.push({name:"Messages",tokens:a,percentage:a/w*100});let Y0=Math.max(0,w-T);return{model:W,modelDisplayName:N,maxContextTokens:w,sections:i,totalTokens:T,freeSpace:Y0,toolCounts:{builtin:E.length,mcp:M.length,toolbox:A.length,total:j.length}}}f4();w1();D4();g0();import*as HD4 from"node:child_process";import*as BD4 from"node:fs/promises";import*as ND4 from"node:path";import{promisify as of5}from"node:util";function af5(J){if(J.startsWith("http://")||J.startsWith("https://"))try{let Z=new URL(J);return Z.username="",Z.password="",Z.toString()}catch{}return J}function EZ0(J){let Z=["github.com","gitlab.com"];J=af5(J);let Q=null,Y=null,X=J.match(/^([^@]+)@([^:/]+)[:/](.+)$/);if(X&&X[1]&&X[2]&&X[3]){let K=X[1],V=X[2],G=X[3],F=K==="git",z=V==="github.com"&&K.startsWith("org-");if(F||z)Q=V,Y=G}if(!Q||!Y){let K=J.match(/^https?:\/\/([^/]+)\/(.+)$/);if(K&&K[1]&&K[2])Q=K[1],Y=K[2]}if(!Q||!Y){let K=J.match(/^([^:]+):(.+)$/);if(K&&K[1]&&K[2])Q=K[1],Y=K[2]}if(Q&&Y&&Z.includes(Q)){let K=Y.replace(/\.git$/,"").replace(/\/+$/,"").replace(/@[^/]+$/,"");return`https://${Q}/${K}`.toLowerCase()}return J.replace(/\.git$/,"").replace(/\/+$/,"").replace(/@[^/]+$/,"").toLowerCase()}var Bd0=of5(HD4.exec);async function wD4(J){let Z={displayName:X1.basename(J)};if(!xF(J))return Z;Z.uri=c1(J);try{if(!await BD4.access(ND4.join(J.fsPath,".git")).then(()=>!0).catch(()=>!1))return Z;let{stdout:Y}=await Bd0("git remote get-url origin",{cwd:J.fsPath}).catch(()=>({stdout:""}));if(!Y.trim())return Z;let{stdout:X}=await Bd0("git symbolic-ref HEAD",{cwd:J.fsPath}).catch(()=>({stdout:""})),{stdout:K}=await Bd0("git rev-parse HEAD",{cwd:J.fsPath}).catch(()=>({stdout:""}));return{...Z,repository:{type:"git",url:EZ0(Y.trim()),ref:X.trim()||void 0,sha:K.trim()??void 0}}}catch(Q){return P.error("Error getting repository info:",Q,{dir:J.fsPath}),Z}}KJ();MC();function LD4(){let J=ME(),Z=pF(),Q=uu1();return{os:Z.os,osVersion:Z.osVersion,cpuArchitecture:Z.cpuArchitecture,webBrowser:Z.webBrowser,client:J.name,clientVersion:J.version,clientType:J.type,installationID:Q?.installationID,deviceFingerprint:Q?.deviceFingerprint}}D4();async function AZ(){return{trees:[await wD4(Y1.file(process.cwd()))],platform:LD4()}}var rf5="https://production.ampworkers.com",sf5="https://staging.ampworkers.com";function p7(J){if(J.includes("staging.ampcodedev.org"))return sf5;return rf5}var tf5="https://thread-actors-prod-us-central1-935747076731.us-central1.run.app",ef5="https://thread-actors-staging-us-central1-739316246630.us-central1.run.app";function MZ0(J){if(J.includes("staging.ampcodedev.org"))return ef5;return tf5}async function AZ0(J){let Z=J.workerURL??p7(J.ampURL),Q=await J.configService.getLatest(J.signal),Y=await Q.secrets.getToken("apiKey",Q.settings.url);if(!Y)throw Error("API key required. Please run `amp login` first.");let X=await fetch(`${Z}/threads/${J.threadID}/context-analysis`,{method:"GET",headers:{Authorization:`Bearer ${Y}`},signal:J.signal});if(!X.ok){let V=await X.text();throw Error(`Context analysis request failed (${X.status}): ${V}`)}let K=await X.json();if(!K.ok||!K.analysis)throw Error(K.error??"Invalid context analysis response from DTW");return K.analysis}var{stderr:$u5,stdout:B7}=process;function OG(J,Z=!1){if(Z||J<1000)return J.toLocaleString();return`${(J/1000).toFixed(1)}k`}function OD4(J,Z,Q,Y,X,K,V){return}async function Ju5(J,Z,Q,Y,X,K,V,G,F,z){K(X,J);let q=await V(Z,J);try{let U=await G(Q??null),W=Y.v2===!0;$u5.write(c0.dim(W?`Analyzing context tokens via v2 worker...
4658
+ `).length,content:t.content}]),L0=await az(x,{kind:"text",text:K0});return{uri:t.uri,tokens:L0}}));c.push(...X0),s=c.reduce((t,K0)=>t+K0.tokens,0)}let z0=T-u,a=Math.max(0,z0-s),q0=T-p,w0=Math.max(0,d-n),F0=q0,$0=0,W0=[];if(M.length>0&&(E.length>0||A.length>0)){let t=await az(x,{kind:"tools_only",tools:[...E,...A]}),K0=await az(x,{kind:"system_only"}),L0=t-K0;$0=q0-L0,F0=L0}else if(M.length>0)$0=q0,F0=0;if(V("Finalizing..."),M.length>0){let X0=new Map;for(let K0 of M){let V0=K0.source.mcp,B0=X0.get(V0)??[];B0.push(K0),X0.set(V0,B0)}let t=await Promise.all(Array.from(X0.entries()).map(async([K0,L0])=>{let V0=await az(x,{kind:"tools_only",tools:L0}),B0=await az(x,{kind:"system_only"});return{server:K0,tokens:V0-B0}}));W0.push(...t)}let i=[];i.push({name:"System prompt",tokens:w0,percentage:w0/w*100});let o=A.length>0?"Builtin + toolbox tools":"Builtin tools";i.push({name:o,tokens:F0,percentage:F0/w*100});let e=[...h,...c],Q0=n+s;if(e.length>0){let X0=null,t=Z.env?.initial?.trees?.find((V0)=>V0.uri!==void 0)?.uri??null;if(t)X0=t;else{let V0=await M1(J.configService.workspaceRoot,Q);if(V0)X0=c1(V0)}let K0={workspaceFolders:X0?[X0]:null,isWindows:pF().os==="windows",homeDir:J.configService.homeDir?c1(J.configService.homeDir):void 0},L0=e.map((V0)=>({name:t8(V0.uri,K0),tokens:V0.tokens,percentage:V0.tokens/w*100}));i.push({name:"AGENTS.md files",tokens:Q0,percentage:Q0/w*100,children:L0})}if(M.length>0){let X0=W0.map((t)=>({name:t.server,tokens:t.tokens,percentage:t.tokens/w*100}));i.push({name:"MCP tools",tokens:$0,percentage:$0/w*100,children:X0.length>1?X0:void 0})}if(Z.messages.length>0)i.push({name:"Messages",tokens:a,percentage:a/w*100});let Y0=Math.max(0,w-T);return{model:W,modelDisplayName:N,maxContextTokens:w,sections:i,totalTokens:T,freeSpace:Y0,toolCounts:{builtin:E.length,mcp:M.length,toolbox:A.length,total:j.length}}}f4();w1();D4();g0();import*as HD4 from"node:child_process";import*as BD4 from"node:fs/promises";import*as ND4 from"node:path";import{promisify as of5}from"node:util";function af5(J){if(J.startsWith("http://")||J.startsWith("https://"))try{let Z=new URL(J);return Z.username="",Z.password="",Z.toString()}catch{}return J}function EZ0(J){let Z=["github.com","gitlab.com"];J=af5(J);let Q=null,Y=null,X=J.match(/^([^@]+)@([^:/]+)[:/](.+)$/);if(X&&X[1]&&X[2]&&X[3]){let K=X[1],V=X[2],G=X[3],F=K==="git",z=V==="github.com"&&K.startsWith("org-");if(F||z)Q=V,Y=G}if(!Q||!Y){let K=J.match(/^https?:\/\/([^/]+)\/(.+)$/);if(K&&K[1]&&K[2])Q=K[1],Y=K[2]}if(!Q||!Y){let K=J.match(/^([^:]+):(.+)$/);if(K&&K[1]&&K[2])Q=K[1],Y=K[2]}if(Q&&Y&&Z.includes(Q)){let K=Y.replace(/\.git$/,"").replace(/\/+$/,"").replace(/@[^/]+$/,"");return`https://${Q}/${K}`.toLowerCase()}return J.replace(/\.git$/,"").replace(/\/+$/,"").replace(/@[^/]+$/,"").toLowerCase()}var Bd0=of5(HD4.exec);async function wD4(J){let Z={displayName:X1.basename(J)};if(!xF(J))return Z;Z.uri=c1(J);try{if(!await BD4.access(ND4.join(J.fsPath,".git")).then(()=>!0).catch(()=>!1))return Z;let{stdout:Y}=await Bd0("git remote get-url origin",{cwd:J.fsPath}).catch(()=>({stdout:""}));if(!Y.trim())return Z;let{stdout:X}=await Bd0("git symbolic-ref HEAD",{cwd:J.fsPath}).catch(()=>({stdout:""})),{stdout:K}=await Bd0("git rev-parse HEAD",{cwd:J.fsPath}).catch(()=>({stdout:""}));return{...Z,repository:{type:"git",url:EZ0(Y.trim()),ref:X.trim()||void 0,sha:K.trim()??void 0}}}catch(Q){return P.error("Error getting repository info:",Q,{dir:J.fsPath}),Z}}KJ();MC();function LD4(){let J=ME(),Z=pF(),Q=uu1();return{os:Z.os,osVersion:Z.osVersion,cpuArchitecture:Z.cpuArchitecture,webBrowser:Z.webBrowser,client:J.name,clientVersion:J.version,clientType:J.type,installationID:Q?.installationID,deviceFingerprint:Q?.deviceFingerprint}}D4();async function AZ(){return{trees:[await wD4(Y1.file(process.cwd()))],platform:LD4()}}var rf5="https://production.ampworkers.com",sf5="https://staging.ampworkers.com";function p7(J){if(J.includes("staging.ampcodedev.org"))return sf5;return rf5}var tf5="https://thread-actors-prod-us-east1-935747076731.us-east1.run.app",ef5="https://thread-actors-staging-us-east1-739316246630.us-east1.run.app";function MZ0(J){if(J.includes("staging.ampcodedev.org"))return ef5;return tf5}async function AZ0(J){let Z=J.workerURL??p7(J.ampURL),Q=await J.configService.getLatest(J.signal),Y=await Q.secrets.getToken("apiKey",Q.settings.url);if(!Y)throw Error("API key required. Please run `amp login` first.");let X=await fetch(`${Z}/threads/${J.threadID}/context-analysis`,{method:"GET",headers:{Authorization:`Bearer ${Y}`},signal:J.signal});if(!X.ok){let V=await X.text();throw Error(`Context analysis request failed (${X.status}): ${V}`)}let K=await X.json();if(!K.ok||!K.analysis)throw Error(K.error??"Invalid context analysis response from DTW");return K.analysis}var{stderr:$u5,stdout:B7}=process;function OG(J,Z=!1){if(Z||J<1000)return J.toLocaleString();return`${(J/1000).toFixed(1)}k`}function OD4(J,Z,Q,Y,X,K,V){return}async function Ju5(J,Z,Q,Y,X,K,V,G,F,z){K(X,J);let q=await V(Z,J);try{let U=await G(Q??null),W=Y.v2===!0;$u5.write(c0.dim(W?`Analyzing context tokens via v2 worker...
4659
4659
  `:`Analyzing context tokens...
4660
4660
  `));let D=W?await AZ0({ampURL:Z.ampURL,configService:q.configService,threadID:U,workerURL:Y.workerUrl}):await(async()=>{let E=await F(U,q),M=await M1(VQ(q.configService).pipe(E5((A)=>A!=="pending")));return OZ0({configService:q.configService,buildSystemPromptDeps:{configService:q.configService,toolService:q.toolService,filesystem:M8,skillService:q.skillService,getThreadEnvironment:AZ,threadService:q.threadService,serverStatus:m6(M)?M:void 0},mcpInitialized:q.mcpService.initialized},E)})();if(B7.write(`
4661
4661
  `),B7.write(c0.bold(`Context Usage Analysis
@@ -6214,11 +6214,11 @@ ${D}`))}},error:(W)=>{if(!U)U=!0,G(Error(`Failed to spawn brew: ${W.message}`))}
6214
6214
  ${D}`;if(X==="pnpm"&&D.includes("Unable to find the global bin directory"))H+=`
6215
6215
 
6216
6216
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
6217
- npm install -g @sourcegraph/amp`;G(Error(H))}},error:(W)=>{if(!q)q=!0,G(Error(`Failed to spawn ${X}: ${W.message}`))},complete:()=>{if(!q)q=!0,V()}})})}g0();g0();VA();async function sX0(J,Z){let X=`${Z||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,K=new AbortController,V=setTimeout(()=>K.abort(),5000);try{let G=await fetch(X,{signal:K.signal});if(!G.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let F=await G.json(),z=F.version??F["dist-tags"]?.latest;if(!z)return{hasUpdate:!1,currentVersion:J,source:"npm"};let q=wT4(J,z),U=q<0,W,D;if(F.time){let H=F.time[J],B=F.time[z],N=Date.now();if(H)W=Math.floor((N-new Date(H).getTime())/3600000);if(B)D=Math.floor((N-new Date(B).getTime())/3600000)}return P.info("NPM version comparison",{currentVersion:J,latestVersion:z,compareResult:q,hasUpdate:U,currentVersionAge:W,latestVersionAge:D}),{hasUpdate:U,latestVersion:z,currentVersion:J,currentVersionAge:W,latestVersionAge:D,source:"npm"}}catch(G){return P.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}finally{clearTimeout(V)}}var ZK3="https://storage.googleapis.com/amp-public-assets-prod-0/cli/cli-version.txt";async function tX0(J){let Z=new AbortController,Q=setTimeout(()=>Z.abort(),5000);try{let Y=await fetch(`${ZK3}?t=${Date.now()}`,{signal:Z.signal,cache:"no-store"});if(!Y.ok)return{hasUpdate:!1,currentVersion:J,source:"bin"};let X=(await Y.text()).trim();if(!X||!/^\d+\.\d+\.\d+/.test(X))return{hasUpdate:!1,currentVersion:J,source:"bin"};let K=wT4(J,X),V=K<0;return P.info("Bin version comparison",{currentVersion:J,latestVersion:X,compareResult:K,hasUpdate:V}),{hasUpdate:V,latestVersion:X,currentVersion:J,source:"bin"}}catch(Y){return P.debug("Error checking bin version",{error:Y}),{hasUpdate:!1,currentVersion:J,source:"bin"}}finally{clearTimeout(Q)}}var QK3=604800000;function NT4(J){if(!J)return null;let Z=typeof J==="number"?J:new Date(J).getTime();if(isNaN(Z))return null;let Q=Date.now()-Z;if(Q>QK3)return{ageMs:Q};return null}function wT4(J,Z){let Q=(V)=>{let[G,F]=V.split("-");return{parts:G?.split(".").map(Number)||[],label:F}},Y=Q(J),X=Q(Z),K=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<K;V++){let G=Y.parts[V]||0,F=X.parts[V]||0;if(G<F)return-1;if(G>F)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}function Lr0(J){try{let Z=J.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Z)return null;let Q=parseInt(Z[1],10)*1000,Y=Z[2],X=Q!==0?kz(Q):void 0;return{sha:Y,age:X}}catch{return null}}w1();function Or0(J,Z,Q={}){let Y=new e1,X=Y.pipe(c6({shouldCountRefs:!1}));return setImmediate(async()=>{let K=new uF().scoped("update"),V=Q.startDelayMs??0;if(V>0)await zz(V);let G=X.subscribe({next:(F)=>{K.debug("emit new state",F)}});try{let F=process.env.AMP_TEST_UPDATE_STATUS;if(F){K.debug("using fake update status for testing",{status:F}),await zz(500),Y.next(F);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){K.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let z=await Z.get("updates.mode");if(z==="disabled"){K.debug("checking disabled");return}let q=await rX0(),U=q==="binary"||q==="brew";K.debug("checking",{currentVersion:J,mode:z,packageManager:q,isBinaryDistribution:U});let W=U?await tX0(J):await sX0(J,lj());if(!(W.latestVersion&&W.hasUpdate)){K.debug("no update available");return}let D=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let H=W.currentVersionAge-W.latestVersionAge,B=0.5;if(Math.abs(H)<0.5)return K.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:H}),!0}return!1};if(!z)z=q==="pnpm"?"warn":"auto",K.debug("no configured update mode; selected default based on package manager",{packageManager:q,mode:z});if(q==="brew"){if(!D())Y.next("update-available-brew");return}if(q==="binary"&&process.execPath!==Wr0()){if(K.debug("non-standard binary path, showing warning"),!D())Y.next("update-available-unrecognized-path");return}if(z==="warn"){if(!D())Y.next("update-available");return}if(!q){if(K.debug("auto-update not supported, falling back to warn mode"),!D())Y.next("update-available");return}if(q==="binary"&&process.platform==="win32"){if(K.debug("binary auto-update not supported on Windows, falling back to warn mode"),!D())Y.next("update-available");return}try{await Cn(W.latestVersion,q);let H=await yw(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...H};if(H.status==="same")K.info("success",B),Y.next("updated");else K.warn("success with warning",B),Y.next("updated-with-warning")}catch(H){Y.next("update-error")}}catch(F){K.debug("check failed",{error:F})}finally{await zz(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:X}}VA();import{stderr as Rq}from"node:process";function LT4(J){let Z=new eN().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await Fr0(Y.force||!1,Y.verbose||!1,"0.0.1774339849-g374434"),process.exit()});J.addCommand(Z,{hidden:!0});let Q=new eN("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(Y)=>{await YK3(Y.targetVersion)});J.addCommand(Q)}async function YK3(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Rq.write(c0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
6217
+ npm install -g @sourcegraph/amp`;G(Error(H))}},error:(W)=>{if(!q)q=!0,G(Error(`Failed to spawn ${X}: ${W.message}`))},complete:()=>{if(!q)q=!0,V()}})})}g0();g0();VA();async function sX0(J,Z){let X=`${Z||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,K=new AbortController,V=setTimeout(()=>K.abort(),5000);try{let G=await fetch(X,{signal:K.signal});if(!G.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let F=await G.json(),z=F.version??F["dist-tags"]?.latest;if(!z)return{hasUpdate:!1,currentVersion:J,source:"npm"};let q=wT4(J,z),U=q<0,W,D;if(F.time){let H=F.time[J],B=F.time[z],N=Date.now();if(H)W=Math.floor((N-new Date(H).getTime())/3600000);if(B)D=Math.floor((N-new Date(B).getTime())/3600000)}return P.info("NPM version comparison",{currentVersion:J,latestVersion:z,compareResult:q,hasUpdate:U,currentVersionAge:W,latestVersionAge:D}),{hasUpdate:U,latestVersion:z,currentVersion:J,currentVersionAge:W,latestVersionAge:D,source:"npm"}}catch(G){return P.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}finally{clearTimeout(V)}}var ZK3="https://storage.googleapis.com/amp-public-assets-prod-0/cli/cli-version.txt";async function tX0(J){let Z=new AbortController,Q=setTimeout(()=>Z.abort(),5000);try{let Y=await fetch(`${ZK3}?t=${Date.now()}`,{signal:Z.signal,cache:"no-store"});if(!Y.ok)return{hasUpdate:!1,currentVersion:J,source:"bin"};let X=(await Y.text()).trim();if(!X||!/^\d+\.\d+\.\d+/.test(X))return{hasUpdate:!1,currentVersion:J,source:"bin"};let K=wT4(J,X),V=K<0;return P.info("Bin version comparison",{currentVersion:J,latestVersion:X,compareResult:K,hasUpdate:V}),{hasUpdate:V,latestVersion:X,currentVersion:J,source:"bin"}}catch(Y){return P.debug("Error checking bin version",{error:Y}),{hasUpdate:!1,currentVersion:J,source:"bin"}}finally{clearTimeout(Q)}}var QK3=604800000;function NT4(J){if(!J)return null;let Z=typeof J==="number"?J:new Date(J).getTime();if(isNaN(Z))return null;let Q=Date.now()-Z;if(Q>QK3)return{ageMs:Q};return null}function wT4(J,Z){let Q=(V)=>{let[G,F]=V.split("-");return{parts:G?.split(".").map(Number)||[],label:F}},Y=Q(J),X=Q(Z),K=Math.max(Y.parts.length,X.parts.length);for(let V=0;V<K;V++){let G=Y.parts[V]||0,F=X.parts[V]||0;if(G<F)return-1;if(G>F)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}function Lr0(J){try{let Z=J.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Z)return null;let Q=parseInt(Z[1],10)*1000,Y=Z[2],X=Q!==0?kz(Q):void 0;return{sha:Y,age:X}}catch{return null}}w1();function Or0(J,Z,Q={}){let Y=new e1,X=Y.pipe(c6({shouldCountRefs:!1}));return setImmediate(async()=>{let K=new uF().scoped("update"),V=Q.startDelayMs??0;if(V>0)await zz(V);let G=X.subscribe({next:(F)=>{K.debug("emit new state",F)}});try{let F=process.env.AMP_TEST_UPDATE_STATUS;if(F){K.debug("using fake update status for testing",{status:F}),await zz(500),Y.next(F);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){K.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let z=await Z.get("updates.mode");if(z==="disabled"){K.debug("checking disabled");return}let q=await rX0(),U=q==="binary"||q==="brew";K.debug("checking",{currentVersion:J,mode:z,packageManager:q,isBinaryDistribution:U});let W=U?await tX0(J):await sX0(J,lj());if(!(W.latestVersion&&W.hasUpdate)){K.debug("no update available");return}let D=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let H=W.currentVersionAge-W.latestVersionAge,B=0.5;if(Math.abs(H)<0.5)return K.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:H}),!0}return!1};if(!z)z=q==="pnpm"?"warn":"auto",K.debug("no configured update mode; selected default based on package manager",{packageManager:q,mode:z});if(q==="brew"){if(!D())Y.next("update-available-brew");return}if(q==="binary"&&process.execPath!==Wr0()){if(K.debug("non-standard binary path, showing warning"),!D())Y.next("update-available-unrecognized-path");return}if(z==="warn"){if(!D())Y.next("update-available");return}if(!q){if(K.debug("auto-update not supported, falling back to warn mode"),!D())Y.next("update-available");return}if(q==="binary"&&process.platform==="win32"){if(K.debug("binary auto-update not supported on Windows, falling back to warn mode"),!D())Y.next("update-available");return}try{await Cn(W.latestVersion,q);let H=await yw(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...H};if(H.status==="same")K.info("success",B),Y.next("updated");else K.warn("success with warning",B),Y.next("updated-with-warning")}catch(H){Y.next("update-error")}}catch(F){K.debug("check failed",{error:F})}finally{await zz(5000),Y.next("hidden"),G.unsubscribe(),Y.complete()}}),{state:X}}VA();import{stderr as Rq}from"node:process";function LT4(J){let Z=new eN().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await Fr0(Y.force||!1,Y.verbose||!1,"0.0.1774341467-g86d7fe"),process.exit()});J.addCommand(Z,{hidden:!0});let Q=new eN("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(Y)=>{await YK3(Y.targetVersion)});J.addCommand(Q)}async function YK3(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")Rq.write(c0.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
6218
6218
 
6219
6219
  `));try{if(!J){Rq.write(c0.blue(`Checking for updates...
6220
- `));let{hasUpdate:Y,latestVersion:X}=zr0()?await tX0("0.0.1774339849-g374434"):await sX0("0.0.1774339849-g374434",lj());if(!Y){let K=Lr0("0.0.1774339849-g374434"),V=K?.age?`released ${K.age} ago`:`built ${kz(new Date("2026-03-24T08:14:26.447Z"))} ago`;Rq.write(c0.green(`✓ Amp is already up to date on version ${"0.0.1774339849-g374434"} (${V})
6221
- `));let G=await yw("0.0.1774339849-g374434");if(G.warning)Rq.write(`
6220
+ `));let{hasUpdate:Y,latestVersion:X}=zr0()?await tX0("0.0.1774341467-g86d7fe"):await sX0("0.0.1774341467-g86d7fe",lj());if(!Y){let K=Lr0("0.0.1774341467-g86d7fe"),V=K?.age?`released ${K.age} ago`:`built ${kz(new Date("2026-03-24T08:41:29.784Z"))} ago`;Rq.write(c0.green(`✓ Amp is already up to date on version ${"0.0.1774341467-g86d7fe"} (${V})
6221
+ `));let G=await yw("0.0.1774341467-g86d7fe");if(G.warning)Rq.write(`
6222
6222
  `+c0.yellow(G.warning)+`
6223
6223
  `);process.exit(0)}if(!X)Rq.write(c0.yellow("[WARN] could not find latest version")),process.exit(0);J=X}Rq.write(c0.blue(`Updating to version ${J}...
6224
6224
  `)),await Cn(J,void 0,(Y)=>{Rq.write(c0.dim(`Running: ${Y}
@@ -7389,7 +7389,7 @@ Ctrl-X, Y, Z to unlock`;if(W){let u=z.text.replace(/`([^`]+)`/g,"$1")+`
7389
7389
  `),K=[];for(let V=0;V<X.length;V++){let z=X[V].replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|HAVING|LIMIT|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON|AND|OR|AS|IN|NOT|NULL|IS|BETWEEN|LIKE|EXISTS|UNION|DISTINCT|COUNT|SUM|AVG|MIN|MAX|DATE|TIMESTAMP_TRUNC|TIMESTAMP_SUB|CURRENT_TIMESTAMP|INTERVAL|CASE|WHEN|THEN|ELSE|END|WITH|INSERT|UPDATE|DELETE|SET|VALUES|INTO|CREATE|ALTER|DROP|TRUE|FALSE|ASC|DESC)\b/gi,"\x00$1\x01").split(/(\x00[^\x01]+\x01)/);for(let q of z)if(q.startsWith("\x00")&&q.endsWith("\x01"))K.push(new C(q.slice(1,-1),new g({color:Y.app.keybind,bold:!0})));else K.push(new C(q,new g({color:Q.colorScheme.foreground})));if(V<X.length-1)K.push(new C(`
7390
7390
  `))}return new i0({decoration:{color:Q.colorScheme.background,border:d1.all(new h1(Y.app.keybind,1,"rounded"))},child:new a0({padding:C0.symmetric(0,1),child:new J0({text:new C(void 0,void 0,K)})})})}}class b11 extends h${chartData;highlightIndex;showAxes;colors;constructor({key:J,chartData:Z,highlightIndex:Q=null,showAxes:Y=!0,colors:X=mF0}){super(J?{key:J}:{});this.chartData=Z,this.highlightIndex=Q,this.showAxes=Y,this.colors=X}createRenderObject(){return new f11({chartData:this.chartData,highlightIndex:this.highlightIndex,showAxes:this.showAxes,colors:this.colors})}updateRenderObject(J){let Z=J;Z.chartData=this.chartData,Z.highlightIndex=this.highlightIndex,Z.showAxes=this.showAxes,Z.colors=this.colors,Z.markNeedsLayout()}}function Np4(J,Z,Q,Y,X,K,V){if(K<=0)return null;switch(J){case"horizontal-bar":{let G=Q;return G>=0&&G<K?G:null}case"bar":case"stacked-bar":{let G=V?x9:0,F=Y-G;if(F<=0)return null;let z=Z-G;if(z<0||z>=F)return null;let q=Math.max(1,Math.floor(F/K)),U=Math.floor(z/q);return U>=0&&U<K?U:null}case"line":case"sparkline":case"stacked-area":{let G=V?x9:0,F=Y-G;if(F<=0)return null;let z=Math.max(0,Math.min(F-1,Z-G));if(K===1)return 0;let q=F/(K-1),U=Math.round(z/q);return Math.max(0,Math.min(K-1,U))}default:return null}}function dC3(J,Z,Q,Y,X,K,V,G){if(X<=0||Z<0||Z>=X)return null;let F=2;switch(J){case"horizontal-bar":return{x:Math.floor(Q/2),y:Z};case"bar":case"stacked-bar":{let z=K?x9:0,q=Q-z,U=Y-(K?F:0);if(q<=0||U<=0)return null;let W=Math.max(1,Math.floor(q/X)),D=z+Z*W+Math.floor(W/2),H=G>0?V/G:0,B=Math.round((1-H)*(U-1));return{x:D,y:B}}case"line":case"sparkline":case"stacked-area":{let z=K?x9:0,q=Q-z,U=Y-(K?F:0);if(q<=0||U<=0)return null;let W=X>1?z+Math.round(Z/(X-1)*(q-1)):z+Math.floor(q/2),D=G>0?V/G:0,H=Math.round((1-D)*(U-1));return{x:W,y:H}}default:return null}}function cC3(J){let Z=0;for(let Q of J)for(let Y of Q.points)if(Y.value>Z)Z=Y.value;return Z||1}function lC3(J,Z,Q,Y,X){if(Q.length<=1){let G=Y(J.value),F=J.meta?` (${J.meta})`:"";return J.label.length+2+G.length+F.length}let K=J.label.length,V=0;for(let G of Q){let F=G.points[Z];if(!F)continue;V+=F.value;let z=2+G.name.length+2+Y(F.value).length;K=Math.max(K,z)}if(X){let G=9+Y(V).length;K=Math.max(K,G)}return K}function iC3(J,Z,Q,Y,X,K,V){let G;try{let H=T1.of(J),B=f0.of(J);G={foreground:H.colorScheme.foreground,background:H.colorScheme.background,border:B.app.keybind}}catch{G={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let F=new g({color:G.foreground,bold:!0}),z=new g({color:G.foreground}),q=new g({color:G.foreground,dim:!0}),U=[],W=new g({color:G.foreground,underline:!0}),D=(H,B)=>new C(B,W,void 0,FK0(H),()=>{$8(J,H)});if(Y.length<=1){if(U.push(new C(`${Z.label}: `,F)),Z.link)U.push(D(Z.link,K(Z.value)));else U.push(new C(K(Z.value),z));if(Z.meta)U.push(new C(` (${Z.meta})`,q))}else{let H=V==="stacked-bar"||V==="stacked-area";U.push(new C(`${Z.label}
7391
7391
  `,F));let B=0;for(let N=0;N<Y.length;N++){let w=Y[N],L=w.points[Q];if(!L)continue;B+=L.value;let O=w.color??X[N%X.length]??G.foreground;if(U.push(new C("● ",new g({color:O}))),U.push(new C(`${w.name}: `,q)),L.link)U.push(D(L.link,K(L.value)));else U.push(new C(K(L.value),z));if(N<Y.length-1||H)U.push(new C(`
7392
- `))}if(H)U.push(new C(" ",q)),U.push(new C("Total: ",q)),U.push(new C(K(B),z))}return new i0({decoration:{color:G.background,border:d1.all(new h1(G.border,1,"rounded"))},child:new J0({text:new C(void 0,void 0,U)})})}wE();g0();S2();import{execSync as O_3}from"node:child_process";jE();M$();b3();T7();Gc();VA();TV();GJ();YZ();NY();hA();f4();Lm();wb();w1();var Nd4=G4(VW(),1);import{writeFile as Ud4}from"fs/promises";import Wd4 from"path";g0();GJ();class h11{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Z){this.enabled=J;this.configService=Z;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Z,Q])=>({feature:"cli.command",action:Z,source:{client:"cli",clientVersion:"0.0.1774339849-g374434"},parameters:{metadata:{count:Q}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Z=JSON.stringify(J);await W60(Z,this.configService)}catch(Z){P.error("Failed to export command telemetry events",Z)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Z=this.commandCounts.get(J)||0;this.commandCounts.set(J,Z+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class EL extends l0{props;constructor(J){super();this.props=J}createState(){return new wp4}}class wp4 extends d0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Z=(Q)=>{this.setState(()=>{this._state=Q(this._state)})};return this.widget.props.builder(J,Z,this._state)}}class Lp4 extends d0{controller=new K$;focusNode=new U6({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Z=f0.of(J),{colors:Q,app:Y}=Z,X=this.widget.props.isRequiredArg??!0,K=this.controller.text.trim().length>0,V=!X||K,G=d1.all(new h1(Q.foreground,1,"solid")),F=new xZ({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let H=D.trim();if(X&&H.length===0)return;this.widget.props.onSubmit(H)},autofocus:!0,style:{textColor:Q.foreground,border:null},maxLines:1}),z=new q1({children:[new i0({decoration:{color:Q.background},child:new J0({text:new C(">",new g({color:Q.foreground}))})}),new k1({child:F})]}),q=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C("",void 0,[new C("Command: ",new g({color:Q.foreground})),new C(this.widget.props.commandName,new g({color:Y.command,bold:!0}))])})}),U=[];if(V)U.push(new C("Enter",new g({color:Y.keybind}))),U.push(new C(" to submit, ",new g({color:Q.foreground,dim:!0})));U.push(new C("Esc",new g({color:Y.keybind}))),U.push(new C(" to cancel",new g({color:Q.foreground,dim:!0})));let W=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C("",void 0,U)})});return new i0({decoration:{border:G,color:Q.background},padding:C0.all(1),child:new x0({children:[q,new I0({height:1}),z,new g3,W]})})}}class Oo extends l0{props;constructor(J){super();this.props=J}createState(){return new Lp4}}import{isDeepStrictEqual as g11}from"node:util";var nC3=/[\\/_ +.#"@[({&]/,aC3=/[\\/_ +.#"@[({&]/g,oC3=/[\s-]/,Op4=/[\s-]/g;function cF0(J,Z,Q,Y,X,K,V){if(K===Z.length){if(X===J.length)return 1;return 0.99}let G=`${X},${K}`;if(V[G]!==void 0)return V[G];let F=Y.charAt(K),z=Q.indexOf(F,X),q=0,U,W,D,H;while(z>=0){if(U=cF0(J,Z,Q,Y,z+1,K+1,V),U>q){if(z===X)U*=1;else if(oC3.test(J.charAt(z-1))){if(U*=0.9,H=J.slice(X,z-1).match(Op4),H&&X>0)U*=0.999**H.length}else if(nC3.test(J.charAt(z-1))){if(U*=0.8,D=J.slice(X,z-1).match(aC3),D&&X>0)U*=0.999**D.length}else if(U*=0.3,X>0)U*=0.999**(z-X);if(J.charAt(z)!==Z.charAt(K))U*=0.9999}if(U<0.1&&(Q.charAt(z-1)===Y.charAt(K+1)||Y.charAt(K+1)===Y.charAt(K)&&Q.charAt(z-1)!==Y.charAt(K))){if(W=cF0(J,Z,Q,Y,z+1,K+2,V),W*0.1>U)U=W*0.1}if(U>q)q=U;z=Q.indexOf(F,z+1)}return V[G]=q,q}function dF0(J){return J.toLowerCase().replace(Op4," ")}function Ep4(J,Z){let Q=cF0(J,Z,dF0(J),dF0(Z),0,0,{}),Y=Z.trim().split(/\s+/);if(Y.length>1){let X=0,K=0;for(let G of Y){let F=cF0(J,G,dF0(J),dF0(G),0,0,{});if(F===0)return Q;X+=F,K+=G.length}let V=X/Y.length*0.95;return Math.max(Q,V)}return Q}class pv{}class dv{}class lF0{}class iF0{}class Mp4 extends l0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new Ap4}}class Ap4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}function rC3(J,Z){if(J==="")return{matches:!0,score:1};let Q=Ep4(Z,J);return{matches:Q>0.15,score:Q}}class s2 extends l0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new jp4}}class jp4 extends d0{textController;focusNode;scrollController=new j5;selectedIndex=0;itemContexts=[];hasUserInteracted=!1;cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){if(this.scrollController.disableFollowMode(),this.textController=new K$(this.widget.props.controller?.query??""),this.focusNode=new U6({debugLabel:this.widget.debugLabel}),this.textController.addListener(()=>{this.hasUserInteracted=!0,this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let J=this.widget.props.controller;if(J)J.query=this.textController.text;this.syncSelection()}),this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let J=this.cachedFiltered.findIndex((Z)=>g11(Z,this.widget.props.controller?.selectedItem));if(J>=0)this.selectedIndex=J}this.clampSelectedIndex(),this.syncSelection(),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!g11(J.props.items,this.widget.props.items)){if(this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let Z=this.cachedFiltered.findIndex((Q)=>g11(Q,this.widget.props.controller?.selectedItem));if(Z>=0)this.selectedIndex=Z}this.clampSelectedIndex(),this.ensureSelectedItemVisible(),this.syncSelection()}}dispose(){this.widget.props.onSelectionChange?.(null),this.textController.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof pv){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof dv){if(this.getFilteredItems().length>0&&this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof lF0){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length){let Q=Z[this.selectedIndex];if(Q){if(!(this.widget.props.isItemDisabled?.(Q)??!1))this.widget.props.onAccept(Q,{hasUserInteracted:this.hasUserInteracted})}}return"handled"}if(J instanceof iF0)return this.widget.props.onDismiss?.(),"handled";return"ignored"};syncSelection(){let Z=this.cachedFiltered[this.selectedIndex]??null;if(this.widget.props.controller)this.widget.props.controller.selectedItem=Z;this.widget.props.onSelectionChange?.(Z)}clampSelectedIndex(){let J=this.cachedFiltered.length-1;if(J<0){this.selectedIndex=0;return}this.selectedIndex=Math.max(0,Math.min(this.selectedIndex,J))}recomputeFilteredItems(){let J=this.textController.text,Z=this.widget.props.items,Q=this.widget.props.normalizeQuery?.(J)??J,Y=Z.filter((X)=>!this.widget.props.filterItem||this.widget.props.filterItem(X,J)).map((X)=>({item:X,...rC3(Q,this.widget.props.getLabel(X))})).filter((X)=>X.matches).sort(this.widget.props.sortItems?(X,K)=>this.widget.props.sortItems(X,K,J):(X,K)=>K.score-X.score).map((X)=>X.item);this.cachedQuery=J,this.cachedItemsRef=Z,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.textController.text,Z=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Z)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;fv(J,{top:Q,bottom:Y},{padding:1})}handleScroll=(J)=>{let Z=this.getFilteredItems();if(Z.length===0)return!1;let Q=this.selectedIndex;if(J.direction==="down")if(this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++;else return!1;else if(this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--;else return!1;return this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection(),this.selectedIndex!==Q};handleItemClick=(J,Z)=>{let Q=this.getFilteredItems();if(J>=0&&J<Q.length){let Y=Q[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Z===1)this.hasUserInteracted=!0,this.selectedIndex=J,this.setState(),this.syncSelection();else if(Z===2&&!X){if(Y)this.hasUserInteracted=!0,this.widget.props.onAccept(Y,{hasUserInteracted:this.hasUserInteracted})}}};build(J){let Z=f0.of(J),{colors:Q}=Z,Y=this.getFilteredItems(),X=d1.all(new h1(Q.foreground,1,"solid")),K=this.widget.props.hidePromptWhenLoading&&this.widget.props.isLoading,V=this.widget.props.enabled??!0,G=new xZ({controller:this.textController,focusNode:this.focusNode,autofocus:!0,enabled:V,style:{backgroundColor:Q.background,textColor:Q.foreground,cursorColor:Q.cursor,placeholderColor:Q.mutedForeground,border:null},maxLines:1}),F=new l$({shortcuts:new Map([[new H4("ArrowDown"),new pv],[new H4("ArrowUp"),new dv],[new H4("Tab"),new pv],[new H4("Tab",{shift:!0}),new dv],[new H4("n",{ctrl:!0}),new pv],[new H4("p",{ctrl:!0}),new dv],[new H4("Enter"),new lF0],[new H4("Escape"),new iF0]]),focusNode:this.focusNode,child:G}),z=new A2({actions:new Map([[pv,new W6(this.invoke)],[dv,new W6(this.invoke)],[lF0,new W6(this.invoke)],[iF0,new W6(this.invoke)]]),child:F}),q=new q1({children:[new i0({decoration:{color:Q.background},child:new J0({text:new C(">",new g({color:Q.foreground}))})}),new k1({child:z})]});this.itemContexts=[];let U;if(this.widget.props.isLoading){let N=this.widget.props.loadingText??"Loading...";U=new I0({height:10,child:new Z4({child:new J0({text:new C(N,new g({color:Q.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)U=new k1({child:new Z4({child:new J0({text:new C(this.widget.props.emptyStateText,new g({color:Q.foreground,dim:!0}))})})});else{let N=Y.map((w,L)=>{let O=L===this.selectedIndex,E=this.widget.props.isItemDisabled?.(w)??!1,M;if(this.widget.props.renderItem)M=this.widget.props.renderItem(w,O,E,J);else{let A=O?Z.app.selectionBackground:void 0,j=O?Z.app.selectionForeground:Q.foreground;M=new i0({decoration:A?{color:A}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C(this.widget.props.getLabel(w),new g({color:j,dim:E}))})})}return new Mp4(new J4({onClick:(A)=>this.handleItemClick(L,A.clickCount),child:M}),(A)=>{this.itemContexts[L]=A})});U=new x0({children:N,crossAxisAlignment:"start"})}let W=new J4({onScroll:this.handleScroll,opaque:!1,child:new _6({controller:this.scrollController,autofocus:!1,child:U})}),D=[];if(this.widget.props.title){let N=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C(this.widget.props.title,new g({color:Z.app.command,bold:!0}))})});D.push(N)}if(!K)D.push(q,new I0({height:1}));if(this.textController.text!==""){let N=Y.length>0?Y[this.selectedIndex]:void 0,w=N&&this.widget.props.buildDisabledReasonWidget?.(N,J);D.push(new k1({child:new x0({mainAxisAlignment:"spaceBetween",children:[new k1({child:W}),new i0({padding:C0.only({top:1}),child:new Z4({child:w??new I0({height:1})})})]})}))}else D.push(new k1({child:W}));if(this.widget.props.footer)D.push(this.widget.props.footer);return new i0({decoration:{border:X,color:Q.background},padding:C0.symmetric(1,0),child:new x0({children:D})})}}function Rp4(J){let Q=new Date().getTime()-J.getTime(),Y=Math.floor(Q/60000),X=Math.floor(Q/3600000),K=Math.floor(Q/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(K<7)return`${K}d ago`;return J.toLocaleDateString()}class m11 extends $4{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Z=[...this.props.entries].sort((X,K)=>K.pubDate.getTime()-X.pubDate.getTime()),Q=Math.max(0,...Z.map((X)=>Rp4(X.pubDate).length));return new s2({items:Z,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,K,V,G)=>{let F=f0.of(G),{colors:z}=F,q=F.app,U=K?q.selectionBackground:void 0,W=K?q.selectionForeground:z.foreground,D=z.mutedForeground,H=(B,N)=>new I0({width:N,child:q1.end([new J0({text:new C(B,new g({color:D}))})])});return new i0({decoration:U?{color:U}:void 0,padding:C0.symmetric(2,0),child:new q1({children:[new k1({child:new J0({text:new C(X.title,new g({color:W})),overflow:"ellipsis",maxLines:1})}),new I0({width:2}),H(Rp4(X.pubDate),Q)]})})}})}}class p11 extends l0{createState(){return new Ip4}}class Ip4 extends d0{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){let Q=f0.of(J).colors;return new J0({text:new C("●",new g({color:this.isGreen?Q.success:Q.mutedForeground,bold:!0})),maxLines:1})}}function sC3(J){return CY(J,{acceptedHostnames:["ampcode.com","localhost"],allowThreadsPathExtraction:!0})}function tC3(J){let Z=new Map,Q=new Map,Y=new Map,X=[];for(let V of J)Z.set(V.id,V);for(let V of J){let G=V.relationships.find((F)=>F.role==="child"&&Z.has(F.threadID)&&(F.type==="fork"||F.type==="handoff"));if(G){Y.set(V.id,G.type);let F=G.threadID,z=Q.get(F)||[];z.push(V),Q.set(F,z)}else X.push(V)}return LG0.flatten(X,(V)=>Q.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function d11(J,Z,Q){return new J0({text:new C(`${J}${Z}`,new g({color:Q})),maxLines:1})}function eC3(J,Z,Q,Y){return[d11("+",J,Y.success),g3.horizontal(1),d11("~",Z,Y.warning),g3.horizontal(1),d11("-",Q,Y.destructive)]}function $_3(J){return typeof J==="object"&&J!==null&&"then"in J&&typeof J.then==="function"}class nF0 extends l0{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}createState(){return new Pp4}}class Pp4 extends d0{spinner=new F3;spinnerInterval=null;isSwitchingThread=!1;get isBusy(){return this.isSwitchingThread||this.widget.props.isLoading===!0}updateSpinnerAnimation(){if(this.isBusy){if(!this.spinnerInterval)this.spinnerInterval=setInterval(()=>{this.spinner.step(),this.setState(()=>{})},100);return}if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null}setSwitchingThread(J){if(this.isSwitchingThread===J)return;this.setState(()=>{this.isSwitchingThread=J}),this.updateSpinnerAnimation()}initState(){super.initState(),this.updateSpinnerAnimation()}didUpdateWidget(J){this.updateSpinnerAnimation()}dispose(){if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null;super.dispose()}build(J){let{props:Z}=this.widget,Q=this.isBusy,Y=this.isSwitchingThread?"Switching thread...":"Loading threads...",X=`${this.spinner.toBraille()} ${Y}`,K=Z.filterByWorkspace&&Z.currentWorkspaceURI?Z.threads.filter((L)=>L.workspaceURI===Z.currentWorkspaceURI):Z.threads;if(Z.excludeCurrentThread&&Z.currentThreadID)K=K.filter((L)=>L.id!==Z.currentThreadID);let V=Z.recentThreadIDs||[],G=new Set(V),F=Z.currentThreadID,z=[...K].sort((L,O)=>{if(F){if(L.id===F)return-1;if(O.id===F)return 1}let E=V.indexOf(L.id),M=V.indexOf(O.id);if(E!==-1&&M!==-1)return E-M;if(E!==-1)return-1;if(M!==-1)return 1;return 0}),q=tC3(z),U=Math.max(0,...q.map((L)=>L.description.timeAgo.length)),W=f0.of(J),D=new a0({padding:C0.symmetric(0,1),child:new Z4({child:new J0({text:new C("",new g({color:W.colors.foreground,dim:!0}),[new C("Ctrl+T",new g({color:W.colors.primary,dim:!0})),new C(Z.filterByWorkspace?" for all workspaces":" to filter by workspace",new g({color:W.colors.foreground,dim:!0}))])})})}),H="",B=null,N=(L)=>{if(L!==H)H=L,B=sC3(L);return B};return new s2({items:q,getLabel:(L)=>`${L.title} ${L.id}`,filterItem:(L,O)=>{let E=N(O);if(E)return L.id.toLowerCase()===E.toLowerCase();return!0},normalizeQuery:(L)=>N(L)?"":L,onAccept:async(L,O)=>{if(!Z.onSelect||this.isSwitchingThread)return;let E=Z.onSelect(L.id,O);if(!$_3(E))return;this.setSwitchingThread(!0);try{await E}finally{if(this.mounted)this.setSwitchingThread(!1)}},onDismiss:Z.onDismiss,onSelectionChange:(L)=>{if(Z.previewController){if(L)Z.previewController.select(L.id)}},title:Z.title,enabled:!Q,isLoading:Q,hidePromptWhenLoading:!0,loadingText:X,emptyStateText:"No threads match your filter",maxRenderItems:200,footer:Q?void 0:D,renderItem:(L,O,E,M)=>{let A=f0.of(M),{app:j,colors:R}=A,S=O?j.selectionBackground:void 0,_=O?j.selectionForeground:R.foreground,f=R.mutedForeground,m=(s,z0)=>new I0({width:z0,child:q1.end([new J0({text:new C(s,new g({color:f}))})])}),x=Z.threadViewStates[L.id],T=[],u=L.relationshipType==="handoff",p=new ia({connectorColor:R.mutedForeground});if(L.depth>0){let s=[],z0=L.ancestorsAreLast.slice(1);for(let w0 of z0)s.push(new C(p.getAncestorPrefix(w0),new g({color:p.connectorColor,dim:p.connectorDim})));let a=L.isLast?p.elbow:p.tee,q0=p.getConnectorText(a);s.push(new C(q0,new g({color:p.connectorColor,dim:p.connectorDim}))),T.push(new J0({text:new C("",void 0,s)}))}let d=[],h=F===L.id?new C("(current) ",new g({color:R.success})):G.has(L.id)?new C("(visited) ",new g({color:R.foreground,dim:!0})):null;if(h)d.push(new J0({text:h}));if(SN(x))d.push(new p11),d.push(new I0({width:1}));let n=L.title;if(L.relationshipType==="fork"){let s=n.match(/^Forked\((\d+)\): /);if(s)n=n.slice(s[0].length);else while(n.startsWith("Forked: "))n=n.slice(8);d.push(new J0({text:new C("[fork] ",new g({color:R.primary}))}))}else if(u)d.push(new J0({text:new C("[handoff] ",new g({color:R.accent}))}));if(d.push(new k1({child:new J0({text:new C(n,new g({color:_})),overflow:"ellipsis",maxLines:1})})),d.push(new I0({width:2})),L.diffStats&&(L.diffStats.added>0||L.diffStats.changed>0||L.diffStats.deleted>0)){let s=O?{success:f,warning:f,destructive:f}:R;d.push(...eC3(L.diffStats.added,L.diffStats.changed,L.diffStats.deleted,s)),d.push(new I0({width:2}))}return d.push(m(L.description.timeAgo,U)),new i0({decoration:S?{color:S}:void 0,padding:C0.symmetric(2,0),child:new q1({children:[...T,...d]})})}})}}function Cp4(J){return 1-(1-J)**3}function _p4(J,Z,Q){return J+(Z-J)*Q}function Eo(J,Z){if(!J)return{x:0,y:0};let Q=Z-J.startTime,Y=Math.min(Q/J.durationX,1),X=Math.min(Q/J.durationY,1),K=Cp4(Y),V=Cp4(X);return{x:_p4(J.startOffset.x,J.targetOffset.x,K),y:_p4(J.startOffset.y,J.targetOffset.y,V)}}var J_3={nodeWidth:3,horizontalSpacing:3};class cv{options;constructor(J={}){this.options={...J_3,...J}}layout(J){let{childrenMap:Z,resolvedParent:Q}=this.buildTree(J),Y=[],X=Z.get(void 0)??[];if(this.options.comparator)X.sort(this.options.comparator);let K=0,V=(G,F)=>{let z=Z.get(G.id)??[];if(this.options.comparator)z.sort(this.options.comparator);let q={...G,parentID:Q.get(G.id)};if(z.length===0){Y.push({node:q,position:{x:K,y:F}});let B=K;return K+=this.options.nodeWidth+this.options.horizontalSpacing,B}let U=[];for(let B of z)U.push(V(B,F+1));let W=Math.min(...U),D=Math.max(...U),H=Math.floor((W+D)/2);return Y.push({node:q,position:{x:H,y:F}}),H};for(let G of X)V(G,0);return Y}buildTree(J){let Z=new Set(J.map((K)=>K.id)),Q=[...J].sort((K,V)=>K.id.localeCompare(V.id)),Y=new Map;for(let K of Q){if(!K.parentID||!Z.has(K.parentID)){Y.set(K.id,void 0);continue}let V=!1,G=K.parentID;while(G){if(G===K.id){V=!0;break}G=Y.get(G)}Y.set(K.id,V?void 0:K.parentID)}let X=new Map;for(let K of J){let V=Y.get(K.id);if(!X.has(V))X.set(V,[]);X.get(V).push(K)}return{childrenMap:X,resolvedParent:Y}}}var Z_3={nodeWidth:3,nodeHeight:2};class lv{options;constructor(J={}){this.options={...Z_3,...J}}calculate(J){let Z=[],Q=new Map;for(let Y of J)Q.set(Y.node.id,Y);for(let Y of J){if(!Y.node.parentID)continue;let X=Q.get(Y.node.parentID);if(!X)continue;let K=this.calculateConnectorLine(X.position,Y.position);Z.push({points:K,fromNodeID:X.node.id,toNodeID:Y.node.id})}return Z}calculateConnectorLine(J,Z){let Q=Math.floor(this.options.nodeWidth/2),Y=[],X=J.x+Q,K=Z.x+Q,V=J.y*(this.options.nodeHeight+3)+this.options.nodeHeight;Y.push({x:X,y:V});let G=V+1;if(Y.push({x:X,y:G}),X!==K)Y.push({x:K,y:G});let F=Z.y*(this.options.nodeHeight+3)-1;return Y.push({x:K,y:F}),Y}}var Q_3={nodeWidth:3,nodeHeight:2},Y_3={x:0,y:0};class oF0{options;constructor(J={}){this.options={...Q_3,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Y_3,X,K,V,G){let F=G?f0.of(G):null,z=F?.colors,q=F?.app,U=z?.mutedForeground??z?.foreground;if(J.length===0)return new J0({text:new C("No nodes",new g({color:U}))});let W=Math.max(...J.map((j)=>j.position.y)),H=Math.max(...J.map((j)=>j.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+3,N=[];for(let j=W;j>=0;j--){let R=J.filter((f)=>f.position.y===j);R.sort((f,m)=>f.position.x-m.position.x);let S=[],_=0;for(let f of R){if(f.position.x>_)S.push(new I0({width:f.position.x-_}));let m=f.node.id===Q,x=V?.(f.node.data)??!1,T=K?.activeFlashOn??!1,u=f.node.id===K?.copyFlashNodeId;S.push(this.renderNode(m,x,T,u,q,z)),_=f.position.x+this.options.nodeWidth}if(N.push(new q1({crossAxisAlignment:"start",children:S})),j>0){let f=J.filter((T)=>T.position.y===j-1),m=R,x=this.renderConnectors(f,m,Z,H,z,q);N.push(...x)}}let w=new x0({crossAxisAlignment:"start",children:N}),L=Math.round(Y.x),O=Math.round(Y.y*B),E=(W+1)*B,M=[new I0({width:H,height:E}),new e6({left:L,top:O,child:w})],A=Q?J.find((j)=>j.node.id===Q):void 0;if(A&&X){let j=X(A.node.data),R=W-A.position.y,S=L+A.position.x+this.options.nodeWidth+1,_=O+R*B+1,f=30;if(K?.maxTitleWidthPercent&&K.viewportWidth)f=Math.floor(K.viewportWidth*K.maxTitleWidthPercent/100);M.push(new e6({left:S,top:_,child:this.renderInfoBox(j,f,z,q)}))}return new i0({padding:C0.horizontal(2),child:new lG(new q5({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X,K){let V="┌─┐",G="└─┘",F=J?X?.threadGraphNodeSelected??K?.primary??K?.foreground:X?.threadGraphNode??K?.primary??K?.foreground,z=!1;if(Y)F=X?.threadGraphNodeSelected??K?.primary??F,V="┏━┓",G="┗━┛",z=!0;else if(Z&&Q)F=X?.toolSuccess??K?.primary??F,V="┏━┓",G="┗━┛";return new x0({crossAxisAlignment:"start",children:[new J0({text:new C(V,new g({color:F,bold:z}))}),new J0({text:new C(G,new g({color:F,bold:z}))})]})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let K of Q){if(K.length>Z)K=K.slice(0,Z-1)+"…";if(X.length===0)X=K;else if(X.length+1+K.length<=Z)X+=" "+K;else Y.push(X),X=K}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q,Y){let X=this.wrapText(J,Z),K=Math.min(Z,Math.max(1,...X.map((W)=>W.length))),V=K+2,G="┌"+"─".repeat(V)+"┐",F="└"+"─".repeat(V)+"┘",z=Q?.border??Y?.threadGraphConnector??Q?.foreground,q=Q?.foreground,U=[new J0({text:new C(G,new g({color:z}))})];for(let W of X){let D=" ".repeat(K-W.length);U.push(new J0({text:new C("│ ",new g({color:z}),[new C(W+D,new g({color:q??z})),new C(" │",new g({color:z}))])}))}return U.push(new J0({text:new C(F,new g({color:z}))})),new x0({crossAxisAlignment:"start",children:U})}renderConnectors(J,Z,Q,Y,X,K){let V=[],G=Math.floor(this.options.nodeWidth/2),F=K?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let W of Z){let D=W.position.x+G;if(D>=0&&D<Y)z[D]="▲"}V.push(new J0({text:new C(z.join(""),new g({color:F}))}));let q=Array(Y).fill(" ");for(let W of J){let D=Z.filter((L)=>L.node.parentID===W.node.id);if(D.length===0)continue;let H=W.position.x+G,B=D.map((L)=>L.position.x+G),N=Math.min(...B),w=Math.max(...B);for(let L=N;L<=w;L++)if(L>=0&&L<Y){if(L===H)if(D.length===1&&B[0]===H)q[L]="│";else if(L===N)q[L]="└";else if(L===w)q[L]="┘";else q[L]="┬";else if(B.includes(L))if(L===N)q[L]="└";else if(L===w)q[L]="┘";else q[L]="┴";else if(q[L]===" ")q[L]="─"}}V.push(new J0({text:new C(q.join(""),new g({color:F}))}));let U=Array(Y).fill(" ");for(let W of J){if(Z.filter((B)=>B.node.parentID===W.node.id).length===0)continue;let H=W.position.x+G;if(H>=0&&H<Y)U[H]="│"}return V.push(new J0({text:new C(U.join(""),new g({color:F}))})),V}}var X_3={nodeWidth:1,nodeHeight:1,nodeIcon:"□",selectedIcon:"□"},K_3={x:0,y:0};class c11{options;constructor(J={}){this.options={...X_3,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=K_3,X,K,V,G){let F=G?f0.of(G):null,z=F?.colors,q=F?.app,U=z?.mutedForeground??z?.foreground;if(J.length===0)return new J0({text:new C("No nodes",new g({color:U}))});let W=Math.max(...J.map((j)=>j.position.y)),H=Math.max(...J.map((j)=>j.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+1,N=[];for(let j=W;j>=0;j--){let R=J.filter((f)=>f.position.y===j);R.sort((f,m)=>f.position.x-m.position.x);let S=[],_=0;for(let f of R){if(f.position.x>_)S.push(new I0({width:f.position.x-_}));let m=f.node.id===Q,x=V?.(f.node.data)??!1,T=K?.activeFlashOn??!1;S.push(this.renderNode(m,x,T,q,z)),_=f.position.x+this.options.nodeWidth}if(N.push(new q1({crossAxisAlignment:"start",children:S})),j>0){let f=J.filter((T)=>T.position.y===j-1),m=R,x=this.renderConnectors(f,m,Z,H,z,q);N.push(...x)}}let w=new x0({crossAxisAlignment:"start",children:N}),L=Math.round(Y.x),O=Math.round(Y.y*B),E=(W+1)*B,M=[new I0({width:H,height:E}),new e6({left:L,top:O,child:w})],A=Q?J.find((j)=>j.node.id===Q):void 0;if(A&&X){let j=X(A.node.data),R=W-A.position.y,S=L+A.position.x+this.options.nodeWidth+1,_=O+R*B,f=30;if(K?.maxTitleWidthPercent&&K.viewportWidth)f=Math.floor(K.viewportWidth*K.maxTitleWidthPercent/100);M.push(new e6({left:S,top:_,child:this.renderInfoBox(j,f,z)}))}return new i0({padding:C0.horizontal(2),child:new lG(new q5({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X){let K=J?this.options.selectedIcon:this.options.nodeIcon,V=J?Y?.threadGraphNodeSelected??X?.primary??X?.foreground:Y?.threadGraphNode??X?.primary??X?.foreground;if(Z&&Q)V=Y?.toolSuccess??X?.primary??V,K="■";return new J0({text:new C(K,new g({color:V}))})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let K of Q){if(K.length>Z)K=K.slice(0,Z-1)+"…";if(X.length===0)X=K;else if(X.length+1+K.length<=Z)X+=" "+K;else Y.push(X),X=K}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q){let Y=this.wrapText(J,Z),X=Q?.foreground,K=[];for(let V of Y)K.push(new J0({text:new C(V,new g({color:X??Q?.primary??Q?.foreground}))}));return new x0({crossAxisAlignment:"start",children:K})}renderConnectors(J,Z,Q,Y,X,K){let V=[],G=Math.floor(this.options.nodeWidth/2),F=K?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let q of J){let U=Z.filter((N)=>N.node.parentID===q.node.id);if(U.length===0)continue;let W=q.position.x+G,D=U.map((N)=>N.position.x+G),H=Math.min(...D),B=Math.max(...D);for(let N=H;N<=B;N++)if(N>=0&&N<Y){let w=N===W,L=D.includes(N);if(w&&L)if(U.length===1)z[N]="│";else if(N===H)z[N]="└";else if(N===B)z[N]="┘";else z[N]="┼";else if(w)if(N===H)z[N]="└";else if(N===B)z[N]="┘";else z[N]="┬";else if(L)if(N===H)z[N]="└";else if(N===B)z[N]="┘";else z[N]="┴";else if(z[N]===" ")z[N]="─"}}return V.push(new J0({text:new C(z.join(""),new g({color:F}))})),V}}class Mo extends s3{onWidth;onHeight;constructor(J){super(J.child);this.onWidth=J.onWidth,this.onHeight=J.onHeight}createRenderObject(){return new Tp4(this.onWidth,this.onHeight)}updateRenderObject(J){J.onWidth=this.onWidth,J.onHeight=this.onHeight}}class Tp4 extends v4{onWidth;onHeight;constructor(J,Z){super();this.onWidth=J,this.onHeight=Z}performLayout(){let J=this._lastConstraints,Z=Number.isFinite(J.maxWidth)?J.maxWidth:80,Q=Number.isFinite(J.maxHeight)?J.maxHeight:24;this.onWidth(Z),this.onHeight?.(Q);let Y=this.children[0];if(Y)Y.layout(J),this.setSize(Y.size.width,Y.size.height);else this.setSize(J.minWidth,J.minHeight)}paint(J,Z,Q){for(let Y of this.children)Y.paint(J,Z,Q)}}class gR extends l0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new yp4}}var Sp4=400,kp4=300,V_3=16;class yp4 extends d0{selectedNodeId=null;positionedNodes=[];dateComparator=(J,Z)=>{let Q=J.data.updatedAt??"",Y=Z.data.updatedAt??"";return Q.localeCompare(Y)};layoutEngine=new cv({nodeWidth:1,horizontalSpacing:1,comparator:this.dateComparator});lineCalculator=new lv;renderer=new c11;animation=null;currentOffset={x:0,y:0};animationTimer=null;viewportWidth=80;viewportHeight=24;activeFlashOn=!0;activeFlashTimer=null;initState(){let{initialSelectedThreadID:J}=this.widget.props;if(J){let Q=this.widget.props.threads.find((Y)=>Y.id===J);if(Q)this.selectedNodeId=Q.id}this.startActiveFlashTimer()}startActiveFlashTimer(){if(!this.widget.props.threads.some((Z)=>Z.isActive))return;this.activeFlashTimer=setInterval(()=>{this.activeFlashOn=!this.activeFlashOn,this.setState()},700)}stopActiveFlashTimer(){if(this.activeFlashTimer)clearInterval(this.activeFlashTimer),this.activeFlashTimer=null}didUpdateWidget(J){let Z=new Set(J.props.threads.map((F)=>F.id)),Q=new Set(this.widget.props.threads.map((F)=>F.id));if(Z.size!==Q.size||[...Z].some((F)=>!Q.has(F)))this.stopAnimation(),this.currentOffset={x:0,y:0};let X=J.props.initialSelectedThreadID,K=this.widget.props.initialSelectedThreadID;if(X!==K&&K){let z=this.widget.props.threads.find((q)=>q.id===K);if(z)this.selectedNodeId=z.id,this.stopAnimation(),this.currentOffset={x:0,y:0}}let V=J.props.threads.some((F)=>F.isActive),G=this.widget.props.threads.some((F)=>F.isActive);if(V!==G){if(this.stopActiveFlashTimer(),G)this.startActiveFlashTimer()}}dispose(){this.stopAnimation(),this.stopActiveFlashTimer()}startAnimation(J){this.stopAnimation(),this.animation={startOffset:{...this.currentOffset},targetOffset:J,startTime:Date.now(),durationX:Sp4,durationY:kp4};let Z=Math.max(Sp4,kp4);this.animationTimer=setInterval(()=>{let Q=Date.now();if(this.currentOffset=Eo(this.animation,Q),this.animation&&Q-this.animation.startTime>=Z)this.currentOffset={...this.animation.targetOffset},this.stopAnimation();this.setState()},V_3)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null;this.animation=null}calculateCenterOffset(J,Z,Q){let Y=Math.floor(this.renderer.getNodeWidth()/2),K=Math.floor(this.viewportWidth/2)-J-Y,V=Q-Z,G=2,F=Math.floor(this.viewportHeight/2),q=Math.floor(F/2)-V;return{x:K,y:q}}animateToNode(J){let Z=this.positionedNodes.find((Q)=>Q.node.id===J);if(Z){let Q=Math.max(...this.positionedNodes.map((X)=>X.position.y)),Y=this.calculateCenterOffset(Z.position.x,Z.position.y,Q);this.startAnimation(Y)}}toGraphNodes(){return this.widget.props.threads.map((J)=>({id:J.id,parentID:J.parentID,data:{title:J.title,updatedAt:J.updatedAt,isActive:J.isActive}}))}toThreadNode(J){return{id:J.node.id,parentID:J.node.parentID,title:J.node.data.title,updatedAt:J.node.data.updatedAt}}handleKeyEvent=(J)=>{if(!this.selectedNodeId)return"ignored";let Z=this.positionedNodes,Q=Z.find((X)=>X.node.id===this.selectedNodeId);if(!Q)return"ignored";let Y;switch(J.key){case"ArrowUp":{let X=Z.filter((K)=>K.node.parentID===Q.node.id);if(X.length>0){X.sort((V,G)=>V.position.x-G.position.x);let K=Math.floor(X.length/2);Y=X[K]}break}case"ArrowDown":{Y=Z.find((X)=>X.node.id===Q.node.parentID);break}case"ArrowLeft":{let X=Z.filter((K)=>K.position.y===Q.position.y&&K.position.x<Q.position.x);if(X.length>0)X.sort((K,V)=>V.position.x-K.position.x),Y=X[0];break}case"ArrowRight":{let X=Z.filter((K)=>K.position.y===Q.position.y&&K.position.x>Q.position.x);if(X.length>0)X.sort((K,V)=>K.position.x-V.position.x),Y=X[0];break}case"Enter":{if(this.widget.props.onSelect)this.widget.props.onSelect(this.toThreadNode(Q));return"handled"}default:{if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"}}if(Y)return this.selectedNodeId=Y.node.id,this.widget.props.onSelectionChange?.(this.toThreadNode(Y)),this.animateToNode(Y.node.id),"handled";if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"};build(J){let Z=this.toGraphNodes();this.positionedNodes=this.layoutEngine.layout(Z);let Q=this.lineCalculator.calculate(this.positionedNodes);if(!this.animation&&this.currentOffset.x===0&&this.currentOffset.y===0){let q=(this.selectedNodeId?this.positionedNodes.find((U)=>U.node.id===this.selectedNodeId):null)??this.positionedNodes.find((U)=>!U.node.parentID);if(q){let U=Math.max(...this.positionedNodes.map((W)=>W.position.y));this.currentOffset=this.calculateCenterOffset(q.position.x,q.position.y,U)}}let X=this.widget.props.showTitle??!0,K=this.widget.props.offsetY??0,V={x:this.currentOffset.x,y:this.currentOffset.y+K},G=this.renderer.render(this.positionedNodes,Q,this.selectedNodeId??void 0,V,X?(z)=>z.title:void 0,{maxTitleWidthPercent:this.widget.props.maxTitleWidthPercent,viewportWidth:this.viewportWidth,activeFlashOn:this.activeFlashOn},(z)=>z.isActive??!1,J),F=new Mo({onWidth:(z)=>{if(this.viewportWidth!==z)this.viewportWidth=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},onHeight:(z)=>{if(this.viewportHeight!==z)this.viewportHeight=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},child:G});return new s4({autofocus:this.widget.props.autofocus??!0,onKey:this.handleKeyEvent,debugLabel:"MiniThreadGraph",child:F})}getSelectedNode(){let J=this.positionedNodes.find((Z)=>Z.node.id===this.selectedNodeId);return J?this.toThreadNode(J):null}}class xp4 extends l0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new fp4}}class fp4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}var vp4=30,G_3=30;class iv{}class nv{}class rF0{}class sF0{}class l11 extends l0{props;constructor(J){super();this.props=J}createState(){return new up4}}class up4 extends d0{highlightedIndex=0;controller=new K$;focusNode;scrollController=new j5;filteredClusters=[];itemContexts=[];initState(){this.focusNode=new U6({debugLabel:"ClusterPicker"}),this.scrollController.disableFollowMode(),this.recomputeFiltered(),this.controller.addListener(()=>{this.highlightedIndex=0,this.recomputeFiltered(),this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()})})}didUpdateWidget(J){if(J.props.clusters!==this.widget.props.clusters){if(this.recomputeFiltered(),this.highlightedIndex>=this.filteredClusters.length)this.highlightedIndex=Math.max(0,this.filteredClusters.length-1)}}ensureSelectedItemVisible(){let J=this.itemContexts[this.highlightedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;fv(J,{top:Q,bottom:Y},{padding:1})}dispose(){this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}recomputeFiltered(){let J=this.controller.text.toLowerCase(),{clusters:Z}=this.widget.props;if(!J)this.filteredClusters=[...Z];else this.filteredClusters=Z.filter((Q)=>Q.label.toLowerCase().includes(J))}invoke=(J)=>{if(J instanceof iv){if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof nv){if(this.highlightedIndex>0)this.highlightedIndex--,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof rF0){let Z=this.filteredClusters[this.highlightedIndex];if(Z)this.widget.props.onAccept(Z);return"handled"}if(J instanceof sF0)return this.widget.props.onDismiss(),"handled";return"ignored"};handleItemClick=(J,Z)=>{if(J>=0&&J<this.filteredClusters.length){if(Z===1)this.highlightedIndex=J,this.setState();else if(Z===2){let Q=this.filteredClusters[J];if(Q)this.widget.props.onAccept(Q)}}};handleScroll=(J)=>{if(this.filteredClusters.length===0)return!1;let Z=this.highlightedIndex;if(J.direction==="down")if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++;else return!1;else if(this.highlightedIndex>0)this.highlightedIndex--;else return!1;return this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.highlightedIndex!==Z};build(J){let{currentThreadID:Z}=this.widget.props,Q=f0.of(J),{colors:Y,app:X}=Q,G=V4.of(J).size.width>=G_3+vp4,F=d1.all(new h1(Y.foreground,1,"solid")),z=this.filteredClusters[this.highlightedIndex]??null,q=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C("Select a cluster",new g({color:X.command,bold:!0}))})}),U=new xZ({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new l$({shortcuts:new Map([[new H4("ArrowDown"),new iv],[new H4("ArrowUp"),new nv],[new H4("Tab"),new iv],[new H4("Tab",{shift:!0}),new nv],[new H4("n",{ctrl:!0}),new iv],[new H4("p",{ctrl:!0}),new nv],[new H4("Enter"),new rF0],[new H4("Escape"),new sF0]]),focusNode:this.focusNode,child:U}),D=new A2({actions:new Map([[iv,new W6(this.invoke)],[nv,new W6(this.invoke)],[rF0,new W6(this.invoke)],[sF0,new W6(this.invoke)]]),child:W}),H=new q1({children:[new i0({decoration:{color:Y.background},child:new J0({text:new C(">",new g({color:Y.foreground}))})}),new k1({child:D})]});this.itemContexts=[];let B=this.filteredClusters.map((M,A)=>{let j=A===this.highlightedIndex,R=Z?M.threads.some((m)=>m.id===Z):!1,S=j?X.selectionBackground:void 0,_=j?X.selectionForeground:Y.foreground,f=[new C(M.label,new g({color:_})),new C(` (${M.threads.length})`,new g({color:_,dim:!0}))];if(R)f.push(new C(" (current)",new g({color:j?X.selectionForeground:Y.success})));return new xp4(new J4({onClick:(m)=>this.handleItemClick(A,m.clickCount),child:new i0({decoration:S?{color:S}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C("",void 0,f)})})}),(m)=>{this.itemContexts[A]=m})}),N=new x0({children:B,crossAxisAlignment:"start"}),w=new k1({child:new J4({onScroll:this.handleScroll,child:new _6({controller:this.scrollController,autofocus:!1,child:N})})}),L=z?z.threads.map((M)=>({id:M.id,title:M.title,parentID:M.parentID,updatedAt:M.updatedAt})):[],O=z?new i0({padding:C0.all(1),child:new gR({threads:L,autofocus:!1,offsetY:2})}):null,E;if(G){let M=O?new k1({child:O}):new I0({width:vp4});E=new q1({crossAxisAlignment:"stretch",mainAxisAlignment:"start",children:[w,M]})}else{let M=[new k1({child:new J4({onScroll:this.handleScroll,child:new _6({controller:this.scrollController,autofocus:!1,child:N})})})];if(O)M.push(new k1({child:O}));E=new x0({crossAxisAlignment:"stretch",children:M})}return new i0({decoration:{border:F,color:Y.background},padding:C0.symmetric(1,0),child:new x0({children:[q,H,new I0({height:1}),new k1({child:E})]})})}}class hJ{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!hJ._instance)hJ._instance=new hJ;return hJ._instance}get allExpanded(){return this._allExpanded}setAllExpanded(J){if(this._allExpanded===J)return;this._allExpanded=J,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(J){return this._listeners.add(J),()=>this.removeListener(J)}removeListener(J){this._listeners.delete(J)}_notifyListeners(){for(let J of this._listeners)J()}}g0();class bp4 extends d0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let J=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!J.ok){P.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){P.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){let Z=J.trim().toLowerCase();if(Z.length===0)return null;if(Z.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Z))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null&&J.length>0}getAvailableLabels(){let J=this.widget.props.currentLabels||[];return this.labels.filter((Z)=>!J.includes(Z.name))}shouldShowCreateMarker(J){if(J.length===0||this.isLoading)return!1;let Z=J.trim().toLowerCase();if(!this.isValidLabelName(Z))return!1;let Q=this.widget.props.currentLabels||[],Y=this.labels.some((K)=>K.name===Z),X=Q.includes(Z);return!Y&&!X}build(J){let Z=f0.of(J),{app:Q,colors:Y}=Z,X=this.currentQuery.trim().toLowerCase(),K=X.length>0?this.getValidationError(X):null,V=this.getAvailableLabels(),F=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...V];return new s2({title:"Add Label",items:F,getLabel:(z)=>{if("__isCreateMarker"in z)return this.currentQuery.trim().toLowerCase();return z.name},onAccept:(z)=>{if("__isCreateMarker"in z)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(z.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:K||"Type to create a new label",renderItem:(z,q,U,W)=>{let D=q?Q.selectionBackground:void 0,H=q?Q.selectionForeground:Y.foreground;if("__isCreateMarker"in z&&z.__isCreateMarker){let N=this.currentQuery.trim().toLowerCase();return new i0({decoration:D?{color:D}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C("",void 0,[new C("Create new label: ",new g({color:H})),new C(N,new g({color:H,bold:!0}))])})})}return new i0({decoration:D?{color:D}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C(z.name,new g({color:H}))})})},filterItem:(z,q)=>{if(this.currentQuery!==q)this.currentQuery=q,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in z&&z.__isCreateMarker)return this.shouldShowCreateMarker(q);let W=q.trim().toLowerCase();return W.length===0||z.name.includes(W)},sortItems:(z,q,U)=>{let W="__isCreateMarker"in z.item&&z.item.__isCreateMarker,D="__isCreateMarker"in q.item&&q.item.__isCreateMarker;if(W&&!D)return-1;if(!W&&D)return 1;return q.score-z.score}})}}class i11 extends l0{props;constructor(J){super();this.props=J}createState(){return new bp4}}class eG extends l0{props;constructor(J){super();this.props=J}createState(){return new hp4}}class hp4 extends d0{_spinner=new F3;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(J){let Z=f0.of(J),{colors:Q,app:Y}=Z,X=d1.all(new h1(Q.foreground,1,"solid")),K=this._spinner.toBraille(),V=new J0({textAlign:"center",text:new C("",void 0,[new C(K,new g({color:Y.processing})),new C(" ",void 0),new C(this.widget.props.message,new g({color:Q.foreground}))])}),F=[new k1({child:new x0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[V]})})];if(this.widget.props.onAbort)F.push(new I0({height:2,child:new i0({padding:C0.symmetric(2,0),child:new J0({text:new C("",new g({dim:!0}),[new C("Press ",new g({color:Q.foreground})),new C("Esc",new g({color:Q.info})),new C(" to cancel",new g({color:Q.foreground}))])})})}));let z=new i0({decoration:new r4(Q.background,X),child:new I0({width:60,height:7,child:new x0({mainAxisAlignment:"start",children:F})})});if(this.widget.props.onAbort)return new s4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(q)=>{if(q.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:z});return z}}var Ao={workspace:{label:"Workspace",pathHint:".amp/settings.json",description:"workspace config"},global:{label:"Global",pathHint:"~/.config/amp/settings.json",description:"global config"},flag:{label:"Flag",pathHint:"CLI flags",description:"flag config"},default:{label:"Default",pathHint:"built-in defaults",description:"default config"},external:{label:"External",pathHint:"extensions / external",description:"external source"},skill:{label:"Skills",pathHint:".agents/skills/",description:"skill source"},other:{label:"Other",pathHint:"",description:"other source"}},tF0=["workspace","global","flag","default","external","skill","other"];function F_3(J){return Array.from(new Set(J))}function gp4(J){return F_3([...J.skillNames??[],...J.skillName?[J.skillName]:[]])}function av(J){if(J.isExternal)return"external";switch(J.spec._target){case"workspace":return"workspace";case"global":return"global";case"flag":return"flag";case"default":return"default"}return gp4(J).length>0?"skill":"other"}function n11(J){return av(J)==="skill"}function mp4(J){let Z=gp4(J);if(Z.length===0)return;let Q=Z.join(", "),Y=av(J);if(Y==="skill")return`skills: ${Q}`;return`${Z.length===1?"skill source":"skill sources"} overridden by ${Ao[Y].description}: ${Q}`}function pp4(J){return J.spec.meta?.skillNames?Array.from(J.spec.meta.skillNames):[]}var dp4=process.platform==="win32"?" ":"█",cp4=process.platform==="win32"?"░":"█";class E9 extends l0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X=dp4,thumbChar:K=cp4,showTrack:V=!0,thumbColor:G,trackColor:F}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=K,this.showTrack=V,this.thumbColor=G,this.trackColor=F}createState(){return new lp4}}class lp4 extends d0{_dragStartY=null;_dragStartOffset=null;_isOverThumb=!1;_isPositionOverThumb(J){let{totalContentHeight:Z,viewportHeight:Q}=this.widget.getScrollInfo(),X=this.context.findRenderObject()?.size.height??0;if(X===0||Z<=Q)return!1;let K=this.widget.getScrollInfo(),V=Math.min(1,Q/Z),G=Math.max(1,X*V),F=Math.max(0,Math.min(1,K.scrollOffset/(Z-Q))),z=X-G,q=Math.max(0,z*F),U=q+G;return J>=q&&J<=U}_handleHover=(J)=>{let Z=this._isOverThumb;if(this._isOverThumb=this._isPositionOverThumb(J.localPosition.y),Z!==this._isOverThumb)this.setState()};_handleDrag=(J)=>{let{totalContentHeight:Z,viewportHeight:Q,scrollOffset:Y}=this.widget.getScrollInfo(),K=this.context.findRenderObject()?.size.height??0;if(K===0||Z<=Q)return;if(this._dragStartY===null)this._dragStartY=J.localPosition.y,this._dragStartOffset=Y;let V=J.localPosition.y-this._dragStartY,G=Math.min(1,Q/Z),F=Math.max(1,K*G),z=K-F;if(z<=0)return;let q=Z-Q,U=z/q,W=V/U,D=Math.max(0,Math.min(q,this._dragStartOffset+W));this.widget.controller.jumpTo(D)};_handleRelease=()=>{this._dragStartY=null,this._dragStartOffset=null};_handleClick=(J)=>{if(J.button!=="left")return;let Z=J.localPosition.y,{totalContentHeight:Q,viewportHeight:Y,scrollOffset:X}=this.widget.getScrollInfo(),V=this.context.findRenderObject()?.size.height??0;if(V===0||Q<=Y)return;let G=Math.min(1,Y/Q),F=Math.max(1,V*G),z=Q-Y,q=V-F,U=Math.max(0,Math.min(1,X/(Q-Y))),W=Math.max(0,q*U),D=W+F;if(Z>=W&&Z<=D)return;if(Z<W)this.widget.controller.animateTo(Math.max(0,X-Y));else this.widget.controller.animateTo(Math.min(z,X+Y))};build(J){return new J4({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?d5.POINTER:d5.DEFAULT,child:new ip4({controller:this.widget.controller,getScrollInfo:this.widget.getScrollInfo,thickness:this.widget.thickness,trackChar:this.widget.trackChar,thumbChar:this.widget.thumbChar,showTrack:this.widget.showTrack,thumbColor:this.widget.thumbColor,trackColor:this.widget.trackColor})})}}class ip4 extends ky{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X=dp4,thumbChar:K=cp4,showTrack:V=!0,thumbColor:G,trackColor:F}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=K,this.showTrack=V,this.thumbColor=G,this.trackColor=F}createRenderObject(){return new np4(this)}updateRenderObject(J){J.updateWidget(this)}}class np4 extends v4{_widget;constructor(J){super();this._widget=J}updateWidget(J){this._widget=J,this.markNeedsLayout()}performLayout(){let J=this._lastConstraints;J6(!!J,"performLayout called without constraints");let Z=Math.min(J.maxWidth,this._widget.thickness),Q=J.maxHeight;this.setSize(Z,Q),super.performLayout()}getMinIntrinsicWidth(J){return this._widget.thickness}getMaxIntrinsicWidth(J){return this._widget.thickness}getMinIntrinsicHeight(J){return 0}getMaxIntrinsicHeight(J){return 0}paint(J,Z,Q){let{thumbStartFloat:Y,thumbSizeFloat:X,showScrollbar:K}=this._calculateScrollbarMetrics();if(!K)return;let V=this._widget.trackColor,G=this._widget.thumbColor,F=process.platform==="win32",z=Y,q=Y+X;if(!F){let U=["▁","▂","▃","▄","▅","▆","▇","█"];for(let W=0;W<this.size.height;W++){let D="█",H=!0;if(W===Math.floor(z)){let B=1-(z-W),N=Math.floor(B*8);D=U[N]||"█",H=!1}else if(W===Math.floor(q)){let B=1-(q-W),N=Math.floor(B*8);D=U[N]||"█"}else if(W>z&&W<q)H=!1;J.setChar(Z,Q+W,D,{fg:G,bg:V,reverse:H},1)}return}for(let U=0;U<this.size.height;U++){let W=U+0.5,D=W>=z&&W<q,H=D?this._widget.thumbChar:this._widget.trackChar;J.setChar(Z,Q+U,H,{fg:D?G:V,bg:V,reverse:!1},1)}}_calculateScrollbarMetrics(){let{totalContentHeight:J,viewportHeight:Z,scrollOffset:Q}=this._widget.getScrollInfo(),Y=this.size.height;if(J<=Z||Y<=0)return{thumbStartFloat:0,thumbSizeFloat:0,showScrollbar:!1};let X=Math.max(0,Math.min(1,Q/(J-Z))),K=Math.min(1,Z/J),V=Math.max(1,Y*K),G=Y-V;return{thumbStartFloat:Math.max(0,G*X),thumbSizeFloat:V,showScrollbar:!0}}}class mR extends l0{props;constructor(J){super();this.props=J}createState(){return new ap4}}class ap4 extends d0{scrollController=new j5;scrollAreaKey=new J$("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(J){return J instanceof r2}resolveFooterStyle(J){if(this.isWidgetMessage(J))return J.footerStyle;return"default"}getViewportHeight(){let Z=this.scrollAreaKey.currentElement?.renderObject;if(Z&&"size"in Z){let Q=Z.size;if(typeof Q.height==="number"&&Q.height>0)return this.viewportHeight=Q.height,Q.height}return this.viewportHeight}build(J){let Z=f0.of(J),Q=this.widget.props.message,Y=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let q=IF0(Q);return{title:q.title,type:q.type,description:q.description}})(),X=Y.type==="error"?Z.app.toolError:Z.app.command,K=d1.all(new h1(Z.colors.border,1,"solid")),V=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C(Y.title,new g({color:X,bold:!0}))})}),G=this.isWidgetMessage(Q)?Q.widget:new J0({text:new C(Y.description,new g({color:Z.colors.foreground})),selectable:!0}),F=new k1({child:new i$({child:new i0({padding:C0.symmetric(1,0),child:new q1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new k1({child:new _6({controller:this.scrollController,autofocus:!0,child:G})}),new E9({controller:this.scrollController,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let q=this.scrollController.maxScrollExtent,U=this.scrollController.offset,W=this.getViewportHeight(),D=q+W;return{totalContentHeight:Math.max(D,0),viewportHeight:Math.max(W,1),scrollOffset:Math.max(U,0)}}})]})})})}),z=new i0({padding:C0.symmetric(1,0),child:new J0({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new g({color:Z.colors.foreground,dim:!0})),new C("R",new g({color:Z.app.keybind})),new C(" to retry, ",new g({color:Z.colors.foreground,dim:!0})),new C("Esc",new g({color:Z.app.keybind})),new C(" to cancel",new g({color:Z.colors.foreground,dim:!0}))]);let q=this.resolveFooterStyle(this.widget.props.message);if(q==="none")return new C("",new g({color:Z.colors.foreground,dim:!0}));if(q==="help"){let U=new g({color:Z.app.keybind}),W=new g({color:Z.colors.foreground,dim:!0});return new C("",W,[new C("Press ",W),new C("Escape",U),new C(" to close • Use ",W),new C("↑↓",U),new C(" or ",W),new C("j/k",U),new C(" to scroll",W)])}return new C("Press any key to close",new g({color:Z.colors.foreground,dim:!0,italic:!0}))})()})});return new s4({onKey:(q)=>{if(this.widget.props.onRetry&&q.key==="r")return this.widget.props.onRetry(),"handled";if(q.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new i0({decoration:{border:K,color:Z.colors.background},padding:C0.all(1),child:new x0({mainAxisAlignment:"center",children:[V,new I0({height:1}),F,z]})})})}}S2();class op4 extends l0{props;constructor(J){super();this.props=J}createState(){return new rp4}}class rp4 extends d0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((J)=>{this.plugins=J,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(J){let Z=J.startsWith("file://")?J.slice(7):J,Q=this.widget.props.cwd;if(Z.startsWith(Q))return Z.slice(Q.length+1);return Z}statusIcon(J){let Z=y9.default(),{colors:Q,app:Y}=Z;switch(J){case"loading":return{icon:"◌",color:Q.warning};case"active":return{icon:"✓",color:Y.toolSuccess};case"error":return{icon:"✗",color:Y.toolError}}}build(J){let Z=f0.of(J),{app:Q}=Z;if(this.plugins.length===0)return new J0({text:new C("No plugins found.",new g({dim:!0}))});let Y=[],X=this.plugins.length,K=this.plugins.filter((F)=>F.status==="active").length,V=this.plugins.reduce((F,z)=>F+z.registeredCommands.length,0),G=this.plugins.reduce((F,z)=>F+z.registeredTools.length,0);if(Y.push(new C(`${K}/${X} ${p4(X,"plugin")} active`,new g({bold:!0}))),V>0||G>0)Y.push(new C(` (${V} ${p4(V,"command")}, ${G} ${p4(G,"tool")})`,new g({dim:!0})));Y.push(new C(`
7392
+ `))}if(H)U.push(new C(" ",q)),U.push(new C("Total: ",q)),U.push(new C(K(B),z))}return new i0({decoration:{color:G.background,border:d1.all(new h1(G.border,1,"rounded"))},child:new J0({text:new C(void 0,void 0,U)})})}wE();g0();S2();import{execSync as O_3}from"node:child_process";jE();M$();b3();T7();Gc();VA();TV();GJ();YZ();NY();hA();f4();Lm();wb();w1();var Nd4=G4(VW(),1);import{writeFile as Ud4}from"fs/promises";import Wd4 from"path";g0();GJ();class h11{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Z){this.enabled=J;this.configService=Z;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Z,Q])=>({feature:"cli.command",action:Z,source:{client:"cli",clientVersion:"0.0.1774341467-g86d7fe"},parameters:{metadata:{count:Q}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Z=JSON.stringify(J);await W60(Z,this.configService)}catch(Z){P.error("Failed to export command telemetry events",Z)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Z=this.commandCounts.get(J)||0;this.commandCounts.set(J,Z+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class EL extends l0{props;constructor(J){super();this.props=J}createState(){return new wp4}}class wp4 extends d0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Z=(Q)=>{this.setState(()=>{this._state=Q(this._state)})};return this.widget.props.builder(J,Z,this._state)}}class Lp4 extends d0{controller=new K$;focusNode=new U6({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Z=f0.of(J),{colors:Q,app:Y}=Z,X=this.widget.props.isRequiredArg??!0,K=this.controller.text.trim().length>0,V=!X||K,G=d1.all(new h1(Q.foreground,1,"solid")),F=new xZ({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(D)=>{let H=D.trim();if(X&&H.length===0)return;this.widget.props.onSubmit(H)},autofocus:!0,style:{textColor:Q.foreground,border:null},maxLines:1}),z=new q1({children:[new i0({decoration:{color:Q.background},child:new J0({text:new C(">",new g({color:Q.foreground}))})}),new k1({child:F})]}),q=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C("",void 0,[new C("Command: ",new g({color:Q.foreground})),new C(this.widget.props.commandName,new g({color:Y.command,bold:!0}))])})}),U=[];if(V)U.push(new C("Enter",new g({color:Y.keybind}))),U.push(new C(" to submit, ",new g({color:Q.foreground,dim:!0})));U.push(new C("Esc",new g({color:Y.keybind}))),U.push(new C(" to cancel",new g({color:Q.foreground,dim:!0})));let W=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C("",void 0,U)})});return new i0({decoration:{border:G,color:Q.background},padding:C0.all(1),child:new x0({children:[q,new I0({height:1}),z,new g3,W]})})}}class Oo extends l0{props;constructor(J){super();this.props=J}createState(){return new Lp4}}import{isDeepStrictEqual as g11}from"node:util";var nC3=/[\\/_ +.#"@[({&]/,aC3=/[\\/_ +.#"@[({&]/g,oC3=/[\s-]/,Op4=/[\s-]/g;function cF0(J,Z,Q,Y,X,K,V){if(K===Z.length){if(X===J.length)return 1;return 0.99}let G=`${X},${K}`;if(V[G]!==void 0)return V[G];let F=Y.charAt(K),z=Q.indexOf(F,X),q=0,U,W,D,H;while(z>=0){if(U=cF0(J,Z,Q,Y,z+1,K+1,V),U>q){if(z===X)U*=1;else if(oC3.test(J.charAt(z-1))){if(U*=0.9,H=J.slice(X,z-1).match(Op4),H&&X>0)U*=0.999**H.length}else if(nC3.test(J.charAt(z-1))){if(U*=0.8,D=J.slice(X,z-1).match(aC3),D&&X>0)U*=0.999**D.length}else if(U*=0.3,X>0)U*=0.999**(z-X);if(J.charAt(z)!==Z.charAt(K))U*=0.9999}if(U<0.1&&(Q.charAt(z-1)===Y.charAt(K+1)||Y.charAt(K+1)===Y.charAt(K)&&Q.charAt(z-1)!==Y.charAt(K))){if(W=cF0(J,Z,Q,Y,z+1,K+2,V),W*0.1>U)U=W*0.1}if(U>q)q=U;z=Q.indexOf(F,z+1)}return V[G]=q,q}function dF0(J){return J.toLowerCase().replace(Op4," ")}function Ep4(J,Z){let Q=cF0(J,Z,dF0(J),dF0(Z),0,0,{}),Y=Z.trim().split(/\s+/);if(Y.length>1){let X=0,K=0;for(let G of Y){let F=cF0(J,G,dF0(J),dF0(G),0,0,{});if(F===0)return Q;X+=F,K+=G.length}let V=X/Y.length*0.95;return Math.max(Q,V)}return Q}class pv{}class dv{}class lF0{}class iF0{}class Mp4 extends l0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new Ap4}}class Ap4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}function rC3(J,Z){if(J==="")return{matches:!0,score:1};let Q=Ep4(Z,J);return{matches:Q>0.15,score:Q}}class s2 extends l0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new jp4}}class jp4 extends d0{textController;focusNode;scrollController=new j5;selectedIndex=0;itemContexts=[];hasUserInteracted=!1;cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){if(this.scrollController.disableFollowMode(),this.textController=new K$(this.widget.props.controller?.query??""),this.focusNode=new U6({debugLabel:this.widget.debugLabel}),this.textController.addListener(()=>{this.hasUserInteracted=!0,this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let J=this.widget.props.controller;if(J)J.query=this.textController.text;this.syncSelection()}),this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let J=this.cachedFiltered.findIndex((Z)=>g11(Z,this.widget.props.controller?.selectedItem));if(J>=0)this.selectedIndex=J}this.clampSelectedIndex(),this.syncSelection(),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!g11(J.props.items,this.widget.props.items)){if(this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let Z=this.cachedFiltered.findIndex((Q)=>g11(Q,this.widget.props.controller?.selectedItem));if(Z>=0)this.selectedIndex=Z}this.clampSelectedIndex(),this.ensureSelectedItemVisible(),this.syncSelection()}}dispose(){this.widget.props.onSelectionChange?.(null),this.textController.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof pv){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof dv){if(this.getFilteredItems().length>0&&this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof lF0){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length){let Q=Z[this.selectedIndex];if(Q){if(!(this.widget.props.isItemDisabled?.(Q)??!1))this.widget.props.onAccept(Q,{hasUserInteracted:this.hasUserInteracted})}}return"handled"}if(J instanceof iF0)return this.widget.props.onDismiss?.(),"handled";return"ignored"};syncSelection(){let Z=this.cachedFiltered[this.selectedIndex]??null;if(this.widget.props.controller)this.widget.props.controller.selectedItem=Z;this.widget.props.onSelectionChange?.(Z)}clampSelectedIndex(){let J=this.cachedFiltered.length-1;if(J<0){this.selectedIndex=0;return}this.selectedIndex=Math.max(0,Math.min(this.selectedIndex,J))}recomputeFilteredItems(){let J=this.textController.text,Z=this.widget.props.items,Q=this.widget.props.normalizeQuery?.(J)??J,Y=Z.filter((X)=>!this.widget.props.filterItem||this.widget.props.filterItem(X,J)).map((X)=>({item:X,...rC3(Q,this.widget.props.getLabel(X))})).filter((X)=>X.matches).sort(this.widget.props.sortItems?(X,K)=>this.widget.props.sortItems(X,K,J):(X,K)=>K.score-X.score).map((X)=>X.item);this.cachedQuery=J,this.cachedItemsRef=Z,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.textController.text,Z=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Z)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;fv(J,{top:Q,bottom:Y},{padding:1})}handleScroll=(J)=>{let Z=this.getFilteredItems();if(Z.length===0)return!1;let Q=this.selectedIndex;if(J.direction==="down")if(this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++;else return!1;else if(this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--;else return!1;return this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection(),this.selectedIndex!==Q};handleItemClick=(J,Z)=>{let Q=this.getFilteredItems();if(J>=0&&J<Q.length){let Y=Q[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Z===1)this.hasUserInteracted=!0,this.selectedIndex=J,this.setState(),this.syncSelection();else if(Z===2&&!X){if(Y)this.hasUserInteracted=!0,this.widget.props.onAccept(Y,{hasUserInteracted:this.hasUserInteracted})}}};build(J){let Z=f0.of(J),{colors:Q}=Z,Y=this.getFilteredItems(),X=d1.all(new h1(Q.foreground,1,"solid")),K=this.widget.props.hidePromptWhenLoading&&this.widget.props.isLoading,V=this.widget.props.enabled??!0,G=new xZ({controller:this.textController,focusNode:this.focusNode,autofocus:!0,enabled:V,style:{backgroundColor:Q.background,textColor:Q.foreground,cursorColor:Q.cursor,placeholderColor:Q.mutedForeground,border:null},maxLines:1}),F=new l$({shortcuts:new Map([[new H4("ArrowDown"),new pv],[new H4("ArrowUp"),new dv],[new H4("Tab"),new pv],[new H4("Tab",{shift:!0}),new dv],[new H4("n",{ctrl:!0}),new pv],[new H4("p",{ctrl:!0}),new dv],[new H4("Enter"),new lF0],[new H4("Escape"),new iF0]]),focusNode:this.focusNode,child:G}),z=new A2({actions:new Map([[pv,new W6(this.invoke)],[dv,new W6(this.invoke)],[lF0,new W6(this.invoke)],[iF0,new W6(this.invoke)]]),child:F}),q=new q1({children:[new i0({decoration:{color:Q.background},child:new J0({text:new C(">",new g({color:Q.foreground}))})}),new k1({child:z})]});this.itemContexts=[];let U;if(this.widget.props.isLoading){let N=this.widget.props.loadingText??"Loading...";U=new I0({height:10,child:new Z4({child:new J0({text:new C(N,new g({color:Q.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)U=new k1({child:new Z4({child:new J0({text:new C(this.widget.props.emptyStateText,new g({color:Q.foreground,dim:!0}))})})});else{let N=Y.map((w,L)=>{let O=L===this.selectedIndex,E=this.widget.props.isItemDisabled?.(w)??!1,M;if(this.widget.props.renderItem)M=this.widget.props.renderItem(w,O,E,J);else{let A=O?Z.app.selectionBackground:void 0,j=O?Z.app.selectionForeground:Q.foreground;M=new i0({decoration:A?{color:A}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C(this.widget.props.getLabel(w),new g({color:j,dim:E}))})})}return new Mp4(new J4({onClick:(A)=>this.handleItemClick(L,A.clickCount),child:M}),(A)=>{this.itemContexts[L]=A})});U=new x0({children:N,crossAxisAlignment:"start"})}let W=new J4({onScroll:this.handleScroll,opaque:!1,child:new _6({controller:this.scrollController,autofocus:!1,child:U})}),D=[];if(this.widget.props.title){let N=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C(this.widget.props.title,new g({color:Z.app.command,bold:!0}))})});D.push(N)}if(!K)D.push(q,new I0({height:1}));if(this.textController.text!==""){let N=Y.length>0?Y[this.selectedIndex]:void 0,w=N&&this.widget.props.buildDisabledReasonWidget?.(N,J);D.push(new k1({child:new x0({mainAxisAlignment:"spaceBetween",children:[new k1({child:W}),new i0({padding:C0.only({top:1}),child:new Z4({child:w??new I0({height:1})})})]})}))}else D.push(new k1({child:W}));if(this.widget.props.footer)D.push(this.widget.props.footer);return new i0({decoration:{border:X,color:Q.background},padding:C0.symmetric(1,0),child:new x0({children:D})})}}function Rp4(J){let Q=new Date().getTime()-J.getTime(),Y=Math.floor(Q/60000),X=Math.floor(Q/3600000),K=Math.floor(Q/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(K<7)return`${K}d ago`;return J.toLocaleDateString()}class m11 extends $4{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Z=[...this.props.entries].sort((X,K)=>K.pubDate.getTime()-X.pubDate.getTime()),Q=Math.max(0,...Z.map((X)=>Rp4(X.pubDate).length));return new s2({items:Z,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,K,V,G)=>{let F=f0.of(G),{colors:z}=F,q=F.app,U=K?q.selectionBackground:void 0,W=K?q.selectionForeground:z.foreground,D=z.mutedForeground,H=(B,N)=>new I0({width:N,child:q1.end([new J0({text:new C(B,new g({color:D}))})])});return new i0({decoration:U?{color:U}:void 0,padding:C0.symmetric(2,0),child:new q1({children:[new k1({child:new J0({text:new C(X.title,new g({color:W})),overflow:"ellipsis",maxLines:1})}),new I0({width:2}),H(Rp4(X.pubDate),Q)]})})}})}}class p11 extends l0{createState(){return new Ip4}}class Ip4 extends d0{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){let Q=f0.of(J).colors;return new J0({text:new C("●",new g({color:this.isGreen?Q.success:Q.mutedForeground,bold:!0})),maxLines:1})}}function sC3(J){return CY(J,{acceptedHostnames:["ampcode.com","localhost"],allowThreadsPathExtraction:!0})}function tC3(J){let Z=new Map,Q=new Map,Y=new Map,X=[];for(let V of J)Z.set(V.id,V);for(let V of J){let G=V.relationships.find((F)=>F.role==="child"&&Z.has(F.threadID)&&(F.type==="fork"||F.type==="handoff"));if(G){Y.set(V.id,G.type);let F=G.threadID,z=Q.get(F)||[];z.push(V),Q.set(F,z)}else X.push(V)}return LG0.flatten(X,(V)=>Q.get(V.id)).map((V)=>({...V.item,depth:V.depth,isLast:V.isLast,ancestorsAreLast:V.ancestorsAreLast,relationshipType:Y.get(V.item.id)}))}function d11(J,Z,Q){return new J0({text:new C(`${J}${Z}`,new g({color:Q})),maxLines:1})}function eC3(J,Z,Q,Y){return[d11("+",J,Y.success),g3.horizontal(1),d11("~",Z,Y.warning),g3.horizontal(1),d11("-",Q,Y.destructive)]}function $_3(J){return typeof J==="object"&&J!==null&&"then"in J&&typeof J.then==="function"}class nF0 extends l0{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}createState(){return new Pp4}}class Pp4 extends d0{spinner=new F3;spinnerInterval=null;isSwitchingThread=!1;get isBusy(){return this.isSwitchingThread||this.widget.props.isLoading===!0}updateSpinnerAnimation(){if(this.isBusy){if(!this.spinnerInterval)this.spinnerInterval=setInterval(()=>{this.spinner.step(),this.setState(()=>{})},100);return}if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null}setSwitchingThread(J){if(this.isSwitchingThread===J)return;this.setState(()=>{this.isSwitchingThread=J}),this.updateSpinnerAnimation()}initState(){super.initState(),this.updateSpinnerAnimation()}didUpdateWidget(J){this.updateSpinnerAnimation()}dispose(){if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null;super.dispose()}build(J){let{props:Z}=this.widget,Q=this.isBusy,Y=this.isSwitchingThread?"Switching thread...":"Loading threads...",X=`${this.spinner.toBraille()} ${Y}`,K=Z.filterByWorkspace&&Z.currentWorkspaceURI?Z.threads.filter((L)=>L.workspaceURI===Z.currentWorkspaceURI):Z.threads;if(Z.excludeCurrentThread&&Z.currentThreadID)K=K.filter((L)=>L.id!==Z.currentThreadID);let V=Z.recentThreadIDs||[],G=new Set(V),F=Z.currentThreadID,z=[...K].sort((L,O)=>{if(F){if(L.id===F)return-1;if(O.id===F)return 1}let E=V.indexOf(L.id),M=V.indexOf(O.id);if(E!==-1&&M!==-1)return E-M;if(E!==-1)return-1;if(M!==-1)return 1;return 0}),q=tC3(z),U=Math.max(0,...q.map((L)=>L.description.timeAgo.length)),W=f0.of(J),D=new a0({padding:C0.symmetric(0,1),child:new Z4({child:new J0({text:new C("",new g({color:W.colors.foreground,dim:!0}),[new C("Ctrl+T",new g({color:W.colors.primary,dim:!0})),new C(Z.filterByWorkspace?" for all workspaces":" to filter by workspace",new g({color:W.colors.foreground,dim:!0}))])})})}),H="",B=null,N=(L)=>{if(L!==H)H=L,B=sC3(L);return B};return new s2({items:q,getLabel:(L)=>`${L.title} ${L.id}`,filterItem:(L,O)=>{let E=N(O);if(E)return L.id.toLowerCase()===E.toLowerCase();return!0},normalizeQuery:(L)=>N(L)?"":L,onAccept:async(L,O)=>{if(!Z.onSelect||this.isSwitchingThread)return;let E=Z.onSelect(L.id,O);if(!$_3(E))return;this.setSwitchingThread(!0);try{await E}finally{if(this.mounted)this.setSwitchingThread(!1)}},onDismiss:Z.onDismiss,onSelectionChange:(L)=>{if(Z.previewController){if(L)Z.previewController.select(L.id)}},title:Z.title,enabled:!Q,isLoading:Q,hidePromptWhenLoading:!0,loadingText:X,emptyStateText:"No threads match your filter",maxRenderItems:200,footer:Q?void 0:D,renderItem:(L,O,E,M)=>{let A=f0.of(M),{app:j,colors:R}=A,S=O?j.selectionBackground:void 0,_=O?j.selectionForeground:R.foreground,f=R.mutedForeground,m=(s,z0)=>new I0({width:z0,child:q1.end([new J0({text:new C(s,new g({color:f}))})])}),x=Z.threadViewStates[L.id],T=[],u=L.relationshipType==="handoff",p=new ia({connectorColor:R.mutedForeground});if(L.depth>0){let s=[],z0=L.ancestorsAreLast.slice(1);for(let w0 of z0)s.push(new C(p.getAncestorPrefix(w0),new g({color:p.connectorColor,dim:p.connectorDim})));let a=L.isLast?p.elbow:p.tee,q0=p.getConnectorText(a);s.push(new C(q0,new g({color:p.connectorColor,dim:p.connectorDim}))),T.push(new J0({text:new C("",void 0,s)}))}let d=[],h=F===L.id?new C("(current) ",new g({color:R.success})):G.has(L.id)?new C("(visited) ",new g({color:R.foreground,dim:!0})):null;if(h)d.push(new J0({text:h}));if(SN(x))d.push(new p11),d.push(new I0({width:1}));let n=L.title;if(L.relationshipType==="fork"){let s=n.match(/^Forked\((\d+)\): /);if(s)n=n.slice(s[0].length);else while(n.startsWith("Forked: "))n=n.slice(8);d.push(new J0({text:new C("[fork] ",new g({color:R.primary}))}))}else if(u)d.push(new J0({text:new C("[handoff] ",new g({color:R.accent}))}));if(d.push(new k1({child:new J0({text:new C(n,new g({color:_})),overflow:"ellipsis",maxLines:1})})),d.push(new I0({width:2})),L.diffStats&&(L.diffStats.added>0||L.diffStats.changed>0||L.diffStats.deleted>0)){let s=O?{success:f,warning:f,destructive:f}:R;d.push(...eC3(L.diffStats.added,L.diffStats.changed,L.diffStats.deleted,s)),d.push(new I0({width:2}))}return d.push(m(L.description.timeAgo,U)),new i0({decoration:S?{color:S}:void 0,padding:C0.symmetric(2,0),child:new q1({children:[...T,...d]})})}})}}function Cp4(J){return 1-(1-J)**3}function _p4(J,Z,Q){return J+(Z-J)*Q}function Eo(J,Z){if(!J)return{x:0,y:0};let Q=Z-J.startTime,Y=Math.min(Q/J.durationX,1),X=Math.min(Q/J.durationY,1),K=Cp4(Y),V=Cp4(X);return{x:_p4(J.startOffset.x,J.targetOffset.x,K),y:_p4(J.startOffset.y,J.targetOffset.y,V)}}var J_3={nodeWidth:3,horizontalSpacing:3};class cv{options;constructor(J={}){this.options={...J_3,...J}}layout(J){let{childrenMap:Z,resolvedParent:Q}=this.buildTree(J),Y=[],X=Z.get(void 0)??[];if(this.options.comparator)X.sort(this.options.comparator);let K=0,V=(G,F)=>{let z=Z.get(G.id)??[];if(this.options.comparator)z.sort(this.options.comparator);let q={...G,parentID:Q.get(G.id)};if(z.length===0){Y.push({node:q,position:{x:K,y:F}});let B=K;return K+=this.options.nodeWidth+this.options.horizontalSpacing,B}let U=[];for(let B of z)U.push(V(B,F+1));let W=Math.min(...U),D=Math.max(...U),H=Math.floor((W+D)/2);return Y.push({node:q,position:{x:H,y:F}}),H};for(let G of X)V(G,0);return Y}buildTree(J){let Z=new Set(J.map((K)=>K.id)),Q=[...J].sort((K,V)=>K.id.localeCompare(V.id)),Y=new Map;for(let K of Q){if(!K.parentID||!Z.has(K.parentID)){Y.set(K.id,void 0);continue}let V=!1,G=K.parentID;while(G){if(G===K.id){V=!0;break}G=Y.get(G)}Y.set(K.id,V?void 0:K.parentID)}let X=new Map;for(let K of J){let V=Y.get(K.id);if(!X.has(V))X.set(V,[]);X.get(V).push(K)}return{childrenMap:X,resolvedParent:Y}}}var Z_3={nodeWidth:3,nodeHeight:2};class lv{options;constructor(J={}){this.options={...Z_3,...J}}calculate(J){let Z=[],Q=new Map;for(let Y of J)Q.set(Y.node.id,Y);for(let Y of J){if(!Y.node.parentID)continue;let X=Q.get(Y.node.parentID);if(!X)continue;let K=this.calculateConnectorLine(X.position,Y.position);Z.push({points:K,fromNodeID:X.node.id,toNodeID:Y.node.id})}return Z}calculateConnectorLine(J,Z){let Q=Math.floor(this.options.nodeWidth/2),Y=[],X=J.x+Q,K=Z.x+Q,V=J.y*(this.options.nodeHeight+3)+this.options.nodeHeight;Y.push({x:X,y:V});let G=V+1;if(Y.push({x:X,y:G}),X!==K)Y.push({x:K,y:G});let F=Z.y*(this.options.nodeHeight+3)-1;return Y.push({x:K,y:F}),Y}}var Q_3={nodeWidth:3,nodeHeight:2},Y_3={x:0,y:0};class oF0{options;constructor(J={}){this.options={...Q_3,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Y_3,X,K,V,G){let F=G?f0.of(G):null,z=F?.colors,q=F?.app,U=z?.mutedForeground??z?.foreground;if(J.length===0)return new J0({text:new C("No nodes",new g({color:U}))});let W=Math.max(...J.map((j)=>j.position.y)),H=Math.max(...J.map((j)=>j.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+3,N=[];for(let j=W;j>=0;j--){let R=J.filter((f)=>f.position.y===j);R.sort((f,m)=>f.position.x-m.position.x);let S=[],_=0;for(let f of R){if(f.position.x>_)S.push(new I0({width:f.position.x-_}));let m=f.node.id===Q,x=V?.(f.node.data)??!1,T=K?.activeFlashOn??!1,u=f.node.id===K?.copyFlashNodeId;S.push(this.renderNode(m,x,T,u,q,z)),_=f.position.x+this.options.nodeWidth}if(N.push(new q1({crossAxisAlignment:"start",children:S})),j>0){let f=J.filter((T)=>T.position.y===j-1),m=R,x=this.renderConnectors(f,m,Z,H,z,q);N.push(...x)}}let w=new x0({crossAxisAlignment:"start",children:N}),L=Math.round(Y.x),O=Math.round(Y.y*B),E=(W+1)*B,M=[new I0({width:H,height:E}),new e6({left:L,top:O,child:w})],A=Q?J.find((j)=>j.node.id===Q):void 0;if(A&&X){let j=X(A.node.data),R=W-A.position.y,S=L+A.position.x+this.options.nodeWidth+1,_=O+R*B+1,f=30;if(K?.maxTitleWidthPercent&&K.viewportWidth)f=Math.floor(K.viewportWidth*K.maxTitleWidthPercent/100);M.push(new e6({left:S,top:_,child:this.renderInfoBox(j,f,z,q)}))}return new i0({padding:C0.horizontal(2),child:new lG(new q5({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X,K){let V="┌─┐",G="└─┘",F=J?X?.threadGraphNodeSelected??K?.primary??K?.foreground:X?.threadGraphNode??K?.primary??K?.foreground,z=!1;if(Y)F=X?.threadGraphNodeSelected??K?.primary??F,V="┏━┓",G="┗━┛",z=!0;else if(Z&&Q)F=X?.toolSuccess??K?.primary??F,V="┏━┓",G="┗━┛";return new x0({crossAxisAlignment:"start",children:[new J0({text:new C(V,new g({color:F,bold:z}))}),new J0({text:new C(G,new g({color:F,bold:z}))})]})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let K of Q){if(K.length>Z)K=K.slice(0,Z-1)+"…";if(X.length===0)X=K;else if(X.length+1+K.length<=Z)X+=" "+K;else Y.push(X),X=K}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q,Y){let X=this.wrapText(J,Z),K=Math.min(Z,Math.max(1,...X.map((W)=>W.length))),V=K+2,G="┌"+"─".repeat(V)+"┐",F="└"+"─".repeat(V)+"┘",z=Q?.border??Y?.threadGraphConnector??Q?.foreground,q=Q?.foreground,U=[new J0({text:new C(G,new g({color:z}))})];for(let W of X){let D=" ".repeat(K-W.length);U.push(new J0({text:new C("│ ",new g({color:z}),[new C(W+D,new g({color:q??z})),new C(" │",new g({color:z}))])}))}return U.push(new J0({text:new C(F,new g({color:z}))})),new x0({crossAxisAlignment:"start",children:U})}renderConnectors(J,Z,Q,Y,X,K){let V=[],G=Math.floor(this.options.nodeWidth/2),F=K?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let W of Z){let D=W.position.x+G;if(D>=0&&D<Y)z[D]="▲"}V.push(new J0({text:new C(z.join(""),new g({color:F}))}));let q=Array(Y).fill(" ");for(let W of J){let D=Z.filter((L)=>L.node.parentID===W.node.id);if(D.length===0)continue;let H=W.position.x+G,B=D.map((L)=>L.position.x+G),N=Math.min(...B),w=Math.max(...B);for(let L=N;L<=w;L++)if(L>=0&&L<Y){if(L===H)if(D.length===1&&B[0]===H)q[L]="│";else if(L===N)q[L]="└";else if(L===w)q[L]="┘";else q[L]="┬";else if(B.includes(L))if(L===N)q[L]="└";else if(L===w)q[L]="┘";else q[L]="┴";else if(q[L]===" ")q[L]="─"}}V.push(new J0({text:new C(q.join(""),new g({color:F}))}));let U=Array(Y).fill(" ");for(let W of J){if(Z.filter((B)=>B.node.parentID===W.node.id).length===0)continue;let H=W.position.x+G;if(H>=0&&H<Y)U[H]="│"}return V.push(new J0({text:new C(U.join(""),new g({color:F}))})),V}}var X_3={nodeWidth:1,nodeHeight:1,nodeIcon:"□",selectedIcon:"□"},K_3={x:0,y:0};class c11{options;constructor(J={}){this.options={...X_3,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=K_3,X,K,V,G){let F=G?f0.of(G):null,z=F?.colors,q=F?.app,U=z?.mutedForeground??z?.foreground;if(J.length===0)return new J0({text:new C("No nodes",new g({color:U}))});let W=Math.max(...J.map((j)=>j.position.y)),H=Math.max(...J.map((j)=>j.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+1,N=[];for(let j=W;j>=0;j--){let R=J.filter((f)=>f.position.y===j);R.sort((f,m)=>f.position.x-m.position.x);let S=[],_=0;for(let f of R){if(f.position.x>_)S.push(new I0({width:f.position.x-_}));let m=f.node.id===Q,x=V?.(f.node.data)??!1,T=K?.activeFlashOn??!1;S.push(this.renderNode(m,x,T,q,z)),_=f.position.x+this.options.nodeWidth}if(N.push(new q1({crossAxisAlignment:"start",children:S})),j>0){let f=J.filter((T)=>T.position.y===j-1),m=R,x=this.renderConnectors(f,m,Z,H,z,q);N.push(...x)}}let w=new x0({crossAxisAlignment:"start",children:N}),L=Math.round(Y.x),O=Math.round(Y.y*B),E=(W+1)*B,M=[new I0({width:H,height:E}),new e6({left:L,top:O,child:w})],A=Q?J.find((j)=>j.node.id===Q):void 0;if(A&&X){let j=X(A.node.data),R=W-A.position.y,S=L+A.position.x+this.options.nodeWidth+1,_=O+R*B,f=30;if(K?.maxTitleWidthPercent&&K.viewportWidth)f=Math.floor(K.viewportWidth*K.maxTitleWidthPercent/100);M.push(new e6({left:S,top:_,child:this.renderInfoBox(j,f,z)}))}return new i0({padding:C0.horizontal(2),child:new lG(new q5({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X){let K=J?this.options.selectedIcon:this.options.nodeIcon,V=J?Y?.threadGraphNodeSelected??X?.primary??X?.foreground:Y?.threadGraphNode??X?.primary??X?.foreground;if(Z&&Q)V=Y?.toolSuccess??X?.primary??V,K="■";return new J0({text:new C(K,new g({color:V}))})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let K of Q){if(K.length>Z)K=K.slice(0,Z-1)+"…";if(X.length===0)X=K;else if(X.length+1+K.length<=Z)X+=" "+K;else Y.push(X),X=K}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q){let Y=this.wrapText(J,Z),X=Q?.foreground,K=[];for(let V of Y)K.push(new J0({text:new C(V,new g({color:X??Q?.primary??Q?.foreground}))}));return new x0({crossAxisAlignment:"start",children:K})}renderConnectors(J,Z,Q,Y,X,K){let V=[],G=Math.floor(this.options.nodeWidth/2),F=K?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let q of J){let U=Z.filter((N)=>N.node.parentID===q.node.id);if(U.length===0)continue;let W=q.position.x+G,D=U.map((N)=>N.position.x+G),H=Math.min(...D),B=Math.max(...D);for(let N=H;N<=B;N++)if(N>=0&&N<Y){let w=N===W,L=D.includes(N);if(w&&L)if(U.length===1)z[N]="│";else if(N===H)z[N]="└";else if(N===B)z[N]="┘";else z[N]="┼";else if(w)if(N===H)z[N]="└";else if(N===B)z[N]="┘";else z[N]="┬";else if(L)if(N===H)z[N]="└";else if(N===B)z[N]="┘";else z[N]="┴";else if(z[N]===" ")z[N]="─"}}return V.push(new J0({text:new C(z.join(""),new g({color:F}))})),V}}class Mo extends s3{onWidth;onHeight;constructor(J){super(J.child);this.onWidth=J.onWidth,this.onHeight=J.onHeight}createRenderObject(){return new Tp4(this.onWidth,this.onHeight)}updateRenderObject(J){J.onWidth=this.onWidth,J.onHeight=this.onHeight}}class Tp4 extends v4{onWidth;onHeight;constructor(J,Z){super();this.onWidth=J,this.onHeight=Z}performLayout(){let J=this._lastConstraints,Z=Number.isFinite(J.maxWidth)?J.maxWidth:80,Q=Number.isFinite(J.maxHeight)?J.maxHeight:24;this.onWidth(Z),this.onHeight?.(Q);let Y=this.children[0];if(Y)Y.layout(J),this.setSize(Y.size.width,Y.size.height);else this.setSize(J.minWidth,J.minHeight)}paint(J,Z,Q){for(let Y of this.children)Y.paint(J,Z,Q)}}class gR extends l0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new yp4}}var Sp4=400,kp4=300,V_3=16;class yp4 extends d0{selectedNodeId=null;positionedNodes=[];dateComparator=(J,Z)=>{let Q=J.data.updatedAt??"",Y=Z.data.updatedAt??"";return Q.localeCompare(Y)};layoutEngine=new cv({nodeWidth:1,horizontalSpacing:1,comparator:this.dateComparator});lineCalculator=new lv;renderer=new c11;animation=null;currentOffset={x:0,y:0};animationTimer=null;viewportWidth=80;viewportHeight=24;activeFlashOn=!0;activeFlashTimer=null;initState(){let{initialSelectedThreadID:J}=this.widget.props;if(J){let Q=this.widget.props.threads.find((Y)=>Y.id===J);if(Q)this.selectedNodeId=Q.id}this.startActiveFlashTimer()}startActiveFlashTimer(){if(!this.widget.props.threads.some((Z)=>Z.isActive))return;this.activeFlashTimer=setInterval(()=>{this.activeFlashOn=!this.activeFlashOn,this.setState()},700)}stopActiveFlashTimer(){if(this.activeFlashTimer)clearInterval(this.activeFlashTimer),this.activeFlashTimer=null}didUpdateWidget(J){let Z=new Set(J.props.threads.map((F)=>F.id)),Q=new Set(this.widget.props.threads.map((F)=>F.id));if(Z.size!==Q.size||[...Z].some((F)=>!Q.has(F)))this.stopAnimation(),this.currentOffset={x:0,y:0};let X=J.props.initialSelectedThreadID,K=this.widget.props.initialSelectedThreadID;if(X!==K&&K){let z=this.widget.props.threads.find((q)=>q.id===K);if(z)this.selectedNodeId=z.id,this.stopAnimation(),this.currentOffset={x:0,y:0}}let V=J.props.threads.some((F)=>F.isActive),G=this.widget.props.threads.some((F)=>F.isActive);if(V!==G){if(this.stopActiveFlashTimer(),G)this.startActiveFlashTimer()}}dispose(){this.stopAnimation(),this.stopActiveFlashTimer()}startAnimation(J){this.stopAnimation(),this.animation={startOffset:{...this.currentOffset},targetOffset:J,startTime:Date.now(),durationX:Sp4,durationY:kp4};let Z=Math.max(Sp4,kp4);this.animationTimer=setInterval(()=>{let Q=Date.now();if(this.currentOffset=Eo(this.animation,Q),this.animation&&Q-this.animation.startTime>=Z)this.currentOffset={...this.animation.targetOffset},this.stopAnimation();this.setState()},V_3)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null;this.animation=null}calculateCenterOffset(J,Z,Q){let Y=Math.floor(this.renderer.getNodeWidth()/2),K=Math.floor(this.viewportWidth/2)-J-Y,V=Q-Z,G=2,F=Math.floor(this.viewportHeight/2),q=Math.floor(F/2)-V;return{x:K,y:q}}animateToNode(J){let Z=this.positionedNodes.find((Q)=>Q.node.id===J);if(Z){let Q=Math.max(...this.positionedNodes.map((X)=>X.position.y)),Y=this.calculateCenterOffset(Z.position.x,Z.position.y,Q);this.startAnimation(Y)}}toGraphNodes(){return this.widget.props.threads.map((J)=>({id:J.id,parentID:J.parentID,data:{title:J.title,updatedAt:J.updatedAt,isActive:J.isActive}}))}toThreadNode(J){return{id:J.node.id,parentID:J.node.parentID,title:J.node.data.title,updatedAt:J.node.data.updatedAt}}handleKeyEvent=(J)=>{if(!this.selectedNodeId)return"ignored";let Z=this.positionedNodes,Q=Z.find((X)=>X.node.id===this.selectedNodeId);if(!Q)return"ignored";let Y;switch(J.key){case"ArrowUp":{let X=Z.filter((K)=>K.node.parentID===Q.node.id);if(X.length>0){X.sort((V,G)=>V.position.x-G.position.x);let K=Math.floor(X.length/2);Y=X[K]}break}case"ArrowDown":{Y=Z.find((X)=>X.node.id===Q.node.parentID);break}case"ArrowLeft":{let X=Z.filter((K)=>K.position.y===Q.position.y&&K.position.x<Q.position.x);if(X.length>0)X.sort((K,V)=>V.position.x-K.position.x),Y=X[0];break}case"ArrowRight":{let X=Z.filter((K)=>K.position.y===Q.position.y&&K.position.x>Q.position.x);if(X.length>0)X.sort((K,V)=>K.position.x-V.position.x),Y=X[0];break}case"Enter":{if(this.widget.props.onSelect)this.widget.props.onSelect(this.toThreadNode(Q));return"handled"}default:{if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"}}if(Y)return this.selectedNodeId=Y.node.id,this.widget.props.onSelectionChange?.(this.toThreadNode(Y)),this.animateToNode(Y.node.id),"handled";if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"};build(J){let Z=this.toGraphNodes();this.positionedNodes=this.layoutEngine.layout(Z);let Q=this.lineCalculator.calculate(this.positionedNodes);if(!this.animation&&this.currentOffset.x===0&&this.currentOffset.y===0){let q=(this.selectedNodeId?this.positionedNodes.find((U)=>U.node.id===this.selectedNodeId):null)??this.positionedNodes.find((U)=>!U.node.parentID);if(q){let U=Math.max(...this.positionedNodes.map((W)=>W.position.y));this.currentOffset=this.calculateCenterOffset(q.position.x,q.position.y,U)}}let X=this.widget.props.showTitle??!0,K=this.widget.props.offsetY??0,V={x:this.currentOffset.x,y:this.currentOffset.y+K},G=this.renderer.render(this.positionedNodes,Q,this.selectedNodeId??void 0,V,X?(z)=>z.title:void 0,{maxTitleWidthPercent:this.widget.props.maxTitleWidthPercent,viewportWidth:this.viewportWidth,activeFlashOn:this.activeFlashOn},(z)=>z.isActive??!1,J),F=new Mo({onWidth:(z)=>{if(this.viewportWidth!==z)this.viewportWidth=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},onHeight:(z)=>{if(this.viewportHeight!==z)this.viewportHeight=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},child:G});return new s4({autofocus:this.widget.props.autofocus??!0,onKey:this.handleKeyEvent,debugLabel:"MiniThreadGraph",child:F})}getSelectedNode(){let J=this.positionedNodes.find((Z)=>Z.node.id===this.selectedNodeId);return J?this.toThreadNode(J):null}}class xp4 extends l0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new fp4}}class fp4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}var vp4=30,G_3=30;class iv{}class nv{}class rF0{}class sF0{}class l11 extends l0{props;constructor(J){super();this.props=J}createState(){return new up4}}class up4 extends d0{highlightedIndex=0;controller=new K$;focusNode;scrollController=new j5;filteredClusters=[];itemContexts=[];initState(){this.focusNode=new U6({debugLabel:"ClusterPicker"}),this.scrollController.disableFollowMode(),this.recomputeFiltered(),this.controller.addListener(()=>{this.highlightedIndex=0,this.recomputeFiltered(),this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()})})}didUpdateWidget(J){if(J.props.clusters!==this.widget.props.clusters){if(this.recomputeFiltered(),this.highlightedIndex>=this.filteredClusters.length)this.highlightedIndex=Math.max(0,this.filteredClusters.length-1)}}ensureSelectedItemVisible(){let J=this.itemContexts[this.highlightedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;fv(J,{top:Q,bottom:Y},{padding:1})}dispose(){this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}recomputeFiltered(){let J=this.controller.text.toLowerCase(),{clusters:Z}=this.widget.props;if(!J)this.filteredClusters=[...Z];else this.filteredClusters=Z.filter((Q)=>Q.label.toLowerCase().includes(J))}invoke=(J)=>{if(J instanceof iv){if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof nv){if(this.highlightedIndex>0)this.highlightedIndex--,this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof rF0){let Z=this.filteredClusters[this.highlightedIndex];if(Z)this.widget.props.onAccept(Z);return"handled"}if(J instanceof sF0)return this.widget.props.onDismiss(),"handled";return"ignored"};handleItemClick=(J,Z)=>{if(J>=0&&J<this.filteredClusters.length){if(Z===1)this.highlightedIndex=J,this.setState();else if(Z===2){let Q=this.filteredClusters[J];if(Q)this.widget.props.onAccept(Q)}}};handleScroll=(J)=>{if(this.filteredClusters.length===0)return!1;let Z=this.highlightedIndex;if(J.direction==="down")if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++;else return!1;else if(this.highlightedIndex>0)this.highlightedIndex--;else return!1;return this.setState(),C6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.highlightedIndex!==Z};build(J){let{currentThreadID:Z}=this.widget.props,Q=f0.of(J),{colors:Y,app:X}=Q,G=V4.of(J).size.width>=G_3+vp4,F=d1.all(new h1(Y.foreground,1,"solid")),z=this.filteredClusters[this.highlightedIndex]??null,q=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C("Select a cluster",new g({color:X.command,bold:!0}))})}),U=new xZ({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new l$({shortcuts:new Map([[new H4("ArrowDown"),new iv],[new H4("ArrowUp"),new nv],[new H4("Tab"),new iv],[new H4("Tab",{shift:!0}),new nv],[new H4("n",{ctrl:!0}),new iv],[new H4("p",{ctrl:!0}),new nv],[new H4("Enter"),new rF0],[new H4("Escape"),new sF0]]),focusNode:this.focusNode,child:U}),D=new A2({actions:new Map([[iv,new W6(this.invoke)],[nv,new W6(this.invoke)],[rF0,new W6(this.invoke)],[sF0,new W6(this.invoke)]]),child:W}),H=new q1({children:[new i0({decoration:{color:Y.background},child:new J0({text:new C(">",new g({color:Y.foreground}))})}),new k1({child:D})]});this.itemContexts=[];let B=this.filteredClusters.map((M,A)=>{let j=A===this.highlightedIndex,R=Z?M.threads.some((m)=>m.id===Z):!1,S=j?X.selectionBackground:void 0,_=j?X.selectionForeground:Y.foreground,f=[new C(M.label,new g({color:_})),new C(` (${M.threads.length})`,new g({color:_,dim:!0}))];if(R)f.push(new C(" (current)",new g({color:j?X.selectionForeground:Y.success})));return new xp4(new J4({onClick:(m)=>this.handleItemClick(A,m.clickCount),child:new i0({decoration:S?{color:S}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C("",void 0,f)})})}),(m)=>{this.itemContexts[A]=m})}),N=new x0({children:B,crossAxisAlignment:"start"}),w=new k1({child:new J4({onScroll:this.handleScroll,child:new _6({controller:this.scrollController,autofocus:!1,child:N})})}),L=z?z.threads.map((M)=>({id:M.id,title:M.title,parentID:M.parentID,updatedAt:M.updatedAt})):[],O=z?new i0({padding:C0.all(1),child:new gR({threads:L,autofocus:!1,offsetY:2})}):null,E;if(G){let M=O?new k1({child:O}):new I0({width:vp4});E=new q1({crossAxisAlignment:"stretch",mainAxisAlignment:"start",children:[w,M]})}else{let M=[new k1({child:new J4({onScroll:this.handleScroll,child:new _6({controller:this.scrollController,autofocus:!1,child:N})})})];if(O)M.push(new k1({child:O}));E=new x0({crossAxisAlignment:"stretch",children:M})}return new i0({decoration:{border:F,color:Y.background},padding:C0.symmetric(1,0),child:new x0({children:[q,H,new I0({height:1}),new k1({child:E})]})})}}class hJ{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!hJ._instance)hJ._instance=new hJ;return hJ._instance}get allExpanded(){return this._allExpanded}setAllExpanded(J){if(this._allExpanded===J)return;this._allExpanded=J,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(J){return this._listeners.add(J),()=>this.removeListener(J)}removeListener(J){this._listeners.delete(J)}_notifyListeners(){for(let J of this._listeners)J()}}g0();class bp4 extends d0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let J=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!J.ok){P.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){P.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){let Z=J.trim().toLowerCase();if(Z.length===0)return null;if(Z.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Z))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null&&J.length>0}getAvailableLabels(){let J=this.widget.props.currentLabels||[];return this.labels.filter((Z)=>!J.includes(Z.name))}shouldShowCreateMarker(J){if(J.length===0||this.isLoading)return!1;let Z=J.trim().toLowerCase();if(!this.isValidLabelName(Z))return!1;let Q=this.widget.props.currentLabels||[],Y=this.labels.some((K)=>K.name===Z),X=Q.includes(Z);return!Y&&!X}build(J){let Z=f0.of(J),{app:Q,colors:Y}=Z,X=this.currentQuery.trim().toLowerCase(),K=X.length>0?this.getValidationError(X):null,V=this.getAvailableLabels(),F=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...V];return new s2({title:"Add Label",items:F,getLabel:(z)=>{if("__isCreateMarker"in z)return this.currentQuery.trim().toLowerCase();return z.name},onAccept:(z)=>{if("__isCreateMarker"in z)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(z.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:K||"Type to create a new label",renderItem:(z,q,U,W)=>{let D=q?Q.selectionBackground:void 0,H=q?Q.selectionForeground:Y.foreground;if("__isCreateMarker"in z&&z.__isCreateMarker){let N=this.currentQuery.trim().toLowerCase();return new i0({decoration:D?{color:D}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C("",void 0,[new C("Create new label: ",new g({color:H})),new C(N,new g({color:H,bold:!0}))])})})}return new i0({decoration:D?{color:D}:void 0,padding:C0.symmetric(2,0),child:new J0({text:new C(z.name,new g({color:H}))})})},filterItem:(z,q)=>{if(this.currentQuery!==q)this.currentQuery=q,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in z&&z.__isCreateMarker)return this.shouldShowCreateMarker(q);let W=q.trim().toLowerCase();return W.length===0||z.name.includes(W)},sortItems:(z,q,U)=>{let W="__isCreateMarker"in z.item&&z.item.__isCreateMarker,D="__isCreateMarker"in q.item&&q.item.__isCreateMarker;if(W&&!D)return-1;if(!W&&D)return 1;return q.score-z.score}})}}class i11 extends l0{props;constructor(J){super();this.props=J}createState(){return new bp4}}class eG extends l0{props;constructor(J){super();this.props=J}createState(){return new hp4}}class hp4 extends d0{_spinner=new F3;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(J){let Z=f0.of(J),{colors:Q,app:Y}=Z,X=d1.all(new h1(Q.foreground,1,"solid")),K=this._spinner.toBraille(),V=new J0({textAlign:"center",text:new C("",void 0,[new C(K,new g({color:Y.processing})),new C(" ",void 0),new C(this.widget.props.message,new g({color:Q.foreground}))])}),F=[new k1({child:new x0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[V]})})];if(this.widget.props.onAbort)F.push(new I0({height:2,child:new i0({padding:C0.symmetric(2,0),child:new J0({text:new C("",new g({dim:!0}),[new C("Press ",new g({color:Q.foreground})),new C("Esc",new g({color:Q.info})),new C(" to cancel",new g({color:Q.foreground}))])})})}));let z=new i0({decoration:new r4(Q.background,X),child:new I0({width:60,height:7,child:new x0({mainAxisAlignment:"start",children:F})})});if(this.widget.props.onAbort)return new s4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(q)=>{if(q.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:z});return z}}var Ao={workspace:{label:"Workspace",pathHint:".amp/settings.json",description:"workspace config"},global:{label:"Global",pathHint:"~/.config/amp/settings.json",description:"global config"},flag:{label:"Flag",pathHint:"CLI flags",description:"flag config"},default:{label:"Default",pathHint:"built-in defaults",description:"default config"},external:{label:"External",pathHint:"extensions / external",description:"external source"},skill:{label:"Skills",pathHint:".agents/skills/",description:"skill source"},other:{label:"Other",pathHint:"",description:"other source"}},tF0=["workspace","global","flag","default","external","skill","other"];function F_3(J){return Array.from(new Set(J))}function gp4(J){return F_3([...J.skillNames??[],...J.skillName?[J.skillName]:[]])}function av(J){if(J.isExternal)return"external";switch(J.spec._target){case"workspace":return"workspace";case"global":return"global";case"flag":return"flag";case"default":return"default"}return gp4(J).length>0?"skill":"other"}function n11(J){return av(J)==="skill"}function mp4(J){let Z=gp4(J);if(Z.length===0)return;let Q=Z.join(", "),Y=av(J);if(Y==="skill")return`skills: ${Q}`;return`${Z.length===1?"skill source":"skill sources"} overridden by ${Ao[Y].description}: ${Q}`}function pp4(J){return J.spec.meta?.skillNames?Array.from(J.spec.meta.skillNames):[]}var dp4=process.platform==="win32"?" ":"█",cp4=process.platform==="win32"?"░":"█";class E9 extends l0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X=dp4,thumbChar:K=cp4,showTrack:V=!0,thumbColor:G,trackColor:F}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=K,this.showTrack=V,this.thumbColor=G,this.trackColor=F}createState(){return new lp4}}class lp4 extends d0{_dragStartY=null;_dragStartOffset=null;_isOverThumb=!1;_isPositionOverThumb(J){let{totalContentHeight:Z,viewportHeight:Q}=this.widget.getScrollInfo(),X=this.context.findRenderObject()?.size.height??0;if(X===0||Z<=Q)return!1;let K=this.widget.getScrollInfo(),V=Math.min(1,Q/Z),G=Math.max(1,X*V),F=Math.max(0,Math.min(1,K.scrollOffset/(Z-Q))),z=X-G,q=Math.max(0,z*F),U=q+G;return J>=q&&J<=U}_handleHover=(J)=>{let Z=this._isOverThumb;if(this._isOverThumb=this._isPositionOverThumb(J.localPosition.y),Z!==this._isOverThumb)this.setState()};_handleDrag=(J)=>{let{totalContentHeight:Z,viewportHeight:Q,scrollOffset:Y}=this.widget.getScrollInfo(),K=this.context.findRenderObject()?.size.height??0;if(K===0||Z<=Q)return;if(this._dragStartY===null)this._dragStartY=J.localPosition.y,this._dragStartOffset=Y;let V=J.localPosition.y-this._dragStartY,G=Math.min(1,Q/Z),F=Math.max(1,K*G),z=K-F;if(z<=0)return;let q=Z-Q,U=z/q,W=V/U,D=Math.max(0,Math.min(q,this._dragStartOffset+W));this.widget.controller.jumpTo(D)};_handleRelease=()=>{this._dragStartY=null,this._dragStartOffset=null};_handleClick=(J)=>{if(J.button!=="left")return;let Z=J.localPosition.y,{totalContentHeight:Q,viewportHeight:Y,scrollOffset:X}=this.widget.getScrollInfo(),V=this.context.findRenderObject()?.size.height??0;if(V===0||Q<=Y)return;let G=Math.min(1,Y/Q),F=Math.max(1,V*G),z=Q-Y,q=V-F,U=Math.max(0,Math.min(1,X/(Q-Y))),W=Math.max(0,q*U),D=W+F;if(Z>=W&&Z<=D)return;if(Z<W)this.widget.controller.animateTo(Math.max(0,X-Y));else this.widget.controller.animateTo(Math.min(z,X+Y))};build(J){return new J4({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?d5.POINTER:d5.DEFAULT,child:new ip4({controller:this.widget.controller,getScrollInfo:this.widget.getScrollInfo,thickness:this.widget.thickness,trackChar:this.widget.trackChar,thumbChar:this.widget.thumbChar,showTrack:this.widget.showTrack,thumbColor:this.widget.thumbColor,trackColor:this.widget.trackColor})})}}class ip4 extends ky{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X=dp4,thumbChar:K=cp4,showTrack:V=!0,thumbColor:G,trackColor:F}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=K,this.showTrack=V,this.thumbColor=G,this.trackColor=F}createRenderObject(){return new np4(this)}updateRenderObject(J){J.updateWidget(this)}}class np4 extends v4{_widget;constructor(J){super();this._widget=J}updateWidget(J){this._widget=J,this.markNeedsLayout()}performLayout(){let J=this._lastConstraints;J6(!!J,"performLayout called without constraints");let Z=Math.min(J.maxWidth,this._widget.thickness),Q=J.maxHeight;this.setSize(Z,Q),super.performLayout()}getMinIntrinsicWidth(J){return this._widget.thickness}getMaxIntrinsicWidth(J){return this._widget.thickness}getMinIntrinsicHeight(J){return 0}getMaxIntrinsicHeight(J){return 0}paint(J,Z,Q){let{thumbStartFloat:Y,thumbSizeFloat:X,showScrollbar:K}=this._calculateScrollbarMetrics();if(!K)return;let V=this._widget.trackColor,G=this._widget.thumbColor,F=process.platform==="win32",z=Y,q=Y+X;if(!F){let U=["▁","▂","▃","▄","▅","▆","▇","█"];for(let W=0;W<this.size.height;W++){let D="█",H=!0;if(W===Math.floor(z)){let B=1-(z-W),N=Math.floor(B*8);D=U[N]||"█",H=!1}else if(W===Math.floor(q)){let B=1-(q-W),N=Math.floor(B*8);D=U[N]||"█"}else if(W>z&&W<q)H=!1;J.setChar(Z,Q+W,D,{fg:G,bg:V,reverse:H},1)}return}for(let U=0;U<this.size.height;U++){let W=U+0.5,D=W>=z&&W<q,H=D?this._widget.thumbChar:this._widget.trackChar;J.setChar(Z,Q+U,H,{fg:D?G:V,bg:V,reverse:!1},1)}}_calculateScrollbarMetrics(){let{totalContentHeight:J,viewportHeight:Z,scrollOffset:Q}=this._widget.getScrollInfo(),Y=this.size.height;if(J<=Z||Y<=0)return{thumbStartFloat:0,thumbSizeFloat:0,showScrollbar:!1};let X=Math.max(0,Math.min(1,Q/(J-Z))),K=Math.min(1,Z/J),V=Math.max(1,Y*K),G=Y-V;return{thumbStartFloat:Math.max(0,G*X),thumbSizeFloat:V,showScrollbar:!0}}}class mR extends l0{props;constructor(J){super();this.props=J}createState(){return new ap4}}class ap4 extends d0{scrollController=new j5;scrollAreaKey=new J$("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(J){return J instanceof r2}resolveFooterStyle(J){if(this.isWidgetMessage(J))return J.footerStyle;return"default"}getViewportHeight(){let Z=this.scrollAreaKey.currentElement?.renderObject;if(Z&&"size"in Z){let Q=Z.size;if(typeof Q.height==="number"&&Q.height>0)return this.viewportHeight=Q.height,Q.height}return this.viewportHeight}build(J){let Z=f0.of(J),Q=this.widget.props.message,Y=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let q=IF0(Q);return{title:q.title,type:q.type,description:q.description}})(),X=Y.type==="error"?Z.app.toolError:Z.app.command,K=d1.all(new h1(Z.colors.border,1,"solid")),V=new i0({padding:C0.symmetric(1,0),child:new J0({text:new C(Y.title,new g({color:X,bold:!0}))})}),G=this.isWidgetMessage(Q)?Q.widget:new J0({text:new C(Y.description,new g({color:Z.colors.foreground})),selectable:!0}),F=new k1({child:new i$({child:new i0({padding:C0.symmetric(1,0),child:new q1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new k1({child:new _6({controller:this.scrollController,autofocus:!0,child:G})}),new E9({controller:this.scrollController,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let q=this.scrollController.maxScrollExtent,U=this.scrollController.offset,W=this.getViewportHeight(),D=q+W;return{totalContentHeight:Math.max(D,0),viewportHeight:Math.max(W,1),scrollOffset:Math.max(U,0)}}})]})})})}),z=new i0({padding:C0.symmetric(1,0),child:new J0({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new g({color:Z.colors.foreground,dim:!0})),new C("R",new g({color:Z.app.keybind})),new C(" to retry, ",new g({color:Z.colors.foreground,dim:!0})),new C("Esc",new g({color:Z.app.keybind})),new C(" to cancel",new g({color:Z.colors.foreground,dim:!0}))]);let q=this.resolveFooterStyle(this.widget.props.message);if(q==="none")return new C("",new g({color:Z.colors.foreground,dim:!0}));if(q==="help"){let U=new g({color:Z.app.keybind}),W=new g({color:Z.colors.foreground,dim:!0});return new C("",W,[new C("Press ",W),new C("Escape",U),new C(" to close • Use ",W),new C("↑↓",U),new C(" or ",W),new C("j/k",U),new C(" to scroll",W)])}return new C("Press any key to close",new g({color:Z.colors.foreground,dim:!0,italic:!0}))})()})});return new s4({onKey:(q)=>{if(this.widget.props.onRetry&&q.key==="r")return this.widget.props.onRetry(),"handled";if(q.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new i0({decoration:{border:K,color:Z.colors.background},padding:C0.all(1),child:new x0({mainAxisAlignment:"center",children:[V,new I0({height:1}),F,z]})})})}}S2();class op4 extends l0{props;constructor(J){super();this.props=J}createState(){return new rp4}}class rp4 extends d0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((J)=>{this.plugins=J,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(J){let Z=J.startsWith("file://")?J.slice(7):J,Q=this.widget.props.cwd;if(Z.startsWith(Q))return Z.slice(Q.length+1);return Z}statusIcon(J){let Z=y9.default(),{colors:Q,app:Y}=Z;switch(J){case"loading":return{icon:"◌",color:Q.warning};case"active":return{icon:"✓",color:Y.toolSuccess};case"error":return{icon:"✗",color:Y.toolError}}}build(J){let Z=f0.of(J),{app:Q}=Z;if(this.plugins.length===0)return new J0({text:new C("No plugins found.",new g({dim:!0}))});let Y=[],X=this.plugins.length,K=this.plugins.filter((F)=>F.status==="active").length,V=this.plugins.reduce((F,z)=>F+z.registeredCommands.length,0),G=this.plugins.reduce((F,z)=>F+z.registeredTools.length,0);if(Y.push(new C(`${K}/${X} ${p4(X,"plugin")} active`,new g({bold:!0}))),V>0||G>0)Y.push(new C(` (${V} ${p4(V,"command")}, ${G} ${p4(G,"tool")})`,new g({dim:!0})));Y.push(new C(`
7393
7393
 
7394
7394
  `));for(let F of this.plugins){let{icon:z,color:q}=this.statusIcon(F.status),U=this.getRelativePath(F.uri.toString());if(Y.push(new C(`${z} `,new g({color:q}))),Y.push(new C(U,new g({bold:!0}))),Y.push(new C(` ${F.status}`,new g({dim:!0}))),Y.push(new C(`
7395
7395
  `)),F.status==="active"&&F.registeredEvents.length>0)Y.push(new C(" Events: ",new g({dim:!0}))),Y.push(new C(F.registeredEvents.join(", "),new g({color:Q.link}))),Y.push(new C(`
@@ -7618,7 +7618,7 @@ ${Y0.content||""}`:Y0.content||"",$1=[],W1=Y0.baseDir.startsWith("file://")?fz0(
7618
7618
  `),process.exit(1)}process.stdout.write(await ey3(F.result.displayText)+`
7619
7619
  `),process.exit(0)})}VA();import{stdout as $v3}from"node:process";function Jv3({version:J,buildTimestamp:Z,buildType:Q}){let Y=Q==="dev"?"dev":"released",X=Z?new Date(Z):null,K=X&&!Number.isNaN(X.getTime())?`, ${kz(X)} ago`:"";return`${J} (${Y}${Z?` ${Z}`:""}${K})`}function hi4(J){$v3.write(`${Jv3(J)}
7620
7620
  `)}function gi4(J,Z){J.option("-V, --version","Print the version number and exit",()=>{hi4(Z),process.exit(0)}),J.command("version").description("Print the version number and exit").action(()=>{hi4(Z),process.exit(0)})}var Mb3=mL.join(ZQ,"logs","headless.log"),O31=mL.join(Sy,"device-id.json");async function Ab3(){for(let J of IE)try{if((await J.listConfigs()).length>0)return J}catch(Z){P.debug("Failed to detect query-based IDE integration",{ideName:J.ideName,error:Z})}return}try{if(process.platform==="win32")await Promise.resolve().then(() => G4(Ax(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){R7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
7621
- `)}function jb3(J){process.emitWarning=(Z,Q,Y,X)=>{let K=typeof Z==="string"?Z:Z.message||String(Z),V=Q||"Warning",G=!1;J.warn(K,{name:V,code:Y})}}function e2(J,Z){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")ZZ("dangerouslyAllowAll",Z.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")ZZ("experimental.agentMode",Z.mode)}function wr4(J,Z){if(J.getOptionValueSourceWithGlobals("sp")==="cli"&&Z.sp)return Z.sp;if(J.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Z.systemPrompt)return Z.systemPrompt;return}async function Rb3(J){try{return await Br4(J,"utf-8")}catch{return J}}async function E31(J,Z,Q){let Y=wr4(J,Z);if(!Y)return;let X=m6(Q)?Q.features:[],K=m6(Q)?Q.user.email:void 0;if(!I31(X,S7.HARNESS_SYSTEM_PROMPT)&&!Lr4(K))throw new P1("You are not allowed to do this.",1);ZZ("systemPrompt",await Rb3(Y))}function Lr4(J){return!!(J&&V40(J))}function I31(J,Z){return J?.some((Q)=>Q.name===Z&&Q.enabled)??!1}function M31(J){return(J.userEmail?JZ(J.userEmail):!1)||I31(J.features,S7.DTW_TUI)}function Gr4(J){if(J.dtwEnabled&&!J.hasV2TUIAccess)throw new P1("This TUI mode is not enabled for your user;",1)}function A31(J,Z){if(typeof J==="boolean")return J;if(!m6(Z))return!1;return M31({userEmail:Z.user.email,features:Z.features})}function j31(J){if(!m6(J))return null;return{...J.user,features:J.features??[],team:J.workspace??void 0}}function Ib3(J){try{let Z=new URL(J);return Z.hostname==="localhost"||Z.hostname==="127.0.0.1"}catch{return J.includes("localhost")||J.includes("127.0.0.1")}}function Iq0(J){let Y=Ib3(J)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new P1(`Couldn't connect to the Amp server at ${J}.`,1,Y)}async function Fr4(J){if(!V5.write(J))await wb3(V5,"drain")}var zr4=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??gK,description:`Custom settings file path (overrides the default location ${gK})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(P).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${Yj})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:a2(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"mode",long:"mode",short:"m",type:"option",default:cF.SMART.key,description:`Set the agent mode (${lF().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:lF().map((J)=>J.mode).concat("large","deep","internal")},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable v2 thread mode and use the legacy worker runtime",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless DTW harness (no TUI). Optionally provide a thread ID to connect as executor.",hidden:!0},{name:"threadActors",long:"thread-actors",type:"optional-option",description:"Connect to the thread-actors counter service. Optionally provide a thread ID.",hidden:!0},{name:"apiKey",long:"api-key",type:"option",description:"API key for internal DTW commands (overrides AMP_API_KEY)",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0}],qr4=(J)=>("deprecated"in J)&&J.deprecated===!0,Pb3=(J)=>("hidden"in J)&&J.hidden===!0,Cb3=(J)=>("default"in J),_b3=(J)=>("default"in J)?J.default:void 0,Or4=[{name:"toggle-skills-count",entryPoint:$s0}];function Tb3(J,Z){let Q=Z.args[0],Y=Z.commands.map((K)=>K.name());if(Q&&!Q.includes(" ")&&Q.length<30&&!/[./\\]/.test(Q)){let K=Y.filter((G)=>Q.includes(G)||G.includes(Q)),V="Run amp --help for a list of available commands.";if(K.length>0)V=`Did you mean: ${K.join(", ")}? Or run amp --help for all commands.`;throw new P1(M3.unknownCommand(Q),1,V)}}async function P31(J){return{...J,getThreadEnvironment:AZ,threadSyncService:J.threadSyncService,osFileSystem:J.fileSystem,skillService:J.skillService,fileChangeTrackerStorage:new nV(J.fileSystem),generateThreadTitle:y90,deleteThread:(Z)=>J.threadService.delete(Z),getServerStatus:()=>VQ(J.configService),pluginService:J.pluginService}}function Er4(J){return{toolService:J.toolService,configService:J.configService,skillService:J.skillService,getThreadEnvironment:AZ,filesystem:J.fileSystem,threadService:J.threadService}}var Pq0=Y1.file(Nr4.homedir()),R31=process.env.XDG_CONFIG_HOME?Y1.file(process.env.XDG_CONFIG_HOME):X1.joinPath(Pq0,".config");function Sb3(J){return vW4({playNotificationSound:async(Z)=>{if(J.useNotificationsForService){yW4(Z);let Q=hK0(),Y=Hs0();if((!Q||Y||jk4())&&J.config.settings["notifications.system.enabled"]!==!1){if(Z==="idle")process.stdout.write(TD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Z==="requires-user-input")process.stdout.write(TD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(hK0()),threadService:J.threadService,configService:J.configService,threadViewStates$:J.threadViewStates$})}function kb3(){return{sync:async()=>{},uploadThread:async()=>{},discoverThreads:async()=>[],initialSyncComplete:Promise.resolve(),updateThreadMeta:async()=>{},threadSyncInfo:()=>k0.of({}),flushPendingSyncs:async()=>{},dispose:()=>{}}}async function Z2(J,Z,Q){let Y=Q?.deferAuth??!1;vu1("0.0.1774339849-g374434");let X=E40({storage:J.settings,secretStorage:J.secrets,workspaceRoot:k0.of(Y1.file(process.cwd())),defaultAmpURL:J.ampURL,homeDir:Pq0,userConfigDir:R31});Ak4(X);let K=await X.getLatest();P.debug("Global configuration initialized",{settingsKeys:Object.keys(K.settings)});let V=!1;{let z0=await J.secrets.get("apiKey",J.ampURL);if(V=Boolean(z0),P.info("API key lookup before login",{found:Boolean(z0),ampURL:J.ampURL,deferAuth:Y}),!z0)if(Y)P.info("No API key found, continuing startup with deferred auth");else{V5.write(`No API key found. Starting login flow...
7621
+ `)}function jb3(J){process.emitWarning=(Z,Q,Y,X)=>{let K=typeof Z==="string"?Z:Z.message||String(Z),V=Q||"Warning",G=!1;J.warn(K,{name:V,code:Y})}}function e2(J,Z){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")ZZ("dangerouslyAllowAll",Z.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")ZZ("experimental.agentMode",Z.mode)}function wr4(J,Z){if(J.getOptionValueSourceWithGlobals("sp")==="cli"&&Z.sp)return Z.sp;if(J.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Z.systemPrompt)return Z.systemPrompt;return}async function Rb3(J){try{return await Br4(J,"utf-8")}catch{return J}}async function E31(J,Z,Q){let Y=wr4(J,Z);if(!Y)return;let X=m6(Q)?Q.features:[],K=m6(Q)?Q.user.email:void 0;if(!I31(X,S7.HARNESS_SYSTEM_PROMPT)&&!Lr4(K))throw new P1("You are not allowed to do this.",1);ZZ("systemPrompt",await Rb3(Y))}function Lr4(J){return!!(J&&V40(J))}function I31(J,Z){return J?.some((Q)=>Q.name===Z&&Q.enabled)??!1}function M31(J){return(J.userEmail?JZ(J.userEmail):!1)||I31(J.features,S7.DTW_TUI)}function Gr4(J){if(J.dtwEnabled&&!J.hasV2TUIAccess)throw new P1("This TUI mode is not enabled for your user;",1)}function A31(J,Z){if(typeof J==="boolean")return J;if(!m6(Z))return!1;return M31({userEmail:Z.user.email,features:Z.features})}function j31(J){if(!m6(J))return null;return{...J.user,features:J.features??[],team:J.workspace??void 0}}function Ib3(J){try{let Z=new URL(J);return Z.hostname==="localhost"||Z.hostname==="127.0.0.1"}catch{return J.includes("localhost")||J.includes("127.0.0.1")}}function Iq0(J){let Y=Ib3(J)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new P1(`Couldn't connect to the Amp server at ${J}.`,1,Y)}async function Fr4(J){if(!V5.write(J))await wb3(V5,"drain")}var zr4=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??gK,description:`Custom settings file path (overrides the default location ${gK})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(P).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${Yj})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:a2(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"mode",long:"mode",short:"m",type:"option",default:cF.SMART.key,description:`Set the agent mode (${lF().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:lF().map((J)=>J.mode).concat("large","deep","internal")},{name:"takeMeBack",long:"take-me-back",type:"switch",description:"Disable v2 thread mode and use the legacy worker runtime",hidden:!0},{name:"headless",long:"headless",type:"optional-option",description:"Run headless DTW harness (no TUI). Optionally provide a thread ID to connect as executor.",hidden:!0},{name:"threadActors",long:"thread-actors",type:"optional-option",description:"Connect to the thread-actors counter service. Optionally provide a thread ID.",hidden:!0},{name:"apiKey",long:"api-key",type:"option",description:"API key for internal DTW commands (overrides AMP_API_KEY)",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0}],qr4=(J)=>("deprecated"in J)&&J.deprecated===!0,Pb3=(J)=>("hidden"in J)&&J.hidden===!0,Cb3=(J)=>("default"in J),_b3=(J)=>("default"in J)?J.default:void 0,Or4=[{name:"toggle-skills-count",entryPoint:$s0}];function Tb3(J,Z){let Q=Z.args[0],Y=Z.commands.map((K)=>K.name());if(Q&&!Q.includes(" ")&&Q.length<30&&!/[./\\]/.test(Q)){let K=Y.filter((G)=>Q.includes(G)||G.includes(Q)),V="Run amp --help for a list of available commands.";if(K.length>0)V=`Did you mean: ${K.join(", ")}? Or run amp --help for all commands.`;throw new P1(M3.unknownCommand(Q),1,V)}}async function P31(J){return{...J,getThreadEnvironment:AZ,threadSyncService:J.threadSyncService,osFileSystem:J.fileSystem,skillService:J.skillService,fileChangeTrackerStorage:new nV(J.fileSystem),generateThreadTitle:y90,deleteThread:(Z)=>J.threadService.delete(Z),getServerStatus:()=>VQ(J.configService),pluginService:J.pluginService}}function Er4(J){return{toolService:J.toolService,configService:J.configService,skillService:J.skillService,getThreadEnvironment:AZ,filesystem:J.fileSystem,threadService:J.threadService}}var Pq0=Y1.file(Nr4.homedir()),R31=process.env.XDG_CONFIG_HOME?Y1.file(process.env.XDG_CONFIG_HOME):X1.joinPath(Pq0,".config");function Sb3(J){return vW4({playNotificationSound:async(Z)=>{if(J.useNotificationsForService){yW4(Z);let Q=hK0(),Y=Hs0();if((!Q||Y||jk4())&&J.config.settings["notifications.system.enabled"]!==!1){if(Z==="idle")process.stdout.write(TD("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Z==="requires-user-input")process.stdout.write(TD("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(hK0()),threadService:J.threadService,configService:J.configService,threadViewStates$:J.threadViewStates$})}function kb3(){return{sync:async()=>{},uploadThread:async()=>{},discoverThreads:async()=>[],initialSyncComplete:Promise.resolve(),updateThreadMeta:async()=>{},threadSyncInfo:()=>k0.of({}),flushPendingSyncs:async()=>{},dispose:()=>{}}}async function Z2(J,Z,Q){let Y=Q?.deferAuth??!1;vu1("0.0.1774341467-g86d7fe");let X=E40({storage:J.settings,secretStorage:J.secrets,workspaceRoot:k0.of(Y1.file(process.cwd())),defaultAmpURL:J.ampURL,homeDir:Pq0,userConfigDir:R31});Ak4(X);let K=await X.getLatest();P.debug("Global configuration initialized",{settingsKeys:Object.keys(K.settings)});let V=!1;{let z0=await J.secrets.get("apiKey",J.ampURL);if(V=Boolean(z0),P.info("API key lookup before login",{found:Boolean(z0),ampURL:J.ampURL,deferAuth:Y}),!z0)if(Y)P.info("No API key found, continuing startup with deferred auth");else{V5.write(`No API key found. Starting login flow...
7622
7622
  `);let a=await yb3(J),q0=await J.secrets.get("apiKey",J.ampURL);if(P.info("Login flow completed",{success:a,storedKeyPresent:Boolean(q0),ampURL:J.ampURL}),!a)await YD(),process.exit(1);V=!0}}{let z0=await X.getLatest(),a=z0.settings.url,q0=z0.secrets.isSet?.[a];P.info("Config secrets state after login",{configURL:a,apiKeySet:q0?.apiKey??!1})}let G=M1(VQ(X).pipe(E5((z0)=>z0!=="pending"))),F=Y?"pending":await G;if(!Y)P.info("Server status resolved",{status:"ready",isAuthenticated:m6(F),isError:iU(F),errorMessage:iU(F)?F.error.message:void 0});let{toolService:z,dispose:q}=CW4({configService:X}),U=new Map,W=()=>U.clear(),D=new XS0(X,J.settings.getWorkspaceRootPath()),H=ye1({configService:X,filesystem:M8}),B=Co1({configService:X,trustStore:D,skillMCPServers:H.skillMCPServers,createOAuthProvider:async(z0,a,q0)=>{let w0=`${z0}:${a}`,F0=U.get(w0);if(F0)return P.debug("Reusing existing OAuth provider for server",{serverName:z0,serverUrl:a}),F0;P.debug("Creating OAuth provider for server",{serverName:z0,serverUrl:a});let $0=(async()=>{let W0=new xE(J.secrets),i=await W0.getClientInfo(z0,a),o=q0?.scopes??i?.scopes,e=Z_4();P.info("OAuth headless mode check",{useHeadless:e,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:V5.isTTY});let Q0;if(e)Q0=J.executeMode?J_4():$_4(z0);let Y0=new hI0({storage:W0,serverName:z0,serverUrl:a,clientId:q0?.clientId??i?.clientId,clientSecret:q0?.clientSecret??i?.clientSecret,authUrl:q0?.authUrl??i?.authUrl,tokenUrl:q0?.tokenUrl??i?.tokenUrl,scopes:o,headlessAuthHandler:Q0});return P.debug("OAuth provider created",{serverName:z0,serverUrl:a,hasManualClientId:!!(q0?.clientId??i?.clientId),willUseDCR:!(q0?.clientId??i?.clientId),scopes:o,headlessMode:e,executeMode:J.executeMode}),Y0})();return U.set(w0,$0),$0}}),N=Wp0({configService:X,filesystem:M8,spawn:yJ0}),w;if(J.executeMode){let z0=await kz4({toolService:z,providers:[B,N],initialTimeout:15000});w=z0.registrations;for(let[a,q0]of z0.initErrors)P.warn(`${a} provider initialization slow or failed:`,q0)}else w=Dp0({toolService:z,providers:[B,N]});if(Z.jetbrains)EE("JetBrains");else if(Z.ide&&g_4())EE("VS Code");else if(Z.ide&&m_4())EE("Neovim");else if(Z.ide){let z0=await Ab3();if(z0){let a=T40(z0.ideName);if(a)EE(a)}}if(J.executeMode)xu1(!0);let L,O=A$.status.pipe(U1((z0)=>Boolean(z0.connected&&z0.authenticated&&z0.ideName&&Lb1(z0.ideName))),y4()).subscribe((z0)=>{if(z0){if(!L)L=z.registerTool(Sz4)}else L?.dispose(),L=void 0}),E;if(!J.executeMode){let z0=await J.settings.get("fuzzy.alwaysIncludePaths")??[];E=new HQ0(process.cwd(),{alwaysIncludePaths:z0},!0)}else E=new class extends HQ0{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let M=await he1({isDevelopment:!1}),A=new Kv0(M,X),j=new rk0(M,{lazy:!0,maxThreads:200});P.info("Starting Amp background services");let R=Z.takeMeBack?!1:void 0,S=A31(R,F),_=Boolean(S||Z.headless);if(_)P.info("DTW mode enabled: thread sync service disabled");let f=_?kb3():w14({threadService:A,threadHistoryService:j,configService:X,isExtensionDevelopment:!1}),m;A$.status.subscribe((z0)=>{m=z0});let x=new RR0({workspaceRoots:[Y1.file(process.cwd())],fileSystem:M8,getCurrentFile:()=>{if(!m?.openFile)return;try{return Y1.parse(m.openFile)}catch(z0){P.warn("Failed to parse current file URI",{uri:m.openFile,error:z0});return}},getOpenFiles:()=>{if(!m?.visibleFiles?.length)return[];let z0=m.openFile;return m.visibleFiles.filter((a)=>a!==z0).map((a)=>{try{return Y1.parse(a)}catch(q0){return P.warn("Failed to parse visible file URI",{uri:a,error:q0}),null}}).filter((a)=>a!==null)}}),T=new ws0,u=process.env.PLUGINS??"off",p=Z.headless?Vk4():void 0,d=p??new yK0({configService:X}),h=d instanceof yK0?d:void 0;if(h)h.pluginExecutorKind=S?"local":"unknown";let n=ES0({configService:X,fileSystem:M8,platform:d,internalPlugins:Or4,pluginFilter:u}),c=Mr1({pluginService:n,toolService:z}),s={codebaseContextService:x,configService:X,toolService:z,mcpService:B,skillService:H,toolboxService:N,trustStore:D,threadService:A,threadHistoryService:j,threadSyncService:f,threadStorage:M,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:E,fileSystem:M8,terminal:T,pluginService:n,pluginPlatform:h,headlessPluginPlatform:p,serverStatus:F,serverStatusPromise:G,hasAPIKeyAtStartup:V};return{...s,async asyncDispose(){if(s.mcpService.hasAuthenticatingClients())P.info("Waiting for OAuth authentication to complete before exit..."),await s.mcpService.waitForAuthentication();for(let z0 of w.values())z0.dispose();await s.mcpService.dispose(),W(),await s.threadService.asyncDispose(),s.configService.unsubscribe(),q(),s.fuzzyServer.dispose(),s.threadSyncService.dispose(),s.settingsStorage[Symbol.dispose](),O.unsubscribe(),L?.dispose(),c.dispose(),await s.pluginService.dispose()}}}async function yb3(J){if(!J.executeMode){if(!await TK0("Would you like to log in to Amp? [(y)es, (n)o]: "))return V5.write(`Login cancelled. Run the command again to retry.
7623
7623
  `),!1}return await Mr4(J)}async function Mr4(J){let Z=Nb3(32).toString("hex"),Q=await hy(J.ampURL,Z),Y=new AbortController;try{await CV(Q,Y.signal)}catch(K){P.error("Error opening browser",{error:K})}let X=await hy(J.ampURL,Z,!1);V5.write(`If your browser does not open automatically, visit:
7624
7624
 
@@ -7626,7 +7626,7 @@ ${c0.blue.bold(X)}
7626
7626
 
7627
7627
  `);try{return await gS4(J.ampURL,Z,J.secrets,Y),V5.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(K){return P.error("Login failed",{error:K}),R7.write(`
7628
7628
  Login failed: ${K instanceof Error?K.message:String(K)}
7629
- `),!1}}function Ur4(J){if(!J||J.length===0)return;let Z=J.join(" ").trim();return Z.length>0?Z:void 0}async function vb3(J){let Z={...J.agentMode?{agentMode:J.agentMode}:{},...J.repositoryURL?{repositoryURL:J.repositoryURL}:{}},Q=await fetch(`${J.ampURL}/api/durable-thread-workers`,{method:"POST",headers:{Authorization:`Bearer ${J.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify(Z)});if(!Q.ok){let X=await Q.text();throw new P1(`Create request failed (${Q.status}): ${X}`,1)}let Y=await Q.json();if(!Y.threadId||!h9(Y.threadId))throw new P1("Create response did not include a valid thread ID",1);return Y.threadId}function xb3(J){return typeof J==="object"&&J!==null&&"durableObjectId"in J&&typeof J.durableObjectId==="string"&&J.durableObjectId.length>0}async function fb3(J){let Z=await fetch(new URL(`/threads/${J.threadID}/durable-object-id`,J.workerURL),{method:"GET",headers:{Authorization:`Bearer ${J.apiKey}`}});if(!Z.ok){let Y=await Z.text();throw new P1(`Durable object ID request failed (${Z.status}): ${Y}`,1)}let Q=await Z.json();if(!xb3(Q))throw new P1("Durable object ID response did not include a durableObjectId",1);return Q.durableObjectId}function ub3(J){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(J)}async function bb3(J){let Z=await fetch(`${J.workerURL}/threads/${J.threadID}/spawn`,{method:"POST",headers:{Authorization:`Bearer ${J.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify({repositoryURL:J.repositoryURL,...J.projectID?{projectID:J.projectID}:{}})});if(!Z.ok){let Q=await Z.text();throw new P1(`Spawn request failed (${Z.status}): ${Q}`,1)}}function hb3(){let J=new eN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)Kj(),process.exit(0);let B=H.originalError??H;AL4(B)}),gi4(J,{version:"0.0.1774339849-g374434",buildTimestamp:"2026-03-24T08:14:26.447Z",buildType:"'release'"}),J.addHelpText("after",u_4()),J.configureHelp({formatHelp:b_4}),J.command("logout").description("Log out by removing stored API key").action(async(H,B)=>{let N=B.optsWithGlobals(),w=await d3(N);await ib3(w)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,B)=>{let N=B.optsWithGlobals(),w=await d3(N);await lb3(w,await $r0(N,w.settings))}),J.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,B,N)=>{let w=N.optsWithGlobals(),L=await d3(w);await oL4(H??"get",L.ampURL,L.secrets),process.exit(process.exitCode??0)}),J.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(H,B)=>{let N=B.optsWithGlobals(),w=await d3(N);await rL4(w.ampURL,w.secrets),process.exit(process.exitCode??0)}),J.command("dtw-curl [threadId] [action] [message...]",{hidden:!0}).summary("DTW helper").description("Internal: helper for DTW one-shot commands.").addHelpText("after",`
7629
+ `),!1}}function Ur4(J){if(!J||J.length===0)return;let Z=J.join(" ").trim();return Z.length>0?Z:void 0}async function vb3(J){let Z={...J.agentMode?{agentMode:J.agentMode}:{},...J.repositoryURL?{repositoryURL:J.repositoryURL}:{}},Q=await fetch(`${J.ampURL}/api/durable-thread-workers`,{method:"POST",headers:{Authorization:`Bearer ${J.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify(Z)});if(!Q.ok){let X=await Q.text();throw new P1(`Create request failed (${Q.status}): ${X}`,1)}let Y=await Q.json();if(!Y.threadId||!h9(Y.threadId))throw new P1("Create response did not include a valid thread ID",1);return Y.threadId}function xb3(J){return typeof J==="object"&&J!==null&&"durableObjectId"in J&&typeof J.durableObjectId==="string"&&J.durableObjectId.length>0}async function fb3(J){let Z=await fetch(new URL(`/threads/${J.threadID}/durable-object-id`,J.workerURL),{method:"GET",headers:{Authorization:`Bearer ${J.apiKey}`}});if(!Z.ok){let Y=await Z.text();throw new P1(`Durable object ID request failed (${Z.status}): ${Y}`,1)}let Q=await Z.json();if(!xb3(Q))throw new P1("Durable object ID response did not include a durableObjectId",1);return Q.durableObjectId}function ub3(J){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(J)}async function bb3(J){let Z=await fetch(`${J.workerURL}/threads/${J.threadID}/spawn`,{method:"POST",headers:{Authorization:`Bearer ${J.apiKey}`,"Content-Type":"application/json"},body:JSON.stringify({repositoryURL:J.repositoryURL,...J.projectID?{projectID:J.projectID}:{}})});if(!Z.ok){let Q=await Z.text();throw new P1(`Spawn request failed (${Z.status}): ${Q}`,1)}}function hb3(){let J=new eN().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)Kj(),process.exit(0);let B=H.originalError??H;AL4(B)}),gi4(J,{version:"0.0.1774341467-g86d7fe",buildTimestamp:"2026-03-24T08:41:29.784Z",buildType:"'release'"}),J.addHelpText("after",u_4()),J.configureHelp({formatHelp:b_4}),J.command("logout").description("Log out by removing stored API key").action(async(H,B)=>{let N=B.optsWithGlobals(),w=await d3(N);await ib3(w)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,B)=>{let N=B.optsWithGlobals(),w=await d3(N);await lb3(w,await $r0(N,w.settings))}),J.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,B,N)=>{let w=N.optsWithGlobals(),L=await d3(w);await oL4(H??"get",L.ampURL,L.secrets),process.exit(process.exitCode??0)}),J.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(H,B)=>{let N=B.optsWithGlobals(),w=await d3(N);await rL4(w.ampURL,w.secrets),process.exit(process.exitCode??0)}),J.command("dtw-curl [threadId] [action] [message...]",{hidden:!0}).summary("DTW helper").description("Internal: helper for DTW one-shot commands.").addHelpText("after",`
7630
7630
  Actions:
7631
7631
  create Create a new DTW thread and print its ID
7632
7632
  add-message <message> Send a user message and wait for message_added
@@ -7690,8 +7690,8 @@ ${E}
7690
7690
 
7691
7691
  This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}async function gb3(J){P.info("[createDTWThreadPool] Creating DTW thread pool",{threadId:J.threadId,ampURL:J.ampURL,workerUrl:process.env.AMP_WORKER_URL});try{let Z=new na({threadService:J.threadService,configService:J.configService,mcpService:J.mcpService,initialToolDiscovery:Promise.all([J.mcpService.initialized,J.toolboxService.initialized]).then(()=>{return}),toolService:J.toolService,skillService:J.skillService,getThreadEnvironment:AZ,osFileSystem:J.fileSystem,fileChangeTrackerStorage:new nV(J.fileSystem),ampURL:J.ampURL,useThreadActors:J.useThreadActors});if(J.threadId)await Z.switchThread(J.threadId);else await Z.createThread();return Z}catch(Z){throw P.error("[createDTWThreadPool] Failed to create DTW thread pool",{threadId:J.threadId,error:Z}),Z}}async function mb3(J){if(J.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof J.execute==="string"){let Z=(await cy()).trimEnd();return{userInput:J.execute,stdinInput:Z||null}}return{userInput:(await cy()).trimEnd(),stdinInput:null}}function pb3(J,Z,Q){if(J.remote&&!Z)throw new P1("The -r/--remote flag requires --execute mode",1,'Use: amp --remote --execute "your message"');if(J.streamJson&&!Z)throw new P1("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(J.streamJsonInput&&!Z)throw new P1("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(J.streamJsonInput&&!J.streamJson)throw new P1("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(J.stats&&!Z)throw new P1("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(J.archive&&!Z)throw new P1("The --archive flag requires --execute mode",1,'Use: amp --execute "your message" --archive');if(J.streamJsonInput&&typeof J.execute==="string"&&J.execute.trim()!=="")throw new P1("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(Z&&Q===""&&!J.streamJsonInput&&!J.headless)throw new P1("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"
7692
7692
  Or pipe via stdin: echo "your message" | amp --execute`)}async function Cq0(J,Z,Q){let Y=process.hrtime.bigint(),X=(F0,$0)=>{let W0=Number(process.hrtime.bigint()-$0)/1e6,i=AD4();P.info("Startup phase",{phase:F0,phaseMs:Math.round(W0),sinceMainMs:i===null?void 0:Math.round(i)})},{userInput:K,stdinInput:V}=await mb3(Z),G=!!Z.streamJson||!!Z.streamJsonThinking;pb3({...Z,streamJson:G},J.executeMode,K),e2(Q,Z);let F=process.hrtime.bigint(),z=Boolean(await J.secrets.get("apiKey",J.ampURL)),q=!J.executeMode&&!Z.headless&&!Z.threadActors&&z;P.info("Interactive auth startup mode",{deferInteractiveAuth:q,hasAPIKeyAtStartup:z,executeMode:J.executeMode,headless:Boolean(Z.headless)});let U=await Z2(J,Z,{deferAuth:q});X("runMainThread:createThreadDependencies",F),F=process.hrtime.bigint();let W=await P31(U);X("runMainThread:createWorkerDeps",F);let{serverStatus:D}=U;if(!q&&iU(D)){let F0=kk(Error(D.error.message));if(F0.message===M3.networkOffline||F0.message===M3.networkTimeout)throw Iq0(J.ampURL);throw new P1(M3.invalidAPIKey,1)}let H=m6(D)?D:null,B=H?.user.email,N=Lr4(B),w=M31({userEmail:B,features:H?.features}),L=Z.takeMeBack?!1:void 0,O=H!==null&&A31(L,H);if(!q)await E31(Q,Z,D);let E=j31(D),M=E?.features??[],A=E?.team??null,j=SK0(Z,E);if(j instanceof Error)c3(j.message);if((J.executeMode||G)&&L8(Z.mode)&&!N)throw new P1(`Execute mode is not permitted with --mode '${Z.mode}'`,1);if(H&&!AE(Z.mode,B))throw new P1(`Agent mode '${Z.mode}' is only available for Amp employees`,1);if(J.executeMode&&Z.remote)await zk4(K,V,U.configService),await U.asyncDispose(),process.exit(0);if(Z.headless){if(!B||!JZ(B))throw new P1("Headless DTW mode is only available for Amp employees",1);let F0=await U.secretStorage.get("apiKey",J.ampURL);if(!F0)throw new P1("API key required for headless mode. Please run `amp login` first.",1);let $0=typeof Z.headless==="string"&&Z.headless!=="true"?Z.headless:void 0;if($0&&!h9($0))throw new P1(`Invalid thread ID: ${$0}`,1);let W0=$0??await $h3({dependencies:U,visibility:j??void 0,usesThreadActors:Z.threadActors?!0:void 0}),i=await K_4(W0);if(i.status==="already-running")await U.asyncDispose(),await YD(),process.exit(0);try{await eC4({ampURL:J.ampURL,apiKey:F0,workerUrl:process.env.AMP_WORKER_URL,workspaceRoot:process.cwd(),threadId:W0,initialToolDiscovery:Promise.all([U.mcpService.initialized,U.toolboxService.initialized]).then(()=>{return}),configService:U.configService,mcpService:U.mcpService,toolService:U.toolService,skillService:U.skillService,fileSystem:U.fileSystem,pluginService:U.pluginService,pluginPlatform:U.headlessPluginPlatform,useThreadActors:Z.threadActors?!0:void 0})}finally{await i.release(),await U.asyncDispose()}await YD(),process.exit(0)}let R=J.executeMode?void 0:async(F0)=>Hr(F0,"interactive"),S={threadService:U.threadService,workerDeps:W,createThread:async()=>{let F0=q?await U.serverStatusPromise:D,$0=await $Q0(J.settings,process.cwd(),j31(F0),j);if($0 instanceof Error)c3($0.message);return v01(W,{threadMeta:$0?pG($0):void 0,agentMode:Z.mode,onFirstAssistantMessage:R})},validateThreadOwnership:async(F0,$0)=>{if($0?.nonBlockingOwnershipCheck){Wr4(F0,U.configService).catch((W0)=>{if(W0 instanceof P1){if($0.onOwnershipError){$0.onOwnershipError(W0,F0);return}Vj(W0,F0);return}P.warn("Failed to validate thread ownership in CLI, allowing to open",{error:W0})});return}try{await Wr4(F0,U.configService)}catch(W0){if(W0 instanceof P1)throw W0;P.warn("Failed to validate thread ownership in CLI, allowing to open",{error:W0})}},switchThreadVisibility:j,switchThreadAgentMode:Z.mode,onFirstAssistantMessage:R,handleError:Vj},_=async(F0)=>{try{if(F0==="dtw")return gb3({ampURL:J.ampURL,configService:U.configService,threadService:U.threadService,mcpService:U.mcpService,toolboxService:U.toolboxService,toolService:U.toolService,skillService:U.skillService,fileSystem:U.fileSystem,threadId:Z.threadId,useThreadActors:Z.threadActors?!0:void 0});return wh4(S,Z.threadId,{nonBlockingOwnershipCheck:Z.nonBlockingThreadOwnershipCheck})}catch($0){if($0 instanceof P1)throw $0;throw await Vj($0,Z.threadId),Error("handleError should have called process.exit()")}};if(Z.format==="jsonl")R7.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
7693
- `),await YD(),process.exit(1);let f=(async()=>{if(q){P.info("Skipping initial free tier status fetch until auth is complete");return}try{let F0=await U.configService.getLatest(),$0=bb(F0),W0=await g6.getUserFreeTierStatus({},{config:U.configService,signal:AbortSignal.timeout($0)});if(W0.ok)return P.info("User free tier status:",W0),W0.result;return}catch(F0){P.error("Failed to fetch free tier status:",F0);return}})(),x=!J.executeMode?new P01:null,T,u=null;if(x)T=x,u=(async()=>{let F0=q?await U.serverStatusPromise:U.serverStatus;await E31(Q,Z,F0);let $0=process.hrtime.bigint(),W0=A31(L,F0),i=m6(F0)?M31({userEmail:F0.user.email,features:F0.features}):!1;Gr4({dtwEnabled:W0,hasV2TUIAccess:i});let o=await _(W0?"dtw":"worker");if(X("runMainThread:createThreadPool",$0),x.attach(o),K){let e=await M1(o.threadHandles$);if(!e)throw new P1("No active thread is available yet.",1);await e.sendMessage({content:[{type:"text",text:K}]})}})(),u.catch(async(F0)=>{let $0=F0 instanceof Error?F0:Error(String(F0));x.setInitError($0),await Vj(F0,Z.threadId)});else F=process.hrtime.bigint(),Gr4({dtwEnabled:O,hasV2TUIAccess:w}),T=await _(O?"dtw":"worker"),X("runMainThread:createThreadPool",F);let p=Z.notifications!==void 0?Z.notifications:!J.executeMode;F=process.hrtime.bigint();let d=await U.configService.getLatest();if(X("runMainThread:configService.getLatest",F),F=process.hrtime.bigint(),Sb3({configService:U.configService,threadService:U.threadService,config:d,useNotificationsForService:p,threadViewStates$:()=>T.threadHandles$.pipe(U4((F0)=>{if(!F0)return k0.of({});return F5(F0.thread$,F0.threadViewState$).pipe(U1(([$0,W0])=>({[$0.id]:W0})))}))}),X("runMainThread:createCliNotificationService",F),J.executeMode){tS4(U.mcpService,J.settings);let F0={userInput:K,stdinInput:V,dependencies:U,streamJson:G,streamJsonInput:!!Z.streamJsonInput,streamJsonThinking:!!Z.streamJsonThinking,stats:!!Z.stats,ampURL:J.ampURL,isDogfooding:N,agentMode:Z.mode,labels:Z.label},$0=await vL4({threadPool:T,...F0});if(await Hr($0,"execute"),Z.archive)await g6.archiveThread({thread:$0,archived:!0},{config:U.configService});await U.asyncDispose(),process.exit(0)}let h=!1,n=!1;if(Z.jetbrains||Z.ide){await Rb1();let F0=await CE({jetbrainsOnly:Z.jetbrains});if(F0.length===0){if(Z.jetbrains)h=!await U.configService.get("jetbrains.skipInstall")}else if(F0.length===1){let $0=F0[0];if($0)A$.selectConfig($0)}else n=!0}F=process.hrtime.bigint();let c=Or0("0.0.1774339849-g374434",U.settingsStorage,{startDelayMs:3000});X("runMainThread:createUpdateService",F),F=process.hrtime.bigint();let s=new ok0(U.threadStorage);X("runMainThread:createThreadFuzzyIndexer",F),F=process.hrtime.bigint();let z0=new er0(U.mcpService,J.settings.getWorkspaceRootPath());if(X("runMainThread:createMcpTrustHandler",F),K&&J.executeMode){let F0=await M1(T.threadHandles$);if(!F0)throw new P1("No active thread is available yet.",1);await F0.sendMessage({content:[{type:"text",text:K}]})}F=process.hrtime.bigint();let a=await xK0();X("runMainThread:loadSessionState",F),P.info("Loaded session state:",a);let q0={...a,launchCount:a.launchCount+1};sj((F0)=>({...F0,launchCount:F0.launchCount+1}));let w0=Z.threadId&&h9(Z.threadId)?Z.threadId:void 0;try{if(F=process.hrtime.bigint(),await Vg4({codebaseContextService:U.codebaseContextService,history:new kl0,fuzzyServer:U.fuzzyServer,settingsStorage:U.settingsStorage,threadService:U.threadService,threadHistoryService:U.threadHistoryService,threadFuzzyIndexer:s,skillService:U.skillService,configService:U.configService,secretStorage:U.secretStorage,internalAPIClient:g6,threadPool:T,createSystemPromptDeps:async()=>Er4(U),ideClient:A$,mcpService:U.mcpService,toolboxService:U.toolboxService,mcpTrustHandler:z0,updateService:c,pluginPlatform:U.pluginPlatform,pluginService:U.pluginService},{initialServerStatus:U.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:U.hasAPIKeyAtStartup,ampURL:J.ampURL,startupThreadID:w0,showJetBrainsInstaller:h,showIdePickerHint:n,openThreadSwitcher:Z.openThreadSwitcher,inspector:Z.inspector,inspectorPort:Z.inspectorPort,jetbrainsMode:Z.jetbrains,clientId:Z.clientId,sessionState:q0,freeTierStatusPromise:f,workspace:A??null,features:M,isDogfooding:N,initialAgentMode:Q.getOptionValueSourceWithGlobals("mode")==="cli"?Z.mode:void 0,buildTimestamp:"2026-03-24T08:14:26.447Z"},(F0)=>new n01({...F0,threadPool:F0.threadPool},($0)=>new i61({...$0,threadState:$0.threadState}))),X("runMainThread:mountApp-returned",F),u)await u}finally{}await U.asyncDispose(),X("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function d3(J){if(P.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)}),J.interactive)R7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7694
- `);let Z=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Q=process.stdout.isTTY&&process.stderr.isTTY;P.info("Execution mode resolved",{executeMode:Z,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:J.streamJson,executeFlag:J.execute});let Y=await yo1({get:async(G)=>{if(G!==kg)return;try{let F=await Br4(O31,"utf-8");return JSON.parse(F).installationID}catch{return}},set:async(G,F)=>{if(G!==kg)return;await Hr4(mL.dirname(O31),{recursive:!0}),await Lb3(O31,JSON.stringify({installationID:F},null,2),{mode:384})}},{clientType:"cli",platform:pF()});fu1(Y);let X=await L_4({...J,workspaceTrust:{current:!0,changes:Ob},getHook:process.env.AMP_URL?(G,F)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return F()}:void 0});if(J.mcpConfig){let G=await rS4(J.mcpConfig);X=sS4(X,G)}let K=mL.dirname(X.getSettingsFilePath());kW4(Sy,K);let V=await X.get("url","global");if(!V)V=z2;if(P.info("Resolved Amp URL",{ampURL:V,settingsFile:X.getSettingsFilePath(),workspaceRoot:X.getWorkspaceRootPath()}),!_V(V))P.info("Targeting custom Amp server",{ampURL:V});return X=Iu1(X),{executeMode:Z,isTTY:Q,ampURL:V,settings:X,secrets:Hk4(await $r0(J,X))}}function db3(J){let Z={};for(let Q=0;Q<J.length;Q++){let Y=J[Q];if(Y?.startsWith("--")){let K=Y.slice(2).replace(/-([a-z])/g,(G,F)=>F.toUpperCase()),V=J[Q+1];if(V&&!V.startsWith("--"))Z[K]=V,Q++}}return Z}async function cb3(){MD4();let J=db3(process.argv),Z=process.argv.includes("--headless")||process.argv.some((K)=>K.startsWith("--headless="));xw4({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE||(Z?Mb3:void 0)});let Q=process.argv.includes("--no-color"),Y=process.argv.includes("--color"),X=process.stdout.isTTY&&process.stderr.isTTY;if(Q||!Y&&!X)c0.level=0;if(jb3(P),P.info("Starting Amp CLI.",{version:"0.0.1774339849-g374434",buildTimestamp:"2026-03-24T08:14:26.447Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new P1(M3.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await hb3().parseAsync(process.argv)}TW4().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await cb3().catch(Vj)});async function lb3(J,Z){let Q=J.ampURL.includes("localhost")||J.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!Q)await J.settings.set("url",process.env.AMP_URL,"global"),V5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7693
+ `),await YD(),process.exit(1);let f=(async()=>{if(q){P.info("Skipping initial free tier status fetch until auth is complete");return}try{let F0=await U.configService.getLatest(),$0=bb(F0),W0=await g6.getUserFreeTierStatus({},{config:U.configService,signal:AbortSignal.timeout($0)});if(W0.ok)return P.info("User free tier status:",W0),W0.result;return}catch(F0){P.error("Failed to fetch free tier status:",F0);return}})(),x=!J.executeMode?new P01:null,T,u=null;if(x)T=x,u=(async()=>{let F0=q?await U.serverStatusPromise:U.serverStatus;await E31(Q,Z,F0);let $0=process.hrtime.bigint(),W0=A31(L,F0),i=m6(F0)?M31({userEmail:F0.user.email,features:F0.features}):!1;Gr4({dtwEnabled:W0,hasV2TUIAccess:i});let o=await _(W0?"dtw":"worker");if(X("runMainThread:createThreadPool",$0),x.attach(o),K){let e=await M1(o.threadHandles$);if(!e)throw new P1("No active thread is available yet.",1);await e.sendMessage({content:[{type:"text",text:K}]})}})(),u.catch(async(F0)=>{let $0=F0 instanceof Error?F0:Error(String(F0));x.setInitError($0),await Vj(F0,Z.threadId)});else F=process.hrtime.bigint(),Gr4({dtwEnabled:O,hasV2TUIAccess:w}),T=await _(O?"dtw":"worker"),X("runMainThread:createThreadPool",F);let p=Z.notifications!==void 0?Z.notifications:!J.executeMode;F=process.hrtime.bigint();let d=await U.configService.getLatest();if(X("runMainThread:configService.getLatest",F),F=process.hrtime.bigint(),Sb3({configService:U.configService,threadService:U.threadService,config:d,useNotificationsForService:p,threadViewStates$:()=>T.threadHandles$.pipe(U4((F0)=>{if(!F0)return k0.of({});return F5(F0.thread$,F0.threadViewState$).pipe(U1(([$0,W0])=>({[$0.id]:W0})))}))}),X("runMainThread:createCliNotificationService",F),J.executeMode){tS4(U.mcpService,J.settings);let F0={userInput:K,stdinInput:V,dependencies:U,streamJson:G,streamJsonInput:!!Z.streamJsonInput,streamJsonThinking:!!Z.streamJsonThinking,stats:!!Z.stats,ampURL:J.ampURL,isDogfooding:N,agentMode:Z.mode,labels:Z.label},$0=await vL4({threadPool:T,...F0});if(await Hr($0,"execute"),Z.archive)await g6.archiveThread({thread:$0,archived:!0},{config:U.configService});await U.asyncDispose(),process.exit(0)}let h=!1,n=!1;if(Z.jetbrains||Z.ide){await Rb1();let F0=await CE({jetbrainsOnly:Z.jetbrains});if(F0.length===0){if(Z.jetbrains)h=!await U.configService.get("jetbrains.skipInstall")}else if(F0.length===1){let $0=F0[0];if($0)A$.selectConfig($0)}else n=!0}F=process.hrtime.bigint();let c=Or0("0.0.1774341467-g86d7fe",U.settingsStorage,{startDelayMs:3000});X("runMainThread:createUpdateService",F),F=process.hrtime.bigint();let s=new ok0(U.threadStorage);X("runMainThread:createThreadFuzzyIndexer",F),F=process.hrtime.bigint();let z0=new er0(U.mcpService,J.settings.getWorkspaceRootPath());if(X("runMainThread:createMcpTrustHandler",F),K&&J.executeMode){let F0=await M1(T.threadHandles$);if(!F0)throw new P1("No active thread is available yet.",1);await F0.sendMessage({content:[{type:"text",text:K}]})}F=process.hrtime.bigint();let a=await xK0();X("runMainThread:loadSessionState",F),P.info("Loaded session state:",a);let q0={...a,launchCount:a.launchCount+1};sj((F0)=>({...F0,launchCount:F0.launchCount+1}));let w0=Z.threadId&&h9(Z.threadId)?Z.threadId:void 0;try{if(F=process.hrtime.bigint(),await Vg4({codebaseContextService:U.codebaseContextService,history:new kl0,fuzzyServer:U.fuzzyServer,settingsStorage:U.settingsStorage,threadService:U.threadService,threadHistoryService:U.threadHistoryService,threadFuzzyIndexer:s,skillService:U.skillService,configService:U.configService,secretStorage:U.secretStorage,internalAPIClient:g6,threadPool:T,createSystemPromptDeps:async()=>Er4(U),ideClient:A$,mcpService:U.mcpService,toolboxService:U.toolboxService,mcpTrustHandler:z0,updateService:c,pluginPlatform:U.pluginPlatform,pluginService:U.pluginService},{initialServerStatus:U.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:U.hasAPIKeyAtStartup,ampURL:J.ampURL,startupThreadID:w0,showJetBrainsInstaller:h,showIdePickerHint:n,openThreadSwitcher:Z.openThreadSwitcher,inspector:Z.inspector,inspectorPort:Z.inspectorPort,jetbrainsMode:Z.jetbrains,clientId:Z.clientId,sessionState:q0,freeTierStatusPromise:f,workspace:A??null,features:M,isDogfooding:N,initialAgentMode:Q.getOptionValueSourceWithGlobals("mode")==="cli"?Z.mode:void 0,buildTimestamp:"2026-03-24T08:41:29.784Z"},(F0)=>new n01({...F0,threadPool:F0.threadPool},($0)=>new i61({...$0,threadState:$0.threadState}))),X("runMainThread:mountApp-returned",F),u)await u}finally{}await U.asyncDispose(),X("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function d3(J){if(P.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)}),J.interactive)R7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7694
+ `);let Z=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Q=process.stdout.isTTY&&process.stderr.isTTY;P.info("Execution mode resolved",{executeMode:Z,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:J.streamJson,executeFlag:J.execute});let Y=await yo1({get:async(G)=>{if(G!==kg)return;try{let F=await Br4(O31,"utf-8");return JSON.parse(F).installationID}catch{return}},set:async(G,F)=>{if(G!==kg)return;await Hr4(mL.dirname(O31),{recursive:!0}),await Lb3(O31,JSON.stringify({installationID:F},null,2),{mode:384})}},{clientType:"cli",platform:pF()});fu1(Y);let X=await L_4({...J,workspaceTrust:{current:!0,changes:Ob},getHook:process.env.AMP_URL?(G,F)=>{if(G==="url")return Promise.resolve(process.env.AMP_URL);return F()}:void 0});if(J.mcpConfig){let G=await rS4(J.mcpConfig);X=sS4(X,G)}let K=mL.dirname(X.getSettingsFilePath());kW4(Sy,K);let V=await X.get("url","global");if(!V)V=z2;if(P.info("Resolved Amp URL",{ampURL:V,settingsFile:X.getSettingsFilePath(),workspaceRoot:X.getWorkspaceRootPath()}),!_V(V))P.info("Targeting custom Amp server",{ampURL:V});return X=Iu1(X),{executeMode:Z,isTTY:Q,ampURL:V,settings:X,secrets:Hk4(await $r0(J,X))}}function db3(J){let Z={};for(let Q=0;Q<J.length;Q++){let Y=J[Q];if(Y?.startsWith("--")){let K=Y.slice(2).replace(/-([a-z])/g,(G,F)=>F.toUpperCase()),V=J[Q+1];if(V&&!V.startsWith("--"))Z[K]=V,Q++}}return Z}async function cb3(){MD4();let J=db3(process.argv),Z=process.argv.includes("--headless")||process.argv.some((K)=>K.startsWith("--headless="));xw4({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE||(Z?Mb3:void 0)});let Q=process.argv.includes("--no-color"),Y=process.argv.includes("--color"),X=process.stdout.isTTY&&process.stderr.isTTY;if(Q||!Y&&!X)c0.level=0;if(jb3(P),P.info("Starting Amp CLI.",{version:"0.0.1774341467-g86d7fe",buildTimestamp:"2026-03-24T08:41:29.784Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new P1(M3.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await hb3().parseAsync(process.argv)}TW4().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await cb3().catch(Vj)});async function lb3(J,Z){let Q=J.ampURL.includes("localhost")||J.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!Q)await J.settings.set("url",process.env.AMP_URL,"global"),V5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7695
7695
  `);else if(!_V(J.ampURL))V5.write(`Logging in to ${new URL(J.ampURL).hostname}
7696
7696
  `);let Y=process.env.AMP_API_KEY;if(Y)V5.write(`API key found in environment variable, storing...
7697
7697
  `),await Z.set("apiKey",Y,J.ampURL),V5.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1774339849-g374434",
3
+ "version": "0.0.1774341467-g86d7fe",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {