@sourcegraph/amp 0.0.1773086656-gba9cfc → 0.0.1773100957-g1437de

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 +8 -8
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -5995,11 +5995,11 @@ ${W}`))}},error:(q)=>{if(!F)F=!0,z(Error(`Failed to spawn brew: ${q.message}`))}
5995
5995
  ${W}`;if(X==="pnpm"&&W.includes("Unable to find the global bin directory"))H+=`
5996
5996
 
5997
5997
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
5998
- npm install -g @sourcegraph/amp`;z(Error(H))}},error:(q)=>{if(!G)G=!0,z(Error(`Failed to spawn ${X}: ${q.message}`))},complete:()=>{if(!G)G=!0,K()}})})}m0();m0();Aj();async function k80(J,Z){let X=`${Z||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,V=new AbortController,K=setTimeout(()=>V.abort(),5000);try{let z=await fetch(X,{signal:V.signal});if(!z.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let D=await z.json(),U=D.version??D["dist-tags"]?.latest;if(!U)return{hasUpdate:!1,currentVersion:J,source:"npm"};let G=QV4(J,U),F=G<0,q,W;if(D.time){let H=D.time[J],B=D.time[U],w=Date.now();if(H)q=Math.floor((w-new Date(H).getTime())/3600000);if(B)W=Math.floor((w-new Date(B).getTime())/3600000)}return P.info("NPM version comparison",{currentVersion:J,latestVersion:U,compareResult:G,hasUpdate:F,currentVersionAge:q,latestVersionAge:W}),{hasUpdate:F,latestVersion:U,currentVersion:J,currentVersionAge:q,latestVersionAge:W,source:"npm"}}catch(z){return P.debug("Error checking npm version",{error:z}),{hasUpdate:!1,currentVersion:J,source:"npm"}}finally{clearTimeout(K)}}var iM5="https://storage.googleapis.com/amp-public-assets-prod-0/cli/cli-version.txt";async function y80(J){let Z=new AbortController,Q=setTimeout(()=>Z.abort(),5000);try{let Y=await fetch(`${iM5}?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 V=QV4(J,X),K=V<0;return P.info("Bin version comparison",{currentVersion:J,latestVersion:X,compareResult:V,hasUpdate:K}),{hasUpdate:K,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 nM5=604800000;function ZV4(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>nM5)return{ageMs:Q};return null}function QV4(J,Z){let Q=(K)=>{let[z,D]=K.split("-");return{parts:z?.split(".").map(Number)||[],label:D}},Y=Q(J),X=Q(Z),V=Math.max(Y.parts.length,X.parts.length);for(let K=0;K<V;K++){let z=Y.parts[K]||0,D=X.parts[K]||0;if(z<D)return-1;if(z>D)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 zx0(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?Rq(Q):void 0;return{sha:Y,age:X}}catch{return null}}B1();function Dx0(J,Z,Q={}){let Y=new Z4,X=Y.pipe(I6({shouldCountRefs:!1}));return setImmediate(async()=>{let V=new RK().scoped("update"),K=Q.startDelayMs??0;if(K>0)await Jz(K);let z=X.subscribe({next:(D)=>{V.debug("emit new state",D)}});try{let D=process.env.AMP_TEST_UPDATE_STATUS;if(D){V.debug("using fake update status for testing",{status:D}),await Jz(500),Y.next(D);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){V.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let U=await Z.get("updates.mode");if(U==="disabled"){V.debug("checking disabled");return}let G=await v80(),F=G==="binary"||G==="brew";V.debug("checking",{currentVersion:J,mode:U,packageManager:G,isBinaryDistribution:F});let q=F?await y80(J):await k80(J,dE());if(!(q.latestVersion&&q.hasUpdate)){V.debug("no update available");return}let W=()=>{if(q.currentVersionAge!==void 0&&q.latestVersionAge!==void 0){let H=q.currentVersionAge-q.latestVersionAge,B=0.5;if(Math.abs(H)<0.5)return V.debug("versions too close together, suppressing update warning",{currentVersionAge:q.currentVersionAge,latestVersionAge:q.latestVersionAge,ageDifferenceHours:H}),!0}return!1};if(!U)U=G==="pnpm"?"warn":"auto",V.debug("no configured update mode; selected default based on package manager",{packageManager:G,mode:U});if(G==="brew"){if(!W())Y.next("update-available-brew");return}if(G==="binary"&&process.execPath!==Zx0()){if(V.debug("non-standard binary path, showing warning"),!W())Y.next("update-available-unrecognized-path");return}if(U==="warn"){if(!W())Y.next("update-available");return}if(!G){if(V.debug("auto-update not supported, falling back to warn mode"),!W())Y.next("update-available");return}if(G==="binary"&&process.platform==="win32"){if(V.debug("binary auto-update not supported on Windows, falling back to warn mode"),!W())Y.next("update-available");return}try{await cm(q.latestVersion,G);let H=await KH(q.latestVersion),B={from:q.currentVersion,to:q.latestVersion,...H};if(H.status==="same")V.info("success",B),Y.next("updated");else V.warn("success with warning",B),Y.next("updated-with-warning")}catch(H){Y.next("update-error")}}catch(D){V.debug("check failed",{error:D})}finally{await Jz(5000),Y.next("hidden"),z.unsubscribe(),Y.complete()}}),{state:X}}Aj();import{stderr as iz}from"node:process";function YV4(J){let Z=new oW().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 tu0(Y.force||!1,Y.verbose||!1,"0.0.1773086656-gba9cfc"),process.exit()});J.addCommand(Z,{hidden:!0});let Q=new oW("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Y)=>{await aM5(Y.targetVersion)});J.addCommand(Q)}async function aM5(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")iz.write(J1.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
5998
+ npm install -g @sourcegraph/amp`;z(Error(H))}},error:(q)=>{if(!G)G=!0,z(Error(`Failed to spawn ${X}: ${q.message}`))},complete:()=>{if(!G)G=!0,K()}})})}m0();m0();Aj();async function k80(J,Z){let X=`${Z||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,V=new AbortController,K=setTimeout(()=>V.abort(),5000);try{let z=await fetch(X,{signal:V.signal});if(!z.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let D=await z.json(),U=D.version??D["dist-tags"]?.latest;if(!U)return{hasUpdate:!1,currentVersion:J,source:"npm"};let G=QV4(J,U),F=G<0,q,W;if(D.time){let H=D.time[J],B=D.time[U],w=Date.now();if(H)q=Math.floor((w-new Date(H).getTime())/3600000);if(B)W=Math.floor((w-new Date(B).getTime())/3600000)}return P.info("NPM version comparison",{currentVersion:J,latestVersion:U,compareResult:G,hasUpdate:F,currentVersionAge:q,latestVersionAge:W}),{hasUpdate:F,latestVersion:U,currentVersion:J,currentVersionAge:q,latestVersionAge:W,source:"npm"}}catch(z){return P.debug("Error checking npm version",{error:z}),{hasUpdate:!1,currentVersion:J,source:"npm"}}finally{clearTimeout(K)}}var iM5="https://storage.googleapis.com/amp-public-assets-prod-0/cli/cli-version.txt";async function y80(J){let Z=new AbortController,Q=setTimeout(()=>Z.abort(),5000);try{let Y=await fetch(`${iM5}?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 V=QV4(J,X),K=V<0;return P.info("Bin version comparison",{currentVersion:J,latestVersion:X,compareResult:V,hasUpdate:K}),{hasUpdate:K,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 nM5=604800000;function ZV4(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>nM5)return{ageMs:Q};return null}function QV4(J,Z){let Q=(K)=>{let[z,D]=K.split("-");return{parts:z?.split(".").map(Number)||[],label:D}},Y=Q(J),X=Q(Z),V=Math.max(Y.parts.length,X.parts.length);for(let K=0;K<V;K++){let z=Y.parts[K]||0,D=X.parts[K]||0;if(z<D)return-1;if(z>D)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 zx0(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?Rq(Q):void 0;return{sha:Y,age:X}}catch{return null}}B1();function Dx0(J,Z,Q={}){let Y=new Z4,X=Y.pipe(I6({shouldCountRefs:!1}));return setImmediate(async()=>{let V=new RK().scoped("update"),K=Q.startDelayMs??0;if(K>0)await Jz(K);let z=X.subscribe({next:(D)=>{V.debug("emit new state",D)}});try{let D=process.env.AMP_TEST_UPDATE_STATUS;if(D){V.debug("using fake update status for testing",{status:D}),await Jz(500),Y.next(D);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){V.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let U=await Z.get("updates.mode");if(U==="disabled"){V.debug("checking disabled");return}let G=await v80(),F=G==="binary"||G==="brew";V.debug("checking",{currentVersion:J,mode:U,packageManager:G,isBinaryDistribution:F});let q=F?await y80(J):await k80(J,dE());if(!(q.latestVersion&&q.hasUpdate)){V.debug("no update available");return}let W=()=>{if(q.currentVersionAge!==void 0&&q.latestVersionAge!==void 0){let H=q.currentVersionAge-q.latestVersionAge,B=0.5;if(Math.abs(H)<0.5)return V.debug("versions too close together, suppressing update warning",{currentVersionAge:q.currentVersionAge,latestVersionAge:q.latestVersionAge,ageDifferenceHours:H}),!0}return!1};if(!U)U=G==="pnpm"?"warn":"auto",V.debug("no configured update mode; selected default based on package manager",{packageManager:G,mode:U});if(G==="brew"){if(!W())Y.next("update-available-brew");return}if(G==="binary"&&process.execPath!==Zx0()){if(V.debug("non-standard binary path, showing warning"),!W())Y.next("update-available-unrecognized-path");return}if(U==="warn"){if(!W())Y.next("update-available");return}if(!G){if(V.debug("auto-update not supported, falling back to warn mode"),!W())Y.next("update-available");return}if(G==="binary"&&process.platform==="win32"){if(V.debug("binary auto-update not supported on Windows, falling back to warn mode"),!W())Y.next("update-available");return}try{await cm(q.latestVersion,G);let H=await KH(q.latestVersion),B={from:q.currentVersion,to:q.latestVersion,...H};if(H.status==="same")V.info("success",B),Y.next("updated");else V.warn("success with warning",B),Y.next("updated-with-warning")}catch(H){Y.next("update-error")}}catch(D){V.debug("check failed",{error:D})}finally{await Jz(5000),Y.next("hidden"),z.unsubscribe(),Y.complete()}}),{state:X}}Aj();import{stderr as iz}from"node:process";function YV4(J){let Z=new oW().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 tu0(Y.force||!1,Y.verbose||!1,"0.0.1773100957-g1437de"),process.exit()});J.addCommand(Z,{hidden:!0});let Q=new oW("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Y)=>{await aM5(Y.targetVersion)});J.addCommand(Q)}async function aM5(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")iz.write(J1.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
5999
5999
 
6000
6000
  `));try{if(!J){iz.write(J1.blue(`Checking for updates...
6001
- `));let{hasUpdate:Y,latestVersion:X}=eu0()?await y80("0.0.1773086656-gba9cfc"):await k80("0.0.1773086656-gba9cfc",dE());if(!Y){let V=zx0("0.0.1773086656-gba9cfc"),K=V?.age?`released ${V.age} ago`:`built ${Rq(new Date("2026-03-09T20:10:03.282Z"))} ago`;iz.write(J1.green(`✓ Amp is already up to date on version ${"0.0.1773086656-gba9cfc"} (${K})
6002
- `));let z=await KH("0.0.1773086656-gba9cfc");if(z.warning)iz.write(`
6001
+ `));let{hasUpdate:Y,latestVersion:X}=eu0()?await y80("0.0.1773100957-g1437de"):await k80("0.0.1773100957-g1437de",dE());if(!Y){let V=zx0("0.0.1773100957-g1437de"),K=V?.age?`released ${V.age} ago`:`built ${Rq(new Date("2026-03-10T00:08:18.962Z"))} ago`;iz.write(J1.green(`✓ Amp is already up to date on version ${"0.0.1773100957-g1437de"} (${K})
6002
+ `));let z=await KH("0.0.1773100957-g1437de");if(z.warning)iz.write(`
6003
6003
  `+J1.yellow(z.warning)+`
6004
6004
  `);process.exit(0)}if(!X)iz.write(J1.yellow("[WARN] could not find latest version")),process.exit(0);J=X}iz.write(J1.blue(`Updating to version ${J}...
6005
6005
  `)),await cm(J,void 0,(Y)=>{iz.write(J1.dim(`Running: ${Y}
@@ -7159,7 +7159,7 @@ Ctrl-X, Y, Z to unlock`;if(q){let f=U.text.replace(/`([^`]+)`/g,"$1")+`
7159
7159
  `),V=[];for(let K=0;K<X.length;K++){let U=X[K].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 G of U)if(G.startsWith("\x00")&&G.endsWith("\x01"))V.push(new C(G.slice(1,-1),new b({color:Y.app.keybind,bold:!0})));else V.push(new C(G,new b({color:Q.colorScheme.foreground})));if(K<X.length-1)V.push(new C(`
7160
7160
  `))}return new l0({decoration:{color:Q.colorScheme.background,border:u1.all(new v1(Y.app.keybind,1,"rounded"))},child:new n0({padding:C0.symmetric(0,1),child:new Z0({text:new C(void 0,void 0,V)})})})}}class qg0 extends B2{chartData;highlightIndex;showAxes;colors;constructor({key:J,chartData:Z,highlightIndex:Q=null,showAxes:Y=!0,colors:X=K$0}){super(J?{key:J}:{});this.chartData=Z,this.highlightIndex=Q,this.showAxes=Y,this.colors=X}createRenderObject(){return new Gg0({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 Vw4(J,Z,Q,Y,X,V,K){if(V<=0)return null;switch(J){case"horizontal-bar":{let z=Q;return z>=0&&z<V?z:null}case"bar":case"stacked-bar":{let z=K?g8:0,D=Y-z;if(D<=0)return null;let U=Z-z;if(U<0||U>=D)return null;let G=Math.max(1,Math.floor(D/V)),F=Math.floor(U/G);return F>=0&&F<V?F:null}case"line":case"sparkline":case"stacked-area":{let z=K?g8:0,D=Y-z;if(D<=0)return null;let U=Math.max(0,Math.min(D-1,Z-z));if(V===1)return 0;let G=D/(V-1),F=Math.round(U/G);return Math.max(0,Math.min(V-1,F))}default:return null}}function sp5(J,Z,Q,Y,X,V,K,z){if(X<=0||Z<0||Z>=X)return null;let D=2;switch(J){case"horizontal-bar":return{x:Math.floor(Q/2),y:Z};case"bar":case"stacked-bar":{let U=V?g8:0,G=Q-U,F=Y-(V?D:0);if(G<=0||F<=0)return null;let q=Math.max(1,Math.floor(G/X)),W=U+Z*q+Math.floor(q/2),H=z>0?K/z:0,B=Math.round((1-H)*(F-1));return{x:W,y:B}}case"line":case"sparkline":case"stacked-area":{let U=V?g8:0,G=Q-U,F=Y-(V?D:0);if(G<=0||F<=0)return null;let q=X>1?U+Math.round(Z/(X-1)*(G-1)):U+Math.floor(G/2),W=z>0?K/z:0,H=Math.round((1-W)*(F-1));return{x:q,y:H}}default:return null}}function tp5(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 ep5(J,Z,Q,Y,X){if(Q.length<=1){let z=Y(J.value),D=J.meta?` (${J.meta})`:"";return J.label.length+2+z.length+D.length}let V=J.label.length,K=0;for(let z of Q){let D=z.points[Z];if(!D)continue;K+=D.value;let U=2+z.name.length+2+Y(D.value).length;V=Math.max(V,U)}if(X){let z=9+Y(K).length;V=Math.max(V,z)}return V}function $d5(J,Z,Q,Y,X,V,K){let z;try{let H=I1.of(J),B=f0.of(J);z={foreground:H.colorScheme.foreground,background:H.colorScheme.background,border:B.app.keybind}}catch{z={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let D=new b({color:z.foreground,bold:!0}),U=new b({color:z.foreground}),G=new b({color:z.foreground,dim:!0}),F=[],q=new b({color:z.foreground,underline:!0}),W=(H,B)=>new C(B,q,void 0,n80(H),()=>{U8(J,H)});if(Y.length<=1){if(F.push(new C(`${Z.label}: `,D)),Z.link)F.push(W(Z.link,V(Z.value)));else F.push(new C(V(Z.value),U));if(Z.meta)F.push(new C(` (${Z.meta})`,G))}else{let H=K==="stacked-bar"||K==="stacked-area";F.push(new C(`${Z.label}
7161
7161
  `,D));let B=0;for(let w=0;w<Y.length;w++){let N=Y[w],O=N.points[Q];if(!O)continue;B+=O.value;let E=N.color??X[w%X.length]??z.foreground;if(F.push(new C("● ",new b({color:E}))),F.push(new C(`${N.name}: `,G)),O.link)F.push(W(O.link,V(O.value)));else F.push(new C(V(O.value),U));if(w<Y.length-1||H)F.push(new C(`
7162
- `))}if(H)F.push(new C(" ",G)),F.push(new C("Total: ",G)),F.push(new C(V(B),U))}return new l0({decoration:{color:z.background,border:u1.all(new v1(z.border,1,"rounded"))},child:new Z0({text:new C(void 0,void 0,F)})})}aw();m0();r9();import{execSync as Cd5}from"node:child_process";AI();LJ();U3();L7();ow();kX();P$();C$();TX();HE();f4();$x();Xk();B1();var JN4=q4(PU(),1);import{writeFile as rw4}from"fs/promises";import sw4 from"path";m0();P$();class Wg0{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.1773086656-gba9cfc"},parameters:{metadata:{count:Q}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Z=JSON.stringify(J);await qt(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 aH extends c0{props;constructor(J){super();this.props=J}createState(){return new Kw4}}class Kw4 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 zw4 extends d0{controller=new h7;focusNode=new a4({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,V=this.controller.text.trim().length>0,K=!X||V,z=u1.all(new v1(Q.foreground,1,"solid")),D=new e$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(W)=>{let H=W.trim();if(X&&H.length===0)return;this.widget.props.onSubmit(H)},autofocus:!0,style:{textColor:Q.foreground,border:null},maxLines:1}),U=new U1({children:[new l0({decoration:{color:Q.background},child:new Z0({text:new C(">",new b({color:Q.foreground}))})}),new T1({child:D})]}),G=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C("",void 0,[new C("Command: ",new b({color:Q.foreground})),new C(this.widget.props.commandName,new b({color:Y.command,bold:!0}))])})}),F=[];if(K)F.push(new C("Enter",new b({color:Y.keybind}))),F.push(new C(" to submit, ",new b({color:Q.foreground,dim:!0})));F.push(new C("Esc",new b({color:Y.keybind}))),F.push(new C(" to cancel",new b({color:Q.foreground,dim:!0})));let q=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C("",void 0,F)})});return new l0({decoration:{border:z,color:Q.background},padding:C0.all(1),child:new u0({children:[G,new R0({height:1}),U,new Q3,q]})})}}class Sp extends c0{props;constructor(J){super();this.props=J}createState(){return new zw4}}import{isDeepStrictEqual as Hg0}from"node:util";var Jd5=/[\\/_ +.#"@[({&]/,Zd5=/[\\/_ +.#"@[({&]/g,Qd5=/[\s-]/,Dw4=/[\s-]/g;function U$0(J,Z,Q,Y,X,V,K){if(V===Z.length){if(X===J.length)return 1;return 0.99}let z=`${X},${V}`;if(K[z]!==void 0)return K[z];let D=Y.charAt(V),U=Q.indexOf(D,X),G=0,F,q,W,H;while(U>=0){if(F=U$0(J,Z,Q,Y,U+1,V+1,K),F>G){if(U===X)F*=1;else if(Qd5.test(J.charAt(U-1))){if(F*=0.9,H=J.slice(X,U-1).match(Dw4),H&&X>0)F*=0.999**H.length}else if(Jd5.test(J.charAt(U-1))){if(F*=0.8,W=J.slice(X,U-1).match(Zd5),W&&X>0)F*=0.999**W.length}else if(F*=0.3,X>0)F*=0.999**(U-X);if(J.charAt(U)!==Z.charAt(V))F*=0.9999}if(F<0.1&&(Q.charAt(U-1)===Y.charAt(V+1)||Y.charAt(V+1)===Y.charAt(V)&&Q.charAt(U-1)!==Y.charAt(V))){if(q=U$0(J,Z,Q,Y,U+1,V+2,K),q*0.1>F)F=q*0.1}if(F>G)G=F;U=Q.indexOf(D,U+1)}return K[z]=G,G}function D$0(J){return J.toLowerCase().replace(Dw4," ")}function Uw4(J,Z){let Q=U$0(J,Z,D$0(J),D$0(Z),0,0,{}),Y=Z.trim().split(/\s+/);if(Y.length>1){let X=0,V=0;for(let z of Y){let D=U$0(J,z,D$0(J),D$0(z),0,0,{});if(D===0)return Q;X+=D,V+=z.length}let K=X/Y.length*0.95;return Math.max(Q,K)}return Q}class kT{}class yT{}class G$0{}class F$0{}class Gw4 extends c0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new Fw4}}class Fw4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}function Yd5(J,Z){if(J==="")return{matches:!0,score:1};let Q=Uw4(Z,J);return{matches:Q>0.15,score:Q}}class i9 extends c0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new qw4}}class qw4 extends d0{textController;focusNode;scrollController=new Z5;selectedIndex=0;itemContexts=[];hasUserInteracted=!1;cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){if(this.scrollController.disableFollowMode(),this.textController=new h7(this.widget.props.controller?.query??""),this.focusNode=new a4({debugLabel:this.widget.debugLabel}),this.textController.addListener(()=>{this.hasUserInteracted=!0,this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),q6.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)=>Hg0(Z,this.widget.props.controller?.selectedItem));if(J>=0)this.selectedIndex=J}this.clampSelectedIndex(),this.syncSelection(),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!Hg0(J.props.items,this.widget.props.items)){if(this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let Z=this.cachedFiltered.findIndex((Q)=>Hg0(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 kT){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof yT){if(this.getFilteredItems().length>0&&this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof G$0){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 F$0)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,...Yd5(Q,this.widget.props.getLabel(X))})).filter((X)=>X.matches).sort(this.widget.props.sortItems?(X,V)=>this.widget.props.sortItems(X,V,J):(X,V)=>V.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;PT(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(),q6.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=u1.all(new v1(Q.foreground,1,"solid")),V=this.widget.props.hidePromptWhenLoading&&this.widget.props.isLoading,K=this.widget.props.enabled??!0,z=new e$({controller:this.textController,focusNode:this.focusNode,autofocus:!0,enabled:K,style:{backgroundColor:Q.background,textColor:Q.foreground,cursorColor:Q.cursor,placeholderColor:Q.mutedForeground,border:null},maxLines:1}),D=new L2({shortcuts:new Map([[new $4("ArrowDown"),new kT],[new $4("ArrowUp"),new yT],[new $4("Tab"),new kT],[new $4("Tab",{shift:!0}),new yT],[new $4("n",{ctrl:!0}),new kT],[new $4("p",{ctrl:!0}),new yT],[new $4("Enter"),new G$0],[new $4("Escape"),new F$0]]),focusNode:this.focusNode,child:z}),U=new C9({actions:new Map([[kT,new r4(this.invoke)],[yT,new r4(this.invoke)],[G$0,new r4(this.invoke)],[F$0,new r4(this.invoke)]]),child:D}),G=new U1({children:[new l0({decoration:{color:Q.background},child:new Z0({text:new C(">",new b({color:Q.foreground}))})}),new T1({child:U})]});this.itemContexts=[];let F;if(this.widget.props.isLoading){let w=this.widget.props.loadingText??"Loading...";F=new R0({height:10,child:new i1({child:new Z0({text:new C(w,new b({color:Q.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)F=new T1({child:new i1({child:new Z0({text:new C(this.widget.props.emptyStateText,new b({color:Q.foreground,dim:!0}))})})});else{let w=Y.map((N,O)=>{let E=O===this.selectedIndex,L=this.widget.props.isItemDisabled?.(N)??!1,M;if(this.widget.props.renderItem)M=this.widget.props.renderItem(N,E,L,J);else{let A=E?Z.app.selectionBackground:void 0,I=E?Z.app.selectionForeground:Q.foreground;M=new l0({decoration:A?{color:A}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C(this.widget.props.getLabel(N),new b({color:I,dim:L}))})})}return new Gw4(new l1({onClick:(A)=>this.handleItemClick(O,A.clickCount),child:M}),(A)=>{this.itemContexts[O]=A})});F=new u0({children:w,crossAxisAlignment:"start"})}let q=new l1({onScroll:this.handleScroll,opaque:!1,child:new A6({controller:this.scrollController,autofocus:!1,child:F})}),W=[];if(this.widget.props.title){let w=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C(this.widget.props.title,new b({color:Z.app.command,bold:!0}))})});W.push(w)}if(!V)W.push(G,new R0({height:1}));if(this.textController.text!==""){let w=Y.length>0?Y[this.selectedIndex]:void 0,N=w&&this.widget.props.buildDisabledReasonWidget?.(w,J);W.push(new T1({child:new u0({mainAxisAlignment:"spaceBetween",children:[new T1({child:q}),new l0({padding:C0.only({top:1}),child:new i1({child:N??new R0({height:1})})})]})}))}else W.push(new T1({child:q}));if(this.widget.props.footer)W.push(this.widget.props.footer);return new l0({decoration:{border:X,color:Q.background},padding:C0.symmetric(1,0),child:new u0({children:W})})}}function Ww4(J){let Q=new Date().getTime()-J.getTime(),Y=Math.floor(Q/60000),X=Math.floor(Q/3600000),V=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(V<7)return`${V}d ago`;return J.toLocaleDateString()}class Bg0 extends d1{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Z=[...this.props.entries].sort((X,V)=>V.pubDate.getTime()-X.pubDate.getTime()),Q=Math.max(0,...Z.map((X)=>Ww4(X.pubDate).length));return new i9({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,V,K,z)=>{let D=f0.of(z),{colors:U}=D,G=D.app,F=V?G.selectionBackground:void 0,q=V?G.selectionForeground:U.foreground,W=U.mutedForeground,H=(B,w)=>new R0({width:w,child:U1.end([new Z0({text:new C(B,new b({color:W}))})])});return new l0({decoration:F?{color:F}:void 0,padding:C0.symmetric(2,0),child:new U1({children:[new T1({child:new Z0({text:new C(X.title,new b({color:q})),overflow:"ellipsis",maxLines:1})}),new R0({width:2}),H(Ww4(X.pubDate),Q)]})})}})}}f4();class wg0 extends c0{createState(){return new Hw4}}class Hw4 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 Z0({text:new C("●",new b({color:this.isGreen?Q.success:Q.mutedForeground,bold:!0})),maxLines:1})}}var Xd5=/\/threads\/(T-[^/?#\s<>]+)/i;function Vd5(J){let Z=J.trim(),Y=Z.match(Xd5)?.[1];if(Y&&k8(Y))return Y;let X=Z.replace(/^[<("'`]+|[>")'`,.]+$/g,"");if(k8(X))return X;return null}function Kd5(J){let Z=new Map,Q=new Map,Y=new Map,X=[];for(let K of J)Z.set(K.id,K);for(let K of J){let z=K.relationships.find((D)=>D.role==="child"&&Z.has(D.threadID)&&(D.type==="fork"||D.type==="handoff"));if(z){Y.set(K.id,z.type);let D=z.threadID,U=Q.get(D)||[];U.push(K),Q.set(D,U)}else X.push(K)}return f70.flatten(X,(K)=>Q.get(K.id)).map((K)=>({...K.item,depth:K.depth,isLast:K.isLast,ancestorsAreLast:K.ancestorsAreLast,relationshipType:Y.get(K.item.id)}))}function Ng0(J,Z,Q){return new Z0({text:new C(`${J}${Z}`,new b({color:Q})),maxLines:1})}function zd5(J,Z,Q,Y){return[Ng0("+",J,Y.success),Q3.horizontal(1),Ng0("~",Z,Y.warning),Q3.horizontal(1),Ng0("-",Q,Y.destructive)]}function Dd5(J){return typeof J==="object"&&J!==null&&"then"in J&&typeof J.then==="function"}class q$0 extends c0{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}createState(){return new Bw4}}class Bw4 extends d0{spinner=new I3;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}`,V=Z.filterByWorkspace&&Z.currentWorkspaceURI?Z.threads.filter((O)=>O.workspaceURI===Z.currentWorkspaceURI):Z.threads;if(Z.excludeCurrentThread&&Z.currentThreadID)V=V.filter((O)=>O.id!==Z.currentThreadID);let K=Z.recentThreadIDs||[],z=new Set(K),D=Z.currentThreadID,U=[...V].sort((O,E)=>{if(D){if(O.id===D)return-1;if(E.id===D)return 1}let L=K.indexOf(O.id),M=K.indexOf(E.id);if(L!==-1&&M!==-1)return L-M;if(L!==-1)return-1;if(M!==-1)return 1;return 0}),G=Kd5(U),F=Math.max(0,...G.map((O)=>O.description.timeAgo.length)),q=f0.of(J),W=new n0({padding:C0.symmetric(0,1),child:new i1({child:new Z0({text:new C("",new b({color:q.colors.foreground,dim:!0}),[new C("Ctrl+T",new b({color:q.colors.primary,dim:!0})),new C(Z.filterByWorkspace?" for all workspaces":" to filter by workspace",new b({color:q.colors.foreground,dim:!0}))])})})}),H="",B=null,w=(O)=>{if(O!==H)H=O,B=Vd5(O);return B};return new i9({items:G,getLabel:(O)=>`${O.title} ${O.id}`,filterItem:(O,E)=>{let L=w(E);if(L)return O.id.toLowerCase()===L.toLowerCase();return!0},normalizeQuery:(O)=>w(O)?"":O,onAccept:async(O,E)=>{if(!Z.onSelect||this.isSwitchingThread)return;let L=Z.onSelect(O.id,E);if(!Dd5(L))return;this.setSwitchingThread(!0);try{await L}finally{if(this.mounted)this.setSwitchingThread(!1)}},onDismiss:Z.onDismiss,onSelectionChange:(O)=>{if(Z.previewController){if(O)Z.previewController.select(O.id)}},title:Z.title,enabled:!Q,isLoading:Q,hidePromptWhenLoading:!0,loadingText:X,emptyStateText:"No threads match your filter",maxRenderItems:200,footer:Q?void 0:W,renderItem:(O,E,L,M)=>{let A=f0.of(M),{app:I,colors:j}=A,_=E?I.selectionBackground:void 0,S=E?I.selectionForeground:j.foreground,y=j.mutedForeground,m=(e,G0)=>new R0({width:G0,child:U1.end([new Z0({text:new C(e,new b({color:y}))})])}),f=Z.threadViewStates[O.id],v=[],x=O.relationshipType==="handoff",c=new $p({connectorColor:j.mutedForeground});if(O.depth>0){let e=[],G0=O.ancestorsAreLast.slice(1);for(let F0 of G0)e.push(new C(c.getAncestorPrefix(F0),new b({color:c.connectorColor,dim:c.connectorDim})));let n=O.isLast?c.elbow:c.tee,K0=c.getConnectorText(n);e.push(new C(K0,new b({color:c.connectorColor,dim:c.connectorDim}))),v.push(new Z0({text:new C("",void 0,e)}))}let l=[],h=D===O.id?new C("(current) ",new b({color:j.success})):z.has(O.id)?new C("(visited) ",new b({color:j.foreground,dim:!0})):null;if(h)l.push(new Z0({text:h}));if(bO(f))l.push(new wg0),l.push(new R0({width:1}));let a=O.title;if(O.relationshipType==="fork"){let e=a.match(/^Forked\((\d+)\): /);if(e)a=a.slice(e[0].length);else while(a.startsWith("Forked: "))a=a.slice(8);l.push(new Z0({text:new C("[fork] ",new b({color:j.primary}))}))}else if(x)l.push(new Z0({text:new C("[handoff] ",new b({color:j.accent}))}));if(l.push(new T1({child:new Z0({text:new C(a,new b({color:S})),overflow:"ellipsis",maxLines:1})})),l.push(new R0({width:2})),O.diffStats&&(O.diffStats.added>0||O.diffStats.changed>0||O.diffStats.deleted>0)){let e=E?{success:y,warning:y,destructive:y}:j;l.push(...zd5(O.diffStats.added,O.diffStats.changed,O.diffStats.deleted,e)),l.push(new R0({width:2}))}return l.push(m(O.description.timeAgo,F)),new l0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new U1({children:[...v,...l]})})}})}}function ww4(J){return 1-(1-J)**3}function Nw4(J,Z,Q){return J+(Z-J)*Q}function vp(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),V=ww4(Y),K=ww4(X);return{x:Nw4(J.startOffset.x,J.targetOffset.x,V),y:Nw4(J.startOffset.y,J.targetOffset.y,K)}}var Ud5={nodeWidth:3,horizontalSpacing:3};class uT{options;constructor(J={}){this.options={...Ud5,...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 V=0,K=(z,D)=>{let U=Z.get(z.id)??[];if(this.options.comparator)U.sort(this.options.comparator);let G={...z,parentID:Q.get(z.id)};if(U.length===0){Y.push({node:G,position:{x:V,y:D}});let B=V;return V+=this.options.nodeWidth+this.options.horizontalSpacing,B}let F=[];for(let B of U)F.push(K(B,D+1));let q=Math.min(...F),W=Math.max(...F),H=Math.floor((q+W)/2);return Y.push({node:G,position:{x:H,y:D}}),H};for(let z of X)K(z,0);return Y}buildTree(J){let Z=new Set(J.map((V)=>V.id)),Q=[...J].sort((V,K)=>V.id.localeCompare(K.id)),Y=new Map;for(let V of Q){if(!V.parentID||!Z.has(V.parentID)){Y.set(V.id,void 0);continue}let K=!1,z=V.parentID;while(z){if(z===V.id){K=!0;break}z=Y.get(z)}Y.set(V.id,K?void 0:V.parentID)}let X=new Map;for(let V of J){let K=Y.get(V.id);if(!X.has(K))X.set(K,[]);X.get(K).push(V)}return{childrenMap:X,resolvedParent:Y}}}var Gd5={nodeWidth:3,nodeHeight:2};class xT{options;constructor(J={}){this.options={...Gd5,...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 V=this.calculateConnectorLine(X.position,Y.position);Z.push({points:V,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,V=Z.x+Q,K=J.y*(this.options.nodeHeight+3)+this.options.nodeHeight;Y.push({x:X,y:K});let z=K+1;if(Y.push({x:X,y:z}),X!==V)Y.push({x:V,y:z});let D=Z.y*(this.options.nodeHeight+3)-1;return Y.push({x:V,y:D}),Y}}var Fd5={nodeWidth:3,nodeHeight:2},qd5={x:0,y:0};class H$0{options;constructor(J={}){this.options={...Fd5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=qd5,X,V,K,z){let D=z?f0.of(z):null,U=D?.colors,G=D?.app,F=U?.mutedForeground??U?.foreground;if(J.length===0)return new Z0({text:new C("No nodes",new b({color:F}))});let q=Math.max(...J.map((I)=>I.position.y)),H=Math.max(...J.map((I)=>I.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+3,w=[];for(let I=q;I>=0;I--){let j=J.filter((y)=>y.position.y===I);j.sort((y,m)=>y.position.x-m.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new R0({width:y.position.x-S}));let m=y.node.id===Q,f=K?.(y.node.data)??!1,v=V?.activeFlashOn??!1,x=y.node.id===V?.copyFlashNodeId;_.push(this.renderNode(m,f,v,x,G,U)),S=y.position.x+this.options.nodeWidth}if(w.push(new U1({crossAxisAlignment:"start",children:_})),I>0){let y=J.filter((v)=>v.position.y===I-1),m=j,f=this.renderConnectors(y,m,Z,H,U,G);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(q+1)*B,M=[new R0({width:H,height:L}),new v6({left:O,top:E,child:N})],A=Q?J.find((I)=>I.node.id===Q):void 0;if(A&&X){let I=X(A.node.data),j=q-A.position.y,_=O+A.position.x+this.options.nodeWidth+1,S=E+j*B+1,y=30;if(V?.maxTitleWidthPercent&&V.viewportWidth)y=Math.floor(V.viewportWidth*V.maxTitleWidthPercent/100);M.push(new v6({left:_,top:S,child:this.renderInfoBox(I,y,U,G)}))}return new l0({padding:C0.horizontal(2),child:new NH(new p6({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X,V){let K="┌─┐",z="└─┘",D=J?X?.threadGraphNodeSelected??V?.primary??V?.foreground:X?.threadGraphNode??V?.primary??V?.foreground,U=!1;if(Y)D=X?.threadGraphNodeSelected??V?.primary??D,K="┏━┓",z="┗━┛",U=!0;else if(Z&&Q)D=X?.toolSuccess??V?.primary??D,K="┏━┓",z="┗━┛";return new u0({crossAxisAlignment:"start",children:[new Z0({text:new C(K,new b({color:D,bold:U}))}),new Z0({text:new C(z,new b({color:D,bold:U}))})]})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let V of Q){if(V.length>Z)V=V.slice(0,Z-1)+"…";if(X.length===0)X=V;else if(X.length+1+V.length<=Z)X+=" "+V;else Y.push(X),X=V}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q,Y){let X=this.wrapText(J,Z),V=Math.min(Z,Math.max(1,...X.map((q)=>q.length))),K=V+2,z="┌"+"─".repeat(K)+"┐",D="└"+"─".repeat(K)+"┘",U=Q?.border??Y?.threadGraphConnector??Q?.foreground,G=Q?.foreground,F=[new Z0({text:new C(z,new b({color:U}))})];for(let q of X){let W=" ".repeat(V-q.length);F.push(new Z0({text:new C("│ ",new b({color:U}),[new C(q+W,new b({color:G??U})),new C(" │",new b({color:U}))])}))}return F.push(new Z0({text:new C(D,new b({color:U}))})),new u0({crossAxisAlignment:"start",children:F})}renderConnectors(J,Z,Q,Y,X,V){let K=[],z=Math.floor(this.options.nodeWidth/2),D=V?.threadGraphConnector??X?.primary??X?.foreground,U=Array(Y).fill(" ");for(let q of Z){let W=q.position.x+z;if(W>=0&&W<Y)U[W]="▲"}K.push(new Z0({text:new C(U.join(""),new b({color:D}))}));let G=Array(Y).fill(" ");for(let q of J){let W=Z.filter((O)=>O.node.parentID===q.node.id);if(W.length===0)continue;let H=q.position.x+z,B=W.map((O)=>O.position.x+z),w=Math.min(...B),N=Math.max(...B);for(let O=w;O<=N;O++)if(O>=0&&O<Y){if(O===H)if(W.length===1&&B[0]===H)G[O]="│";else if(O===w)G[O]="└";else if(O===N)G[O]="┘";else G[O]="┬";else if(B.includes(O))if(O===w)G[O]="└";else if(O===N)G[O]="┘";else G[O]="┴";else if(G[O]===" ")G[O]="─"}}K.push(new Z0({text:new C(G.join(""),new b({color:D}))}));let F=Array(Y).fill(" ");for(let q of J){if(Z.filter((B)=>B.node.parentID===q.node.id).length===0)continue;let H=q.position.x+z;if(H>=0&&H<Y)F[H]="│"}return K.push(new Z0({text:new C(F.join(""),new b({color:D}))})),K}}var Wd5={nodeWidth:1,nodeHeight:1,nodeIcon:"□",selectedIcon:"□"},Hd5={x:0,y:0};class Og0{options;constructor(J={}){this.options={...Wd5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Hd5,X,V,K,z){let D=z?f0.of(z):null,U=D?.colors,G=D?.app,F=U?.mutedForeground??U?.foreground;if(J.length===0)return new Z0({text:new C("No nodes",new b({color:F}))});let q=Math.max(...J.map((I)=>I.position.y)),H=Math.max(...J.map((I)=>I.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+1,w=[];for(let I=q;I>=0;I--){let j=J.filter((y)=>y.position.y===I);j.sort((y,m)=>y.position.x-m.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new R0({width:y.position.x-S}));let m=y.node.id===Q,f=K?.(y.node.data)??!1,v=V?.activeFlashOn??!1;_.push(this.renderNode(m,f,v,G,U)),S=y.position.x+this.options.nodeWidth}if(w.push(new U1({crossAxisAlignment:"start",children:_})),I>0){let y=J.filter((v)=>v.position.y===I-1),m=j,f=this.renderConnectors(y,m,Z,H,U,G);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(q+1)*B,M=[new R0({width:H,height:L}),new v6({left:O,top:E,child:N})],A=Q?J.find((I)=>I.node.id===Q):void 0;if(A&&X){let I=X(A.node.data),j=q-A.position.y,_=O+A.position.x+this.options.nodeWidth+1,S=E+j*B,y=30;if(V?.maxTitleWidthPercent&&V.viewportWidth)y=Math.floor(V.viewportWidth*V.maxTitleWidthPercent/100);M.push(new v6({left:_,top:S,child:this.renderInfoBox(I,y,U)}))}return new l0({padding:C0.horizontal(2),child:new NH(new p6({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X){let V=J?this.options.selectedIcon:this.options.nodeIcon,K=J?Y?.threadGraphNodeSelected??X?.primary??X?.foreground:Y?.threadGraphNode??X?.primary??X?.foreground;if(Z&&Q)K=Y?.toolSuccess??X?.primary??K,V="■";return new Z0({text:new C(V,new b({color:K}))})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let V of Q){if(V.length>Z)V=V.slice(0,Z-1)+"…";if(X.length===0)X=V;else if(X.length+1+V.length<=Z)X+=" "+V;else Y.push(X),X=V}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q){let Y=this.wrapText(J,Z),X=Q?.foreground,V=[];for(let K of Y)V.push(new Z0({text:new C(K,new b({color:X??Q?.primary??Q?.foreground}))}));return new u0({crossAxisAlignment:"start",children:V})}renderConnectors(J,Z,Q,Y,X,V){let K=[],z=Math.floor(this.options.nodeWidth/2),D=V?.threadGraphConnector??X?.primary??X?.foreground,U=Array(Y).fill(" ");for(let G of J){let F=Z.filter((w)=>w.node.parentID===G.node.id);if(F.length===0)continue;let q=G.position.x+z,W=F.map((w)=>w.position.x+z),H=Math.min(...W),B=Math.max(...W);for(let w=H;w<=B;w++)if(w>=0&&w<Y){let N=w===q,O=W.includes(w);if(N&&O)if(F.length===1)U[w]="│";else if(w===H)U[w]="└";else if(w===B)U[w]="┘";else U[w]="┼";else if(N)if(w===H)U[w]="└";else if(w===B)U[w]="┘";else U[w]="┬";else if(O)if(w===H)U[w]="└";else if(w===B)U[w]="┘";else U[w]="┴";else if(U[w]===" ")U[w]="─"}}return K.push(new Z0({text:new C(U.join(""),new b({color:D}))})),K}}class kp extends q3{onWidth;onHeight;constructor(J){super(J.child);this.onWidth=J.onWidth,this.onHeight=J.onHeight}createRenderObject(){return new Ow4(this.onWidth,this.onHeight)}updateRenderObject(J){J.onWidth=this.onWidth,J.onHeight=this.onHeight}}class Ow4 extends L4{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 kL extends c0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new Mw4}}var Ew4=400,Lw4=300,Bd5=16;class Mw4 extends d0{selectedNodeId=null;positionedNodes=[];dateComparator=(J,Z)=>{let Q=J.data.updatedAt??"",Y=Z.data.updatedAt??"";return Q.localeCompare(Y)};layoutEngine=new uT({nodeWidth:1,horizontalSpacing:1,comparator:this.dateComparator});lineCalculator=new xT;renderer=new Og0;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((D)=>D.id)),Q=new Set(this.widget.props.threads.map((D)=>D.id));if(Z.size!==Q.size||[...Z].some((D)=>!Q.has(D)))this.stopAnimation(),this.currentOffset={x:0,y:0};let X=J.props.initialSelectedThreadID,V=this.widget.props.initialSelectedThreadID;if(X!==V&&V){let U=this.widget.props.threads.find((G)=>G.id===V);if(U)this.selectedNodeId=U.id,this.stopAnimation(),this.currentOffset={x:0,y:0}}let K=J.props.threads.some((D)=>D.isActive),z=this.widget.props.threads.some((D)=>D.isActive);if(K!==z){if(this.stopActiveFlashTimer(),z)this.startActiveFlashTimer()}}dispose(){this.stopAnimation(),this.stopActiveFlashTimer()}startAnimation(J){this.stopAnimation(),this.animation={startOffset:{...this.currentOffset},targetOffset:J,startTime:Date.now(),durationX:Ew4,durationY:Lw4};let Z=Math.max(Ew4,Lw4);this.animationTimer=setInterval(()=>{let Q=Date.now();if(this.currentOffset=vp(this.animation,Q),this.animation&&Q-this.animation.startTime>=Z)this.currentOffset={...this.animation.targetOffset},this.stopAnimation();this.setState()},Bd5)}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),V=Math.floor(this.viewportWidth/2)-J-Y,K=Q-Z,z=2,D=Math.floor(this.viewportHeight/2),G=Math.floor(D/2)-K;return{x:V,y:G}}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((V)=>V.node.parentID===Q.node.id);if(X.length>0){X.sort((K,z)=>K.position.x-z.position.x);let V=Math.floor(X.length/2);Y=X[V]}break}case"ArrowDown":{Y=Z.find((X)=>X.node.id===Q.node.parentID);break}case"ArrowLeft":{let X=Z.filter((V)=>V.position.y===Q.position.y&&V.position.x<Q.position.x);if(X.length>0)X.sort((V,K)=>K.position.x-V.position.x),Y=X[0];break}case"ArrowRight":{let X=Z.filter((V)=>V.position.y===Q.position.y&&V.position.x>Q.position.x);if(X.length>0)X.sort((V,K)=>V.position.x-K.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 G=(this.selectedNodeId?this.positionedNodes.find((F)=>F.node.id===this.selectedNodeId):null)??this.positionedNodes.find((F)=>!F.node.parentID);if(G){let F=Math.max(...this.positionedNodes.map((q)=>q.position.y));this.currentOffset=this.calculateCenterOffset(G.position.x,G.position.y,F)}}let X=this.widget.props.showTitle??!0,V=this.widget.props.offsetY??0,K={x:this.currentOffset.x,y:this.currentOffset.y+V},z=this.renderer.render(this.positionedNodes,Q,this.selectedNodeId??void 0,K,X?(U)=>U.title:void 0,{maxTitleWidthPercent:this.widget.props.maxTitleWidthPercent,viewportWidth:this.viewportWidth,activeFlashOn:this.activeFlashOn},(U)=>U.isActive??!1,J),D=new kp({onWidth:(U)=>{if(this.viewportWidth!==U)this.viewportWidth=U,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},onHeight:(U)=>{if(this.viewportHeight!==U)this.viewportHeight=U,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},child:z});return new k4({autofocus:this.widget.props.autofocus??!0,onKey:this.handleKeyEvent,debugLabel:"MiniThreadGraph",child:D})}getSelectedNode(){let J=this.positionedNodes.find((Z)=>Z.node.id===this.selectedNodeId);return J?this.toThreadNode(J):null}}class Iw4 extends c0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new jw4}}class jw4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}var Aw4=30,wd5=30;class fT{}class bT{}class B$0{}class w$0{}class Eg0 extends c0{props;constructor(J){super();this.props=J}createState(){return new Rw4}}class Rw4 extends d0{highlightedIndex=0;controller=new h7;focusNode;scrollController=new Z5;filteredClusters=[];itemContexts=[];initState(){this.focusNode=new a4({debugLabel:"ClusterPicker"}),this.scrollController.disableFollowMode(),this.recomputeFiltered(),this.controller.addListener(()=>{this.highlightedIndex=0,this.recomputeFiltered(),this.setState(),q6.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;PT(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 fT){if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof bT){if(this.highlightedIndex>0)this.highlightedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof B$0){let Z=this.filteredClusters[this.highlightedIndex];if(Z)this.widget.props.onAccept(Z);return"handled"}if(J instanceof w$0)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(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.highlightedIndex!==Z};build(J){let{currentThreadID:Z}=this.widget.props,Q=f0.of(J),{colors:Y,app:X}=Q,z=o1.of(J).size.width>=wd5+Aw4,D=u1.all(new v1(Y.foreground,1,"solid")),U=this.filteredClusters[this.highlightedIndex]??null,G=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C("Select a cluster",new b({color:X.command,bold:!0}))})}),F=new e$({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),q=new L2({shortcuts:new Map([[new $4("ArrowDown"),new fT],[new $4("ArrowUp"),new bT],[new $4("Tab"),new fT],[new $4("Tab",{shift:!0}),new bT],[new $4("n",{ctrl:!0}),new fT],[new $4("p",{ctrl:!0}),new bT],[new $4("Enter"),new B$0],[new $4("Escape"),new w$0]]),focusNode:this.focusNode,child:F}),W=new C9({actions:new Map([[fT,new r4(this.invoke)],[bT,new r4(this.invoke)],[B$0,new r4(this.invoke)],[w$0,new r4(this.invoke)]]),child:q}),H=new U1({children:[new l0({decoration:{color:Y.background},child:new Z0({text:new C(">",new b({color:Y.foreground}))})}),new T1({child:W})]});this.itemContexts=[];let B=this.filteredClusters.map((M,A)=>{let I=A===this.highlightedIndex,j=Z?M.threads.some((m)=>m.id===Z):!1,_=I?X.selectionBackground:void 0,S=I?X.selectionForeground:Y.foreground,y=[new C(M.label,new b({color:S})),new C(` (${M.threads.length})`,new b({color:S,dim:!0}))];if(j)y.push(new C(" (current)",new b({color:I?X.selectionForeground:Y.success})));return new Iw4(new l1({onClick:(m)=>this.handleItemClick(A,m.clickCount),child:new l0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C("",void 0,y)})})}),(m)=>{this.itemContexts[A]=m})}),w=new u0({children:B,crossAxisAlignment:"start"}),N=new T1({child:new l1({onScroll:this.handleScroll,child:new A6({controller:this.scrollController,autofocus:!1,child:w})})}),O=U?U.threads.map((M)=>({id:M.id,title:M.title,parentID:M.parentID,updatedAt:M.updatedAt})):[],E=U?new l0({padding:C0.all(1),child:new kL({threads:O,autofocus:!1,offsetY:2})}):null,L;if(z){let M=E?new T1({child:E}):new R0({width:Aw4});L=new U1({crossAxisAlignment:"stretch",mainAxisAlignment:"start",children:[N,M]})}else{let M=[new T1({child:new l1({onScroll:this.handleScroll,child:new A6({controller:this.scrollController,autofocus:!1,child:w})})})];if(E)M.push(new T1({child:E}));L=new u0({crossAxisAlignment:"stretch",children:M})}return new l0({decoration:{border:D,color:Y.background},padding:C0.symmetric(1,0),child:new u0({children:[G,H,new R0({height:1}),new T1({child:L})]})})}}class $J{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!$J._instance)$J._instance=new $J;return $J._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()}}m0();class Pw4 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((V)=>V.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(),V=X.length>0?this.getValidationError(X):null,K=this.getAvailableLabels(),D=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...K];return new i9({title:"Add Label",items:D,getLabel:(U)=>{if("__isCreateMarker"in U)return this.currentQuery.trim().toLowerCase();return U.name},onAccept:(U)=>{if("__isCreateMarker"in U)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(U.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:V||"Type to create a new label",renderItem:(U,G,F,q)=>{let W=G?Q.selectionBackground:void 0,H=G?Q.selectionForeground:Y.foreground;if("__isCreateMarker"in U&&U.__isCreateMarker){let w=this.currentQuery.trim().toLowerCase();return new l0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C("",void 0,[new C("Create new label: ",new b({color:H})),new C(w,new b({color:H,bold:!0}))])})})}return new l0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C(U.name,new b({color:H}))})})},filterItem:(U,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in U&&U.__isCreateMarker)return this.shouldShowCreateMarker(G);let q=G.trim().toLowerCase();return q.length===0||U.name.includes(q)},sortItems:(U,G,F)=>{let q="__isCreateMarker"in U.item&&U.item.__isCreateMarker,W="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(q&&!W)return-1;if(!q&&W)return 1;return G.score-U.score}})}}class Lg0 extends c0{props;constructor(J){super();this.props=J}createState(){return new Pw4}}class oH extends c0{props;constructor(J){super();this.props=J}createState(){return new Cw4}}class Cw4 extends d0{_spinner=new I3;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=u1.all(new v1(Q.foreground,1,"solid")),V=this._spinner.toBraille(),K=new Z0({textAlign:"center",text:new C("",void 0,[new C(V,new b({color:Y.processing})),new C(" ",void 0),new C(this.widget.props.message,new b({color:Q.foreground}))])}),D=[new T1({child:new u0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[K]})})];if(this.widget.props.onAbort)D.push(new R0({height:2,child:new l0({padding:C0.symmetric(2,0),child:new Z0({text:new C("",new b({dim:!0}),[new C("Press ",new b({color:Q.foreground})),new C("Esc",new b({color:Q.info})),new C(" to cancel",new b({color:Q.foreground}))])})})}));let U=new l0({decoration:new v4(Q.background,X),child:new R0({width:60,height:7,child:new u0({mainAxisAlignment:"start",children:D})})});if(this.widget.props.onAbort)return new k4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:U});return U}}class C8 extends c0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:V="█",showTrack:K=!0,thumbColor:z,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=V,this.showTrack=K,this.thumbColor=z,this.trackColor=D}createState(){return new Tw4}}class Tw4 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 V=this.widget.getScrollInfo(),K=Math.min(1,Q/Z),z=Math.max(1,X*K),D=Math.max(0,Math.min(1,V.scrollOffset/(Z-Q))),U=X-z,G=Math.max(0,U*D),F=G+z;return J>=G&&J<=F}_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(),V=this.context.findRenderObject()?.size.height??0;if(V===0||Z<=Q)return;if(this._dragStartY===null)this._dragStartY=J.localPosition.y,this._dragStartOffset=Y;let K=J.localPosition.y-this._dragStartY,z=Math.min(1,Q/Z),D=Math.max(1,V*z),U=V-D;if(U<=0)return;let G=Z-Q,F=U/G,q=K/F,W=Math.max(0,Math.min(G,this._dragStartOffset+q));this.widget.controller.jumpTo(W)};_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(),K=this.context.findRenderObject()?.size.height??0;if(K===0||Q<=Y)return;let z=Math.min(1,Y/Q),D=Math.max(1,K*z),U=Q-Y,G=K-D,F=Math.max(0,Math.min(1,X/(Q-Y))),q=Math.max(0,G*F),W=q+D;if(Z>=q&&Z<=W)return;if(Z<q)this.widget.controller.animateTo(Math.max(0,X-Y));else this.widget.controller.animateTo(Math.min(U,X+Y))};build(J){return new l1({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?w5.POINTER:w5.DEFAULT,child:new _w4({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 _w4 extends xC{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:V="█",showTrack:K=!0,thumbColor:z,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=V,this.showTrack=K,this.thumbColor=z,this.trackColor=D}createRenderObject(){return new Sw4(this)}updateRenderObject(J){J.updateWidget(this)}}class Sw4 extends L4{_widget;constructor(J){super();this._widget=J}updateWidget(J){this._widget=J,this.markNeedsLayout()}performLayout(){let J=this._lastConstraints;x4(!!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:V}=this._calculateScrollbarMetrics();if(!V)return;let K=this._widget.trackColor,z=this._widget.thumbColor,D=["▁","▂","▃","▄","▅","▆","▇","█"],U=Y,G=Y+X;for(let F=0;F<this.size.height;F++){let q="█",W=!0;if(F===Math.floor(U)){let H=1-(U-F),B=Math.floor(H*8);q=D[B]||"█",W=!1}else if(F===Math.floor(G)){let H=1-(G-F),B=Math.floor(H*8);q=D[B]||"█"}else if(F>U&&F<G)W=!1;J.setChar(Z,Q+F,q,{fg:z,bg:K,reverse:W},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))),V=Math.min(1,Z/J),K=Math.max(1,Y*V),z=Y-K;return{thumbStartFloat:Math.max(0,z*X),thumbSizeFloat:K,showScrollbar:!0}}}class yL extends c0{props;constructor(J){super();this.props=J}createState(){return new vw4}}class vw4 extends d0{scrollController=new Z5;scrollAreaKey=new y7("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 I2}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 G=n20(Q);return{title:G.title,type:G.type,description:G.description}})(),X=Y.type==="error"?Z.app.toolError:Z.app.command,V=u1.all(new v1(Z.colors.border,1,"solid")),K=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C(Y.title,new b({color:X,bold:!0}))})}),z=this.isWidgetMessage(Q)?Q.widget:new Z0({text:new C(Y.description,new b({color:Z.colors.foreground})),selectable:!0}),D=new T1({child:new M2({child:new l0({padding:C0.symmetric(1,0),child:new U1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new T1({child:new A6({controller:this.scrollController,autofocus:!0,child:z})}),new C8({controller:this.scrollController,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,F=this.scrollController.offset,q=this.getViewportHeight(),W=G+q;return{totalContentHeight:Math.max(W,0),viewportHeight:Math.max(q,1),scrollOffset:Math.max(F,0)}}})]})})})}),U=new l0({padding:C0.symmetric(1,0),child:new Z0({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new b({color:Z.colors.foreground,dim:!0})),new C("R",new b({color:Z.app.keybind})),new C(" to retry, ",new b({color:Z.colors.foreground,dim:!0})),new C("Esc",new b({color:Z.app.keybind})),new C(" to cancel",new b({color:Z.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new b({color:Z.colors.foreground,dim:!0}));if(G==="help"){let F=new b({color:Z.app.keybind}),q=new b({color:Z.colors.foreground,dim:!0});return new C("",q,[new C("Press ",q),new C("Escape",F),new C(" to close • Use ",q),new C("↑↓",F),new C(" or ",q),new C("j/k",F),new C(" to scroll",q)])}return new C("Press any key to close",new b({color:Z.colors.foreground,dim:!0,italic:!0}))})()})});return new k4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.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 l0({decoration:{border:V,color:Z.colors.background},padding:C0.all(1),child:new u0({mainAxisAlignment:"center",children:[K,new R0({height:1}),D,U]})})})}}r9();class kw4 extends c0{props;constructor(J){super();this.props=J}createState(){return new yw4}}class yw4 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=h8.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 Z0({text:new C("No plugins found.",new b({dim:!0}))});let Y=[],X=this.plugins.length,V=this.plugins.filter((D)=>D.status==="active").length,K=this.plugins.reduce((D,U)=>D+U.registeredCommands.length,0),z=this.plugins.reduce((D,U)=>D+U.registeredTools.length,0);if(Y.push(new C(`${V}/${X} ${m4(X,"plugin")} active`,new b({bold:!0}))),K>0||z>0)Y.push(new C(` (${K} ${m4(K,"command")}, ${z} ${m4(z,"tool")})`,new b({dim:!0})));Y.push(new C(`
7162
+ `))}if(H)F.push(new C(" ",G)),F.push(new C("Total: ",G)),F.push(new C(V(B),U))}return new l0({decoration:{color:z.background,border:u1.all(new v1(z.border,1,"rounded"))},child:new Z0({text:new C(void 0,void 0,F)})})}aw();m0();r9();import{execSync as Cd5}from"node:child_process";AI();LJ();U3();L7();ow();kX();P$();C$();TX();HE();f4();$x();Xk();B1();var JN4=q4(PU(),1);import{writeFile as rw4}from"fs/promises";import sw4 from"path";m0();P$();class Wg0{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.1773100957-g1437de"},parameters:{metadata:{count:Q}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Z=JSON.stringify(J);await qt(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 aH extends c0{props;constructor(J){super();this.props=J}createState(){return new Kw4}}class Kw4 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 zw4 extends d0{controller=new h7;focusNode=new a4({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,V=this.controller.text.trim().length>0,K=!X||V,z=u1.all(new v1(Q.foreground,1,"solid")),D=new e$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(W)=>{let H=W.trim();if(X&&H.length===0)return;this.widget.props.onSubmit(H)},autofocus:!0,style:{textColor:Q.foreground,border:null},maxLines:1}),U=new U1({children:[new l0({decoration:{color:Q.background},child:new Z0({text:new C(">",new b({color:Q.foreground}))})}),new T1({child:D})]}),G=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C("",void 0,[new C("Command: ",new b({color:Q.foreground})),new C(this.widget.props.commandName,new b({color:Y.command,bold:!0}))])})}),F=[];if(K)F.push(new C("Enter",new b({color:Y.keybind}))),F.push(new C(" to submit, ",new b({color:Q.foreground,dim:!0})));F.push(new C("Esc",new b({color:Y.keybind}))),F.push(new C(" to cancel",new b({color:Q.foreground,dim:!0})));let q=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C("",void 0,F)})});return new l0({decoration:{border:z,color:Q.background},padding:C0.all(1),child:new u0({children:[G,new R0({height:1}),U,new Q3,q]})})}}class Sp extends c0{props;constructor(J){super();this.props=J}createState(){return new zw4}}import{isDeepStrictEqual as Hg0}from"node:util";var Jd5=/[\\/_ +.#"@[({&]/,Zd5=/[\\/_ +.#"@[({&]/g,Qd5=/[\s-]/,Dw4=/[\s-]/g;function U$0(J,Z,Q,Y,X,V,K){if(V===Z.length){if(X===J.length)return 1;return 0.99}let z=`${X},${V}`;if(K[z]!==void 0)return K[z];let D=Y.charAt(V),U=Q.indexOf(D,X),G=0,F,q,W,H;while(U>=0){if(F=U$0(J,Z,Q,Y,U+1,V+1,K),F>G){if(U===X)F*=1;else if(Qd5.test(J.charAt(U-1))){if(F*=0.9,H=J.slice(X,U-1).match(Dw4),H&&X>0)F*=0.999**H.length}else if(Jd5.test(J.charAt(U-1))){if(F*=0.8,W=J.slice(X,U-1).match(Zd5),W&&X>0)F*=0.999**W.length}else if(F*=0.3,X>0)F*=0.999**(U-X);if(J.charAt(U)!==Z.charAt(V))F*=0.9999}if(F<0.1&&(Q.charAt(U-1)===Y.charAt(V+1)||Y.charAt(V+1)===Y.charAt(V)&&Q.charAt(U-1)!==Y.charAt(V))){if(q=U$0(J,Z,Q,Y,U+1,V+2,K),q*0.1>F)F=q*0.1}if(F>G)G=F;U=Q.indexOf(D,U+1)}return K[z]=G,G}function D$0(J){return J.toLowerCase().replace(Dw4," ")}function Uw4(J,Z){let Q=U$0(J,Z,D$0(J),D$0(Z),0,0,{}),Y=Z.trim().split(/\s+/);if(Y.length>1){let X=0,V=0;for(let z of Y){let D=U$0(J,z,D$0(J),D$0(z),0,0,{});if(D===0)return Q;X+=D,V+=z.length}let K=X/Y.length*0.95;return Math.max(Q,K)}return Q}class kT{}class yT{}class G$0{}class F$0{}class Gw4 extends c0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new Fw4}}class Fw4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}function Yd5(J,Z){if(J==="")return{matches:!0,score:1};let Q=Uw4(Z,J);return{matches:Q>0.15,score:Q}}class i9 extends c0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new qw4}}class qw4 extends d0{textController;focusNode;scrollController=new Z5;selectedIndex=0;itemContexts=[];hasUserInteracted=!1;cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){if(this.scrollController.disableFollowMode(),this.textController=new h7(this.widget.props.controller?.query??""),this.focusNode=new a4({debugLabel:this.widget.debugLabel}),this.textController.addListener(()=>{this.hasUserInteracted=!0,this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),q6.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)=>Hg0(Z,this.widget.props.controller?.selectedItem));if(J>=0)this.selectedIndex=J}this.clampSelectedIndex(),this.syncSelection(),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!Hg0(J.props.items,this.widget.props.items)){if(this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let Z=this.cachedFiltered.findIndex((Q)=>Hg0(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 kT){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof yT){if(this.getFilteredItems().length>0&&this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof G$0){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 F$0)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,...Yd5(Q,this.widget.props.getLabel(X))})).filter((X)=>X.matches).sort(this.widget.props.sortItems?(X,V)=>this.widget.props.sortItems(X,V,J):(X,V)=>V.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;PT(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(),q6.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=u1.all(new v1(Q.foreground,1,"solid")),V=this.widget.props.hidePromptWhenLoading&&this.widget.props.isLoading,K=this.widget.props.enabled??!0,z=new e$({controller:this.textController,focusNode:this.focusNode,autofocus:!0,enabled:K,style:{backgroundColor:Q.background,textColor:Q.foreground,cursorColor:Q.cursor,placeholderColor:Q.mutedForeground,border:null},maxLines:1}),D=new L2({shortcuts:new Map([[new $4("ArrowDown"),new kT],[new $4("ArrowUp"),new yT],[new $4("Tab"),new kT],[new $4("Tab",{shift:!0}),new yT],[new $4("n",{ctrl:!0}),new kT],[new $4("p",{ctrl:!0}),new yT],[new $4("Enter"),new G$0],[new $4("Escape"),new F$0]]),focusNode:this.focusNode,child:z}),U=new C9({actions:new Map([[kT,new r4(this.invoke)],[yT,new r4(this.invoke)],[G$0,new r4(this.invoke)],[F$0,new r4(this.invoke)]]),child:D}),G=new U1({children:[new l0({decoration:{color:Q.background},child:new Z0({text:new C(">",new b({color:Q.foreground}))})}),new T1({child:U})]});this.itemContexts=[];let F;if(this.widget.props.isLoading){let w=this.widget.props.loadingText??"Loading...";F=new R0({height:10,child:new i1({child:new Z0({text:new C(w,new b({color:Q.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)F=new T1({child:new i1({child:new Z0({text:new C(this.widget.props.emptyStateText,new b({color:Q.foreground,dim:!0}))})})});else{let w=Y.map((N,O)=>{let E=O===this.selectedIndex,L=this.widget.props.isItemDisabled?.(N)??!1,M;if(this.widget.props.renderItem)M=this.widget.props.renderItem(N,E,L,J);else{let A=E?Z.app.selectionBackground:void 0,I=E?Z.app.selectionForeground:Q.foreground;M=new l0({decoration:A?{color:A}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C(this.widget.props.getLabel(N),new b({color:I,dim:L}))})})}return new Gw4(new l1({onClick:(A)=>this.handleItemClick(O,A.clickCount),child:M}),(A)=>{this.itemContexts[O]=A})});F=new u0({children:w,crossAxisAlignment:"start"})}let q=new l1({onScroll:this.handleScroll,opaque:!1,child:new A6({controller:this.scrollController,autofocus:!1,child:F})}),W=[];if(this.widget.props.title){let w=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C(this.widget.props.title,new b({color:Z.app.command,bold:!0}))})});W.push(w)}if(!V)W.push(G,new R0({height:1}));if(this.textController.text!==""){let w=Y.length>0?Y[this.selectedIndex]:void 0,N=w&&this.widget.props.buildDisabledReasonWidget?.(w,J);W.push(new T1({child:new u0({mainAxisAlignment:"spaceBetween",children:[new T1({child:q}),new l0({padding:C0.only({top:1}),child:new i1({child:N??new R0({height:1})})})]})}))}else W.push(new T1({child:q}));if(this.widget.props.footer)W.push(this.widget.props.footer);return new l0({decoration:{border:X,color:Q.background},padding:C0.symmetric(1,0),child:new u0({children:W})})}}function Ww4(J){let Q=new Date().getTime()-J.getTime(),Y=Math.floor(Q/60000),X=Math.floor(Q/3600000),V=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(V<7)return`${V}d ago`;return J.toLocaleDateString()}class Bg0 extends d1{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Z=[...this.props.entries].sort((X,V)=>V.pubDate.getTime()-X.pubDate.getTime()),Q=Math.max(0,...Z.map((X)=>Ww4(X.pubDate).length));return new i9({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,V,K,z)=>{let D=f0.of(z),{colors:U}=D,G=D.app,F=V?G.selectionBackground:void 0,q=V?G.selectionForeground:U.foreground,W=U.mutedForeground,H=(B,w)=>new R0({width:w,child:U1.end([new Z0({text:new C(B,new b({color:W}))})])});return new l0({decoration:F?{color:F}:void 0,padding:C0.symmetric(2,0),child:new U1({children:[new T1({child:new Z0({text:new C(X.title,new b({color:q})),overflow:"ellipsis",maxLines:1})}),new R0({width:2}),H(Ww4(X.pubDate),Q)]})})}})}}f4();class wg0 extends c0{createState(){return new Hw4}}class Hw4 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 Z0({text:new C("●",new b({color:this.isGreen?Q.success:Q.mutedForeground,bold:!0})),maxLines:1})}}var Xd5=/\/threads\/(T-[^/?#\s<>]+)/i;function Vd5(J){let Z=J.trim(),Y=Z.match(Xd5)?.[1];if(Y&&k8(Y))return Y;let X=Z.replace(/^[<("'`]+|[>")'`,.]+$/g,"");if(k8(X))return X;return null}function Kd5(J){let Z=new Map,Q=new Map,Y=new Map,X=[];for(let K of J)Z.set(K.id,K);for(let K of J){let z=K.relationships.find((D)=>D.role==="child"&&Z.has(D.threadID)&&(D.type==="fork"||D.type==="handoff"));if(z){Y.set(K.id,z.type);let D=z.threadID,U=Q.get(D)||[];U.push(K),Q.set(D,U)}else X.push(K)}return f70.flatten(X,(K)=>Q.get(K.id)).map((K)=>({...K.item,depth:K.depth,isLast:K.isLast,ancestorsAreLast:K.ancestorsAreLast,relationshipType:Y.get(K.item.id)}))}function Ng0(J,Z,Q){return new Z0({text:new C(`${J}${Z}`,new b({color:Q})),maxLines:1})}function zd5(J,Z,Q,Y){return[Ng0("+",J,Y.success),Q3.horizontal(1),Ng0("~",Z,Y.warning),Q3.horizontal(1),Ng0("-",Q,Y.destructive)]}function Dd5(J){return typeof J==="object"&&J!==null&&"then"in J&&typeof J.then==="function"}class q$0 extends c0{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}createState(){return new Bw4}}class Bw4 extends d0{spinner=new I3;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}`,V=Z.filterByWorkspace&&Z.currentWorkspaceURI?Z.threads.filter((O)=>O.workspaceURI===Z.currentWorkspaceURI):Z.threads;if(Z.excludeCurrentThread&&Z.currentThreadID)V=V.filter((O)=>O.id!==Z.currentThreadID);let K=Z.recentThreadIDs||[],z=new Set(K),D=Z.currentThreadID,U=[...V].sort((O,E)=>{if(D){if(O.id===D)return-1;if(E.id===D)return 1}let L=K.indexOf(O.id),M=K.indexOf(E.id);if(L!==-1&&M!==-1)return L-M;if(L!==-1)return-1;if(M!==-1)return 1;return 0}),G=Kd5(U),F=Math.max(0,...G.map((O)=>O.description.timeAgo.length)),q=f0.of(J),W=new n0({padding:C0.symmetric(0,1),child:new i1({child:new Z0({text:new C("",new b({color:q.colors.foreground,dim:!0}),[new C("Ctrl+T",new b({color:q.colors.primary,dim:!0})),new C(Z.filterByWorkspace?" for all workspaces":" to filter by workspace",new b({color:q.colors.foreground,dim:!0}))])})})}),H="",B=null,w=(O)=>{if(O!==H)H=O,B=Vd5(O);return B};return new i9({items:G,getLabel:(O)=>`${O.title} ${O.id}`,filterItem:(O,E)=>{let L=w(E);if(L)return O.id.toLowerCase()===L.toLowerCase();return!0},normalizeQuery:(O)=>w(O)?"":O,onAccept:async(O,E)=>{if(!Z.onSelect||this.isSwitchingThread)return;let L=Z.onSelect(O.id,E);if(!Dd5(L))return;this.setSwitchingThread(!0);try{await L}finally{if(this.mounted)this.setSwitchingThread(!1)}},onDismiss:Z.onDismiss,onSelectionChange:(O)=>{if(Z.previewController){if(O)Z.previewController.select(O.id)}},title:Z.title,enabled:!Q,isLoading:Q,hidePromptWhenLoading:!0,loadingText:X,emptyStateText:"No threads match your filter",maxRenderItems:200,footer:Q?void 0:W,renderItem:(O,E,L,M)=>{let A=f0.of(M),{app:I,colors:j}=A,_=E?I.selectionBackground:void 0,S=E?I.selectionForeground:j.foreground,y=j.mutedForeground,m=(e,G0)=>new R0({width:G0,child:U1.end([new Z0({text:new C(e,new b({color:y}))})])}),f=Z.threadViewStates[O.id],v=[],x=O.relationshipType==="handoff",c=new $p({connectorColor:j.mutedForeground});if(O.depth>0){let e=[],G0=O.ancestorsAreLast.slice(1);for(let F0 of G0)e.push(new C(c.getAncestorPrefix(F0),new b({color:c.connectorColor,dim:c.connectorDim})));let n=O.isLast?c.elbow:c.tee,K0=c.getConnectorText(n);e.push(new C(K0,new b({color:c.connectorColor,dim:c.connectorDim}))),v.push(new Z0({text:new C("",void 0,e)}))}let l=[],h=D===O.id?new C("(current) ",new b({color:j.success})):z.has(O.id)?new C("(visited) ",new b({color:j.foreground,dim:!0})):null;if(h)l.push(new Z0({text:h}));if(bO(f))l.push(new wg0),l.push(new R0({width:1}));let a=O.title;if(O.relationshipType==="fork"){let e=a.match(/^Forked\((\d+)\): /);if(e)a=a.slice(e[0].length);else while(a.startsWith("Forked: "))a=a.slice(8);l.push(new Z0({text:new C("[fork] ",new b({color:j.primary}))}))}else if(x)l.push(new Z0({text:new C("[handoff] ",new b({color:j.accent}))}));if(l.push(new T1({child:new Z0({text:new C(a,new b({color:S})),overflow:"ellipsis",maxLines:1})})),l.push(new R0({width:2})),O.diffStats&&(O.diffStats.added>0||O.diffStats.changed>0||O.diffStats.deleted>0)){let e=E?{success:y,warning:y,destructive:y}:j;l.push(...zd5(O.diffStats.added,O.diffStats.changed,O.diffStats.deleted,e)),l.push(new R0({width:2}))}return l.push(m(O.description.timeAgo,F)),new l0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new U1({children:[...v,...l]})})}})}}function ww4(J){return 1-(1-J)**3}function Nw4(J,Z,Q){return J+(Z-J)*Q}function vp(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),V=ww4(Y),K=ww4(X);return{x:Nw4(J.startOffset.x,J.targetOffset.x,V),y:Nw4(J.startOffset.y,J.targetOffset.y,K)}}var Ud5={nodeWidth:3,horizontalSpacing:3};class uT{options;constructor(J={}){this.options={...Ud5,...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 V=0,K=(z,D)=>{let U=Z.get(z.id)??[];if(this.options.comparator)U.sort(this.options.comparator);let G={...z,parentID:Q.get(z.id)};if(U.length===0){Y.push({node:G,position:{x:V,y:D}});let B=V;return V+=this.options.nodeWidth+this.options.horizontalSpacing,B}let F=[];for(let B of U)F.push(K(B,D+1));let q=Math.min(...F),W=Math.max(...F),H=Math.floor((q+W)/2);return Y.push({node:G,position:{x:H,y:D}}),H};for(let z of X)K(z,0);return Y}buildTree(J){let Z=new Set(J.map((V)=>V.id)),Q=[...J].sort((V,K)=>V.id.localeCompare(K.id)),Y=new Map;for(let V of Q){if(!V.parentID||!Z.has(V.parentID)){Y.set(V.id,void 0);continue}let K=!1,z=V.parentID;while(z){if(z===V.id){K=!0;break}z=Y.get(z)}Y.set(V.id,K?void 0:V.parentID)}let X=new Map;for(let V of J){let K=Y.get(V.id);if(!X.has(K))X.set(K,[]);X.get(K).push(V)}return{childrenMap:X,resolvedParent:Y}}}var Gd5={nodeWidth:3,nodeHeight:2};class xT{options;constructor(J={}){this.options={...Gd5,...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 V=this.calculateConnectorLine(X.position,Y.position);Z.push({points:V,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,V=Z.x+Q,K=J.y*(this.options.nodeHeight+3)+this.options.nodeHeight;Y.push({x:X,y:K});let z=K+1;if(Y.push({x:X,y:z}),X!==V)Y.push({x:V,y:z});let D=Z.y*(this.options.nodeHeight+3)-1;return Y.push({x:V,y:D}),Y}}var Fd5={nodeWidth:3,nodeHeight:2},qd5={x:0,y:0};class H$0{options;constructor(J={}){this.options={...Fd5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=qd5,X,V,K,z){let D=z?f0.of(z):null,U=D?.colors,G=D?.app,F=U?.mutedForeground??U?.foreground;if(J.length===0)return new Z0({text:new C("No nodes",new b({color:F}))});let q=Math.max(...J.map((I)=>I.position.y)),H=Math.max(...J.map((I)=>I.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+3,w=[];for(let I=q;I>=0;I--){let j=J.filter((y)=>y.position.y===I);j.sort((y,m)=>y.position.x-m.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new R0({width:y.position.x-S}));let m=y.node.id===Q,f=K?.(y.node.data)??!1,v=V?.activeFlashOn??!1,x=y.node.id===V?.copyFlashNodeId;_.push(this.renderNode(m,f,v,x,G,U)),S=y.position.x+this.options.nodeWidth}if(w.push(new U1({crossAxisAlignment:"start",children:_})),I>0){let y=J.filter((v)=>v.position.y===I-1),m=j,f=this.renderConnectors(y,m,Z,H,U,G);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(q+1)*B,M=[new R0({width:H,height:L}),new v6({left:O,top:E,child:N})],A=Q?J.find((I)=>I.node.id===Q):void 0;if(A&&X){let I=X(A.node.data),j=q-A.position.y,_=O+A.position.x+this.options.nodeWidth+1,S=E+j*B+1,y=30;if(V?.maxTitleWidthPercent&&V.viewportWidth)y=Math.floor(V.viewportWidth*V.maxTitleWidthPercent/100);M.push(new v6({left:_,top:S,child:this.renderInfoBox(I,y,U,G)}))}return new l0({padding:C0.horizontal(2),child:new NH(new p6({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X,V){let K="┌─┐",z="└─┘",D=J?X?.threadGraphNodeSelected??V?.primary??V?.foreground:X?.threadGraphNode??V?.primary??V?.foreground,U=!1;if(Y)D=X?.threadGraphNodeSelected??V?.primary??D,K="┏━┓",z="┗━┛",U=!0;else if(Z&&Q)D=X?.toolSuccess??V?.primary??D,K="┏━┓",z="┗━┛";return new u0({crossAxisAlignment:"start",children:[new Z0({text:new C(K,new b({color:D,bold:U}))}),new Z0({text:new C(z,new b({color:D,bold:U}))})]})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let V of Q){if(V.length>Z)V=V.slice(0,Z-1)+"…";if(X.length===0)X=V;else if(X.length+1+V.length<=Z)X+=" "+V;else Y.push(X),X=V}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q,Y){let X=this.wrapText(J,Z),V=Math.min(Z,Math.max(1,...X.map((q)=>q.length))),K=V+2,z="┌"+"─".repeat(K)+"┐",D="└"+"─".repeat(K)+"┘",U=Q?.border??Y?.threadGraphConnector??Q?.foreground,G=Q?.foreground,F=[new Z0({text:new C(z,new b({color:U}))})];for(let q of X){let W=" ".repeat(V-q.length);F.push(new Z0({text:new C("│ ",new b({color:U}),[new C(q+W,new b({color:G??U})),new C(" │",new b({color:U}))])}))}return F.push(new Z0({text:new C(D,new b({color:U}))})),new u0({crossAxisAlignment:"start",children:F})}renderConnectors(J,Z,Q,Y,X,V){let K=[],z=Math.floor(this.options.nodeWidth/2),D=V?.threadGraphConnector??X?.primary??X?.foreground,U=Array(Y).fill(" ");for(let q of Z){let W=q.position.x+z;if(W>=0&&W<Y)U[W]="▲"}K.push(new Z0({text:new C(U.join(""),new b({color:D}))}));let G=Array(Y).fill(" ");for(let q of J){let W=Z.filter((O)=>O.node.parentID===q.node.id);if(W.length===0)continue;let H=q.position.x+z,B=W.map((O)=>O.position.x+z),w=Math.min(...B),N=Math.max(...B);for(let O=w;O<=N;O++)if(O>=0&&O<Y){if(O===H)if(W.length===1&&B[0]===H)G[O]="│";else if(O===w)G[O]="└";else if(O===N)G[O]="┘";else G[O]="┬";else if(B.includes(O))if(O===w)G[O]="└";else if(O===N)G[O]="┘";else G[O]="┴";else if(G[O]===" ")G[O]="─"}}K.push(new Z0({text:new C(G.join(""),new b({color:D}))}));let F=Array(Y).fill(" ");for(let q of J){if(Z.filter((B)=>B.node.parentID===q.node.id).length===0)continue;let H=q.position.x+z;if(H>=0&&H<Y)F[H]="│"}return K.push(new Z0({text:new C(F.join(""),new b({color:D}))})),K}}var Wd5={nodeWidth:1,nodeHeight:1,nodeIcon:"□",selectedIcon:"□"},Hd5={x:0,y:0};class Og0{options;constructor(J={}){this.options={...Wd5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Hd5,X,V,K,z){let D=z?f0.of(z):null,U=D?.colors,G=D?.app,F=U?.mutedForeground??U?.foreground;if(J.length===0)return new Z0({text:new C("No nodes",new b({color:F}))});let q=Math.max(...J.map((I)=>I.position.y)),H=Math.max(...J.map((I)=>I.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+1,w=[];for(let I=q;I>=0;I--){let j=J.filter((y)=>y.position.y===I);j.sort((y,m)=>y.position.x-m.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new R0({width:y.position.x-S}));let m=y.node.id===Q,f=K?.(y.node.data)??!1,v=V?.activeFlashOn??!1;_.push(this.renderNode(m,f,v,G,U)),S=y.position.x+this.options.nodeWidth}if(w.push(new U1({crossAxisAlignment:"start",children:_})),I>0){let y=J.filter((v)=>v.position.y===I-1),m=j,f=this.renderConnectors(y,m,Z,H,U,G);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(q+1)*B,M=[new R0({width:H,height:L}),new v6({left:O,top:E,child:N})],A=Q?J.find((I)=>I.node.id===Q):void 0;if(A&&X){let I=X(A.node.data),j=q-A.position.y,_=O+A.position.x+this.options.nodeWidth+1,S=E+j*B,y=30;if(V?.maxTitleWidthPercent&&V.viewportWidth)y=Math.floor(V.viewportWidth*V.maxTitleWidthPercent/100);M.push(new v6({left:_,top:S,child:this.renderInfoBox(I,y,U)}))}return new l0({padding:C0.horizontal(2),child:new NH(new p6({fit:"expand",children:M}))})}renderNode(J,Z,Q,Y,X){let V=J?this.options.selectedIcon:this.options.nodeIcon,K=J?Y?.threadGraphNodeSelected??X?.primary??X?.foreground:Y?.threadGraphNode??X?.primary??X?.foreground;if(Z&&Q)K=Y?.toolSuccess??X?.primary??K,V="■";return new Z0({text:new C(V,new b({color:K}))})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let V of Q){if(V.length>Z)V=V.slice(0,Z-1)+"…";if(X.length===0)X=V;else if(X.length+1+V.length<=Z)X+=" "+V;else Y.push(X),X=V}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q){let Y=this.wrapText(J,Z),X=Q?.foreground,V=[];for(let K of Y)V.push(new Z0({text:new C(K,new b({color:X??Q?.primary??Q?.foreground}))}));return new u0({crossAxisAlignment:"start",children:V})}renderConnectors(J,Z,Q,Y,X,V){let K=[],z=Math.floor(this.options.nodeWidth/2),D=V?.threadGraphConnector??X?.primary??X?.foreground,U=Array(Y).fill(" ");for(let G of J){let F=Z.filter((w)=>w.node.parentID===G.node.id);if(F.length===0)continue;let q=G.position.x+z,W=F.map((w)=>w.position.x+z),H=Math.min(...W),B=Math.max(...W);for(let w=H;w<=B;w++)if(w>=0&&w<Y){let N=w===q,O=W.includes(w);if(N&&O)if(F.length===1)U[w]="│";else if(w===H)U[w]="└";else if(w===B)U[w]="┘";else U[w]="┼";else if(N)if(w===H)U[w]="└";else if(w===B)U[w]="┘";else U[w]="┬";else if(O)if(w===H)U[w]="└";else if(w===B)U[w]="┘";else U[w]="┴";else if(U[w]===" ")U[w]="─"}}return K.push(new Z0({text:new C(U.join(""),new b({color:D}))})),K}}class kp extends q3{onWidth;onHeight;constructor(J){super(J.child);this.onWidth=J.onWidth,this.onHeight=J.onHeight}createRenderObject(){return new Ow4(this.onWidth,this.onHeight)}updateRenderObject(J){J.onWidth=this.onWidth,J.onHeight=this.onHeight}}class Ow4 extends L4{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 kL extends c0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new Mw4}}var Ew4=400,Lw4=300,Bd5=16;class Mw4 extends d0{selectedNodeId=null;positionedNodes=[];dateComparator=(J,Z)=>{let Q=J.data.updatedAt??"",Y=Z.data.updatedAt??"";return Q.localeCompare(Y)};layoutEngine=new uT({nodeWidth:1,horizontalSpacing:1,comparator:this.dateComparator});lineCalculator=new xT;renderer=new Og0;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((D)=>D.id)),Q=new Set(this.widget.props.threads.map((D)=>D.id));if(Z.size!==Q.size||[...Z].some((D)=>!Q.has(D)))this.stopAnimation(),this.currentOffset={x:0,y:0};let X=J.props.initialSelectedThreadID,V=this.widget.props.initialSelectedThreadID;if(X!==V&&V){let U=this.widget.props.threads.find((G)=>G.id===V);if(U)this.selectedNodeId=U.id,this.stopAnimation(),this.currentOffset={x:0,y:0}}let K=J.props.threads.some((D)=>D.isActive),z=this.widget.props.threads.some((D)=>D.isActive);if(K!==z){if(this.stopActiveFlashTimer(),z)this.startActiveFlashTimer()}}dispose(){this.stopAnimation(),this.stopActiveFlashTimer()}startAnimation(J){this.stopAnimation(),this.animation={startOffset:{...this.currentOffset},targetOffset:J,startTime:Date.now(),durationX:Ew4,durationY:Lw4};let Z=Math.max(Ew4,Lw4);this.animationTimer=setInterval(()=>{let Q=Date.now();if(this.currentOffset=vp(this.animation,Q),this.animation&&Q-this.animation.startTime>=Z)this.currentOffset={...this.animation.targetOffset},this.stopAnimation();this.setState()},Bd5)}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),V=Math.floor(this.viewportWidth/2)-J-Y,K=Q-Z,z=2,D=Math.floor(this.viewportHeight/2),G=Math.floor(D/2)-K;return{x:V,y:G}}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((V)=>V.node.parentID===Q.node.id);if(X.length>0){X.sort((K,z)=>K.position.x-z.position.x);let V=Math.floor(X.length/2);Y=X[V]}break}case"ArrowDown":{Y=Z.find((X)=>X.node.id===Q.node.parentID);break}case"ArrowLeft":{let X=Z.filter((V)=>V.position.y===Q.position.y&&V.position.x<Q.position.x);if(X.length>0)X.sort((V,K)=>K.position.x-V.position.x),Y=X[0];break}case"ArrowRight":{let X=Z.filter((V)=>V.position.y===Q.position.y&&V.position.x>Q.position.x);if(X.length>0)X.sort((V,K)=>V.position.x-K.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 G=(this.selectedNodeId?this.positionedNodes.find((F)=>F.node.id===this.selectedNodeId):null)??this.positionedNodes.find((F)=>!F.node.parentID);if(G){let F=Math.max(...this.positionedNodes.map((q)=>q.position.y));this.currentOffset=this.calculateCenterOffset(G.position.x,G.position.y,F)}}let X=this.widget.props.showTitle??!0,V=this.widget.props.offsetY??0,K={x:this.currentOffset.x,y:this.currentOffset.y+V},z=this.renderer.render(this.positionedNodes,Q,this.selectedNodeId??void 0,K,X?(U)=>U.title:void 0,{maxTitleWidthPercent:this.widget.props.maxTitleWidthPercent,viewportWidth:this.viewportWidth,activeFlashOn:this.activeFlashOn},(U)=>U.isActive??!1,J),D=new kp({onWidth:(U)=>{if(this.viewportWidth!==U)this.viewportWidth=U,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},onHeight:(U)=>{if(this.viewportHeight!==U)this.viewportHeight=U,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},child:z});return new k4({autofocus:this.widget.props.autofocus??!0,onKey:this.handleKeyEvent,debugLabel:"MiniThreadGraph",child:D})}getSelectedNode(){let J=this.positionedNodes.find((Z)=>Z.node.id===this.selectedNodeId);return J?this.toThreadNode(J):null}}class Iw4 extends c0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new jw4}}class jw4 extends d0{build(J){return this.widget.onContext(J),this.widget.child}}var Aw4=30,wd5=30;class fT{}class bT{}class B$0{}class w$0{}class Eg0 extends c0{props;constructor(J){super();this.props=J}createState(){return new Rw4}}class Rw4 extends d0{highlightedIndex=0;controller=new h7;focusNode;scrollController=new Z5;filteredClusters=[];itemContexts=[];initState(){this.focusNode=new a4({debugLabel:"ClusterPicker"}),this.scrollController.disableFollowMode(),this.recomputeFiltered(),this.controller.addListener(()=>{this.highlightedIndex=0,this.recomputeFiltered(),this.setState(),q6.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;PT(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 fT){if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof bT){if(this.highlightedIndex>0)this.highlightedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof B$0){let Z=this.filteredClusters[this.highlightedIndex];if(Z)this.widget.props.onAccept(Z);return"handled"}if(J instanceof w$0)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(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.highlightedIndex!==Z};build(J){let{currentThreadID:Z}=this.widget.props,Q=f0.of(J),{colors:Y,app:X}=Q,z=o1.of(J).size.width>=wd5+Aw4,D=u1.all(new v1(Y.foreground,1,"solid")),U=this.filteredClusters[this.highlightedIndex]??null,G=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C("Select a cluster",new b({color:X.command,bold:!0}))})}),F=new e$({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),q=new L2({shortcuts:new Map([[new $4("ArrowDown"),new fT],[new $4("ArrowUp"),new bT],[new $4("Tab"),new fT],[new $4("Tab",{shift:!0}),new bT],[new $4("n",{ctrl:!0}),new fT],[new $4("p",{ctrl:!0}),new bT],[new $4("Enter"),new B$0],[new $4("Escape"),new w$0]]),focusNode:this.focusNode,child:F}),W=new C9({actions:new Map([[fT,new r4(this.invoke)],[bT,new r4(this.invoke)],[B$0,new r4(this.invoke)],[w$0,new r4(this.invoke)]]),child:q}),H=new U1({children:[new l0({decoration:{color:Y.background},child:new Z0({text:new C(">",new b({color:Y.foreground}))})}),new T1({child:W})]});this.itemContexts=[];let B=this.filteredClusters.map((M,A)=>{let I=A===this.highlightedIndex,j=Z?M.threads.some((m)=>m.id===Z):!1,_=I?X.selectionBackground:void 0,S=I?X.selectionForeground:Y.foreground,y=[new C(M.label,new b({color:S})),new C(` (${M.threads.length})`,new b({color:S,dim:!0}))];if(j)y.push(new C(" (current)",new b({color:I?X.selectionForeground:Y.success})));return new Iw4(new l1({onClick:(m)=>this.handleItemClick(A,m.clickCount),child:new l0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C("",void 0,y)})})}),(m)=>{this.itemContexts[A]=m})}),w=new u0({children:B,crossAxisAlignment:"start"}),N=new T1({child:new l1({onScroll:this.handleScroll,child:new A6({controller:this.scrollController,autofocus:!1,child:w})})}),O=U?U.threads.map((M)=>({id:M.id,title:M.title,parentID:M.parentID,updatedAt:M.updatedAt})):[],E=U?new l0({padding:C0.all(1),child:new kL({threads:O,autofocus:!1,offsetY:2})}):null,L;if(z){let M=E?new T1({child:E}):new R0({width:Aw4});L=new U1({crossAxisAlignment:"stretch",mainAxisAlignment:"start",children:[N,M]})}else{let M=[new T1({child:new l1({onScroll:this.handleScroll,child:new A6({controller:this.scrollController,autofocus:!1,child:w})})})];if(E)M.push(new T1({child:E}));L=new u0({crossAxisAlignment:"stretch",children:M})}return new l0({decoration:{border:D,color:Y.background},padding:C0.symmetric(1,0),child:new u0({children:[G,H,new R0({height:1}),new T1({child:L})]})})}}class $J{static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!$J._instance)$J._instance=new $J;return $J._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()}}m0();class Pw4 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((V)=>V.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(),V=X.length>0?this.getValidationError(X):null,K=this.getAvailableLabels(),D=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...K];return new i9({title:"Add Label",items:D,getLabel:(U)=>{if("__isCreateMarker"in U)return this.currentQuery.trim().toLowerCase();return U.name},onAccept:(U)=>{if("__isCreateMarker"in U)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(U.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:V||"Type to create a new label",renderItem:(U,G,F,q)=>{let W=G?Q.selectionBackground:void 0,H=G?Q.selectionForeground:Y.foreground;if("__isCreateMarker"in U&&U.__isCreateMarker){let w=this.currentQuery.trim().toLowerCase();return new l0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C("",void 0,[new C("Create new label: ",new b({color:H})),new C(w,new b({color:H,bold:!0}))])})})}return new l0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Z0({text:new C(U.name,new b({color:H}))})})},filterItem:(U,G)=>{if(this.currentQuery!==G)this.currentQuery=G,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in U&&U.__isCreateMarker)return this.shouldShowCreateMarker(G);let q=G.trim().toLowerCase();return q.length===0||U.name.includes(q)},sortItems:(U,G,F)=>{let q="__isCreateMarker"in U.item&&U.item.__isCreateMarker,W="__isCreateMarker"in G.item&&G.item.__isCreateMarker;if(q&&!W)return-1;if(!q&&W)return 1;return G.score-U.score}})}}class Lg0 extends c0{props;constructor(J){super();this.props=J}createState(){return new Pw4}}class oH extends c0{props;constructor(J){super();this.props=J}createState(){return new Cw4}}class Cw4 extends d0{_spinner=new I3;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=u1.all(new v1(Q.foreground,1,"solid")),V=this._spinner.toBraille(),K=new Z0({textAlign:"center",text:new C("",void 0,[new C(V,new b({color:Y.processing})),new C(" ",void 0),new C(this.widget.props.message,new b({color:Q.foreground}))])}),D=[new T1({child:new u0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[K]})})];if(this.widget.props.onAbort)D.push(new R0({height:2,child:new l0({padding:C0.symmetric(2,0),child:new Z0({text:new C("",new b({dim:!0}),[new C("Press ",new b({color:Q.foreground})),new C("Esc",new b({color:Q.info})),new C(" to cancel",new b({color:Q.foreground}))])})})}));let U=new l0({decoration:new v4(Q.background,X),child:new R0({width:60,height:7,child:new u0({mainAxisAlignment:"start",children:D})})});if(this.widget.props.onAbort)return new k4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(G)=>{if(G.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:U});return U}}class C8 extends c0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:V="█",showTrack:K=!0,thumbColor:z,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=V,this.showTrack=K,this.thumbColor=z,this.trackColor=D}createState(){return new Tw4}}class Tw4 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 V=this.widget.getScrollInfo(),K=Math.min(1,Q/Z),z=Math.max(1,X*K),D=Math.max(0,Math.min(1,V.scrollOffset/(Z-Q))),U=X-z,G=Math.max(0,U*D),F=G+z;return J>=G&&J<=F}_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(),V=this.context.findRenderObject()?.size.height??0;if(V===0||Z<=Q)return;if(this._dragStartY===null)this._dragStartY=J.localPosition.y,this._dragStartOffset=Y;let K=J.localPosition.y-this._dragStartY,z=Math.min(1,Q/Z),D=Math.max(1,V*z),U=V-D;if(U<=0)return;let G=Z-Q,F=U/G,q=K/F,W=Math.max(0,Math.min(G,this._dragStartOffset+q));this.widget.controller.jumpTo(W)};_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(),K=this.context.findRenderObject()?.size.height??0;if(K===0||Q<=Y)return;let z=Math.min(1,Y/Q),D=Math.max(1,K*z),U=Q-Y,G=K-D,F=Math.max(0,Math.min(1,X/(Q-Y))),q=Math.max(0,G*F),W=q+D;if(Z>=q&&Z<=W)return;if(Z<q)this.widget.controller.animateTo(Math.max(0,X-Y));else this.widget.controller.animateTo(Math.min(U,X+Y))};build(J){return new l1({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?w5.POINTER:w5.DEFAULT,child:new _w4({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 _w4 extends xC{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:V="█",showTrack:K=!0,thumbColor:z,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=V,this.showTrack=K,this.thumbColor=z,this.trackColor=D}createRenderObject(){return new Sw4(this)}updateRenderObject(J){J.updateWidget(this)}}class Sw4 extends L4{_widget;constructor(J){super();this._widget=J}updateWidget(J){this._widget=J,this.markNeedsLayout()}performLayout(){let J=this._lastConstraints;x4(!!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:V}=this._calculateScrollbarMetrics();if(!V)return;let K=this._widget.trackColor,z=this._widget.thumbColor,D=["▁","▂","▃","▄","▅","▆","▇","█"],U=Y,G=Y+X;for(let F=0;F<this.size.height;F++){let q="█",W=!0;if(F===Math.floor(U)){let H=1-(U-F),B=Math.floor(H*8);q=D[B]||"█",W=!1}else if(F===Math.floor(G)){let H=1-(G-F),B=Math.floor(H*8);q=D[B]||"█"}else if(F>U&&F<G)W=!1;J.setChar(Z,Q+F,q,{fg:z,bg:K,reverse:W},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))),V=Math.min(1,Z/J),K=Math.max(1,Y*V),z=Y-K;return{thumbStartFloat:Math.max(0,z*X),thumbSizeFloat:K,showScrollbar:!0}}}class yL extends c0{props;constructor(J){super();this.props=J}createState(){return new vw4}}class vw4 extends d0{scrollController=new Z5;scrollAreaKey=new y7("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 I2}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 G=n20(Q);return{title:G.title,type:G.type,description:G.description}})(),X=Y.type==="error"?Z.app.toolError:Z.app.command,V=u1.all(new v1(Z.colors.border,1,"solid")),K=new l0({padding:C0.symmetric(1,0),child:new Z0({text:new C(Y.title,new b({color:X,bold:!0}))})}),z=this.isWidgetMessage(Q)?Q.widget:new Z0({text:new C(Y.description,new b({color:Z.colors.foreground})),selectable:!0}),D=new T1({child:new M2({child:new l0({padding:C0.symmetric(1,0),child:new U1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new T1({child:new A6({controller:this.scrollController,autofocus:!0,child:z})}),new C8({controller:this.scrollController,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let G=this.scrollController.maxScrollExtent,F=this.scrollController.offset,q=this.getViewportHeight(),W=G+q;return{totalContentHeight:Math.max(W,0),viewportHeight:Math.max(q,1),scrollOffset:Math.max(F,0)}}})]})})})}),U=new l0({padding:C0.symmetric(1,0),child:new Z0({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new b({color:Z.colors.foreground,dim:!0})),new C("R",new b({color:Z.app.keybind})),new C(" to retry, ",new b({color:Z.colors.foreground,dim:!0})),new C("Esc",new b({color:Z.app.keybind})),new C(" to cancel",new b({color:Z.colors.foreground,dim:!0}))]);let G=this.resolveFooterStyle(this.widget.props.message);if(G==="none")return new C("",new b({color:Z.colors.foreground,dim:!0}));if(G==="help"){let F=new b({color:Z.app.keybind}),q=new b({color:Z.colors.foreground,dim:!0});return new C("",q,[new C("Press ",q),new C("Escape",F),new C(" to close • Use ",q),new C("↑↓",F),new C(" or ",q),new C("j/k",F),new C(" to scroll",q)])}return new C("Press any key to close",new b({color:Z.colors.foreground,dim:!0,italic:!0}))})()})});return new k4({onKey:(G)=>{if(this.widget.props.onRetry&&G.key==="r")return this.widget.props.onRetry(),"handled";if(G.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 l0({decoration:{border:V,color:Z.colors.background},padding:C0.all(1),child:new u0({mainAxisAlignment:"center",children:[K,new R0({height:1}),D,U]})})})}}r9();class kw4 extends c0{props;constructor(J){super();this.props=J}createState(){return new yw4}}class yw4 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=h8.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 Z0({text:new C("No plugins found.",new b({dim:!0}))});let Y=[],X=this.plugins.length,V=this.plugins.filter((D)=>D.status==="active").length,K=this.plugins.reduce((D,U)=>D+U.registeredCommands.length,0),z=this.plugins.reduce((D,U)=>D+U.registeredTools.length,0);if(Y.push(new C(`${V}/${X} ${m4(X,"plugin")} active`,new b({bold:!0}))),K>0||z>0)Y.push(new C(` (${K} ${m4(K,"command")}, ${z} ${m4(z,"tool")})`,new b({dim:!0})));Y.push(new C(`
7163
7163
 
7164
7164
  `));for(let D of this.plugins){let{icon:U,color:G}=this.statusIcon(D.status),F=this.getRelativePath(D.uri.toString());if(Y.push(new C(`${U} `,new b({color:G}))),Y.push(new C(F,new b({bold:!0}))),Y.push(new C(` ${D.status}`,new b({dim:!0}))),Y.push(new C(`
7165
7165
  `)),D.status==="active"&&D.registeredEvents.length>0)Y.push(new C(" Events: ",new b({dim:!0}))),Y.push(new C(D.registeredEvents.join(", "),new b({color:Q.link}))),Y.push(new C(`
@@ -7376,7 +7376,7 @@ ${t.content||""}`:t.content||"",z1=[],E1=t.baseDir.startsWith("file://")?$J0(t.b
7376
7376
  `)}function qL4(J,Z){J.command("usage").description("Show your current Amp usage and credit balance").action(async(Q,Y)=>{let X=Y.optsWithGlobals(),V=await Z(X),K=await V.settings.get("proxy"),z=_I1({settings:{url:V.ampURL,proxy:K},secrets:{getToken:(U,G)=>V.secrets.get(U,G)}}),D=await L6.userDisplayBalanceInfo({},{config:z});if(!D.ok){if(D.error.code==="auth-required")process.stderr.write(J1.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(J1.red("Error: ")+D.error.message+`
7377
7377
  `),process.exit(1)}process.stdout.write(await nn5(D.result.displayText)+`
7378
7378
  `),process.exit(0)})}var qt5=HB.join(RZ,"logs","headless.log"),cc0=HB.join(RC,"device-id.json");function Wt5(){return KU.some((J)=>J.listConfigs().length>0)}try{if(process.platform==="win32")await Promise.resolve().then(() => q4(G_(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){H7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
7379
- `)}function Ht5(J){process.emitWarning=(Z,Q,Y,X)=>{let V=typeof Z==="string"?Z:Z.message||String(Z),K=Q||"Warning",z=!1;J.warn(V,{name:K,code:Y})}}function W7(J,Z){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")A$("dangerouslyAllowAll",Z.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")A$("experimental.agentMode",Z.mode)}function dI4(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 Bt5(J){try{return await gI4(J,"utf-8")}catch{return J}}async function lc0(J,Z,Q){let Y=dI4(J,Z);if(!Y)return;let X=$5(Q)?Q.features:[],V=$5(Q)?Q.user.email:void 0;if(!X.some((z)=>z.name===yX.HARNESS_SYSTEM_PROMPT&&z.enabled)&&!cI4(V))throw new K4("You are not allowed to do this.",1);A$("systemPrompt",await Bt5(Y))}function cI4(J){return!!(J&&Uo(J))}function ic0(J,Z){if(typeof J==="boolean")return J;if(!$5(Z))return!1;return EJ(Z.user.email)}function nc0(J){if(!$5(J))return null;return{...J.user,features:J.features??[],team:J.workspace??void 0}}function wt5(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 ac0(J){let Y=wt5(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 K4(`Couldn't connect to the Amp server at ${J}.`,1,Y)}var uI4=[{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??fY,description:`Custom settings file path (overrides the default location ${fY})`},{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 ${yE})`},{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:l9(),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:yK.SMART.key,description:`Set the agent mode (${IX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:IX().map((J)=>J.mode).concat("large","deep","internal")},{name:"dtw",long:"dtw",type:"flag",description:"Use the DTW-backed thread provider in the TUI (experimental)",hidden:!0,aliases:["deliver-me-to-agg"]},{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:"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}],xI4=(J)=>("deprecated"in J)&&J.deprecated===!0,Nt5=(J)=>("hidden"in J)&&J.hidden===!0,Ot5=(J)=>("default"in J),Et5=(J)=>("default"in J)?J.default:void 0,lI4=[{name:"toggle-skills-count",entryPoint:qx0}];function Lt5(J,Z){let Q=Z.args[0],Y=Z.commands.map((V)=>V.name());if(Q&&!Q.includes(" ")&&Q.length<30&&!/[./\\]/.test(Q)){let V=Y.filter((z)=>Q.includes(z)||z.includes(Q)),K="Run amp --help for a list of available commands.";if(V.length>0)K=`Did you mean: ${V.join(", ")}? Or run amp --help for all commands.`;throw new K4(D8.unknownCommand(Q),1,K)}}async function rc0(J){return{...J,getThreadEnvironment:d$,threadSyncService:J.threadSyncService,osFileSystem:J.fileSystem,skillService:J.skillService,fileChangeTrackerStorage:new tX(J.fileSystem),generateThreadTitle:u00,deleteThread:(Z)=>J.threadService.delete(Z),getServerStatus:()=>bJ(J.configService),pluginService:J.pluginService}}function iI4(J){return{toolService:J.toolService,configService:J.configService,skillService:J.skillService,getThreadEnvironment:d$,filesystem:J.fileSystem,threadService:J.threadService}}var cJ0=X1.file(pI4.homedir()),oc0=process.env.XDG_CONFIG_HOME?X1.file(process.env.XDG_CONFIG_HOME):V1.joinPath(cJ0,".config");function Mt5(J){return C74({playNotificationSound:async(Z)=>{if(J.useNotificationsForService){P74(Z);let Q=J90(),Y=kx0();if((!Q||Y||iV4())&&J.config.settings["notifications.system.enabled"]!==!1){if(Z==="idle")process.stdout.write(AG("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Z==="requires-user-input")process.stdout.write(AG("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(J90()),threadService:J.threadService,configService:J.configService,threadViewStates$:J.threadViewStates$})}function At5(){return{sync:async()=>{},uploadThread:async()=>{},discoverThreads:async()=>[],initialSyncComplete:Promise.resolve(),updateThreadMeta:async()=>{},threadSyncInfo:()=>v0.of({}),flushPendingSyncs:async()=>{},dispose:()=>{}}}async function _9(J,Z,Q){let Y=Q?.deferAuth??!1;AI1("0.0.1773086656-gba9cfc");let X=Jr({storage:J.settings,secretStorage:J.secrets,workspaceRoots:v0.of([X1.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:cJ0,userConfigDir:oc0});gV4(X);let V=await X.getLatest();P.debug("Global configuration initialized",{settingsKeys:Object.keys(V.settings)});let{toolService:K,dispose:z}=M74({configService:X}),D=new Map,U=()=>D.clear(),G=new CL0(X,J.settings.getWorkspaceRootPath()),F=zh1({configService:X,filesystem:i6}),q=Vu1({configService:X,trustStore:G,skillMCPServers:F.skillMCPServers,createOAuthProvider:async(e,G0,n)=>{let K0=`${e}:${G0}`,F0=D.get(K0);if(F0)return P.debug("Reusing existing OAuth provider for server",{serverName:e,serverUrl:G0}),F0;P.debug("Creating OAuth provider for server",{serverName:e,serverUrl:G0});let O0=(async()=>{let V0=new PN(J.secrets),H0=await V0.getClientInfo(e,G0),i=n?.scopes??H0?.scopes,r=$X4();P.info("OAuth headless mode check",{useHeadless:r,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:t6.isTTY});let $0;if(r)$0=J.executeMode?eY4():tY4(e);let o=new nE0({storage:V0,serverName:e,serverUrl:G0,clientId:n?.clientId??H0?.clientId,clientSecret:n?.clientSecret??H0?.clientSecret,authUrl:n?.authUrl??H0?.authUrl,tokenUrl:n?.tokenUrl??H0?.tokenUrl,scopes:i,headlessAuthHandler:$0});return P.debug("OAuth provider created",{serverName:e,serverUrl:G0,hasManualClientId:!!(n?.clientId??H0?.clientId),willUseDCR:!(n?.clientId??H0?.clientId),scopes:i,headlessMode:r,executeMode:J.executeMode}),o})();return D.set(K0,O0),O0}}),W=Tv0({configService:X,filesystem:i6,spawn:f50}),H;if(J.executeMode){let e=await f34({toolService:K,providers:[q,W],initialTimeout:15000});H=e.registrations;for(let[G0,n]of e.initErrors)P.warn(`${G0} provider initialization slow or failed:`,n)}else H=_v0({toolService:K,providers:[q,W]});if(Z.jetbrains)QN("JetBrains");else if(Z.ide&&xX4())QN("VS Code");else if(Z.ide&&fX4())QN("Neovim");else if(Z.ide&&Wt5()){let e=KU.find((G0)=>G0.listConfigs().length>0);if(e){let G0=Kr(e.ideName);if(G0)QN(G0)}}if(J.executeMode)II1(!0);let B,w=u8.status.pipe(q1((e)=>Boolean(e.connected&&e.authenticated&&e.ideName&&$j1(e.ideName))),A4()).subscribe((e)=>{if(e){if(!B)B=K.registerTool(x34)}else B?.dispose(),B=void 0}),N;if(!J.executeMode){let e=await J.settings.get("fuzzy.alwaysIncludePaths")??[];N=new W80(process.cwd(),{alwaysIncludePaths:e},!0)}else N=new class extends W80{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let O=!1;{let e=await J.secrets.get("apiKey",J.ampURL);if(O=Boolean(e),P.info("API key lookup before login",{found:Boolean(e),ampURL:J.ampURL,deferAuth:Y}),!e)if(Y)P.info("No API key found, continuing startup with deferred auth");else{t6.write(`No API key found. Starting login flow...
7379
+ `)}function Ht5(J){process.emitWarning=(Z,Q,Y,X)=>{let V=typeof Z==="string"?Z:Z.message||String(Z),K=Q||"Warning",z=!1;J.warn(V,{name:K,code:Y})}}function W7(J,Z){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")A$("dangerouslyAllowAll",Z.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")A$("experimental.agentMode",Z.mode)}function dI4(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 Bt5(J){try{return await gI4(J,"utf-8")}catch{return J}}async function lc0(J,Z,Q){let Y=dI4(J,Z);if(!Y)return;let X=$5(Q)?Q.features:[],V=$5(Q)?Q.user.email:void 0;if(!X.some((z)=>z.name===yX.HARNESS_SYSTEM_PROMPT&&z.enabled)&&!cI4(V))throw new K4("You are not allowed to do this.",1);A$("systemPrompt",await Bt5(Y))}function cI4(J){return!!(J&&Uo(J))}function ic0(J,Z){if(typeof J==="boolean")return J;if(!$5(Z))return!1;return EJ(Z.user.email)}function nc0(J){if(!$5(J))return null;return{...J.user,features:J.features??[],team:J.workspace??void 0}}function wt5(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 ac0(J){let Y=wt5(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 K4(`Couldn't connect to the Amp server at ${J}.`,1,Y)}var uI4=[{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??fY,description:`Custom settings file path (overrides the default location ${fY})`},{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 ${yE})`},{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:l9(),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:yK.SMART.key,description:`Set the agent mode (${IX().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:IX().map((J)=>J.mode).concat("large","deep","internal")},{name:"dtw",long:"dtw",type:"flag",description:"Use the DTW-backed thread provider in the TUI (experimental)",hidden:!0,aliases:["deliver-me-to-agg"]},{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:"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}],xI4=(J)=>("deprecated"in J)&&J.deprecated===!0,Nt5=(J)=>("hidden"in J)&&J.hidden===!0,Ot5=(J)=>("default"in J),Et5=(J)=>("default"in J)?J.default:void 0,lI4=[{name:"toggle-skills-count",entryPoint:qx0}];function Lt5(J,Z){let Q=Z.args[0],Y=Z.commands.map((V)=>V.name());if(Q&&!Q.includes(" ")&&Q.length<30&&!/[./\\]/.test(Q)){let V=Y.filter((z)=>Q.includes(z)||z.includes(Q)),K="Run amp --help for a list of available commands.";if(V.length>0)K=`Did you mean: ${V.join(", ")}? Or run amp --help for all commands.`;throw new K4(D8.unknownCommand(Q),1,K)}}async function rc0(J){return{...J,getThreadEnvironment:d$,threadSyncService:J.threadSyncService,osFileSystem:J.fileSystem,skillService:J.skillService,fileChangeTrackerStorage:new tX(J.fileSystem),generateThreadTitle:u00,deleteThread:(Z)=>J.threadService.delete(Z),getServerStatus:()=>bJ(J.configService),pluginService:J.pluginService}}function iI4(J){return{toolService:J.toolService,configService:J.configService,skillService:J.skillService,getThreadEnvironment:d$,filesystem:J.fileSystem,threadService:J.threadService}}var cJ0=X1.file(pI4.homedir()),oc0=process.env.XDG_CONFIG_HOME?X1.file(process.env.XDG_CONFIG_HOME):V1.joinPath(cJ0,".config");function Mt5(J){return C74({playNotificationSound:async(Z)=>{if(J.useNotificationsForService){P74(Z);let Q=J90(),Y=kx0();if((!Q||Y||iV4())&&J.config.settings["notifications.system.enabled"]!==!1){if(Z==="idle")process.stdout.write(AG("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Z==="requires-user-input")process.stdout.write(AG("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(J90()),threadService:J.threadService,configService:J.configService,threadViewStates$:J.threadViewStates$})}function At5(){return{sync:async()=>{},uploadThread:async()=>{},discoverThreads:async()=>[],initialSyncComplete:Promise.resolve(),updateThreadMeta:async()=>{},threadSyncInfo:()=>v0.of({}),flushPendingSyncs:async()=>{},dispose:()=>{}}}async function _9(J,Z,Q){let Y=Q?.deferAuth??!1;AI1("0.0.1773100957-g1437de");let X=Jr({storage:J.settings,secretStorage:J.secrets,workspaceRoots:v0.of([X1.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:cJ0,userConfigDir:oc0});gV4(X);let V=await X.getLatest();P.debug("Global configuration initialized",{settingsKeys:Object.keys(V.settings)});let{toolService:K,dispose:z}=M74({configService:X}),D=new Map,U=()=>D.clear(),G=new CL0(X,J.settings.getWorkspaceRootPath()),F=zh1({configService:X,filesystem:i6}),q=Vu1({configService:X,trustStore:G,skillMCPServers:F.skillMCPServers,createOAuthProvider:async(e,G0,n)=>{let K0=`${e}:${G0}`,F0=D.get(K0);if(F0)return P.debug("Reusing existing OAuth provider for server",{serverName:e,serverUrl:G0}),F0;P.debug("Creating OAuth provider for server",{serverName:e,serverUrl:G0});let O0=(async()=>{let V0=new PN(J.secrets),H0=await V0.getClientInfo(e,G0),i=n?.scopes??H0?.scopes,r=$X4();P.info("OAuth headless mode check",{useHeadless:r,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:t6.isTTY});let $0;if(r)$0=J.executeMode?eY4():tY4(e);let o=new nE0({storage:V0,serverName:e,serverUrl:G0,clientId:n?.clientId??H0?.clientId,clientSecret:n?.clientSecret??H0?.clientSecret,authUrl:n?.authUrl??H0?.authUrl,tokenUrl:n?.tokenUrl??H0?.tokenUrl,scopes:i,headlessAuthHandler:$0});return P.debug("OAuth provider created",{serverName:e,serverUrl:G0,hasManualClientId:!!(n?.clientId??H0?.clientId),willUseDCR:!(n?.clientId??H0?.clientId),scopes:i,headlessMode:r,executeMode:J.executeMode}),o})();return D.set(K0,O0),O0}}),W=Tv0({configService:X,filesystem:i6,spawn:f50}),H;if(J.executeMode){let e=await f34({toolService:K,providers:[q,W],initialTimeout:15000});H=e.registrations;for(let[G0,n]of e.initErrors)P.warn(`${G0} provider initialization slow or failed:`,n)}else H=_v0({toolService:K,providers:[q,W]});if(Z.jetbrains)QN("JetBrains");else if(Z.ide&&xX4())QN("VS Code");else if(Z.ide&&fX4())QN("Neovim");else if(Z.ide&&Wt5()){let e=KU.find((G0)=>G0.listConfigs().length>0);if(e){let G0=Kr(e.ideName);if(G0)QN(G0)}}if(J.executeMode)II1(!0);let B,w=u8.status.pipe(q1((e)=>Boolean(e.connected&&e.authenticated&&e.ideName&&$j1(e.ideName))),A4()).subscribe((e)=>{if(e){if(!B)B=K.registerTool(x34)}else B?.dispose(),B=void 0}),N;if(!J.executeMode){let e=await J.settings.get("fuzzy.alwaysIncludePaths")??[];N=new W80(process.cwd(),{alwaysIncludePaths:e},!0)}else N=new class extends W80{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let O=!1;{let e=await J.secrets.get("apiKey",J.ampURL);if(O=Boolean(e),P.info("API key lookup before login",{found:Boolean(e),ampURL:J.ampURL,deferAuth:Y}),!e)if(Y)P.info("No API key found, continuing startup with deferred auth");else{t6.write(`No API key found. Starting login flow...
7380
7380
  `);let G0=await It5(J),n=await J.secrets.get("apiKey",J.ampURL);if(P.info("Login flow completed",{success:G0,storedKeyPresent:Boolean(n),ampURL:J.ampURL}),!G0)await OG(),process.exit(1);O=!0}}{let e=await X.getLatest(),G0=e.settings.url,n=e.secrets.isSet?.[G0];P.info("Config secrets state after login",{configURL:G0,apiKeySet:n?.apiKey??!1})}let E=L1(bJ(X).pipe(u5((e)=>e!=="pending"))),L=await Wh1({isDevelopment:!1}),M=Y?"pending":await E;if(!Y)P.info("Server status resolved",{status:"ready",isAuthenticated:$5(M),isError:jq(M),errorMessage:jq(M)?M.error.message:void 0});let A=new CI0(L,X),I=new LA0(L,{lazy:!0,maxThreads:200});P.info("Starting Amp background services");let j=ic0(Z.dtw,M),_=Boolean(j||Z.headless);if(_)P.info("DTW mode enabled: thread sync service disabled");let S=_?At5():bm1({threadService:A,threadHistoryService:I,configService:X,isExtensionDevelopment:!1}),y;u8.status.subscribe((e)=>{y=e});let m=new cB0({workspaceRoots:[X1.file(process.cwd())],fileSystem:Z.jetbrains||Z.ide?Et:i6,getCurrentFile:()=>{if(!y?.openFile)return;try{return X1.parse(y.openFile)}catch(e){P.warn("Failed to parse current file URI",{uri:y.openFile,error:e});return}},getOpenFiles:()=>{if(!y?.visibleFiles?.length)return[];let e=y.openFile;return y.visibleFiles.filter((G0)=>G0!==e).map((G0)=>{try{return X1.parse(G0)}catch(n){return P.warn("Failed to parse visible file URI",{uri:G0,error:n}),null}}).filter((G0)=>G0!==null)}}),f=new xx0,v=process.env.PLUGINS??"off",x=Z.headless?PV4():void 0,c=x??new f80({configService:X}),l=c instanceof f80?c:void 0;if(l)l.pluginExecutorKind=j?"local":"unknown";let h=nL0({configService:X,fileSystem:Z.jetbrains||Z.ide?Et:i6,platform:c,internalPlugins:lI4,pluginFilter:v}),a=Dx1({pluginService:h,toolService:K}),d={codebaseContextService:m,configService:X,toolService:K,mcpService:q,skillService:F,toolboxService:W,trustStore:G,threadService:A,threadHistoryService:I,threadSyncService:S,threadStorage:L,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:N,fileSystem:Z.jetbrains||Z.ide?Et:i6,terminal:f,pluginService:h,pluginPlatform:l,headlessPluginPlatform:x,serverStatus:M,serverStatusPromise:E,hasAPIKeyAtStartup:O};return{...d,async asyncDispose(){if(d.mcpService.hasAuthenticatingClients())P.info("Waiting for OAuth authentication to complete before exit..."),await d.mcpService.waitForAuthentication();for(let e of H.values())e.dispose();await d.mcpService.dispose(),U(),await d.threadService.asyncDispose(),d.configService.unsubscribe(),z(),d.fuzzyServer.dispose(),d.threadSyncService.dispose(),d.settingsStorage[Symbol.dispose](),w.unsubscribe(),B?.dispose(),a.dispose(),d.pluginService.dispose()}}}async function It5(J){if(!J.executeMode){if(!await Gx0("Would you like to log in to Amp? [(y)es, (n)o]: "))return t6.write(`Login cancelled. Run the command again to retry.
7381
7381
  `),!1}return await nI4(J)}async function nI4(J){let Z=Dt5(32).toString("hex"),Q=await CC(J.ampURL,Z),Y=new AbortController;try{await SX(Q,Y.signal)}catch(V){P.error("Error opening browser",{error:V})}let X=await CC(J.ampURL,Z,!1);t6.write(`If your browser does not open automatically, visit:
7382
7382
 
@@ -7384,7 +7384,7 @@ ${J1.blue.bold(X)}
7384
7384
 
7385
7385
  `);try{return await VV4(J.ampURL,Z,J.secrets,Y),t6.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(V){return P.error("Login failed",{error:V}),H7.write(`
7386
7386
  Login failed: ${V instanceof Error?V.message:String(V)}
7387
- `),!1}}function jt5(){let J=new oW().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)xE(),process.exit(0);let B=H.originalError??H;FY4(B)}),J.option("-V, --version","Print the version number and exit",()=>{let B;try{B=`, ${Rq(new Date("2026-03-09T20:10:03.282Z"))} ago`}catch{}t6.write(`0.0.1773086656-gba9cfc (released 2026-03-09T20:10:03.282Z${B??""})
7387
+ `),!1}}function jt5(){let J=new oW().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)xE(),process.exit(0);let B=H.originalError??H;FY4(B)}),J.option("-V, --version","Print the version number and exit",()=>{let B;try{B=`, ${Rq(new Date("2026-03-10T00:08:18.962Z"))} ago`}catch{}t6.write(`0.0.1773100957-g1437de (released 2026-03-10T00:08:18.962Z${B??""})
7388
7388
  `),process.exit(0)}),J.addHelpText("after",kX4()),J.configureHelp({formatHelp:yX4}),J.command("logout").description("Log out by removing stored API key").action(async(H,B)=>{let w=B.optsWithGlobals(),N=await H3(w);await vt5(N)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,B)=>{let w=B.optsWithGlobals(),N=await H3(w);await St5(N,await lu0(w,N.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,w)=>{let N=w.optsWithGlobals(),O=await H3(N);await xY4(H??"get",O.ampURL,O.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 w=B.optsWithGlobals(),N=await H3(w);await fY4(N.ampURL,N.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",`
7389
7389
  Actions:
7390
7390
  add-message <message> Send a user message and wait for message_added
@@ -7440,8 +7440,8 @@ ${L}
7440
7440
 
7441
7441
  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 Rt5(J){if(!J.userEmail||!EJ(J.userEmail))throw new K4("DTW TUI mode is only available for Amp employees",1);P.info("[createDTWThreadPool] Creating DTW thread pool",{threadId:J.threadId,ampURL:J.ampURL,workerUrl:process.env.AMP_WORKER_URL});try{let Z=new Dg({threadService:J.threadService,configService:J.configService,mcpService:J.mcpService,toolService:J.toolService,skillService:J.skillService,getThreadEnvironment:d$,osFileSystem:J.fileSystem,fileChangeTrackerStorage:new tX(J.fileSystem),ampURL:J.ampURL});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 Pt5(J){if(J.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof J.execute==="string"){let Z=(await nm()).trimEnd();return{userInput:J.execute,stdinInput:Z||null}}return{userInput:(await nm()).trimEnd(),stdinInput:null}}function Ct5(J,Z,Q){if(J.remote&&!Z)throw new K4("The -r/--remote flag requires --execute mode",1,'Use: amp --remote --execute "your message"');if(J.streamJson&&!Z)throw new K4("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(J.streamJsonInput&&!Z)throw new K4("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(J.streamJsonInput&&!J.streamJson)throw new K4("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(J.stats&&!Z)throw new K4("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(J.archive&&!Z)throw new K4("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 K4("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"}]}}' | amp --execute --stream-json --stream-json-input`);if(Z&&Q===""&&!J.streamJsonInput&&!J.headless)throw new K4("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"
7442
7442
  Or pipe via stdin: echo "your message" | amp --execute`)}async function lJ0(J,Z,Q){let Y=process.hrtime.bigint(),X=(G0,n)=>{let K0=Number(process.hrtime.bigint()-n)/1e6,F0=w24();P.info("Startup phase",{phase:G0,phaseMs:Math.round(K0),sinceMainMs:F0===null?void 0:Math.round(F0)})},{userInput:V,stdinInput:K}=await Pt5(Z),z=!!Z.streamJson||!!Z.streamJsonThinking;Ct5({...Z,streamJson:z},J.executeMode,V),W7(Q,Z);let D=process.hrtime.bigint(),U=Boolean(await J.secrets.get("apiKey",J.ampURL)),G=!J.executeMode&&!Z.headless&&U;P.info("Interactive auth startup mode",{deferInteractiveAuth:G,hasAPIKeyAtStartup:U,executeMode:J.executeMode,headless:Boolean(Z.headless)});let F=await _9(J,Z,{deferAuth:G});X("runMainThread:createThreadDependencies",D),D=process.hrtime.bigint();let q=await rc0(F);X("runMainThread:createWorkerDeps",D);let{serverStatus:W}=F;if(!G&&jq(W)){let G0=Am(Error(W.error.message));if(G0.message===D8.networkOffline||G0.message===D8.networkTimeout)throw ac0(J.ampURL);throw new K4(D8.invalidAPIKey,1)}let H=$5(W)?W:null,B=H?.user.email,w=cI4(B),N=!J.executeMode&&H!==null&&ic0(Z.dtw,H);if(!G)await lc0(Q,Z,W);let O=nc0(W),E=O?.features??[],L=O?.team??null,M=u80(Z,O);if(M instanceof Error)V3(M.message);if((J.executeMode||z)&&S8(Z.mode)&&!w)throw new K4(`Execute mode is not permitted with --mode '${Z.mode}'`,1);if(H&&!lF(Z.mode,B))throw new K4(`Agent mode '${Z.mode}' is only available for Amp employees`,1);if(J.executeMode&&Z.remote)await _V4(V,K,F.configService),await F.asyncDispose(),process.exit(0);if(Z.headless){if(!B||!EJ(B))throw new K4("Headless DTW mode is only available for Amp employees",1);let G0=await F.secretStorage.get("apiKey",J.ampURL);if(!G0)throw new K4("API key required for headless mode. Please run `amp login` first.",1);let n=typeof Z.headless==="string"&&Z.headless!=="true"?Z.headless:void 0;if(n&&!k8(n))throw new K4(`Invalid thread ID: ${n}`,1);let K0=n??await mt5({dependencies:F,visibility:M??void 0}),F0=await YX4(K0);if(F0.status==="already-running")await F.asyncDispose(),await OG(),process.exit(0);try{await sY4({ampURL:J.ampURL,apiKey:G0,workerUrl:process.env.AMP_WORKER_URL,workspaceRoot:process.cwd(),threadId:K0,configService:F.configService,mcpService:F.mcpService,toolService:F.toolService,skillService:F.skillService,fileSystem:F.fileSystem,pluginService:F.pluginService,pluginPlatform:F.headlessPluginPlatform})}finally{await F0.release(),await F.asyncDispose()}await OG(),process.exit(0)}let A={threadService:F.threadService,workerDeps:q,createThread:async()=>{let G0=G?await F.serverStatusPromise:W,n=await e30(J.settings,process.cwd(),nc0(G0),M);if(n instanceof Error)V3(n.message);return oh0(q,{threadMeta:n?SV(n):void 0,agentMode:Z.mode,onFirstAssistantMessage:fI4})},validateThreadOwnership:async(G0,n)=>{if(n?.nonBlockingOwnershipCheck){bI4(G0,F.configService).catch((K0)=>{if(K0 instanceof K4){if(n.onOwnershipError){n.onOwnershipError(K0,G0);return}AC(K0,G0);return}P.warn("Failed to validate thread ownership in CLI, allowing to open",{error:K0})});return}try{await bI4(G0,F.configService)}catch(K0){if(K0 instanceof K4)throw K0;P.warn("Failed to validate thread ownership in CLI, allowing to open",{error:K0})}},switchThreadVisibility:M,switchThreadAgentMode:Z.mode,onFirstAssistantMessage:fI4},I=async(G0,n)=>{try{if(G0==="dtw")return Rt5({userEmail:n?.dtwUserEmail??B,ampURL:J.ampURL,configService:F.configService,threadService:F.threadService,mcpService:F.mcpService,toolService:F.toolService,skillService:F.skillService,fileSystem:F.fileSystem,threadId:Z.threadId});return iq4(A,Z.threadId,{nonBlockingOwnershipCheck:Z.nonBlockingThreadOwnershipCheck})}catch(K0){if(K0 instanceof K4)throw K0;throw await AC(K0,Z.threadId),Error("handleError should have called process.exit()")}};if(Z.format==="jsonl")H7.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
7443
- `),await OG(),process.exit(1);let j=(async()=>{if(G){P.info("Skipping initial free tier status fetch until auth is complete");return}try{let G0=await F.configService.getLatest(),n=Ak(G0),K0=await L6.getUserFreeTierStatus({},{config:F.configService,signal:AbortSignal.timeout(n)});if(K0.ok)return P.info("User free tier status:",K0),K0.result;return}catch(G0){P.error("Failed to fetch free tier status:",G0);return}})(),S=!J.executeMode?new ix0:null,y,m=null;if(S)y=S,m=(async()=>{let G0=G?await F.serverStatusPromise:F.serverStatus;await lc0(Q,Z,G0);let n=process.hrtime.bigint(),K0=ic0(Z.dtw,G0),F0=$5(G0)?G0.user.email:void 0,O0=await I(K0?"dtw":"worker",{dtwUserEmail:F0});if(X("runMainThread:createThreadPool",n),S.attach(O0),V){let V0=await L1(O0.threadHandles$);if(!V0)throw new K4("No active thread is available yet.",1);await V0.sendMessage({content:[{type:"text",text:V}]})}})(),m.catch(async(G0)=>{let n=G0 instanceof Error?G0:Error(String(G0));S.setInitError(n),await AC(G0,Z.threadId)});else D=process.hrtime.bigint(),y=await I(N?"dtw":"worker"),X("runMainThread:createThreadPool",D);let f=Z.notifications!==void 0?Z.notifications:!J.executeMode;D=process.hrtime.bigint();let v=await F.configService.getLatest();if(X("runMainThread:configService.getLatest",D),D=process.hrtime.bigint(),Mt5({configService:F.configService,threadService:F.threadService,config:v,useNotificationsForService:f,threadViewStates$:()=>y.threadHandles$.pipe(e1((G0)=>{if(!G0)return v0.of({});return Q5(G0.thread$,G0.threadViewState$).pipe(q1(([n,K0])=>({[n.id]:K0})))}))}),X("runMainThread:createCliNotificationService",D),J.executeMode){if(NV4(F.mcpService,J.settings),!(y instanceof zT))throw new K4("Execute mode is not supported with the DTW thread pool",1);let G0=y.getWorkerForExecuteMode();if(await LY4({worker:G0,threadID:G0.threadID,userInput:V,stdinInput:K,dependencies:F,streamJson:z,streamJsonInput:!!Z.streamJsonInput,streamJsonThinking:!!Z.streamJsonThinking,stats:!!Z.stats,ampURL:J.ampURL,isDogfooding:w,agentMode:Z.mode,labels:Z.label}),Z.archive)await L6.archiveThread({thread:G0.threadID,archived:!0},{config:F.configService});await F.asyncDispose(),process.exit(0)}let x=!1,c=!1;if(Z.jetbrains||Z.ide){await Vj1();let G0=zN({jetbrainsOnly:Z.jetbrains});if(G0.length===0){if(Z.jetbrains)x=!await F.configService.get("jetbrains.skipInstall")}else if(G0.length===1){let n=G0[0];if(n)u8.selectConfig(n)}else c=!0}D=process.hrtime.bigint();let l=Dx0("0.0.1773086656-gba9cfc",F.settingsStorage,{startDelayMs:3000});X("runMainThread:createUpdateService",D),D=process.hrtime.bigint();let h=new EA0(F.threadStorage);X("runMainThread:createThreadFuzzyIndexer",D),D=process.hrtime.bigint();let a=new Fx0(F.mcpService,J.settings.getWorkspaceRootPath());if(X("runMainThread:createMcpTrustHandler",D),V&&J.executeMode){let G0=await L1(y.threadHandles$);if(!G0)throw new K4("No active thread is available yet.",1);await G0.sendMessage({content:[{type:"text",text:V}]})}D=process.hrtime.bigint();let d=await nz();X("runMainThread:loadSessionState",D),P.info("Loaded session state:",d);let e={...d,launchCount:d.launchCount+1};az(e);try{if(D=process.hrtime.bigint(),await $H4({codebaseContextService:F.codebaseContextService,history:new Tu0,fuzzyServer:F.fuzzyServer,settingsStorage:F.settingsStorage,threadService:F.threadService,threadHistoryService:F.threadHistoryService,threadFuzzyIndexer:h,skillService:F.skillService,configService:F.configService,secretStorage:F.secretStorage,internalAPIClient:L6,threadPool:y,createSystemPromptDeps:async()=>iI4(F),ideClient:u8,mcpService:F.mcpService,toolboxService:F.toolboxService,mcpTrustHandler:a,updateService:l,pluginPlatform:F.pluginPlatform,pluginService:F.pluginService},{initialServerStatus:F.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:F.hasAPIKeyAtStartup,ampURL:J.ampURL,showJetBrainsInstaller:x,showIdePickerHint:c,openThreadSwitcher:Z.openThreadSwitcher,inspector:Z.inspector,inspectorPort:Z.inspectorPort,jetbrainsMode:Z.jetbrains,clientId:Z.clientId,sessionState:e,freeTierStatusPromise:j,workspace:L??null,features:E,isDogfooding:w,initialAgentMode:Q.getOptionValueSourceWithGlobals("mode")==="cli"?Z.mode:void 0,buildTimestamp:"2026-03-09T20:10:03.282Z"},(G0)=>new Lm0({...G0,threadPool:G0.threadPool},(n)=>new Bd0({...n,threadState:n.threadState}))),X("runMainThread:mountApp-returned",D),m)await m}finally{}await F.asyncDispose(),X("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function H3(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)H7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7444
- `);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 Fu1({get:async(z)=>{if(z!==Wu)return;try{let D=await gI4(cc0,"utf-8");return JSON.parse(D).installationID}catch{return}},set:async(z,D)=>{if(z!==Wu)return;await mI4(HB.dirname(cc0),{recursive:!0}),await Ut5(cc0,JSON.stringify({installationID:D},null,2),{mode:384})}},{clientType:"cli",platform:rQ()});jI1(Y);let X=await wX4({...J,workspaceTrust:{current:!0,changes:Kk},getHook:process.env.AMP_URL?(z,D)=>{if(z==="url")return Promise.resolve(process.env.AMP_URL);return D()}:void 0});if(J.mcpConfig){let z=await BV4(J.mcpConfig);X=wV4(X,z)}let V=HB.dirname(X.getSettingsFilePath());R74(RC,V);let K=await X.get("url","global");if(!K)K=t9;if(P.info("Resolved Amp URL",{ampURL:K,settingsFile:X.getSettingsFilePath(),workspaceRoot:X.getWorkspaceRootPath()}),!Zq(K))P.info("Targeting custom Amp server",{ampURL:K});return X=HI1(X),{executeMode:Z,isTTY:Q,ampURL:K,settings:X,secrets:uV4(await lu0(J,X))}}function Tt5(J){let Z={};for(let Q=0;Q<J.length;Q++){let Y=J[Q];if(Y?.startsWith("--")){let V=Y.slice(2).replace(/-([a-z])/g,(z,D)=>D.toUpperCase()),K=J[Q+1];if(K&&!K.startsWith("--"))Z[V]=K,Q++}}return Z}async function _t5(){B24();let J=Tt5(process.argv),Z=process.argv.includes("--headless")||process.argv.some((V)=>V.startsWith("--headless="));TQ4({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE||(Z?qt5: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)J1.level=0;if(Ht5(P),P.info("Starting Amp CLI.",{version:"0.0.1773086656-gba9cfc",buildTimestamp:"2026-03-09T20:10:03.282Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new K4(D8.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await jt5().parseAsync(process.argv)}I74().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await _t5().catch(AC)});async function St5(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"),t6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7443
+ `),await OG(),process.exit(1);let j=(async()=>{if(G){P.info("Skipping initial free tier status fetch until auth is complete");return}try{let G0=await F.configService.getLatest(),n=Ak(G0),K0=await L6.getUserFreeTierStatus({},{config:F.configService,signal:AbortSignal.timeout(n)});if(K0.ok)return P.info("User free tier status:",K0),K0.result;return}catch(G0){P.error("Failed to fetch free tier status:",G0);return}})(),S=!J.executeMode?new ix0:null,y,m=null;if(S)y=S,m=(async()=>{let G0=G?await F.serverStatusPromise:F.serverStatus;await lc0(Q,Z,G0);let n=process.hrtime.bigint(),K0=ic0(Z.dtw,G0),F0=$5(G0)?G0.user.email:void 0,O0=await I(K0?"dtw":"worker",{dtwUserEmail:F0});if(X("runMainThread:createThreadPool",n),S.attach(O0),V){let V0=await L1(O0.threadHandles$);if(!V0)throw new K4("No active thread is available yet.",1);await V0.sendMessage({content:[{type:"text",text:V}]})}})(),m.catch(async(G0)=>{let n=G0 instanceof Error?G0:Error(String(G0));S.setInitError(n),await AC(G0,Z.threadId)});else D=process.hrtime.bigint(),y=await I(N?"dtw":"worker"),X("runMainThread:createThreadPool",D);let f=Z.notifications!==void 0?Z.notifications:!J.executeMode;D=process.hrtime.bigint();let v=await F.configService.getLatest();if(X("runMainThread:configService.getLatest",D),D=process.hrtime.bigint(),Mt5({configService:F.configService,threadService:F.threadService,config:v,useNotificationsForService:f,threadViewStates$:()=>y.threadHandles$.pipe(e1((G0)=>{if(!G0)return v0.of({});return Q5(G0.thread$,G0.threadViewState$).pipe(q1(([n,K0])=>({[n.id]:K0})))}))}),X("runMainThread:createCliNotificationService",D),J.executeMode){if(NV4(F.mcpService,J.settings),!(y instanceof zT))throw new K4("Execute mode is not supported with the DTW thread pool",1);let G0=y.getWorkerForExecuteMode();if(await LY4({worker:G0,threadID:G0.threadID,userInput:V,stdinInput:K,dependencies:F,streamJson:z,streamJsonInput:!!Z.streamJsonInput,streamJsonThinking:!!Z.streamJsonThinking,stats:!!Z.stats,ampURL:J.ampURL,isDogfooding:w,agentMode:Z.mode,labels:Z.label}),Z.archive)await L6.archiveThread({thread:G0.threadID,archived:!0},{config:F.configService});await F.asyncDispose(),process.exit(0)}let x=!1,c=!1;if(Z.jetbrains||Z.ide){await Vj1();let G0=zN({jetbrainsOnly:Z.jetbrains});if(G0.length===0){if(Z.jetbrains)x=!await F.configService.get("jetbrains.skipInstall")}else if(G0.length===1){let n=G0[0];if(n)u8.selectConfig(n)}else c=!0}D=process.hrtime.bigint();let l=Dx0("0.0.1773100957-g1437de",F.settingsStorage,{startDelayMs:3000});X("runMainThread:createUpdateService",D),D=process.hrtime.bigint();let h=new EA0(F.threadStorage);X("runMainThread:createThreadFuzzyIndexer",D),D=process.hrtime.bigint();let a=new Fx0(F.mcpService,J.settings.getWorkspaceRootPath());if(X("runMainThread:createMcpTrustHandler",D),V&&J.executeMode){let G0=await L1(y.threadHandles$);if(!G0)throw new K4("No active thread is available yet.",1);await G0.sendMessage({content:[{type:"text",text:V}]})}D=process.hrtime.bigint();let d=await nz();X("runMainThread:loadSessionState",D),P.info("Loaded session state:",d);let e={...d,launchCount:d.launchCount+1};az(e);try{if(D=process.hrtime.bigint(),await $H4({codebaseContextService:F.codebaseContextService,history:new Tu0,fuzzyServer:F.fuzzyServer,settingsStorage:F.settingsStorage,threadService:F.threadService,threadHistoryService:F.threadHistoryService,threadFuzzyIndexer:h,skillService:F.skillService,configService:F.configService,secretStorage:F.secretStorage,internalAPIClient:L6,threadPool:y,createSystemPromptDeps:async()=>iI4(F),ideClient:u8,mcpService:F.mcpService,toolboxService:F.toolboxService,mcpTrustHandler:a,updateService:l,pluginPlatform:F.pluginPlatform,pluginService:F.pluginService},{initialServerStatus:F.serverStatus,stdout:process.stdout,hasAPIKeyAtStartup:F.hasAPIKeyAtStartup,ampURL:J.ampURL,showJetBrainsInstaller:x,showIdePickerHint:c,openThreadSwitcher:Z.openThreadSwitcher,inspector:Z.inspector,inspectorPort:Z.inspectorPort,jetbrainsMode:Z.jetbrains,clientId:Z.clientId,sessionState:e,freeTierStatusPromise:j,workspace:L??null,features:E,isDogfooding:w,initialAgentMode:Q.getOptionValueSourceWithGlobals("mode")==="cli"?Z.mode:void 0,buildTimestamp:"2026-03-10T00:08:18.962Z"},(G0)=>new Lm0({...G0,threadPool:G0.threadPool},(n)=>new Bd0({...n,threadState:n.threadState}))),X("runMainThread:mountApp-returned",D),m)await m}finally{}await F.asyncDispose(),X("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function H3(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)H7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7444
+ `);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 Fu1({get:async(z)=>{if(z!==Wu)return;try{let D=await gI4(cc0,"utf-8");return JSON.parse(D).installationID}catch{return}},set:async(z,D)=>{if(z!==Wu)return;await mI4(HB.dirname(cc0),{recursive:!0}),await Ut5(cc0,JSON.stringify({installationID:D},null,2),{mode:384})}},{clientType:"cli",platform:rQ()});jI1(Y);let X=await wX4({...J,workspaceTrust:{current:!0,changes:Kk},getHook:process.env.AMP_URL?(z,D)=>{if(z==="url")return Promise.resolve(process.env.AMP_URL);return D()}:void 0});if(J.mcpConfig){let z=await BV4(J.mcpConfig);X=wV4(X,z)}let V=HB.dirname(X.getSettingsFilePath());R74(RC,V);let K=await X.get("url","global");if(!K)K=t9;if(P.info("Resolved Amp URL",{ampURL:K,settingsFile:X.getSettingsFilePath(),workspaceRoot:X.getWorkspaceRootPath()}),!Zq(K))P.info("Targeting custom Amp server",{ampURL:K});return X=HI1(X),{executeMode:Z,isTTY:Q,ampURL:K,settings:X,secrets:uV4(await lu0(J,X))}}function Tt5(J){let Z={};for(let Q=0;Q<J.length;Q++){let Y=J[Q];if(Y?.startsWith("--")){let V=Y.slice(2).replace(/-([a-z])/g,(z,D)=>D.toUpperCase()),K=J[Q+1];if(K&&!K.startsWith("--"))Z[V]=K,Q++}}return Z}async function _t5(){B24();let J=Tt5(process.argv),Z=process.argv.includes("--headless")||process.argv.some((V)=>V.startsWith("--headless="));TQ4({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE||(Z?qt5: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)J1.level=0;if(Ht5(P),P.info("Starting Amp CLI.",{version:"0.0.1773100957-g1437de",buildTimestamp:"2026-03-10T00:08:18.962Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new K4(D8.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await jt5().parseAsync(process.argv)}I74().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await _t5().catch(AC)});async function St5(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"),t6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7445
7445
  `);else if(!Zq(J.ampURL))t6.write(`Logging in to ${new URL(J.ampURL).hostname}
7446
7446
  `);let Y=process.env.AMP_API_KEY;if(Y)t6.write(`API key found in environment variable, storing...
7447
7447
  `),await Z.set("apiKey",Y,J.ampURL),t6.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1773086656-gba9cfc",
3
+ "version": "0.0.1773100957-g1437de",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {