@r5n/hydra 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +70 -70
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,99 +1,99 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
4
|
-
`),d=!1;for(let g=0;g<
|
|
5
|
-
`){if(t)o+=
|
|
6
|
-
`){if(i&&
|
|
7
|
-
`)}var q=
|
|
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
|
|
3
|
+
var Do=Object.create;var{getPrototypeOf:Io,defineProperty:ee,getOwnPropertyNames:Eo}=Object;var Ho=Object.prototype.hasOwnProperty;function Uo(r){return this[r]}var No,Ao,oe=(r,n,e)=>{var o=r!=null&&typeof r==="object";if(o){var i=n?No??=new WeakMap:Ao??=new WeakMap,t=i.get(r);if(t)return t}e=r!=null?Do(Io(r)):{};let a=n||!r||!r.__esModule?ee(e,"default",{value:r,enumerable:!0}):e;for(let s of Eo(r))if(!Ho.call(a,s))ee(a,s,{get:Uo.bind(r,s),enumerable:!0});if(o)i.set(r,a);return a};var jo=(r,n)=>()=>(n||r((n={exports:{}}).exports,n),n.exports);var Pn=jo((na,we)=>{var yn={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"},So={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?yn.up():"");if(r)n+=yn.left;return n}};we.exports={cursor:yn,scroll:So,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 xr}from"util";import{stdout as Ln,stdin as ye}from"process";import*as er from"readline";import Bo from"readline";var ie=(()=>{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}})(),te=(r)=>{return r===12288||r>=65281&&r<=65376||r>=65504&&r<=65510},ae=(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 Mo=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,Go=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,se=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu,xo=/\t{1,1000}/y,ce=/[\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,qo=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,zo=/\p{M}+/gu,Wo={limit:1/0,ellipsis:""},fe=(r,n={},e={})=>{let o=n.limit??1/0,i=n.ellipsis??"",t=n?.ellipsisWidth??(i?fe(i,Wo,e).width:0),a=0,s=e.controlWidth??0,c=e.tabWidth??8,f=e.emojiWidth??2,d=2,g=e.regularWidth??1,p=e.wideWidth??2,h=[[qo,g],[Mo,0],[Go,s],[xo,c],[ce,f],[se,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(zo,"")){let W=X.codePointAt(0)||0;if(te(W))L=2;else if(ae(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,Ur]=h[N];if(W.lastIndex=b,W.test(r)){if(I=W===se?ie(r.slice(b,W.lastIndex)):W===ce?1:W.lastIndex-b,L=I*Ur,H+L>E)j=Math.min(j,b+Math.floor((E-H)/Ur));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=fe;var Yo={limit:1/0,ellipsis:"",ellipsisWidth:0},Jo=(r,n={})=>{return ue(r,Yo,n).width},Y=Jo;var Ar="\x1B",ge="\x9B",Ko=39,Cn="\x07",he="[",Oo="]",be="m",$n=`${Oo}8;;`,pe=new RegExp(`(?:\\${he}(?<code>\\d+)m|\\${$n}(?<uri>.*)${Cn})`,"y"),me=(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},le=(r)=>`${Ar}${he}${r}${be}`,de=(r)=>`${Ar}${$n}${r}${Cn}`,vn=(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(),f=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===Ar||g===ge)i=!0,t=n.startsWith($n,d+1);if(i){if(t){if(g===Cn)i=!1,t=!1}else if(g===be)i=!1}else if(s+=p,s===e&&!f.done)r.push(""),s=0;c=f,f=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("")},Qo=(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("");vn(s,p,n),c=Y(s.at(-1)??"");continue}if(c+h>n&&c&&h){if(e.wordWrap===!1&&c<n){vn(s,p,n),c=Y(s.at(-1)??"");continue}s.push(""),c=0}if(c+h>n&&e.wordWrap===!1){vn(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 f=s.join(`
|
|
4
|
+
`),d=!1;for(let g=0;g<f.length;g++){let p=f[g];if(o+=p,!d){if(d=p>="\uD800"&&p<="\uDBFF",d)continue}else d=!1;if(p===Ar||p===ge){pe.lastIndex=g+1;let l=pe.exec(f)?.groups;if(l?.code!==void 0){let b=Number.parseFloat(l.code);i=b===Ko?void 0:b}else if(l?.uri!==void 0)t=l.uri.length===0?void 0:l.uri}if(f[g+1]===`
|
|
5
|
+
`){if(t)o+=de("");let h=i?me(i):void 0;if(i&&h)o+=le(h)}else if(p===`
|
|
6
|
+
`){if(i&&me(i))o+=le(i);if(t)o+=de(t)}}return o},Xo=/\r?\n/;function S(r,n,e){return String(r).normalize().split(Xo).map((o)=>Qo(o,n,e)).join(`
|
|
7
|
+
`)}var q=oe(Pn(),1);import{ReadStream as ve}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 jr(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 _o=["up","down","left","right","space","enter","cancel"],To=["January","February","March","April","May","June","July","August","September","October","November","December"],M={actions:new Set(_o),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:[...To],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 Dn(r,n){if(typeof r=="string")return M.aliases.get(r)===n;for(let e of r)if(e!==void 0&&Dn(e,n))return!0;return!1}function ri(r,n){if(r===n)return;let e=r.split(`
|
|
9
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
|
|
11
|
-
`).map((s,c,
|
|
12
|
-
`)}function
|
|
13
|
-
`),
|
|
14
|
-
`).length-1;this.output.write(q.cursor.move(-999,r*-1))}render(){let r=
|
|
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 ni=globalThis.process.platform.startsWith("win"),Rn=Symbol("clack:cancel");function Cr(r){return r===Rn}function Mr(r,n){let e=r;e.isTTY&&e.setRawMode(n)}function Pe({input:r=ye,output:n=Ln,overwrite:e=!0,hideCursor:o=!0}={}){let i=er.createInterface({input:r,output:n,prompt:"",tabSize:1});er.emitKeypressEvents(r,i),r instanceof ve&&r.isTTY&&r.setRawMode(!0);let t=(a,{name:s,sequence:c})=>{let f=String(a);if(Dn([f,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 ve&&r.isTTY&&!ni&&r.setRawMode(!1),i.terminal=!1,i.close()}}var $r=(r)=>("columns"in r)&&typeof r.columns=="number"?r.columns:80,In=(r)=>("rows"in r)&&typeof r.rows=="number"?r.rows:20;function or(r,n,e,o=e,i=e,t){let a=$r(r??Ln);return S(n,a-e.length,{hard:!0,trim:!1}).split(`
|
|
11
|
+
`).map((s,c,f)=>{let d=t?t(s,c):s;return c===0?`${o}${d}`:c===f.length-1?`${i}${d}`:`${e}${d}`}).join(`
|
|
12
|
+
`)}function Fe(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=ye,output:o=Ln,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(Rn);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=Bo.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),Mr(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),Mr(this.input,!1),r(this.value)}),this.once("cancel",()=>{this.output.write(q.cursor.show),this.output.off("resize",this.render),Mr(this.input,!1),r(Rn)})})}_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=Fe(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")}Dn([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
|
+
`),Mr(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let r=S(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=S(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=ri(this._prevFrame,r),e=In(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
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
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 Dn 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 yn(r){return Number.parseInt((r||"0").replace(/_/g,"0"),10)||0}function jr(r){return{year:yn(r.year),month:yn(r.month),day:yn(r.day)}}function Fn(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:Fn(n.year,n.month)}}class ke 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=Fn(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=Fn(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 Re 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===`
|
|
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 ei(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 oi(r,n){return(n.label??String(n.value)).toLowerCase().includes(r.toLowerCase())}function ii(r,n){if(n)return r?n:n[0]}var ti=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 xr(["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}${xr("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??oi;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,f=s!==void 0&&s!==""&&c.some((d)=>!d.disabled&&(this.#r?this.#r(s,d):!0));if(e.name==="tab"&&a&&f){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=ii(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=ei(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 En 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 ai={Y:{type:"year",len:4},M:{type:"month",len:2},D:{type:"day",len:2}};function Ce(r){return[...r].map((n)=>ai[n])}function si(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 Fn(r){return Number.parseInt((r||"0").replace(/_/g,"0"),10)||0}function Gr(r){return{year:Fn(r.year),month:Fn(r.month),day:Fn(r.day)}}function kn(r,n){return new Date(r||2001,n||1,0).getDate()}function Re(r){let{year:n,month:e,day:o}=Gr(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 $e(r){let n=Re(r);return n?new Date(Date.UTC(n.year,n.month-1,n.day)):void 0}function ci(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:kn(n.year,n.month)}}class ke 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($e(this.#r)??void 0)}constructor(r){let n=r.format?{segments:Ce(r.format),separator:r.separator??"/"}:si(r.locale),e=r.separator??n.separator,o=r.format?Ce(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))}#f(){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}}#u(r){this.inlineError="",this.#a=null;let n=this.#f();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.#f();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=ci(e.type,Gr(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.#u(1);case"left":return this.#u(-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.#f();if(!e)return;if(!this.#r[e.segment.type].replace(/_/g,"")){this.#u(-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.#f();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.#f();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),f=!1;if(s===0&&t==="__"&&(o.type==="month"||o.type==="day")){let p=Number.parseInt(r,10);c=`0${r}`,f=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:Re(this.#r);if(d){let{year:p,month:h}=d,l=kn(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("_");f?(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}=Gr(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}=Gr(this.#r);if(n&&e&&o){let i=kn(n,e);this.#r={...this.#r,day:String(Math.min(o,i)).padStart(2,"0")}}this.value=$e(this.#r)??r.defaultValue??void 0}}var fi=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 Le 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
18
|
`?`${n}\u2588
|
|
19
|
-
${o}`:`${n}${
|
|
19
|
+
${o}`:`${n}${xr("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=jr(this._cursor,0,-1,n);return;case"down":this._cursor=jr(this._cursor,0,1,n);return;case"left":this._cursor=jr(this._cursor,-1,0,n);return;case"right":this._cursor=jr(this._cursor,1,0,n);return}}_shouldSubmit(r,n){if(this.#i)return this.focused==="submit"?!0:(this.#r(`
|
|
20
20
|
`),this._cursor++,!1);let e=this.#n;return this.#n=!0,e&&this.cursor===this.userInput.length?(this.userInput[this.cursor-1]===`
|
|
21
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
|
|
23
|
-
`);F.push(L),I+=L.length}if(I>d){let P=0,A=0,H=I,L=r-y,N=d,X=()=>
|
|
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 Hn 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 De=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 Un 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}${xr("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 u,stripVTControlCharacters as la}from"util";import O from"process";var Pr=oe(Pn(),1);function pi(){if(O.platform!=="win32")return O.env.TERM!=="linux";return Boolean(O.env.CI)||Boolean(O.env.WT_SESSION)||Boolean(O.env.TERMINUS_SUBLIME)||O.env.ConEmuTask==="{cmd::Cmder}"||O.env.TERM_PROGRAM==="Terminus-Sublime"||O.env.TERM_PROGRAM==="vscode"||O.env.TERM==="xterm-256color"||O.env.TERM==="alacritty"||O.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}var Nn=pi(),mi=()=>process.env.CI==="true";var R=(r,n)=>Nn?r:n,li=R("\u25C6","*"),Ne=R("\u25A0","x"),Ae=R("\u25B2","x"),Wr=R("\u25C7","o"),di=R("\u250C","T"),$=R("\u2502","|"),ir=R("\u2514","\u2014"),ba=R("\u2510","T"),wa=R("\u2518","\u2014"),An=R("\u25CF",">"),zr=R("\u25CB"," "),gi=R("\u25FB","[\u2022]"),Ie=R("\u25FC","[+]"),Ee=R("\u25FB","[ ]"),va=R("\u25AA","\u2022"),He=R("\u2500","-"),hi=R("\u256E","+"),bi=R("\u251C","+"),wi=R("\u256F","+"),vi=R("\u2570","+"),Ca=R("\u256D","+"),Ci=R("\u25CF","\u2022"),$i=R("\u25C6","*"),yi=R("\u25B2","!"),Pi=R("\u25A0","x"),Yr=(r)=>{switch(r){case"initial":case"active":return u("cyan",li);case"cancel":return u("red",Ne);case"error":return u("yellow",Ae);case"submit":return u("green",Wr)}},je=(r)=>{switch(r){case"initial":case"active":return u("cyan",$);case"cancel":return u("red",$);case"error":return u("yellow",$);case"submit":return u("green",$)}};function Me(r,n){let e=[`${n?`${u("cyan",$)} `:""}${r.join(" \u2022 ")}`];return n&&e.push(u("cyan",ir)),e}var Ue=(r,n,e,o,i,t=!1)=>{let a=n,s=0;if(t)for(let c=o-1;c>=e;c--){let f=r[c];if(f&&(a-=f.length),s++,a<=i)break}else for(let c=e;c<o;c++){let f=r[c];if(f&&(a-=f.length),s++,a<=i)break}return{lineCount:a,removals:s}},jn=({cursor:r,options:n,style:e,output:o=process.stdout,maxItems:i=Number.POSITIVE_INFINITY,columnPadding:t=0,rowPadding:a=4})=>{let s=$r(o)-t,c=In(o),f=u("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=S(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=()=>Ue(F,H,0,L,N),W=()=>Ue(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(f);for(let P of F)for(let A of P)E.push(A);return l&&E.push(f),E};var Ge=(r)=>{let n=r.active??"Yes",e=r.inactive??"No";return new En({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=`${Yr(this.state)} `,t=o?`${u("gray",$)} `:"",a=or(r.output,r.message,t,i),s=`${o?`${u("gray",$)}
|
|
24
24
|
`:""}${a}
|
|
25
|
-
`,c=this.value?n:e;switch(this.state){case"submit":{let
|
|
26
|
-
${
|
|
27
|
-
${
|
|
28
|
-
`:` ${
|
|
25
|
+
`,c=this.value?n:e;switch(this.state){case"submit":{let f=o?`${u("gray",$)} `:"";return`${s}${f}${u("dim",c)}`}case"cancel":{let f=o?`${u("gray",$)} `:"";return`${s}${f}${u(["strikethrough","dim"],c)}${o?`
|
|
26
|
+
${u("gray",$)}`:""}`}default:{let f=o?`${u("cyan",$)} `:"",d=o?u("cyan",ir):"";return`${s}${f}${this.value?`${u("green",An)} ${n}`:`${u("dim",zr)} ${u("dim",n)}`}${r.vertical?o?`
|
|
27
|
+
${u("cyan",$)} `:`
|
|
28
|
+
`:` ${u("dim","/")} `}${this.value?`${u("dim",zr)} ${u("dim",e)}`:`${u("green",An)} ${e}`}
|
|
29
29
|
${d}
|
|
30
|
-
`}}}}).prompt()};var
|
|
30
|
+
`}}}}).prompt()};var Jr=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"&&Cr(a)){e[i]="canceled",n.onCancel({results:e});continue}e[i]=a}return e},Fi=[`${u("dim","\u2191/\u2193")} to navigate`,`${u("dim","Space:")} select`,`${u("dim","Enter:")} confirm`],yr=(r,n)=>r.split(`
|
|
31
31
|
`).map((e)=>n(e)).join(`
|
|
32
|
-
`),
|
|
33
|
-
${
|
|
32
|
+
`),xe=(r)=>{let n=(i,t)=>{let a=i.label??String(i.value);return t==="disabled"?`${u("gray",Ee)} ${yr(a,(s)=>u(["strikethrough","gray"],s))}${i.hint?` ${u("dim",`(${i.hint??"disabled"})`)}`:""}`:t==="active"?`${u("cyan",gi)} ${a}${i.hint?` ${u("dim",`(${i.hint})`)}`:""}`:t==="selected"?`${u("green",Ie)} ${yr(a,(s)=>u("dim",s))}${i.hint?` ${u("dim",`(${i.hint})`)}`:""}`:t==="cancelled"?`${yr(a,(s)=>u(["strikethrough","dim"],s))}`:t==="active-selected"?`${u("green",Ie)} ${a}${i.hint?` ${u("dim",`(${i.hint})`)}`:""}`:t==="submitted"?`${yr(a,(s)=>u("dim",s))}`:`${u("dim",Ee)} ${yr(a,(s)=>u("dim",s))}`},e=r.required??!0,o=r.showInstructions??!0;return new Hn({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
|
+
${u("reset",u("dim",`Press ${u(["gray","bgWhite","inverse"]," space ")} to select, ${u("gray",u("bgWhite",u("inverse"," enter ")))} to submit`))}`},render(){let i=r.withGuide??M.withGuide,t=or(r.output,r.message,i?`${je(this.state)} `:"",`${Yr(this.state)} `),a=`${i?`${u("gray",$)}
|
|
34
34
|
`:""}${t}
|
|
35
|
-
`,s=this.value??[],c=(
|
|
36
|
-
${
|
|
37
|
-
`).map((h,l)=>l===0?`${i?`${
|
|
35
|
+
`,s=this.value??[],c=(f,d)=>{if(f.disabled)return n(f,"disabled");let g=s.includes(f.value);return d&&g?n(f,"active-selected"):g?n(f,"selected"):n(f,d?"active":"inactive")};switch(this.state){case"submit":{let f=this.options.filter(({value:g})=>s.includes(g)).map((g)=>n(g,"submitted")).join(u("dim",", "))||u("dim","none"),d=or(r.output,f,i?`${u("gray",$)} `:"");return`${a}${d}`}case"cancel":{let f=this.options.filter(({value:g})=>s.includes(g)).map((g)=>n(g,"cancelled")).join(u("dim",", "));if(f.trim()==="")return`${a}${u("gray",$)}`;let d=or(r.output,f,i?`${u("gray",$)} `:"");return`${a}${d}${i?`
|
|
36
|
+
${u("gray",$)}`:""}`}case"error":{let f=i?`${u("yellow",$)} `:"",d=this.error.split(`
|
|
37
|
+
`).map((h,l)=>l===0?`${i?`${u("yellow",ir)} `:""}${u("yellow",h)}`:` ${h}`).join(`
|
|
38
38
|
`),g=a.split(`
|
|
39
39
|
`).length,p=d.split(`
|
|
40
|
-
`).length+1;return`${a}${
|
|
41
|
-
${
|
|
40
|
+
`).length+1;return`${a}${f}${jn({output:r.output,options:this.options,cursor:this.cursor,maxItems:r.maxItems,columnPadding:f.length,rowPadding:g+p,style:c}).join(`
|
|
41
|
+
${f}`)}
|
|
42
42
|
${d}
|
|
43
|
-
`}default:{let
|
|
44
|
-
`).length,g=o?
|
|
45
|
-
`),h=g.length+1;return`${a}${
|
|
46
|
-
${
|
|
43
|
+
`}default:{let f=i?`${u("cyan",$)} `:"",d=a.split(`
|
|
44
|
+
`).length,g=o?Me(Fi,i):i?[u("cyan",ir)]:[],p=g.join(`
|
|
45
|
+
`),h=g.length+1;return`${a}${f}${jn({output:r.output,options:this.options,cursor:this.cursor,maxItems:r.maxItems,columnPadding:f.length,rowPadding:d+h,style:c}).join(`
|
|
46
|
+
${f}`)}
|
|
47
47
|
${p}
|
|
48
|
-
`}}}}).prompt()};var
|
|
49
|
-
`);if(g.length>0){let[p,...h]=g;p.length>0?a.push(`${
|
|
48
|
+
`}}}}).prompt()};var v={message:(r=[],{symbol:n=u("gray",$),secondarySymbol:e=u("gray",$),output:o=process.stdout,spacing:i=1,withGuide:t}={})=>{let a=[],s=t??M.withGuide,c=s?e:"",f=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(`${f}${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(`
|
|
50
50
|
`)}
|
|
51
|
-
`)},info:(r,n)=>{
|
|
52
|
-
`)},
|
|
53
|
-
${
|
|
51
|
+
`)},info:(r,n)=>{v.message(r,{...n,symbol:u("blue",Ci)})},success:(r,n)=>{v.message(r,{...n,symbol:u("green",$i)})},step:(r,n)=>{v.message(r,{...n,symbol:u("green",Wr)})},warn:(r,n)=>{v.message(r,{...n,symbol:u("yellow",yi)})},warning:(r,n)=>{v.warn(r,n)},error:(r,n)=>{v.message(r,{...n,symbol:u("red",Pi)})}};var Kr=(r="",n)=>{let e=n?.output??process.stdout,o=n?.withGuide??M.withGuide?`${u("gray",di)} `:"";e.write(`${o}${r}
|
|
52
|
+
`)},Or=(r="",n)=>{let e=n?.output??process.stdout,o=n?.withGuide??M.withGuide?`${u("gray",$)}
|
|
53
|
+
${u("gray",ir)} `:"";e.write(`${o}${r}
|
|
54
54
|
|
|
55
|
-
`)};var
|
|
56
|
-
`),t=i.reduce((c,
|
|
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,
|
|
58
|
-
`),d=i?`${
|
|
59
|
-
`:"",g=i?
|
|
60
|
-
${
|
|
61
|
-
${
|
|
62
|
-
`)};var
|
|
63
|
-
`);let U=
|
|
64
|
-
`);U.length>1&&e.write(
|
|
65
|
-
`);let K=0,
|
|
55
|
+
`)};var Ri=(r)=>r,ki=(r,n,e)=>{let o={hard:!0,trim:!1},i=S(r,n,o).split(`
|
|
56
|
+
`),t=i.reduce((c,f)=>Math.max(Y(f),c),0),a=i.map(e).reduce((c,f)=>Math.max(Y(f),c),0),s=n-(a-t);return S(r,s,o)},lr=(r="",n="",e)=>{let o=e?.output??O.stdout,i=e?.withGuide??M.withGuide,t=e?.format??Ri,a=["",...ki(r,$r(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,f=a.map((p)=>`${u("gray",$)} ${p}${" ".repeat(c-Y(p))}${u("gray",$)}`).join(`
|
|
58
|
+
`),d=i?`${u("gray",$)}
|
|
59
|
+
`:"",g=i?bi:vi;o.write(`${d}${u("green",Wr)} ${u("reset",n)} ${u("gray",He.repeat(Math.max(c-s-1,1))+hi)}
|
|
60
|
+
${f}
|
|
61
|
+
${u("gray",g+He.repeat(c+2)+wi)}
|
|
62
|
+
`)};var Li=(r)=>u("magenta",r),J=({indicator:r="dots",onCancel:n,output:e=process.stdout,cancelMessage:o,errorMessage:i,frames:t=Nn?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],delay:a=Nn?80:120,signal:s,...c}={})=>{let f=mi(),d,g,p=!1,h=!1,l="",b,F=performance.now(),I=$r(e),y=c?.styleFrame??Li,j=(U)=>{let K=U>1?i??M.messages.error:o??M.messages.cancel;h=U===1,p&&(vr(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;f&&e.write(`
|
|
63
|
+
`);let U=S(b,I,{hard:!0,trim:!1}).split(`
|
|
64
|
+
`);U.length>1&&e.write(Pr.cursor.up(U.length-1)),e.write(Pr.cursor.to(0)),e.write(Pr.erase.down())},N=(U)=>U.replace(/\.+$/,""),X=(U)=>{let K=(performance.now()-U)/1000,V=Math.floor(K/60),B=Math.floor(K%60);return V>0?`[${V}m ${B}s]`:`[${B}s]`},W=c.withGuide??M.withGuide,Ur=(U="")=>{p=!0,d=Pe({output:e}),l=N(U),F=performance.now(),W&&e.write(`${u("gray",$)}
|
|
65
|
+
`);let K=0,V=0;A(),g=setInterval(()=>{if(f&&l===b)return;L(),b=l;let B=y(t[K]),Nr;if(f)Nr=`${B} ${l}...`;else if(r==="timer")Nr=`${B} ${l} ${X(F)}`;else{let Lo=".".repeat(Math.floor(V)).slice(0,3);Nr=`${B} ${l}${Lo}`}let ko=S(Nr,I,{hard:!0,trim:!1});e.write(ko),K=K+1<t.length?K+1:0,V=V<4?V+0.125:0},a)},vr=(U="",K=0,V=!1)=>{if(!p)return;p=!1,clearInterval(g),L();let B=K===0?u("green",Wr):K===1?u("red",Ne):u("red",Ae);l=U??l,V||(r==="timer"?e.write(`${B} ${l} ${X(F)}
|
|
66
66
|
`):e.write(`${B} ${l}
|
|
67
|
-
`)),H(),d()};return{start:
|
|
67
|
+
`)),H(),d()};return{start:Ur,stop:(U="")=>vr(U,0),message:(U="")=>{l=N(U??l)},cancel:(U="")=>vr(U,1),error:(U="")=>vr(U,2),clear:()=>vr("",0,!0),get isCancelled(){return h}}},$a={light:R("\u2500","-"),heavy:R("\u2501","="),block:R("\u2588","#")};var Di=[`${u("dim","\u2191/\u2193")} to navigate`,`${u("dim","Enter:")} confirm`],qr=(r,n)=>r.includes(`
|
|
68
68
|
`)?r.split(`
|
|
69
69
|
`).map((e)=>n(e)).join(`
|
|
70
|
-
`):n(r),
|
|
70
|
+
`):n(r),qe=(r)=>{let n=(o,i)=>{if(o===void 0)return"";let t=o.label??String(o.value);switch(i){case"disabled":return`${u("gray",zr)} ${qr(t,(a)=>u("gray",a))}${o.hint?` ${u("dim",`(${o.hint??"disabled"})`)}`:""}`;case"selected":return`${qr(t,(a)=>u("dim",a))}`;case"active":return`${u("green",An)} ${t}${o.hint?` ${u("dim",`(${o.hint})`)}`:""}`;case"cancelled":return`${qr(t,(a)=>u(["strikethrough","dim"],a))}`;default:return`${u("dim",zr)} ${qr(t,(a)=>u("dim",a))}`}},e=r.showInstructions??!0;return new De({options:r.options,signal:r.signal,input:r.input,output:r.output,initialValue:r.initialValue,render(){let o=r.withGuide??M.withGuide,i=`${Yr(this.state)} `,t=`${je(this.state)} `,a=or(r.output,r.message,t,i),s=`${o?`${u("gray",$)}
|
|
71
71
|
`:""}${a}
|
|
72
|
-
`;switch(this.state){case"submit":{let c=o?`${
|
|
73
|
-
${
|
|
74
|
-
`).length,d=e?
|
|
75
|
-
`),p=d.length+1;return`${s}${c}${
|
|
72
|
+
`;switch(this.state){case"submit":{let c=o?`${u("gray",$)} `:"",f=or(r.output,n(this.options[this.cursor],"selected"),c);return`${s}${f}`}case"cancel":{let c=o?`${u("gray",$)} `:"",f=or(r.output,n(this.options[this.cursor],"cancelled"),c);return`${s}${f}${o?`
|
|
73
|
+
${u("gray",$)}`:""}`}default:{let c=o?`${u("cyan",$)} `:"",f=s.split(`
|
|
74
|
+
`).length,d=e?Me(Di,o):o?[u("cyan",ir)]:[],g=d.join(`
|
|
75
|
+
`),p=d.length+1;return`${s}${c}${jn({output:r.output,cursor:this.cursor,options:this.options,maxItems:r.maxItems,columnPadding:c.length,rowPadding:f+p,style:(h,l)=>n(h,h.disabled?"disabled":l?"active":"inactive")}).join(`
|
|
76
76
|
${c}`)}
|
|
77
77
|
${g}
|
|
78
|
-
`}}}}).prompt()};var
|
|
79
|
-
`:""}${
|
|
80
|
-
`,o=r.placeholder&&r.placeholder.length>0?
|
|
78
|
+
`}}}}).prompt()};var ya=`${u("gray",$)} `;var ze=(r)=>new Un({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?`${u("gray",$)}
|
|
79
|
+
`:""}${Yr(this.state)} `}${r.message}
|
|
80
|
+
`,o=r.placeholder&&r.placeholder.length>0?u("inverse",r.placeholder[0])+u("dim",r.placeholder.slice(1)):u(["inverse","hidden"],"_"),i=this.userInput?this.userInputWithCursor:o,t=this.value??"";switch(this.state){case"error":{let a=this.error?` ${u("yellow",this.error)}`:"",s=n?`${u("yellow",$)} `:"",c=n?u("yellow",ir):"";return`${e.trim()}
|
|
81
81
|
${s}${i}
|
|
82
82
|
${c}${a}
|
|
83
|
-
`}case"submit":{let a=t?` ${
|
|
84
|
-
${s}`:""}`}default:{let a=n?`${
|
|
83
|
+
`}case"submit":{let a=t?` ${u("dim",t)}`:"",s=n?u("gray",$):"";return`${e}${s}${a}`}case"cancel":{let a=t?` ${u(["strikethrough","dim"],t)}`:"",s=n?u("gray",$):"";return`${e}${s}${a}${t.trim()?`
|
|
84
|
+
${s}`:""}`}default:{let a=n?`${u("cyan",$)} `:"",s=n?u("cyan",ir):"";return`${e}${a}${i}
|
|
85
85
|
${s}
|
|
86
|
-
`}}}}).prompt();var
|
|
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
|
|
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(`--${
|
|
89
|
-
Run "${o} --help" for usage.`),process.exit(1)}function
|
|
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}=
|
|
86
|
+
`}}}}).prompt();var Ei=!process.env.NO_COLOR&&(process.env.FORCE_COLOR||(process.stdout?.isTTY??!1)),Je=["black","blue","cyan","gray","green","magenta","red","white","yellow"],Hi=["bold","dim","italic","underline","reset"],Ke={bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",reset:"\x1B[0m",underline:"\x1B[4m"},Ui={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"},Ni={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"},We={"\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 Zr(r){return(n)=>Ei?`${r}${n}${Ke.reset}`:n}function Ai(r){for(let n=0;n<r.length;n++){let e=r.charCodeAt(n);if(e<32&&e!==27)return!1}return!0}function Ye({bright:r=!1,color:n}){let e=Bun.color(n,"ansi"),o=typeof e==="string"&&e.length>0&&Ai(e)?e:Ui[n];if(!o)return"";return r&&o in We?We[o]:o}var ji=Je.reduce((r,n)=>{let e=Ye({color:n});if(e)r[n]=Zr(e);let o=Ye({bright:!0,color:n});if(o)r[`${n}Bright`]=Zr(o);return r},{}),Mi=Hi.reduce((r,n)=>{return r[n]=Zr(Ke[n]),r},{}),Gi=Je.reduce((r,n)=>{let e=Ni[n];if(e){let o=`bg${n.charAt(0).toUpperCase()}${n.slice(1)}`;r[o]=Zr(e)}return r},{}),m={...ji,...Mi,...Gi};function Qr(r){if(Cr(r))throw new Q;return r}function qi(r){return r.map((n)=>n.key?`${m.bold(n.key)} ${m.dim(n.text)}`:m.dim(n.text)).join(m.dim(" \xB7 "))}function Xr(r){v.info(qi(r))}var Sr={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 Xr(Sr.confirm),Qr(await Ge(r))}async function rr(r){return Xr(Sr.text),Qr(await ze(r))}async function cr(r){return Xr(Sr.select),Qr(await qe({showInstructions:!1,...r}))}async function fr(r){return Xr(Sr.multiselect),Qr(await xe({showInstructions:!1,...r}))}var zi=4;function dr(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)dr(o,n+1)}}function Mn(r){return r==null?[]:Array.isArray(r)?r:[r]}function Wi(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 Vr(r,n){r=r||[],n=n||{};var e,o,i,t,a,s={_:[]},c=0,f=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=Mn(n.string),n.boolean=Mn(n.boolean),p)for(e in n.alias){o=n.alias[e]=Mn(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(f=o.length;f-- >0;)n.boolean.push(o[f])}for(c=n.string.length;c-- >0;){o=n.alias[n.string[c]]||[];for(f=o.length;f-- >0;)n.string.push(o[f])}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(f=0;f<i.length;f++)if(i.charCodeAt(f)!==45)break;if(f===0)s._.push(i);else if(i.substring(f,f+3)==="no-"){if(t=i.substring(f+3),h&&!~b.indexOf(t))return n.unknown(i);s[t]=!1}else{for(d=f+1;d<i.length;d++)if(i.charCodeAt(d)===61)break;t=i.substring(f,d),a=i.substring(++d)||(c+1===g||(""+r[c+1]).charCodeAt(0)===45||r[++c]),o=f===2?[t]:t;for(d=0;d<o.length;d++){if(t=o[d],h&&!~b.indexOf(t))return n.unknown("-".repeat(f)+t);Wi(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}var Yi=1;function gr(r){return r.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function Oe(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=gr(e);if(i!==e)n.alias[i]=e;if(o.default!==void 0)n.default[e]=o.default}return n}function Ji(r,n){if(r in n)return`--${gr(r)}`;let e=Object.entries(n).find(([,o])=>o.alias===r)?.[0];if(e)return`--${gr(e)}`;return r.length===Yi?`-${r}`:`--${gr(r)}`}function Ze(r,n){for(let[o,i]of Object.entries(r))if(Array.isArray(i))throw new w(`${Ji(o,n)} 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 Qe(r,n){let e=Oe(n),o=Vr(r,e),i=o._[0],t=i?r.indexOf(i):-1,{_:a,...s}=o,c=Object.fromEntries(Object.entries(s).filter(([d])=>(d in n)||(d in e.alias))),f=Ze(c,n);return{command:i,flags:f,restArgs:t>=0?r.slice(t+1):[]}}function Gn(r,n={}){let e=Oe(n),o=Vr(r,e),{_:i,...t}=o;return{args:Ze(t,n),rawPositionals:i}}function xn(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 Xe(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 Ki=(r)=>r,C={arg:m.magenta,cmd:m.cyan,default:m.bold,desc:Ki,flag:m.green,header:(r)=>m.bold(m.yellow(r)),hint:m.dim,name:(r)=>m.bold(m.cyan(r)),placeholder:m.magenta};class qn{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 f=[t];if(a)f.push(a);f.push(C.placeholder("[options]")),e.push(` ${f.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 f=r.getSubcommands().map((d)=>[` ${C.cmd(d.name)}`,C.desc(d.description)]);e.push(...this.formatColumns(f)),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(`--${gr(e)}`)}${t}`,s=C.desc(o.description??""),c=this.formatDefault(o),f=c===void 0?"":` (default: ${C.default(c)})`;n.push([` ${a}`,`${s}${f}`])}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),Oi=(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 f=nr[n.charCodeAt(c)],d=f|a;if(f|=(f&t)+t^t,a|=~(f|t),t&=f,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},Zi=(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 f=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|f,j=((b|I)&d)+d^d|b|I,E=f|~(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),f=E&y}for(let l=g;l<p;l++)nr[r.charCodeAt(l)]=0;return h},Qi=(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 Oi(r,n);return Zi(r,n)},Se=(r,n)=>{let e=1/0,o=0;for(let i=0;i<n.length;i++){let t=Qi(r,n[i]);if(t<e)e=t,o=i}return n[o]};function Br(r,n,e,o){let i=Se(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 Fr(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]=Fr(t,a);else o[i]=a}return o}var zn="__exit__";class hr{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);Br("subcommand",r,n,this.commandPath)}async handleSubcommandRoute(r,n){await new hr(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}=Gn(r,this.command.args),i=xn(o,this.command.positionals),t=Xe(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}=Gn([],this.command.args),n=xn([],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===zn){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 hr(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));dr(n);return}throw n}}promptSubcommandSelection(){let{isRoot:r}=this.options,n=r?{hint:this.env.cli.exitHint,label:this.env.cli.exitLabel??"Exit",value:zn}:{hint:"Return to previous menu",label:"Back",value:zn};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 Xi={clearOnStart:!0,exitHint:"Close the CLI",exitLabel:"Exit",goodbyeMessage:"Goodbye!",name:"CLI",promptMessage:"What would you like to do?"};class Wn{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={...Xi,...n},this.bin=this.metadata.bin??this.metadata.name,this.init(),this.help=new qn({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}=Qe(r,this.globalArgs);if(e.version&&!n)return console.log(this.help.version());if(e.interactive&&!n)return await 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 hr(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(){Or(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 hr(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}`:"";Kr(`${m.bgCyan(m.black(` ${this.metadata.name}${r} `))}`)}handleUnknownCommand(r){let n=Array.from(this.commands.keys());Br("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));dr(r),process.exit(r.exitCode)}if(r instanceof Error)v.error(m.red(r.message)),dr(r),process.exit(1);console.error(m.red("Error:"),r),process.exit(1)}}class Rr{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 br from"fs";import Ve from"path";class Yn{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 br.existsSync(this.configPath)}getAll(){return Fr({},this.config)}save(r){if(r)this.config={...r};this.ensureDirectoryExists();try{br.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(!br.existsSync(r))try{br.mkdirSync(r,{recursive:!0})}catch(n){throw Error(`Failed to create config directory at ${r}`,{cause:n})}}loadConfig(){if(!br.existsSync(this.configPath))return{...this.defaultConfig};try{let r=br.readFileSync(this.configPath,"utf-8"),n=JSON.parse(r);return Fr({...this.defaultConfig},n)}catch{return console.warn(`Config file corrupted at ${this.configPath}. Using defaults.`),{...this.defaultConfig}}}}var Be="0.9.3";class k extends Rr{}var _r="hydra";var _e=".hydra/config.json",ur=".hydra/shared",kr=".hydra/runners",Lr="default",Te={profiles:{}},ro=!1,no=24,Tr=7,eo=["logs","shared"];import{existsSync as Er}from"fs";import{cp as et,link as ot,mkdir as On,readdir as co,readFile as Zn,readlink as it,rm as Qn,symlink as tt,unlink as fo,writeFile as at}from"fs/promises";import{join as D,resolve as en}from"path";var Vi=new Set(["github.com","www.github.com"]);var oo=/\.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(!Vi.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(oo,"");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(oo,"");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 rn(r){return r.kind==="repo"?`${r.owner}/${r.repo}`:r.org}import{existsSync as Bi}from"fs";import{readdir as _i,stat as Ti}from"fs/promises";import{join as rt}from"path";var Dr="_diag",io={runner:/^Runner_.+\.log$/,worker:/^Worker_.+\.log$/},to=1024,ao=["B","KB","MB","GB"],nt=1;function so(r){if(io.worker.test(r))return"worker";if(io.runner.test(r))return"runner";return null}function nn(r){return[...r].sort((n,e)=>e.mtime.getTime()-n.mtime.getTime())}async function Ir(r){if(!Bi(r))return[];let n=await _i(r,{withFileTypes:!0}),e=[];for(let o of n){if(!o.isFile())continue;let i=so(o.name);if(!i)continue;let t=rt(r,o.name),a=await Ti(t);e.push({mtime:a.mtime,name:o.name,path:t,size:a.size,type:i})}return nn(e)}function Jn(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 Kn(r,n){if(n<=0)return"";let e=r.endsWith(`
|
|
91
91
|
`)?r.slice(0,-1):r;if(e==="")return"";return e.split(`
|
|
92
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(Bi)} ${to[e]??"B"}`}var uo="actions/runner",ot={linux:"linux-x64",osx:"osx-arm64",windows:"win-x64"},fo=["bin"],po=["externals"];class nn{profile;sharedPath=null;constructor(r){this.profile=r}async download(){let r=ot[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:rn(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=rn(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,Rr))}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=rn(r,e),i=D(n,e);if(!Dr(i))await nt(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 _i(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 ${_r(r)} (${o})${a?`: ${a}`:""}`)}let t=i.stdout.toString().trim();if(!t)throw Error(`Failed to fetch ${n} for ${_r(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 rn(r,".pid")}async writePidFile(r,n){await et(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 Ti(i,t)}}async detectVersion(r){try{return(await rt(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 it,readlink as tt,rm as Sn,stat as at}from"fs/promises";import{join as ar}from"path";var mo="_work",st="externals",ct=".pid",ut="github",ft=/github\/([^/]+)/,pt=["runner","worker"],mt=24,lo=3600000,Qn=10;function en(r){return{auto:r?.auto??Te,intervalHours:r?.intervalHours??ro,lastRun:r?.lastRun,olderThanDays:r?.olderThanDays??Br,targets:r?.targets??no}}function go(r,n){return r-n*mt*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=Tr(r),o=new Set;for(let i of pt){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(bt)[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(ft)?.[1]??null}function on(r){return Object.values(r).reduce((n,e)=>n+e.freedBytes,0)}async function Co(r){try{let n=await it(ar(r,ct),"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 tn(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 tn(i);continue}if(o.isFile()){let t=await at(i);e+=t.size}}return e}async function an(r){let n=go(r.now,r.olderThanDays),e={};for(let o of r.targets)switch(o){case"logs":e.logs=await lt(r.entries,n,r.dryRun);break;case"work":e.work=await dt(r.entries,r.dryRun);break;case"shared":e.shared=await gt(r.entries,r.dryRun,r.sharedDir);break}return e}async function lt(r,n,e){let o={freedBytes:0,removed:0,skipped:[]};for(let i of r){let t=await Lr(ar(i.directory,Rr));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 dt(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 tn(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 gt(r,n,e){let o={freedBytes:0,removed:0,skipped:[]},i=e??ar(fr,ut);if(!Xn(i))return o;let a=(await Vn(i,{withFileTypes:!0})).filter((c)=>c.isDirectory()).map((c)=>c.name),s=await ht(r);for(let c of wo(a,s)){let u=ar(i,c);if(o.freedBytes+=await tn(u),o.removed++,!n)await Sn(u,{force:!0,recursive:!0})}return o}async function ht(r){let n=[];for(let e of r)try{let o=await tt(ar(e.directory,st)),i=vo(o);if(i)n.push(i)}catch{}return n}function bt(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 nn(r);default:throw Error(`Runner provider "${r.provider}" is not yet implemented`)}}var $o=0,wt={logs:"file(s)",shared:"version(s)",work:"item(s)"},vt=tr({days:{alias:"d",default:$o,description:"Override log retention",displayDefault:`config or ${Br} 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 sn extends R{name="cleanup";description="Remove logs, workspaces, and old runner versions";args=vt;async execute(r){let n=r.config.get("profiles");if(Object.keys(n).length===0)throw new v("No profiles configured","Run hydra init to set up a profile");let e=en(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 an({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=wt[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){w.info(m.dim("Nothing to clean."));return}let o=on(r),i=n?"Would free":"Freed";e.push(m.dim(`${i} ${mr(o)} total`)),w.info(e.join(`
|
|
94
|
-
`))}}async function
|
|
95
|
-
`),m.green(e?"Hydra initialized":`Profile "${n}" added`))}async promptProfileName(r){return rr({initialValue:r.args.profile??
|
|
96
|
-
`))}async printTail(r,n,e){let o=await
|
|
97
|
-
`)),console.log(
|
|
98
|
-
`),l)}
|
|
99
|
-
`))}formatRunners(r,n){if(r.length===0){n.push(m.dim(" No runners."));return}for(let e of r){let o=
|
|
93
|
+
`)}function mr(r){let n=r,e=0;while(n>=to&&e<ao.length-1)n/=to,e++;return`${e===0?String(n):n.toFixed(nt)} ${ao[e]??"B"}`}var uo="actions/runner",st={linux:"linux-x64",osx:"osx-arm64",windows:"win-x64"},po=["bin"],mo=["externals"];class on{profile;sharedPath=null;constructor(r){this.profile=r}async download(){let r=st[this.profile.os],n=await this.getLatestVersion(),e=D(ur,"github",n);if(Er(e))return this.sharedPath=e,{path:e,version:n};await On(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 fo(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(!Er(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:en(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=en(e);await Bun.$`pkill -f ${i}`.quiet().nothrow(),await this.removePidFile(e)}}async list(){let r=this.profile.directory;if(!Er(r))return[];let n=await co(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 Ir(D(this.profile.directory,r,Dr))}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(Er(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 On(n,{recursive:!0});for(let e of po)await this.hardLinkDir(D(r,e),D(n,e));for(let e of mo){let o=en(r,e),i=D(n,e);if(!Er(i))await tt(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 et(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 ${rn(r)} (${o})${a?`: ${a}`:""}`)}let t=i.stdout.toString().trim();if(!t)throw Error(`Failed to fetch ${n} for ${rn(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 en(r,".pid")}async writePidFile(r,n){await at(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 fo(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 On(n,{recursive:!0});let e=await co(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 ot(i,t)}}async detectVersion(r){try{return(await it(D(r,"externals"))).match(/github\/([^/]+)/)?.[1]??null}catch{return null}}async removeRunnerBinaries(r){for(let n of po)await Qn(D(r,n),{force:!0,recursive:!0});for(let n of mo)await Qn(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 Qn(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 Sn}from"fs";import{readdir as Vn,readFile as ct,readlink as ft,rm as Bn,stat as ut}from"fs/promises";import{join as ar}from"path";var lo="_work",pt="externals",mt=".pid",lt="github",dt=/github\/([^/]+)/,gt=["runner","worker"],ht=24,go=3600000,Xn=10;function tn(r){return{auto:r?.auto??ro,intervalHours:r?.intervalHours??no,lastRun:r?.lastRun,olderThanDays:r?.olderThanDays??Tr,targets:r?.targets??eo}}function ho(r,n){return r-n*ht*go}function _n(r,n){if(!r.lastRun)return!0;let e=Date.parse(r.lastRun);if(Number.isNaN(e))return!0;return n-e>=r.intervalHours*go}function bo(r,n){let e=nn(r),o=new Set;for(let i of gt){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 wo(r){return[...r].sort($t)[0]??null}function vo(r,n){let e=wo(r),o=new Set(n);return r.filter((i)=>i!==e&&!o.has(i))}function Co(r){return r.match(dt)?.[1]??null}function an(r){return Object.values(r).reduce((n,e)=>n+e.freedBytes,0)}async function $o(r){try{let n=await ct(ar(r,mt),"utf-8"),e=Number.parseInt(n.trim(),Xn);if(Number.isNaN(e))return!1;return process.kill(e,0),!0}catch{return!1}}async function sn(r){if(!Sn(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 sn(i);continue}if(o.isFile()){let t=await ut(i);e+=t.size}}return e}async function cn(r){let n=ho(r.now,r.olderThanDays),e={};for(let o of r.targets)switch(o){case"logs":e.logs=await bt(r.entries,n,r.dryRun);break;case"work":e.work=await wt(r.entries,r.dryRun);break;case"shared":e.shared=await vt(r.entries,r.dryRun,r.sharedDir);break}return e}async function bt(r,n,e){let o={freedBytes:0,removed:0,skipped:[]};for(let i of r){let t=await Ir(ar(i.directory,Dr));for(let a of bo(t,n)){if(!e)await Bn(a.path,{force:!0});o.removed++,o.freedBytes+=a.size}}return o}async function wt(r,n){let e={freedBytes:0,removed:0,skipped:[]};for(let o of r){if(await $o(o.directory)){e.skipped.push(o.id);continue}let i=ar(o.directory,lo);if(!Sn(i))continue;let t=await Vn(i);if(t.length===0)continue;if(e.freedBytes+=await sn(i),e.removed+=t.length,n)continue;for(let a of t)await Bn(ar(i,a),{force:!0,recursive:!0})}return e}async function vt(r,n,e){let o={freedBytes:0,removed:0,skipped:[]},i=e??ar(ur,lt);if(!Sn(i))return o;let a=(await Vn(i,{withFileTypes:!0})).filter((c)=>c.isDirectory()).map((c)=>c.name),s=await Ct(r);for(let c of vo(a,s)){let f=ar(i,c);if(o.freedBytes+=await sn(f),o.removed++,!n)await Bn(f,{force:!0,recursive:!0})}return o}async function Ct(r){let n=[];for(let e of r)try{let o=await ft(ar(e.directory,pt)),i=Co(o);if(i)n.push(i)}catch{}return n}function $t(r,n){let e=r.split(".").map((t)=>Number.parseInt(t,Xn)),o=n.split(".").map((t)=>Number.parseInt(t,Xn)),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,f=Number.isNaN(s)?0:s;if(c!==f)return f-c}return 0}function x(r){switch(r.provider){case"github":return new on(r);default:throw Error(`Runner provider "${r.provider}" is not yet implemented`)}}var yo=0,yt={logs:"file(s)",shared:"version(s)",work:"item(s)"},Pt=tr({days:{alias:"d",default:yo,description:"Override log retention",displayDefault:`config or ${Tr} 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 fn extends k{name="cleanup";description="Remove logs, workspaces, and old runner versions";args=Pt;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=tn(r.config.get("cleanup")),o=this.explicitTargets(r),i=o.length>0?o:e.targets,t=r.args.days>yo?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 cn({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=yt[t],c=mr(a.freedBytes),f=n?`would remove ${a.removed} ${s}, ${c}`:`removed ${a.removed} ${s}, freed ${c}`;if(e.push(`${m.bold(t)}: ${a.removed>0?f: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=an(r),i=n?"Would free":"Freed";e.push(m.dim(`${i} ${mr(o)} total`)),v.info(e.join(`
|
|
94
|
+
`))}}async function Hr(r){try{let n=tn(r.config.get("cleanup"));if(!n.auto)return;if(!_n(n,Date.now()))return;let e=await cn({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=an(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 Ft}from"path";function wr(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")??Lr,i=e[o];if(!i)throw new w(`Profile "${o}" not found`);return{name:o,profile:i}}async function Z(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 Rt=G({profile:{description:"Profile to use"},count:{description:"Runner count override"}});class un extends k{name="create";description="Download and register runners";positionals=Rt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await Z(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),f=o-c.length;if(f<=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<f;){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:Ft(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")} ${f} 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 Po}from"fs";import{mkdir as Fo}from"fs/promises";var kt=G({url:{description:"GitHub repository or organization URL"}}),Lt=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 pn extends k{name="init";description="Set up a runner profile";positionals=kt;args=Lt;prompts=!0;async execute(r){let n=r.interactive?await this.promptProfileName(r):r.args.profile??Lr,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(`${_r} 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??Lr,message:"Profile name"})}async ensureDirectories(){if(!Po(ur))await Fo(ur,{recursive:!0});if(!Po(kr))await Fo(kr,{recursive:!0})}async runInitForm(){let r=await Jr({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:kr,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:kr,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 Dt}from"fs";import{readFile as It}from"fs/promises";var Et=100,Ht={runner:"runner daemon log",worker:"job log"},Ut=tr({lines:{alias:"n",default:Et,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"}}),Nt=G({id:{description:"Runner ID"}});class mn extends k{name="logs";description="Show recent runner logs";args=Ut;positionals=Nt;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(!Dt(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=Jn(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 It(n.path,"utf-8"),i=[`${m.bold(r.name)} ${m.dim(Ht[n.type])}`,m.dim(n.path),m.dim(`Last modified: ${n.mtime.toISOString()}`)];v.info(i.join(`
|
|
97
|
+
`)),console.log(Kn(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 At=G({name:{description:"Profile name to set as default"}});class Tn extends k{name="default";description="Set the default profile";positionals=At;async execute(r){let n=r.interactive?await Z(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 re 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(),f=o.filter((b)=>b.profile===t),d=new Set(c.filter((b)=>b.status==="running").map((b)=>b.id)),g=f.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:")} ${f.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 jt}from"fs/promises";import{join as Mt}from"path";var Gt=G({name:{description:"Profile name to remove"}});class ne extends k{name="remove";description="Delete a profile and its runners";positionals=Gt;async execute(r){let n=r.interactive?await Z(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 f=o.filter((d)=>d.profile!==n);r.config.set("runners",f)}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 jt(Mt(r.directory,i),{force:!0,recursive:!0}),o.stop(`${m.red("-")} ${i}`)}}class ln extends k{name="profile";description="Manage profiles";init(){this.registerSubcommands([new re,new ne,new Tn])}}import{rm as xt}from"fs/promises";import{join as qt}from"path";var zt=G({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class dn extends k{name="remove";description="Deregister and delete runners";positionals=zt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await Z(r.config)):z(r.config,r.positionals.profile),o=r.config.get("runners")??[],i=o.filter((f)=>f.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((f)=>f.id)):wr(r.positionals.ids??[],i.map((f)=>f.id)),a=x(e),s=J();for(let f of t)s.start(`Stopping and removing ${f}...`),await a.stop([f]),await a.remove([f]),await xt(qt(e.directory,f),{force:!0,recursive:!0}),s.stop(`${m.red("-")} ${f}`);let c=o.filter((f)=>!t.includes(f.id));r.config.set("runners",c),v.info(`${m.green("Removed")} ${t.length} runner(s).`)}async promptRunnerSelection(r){return fr({message:"Select runners to remove",options:r.map((n)=>({label:n,value:n})),required:!0})}}var Wt=G({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class gn extends k{name="start";description="Start runners";positionals=Wt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await Z(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)),f=i.map((p)=>p.id).filter((p)=>!c.has(p)),d=r.interactive?await this.promptRunnerSelection(f):wr(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 Hr(r)}async promptRunnerSelection(r){if(r.length===0)throw new w("All runners are already running");return fr({message:"Select runners to start",options:r.map((n)=>({label:n,value:n})),required:!0})}}var Yt={registered:m.yellow,running:m.green,stopped:m.red,unknown:m.dim};class hn 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=Yt[e.status]??m.dim,i=e.pid?m.dim(` (pid: ${e.pid})`):"";n.push(` ${o("\u25CF")} ${e.name} ${o(e.status)}${i}`)}}}var Jt=G({profile:{description:"Profile to use"},ids:{description:"Runner IDs (all by default)",variadic:!0}});class bn extends k{name="stop";description="Stop runners";positionals=Jt;async execute(r){let{name:n,profile:e}=r.interactive?z(r.config,await Z(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)),f=i.map((p)=>p.id).filter((p)=>c.has(p)),d=r.interactive?await this.promptRunnerSelection(f):wr(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 fr({message:"Select runners to stop",options:r.map((n)=>({label:n,value:n})),required:!0})}}class wn 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,f]of i){let d=n[c],g=f[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 Hr(r);return}}let h=await p.list(),l=new Set(h.filter((b)=>b.status==="running").map((b)=>b.id));for(let b of f){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 Hr(r)}}class Ro extends Wn{constructor(){super(new Yn(_e,Te),{bin:_r,clearOnStart:!0,description:"Manage GitHub Actions runners on this machine.",exitLabel:"Exit",goodbyeMessage:"Heads down.",name:"HYDRA",promptMessage:"What do you need?",version:Be})}init(){this.registerCommands([new pn,new un,new gn,new bn,new hn,new mn,new fn,new dn,new wn,new ln])}}var Kt=new Ro;Kt.run();
|
package/package.json
CHANGED