@r5n/hydra 0.9.2 → 0.9.4

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 (3) hide show
  1. package/README.md +3 -1
  2. package/dist/cli.js +87 -93
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -89,7 +89,7 @@ Passing any of `-l`/`-w`/`-s` cleans only those targets; with none, the targets
89
89
 
90
90
  - `hydra profile list` — profiles with URL, OS, and created/running counts
91
91
  - `hydra profile default <name>` — set the default profile
92
- - `hydra profile remove <name>` — remove a profile; if it has runners, stops and deregisters them first (after confirmation)
92
+ - `hydra profile remove <name> [--yes]` — remove a profile; if it has runners, stops and deregisters them first. Pass `--yes` to skip confirmation in scripts.
93
93
 
94
94
  ## Configuration
95
95
 
@@ -131,6 +131,8 @@ The `url` is either a repository URL (`https://github.com/owner/repo`) or an org
131
131
 
132
132
  Runner binaries are downloaded once per version into `.hydra/shared/github/<version>`. Each runner directory under `.hydra/runners/<id>` gets hardlinks for `bin`, a symlink for `externals`, and its own copies of the shell scripts, so ten runners cost roughly one copy of the runner distribution on disk. Start/stop is plain process management: a detached `bash run.sh` plus a pid file per runner.
133
133
 
134
+ Hydra disables the runner's automatic updater when registering it; use `hydra update` to update the shared binaries. Failed downloads are discarded, and completed registrations and removals are saved as each runner finishes, so a later failure in the batch can be retried. Failed deregistrations preserve the runner's files and record.
135
+
134
136
  ## License
135
137
 
136
138
  Apache-2.0 — see [LICENSE](./LICENSE)
package/dist/cli.js CHANGED
@@ -1,99 +1,93 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var Lo=Object.create;var{getPrototypeOf:Do,defineProperty:ne,getOwnPropertyNames:Io}=Object;var Eo=Object.prototype.hasOwnProperty;function Ho(r){return this[r]}var Uo,No,ee=(r,n,e)=>{var o=r!=null&&typeof r==="object";if(o){var i=n?Uo??=new WeakMap:No??=new WeakMap,t=i.get(r);if(t)return t}e=r!=null?Lo(Do(r)):{};let a=n||!r||!r.__esModule?ne(e,"default",{value:r,enumerable:!0}):e;for(let s of Io(r))if(!Eo.call(a,s))ne(a,s,{get:Ho.bind(r,s),enumerable:!0});if(o)i.set(r,a);return a};var Ao=(r,n)=>()=>(n||r((n={exports:{}}).exports,n),n.exports);var yn=Ao((_t,be)=>{var $n={to(r,n){if(!n)return`\x1B[${r+1}G`;return`\x1B[${n+1};${r+1}H`},move(r,n){let e="";if(r<0)e+=`\x1B[${-r}D`;else if(r>0)e+=`\x1B[${r}C`;if(n<0)e+=`\x1B[${-n}A`;else if(n>0)e+=`\x1B[${n}B`;return e},up:(r=1)=>`\x1B[${r}A`,down:(r=1)=>`\x1B[${r}B`,forward:(r=1)=>`\x1B[${r}C`,backward:(r=1)=>`\x1B[${r}D`,nextLine:(r=1)=>"\x1B[E".repeat(r),prevLine:(r=1)=>"\x1B[F".repeat(r),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},Xo={up:(r=1)=>"\x1B[S".repeat(r),down:(r=1)=>"\x1B[T".repeat(r)},Vo={screen:"\x1B[2J",up:(r=1)=>"\x1B[1J".repeat(r),down:(r=1)=>"\x1B[J".repeat(r),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(r){let n="";for(let e=0;e<r;e++)n+=this.line+(e<r-1?$n.up():"");if(r)n+=$n.left;return n}};be.exports={cursor:$n,scroll:Xo,erase:Vo,beep:"\x07"}});class Q extends Error{constructor(r="Operation cancelled"){super(r)}}class w extends Error{hint;exitCode;constructor(r,n,e=1){super(r);this.hint=n;this.exitCode=e}}import{styleText as Mr}from"util";import{stdout as kn,stdin as $e}from"process";import*as er from"readline";import So from"readline";var oe=(()=>{let r=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(n)=>{let e=0;r.lastIndex=0;while(r.test(n))e+=1;return n.length-e}})(),ie=(r)=>{return r===12288||r>=65281&&r<=65376||r>=65504&&r<=65510},te=(r)=>{return r===8987||r===9001||r>=12272&&r<=12287||r>=12289&&r<=12350||r>=12441&&r<=12543||r>=12549&&r<=12591||r>=12593&&r<=12686||r>=12688&&r<=12771||r>=12783&&r<=12830||r>=12832&&r<=12871||r>=12880&&r<=19903||r>=65040&&r<=65049||r>=65072&&r<=65106||r>=65108&&r<=65126||r>=65128&&r<=65131||r>=127488&&r<=127490||r>=127504&&r<=127547||r>=127552&&r<=127560||r>=131072&&r<=196605||r>=196608&&r<=262141};var jo=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Mo=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,ae=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,Go=/\t{1,1000}/y,se=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/yu,xo=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,qo=/\p{M}+/gu,zo={limit:1/0,ellipsis:""},ce=(r,n={},e={})=>{let o=n.limit??1/0,i=n.ellipsis??"",t=n?.ellipsisWidth??(i?ce(i,zo,e).width:0),a=0,s=e.controlWidth??0,c=e.tabWidth??8,u=e.emojiWidth??2,d=2,g=e.regularWidth??1,p=e.wideWidth??2,h=[[xo,g],[jo,0],[Mo,s],[Go,c],[se,u],[ae,p]],l=0,b=0,F=r.length,I=0,y=!1,j=F,E=Math.max(0,o-t),P=0,A=0,H=0,L=0;r:while(!0){if(A>P||b>=F&&b>l){let N=r.slice(P,A)||r.slice(l,b);I=0;for(let X of N.replaceAll(qo,"")){let W=X.codePointAt(0)||0;if(ie(W))L=2;else if(te(W))L=p;else L=g;if(H+L>E)j=Math.min(j,Math.max(P,l)+I);if(H+L>o){y=!0;break r}I+=X.length,H+=L}P=A=0}if(b>=F)break r;for(let N=0,X=h.length;N<X;N++){let[W,Er]=h[N];if(W.lastIndex=b,W.test(r)){if(I=W===ae?oe(r.slice(b,W.lastIndex)):W===se?1:W.lastIndex-b,L=I*Er,H+L>E)j=Math.min(j,b+Math.floor((E-H)/Er));if(H+L>o){y=!0;break r}H+=L,P=l,A=b,b=l=W.lastIndex;continue r}}b+=1}return{width:y?E:H,index:y?j:F,truncated:y,ellipsed:y&&o>=t}},ue=ce;var Wo={limit:1/0,ellipsis:"",ellipsisWidth:0},Yo=(r,n={})=>{return ue(r,Wo,n).width},Y=Yo;var Ur="\x1B",de="\x9B",Jo=39,vn="\x07",ge="[",Ko="]",he="m",Cn=`${Ko}8;;`,fe=new RegExp(`(?:\\${ge}(?<code>\\d+)m|\\${Cn}(?<uri>.*)${vn})`,"y"),pe=(r)=>{if(r>=30&&r<=37)return 39;if(r>=90&&r<=97)return 39;if(r>=40&&r<=47)return 49;if(r>=100&&r<=107)return 49;if(r===1||r===2)return 22;if(r===3)return 23;if(r===4)return 24;if(r===7)return 27;if(r===8)return 28;if(r===9)return 29;if(r===0)return 0;return},me=(r)=>`${Ur}${ge}${r}${he}`,le=(r)=>`${Ur}${Cn}${r}${vn}`,wn=(r,n,e)=>{let o=n[Symbol.iterator](),i=!1,t=!1,a=r.at(-1),s=a===void 0?0:Y(a),c=o.next(),u=o.next(),d=0;while(!c.done){let g=c.value,p=Y(g);if(s+p<=e)r[r.length-1]+=g;else r.push(g),s=0;if(g===Ur||g===de)i=!0,t=n.startsWith(Cn,d+1);if(i){if(t){if(g===vn)i=!1,t=!1}else if(g===he)i=!1}else if(s+=p,s===e&&!u.done)r.push(""),s=0;c=u,u=o.next(),d+=g.length}if(a=r.at(-1),!s&&a!==void 0&&a.length&&r.length>1)r[r.length-2]+=r.pop()},Zo=(r)=>{let n=r.split(" "),e=n.length;while(e){if(Y(n[e-1]))break;e--}if(e===n.length)return r;return n.slice(0,e).join(" ")+n.slice(e).join("")},Oo=(r,n,e={})=>{if(e.trim!==!1&&r.trim()==="")return"";let o="",i,t,a=r.split(" "),s=[""],c=0;for(let g=0;g<a.length;g++){let p=a[g];if(e.trim!==!1){let l=s.at(-1)??"",b=l.trimStart();if(l.length!==b.length)s[s.length-1]=b,c=Y(b)}if(g!==0){if(c>=n&&(e.wordWrap===!1||e.trim===!1))s.push(""),c=0;if(c||e.trim===!1)s[s.length-1]+=" ",c++}let h=Y(p);if(e.hard&&h>n){let l=n-c,b=1+Math.floor((h-l-1)/n);if(Math.floor((h-1)/n)<b)s.push("");wn(s,p,n),c=Y(s.at(-1)??"");continue}if(c+h>n&&c&&h){if(e.wordWrap===!1&&c<n){wn(s,p,n),c=Y(s.at(-1)??"");continue}s.push(""),c=0}if(c+h>n&&e.wordWrap===!1){wn(s,p,n),c=Y(s.at(-1)??"");continue}s[s.length-1]+=p,c+=h}if(e.trim!==!1)s=s.map((g)=>Zo(g));let u=s.join(`
4
- `),d=!1;for(let g=0;g<u.length;g++){let p=u[g];if(o+=p,!d){if(d=p>="\uD800"&&p<="\uDBFF",d)continue}else d=!1;if(p===Ur||p===de){fe.lastIndex=g+1;let l=fe.exec(u)?.groups;if(l?.code!==void 0){let b=Number.parseFloat(l.code);i=b===Jo?void 0:b}else if(l?.uri!==void 0)t=l.uri.length===0?void 0:l.uri}if(u[g+1]===`
5
- `){if(t)o+=le("");let h=i?pe(i):void 0;if(i&&h)o+=me(h)}else if(p===`
6
- `){if(i&&pe(i))o+=me(i);if(t)o+=le(t)}}return o},Qo=/\r?\n/;function V(r,n,e){return String(r).normalize().split(Qo).map((o)=>Oo(o,n,e)).join(`
7
- `)}var q=ee(yn(),1);import{ReadStream as we}from"tty";function _(r,n,e){if(!e.some((a)=>!a.disabled))return r;let o=r+n,i=Math.max(e.length-1,0),t=o<0?i:o>i?0:o;return e[t]?.disabled?_(t,n<0?-1:1,e):t}function Nr(r,n,e,o){let i=o.split(`
8
- `),t=0,a=r;for(let c of i){if(a<=c.length)break;a-=c.length+1,t++}for(t=Math.max(0,Math.min(i.length-1,t+e)),a=Math.min(a,i[t].length)+n;a<0&&t>0;)t--,a+=i[t].length+1;for(;a>i[t].length&&t<i.length-1;)a-=i[t].length+1,t++;a=Math.max(0,Math.min(i[t].length,a));let s=0;for(let c=0;c<t;c++)s+=i[c].length+1;return s+a}var Bo=["up","down","left","right","space","enter","cancel"],_o=["January","February","March","April","May","June","July","August","September","October","November","December"],M={actions:new Set(Bo),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"},withGuide:!0,date:{monthNames:[..._o],messages:{required:"Please enter a valid date",invalidMonth:"There are only 12 months in a year",invalidDay:(r,n)=>`There are only ${r} days in ${n}`,afterMin:(r)=>`Date must be on or after ${r.toISOString().slice(0,10)}`,beforeMax:(r)=>`Date must be on or before ${r.toISOString().slice(0,10)}`}}};function Ln(r,n){if(typeof r=="string")return M.aliases.get(r)===n;for(let e of r)if(e!==void 0&&Ln(e,n))return!0;return!1}function To(r,n){if(r===n)return;let e=r.split(`
9
- `),o=n.split(`
10
- `),i=Math.max(e.length,o.length),t=[];for(let a=0;a<i;a++)e[a]!==o[a]&&t.push(a);return{lines:t,numLinesBefore:e.length,numLinesAfter:o.length,numLines:i}}var ri=globalThis.process.platform.startsWith("win"),Fn=Symbol("clack:cancel");function wr(r){return r===Fn}function Ar(r,n){let e=r;e.isTTY&&e.setRawMode(n)}function ye({input:r=$e,output:n=kn,overwrite:e=!0,hideCursor:o=!0}={}){let i=er.createInterface({input:r,output:n,prompt:"",tabSize:1});er.emitKeypressEvents(r,i),r instanceof we&&r.isTTY&&r.setRawMode(!0);let t=(a,{name:s,sequence:c})=>{let u=String(a);if(Ln([u,s,c],"cancel")){o&&n.write(q.cursor.show),process.exit(0);return}if(!e)return;er.moveCursor(n,s==="return"?0:-1,s==="return"?-1:0,()=>{er.clearLine(n,1,()=>{r.once("keypress",t)})})};return o&&n.write(q.cursor.hide),r.once("keypress",t),()=>{r.off("keypress",t),o&&n.write(q.cursor.show),r instanceof we&&r.isTTY&&!ri&&r.setRawMode(!1),i.terminal=!1,i.close()}}var vr=(r)=>("columns"in r)&&typeof r.columns=="number"?r.columns:80,Dn=(r)=>("rows"in r)&&typeof r.rows=="number"?r.rows:20;function or(r,n,e,o=e,i=e,t){let a=vr(r??kn);return V(n,a-e.length,{hard:!0,trim:!1}).split(`
11
- `).map((s,c,u)=>{let d=t?t(s,c):s;return c===0?`${o}${d}`:c===u.length-1?`${i}${d}`:`${e}${d}`}).join(`
12
- `)}function Pe(r,n){if("~standard"in r){let e=r["~standard"].validate(n);if(e instanceof Promise)throw TypeError("Schema validation must be synchronous. Update `validate()` and remove any asynchronous logic.");return e.issues?.at(0)?.message}return r(n)}class T{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(r,n=!0){let{input:e=$e,output:o=kn,render:i,signal:t,...a}=r;this.opts=a,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=n,this._abortSignal=t,this.input=e,this.output=o}unsubscribe(){this._subscribers.clear()}setSubscriber(r,n){let e=this._subscribers.get(r)??[];e.push(n),this._subscribers.set(r,e)}on(r,n){this.setSubscriber(r,{cb:n})}once(r,n){this.setSubscriber(r,{cb:n,once:!0})}emit(r,...n){let e=this._subscribers.get(r)??[],o=[];for(let i of e)i.cb(...n),i.once&&o.push(()=>e.splice(e.indexOf(i),1));for(let i of o)i()}prompt(){return new Promise((r)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),r(Fn);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=So.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),Ar(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(q.cursor.show),this.output.off("resize",this.render),Ar(this.input,!1),r(this.value)}),this.once("cancel",()=>{this.output.write(q.cursor.show),this.output.off("resize",this.render),Ar(this.input,!1),r(Fn)})})}_isActionKey(r,n){return r==="\t"}_shouldSubmit(r,n){return!0}_setValue(r){this.value=r,this.emit("value",this.value)}_setUserInput(r,n){this.userInput=r??"",this.emit("userInput",this.userInput),n&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(r,n){if(this._track&&n.name!=="return"&&(n.name&&this._isActionKey(r,n)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),n?.name&&(!this._track&&M.aliases.has(n.name)&&this.emit("cursor",M.aliases.get(n.name)),M.actions.has(n.name)&&this.emit("cursor",n.name)),r&&(r.toLowerCase()==="y"||r.toLowerCase()==="n")&&this.emit("confirm",r.toLowerCase()==="y"),this.emit("key",r,n),n?.name==="return"&&this._shouldSubmit(r,n)){if(this.opts.validate){let e=Pe(this.opts.validate,this.value);e&&(this.error=e instanceof Error?e.message:e,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}Ln([r,n?.name,n?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
13
- `),Ar(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let r=V(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
14
- `).length-1;this.output.write(q.cursor.move(-999,r*-1))}render(){let r=V(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(r!==this._prevFrame){if(this.state==="initial")this.output.write(q.cursor.hide);else{let n=To(this._prevFrame,r),e=Dn(this.output);if(this.restoreCursor(),n){let o=Math.max(0,n.numLinesAfter-e),i=Math.max(0,n.numLinesBefore-e),t=n.lines.find((a)=>a>=o);if(t===void 0){this._prevFrame=r;return}if(n.lines.length===1){this.output.write(q.cursor.move(0,t-i)),this.output.write(q.erase.lines(1));let a=r.split(`
15
- `);this.output.write(a[t]),this._prevFrame=r,this.output.write(q.cursor.move(0,a.length-t-1));return}else if(n.lines.length>1){if(o<i)t=o;else{let s=t-i;s>0&&this.output.write(q.cursor.move(0,s))}this.output.write(q.erase.down());let a=r.split(`
16
- `).slice(t);this.output.write(a.join(`
17
- `)),this._prevFrame=r;return}}this.output.write(q.erase.down())}this.output.write(r),this.state==="initial"&&(this.state="active"),this._prevFrame=r}}}function ni(r,n){if(r===void 0||n.length===0)return 0;let e=n.findIndex((o)=>o.value===r);return e!==-1?e:0}function ei(r,n){return(n.label??String(n.value)).toLowerCase().includes(r.toLowerCase())}function oi(r,n){if(n)return r?n:n[0]}var ii=class extends T{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#n=0;#i="";#r;#t;#s;get cursor(){return this.#n}get userInputWithCursor(){if(!this.userInput)return Mr(["inverse","hidden"],"_");if(this._cursor>=this.userInput.length)return`${this.userInput}\u2588`;let n=this.userInput.slice(0,this.cursor),e=this.userInput.slice(this.cursor,this.cursor+1),o=this.userInput.slice(this.cursor+1);return`${n}${Mr("inverse",e)}${o}`}get options(){return typeof this.#t=="function"?this.#t():this.#t}constructor(n){super(n),this.#t=n.options,this.#s=n.placeholder;let e=this.options;this.filteredOptions=[...e],this.multiple=n.multiple===!0,this.#r=typeof n.options=="function"?n.filter:n.filter??ei;let o;if(n.initialValue&&Array.isArray(n.initialValue)?this.multiple?o=n.initialValue:o=n.initialValue.slice(0,1):!this.multiple&&this.options.length>0&&(o=[this.options[0]?.value]),o)for(let i of o){let t=e.findIndex((a)=>a.value===i);t!==-1&&(this.toggleSelected(i),this.#n=t)}this.focusedValue=this.options[this.#n]?.value,this.on("key",(i,t)=>this.#e(i,t)),this.on("userInput",(i)=>this.#o(i))}_isActionKey(n,e){return n==="\t"||this.multiple&&this.isNavigating&&e.name==="space"&&n!==void 0&&n!==""}#e(n,e){let o=e.name==="up",i=e.name==="down",t=e.name==="return",a=this.userInput===""||this.userInput==="\t",s=this.#s,c=this.options,u=s!==void 0&&s!==""&&c.some((d)=>!d.disabled&&(this.#r?this.#r(s,d):!0));if(e.name==="tab"&&a&&u){this.userInput==="\t"&&this._clearUserInput(),this._setUserInput(s,!0),this.isNavigating=!1;return}o||i?(this.#n=_(this.#n,o?-1:1,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#n]?.value,this.multiple||(this.selectedValues=[this.focusedValue]),this.isNavigating=!0):t?this.value=oi(this.multiple,this.selectedValues):this.multiple?this.focusedValue!==void 0&&(e.name==="tab"||this.isNavigating&&e.name==="space")?this.toggleSelected(this.focusedValue):this.isNavigating=!1:(this.focusedValue&&(this.selectedValues=[this.focusedValue]),this.isNavigating=!1)}deselectAll(){this.selectedValues=[]}toggleSelected(n){this.filteredOptions.length!==0&&(this.multiple?this.selectedValues.includes(n)?this.selectedValues=this.selectedValues.filter((e)=>e!==n):this.selectedValues=[...this.selectedValues,n]:this.selectedValues=[n])}#o(n){if(n!==this.#i){this.#i=n;let e=this.options;n&&this.#r?this.filteredOptions=e.filter((t)=>this.#r?.(n,t)):this.filteredOptions=[...e];let o=ni(this.focusedValue,this.filteredOptions);this.#n=_(o,0,this.filteredOptions);let i=this.filteredOptions[this.#n];i&&!i.disabled?this.focusedValue=i.value:this.focusedValue=void 0,this.multiple||(this.focusedValue!==void 0?this.toggleSelected(this.focusedValue):this.deselectAll())}}};class In extends T{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(r){super(r,!1),this.value=!!r.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",(n)=>{this.output.write(q.cursor.move(0,-1)),this.value=n,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}var ti={Y:{type:"year",len:4},M:{type:"month",len:2},D:{type:"day",len:2}};function ve(r){return[...r].map((n)=>ti[n])}function ai(r){let n=new Intl.DateTimeFormat(r,{year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(2000,0,15)),e=[],o="/";for(let i of n)i.type==="literal"?o=i.value.trim()||i.value:(i.type==="year"||i.type==="month"||i.type==="day")&&e.push({type:i.type,len:i.type==="year"?4:2});return{segments:e,separator:o}}function Pn(r){return Number.parseInt((r||"0").replace(/_/g,"0"),10)||0}function jr(r){return{year:Pn(r.year),month:Pn(r.month),day:Pn(r.day)}}function Rn(r,n){return new Date(r||2001,n||1,0).getDate()}function Fe(r){let{year:n,month:e,day:o}=jr(r);if(!n||n<0||n>9999||!e||e<1||e>12||!o||o<1)return;let i=new Date(Date.UTC(n,e-1,o));if(!(i.getUTCFullYear()!==n||i.getUTCMonth()!==e-1||i.getUTCDate()!==o))return{year:n,month:e,day:o}}function Ce(r){let n=Fe(r);return n?new Date(Date.UTC(n.year,n.month-1,n.day)):void 0}function si(r,n,e,o){let i=e?{year:e.getUTCFullYear(),month:e.getUTCMonth()+1,day:e.getUTCDate()}:null,t=o?{year:o.getUTCFullYear(),month:o.getUTCMonth()+1,day:o.getUTCDate()}:null;return r==="year"?{min:i?.year??1,max:t?.year??9999}:r==="month"?{min:i&&n.year===i.year?i.month:1,max:t&&n.year===t.year?t.month:12}:{min:i&&n.year===i.year&&n.month===i.month?i.day:1,max:t&&n.year===t.year&&n.month===t.month?t.day:Rn(n.year,n.month)}}class Re extends T{#n;#i;#r;#t;#s;#e={segmentIndex:0,positionInSegment:0};#o=!0;#a=null;inlineError="";get segmentCursor(){return{...this.#e}}get segmentValues(){return{...this.#r}}get segments(){return this.#n}get separator(){return this.#i}get formattedValue(){return this.#p(this.#r)}#p(r){return this.#n.map((n)=>r[n.type]).join(this.#i)}#c(){this._setUserInput(this.#p(this.#r)),this._setValue(Ce(this.#r)??void 0)}constructor(r){let n=r.format?{segments:ve(r.format),separator:r.separator??"/"}:ai(r.locale),e=r.separator??n.separator,o=r.format?ve(r.format):n.segments,i=r.initialValue??r.defaultValue,t=i?{year:String(i.getUTCFullYear()).padStart(4,"0"),month:String(i.getUTCMonth()+1).padStart(2,"0"),day:String(i.getUTCDate()).padStart(2,"0")}:{year:"____",month:"__",day:"__"},a=o.map((s)=>t[s.type]).join(e);super({...r,initialUserInput:a},!1),this.#n=o,this.#i=e,this.#r=t,this.#t=r.minDate,this.#s=r.maxDate,this.#c(),this.on("cursor",(s)=>this.#d(s)),this.on("key",(s,c)=>this.#g(s,c)),this.on("finalize",()=>this.#h(r))}#u(){let r=Math.max(0,Math.min(this.#e.segmentIndex,this.#n.length-1)),n=this.#n[r];if(n)return this.#e.positionInSegment=Math.max(0,Math.min(this.#e.positionInSegment,n.len-1)),{segment:n,index:r}}#f(r){this.inlineError="",this.#a=null;let n=this.#u();n&&(this.#e.segmentIndex=Math.max(0,Math.min(this.#n.length-1,n.index+r)),this.#e.positionInSegment=0,this.#o=!0)}#m(r){let n=this.#u();if(!n)return;let{segment:e}=n,o=this.#r[e.type],i=!o||o.replace(/_/g,"")==="",t=Number.parseInt((o||"0").replace(/_/g,"0"),10)||0,a=si(e.type,jr(this.#r),this.#t,this.#s),s;i?s=r===1?a.min:a.max:s=Math.max(Math.min(a.max,t+r),a.min),this.#r={...this.#r,[e.type]:s.toString().padStart(e.len,"0")},this.#o=!0,this.#a=null,this.#c()}#d(r){if(r)switch(r){case"right":return this.#f(1);case"left":return this.#f(-1);case"up":return this.#m(1);case"down":return this.#m(-1)}}#g(r,n){if(n?.name==="backspace"||n?.sequence==="\x7F"||n?.sequence==="\b"||r==="\x7F"||r==="\b"){this.inlineError="";let e=this.#u();if(!e)return;if(!this.#r[e.segment.type].replace(/_/g,"")){this.#f(-1);return}this.#r[e.segment.type]="_".repeat(e.segment.len),this.#o=!0,this.#e.positionInSegment=0,this.#c();return}if(n?.name==="tab"){this.inlineError="";let e=this.#u();if(!e)return;let o=n.shift?-1:1,i=e.index+o;i>=0&&i<this.#n.length&&(this.#e.segmentIndex=i,this.#e.positionInSegment=0,this.#o=!0);return}if(r&&/^[0-9]$/.test(r)){let e=this.#u();if(!e)return;let{segment:o}=e,i=!this.#r[o.type].replace(/_/g,"");if(this.#o&&this.#a!==null&&!i){let p=this.#a+r,h={...this.#r,[o.type]:p},l=this.#l(h,o);if(l){this.inlineError=l,this.#a=null,this.#o=!1;return}this.inlineError="",this.#r[o.type]=p,this.#a=null,this.#o=!1,this.#c(),e.index<this.#n.length-1&&(this.#e.segmentIndex=e.index+1,this.#e.positionInSegment=0,this.#o=!0);return}this.#o&&!i&&(this.#r[o.type]="_".repeat(o.len),this.#e.positionInSegment=0),this.#o=!1,this.#a=null;let t=this.#r[o.type],a=t.indexOf("_"),s=a>=0?a:Math.min(this.#e.positionInSegment,o.len-1);if(s<0||s>=o.len)return;let c=t.slice(0,s)+r+t.slice(s+1),u=!1;if(s===0&&t==="__"&&(o.type==="month"||o.type==="day")){let p=Number.parseInt(r,10);c=`0${r}`,u=p<=(o.type==="month"?1:2)}if(o.type==="year"&&(c=(t.replace(/_/g,"")+r).padStart(o.len,"_")),!c.includes("_")){let p={...this.#r,[o.type]:c},h=this.#l(p,o);if(h){this.inlineError=h;return}}this.inlineError="",this.#r[o.type]=c;let d=c.includes("_")?void 0:Fe(this.#r);if(d){let{year:p,month:h}=d,l=Rn(p,h);this.#r={year:String(Math.max(0,Math.min(9999,p))).padStart(4,"0"),month:String(Math.max(1,Math.min(12,h))).padStart(2,"0"),day:String(Math.max(1,Math.min(l,d.day))).padStart(2,"0")}}this.#c();let g=c.indexOf("_");u?(this.#o=!0,this.#a=r):g>=0?this.#e.positionInSegment=g:a>=0&&e.index<this.#n.length-1?(this.#e.segmentIndex=e.index+1,this.#e.positionInSegment=0,this.#o=!0):this.#e.positionInSegment=Math.min(s+1,o.len-1)}}#l(r,n){let{month:e,day:o}=jr(r);if(n.type==="month"&&(e<0||e>12))return M.date.messages.invalidMonth;if(n.type==="day"&&(o<0||o>31))return M.date.messages.invalidDay(31,"any month")}#h(r){let{year:n,month:e,day:o}=jr(this.#r);if(n&&e&&o){let i=Rn(n,e);this.#r={...this.#r,day:String(Math.min(o,i)).padStart(2,"0")}}this.value=Ce(this.#r)??r.defaultValue??void 0}}var ci=class extends T{options;cursor=0;#n;getGroupItems(n){return this.options.filter((e)=>e.group===n)}isGroupSelected(n){let e=this.getGroupItems(n),o=this.value;return o===void 0?!1:e.every((i)=>o.includes(i.value))}toggleValue(){let n=this.options[this.cursor];if(n!==void 0)if(this.value===void 0&&(this.value=[]),n.group===!0){let e=n.value,o=this.getGroupItems(e);this.isGroupSelected(e)?this.value=this.value.filter((i)=>o.findIndex((t)=>t.value===i)===-1):this.value=[...this.value,...o.map((i)=>i.value)],this.value=Array.from(new Set(this.value))}else{let e=this.value.includes(n.value);this.value=e?this.value.filter((o)=>o!==n.value):[...this.value,n.value]}}constructor(n){super(n,!1);let{options:e}=n;this.#n=n.selectableGroups!==!1,this.options=Object.entries(e).flatMap(([o,i])=>[{value:o,group:!0,label:o},...i.map((t)=>({...t,group:o}))]),this.value=[...n.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:o})=>o===n.cursorAt),this.#n?0:1),this.on("cursor",(o)=>{switch(o){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let i=this.options[this.cursor]?.group===!0;!this.#n&&i&&(this.cursor=this.cursor===0?this.options.length-1:this.cursor-1);break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let i=this.options[this.cursor]?.group===!0;!this.#n&&i&&(this.cursor=this.cursor===this.options.length-1?0:this.cursor+1);break}case"space":this.toggleValue();break}})}},ui=new Set(["up","down","left","right"]);class ke extends T{#n=!1;#i;focused="editor";get userInputWithCursor(){if(this.state==="submit")return this.userInput;let r=this.userInput;if(this.cursor>=r.length)return`${r}\u2588`;let n=r.slice(0,this.cursor),e=r.slice(this.cursor,this.cursor+1),o=r.slice(this.cursor+1);return e===`
18
- `?`${n}\u2588
19
- ${o}`:`${n}${Mr("inverse",e)}${o}`}get cursor(){return this._cursor}#r(r){if(this.userInput.length===0){this._setUserInput(r);return}this._setUserInput(this.userInput.slice(0,this.cursor)+r+this.userInput.slice(this.cursor))}#t(r){let n=this.value??"";switch(r){case"up":this._cursor=Nr(this._cursor,0,-1,n);return;case"down":this._cursor=Nr(this._cursor,0,1,n);return;case"left":this._cursor=Nr(this._cursor,-1,0,n);return;case"right":this._cursor=Nr(this._cursor,1,0,n);return}}_shouldSubmit(r,n){if(this.#i)return this.focused==="submit"?!0:(this.#r(`
20
- `),this._cursor++,!1);let e=this.#n;return this.#n=!0,e&&this.cursor===this.userInput.length?(this.userInput[this.cursor-1]===`
21
- `&&(this._setUserInput(this.userInput.slice(0,this.cursor-1)+this.userInput.slice(this.cursor)),this._cursor--),!0):(this.#r(`
22
- `),this._cursor++,!1)}constructor(r){let n=r.initialUserInput??r.initialValue;super({...r,initialUserInput:n},!1),n!==void 0&&(this._cursor=n.length),this.#i=r.showSubmit??!1,this.on("key",(e,o)=>{if(o?.name&&ui.has(o.name)){this.#n=!1,this.#t(o.name);return}if(e==="\t"&&this.#i){this.focused=this.focused==="editor"?"submit":"editor";return}if(o?.name!=="return"){if(this.#n=!1,o?.name==="backspace"&&this.cursor>0){this._setUserInput(this.userInput.slice(0,this.cursor-1)+this.userInput.slice(this.cursor)),this._cursor--;return}if(o?.name==="delete"&&this.cursor<this.userInput.length){this._setUserInput(this.userInput.slice(0,this.cursor)+this.userInput.slice(this.cursor+1));return}e&&(this.#i&&this.focused==="submit"&&(this.focused="editor"),this.#r(e??""),this._cursor++)}}),this.on("userInput",(e)=>{this._setValue(e)}),this.on("finalize",()=>{this.value||(this.value=r.defaultValue),this.value===void 0&&(this.value="")})}}class En extends T{options;cursor=0;get _value(){return this.options[this.cursor]?.value}get _enabledOptions(){return this.options.filter((r)=>r.disabled!==!0)}toggleAll(){let r=this._enabledOptions,n=this.value!==void 0&&this.value.length===r.length;this.value=n?[]:r.map((e)=>e.value)}toggleInvert(){let r=this.value;if(!r)return;let n=this._enabledOptions.filter((e)=>!r.includes(e.value));this.value=n.map((e)=>e.value)}toggleValue(){this.value===void 0&&(this.value=[]);let r=this.value.includes(this._value);this.value=r?this.value.filter((n)=>n!==this._value):[...this.value,this._value]}constructor(r){super(r,!1),this.options=r.options,this.value=[...r.initialValues??[]];let n=Math.max(this.options.findIndex(({value:e})=>e===r.cursorAt),0);this.cursor=this.options[n]?.disabled?_(n,1,this.options):n,this.on("key",(e,o)=>{o.name==="a"&&this.toggleAll(),o.name==="i"&&this.toggleInvert()}),this.on("cursor",(e)=>{switch(e){case"left":case"up":this.cursor=_(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=_(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}}var Le=class extends T{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){let n=this._selectedValue;this.value=n===void 0?void 0:n.value}constructor(n){super(n,!1),this.options=n.options;let e=this.options.findIndex(({value:i})=>i===n.initialValue),o=e===-1?0:e;this.cursor=this.options[o]?.disabled?_(o,1,this.options):o,this.changeValue(),this.on("cursor",(i)=>{switch(i){case"left":case"up":this.cursor=_(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=_(this.cursor,1,this.options);break}this.changeValue()})}};class Hn extends T{get userInputWithCursor(){if(this.state==="submit")return this.userInput;let r=this.userInput;if(this.cursor>=r.length)return`${this.userInput}\u2588`;let n=r.slice(0,this.cursor),e=r.slice(this.cursor,this.cursor+1),o=r.slice(this.cursor+1);return`${n}${Mr("inverse",e)}${o}`}get cursor(){return this._cursor}constructor(r){super({...r,initialUserInput:r.initialUserInput??r.initialValue}),this.on("userInput",(n)=>{this._setValue(n)}),this.on("finalize",()=>{this.value||(this.value=r.defaultValue),this.value===void 0&&(this.value="")})}}import{styleText as f,stripVTControlCharacters as fa}from"util";import Z from"process";var $r=ee(yn(),1);function fi(){if(Z.platform!=="win32")return Z.env.TERM!=="linux";return Boolean(Z.env.CI)||Boolean(Z.env.WT_SESSION)||Boolean(Z.env.TERMINUS_SUBLIME)||Z.env.ConEmuTask==="{cmd::Cmder}"||Z.env.TERM_PROGRAM==="Terminus-Sublime"||Z.env.TERM_PROGRAM==="vscode"||Z.env.TERM==="xterm-256color"||Z.env.TERM==="alacritty"||Z.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var Un=fi(),pi=()=>process.env.CI==="true";var R=(r,n)=>Un?r:n,mi=R("\u25C6","*"),Ue=R("\u25A0","x"),Ne=R("\u25B2","x"),qr=R("\u25C7","o"),li=R("\u250C","T"),$=R("\u2502","|"),ir=R("\u2514","\u2014"),da=R("\u2510","T"),ga=R("\u2518","\u2014"),Nn=R("\u25CF",">"),xr=R("\u25CB"," "),di=R("\u25FB","[\u2022]"),De=R("\u25FC","[+]"),Ie=R("\u25FB","[ ]"),ha=R("\u25AA","\u2022"),Ee=R("\u2500","-"),gi=R("\u256E","+"),hi=R("\u251C","+"),bi=R("\u256F","+"),wi=R("\u2570","+"),ba=R("\u256D","+"),vi=R("\u25CF","\u2022"),Ci=R("\u25C6","*"),$i=R("\u25B2","!"),yi=R("\u25A0","x"),zr=(r)=>{switch(r){case"initial":case"active":return f("cyan",mi);case"cancel":return f("red",Ue);case"error":return f("yellow",Ne);case"submit":return f("green",qr)}},Ae=(r)=>{switch(r){case"initial":case"active":return f("cyan",$);case"cancel":return f("red",$);case"error":return f("yellow",$);case"submit":return f("green",$)}};function je(r,n){let e=[`${n?`${f("cyan",$)} `:""}${r.join(" \u2022 ")}`];return n&&e.push(f("cyan",ir)),e}var He=(r,n,e,o,i,t=!1)=>{let a=n,s=0;if(t)for(let c=o-1;c>=e;c--){let u=r[c];if(u&&(a-=u.length),s++,a<=i)break}else for(let c=e;c<o;c++){let u=r[c];if(u&&(a-=u.length),s++,a<=i)break}return{lineCount:a,removals:s}},An=({cursor:r,options:n,style:e,output:o=process.stdout,maxItems:i=Number.POSITIVE_INFINITY,columnPadding:t=0,rowPadding:a=4})=>{let s=vr(o)-t,c=Dn(o),u=f("dim","..."),d=Math.max(c-a,0),g=Math.max(Math.min(i,d),5),p=0;r>=g-3&&(p=Math.max(Math.min(r-g+3,n.length-g),0));let h=g<n.length&&p>0,l=g<n.length&&p+g<n.length,b=Math.min(p+g,n.length),F=[],I=0;h&&I++,l&&I++;let y=p+(h?1:0),j=b-(l?1:0);for(let P=y;P<j;P++){let A=n[P],H=A?e(A,P===r):"",L=V(H,s,{hard:!0,trim:!1}).split(`
23
- `);F.push(L),I+=L.length}if(I>d){let P=0,A=0,H=I,L=r-y,N=d,X=()=>He(F,H,0,L,N),W=()=>He(F,H,L+1,F.length,N,!0);h?({lineCount:H,removals:P}=X(),H>N&&(l||(N-=1),{lineCount:H,removals:A}=W())):(l||(N-=1),{lineCount:H,removals:A}=W(),H>N&&(N-=1,{lineCount:H,removals:P}=X())),P>0&&(h=!0,F.splice(0,P)),A>0&&(l=!0,F.splice(F.length-A,A))}let E=[];h&&E.push(u);for(let P of F)for(let A of P)E.push(A);return l&&E.push(u),E};var Me=(r)=>{let n=r.active??"Yes",e=r.inactive??"No";return new In({active:n,inactive:e,signal:r.signal,input:r.input,output:r.output,initialValue:r.initialValue??!0,render(){let o=r.withGuide??M.withGuide,i=`${zr(this.state)} `,t=o?`${f("gray",$)} `:"",a=or(r.output,r.message,t,i),s=`${o?`${f("gray",$)}
24
- `:""}${a}
25
- `,c=this.value?n:e;switch(this.state){case"submit":{let u=o?`${f("gray",$)} `:"";return`${s}${u}${f("dim",c)}`}case"cancel":{let u=o?`${f("gray",$)} `:"";return`${s}${u}${f(["strikethrough","dim"],c)}${o?`
26
- ${f("gray",$)}`:""}`}default:{let u=o?`${f("cyan",$)} `:"",d=o?f("cyan",ir):"";return`${s}${u}${this.value?`${f("green",Nn)} ${n}`:`${f("dim",xr)} ${f("dim",n)}`}${r.vertical?o?`
27
- ${f("cyan",$)} `:`
28
- `:` ${f("dim","/")} `}${this.value?`${f("dim",xr)} ${f("dim",e)}`:`${f("green",Nn)} ${e}`}
3
+ var Ii=Object.create;var{getPrototypeOf:Ei,defineProperty:ir,getOwnPropertyNames:Pi}=Object;var nr=Object.prototype.hasOwnProperty;function _i(t){return this[t]}var Ai,Ti,sr=(t,e,r)=>{var i=t!=null&&typeof t==="object";if(i){var n=e?Ai??=new WeakMap:Ti??=new WeakMap,s=n.get(t);if(s)return s}r=t!=null?Ii(Ei(t)):{};let o=e||!t||!t.__esModule||!nr.call(t,"default")?ir(r,"default",{value:t,enumerable:!0}):r;if(t&&typeof t==="object"||typeof t==="function"){for(let u of Pi(t))if(!nr.call(o,u))ir(o,u,{get:_i.bind(t,u),enumerable:!0})}if(i)n.set(t,o);return o};var Di=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var xe=Di(function(no,wr){var Ce={to(t,e){if(!e)return`\x1B[${t+1}G`;return`\x1B[${e+1};${t+1}H`},move(t,e){let r="";if(t<0)r+=`\x1B[${-t}D`;else if(t>0)r+=`\x1B[${t}C`;if(e<0)r+=`\x1B[${-e}A`;else if(e>0)r+=`\x1B[${e}B`;return r},up:(t=1)=>`\x1B[${t}A`,down:(t=1)=>`\x1B[${t}B`,forward:(t=1)=>`\x1B[${t}C`,backward:(t=1)=>`\x1B[${t}D`,nextLine:(t=1)=>"\x1B[E".repeat(t),prevLine:(t=1)=>"\x1B[F".repeat(t),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},Ki={up:(t=1)=>"\x1B[S".repeat(t),down:(t=1)=>"\x1B[T".repeat(t)},qi={screen:"\x1B[2J",up:(t=1)=>"\x1B[1J".repeat(t),down:(t=1)=>"\x1B[J".repeat(t),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(t){let e="";for(let r=0;r<t;r++)e+=this.line+(r<t-1?Ce.up():"");if(t)e+=Ce.left;return e}};wr.exports={cursor:Ce,scroll:Ki,erase:qi,beep:"\x07"}});class Y extends Error{constructor(t="Operation cancelled"){super(t)}}class y extends Error{hint;exitCode;constructor(t,e,r=1){super(t);this.hint=e;this.exitCode=r}}import{styleText as zi}from"util";import{stdout as Se,stdin as Cr}from"process";import*as st from"readline";import Yi from"readline";var or=(()=>{let t=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return(e)=>{let r=0;t.lastIndex=0;while(t.test(e))r+=1;return e.length-r}})(),ar=(t)=>t===12288||t>=65281&&t<=65376||t>=65504&&t<=65510,ur=(t)=>t===8987||t===9001||t>=12272&&t<=12287||t>=12289&&t<=12350||t>=12441&&t<=12543||t>=12549&&t<=12591||t>=12593&&t<=12686||t>=12688&&t<=12771||t>=12783&&t<=12830||t>=12832&&t<=12871||t>=12880&&t<=19903||t>=65040&&t<=65049||t>=65072&&t<=65106||t>=65108&&t<=65126||t>=65128&&t<=65131||t>=127488&&t<=127490||t>=127504&&t<=127547||t>=127552&&t<=127560||t>=131072&&t<=196605||t>=196608&&t<=262141;var ki=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Li=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,lr=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,Fi=/\t{1,1000}/y,cr=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/yu,Oi=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Ni=/\p{M}+/gu,Mi={limit:1/0,ellipsis:""},pr=(t,e={},r={})=>{let i=e.limit??1/0,n=e.ellipsis??"",s=e?.ellipsisWidth??(n?pr(n,Mi,r).width:0),o=0,u=r.controlWidth??0,a=r.tabWidth??8,l=r.emojiWidth??2,f=2,h=r.regularWidth??1,d=r.wideWidth??2,g=[[Oi,h],[ki,0],[Li,u],[Fi,a],[cr,l],[lr,d]],m=0,v=0,I=t.length,A=0,x=!1,N=I,T=Math.max(0,i-s),R=0,F=0,D=0,_=0;t:while(!0){if(F>R||v>=I&&v>m){let L=t.slice(R,F)||t.slice(m,v);A=0;for(let X of L.replaceAll(Ni,"")){let H=X.codePointAt(0)||0;if(ar(H))_=2;else if(ur(H))_=d;else _=h;if(D+_>T)N=Math.min(N,Math.max(R,m)+A);if(D+_>i){x=!0;break t}A+=X.length,D+=_}R=F=0}if(v>=I)break t;for(let L=0,X=g.length;L<X;L++){let[H,Lt]=g[L];if(H.lastIndex=v,H.test(t)){if(A=H===lr?or(t.slice(v,H.lastIndex)):H===cr?1:H.lastIndex-v,_=A*Lt,D+_>T)N=Math.min(N,v+Math.floor((T-D)/Lt));if(D+_>i){x=!0;break t}D+=_,R=m,F=v,v=m=H.lastIndex;continue t}}v+=1}return{width:x?T:D,index:x?N:I,truncated:x,ellipsed:x&&i>=s}},dr=pr;var Ui={limit:1/0,ellipsis:"",ellipsisWidth:0},Vi=(t,e={})=>dr(t,Ui,e).width,B=Vi;var Ot="\x1B",yr="\x9B",Gi=39,we="\x07",$r="[",ji="]",vr="m",be=`${ji}8;;`,mr=new RegExp(`(?:\\${$r}(?<code>\\d+)m|\\${be}(?<uri>.*)${we})`,"y"),hr=(t)=>{if(t>=30&&t<=37)return 39;if(t>=90&&t<=97)return 39;if(t>=40&&t<=47)return 49;if(t>=100&&t<=107)return 49;if(t===1||t===2)return 22;if(t===3)return 23;if(t===4)return 24;if(t===7)return 27;if(t===8)return 28;if(t===9)return 29;if(t===0)return 0;return},fr=(t)=>`${Ot}${$r}${t}${vr}`,gr=(t)=>`${Ot}${be}${t}${we}`,ve=(t,e,r)=>{let i=e[Symbol.iterator](),n=!1,s=!1,o=t.at(-1),u=o===void 0?0:B(o),a=i.next(),l=i.next(),f=0;while(!a.done){let h=a.value,d=B(h);if(u+d<=r)t[t.length-1]+=h;else t.push(h),u=0;if(h===Ot||h===yr)n=!0,s=e.startsWith(be,f+1);if(n){if(s){if(h===we)n=!1,s=!1}else if(h===vr)n=!1}else if(u+=d,u===r&&!l.done)t.push(""),u=0;a=l,l=i.next(),f+=h.length}if(o=t.at(-1),!u&&o!==void 0&&o.length&&t.length>1)t[t.length-2]+=t.pop()},Hi=(t)=>{let e=t.split(" "),r=e.length;while(r){if(B(e[r-1]))break;r--}if(r===e.length)return t;return e.slice(0,r).join(" ")+e.slice(r).join("")},Bi=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let i="",n,s,o=t.split(" "),u=[""],a=0;for(let h=0;h<o.length;h++){let d=o[h];if(r.trim!==!1){let m=u.at(-1)??"",v=m.trimStart();if(m.length!==v.length)u[u.length-1]=v,a=B(v)}if(h!==0){if(a>=e&&(r.wordWrap===!1||r.trim===!1))u.push(""),a=0;if(a||r.trim===!1)u[u.length-1]+=" ",a++}let g=B(d);if(r.hard&&g>e){let m=e-a,v=1+Math.floor((g-m-1)/e);if(Math.floor((g-1)/e)<v)u.push("");ve(u,d,e),a=B(u.at(-1)??"");continue}if(a+g>e&&a&&g){if(r.wordWrap===!1&&a<e){ve(u,d,e),a=B(u.at(-1)??"");continue}u.push(""),a=0}if(a+g>e&&r.wordWrap===!1){ve(u,d,e),a=B(u.at(-1)??"");continue}u[u.length-1]+=d,a+=g}if(r.trim!==!1)u=u.map((h)=>Hi(h));let l=u.join(`
4
+ `),f=!1;for(let h=0;h<l.length;h++){let d=l[h];if(i+=d,!f){if(f=d>="\uD800"&&d<="\uDBFF",f)continue}else f=!1;if(d===Ot||d===yr){mr.lastIndex=h+1;let m=mr.exec(l)?.groups;if(m?.code!==void 0){let v=Number.parseFloat(m.code);n=v===Gi?void 0:v}else if(m?.uri!==void 0)s=m.uri.length===0?void 0:m.uri}if(l[h+1]===`
5
+ `){if(s)i+=gr("");let g=n?hr(n):void 0;if(n&&g)i+=fr(g)}else if(d===`
6
+ `){if(n&&hr(n))i+=fr(n);if(s)i+=gr(s)}}return i},Wi=/\r?\n/;function Z(t,e,r){return String(t).normalize().split(Wi).map((i)=>Bi(i,e,r)).join(`
7
+ `)}var G=sr(xe(),1);import{ReadStream as br}from"tty";function lt(t,e,r){if(!r.some((o)=>!o.disabled))return t;let i=t+e,n=Math.max(r.length-1,0),s=i<0?n:i>n?0:i;return r[s]?.disabled?lt(s,e<0?-1:1,r):s}var Ji=["up","down","left","right","space","enter","cancel"],Xi=["January","February","March","April","May","June","July","August","September","October","November","December"],V={actions:new Set(Ji),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"},withGuide:!0,date:{monthNames:[...Xi],messages:{required:"Please enter a valid date",invalidMonth:"There are only 12 months in a year",invalidDay:(t,e)=>`There are only ${t} days in ${e}`,afterMin:(t)=>`Date must be on or after ${t.toISOString().slice(0,10)}`,beforeMax:(t)=>`Date must be on or before ${t.toISOString().slice(0,10)}`}}};function Ie(t,e){if(typeof t=="string")return V.aliases.get(t)===e;for(let r of t)if(r!==void 0&&Ie(r,e))return!0;return!1}function Zi(t,e){if(t===e)return;let r=t.split(`
8
+ `),i=e.split(`
9
+ `),n=Math.max(r.length,i.length),s=[];for(let o=0;o<n;o++)r[o]!==i[o]&&s.push(o);return{lines:s,numLinesBefore:r.length,numLinesAfter:i.length,numLines:n}}var Qi=globalThis.process.platform.startsWith("win"),Re=Symbol("clack:cancel");function xt(t){return t===Re}function Nt(t,e){let r=t;r.isTTY&&r.setRawMode(e)}function xr({input:t=Cr,output:e=Se,overwrite:r=!0,hideCursor:i=!0}={}){let n=st.createInterface({input:t,output:e,prompt:"",tabSize:1});st.emitKeypressEvents(t,n),t instanceof br&&t.isTTY&&t.setRawMode(!0);let s=(o,{name:u,sequence:a})=>{let l=String(o);if(Ie([l,u,a],"cancel")){i&&e.write(G.cursor.show),process.exit(0);return}if(!r)return;st.moveCursor(e,u==="return"?0:-1,u==="return"?-1:0,()=>{st.clearLine(e,1,()=>{t.once("keypress",s)})})};return i&&e.write(G.cursor.hide),t.once("keypress",s),()=>{t.off("keypress",s),i&&e.write(G.cursor.show),t instanceof br&&t.isTTY&&!Qi&&t.setRawMode(!1),n.terminal=!1,n.close()}}var Rt=(t)=>("columns"in t)&&typeof t.columns=="number"?t.columns:80,Ee=(t)=>("rows"in t)&&typeof t.rows=="number"?t.rows:20;function ot(t,e,r,i=r,n=r,s){let o=Rt(t??Se);return Z(e,o-r.length,{hard:!0,trim:!1}).split(`
10
+ `).map((u,a,l)=>{let f=s?s(u,a):u;return a===0?`${i}${f}`:a===l.length-1?`${n}${f}`:`${r}${f}`}).join(`
11
+ `)}function Rr(t,e){if("~standard"in t){let r=t["~standard"].validate(e);if(r instanceof Promise)throw TypeError("Schema validation must be synchronous. Update `validate()` and remove any asynchronous logic.");return r.issues?.at(0)?.message}return t(e)}class St{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(t,e=!0){let{input:r=Cr,output:i=Se,render:n,signal:s,...o}=t;this.opts=o,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=n.bind(this),this._track=e,this._abortSignal=s,this.input=r,this.output=i}unsubscribe(){this._subscribers.clear()}setSubscriber(t,e){let r=this._subscribers.get(t)??[];r.push(e),this._subscribers.set(t,r)}on(t,e){this.setSubscriber(t,{cb:e})}once(t,e){this.setSubscriber(t,{cb:e,once:!0})}emit(t,...e){let r=this._subscribers.get(t)??[],i=[];for(let n of r)n.cb(...e),n.once&&i.push(()=>r.splice(r.indexOf(n),1));for(let n of i)n()}prompt(){return new Promise((t)=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),t(Re);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=Yi.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),Nt(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(G.cursor.show),this.output.off("resize",this.render),Nt(this.input,!1),t(this.value)}),this.once("cancel",()=>{this.output.write(G.cursor.show),this.output.off("resize",this.render),Nt(this.input,!1),t(Re)})})}_isActionKey(t,e){return t==="\t"}_shouldSubmit(t,e){return!0}_setValue(t){this.value=t,this.emit("value",this.value)}_setUserInput(t,e){this.userInput=t??"",this.emit("userInput",this.userInput),e&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(t,e){if(this._track&&e.name!=="return"&&(e.name&&this._isActionKey(t,e)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),e?.name&&(!this._track&&V.aliases.has(e.name)&&this.emit("cursor",V.aliases.get(e.name)),V.actions.has(e.name)&&this.emit("cursor",e.name)),t&&(t.toLowerCase()==="y"||t.toLowerCase()==="n")&&this.emit("confirm",t.toLowerCase()==="y"),this.emit("key",t,e),e?.name==="return"&&this._shouldSubmit(t,e)){if(this.opts.validate){let r=Rr(this.opts.validate,this.value);r&&(this.error=r instanceof Error?r.message:r,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}Ie([t,e?.name,e?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
12
+ `),Nt(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let t=Z(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
13
+ `).length-1;this.output.write(G.cursor.move(-999,t*-1))}render(){let t=Z(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(t!==this._prevFrame){if(this.state==="initial")this.output.write(G.cursor.hide);else{let e=Zi(this._prevFrame,t),r=Ee(this.output);if(this.restoreCursor(),e){let i=Math.max(0,e.numLinesAfter-r),n=Math.max(0,e.numLinesBefore-r),s=e.lines.find((o)=>o>=i);if(s===void 0){this._prevFrame=t;return}if(e.lines.length===1){this.output.write(G.cursor.move(0,s-n)),this.output.write(G.erase.lines(1));let o=t.split(`
14
+ `);this.output.write(o[s]),this._prevFrame=t,this.output.write(G.cursor.move(0,o.length-s-1));return}else if(e.lines.length>1){if(i<n)s=i;else{let u=s-n;u>0&&this.output.write(G.cursor.move(0,u))}this.output.write(G.erase.down());let o=t.split(`
15
+ `).slice(s);this.output.write(o.join(`
16
+ `)),this._prevFrame=t;return}}this.output.write(G.erase.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}}class Pe extends St{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(t){super(t,!1),this.value=!!t.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",(e)=>{this.output.write(G.cursor.move(0,-1)),this.value=e,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}class _e extends St{options;cursor=0;get _value(){return this.options[this.cursor]?.value}get _enabledOptions(){return this.options.filter((t)=>t.disabled!==!0)}toggleAll(){let t=this._enabledOptions,e=this.value!==void 0&&this.value.length===t.length;this.value=e?[]:t.map((r)=>r.value)}toggleInvert(){let t=this.value;if(!t)return;let e=this._enabledOptions.filter((r)=>!t.includes(r.value));this.value=e.map((r)=>r.value)}toggleValue(){this.value===void 0&&(this.value=[]);let t=this.value.includes(this._value);this.value=t?this.value.filter((e)=>e!==this._value):[...this.value,this._value]}constructor(t){super(t,!1),this.options=t.options,this.value=[...t.initialValues??[]];let e=Math.max(this.options.findIndex(({value:r})=>r===t.cursorAt),0);this.cursor=this.options[e]?.disabled?lt(e,1,this.options):e,this.on("key",(r,i)=>{i.name==="a"&&this.toggleAll(),i.name==="i"&&this.toggleInvert()}),this.on("cursor",(r)=>{switch(r){case"left":case"up":this.cursor=lt(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=lt(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}}var Sr=class extends St{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){let e=this._selectedValue;this.value=e===void 0?void 0:e.value}constructor(e){super(e,!1),this.options=e.options;let r=this.options.findIndex(({value:n})=>n===e.initialValue),i=r===-1?0:r;this.cursor=this.options[i]?.disabled?lt(i,1,this.options):i,this.changeValue(),this.on("cursor",(n)=>{switch(n){case"left":case"up":this.cursor=lt(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=lt(this.cursor,1,this.options);break}this.changeValue()})}};class Ae extends St{get userInputWithCursor(){if(this.state==="submit")return this.userInput;let t=this.userInput;if(this.cursor>=t.length)return`${this.userInput}\u2588`;let e=t.slice(0,this.cursor),r=t.slice(this.cursor,this.cursor+1),i=t.slice(this.cursor+1);return`${e}${zi("inverse",r)}${i}`}get cursor(){return this._cursor}constructor(t){super({...t,initialUserInput:t.initialUserInput??t.initialValue}),this.on("userInput",(e)=>{this._setValue(e)}),this.on("finalize",()=>{this.value||(this.value=t.defaultValue),this.value===void 0&&(this.value="")})}}import{styleText as c,stripVTControlCharacters as bo}from"util";import q from"process";var Et=sr(xe(),1);function tn(){if(q.platform!=="win32")return q.env.TERM!=="linux";return Boolean(q.env.CI)||Boolean(q.env.WT_SESSION)||Boolean(q.env.TERMINUS_SUBLIME)||q.env.ConEmuTask==="{cmd::Cmder}"||q.env.TERM_PROGRAM==="Terminus-Sublime"||q.env.TERM_PROGRAM==="vscode"||q.env.TERM==="xterm-256color"||q.env.TERM==="alacritty"||q.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var Te=tn(),en=()=>process.env.CI==="true";var E=(t,e)=>Te?t:e,rn=E("\u25C6","*"),Ar=E("\u25A0","x"),Tr=E("\u25B2","x"),Vt=E("\u25C7","o"),nn=E("\u250C","T"),C=E("\u2502","|"),at=E("\u2514","\u2014"),So=E("\u2510","T"),Io=E("\u2518","\u2014"),De=E("\u25CF",">"),Ut=E("\u25CB"," "),sn=E("\u25FB","[\u2022]"),Ir=E("\u25FC","[+]"),Er=E("\u25FB","[ ]"),Eo=E("\u25AA","\u2022"),Pr=E("\u2500","-"),on=E("\u256E","+"),an=E("\u251C","+"),un=E("\u256F","+"),ln=E("\u2570","+"),Po=E("\u256D","+"),cn=E("\u25CF","\u2022"),pn=E("\u25C6","*"),dn=E("\u25B2","!"),mn=E("\u25A0","x"),Gt=(t)=>{switch(t){case"initial":case"active":return c("cyan",rn);case"cancel":return c("red",Ar);case"error":return c("yellow",Tr);case"submit":return c("green",Vt)}},Dr=(t)=>{switch(t){case"initial":case"active":return c("cyan",C);case"cancel":return c("red",C);case"error":return c("yellow",C);case"submit":return c("green",C)}};function kr(t,e){let r=[`${e?`${c("cyan",C)} `:""}${t.join(" \u2022 ")}`];return e&&r.push(c("cyan",at)),r}var _r=(t,e,r,i,n,s=!1)=>{let o=e,u=0;if(s)for(let a=i-1;a>=r;a--){let l=t[a];if(l&&(o-=l.length),u++,o<=n)break}else for(let a=r;a<i;a++){let l=t[a];if(l&&(o-=l.length),u++,o<=n)break}return{lineCount:o,removals:u}},ke=({cursor:t,options:e,style:r,output:i=process.stdout,maxItems:n=Number.POSITIVE_INFINITY,columnPadding:s=0,rowPadding:o=4})=>{let u=Rt(i)-s,a=Ee(i),l=c("dim","..."),f=Math.max(a-o,0),h=Math.max(Math.min(n,f),5),d=0;t>=h-3&&(d=Math.max(Math.min(t-h+3,e.length-h),0));let g=h<e.length&&d>0,m=h<e.length&&d+h<e.length,v=Math.min(d+h,e.length),I=[],A=0;g&&A++,m&&A++;let x=d+(g?1:0),N=v-(m?1:0);for(let R=x;R<N;R++){let F=e[R],D=F?r(F,R===t):"",_=Z(D,u,{hard:!0,trim:!1}).split(`
17
+ `);I.push(_),A+=_.length}if(A>f){let R=0,F=0,D=A,_=t-x,L=f,X=()=>_r(I,D,0,_,L),H=()=>_r(I,D,_+1,I.length,L,!0);g?({lineCount:D,removals:R}=X(),D>L&&(m||(L-=1),{lineCount:D,removals:F}=H())):(m||(L-=1),{lineCount:D,removals:F}=H(),D>L&&(L-=1,{lineCount:D,removals:R}=X())),R>0&&(g=!0,I.splice(0,R)),F>0&&(m=!0,I.splice(I.length-F,F))}let T=[];g&&T.push(l);for(let R of I)for(let F of R)T.push(F);return m&&T.push(l),T};var Lr=(t)=>{let e=t.active??"Yes",r=t.inactive??"No";return new Pe({active:e,inactive:r,signal:t.signal,input:t.input,output:t.output,initialValue:t.initialValue??!0,render(){let i=t.withGuide??V.withGuide,n=`${Gt(this.state)} `,s=i?`${c("gray",C)} `:"",o=ot(t.output,t.message,s,n),u=`${i?`${c("gray",C)}
18
+ `:""}${o}
19
+ `,a=this.value?e:r;switch(this.state){case"submit":{let l=i?`${c("gray",C)} `:"";return`${u}${l}${c("dim",a)}`}case"cancel":{let l=i?`${c("gray",C)} `:"";return`${u}${l}${c(["strikethrough","dim"],a)}${i?`
20
+ ${c("gray",C)}`:""}`}default:{let l=i?`${c("cyan",C)} `:"",f=i?c("cyan",at):"";return`${u}${l}${this.value?`${c("green",De)} ${e}`:`${c("dim",Ut)} ${c("dim",e)}`}${t.vertical?i?`
21
+ ${c("cyan",C)} `:`
22
+ `:` ${c("dim","/")} `}${this.value?`${c("dim",Ut)} ${c("dim",r)}`:`${c("green",De)} ${r}`}
23
+ ${f}
24
+ `}}}}).prompt()};var jt=async(t,e)=>{let r={},i=Object.keys(t);for(let n of i){let s=t[n],o=await s({results:r})?.catch((u)=>{throw u});if(typeof e?.onCancel=="function"&&xt(o)){r[n]="canceled",e.onCancel({results:r});continue}r[n]=o}return r},hn=[`${c("dim","\u2191/\u2193")} to navigate`,`${c("dim","Space:")} select`,`${c("dim","Enter:")} confirm`],It=(t,e)=>t.split(`
25
+ `).map((r)=>e(r)).join(`
26
+ `),Fr=(t)=>{let e=(n,s)=>{let o=n.label??String(n.value);return s==="disabled"?`${c("gray",Er)} ${It(o,(u)=>c(["strikethrough","gray"],u))}${n.hint?` ${c("dim",`(${n.hint??"disabled"})`)}`:""}`:s==="active"?`${c("cyan",sn)} ${o}${n.hint?` ${c("dim",`(${n.hint})`)}`:""}`:s==="selected"?`${c("green",Ir)} ${It(o,(u)=>c("dim",u))}${n.hint?` ${c("dim",`(${n.hint})`)}`:""}`:s==="cancelled"?`${It(o,(u)=>c(["strikethrough","dim"],u))}`:s==="active-selected"?`${c("green",Ir)} ${o}${n.hint?` ${c("dim",`(${n.hint})`)}`:""}`:s==="submitted"?`${It(o,(u)=>c("dim",u))}`:`${c("dim",Er)} ${It(o,(u)=>c("dim",u))}`},r=t.required??!0,i=t.showInstructions??!0;return new _e({options:t.options,signal:t.signal,input:t.input,output:t.output,initialValues:t.initialValues,required:r,cursorAt:t.cursorAt,validate(n){if(r&&(n===void 0||n.length===0))return`Please select at least one option.
27
+ ${c("reset",c("dim",`Press ${c(["gray","bgWhite","inverse"]," space ")} to select, ${c("gray",c("bgWhite",c("inverse"," enter ")))} to submit`))}`},render(){let n=t.withGuide??V.withGuide,s=ot(t.output,t.message,n?`${Dr(this.state)} `:"",`${Gt(this.state)} `),o=`${n?`${c("gray",C)}
28
+ `:""}${s}
29
+ `,u=this.value??[],a=(l,f)=>{if(l.disabled)return e(l,"disabled");let h=u.includes(l.value);return f&&h?e(l,"active-selected"):h?e(l,"selected"):e(l,f?"active":"inactive")};switch(this.state){case"submit":{let l=this.options.filter(({value:h})=>u.includes(h)).map((h)=>e(h,"submitted")).join(c("dim",", "))||c("dim","none"),f=ot(t.output,l,n?`${c("gray",C)} `:"");return`${o}${f}`}case"cancel":{let l=this.options.filter(({value:h})=>u.includes(h)).map((h)=>e(h,"cancelled")).join(c("dim",", "));if(l.trim()==="")return`${o}${c("gray",C)}`;let f=ot(t.output,l,n?`${c("gray",C)} `:"");return`${o}${f}${n?`
30
+ ${c("gray",C)}`:""}`}case"error":{let l=n?`${c("yellow",C)} `:"",f=this.error.split(`
31
+ `).map((g,m)=>m===0?`${n?`${c("yellow",at)} `:""}${c("yellow",g)}`:` ${g}`).join(`
32
+ `),h=o.split(`
33
+ `).length,d=f.split(`
34
+ `).length+1;return`${o}${l}${ke({output:t.output,options:this.options,cursor:this.cursor,maxItems:t.maxItems,columnPadding:l.length,rowPadding:h+d,style:a}).join(`
35
+ ${l}`)}
36
+ ${f}
37
+ `}default:{let l=n?`${c("cyan",C)} `:"",f=o.split(`
38
+ `).length,h=i?kr(hn,n):n?[c("cyan",at)]:[],d=h.join(`
39
+ `),g=h.length+1;return`${o}${l}${ke({output:t.output,options:this.options,cursor:this.cursor,maxItems:t.maxItems,columnPadding:l.length,rowPadding:f+g,style:a}).join(`
40
+ ${l}`)}
29
41
  ${d}
30
- `}}}}).prompt()};var Wr=async(r,n)=>{let e={},o=Object.keys(r);for(let i of o){let t=r[i],a=await t({results:e})?.catch((s)=>{throw s});if(typeof n?.onCancel=="function"&&wr(a)){e[i]="canceled",n.onCancel({results:e});continue}e[i]=a}return e},Pi=[`${f("dim","\u2191/\u2193")} to navigate`,`${f("dim","Space:")} select`,`${f("dim","Enter:")} confirm`],Cr=(r,n)=>r.split(`
31
- `).map((e)=>n(e)).join(`
32
- `),Ge=(r)=>{let n=(i,t)=>{let a=i.label??String(i.value);return t==="disabled"?`${f("gray",Ie)} ${Cr(a,(s)=>f(["strikethrough","gray"],s))}${i.hint?` ${f("dim",`(${i.hint??"disabled"})`)}`:""}`:t==="active"?`${f("cyan",di)} ${a}${i.hint?` ${f("dim",`(${i.hint})`)}`:""}`:t==="selected"?`${f("green",De)} ${Cr(a,(s)=>f("dim",s))}${i.hint?` ${f("dim",`(${i.hint})`)}`:""}`:t==="cancelled"?`${Cr(a,(s)=>f(["strikethrough","dim"],s))}`:t==="active-selected"?`${f("green",De)} ${a}${i.hint?` ${f("dim",`(${i.hint})`)}`:""}`:t==="submitted"?`${Cr(a,(s)=>f("dim",s))}`:`${f("dim",Ie)} ${Cr(a,(s)=>f("dim",s))}`},e=r.required??!0,o=r.showInstructions??!0;return new En({options:r.options,signal:r.signal,input:r.input,output:r.output,initialValues:r.initialValues,required:e,cursorAt:r.cursorAt,validate(i){if(e&&(i===void 0||i.length===0))return`Please select at least one option.
33
- ${f("reset",f("dim",`Press ${f(["gray","bgWhite","inverse"]," space ")} to select, ${f("gray",f("bgWhite",f("inverse"," enter ")))} to submit`))}`},render(){let i=r.withGuide??M.withGuide,t=or(r.output,r.message,i?`${Ae(this.state)} `:"",`${zr(this.state)} `),a=`${i?`${f("gray",$)}
34
- `:""}${t}
35
- `,s=this.value??[],c=(u,d)=>{if(u.disabled)return n(u,"disabled");let g=s.includes(u.value);return d&&g?n(u,"active-selected"):g?n(u,"selected"):n(u,d?"active":"inactive")};switch(this.state){case"submit":{let u=this.options.filter(({value:g})=>s.includes(g)).map((g)=>n(g,"submitted")).join(f("dim",", "))||f("dim","none"),d=or(r.output,u,i?`${f("gray",$)} `:"");return`${a}${d}`}case"cancel":{let u=this.options.filter(({value:g})=>s.includes(g)).map((g)=>n(g,"cancelled")).join(f("dim",", "));if(u.trim()==="")return`${a}${f("gray",$)}`;let d=or(r.output,u,i?`${f("gray",$)} `:"");return`${a}${d}${i?`
36
- ${f("gray",$)}`:""}`}case"error":{let u=i?`${f("yellow",$)} `:"",d=this.error.split(`
37
- `).map((h,l)=>l===0?`${i?`${f("yellow",ir)} `:""}${f("yellow",h)}`:` ${h}`).join(`
38
- `),g=a.split(`
39
- `).length,p=d.split(`
40
- `).length+1;return`${a}${u}${An({output:r.output,options:this.options,cursor:this.cursor,maxItems:r.maxItems,columnPadding:u.length,rowPadding:g+p,style:c}).join(`
41
- ${u}`)}
42
- ${d}
43
- `}default:{let u=i?`${f("cyan",$)} `:"",d=a.split(`
44
- `).length,g=o?je(Pi,i):i?[f("cyan",ir)]:[],p=g.join(`
45
- `),h=g.length+1;return`${a}${u}${An({output:r.output,options:this.options,cursor:this.cursor,maxItems:r.maxItems,columnPadding:u.length,rowPadding:d+h,style:c}).join(`
46
- ${u}`)}
47
- ${p}
48
- `}}}}).prompt()};var v={message:(r=[],{symbol:n=f("gray",$),secondarySymbol:e=f("gray",$),output:o=process.stdout,spacing:i=1,withGuide:t}={})=>{let a=[],s=t??M.withGuide,c=s?e:"",u=s?`${n} `:"",d=s?`${e} `:"";for(let p=0;p<i;p++)a.push(c);let g=Array.isArray(r)?r:r.split(`
49
- `);if(g.length>0){let[p,...h]=g;p.length>0?a.push(`${u}${p}`):a.push(s?n:"");for(let l of h)l.length>0?a.push(`${d}${l}`):a.push(s?e:"")}o.write(`${a.join(`
42
+ `}}}}).prompt()};var w={message:(t=[],{symbol:e=c("gray",C),secondarySymbol:r=c("gray",C),output:i=process.stdout,spacing:n=1,withGuide:s}={})=>{let o=[],u=s??V.withGuide,a=u?r:"",l=u?`${e} `:"",f=u?`${r} `:"";for(let d=0;d<n;d++)o.push(a);let h=Array.isArray(t)?t:t.split(`
43
+ `);if(h.length>0){let[d,...g]=h;d.length>0?o.push(`${l}${d}`):o.push(u?e:"");for(let m of g)m.length>0?o.push(`${f}${m}`):o.push(u?r:"")}i.write(`${o.join(`
50
44
  `)}
51
- `)},info:(r,n)=>{v.message(r,{...n,symbol:f("blue",vi)})},success:(r,n)=>{v.message(r,{...n,symbol:f("green",Ci)})},step:(r,n)=>{v.message(r,{...n,symbol:f("green",qr)})},warn:(r,n)=>{v.message(r,{...n,symbol:f("yellow",$i)})},warning:(r,n)=>{v.warn(r,n)},error:(r,n)=>{v.message(r,{...n,symbol:f("red",yi)})}};var Yr=(r="",n)=>{let e=n?.output??process.stdout,o=n?.withGuide??M.withGuide?`${f("gray",li)} `:"";e.write(`${o}${r}
52
- `)},Jr=(r="",n)=>{let e=n?.output??process.stdout,o=n?.withGuide??M.withGuide?`${f("gray",$)}
53
- ${f("gray",ir)} `:"";e.write(`${o}${r}
45
+ `)},info:(t,e)=>{w.message(t,{...e,symbol:c("blue",cn)})},success:(t,e)=>{w.message(t,{...e,symbol:c("green",pn)})},step:(t,e)=>{w.message(t,{...e,symbol:c("green",Vt)})},warn:(t,e)=>{w.message(t,{...e,symbol:c("yellow",dn)})},warning:(t,e)=>{w.warn(t,e)},error:(t,e)=>{w.message(t,{...e,symbol:c("red",mn)})}};var Ht=(t="",e)=>{let r=e?.output??process.stdout,i=e?.withGuide??V.withGuide?`${c("gray",nn)} `:"";r.write(`${i}${t}
46
+ `)},Bt=(t="",e)=>{let r=e?.output??process.stdout,i=e?.withGuide??V.withGuide?`${c("gray",C)}
47
+ ${c("gray",at)} `:"";r.write(`${i}${t}
54
48
 
55
- `)};var Fi=(r)=>r,Ri=(r,n,e)=>{let o={hard:!0,trim:!1},i=V(r,n,o).split(`
56
- `),t=i.reduce((c,u)=>Math.max(Y(u),c),0),a=i.map(e).reduce((c,u)=>Math.max(Y(u),c),0),s=n-(a-t);return V(r,s,o)},lr=(r="",n="",e)=>{let o=e?.output??Z.stdout,i=e?.withGuide??M.withGuide,t=e?.format??Fi,a=["",...Ri(r,vr(o)-6,t).split(`
57
- `).map(t),""],s=Y(n),c=Math.max(a.reduce((p,h)=>{let l=Y(h);return l>p?l:p},0),s)+2,u=a.map((p)=>`${f("gray",$)} ${p}${" ".repeat(c-Y(p))}${f("gray",$)}`).join(`
58
- `),d=i?`${f("gray",$)}
59
- `:"",g=i?hi:wi;o.write(`${d}${f("green",qr)} ${f("reset",n)} ${f("gray",Ee.repeat(Math.max(c-s-1,1))+gi)}
49
+ `)};var fn=(t)=>t,gn=(t,e,r)=>{let i={hard:!0,trim:!1},n=Z(t,e,i).split(`
50
+ `),s=n.reduce((a,l)=>Math.max(B(l),a),0),o=n.map(r).reduce((a,l)=>Math.max(B(l),a),0),u=e-(o-s);return Z(t,u,i)},gt=(t="",e="",r)=>{let i=r?.output??q.stdout,n=r?.withGuide??V.withGuide,s=r?.format??fn,o=["",...gn(t,Rt(i)-6,s).split(`
51
+ `).map(s),""],u=B(e),a=Math.max(o.reduce((d,g)=>{let m=B(g);return m>d?m:d},0),u)+2,l=o.map((d)=>`${c("gray",C)} ${d}${" ".repeat(a-B(d))}${c("gray",C)}`).join(`
52
+ `),f=n?`${c("gray",C)}
53
+ `:"",h=n?an:ln;i.write(`${f}${c("green",Vt)} ${c("reset",e)} ${c("gray",Pr.repeat(Math.max(a-u-1,1))+on)}
54
+ ${l}
55
+ ${c("gray",h+Pr.repeat(a+2)+un)}
56
+ `)};var yn=(t)=>c("magenta",t),W=({indicator:t="dots",onCancel:e,output:r=process.stdout,cancelMessage:i,errorMessage:n,frames:s=Te?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],delay:o=Te?80:120,signal:u,...a}={})=>{let l=en(),f,h,d=!1,g=!1,m="",v,I=performance.now(),A=Rt(r),x=a?.styleFrame??yn,N=(k)=>{let K=k>1?n??V.messages.error:i??V.messages.cancel;g=k===1,d&&(Ct(K,k),g&&typeof e=="function"&&e())},T=()=>N(2),R=()=>N(1),F=()=>{process.on("uncaughtExceptionMonitor",T),process.on("unhandledRejection",T),process.on("SIGINT",R),process.on("SIGTERM",R),process.on("exit",N),u&&u.addEventListener("abort",R)},D=()=>{process.removeListener("uncaughtExceptionMonitor",T),process.removeListener("unhandledRejection",T),process.removeListener("SIGINT",R),process.removeListener("SIGTERM",R),process.removeListener("exit",N),u&&u.removeEventListener("abort",R)},_=()=>{if(v===void 0)return;l&&r.write(`
57
+ `);let k=Z(v,A,{hard:!0,trim:!1}).split(`
58
+ `);k.length>1&&r.write(Et.cursor.up(k.length-1)),r.write(Et.cursor.to(0)),r.write(Et.erase.down())},L=(k)=>k.replace(/\.+$/,""),X=(k)=>{let K=(performance.now()-k)/1000,et=Math.floor(K/60),rt=Math.floor(K%60);return et>0?`[${et}m ${rt}s]`:`[${rt}s]`},H=a.withGuide??V.withGuide,Lt=(k="")=>{d=!0,f=xr({output:r}),m=L(k),I=performance.now(),H&&r.write(`${c("gray",C)}
59
+ `);let K=0,et=0;F(),h=setInterval(()=>{if(l&&m===v)return;_(),v=m;let rt=x(s[K]),Ft;if(l)Ft=`${rt} ${m}...`;else if(t==="timer")Ft=`${rt} ${m} ${X(I)}`;else{let Si=".".repeat(Math.floor(et)).slice(0,3);Ft=`${rt} ${m}${Si}`}let Ri=Z(Ft,A,{hard:!0,trim:!1});r.write(Ri),K=K+1<s.length?K+1:0,et=et<4?et+0.125:0},o)},Ct=(k="",K=0,et=!1)=>{if(!d)return;d=!1,clearInterval(h),_();let rt=K===0?c("green",Vt):K===1?c("red",Ar):c("red",Tr);m=k??m,et||(t==="timer"?r.write(`${rt} ${m} ${X(I)}
60
+ `):r.write(`${rt} ${m}
61
+ `)),D(),f()};return{start:Lt,stop:(k="")=>Ct(k,0),message:(k="")=>{m=L(k??m)},cancel:(k="")=>Ct(k,1),error:(k="")=>Ct(k,2),clear:()=>Ct("",0,!0),get isCancelled(){return g}}},_o={light:E("\u2500","-"),heavy:E("\u2501","="),block:E("\u2588","#")};var $n=[`${c("dim","\u2191/\u2193")} to navigate`,`${c("dim","Enter:")} confirm`],Mt=(t,e)=>t.includes(`
62
+ `)?t.split(`
63
+ `).map((r)=>e(r)).join(`
64
+ `):e(t),Or=(t)=>{let e=(i,n)=>{if(i===void 0)return"";let s=i.label??String(i.value);switch(n){case"disabled":return`${c("gray",Ut)} ${Mt(s,(o)=>c("gray",o))}${i.hint?` ${c("dim",`(${i.hint??"disabled"})`)}`:""}`;case"selected":return`${Mt(s,(o)=>c("dim",o))}`;case"active":return`${c("green",De)} ${s}${i.hint?` ${c("dim",`(${i.hint})`)}`:""}`;case"cancelled":return`${Mt(s,(o)=>c(["strikethrough","dim"],o))}`;default:return`${c("dim",Ut)} ${Mt(s,(o)=>c("dim",o))}`}},r=t.showInstructions??!0;return new Sr({options:t.options,signal:t.signal,input:t.input,output:t.output,initialValue:t.initialValue,render(){let i=t.withGuide??V.withGuide,n=`${Gt(this.state)} `,s=`${Dr(this.state)} `,o=ot(t.output,t.message,s,n),u=`${i?`${c("gray",C)}
65
+ `:""}${o}
66
+ `;switch(this.state){case"submit":{let a=i?`${c("gray",C)} `:"",l=ot(t.output,e(this.options[this.cursor],"selected"),a);return`${u}${l}`}case"cancel":{let a=i?`${c("gray",C)} `:"",l=ot(t.output,e(this.options[this.cursor],"cancelled"),a);return`${u}${l}${i?`
67
+ ${c("gray",C)}`:""}`}default:{let a=i?`${c("cyan",C)} `:"",l=u.split(`
68
+ `).length,f=r?kr($n,i):i?[c("cyan",at)]:[],h=f.join(`
69
+ `),d=f.length+1;return`${u}${a}${ke({output:t.output,cursor:this.cursor,options:this.options,maxItems:t.maxItems,columnPadding:a.length,rowPadding:l+d,style:(g,m)=>e(g,g.disabled?"disabled":m?"active":"inactive")}).join(`
70
+ ${a}`)}
71
+ ${h}
72
+ `}}}}).prompt()};var Ao=`${c("gray",C)} `;var Nr=(t)=>new Ae({validate:t.validate,placeholder:t.placeholder,defaultValue:t.defaultValue,initialValue:t.initialValue,output:t.output,signal:t.signal,input:t.input,render(){let e=t?.withGuide??V.withGuide,r=`${`${e?`${c("gray",C)}
73
+ `:""}${Gt(this.state)} `}${t.message}
74
+ `,i=t.placeholder&&t.placeholder.length>0?c("inverse",t.placeholder[0])+c("dim",t.placeholder.slice(1)):c(["inverse","hidden"],"_"),n=this.userInput?this.userInputWithCursor:i,s=this.value??"";switch(this.state){case"error":{let o=this.error?` ${c("yellow",this.error)}`:"",u=e?`${c("yellow",C)} `:"",a=e?c("yellow",at):"";return`${r.trim()}
75
+ ${u}${n}
76
+ ${a}${o}
77
+ `}case"submit":{let o=s?` ${c("dim",s)}`:"",u=e?c("gray",C):"";return`${r}${u}${o}`}case"cancel":{let o=s?` ${c(["strikethrough","dim"],s)}`:"",u=e?c("gray",C):"";return`${r}${u}${o}${s.trim()?`
78
+ ${u}`:""}`}default:{let o=e?`${c("cyan",C)} `:"",u=e?c("cyan",at):"";return`${r}${o}${n}
60
79
  ${u}
61
- ${f("gray",g+Ee.repeat(c+2)+bi)}
62
- `)};var ki=(r)=>f("magenta",r),J=({indicator:r="dots",onCancel:n,output:e=process.stdout,cancelMessage:o,errorMessage:i,frames:t=Un?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],delay:a=Un?80:120,signal:s,...c}={})=>{let u=pi(),d,g,p=!1,h=!1,l="",b,F=performance.now(),I=vr(e),y=c?.styleFrame??ki,j=(U)=>{let K=U>1?i??M.messages.error:o??M.messages.cancel;h=U===1,p&&(br(K,U),h&&typeof n=="function"&&n())},E=()=>j(2),P=()=>j(1),A=()=>{process.on("uncaughtExceptionMonitor",E),process.on("unhandledRejection",E),process.on("SIGINT",P),process.on("SIGTERM",P),process.on("exit",j),s&&s.addEventListener("abort",P)},H=()=>{process.removeListener("uncaughtExceptionMonitor",E),process.removeListener("unhandledRejection",E),process.removeListener("SIGINT",P),process.removeListener("SIGTERM",P),process.removeListener("exit",j),s&&s.removeEventListener("abort",P)},L=()=>{if(b===void 0)return;u&&e.write(`
63
- `);let U=V(b,I,{hard:!0,trim:!1}).split(`
64
- `);U.length>1&&e.write($r.cursor.up(U.length-1)),e.write($r.cursor.to(0)),e.write($r.erase.down())},N=(U)=>U.replace(/\.+$/,""),X=(U)=>{let K=(performance.now()-U)/1000,S=Math.floor(K/60),B=Math.floor(K%60);return S>0?`[${S}m ${B}s]`:`[${B}s]`},W=c.withGuide??M.withGuide,Er=(U="")=>{p=!0,d=ye({output:e}),l=N(U),F=performance.now(),W&&e.write(`${f("gray",$)}
65
- `);let K=0,S=0;A(),g=setInterval(()=>{if(u&&l===b)return;L(),b=l;let B=y(t[K]),Hr;if(u)Hr=`${B} ${l}...`;else if(r==="timer")Hr=`${B} ${l} ${X(F)}`;else{let ko=".".repeat(Math.floor(S)).slice(0,3);Hr=`${B} ${l}${ko}`}let Ro=V(Hr,I,{hard:!0,trim:!1});e.write(Ro),K=K+1<t.length?K+1:0,S=S<4?S+0.125:0},a)},br=(U="",K=0,S=!1)=>{if(!p)return;p=!1,clearInterval(g),L();let B=K===0?f("green",qr):K===1?f("red",Ue):f("red",Ne);l=U??l,S||(r==="timer"?e.write(`${B} ${l} ${X(F)}
66
- `):e.write(`${B} ${l}
67
- `)),H(),d()};return{start:Er,stop:(U="")=>br(U,0),message:(U="")=>{l=N(U??l)},cancel:(U="")=>br(U,1),error:(U="")=>br(U,2),clear:()=>br("",0,!0),get isCancelled(){return h}}},wa={light:R("\u2500","-"),heavy:R("\u2501","="),block:R("\u2588","#")};var Li=[`${f("dim","\u2191/\u2193")} to navigate`,`${f("dim","Enter:")} confirm`],Gr=(r,n)=>r.includes(`
68
- `)?r.split(`
69
- `).map((e)=>n(e)).join(`
70
- `):n(r),xe=(r)=>{let n=(o,i)=>{if(o===void 0)return"";let t=o.label??String(o.value);switch(i){case"disabled":return`${f("gray",xr)} ${Gr(t,(a)=>f("gray",a))}${o.hint?` ${f("dim",`(${o.hint??"disabled"})`)}`:""}`;case"selected":return`${Gr(t,(a)=>f("dim",a))}`;case"active":return`${f("green",Nn)} ${t}${o.hint?` ${f("dim",`(${o.hint})`)}`:""}`;case"cancelled":return`${Gr(t,(a)=>f(["strikethrough","dim"],a))}`;default:return`${f("dim",xr)} ${Gr(t,(a)=>f("dim",a))}`}},e=r.showInstructions??!0;return new Le({options:r.options,signal:r.signal,input:r.input,output:r.output,initialValue:r.initialValue,render(){let o=r.withGuide??M.withGuide,i=`${zr(this.state)} `,t=`${Ae(this.state)} `,a=or(r.output,r.message,t,i),s=`${o?`${f("gray",$)}
71
- `:""}${a}
72
- `;switch(this.state){case"submit":{let c=o?`${f("gray",$)} `:"",u=or(r.output,n(this.options[this.cursor],"selected"),c);return`${s}${u}`}case"cancel":{let c=o?`${f("gray",$)} `:"",u=or(r.output,n(this.options[this.cursor],"cancelled"),c);return`${s}${u}${o?`
73
- ${f("gray",$)}`:""}`}default:{let c=o?`${f("cyan",$)} `:"",u=s.split(`
74
- `).length,d=e?je(Li,o):o?[f("cyan",ir)]:[],g=d.join(`
75
- `),p=d.length+1;return`${s}${c}${An({output:r.output,cursor:this.cursor,options:this.options,maxItems:r.maxItems,columnPadding:c.length,rowPadding:u+p,style:(h,l)=>n(h,h.disabled?"disabled":l?"active":"inactive")}).join(`
76
- ${c}`)}
77
- ${g}
78
- `}}}}).prompt()};var va=`${f("gray",$)} `;var qe=(r)=>new Hn({validate:r.validate,placeholder:r.placeholder,defaultValue:r.defaultValue,initialValue:r.initialValue,output:r.output,signal:r.signal,input:r.input,render(){let n=r?.withGuide??M.withGuide,e=`${`${n?`${f("gray",$)}
79
- `:""}${zr(this.state)} `}${r.message}
80
- `,o=r.placeholder&&r.placeholder.length>0?f("inverse",r.placeholder[0])+f("dim",r.placeholder.slice(1)):f(["inverse","hidden"],"_"),i=this.userInput?this.userInputWithCursor:o,t=this.value??"";switch(this.state){case"error":{let a=this.error?` ${f("yellow",this.error)}`:"",s=n?`${f("yellow",$)} `:"",c=n?f("yellow",ir):"";return`${e.trim()}
81
- ${s}${i}
82
- ${c}${a}
83
- `}case"submit":{let a=t?` ${f("dim",t)}`:"",s=n?f("gray",$):"";return`${e}${s}${a}`}case"cancel":{let a=t?` ${f(["strikethrough","dim"],t)}`:"",s=n?f("gray",$):"";return`${e}${s}${a}${t.trim()?`
84
- ${s}`:""}`}default:{let a=n?`${f("cyan",$)} `:"",s=n?f("cyan",ir):"";return`${e}${a}${i}
85
- ${s}
86
- `}}}}).prompt();var Ii=!process.env.NO_COLOR&&(process.env.FORCE_COLOR||(process.stdout?.isTTY??!1)),Ye=["black","blue","cyan","gray","green","magenta","red","white","yellow"],Ei=["bold","dim","italic","underline","reset"],Je={bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",reset:"\x1B[0m",underline:"\x1B[4m"},Hi={black:"\x1B[30m",blue:"\x1B[34m",cyan:"\x1B[36m",gray:"\x1B[90m",green:"\x1B[32m",magenta:"\x1B[35m",red:"\x1B[31m",white:"\x1B[37m",yellow:"\x1B[33m"},Ui={black:"\x1B[40m",blue:"\x1B[44m",cyan:"\x1B[46m",gray:"\x1B[100m",green:"\x1B[42m",magenta:"\x1B[45m",red:"\x1B[41m",white:"\x1B[47m",yellow:"\x1B[43m"},ze={"\x1B[30m":"\x1B[90m","\x1B[31m":"\x1B[91m","\x1B[32m":"\x1B[92m","\x1B[33m":"\x1B[93m","\x1B[34m":"\x1B[94m","\x1B[35m":"\x1B[95m","\x1B[36m":"\x1B[96m","\x1B[37m":"\x1B[97m"};function Kr(r){return(n)=>Ii?`${r}${n}${Je.reset}`:n}function Ni(r){for(let n=0;n<r.length;n++){let e=r.charCodeAt(n);if(e<32&&e!==27)return!1}return!0}function We({bright:r=!1,color:n}){let e=Bun.color(n,"ansi"),o=typeof e==="string"&&e.length>0&&Ni(e)?e:Hi[n];if(!o)return"";return r&&o in ze?ze[o]:o}var Ai=Ye.reduce((r,n)=>{let e=We({color:n});if(e)r[n]=Kr(e);let o=We({bright:!0,color:n});if(o)r[`${n}Bright`]=Kr(o);return r},{}),ji=Ei.reduce((r,n)=>{return r[n]=Kr(Je[n]),r},{}),Mi=Ye.reduce((r,n)=>{let e=Ui[n];if(e){let o=`bg${n.charAt(0).toUpperCase()}${n.slice(1)}`;r[o]=Kr(e)}return r},{}),m={...Ai,...ji,...Mi};function Zr(r){if(wr(r))throw new Q;return r}function xi(r){return r.map((n)=>n.key?`${m.bold(n.key)} ${m.dim(n.text)}`:m.dim(n.text)).join(m.dim(" \xB7 "))}function Or(r){v.info(xi(r))}var Qr={confirm:[{key:"Enter",text:"confirm"},{key:"Esc",text:"cancel"}],multiselect:[{key:"\u2191\u2193",text:"navigate"},{key:"Space",text:"toggle"},{key:"a",text:"all"},{key:"Enter",text:"confirm"},{key:"Esc",text:"cancel"}],select:[{key:"\u2191\u2193",text:"navigate"},{key:"Enter",text:"select"},{key:"Esc",text:"cancel"}],text:[{key:"Enter",text:"submit"},{key:"Esc",text:"cancel"}]};async function sr(r){return Or(Qr.confirm),Zr(await Me(r))}async function rr(r){return Or(Qr.text),Zr(await qe(r))}async function cr(r){return Or(Qr.select),Zr(await xe({showInstructions:!1,...r}))}async function ur(r){return Or(Qr.multiselect),Zr(await Ge({showInstructions:!1,...r}))}function jn(r){return r==null?[]:Array.isArray(r)?r:[r]}function qi(r,n,e,o){var i,t=r[n],a=~o.string.indexOf(n)?e==null||e===!0?"":String(e):typeof e==="boolean"?e:~o.boolean.indexOf(n)?e==="false"?!1:e==="true"||(r._.push((i=+e,i*0===0)?i:e),!!e):(i=+e,i*0===0)?i:e;r[n]=t==null?a:Array.isArray(t)?t.concat(a):[t,a]}function Xr(r,n){r=r||[],n=n||{};var e,o,i,t,a,s={_:[]},c=0,u=0,d=0,g=r.length;let p=n.alias!==void 0,h=n.unknown!==void 0,l=n.default!==void 0;if(n.alias=n.alias||{},n.string=jn(n.string),n.boolean=jn(n.boolean),p)for(e in n.alias){o=n.alias[e]=jn(n.alias[e]);for(c=0;c<o.length;c++)(n.alias[o[c]]=o.concat(e)).splice(c,1)}for(c=n.boolean.length;c-- >0;){o=n.alias[n.boolean[c]]||[];for(u=o.length;u-- >0;)n.boolean.push(o[u])}for(c=n.string.length;c-- >0;){o=n.alias[n.string[c]]||[];for(u=o.length;u-- >0;)n.string.push(o[u])}if(l){for(e in n.default)if(t=typeof n.default[e],o=n.alias[e]=n.alias[e]||[],n[t]!==void 0){n[t].push(e);for(c=0;c<o.length;c++)n[t].push(o[c])}}let b=h?Object.keys(n.alias):[];for(c=0;c<g;c++){if(i=r[c],i==="--"){s._=s._.concat(r.slice(++c));break}for(u=0;u<i.length;u++)if(i.charCodeAt(u)!==45)break;if(u===0)s._.push(i);else if(i.substring(u,u+3)==="no-"){if(t=i.substring(u+3),h&&!~b.indexOf(t))return n.unknown(i);s[t]=!1}else{for(d=u+1;d<i.length;d++)if(i.charCodeAt(d)===61)break;t=i.substring(u,d),a=i.substring(++d)||(c+1===g||(""+r[c+1]).charCodeAt(0)===45||r[++c]),o=u===2?[t]:t;for(d=0;d<o.length;d++){if(t=o[d],h&&!~b.indexOf(t))return n.unknown("-".repeat(u)+t);qi(s,t,d+1<o.length||a,n)}}}if(l){for(e in n.default)if(s[e]===void 0)s[e]=n.default[e]}if(p)for(e in s){o=n.alias[e]||[];while(o.length>0)s[o.shift()]=s[e]}return s}function Vr(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function Ke(r){let n={alias:{},boolean:[],default:{},string:[]};for(let[e,o]of Object.entries(r)){if(o.type==="boolean")n.boolean.push(e);else n.string.push(e);if(o.alias)n.alias[o.alias]=e;let i=Vr(e);if(i!==e)n.alias[i]=e;if(o.default!==void 0)n.default[e]=o.default}return n}function Ze(r,n){for(let[o,i]of Object.entries(r))if(Array.isArray(i))throw new w(`--${Vr(o)} can only be provided once`);let e={...r};for(let[o,i]of Object.entries(n)){if(i.type!=="number")continue;let t=r[o];if(t===void 0||typeof t==="boolean")continue;let a=Number(t);if(Number.isNaN(a))throw Error(`Invalid number for --${o}: "${t}"`);e[o]=a}return e}function Oe(r,n){let e=Ke(n),o=Xr(r,e),i=o._[0],t=i?r.indexOf(i):-1,{_:a,...s}=o,c=Ze(s,n);return{command:i,flags:c,restArgs:t>=0?r.slice(t+1):[]}}function Mn(r,n={}){let e=Ke(n),o=Xr(r,e),{_:i,...t}=o;return{args:Ze(t,n),rawPositionals:i}}function Gn(r,n){let e={},o=Object.entries(n);for(let[i,[t,a]]of o.entries())e[t]=a.variadic?r.slice(i):r[i];return e}function Qe(r,n){for(let[e,o]of Object.entries(n)){if(!o.required)continue;let i=r[e];if(Array.isArray(i)?i.length===0:!i)return`Missing required argument: <${e}${o.variadic?"...":""}>`}return null}var zi=(r)=>r,C={arg:m.magenta,cmd:m.cyan,default:m.bold,desc:zi,flag:m.green,header:(r)=>m.bold(m.yellow(r)),hint:m.dim,name:(r)=>m.bold(m.cyan(r)),placeholder:m.magenta};class xn{metadata;commands;globalArgs;constructor(r,n,e){this.metadata=r;this.commands=n;this.globalArgs=e}version(){return`${C.name(this.metadata.name)} ${C.hint(this.metadata.version??"0.0.0")}`}global(){let r=[],{name:n,bin:e,version:o,description:i}=this.metadata;if(r.push(`${C.name(n)}${o?` ${C.hint(`v${o}`)}`:""}`),i)r.push(C.desc(i));r.push(""),r.push(C.header("Usage:")),r.push(` ${C.cmd(e)} ${C.placeholder("[command]")} ${C.placeholder("[options]")}`),r.push(""),r.push(C.header("Commands:"));let t=Array.from(this.commands.values()).map((a)=>[` ${C.cmd(a.name)}`,C.desc(a.description)]);return r.push(...this.formatColumns(t)),r.push(""),r.push(C.header("Options:")),r.push(...this.formatArgDefs(this.globalArgs)),r.push(""),r.push(`${C.hint("Run")} ${C.cmd(`${e} <command> --help`)} ${C.hint("for command details.")}`),r.join(`
87
- `).trimEnd()}command(r,n){let e=[],o=n??this.metadata.bin,i=`${o} ${r.name}`,t=`${C.cmd(o)} ${C.cmd(r.name)}`;e.push(C.name(i)),e.push(C.desc(r.description)),e.push(""),e.push(C.header("Usage:"));let a=this.formatPositionalUsage(r.positionals);if(r.hasSubcommands())e.push(` ${t} ${C.placeholder("<subcommand>")} ${C.placeholder("[options]")}`);else{let u=[t];if(a)u.push(a);u.push(C.placeholder("[options]")),e.push(` ${u.join(" ")}`)}if(r.prompts&&Object.keys(r.positionals).length>0)e.push(` ${C.hint("Omit positional arguments to run interactively.")}`);if(e.push(""),r.hasSubcommands()){e.push(C.header("Subcommands:"));let u=r.getSubcommands().map((d)=>[` ${C.cmd(d.name)}`,C.desc(d.description)]);e.push(...this.formatColumns(u)),e.push("")}if(Object.entries(r.positionals).length>0)e.push(C.header("Arguments:")),e.push(...this.formatPositionalDefs(r.positionals)),e.push("");if(Object.entries(r.args).length>0)e.push(C.header("Options:")),e.push(...this.formatArgDefs(r.args));return e.join(`
88
- `).trimEnd()}formatPositionalUsage(r){return Object.entries(r).map(([n,e])=>{let o=e.variadic?`${n}...`:n;return e.required?C.arg(`<${o}>`):C.arg(`[${o}]`)}).join(" ")}formatPositionalDefs(r){let n=Object.entries(r).map(([e,o])=>{let i=o.variadic?`${e}...`:e,t=C.desc(o.description??""),a=o.required?"":C.hint(" (optional)");return[` ${C.arg(i)}`,`${t}${a}`]});return this.formatColumns(n)}formatArgDefs(r){let n=[];for(let[e,o]of Object.entries(r)){let i=o.alias?`${C.flag(`-${o.alias}`)}, `:" ",t=o.type==="boolean"?"":` ${C.placeholder(`<${o.type==="number"?"number":"value"}>`)}`,a=`${i}${C.flag(`--${Vr(e)}`)}${t}`,s=C.desc(o.description??""),c=this.formatDefault(o),u=c===void 0?"":` (default: ${C.default(c)})`;n.push([` ${a}`,`${s}${u}`])}return this.formatColumns(n)}formatDefault(r){if(typeof r.displayDefault==="string")return r.displayDefault;if(r.default===void 0)return;if(r.type==="boolean"&&r.default===!1)return;if(r.type==="string")return`"${r.default}"`;return String(r.default)}formatColumns(r){if(r.length===0)return[];let n=Math.max(...r.map(([o])=>this.stripAnsi(o).length)),e=2;return r.map(([o,i])=>{let t=n-this.stripAnsi(o).length+e;return`${o}${" ".repeat(t)}${i}`})}stripAnsi(r){return r.replace(/\x1b\[[0-9;]*m/g,"")}}var nr=new Uint32Array(65536),Wi=(r,n)=>{let e=r.length,o=n.length,i=1<<e-1,t=-1,a=0,s=e,c=e;while(c--)nr[r.charCodeAt(c)]|=1<<c;for(c=0;c<o;c++){let u=nr[n.charCodeAt(c)],d=u|a;if(u|=(u&t)+t^t,a|=~(u|t),t&=u,a&i)s++;if(t&i)s--;a=a<<1|1,t=t<<1|~(d|a),a&=d}c=e;while(c--)nr[r.charCodeAt(c)]=0;return s},Yi=(r,n)=>{let e=n.length,o=r.length,i=[],t=[],a=Math.ceil(e/32),s=Math.ceil(o/32);for(let l=0;l<a;l++)t[l]=-1,i[l]=0;let c=0;for(;c<s-1;c++){let l=0,b=-1,F=c*32,I=Math.min(32,o)+F;for(let y=F;y<I;y++)nr[r.charCodeAt(y)]|=1<<y;for(let y=0;y<e;y++){let j=nr[n.charCodeAt(y)],E=t[y/32|0]>>>y&1,P=i[y/32|0]>>>y&1,A=j|l,H=((j|P)&b)+b^b|j|P,L=l|~(H|b),N=b&H;if(L>>>31^E)t[y/32|0]^=1<<y;if(N>>>31^P)i[y/32|0]^=1<<y;L=L<<1|E,N=N<<1|P,b=N|~(A|L),l=L&A}for(let y=F;y<I;y++)nr[r.charCodeAt(y)]=0}let u=0,d=-1,g=c*32,p=Math.min(32,o-g)+g;for(let l=g;l<p;l++)nr[r.charCodeAt(l)]|=1<<l;let h=o;for(let l=0;l<e;l++){let b=nr[n.charCodeAt(l)],F=t[l/32|0]>>>l&1,I=i[l/32|0]>>>l&1,y=b|u,j=((b|I)&d)+d^d|b|I,E=u|~(j|d),P=d&j;if(h+=E>>>o-1&1,h-=P>>>o-1&1,E>>>31^F)t[l/32|0]^=1<<l;if(P>>>31^I)i[l/32|0]^=1<<l;E=E<<1|F,P=P<<1|I,d=P|~(y|E),u=E&y}for(let l=g;l<p;l++)nr[r.charCodeAt(l)]=0;return h},Ji=(r,n)=>{if(r.length<n.length){let e=n;n=r,r=e}if(n.length===0)return r.length;if(r.length<=32)return Wi(r,n);return Yi(r,n)},Xe=(r,n)=>{let e=1/0,o=0;for(let i=0;i<n.length;i++){let t=Ji(r,n[i]);if(t<e)e=t,o=i}return n[o]};function Sr(r,n,e,o){let i=Xe(n,e);if(console.error(m.red(`Unknown ${r}: ${n}`)),i)console.error(m.yellow(`Did you mean "${i}"?`));console.error(`
89
- Run "${o} --help" for usage.`),process.exit(1)}function yr(r,n){let e=(i)=>i&&typeof i==="object";if(!e(r)||!e(n))return n;let o={...r};for(let i of Object.keys(n)){let t=o[i],a=n[i];if(Array.isArray(t)&&Array.isArray(a))o[i]=[...a];else if(e(t)&&e(a))o[i]=yr(t,a);else o[i]=a}return o}var qn="__exit__";class dr{command;env;prefix;options;constructor(r,n,e,o={}){this.command=r;this.env=n;this.prefix=e;this.options=o}get commandPath(){return this.prefix?`${this.prefix} ${this.command.name}`:this.command.name}async route(r,n){if(n)await this.routeInteractive();else await this.routeDirect(r)}async routeDirect(r){let[n,...e]=r;if(n&&this.command.hasSubcommands()){let o=this.command.getSubcommand(n);if(o){await this.handleSubcommandRoute(o,e);return}if(!n.startsWith("-")){this.handleUnknownSubcommand(n);return}}await this.executeCommand(r)}handleUnknownSubcommand(r){let n=this.command.getSubcommands().map((e)=>e.name);Sr("subcommand",r,n,this.commandPath)}async handleSubcommandRoute(r,n){await new dr(r,this.env,this.commandPath).route(n,!1)}async executeCommand(r){if(this.isHelpRequest(r)){this.printHelp(this.command);return}if(this.command.hasSubcommands()&&!this.command.execute){this.printHelp(this.command);return}if(!this.command.execute)return;let{args:e,rawPositionals:o}=Mn(r,this.command.args),i=Gn(o,this.command.positionals),t=Qe(i,this.command.positionals);if(t)v.error(t),console.error(`
90
- Run "${this.commandPath} --help" for usage.`),process.exit(1);let a=this.command.prompts&&o.length===0,s=this.buildContext(i,e,a);await this.command.execute(s)}async routeInteractive(){if(!this.command.hasSubcommands()){await this.executeInteractive();return}await this.runSubcommandMenu()}async executeInteractive(){let{args:r}=Mn([],this.command.args),n=Gn([],this.command.positionals),e=this.buildContext(n,r,!0);await this.command.execute?.(e)}async runSubcommandMenu(){while(!0){let r=await this.promptSubcommandSelectionOrBack();if(r===null)return;if(r===qn){this.options.onExit?.();return}let n=this.command.getSubcommand(r);if(n)await this.executeSubcommand(n)}}async promptSubcommandSelectionOrBack(){try{return await this.promptSubcommandSelection()}catch(r){if(r instanceof Q){if(this.options.isRoot)this.options.onExit?.();return null}throw r}}async executeSubcommand(r){try{await new dr(r,this.env,this.commandPath).route([],!0)}catch(n){if(n instanceof Q)return;if(n instanceof w){if(v.warn(m.yellow(n.message)),n.hint)v.info(m.dim(n.hint));return}throw n}}promptSubcommandSelection(){let{isRoot:r}=this.options,n=r?{hint:this.env.cli.exitHint,label:this.env.cli.exitLabel??"Exit",value:qn}:{hint:"Return to previous menu",label:"Back",value:qn};return cr({message:r?this.env.cli.promptMessage??"Select:":`${this.command.name}:`,options:[...this.command.getSubcommands().map((e)=>({hint:e.description,label:e.name,value:e.name})),n]})}buildContext(r,n,e){return{...this.env,args:n,interactive:e,positionals:r}}isHelpRequest(r){let n=r.indexOf("--"),e=n<0?r:r.slice(0,n);return e.includes("--help")||e.includes("-h")}printHelp(r){let n=r===this.command?this.prefix:this.commandPath;console.log(this.env.formatHelp(r,n))}}var Ki={clearOnStart:!0,exitHint:"Close the CLI",exitLabel:"Exit",goodbyeMessage:"Goodbye!",name:"CLI",promptMessage:"What would you like to do?"},Zi=4;class zn{commands=new Map;metadata;configManager;help;bin;globalArgs={help:{alias:"h",description:"Show help",type:"boolean"},interactive:{alias:"i",description:"Open interactive mode",type:"boolean"},version:{alias:"v",description:"Show version",type:"boolean"}};constructor(r,n){this.configManager=r,this.metadata={...Ki,...n},this.bin=this.metadata.bin??this.metadata.name,this.init(),this.help=new xn({bin:this.bin,description:this.metadata.description,name:this.metadata.name,version:this.metadata.version},this.commands,this.globalArgs)}registerCommands(r){for(let n of r)n.init?.(),this.commands.set(n.name,n)}async run(r=process.argv.slice(2)){try{let{command:n,flags:e,restArgs:o}=Oe(r,this.globalArgs);if(e.version&&!n)return console.log(this.help.version());if(e.interactive&&!n)return this.runInteractive();if(!n)return console.log(this.help.global());if(n==="help")return this.printHelpFor(o[0]);await this.runDirect(n,o,!!e.help)}catch(n){this.handleError(n)}}printHelpFor(r){if(!r)return console.log(this.help.global());let n=this.commands.get(r);if(!n)return this.handleUnknownCommand(r);console.log(this.help.command(n))}async runInteractive(){this.showIntro();let r=this.createVirtualRootCommand(),n={cli:this.metadata,config:this.configManager,formatHelp:this.help.command.bind(this.help)},e=new dr(r,n,this.bin,{isRoot:!0,onExit:()=>this.exit()});try{await e.route([],!0)}catch(o){this.handleError(o)}}createVirtualRootCommand(){return{description:this.metadata.description,getSubcommand:(r)=>this.commands.get(r),getSubcommands:()=>Array.from(this.commands.values()),hasSubcommands:()=>!0,name:this.metadata.name}}exit(){Jr(this.metadata.goodbyeMessage),process.exit(0)}async runDirect(r,n,e){let o=this.commands.get(r);if(!o)return this.handleUnknownCommand(r);let i=n.length>0&&!n[0]?.startsWith("-");if(e&&!i)return console.log(this.help.command(o));try{let t={cli:this.metadata,config:this.configManager,formatHelp:this.help.command.bind(this.help)};await new dr(o,t,this.bin).route(n,!1)}catch(t){this.handleError(t)}}showIntro(){if(this.metadata.clearOnStart)console.clear();let r=this.metadata.version?` v${this.metadata.version}`:"";Yr(`${m.bgCyan(m.black(` ${this.metadata.name}${r} `))}`)}handleUnknownCommand(r){let n=Array.from(this.commands.keys());Sr("command",r,n,this.bin)}handleError(r){if(this.metadata.onError?.(r))return;if(r instanceof Q)process.exit(0);if(r instanceof w){if(v.warn(m.yellow(r.message)),r.hint)v.info(m.dim(r.hint));this.logErrorCauses(r),process.exit(r.exitCode)}if(r instanceof Error)v.error(m.red(r.message)),this.logErrorCauses(r),process.exit(1);console.error(m.red("Error:"),r),process.exit(1)}logErrorCauses(r,n=0){if(n>=Zi)return;let e=[...r instanceof AggregateError?r.errors:[],...r.cause!==void 0?[r.cause]:[]];for(let o of e){if(v.info(m.dim(`caused by: ${o instanceof Error?o.message:String(o)}`)),o instanceof w&&o.hint)v.info(m.dim(` ${o.hint}`));if(o instanceof Error)this.logErrorCauses(o,n+1)}}}class Pr{args={};positionals={};prompts=!1;subcommands=new Map;registerSubcommands(r){for(let n of r)n.init?.(),this.subcommands.set(n.name,n)}hasSubcommands(){return this.subcommands.size>0}getSubcommand(r){return this.subcommands.get(r)}getSubcommands(){return Array.from(this.subcommands.values())}}function tr(r){return r}function G(r){return r}import gr from"fs";import Ve from"path";class Wn{config;configPath;defaultConfig;constructor(r,n){this.configPath=Ve.resolve(r),this.defaultConfig=n,this.config=this.loadConfig()}get path(){return this.configPath}get(r){return this.config[r]}set(r,n){this.config[r]=n,this.save()}delete(r){delete this.config[r],this.save()}exists(){return gr.existsSync(this.configPath)}getAll(){return yr({},this.config)}save(r){if(r)this.config={...r};this.ensureDirectoryExists();try{gr.writeFileSync(this.configPath,JSON.stringify(this.config,null,2))}catch(n){throw Error(`Failed to save config to ${this.configPath}`,{cause:n})}}ensureDirectoryExists(){let r=Ve.dirname(this.configPath);if(!gr.existsSync(r))try{gr.mkdirSync(r,{recursive:!0})}catch(n){throw Error(`Failed to create config directory at ${r}`,{cause:n})}}loadConfig(){if(!gr.existsSync(this.configPath))return{...this.defaultConfig};try{let r=gr.readFileSync(this.configPath,"utf-8"),n=JSON.parse(r);return yr({...this.defaultConfig},n)}catch{return console.warn(`Config file corrupted at ${this.configPath}. Using defaults.`),{...this.defaultConfig}}}}var Se="0.9.2";class k extends Pr{}var Br="hydra";var Be=".hydra/config.json",fr=".hydra/shared",Fr=".hydra/runners",Rr="default",_e={profiles:{}},Te=!1,ro=24,_r=7,no=["logs","shared"];import{existsSync as Dr}from"fs";import{cp as Ti,link as rt,mkdir as Kn,readdir as so,readFile as Zn,readlink as nt,rm as On,symlink as et,unlink as co,writeFile as ot}from"fs/promises";import{join as D,resolve as nn}from"path";var Qi=new Set(["github.com","www.github.com"]);var eo=/\.git$/;function pr(r){let n;try{n=new URL(r)}catch{throw Error(`Invalid GitHub URL: ${r}`)}if(n.protocol!=="https:"&&n.protocol!=="http:")throw Error(`Invalid GitHub URL (expected http(s)): ${r}`);if(!Qi.has(n.hostname))throw Error(`Invalid GitHub URL (host must be github.com): ${r}`);let e=n.pathname.split("/").filter(Boolean);if(e.length===1){let o=e[0]?.replace(eo,"");if(!o)throw Error(`Invalid GitHub URL: ${r}`);return{kind:"org",org:o}}if(e.length===2){let o=e[0],i=e[1]?.replace(eo,"");if(!o||!i)throw Error(`Invalid GitHub URL: ${r}`);return{kind:"repo",owner:o,repo:i}}throw Error(`Invalid GitHub URL (expected github.com/<owner>/<repo> or github.com/<org>): ${r}`)}function Tr(r){return r.kind==="repo"?`${r.owner}/${r.repo}`:r.org}import{existsSync as Xi}from"fs";import{readdir as Vi,stat as Si}from"fs/promises";import{join as Bi}from"path";var kr="_diag",oo={runner:/^Runner_.+\.log$/,worker:/^Worker_.+\.log$/},io=1024,to=["B","KB","MB","GB"],_i=1;function ao(r){if(oo.worker.test(r))return"worker";if(oo.runner.test(r))return"runner";return null}function rn(r){return[...r].sort((n,e)=>e.mtime.getTime()-n.mtime.getTime())}async function Lr(r){if(!Xi(r))return[];let n=await Vi(r,{withFileTypes:!0}),e=[];for(let o of n){if(!o.isFile())continue;let i=ao(o.name);if(!i)continue;let t=Bi(r,o.name),a=await Si(t);e.push({mtime:a.mtime,name:o.name,path:t,size:a.size,type:i})}return rn(e)}function Yn(r,n){let e=r.find((i)=>i.type===n);if(e)return{fallback:!1,file:e};let o=r[0];return o?{fallback:!0,file:o}:null}function Jn(r,n){if(n<=0)return"";let e=r.endsWith(`
91
- `)?r.slice(0,-1):r;if(e==="")return"";return e.split(`
92
- `).slice(-n).join(`
93
- `)}function mr(r){let n=r,e=0;while(n>=io&&e<to.length-1)n/=io,e++;return`${e===0?String(n):n.toFixed(_i)} ${to[e]??"B"}`}var uo="actions/runner",it={linux:"linux-x64",osx:"osx-arm64",windows:"win-x64"},fo=["bin"],po=["externals"];class en{profile;sharedPath=null;constructor(r){this.profile=r}async download(){let r=it[this.profile.os],n=await this.getLatestVersion(),e=D(fr,"github",n);if(Dr(e))return this.sharedPath=e,{path:e,version:n};await Kn(e,{recursive:!0});let o=`actions-runner-${r}-${n}.tar.gz`,i=D(e,o),t=`https://github.com/${uo}/releases/download/v${n}/${o}`;return await Bun.$`curl -sL -o ${i} ${t}`,await Bun.$`tar xzf ${i} -C ${e}`,await co(i),this.sharedPath=e,{path:e,version:n}}async create(r){let n=await this.ensureDownloaded(),e=[];for(let o of r){let i=D(this.profile.directory,o);await this.setupRunnerDir(n,i),await this.registerRunner(i,o),e.push({directory:i,id:o,name:o,status:"registered"})}return e}async remove(r){for(let n of r){let e=D(this.profile.directory,n);if(!Dr(D(e,".runner")))continue;let o=await this.fetchRemovalToken(e);await Bun.$`bash ./config.sh remove --token ${o}`.cwd(e).quiet().nothrow()}}async start(r){for(let n of r){let e=D(this.profile.directory,n),o=await this.readPidFile(e);if(o&&this.isProcessRunning(o))continue;let i=Bun.spawn(["bash","./run.sh"],{cwd:nn(e),stderr:"pipe",stdout:"pipe"});i.unref(),await this.writePidFile(e,i.pid)}}async stop(r){for(let n of r){let e=D(this.profile.directory,n);if(!await this.readPidFile(e))continue;let i=nn(e);await Bun.$`pkill -f ${i}`.quiet().nothrow(),await this.removePidFile(e)}}async list(){let r=this.profile.directory;if(!Dr(r))return[];let n=await so(r,{withFileTypes:!0}),e=[];for(let o of n){if(!o.isDirectory())continue;let i=D(r,o.name);e.push(await this.getRunnerStatus(i,o.name))}return e}async currentVersion(r){let n=D(this.profile.directory,r);return this.detectVersion(n)}async logFiles(r){return Lr(D(this.profile.directory,r,kr))}async update(r){let n=await this.ensureDownloaded();for(let e of r){let o=D(this.profile.directory,e);await this.removeRunnerBinaries(o),await this.setupRunnerDir(n,o)}}async getRunnerStatus(r,n){let e=await this.readRunnerName(r),o=await this.readPidFile(r),i=o!==null&&this.isProcessRunning(o),t="unknown";if(i)t="running";else if(Dr(D(r,".runner")))t="registered";return{directory:r,id:n,name:e,pid:i?o:void 0,status:t}}async ensureDownloaded(){if(this.sharedPath)return this.sharedPath;let{path:r}=await this.download();return r}async setupRunnerDir(r,n){await Kn(n,{recursive:!0});for(let e of fo)await this.hardLinkDir(D(r,e),D(n,e));for(let e of po){let o=nn(r,e),i=D(n,e);if(!Dr(i))await et(o,i)}for(let e of["*.sh","*.sh.template"]){let o=await Array.fromAsync(new Bun.Glob(e).scan(r));for(let i of o)await Ti(D(r,i),D(n,i))}}async registerRunner(r,n){let e=await this.fetchRegistrationToken(),o=["--url",this.profile.url,"--token",e,"--name",n,"--unattended"];if(this.profile.labels)o.push("--labels",this.profile.labels);if(this.profile.runnerGroup)o.push("--runnergroup",this.profile.runnerGroup);await Bun.$`bash ./config.sh ${o}`.cwd(r).quiet()}async fetchRegistrationToken(){return this.fetchRunnerToken(pr(this.profile.url),"registration-token")}async fetchRemovalToken(r){let n=await Zn(D(r,".runner"),"utf-8"),o=JSON.parse(this.stripBom(n)).gitHubUrl;if(!o)throw Error("Cannot determine GitHub URL from runner config");return this.fetchRunnerToken(pr(o),"remove-token")}async fetchRunnerToken(r,n){let e=r.kind==="repo"?`repos/${r.owner}/${r.repo}/actions/runners/${n}`:`orgs/${r.org}/actions/runners/${n}`,o=r.kind==="repo"?"gh needs admin access to the repository":"gh needs the admin:org scope",i=await Bun.$`gh api ${e} --method POST --jq .token`.quiet().nothrow();if(i.exitCode!==0){let a=i.stderr.toString().trim();throw Error(`gh api ${e} failed for ${Tr(r)} (${o})${a?`: ${a}`:""}`)}let t=i.stdout.toString().trim();if(!t)throw Error(`Failed to fetch ${n} for ${Tr(r)}`);return t}async getLatestVersion(){return(await Bun.$`gh api repos/${uo}/releases/latest --jq .tag_name`.quiet()).stdout.toString().trim().replace(/^v/,"")}pidFilePath(r){return nn(r,".pid")}async writePidFile(r,n){await ot(this.pidFilePath(r),String(n))}async readPidFile(r){try{let n=await Zn(this.pidFilePath(r),"utf-8");return Number.parseInt(n.trim(),10)}catch{return null}}async removePidFile(r){try{await co(this.pidFilePath(r))}catch{}}async readRunnerName(r){try{let n=await Zn(D(r,".runner"),"utf-8");return JSON.parse(this.stripBom(n)).agentName??"unknown"}catch{return"unknown"}}async hardLinkDir(r,n){await Kn(n,{recursive:!0});let e=await so(r,{withFileTypes:!0});for(let o of e){let i=D(r,o.name),t=D(n,o.name);if(o.isDirectory())await this.hardLinkDir(i,t);else await rt(i,t)}}async detectVersion(r){try{return(await nt(D(r,"externals"))).match(/github\/([^/]+)/)?.[1]??null}catch{return null}}async removeRunnerBinaries(r){for(let n of fo)await On(D(r,n),{force:!0,recursive:!0});for(let n of po)await On(D(r,n),{force:!0});for(let n of["*.sh","*.sh.template"]){let e=await Array.fromAsync(new Bun.Glob(n).scan(r));for(let o of e)await On(D(r,o),{force:!0})}}stripBom(r){return r.replace(/^\uFEFF/,"")}isProcessRunning(r){try{return process.kill(r,0),!0}catch{return!1}}}import{existsSync as Xn}from"fs";import{readdir as Vn,readFile as tt,readlink as at,rm as Sn,stat as st}from"fs/promises";import{join as ar}from"path";var mo="_work",ct="externals",ut=".pid",ft="github",pt=/github\/([^/]+)/,mt=["runner","worker"],lt=24,lo=3600000,Qn=10;function on(r){return{auto:r?.auto??Te,intervalHours:r?.intervalHours??ro,lastRun:r?.lastRun,olderThanDays:r?.olderThanDays??_r,targets:r?.targets??no}}function go(r,n){return r-n*lt*lo}function Bn(r,n){if(!r.lastRun)return!0;let e=Date.parse(r.lastRun);if(Number.isNaN(e))return!0;return n-e>=r.intervalHours*lo}function ho(r,n){let e=rn(r),o=new Set;for(let i of mt){let t=e.find((a)=>a.type===i);if(t)o.add(t.path)}return e.filter((i)=>!o.has(i.path)&&i.mtime.getTime()<n)}function bo(r){return[...r].sort(wt)[0]??null}function wo(r,n){let e=bo(r),o=new Set(n);return r.filter((i)=>i!==e&&!o.has(i))}function vo(r){return r.match(pt)?.[1]??null}function tn(r){return Object.values(r).reduce((n,e)=>n+e.freedBytes,0)}async function Co(r){try{let n=await tt(ar(r,ut),"utf-8"),e=Number.parseInt(n.trim(),Qn);if(Number.isNaN(e))return!1;return process.kill(e,0),!0}catch{return!1}}async function an(r){if(!Xn(r))return 0;let n=await Vn(r,{withFileTypes:!0}),e=0;for(let o of n){if(o.isSymbolicLink())continue;let i=ar(r,o.name);if(o.isDirectory()){e+=await an(i);continue}if(o.isFile()){let t=await st(i);e+=t.size}}return e}async function sn(r){let n=go(r.now,r.olderThanDays),e={};for(let o of r.targets)switch(o){case"logs":e.logs=await dt(r.entries,n,r.dryRun);break;case"work":e.work=await gt(r.entries,r.dryRun);break;case"shared":e.shared=await ht(r.entries,r.dryRun,r.sharedDir);break}return e}async function dt(r,n,e){let o={freedBytes:0,removed:0,skipped:[]};for(let i of r){let t=await Lr(ar(i.directory,kr));for(let a of ho(t,n)){if(!e)await Sn(a.path,{force:!0});o.removed++,o.freedBytes+=a.size}}return o}async function gt(r,n){let e={freedBytes:0,removed:0,skipped:[]};for(let o of r){if(await Co(o.directory)){e.skipped.push(o.id);continue}let i=ar(o.directory,mo);if(!Xn(i))continue;let t=await Vn(i);if(t.length===0)continue;if(e.freedBytes+=await an(i),e.removed+=t.length,n)continue;for(let a of t)await Sn(ar(i,a),{force:!0,recursive:!0})}return e}async function ht(r,n,e){let o={freedBytes:0,removed:0,skipped:[]},i=e??ar(fr,ft);if(!Xn(i))return o;let a=(await Vn(i,{withFileTypes:!0})).filter((c)=>c.isDirectory()).map((c)=>c.name),s=await bt(r);for(let c of wo(a,s)){let u=ar(i,c);if(o.freedBytes+=await an(u),o.removed++,!n)await Sn(u,{force:!0,recursive:!0})}return o}async function bt(r){let n=[];for(let e of r)try{let o=await at(ar(e.directory,ct)),i=vo(o);if(i)n.push(i)}catch{}return n}function wt(r,n){let e=r.split(".").map((t)=>Number.parseInt(t,Qn)),o=n.split(".").map((t)=>Number.parseInt(t,Qn)),i=Math.max(e.length,o.length);for(let t=0;t<i;t++){let a=e[t]??0,s=o[t]??0,c=Number.isNaN(a)?0:a,u=Number.isNaN(s)?0:s;if(c!==u)return u-c}return 0}function x(r){switch(r.provider){case"github":return new en(r);default:throw Error(`Runner provider "${r.provider}" is not yet implemented`)}}var $o=0,vt={logs:"file(s)",shared:"version(s)",work:"item(s)"},Ct=tr({days:{alias:"d",default:$o,description:"Override log retention",displayDefault:`config or ${_r} days`,type:"number"},dryRun:{alias:"n",default:!1,description:"Preview cleanup without deleting",type:"boolean"},logs:{alias:"l",default:!1,description:"Remove old diagnostic logs",type:"boolean"},shared:{alias:"s",default:!1,description:"Remove unused runner versions",type:"boolean"},work:{alias:"w",default:!1,description:"Clear stopped runners' workspaces",type:"boolean"},yes:{alias:"y",default:!1,description:"Skip workspace confirmation",type:"boolean"}});class cn extends k{name="cleanup";description="Remove logs, workspaces, and old runner versions";args=Ct;async execute(r){let n=r.config.get("profiles");if(Object.keys(n).length===0)throw new w("No profiles configured","Run hydra init to set up a profile");let e=on(r.config.get("cleanup")),o=this.explicitTargets(r),i=o.length>0?o:e.targets,t=r.args.days>$o?r.args.days:e.olderThanDays;if(i.includes("work")&&!r.args.dryRun&&!r.args.yes){if(!await sr({message:"Delete _work contents (checkouts and caches) of stopped runners?"}))i=i.filter((c)=>c!=="work")}let a=await sn({dryRun:r.args.dryRun,entries:r.config.get("runners")??[],now:Date.now(),olderThanDays:t,targets:i});if(this.printReport(a,r.args.dryRun),r.args.dryRun)return;r.config.set("cleanup",{...r.config.get("cleanup"),lastRun:new Date().toISOString()})}explicitTargets(r){let n=[];if(r.args.logs)n.push("logs");if(r.args.work)n.push("work");if(r.args.shared)n.push("shared");return n}printReport(r,n){let e=[];for(let[t,a]of Object.entries(r)){if(!a)continue;let s=vt[t],c=mr(a.freedBytes),u=n?`would remove ${a.removed} ${s}, ${c}`:`removed ${a.removed} ${s}, freed ${c}`;if(e.push(`${m.bold(t)}: ${a.removed>0?u:m.dim("nothing to do")}`),a.skipped.length>0)e.push(m.dim(` skipped running runner(s): ${a.skipped.join(", ")}`))}if(e.length===0){v.info(m.dim("Nothing to clean."));return}let o=tn(r),i=n?"Would free":"Freed";e.push(m.dim(`${i} ${mr(o)} total`)),v.info(e.join(`
94
- `))}}async function Ir(r){try{let n=on(r.config.get("cleanup"));if(!n.auto)return;if(!Bn(n,Date.now()))return;let e=await sn({dryRun:!1,entries:r.config.get("runners")??[],now:Date.now(),olderThanDays:n.olderThanDays,targets:n.targets});r.config.set("cleanup",{...r.config.get("cleanup"),lastRun:new Date().toISOString()});let o=tn(e);if(o>0)v.info(m.dim(`Auto cleanup freed ${mr(o)}`))}catch(n){let e=n instanceof Error?n.message:String(n);v.warn(m.yellow(`Auto cleanup failed: ${e}`))}}import{join as $t}from"path";function hr(r,n){if(r.length===0)return n;for(let e of r)if(!n.includes(e))throw new w(`Runner "${e}" not found`);return r}function z(r,n){let e=r.get("profiles");if(Object.keys(e).length===0)throw new w("No profiles configured","Run hydra init to set up a profile");let o=n??r.get("defaultProfile")??Rr,i=e[o];if(!i)throw new w(`Profile "${o}" not found`);return{name:o,profile:i}}async function O(r){let n=r.get("profiles"),e=Object.keys(n);if(e.length===0)throw new w("No profiles configured","Run hydra init to set up a profile");if(e.length===1)return e[0];return cr({message:"Select profile",options:e.map((o)=>({label:o,value:o,hint:n[o]?.url}))})}var yt=G({profile:{description:"Profile to use"},count:{description:"Runner count override"}});class un extends k{name="create";description="Download and register runners";positionals=yt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await O(r.config)):z(r.config,r.positionals.profile),o=r.interactive?await this.promptCount(e.numberOfMachines):r.positionals.count?Number.parseInt(r.positionals.count,10):e.numberOfMachines;if(!o||o<1)throw new w("Runner count must be at least 1");let i=x(e),t=J();t.start("Downloading runner binary...");let{version:a}=await i.download();t.stop(`Runner v${a} ready`);let s=r.config.get("runners")??[],c=s.filter((l)=>l.profile===n),u=o-c.length;if(u<=0){v.warn(`Already have ${c.length} runner(s) for profile "${n}". Nothing to create.`);return}let d=new Set(s.map((l)=>l.id)),g=1;for(let l=0;l<u;){let b=`${e.name}-${g++}`;if(d.has(b))continue;l++,t.start(`Registering ${b}...`),await i.create([b]),t.stop(`${m.green("+")} ${b}`),s.push({createdAt:new Date().toISOString(),directory:$t(e.directory,b),id:b,name:b,profile:n,provider:e.provider,url:e.url})}r.config.set("runners",s);let h=n===r.config.get("defaultProfile")?"":` ${n}`;v.info(`${m.green("Created")} ${u} runner(s) for "${n}". Run ${m.green(`hydra start${h}`)} to start them.`)}async promptCount(r){let n=await rr({initialValue:String(r),message:"Number of runners to create",validate:(e)=>{let o=Number.parseInt(e??"",10);if(Number.isNaN(o)||o<1)return"Must be a positive number";return}});return Number.parseInt(n,10)}}import{existsSync as yo}from"fs";import{mkdir as Po}from"fs/promises";var Pt=G({url:{description:"GitHub repository or organization URL"}}),Ft=tr({force:{alias:"f",default:!1,description:"Overwrite an existing profile",type:"boolean"},labels:{alias:"l",description:"Set comma-separated runner labels",type:"string"},name:{alias:"n",description:"Set the runner name prefix",type:"string"},profile:{alias:"p",description:"Set the profile name",type:"string"},runners:{alias:"c",description:"Set the runner count",type:"number"}});class fn extends k{name="init";description="Set up a runner profile";positionals=Pt;args=Ft;prompts=!0;async execute(r){let n=r.interactive?await this.promptProfileName(r):r.args.profile??Rr,e=!r.config.exists();if(!e&&r.config.get("profiles")[n]&&!r.args.force){if(!r.interactive)throw new w(`Profile "${n}" already exists. Use --force to overwrite.`);if(!await sr({initialValue:!1,message:`Profile "${n}" already exists. Overwrite?`}))return}await this.ensureDirectories();let i=r.interactive?await this.runInitForm():this.buildProfileFromArgs(r),t=e?{}:{...r.config.get("profiles")};if(t[n]=i,r.config.set("profiles",t),!r.config.get("defaultProfile"))r.config.set("defaultProfile",n);lr([`${m.dim("Profile:")} ${n}`,`${m.dim("URL:")} ${i.url}`,`${m.dim("Runners:")} ${i.numberOfMachines}`,`${m.dim("Name:")} ${i.name}`,i.labels?`${m.dim("Labels:")} ${i.labels}`:"","",`Run ${m.green(`${Br} create${n!==r.config.get("defaultProfile")?` ${n}`:""}`)} to provision runners.`].filter(Boolean).join(`
95
- `),m.green(e?"Hydra initialized":`Profile "${n}" added`))}async promptProfileName(r){return rr({initialValue:r.args.profile??Rr,message:"Profile name"})}async ensureDirectories(){if(!yo(fr))await Po(fr,{recursive:!0});if(!yo(Fr))await Po(Fr,{recursive:!0})}async runInitForm(){let r=await Wr({url:()=>rr({message:"GitHub repository or organization URL",placeholder:"https://github.com/owner/repo",validate:(n)=>{if(!n)return"URL is required";try{pr(n)}catch{return"Must be a GitHub repository or organization URL (https://github.com/<owner>/<repo> or https://github.com/<org>)"}return}}),name:()=>rr({initialValue:"runner",message:"Base name for runners",placeholder:"runner"}),runners:()=>rr({initialValue:"1",message:"Number of runners",placeholder:"1",validate:(n)=>{if(!n)return"Must be a positive number";let e=Number.parseInt(n,10);if(Number.isNaN(e)||e<1)return"Must be a positive number";return}}),labels:()=>rr({message:"Additional labels (comma-separated, optional)",placeholder:"self-hosted,macOS,ARM64"})},{onCancel:()=>{throw new Q}});return{directory:Fr,labels:r.labels||void 0,name:r.name,numberOfMachines:Number.parseInt(r.runners,10)||1,os:this.detectOs(),overwrite:!1,provider:"github",run:!1,url:r.url}}buildProfileFromArgs(r){if(!r.positionals.url)throw new w("URL is required","Usage: hydra init <url>");return this.validateUrl(r.positionals.url),this.validateRunnerCount(r.args.runners),{directory:Fr,labels:r.args.labels,name:r.args.name??"runner",numberOfMachines:r.args.runners??1,os:this.detectOs(),overwrite:!1,provider:"github",run:!1,url:r.positionals.url}}validateUrl(r){try{pr(r)}catch(n){throw new w(n instanceof Error?n.message:`Invalid GitHub URL: ${r}`,"Expected https://github.com/<owner>/<repo> or https://github.com/<org>")}}validateRunnerCount(r){if(r!==void 0&&r<1)throw new w("Runner count must be at least 1")}detectOs(){let r=process.platform;if(r==="darwin")return"osx";if(r==="win32")return"windows";return"linux"}}import{existsSync as Rt}from"fs";import{readFile as kt}from"fs/promises";var Lt=100,Dt={runner:"runner daemon log",worker:"job log"},It=tr({lines:{alias:"n",default:Lt,description:"Number of lines to show",type:"number"},list:{alias:"l",default:!1,description:"List log files instead of showing one",type:"boolean"},open:{alias:"o",default:!1,description:"Open the log file",type:"boolean"},runner:{alias:"r",default:!1,description:"Show the runner log instead of a job log",type:"boolean"}}),Et=G({id:{description:"Runner ID"}});class pn extends k{name="logs";description="Show recent runner logs";args=It;positionals=Et;async execute(r){let n=r.config.get("runners")??[];if(n.length===0)throw new w("No runners found","Run hydra create to provision runners");let e=await this.resolveEntry(r,n),o=r.config.get("profiles")[e.profile];if(!o)throw new w(`Profile "${e.profile}" not found for runner "${e.id}"`,"Run hydra init to set it up");if(!Rt(e.directory))throw new w(`Runner directory not found: ${e.directory}`,"Run hydra create to provision this runner");let t=await x(o).logFiles(e.id);if(t.length===0)this.noLogs(e.id);if(r.args.list){this.printList(e,t);return}let a=this.selectFile(r,e,t);if(r.args.open){await this.openFile(a);return}await this.printTail(e,a,r.args.lines)}async resolveEntry(r,n){let e=r.positionals.id;if(e){let i=n.find((t)=>t.id===e);if(!i)throw new w(`Runner "${e}" not found`,`Known runners: ${n.map((t)=>t.id).join(", ")}`);return i}if(r.interactive)return cr({message:"Select runner",options:n.map((i)=>({hint:i.profile,label:i.name,value:i}))});let o=n[0];if(n.length===1&&o)return o;throw new w("Multiple runners found",`Pass a runner id: hydra logs <id> (${n.map((i)=>i.id).join(", ")})`)}selectFile(r,n,e){if(r.args.runner){let i=e.find((t)=>t.type==="runner");if(!i)throw new w(`No runner daemon logs found for "${n.id}"`,"Start the runner first: hydra start");return i}let o=Yn(e,"worker");if(!o)this.noLogs(n.id);if(o.fallback)v.warn(m.yellow("No job (Worker) logs yet; showing the runner daemon log instead"));return o.file}noLogs(r){throw new w(`No logs found for runner "${r}"`,"Logs appear once the runner has started; run hydra start")}printList(r,n){let e=[`${m.bold(r.name)} ${m.dim(r.directory)}`];for(let o of n){let i=o.type==="worker"?m.green("worker"):m.blue("runner");e.push(` ${i} ${o.name} ${m.dim(`${o.mtime.toISOString()} \xB7 ${mr(o.size)}`)}`)}v.info(e.join(`
96
- `))}async printTail(r,n,e){let o=await kt(n.path,"utf-8"),i=[`${m.bold(r.name)} ${m.dim(Dt[n.type])}`,m.dim(n.path),m.dim(`Last modified: ${n.mtime.toISOString()}`)];v.info(i.join(`
97
- `)),console.log(Jn(o,e))}async openFile(r){let n=(process.env.EDITOR??"").split(" ").filter(Boolean),e=n[0];if(e){await Bun.spawn([e,...n.slice(1),r.path],{stderr:"inherit",stdin:"inherit",stdout:"inherit"}).exited;return}if(process.platform==="darwin"){await Bun.$`open ${r.path}`.quiet();return}throw new w("No editor configured","Set $EDITOR to open log files")}}var Ht=G({name:{description:"Profile name to set as default"}});class _n extends k{name="default";description="Set the default profile";positionals=Ht;async execute(r){let n=r.interactive?await O(r.config):r.positionals.name;if(!n)throw new w("Profile name is required","Usage: hydra profile default <name>");let{name:e}=z(r.config,n);if(r.config.get("defaultProfile")===e){v.info(`"${e}" is already the default profile.`);return}r.config.set("defaultProfile",e),v.info(`${m.green("Default profile set to")} "${e}".`)}}class Tn extends k{name="list";description="List profiles";async execute(r){let n=r.config.get("profiles"),e=Object.keys(n);if(e.length===0)throw new w("No profiles configured","Run hydra init to set up a profile");let o=r.config.get("runners")??[],i=r.config.get("defaultProfile");for(let t of e){let a=n[t],c=await x(a).list(),u=o.filter((b)=>b.profile===t),d=new Set(c.filter((b)=>b.status==="running").map((b)=>b.id)),g=u.filter((b)=>d.has(b.id)).length,p=t===i,h=[`${m.dim("URL:")} ${a.url}`,`${m.dim("Provider:")} ${a.provider}`,`${m.dim("OS:")} ${a.os}`,`${m.dim("Name:")} ${a.name}`,`${m.dim("Runners:")} ${u.length}/${a.numberOfMachines} created, ${m.green(`${g} running`)}`];if(a.labels)h.push(`${m.dim("Labels:")} ${a.labels}`);let l=p?`${t} ${m.dim("(default)")}`:t;lr(h.join(`
98
- `),l)}v.info(m.dim(`${e.length} profile(s)`))}}import{rm as Ut}from"fs/promises";import{join as Nt}from"path";var At=G({name:{description:"Profile name to remove"}});class re extends k{name="remove";description="Delete a profile and its runners";positionals=At;async execute(r){let n=r.interactive?await O(r.config):r.positionals.name;if(!n)throw new w("Profile name is required","Usage: hydra profile remove <name>");let{profile:e}=z(r.config,n),o=r.config.get("runners")??[],i=o.filter((c)=>c.profile===n);if(i.length>0){if(!await sr({initialValue:!0,message:`This will stop and remove ${i.length} runner(s). Continue?`}))return;await this.removeRunners(e,i.map((d)=>d.id));let u=o.filter((d)=>d.profile!==n);r.config.set("runners",u)}let{[n]:t,...a}=r.config.get("profiles");if(r.config.set("profiles",a),r.config.get("defaultProfile")===n){let c=Object.keys(a);r.config.set("defaultProfile",c[0])}v.info(`${m.green("Removed")} profile "${n}".`)}async removeRunners(r,n){let e=x(r),o=J();for(let i of n)o.start(`Stopping and removing ${i}...`),await e.stop([i]),await e.remove([i]),await Ut(Nt(r.directory,i),{force:!0,recursive:!0}),o.stop(`${m.red("-")} ${i}`)}}class mn extends k{name="profile";description="Manage profiles";init(){this.registerSubcommands([new Tn,new re,new _n])}}import{rm as jt}from"fs/promises";import{join as Mt}from"path";var Gt=G({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class ln extends k{name="remove";description="Deregister and delete runners";positionals=Gt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await O(r.config)):z(r.config,r.positionals.profile),o=r.config.get("runners")??[],i=o.filter((u)=>u.profile===n);if(i.length===0)throw new w(`No runners found for profile "${n}"`,"Run hydra create to provision runners");let t=r.interactive?await this.promptRunnerSelection(i.map((u)=>u.id)):hr(r.positionals.ids??[],i.map((u)=>u.id)),a=x(e),s=J();for(let u of t)s.start(`Stopping and removing ${u}...`),await a.stop([u]),await a.remove([u]),await jt(Mt(e.directory,u),{force:!0,recursive:!0}),s.stop(`${m.red("-")} ${u}`);let c=o.filter((u)=>!t.includes(u.id));r.config.set("runners",c),v.info(`${m.green("Removed")} ${t.length} runner(s).`)}async promptRunnerSelection(r){return ur({message:"Select runners to remove",options:r.map((n)=>({label:n,value:n})),required:!0})}}var xt=G({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class dn extends k{name="start";description="Start runners";positionals=xt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await O(r.config)):z(r.config,r.positionals.profile),i=(r.config.get("runners")??[]).filter((p)=>p.profile===n);if(i.length===0)throw new w(`No runners found for profile "${n}"`,"Run hydra create to provision runners");let t=x(e),a=J();a.start("Fetching runner status...");let s=await t.list();a.stop("Runner status fetched");let c=new Set(s.filter((p)=>p.status==="running").map((p)=>p.id)),u=i.map((p)=>p.id).filter((p)=>!c.has(p)),d=r.interactive?await this.promptRunnerSelection(u):hr(r.positionals.ids??[],i.map((p)=>p.id)),g=0;for(let p of d){if(c.has(p)){a.start(""),a.stop(`${m.dim("\u25CF")} ${p} ${m.dim("already running")}`);continue}a.start(`Starting ${p}...`),await t.start([p]),a.stop(`${m.green("\u25B6")} ${p}`),g++}v.info(`${m.green("Started")} ${g} runner(s).`),await Ir(r)}async promptRunnerSelection(r){if(r.length===0)throw new w("All runners are already running");return ur({message:"Select runners to start",options:r.map((n)=>({label:n,value:n})),required:!0})}}var qt={registered:m.yellow,running:m.green,stopped:m.red,unknown:m.dim};class gn extends k{name="status";description="Show status across profiles";async execute(r){let n=r.config.get("profiles"),e=Object.keys(n);if(e.length===0)throw new w("No profiles configured","Run hydra init to set up a profile");let o=r.config.get("runners")??[],i=0,t=0,a=[];for(let s of e){let c=n[s],d=await x(c).list();if(a.length>0)a.push("");a.push(`${m.bold(s)} ${m.dim(c.url)}`);let g=new Set(o.filter((h)=>h.profile===s).map((h)=>h.id)),p=d.filter((h)=>g.has(h.id)).sort((h,l)=>h.name.localeCompare(l.name,void 0,{numeric:!0}));this.formatRunners(p,a),i+=p.length,t+=p.filter((h)=>h.status==="running").length}a.push(""),a.push(m.dim(`${i} runner(s) total, ${t} running`)),v.info(a.join(`
99
- `))}formatRunners(r,n){if(r.length===0){n.push(m.dim(" No runners."));return}for(let e of r){let o=qt[e.status]??m.dim,i=e.pid?m.dim(` (pid: ${e.pid})`):"";n.push(` ${o("\u25CF")} ${e.name} ${o(e.status)}${i}`)}}}var zt=G({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class hn extends k{name="stop";description="Stop runners";positionals=zt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await O(r.config)):z(r.config,r.positionals.profile),i=(r.config.get("runners")??[]).filter((p)=>p.profile===n);if(i.length===0)throw new w(`No runners found for profile "${n}"`,"Run hydra create to provision runners");let t=x(e),a=J();a.start("Fetching runner status...");let s=await t.list();a.stop("Runner status fetched");let c=new Set(s.filter((p)=>p.status==="running").map((p)=>p.id)),u=i.map((p)=>p.id).filter((p)=>c.has(p)),d=r.interactive?await this.promptRunnerSelection(u):hr(r.positionals.ids??[],i.map((p)=>p.id)),g=0;for(let p of d){if(!c.has(p)){a.start(""),a.stop(`${m.dim("\u25CF")} ${p} ${m.dim("not running")}`);continue}a.start(`Stopping ${p}...`),await t.stop([p]),a.stop(`${m.red("\u25A0")} ${p}`),g++}v.info(`${m.green("Stopped")} ${g} runner(s).`)}async promptRunnerSelection(r){if(r.length===0)throw new w("No runners are currently running");return ur({message:"Select runners to stop",options:r.map((n)=>({label:n,value:n})),required:!0})}}class bn extends k{name="update";description="Update runner binaries";async execute(r){let n=r.config.get("profiles"),e=r.config.get("runners")??[];if(e.length===0)throw new w("No runners found","Run hydra create to provision runners");let o=J(),i=Map.groupBy(e,(c)=>c.profile),t=null,a="",s=!1;for(let[c,u]of i){let d=n[c],g=u[0];if(!d||!g)continue;let p=x(d);if(!s){if(s=!0,o.start("Checking for updates..."),a=(await p.download()).version,t=await p.currentVersion(g.id),o.stop(`Current: v${t??"unknown"} | Latest: v${a}`),t===a){v.info(`Already on latest version ${m.dim(`(v${a})`)}`),await Ir(r);return}}let h=await p.list(),l=new Set(h.filter((b)=>b.status==="running").map((b)=>b.id));for(let b of u){let F=l.has(b.id);if(o.start(`Updating ${b.id}...`),F)await p.stop([b.id]);if(await p.update([b.id]),F)await p.start([b.id]);let I=F?` ${m.dim("(restarted)")}`:"";o.stop(`${m.green("\u2713")} ${b.id}${I}`)}}v.info(`${m.green("Updated")} ${e.length} runner(s) from v${t} to v${a}`),await Ir(r)}}class Fo extends zn{constructor(){super(new Wn(Be,_e),{bin:Br,clearOnStart:!0,description:"Manage GitHub Actions runners on this machine.",exitLabel:"Exit",goodbyeMessage:"Heads down.",name:"HYDRA",promptMessage:"What do you need?",version:Se})}init(){this.registerCommands([new fn,new un,new dn,new hn,new gn,new pn,new cn,new ln,new bn,new mn])}}var Wt=new Fo;Wt.run();
80
+ `}}}}).prompt();var wn=!process.env.NO_COLOR&&(process.env.FORCE_COLOR||(process.stdout?.isTTY??!1)),Vr=["black","blue","cyan","gray","green","magenta","red","white","yellow"],bn=["bold","dim","italic","underline","reset"],Gr={bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",reset:"\x1B[0m",underline:"\x1B[4m"},Cn={black:"\x1B[30m",blue:"\x1B[34m",cyan:"\x1B[36m",gray:"\x1B[90m",green:"\x1B[32m",magenta:"\x1B[35m",red:"\x1B[31m",white:"\x1B[37m",yellow:"\x1B[33m"},xn={black:"\x1B[40m",blue:"\x1B[44m",cyan:"\x1B[46m",gray:"\x1B[100m",green:"\x1B[42m",magenta:"\x1B[45m",red:"\x1B[41m",white:"\x1B[47m",yellow:"\x1B[43m"},Mr={"\x1B[30m":"\x1B[90m","\x1B[31m":"\x1B[91m","\x1B[32m":"\x1B[92m","\x1B[33m":"\x1B[93m","\x1B[34m":"\x1B[94m","\x1B[35m":"\x1B[95m","\x1B[36m":"\x1B[96m","\x1B[37m":"\x1B[97m"};function Wt(t){return(e)=>wn?`${t}${e}${Gr.reset}`:e}function Rn(t){for(let e=0;e<t.length;e++){let r=t.charCodeAt(e);if(r<32&&r!==27)return!1}return!0}function Ur({bright:t=!1,color:e}){let r=Bun.color(e,"ansi"),i=typeof r==="string"&&r.length>0&&Rn(r)?r:Cn[e];if(!i)return"";return t&&i in Mr?Mr[i]:i}var Sn=Vr.reduce((t,e)=>{let r=Ur({color:e});if(r)t[e]=Wt(r);let i=Ur({bright:!0,color:e});if(i)t[`${e}Bright`]=Wt(i);return t},{}),In=bn.reduce((t,e)=>(t[e]=Wt(Gr[e]),t),{}),En=Vr.reduce((t,e)=>{let r=xn[e];if(r){let i=`bg${e.charAt(0).toUpperCase()}${e.slice(1)}`;t[i]=Wt(r)}return t},{}),p={...Sn,...In,...En};function Kt(t){if(xt(t))throw new Y;return t}function _n(t){return t.map((e)=>e.key?`${p.bold(e.key)} ${p.dim(e.text)}`:p.dim(e.text)).join(p.dim(" \xB7 "))}function qt(t){w.info(_n(t))}var zt={confirm:[{key:"Enter",text:"confirm"},{key:"Esc",text:"cancel"}],multiselect:[{key:"\u2191\u2193",text:"navigate"},{key:"Space",text:"toggle"},{key:"a",text:"all"},{key:"Enter",text:"confirm"},{key:"Esc",text:"cancel"}],select:[{key:"\u2191\u2193",text:"navigate"},{key:"Enter",text:"select"},{key:"Esc",text:"cancel"}],text:[{key:"Enter",text:"submit"},{key:"Esc",text:"cancel"}]};async function ct(t){return qt(zt.confirm),Kt(await Lr(t))}async function it(t){return qt(zt.text),Kt(await Nr(t))}async function pt(t){return qt(zt.select),Kt(await Or({showInstructions:!1,...t}))}async function dt(t){return qt(zt.multiselect),Kt(await Fr({showInstructions:!1,...t}))}var An=4;function yt(t,e=0){if(e>=An)return;let r=[...t instanceof AggregateError?t.errors:[],...t.cause!==void 0?[t.cause]:[]];for(let i of r){if(w.info(p.dim(`caused by: ${i instanceof Error?i.message:String(i)}`)),i instanceof y&&i.hint)w.info(p.dim(` ${i.hint}`));if(i instanceof Error)yt(i,e+1)}}function Le(t){return t==null?[]:Array.isArray(t)?t:[t]}function Tn(t,e,r,i){var n,s=t[e],o=~i.string.indexOf(e)?r==null||r===!0?"":String(r):typeof r==="boolean"?r:~i.boolean.indexOf(e)?r==="false"?!1:r==="true"||(t._.push((n=+r,n*0===0)?n:r),!!r):(n=+r,n*0===0)?n:r;t[e]=s==null?o:Array.isArray(s)?s.concat(o):[s,o]}function Pt(t,e){t=t||[],e=e||{};var r,i,n,s,o,u={_:[]},a=0,l=0,f=0,h=t.length;let d=e.alias!==void 0,g=e.unknown!==void 0,m=e.default!==void 0;if(e.alias=e.alias||{},e.string=Le(e.string),e.boolean=Le(e.boolean),d)for(r in e.alias){i=e.alias[r]=Le(e.alias[r]);for(a=0;a<i.length;a++)(e.alias[i[a]]=i.concat(r)).splice(a,1)}for(a=e.boolean.length;a-- >0;){i=e.alias[e.boolean[a]]||[];for(l=i.length;l-- >0;)e.boolean.push(i[l])}for(a=e.string.length;a-- >0;){i=e.alias[e.string[a]]||[];for(l=i.length;l-- >0;)e.string.push(i[l])}if(m){for(r in e.default)if(s=typeof e.default[r],i=e.alias[r]=e.alias[r]||[],e[s]!==void 0){e[s].push(r);for(a=0;a<i.length;a++)e[s].push(i[a])}}let v=g?Object.keys(e.alias):[];for(a=0;a<h;a++){if(n=t[a],n==="--"){u._=u._.concat(t.slice(++a));break}for(l=0;l<n.length;l++)if(n.charCodeAt(l)!==45)break;if(l===0)u._.push(n);else if(n.substring(l,l+3)==="no-"){if(s=n.substring(l+3),g&&!~v.indexOf(s))return e.unknown(n);u[s]=!1}else{for(f=l+1;f<n.length;f++)if(n.charCodeAt(f)===61)break;s=n.substring(l,f),o=n.substring(++f)||(a+1===h||(""+t[a+1]).charCodeAt(0)===45||t[++a]),i=l===2?[s]:s;for(f=0;f<i.length;f++){if(s=i[f],g&&!~v.indexOf(s))return e.unknown("-".repeat(l)+s);Tn(u,s,f+1<i.length||o,e)}}}if(m){for(r in e.default)if(u[r]===void 0)u[r]=e.default[r]}if(d)for(r in u){i=e.alias[r]||[];while(i.length>0)u[i.shift()]=u[r]}return u}var Dn=1;function $t(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function Oe(t){let e={alias:{},boolean:[],default:{},string:[]};for(let[r,i]of Object.entries(t)){if(i.type==="boolean")e.boolean.push(r);else e.string.push(r);if(i.alias)e.alias[i.alias]=r;let n=$t(r);if(n!==r)e.alias[n]=r;if(i.default!==void 0)e.default[r]=i.default}return e}function Fe(t,e){if(t in e)return`--${$t(t)}`;let r=Object.entries(e).find(([,i])=>i.alias===t)?.[0];if(r)return`--${$t(r)}`;return t.length===Dn?`-${t}`:`--${$t(t)}`}function O(t,e,r){let{alias:i}=Oe(e),n=Object.keys(t).find((s)=>!Object.hasOwn(e,s)&&!Object.hasOwn(i,s));if(n!==void 0)throw new y(`Unknown option: ${Fe(n,e)}`,r)}function jr(t,e){for(let[i,n]of Object.entries(t))if(Array.isArray(n))throw new y(`${Fe(i,e)} can only be provided once`);let r={...t};for(let[i,n]of Object.entries(e)){if(n.type!=="number")continue;let s=t[i];if(s===void 0)continue;let o=Number(s);if(typeof s==="boolean"||typeof s==="string"&&s.trim().length===0||!Number.isFinite(o)){let u=Fe(i,e);throw new y(`Invalid number for ${u}: "${s}"`,`Use ${u}=<number> with a finite numeric value`)}r[i]=o}return r}function Hr(t,e){let r=Oe(e),i=Pt(t,r),n=i._[0],s=n?t.indexOf(n):-1,o=Pt(s>=0?t.slice(0,s):t,r),{_:u,...a}=o;O(a,e,"Place command options after the command name");let{_:l,...f}=i,h=Object.fromEntries(Object.entries(f).filter(([g])=>(g in e)||(g in r.alias))),d=jr(h,e);return{command:n,flags:d,restArgs:s>=0?t.slice(s+1):[]}}function Ne(t,e={}){let r=Oe(e),i=Pt(kn(t,r),r),{_:n,...s}=i;return{args:jr(s,e),rawPositionals:n}}function kn(t,e){let r=!0;return t.map((i)=>{if(i==="--")r=!1;if(!r)return i;return i.replace(/^--(no-[^=]+)(=.*)?$/,(n,s,o)=>{let u=e.alias[s];return u&&e.boolean.includes(u)?`--${u}${o??""}`:n})})}function Me(t,e){let r={},i=Object.entries(e);for(let[n,[s,o]]of i.entries())r[s]=o.variadic?t.slice(n):t[n];return r}function Br(t,e){for(let[r,i]of Object.entries(e)){if(!i.required)continue;let n=t[r];if(Array.isArray(n)?n.length===0:!n)return`Missing required argument: <${r}${i.variadic?"...":""}>`}return null}var Ln=(t)=>t,b={arg:p.magenta,cmd:p.cyan,default:p.bold,desc:Ln,flag:p.green,header:(t)=>p.bold(p.yellow(t)),hint:p.dim,name:(t)=>p.bold(p.cyan(t)),placeholder:p.magenta};class Ue{metadata;commands;globalArgs;constructor(t,e,r){this.metadata=t;this.commands=e;this.globalArgs=r}version(){return`${b.name(this.metadata.name)} ${b.hint(this.metadata.version??"0.0.0")}`}global(){let t=[],{name:e,bin:r,version:i,description:n}=this.metadata;if(t.push(`${b.name(e)}${i?` ${b.hint(`v${i}`)}`:""}`),n)t.push(b.desc(n));t.push(""),t.push(b.header("Usage:")),t.push(` ${b.cmd(r)} ${b.placeholder("[command]")} ${b.placeholder("[options]")}`),t.push(""),t.push(b.header("Commands:"));let s=Array.from(this.commands.values()).map((o)=>[` ${b.cmd(o.name)}`,b.desc(o.description)]);return t.push(...this.formatColumns(s)),t.push(""),t.push(b.header("Options:")),t.push(...this.formatArgDefs(this.globalArgs)),t.push(""),t.push(`${b.hint("Run")} ${b.cmd(`${r} <command> --help`)} ${b.hint("for command details.")}`),t.join(`
81
+ `).trimEnd()}command(t,e){let r=[],i=e??this.metadata.bin,n=`${i} ${t.name}`,s=`${b.cmd(i)} ${b.cmd(t.name)}`;r.push(b.name(n)),r.push(b.desc(t.description)),r.push(""),r.push(b.header("Usage:"));let o=this.formatPositionalUsage(t.positionals);if(t.hasSubcommands())r.push(` ${s} ${b.placeholder("<subcommand>")} ${b.placeholder("[options]")}`);else{let l=[s];if(o)l.push(o);l.push(b.placeholder("[options]")),r.push(` ${l.join(" ")}`)}if(t.prompts&&Object.keys(t.positionals).length>0)r.push(` ${b.hint("Omit positional arguments to run interactively.")}`);if(r.push(""),t.hasSubcommands()){r.push(b.header("Subcommands:"));let l=t.getSubcommands().map((f)=>[` ${b.cmd(f.name)}`,b.desc(f.description)]);r.push(...this.formatColumns(l)),r.push("")}if(Object.entries(t.positionals).length>0)r.push(b.header("Arguments:")),r.push(...this.formatPositionalDefs(t.positionals)),r.push("");if(Object.entries(t.args).length>0)r.push(b.header("Options:")),r.push(...this.formatArgDefs(t.args));return r.join(`
82
+ `).trimEnd()}formatPositionalUsage(t){return Object.entries(t).map(([e,r])=>{let i=r.variadic?`${e}...`:e;return r.required?b.arg(`<${i}>`):b.arg(`[${i}]`)}).join(" ")}formatPositionalDefs(t){let e=Object.entries(t).map(([r,i])=>{let n=i.variadic?`${r}...`:r,s=b.desc(i.description??""),o=i.required?"":b.hint(" (optional)");return[` ${b.arg(n)}`,`${s}${o}`]});return this.formatColumns(e)}formatArgDefs(t){let e=[];for(let[r,i]of Object.entries(t)){let n=i.alias?`${b.flag(`-${i.alias}`)}, `:" ",s=i.type==="boolean"?"":` ${b.placeholder(`<${i.type==="number"?"number":"value"}>`)}`,o=`${n}${b.flag(`--${$t(r)}`)}${s}`,u=b.desc(i.description??""),a=this.formatDefault(i),l=a===void 0?"":` (default: ${b.default(a)})`;e.push([` ${o}`,`${u}${l}`])}return this.formatColumns(e)}formatDefault(t){if(typeof t.displayDefault==="string")return t.displayDefault;if(t.default===void 0)return;if(t.type==="boolean"&&t.default===!1)return;if(t.type==="string")return`"${t.default}"`;return String(t.default)}formatColumns(t){if(t.length===0)return[];let e=Math.max(...t.map(([i])=>this.stripAnsi(i).length)),r=2;return t.map(([i,n])=>{let s=e-this.stripAnsi(i).length+r;return`${i}${" ".repeat(s)}${n}`})}stripAnsi(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}}var nt=new Uint32Array(65536),Fn=(t,e)=>{let r=t.length,i=e.length,n=1<<r-1,s=-1,o=0,u=r,a=r;while(a--)nt[t.charCodeAt(a)]|=1<<a;for(a=0;a<i;a++){let l=nt[e.charCodeAt(a)],f=l|o;if(l|=(l&s)+s^s,o|=~(l|s),s&=l,o&n)u++;if(s&n)u--;o=o<<1|1,s=s<<1|~(f|o),o&=f}a=r;while(a--)nt[t.charCodeAt(a)]=0;return u},On=(t,e)=>{let r=e.length,i=t.length,n=[],s=[],o=Math.ceil(r/32),u=Math.ceil(i/32);for(let m=0;m<o;m++)s[m]=-1,n[m]=0;let a=0;for(;a<u-1;a++){let m=0,v=-1,I=a*32,A=Math.min(32,i)+I;for(let x=I;x<A;x++)nt[t.charCodeAt(x)]|=1<<x;for(let x=0;x<r;x++){let N=nt[e.charCodeAt(x)],T=s[x/32|0]>>>x&1,R=n[x/32|0]>>>x&1,F=N|m,D=((N|R)&v)+v^v|N|R,_=m|~(D|v),L=v&D;if(_>>>31^T)s[x/32|0]^=1<<x;if(L>>>31^R)n[x/32|0]^=1<<x;_=_<<1|T,L=L<<1|R,v=L|~(F|_),m=_&F}for(let x=I;x<A;x++)nt[t.charCodeAt(x)]=0}let l=0,f=-1,h=a*32,d=Math.min(32,i-h)+h;for(let m=h;m<d;m++)nt[t.charCodeAt(m)]|=1<<m;let g=i;for(let m=0;m<r;m++){let v=nt[e.charCodeAt(m)],I=s[m/32|0]>>>m&1,A=n[m/32|0]>>>m&1,x=v|l,N=((v|A)&f)+f^f|v|A,T=l|~(N|f),R=f&N;if(g+=T>>>i-1&1,g-=R>>>i-1&1,T>>>31^I)s[m/32|0]^=1<<m;if(R>>>31^A)n[m/32|0]^=1<<m;T=T<<1|I,R=R<<1|A,f=R|~(x|T),l=T&x}for(let m=h;m<d;m++)nt[t.charCodeAt(m)]=0;return g},Nn=(t,e)=>{if(t.length<e.length){let r=e;e=t,t=r}if(e.length===0)return t.length;if(t.length<=32)return Fn(t,e);return On(t,e)},Wr=(t,e)=>{let r=1/0,i=0;for(let n=0;n<e.length;n++){let s=Nn(t,e[n]);if(s<r)r=s,i=n}return e[i]};function Yt(t,e,r,i){let n=Wr(e,r);if(console.error(p.red(`Unknown ${t}: ${e}`)),n)console.error(p.yellow(`Did you mean "${n}"?`));console.error(`
83
+ Run "${i} --help" for usage.`),process.exit(1)}function Jt(t,e){let r=(n)=>n&&typeof n==="object";if(!r(t)||!r(e))return e;let i={...t};for(let n of Object.keys(e)){let s=i[n],o=e[n];if(Array.isArray(s)&&Array.isArray(o))i[n]=[...o];else if(r(s)&&r(o))i[n]=Jt(s,o);else i[n]=o}return i}var Ve="__exit__";class vt{command;env;prefix;options;constructor(t,e,r,i={}){this.command=t;this.env=e;this.prefix=r;this.options=i}get commandPath(){return this.prefix?`${this.prefix} ${this.command.name}`:this.command.name}async route(t,e){if(e&&process.stdout.isTTY!==!0)throw new y("Interactive mode requires a terminal","Pass a command and its arguments to run non-interactively");if(e)await this.routeInteractive();else await this.routeDirect(t)}async routeDirect(t){let[e,...r]=t;if(e&&this.command.hasSubcommands()){let i=this.command.getSubcommand(e);if(i){await this.handleSubcommandRoute(i,r);return}if(!e.startsWith("-")){this.handleUnknownSubcommand(e);return}}await this.executeCommand(t)}handleUnknownSubcommand(t){let e=this.command.getSubcommands().map((r)=>r.name);Yt("subcommand",t,e,this.commandPath)}async handleSubcommandRoute(t,e){await new vt(t,this.env,this.commandPath).route(e,!1)}async executeCommand(t){if(this.isHelpRequest(t)){this.printHelp(this.command);return}if(this.command.hasSubcommands()&&!this.command.execute){this.printHelp(this.command);return}if(!this.command.execute)return;let{args:r,rawPositionals:i}=Ne(t,this.command.args),n=Me(i,this.command.positionals),s=Br(n,this.command.positionals);if(s)w.error(s),console.error(`
84
+ Run "${this.commandPath} --help" for usage.`),process.exit(1);let o=this.command.prompts&&i.length===0&&process.stdout.isTTY===!0,u=this.buildContext(n,r,o);await this.command.execute(u)}async routeInteractive(){if(!this.command.hasSubcommands()){await this.executeInteractive();return}await this.runSubcommandMenu()}async executeInteractive(){let{args:t}=Ne([],this.command.args),e=Me([],this.command.positionals),r=this.buildContext(e,t,!0);await this.command.execute?.(r)}async runSubcommandMenu(){while(!0){let t=await this.promptSubcommandSelectionOrBack();if(t===null)return;if(t===Ve){this.options.onExit?.();return}let e=this.command.getSubcommand(t);if(e)await this.executeSubcommand(e)}}async promptSubcommandSelectionOrBack(){try{return await this.promptSubcommandSelection()}catch(t){if(t instanceof Y){if(this.options.isRoot)this.options.onExit?.();return null}throw t}}async executeSubcommand(t){try{await new vt(t,this.env,this.commandPath).route([],!0)}catch(e){if(e instanceof Y)return;if(e instanceof y){if(w.warn(p.yellow(e.message)),e.hint)w.info(p.dim(e.hint));yt(e);return}throw e}}promptSubcommandSelection(){let{isRoot:t}=this.options,e=t?{hint:this.env.cli.exitHint,label:this.env.cli.exitLabel??"Exit",value:Ve}:{hint:"Return to previous menu",label:"Back",value:Ve};return pt({message:t?this.env.cli.promptMessage??"Select:":`${this.command.name}:`,options:[...this.command.getSubcommands().map((r)=>({hint:r.description,label:r.name,value:r.name})),e]})}buildContext(t,e,r){return{...this.env,args:e,interactive:r,positionals:t}}isHelpRequest(t){let e=t.indexOf("--"),r=e<0?t:t.slice(0,e);return r.includes("--help")||r.includes("-h")}printHelp(t){let e=t===this.command?this.prefix:this.commandPath;console.log(this.env.formatHelp(t,e))}}var Mn={clearOnStart:!0,exitHint:"Close the CLI",exitLabel:"Exit",goodbyeMessage:"Goodbye!",name:"CLI",promptMessage:"What would you like to do?"};class Ge{commands=new Map;metadata;configManager;help;bin;globalArgs={help:{alias:"h",description:"Show help",type:"boolean"},interactive:{alias:"i",description:"Open interactive mode",type:"boolean"},version:{alias:"v",description:"Show version",type:"boolean"}};constructor(t,e){this.configManager=t,this.metadata={...Mn,...e},this.bin=this.metadata.bin??this.metadata.name,this.init(),this.help=new Ue({bin:this.bin,description:this.metadata.description,name:this.metadata.name,version:this.metadata.version},this.commands,this.globalArgs)}registerCommands(t){for(let e of t)e.init?.(),this.commands.set(e.name,e)}async run(t=process.argv.slice(2)){try{let{command:e,flags:r,restArgs:i}=Hr(t,this.globalArgs);if(r.version&&!e)return console.log(this.help.version());if(r.interactive&&!e)return await this.runInteractive();if(!e)return console.log(this.help.global());if(e==="help")return this.printHelpFor(i[0]);await this.runDirect(e,i,!!r.help)}catch(e){this.handleError(e)}}printHelpFor(t){if(!t)return console.log(this.help.global());let e=this.commands.get(t);if(!e)return this.handleUnknownCommand(t);console.log(this.help.command(e))}async runInteractive(){this.showIntro();let t=this.createVirtualRootCommand(),e={cli:this.metadata,config:this.configManager,formatHelp:this.help.command.bind(this.help)},r=new vt(t,e,this.bin,{isRoot:!0,onExit:()=>this.exit()});try{await r.route([],!0)}catch(i){this.handleError(i)}}createVirtualRootCommand(){return{description:this.metadata.description,getSubcommand:(t)=>this.commands.get(t),getSubcommands:()=>Array.from(this.commands.values()),hasSubcommands:()=>!0,name:this.metadata.name}}exit(){Bt(this.metadata.goodbyeMessage),process.exit(0)}async runDirect(t,e,r){let i=this.commands.get(t);if(!i)return this.handleUnknownCommand(t);let n=e.length>0&&!e[0]?.startsWith("-");if(r&&!n)return console.log(this.help.command(i));try{let s={cli:this.metadata,config:this.configManager,formatHelp:this.help.command.bind(this.help)};await new vt(i,s,this.bin).route(e,!1)}catch(s){this.handleError(s)}}showIntro(){if(this.metadata.clearOnStart)console.clear();let t=this.metadata.version?` v${this.metadata.version}`:"";Ht(`${p.bgCyan(p.black(` ${this.metadata.name}${t} `))}`)}handleUnknownCommand(t){let e=Array.from(this.commands.keys());Yt("command",t,e,this.bin)}handleError(t){if(this.metadata.onError?.(t))return;if(t instanceof Y)process.exit(0);if(t instanceof y){if(w.warn(p.yellow(t.message)),t.hint)w.info(p.dim(t.hint));yt(t),process.exit(t.exitCode)}if(t instanceof Error)w.error(p.red(t.message)),yt(t),process.exit(1);console.error(p.red("Error:"),t),process.exit(1)}}class _t{args={};positionals={};prompts=!1;subcommands=new Map;registerSubcommands(t){for(let e of t)e.init?.(),this.subcommands.set(e.name,e)}hasSubcommands(){return this.subcommands.size>0}getSubcommand(t){return this.subcommands.get(t)}getSubcommands(){return Array.from(this.subcommands.values())}}function Q(t){return t}function M(t){return t}import J from"fs";import zr from"path";var Xt=(t)=>(t.map=(e)=>Xt((r)=>e(t(r))),t.or=(e)=>Xt((r)=>{try{return t(r)}catch(i){return e(r)}}),t),Un=()=>"bad banditype"();var Kr=()=>Xt((t)=>t);var Vn=(t)=>Xt((e)=>e instanceof t?e:Un()),qr=(t)=>Vn(Object).map((e)=>{let r={};for(let i in e){let n=t(e[i]);n!==void 0&&(r[i]=n)}return r});var Gn=2,jn=qr(Kr());class je{config;configPath;defaultConfig;loadError;constructor(t,e){this.configPath=zr.resolve(t),this.defaultConfig=e,this.config=this.loadConfig()}get path(){return this.configPath}get(t){return this.config[t]}set(t,e){this.config[t]=e,this.save()}delete(t){delete this.config[t],this.save()}exists(){return J.existsSync(this.configPath)}getAll(){return structuredClone(this.config)}save(t){if(this.loadError)throw Error(`Cannot overwrite unreadable config at ${this.configPath}; repair the file and try again`,{cause:this.loadError});if(t)this.config={...t};this.ensureDirectoryExists();let e=this.exists()?J.realpathSync(this.configPath):this.configPath,r=`${e}.${crypto.randomUUID()}.tmp`;try{let i=this.exists()?J.statSync(this.configPath).mode:void 0;if(J.writeFileSync(r,JSON.stringify(this.config,null,Gn),{flag:"wx",mode:i}),i!==void 0)J.chmodSync(r,i);J.renameSync(r,e)}catch(i){throw Error(`Failed to save config to ${this.configPath}`,{cause:i})}finally{J.rmSync(r,{force:!0})}}ensureDirectoryExists(){let t=zr.dirname(this.configPath);if(!J.existsSync(t))try{J.mkdirSync(t,{recursive:!0})}catch(e){throw Error(`Failed to create config directory at ${t}`,{cause:e})}}loadConfig(){if(!J.existsSync(this.configPath))return structuredClone(this.defaultConfig);try{let t=J.readFileSync(this.configPath,"utf-8"),e=JSON.parse(t);if(Array.isArray(e))throw Error("Config must be an object");let r=jn(e);return Jt(structuredClone(this.defaultConfig),r)}catch(t){return this.loadError=t,console.warn(`Config file corrupted at ${this.configPath}. Using defaults.`),structuredClone(this.defaultConfig)}}}var Yr="0.9.4";class P extends _t{}var Zt="hydra";var Jr=".hydra/config.json",tt=".hydra/shared",At=".hydra/runners",Tt="default",Xr={profiles:{}},Zr=!1,Qr=24,Qt=7,ti=["logs","shared"];import{spawn as Jn}from"child_process";import{once as Xn}from"events";import{existsSync as wt}from"fs";import{cp as Zn,link as Qn,mkdir as re,mkdtemp as ts,readdir as oi,readFile as We,readlink as es,rename as rs,rm as ft,stat as is,symlink as ns,unlink as ai,writeFile as ss}from"fs/promises";import{join as S,resolve as Ke}from"path";var Bn=new Set(["github.com","www.github.com"]);var ei=/\.git$/;function mt(t){let e;try{e=new URL(t)}catch{throw Error(`Invalid GitHub URL: ${t}`)}if(e.protocol!=="https:"&&e.protocol!=="http:")throw Error(`Invalid GitHub URL (expected http(s)): ${t}`);if(!Bn.has(e.hostname))throw Error(`Invalid GitHub URL (host must be github.com): ${t}`);let r=e.pathname.split("/").filter(Boolean);if(r.length===1){let i=r[0]?.replace(ei,"");if(!i)throw Error(`Invalid GitHub URL: ${t}`);return{kind:"org",org:i}}if(r.length===2){let i=r[0],n=r[1]?.replace(ei,"");if(!i||!n)throw Error(`Invalid GitHub URL: ${t}`);return{kind:"repo",owner:i,repo:n}}throw Error(`Invalid GitHub URL (expected github.com/<owner>/<repo> or github.com/<org>): ${t}`)}function te(t){return t.kind==="repo"?`${t.owner}/${t.repo}`:t.org}import{existsSync as Wn}from"fs";import{readdir as Kn,stat as qn}from"fs/promises";import{join as zn}from"path";var Dt="_diag",ri={runner:/^Runner_.+\.log$/,worker:/^Worker_.+\.log$/},ii=1024,ni=["B","KB","MB","GB"],Yn=1;function si(t){if(ri.worker.test(t))return"worker";if(ri.runner.test(t))return"runner";return null}function ee(t){return[...t].sort((e,r)=>r.mtime.getTime()-e.mtime.getTime())}async function kt(t){if(!Wn(t))return[];let e=await Kn(t,{withFileTypes:!0}),r=[];for(let i of e){if(!i.isFile())continue;let n=si(i.name);if(!n)continue;let s=zn(t,i.name),o=await qn(s);r.push({mtime:o.mtime,name:i.name,path:s,size:o.size,type:n})}return ee(r)}function He(t,e){let r=t.find((n)=>n.type===e);if(r)return{fallback:!1,file:r};let i=t[0];return i?{fallback:!0,file:i}:null}function Be(t,e){if(e<=0)return"";let r=t.endsWith(`
85
+ `)?t.slice(0,-1):t;if(r==="")return"";return r.split(`
86
+ `).slice(-e).join(`
87
+ `)}function ht(t){let e=t,r=0;while(e>=ii&&r<ni.length-1)e/=ii,r++;return`${r===0?String(e):e.toFixed(Yn)} ${ni[r]??"B"}`}var ui="actions/runner",os={linux:"linux-x64",osx:"osx-arm64",windows:"win-x64"},qe=["bin"],ze=["externals"],as=1,us=5000,ls=50,cs=5000,ps=50;class ie{profile;sharedPath=null;constructor(t){this.profile=t}async download(){let t=os[this.profile.os],e=await this.getLatestVersion(),r=S(tt,"github",e);if(await this.isCompleteDownload(r))return this.sharedPath=r,{path:r,version:e};let i=S(tt,"github");await re(i,{recursive:!0});let n=await ts(S(tt,`.github-${e}-`)),s=`actions-runner-${t}-${e}.tar.gz`,o=S(n,s),u=`https://github.com/${ui}/releases/download/v${e}/${s}`;try{if(await Bun.$`curl --fail --silent --show-error --location -o ${o} ${u}`,await Bun.$`tar xzf ${o} -C ${n}`,await ai(o),!await this.isCompleteDownload(n))throw new y(`Runner v${e} archive is incomplete`);await this.publishDownload(n,r,e)}finally{await ft(n,{force:!0,recursive:!0})}return this.sharedPath=r,{path:r,version:e}}async create(t){let e=await this.ensureDownloaded(),r=[];for(let i of t){let n=S(this.profile.directory,i);if(wt(n))throw new y(`Runner directory already exists: ${n}`,"Remove or recover this runner before creating it again");try{await this.setupRunnerDir(e,n),await this.registerRunner(n,i)}catch(s){if(!wt(S(n,".runner")))await ft(n,{force:!0,recursive:!0});throw s}r.push({directory:n,id:i,name:i,status:"registered"})}return r}async remove(t){for(let e of t){let r=S(this.profile.directory,e);if(!wt(S(r,".runner")))continue;let i=await this.fetchRemovalToken(r),n=await Bun.$`bash ./config.sh remove --token ${i}`.cwd(r).quiet().nothrow();if(n.exitCode!==0)throw new y(`Failed to deregister runner ${e}`,n.stderr.toString().trim()||"Runner files have been preserved; retry removal")}}async start(t){for(let e of t){let r=S(this.profile.directory,e),i=await this.readPidFile(r);if(i&&this.isProcessRunning(i))continue;let n=Jn("bash",["./run.sh"],{cwd:Ke(r),detached:!0,stdio:"ignore"});if(await Xn(n,"spawn"),n.pid===void 0)throw new y(`Failed to start runner ${e}`);n.unref(),await this.writePidFile(r,n.pid)}}async stop(t){for(let e of t){let r=S(this.profile.directory,e),i=await this.readPidFile(r);if(i&&this.isProcessRunning(i)){try{process.kill(-i,"SIGTERM")}catch(s){if(s.code!=="ESRCH")throw s;try{process.kill(i,"SIGTERM")}catch(o){if(o.code!=="ESRCH")throw o}}let n=Date.now()+us;while(this.isProcessRunning(i)){if(Date.now()>=n)throw new y(`Runner ${e} did not stop`,"Wait for its current job to finish and retry");await Bun.sleep(ls)}}await this.removePidFile(r)}}async list(){let t=this.profile.directory;if(!wt(t))return[];let e=await oi(t,{withFileTypes:!0}),r=[];for(let i of e){if(!i.isDirectory())continue;let n=S(t,i.name);r.push(await this.getRunnerStatus(n,i.name))}return r}async currentVersion(t){let e=S(this.profile.directory,t);return this.detectVersion(e)}async logFiles(t){return kt(S(this.profile.directory,t,Dt))}async update(t){let e=await this.ensureDownloaded();for(let r of t){let i=S(this.profile.directory,r);await this.removeRunnerBinaries(i),await this.setupRunnerDir(e,i)}}async getRunnerStatus(t,e){let r=await this.readRunnerName(t),i=await this.readPidFile(t),n=i!==null&&this.isProcessRunning(i),s="unknown";if(n)s="running";else if(wt(S(t,".runner")))s="registered";return{directory:t,id:e,name:r,pid:n?i:void 0,status:s}}async ensureDownloaded(){if(this.sharedPath)return this.sharedPath;let{path:t}=await this.download();return t}async isCompleteDownload(t){try{return(await Promise.all(["bin","externals","config.sh","run.sh"].map((r)=>is(S(t,r))))).every((r,i)=>i<qe.length+ze.length?r.isDirectory():r.isFile())}catch(e){if(e.code==="ENOENT")return!1;throw e}}async publishDownload(t,e,r){let i=S(tt,`.github-${r}.lock`),n=Date.now()+cs;while(!0)try{await re(i);break}catch(s){if(s.code!=="EEXIST")throw s;if(Date.now()>=n)throw new y(`Runner download is locked: ${i}`,"Retry after other Hydra downloads finish; remove a stale lock only when no download is running");await Bun.sleep(ps)}try{if(await this.isCompleteDownload(e))return;await ft(e,{force:!0,recursive:!0}),await rs(t,e)}finally{await ft(i,{force:!0,recursive:!0})}}async setupRunnerDir(t,e){await re(e,{recursive:!0});for(let r of qe)await this.hardLinkDir(S(t,r),S(e,r));for(let r of ze){let i=Ke(t,r),n=S(e,r);if(!wt(n))await ns(i,n)}for(let r of["*.sh","*.sh.template"]){let i=await Array.fromAsync(new Bun.Glob(r).scan(t));for(let n of i)await Zn(S(t,n),S(e,n))}}async registerRunner(t,e){let r=await this.fetchRegistrationToken(),i=["--url",this.profile.url,"--token",r,"--name",e,"--unattended","--disableupdate"];if(this.profile.labels)i.push("--labels",this.profile.labels);if(this.profile.runnerGroup)i.push("--runnergroup",this.profile.runnerGroup);await Bun.$`bash ./config.sh ${i}`.cwd(t).quiet()}async fetchRegistrationToken(){return this.fetchRunnerToken(mt(this.profile.url),"registration-token")}async fetchRemovalToken(t){let e=await We(S(t,".runner"),"utf-8"),i=JSON.parse(this.stripBom(e)).gitHubUrl;if(!i)throw Error("Cannot determine GitHub URL from runner config");return this.fetchRunnerToken(mt(i),"remove-token")}async fetchRunnerToken(t,e){let r=t.kind==="repo"?`repos/${t.owner}/${t.repo}/actions/runners/${e}`:`orgs/${t.org}/actions/runners/${e}`,i=t.kind==="repo"?"gh needs admin access to the repository":"gh needs the admin:org scope",n=await Bun.$`gh api ${r} --method POST --jq .token`.quiet().nothrow();if(n.exitCode!==0){let o=n.stderr.toString().trim();throw Error(`gh api ${r} failed for ${te(t)} (${i})${o?`: ${o}`:""}`)}let s=n.stdout.toString().trim();if(!s)throw Error(`Failed to fetch ${e} for ${te(t)}`);return s}async getLatestVersion(){return(await Bun.$`gh api repos/${ui}/releases/latest --jq .tag_name`.quiet()).stdout.toString().trim().replace(/^v/,"")}pidFilePath(t){return Ke(t,".pid")}async writePidFile(t,e){await ss(this.pidFilePath(t),String(e))}async readPidFile(t){try{let e=await We(this.pidFilePath(t),"utf-8"),r=Number(e.trim());return Number.isSafeInteger(r)&&r>as?r:null}catch{return null}}async removePidFile(t){try{await ai(this.pidFilePath(t))}catch{}}async readRunnerName(t){try{let e=await We(S(t,".runner"),"utf-8");return JSON.parse(this.stripBom(e)).agentName??"unknown"}catch{return"unknown"}}async hardLinkDir(t,e){await re(e,{recursive:!0});let r=await oi(t,{withFileTypes:!0});for(let i of r){let n=S(t,i.name),s=S(e,i.name);if(i.isDirectory())await this.hardLinkDir(n,s);else await Qn(n,s)}}async detectVersion(t){try{return(await es(S(t,"externals"))).match(/github\/([^/]+)/)?.[1]??null}catch{return null}}async removeRunnerBinaries(t){for(let e of qe)await ft(S(t,e),{force:!0,recursive:!0});for(let e of ze)await ft(S(t,e),{force:!0});for(let e of["*.sh","*.sh.template"]){let r=await Array.fromAsync(new Bun.Glob(e).scan(t));for(let i of r)await ft(S(t,i),{force:!0})}}stripBom(t){return t.replace(/^\uFEFF/,"")}isProcessRunning(t){try{return process.kill(t,0),!0}catch(e){return e.code==="EPERM"}}}import{existsSync as Je}from"fs";import{readdir as Xe,readFile as ds,readlink as ms,rm as Ze,stat as hs}from"fs/promises";import{join as ut}from"path";var li="_work",fs="externals",gs=".pid",ys="github",$s=/github\/([^/]+)/,vs=["runner","worker"],ws=24,ci=3600000,Ye=10;function ne(t){return{auto:t?.auto??Zr,intervalHours:t?.intervalHours??Qr,lastRun:t?.lastRun,olderThanDays:t?.olderThanDays??Qt,targets:t?.targets??ti}}function pi(t,e){return t-e*ws*ci}function Qe(t,e){if(!t.lastRun)return!0;let r=Date.parse(t.lastRun);if(Number.isNaN(r))return!0;return e-r>=t.intervalHours*ci}function di(t,e){let r=ee(t),i=new Set;for(let n of vs){let s=r.find((o)=>o.type===n);if(s)i.add(s.path)}return r.filter((n)=>!i.has(n.path)&&n.mtime.getTime()<e)}function mi(t){return[...t].sort(Ss)[0]??null}function hi(t,e){let r=mi(t),i=new Set(e);return t.filter((n)=>n!==r&&!i.has(n))}function fi(t){return t.match($s)?.[1]??null}function se(t){return Object.values(t).reduce((e,r)=>e+r.freedBytes,0)}async function gi(t){try{let e=await ds(ut(t,gs),"utf-8"),r=Number.parseInt(e.trim(),Ye);if(Number.isNaN(r))return!1;return process.kill(r,0),!0}catch{return!1}}async function oe(t){if(!Je(t))return 0;let e=await Xe(t,{withFileTypes:!0}),r=0;for(let i of e){if(i.isSymbolicLink())continue;let n=ut(t,i.name);if(i.isDirectory()){r+=await oe(n);continue}if(i.isFile()){let s=await hs(n);r+=s.size}}return r}async function ae(t){let e=pi(t.now,t.olderThanDays),r={};for(let i of t.targets)switch(i){case"logs":r.logs=await bs(t.entries,e,t.dryRun);break;case"work":r.work=await Cs(t.entries,t.dryRun);break;case"shared":r.shared=await xs(t.entries,t.dryRun,t.sharedDir);break}return r}async function bs(t,e,r){let i={freedBytes:0,removed:0,skipped:[]};for(let n of t){let s=await kt(ut(n.directory,Dt));for(let o of di(s,e)){if(!r)await Ze(o.path,{force:!0});i.removed++,i.freedBytes+=o.size}}return i}async function Cs(t,e){let r={freedBytes:0,removed:0,skipped:[]};for(let i of t){if(await gi(i.directory)){r.skipped.push(i.id);continue}let n=ut(i.directory,li);if(!Je(n))continue;let s=await Xe(n);if(s.length===0)continue;if(r.freedBytes+=await oe(n),r.removed+=s.length,e)continue;for(let o of s)await Ze(ut(n,o),{force:!0,recursive:!0})}return r}async function xs(t,e,r){let i={freedBytes:0,removed:0,skipped:[]},n=r??ut(tt,ys);if(!Je(n))return i;let o=(await Xe(n,{withFileTypes:!0})).filter((a)=>a.isDirectory()).map((a)=>a.name),u=await Rs(t);for(let a of hi(o,u)){let l=ut(n,a);if(i.freedBytes+=await oe(l),i.removed++,!e)await Ze(l,{force:!0,recursive:!0})}return i}async function Rs(t){let e=[];for(let r of t)try{let i=await ms(ut(r.directory,fs)),n=fi(i);if(n)e.push(n)}catch{}return e}function Ss(t,e){let r=t.split(".").map((s)=>Number.parseInt(s,Ye)),i=e.split(".").map((s)=>Number.parseInt(s,Ye)),n=Math.max(r.length,i.length);for(let s=0;s<n;s++){let o=r[s]??0,u=i[s]??0,a=Number.isNaN(o)?0:o,l=Number.isNaN(u)?0:u;if(a!==l)return l-a}return 0}function U(t){switch(t.provider){case"github":return new ie(t);default:throw Error(`Runner provider "${t.provider}" is not yet implemented`)}}var $i=0,Is={logs:"file(s)",shared:"version(s)",work:"item(s)"},yi=Q({days:{alias:"d",default:$i,description:"Override log retention",displayDefault:`config or ${Qt} days`,type:"number"},dryRun:{alias:"n",default:!1,description:"Preview cleanup without deleting",type:"boolean"},logs:{alias:"l",default:!1,description:"Remove old diagnostic logs",type:"boolean"},shared:{alias:"s",default:!1,description:"Remove unused runner versions",type:"boolean"},work:{alias:"w",default:!1,description:"Clear stopped runners' workspaces",type:"boolean"},yes:{alias:"y",default:!1,description:"Skip workspace confirmation",type:"boolean"}});class ue extends P{name="cleanup";description="Remove logs, workspaces, and old runner versions";args=yi;async execute(t){O(t.args,yi,"Run 'hydra cleanup --help' for supported options");let e=t.config.get("profiles");if(Object.keys(e).length===0)throw new y("No profiles configured","Run hydra init to set up a profile");let r=ne(t.config.get("cleanup")),i=this.explicitTargets(t),n=i.length>0?i:r.targets,s=t.args.days>$i?t.args.days:r.olderThanDays;if(n.includes("work")&&!t.args.dryRun&&!t.args.yes){if(!await ct({message:"Delete _work contents (checkouts and caches) of stopped runners?"}))n=n.filter((a)=>a!=="work")}let o=await ae({dryRun:t.args.dryRun,entries:t.config.get("runners")??[],now:Date.now(),olderThanDays:s,targets:n});if(this.printReport(o,t.args.dryRun),t.args.dryRun)return;t.config.set("cleanup",{...t.config.get("cleanup"),lastRun:new Date().toISOString()})}explicitTargets(t){let e=[];if(t.args.logs)e.push("logs");if(t.args.work)e.push("work");if(t.args.shared)e.push("shared");return e}printReport(t,e){let r=[];for(let[s,o]of Object.entries(t)){if(!o)continue;let u=Is[s],a=ht(o.freedBytes),l=e?`would remove ${o.removed} ${u}, ${a}`:`removed ${o.removed} ${u}, freed ${a}`;if(r.push(`${p.bold(s)}: ${o.removed>0?l:p.dim("nothing to do")}`),o.skipped.length>0)r.push(p.dim(` skipped running runner(s): ${o.skipped.join(", ")}`))}if(r.length===0){w.info(p.dim("Nothing to clean."));return}let i=se(t),n=e?"Would free":"Freed";r.push(p.dim(`${n} ${ht(i)} total`)),w.info(r.join(`
88
+ `))}}async function le(t){try{let e=ne(t.config.get("cleanup"));if(!e.auto)return;if(!Qe(e,Date.now()))return;let r=await ae({dryRun:!1,entries:t.config.get("runners")??[],now:Date.now(),olderThanDays:e.olderThanDays,targets:e.targets});t.config.set("cleanup",{...t.config.get("cleanup"),lastRun:new Date().toISOString()});let i=se(r);if(i>0)w.info(p.dim(`Auto cleanup freed ${ht(i)}`))}catch(e){let r=e instanceof Error?e.message:String(e);w.warn(p.yellow(`Auto cleanup failed: ${r}`))}}import{existsSync as vi}from"fs";import{join as wi}from"path";function bt(t,e){if(t.length===0)return e;for(let r of t)if(!e.includes(r))throw new y(`Runner "${r}" not found`);return t}function j(t,e){let r=t.get("profiles");if(Object.keys(r).length===0)throw new y("No profiles configured","Run hydra init to set up a profile");let i=e??t.get("defaultProfile")??Tt,n=r[i];if(!n)throw new y(`Profile "${i}" not found`);return{name:i,profile:n}}async function z(t){let e=t.get("profiles"),r=Object.keys(e);if(r.length===0)throw new y("No profiles configured","Run hydra init to set up a profile");if(r.length===1)return r[0];return pt({message:"Select profile",options:r.map((i)=>({label:i,value:i,hint:e[i]?.url}))})}var Es=M({profile:{description:"Profile to use"},count:{description:"Runner count override"}});class ce extends P{name="create";description="Download and register runners";positionals=Es;async execute(t){O(t.args,this.args,"Run 'hydra create --help' for supported options");let{name:e,profile:r}=t.interactive?j(t.config,await z(t.config)):j(t.config,t.positionals.profile),i=t.interactive?await this.promptCount(r.numberOfMachines):t.positionals.count?Number.parseInt(t.positionals.count,10):r.numberOfMachines;if(!i||i<1)throw new y("Runner count must be at least 1");let n=t.config.get("runners")??[],s=n.filter((m)=>m.profile===e),o=i-s.length;if(o<=0){w.warn(`Already have ${s.length} runner(s) for profile "${e}". Nothing to create.`);return}let u=U(r),a=W();a.start("Downloading runner binary...");let{version:l}=await u.download();a.stop(`Runner v${l} ready`);let f=new Set(n.map((m)=>m.id)),h=1;for(let m=0;m<o;){let v=`${r.name}-${h++}`;if(f.has(v))continue;m++;let I={createdAt:new Date().toISOString(),directory:wi(r.directory,v),id:v,name:v,profile:e,provider:r.provider,url:r.url},A=vi(I.directory);a.start(`Registering ${v}...`);try{await u.create([v])}finally{if(!A&&vi(wi(I.directory,".runner")))n.push(I),t.config.set("runners",n)}a.stop(`${p.green("+")} ${v}`)}let g=e===t.config.get("defaultProfile")?"":` ${e}`;w.info(`${p.green("Created")} ${o} runner(s) for "${e}". Run ${p.green(`hydra start${g}`)} to start them.`)}async promptCount(t){let e=await it({initialValue:String(t),message:"Number of runners to create",validate:(r)=>{let i=Number.parseInt(r??"",10);if(Number.isNaN(i)||i<1)return"Must be a positive number";return}});return Number.parseInt(e,10)}}import{existsSync as bi}from"fs";import{mkdir as Ci}from"fs/promises";var Ps=M({url:{description:"GitHub repository or organization URL"}}),_s=Q({force:{alias:"f",default:!1,description:"Overwrite an existing profile",type:"boolean"},labels:{alias:"l",description:"Set comma-separated runner labels",type:"string"},name:{alias:"n",description:"Set the runner name prefix",type:"string"},profile:{alias:"p",description:"Set the profile name",type:"string"},runners:{alias:"c",description:"Set the runner count",type:"number"}});class pe extends P{name="init";description="Set up a runner profile";positionals=Ps;args=_s;prompts=!0;async execute(t){O(t.args,this.args,"Run 'hydra init --help' for supported options");let e=t.interactive?await this.promptProfileName(t):t.args.profile??Tt,r=!t.config.exists();if(!r&&t.config.get("profiles")[e]&&!t.args.force){if(!t.interactive)throw new y(`Profile "${e}" already exists. Use --force to overwrite.`);if(!await ct({initialValue:!1,message:`Profile "${e}" already exists. Overwrite?`}))return}await this.ensureDirectories();let n=t.interactive?await this.runInitForm():this.buildProfileFromArgs(t),s=r?{}:{...t.config.get("profiles")};if(s[e]=n,t.config.set("profiles",s),!t.config.get("defaultProfile"))t.config.set("defaultProfile",e);gt([`${p.dim("Profile:")} ${e}`,`${p.dim("URL:")} ${n.url}`,`${p.dim("Runners:")} ${n.numberOfMachines}`,`${p.dim("Name:")} ${n.name}`,n.labels?`${p.dim("Labels:")} ${n.labels}`:"","",`Run ${p.green(`${Zt} create${e!==t.config.get("defaultProfile")?` ${e}`:""}`)} to provision runners.`].filter(Boolean).join(`
89
+ `),p.green(r?"Hydra initialized":`Profile "${e}" added`))}async promptProfileName(t){return it({initialValue:t.args.profile??Tt,message:"Profile name"})}async ensureDirectories(){if(!bi(tt))await Ci(tt,{recursive:!0});if(!bi(At))await Ci(At,{recursive:!0})}async runInitForm(){let t=await jt({url:()=>it({message:"GitHub repository or organization URL",placeholder:"https://github.com/owner/repo",validate:(e)=>{if(!e)return"URL is required";try{mt(e)}catch{return"Must be a GitHub repository or organization URL (https://github.com/<owner>/<repo> or https://github.com/<org>)"}return}}),name:()=>it({initialValue:"runner",message:"Base name for runners",placeholder:"runner"}),runners:()=>it({initialValue:"1",message:"Number of runners",placeholder:"1",validate:(e)=>{if(!e)return"Must be a positive number";let r=Number.parseInt(e,10);if(Number.isNaN(r)||r<1)return"Must be a positive number";return}}),labels:()=>it({message:"Additional labels (comma-separated, optional)",placeholder:"self-hosted,macOS,ARM64"})},{onCancel:()=>{throw new Y}});return{directory:At,labels:t.labels||void 0,name:t.name,numberOfMachines:Number.parseInt(t.runners,10)||1,os:this.detectOs(),overwrite:!1,provider:"github",run:!1,url:t.url}}buildProfileFromArgs(t){if(!t.positionals.url)throw new y("URL is required","Usage: hydra init <url>");return this.validateUrl(t.positionals.url),this.validateRunnerCount(t.args.runners),{directory:At,labels:t.args.labels,name:t.args.name??"runner",numberOfMachines:t.args.runners??1,os:this.detectOs(),overwrite:!1,provider:"github",run:!1,url:t.positionals.url}}validateUrl(t){try{mt(t)}catch(e){throw new y(e instanceof Error?e.message:`Invalid GitHub URL: ${t}`,"Expected https://github.com/<owner>/<repo> or https://github.com/<org>")}}validateRunnerCount(t){if(t!==void 0&&t<1)throw new y("Runner count must be at least 1")}detectOs(){let t=process.platform;if(t==="darwin")return"osx";if(t==="win32")return"windows";return"linux"}}import{existsSync as As}from"fs";import{readFile as Ts}from"fs/promises";var Ds=100,ks={runner:"runner daemon log",worker:"job log"},Ls=Q({lines:{alias:"n",default:Ds,description:"Number of lines to show",type:"number"},list:{alias:"l",default:!1,description:"List log files instead of showing one",type:"boolean"},open:{alias:"o",default:!1,description:"Open the log file",type:"boolean"},runner:{alias:"r",default:!1,description:"Show the runner log instead of a job log",type:"boolean"}}),Fs=M({id:{description:"Runner ID"}});class de extends P{name="logs";description="Show recent runner logs";args=Ls;positionals=Fs;async execute(t){let e=t.config.get("runners")??[];if(e.length===0)throw new y("No runners found","Run hydra create to provision runners");let r=await this.resolveEntry(t,e),i=t.config.get("profiles")[r.profile];if(!i)throw new y(`Profile "${r.profile}" not found for runner "${r.id}"`,"Run hydra init to set it up");if(!As(r.directory))throw new y(`Runner directory not found: ${r.directory}`,"Run hydra create to provision this runner");let s=await U(i).logFiles(r.id);if(s.length===0)this.noLogs(r.id);if(t.args.list){this.printList(r,s);return}let o=this.selectFile(t,r,s);if(t.args.open){await this.openFile(o);return}await this.printTail(r,o,t.args.lines)}async resolveEntry(t,e){let r=t.positionals.id;if(r){let n=e.find((s)=>s.id===r);if(!n)throw new y(`Runner "${r}" not found`,`Known runners: ${e.map((s)=>s.id).join(", ")}`);return n}if(t.interactive)return pt({message:"Select runner",options:e.map((n)=>({hint:n.profile,label:n.name,value:n}))});let i=e[0];if(e.length===1&&i)return i;throw new y("Multiple runners found",`Pass a runner id: hydra logs <id> (${e.map((n)=>n.id).join(", ")})`)}selectFile(t,e,r){if(t.args.runner){let n=r.find((s)=>s.type==="runner");if(!n)throw new y(`No runner daemon logs found for "${e.id}"`,"Start the runner first: hydra start");return n}let i=He(r,"worker");if(!i)this.noLogs(e.id);if(i.fallback)w.warn(p.yellow("No job (Worker) logs yet; showing the runner daemon log instead"));return i.file}noLogs(t){throw new y(`No logs found for runner "${t}"`,"Logs appear once the runner has started; run hydra start")}printList(t,e){let r=[`${p.bold(t.name)} ${p.dim(t.directory)}`];for(let i of e){let n=i.type==="worker"?p.green("worker"):p.blue("runner");r.push(` ${n} ${i.name} ${p.dim(`${i.mtime.toISOString()} \xB7 ${ht(i.size)}`)}`)}w.info(r.join(`
90
+ `))}async printTail(t,e,r){let i=await Ts(e.path,"utf-8"),n=[`${p.bold(t.name)} ${p.dim(ks[e.type])}`,p.dim(e.path),p.dim(`Last modified: ${e.mtime.toISOString()}`)];w.info(n.join(`
91
+ `)),console.log(Be(i,r))}async openFile(t){let e=(process.env.EDITOR??"").split(" ").filter(Boolean),r=e[0];if(r){await Bun.spawn([r,...e.slice(1),t.path],{stderr:"inherit",stdin:"inherit",stdout:"inherit"}).exited;return}if(process.platform==="darwin"){await Bun.$`open ${t.path}`.quiet();return}throw new y("No editor configured","Set $EDITOR to open log files")}}var Os=M({name:{description:"Profile name to set as default"}});class tr extends P{name="default";description="Set the default profile";positionals=Os;async execute(t){O(t.args,this.args,"Run 'hydra profile default --help' for supported options");let e=t.interactive?await z(t.config):t.positionals.name;if(!e)throw new y("Profile name is required","Usage: hydra profile default <name>");let{name:r}=j(t.config,e);if(t.config.get("defaultProfile")===r){w.info(`"${r}" is already the default profile.`);return}t.config.set("defaultProfile",r),w.info(`${p.green("Default profile set to")} "${r}".`)}}class er extends P{name="list";description="List profiles";async execute(t){let e=t.config.get("profiles"),r=Object.keys(e);if(r.length===0)throw new y("No profiles configured","Run hydra init to set up a profile");let i=t.config.get("runners")??[],n=t.config.get("defaultProfile");for(let s of r){let o=e[s],a=await U(o).list(),l=i.filter((v)=>v.profile===s),f=new Set(a.filter((v)=>v.status==="running").map((v)=>v.id)),h=l.filter((v)=>f.has(v.id)).length,d=s===n,g=[`${p.dim("URL:")} ${o.url}`,`${p.dim("Provider:")} ${o.provider}`,`${p.dim("OS:")} ${o.os}`,`${p.dim("Name:")} ${o.name}`,`${p.dim("Runners:")} ${l.length}/${o.numberOfMachines} created, ${p.green(`${h} running`)}`];if(o.labels)g.push(`${p.dim("Labels:")} ${o.labels}`);let m=d?`${s} ${p.dim("(default)")}`:s;gt(g.join(`
92
+ `),m)}w.info(p.dim(`${r.length} profile(s)`))}}import{rm as Ns}from"fs/promises";import{join as Ms}from"path";var Us=M({name:{description:"Profile name to remove"}}),Vs=Q({yes:{alias:"y",default:!1,description:"Skip runner removal confirmation",type:"boolean"}});class rr extends P{name="remove";description="Delete a profile and its runners";positionals=Us;args=Vs;async execute(t){O(t.args,this.args,"Run 'hydra profile remove --help' for supported options");let e=t.interactive?await z(t.config):t.positionals.name;if(!e)throw new y("Profile name is required","Usage: hydra profile remove <name>");let{profile:r}=j(t.config,e),i=t.config.get("runners")??[],n=i.filter((a)=>a.profile===e);if(n.length>0){if(!t.args.yes){if(!process.stdout.isTTY)throw new y("Runner removal requires confirmation","Pass --yes to remove the profile and its runners without a prompt");if(!await ct({initialValue:!0,message:`This will stop and remove ${n.length} runner(s). Continue?`}))return}await this.removeRunners(t,r,n.map((l)=>l.id));let a=i.filter((l)=>l.profile!==e);t.config.set("runners",a)}let{[e]:s,...o}=t.config.get("profiles");if(t.config.set("profiles",o),t.config.get("defaultProfile")===e){let a=Object.keys(o);t.config.set("defaultProfile",a[0])}w.info(`${p.green("Removed")} profile "${e}".`)}async removeRunners(t,e,r){let i=U(e),n=W();for(let s of r)n.start(`Stopping and removing ${s}...`),await i.stop([s]),await i.remove([s]),await Ns(Ms(e.directory,s),{force:!0,recursive:!0}),t.config.set("runners",(t.config.get("runners")??[]).filter((o)=>o.id!==s)),n.stop(`${p.red("-")} ${s}`)}}class me extends P{name="profile";description="Manage profiles";init(){this.registerSubcommands([new er,new rr,new tr])}}import{rm as Gs}from"fs/promises";import{join as js}from"path";var Hs=M({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class he extends P{name="remove";description="Deregister and delete runners";positionals=Hs;async execute(t){O(t.args,this.args,"Run 'hydra remove --help' for supported options");let{name:e,profile:r}=t.interactive?j(t.config,await z(t.config)):j(t.config,t.positionals.profile),n=(t.config.get("runners")??[]).filter((a)=>a.profile===e);if(n.length===0)throw new y(`No runners found for profile "${e}"`,"Run hydra create to provision runners");let s=t.interactive?await this.promptRunnerSelection(n.map((a)=>a.id)):bt(t.positionals.ids??[],n.map((a)=>a.id)),o=U(r),u=W();for(let a of s)u.start(`Stopping and removing ${a}...`),await o.stop([a]),await o.remove([a]),await Gs(js(r.directory,a),{force:!0,recursive:!0}),t.config.set("runners",(t.config.get("runners")??[]).filter((l)=>l.id!==a)),u.stop(`${p.red("-")} ${a}`);w.info(`${p.green("Removed")} ${s.length} runner(s).`)}async promptRunnerSelection(t){return dt({message:"Select runners to remove",options:t.map((e)=>({label:e,value:e})),required:!0})}}var Bs=M({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class fe extends P{name="start";description="Start runners";positionals=Bs;async execute(t){O(t.args,this.args,"Run 'hydra start --help' for supported options");let{name:e,profile:r}=t.interactive?j(t.config,await z(t.config)):j(t.config,t.positionals.profile),n=(t.config.get("runners")??[]).filter((d)=>d.profile===e);if(n.length===0)throw new y(`No runners found for profile "${e}"`,"Run hydra create to provision runners");let s=U(r),o=W();o.start("Fetching runner status...");let u=await s.list();o.stop("Runner status fetched");let a=new Set(u.filter((d)=>d.status==="running").map((d)=>d.id)),l=n.map((d)=>d.id).filter((d)=>!a.has(d)),f=t.interactive?await this.promptRunnerSelection(l):bt(t.positionals.ids??[],n.map((d)=>d.id)),h=0;for(let d of f){if(a.has(d)){o.start(""),o.stop(`${p.dim("\u25CF")} ${d} ${p.dim("already running")}`);continue}o.start(`Starting ${d}...`),await s.start([d]),o.stop(`${p.green("\u25B6")} ${d}`),h++}w.info(`${p.green("Started")} ${h} runner(s).`),await le(t)}async promptRunnerSelection(t){if(t.length===0)throw new y("All runners are already running");return dt({message:"Select runners to start",options:t.map((e)=>({label:e,value:e})),required:!0})}}var Ws={registered:p.yellow,running:p.green,stopped:p.red,unknown:p.dim};class ge extends P{name="status";description="Show status across profiles";async execute(t){let e=t.config.get("profiles"),r=Object.keys(e);if(r.length===0)throw new y("No profiles configured","Run hydra init to set up a profile");let i=t.config.get("runners")??[],n=0,s=0,o=[];for(let u of r){let a=e[u],f=await U(a).list();if(o.length>0)o.push("");o.push(`${p.bold(u)} ${p.dim(a.url)}`);let h=new Set(i.filter((g)=>g.profile===u).map((g)=>g.id)),d=f.filter((g)=>h.has(g.id)).sort((g,m)=>g.name.localeCompare(m.name,void 0,{numeric:!0}));this.formatRunners(d,o),n+=d.length,s+=d.filter((g)=>g.status==="running").length}o.push(""),o.push(p.dim(`${n} runner(s) total, ${s} running`)),w.info(o.join(`
93
+ `))}formatRunners(t,e){if(t.length===0){e.push(p.dim(" No runners."));return}for(let r of t){let i=Ws[r.status]??p.dim,n=r.pid?p.dim(` (pid: ${r.pid})`):"";e.push(` ${i("\u25CF")} ${r.name} ${i(r.status)}${n}`)}}}var Ks=M({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class ye extends P{name="stop";description="Stop runners";positionals=Ks;async execute(t){O(t.args,this.args,"Run 'hydra stop --help' for supported options");let{name:e,profile:r}=t.interactive?j(t.config,await z(t.config)):j(t.config,t.positionals.profile),n=(t.config.get("runners")??[]).filter((d)=>d.profile===e);if(n.length===0)throw new y(`No runners found for profile "${e}"`,"Run hydra create to provision runners");let s=U(r),o=W();o.start("Fetching runner status...");let u=await s.list();o.stop("Runner status fetched");let a=new Set(u.filter((d)=>d.status==="running").map((d)=>d.id)),l=n.map((d)=>d.id).filter((d)=>a.has(d)),f=t.interactive?await this.promptRunnerSelection(l):bt(t.positionals.ids??[],n.map((d)=>d.id)),h=0;for(let d of f){if(!a.has(d)){o.start(""),o.stop(`${p.dim("\u25CF")} ${d} ${p.dim("not running")}`);continue}o.start(`Stopping ${d}...`),await s.stop([d]),o.stop(`${p.red("\u25A0")} ${d}`),h++}w.info(`${p.green("Stopped")} ${h} runner(s).`)}async promptRunnerSelection(t){if(t.length===0)throw new y("No runners are currently running");return dt({message:"Select runners to stop",options:t.map((e)=>({label:e,value:e})),required:!0})}}class $e extends P{name="update";description="Update runner binaries";async execute(t){O(t.args,this.args,"Run 'hydra update --help' for supported options");let e=t.config.get("profiles"),r=t.config.get("runners")??[];if(r.length===0)throw new y("No runners found","Run hydra create to provision runners");let i=W(),n=Map.groupBy(r,(o)=>o.profile),s=0;for(let[o,u]of n){let a=e[o];if(!a)continue;let l=U(a);i.start(`Checking for updates for "${o}"...`);let{version:f}=await l.download();i.stop(`Latest: v${f}`);let h=await l.list(),d=new Set(h.filter((g)=>g.status==="running").map((g)=>g.id));for(let g of u){if(await l.currentVersion(g.id)===f)continue;let m=d.has(g.id);if(i.start(`Updating ${g.id}...`),m)await l.stop([g.id]);if(await l.update([g.id]),m)await l.start([g.id]);s++;let v=m?` ${p.dim("(restarted)")}`:"";i.stop(`${p.green("\u2713")} ${g.id}${v}`)}}w.info(s>0?`${p.green("Updated")} ${s} runner(s).`:"All runners are already on the latest version."),await le(t)}}class xi extends Ge{constructor(){super(new je(Jr,Xr),{bin:Zt,clearOnStart:!0,description:"Manage GitHub Actions runners on this machine.",exitLabel:"Exit",goodbyeMessage:"Heads down.",name:"HYDRA",promptMessage:"What do you need?",version:Yr})}init(){this.registerCommands([new pe,new ce,new fe,new ye,new ge,new de,new ue,new he,new $e,new me])}}var qs=new xi;qs.run();
package/package.json CHANGED
@@ -36,5 +36,5 @@
36
36
  },
37
37
  "type": "module",
38
38
  "types": "src/cli.ts",
39
- "version": "0.9.2"
39
+ "version": "0.9.4"
40
40
  }