phala 1.1.13 → 1.1.18

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/index.js CHANGED
@@ -1,91 +1,166 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'module';const require = createRequire(import.meta.url);
3
- var ig=Object.create;var gi=Object.defineProperty;var cg=Object.getOwnPropertyDescriptor;var lg=Object.getOwnPropertyNames;var mg=Object.getPrototypeOf,pg=Object.prototype.hasOwnProperty;var Tt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Ze=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ug=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of lg(t))!pg.call(e,o)&&o!==r&&gi(e,o,{get:()=>t[o],enumerable:!(n=cg(t,o))||n.enumerable});return e};var qr=(e,t,r)=>(r=e!=null?ig(mg(e)):{},ug(t||!e||!e.__esModule?gi(r,"default",{value:e,enumerable:!0}):r,e));var yi=Ze((DE,hi)=>{var ur=1e3,dr=ur*60,fr=dr*60,Bt=fr*24,dg=Bt*7,fg=Bt*365.25;hi.exports=function(e,t){t=t||{};var r=typeof e;if(r==="string"&&e.length>0)return gg(e);if(r==="number"&&isFinite(e))return t.long?yg(e):hg(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function gg(e){if(e=String(e),!(e.length>100)){var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(t){var r=parseFloat(t[1]),n=(t[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*fg;case"weeks":case"week":case"w":return r*dg;case"days":case"day":case"d":return r*Bt;case"hours":case"hour":case"hrs":case"hr":case"h":return r*fr;case"minutes":case"minute":case"mins":case"min":case"m":return r*dr;case"seconds":case"second":case"secs":case"sec":case"s":return r*ur;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function hg(e){var t=Math.abs(e);return t>=Bt?Math.round(e/Bt)+"d":t>=fr?Math.round(e/fr)+"h":t>=dr?Math.round(e/dr)+"m":t>=ur?Math.round(e/ur)+"s":e+"ms"}function yg(e){var t=Math.abs(e);return t>=Bt?Nn(e,t,Bt,"day"):t>=fr?Nn(e,t,fr,"hour"):t>=dr?Nn(e,t,dr,"minute"):t>=ur?Nn(e,t,ur,"second"):e+" ms"}function Nn(e,t,r,n){var o=t>=r*1.5;return Math.round(e/r)+" "+n+(o?"s":"")}});var ua=Ze((RE,vi)=>{function vg(e){r.debug=r,r.default=r,r.coerce=l,r.disable=s,r.enable=o,r.enabled=c,r.humanize=yi(),r.destroy=m,Object.keys(e).forEach(p=>{r[p]=e[p]}),r.names=[],r.skips=[],r.formatters={};function t(p){let u=0;for(let d=0;d<p.length;d++)u=(u<<5)-u+p.charCodeAt(d),u|=0;return r.colors[Math.abs(u)%r.colors.length]}r.selectColor=t;function r(p){let u,d=null,f,g;function h(...v){if(!h.enabled)return;let w=h,C=Number(new Date),_=C-(u||C);w.diff=_,w.prev=u,w.curr=C,u=C,v[0]=r.coerce(v[0]),typeof v[0]!="string"&&v.unshift("%O");let S=0;v[0]=v[0].replace(/%([a-zA-Z%])/g,(x,P)=>{if(x==="%%")return"%";S++;let O=r.formatters[P];if(typeof O=="function"){let V=v[S];x=O.call(w,V),v.splice(S,1),S--}return x}),r.formatArgs.call(w,v),(w.log||r.log).apply(w,v)}return h.namespace=p,h.useColors=r.useColors(),h.color=r.selectColor(p),h.extend=n,h.destroy=r.destroy,Object.defineProperty(h,"enabled",{enumerable:!0,configurable:!1,get:()=>d!==null?d:(f!==r.namespaces&&(f=r.namespaces,g=r.enabled(p)),g),set:v=>{d=v}}),typeof r.init=="function"&&r.init(h),h}function n(p,u){let d=r(this.namespace+(typeof u>"u"?":":u)+p);return d.log=this.log,d}function o(p){r.save(p),r.namespaces=p,r.names=[],r.skips=[];let u=(typeof p=="string"?p:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let d of u)d[0]==="-"?r.skips.push(d.slice(1)):r.names.push(d)}function a(p,u){let d=0,f=0,g=-1,h=0;for(;d<p.length;)if(f<u.length&&(u[f]===p[d]||u[f]==="*"))u[f]==="*"?(g=f,h=d,f++):(d++,f++);else if(g!==-1)f=g+1,h++,d=h;else return!1;for(;f<u.length&&u[f]==="*";)f++;return f===u.length}function s(){let p=[...r.names,...r.skips.map(u=>"-"+u)].join(",");return r.enable(""),p}function c(p){for(let u of r.skips)if(a(p,u))return!1;for(let u of r.names)if(a(p,u))return!0;return!1}function l(p){return p instanceof Error?p.stack||p.message:p}function m(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return r.enable(r.load()),r}vi.exports=vg});var bi=Ze((je,Un)=>{je.formatArgs=Cg;je.save=wg;je.load=_g;je.useColors=bg;je.storage=Sg();je.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();je.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function bg(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function Cg(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+Un.exports.humanize(this.diff),!this.useColors)return;let t="color: "+this.color;e.splice(1,0,t,"color: inherit");let r=0,n=0;e[0].replace(/%[a-zA-Z%]/g,o=>{o!=="%%"&&(r++,o==="%c"&&(n=r))}),e.splice(n,0,t)}je.log=console.debug||console.log||(()=>{});function wg(e){try{e?je.storage.setItem("debug",e):je.storage.removeItem("debug")}catch{}}function _g(){let e;try{e=je.storage.getItem("debug")||je.storage.getItem("DEBUG")}catch{}return!e&&typeof process<"u"&&"env"in process&&(e=process.env.DEBUG),e}function Sg(){try{return localStorage}catch{}}Un.exports=ua()(je);var{formatters:kg}=Un.exports;kg.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var wi=Ze((be,Fn)=>{var Eg=Tt("tty"),On=Tt("util");be.init=Rg;be.log=Pg;be.formatArgs=Ag;be.save=$g;be.load=Dg;be.useColors=Ig;be.destroy=On.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");be.colors=[6,2,3,4,5,1];try{let e=Tt("supports-color");e&&(e.stderr||e).level>=2&&(be.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}be.inspectOpts=Object.keys(process.env).filter(e=>/^debug_/i.test(e)).reduce((e,t)=>{let r=t.substring(6).toLowerCase().replace(/_([a-z])/g,(o,a)=>a.toUpperCase()),n=process.env[t];return/^(yes|on|true|enabled)$/i.test(n)?n=!0:/^(no|off|false|disabled)$/i.test(n)?n=!1:n==="null"?n=null:n=Number(n),e[r]=n,e},{});function Ig(){return"colors"in be.inspectOpts?!!be.inspectOpts.colors:Eg.isatty(process.stderr.fd)}function Ag(e){let{namespace:t,useColors:r}=this;if(r){let n=this.color,o="\x1B[3"+(n<8?n:"8;5;"+n),a=` ${o};1m${t} \x1B[0m`;e[0]=a+e[0].split(`
3
+ var vh=Object.create;var Zi=Object.defineProperty;var Ch=Object.getOwnPropertyDescriptor;var bh=Object.getOwnPropertyNames;var wh=Object.getPrototypeOf,_h=Object.prototype.hasOwnProperty;var Jt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var it=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var kh=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of bh(t))!_h.call(e,o)&&o!==n&&Zi(e,o,{get:()=>t[o],enumerable:!(r=Ch(t,o))||r.enumerable});return e};var Ir=(e,t,n)=>(n=e!=null?vh(wh(e)):{},kh(t||!e||!e.__esModule?Zi(n,"default",{value:e,enumerable:!0}):n,e));var Qi=it((nP,Xi)=>{var Un=1e3,On=Un*60,Nn=On*60,hn=Nn*24,Sh=hn*7,Eh=hn*365.25;Xi.exports=function(e,t){t=t||{};var n=typeof e;if(n==="string"&&e.length>0)return Ih(e);if(n==="number"&&isFinite(e))return t.long?Ph(e):Ah(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function Ih(e){if(e=String(e),!(e.length>100)){var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]),r=(t[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return n*Eh;case"weeks":case"week":case"w":return n*Sh;case"days":case"day":case"d":return n*hn;case"hours":case"hour":case"hrs":case"hr":case"h":return n*Nn;case"minutes":case"minute":case"mins":case"min":case"m":return n*On;case"seconds":case"second":case"secs":case"sec":case"s":return n*Un;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function Ah(e){var t=Math.abs(e);return t>=hn?Math.round(e/hn)+"d":t>=Nn?Math.round(e/Nn)+"h":t>=On?Math.round(e/On)+"m":t>=Un?Math.round(e/Un)+"s":e+"ms"}function Ph(e){var t=Math.abs(e);return t>=hn?fo(e,t,hn,"day"):t>=Nn?fo(e,t,Nn,"hour"):t>=On?fo(e,t,On,"minute"):t>=Un?fo(e,t,Un,"second"):e+" ms"}function fo(e,t,n,r){var o=t>=n*1.5;return Math.round(e/n)+" "+r+(o?"s":"")}});var Ba=it((rP,ec)=>{function $h(e){n.debug=n,n.default=n,n.coerce=l,n.disable=s,n.enable=o,n.enabled=i,n.humanize=Qi(),n.destroy=p,Object.keys(e).forEach(m=>{n[m]=e[m]}),n.names=[],n.skips=[],n.formatters={};function t(m){let d=0;for(let f=0;f<m.length;f++)d=(d<<5)-d+m.charCodeAt(f),d|=0;return n.colors[Math.abs(d)%n.colors.length]}n.selectColor=t;function n(m){let d,f=null,u,h;function g(...y){if(!g.enabled)return;let b=g,w=Number(new Date),S=w-(d||w);b.diff=S,b.prev=d,b.curr=w,d=w,y[0]=n.coerce(y[0]),typeof y[0]!="string"&&y.unshift("%O");let k=0;y[0]=y[0].replace(/%([a-zA-Z%])/g,(I,$)=>{if(I==="%%")return"%";k++;let M=n.formatters[$];if(typeof M=="function"){let U=y[k];I=M.call(b,U),y.splice(k,1),k--}return I}),n.formatArgs.call(b,y),(b.log||n.log).apply(b,y)}return g.namespace=m,g.useColors=n.useColors(),g.color=n.selectColor(m),g.extend=r,g.destroy=n.destroy,Object.defineProperty(g,"enabled",{enumerable:!0,configurable:!1,get:()=>f!==null?f:(u!==n.namespaces&&(u=n.namespaces,h=n.enabled(m)),h),set:y=>{f=y}}),typeof n.init=="function"&&n.init(g),g}function r(m,d){let f=n(this.namespace+(typeof d>"u"?":":d)+m);return f.log=this.log,f}function o(m){n.save(m),n.namespaces=m,n.names=[],n.skips=[];let d=(typeof m=="string"?m:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let f of d)f[0]==="-"?n.skips.push(f.slice(1)):n.names.push(f)}function a(m,d){let f=0,u=0,h=-1,g=0;for(;f<m.length;)if(u<d.length&&(d[u]===m[f]||d[u]==="*"))d[u]==="*"?(h=u,g=f,u++):(f++,u++);else if(h!==-1)u=h+1,g++,f=g;else return!1;for(;u<d.length&&d[u]==="*";)u++;return u===d.length}function s(){let m=[...n.names,...n.skips.map(d=>"-"+d)].join(",");return n.enable(""),m}function i(m){for(let d of n.skips)if(a(m,d))return!1;for(let d of n.names)if(a(m,d))return!0;return!1}function l(m){return m instanceof Error?m.stack||m.message:m}function p(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return n.enable(n.load()),n}ec.exports=$h});var tc=it((Be,go)=>{Be.formatArgs=xh;Be.save=Dh;Be.load=Th;Be.useColors=Rh;Be.storage=Mh();Be.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();Be.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Rh(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function xh(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+go.exports.humanize(this.diff),!this.useColors)return;let t="color: "+this.color;e.splice(1,0,t,"color: inherit");let n=0,r=0;e[0].replace(/%[a-zA-Z%]/g,o=>{o!=="%%"&&(n++,o==="%c"&&(r=n))}),e.splice(r,0,t)}Be.log=console.debug||console.log||(()=>{});function Dh(e){try{e?Be.storage.setItem("debug",e):Be.storage.removeItem("debug")}catch{}}function Th(){let e;try{e=Be.storage.getItem("debug")||Be.storage.getItem("DEBUG")}catch{}return!e&&typeof process<"u"&&"env"in process&&(e=process.env.DEBUG),e}function Mh(){try{return localStorage}catch{}}go.exports=Ba()(Be);var{formatters:Lh}=go.exports;Lh.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var rc=it((Se,yo)=>{var Uh=Jt("tty"),ho=Jt("util");Se.init=zh;Se.log=Fh;Se.formatArgs=Nh;Se.save=Vh;Se.load=Hh;Se.useColors=Oh;Se.destroy=ho.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");Se.colors=[6,2,3,4,5,1];try{let e=Jt("supports-color");e&&(e.stderr||e).level>=2&&(Se.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}Se.inspectOpts=Object.keys(process.env).filter(e=>/^debug_/i.test(e)).reduce((e,t)=>{let n=t.substring(6).toLowerCase().replace(/_([a-z])/g,(o,a)=>a.toUpperCase()),r=process.env[t];return/^(yes|on|true|enabled)$/i.test(r)?r=!0:/^(no|off|false|disabled)$/i.test(r)?r=!1:r==="null"?r=null:r=Number(r),e[n]=r,e},{});function Oh(){return"colors"in Se.inspectOpts?!!Se.inspectOpts.colors:Uh.isatty(process.stderr.fd)}function Nh(e){let{namespace:t,useColors:n}=this;if(n){let r=this.color,o="\x1B[3"+(r<8?r:"8;5;"+r),a=` ${o};1m${t} \x1B[0m`;e[0]=a+e[0].split(`
4
4
  `).join(`
5
- `+a),e.push(o+"m+"+Fn.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=xg()+t+" "+e[0]}function xg(){return be.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Pg(...e){return process.stderr.write(On.formatWithOptions(be.inspectOpts,...e)+`
6
- `)}function $g(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function Dg(){return process.env.DEBUG}function Rg(e){e.inspectOpts={};let t=Object.keys(be.inspectOpts);for(let r=0;r<t.length;r++)e.inspectOpts[t[r]]=be.inspectOpts[t[r]]}Fn.exports=ua()(be);var{formatters:Ci}=Fn.exports;Ci.o=function(e){return this.inspectOpts.colors=this.useColors,On.inspect(e,this.inspectOpts).split(`
7
- `).map(t=>t.trim()).join(" ")};Ci.O=function(e){return this.inspectOpts.colors=this.useColors,On.inspect(e,this.inspectOpts)}});var _i=Ze((ME,da)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?da.exports=bi():da.exports=wi()});var ha=Ze(Br=>{"use strict";var Mg=Br&&Br.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Br,"__esModule",{value:!0});Br.encryptEnvVars=Ng;var fa=Tt("@noble/curves/ed25519"),ga=Mg(Tt("crypto"));function Tg(e){var t,r;return e=e.startsWith("0x")?e.slice(2):e,new Uint8Array((r=(t=e.match(/.{1,2}/g))===null||t===void 0?void 0:t.map(n=>parseInt(n,16)))!==null&&r!==void 0?r:[])}function Lg(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Ng(e,t){let r=JSON.stringify({env:e}),n=fa.x25519.utils.randomPrivateKey(),o=fa.x25519.getPublicKey(n),a=Tg(t),s=fa.x25519.getSharedSecret(n,a),c=await ga.default.subtle.importKey("raw",s,{name:"AES-GCM",length:256},!0,["encrypt"]),l=ga.default.getRandomValues(new Uint8Array(12)),m=await ga.default.subtle.encrypt({name:"AES-GCM",iv:l},c,new TextEncoder().encode(r)),p=new Uint8Array(o.length+l.length+m.byteLength);return p.set(o),p.set(l,o.length),p.set(new Uint8Array(m),o.length+l.length),Lg(p)}});var ki=Ze(Wr=>{"use strict";var Ug=Wr&&Wr.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Wr,"__esModule",{value:!0});Wr.getComposeHash=Vg;var Og=Ug(Tt("crypto"));function ya(e){return e==null?e:Array.isArray(e)?e.map(ya):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,r)=>{let n=e[r];return t[r]=ya(n),t},{}):e}function Fg(e){let t={...e};return t.runner==="bash"&&"docker_compose_file"in t?delete t.docker_compose_file:t.runner==="docker-compose"&&"bash_script"in t&&delete t.bash_script,"pre_launch_script"in t&&!t.pre_launch_script&&delete t.pre_launch_script,t}function jg(e){let t=ya(e);return JSON.stringify(t,(r,n)=>typeof n=="number"&&(isNaN(n)||!isFinite(n))?null:n)}function Vg(e,t=!1){t&&(e=Fg(e));let r=jg(e);return Og.default.createHash("sha256").update(r,"utf8").digest("hex")}});var qi=Ze(T=>{"use strict";Object.defineProperty(T,"__esModule",{value:!0});T.toBig=T.shrSL=T.shrSH=T.rotrSL=T.rotrSH=T.rotrBL=T.rotrBH=T.rotr32L=T.rotr32H=T.rotlSL=T.rotlSH=T.rotlBL=T.rotlBH=T.add5L=T.add5H=T.add4L=T.add4H=T.add3L=T.add3H=void 0;T.add=Fi;T.fromBig=ba;T.split=Ei;var jn=BigInt(2**32-1),va=BigInt(32);function ba(e,t=!1){return t?{h:Number(e&jn),l:Number(e>>va&jn)}:{h:Number(e>>va&jn)|0,l:Number(e&jn)|0}}function Ei(e,t=!1){let r=e.length,n=new Uint32Array(r),o=new Uint32Array(r);for(let a=0;a<r;a++){let{h:s,l:c}=ba(e[a],t);[n[a],o[a]]=[s,c]}return[n,o]}var Ii=(e,t)=>BigInt(e>>>0)<<va|BigInt(t>>>0);T.toBig=Ii;var Ai=(e,t,r)=>e>>>r;T.shrSH=Ai;var xi=(e,t,r)=>e<<32-r|t>>>r;T.shrSL=xi;var Pi=(e,t,r)=>e>>>r|t<<32-r;T.rotrSH=Pi;var $i=(e,t,r)=>e<<32-r|t>>>r;T.rotrSL=$i;var Di=(e,t,r)=>e<<64-r|t>>>r-32;T.rotrBH=Di;var Ri=(e,t,r)=>e>>>r-32|t<<64-r;T.rotrBL=Ri;var Mi=(e,t)=>t;T.rotr32H=Mi;var Ti=(e,t)=>e;T.rotr32L=Ti;var Li=(e,t,r)=>e<<r|t>>>32-r;T.rotlSH=Li;var Ni=(e,t,r)=>t<<r|e>>>32-r;T.rotlSL=Ni;var Ui=(e,t,r)=>t<<r-32|e>>>64-r;T.rotlBH=Ui;var Oi=(e,t,r)=>e<<r-32|t>>>64-r;T.rotlBL=Oi;function Fi(e,t,r,n){let o=(t>>>0)+(n>>>0);return{h:e+r+(o/2**32|0)|0,l:o|0}}var ji=(e,t,r)=>(e>>>0)+(t>>>0)+(r>>>0);T.add3L=ji;var Vi=(e,t,r,n)=>t+r+n+(e/2**32|0)|0;T.add3H=Vi;var zi=(e,t,r,n)=>(e>>>0)+(t>>>0)+(r>>>0)+(n>>>0);T.add4L=zi;var Ki=(e,t,r,n,o)=>t+r+n+o+(e/2**32|0)|0;T.add4H=Ki;var Gi=(e,t,r,n,o)=>(e>>>0)+(t>>>0)+(r>>>0)+(n>>>0)+(o>>>0);T.add5L=Gi;var Hi=(e,t,r,n,o,a)=>t+r+n+o+a+(e/2**32|0)|0;T.add5H=Hi;var zg={fromBig:ba,split:Ei,toBig:Ii,shrSH:Ai,shrSL:xi,rotrSH:Pi,rotrSL:$i,rotrBH:Di,rotrBL:Ri,rotr32H:Mi,rotr32L:Ti,rotlSH:Li,rotlSL:Ni,rotlBH:Ui,rotlBL:Oi,add:Fi,add3L:ji,add3H:Vi,add4L:zi,add4H:Ki,add5H:Hi,add5L:Gi};T.default=zg});var Bi=Ze(Vn=>{"use strict";Object.defineProperty(Vn,"__esModule",{value:!0});Vn.crypto=void 0;var Lt=Tt("crypto");Vn.crypto=Lt&&typeof Lt=="object"&&"webcrypto"in Lt?Lt.webcrypto:Lt&&typeof Lt=="object"&&"randomBytes"in Lt?Lt:void 0});var tc=Ze(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});D.wrapXOFConstructorWithOpts=D.wrapConstructorWithOpts=D.wrapConstructor=D.Hash=D.nextTick=D.swap32IfBE=D.byteSwapIfBE=D.swap8IfBE=D.isLE=void 0;D.isBytes=Ji;D.anumber=Ca;D.abytes=hr;D.ahash=Kg;D.aexists=Gg;D.aoutput=Hg;D.u8=qg;D.u32=Bg;D.clean=Wg;D.createView=Jg;D.rotr=Yg;D.rotl=Zg;D.byteSwap=_a;D.byteSwap32=Yi;D.bytesToHex=Qg;D.hexToBytes=eh;D.asyncLoop=rh;D.utf8ToBytes=Sa;D.bytesToUtf8=nh;D.toBytes=zn;D.kdfInputToBytes=oh;D.concatBytes=ah;D.checkOpts=sh;D.createHasher=Xi;D.createOptHasher=Qi;D.createXOFer=ec;D.randomBytes=ih;var gr=Bi();function Ji(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"}function Ca(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("positive integer expected, got "+e)}function hr(e,...t){if(!Ji(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error("Uint8Array expected of length "+t+", got length="+e.length)}function Kg(e){if(typeof e!="function"||typeof e.create!="function")throw new Error("Hash should be wrapped by utils.createHasher");Ca(e.outputLen),Ca(e.blockLen)}function Gg(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Hg(e,t){hr(e);let r=t.outputLen;if(e.length<r)throw new Error("digestInto() expects output buffer of length at least "+r)}function qg(e){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function Bg(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function Wg(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function Jg(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function Yg(e,t){return e<<32-t|e>>>t}function Zg(e,t){return e<<t|e>>>32-t>>>0}D.isLE=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function _a(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}D.swap8IfBE=D.isLE?e=>e:e=>_a(e);D.byteSwapIfBE=D.swap8IfBE;function Yi(e){for(let t=0;t<e.length;t++)e[t]=_a(e[t]);return e}D.swap32IfBE=D.isLE?e=>e:Yi;var Zi=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",Xg=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function Qg(e){if(hr(e),Zi)return e.toHex();let t="";for(let r=0;r<e.length;r++)t+=Xg[e[r]];return t}var Ct={_0:48,_9:57,A:65,F:70,a:97,f:102};function Wi(e){if(e>=Ct._0&&e<=Ct._9)return e-Ct._0;if(e>=Ct.A&&e<=Ct.F)return e-(Ct.A-10);if(e>=Ct.a&&e<=Ct.f)return e-(Ct.a-10)}function eh(e){if(typeof e!="string")throw new Error("hex string expected, got "+typeof e);if(Zi)return Uint8Array.fromHex(e);let t=e.length,r=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);let n=new Uint8Array(r);for(let o=0,a=0;o<r;o++,a+=2){let s=Wi(e.charCodeAt(a)),c=Wi(e.charCodeAt(a+1));if(s===void 0||c===void 0){let l=e[a]+e[a+1];throw new Error('hex string expected, got non-hex character "'+l+'" at index '+a)}n[o]=s*16+c}return n}var th=async()=>{};D.nextTick=th;async function rh(e,t,r){let n=Date.now();for(let o=0;o<e;o++){r(o);let a=Date.now()-n;a>=0&&a<t||(await(0,D.nextTick)(),n+=a)}}function Sa(e){if(typeof e!="string")throw new Error("string expected");return new Uint8Array(new TextEncoder().encode(e))}function nh(e){return new TextDecoder().decode(e)}function zn(e){return typeof e=="string"&&(e=Sa(e)),hr(e),e}function oh(e){return typeof e=="string"&&(e=Sa(e)),hr(e),e}function ah(...e){let t=0;for(let n=0;n<e.length;n++){let o=e[n];hr(o),t+=o.length}let r=new Uint8Array(t);for(let n=0,o=0;n<e.length;n++){let a=e[n];r.set(a,o),o+=a.length}return r}function sh(e,t){if(t!==void 0&&{}.toString.call(t)!=="[object Object]")throw new Error("options should be object or undefined");return Object.assign(e,t)}var wa=class{};D.Hash=wa;function Xi(e){let t=n=>e().update(zn(n)).digest(),r=e();return t.outputLen=r.outputLen,t.blockLen=r.blockLen,t.create=()=>e(),t}function Qi(e){let t=(n,o)=>e(o).update(zn(n)).digest(),r=e({});return t.outputLen=r.outputLen,t.blockLen=r.blockLen,t.create=n=>e(n),t}function ec(e){let t=(n,o)=>e(o).update(zn(n)).digest(),r=e({});return t.outputLen=r.outputLen,t.blockLen=r.blockLen,t.create=n=>e(n),t}D.wrapConstructor=Xi;D.wrapConstructorWithOpts=Qi;D.wrapXOFConstructorWithOpts=ec;function ih(e=32){if(gr.crypto&&typeof gr.crypto.getRandomValues=="function")return gr.crypto.getRandomValues(new Uint8Array(e));if(gr.crypto&&typeof gr.crypto.randomBytes=="function")return Uint8Array.from(gr.crypto.randomBytes(e));throw new Error("crypto.getRandomValues must be defined")}});var mc=Ze(ae=>{"use strict";Object.defineProperty(ae,"__esModule",{value:!0});ae.shake256=ae.shake128=ae.keccak_512=ae.keccak_384=ae.keccak_256=ae.keccak_224=ae.sha3_512=ae.sha3_384=ae.sha3_256=ae.sha3_224=ae.Keccak=void 0;ae.keccakP=cc;var Yr=qi(),Ae=tc(),ch=BigInt(0),Jr=BigInt(1),lh=BigInt(2),mh=BigInt(7),ph=BigInt(256),uh=BigInt(113),oc=[],ac=[],sc=[];for(let e=0,t=Jr,r=1,n=0;e<24;e++){[r,n]=[n,(2*r+3*n)%5],oc.push(2*(5*n+r)),ac.push((e+1)*(e+2)/2%64);let o=ch;for(let a=0;a<7;a++)t=(t<<Jr^(t>>mh)*uh)%ph,t&lh&&(o^=Jr<<(Jr<<BigInt(a))-Jr);sc.push(o)}var ic=(0,Yr.split)(sc,!0),dh=ic[0],fh=ic[1],rc=(e,t,r)=>r>32?(0,Yr.rotlBH)(e,t,r):(0,Yr.rotlSH)(e,t,r),nc=(e,t,r)=>r>32?(0,Yr.rotlBL)(e,t,r):(0,Yr.rotlSL)(e,t,r);function cc(e,t=24){let r=new Uint32Array(10);for(let n=24-t;n<24;n++){for(let s=0;s<10;s++)r[s]=e[s]^e[s+10]^e[s+20]^e[s+30]^e[s+40];for(let s=0;s<10;s+=2){let c=(s+8)%10,l=(s+2)%10,m=r[l],p=r[l+1],u=rc(m,p,1)^r[c],d=nc(m,p,1)^r[c+1];for(let f=0;f<50;f+=10)e[s+f]^=u,e[s+f+1]^=d}let o=e[2],a=e[3];for(let s=0;s<24;s++){let c=ac[s],l=rc(o,a,c),m=nc(o,a,c),p=oc[s];o=e[p],a=e[p+1],e[p]=l,e[p+1]=m}for(let s=0;s<50;s+=10){for(let c=0;c<10;c++)r[c]=e[s+c];for(let c=0;c<10;c++)e[s+c]^=~r[(c+2)%10]&r[(c+4)%10]}e[0]^=dh[n],e[1]^=fh[n]}(0,Ae.clean)(r)}var Zr=class e extends Ae.Hash{constructor(t,r,n,o=!1,a=24){if(super(),this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,this.enableXOF=!1,this.blockLen=t,this.suffix=r,this.outputLen=n,this.enableXOF=o,this.rounds=a,(0,Ae.anumber)(n),!(0<t&&t<200))throw new Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=(0,Ae.u32)(this.state)}clone(){return this._cloneInto()}keccak(){(0,Ae.swap32IfBE)(this.state32),cc(this.state32,this.rounds),(0,Ae.swap32IfBE)(this.state32),this.posOut=0,this.pos=0}update(t){(0,Ae.aexists)(this),t=(0,Ae.toBytes)(t),(0,Ae.abytes)(t);let{blockLen:r,state:n}=this,o=t.length;for(let a=0;a<o;){let s=Math.min(r-this.pos,o-a);for(let c=0;c<s;c++)n[this.pos++]^=t[a++];this.pos===r&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:t,suffix:r,pos:n,blockLen:o}=this;t[n]^=r,(r&128)!==0&&n===o-1&&this.keccak(),t[o-1]^=128,this.keccak()}writeInto(t){(0,Ae.aexists)(this,!1),(0,Ae.abytes)(t),this.finish();let r=this.state,{blockLen:n}=this;for(let o=0,a=t.length;o<a;){this.posOut>=n&&this.keccak();let s=Math.min(n-this.posOut,a-o);t.set(r.subarray(this.posOut,this.posOut+s),o),this.posOut+=s,o+=s}return t}xofInto(t){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(t)}xof(t){return(0,Ae.anumber)(t),this.xofInto(new Uint8Array(t))}digestInto(t){if((0,Ae.aoutput)(t,this),this.finished)throw new Error("digest() was already called");return this.writeInto(t),this.destroy(),t}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,(0,Ae.clean)(this.state)}_cloneInto(t){let{blockLen:r,suffix:n,outputLen:o,rounds:a,enableXOF:s}=this;return t||(t=new e(r,n,o,s,a)),t.state32.set(this.state32),t.pos=this.pos,t.posOut=this.posOut,t.finished=this.finished,t.rounds=a,t.suffix=n,t.outputLen=o,t.enableXOF=s,t.destroyed=this.destroyed,t}};ae.Keccak=Zr;var Nt=(e,t,r)=>(0,Ae.createHasher)(()=>new Zr(t,e,r));ae.sha3_224=Nt(6,144,224/8);ae.sha3_256=Nt(6,136,256/8);ae.sha3_384=Nt(6,104,384/8);ae.sha3_512=Nt(6,72,512/8);ae.keccak_224=Nt(1,144,224/8);ae.keccak_256=Nt(1,136,256/8);ae.keccak_384=Nt(1,104,384/8);ae.keccak_512=Nt(1,72,512/8);var lc=(e,t,r)=>(0,Ae.createXOFer)((n={})=>new Zr(t,e,n.dkLen===void 0?r:n.dkLen,!0));ae.shake128=lc(31,168,128/8);ae.shake256=lc(31,136,256/8)});var pc=Ze(ka=>{"use strict";Object.defineProperty(ka,"__esModule",{value:!0});ka.verifyEnvEncryptPublicKey=yh;var gh=mc(),hh=Tt("@noble/curves/secp256k1");function yh(e,t,r){if(t.length!==65)return null;let n=Buffer.from("dstack-env-encrypt-pubkey","utf8"),o=r;r.startsWith("0x")&&(o=r.slice(2));let a=Buffer.from(o,"hex"),s=Buffer.from(":","utf8"),c=Buffer.concat([n,s,a,Buffer.from(e)]),l=(0,gh.keccak_256)(c);try{let m=t.slice(0,32),p=t.slice(32,64),u=t[64],d=new Uint8Array(64);d.set(m,0),d.set(p,32);let f=hh.secp256k1.Signature.fromCompact(d).addRecoveryBit(u).recoverPublicKey(l);return"0x"+Buffer.from(f.toRawBytes(!0)).toString("hex")}catch(m){return console.error("signature verification failed:",m),null}}});import{readFileSync as vE}from"fs";import{dirname as bE,join as CE}from"path";import{fileURLToPath as wE}from"url";import{ZodError as Hw}from"zod";import Tr from"chalk";var Mc=qr(_i(),1);import{ofetch as vh}from"ofetch";function Si(e){return{all:e=e||new Map,on:function(t,r){var n=e.get(t);n?n.push(r):e.set(t,[r])},off:function(t,r){var n=e.get(t);n&&(r?n.splice(n.indexOf(r)>>>0,1):e.set(t,[]))},emit:function(t,r){var n=e.get(t);n&&n.slice().map(function(o){o(r)}),(n=e.get("*"))&&n.slice().map(function(o){o(t,r)})}}}var HI=qr(ha(),1),$e=qr(ha(),1),cw=qr(ki(),1),lw=qr(pc(),1);import{z as Ce}from"zod";import{z as se}from"zod";import{z as Ut}from"zod";import{z as K}from"zod";import{z as Ot}from"zod";import{anvil as dc,base as fc,mainnet as gc}from"viem/chains";import{z as fe}from"zod";import{z as Ne}from"zod";import{z as I}from"zod";import{z as A}from"zod";import{z as vr}from"zod";import{z as br}from"zod";import{z as F}from"zod";import{z as we}from"zod";import{z as H}from"zod";import xy from"crypto";import{z as mt}from"zod";import{z as rt}from"zod";import{z as ke}from"zod";import{z as ze}from"zod";import{z as Ke}from"zod";import{z as nv}from"zod";import{z as hc}from"zod";import{z as pt}from"zod";import{z as Er}from"zod";import{z as Jt}from"zod";import{z as re}from"zod";import{z as Av}from"zod";import{z as $v}from"zod";import{z as X}from"zod";import{z as ct}from"zod";import{z as Gv}from"zod";import{z as de}from"zod";import{z as R}from"zod";import{z as Sr}from"zod";import{z as Aa}from"zod";import{z as xe}from"zod";import{z as el}from"zod";import{z as it}from"zod";import{z as Ve}from"zod";import{z as Ft}from"zod";import{z as xa}from"zod";import{z as La}from"zod";import{z as Wt}from"zod";import{z as Se}from"zod";import{z as ge}from"zod";import{z as $}from"zod";import{z as W}from"zod";import{z as q}from"zod";import{z as ye}from"zod";import{createPublicClient as bc,createWalletClient as Qb,http as Pa,parseEventLogs as eC,parseEther as Cc}from"viem";import{privateKeyToAccount as tC}from"viem/accounts";import{isHex as wc}from"viem";import{createPublicClient as JI,createWalletClient as YI,http as ZI,custom as XI}from"viem";import{privateKeyToAccount as eA}from"viem/accounts";import{z as le}from"zod";import{createPublicClient as _c,createWalletClient as mC,http as $a,parseEventLogs as pC,parseEther as Sc}from"viem";import{privateKeyToAccount as uC}from"viem/accounts";import{z as me}from"zod";import{createPublicClient as kc,createWalletClient as yC,http as Da,parseEther as Ec}from"viem";import{privateKeyToAccount as vC}from"viem/accounts";import{z as pe}from"zod";import{createPublicClient as Ic,createWalletClient as _C,http as Ra,parseEther as Ac}from"viem";import{privateKeyToAccount as SC}from"viem/accounts";import{z as ue}from"zod";import{createPublicClient as xc,createWalletClient as AC,http as Ma,parseEther as Pc}from"viem";import{privateKeyToAccount as xC}from"viem/accounts";import{z as Cr}from"zod";import{createPublicClient as RC,http as MC}from"viem";import{createPublicClient as yA,http as vA}from"viem";import{z as wr}from"zod";import{z as ot}from"zod";import{z as FC}from"zod";import{z as _r}from"zod";import{z as nt}from"zod";import{z as _e}from"zod";import{z as Le}from"zod";import{z as Xr}from"zod";import{z as Be}from"zod";import{z as $c}from"zod";import{z as Dc}from"zod";import{z as Ue}from"zod";import{z as Gn}from"zod";import{z as Hn}from"zod";import{z as Te}from"zod";import{z as J}from"zod";var bh=Ce.object({detail:Ce.union([Ce.string(),Ce.array(Ce.object({msg:Ce.string(),type:Ce.string().optional(),ctx:Ce.record(Ce.unknown()).optional(),loc:Ce.array(Ce.union([Ce.string(),Ce.number()])).optional(),input:Ce.unknown().optional()}).passthrough()),Ce.record(Ce.unknown())]).optional(),type:Ce.string().optional(),code:Ce.string().optional()}),ut=class extends Error{constructor(e,t){super(e),this.name=this.constructor.name,this.status=t.status,this.statusText=t.statusText,this.detail=t.detail,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},Ea=class qn extends ut{constructor(t,r){super(t,{status:r?.status??0,statusText:r?.statusText??"Unknown Error",detail:r?.detail||t}),this.name="RequestError",this.isRequestError=!0,this.data=r?.data,this.request=r?.request,this.response=r?.response,this.code=r?.code,this.type=r?.type}static fromFetchError(t){let r=bh.safeParse(t.data);return r.success?new qn(t.message,{status:t.status??void 0,statusText:t.statusText??void 0,data:t.data,request:t.request??void 0,response:t.response??void 0,detail:r.data.detail,code:r.data.code??void 0,type:r.data.type??void 0}):new qn(t.message,{status:t.status??void 0,statusText:t.statusText??void 0,data:t.data,request:t.request??void 0,response:t.response??void 0,detail:t.data?.detail||"Unknown API error",code:t.status?.toString()??void 0})}static fromError(t,r){return new qn(t.message,{request:r??void 0,detail:t.message})}},Ch=class extends ut{constructor(e,t){super(e,t),this.isValidationError=!0,this.validationErrors=t.validationErrors}},wh=class extends ut{constructor(){super(...arguments),this.isAuthError=!0}},Wn=class extends ut{constructor(){super(...arguments),this.isBusinessError=!0}},_h=class extends ut{constructor(){super(...arguments),this.isServerError=!0}},Sh=class extends ut{constructor(){super(...arguments),this.isUnknownError=!0}};function kh(e){if(!e||!Array.isArray(e))return"unknown";let t=e.filter(r=>typeof r=="string"?!["body","query","path","header"].includes(r):!0);return t.length>0?t.join("."):"unknown"}function Tc(e){if(!Array.isArray(e))return{errors:[],message:typeof e=="string"?e:"Validation error"};let t=e.map((o,a)=>{let s=kh(o.loc),c=s;return s==="unknown"&&o.type&&(c=o.type==="missing"?"required field":o.type),{field:c,message:o.msg,type:o.type,context:o.ctx}}),r=t.length,n=r===1?`Validation failed: ${t[0].message}`:`Validation failed (${r} issue${r>1?"s":""})`;return{errors:t,message:n}}function Eh(e){return e===422?"validation":e===401||e===403?"auth":e>=400&&e<500?"business":e>=500?"server":"unknown"}function Ih(e,t,r){if(e===422&&Array.isArray(t)){let{message:n}=Tc(t);return n}if(typeof t=="string")return t;if(t&&typeof t=="object"&&"message"in t){let n=t.message;if(typeof n=="string")return n}return r}function Ah(e){let t=e.status??0,r=e.statusText??"Unknown Error",n=e.detail,o=xh(n);if(o)return new en(o.message,{status:t,statusText:r,detail:n,errorCode:o.error_code,structuredDetails:o.details,suggestions:o.suggestions,links:o.links});let a=Eh(t),s=Ih(t,n,e.message),c={status:t,statusText:r,detail:n};if(a==="validation"&&Array.isArray(n)){let{errors:l}=Tc(n);return new Ch(s,{...c,validationErrors:l})}return a==="auth"?new wh(s,c):a==="business"?new Wn(s,c):a==="server"?new _h(s,c):new Sh(s,c)}var en=class extends Wn{constructor(e,t){super(e,t),this.isResourceError=!0,this.errorCode=t.errorCode,this.structuredDetails=t.structuredDetails,this.suggestions=t.suggestions,this.links=t.links}};function xh(e){if(!e||typeof e!="object")return null;let t=e;return t.error_code&&typeof t.error_code=="string"&&t.message&&typeof t.message=="string"?{error_code:t.error_code,message:t.message,details:t.details,suggestions:t.suggestions,links:t.links}:null}function Jn(e,t){let{showErrorCode:r=!0,showSuggestions:n=!0,showLinks:o=!0}=t??{},a=[];return r&&e.errorCode?a.push(`Error [${e.errorCode}]: ${e.message}`):a.push(e.message),e.structuredDetails&&e.structuredDetails.length>0&&(a.push(""),a.push("Details:"),e.structuredDetails.forEach(s=>{s.message?a.push(` - ${s.message}`):s.field&&s.value!==void 0&&a.push(` - ${s.field}: ${s.value}`)})),n&&e.suggestions&&e.suggestions.length>0&&(a.push(""),a.push("Suggestions:"),e.suggestions.forEach(s=>{a.push(` - ${s}`)})),o&&e.links&&e.links.length>0&&(a.push(""),a.push("Learn more:"),e.links.forEach(s=>{a.push(` - ${s.label}: ${s.url}`)})),a.join(`
8
- `)}var Yt=["2025-10-28","2026-01-21"],Ph="2026-01-21",yr=(0,Mc.default)("phala::api-client");function $h(e){return Object.entries(e).map(([t,r])=>` -H "${t}: ${r}"`).join(`
9
- `)}function Dh(e){return e?` -d '${(typeof e=="string"?e:JSON.stringify(e,null,2)).replace(/'/g,"\\'")}'`:""}function uc(e,t,r,n){let o=[];r.forEach((c,l)=>{o.push(`${l}: ${c}`)});let a=o.join(`
10
- `),s=typeof n=="string"?n:JSON.stringify(n,null,2);return[`< HTTP/1.1 ${e} ${t}`,a?`< ${a.replace(/\n/g,`
5
+ `+a),e.push(o+"m+"+yo.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=jh()+t+" "+e[0]}function jh(){return Se.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Fh(...e){return process.stderr.write(ho.formatWithOptions(Se.inspectOpts,...e)+`
6
+ `)}function Vh(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function Hh(){return process.env.DEBUG}function zh(e){e.inspectOpts={};let t=Object.keys(Se.inspectOpts);for(let n=0;n<t.length;n++)e.inspectOpts[t[n]]=Se.inspectOpts[t[n]]}yo.exports=Ba()(Se);var{formatters:nc}=yo.exports;nc.o=function(e){return this.inspectOpts.colors=this.useColors,ho.inspect(e,this.inspectOpts).split(`
7
+ `).map(t=>t.trim()).join(" ")};nc.O=function(e){return this.inspectOpts.colors=this.useColors,ho.inspect(e,this.inspectOpts)}});var oc=it((oP,Wa)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Wa.exports=tc():Wa.exports=rc()});var Za=it(Ar=>{"use strict";var Kh=Ar&&Ar.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Ar,"__esModule",{value:!0});Ar.encryptEnvVars=Bh;var Ja=Jt("@noble/curves/ed25519"),Ya=Kh(Jt("crypto"));function Gh(e){var t,n;return e=e.startsWith("0x")?e.slice(2):e,new Uint8Array((n=(t=e.match(/.{1,2}/g))===null||t===void 0?void 0:t.map(r=>parseInt(r,16)))!==null&&n!==void 0?n:[])}function qh(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Bh(e,t){let n=JSON.stringify({env:e}),r=Ja.x25519.utils.randomPrivateKey(),o=Ja.x25519.getPublicKey(r),a=Gh(t),s=Ja.x25519.getSharedSecret(r,a),i=await Ya.default.subtle.importKey("raw",s,{name:"AES-GCM",length:256},!0,["encrypt"]),l=Ya.default.getRandomValues(new Uint8Array(12)),p=await Ya.default.subtle.encrypt({name:"AES-GCM",iv:l},i,new TextEncoder().encode(n)),m=new Uint8Array(o.length+l.length+p.byteLength);return m.set(o),m.set(l,o.length),m.set(new Uint8Array(p),o.length+l.length),qh(m)}});var sc=it(Pr=>{"use strict";var Wh=Pr&&Pr.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Pr,"__esModule",{value:!0});Pr.getComposeHash=Xh;var Jh=Wh(Jt("crypto"));function Xa(e){return e==null?e:Array.isArray(e)?e.map(Xa):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return t[n]=Xa(r),t},{}):e}function Yh(e){let t={...e};return t.runner==="bash"&&"docker_compose_file"in t?delete t.docker_compose_file:t.runner==="docker-compose"&&"bash_script"in t&&delete t.bash_script,"pre_launch_script"in t&&!t.pre_launch_script&&delete t.pre_launch_script,t}function Zh(e){let t=Xa(e);return JSON.stringify(t,(n,r)=>typeof r=="number"&&(isNaN(r)||!isFinite(r))?null:r)}function Xh(e,t=!1){t&&(e=Yh(e));let n=Zh(e);return Jh.default.createHash("sha256").update(n,"utf8").digest("hex")}});var Pc=it(N=>{"use strict";Object.defineProperty(N,"__esModule",{value:!0});N.toBig=N.shrSL=N.shrSH=N.rotrSL=N.rotrSH=N.rotrBL=N.rotrBH=N.rotr32L=N.rotr32H=N.rotlSL=N.rotlSH=N.rotlBL=N.rotlBH=N.add5L=N.add5H=N.add4L=N.add4H=N.add3L=N.add3H=void 0;N.add=wc;N.fromBig=es;N.split=ic;var vo=BigInt(2**32-1),Qa=BigInt(32);function es(e,t=!1){return t?{h:Number(e&vo),l:Number(e>>Qa&vo)}:{h:Number(e>>Qa&vo)|0,l:Number(e&vo)|0}}function ic(e,t=!1){let n=e.length,r=new Uint32Array(n),o=new Uint32Array(n);for(let a=0;a<n;a++){let{h:s,l:i}=es(e[a],t);[r[a],o[a]]=[s,i]}return[r,o]}var cc=(e,t)=>BigInt(e>>>0)<<Qa|BigInt(t>>>0);N.toBig=cc;var lc=(e,t,n)=>e>>>n;N.shrSH=lc;var mc=(e,t,n)=>e<<32-n|t>>>n;N.shrSL=mc;var pc=(e,t,n)=>e>>>n|t<<32-n;N.rotrSH=pc;var dc=(e,t,n)=>e<<32-n|t>>>n;N.rotrSL=dc;var uc=(e,t,n)=>e<<64-n|t>>>n-32;N.rotrBH=uc;var fc=(e,t,n)=>e>>>n-32|t<<64-n;N.rotrBL=fc;var gc=(e,t)=>t;N.rotr32H=gc;var hc=(e,t)=>e;N.rotr32L=hc;var yc=(e,t,n)=>e<<n|t>>>32-n;N.rotlSH=yc;var vc=(e,t,n)=>t<<n|e>>>32-n;N.rotlSL=vc;var Cc=(e,t,n)=>t<<n-32|e>>>64-n;N.rotlBH=Cc;var bc=(e,t,n)=>e<<n-32|t>>>64-n;N.rotlBL=bc;function wc(e,t,n,r){let o=(t>>>0)+(r>>>0);return{h:e+n+(o/2**32|0)|0,l:o|0}}var _c=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0);N.add3L=_c;var kc=(e,t,n,r)=>t+n+r+(e/2**32|0)|0;N.add3H=kc;var Sc=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0);N.add4L=Sc;var Ec=(e,t,n,r,o)=>t+n+r+o+(e/2**32|0)|0;N.add4H=Ec;var Ic=(e,t,n,r,o)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(o>>>0);N.add5L=Ic;var Ac=(e,t,n,r,o,a)=>t+n+r+o+a+(e/2**32|0)|0;N.add5H=Ac;var Qh={fromBig:es,split:ic,toBig:cc,shrSH:lc,shrSL:mc,rotrSH:pc,rotrSL:dc,rotrBH:uc,rotrBL:fc,rotr32H:gc,rotr32L:hc,rotlSH:yc,rotlSL:vc,rotlBH:Cc,rotlBL:bc,add:wc,add3L:_c,add3H:kc,add4L:Sc,add4H:Ec,add5H:Ac,add5L:Ic};N.default=Qh});var $c=it(Co=>{"use strict";Object.defineProperty(Co,"__esModule",{value:!0});Co.crypto=void 0;var Yt=Jt("crypto");Co.crypto=Yt&&typeof Yt=="object"&&"webcrypto"in Yt?Yt.webcrypto:Yt&&typeof Yt=="object"&&"randomBytes"in Yt?Yt:void 0});var Oc=it(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});D.wrapXOFConstructorWithOpts=D.wrapConstructorWithOpts=D.wrapConstructor=D.Hash=D.nextTick=D.swap32IfBE=D.byteSwapIfBE=D.swap8IfBE=D.isLE=void 0;D.isBytes=xc;D.anumber=ts;D.abytes=Fn;D.ahash=ey;D.aexists=ty;D.aoutput=ny;D.u8=ry;D.u32=oy;D.clean=ay;D.createView=sy;D.rotr=iy;D.rotl=cy;D.byteSwap=rs;D.byteSwap32=Dc;D.bytesToHex=my;D.hexToBytes=py;D.asyncLoop=uy;D.utf8ToBytes=os;D.bytesToUtf8=fy;D.toBytes=bo;D.kdfInputToBytes=gy;D.concatBytes=hy;D.checkOpts=yy;D.createHasher=Mc;D.createOptHasher=Lc;D.createXOFer=Uc;D.randomBytes=vy;var jn=$c();function xc(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"}function ts(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("positive integer expected, got "+e)}function Fn(e,...t){if(!xc(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error("Uint8Array expected of length "+t+", got length="+e.length)}function ey(e){if(typeof e!="function"||typeof e.create!="function")throw new Error("Hash should be wrapped by utils.createHasher");ts(e.outputLen),ts(e.blockLen)}function ty(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function ny(e,t){Fn(e);let n=t.outputLen;if(e.length<n)throw new Error("digestInto() expects output buffer of length at least "+n)}function ry(e){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function oy(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function ay(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function sy(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function iy(e,t){return e<<32-t|e>>>t}function cy(e,t){return e<<t|e>>>32-t>>>0}D.isLE=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function rs(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}D.swap8IfBE=D.isLE?e=>e:e=>rs(e);D.byteSwapIfBE=D.swap8IfBE;function Dc(e){for(let t=0;t<e.length;t++)e[t]=rs(e[t]);return e}D.swap32IfBE=D.isLE?e=>e:Dc;var Tc=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",ly=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function my(e){if(Fn(e),Tc)return e.toHex();let t="";for(let n=0;n<e.length;n++)t+=ly[e[n]];return t}var Lt={_0:48,_9:57,A:65,F:70,a:97,f:102};function Rc(e){if(e>=Lt._0&&e<=Lt._9)return e-Lt._0;if(e>=Lt.A&&e<=Lt.F)return e-(Lt.A-10);if(e>=Lt.a&&e<=Lt.f)return e-(Lt.a-10)}function py(e){if(typeof e!="string")throw new Error("hex string expected, got "+typeof e);if(Tc)return Uint8Array.fromHex(e);let t=e.length,n=t/2;if(t%2)throw new Error("hex string expected, got unpadded hex of length "+t);let r=new Uint8Array(n);for(let o=0,a=0;o<n;o++,a+=2){let s=Rc(e.charCodeAt(a)),i=Rc(e.charCodeAt(a+1));if(s===void 0||i===void 0){let l=e[a]+e[a+1];throw new Error('hex string expected, got non-hex character "'+l+'" at index '+a)}r[o]=s*16+i}return r}var dy=async()=>{};D.nextTick=dy;async function uy(e,t,n){let r=Date.now();for(let o=0;o<e;o++){n(o);let a=Date.now()-r;a>=0&&a<t||(await(0,D.nextTick)(),r+=a)}}function os(e){if(typeof e!="string")throw new Error("string expected");return new Uint8Array(new TextEncoder().encode(e))}function fy(e){return new TextDecoder().decode(e)}function bo(e){return typeof e=="string"&&(e=os(e)),Fn(e),e}function gy(e){return typeof e=="string"&&(e=os(e)),Fn(e),e}function hy(...e){let t=0;for(let r=0;r<e.length;r++){let o=e[r];Fn(o),t+=o.length}let n=new Uint8Array(t);for(let r=0,o=0;r<e.length;r++){let a=e[r];n.set(a,o),o+=a.length}return n}function yy(e,t){if(t!==void 0&&{}.toString.call(t)!=="[object Object]")throw new Error("options should be object or undefined");return Object.assign(e,t)}var ns=class{};D.Hash=ns;function Mc(e){let t=r=>e().update(bo(r)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function Lc(e){let t=(r,o)=>e(o).update(bo(r)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=r=>e(r),t}function Uc(e){let t=(r,o)=>e(o).update(bo(r)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=r=>e(r),t}D.wrapConstructor=Mc;D.wrapConstructorWithOpts=Lc;D.wrapXOFConstructorWithOpts=Uc;function vy(e=32){if(jn.crypto&&typeof jn.crypto.getRandomValues=="function")return jn.crypto.getRandomValues(new Uint8Array(e));if(jn.crypto&&typeof jn.crypto.randomBytes=="function")return Uint8Array.from(jn.crypto.randomBytes(e));throw new Error("crypto.getRandomValues must be defined")}});var qc=it(le=>{"use strict";Object.defineProperty(le,"__esModule",{value:!0});le.shake256=le.shake128=le.keccak_512=le.keccak_384=le.keccak_256=le.keccak_224=le.sha3_512=le.sha3_384=le.sha3_256=le.sha3_224=le.Keccak=void 0;le.keccakP=Kc;var Rr=Pc(),Le=Oc(),Cy=BigInt(0),$r=BigInt(1),by=BigInt(2),wy=BigInt(7),_y=BigInt(256),ky=BigInt(113),Fc=[],Vc=[],Hc=[];for(let e=0,t=$r,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],Fc.push(2*(5*r+n)),Vc.push((e+1)*(e+2)/2%64);let o=Cy;for(let a=0;a<7;a++)t=(t<<$r^(t>>wy)*ky)%_y,t&by&&(o^=$r<<($r<<BigInt(a))-$r);Hc.push(o)}var zc=(0,Rr.split)(Hc,!0),Sy=zc[0],Ey=zc[1],Nc=(e,t,n)=>n>32?(0,Rr.rotlBH)(e,t,n):(0,Rr.rotlSH)(e,t,n),jc=(e,t,n)=>n>32?(0,Rr.rotlBL)(e,t,n):(0,Rr.rotlSL)(e,t,n);function Kc(e,t=24){let n=new Uint32Array(10);for(let r=24-t;r<24;r++){for(let s=0;s<10;s++)n[s]=e[s]^e[s+10]^e[s+20]^e[s+30]^e[s+40];for(let s=0;s<10;s+=2){let i=(s+8)%10,l=(s+2)%10,p=n[l],m=n[l+1],d=Nc(p,m,1)^n[i],f=jc(p,m,1)^n[i+1];for(let u=0;u<50;u+=10)e[s+u]^=d,e[s+u+1]^=f}let o=e[2],a=e[3];for(let s=0;s<24;s++){let i=Vc[s],l=Nc(o,a,i),p=jc(o,a,i),m=Fc[s];o=e[m],a=e[m+1],e[m]=l,e[m+1]=p}for(let s=0;s<50;s+=10){for(let i=0;i<10;i++)n[i]=e[s+i];for(let i=0;i<10;i++)e[s+i]^=~n[(i+2)%10]&n[(i+4)%10]}e[0]^=Sy[r],e[1]^=Ey[r]}(0,Le.clean)(n)}var xr=class e extends Le.Hash{constructor(t,n,r,o=!1,a=24){if(super(),this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,this.enableXOF=!1,this.blockLen=t,this.suffix=n,this.outputLen=r,this.enableXOF=o,this.rounds=a,(0,Le.anumber)(r),!(0<t&&t<200))throw new Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=(0,Le.u32)(this.state)}clone(){return this._cloneInto()}keccak(){(0,Le.swap32IfBE)(this.state32),Kc(this.state32,this.rounds),(0,Le.swap32IfBE)(this.state32),this.posOut=0,this.pos=0}update(t){(0,Le.aexists)(this),t=(0,Le.toBytes)(t),(0,Le.abytes)(t);let{blockLen:n,state:r}=this,o=t.length;for(let a=0;a<o;){let s=Math.min(n-this.pos,o-a);for(let i=0;i<s;i++)r[this.pos++]^=t[a++];this.pos===n&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:t,suffix:n,pos:r,blockLen:o}=this;t[r]^=n,(n&128)!==0&&r===o-1&&this.keccak(),t[o-1]^=128,this.keccak()}writeInto(t){(0,Le.aexists)(this,!1),(0,Le.abytes)(t),this.finish();let n=this.state,{blockLen:r}=this;for(let o=0,a=t.length;o<a;){this.posOut>=r&&this.keccak();let s=Math.min(r-this.posOut,a-o);t.set(n.subarray(this.posOut,this.posOut+s),o),this.posOut+=s,o+=s}return t}xofInto(t){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(t)}xof(t){return(0,Le.anumber)(t),this.xofInto(new Uint8Array(t))}digestInto(t){if((0,Le.aoutput)(t,this),this.finished)throw new Error("digest() was already called");return this.writeInto(t),this.destroy(),t}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,(0,Le.clean)(this.state)}_cloneInto(t){let{blockLen:n,suffix:r,outputLen:o,rounds:a,enableXOF:s}=this;return t||(t=new e(n,r,o,s,a)),t.state32.set(this.state32),t.pos=this.pos,t.posOut=this.posOut,t.finished=this.finished,t.rounds=a,t.suffix=r,t.outputLen=o,t.enableXOF=s,t.destroyed=this.destroyed,t}};le.Keccak=xr;var Zt=(e,t,n)=>(0,Le.createHasher)(()=>new xr(t,e,n));le.sha3_224=Zt(6,144,224/8);le.sha3_256=Zt(6,136,256/8);le.sha3_384=Zt(6,104,384/8);le.sha3_512=Zt(6,72,512/8);le.keccak_224=Zt(1,144,224/8);le.keccak_256=Zt(1,136,256/8);le.keccak_384=Zt(1,104,384/8);le.keccak_512=Zt(1,72,512/8);var Gc=(e,t,n)=>(0,Le.createXOFer)((r={})=>new xr(t,e,r.dkLen===void 0?n:r.dkLen,!0));le.shake128=Gc(31,168,128/8);le.shake256=Gc(31,136,256/8)});var Bc=it(as=>{"use strict";Object.defineProperty(as,"__esModule",{value:!0});as.verifyEnvEncryptPublicKey=Py;var Iy=qc(),Ay=Jt("@noble/curves/secp256k1");function Py(e,t,n){if(t.length!==65)return null;let r=Buffer.from("dstack-env-encrypt-pubkey","utf8"),o=n;n.startsWith("0x")&&(o=n.slice(2));let a=Buffer.from(o,"hex"),s=Buffer.from(":","utf8"),i=Buffer.concat([r,s,a,Buffer.from(e)]),l=(0,Iy.keccak_256)(i);try{let p=t.slice(0,32),m=t.slice(32,64),d=t[64],f=new Uint8Array(64);f.set(p,0),f.set(m,32);let u=Ay.secp256k1.Signature.fromCompact(f).addRecoveryBit(d).recoverPublicKey(l);return"0x"+Buffer.from(u.toRawBytes(!0)).toString("hex")}catch(p){return console.error("signature verification failed:",p),null}}});import{readFileSync as KA}from"fs";import{dirname as GA,join as qA}from"path";import{fileURLToPath as BA}from"url";import{ZodError as Dk}from"zod";import pr from"chalk";var yl=Ir(oc(),1);import{ofetch as $y}from"ofetch";function ac(e){return{all:e=e||new Map,on:function(t,n){var r=e.get(t);r?r.push(n):e.set(t,[n])},off:function(t,n){var r=e.get(t);r&&(n?r.splice(r.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var r=e.get(t);r&&r.slice().map(function(o){o(n)}),(r=e.get("*"))&&r.slice().map(function(o){o(t,n)})}}}var h$=Ir(Za(),1),Ie=Ir(Za(),1),G_=Ir(sc(),1),q_=Ir(Bc(),1);import{z as Ee}from"zod";import{z as me}from"zod";import{z as Xt}from"zod";import{z as K}from"zod";import{z as Qt}from"zod";import{anvil as Jc,base as Yc,mainnet as Zc}from"viem/chains";import{z as Ce}from"zod";import{z as He}from"zod";import{z as A}from"zod";import{z as P}from"zod";import{z as Hn}from"zod";import{z as zn}from"zod";import{z as V}from"zod";import{z as Pe}from"zod";import{z as B}from"zod";import jv from"crypto";import{z as ft}from"zod";import{z as dt}from"zod";import{z as xe}from"zod";import{z as Je}from"zod";import{z as Ye}from"zod";import{z as yC}from"zod";import{z as Xc}from"zod";import{z as Pt}from"zod";import{z as Yn}from"zod";import{z as vn}from"zod";import{z as ie}from"zod";import{z as VC}from"zod";import{z as KC}from"zod";import{z as ne}from"zod";import{z as It}from"zod";import{z as ob}from"zod";import{z as ve}from"zod";import{z as L}from"zod";import{z as Wn}from"zod";import{z as cs}from"zod";import{z as Ue}from"zod";import{z as Fl}from"zod";import{z as Et}from"zod";import{z as We}from"zod";import{z as en}from"zod";import{z as ls}from"zod";import{z as us}from"zod";import{z as yn}from"zod";import{z as Re}from"zod";import{z as be}from"zod";import{z as R}from"zod";import{z as X}from"zod";import{z as J}from"zod";import{z as we}from"zod";import{createPublicClient as tl,createWalletClient as dw,http as ms,parseEventLogs as uw,parseEther as nl}from"viem";import{privateKeyToAccount as fw}from"viem/accounts";import{isHex as rl}from"viem";import{createPublicClient as b$,createWalletClient as w$,http as _$,custom as k$}from"viem";import{privateKeyToAccount as E$}from"viem/accounts";import{z as fe}from"zod";import{createPublicClient as ol,createWalletClient as kw,http as ps,parseEventLogs as Sw,parseEther as al}from"viem";import{privateKeyToAccount as Ew}from"viem/accounts";import{z as ge}from"zod";import{createPublicClient as sl,createWalletClient as Rw,http as il,parseEther as cl}from"viem";import{privateKeyToAccount as xw}from"viem/accounts";import{z as he}from"zod";import{createPublicClient as ll,createWalletClient as Lw,http as ml,parseEther as pl}from"viem";import{privateKeyToAccount as Uw}from"viem/accounts";import{z as ye}from"zod";import{createPublicClient as dl,createWalletClient as Fw,http as ul,parseEther as fl}from"viem";import{privateKeyToAccount as Vw}from"viem/accounts";import{z as Kn}from"zod";import{createPublicClient as Gw,http as qw}from"viem";import{createPublicClient as H$,http as z$}from"viem";import{createPublicClient as G$,http as q$}from"viem";import{createPublicClient as Bw,http as Ww}from"viem";import{z as Gn}from"zod";import{z as gt}from"zod";import{z as t_}from"zod";import{z as qn}from"zod";import{z as W}from"zod";import{z as Eo}from"zod";import{z as Zn}from"zod";import{z as ut}from"zod";import{z as $e}from"zod";import{z as Fe}from"zod";import{z as Dr}from"zod";import{z as Ve}from"zod";import{z as Bn}from"zod";import{z as ct}from"zod";import{z as tt}from"zod";import{z as gl}from"zod";import{z as Io}from"zod";import{z as Ut}from"zod";import{z as ze}from"zod";import{z as _o}from"zod";import{z as ko}from"zod";import{z as je}from"zod";import{z as Q}from"zod";var Ry=Ee.object({detail:Ee.union([Ee.string(),Ee.array(Ee.object({msg:Ee.string(),type:Ee.string().optional(),ctx:Ee.record(Ee.unknown()).optional(),loc:Ee.array(Ee.union([Ee.string(),Ee.number()])).optional(),input:Ee.unknown().optional()}).passthrough()),Ee.record(Ee.unknown())]).optional(),type:Ee.string().optional(),code:Ee.string().optional()}),yt=class extends Error{constructor(e,t){super(e),this.name=this.constructor.name,this.status=t.status,this.statusText=t.statusText,this.detail=t.detail,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},ss=class So extends yt{constructor(t,n){super(t,{status:n?.status??0,statusText:n?.statusText??"Unknown Error",detail:n?.detail||t}),this.name="RequestError",this.isRequestError=!0,this.data=n?.data,this.request=n?.request,this.response=n?.response,this.code=n?.code,this.type=n?.type}static fromFetchError(t){let n=Ry.safeParse(t.data);if(n.success){let r=n.data.detail??(t.data&&typeof t.data=="object"&&"error_code"in t.data?t.data:void 0);return new So(t.message,{status:t.status??void 0,statusText:t.statusText??void 0,data:t.data,request:t.request??void 0,response:t.response??void 0,detail:r,code:n.data.code??void 0,type:n.data.type??void 0})}return new So(t.message,{status:t.status??void 0,statusText:t.statusText??void 0,data:t.data,request:t.request??void 0,response:t.response??void 0,detail:t.data?.detail||"Unknown API error",code:t.status?.toString()??void 0})}static fromError(t,n){return new So(t.message,{request:n??void 0,detail:t.message})}},vl=class extends yt{constructor(e,t){super(e,t),this.isValidationError=!0,this.validationErrors=t.validationErrors}},xy=class extends yt{constructor(){super(...arguments),this.isAuthError=!0}},Ao=class extends yt{constructor(){super(...arguments),this.isBusinessError=!0}},Dy=class extends yt{constructor(){super(...arguments),this.isServerError=!0}},Ty=class extends yt{constructor(){super(...arguments),this.isUnknownError=!0}};function My(e){if(!e||!Array.isArray(e))return"unknown";let t=e.filter(n=>typeof n=="string"?!["body","query","path","header"].includes(n):!0);return t.length>0?t.join("."):"unknown"}function Cl(e){if(!Array.isArray(e))return{errors:[],message:typeof e=="string"?e:"Validation error"};let t=e.map((o,a)=>{let s=My(o.loc),i=s;return s==="unknown"&&o.type&&(i=o.type==="missing"?"required field":o.type),{field:i,message:o.msg,type:o.type,context:o.ctx}}),n=t.length,r=n===1?`Validation failed: ${t[0].message}`:`Validation failed (${n} issue${n>1?"s":""})`;return{errors:t,message:r}}function Ly(e){return e===422?"validation":e===401||e===403?"auth":e>=400&&e<500?"business":e>=500?"server":"unknown"}function Uy(e,t,n){if(e===422&&Array.isArray(t)){let{message:r}=Cl(t);return r}if(typeof t=="string")return t;if(t&&typeof t=="object"&&"message"in t){let r=t.message;if(typeof r=="string")return r}return n}function Oy(e){let t=e.status??0,n=e.statusText??"Unknown Error",r=e.detail,o=jy(r);if(o)return new vt(o.message,{status:t,statusText:n,detail:r,errorCode:o.error_code,structuredDetails:o.details,suggestions:o.suggestions,links:o.links});let a=Ly(t),s=Uy(t,r,e.message),i={status:t,statusText:n,detail:r};if(a==="validation"&&Array.isArray(r)){let{errors:l}=Cl(r);return new vl(s,{...i,validationErrors:l})}return a==="auth"?new xy(s,i):a==="business"?new Ao(s,i):a==="server"?new Dy(s,i):new Ty(s,i)}function Ny(e,t){let{numbered:n=!0,indent:r=2,showFields:o=!0}=t??{},a=" ".repeat(r);return e.map((s,i)=>{let l=n?`${i+1}. `:"\u2022 ",p=o?`${s.field}: `:"";return`${a}${l}${p}${s.message}`}).join(`
8
+ `)}function Po(e,t){let{showFields:n=!0,showType:r=!1}=t??{},o=[];return r&&o.push(`[${e.constructor.name.toUpperCase()}]`),o.push(e.message),e instanceof vl&&e.validationErrors.length>0&&(o.push(""),o.push(Ny(e.validationErrors,{showFields:n}))),o.join(`
9
+ `)}var vt=class extends Ao{constructor(e,t){super(e,t),this.isResourceError=!0,this.errorCode=t.errorCode,this.structuredDetails=t.structuredDetails,this.suggestions=t.suggestions,this.links=t.links}};function jy(e){if(!e||typeof e!="object")return null;let t=e;return t.error_code&&typeof t.error_code=="string"&&t.message&&typeof t.message=="string"?{error_code:t.error_code,message:t.message,details:t.details,suggestions:t.suggestions,links:t.links}:null}function tn(e,t){let{showErrorCode:n=!0,showSuggestions:r=!0,showLinks:o=!0}=t??{},a=[];return n&&e.errorCode?a.push(`Error [${e.errorCode}]: ${e.message}`):a.push(e.message),e.structuredDetails&&e.structuredDetails.length>0&&(a.push(""),a.push("Details:"),e.structuredDetails.forEach(s=>{s.message?a.push(` - ${s.message}`):s.field&&s.value!==void 0&&a.push(` - ${s.field}: ${s.value}`)})),r&&e.suggestions&&e.suggestions.length>0&&(a.push(""),a.push("Suggestions:"),e.suggestions.forEach(s=>{a.push(` - ${s}`)})),o&&e.links&&e.links.length>0&&(a.push(""),a.push("Learn more:"),e.links.forEach(s=>{a.push(` - ${s.label}: ${s.url}`)})),a.join(`
10
+ `)}var Cn=["2025-10-28","2026-01-21"],Fy="2026-01-21",Vn=(0,yl.default)("phala::api-client");function Vy(e){return Object.entries(e).map(([t,n])=>` -H "${t}: ${n}"`).join(`
11
+ `)}function Hy(e){return e?` -d '${(typeof e=="string"?e:JSON.stringify(e,null,2)).replace(/'/g,"\\'")}'`:""}function Wc(e,t,n,r){let o=[];n.forEach((i,l)=>{o.push(`${l}: ${i}`)});let a=o.join(`
12
+ `),s=typeof r=="string"?r:JSON.stringify(r,null,2);return[`< HTTP/1.1 ${e} ${t}`,a?`< ${a.replace(/\n/g,`
11
13
  < `)}`:"","",s].filter(Boolean).join(`
12
- `)}var Rh=class Lc{constructor(t={}){this.emitter=Si();let r=t.apiKey||process?.env?.PHALA_CLOUD_API_KEY,n=t.baseURL||process?.env?.PHALA_CLOUD_API_PREFIX||"https://cloud-api.phala.com/api/v1",o=t.version&&Yt.includes(t.version)?t.version:Ph;this.config={...t,apiKey:r,baseURL:n,version:o};let{apiKey:a,baseURL:s,timeout:c,headers:l,useCookieAuth:m,onResponseError:p,...u}=this.config,d={"X-Phala-Version":o,"Content-Type":"application/json"};l&&typeof l=="object"&&Object.entries(l).forEach(([f,g])=>{typeof g=="string"&&(d[f]=g)}),!m&&a&&(d["X-API-Key"]=a),this.fetchInstance=vh.create({baseURL:s,timeout:c||3e4,headers:d,...m?{credentials:"include"}:{},...u,onRequest({request:f,options:g}){if(yr.enabled){let h=g.method||"GET",v=typeof f=="string"?f:f.url,w=v.startsWith("http")?v:`${s}${v}`,C={};g.headers&&typeof g.headers=="object"&&Object.entries(g.headers).forEach(([S,E])=>{typeof E=="string"&&(C[S]=E)});let _=[`> curl -X ${h} "${w}"`,$h(C),g.body?Dh(g.body):""].filter(Boolean).join(`
13
- `);yr(`
14
+ `)}var zy=class bl{constructor(t={}){this.emitter=ac();let n=t.apiKey||process?.env?.PHALA_CLOUD_API_KEY,r=t.baseURL||process?.env?.PHALA_CLOUD_API_PREFIX||"https://cloud-api.phala.com/api/v1",o=t.version&&Cn.includes(t.version)?t.version:Fy;this.config={...t,apiKey:n,baseURL:r,version:o};let{apiKey:a,baseURL:s,timeout:i,headers:l,useCookieAuth:p,onResponseError:m,...d}=this.config,f={"X-Phala-Version":o,"Content-Type":"application/json"};l&&typeof l=="object"&&Object.entries(l).forEach(([u,h])=>{typeof h=="string"&&(f[u]=h)}),!p&&a&&(f["X-API-Key"]=a),this.fetchInstance=$y.create({baseURL:s,timeout:i||3e4,headers:f,...p?{credentials:"include"}:{},...d,onRequest({request:u,options:h}){if(h.body instanceof FormData){let g=h.headers;g instanceof Headers?g.delete("content-type"):g&&typeof g=="object"&&!Array.isArray(g)&&(delete g["Content-Type"],delete g["content-type"])}if(Vn.enabled){let g=h.method||"GET",y=typeof u=="string"?u:u.url,b=y.startsWith("http")?y:`${s}${y}`,w={};h.headers&&typeof h.headers=="object"&&Object.entries(h.headers).forEach(([k,_])=>{typeof _=="string"&&(w[k]=_)});let S=[`> curl -X ${g} "${b}"`,Vy(w),h.body?Hy(h.body):""].filter(Boolean).join(`
15
+ `);Vn(`
14
16
  === REQUEST ===
15
17
  %s
16
- `,_)}},onResponse({request:f,response:g,options:h}){if(yr.enabled){let v=h.method||"GET",w=typeof f=="string"?f:f.url;yr(`
18
+ `,S)}},onResponse({request:u,response:h,options:g}){if(Vn.enabled){let y=g.method||"GET",b=typeof u=="string"?u:u.url;Vn(`
17
19
  === RESPONSE [%s %s] (%dms) ===
18
20
  %s
19
- `,v,w,g.headers.get("x-response-time")||"?",uc(g.status,g.statusText,g.headers,g._data))}},onResponseError:({request:f,response:g,options:h})=>{if(yr.enabled){console.warn(`HTTP ${g.status}: ${g.url}`);let v=h.method||"GET",w=typeof f=="string"?f:f.url;yr(`
21
+ `,y,b,h.headers.get("x-response-time")||"?",Wc(h.status,h.statusText,h.headers,h._data))}},onResponseError:({request:u,response:h,options:g})=>{if(Vn.enabled){console.warn(`HTTP ${h.status}: ${h.url}`);let y=g.method||"GET",b=typeof u=="string"?u:u.url;Vn(`
20
22
  === ERROR RESPONSE [%s %s] ===
21
23
  %s
22
- `,v,w,uc(g.status,g.statusText,g.headers,g._data))}p&&p({request:f,response:g,options:h})}})}get raw(){return this.fetchInstance}on(t,r){this.emitter.on(t,r)}off(t,r){this.emitter.off(t,r)}once(t,r){let n=o=>{r(o),this.emitter.off(t,n)};this.emitter.on(t,n)}async request(t,r){try{let n=r?.method||"GET";return await this.fetchInstance(t,{...r,method:n})}catch(n){let o=this.convertToRequestError(n);throw this.emitError(o)}}async requestFull(t,r){try{let n=r?.method||"GET",o=await this.fetchInstance.raw(t,{...r,method:n,ignoreResponseError:!0});return{status:o.status,statusText:o.statusText,headers:o.headers,data:o._data,ok:o.ok}}catch(n){let o=this.convertToRequestError(n);throw this.emitError(o)}}async get(t,r){try{return await this.fetchInstance(t,{...r,method:"GET"})}catch(n){let o=this.convertToRequestError(n);throw this.emitError(o)}}async post(t,r,n){try{return await this.fetchInstance(t,{...n,method:"POST",body:r})}catch(o){let a=this.convertToRequestError(o);throw this.emitError(a)}}async put(t,r,n){try{return await this.fetchInstance(t,{...n,method:"PUT",body:r})}catch(o){let a=this.convertToRequestError(o);throw this.emitError(a)}}async patch(t,r,n){try{return await this.fetchInstance(t,{...n,method:"PATCH",body:r})}catch(o){let a=this.convertToRequestError(o);throw this.emitError(a)}}async delete(t,r){try{return await this.fetchInstance(t,{...r,method:"DELETE"})}catch(n){let o=this.convertToRequestError(n);throw this.emitError(o)}}convertToRequestError(t){return t&&typeof t=="object"&&"data"in t?Ea.fromFetchError(t):t instanceof Error?Ea.fromError(t):new Ea("Unknown error occurred",{detail:"Unknown error occurred"})}emitError(t){let r=Ah(t);return this.emitter.emit("error",r),r}async safeRequest(t){try{return{success:!0,data:await t()}}catch(r){if(r instanceof ut)return{success:!1,error:r};let n=this.convertToRequestError(r);return this.emitError(n),{success:!1,error:n}}}async safeGet(t,r){return this.safeRequest(()=>this.get(t,r))}async safePost(t,r,n){return this.safeRequest(()=>this.post(t,r,n))}async safePut(t,r,n){return this.safeRequest(()=>this.put(t,r,n))}async safePatch(t,r,n){return this.safeRequest(()=>this.patch(t,r,n))}async safeDelete(t,r){return this.safeRequest(()=>this.delete(t,r))}async safeRequestMethod(t,r){return this.safeRequest(()=>this.request(t,r))}async safeRequestFull(t,r){return this.safeRequest(()=>this.requestFull(t,r))}withVersion(t){return new Lc({...this.config,version:t})}extend(t){let r=typeof t=="function"?t(this):t,n=Object.create(this);for(let[o,a]of Object.entries(r))typeof a=="function"&&(n[o]=(...s)=>a(this,...s));return n}};function Mh(e={}){return new Rh(e)}var Th=se.object({username:se.string(),email:se.string(),role:se.enum(["admin","user"]),avatar:se.string(),email_verified:se.boolean(),totp_enabled:se.boolean(),has_backup_codes:se.boolean(),flag_has_password:se.boolean()}).passthrough(),Lh=se.object({id:se.string(),name:se.string(),slug:se.string().nullable(),tier:se.string(),role:se.string(),avatar:se.string().nullable().optional()}).passthrough(),Nh=se.object({balance:se.string().or(se.number()),granted_balance:se.string().or(se.number()),is_post_paid:se.boolean(),outstanding_amount:se.string().or(se.number()).nullable()}).passthrough(),Uh=se.object({user:Th,workspace:Lh,credits:Nh}).passthrough(),Oh=Ut.object({username:Ut.string(),email:Ut.string(),credits:Ut.number(),granted_credits:Ut.number(),avatar:Ut.string(),team_name:Ut.string(),team_tier:Ut.string()}).passthrough();function Fh(e){return e==="2025-10-28"?Oh:Uh}async function Nc(e,t){let r=await e.get("/auth/me");return t?.schema===!1?r:(t?.schema||Fh(e.config.version)).parse(r)}async function Pe(e,t){try{return{success:!0,data:await Nc(e,t)}}catch(r){return r&&typeof r=="object"&&("status"in r||"issues"in r)?{success:!1,error:r}:{success:!1,error:{name:"Error",message:r instanceof Error?r.message:String(r)}}}}var Na={[gc.id]:gc,[fc.id]:fc,[dc.id]:dc},jh=Ot.object({id:Ot.string(),slug:Ot.string().nullable(),url:Ot.string(),version:Ot.string(),chain_id:Ot.number().nullable(),kms_contract_address:Ot.string().nullable().transform(e=>e),gateway_app_id:Ot.string().nullable().transform(e=>e)}).passthrough(),dt=jh.transform(e=>{if(e.chain_id!=null){let t=Na[e.chain_id];if(t)return{...e,chain:t}}return e});function Uc(e){if(e?.schema!==void 0&&e?.schema!==!1&&(typeof e.schema!="object"||e.schema===null||!("parse"in e.schema)||typeof e.schema.parse!="function"))throw new Error("Invalid schema: must be a Zod schema object, false, or undefined")}function Oc(e){if(e?.schema!==void 0&&e?.schema!==!1&&(typeof e.schema!="object"||e.schema===null||!("parse"in e.schema)||typeof e.schema.parse!="function"))return{success:!1,error:{name:"ZodError",message:"Invalid schema: must be a Zod schema object, false, or undefined",issues:[{code:"invalid_type",expected:"object",received:typeof e.schema,path:["schema"],message:"Invalid schema: must be a Zod schema object, false, or undefined"}]}}}function Fc(e,t){function r(s,c){return n(s,c)}async function n(s,c){Uc(c);let l=await t(s);return c?.schema===!1?l:(c?.schema||e).parse(l)}function o(s,c){return a(s,c)}async function a(s,c){let l=Oc(c);if(l)return l;let m=await(async()=>{try{return{success:!0,data:await t(s)}}catch(u){return u&&typeof u=="object"&&"status"in u?{success:!1,error:u}:u&&typeof u=="object"&&"issues"in u?{success:!1,error:u}:{success:!1,error:{name:"Error",message:u instanceof Error?u.message:String(u)}}}})();return m.success?c?.schema===!1?{success:!0,data:m.data}:(c?.schema||e).safeParse(m.data):m}return{action:r,safeAction:o}}function M(e,t){function r(s,...c){let[l,m]=c;return n(s,l,m)}async function n(s,c,l){Uc(l);let m=await t(s,c);return l?.schema===!1?m:(l?.schema||e).parse(m)}function o(s,...c){let[l,m]=c;return a(s,l,m)}async function a(s,c,l){let m=Oc(l);if(m)return m;let p=await(async()=>{try{return{success:!0,data:await t(s,c)}}catch(d){return d&&typeof d=="object"&&"status"in d?{success:!1,error:d}:d&&typeof d=="object"&&"issues"in d?{success:!1,error:d}:{success:!1,error:{name:"Error",message:d instanceof Error?d.message:String(d)}}}})();return p.success?l?.schema===!1?{success:!0,data:p.data}:(l?.schema||e).safeParse(p.data):p}return{action:r,safeAction:o}}var Vh=K.object({name:K.string(),is_dev:K.boolean(),version:K.union([K.tuple([K.number(),K.number(),K.number()]),K.tuple([K.number(),K.number(),K.number(),K.number()])]),os_image_hash:K.string().nullable().optional()}).passthrough(),zh=K.object({teepod_id:K.number(),name:K.string(),listed:K.boolean(),resource_score:K.number(),remaining_vcpu:K.number(),remaining_memory:K.number(),remaining_cvm_slots:K.number(),images:K.array(Vh),support_onchain_kms:K.boolean().optional(),fmspc:K.string().nullable().optional(),device_id:K.string().nullable().optional(),region_identifier:K.string().nullable().optional(),default_kms:K.string().nullable().optional(),kms_list:K.array(K.string()).default([])}).passthrough(),Kh=K.object({max_instances:K.number().nullable().optional(),max_vcpu:K.number().nullable().optional(),max_memory:K.number().nullable().optional(),max_disk:K.number().nullable().optional()}).passthrough(),Gh=K.object({tier:K.string(),capacity:Kh,nodes:K.array(zh),kms_list:K.array(dt)}).passthrough(),{action:Hh,safeAction:Zt}=Fc(Gh,async e=>await e.get("/teepods/available")),jc=fe.object({id:fe.string(),name:fe.string(),description:fe.string(),vcpu:fe.number(),memory_mb:fe.number(),hourly_rate:fe.string(),requires_gpu:fe.boolean(),default_disk_size_gb:fe.number().default(20),family:fe.string().nullable()}).passthrough(),qh=fe.object({name:fe.string(),items:fe.array(jc),total:fe.number()}).strict(),Bh=fe.object({result:fe.array(qh)}).strict(),Wh=fe.object({items:fe.array(jc),total:fe.number(),family:fe.string()}).strict(),Jh=fe.object({family:fe.string()}).strict(),{action:Ua,safeAction:Yh}=M(Bh,async e=>await e.get("/instance-types")),{action:Oa,safeAction:Zh}=M(Wh,async(e,t)=>{let r=Jh.parse(t);return await e.get(`/instance-types/${r.family}`)}),Vc=Ne.object({id:Ne.string(),name:Ne.string(),slug:Ne.string().nullable(),tier:Ne.string(),role:Ne.string(),is_default:Ne.boolean(),created_at:Ne.string(),confidential_models_enabled:Ne.boolean().optional()}).passthrough(),Xh=Ne.object({has_more:Ne.boolean(),next_cursor:Ne.string().nullable(),total:Ne.number().nullable()}).passthrough(),Qh=Ne.object({data:Ne.array(Vc),pagination:Xh}).passthrough(),{action:ey,safeAction:ty}=M(Qh,async(e,t)=>{let r=new URLSearchParams;t?.cursor&&r.append("cursor",t.cursor),t?.limit&&r.append("limit",t.limit.toString());let n=r.toString()?`/workspaces?${r.toString()}`:"/workspaces";return await e.get(n)}),{action:ry,safeAction:ny}=M(Vc,async(e,t)=>await e.get(`/workspaces/${t}`)),oy=I.object({id:I.string(),name:I.string(),status:I.string(),uptime:I.string(),app_url:I.string().nullable(),app_id:I.string(),instance_id:I.string().nullable(),configuration:I.any().optional(),exited_at:I.string().nullable(),boot_progress:I.string().nullable(),boot_error:I.string().nullable(),shutdown_progress:I.string().nullable(),image_version:I.string().nullable()}),ay=I.object({id:I.number(),username:I.string()}),zc=I.object({id:I.number(),name:I.string(),region_identifier:I.string().nullable().optional()}),Fa=I.object({vcpu:I.number(),memory:I.number(),disk_size:I.number(),gpu_count:I.number().default(0)}),ja=I.object({app:I.string(),instance:I.string()}),sy=I.object({hosted:oy,name:I.string(),managed_user:ay.nullable(),node:zc.nullable(),listed:I.boolean().default(!1),status:I.string(),in_progress:I.boolean().default(!1),dapp_dashboard_url:I.string().nullable(),syslog_endpoint:I.string().nullable(),allow_upgrade:I.boolean().default(!1),project_id:I.string().nullable(),project_type:I.string().nullable(),billing_period:I.string().nullable(),kms_info:dt.nullable(),vcpu:I.number().nullable(),memory:I.number().nullable(),disk_size:I.number().nullable(),gateway_domain:I.string().nullable(),public_urls:I.array(ja),machine_info:Fa.nullable().optional(),updated_at:I.string().nullable().optional()}),Kc=I.object({id:I.number(),name:I.string(),status:I.string(),in_progress:I.boolean().optional().default(!1),teepod_id:I.number().nullable(),teepod:zc.optional().nullable(),app_id:I.string(),vm_uuid:I.string().nullable(),instance_id:I.string().nullable(),vcpu:I.number(),memory:I.number(),disk_size:I.number(),base_image:I.string().nullable(),encrypted_env_pubkey:I.string().nullable(),listed:I.boolean().optional().default(!1),project_id:I.string().optional().nullable(),project_type:I.string().optional().nullable(),instance_type:I.string().optional().nullable(),public_sysinfo:I.boolean().optional().default(!1),public_logs:I.boolean().optional().default(!1),dapp_dashboard_url:I.string().optional().nullable(),syslog_endpoint:I.string().optional().nullable(),kms_info:dt.optional().nullable(),contract_address:I.string().optional().nullable(),deployer_address:I.string().optional().nullable(),scheduled_delete_at:I.string().optional().nullable(),public_urls:I.array(ja).optional().default([]),gateway_domain:I.string().optional().nullable(),machine_info:Fa.optional().nullable(),updated_at:I.string().optional().nullable()}),iy=I.object({items:I.array(sy),total:I.number(),page:I.number(),page_size:I.number(),pages:I.number()}),cy=A.enum(["skip","hourly","monthly"]),ly=A.enum(["phala","ethereum","base","legacy"]),Va=A.object({object_type:A.literal("user"),id:A.string().nullable().optional(),username:A.string().nullable().optional(),avatar_url:A.string().nullable().optional()}),za=A.object({object_type:A.literal("workspace"),id:A.string(),name:A.string(),slug:A.string().nullable().optional(),avatar_url:A.string().nullable().optional()}),my=A.object({instance_type:A.string().nullable().optional(),vcpu:A.number().int().nullable().optional(),memory_in_gb:A.number().nullable().optional(),disk_in_gb:A.number().int().nullable().optional(),gpus:A.number().int().nullable().optional(),compute_billing_price:A.string().nullable().optional(),billing_period:cy.nullable().optional()}),py=A.object({name:A.string().nullable().optional(),version:A.string().nullable().optional(),is_dev:A.boolean().nullable().optional(),os_image_hash:A.string().nullable().optional()}),uy=A.object({chain_id:A.number().int().nullable().optional(),dstack_kms_address:A.string().nullable().optional(),dstack_app_address:A.string().nullable().optional(),deployer_address:A.string().nullable().optional(),rpc_endpoint:A.string().nullable().optional(),encrypted_env_pubkey:A.string().nullable().optional()}),dy=A.object({target:A.string().nullable().optional(),started_at:A.string().nullable().optional(),correlation_id:A.string().nullable().optional()}),fy=A.object({base_domain:A.string().nullable().optional(),cname:A.string().nullable().optional()}),Gc=A.object({object_type:A.literal("node"),id:A.number().int().nullable().optional(),name:A.string().nullable().optional(),region:A.string().nullable().optional(),device_id:A.string().nullable().optional(),ppid:A.string().nullable().optional(),status:A.string().nullable().optional(),version:A.string().nullable().optional()});var Bn=A.object({id:A.string(),name:A.string(),app_id:A.string().nullable().optional(),vm_uuid:A.string().nullable().optional(),instance_id:A.string().nullable().optional(),resource:my,node_info:Gc.nullable().optional(),os:py.nullable().optional(),kms_type:ly.nullable().optional(),kms_info:uy.nullable().optional(),status:A.string(),progress:dy.nullable().optional(),compose_hash:A.string().nullable().optional(),gateway:fy,services:A.array(A.record(A.any())).optional().default([]),endpoints:A.array(ja).nullable().optional(),public_logs:A.boolean().optional(),public_sysinfo:A.boolean().optional(),public_tcbinfo:A.boolean().optional(),gateway_enabled:A.boolean().optional(),secure_time:A.boolean().optional(),listed:A.boolean().optional().default(!1),storage_fs:A.string().optional(),workspace:za.nullable().optional(),creator:Va.nullable().optional()}),gy=Bn.extend({compose_file:A.union([A.record(A.any()),A.string()]).nullable().optional()}),hy=A.object({items:A.array(Bn),total:A.number(),page:A.number(),page_size:A.number(),pages:A.number()});function Ar(e){return typeof e!="string"||e.length<5||e.length>63?!1:/^[a-zA-Z](?!.*--)([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(e)}function Hc(e){if(typeof e!="string")return Kn();let t=e;return t=t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),t=t.replace(/_/g,"-"),t=t.replace(/[^a-z0-9\s-]/gi,"-").replace(/\s+/g,"-"),t=t.replace(/-+/g,"-").replace(/^-+/,"").replace(/-+$/,""),t.length===0||(/^\d/.test(t)&&(t=`dstack-app-${t}`),t.length<5&&(t=`dstack-app-${t}`),t=t.slice(0,63).replace(/-+$/,""),t.length===0)||!Ar(t)?Kn():t}function Kn(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,6);return`dstack-app-${e}-${t}`}var Xe=vr.object({id:vr.string().optional(),uuid:vr.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i,"Invalid UUID format").optional(),app_id:vr.string().optional(),instance_id:vr.string().optional(),name:vr.string().refine(Ar,{message:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens"}).optional()}),ft=e=>e.refine(t=>{let r=t;return!!(r.id||r.uuid||r.app_id||r.instance_id||r.name)},{message:"One of id, uuid, app_id, instance_id, or name must be provided"}),yy=ft(Xe),G=yy.transform(e=>{let t;if(e.id)t=e.id;else if(e.uuid)t=e.uuid;else if(e.app_id)t=e.app_id;else if(e.instance_id)t=e.instance_id;else{if(e.name)return{cvmId:e.name};throw new Error("No valid identifier provided")}let r=/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i,n=/^[0-9a-f]{40}$/i,o;return r.test(t)?o=t.replace(/-/g,""):n.test(t)?o=`app_${t}`:o=t,{cvmId:o}}),vy=G;function by(e){return e==="2025-10-28"?Kc:gy}async function qc(e,t){let{cvmId:r}=vy.parse(t),n=await e.get(`/cvms/${r}`);return by(e.config.version).parse(n)}async function Q(e,t){try{return{success:!0,data:await qc(e,t)}}catch(r){return r&&typeof r=="object"&&("status"in r||"issues"in r)?{success:!1,error:r}:{success:!1,error:{name:"Error",message:r instanceof Error?r.message:String(r)}}}}var Cy=br.object({page:br.number().int().min(1).optional(),page_size:br.number().int().min(1).optional(),node_id:br.number().int().min(1).optional(),teepod_id:br.number().int().min(1).optional(),user_id:br.string().optional()}).strict();function wy(e){return e==="2025-10-28"?iy:hy}async function Bc(e,t){let r=Cy.parse(t??{}),n=await e.get("/cvms/paginated",{params:r});return wy(e.config.version).parse(n)}async function tn(e,t){try{return{success:!0,data:await Bc(e,t)}}catch(r){return r&&typeof r=="object"&&("status"in r||"issues"in r)?{success:!1,error:r}:{success:!1,error:{name:"Error",message:r instanceof Error?r.message:String(r)}}}}var Qr=200*1024;function Wc(e,t,r){let n=new TextEncoder,o=e?n.encode(e).byteLength:0,a=t?n.encode(t).byteLength:0,s=o+a;if(s>Qr){let c=Qr/1024,l=Math.ceil(s/1024);r.addIssue({code:we.ZodIssueCode.custom,message:`Combined size of docker_compose_file and pre_launch_script must not exceed ${c}KB (current: ${l}KB)`})}}var Jc=we.object({allowed_envs:we.array(we.string()).optional(),docker_compose_file:we.string(),features:we.array(we.string()).optional(),name:we.string().optional(),manifest_version:we.number().optional(),kms_enabled:we.boolean().optional(),public_logs:we.boolean().optional(),public_sysinfo:we.boolean().optional(),tproxy_enabled:we.boolean().optional(),storage_fs:we.enum(["ext4","zfs"]).optional(),pre_launch_script:we.string().optional(),env_pubkey:we.string().optional(),salt:we.string().optional().nullable()}).passthrough().superRefine((e,t)=>{Wc(e.docker_compose_file,e.pre_launch_script,t)}),_y=F.object({app_id:F.string().nullable().optional(),app_env_encrypt_pubkey:F.string().nullable().optional(),compose_hash:F.string(),kms_info:dt.nullable().optional(),fmspc:F.string().nullable().optional(),device_id:F.string().nullable().optional(),os_image_hash:F.string().nullable().optional(),instance_type:F.string().nullable().optional(),teepod_id:F.number().nullable().optional(),node_id:F.number().nullable().optional(),kms_id:F.string().nullable().optional()}).passthrough().transform(e=>{if("teepod_id"in e&&e.teepod_id!==void 0){let{teepod_id:t,...r}=e;return{...r,node_id:t}}return e}),Ia="Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens",Sy=F.object({node_id:F.number().optional(),teepod_id:F.number().optional(),region:F.string().optional(),name:F.string().min(5,Ia).max(63,Ia).refine(e=>Ar(e),Ia),instance_type:F.string().optional(),image:F.string().optional(),vcpu:F.number().optional(),memory:F.number().optional(),disk_size:F.number().optional(),compose_file:F.object({allowed_envs:F.array(F.string()).optional(),pre_launch_script:F.string().optional(),docker_compose_file:F.string().optional(),name:F.string().optional().default(""),kms_enabled:F.boolean().optional(),public_logs:F.boolean().optional(),public_sysinfo:F.boolean().optional(),gateway_enabled:F.boolean().optional(),tproxy_enabled:F.boolean().optional(),storage_fs:F.enum(["ext4","zfs"]).optional()}).superRefine((e,t)=>{Wc(e.docker_compose_file,e.pre_launch_script,t)}),listed:F.boolean().optional(),kms_id:F.string().optional(),kms:F.enum(["PHALA","ETHEREUM","BASE"]).optional(),kms_contract:F.string().optional(),env_keys:F.array(F.string()).optional(),nonce:F.number().optional(),app_id:F.string().optional()}).passthrough().transform(e=>!e.instance_type&&!e.vcpu&&!e.memory?{...e,instance_type:"tdx.small"}:e);function ky(e){if(!e.compose_file)return e;let t={...e.compose_file};return typeof t.gateway_enabled=="boolean"&&typeof t.tproxy_enabled=="boolean"?delete t.tproxy_enabled:typeof t.tproxy_enabled=="boolean"&&typeof t.gateway_enabled>"u"&&(t.gateway_enabled=t.tproxy_enabled,delete t.tproxy_enabled,(typeof window<"u"?window.console:globalThis.console)&&console.warn("[phala/cloud] tproxy_enabled is deprecated, please use gateway_enabled instead. See docs for migration.")),{...e,compose_file:t}}var{action:Ey,safeAction:Ka}=M(_y,async(e,t)=>{let r=Sy.parse(t),n=ky(r),o={...n};return typeof n.node_id=="number"?(o={...n,teepod_id:n.node_id},delete o.node_id):typeof n.teepod_id=="number"&&console.warn("[phala/cloud] teepod_id is deprecated, please use node_id instead."),await e.post("/cvms/provision",o)}),Iy=H.object({id:H.number(),name:H.string(),status:H.string(),teepod_id:H.number(),teepod:H.object({id:H.number(),name:H.string()}).nullable(),user_id:H.number().nullable(),app_id:H.string().nullable(),vm_uuid:H.string().nullable(),instance_id:H.string().nullable(),app_url:H.string().nullable().default(null),base_image:H.string().nullable(),vcpu:H.number(),memory:H.number(),disk_size:H.number(),manifest_version:H.number().nullable().default(2),version:H.string().nullable().default("1.0.0"),runner:H.string().nullable().default("docker-compose"),docker_compose_file:H.string().nullable(),features:H.array(H.string()).nullable().default(["kms","tproxy-net"]),created_at:H.string(),encrypted_env_pubkey:H.string().nullable().optional(),app_auth_contract_address:H.string().nullable().optional(),deployer_address:H.string().nullable().optional()}).passthrough(),aI=H.object({encrypted_env:H.string().optional().nullable(),app_id:H.string(),compose_hash:H.string(),kms_id:H.string().optional(),contract_address:H.string().optional(),deployer_address:H.string().optional(),env_keys:H.array(H.string()).optional().nullable()}).passthrough(),{action:Ay,safeAction:Yn}=M(Iy,async(e,t)=>await e.post("/cvms",t));function Ta(e){return e==null?e:Array.isArray(e)?e.map(Ta):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,r)=>{let n=e[r];return t[r]=Ta(n),t},{}):e}function Yc(e){let t={...e};return t.runner==="bash"&&"docker_compose_file"in t?delete t.docker_compose_file:t.runner==="docker-compose"&&"bash_script"in t&&delete t.bash_script,"pre_launch_script"in t&&!t.pre_launch_script&&delete t.pre_launch_script,t}function Zc(e){let t=Ta(e),r=JSON.stringify(t,null,4);return r=r.replace(/": /g,'":'),r}function Py(e){let t=Yc(e),r=Zc(t);return xy.createHash("sha256").update(r,"utf8").digest("hex")}function $y(e){let t=e;return{...e,getHash:()=>Py(t),toString:()=>Zc(Yc(t))}}var Dy=Jc.transform(e=>$y(e)),Ry=G,{action:My,safeAction:rn}=M(Dy,async(e,t)=>{let{cvmId:r}=Ry.parse(t);return await e.get(`/cvms/${r}/compose_file`)}),Ty=mt.object({id:mt.string().optional(),uuid:mt.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i).optional(),app_id:mt.string().refine(e=>!e.startsWith("app_")&&e.length===40,"app_id should be 40 characters without prefix").transform(e=>e.startsWith("app_")?e:`app_${e}`).optional(),instance_id:mt.string().refine(e=>!e.startsWith("instance_")&&e.length===40,"instance_id should be 40 characters without prefix").transform(e=>e.startsWith("instance_")?e:`instance_${e}`).optional(),app_compose:Jc,update_env_vars:mt.boolean().optional().nullable()}).refine(e=>!!(e.id||e.uuid||e.app_id||e.instance_id),"One of id, uuid, app_id, or instance_id must be provided").transform(e=>({cvmId:e.id||e.uuid||e.app_id||e.instance_id,request:{...e.app_compose,update_env_vars:e.update_env_vars},_raw:e})),Ly=mt.object({app_id:mt.string().nullable(),device_id:mt.string().nullable(),compose_hash:mt.string(),kms_info:dt.nullable().optional()}).passthrough(),{action:Ny,safeAction:Ga}=M(Ly,async(e,t)=>{let r=Ty.parse(t);return await e.post(`/cvms/${r.cvmId}/compose_file/provision`,r.request)}),Uy=rt.object({id:rt.string().optional(),uuid:rt.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i).optional(),app_id:rt.string().refine(e=>!e.startsWith("app_")&&e.length===40,"app_id should be 40 characters without prefix").transform(e=>e.startsWith("app_")?e:`app_${e}`).optional(),instance_id:rt.string().refine(e=>!e.startsWith("instance_")&&e.length===40,"instance_id should be 40 characters without prefix").transform(e=>e.startsWith("instance_")?e:`instance_${e}`).optional(),compose_hash:rt.string().min(1,"Compose hash is required"),encrypted_env:rt.string().optional(),env_keys:rt.array(rt.string()).optional(),update_env_vars:rt.boolean().optional().nullable()}).refine(e=>!!(e.id||e.uuid||e.app_id||e.instance_id),"One of id, uuid, app_id, or instance_id must be provided").transform(e=>({cvmId:e.id||e.uuid||e.app_id||e.instance_id,compose_hash:e.compose_hash,encrypted_env:e.encrypted_env,env_keys:e.env_keys,update_env_vars:e.update_env_vars??void 0,_raw:e})),Oy=rt.any().transform(()=>{}),{action:Fy,safeAction:Ha}=M(Oy,async(e,t)=>{let r=Uy.parse(t);return await e.patch(`/cvms/${r.cvmId}/compose_file`,{compose_hash:r.compose_hash,encrypted_env:r.encrypted_env,env_keys:r.env_keys,update_env_vars:r.update_env_vars})}),jy=ft(Xe.extend({encrypted_env:ke.string().describe("Encrypted environment variables (hex string)"),env_keys:ke.array(ke.string()).optional().describe("List of allowed environment variable keys"),compose_hash:ke.string().optional().describe("Compose hash for verification (Phase 2, required when env_keys changes)"),transaction_hash:ke.string().optional().describe("On-chain transaction hash for verification (Phase 2, required when env_keys changes)")})).transform(e=>{let{cvmId:t}=G.parse(e);return{cvmId:t,request:{encrypted_env:e.encrypted_env,env_keys:e.env_keys,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),Vy=ke.object({status:ke.literal("in_progress"),message:ke.string(),correlation_id:ke.string(),allowed_envs_changed:ke.boolean()}),zy=ke.object({status:ke.literal("precondition_required"),message:ke.string(),compose_hash:ke.string(),app_id:ke.string(),device_id:ke.string(),kms_info:dt}),Ky=ke.union([Vy,zy]),{action:Gy,safeAction:Zn}=M(Ky,async(e,t)=>{let r=jy.parse(t);try{return await e.patch(`/cvms/${r.cvmId}/envs`,r.request)}catch(n){if(n instanceof ut&&n.status===465){let o=n.detail;if(o&&typeof o=="object"){let a=o;return{status:"precondition_required",message:a.message||"Compose hash verification required",compose_hash:a.compose_hash,app_id:a.app_id,device_id:a.device_id,kms_info:a.kms_info}}}throw n}}),Hy=ft(Xe.extend({docker_compose_file:ze.string().describe("Docker Compose YAML content"),compose_hash:ze.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:ze.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=G.parse(e);return{cvmId:t,request:{docker_compose_file:e.docker_compose_file,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),qy=ze.object({status:ze.literal("in_progress"),message:ze.string(),correlation_id:ze.string()}),By=ze.object({status:ze.literal("precondition_required"),message:ze.string(),compose_hash:ze.string(),app_id:ze.string(),device_id:ze.string(),kms_info:dt}),Wy=ze.union([qy,By]),{action:Jy,safeAction:Yy}=M(Wy,async(e,t)=>{let r=Hy.parse(t),n={"Content-Type":"text/yaml"};r.request.compose_hash&&(n["X-Compose-Hash"]=r.request.compose_hash),r.request.transaction_hash&&(n["X-Transaction-Hash"]=r.request.transaction_hash);try{return await e.patch(`/cvms/${r.cvmId}/docker-compose`,r.request.docker_compose_file,{headers:n})}catch(o){if(o instanceof ut&&o.status===465){let a=o.detail;if(a&&typeof a=="object"){let s=a;return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:s.compose_hash,app_id:s.app_id,device_id:s.device_id,kms_info:s.kms_info}}}throw o}}),Zy=ft(Xe.extend({pre_launch_script:Ke.string().describe("Pre-launch script content (shell script)"),compose_hash:Ke.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:Ke.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=G.parse(e);return{cvmId:t,request:{pre_launch_script:e.pre_launch_script,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),Xy=Ke.object({status:Ke.literal("in_progress"),message:Ke.string(),correlation_id:Ke.string()}),Qy=Ke.object({status:Ke.literal("precondition_required"),message:Ke.string(),compose_hash:Ke.string(),app_id:Ke.string(),device_id:Ke.string(),kms_info:dt}),ev=Ke.union([Xy,Qy]),{action:tv,safeAction:rv}=M(ev,async(e,t)=>{let r=Zy.parse(t),n={"Content-Type":"text/plain"};r.request.compose_hash&&(n["X-Compose-Hash"]=r.request.compose_hash),r.request.transaction_hash&&(n["X-Transaction-Hash"]=r.request.transaction_hash);try{return await e.patch(`/cvms/${r.cvmId}/pre-launch-script`,r.request.pre_launch_script,{headers:n})}catch(o){if(o instanceof ut&&o.status===465){let a=o.detail;if(a&&typeof a=="object"){let s=a;return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:s.compose_hash,app_id:s.app_id,device_id:s.device_id,kms_info:s.kms_info}}}throw o}}),ov=G,{action:av,safeAction:sv}=M(nv.string(),async(e,t)=>{let{cvmId:r}=ov.parse(t);return await e.get(`/cvms/${r}/pre-launch-script`)}),iv=hc.object({kms_id:hc.string().min(1,"KMS ID is required")}),{action:cv,safeAction:lv}=M(dt,async(e,t)=>{let r=iv.parse(t);return await e.get(`/kms/${r.kms_id}`)}),mv=pt.object({page:pt.number().int().min(1).optional(),page_size:pt.number().int().min(1).optional(),is_onchain:pt.boolean().optional()}).strict(),pv=pt.object({items:pt.array(dt),total:pt.number(),page:pt.number(),page_size:pt.number(),pages:pt.number()}).strict(),{action:uv,safeAction:qa}=M(pv,async(e,t)=>{let r=mv.parse(t??{});return await e.get("/kms",{params:r})}),dv=Er.object({kms:Er.string().min(1,"KMS ID or slug is required"),app_id:Er.string().refine(e=>e.length===40||e.startsWith("0x")&&e.length===42,"App ID must be exactly 40 characters or 42 characters with 0x prefix")}).strict(),fv=Er.object({public_key:Er.string(),signature:Er.string()}).strict(),{action:gv,safeAction:xr}=M(fv,async(e,t)=>{let r=dv.parse(t);return await e.get(`/kms/${r.kms}/pubkey/${r.app_id}`)}),hv=Jt.object({counts:Jt.number().int().min(1).max(20).optional().default(1)}).strict(),yv=Jt.object({app_ids:Jt.array(Jt.object({app_id:Jt.string(),nonce:Jt.number().int().min(0)}))}).strict(),{action:vv,safeAction:bv}=M(yv,async(e,t)=>{let r=hv.parse(t??{}),n=new URLSearchParams;return n.append("counts",r.counts.toString()),await e.get(`/kms/phala/next_app_id?${n.toString()}`)}),nn=re.object({id:re.number(),name:re.string(),status:re.string(),teepod_id:re.number(),teepod:re.object({id:re.number(),name:re.string(),region_identifier:re.string().nullable().optional()}).optional().nullable(),user_id:re.number().optional().nullable(),app_id:re.string(),vm_uuid:re.string().nullable(),instance_id:re.string().nullable(),app_url:re.string().optional().nullable(),base_image:re.string().optional().nullable(),vcpu:re.number(),memory:re.number(),disk_size:re.number(),manifest_version:re.number().optional().nullable(),version:re.string().optional().nullable(),runner:re.string().optional().nullable(),docker_compose_file:re.string().optional().nullable(),features:re.array(re.string()).optional().nullable(),created_at:re.string(),encrypted_env_pubkey:re.string().nullable()}),Cv=G,{action:wv,safeAction:Ba}=M(nn,async(e,t)=>{let{cvmId:r}=Cv.parse(t);return await e.post(`/cvms/${r}/start`)}),_v=G,{action:Sv,safeAction:Wa}=M(nn,async(e,t)=>{let{cvmId:r}=_v.parse(t);return await e.post(`/cvms/${r}/stop`)}),kv=G,{action:Ev,safeAction:Iv}=M(nn,async(e,t)=>{let{cvmId:r}=kv.parse(t);return await e.post(`/cvms/${r}/shutdown`)}),xv=ft(Xe.extend({force:Av.boolean().optional()})),{action:Pv,safeAction:Ja}=M(nn,async(e,t)=>{let r=xv.parse(t),{cvmId:n}=G.parse(r),{force:o=!1}=r;return await e.post(`/cvms/${n}/restart`,{force:o})}),Dv=G,{action:Rv,safeAction:Ya}=M($v.void(),async(e,t)=>{let{cvmId:r}=Dv.parse(t);await e.delete(`/cvms/${r}`)}),Mv=X.object({name:X.string(),mount_point:X.string(),total_size:X.number(),free_size:X.number()}),Tv=X.object({os_name:X.string(),os_version:X.string(),kernel_version:X.string(),cpu_model:X.string(),num_cpus:X.number(),total_memory:X.number(),available_memory:X.number(),used_memory:X.number(),free_memory:X.number(),total_swap:X.number(),used_swap:X.number(),free_swap:X.number(),uptime:X.number(),loadavg_one:X.number(),loadavg_five:X.number(),loadavg_fifteen:X.number(),disks:X.array(Mv)}),Lv=X.object({is_online:X.boolean(),is_public:X.boolean().default(!1),error:X.string().nullable(),sysinfo:Tv.nullable(),status:X.string().nullable(),in_progress:X.boolean().default(!1),boot_progress:X.string().nullable(),boot_error:X.string().nullable()}),Nv=G,{action:Uv,safeAction:Ov}=M(Lv,async(e,t)=>{let{cvmId:r}=Nv.parse(t);return await e.get(`/cvms/${r}/stats`)}),Fv=ct.object({app:ct.string(),instance:ct.string()}),jv=ct.object({is_online:ct.boolean(),is_public:ct.boolean().default(!0),error:ct.string().nullable(),internal_ip:ct.string().nullable(),latest_handshake:ct.string().nullable(),public_urls:ct.array(Fv).nullable()}),Vv=G,{action:zv,safeAction:Kv}=M(jv,async(e,t)=>{let{cvmId:r}=Vv.parse(t);return await e.get(`/cvms/${r}/network`)}),Hv=G,{action:qv,safeAction:Bv}=M(Gv.string(),async(e,t)=>{let{cvmId:r}=Hv.parse(t);return await e.get(`/cvms/${r}/docker-compose.yml`)}),Wv=de.object({id:de.string(),names:de.array(de.string()),image:de.string(),image_id:de.string(),command:de.string().nullable().optional(),created:de.number(),state:de.string(),status:de.string(),log_endpoint:de.string().nullable()}),Jv=de.object({is_online:de.boolean(),is_public:de.boolean().default(!0),error:de.string().nullable(),docker_compose_file:de.string().nullable(),manifest_version:de.number().nullable(),version:de.string().nullable(),runner:de.string().nullable(),features:de.array(de.string()).nullable(),containers:de.array(Wv).nullable()}),Yv=G,{action:Zv,safeAction:Za}=M(Jv,async(e,t)=>{let{cvmId:r}=Yv.parse(t);return await e.get(`/cvms/${r}/composition`)}),Xv=R.object({common_name:R.string().nullable(),organization:R.string().nullable(),country:R.string().nullable(),state:R.string().nullable(),locality:R.string().nullable()}),Qv=R.object({common_name:R.string().nullable(),organization:R.string().nullable(),country:R.string().nullable()}),Xc=R.object({subject:Xv,issuer:Qv,serial_number:R.string(),not_before:R.string(),not_after:R.string(),version:R.string(),fingerprint:R.string(),signature_algorithm:R.string(),sans:R.array(R.string()).nullable(),is_ca:R.boolean(),position_in_chain:R.number().nullable(),quote:R.string().nullable(),app_id:R.string().nullable().optional(),cert_usage:R.string().nullable().optional()}),eb=R.object({imr:R.number(),event_type:R.number(),digest:R.string(),event:R.string(),event_payload:R.string()}),Qc=R.object({mrtd:R.string(),rootfs_hash:R.string().nullable().optional(),rtmr0:R.string(),rtmr1:R.string(),rtmr2:R.string(),rtmr3:R.string(),event_log:R.array(eb),app_compose:R.string()}),tb=R.object({name:R.string().nullable(),is_online:R.boolean(),is_public:R.boolean().default(!0),error:R.string().nullable(),app_certificates:R.array(Xc).nullable(),tcb_info:Qc.nullable(),compose_file:R.string().nullable()}),rb=G,{action:nb,safeAction:ob}=M(tb,async(e,t)=>{let{cvmId:r}=rb.parse(t);return await e.get(`/cvms/${r}/attestation`)}),ab=ft(Xe.extend({vcpu:Sr.number().optional(),memory:Sr.number().optional(),disk_size:Sr.number().optional(),instance_type:Sr.string().optional(),allow_restart:Sr.boolean().optional()})),{action:sb,safeAction:ib}=M(Sr.void(),async(e,t)=>{let r=ab.parse(t),{cvmId:n}=G.parse(r),{...o}=r;await e.patch(`/cvms/${n}/resources`,o)}),cb=ft(Xe.extend({public_sysinfo:Aa.boolean(),public_logs:Aa.boolean(),public_tcbinfo:Aa.boolean().optional()})),{action:lb,safeAction:Xa}=M(Kc,async(e,t)=>{let r=cb.parse(t),{cvmId:n}=G.parse(r),{public_sysinfo:o,public_logs:a,public_tcbinfo:s}=r;return await e.patch(`/cvms/${n}/visibility`,{public_sysinfo:o,public_logs:a,public_tcbinfo:s})}),yc=xe.object({name:xe.string(),os_image_hash:xe.string().nullable(),is_current:xe.boolean()}),mb=xe.object({version:xe.union([xe.tuple([xe.number(),xe.number(),xe.number(),xe.number()]),xe.tuple([xe.number(),xe.number(),xe.number()])]),prod:yc.nullable(),dev:yc.nullable()}),pb=xe.array(mb),ub=G,{action:db,safeAction:fb}=M(pb,async(e,t)=>{let{cvmId:r}=ub.parse(t);return await e.get(`/cvms/${r}/available-os-images`)}),gb=ft(Xe.extend({os_image_name:el.string().min(1,"OS image name is required")})),{action:hb,safeAction:yb}=M(el.void(),async(e,t)=>{let r=gb.parse(t),{cvmId:n}=G.parse(r),{os_image_name:o}=r;await e.patch(`/cvms/${n}/os-image`,{os_image_name:o})}),vb=it.object({id:it.string().optional(),instance_id:it.string().optional(),name:it.string(),status:it.string(),uptime:it.string().optional(),exited_at:it.string().optional(),boot_progress:it.string().optional(),boot_error:it.string().optional(),shutdown_progress:it.string().optional()}),bb=G,{action:Cb,safeAction:wb}=M(vb,async(e,t)=>{let{cvmId:r}=bb.parse(t);return await e.get(`/cvms/${r}/state`)}),tl=Ve.object({id:Ve.string(),user_id:Ve.string(),name:Ve.string(),public_key:Ve.string(),fingerprint:Ve.string(),key_type:Ve.string(),source:Ve.string(),key_metadata:Ve.record(Ve.unknown()).nullable().optional(),last_synced_at:Ve.string().nullable().optional(),created_at:Ve.string(),updated_at:Ve.string()}),_b=Ve.array(tl);async function rl(e){let t=await e.get("/user/ssh-keys");return _b.parse(t)}async function on(e){try{return{success:!0,data:await rl(e)}}catch(t){return t&&typeof t=="object"&&("status"in t||"issues"in t)?{success:!1,error:t}:{success:!1,error:{name:"Error",message:t instanceof Error?t.message:String(t)}}}}var Sb=Ft.object({github_username:Ft.string().min(1)}),kb=Ft.object({github_username:Ft.string(),keys_added:Ft.number().int(),keys_skipped:Ft.number().int(),errors:Ft.array(Ft.string()).default([])}),{action:Eb,safeAction:Qa}=M(kb,async(e,t)=>{let{github_username:r}=Sb.parse(t);return await e.post("/user/ssh-keys/github-profile",{github_username:r})}),Ib=xa.object({name:xa.string().min(1),public_key:xa.string().min(1)}),{action:Ab,safeAction:es}=M(tl,async(e,t)=>{let{name:r,public_key:n}=Ib.parse(t);return await e.post("/user/ssh-keys",{name:r,public_key:n})}),xb=La.object({keyId:La.string().min(1)}),{action:Pb,safeAction:ts}=M(La.void(),async(e,t)=>{let{keyId:r}=xb.parse(t);await e.delete(`/user/ssh-keys/${r}`)}),$b=Wt.object({synced_count:Wt.number().int(),keys_added:Wt.number().int(),keys_updated:Wt.number().int(),keys_removed:Wt.number().int(),errors:Wt.array(Wt.string()).default([])}),{action:Db,safeAction:Rb}=Fc($b,async e=>await e.post("/user/ssh-keys/github-sync",{})),Mb=Se.object({name:Se.string(),slug:Se.string(),version:Se.string(),os_image_hash:Se.string().nullable(),is_dev:Se.boolean(),requires_gpu:Se.boolean()}).passthrough(),Tb=Se.object({page:Se.number().int().min(1).optional(),page_size:Se.number().int().min(1).optional(),is_dev:Se.boolean().optional()}).strict(),Lb=Se.object({items:Se.array(Mb),total:Se.number(),page:Se.number(),page_size:Se.number(),pages:Se.number()}).passthrough(),{action:Nb,safeAction:rs}=M(Lb,async(e,t)=>{let r=Tb.parse(t??{});return await e.get("/os-images",{params:r})}),Ub=ge.object({device_id:ge.string(),node_name:ge.string().nullable().optional(),on_chain_allowed:ge.boolean().nullable()}).passthrough(),Ob=ge.object({name:ge.string(),version:ge.string(),os_image_hash:ge.string().nullable(),on_chain_allowed:ge.boolean().nullable()}).passthrough(),Fb=ge.object({contract_address:ge.string(),chain_id:ge.number(),chain_name:ge.string(),devices:ge.array(Ub),os_images:ge.array(Ob)}).passthrough(),jb=ge.object({chain_name:ge.string(),chain_id:ge.number(),contracts:ge.array(Fb)}).passthrough(),Vb=ge.object({chain:ge.string()}).strict(),{action:zb,safeAction:ns}=M(jb,async(e,t)=>{let{chain:r}=Vb.parse(t);return await e.get(`/kms/on-chain/${r}`)});function Qe(e={}){let t=Mh(e),r={getCurrentUser:Nc,safeGetCurrentUser:Pe,getAvailableNodes:Hh,safeGetAvailableNodes:Zt,listAllInstanceTypeFamilies:Ua,safeListAllInstanceTypeFamilies:Yh,listFamilyInstanceTypes:Oa,safeListFamilyInstanceTypes:Zh,listWorkspaces:ey,safeListWorkspaces:ty,getWorkspace:ry,safeGetWorkspace:ny,getCvmInfo:qc,safeGetCvmInfo:Q,getCvmList:Bc,safeGetCvmList:tn,provisionCvm:Ey,safeProvisionCvm:Ka,commitCvmProvision:Ay,safeCommitCvmProvision:Yn,getCvmComposeFile:My,safeGetCvmComposeFile:rn,provisionCvmComposeFileUpdate:Ny,safeProvisionCvmComposeFileUpdate:Ga,commitCvmComposeFileUpdate:Fy,safeCommitCvmComposeFileUpdate:Ha,updateCvmEnvs:Gy,safeUpdateCvmEnvs:Zn,updateDockerCompose:Jy,safeUpdateDockerCompose:Yy,updatePreLaunchScript:tv,safeUpdatePreLaunchScript:rv,getCvmPreLaunchScript:av,safeGetCvmPreLaunchScript:sv,startCvm:wv,safeStartCvm:Ba,stopCvm:Sv,safeStopCvm:Wa,shutdownCvm:Ev,safeShutdownCvm:Iv,restartCvm:Pv,safeRestartCvm:Ja,deleteCvm:Rv,safeDeleteCvm:Ya,getCvmStats:Uv,safeGetCvmStats:Ov,getCvmNetwork:zv,safeGetCvmNetwork:Kv,getCvmDockerCompose:qv,safeGetCvmDockerCompose:Bv,getCvmContainersStats:Zv,safeGetCvmContainersStats:Za,getCvmAttestation:nb,safeGetCvmAttestation:ob,updateCvmResources:sb,safeUpdateCvmResources:ib,updateCvmVisibility:lb,safeUpdateCvmVisibility:Xa,getAvailableOsImages:db,safeGetAvailableOsImages:fb,updateOsImage:hb,safeUpdateOsImage:yb,getKmsInfo:cv,safeGetKmsInfo:lv,getKmsList:uv,safeGetKmsList:qa,getAppEnvEncryptPubKey:gv,safeGetAppEnvEncryptPubKey:xr,nextAppIds:vv,safeNextAppIds:bv,getCvmState:Cb,safeGetCvmState:wb,listSshKeys:rl,safeListSshKeys:on,importGithubProfileSshKeys:Eb,safeImportGithubProfileSshKeys:Qa,createSshKey:Ab,safeCreateSshKey:es,deleteSshKey:Pb,safeDeleteSshKey:ts,syncGithubSshKeys:Db,safeSyncGithubSshKeys:Rb,getOsImages:Nb,safeGetOsImages:rs,getKmsOnChainDetail:zb,safeGetKmsOnChainDetail:ns};return t.extend(r)}var vc=$.object({vm_uuid:$.string().nullable(),app_id:$.string(),name:$.string().default(""),status:$.string(),vcpu:$.number().int(),memory:$.number().int(),disk_size:$.number().int(),teepod_id:$.number().int(),teepod_name:$.string(),region_identifier:$.string().nullable().optional(),kms_type:$.string().nullable().optional(),instance_type:$.string().nullable().optional(),listed:$.boolean().nullable().optional(),base_image:$.string().nullable().optional(),kms_slug:$.string().nullable().optional(),kms_id:$.string().nullable().optional(),instance_id:$.string().nullable().optional(),machine_info:Fa.nullable().optional(),updated_at:$.string().nullable().optional()}),Kb=$.object({display_name:$.string().nullable().optional(),avatar_url:$.string().nullable().optional(),description:$.string().nullable().optional(),custom_domain:$.string().nullable().optional()}),Gb=$.object({id:$.string(),name:$.string(),app_id:$.string(),app_provision_type:$.string().nullable().optional(),app_icon_url:$.string().nullable().optional(),created_at:$.string(),kms_type:$.string(),profile:Kb.nullable().optional(),current_cvm:vc.nullable().optional(),cvms:$.array(vc).default([]),cvm_count:$.number().int().default(0)}),Hb=$.object({id:$.null().optional(),app_id:$.string(),name:$.null().optional(),app_provision_type:$.null().optional(),app_icon_url:$.null().optional(),created_at:$.null().optional(),kms_type:$.null().optional(),current_cvm:$.null().optional(),cvms:$.null().optional(),cvm_count:$.null().optional()}),qb=$.union([Gb,Hb]),Bb=$.object({dstack_apps:$.array(qb),page:$.number().int(),page_size:$.number().int(),total:$.number().int(),total_pages:$.number().int()}),Wb=W.object({id:W.string(),name:W.string(),app_id:W.string(),app_provision_type:W.string().nullable().optional(),app_icon_url:W.string().nullable().optional(),created_at:W.string(),kms_type:W.string(),profile:W.object({display_name:W.string().nullable().optional(),avatar_url:W.string().nullable().optional(),description:W.string().nullable().optional(),custom_domain:W.string().nullable().optional()}).nullable().optional(),current_cvm:Bn.nullable().optional(),cvms:W.array(Bn).default([]),cvm_count:W.number().int().default(0)}),Jb=W.object({id:W.null().optional(),app_id:W.string(),name:W.null().optional(),app_provision_type:W.null().optional(),app_icon_url:W.null().optional(),created_at:W.null().optional(),kms_type:W.null().optional(),current_cvm:W.null().optional(),cvms:W.null().optional(),cvm_count:W.null().optional()}),Yb=W.union([Wb,Jb]),Zb=W.object({dstack_apps:W.array(Yb),page:W.number().int(),page_size:W.number().int(),total:W.number().int(),total_pages:W.number().int()}),nl=q.object({object_type:q.literal("cvm"),id:q.string().nullable().optional(),name:q.string().nullable().optional(),app_id:q.string().nullable().optional(),vm_uuid:q.string().nullable().optional()}),Xb=q.object({revision_id:q.string(),app_id:q.string(),vm_uuid:q.string(),compose_hash:q.string(),created_at:q.string(),trace_id:q.string().nullable().optional(),operation_type:q.string(),triggered_by:Va.nullable().optional(),cvm:nl.nullable().optional(),workspace:za.nullable().optional()}),jI=q.object({revision_id:q.string(),app_id:q.string(),vm_uuid:q.string(),compose_hash:q.string(),compose_file:q.union([q.record(q.any()),q.string()]).nullable().optional(),encrypted_env:q.string(),user_config:q.string(),created_at:q.string(),trace_id:q.string().nullable().optional(),operation_type:q.string(),triggered_by:Va.nullable().optional(),cvm:nl.nullable().optional(),workspace:za.nullable().optional()}),VI=q.object({revisions:q.array(Xb),total:q.number().int(),page:q.number().int(),page_size:q.number().int(),total_pages:q.number().int()});function wt(e){if(typeof e=="string"){if(e.startsWith("0x")&&wc(e))return e;if(wc(`0x${e}`))return`0x${e}`}throw new Error(`Invalid hex value: ${e}`)}var ol=class extends Error{constructor(e,t,r){super(e),this.code=t,this.details=r,this.name="NetworkError"}};var lt=class extends Error{constructor(e,t,r){super(e),this.hash=t,this.details=r,this.name="TransactionError"}};async function rC(e,t){try{let r=await e.walletClient.getChainId();return{isCorrectNetwork:r===t,currentChainId:r}}catch(r){throw new ol(`Failed to check network status: ${r instanceof Error?r.message:"Unknown error"}`,"NETWORK_CHECK_FAILED",r)}}async function nC(e,t,r){try{let n=await e.getBalance({address:t});return{address:t,balance:n,sufficient:r?n>=r:!0,required:r}}catch(n){throw new ol(`Failed to check balance: ${n instanceof Error?n.message:"Unknown error"}`,"BALANCE_CHECK_FAILED",n)}}async function oC(e,t,r={}){let{timeout:n=6e4,pollingInterval:o=2e3,confirmations:a=1}=r,s=Date.now();return new Promise((c,l)=>{let m=async()=>{try{let p=await e.getTransactionReceipt({hash:t});if(p){if(a>1&&await e.getBlockNumber()-p.blockNumber+1n<BigInt(a)){if(Date.now()-s>=n){l(new lt(`Transaction confirmation timeout after ${n}ms`,t));return}setTimeout(m,o);return}c(p)}else{if(Date.now()-s>=n){l(new lt(`Transaction receipt timeout after ${n}ms`,t));return}setTimeout(m,o)}}catch(p){if(Date.now()-s>=n){l(new lt(`Transaction receipt timeout after ${n}ms`,t,p));return}setTimeout(m,o)}};m()})}async function an(e,t){let{targetChainId:r,minBalance:n,requiredAddress:o}=t,a=await rC(e,r),s=await nC(e.publicClient,e.address,n),c=o?e.address.toLowerCase()===o.toLowerCase():!0;return{networkValid:a.isCorrectNetwork,balanceValid:s.sufficient,addressValid:c,details:{currentChainId:a.currentChainId,balance:s.balance,address:e.address}}}function Pr(){let e={state:"idle"},t,r,n=c=>{e={...e,...c}},o=()=>{t&&(clearTimeout(t),t=void 0),r&&(r.abort(),r=void 0),e={state:"idle"}},a=()=>{r&&r.abort(),t&&(clearTimeout(t),t=void 0),n({state:"error",aborted:!0,error:"Transaction aborted by user"})};return{get status(){return{...e}},get isIdle(){return e.state==="idle"},get isSubmitting(){return e.state==="submitting"},get isPending(){return e.state==="pending"},get isSuccess(){return e.state==="success"},get isError(){return e.state==="error"},get isTimeout(){return e.state==="timeout"},get isAborted(){return e.aborted===!0},get isComplete(){return["success","error","timeout"].includes(e.state)},abort:a,reset:o,execute:async(c,l,m,p={})=>{let{timeout:u=6e4,confirmations:d=1,onSubmitted:f,onConfirmed:g,onError:h,signal:v}=p;try{if(o(),r=new AbortController,v){if(v.aborted)throw new lt("Operation was aborted before execution");v.addEventListener("abort",()=>{a()})}if(n({state:"submitting",startTime:Date.now(),error:void 0,hash:void 0,receipt:void 0,aborted:!1}),r.signal.aborted)throw new lt("Transaction aborted");let w=await c(l,...m);if(r.signal.aborted)throw new lt("Transaction aborted after submission",w);n({state:"pending",hash:w,submitTime:Date.now()}),f?.(w),u>0&&(t=setTimeout(()=>{e.state==="pending"&&!r?.signal.aborted&&n({state:"timeout",error:`Transaction timeout after ${u}ms`})},u));let C=await Promise.race([oC(l.publicClient,w,{timeout:u,confirmations:d}),new Promise((S,E)=>{r?.signal.addEventListener("abort",()=>{E(new lt("Transaction aborted while waiting for receipt",w))})})]);t&&(clearTimeout(t),t=void 0);let _=C.status==="success";if(n({state:_?"success":"error",receipt:C,confirmTime:Date.now(),error:_?void 0:"Transaction failed on-chain"}),_)g?.(C);else{let S=new lt("Transaction failed on-chain",w,C);throw h?.(S,w),S}return{hash:w,receipt:C,success:_}}catch(w){let C=w instanceof lt?w:new lt(`Transaction execution failed: ${w instanceof Error?w.message:"Unknown error"}`,e.hash,w);throw n({state:"error",error:C.message}),h?.(C,e.hash),C}}}}async function sn(e,t,r,n={},o={}){let{maxRetries:a=3,initialDelay:s=1e3,maxDelay:c=1e4,backoffFactor:l=2,retryCondition:m=()=>!0}=o,p,u=s;for(let d=0;d<=a;d++)try{return await Pr().execute(e,t,r,n)}catch(f){if(p=f instanceof Error?f:new Error(String(f)),d===a||!m(p))break;await new Promise(g=>setTimeout(g,u)),u=Math.min(u*l,c)}throw p}var al=[{inputs:[{name:"deployer",type:"address"},{name:"disableUpgrades",type:"bool"},{name:"allowAnyDevice",type:"bool"},{name:"deviceId",type:"bytes32"},{name:"composeHash",type:"bytes32"}],name:"deployAndRegisterApp",outputs:[{name:"",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"appId",type:"address",indexed:!0},{name:"deployer",type:"address",indexed:!0}],name:"AppDeployedViaFactory",type:"event",anonymous:!1},{inputs:[{name:"appId",type:"address",indexed:!1}],name:"AppRegistered",type:"event",anonymous:!1}],aC=ye.object({chain:ye.unknown().optional(),rpcUrl:ye.string().optional(),kmsContractAddress:ye.string(),privateKey:ye.string().optional(),walletClient:ye.unknown().optional(),publicClient:ye.unknown().optional(),allowAnyDevice:ye.boolean().optional().default(!1),deviceId:ye.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),composeHash:ye.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),disableUpgrades:ye.boolean().optional().default(!1),skipPrerequisiteChecks:ye.boolean().optional().default(!1),minBalance:ye.string().optional()}).passthrough(),sC=aC.refine(e=>{let t=!!e.privateKey,r=!!e.walletClient;return t!==r},{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>{let t=!!e.publicClient,r=!!e.walletClient,n=!!e.chain;return t&&r?!0:n},{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),iC=ye.object({appId:ye.string(),appAuthAddress:ye.string(),deployer:ye.string(),transactionHash:ye.string(),blockNumber:ye.bigint().optional(),gasUsed:ye.bigint().optional()}).passthrough();function cC(e,t,r){try{let n=eC({abi:al,eventName:"AppDeployedViaFactory",logs:e.logs,strict:!1});if(n.length===0)throw e.status==="reverted"?new Error(`Transaction failed: ${e.transactionHash}`):new Error(`Transaction ${e.transactionHash} has no AppDeployedViaFactory events. The deployment failed. Status: ${e.status}. Found ${e.logs.length} logs.`);let o=n[0];if(!o?.args)throw new Error("Event has no data");let{appId:a,deployer:s}=o.args;if(!a)throw new Error("Event missing appId");return{appId:a,appAuthAddress:a,deployer:t,transactionHash:e.transactionHash,blockNumber:e.blockNumber,gasUsed:e.gasUsed}}catch(n){throw n instanceof Error?n:new Error(`Parse failed: ${n}`)}}async function lC(e,t){let r=sC.parse(e),{chain:n,rpcUrl:o,kmsContractAddress:a,privateKey:s,walletClient:c,publicClient:l,allowAnyDevice:m=!1,deviceId:p="0000000000000000000000000000000000000000000000000000000000000000",composeHash:u="0000000000000000000000000000000000000000000000000000000000000000",disableUpgrades:d=!1,skipPrerequisiteChecks:f=!1,minBalance:g,timeout:h=12e4,retryOptions:v,signal:w,onTransactionStateChange:C,onTransactionSubmitted:_,onTransactionConfirmed:S}=r,E="0000000000000000000000000000000000000000000000000000000000000000",P=p!==E&&p!=="0x"+E?!1:m,O,V,te,oe;if(s){let Me=tC(s);if(l){if(typeof l!="object"||!l)throw new Error("publicClient is invalid");O=l}else{if(!n)throw new Error("Chain required for publicClient");O=bc({chain:n,transport:Pa(o)})}if(!n)throw new Error("Chain required for walletClient");V=Qb({account:Me,chain:n,transport:Pa(o)}),te=Me.address,oe=n.id}else if(c){if(typeof c!="object"||!c)throw new Error("walletClient is invalid");if(V=c,l){if(typeof l!="object"||!l)throw new Error("publicClient is invalid");O=l}else{if(!n)throw new Error("Chain required for publicClient");O=bc({chain:n,transport:Pa(o)})}if(!V.account?.address)throw new Error("WalletClient needs an account");te=V.account.address,n?oe=n.id:oe=await V.getChainId()}else throw new Error("Need privateKey or walletClient");let Re={publicClient:O,walletClient:V,address:te,chainId:oe},z=Pr();if(C&&typeof C=="function"){let Me=()=>{C(z.status),z.isComplete||setTimeout(Me,100)};setTimeout(Me,10)}if(!f){let Me={targetChainId:oe,minBalance:g?Cc(g):Cc("0.001")},pr=await an(Re,Me);if(!pr.networkValid)throw new Error(`Wrong network. Need chain ${Me.targetChainId}, got ${pr.details.currentChainId}`);if(!pr.balanceValid){let Mt=Number(Me.minBalance)/1e18,sg=Number(pr.details.balance)/1e18;throw new Error(`Not enough ETH. Need ${Mt}, have ${sg.toFixed(6)}`)}}let L=wt(p),ve=wt(u),Fe=`0x${L.slice(2).padEnd(64,"0")}`,ee=`0x${ve.slice(2).padEnd(64,"0")}`,bt=async Me=>{try{let Mt=await Me.publicClient.getCode({address:a});if(!Mt||Mt==="0x")throw new Error(`No contract at ${a}`)}catch(Mt){if(Mt instanceof Error&&Mt.message.includes("No contract at"))throw Mt}let pr={address:a,abi:al,functionName:"deployAndRegisterApp",args:[Me.address,d,P,Fe,ee],account:Me.walletClient.account||Me.address,chain:n||null};return await Me.walletClient.writeContract(pr)},ag=v?await sn(bt,Re,[],{timeout:h,confirmations:1,onSubmitted:_,onConfirmed:S,signal:w},v):await z.execute(bt,Re,[],{timeout:h,confirmations:1,onSubmitted:_,onConfirmed:S,signal:w}),fi=cC(ag.receipt,te,a);return t?.schema===!1?fi:(t?.schema||iC).parse(fi)}async function sl(e,t){try{return{success:!0,data:await lC(e,t)}}catch(r){let n=r instanceof Error?r.message:"Unknown deployment error";return{success:!1,error:{isRequestError:!0,message:n,status:500,detail:n}}}}var il=[{inputs:[{name:"composeHash",type:"bytes32"}],name:"addComposeHash",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"composeHash",type:"bytes32",indexed:!1}],name:"ComposeHashAdded",type:"event",anonymous:!1}],dC=le.object({chain:le.unknown().optional(),rpcUrl:le.string().optional(),appId:le.string(),composeHash:le.string(),privateKey:le.string().optional(),walletClient:le.unknown().optional(),publicClient:le.unknown().optional(),skipPrerequisiteChecks:le.boolean().optional().default(!1),minBalance:le.string().optional(),timeout:le.number().optional().default(12e4),retryOptions:le.unknown().optional(),signal:le.unknown().optional(),onTransactionStateChange:le.function().optional(),onTransactionSubmitted:le.function().optional(),onTransactionConfirmed:le.function().optional()}).passthrough().refine(e=>{let t=!!e.privateKey,r=!!e.walletClient;return t!==r},{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>{let t=!!e.publicClient,r=!!e.walletClient,n=!!e.chain;return t&&r?!0:n},{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),fC=le.object({composeHash:le.string(),appId:le.string(),transactionHash:le.string(),blockNumber:le.bigint().optional(),gasUsed:le.bigint().optional()}).passthrough();function gC(e,t,r,n){console.log(e.logs);try{let o=pC({abi:il,eventName:"ComposeHashAdded",logs:e.logs,strict:!1});if(o.length>0){let a=o[0];a?.args?.composeHash!==t&&console.warn(`Event compose hash (${a?.args?.composeHash}) does not match expected (${t})`)}return{composeHash:t,appAuthAddress:r,appId:n,transactionHash:e.transactionHash,blockNumber:e.blockNumber,gasUsed:e.gasUsed}}catch(o){return console.warn("Failed to parse ComposeHashAdded event, returning basic result:",o),{composeHash:t,appAuthAddress:r,appId:n,transactionHash:e.transactionHash,blockNumber:e.blockNumber,gasUsed:e.gasUsed}}}async function hC(e,t){let r=dC.parse(e),{chain:n,rpcUrl:o,appId:a,composeHash:s,privateKey:c,walletClient:l,publicClient:m,timeout:p=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:g,onTransactionConfirmed:h,skipPrerequisiteChecks:v=!1,minBalance:w}=r,C,_,S,E,x=a.startsWith("0x")?a:`0x${a}`;if(c){let z=uC(c);if(m)C=m;else{if(!n)throw new Error("Chain required when creating publicClient");C=_c({chain:n,transport:$a(o)})}if(!n)throw new Error("Chain required when creating walletClient");_=mC({account:z,chain:n,transport:$a(o)}),S=z.address,E=n.id}else if(l){if(_=l,m)C=m;else{if(!n)throw new Error("Chain required when creating publicClient");C=_c({chain:n,transport:$a(o)})}if(!_.account?.address)throw new Error("WalletClient must have an account with address");S=_.account.address,E=n?n.id:await _.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let P={publicClient:C,walletClient:_,address:S,chainId:E},O=Pr();if(f&&typeof f=="function"){let z=()=>{f(O.status),O.isComplete||setTimeout(z,100)};setTimeout(z,10)}if(!v){let z={targetChainId:E,minBalance:w?Sc(w):Sc("0.001")},L=await an(P,z);if(!L.networkValid)throw new Error(`Network mismatch: Expected chain ${z.targetChainId}, but wallet is on chain ${L.details.currentChainId}`);if(!L.balanceValid){let ve=Number(z.minBalance)/1e18,Fe=Number(L.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${ve} ETH, but account has ${Fe.toFixed(6)} ETH`)}}let V=async z=>await z.walletClient.writeContract({address:x,abi:il,functionName:"addComposeHash",args:[wt(s)],account:z.walletClient.account||z.address,chain:n||null}),te=u?await sn(V,P,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d},u):await O.execute(V,P,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d}),oe=gC(te.receipt,wt(s),x,a);return t?.schema===!1?oe:(t?.schema||fC).parse(oe)}async function Xn(e,t){try{return{success:!0,data:await hC(e,t)}}catch(r){let n=r instanceof Error?r.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:n,status:500,detail:n}}}}var Ir=[{inputs:[{internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"addDevice",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"removeDevice",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bool",name:"_allowAnyDevice",type:"bool"}],name:"setAllowAnyDevice",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"allowedDeviceIds",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"allowAnyDevice",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"DeviceAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"DeviceRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bool",name:"allowAny",type:"bool"}],name:"AllowAnyDeviceSet",type:"event"}],bC=me.object({chain:me.unknown().optional(),rpcUrl:me.string().optional(),appAddress:me.string(),deviceId:me.string(),privateKey:me.string().optional(),walletClient:me.unknown().optional(),publicClient:me.unknown().optional(),skipPrerequisiteChecks:me.boolean().optional().default(!1),minBalance:me.string().optional(),timeout:me.number().optional().default(12e4),retryOptions:me.unknown().optional(),signal:me.unknown().optional(),onTransactionStateChange:me.function().optional(),onTransactionSubmitted:me.function().optional(),onTransactionConfirmed:me.function().optional()}).passthrough().refine(e=>!!e.privateKey!=!!e.walletClient,{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>e.publicClient&&e.walletClient?!0:!!e.chain,{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),CC=me.object({appAddress:me.string(),deviceId:me.string(),transactionHash:me.string(),blockNumber:me.bigint().optional(),gasUsed:me.bigint().optional()}).passthrough();async function wC(e,t){let r=bC.parse(e),{chain:n,rpcUrl:o,appAddress:a,deviceId:s,privateKey:c,walletClient:l,publicClient:m,timeout:p=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:g,onTransactionConfirmed:h,skipPrerequisiteChecks:v=!1,minBalance:w}=r,C=a.startsWith("0x")?a:`0x${a}`,_=wt(s),S,E,x,P;if(c){let L=vC(c);S=m||kc({chain:n,transport:Da(o)}),E=yC({account:L,chain:n,transport:Da(o)}),x=L.address,P=n.id}else if(l){if(E=l,S=m||kc({chain:n,transport:Da(o)}),!E.account?.address)throw new Error("WalletClient must have an account with address");x=E.account.address,P=n?n.id:await E.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let O={publicClient:S,walletClient:E,address:x,chainId:P},V=Pr();if(f&&typeof f=="function"){let L=()=>{f(V.status),V.isComplete||setTimeout(L,100)};setTimeout(L,10)}if(!v){let L={targetChainId:P,minBalance:w?Ec(w):Ec("0.001")},ve=await an(O,L);if(!ve.networkValid)throw new Error(`Network mismatch: Expected chain ${L.targetChainId}, but wallet is on chain ${ve.details.currentChainId}`);if(!ve.balanceValid){let Fe=Number(L.minBalance)/1e18,ee=Number(ve.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Fe} ETH, but account has ${ee.toFixed(6)} ETH`)}}let te=async L=>L.walletClient.writeContract({address:C,abi:Ir,functionName:"addDevice",args:[_],account:L.walletClient.account||L.address,chain:n||null}),oe=u?await sn(te,O,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d},u):await V.execute(te,O,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d}),Re={appAddress:C,deviceId:_,transactionHash:oe.receipt.transactionHash,blockNumber:oe.receipt.blockNumber,gasUsed:oe.receipt.gasUsed};return t?.schema===!1?Re:(t?.schema||CC).parse(Re)}async function cl(e,t){try{return{success:!0,data:await wC(e,t)}}catch(r){let n=r instanceof Error?r.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:n,status:500,detail:n}}}}var kC=pe.object({chain:pe.unknown().optional(),rpcUrl:pe.string().optional(),appAddress:pe.string(),deviceId:pe.string(),privateKey:pe.string().optional(),walletClient:pe.unknown().optional(),publicClient:pe.unknown().optional(),skipPrerequisiteChecks:pe.boolean().optional().default(!1),minBalance:pe.string().optional(),timeout:pe.number().optional().default(12e4),retryOptions:pe.unknown().optional(),signal:pe.unknown().optional(),onTransactionStateChange:pe.function().optional(),onTransactionSubmitted:pe.function().optional(),onTransactionConfirmed:pe.function().optional()}).passthrough().refine(e=>!!e.privateKey!=!!e.walletClient,{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>e.publicClient&&e.walletClient?!0:!!e.chain,{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),EC=pe.object({appAddress:pe.string(),deviceId:pe.string(),transactionHash:pe.string(),blockNumber:pe.bigint().optional(),gasUsed:pe.bigint().optional()}).passthrough();async function IC(e,t){let r=kC.parse(e),{chain:n,rpcUrl:o,appAddress:a,deviceId:s,privateKey:c,walletClient:l,publicClient:m,timeout:p=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:g,onTransactionConfirmed:h,skipPrerequisiteChecks:v=!1,minBalance:w}=r,C=a.startsWith("0x")?a:`0x${a}`,_=wt(s),S,E,x,P;if(c){let L=SC(c);S=m||Ic({chain:n,transport:Ra(o)}),E=_C({account:L,chain:n,transport:Ra(o)}),x=L.address,P=n.id}else if(l){if(E=l,S=m||Ic({chain:n,transport:Ra(o)}),!E.account?.address)throw new Error("WalletClient must have an account with address");x=E.account.address,P=n?n.id:await E.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let O={publicClient:S,walletClient:E,address:x,chainId:P},V=Pr();if(f&&typeof f=="function"){let L=()=>{f(V.status),V.isComplete||setTimeout(L,100)};setTimeout(L,10)}if(!v){let L={targetChainId:P,minBalance:w?Ac(w):Ac("0.001")},ve=await an(O,L);if(!ve.networkValid)throw new Error(`Network mismatch: Expected chain ${L.targetChainId}, but wallet is on chain ${ve.details.currentChainId}`);if(!ve.balanceValid){let Fe=Number(L.minBalance)/1e18,ee=Number(ve.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Fe} ETH, but account has ${ee.toFixed(6)} ETH`)}}let te=async L=>L.walletClient.writeContract({address:C,abi:Ir,functionName:"removeDevice",args:[_],account:L.walletClient.account||L.address,chain:n||null}),oe=u?await sn(te,O,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d},u):await V.execute(te,O,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d}),Re={appAddress:C,deviceId:_,transactionHash:oe.receipt.transactionHash,blockNumber:oe.receipt.blockNumber,gasUsed:oe.receipt.gasUsed};return t?.schema===!1?Re:(t?.schema||EC).parse(Re)}async function ll(e,t){try{return{success:!0,data:await IC(e,t)}}catch(r){let n=r instanceof Error?r.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:n,status:500,detail:n}}}}var PC=ue.object({chain:ue.unknown().optional(),rpcUrl:ue.string().optional(),appAddress:ue.string(),allow:ue.boolean(),privateKey:ue.string().optional(),walletClient:ue.unknown().optional(),publicClient:ue.unknown().optional(),skipPrerequisiteChecks:ue.boolean().optional().default(!1),minBalance:ue.string().optional(),timeout:ue.number().optional().default(12e4),retryOptions:ue.unknown().optional(),signal:ue.unknown().optional(),onTransactionStateChange:ue.function().optional(),onTransactionSubmitted:ue.function().optional(),onTransactionConfirmed:ue.function().optional()}).passthrough().refine(e=>!!e.privateKey!=!!e.walletClient,{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>e.publicClient&&e.walletClient?!0:!!e.chain,{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),$C=ue.object({appAddress:ue.string(),allow:ue.boolean(),transactionHash:ue.string(),blockNumber:ue.bigint().optional(),gasUsed:ue.bigint().optional()}).passthrough();async function DC(e,t){let r=PC.parse(e),{chain:n,rpcUrl:o,appAddress:a,allow:s,privateKey:c,walletClient:l,publicClient:m,timeout:p=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:g,onTransactionConfirmed:h,skipPrerequisiteChecks:v=!1,minBalance:w}=r,C=a.startsWith("0x")?a:`0x${a}`,_,S,E,x;if(c){let z=xC(c);_=m||xc({chain:n,transport:Ma(o)}),S=AC({account:z,chain:n,transport:Ma(o)}),E=z.address,x=n.id}else if(l){if(S=l,_=m||xc({chain:n,transport:Ma(o)}),!S.account?.address)throw new Error("WalletClient must have an account with address");E=S.account.address,x=n?n.id:await S.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let P={publicClient:_,walletClient:S,address:E,chainId:x},O=Pr();if(f&&typeof f=="function"){let z=()=>{f(O.status),O.isComplete||setTimeout(z,100)};setTimeout(z,10)}if(!v){let z={targetChainId:x,minBalance:w?Pc(w):Pc("0.001")},L=await an(P,z);if(!L.networkValid)throw new Error(`Network mismatch: Expected chain ${z.targetChainId}, but wallet is on chain ${L.details.currentChainId}`);if(!L.balanceValid){let ve=Number(z.minBalance)/1e18,Fe=Number(L.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${ve} ETH, but account has ${Fe.toFixed(6)} ETH`)}}let V=async z=>z.walletClient.writeContract({address:C,abi:Ir,functionName:"setAllowAnyDevice",args:[s],account:z.walletClient.account||z.address,chain:n||null}),te=u?await sn(V,P,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d},u):await O.execute(V,P,[],{timeout:p,confirmations:1,onSubmitted:g,onConfirmed:h,signal:d}),oe={appAddress:C,allow:s,transactionHash:te.receipt.transactionHash,blockNumber:te.receipt.blockNumber,gasUsed:te.receipt.gasUsed};return t?.schema===!1?oe:(t?.schema||$C).parse(oe)}async function ml(e,t){try{return{success:!0,data:await DC(e,t)}}catch(r){let n=r instanceof Error?r.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:n,status:500,detail:n}}}}var gA=Cr.object({appAddress:Cr.string(),owner:Cr.string(),allowAnyDevice:Cr.boolean(),devices:Cr.array(Cr.string())});async function Qn(e){let{chain:t,rpcUrl:r,appAddress:n,deviceIds:o,publicClient:a}=e,s=n.startsWith("0x")?n:`0x${n}`,c=a||(()=>{if(!t)throw new Error("Chain is required when publicClient is not provided");return RC({chain:t,transport:MC(r)})})(),[l,m]=await Promise.all([c.readContract({address:s,abi:Ir,functionName:"allowAnyDevice"}),c.readContract({address:s,abi:Ir,functionName:"owner"})]);if(l)return{appAddress:s,owner:m,allowAnyDevice:!0,devices:o.map(u=>wt(u))};let p;if(o.length===0)p=[];else{let u=o.map(f=>({address:s,abi:Ir,functionName:"allowedDeviceIds",args:[wt(f)]})),d=await c.multicall({contracts:u});p=o.map((f,g)=>({deviceId:wt(f),allowed:d[g]?.status==="success"&&d[g]?.result===!0})).filter(f=>f.allowed).map(f=>f.deviceId)}return{appAddress:s,owner:m,allowAnyDevice:!1,devices:p}}var TC=Gc;var LC=wr.object({items:wr.array(TC),total:wr.number(),page:wr.number(),page_size:wr.number(),pages:wr.number()}).passthrough(),{action:CA,safeAction:pl}=M(LC,async(e,t)=>{let{teamSlug:r,page:n,pageSize:o}=t,a=new URLSearchParams;n!==void 0&&a.append("page",n.toString()),o!==void 0&&a.append("page_size",o.toString());let s=a.toString()?`/workspaces/${r}/nodes?${a.toString()}`:`/workspaces/${r}/nodes`;return await e.get(s)}),kr=ot.object({limit:ot.number(),remaining:ot.number()}).passthrough(),NC=ot.object({vm_slots:kr,vcpu:kr,memory_mb:kr,disk_gb:kr}).passthrough(),UC=ot.object({gpus:kr,in_use:ot.number(),misconfigured:ot.number()}).passthrough(),OC=ot.object({team_slug:ot.string(),tier:ot.string(),quotas:NC,reserved_nodes:kr,reserved_gpu:UC,as_of:ot.string()}).passthrough(),{action:_A,safeAction:SA}=M(OC,async(e,t)=>await e.get(`/workspaces/${t.teamSlug}/quotas`)),jC=ft(Xe.extend({node_id:FC.number().optional()})),{action:EA,safeAction:IA}=M(nn,async(e,t)=>{let r=jC.parse(t),{cvmId:n}=G.parse(r),{node_id:o}=r;return await e.post(`/cvms/${n}/replicas`,{node_id:o})}),xA=_r.object({target:_r.string().describe("Target status to wait for (e.g., 'running', 'stopped')"),interval:_r.number().min(5).max(30).default(5).describe("Polling interval in seconds"),timeout:_r.number().min(10).max(600).default(300).describe("Timeout per attempt in seconds"),maxRetries:_r.number().min(0).default(Number.POSITIVE_INFINITY).describe("Maximum number of retry attempts (Infinity for unlimited)"),retryDelay:_r.number().min(0).default(5e3).describe("Delay between retries in milliseconds")});var ul=nt.object({cvm_id:nt.number().int(),identifier:nt.string(),status:nt.enum(["updated","unchanged","skipped","conflict","error"]),old_instance_id:nt.string().nullable().optional(),new_instance_id:nt.string().nullable().optional(),source:nt.enum(["teepod_state","teepod_info","gateway","none"]),verified_with_gateway:nt.boolean(),reason:nt.string().nullable().optional()}),VC=ft(Xe.extend({overwrite:nt.boolean().optional(),dry_run:nt.boolean().optional()})),{action:$A,safeAction:DA}=M(ul,async(e,t)=>{let r=VC.parse(t),{cvmId:n}=G.parse(r),{overwrite:o,dry_run:a}=r;return await e.patch(`/cvms/${n}/instance-id`,{overwrite:o,dry_run:a})}),zC=_e.object({cvm_ids:_e.array(_e.string()).optional(),running_only:_e.boolean().optional(),missing_only:_e.boolean().optional(),overwrite:_e.boolean().optional(),limit:_e.number().int().min(1).max(500).optional(),dry_run:_e.boolean().optional()}).strict(),KC=_e.object({total:_e.number().int(),scanned:_e.number().int(),updated:_e.number().int(),unchanged:_e.number().int(),skipped:_e.number().int(),conflicts:_e.number().int(),errors:_e.number().int(),items:_e.array(ul)}),{action:MA,safeAction:TA}=M(KC,async(e,t)=>{let r=zC.parse(t);return await e.patch("/cvms/instance-ids",r)}),GC=Le.object({vm_uuid:Le.string(),status:Le.string(),uptime:Le.string().nullable().optional(),in_progress:Le.boolean(),boot_progress:Le.string().nullable().optional(),boot_error:Le.string().nullable().optional(),operation_type:Le.string().nullable().optional(),operation_started_at:Le.string().nullable().optional(),correlation_id:Le.string().nullable().optional()}),HC=Le.record(Le.string(),GC),qC=Le.object({vmUuids:Le.array(Le.string())}),{action:NA,safeAction:dl}=M(HC,async(e,t)=>{let{vmUuids:r}=qC.parse(t);return await e.post("/status/batch",{vm_uuids:r})}),BC=Xr.object({hostname:Xr.string().nullable().optional(),ssh_authorized_keys:Xr.array(Xr.string()).default([]),default_gateway_domain:Xr.string().nullable().optional()}),WC=G,{action:OA,safeAction:fl}=M(BC,async(e,t)=>{let{cvmId:r}=WC.parse(t);return await e.get(`/cvms/${r}/user_config`)}),JC=Be.object({page:Be.number().int().min(1).optional(),page_size:Be.number().int().min(1).max(100).optional(),search:Be.string().optional(),status:Be.array(Be.string()).optional(),listed:Be.boolean().optional(),base_image:Be.string().optional(),instance_type:Be.string().optional(),kms_slug:Be.string().optional(),kms_type:Be.string().optional(),node:Be.string().optional(),region:Be.string().optional()}).strict();function YC(e){return e==="2025-10-28"?Bb:Zb}async function ZC(e,t){let r=JC.parse(t??{}),n=await e.get("/apps",{params:r});return YC(e.config.version).parse(n)}async function gl(e,t){try{return{success:!0,data:await ZC(e,t)}}catch(r){return r&&typeof r=="object"&&("status"in r||"issues"in r)?{success:!1,error:r}:{success:!1,error:{name:"Error",message:r instanceof Error?r.message:String(r)}}}}var VA=$c.object({appId:$c.string().min(1)}).strict();var KA=Dc.object({appId:Dc.string().min(1)}).strict();var XC=Ue.object({device_id:Ue.string(),node_name:Ue.string().nullable(),cvm_ids:Ue.array(Ue.number()),allowed_onchain:Ue.boolean(),status:Ue.string()}),QC=Ue.object({is_onchain_kms:Ue.boolean(),allow_any_device:Ue.boolean().nullable().optional(),chain_id:Ue.number().nullable().optional(),app_contract_address:Ue.string().nullable().optional(),devices:Ue.array(XC).optional().default([])}),ew=Ue.object({appId:Ue.string().min(1)}).strict();async function tw(e,t){let{appId:r}=ew.parse(t),n=await e.get(`/apps/${r}/device-allowlist`);return QC.parse(n)}async function eo(e,t){try{return{success:!0,data:await tw(e,t)}}catch(r){return r&&typeof r=="object"&&("status"in r||"issues"in r)?{success:!1,error:r}:{success:!1,error:{name:"Error",message:r instanceof Error?r.message:String(r)}}}}var qA=Gn.object({appId:Gn.string().min(1),page:Gn.number().int().min(1).optional(),page_size:Gn.number().int().min(1).max(1e3).optional()}).strict();var WA=Hn.object({appId:Hn.string().min(1),revisionId:Hn.string().min(1),rawComposeFile:Hn.boolean().optional()}).strict();var YA=Te.object({statuses:Te.array(Te.string()),image_versions:Te.array(Te.string()),instance_types:Te.array(Te.string()),kms_slugs:Te.array(Te.string()),kms_types:Te.array(Te.string()),regions:Te.array(Te.string()),nodes:Te.array(Te.string())});var rw=J.object({contract_address:J.string(),chain_id:J.string().nullable(),version:J.string(),url:J.string(),gateway_app_id:J.string().nullable(),gateway_app_url:J.string(),kms_type:J.string()}),Rc=J.object({app_id:J.string().optional(),instance_id:J.string().optional(),app_name:J.string().optional(),device_id:J.string().optional()}).passthrough().nullable(),nw=J.object({vm_uuid:J.string().nullable().optional(),name:J.string().optional(),instance_id:J.string().nullable().optional(),status:J.string().optional(),image_version:J.string().nullable().optional(),quote:J.string().nullable().optional(),ppid:J.string().optional(),device_id:J.string().optional(),tcb_info:Qc.nullable().optional(),app_certificates:J.array(Xc).nullable().optional(),compose_file:J.string().nullable().optional(),error:J.string().nullable().optional()}),ow=J.object({app_id:J.string(),contract_address:J.string(),kms_info:rw,instances:J.array(nw),kms_guest_agent_info:Rc,gateway_guest_agent_info:Rc,qemu_version:J.string().nullable()}),aw=J.object({appId:J.string().min(1)}).strict(),{action:XA,safeAction:QA}=M(ow,async(e,t)=>{let{appId:r}=aw.parse(t);return await e.get(`/apps/${r}/attestations`)}),sw=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function iw(e){let t={},r=e.toString();r=r.replace(/\r\n?/gm,`
23
- `);let n;for(;(n=sw.exec(r))!=null;){let o=n[1];if(!o)continue;let a=n[2]||"";a=a.trim();let s=a[0];a=a.replace(/^(['"`])([\s\S]*)\1$/gm,"$2"),s==='"'&&(a=a.replace(/\\n/g,`
24
- `),a=a.replace(/\\r/g,"\r")),t[o]=a}return t}function $r(e){let t=iw(e),r=[];for(let[n,o]of Object.entries(t))r.push({key:n,value:o});return r}function to(e){return e.split(/[\s-]+/).filter(Boolean).map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function hl(e){return e===void 0?[]:Array.isArray(e)?[...e]:[e]}function yl(e,t){let r={};for(let c of t.flagConfig.descriptors.values()){let l=t.flags[c.canonicalKey];l!==void 0&&(r[c.target]=l)}for(let c of t.flagConfig.negatedLookup.values())c.negatedKey&&t.flags[c.negatedKey]&&(r[c.target]=!1);t.passThrough.length>0&&(r["--"]=t.passThrough);let n={},o=e.arguments??[],a=[...t.positionals],s=0;for(let c of o){let l=c.target??to(c.name);if(c.variadic){n[l]=a.slice(s),s=a.length;break}a[s]!==void 0&&(n[l]=a[s]),s+=1}return{options:r,positionals:n,raw:{flags:t.flags,positionals:t.positionals}}}import fw from"arg";var mw={name:"help",shorthand:"h",description:"Show help information for the current command",type:"boolean",target:"help"},pw={name:"version",shorthand:"v",description:"Show CLI version",type:"boolean",target:"version"},N={name:"interactive",shorthand:"i",description:"Enable interactive mode",type:"boolean",target:"interactive",group:"basic"},vl={name:"api-token",description:"API token used for authentication",type:"string",target:"apiToken",aliases:["api-key"],argumentName:"token",group:"basic"},Ee={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json",group:"basic"},uw={name:"api-version",description:"API version to use (e.g. 2025-10-28, 2026-01-21)",type:"string",target:"apiVersion",group:"advanced"},Xt=[mw,pw,vl,Ee,uw],jt=[vl],B={name:"cvm_id",description:"CVM identifier (UUID, app_id, instance_id, or name)",required:!1,target:"cvmId"},Dr={name:"cvm-id",description:"CVM identifier (UUID, app_id, instance_id, or name)",type:"string",target:"cvmId"},bl={name:"uuid",description:"[DEPRECATED] Use --cvm-id instead. CVM UUID.",type:"string",target:"cvmId",deprecated:!0,group:"deprecated"};import Cl from"arg";function wl(e){let t={},r=new Map,n=new Map;if(!e)return{spec:t,descriptors:r,negatedLookup:n};for(let o of e){let a=`--${o.name}`,s=o.target??to(o.name),c=dw(o.type);r.set(a,{option:o,canonicalKey:a,target:s,negatedKey:o.negatedName?`--${o.negatedName}`:void 0}),t[a]=c,o.shorthand&&(t[`-${o.shorthand}`]=a);for(let l of hl(o.aliases))t[`--${l}`]=a;if(o.negatedName){let l=`--${o.negatedName}`;if(o.type!=="boolean")throw new Error(`Negated option is only supported for boolean types: ${o.name}`);t[l]=Cl.flag(()=>!0),n.set(l,{option:o,canonicalKey:a,target:s,negatedKey:l})}}return{spec:t,descriptors:r,negatedLookup:n}}function dw(e){switch(e){case"string":return(t="")=>t;case"number":return(t,r)=>{let n=Number(t);if(Number.isNaN(n))throw new Error(`Invalid value for ${r}: expected a number.`);return n};case"boolean":return Cl.flag(()=>!0);case"string[]":return(t,r,n)=>{let o=Array.isArray(n)?[...n]:[];if(t==="")throw new Error(`Option ${r} expects a value.`);return o.push(t),o};case"number[]":return(t,r,n)=>{let o=Array.isArray(n)?[...n]:[],a=Number(t);if(Number.isNaN(a))throw new Error(`Invalid value for ${r}: expected a number.`);return o.push(a),o};default:throw new Error(`Unsupported option type: ${e}`)}}function gw(e){let t=e.indexOf("--");return t===-1?[[...e],[]]:[e.slice(0,t),e.slice(t+1)]}function cn(e,t,r={}){let n=[...Xt,...t?[...t]:[]],o=wl(n),{permissive:a=!1,stopAtPositional:s=!1}=r,[c,l]=gw(e),m=fw(o.spec,{argv:c,permissive:a,stopAtPositional:s}),{_:p,...u}=m;return{positionals:p??[],flags:u,flagConfig:o,passThrough:l}}function ro(e){return e==="unstable"?" [UNSTABLE]":e==="deprecated"?" [DEPRECATED]":""}function oo(e){let{registry:t,executableName:r}=e,n=[];n.push(`Usage: ${r} <command> [options]`),n.push("");let o=t.getChildren(),a=l=>{switch(l){case"deploy":return"Deploy:";case"manage":return"Manage:";case"cvm-ops":return"CVM operations:";case"profile":return"Profile / auth:";case"advanced":return"Advanced:";case"deprecated":return"Deprecated:"}},s=["deploy","manage","cvm-ops","profile","advanced","deprecated"],c=l=>{let m=l.command?.meta??l.group?.meta;if(m?.category)return m.category;let p=l.name??"";return m?.stability==="deprecated"?"deprecated":p==="nodes"||p==="deploy"?"deploy":p==="apps"||p==="cvms"||p==="link"||p==="simulator"?"manage":p==="ssh"||p==="cp"||p==="ps"||p==="logs"?"cvm-ops":p==="login"||p==="logout"||p==="switch"||p==="status"?"profile":p==="api"||p==="self"?"advanced":p==="auth"||p==="config"||p==="docker"?"deprecated":"advanced"};for(let l of s){let m=o.filter(p=>c(p)===l).sort((p,u)=>(p.name??"").localeCompare(u.name??""));if(m.length!==0){n.push(a(l));for(let p of m){let u=p.command?.meta??p.group?.meta,d=(u?.description??"").split(`
25
- `)[0],f=u?.stability,g=f?ro(f):"",h=p.name??"",v=u?.aliases,w=v?.length?`${h} (${v.join(", ")})`:h;n.push(` ${w.padEnd(18)}${d}${g}`.trimEnd())}n.push("")}}n.push(""),n.push("Global options:");for(let l of Xt){let m=no(l),p=Math.max(24,m.length+2);n.push(` ${m.padEnd(p)}${l.description??""}`.trimEnd())}return n.join(`
26
- `)}function _l(e){let{registry:t,executableName:r,groupPath:n}=e,o=t.getNode(n);if(!o?.group)return oo({registry:t,executableName:r});let a=[],s=n.join(" "),c=`${r} ${s}`;a.push(`Usage: ${c} <command> [options]`),a.push(""),o.group.meta.description&&(a.push(o.group.meta.description),a.push(""));let l=t.getChildren(n);if(l.length>0){a.push("Available commands:");for(let m of l){let p=m.command?.meta??m.group?.meta,u=(p?.description??"").split(`
27
- `)[0],d=p?.stability,f=d?ro(d):"",g=m.name??"",h=p?.aliases,v=h?.length?`${g} (${h.join(", ")})`:g;a.push(` ${v.padEnd(18)}${u}${f}`.trimEnd())}a.push("")}a.push("Global options:");for(let m of Xt){let p=no(m),u=Math.max(24,p.length+2);a.push(` ${p.padEnd(u)}${m.description??""}`.trimEnd())}return a.join(`
28
- `)}function os(e){let{executableName:t,definition:r,registry:n}=e,o=hw({executableName:t,definition:r}),a=ro(r.meta.stability),s=[o,"",`${r.meta.description}${a}`],c=r.meta.arguments??[];if(c.length>0){s.push(""),s.push("Arguments:");for(let g of c){let h=vw(g);s.push(` ${h.padEnd(18)}${g.description??""}`.trimEnd())}}let l=[...r.meta.options??[]],m=Xt.filter(g=>!g.hidden),p=l.filter(g=>!g.hidden),u=new Set(Xt.map(g=>g.name)),d=p.filter(g=>!u.has(g.name));if(m.length>0){let g=new Set(d.map(h=>h.shorthand).filter(h=>typeof h=="string"&&h.length>0));s.push(""),s.push("Global options:");for(let h of m){let v=!h.shorthand||!g.has(h.shorthand),w=no(h,{includeShorthand:v}),C=Math.max(24,w.length+2);s.push(` ${w.padEnd(C)}${h.description??""}`.trimEnd())}}if(d.length>0){let g=C=>C.group==="deprecated"||C.deprecated?!0:(C.description??"").includes("[DEPRECATED]"),h=C=>C.group?C.group:g(C)?"deprecated":"basic",v={basic:[],advanced:[],deprecated:[]};for(let C of d)v[h(C)].push(C);let w=(C,_)=>{if(_.length!==0){s.push(""),s.push(C);for(let S of _){let E=no(S),x=Math.max(24,E.length+2);s.push(` ${E.padEnd(x)}${S.description??""}`.trimEnd())}}};w("Basic options:",v.basic),w("Advanced options:",v.advanced),w("Deprecated options:",v.deprecated)}if(r.meta.passThrough&&(s.push(""),s.push("Pass-through (after --):"),s.push(` ${r.meta.passThrough.description}`),r.meta.passThrough.examples&&r.meta.passThrough.examples.length>0)){s.push(""),s.push(" Examples:");for(let g of r.meta.passThrough.examples)s.push(` ${g}`)}if(r.meta.examples&&r.meta.examples.length>0){s.push(""),s.push("Examples:");for(let g of r.meta.examples)s.push(` # ${g.name}`),s.push(` ${g.value}`)}let f=n.getChildren(r.path);if(f.length>0){s.push(""),s.push("Subcommands:");for(let g of f){let h=g.command?.meta??g.group?.meta,v=(h?.description??"").split(`
29
- `)[0],w=h?.stability,C=w?ro(w):"",_=g.name??"",S=h?.aliases,E=S?.length?`${_} (${S.join(", ")})`:_;s.push(` ${E.padEnd(18)}${v}${C}`.trimEnd())}}return s.join(`
30
- `)}function hw({executableName:e,definition:t}){let r=[e,...t.path],o=(t.meta.arguments??[]).map(m=>yw(m)).join(" "),s=(t.meta.options?.length??0)>0?" [options]":"",c=o?` ${o}`:"",l=t.meta.passThrough?" [--] [...]":"";return`Usage: ${r.join(" ")}${s}${c}${l}`}function yw(e){let t=`<${e.name}>`;return e.variadic?`${t}...`:e.required===!1?`[${t}]`:t}function vw(e){return e.variadic?`<${e.name}...>`:e.required===!1?`<${e.name}>?`:`<${e.name}>`}function no(e,{includeShorthand:t=!0}={}){let r=[];t&&e.shorthand&&r.push(`-${e.shorthand}`);let n=`--${e.name}`;if(e.argumentName?n+=` ${e.argumentName.toUpperCase()}`:e.type!=="boolean"&&(n+=" <value>"),r.push(n),e.aliases&&e.aliases.length>0)for(let o of e.aliases){let a=`--${o}`;e.argumentName?a+=` ${e.argumentName.toUpperCase()}`:e.type!=="boolean"&&(a+=" <value>"),r.push(a)}return e.type==="boolean"&&e.negatedName&&r.push(`--${e.negatedName}`),r.join(", ")}var Sl;function kl(e){return Yt.includes(e)}function El(e){Sl=e}function as(){return Sl}var ss=!1;function ln(e){ss=e}function ne(){return ss}function is(){return!ss}import _w from"path";import ao from"fs-extra";import Al from"@iarna/toml";import{z as at}from"zod";import Oe from"chalk";import bw from"ora";function Cw(e,t){let r=e.split(/\s+/),n=[],o="";for(let a of r){let s=o.length===0?a:`${o} ${a}`;s.length<=t?o=s:(o.length>0&&n.push(o),o=a)}return o.length>0&&n.push(o),n}function ww(e,t){if(e.length<=t)return[e];let r=[],n=0;for(;n<e.length;)r.push(e.slice(n,n+t)),n+=t;return r}function Il(e,t){let r=[];for(let n of e.split(`
31
- `)){if(n.length<=t){r.push(n);continue}if(n.indexOf(" ")===-1){r.push(...ww(n,t));continue}let o=Cw(n,t);r.push(...o)}if(r.length===0){let n=e.trim();r.push(n)}return r}var i={error:(e,...t)=>{ne()||(process.stderr.write(`${Oe.red("\u2717")} ${Oe.red(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
32
- `))},warn:(e,...t)=>{ne()||(process.stderr.write(`${Oe.yellow("\u26A0")} ${Oe.yellow(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
33
- `))},info:(e,...t)=>{ne()||(process.stderr.write(`${Oe.blue("\u2139")} ${Oe.blue(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
34
- `))},success:(e,...t)=>{ne()||(process.stderr.write(`${Oe.green("\u2713")} ${Oe.green(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
35
- `))},debug:(e,...t)=>{ne()||process.env.DEBUG&&(process.stderr.write(`${Oe.gray("\u{1F50D}")} ${Oe.gray(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
36
- `))},table:(e,t)=>{if(!ne()){if(e.length===0){console.log(Oe.yellow("No data to display"));return}if(t){let r;typeof t[0]=="string"?r=t.map(s=>({key:s,header:s})):r=t;let n={};for(let s of r){let c=s.header||String(s.key);n[String(s.key)]=c.length}for(let s of e)for(let c of r){let l=String(typeof c.key=="string"&&!(c.key in s)?"":s[String(c.key)]??"");n[String(c.key)]=Math.max(n[String(c.key)],l.length)}let o=[];for(let s of r){let c=s.header||String(s.key);o.push(Oe.bold(c.padEnd(n[String(s.key)])))}console.log(o.join(" "));let a=[];for(let s of r)a.push("-".repeat(n[String(s.key)]));console.log(a.join(" "));for(let s of e){let c=[];for(let l of r){let m=String(typeof l.key=="string"&&!(l.key in s)?"":s[String(l.key)]??"");c.push(m.padEnd(n[String(l.key)]))}console.log(c.join(" "))}}else{let r=e[0],n=Object.keys(r),o={};for(let c of n)o[c]=c.length;for(let c of e)for(let l of n){let m=String(c[l]??"");o[l]=Math.max(o[l],m.length)}let a=[];for(let c of n)a.push(Oe.bold(c.padEnd(o[c])));console.log(a.join(" "));let s=[];for(let c of n)s.push("-".repeat(o[c]));console.log(s.join(" "));for(let c of e){let l=[];for(let m of n){let p=String(c[m]??"");l.push(p.padEnd(o[m]))}console.log(l.join(" "))}}}},keyValueTable:(e,t)=>{if(ne())return;let{borderStyle:r="single",keyColor:n=Oe.blue,valueColor:o=Oe.white,maxWidth:a=process.stdout.columns||80}=t||{},c={single:{topLeft:"\u250C",topRight:"\u2510",bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",vertical:"\u2502",cross:"\u253C",leftT:"\u251C",rightT:"\u2524"},double:{topLeft:"\u2554",topRight:"\u2557",bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",vertical:"\u2551",cross:"\u256C",leftT:"\u2560",rightT:"\u2563"},rounded:{topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",vertical:"\u2502",cross:"\u253C",leftT:"\u251C",rightT:"\u2524"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomLeft:"\u2517",bottomRight:"\u251B",horizontal:"\u2501",vertical:"\u2503",cross:"\u254B",leftT:"\u2523",rightT:"\u252B"},none:{topLeft:"",topRight:"",bottomLeft:"",bottomRight:"",horizontal:"",vertical:"",cross:"",leftT:"",rightT:""}}[r],l=0,m=0;for(let[g,h]of Object.entries(e)){l=Math.max(l,g.length);let v=String(h??"");m=Math.max(m,v.length)}let p=4,u=1,d=a-p-u;if(l+m>d){let g=l/(l+m);l=Math.floor(d*g),m=d-l}let f=l+m+p+u;r!=="none"&&console.log(c.topLeft+c.horizontal.repeat(f-2)+c.topRight);for(let[g,h]of Object.entries(e)){let v=g,w=String(h??""),C=Il(v,l),_=Il(w,m),S=Math.max(C.length,_.length);for(;C.length<S;)C.push("");for(;_.length<S;)_.push("");for(let E=0;E<S;E++){let x=C[E].padEnd(l),P=_[E].padEnd(m);console.log(r!=="none"?`${c.vertical} ${n(x)} ${c.vertical} ${o(P)} ${c.vertical}`:`${n(x)} : ${o(P)}`)}}r!=="none"&&console.log(c.bottomLeft+c.horizontal.repeat(f-2)+c.bottomRight)},break:()=>{ne()||process.stderr.write(`
37
- `)},startSpinner:e=>{if(ne())return{stop:()=>{}};let t=bw(e).start();return{stop:(r=!0,n)=>{n&&(t.text=n),r?t.succeed():t.fail()}}},logDetailedError(e,t){if(ne())return;let r=t?`[${t}] `:"",n=a=>a!==null&&typeof a=="object"&&"isRequestError"in a&&a.isRequestError===!0&&"status"in a&&"message"in a&&"data"in a,o=a=>a!==null&&typeof a=="object"&&"issues"in a&&Array.isArray(a.issues);if(n(e)){process.stderr.write(`${r}HTTP ${e.status}: ${e.message}
24
+ `,y,b,Wc(h.status,h.statusText,h.headers,h._data))}m&&m({request:u,response:h,options:g})}})}get raw(){return this.fetchInstance}on(t,n){this.emitter.on(t,n)}off(t,n){this.emitter.off(t,n)}once(t,n){let r=o=>{n(o),this.emitter.off(t,r)};this.emitter.on(t,r)}async request(t,n){try{let r=n?.method||"GET";return await this.fetchInstance(t,{...n,method:r})}catch(r){let o=this.convertToRequestError(r);throw this.emitError(o)}}async requestFull(t,n){try{let r=n?.method||"GET",o=await this.fetchInstance.raw(t,{...n,method:r,ignoreResponseError:!0});return{status:o.status,statusText:o.statusText,headers:o.headers,data:o._data,ok:o.ok}}catch(r){let o=this.convertToRequestError(r);throw this.emitError(o)}}async get(t,n){try{return await this.fetchInstance(t,{...n,method:"GET"})}catch(r){let o=this.convertToRequestError(r);throw this.emitError(o)}}buildRequestOptions(t,n,r){let o={...r,method:t,body:n};if(n instanceof FormData){let a=o.headers;o.headers={...a,"Content-Type":""}}return o}async post(t,n,r){try{return await this.fetchInstance(t,this.buildRequestOptions("POST",n,r))}catch(o){let a=this.convertToRequestError(o);throw this.emitError(a)}}async put(t,n,r){try{return await this.fetchInstance(t,this.buildRequestOptions("PUT",n,r))}catch(o){let a=this.convertToRequestError(o);throw this.emitError(a)}}async patch(t,n,r){try{return await this.fetchInstance(t,this.buildRequestOptions("PATCH",n,r))}catch(o){let a=this.convertToRequestError(o);throw this.emitError(a)}}async delete(t,n){try{return await this.fetchInstance(t,{...n,method:"DELETE"})}catch(r){let o=this.convertToRequestError(r);throw this.emitError(o)}}convertToRequestError(t){return t&&typeof t=="object"&&"data"in t?ss.fromFetchError(t):t instanceof Error?ss.fromError(t):new ss("Unknown error occurred",{detail:"Unknown error occurred"})}emitError(t){let n=Oy(t);return this.emitter.emit("error",n),n}async safeRequest(t){try{return{success:!0,data:await t()}}catch(n){if(n instanceof yt)return{success:!1,error:n};let r=this.convertToRequestError(n);return this.emitError(r),{success:!1,error:r}}}async safeGet(t,n){return this.safeRequest(()=>this.get(t,n))}async safePost(t,n,r){return this.safeRequest(()=>this.post(t,n,r))}async safePut(t,n,r){return this.safeRequest(()=>this.put(t,n,r))}async safePatch(t,n,r){return this.safeRequest(()=>this.patch(t,n,r))}async safeDelete(t,n){return this.safeRequest(()=>this.delete(t,n))}async safeRequestMethod(t,n){return this.safeRequest(()=>this.request(t,n))}async safeRequestFull(t,n){return this.safeRequest(()=>this.requestFull(t,n))}withVersion(t){return new bl({...this.config,version:t})}extend(t){let n=typeof t=="function"?t(this):t,r=Object.create(this);for(let[o,a]of Object.entries(n))typeof a=="function"&&(r[o]=(...s)=>a(this,...s));return r}};function Ky(e={}){return new zy(e)}var Gy=me.object({username:me.string(),email:me.string(),role:me.enum(["admin","user"]),avatar:me.string(),email_verified:me.boolean(),totp_enabled:me.boolean(),has_backup_codes:me.boolean(),flag_has_password:me.boolean()}).passthrough(),qy=me.object({id:me.string(),name:me.string(),slug:me.string().nullable(),tier:me.string(),role:me.string(),avatar:me.string().nullable().optional()}).passthrough(),By=me.object({balance:me.string().or(me.number()),granted_balance:me.string().or(me.number()),is_post_paid:me.boolean(),outstanding_amount:me.string().or(me.number()).nullable()}).passthrough(),Wy=me.object({user:Gy,workspace:qy,credits:By}).passthrough(),Jy=Xt.object({username:Xt.string(),email:Xt.string(),credits:Xt.number(),granted_credits:Xt.number(),avatar:Xt.string(),team_name:Xt.string(),team_tier:Xt.string()}).passthrough();function Yy(e){return e==="2025-10-28"?Jy:Wy}async function wl(e,t){let n=await e.get("/auth/me");return t?.schema===!1?n:(t?.schema||Yy(e.config.version)).parse(n)}async function Oe(e,t){try{return{success:!0,data:await wl(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var $o={[Zc.id]:Zc,[Yc.id]:Yc,[Jc.id]:Jc},Zy=Qt.object({id:Qt.string(),slug:Qt.string().nullable(),url:Qt.string(),version:Qt.string(),chain_id:Qt.number().nullable(),kms_contract_address:Qt.string().nullable().transform(e=>e),gateway_app_id:Qt.string().nullable().transform(e=>e)}).passthrough(),Ct=Zy.transform(e=>{if(e.chain_id!=null){let t=$o[e.chain_id];if(t)return{...e,chain:t}}return e});function _l(e){if(e?.schema!==void 0&&e?.schema!==!1&&(typeof e.schema!="object"||e.schema===null||!("parse"in e.schema)||typeof e.schema.parse!="function"))throw new Error("Invalid schema: must be a Zod schema object, false, or undefined")}function kl(e){if(e?.schema!==void 0&&e?.schema!==!1&&(typeof e.schema!="object"||e.schema===null||!("parse"in e.schema)||typeof e.schema.parse!="function"))return{success:!1,error:{name:"ZodError",message:"Invalid schema: must be a Zod schema object, false, or undefined",issues:[{code:"invalid_type",expected:"object",received:typeof e.schema,path:["schema"],message:"Invalid schema: must be a Zod schema object, false, or undefined"}]}}}function Sl(e,t){function n(s,i){return r(s,i)}async function r(s,i){_l(i);let l=await t(s);return i?.schema===!1?l:(i?.schema||e).parse(l)}function o(s,i){return a(s,i)}async function a(s,i){let l=kl(i);if(l)return l;let p=await(async()=>{try{return{success:!0,data:await t(s)}}catch(d){return d&&typeof d=="object"&&"status"in d?{success:!1,error:d}:d&&typeof d=="object"&&"issues"in d?{success:!1,error:d}:{success:!1,error:{name:"Error",message:d instanceof Error?d.message:String(d)}}}})();return p.success?i?.schema===!1?{success:!0,data:p.data}:(i?.schema||e).safeParse(p.data):p}return{action:n,safeAction:o}}function x(e,t){function n(s,...i){let[l,p]=i;return r(s,l,p)}async function r(s,i,l){_l(l);let p=await t(s,i);return l?.schema===!1?p:(l?.schema||e).parse(p)}function o(s,...i){let[l,p]=i;return a(s,l,p)}async function a(s,i,l){let p=kl(l);if(p)return p;let m=await(async()=>{try{return{success:!0,data:await t(s,i)}}catch(f){return f&&typeof f=="object"&&"status"in f?{success:!1,error:f}:f&&typeof f=="object"&&"issues"in f?{success:!1,error:f}:{success:!1,error:{name:"Error",message:f instanceof Error?f.message:String(f)}}}})();return m.success?l?.schema===!1?{success:!0,data:m.data}:(l?.schema||e).safeParse(m.data):m}return{action:n,safeAction:o}}var Xy=K.object({name:K.string(),is_dev:K.boolean(),version:K.union([K.tuple([K.number(),K.number(),K.number()]),K.tuple([K.number(),K.number(),K.number(),K.number()])]),os_image_hash:K.string().nullable().optional()}).passthrough(),Qy=K.object({teepod_id:K.number(),name:K.string(),listed:K.boolean(),resource_score:K.number(),remaining_vcpu:K.number(),remaining_memory:K.number(),remaining_cvm_slots:K.number(),images:K.array(Xy),support_onchain_kms:K.boolean().optional(),fmspc:K.string().nullable().optional(),device_id:K.string().nullable().optional(),region_identifier:K.string().nullable().optional(),default_kms:K.string().nullable().optional(),kms_list:K.array(K.string()).default([])}).passthrough(),ev=K.object({max_instances:K.number().nullable().optional(),max_vcpu:K.number().nullable().optional(),max_memory:K.number().nullable().optional(),max_disk:K.number().nullable().optional()}).passthrough(),tv=K.object({tier:K.string(),capacity:ev,nodes:K.array(Qy),kms_list:K.array(Ct)}).passthrough(),{action:nv,safeAction:bt}=Sl(tv,async e=>await e.get("/teepods/available")),El=Ce.object({id:Ce.string(),name:Ce.string(),description:Ce.string(),vcpu:Ce.number(),memory_mb:Ce.number(),hourly_rate:Ce.string(),requires_gpu:Ce.boolean(),default_disk_size_gb:Ce.number().default(20),family:Ce.string().nullable()}).passthrough(),rv=Ce.object({name:Ce.string(),items:Ce.array(El),total:Ce.number()}).strict(),ov=Ce.object({result:Ce.array(rv)}).strict(),av=Ce.object({items:Ce.array(El),total:Ce.number(),family:Ce.string()}).strict(),sv=Ce.object({family:Ce.string()}).strict(),{action:fs,safeAction:iv}=x(ov,async e=>await e.get("/instance-types")),{action:gs,safeAction:cv}=x(av,async(e,t)=>{let n=sv.parse(t);return await e.get(`/instance-types/${n.family}`)}),Il=He.object({id:He.string(),name:He.string(),slug:He.string().nullable(),tier:He.string(),role:He.string(),is_default:He.boolean(),created_at:He.string(),confidential_models_enabled:He.boolean().optional()}).passthrough(),lv=He.object({has_more:He.boolean(),next_cursor:He.string().nullable(),total:He.number().nullable()}).passthrough(),mv=He.object({data:He.array(Il),pagination:lv}).passthrough(),{action:pv,safeAction:dv}=x(mv,async(e,t)=>{let n=new URLSearchParams;t?.cursor&&n.append("cursor",t.cursor),t?.limit&&n.append("limit",t.limit.toString());let r=n.toString()?`/workspaces?${n.toString()}`:"/workspaces";return await e.get(r)}),{action:uv,safeAction:fv}=x(Il,async(e,t)=>await e.get(`/workspaces/${t}`)),gv=A.object({id:A.string(),name:A.string(),status:A.string(),uptime:A.string(),app_url:A.string().nullable(),app_id:A.string(),instance_id:A.string().nullable(),configuration:A.any().optional(),exited_at:A.string().nullable(),boot_progress:A.string().nullable(),boot_error:A.string().nullable(),shutdown_progress:A.string().nullable(),image_version:A.string().nullable()}),hv=A.object({id:A.number(),username:A.string()}),Al=A.object({id:A.number(),name:A.string(),region_identifier:A.string().nullable().optional()}),hs=A.object({vcpu:A.number(),memory:A.number(),disk_size:A.number(),gpu_count:A.number().default(0)}),ys=A.object({app:A.string(),instance:A.string()}),Pl=A.object({hosted:gv,name:A.string(),managed_user:hv.nullable(),node:Al.nullable(),listed:A.boolean().default(!1),status:A.string(),in_progress:A.boolean().default(!1),dapp_dashboard_url:A.string().nullable(),syslog_endpoint:A.string().nullable(),allow_upgrade:A.boolean().default(!1),project_id:A.string().nullable(),project_type:A.string().nullable(),billing_period:A.string().nullable(),kms_info:Ct.nullable(),vcpu:A.number().nullable(),memory:A.number().nullable(),disk_size:A.number().nullable(),gateway_domain:A.string().nullable(),public_urls:A.array(ys),machine_info:hs.nullable().optional(),updated_at:A.string().nullable().optional()}),$l=A.object({id:A.number(),name:A.string(),status:A.string(),in_progress:A.boolean().optional().default(!1),teepod_id:A.number().nullable(),teepod:Al.optional().nullable(),app_id:A.string(),vm_uuid:A.string().nullable(),instance_id:A.string().nullable(),vcpu:A.number(),memory:A.number(),disk_size:A.number(),base_image:A.string().nullable(),encrypted_env_pubkey:A.string().nullable(),listed:A.boolean().optional().default(!1),project_id:A.string().optional().nullable(),project_type:A.string().optional().nullable(),instance_type:A.string().optional().nullable(),public_sysinfo:A.boolean().optional().default(!1),public_logs:A.boolean().optional().default(!1),dapp_dashboard_url:A.string().optional().nullable(),syslog_endpoint:A.string().optional().nullable(),kms_info:Ct.optional().nullable(),contract_address:A.string().optional().nullable(),deployer_address:A.string().optional().nullable(),scheduled_delete_at:A.string().optional().nullable(),public_urls:A.array(ys).optional().default([]),gateway_domain:A.string().optional().nullable(),machine_info:hs.optional().nullable(),updated_at:A.string().optional().nullable()}),yv=A.object({items:A.array(Pl),total:A.number(),page:A.number(),page_size:A.number(),pages:A.number()}),vv=P.enum(["skip","hourly","monthly"]),Cv=P.enum(["phala","ethereum","base","legacy"]),vs=P.object({object_type:P.literal("user"),id:P.string().nullable().optional(),username:P.string().nullable().optional(),avatar_url:P.string().nullable().optional()}),Cs=P.object({object_type:P.literal("workspace"),id:P.string(),name:P.string(),slug:P.string().nullable().optional(),avatar_url:P.string().nullable().optional()}),bv=P.object({instance_type:P.string().nullable().optional(),vcpu:P.number().int().nullable().optional(),memory_in_gb:P.number().nullable().optional(),disk_in_gb:P.number().int().nullable().optional(),gpus:P.number().int().nullable().optional(),compute_billing_price:P.string().nullable().optional(),billing_period:vv.nullable().optional()}),wv=P.object({name:P.string().nullable().optional(),version:P.string().nullable().optional(),is_dev:P.boolean().nullable().optional(),os_image_hash:P.string().nullable().optional()}),_v=P.object({chain_id:P.number().int().nullable().optional(),dstack_kms_address:P.string().nullable().optional(),dstack_app_address:P.string().nullable().optional(),deployer_address:P.string().nullable().optional(),rpc_endpoint:P.string().nullable().optional(),encrypted_env_pubkey:P.string().nullable().optional()}),kv=_v.transform(e=>{if(e.chain_id!=null){let t=$o[e.chain_id];if(t)return{...e,chain:t}}return e}),Sv=P.object({target:P.string().nullable().optional(),started_at:P.string().nullable().optional(),correlation_id:P.string().nullable().optional()}),Ev=P.object({base_domain:P.string().nullable().optional(),cname:P.string().nullable().optional()}),Rl=P.object({object_type:P.literal("node"),id:P.number().int().nullable().optional(),name:P.string().nullable().optional(),region:P.string().nullable().optional(),device_id:P.string().nullable().optional(),ppid:P.string().nullable().optional(),status:P.string().nullable().optional(),version:P.string().nullable().optional()});var Tr=P.object({id:P.string(),name:P.string(),app_id:P.string().nullable().optional(),vm_uuid:P.string().nullable().optional(),instance_id:P.string().nullable().optional(),resource:bv,node_info:Rl.nullable().optional(),os:wv.nullable().optional(),kms_type:Cv.nullable().optional(),kms_info:kv.nullable().optional(),status:P.string(),progress:Sv.nullable().optional(),compose_hash:P.string().nullable().optional(),gateway:Ev,services:P.array(P.record(P.any())).optional().default([]),endpoints:P.array(ys).nullable().optional(),public_logs:P.boolean().optional(),public_sysinfo:P.boolean().optional(),public_tcbinfo:P.boolean().optional(),gateway_enabled:P.boolean().optional(),secure_time:P.boolean().optional(),listed:P.boolean().optional().default(!1),storage_fs:P.string().optional(),workspace:Cs.nullable().optional(),creator:vs.nullable().optional()}),Iv=Tr.extend({compose_file:P.union([P.record(P.any()),P.string()]).nullable().optional()}),Av=P.object({items:P.array(Tr),total:P.number(),page:P.number(),page_size:P.number(),pages:P.number()});function Xn(e){return typeof e!="string"||e.length<5||e.length>63?!1:/^[a-zA-Z](?!.*--)([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(e)}function xl(e){if(typeof e!="string")return wo();let t=e;return t=t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),t=t.replace(/_/g,"-"),t=t.replace(/[^a-z0-9\s-]/gi,"-").replace(/\s+/g,"-"),t=t.replace(/-+/g,"-").replace(/^-+/,"").replace(/-+$/,""),t.length===0||(/^\d/.test(t)&&(t=`dstack-app-${t}`),t.length<5&&(t=`dstack-app-${t}`),t=t.slice(0,63).replace(/-+$/,""),t.length===0)||!Xn(t)?wo():t}function wo(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,6);return`dstack-app-${e}-${t}`}var Ke=Hn.object({id:Hn.string().optional(),uuid:Hn.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i,"Invalid UUID format").optional(),app_id:Hn.string().optional(),instance_id:Hn.string().optional(),name:Hn.string().refine(Xn,{message:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens"}).optional()}),nt=e=>e.refine(t=>{let n=t;return!!(n.id||n.uuid||n.app_id||n.instance_id||n.name)},{message:"One of id, uuid, app_id, instance_id, or name must be provided"}),Pv=nt(Ke),H=Pv.transform(e=>{let t;if(e.id)t=e.id;else if(e.uuid)t=e.uuid;else if(e.app_id)t=e.app_id;else if(e.instance_id)t=e.instance_id;else{if(e.name)return{cvmId:e.name};throw new Error("No valid identifier provided")}let n=/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i,r=/^[0-9a-f]{40}$/i,o;return n.test(t)?o=t.replace(/-/g,""):r.test(t)?o=`app_${t}`:o=t,{cvmId:o}}),$v=H;function Rv(e){return e==="2025-10-28"?$l:Iv}async function Dl(e,t){let{cvmId:n}=$v.parse(t),r=await e.get(`/cvms/${n}`);return Rv(e.config.version).parse(r)}async function G(e,t){try{return{success:!0,data:await Dl(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var xv=zn.object({page:zn.number().int().min(1).optional(),page_size:zn.number().int().min(1).optional(),node_id:zn.number().int().min(1).optional(),teepod_id:zn.number().int().min(1).optional(),user_id:zn.string().optional()}).strict();function Dv(e){return e==="2025-10-28"?yv:Av}async function Tl(e,t){let n=xv.parse(t??{}),r=await e.get("/cvms/paginated",{params:n});return Dv(e.config.version).parse(r)}async function Lr(e,t){try{return{success:!0,data:await Tl(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var Mr=200*1024;function Ml(e,t,n){let r=new TextEncoder,o=e?r.encode(e).byteLength:0,a=t?r.encode(t).byteLength:0,s=o+a;if(s>Mr){let i=Mr/1024,l=Math.ceil(s/1024);n.addIssue({code:Pe.ZodIssueCode.custom,message:`Combined size of docker_compose_file and pre_launch_script must not exceed ${i}KB (current: ${l}KB)`})}}var Ll=Pe.object({allowed_envs:Pe.array(Pe.string()).optional(),docker_compose_file:Pe.string(),features:Pe.array(Pe.string()).optional(),name:Pe.string().optional(),manifest_version:Pe.number().optional(),kms_enabled:Pe.boolean().optional(),public_logs:Pe.boolean().optional(),public_sysinfo:Pe.boolean().optional(),tproxy_enabled:Pe.boolean().optional(),storage_fs:Pe.enum(["ext4","zfs"]).optional(),pre_launch_script:Pe.string().optional(),env_pubkey:Pe.string().optional(),salt:Pe.string().optional().nullable()}).passthrough().superRefine((e,t)=>{Ml(e.docker_compose_file,e.pre_launch_script,t)}),Tv=V.object({app_id:V.string().nullable().optional(),app_env_encrypt_pubkey:V.string().nullable().optional(),compose_hash:V.string(),kms_info:Ct.nullable().optional(),fmspc:V.string().nullable().optional(),device_id:V.string().nullable().optional(),os_image_hash:V.string().nullable().optional(),instance_type:V.string().nullable().optional(),teepod_id:V.number().nullable().optional(),node_id:V.number().nullable().optional(),kms_id:V.string().nullable().optional()}).passthrough().transform(e=>{if("teepod_id"in e&&e.teepod_id!==void 0){let{teepod_id:t,...n}=e;return{...n,node_id:t}}return e}),is="Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens",Mv=V.object({node_id:V.number().optional(),teepod_id:V.number().optional(),region:V.string().optional(),name:V.string().min(5,is).max(63,is).refine(e=>Xn(e),is),instance_type:V.string().optional(),image:V.string().optional(),vcpu:V.number().optional(),memory:V.number().optional(),disk_size:V.number().optional(),compose_file:V.object({allowed_envs:V.array(V.string()).optional(),pre_launch_script:V.string().optional(),docker_compose_file:V.string().optional(),name:V.string().optional().default(""),kms_enabled:V.boolean().optional(),public_logs:V.boolean().optional(),public_sysinfo:V.boolean().optional(),gateway_enabled:V.boolean().optional(),tproxy_enabled:V.boolean().optional(),storage_fs:V.enum(["ext4","zfs"]).optional()}).superRefine((e,t)=>{Ml(e.docker_compose_file,e.pre_launch_script,t)}),listed:V.boolean().optional(),kms_id:V.string().optional(),kms:V.enum(["PHALA","ETHEREUM","BASE"]).optional(),kms_contract:V.string().optional(),env_keys:V.array(V.string()).optional(),nonce:V.number().optional(),app_id:V.string().optional()}).passthrough().transform(e=>!e.instance_type&&!e.vcpu&&!e.memory?{...e,instance_type:"tdx.small"}:e);function Lv(e){if(!e.compose_file)return e;let t={...e.compose_file};return typeof t.gateway_enabled=="boolean"&&typeof t.tproxy_enabled=="boolean"?delete t.tproxy_enabled:typeof t.tproxy_enabled=="boolean"&&typeof t.gateway_enabled>"u"&&(t.gateway_enabled=t.tproxy_enabled,delete t.tproxy_enabled,(typeof window<"u"?window.console:globalThis.console)&&console.warn("[phala/cloud] tproxy_enabled is deprecated, please use gateway_enabled instead. See docs for migration.")),{...e,compose_file:t}}var{action:Uv,safeAction:bs}=x(Tv,async(e,t)=>{let n=Mv.parse(t),r=Lv(n),o={...r};return typeof r.node_id=="number"?(o={...r,teepod_id:r.node_id},delete o.node_id):typeof r.teepod_id=="number"&&console.warn("[phala/cloud] teepod_id is deprecated, please use node_id instead."),await e.post("/cvms/provision",o)}),Ov=B.object({id:B.number(),name:B.string(),status:B.string(),teepod_id:B.number(),teepod:B.object({id:B.number(),name:B.string()}).nullable(),user_id:B.number().nullable(),app_id:B.string().nullable(),vm_uuid:B.string().nullable(),instance_id:B.string().nullable(),app_url:B.string().nullable().default(null),base_image:B.string().nullable(),vcpu:B.number(),memory:B.number(),disk_size:B.number(),manifest_version:B.number().nullable().default(2),version:B.string().nullable().default("1.0.0"),runner:B.string().nullable().default("docker-compose"),docker_compose_file:B.string().nullable(),features:B.array(B.string()).nullable().default(["kms","tproxy-net"]),created_at:B.string(),encrypted_env_pubkey:B.string().nullable().optional(),app_auth_contract_address:B.string().nullable().optional(),deployer_address:B.string().nullable().optional()}).passthrough(),RP=B.object({encrypted_env:B.string().optional().nullable(),app_id:B.string(),compose_hash:B.string(),kms_id:B.string().optional(),contract_address:B.string().optional(),deployer_address:B.string().optional(),env_keys:B.array(B.string()).optional().nullable()}).passthrough(),{action:Nv,safeAction:Ro}=x(Ov,async(e,t)=>await e.post("/cvms",t));function ds(e){return e==null?e:Array.isArray(e)?e.map(ds):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return t[n]=ds(r),t},{}):e}function Ul(e){let t={...e};return t.runner==="bash"&&"docker_compose_file"in t?delete t.docker_compose_file:t.runner==="docker-compose"&&"bash_script"in t&&delete t.bash_script,"pre_launch_script"in t&&!t.pre_launch_script&&delete t.pre_launch_script,t}function Ol(e){let t=ds(e),n=JSON.stringify(t,null,4);return n=n.replace(/": /g,'":'),n}function Fv(e){let t=Ul(e),n=Ol(t);return jv.createHash("sha256").update(n,"utf8").digest("hex")}function Vv(e){let t=e;return{...e,getHash:()=>Fv(t),toString:()=>Ol(Ul(t))}}var Hv=Ll.transform(e=>Vv(e)),zv=H,{action:Kv,safeAction:Gv}=x(Hv,async(e,t)=>{let{cvmId:n}=zv.parse(t);return await e.get(`/cvms/${n}/compose_file`)}),qv=ft.object({id:ft.string().optional(),uuid:ft.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i).optional(),app_id:ft.string().refine(e=>!e.startsWith("app_")&&e.length===40,"app_id should be 40 characters without prefix").transform(e=>e.startsWith("app_")?e:`app_${e}`).optional(),instance_id:ft.string().refine(e=>!e.startsWith("instance_")&&e.length===40,"instance_id should be 40 characters without prefix").transform(e=>e.startsWith("instance_")?e:`instance_${e}`).optional(),app_compose:Ll,update_env_vars:ft.boolean().optional().nullable()}).refine(e=>!!(e.id||e.uuid||e.app_id||e.instance_id),"One of id, uuid, app_id, or instance_id must be provided").transform(e=>({cvmId:e.id||e.uuid||e.app_id||e.instance_id,request:{...e.app_compose,update_env_vars:e.update_env_vars},_raw:e})),Bv=ft.object({app_id:ft.string().nullable(),device_id:ft.string().nullable(),compose_hash:ft.string(),kms_info:Ct.nullable().optional(),compose_hash_registered:ft.boolean().optional().default(!1)}).passthrough(),{action:Wv,safeAction:Jv}=x(Bv,async(e,t)=>{let n=qv.parse(t);return await e.post(`/cvms/${n.cvmId}/compose_file/provision`,n.request)}),Yv=dt.object({id:dt.string().optional(),uuid:dt.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i).optional(),app_id:dt.string().refine(e=>!e.startsWith("app_")&&e.length===40,"app_id should be 40 characters without prefix").transform(e=>e.startsWith("app_")?e:`app_${e}`).optional(),instance_id:dt.string().refine(e=>!e.startsWith("instance_")&&e.length===40,"instance_id should be 40 characters without prefix").transform(e=>e.startsWith("instance_")?e:`instance_${e}`).optional(),compose_hash:dt.string().min(1,"Compose hash is required"),encrypted_env:dt.string().optional(),env_keys:dt.array(dt.string()).optional(),update_env_vars:dt.boolean().optional().nullable()}).refine(e=>!!(e.id||e.uuid||e.app_id||e.instance_id),"One of id, uuid, app_id, or instance_id must be provided").transform(e=>({cvmId:e.id||e.uuid||e.app_id||e.instance_id,compose_hash:e.compose_hash,encrypted_env:e.encrypted_env,env_keys:e.env_keys,update_env_vars:e.update_env_vars??void 0,_raw:e})),Zv=dt.any().transform(()=>{}),{action:Xv,safeAction:Qv}=x(Zv,async(e,t)=>{let n=Yv.parse(t);return await e.patch(`/cvms/${n.cvmId}/compose_file`,{compose_hash:n.compose_hash,encrypted_env:n.encrypted_env,env_keys:n.env_keys,update_env_vars:n.update_env_vars})}),eC=nt(Ke.extend({encrypted_env:xe.string().describe("Encrypted environment variables (hex string)"),env_keys:xe.array(xe.string()).optional().describe("List of allowed environment variable keys"),compose_hash:xe.string().optional().describe("Compose hash for verification (Phase 2, required when env_keys changes)"),transaction_hash:xe.string().optional().describe("On-chain transaction hash for verification (Phase 2, required when env_keys changes)")})).transform(e=>{let{cvmId:t}=H.parse(e);return{cvmId:t,request:{encrypted_env:e.encrypted_env,env_keys:e.env_keys,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),tC=xe.object({status:xe.literal("in_progress"),message:xe.string(),correlation_id:xe.string(),allowed_envs_changed:xe.boolean()}),nC=xe.object({status:xe.literal("precondition_required"),message:xe.string(),compose_hash:xe.string(),app_id:xe.string(),device_id:xe.string(),kms_info:Ct}),rC=xe.union([tC,nC]),{action:oC,safeAction:xo}=x(rC,async(e,t)=>{let n=eC.parse(t);try{return await e.patch(`/cvms/${n.cvmId}/envs`,n.request)}catch(r){if(r instanceof yt&&r.status===465){let o=r.detail;if(o&&typeof o=="object"){let a=o,s=a.details;if(s&&Array.isArray(s)){let i=new Map(s.map(f=>[f.field,f.value])),l=i.get("compose_hash"),p=i.get("app_id"),m=i.get("device_id"),d=i.get("kms_info");if(l&&p)return{status:"precondition_required",message:a.message||"Compose hash verification required",compose_hash:l,app_id:p,device_id:m||"",kms_info:d}}}}throw r}}),aC=nt(Ke.extend({docker_compose_file:Je.string().describe("Docker Compose YAML content"),compose_hash:Je.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:Je.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=H.parse(e);return{cvmId:t,request:{docker_compose_file:e.docker_compose_file,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),sC=Je.object({status:Je.literal("in_progress"),message:Je.string(),correlation_id:Je.string()}),iC=Je.object({status:Je.literal("precondition_required"),message:Je.string(),compose_hash:Je.string(),app_id:Je.string(),device_id:Je.string(),kms_info:Ct}),cC=Je.union([sC,iC]),{action:lC,safeAction:mC}=x(cC,async(e,t)=>{let n=aC.parse(t),r={"Content-Type":"text/yaml"};n.request.compose_hash&&(r["X-Compose-Hash"]=n.request.compose_hash),n.request.transaction_hash&&(r["X-Transaction-Hash"]=n.request.transaction_hash);try{return await e.patch(`/cvms/${n.cvmId}/docker-compose`,n.request.docker_compose_file,{headers:r})}catch(o){if(o instanceof yt&&o.status===465){let a=o.detail;if(a&&typeof a=="object"){let s=a,i=s.details;if(i&&Array.isArray(i)){let l=new Map(i.map(u=>[u.field,u.value])),p=l.get("compose_hash"),m=l.get("app_id"),d=l.get("device_id"),f=l.get("kms_info");if(p&&m)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:p,app_id:m,device_id:d||"",kms_info:f}}}}throw o}}),pC=nt(Ke.extend({pre_launch_script:Ye.string().describe("Pre-launch script content (shell script)"),compose_hash:Ye.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:Ye.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=H.parse(e);return{cvmId:t,request:{pre_launch_script:e.pre_launch_script,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),dC=Ye.object({status:Ye.literal("in_progress"),message:Ye.string(),correlation_id:Ye.string()}),uC=Ye.object({status:Ye.literal("precondition_required"),message:Ye.string(),compose_hash:Ye.string(),app_id:Ye.string(),device_id:Ye.string(),kms_info:Ct}),fC=Ye.union([dC,uC]),{action:gC,safeAction:hC}=x(fC,async(e,t)=>{let n=pC.parse(t),r={"Content-Type":"text/plain"};n.request.compose_hash&&(r["X-Compose-Hash"]=n.request.compose_hash),n.request.transaction_hash&&(r["X-Transaction-Hash"]=n.request.transaction_hash);try{return await e.patch(`/cvms/${n.cvmId}/pre-launch-script`,n.request.pre_launch_script,{headers:r})}catch(o){if(o instanceof yt&&o.status===465){let a=o.detail;if(a&&typeof a=="object"){let s=a,i=s.details;if(i&&Array.isArray(i)){let l=new Map(i.map(u=>[u.field,u.value])),p=l.get("compose_hash"),m=l.get("app_id"),d=l.get("device_id"),f=l.get("kms_info");if(p&&m)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:p,app_id:m,device_id:d||"",kms_info:f}}}}throw o}}),vC=H,{action:CC,safeAction:bC}=x(yC.string(),async(e,t)=>{let{cvmId:n}=vC.parse(t);return await e.get(`/cvms/${n}/pre-launch-script`)}),wC=Xc.object({kms_id:Xc.string().min(1,"KMS ID is required")}),{action:_C,safeAction:kC}=x(Ct,async(e,t)=>{let n=wC.parse(t);return await e.get(`/kms/${n.kms_id}`)}),SC=Pt.object({page:Pt.number().int().min(1).optional(),page_size:Pt.number().int().min(1).optional(),is_onchain:Pt.boolean().optional()}).strict(),EC=Pt.object({items:Pt.array(Ct),total:Pt.number(),page:Pt.number(),page_size:Pt.number(),pages:Pt.number()}).strict(),{action:IC,safeAction:ws}=x(EC,async(e,t)=>{let n=SC.parse(t??{});return await e.get("/kms",{params:n})}),AC=Yn.object({kms:Yn.string().min(1,"KMS ID or slug is required"),app_id:Yn.string().refine(e=>e.length===40||e.startsWith("0x")&&e.length===42,"App ID must be exactly 40 characters or 42 characters with 0x prefix")}).strict(),PC=Yn.object({public_key:Yn.string(),signature:Yn.string()}).strict(),{action:$C,safeAction:Qn}=x(PC,async(e,t)=>{let n=AC.parse(t);return await e.get(`/kms/${n.kms}/pubkey/${n.app_id}`)}),RC=vn.object({counts:vn.number().int().min(1).max(20).optional().default(1)}).strict(),xC=vn.object({app_ids:vn.array(vn.object({app_id:vn.string(),nonce:vn.number().int().min(0)}))}).strict(),{action:DC,safeAction:TC}=x(xC,async(e,t)=>{let n=RC.parse(t??{}),r=new URLSearchParams;return r.append("counts",n.counts.toString()),await e.get(`/kms/phala/next_app_id?${r.toString()}`)}),er=ie.object({id:ie.number(),name:ie.string(),status:ie.string(),teepod_id:ie.number(),teepod:ie.object({id:ie.number(),name:ie.string(),region_identifier:ie.string().nullable().optional()}).optional().nullable(),user_id:ie.number().optional().nullable(),app_id:ie.string(),vm_uuid:ie.string().nullable(),instance_id:ie.string().nullable(),app_url:ie.string().optional().nullable(),base_image:ie.string().optional().nullable(),vcpu:ie.number(),memory:ie.number(),disk_size:ie.number(),manifest_version:ie.number().optional().nullable(),version:ie.string().optional().nullable(),runner:ie.string().optional().nullable(),docker_compose_file:ie.string().optional().nullable(),features:ie.array(ie.string()).optional().nullable(),created_at:ie.string(),encrypted_env_pubkey:ie.string().nullable()}),MC=H,{action:LC,safeAction:_s}=x(er,async(e,t)=>{let{cvmId:n}=MC.parse(t);return await e.post(`/cvms/${n}/start`)}),UC=H,{action:OC,safeAction:ks}=x(er,async(e,t)=>{let{cvmId:n}=UC.parse(t);return await e.post(`/cvms/${n}/stop`)}),NC=H,{action:jC,safeAction:FC}=x(er,async(e,t)=>{let{cvmId:n}=NC.parse(t);return await e.post(`/cvms/${n}/shutdown`)}),HC=nt(Ke.extend({force:VC.boolean().optional()})),{action:zC,safeAction:Ss}=x(er,async(e,t)=>{let n=HC.parse(t),{cvmId:r}=H.parse(n),{force:o=!1}=n;return await e.post(`/cvms/${r}/restart`,{force:o})}),GC=H,{action:qC,safeAction:Ur}=x(KC.void(),async(e,t)=>{let{cvmId:n}=GC.parse(t);await e.delete(`/cvms/${n}`)}),BC=ne.object({name:ne.string(),mount_point:ne.string(),total_size:ne.number(),free_size:ne.number()}),WC=ne.object({os_name:ne.string(),os_version:ne.string(),kernel_version:ne.string(),cpu_model:ne.string(),num_cpus:ne.number(),total_memory:ne.number(),available_memory:ne.number(),used_memory:ne.number(),free_memory:ne.number(),total_swap:ne.number(),used_swap:ne.number(),free_swap:ne.number(),uptime:ne.number(),loadavg_one:ne.number(),loadavg_five:ne.number(),loadavg_fifteen:ne.number(),disks:ne.array(BC)}),JC=ne.object({is_online:ne.boolean(),is_public:ne.boolean().default(!1),error:ne.string().nullable(),sysinfo:WC.nullable(),status:ne.string().nullable(),in_progress:ne.boolean().default(!1),boot_progress:ne.string().nullable(),boot_error:ne.string().nullable()}),YC=H,{action:ZC,safeAction:XC}=x(JC,async(e,t)=>{let{cvmId:n}=YC.parse(t);return await e.get(`/cvms/${n}/stats`)}),QC=It.object({app:It.string(),instance:It.string()}),eb=It.object({is_online:It.boolean(),is_public:It.boolean().default(!0),error:It.string().nullable(),internal_ip:It.string().nullable(),latest_handshake:It.string().nullable(),public_urls:It.array(QC).nullable()}),tb=H,{action:nb,safeAction:rb}=x(eb,async(e,t)=>{let{cvmId:n}=tb.parse(t);return await e.get(`/cvms/${n}/network`)}),ab=H,{action:sb,safeAction:ib}=x(ob.string(),async(e,t)=>{let{cvmId:n}=ab.parse(t);return await e.get(`/cvms/${n}/docker-compose.yml`)}),cb=ve.object({id:ve.string(),names:ve.array(ve.string()),image:ve.string(),image_id:ve.string(),command:ve.string().nullable().optional(),created:ve.number(),state:ve.string(),status:ve.string(),log_endpoint:ve.string().nullable()}),lb=ve.object({is_online:ve.boolean(),is_public:ve.boolean().default(!0),error:ve.string().nullable(),docker_compose_file:ve.string().nullable(),manifest_version:ve.number().nullable(),version:ve.string().nullable(),runner:ve.string().nullable(),features:ve.array(ve.string()).nullable(),containers:ve.array(cb).nullable()}),mb=H,{action:pb,safeAction:Es}=x(lb,async(e,t)=>{let{cvmId:n}=mb.parse(t);return await e.get(`/cvms/${n}/composition`)}),db=L.object({common_name:L.string().nullable(),organization:L.string().nullable(),country:L.string().nullable(),state:L.string().nullable(),locality:L.string().nullable()}),ub=L.object({common_name:L.string().nullable(),organization:L.string().nullable(),country:L.string().nullable()}),Nl=L.object({subject:db,issuer:ub,serial_number:L.string(),not_before:L.string(),not_after:L.string(),version:L.string(),fingerprint:L.string(),signature_algorithm:L.string(),sans:L.array(L.string()).nullable(),is_ca:L.boolean(),position_in_chain:L.number().nullable(),quote:L.string().nullable(),app_id:L.string().nullable().optional(),cert_usage:L.string().nullable().optional()}),fb=L.object({imr:L.number(),event_type:L.number(),digest:L.string(),event:L.string(),event_payload:L.string()}),jl=L.object({mrtd:L.string(),rootfs_hash:L.string().nullable().optional(),rtmr0:L.string(),rtmr1:L.string(),rtmr2:L.string(),rtmr3:L.string(),event_log:L.array(fb),app_compose:L.string()}),gb=L.object({name:L.string().nullable(),is_online:L.boolean(),is_public:L.boolean().default(!0),error:L.string().nullable(),app_certificates:L.array(Nl).nullable(),tcb_info:jl.nullable(),compose_file:L.string().nullable()}),hb=H,{action:yb,safeAction:vb}=x(gb,async(e,t)=>{let{cvmId:n}=hb.parse(t);return await e.get(`/cvms/${n}/attestation`)}),Cb=nt(Ke.extend({vcpu:Wn.number().optional(),memory:Wn.number().optional(),disk_size:Wn.number().optional(),instance_type:Wn.string().optional(),allow_restart:Wn.boolean().optional()})),{action:bb,safeAction:wb}=x(Wn.void(),async(e,t)=>{let n=Cb.parse(t),{cvmId:r}=H.parse(n),{...o}=n;await e.patch(`/cvms/${r}/resources`,o)}),_b=nt(Ke.extend({public_sysinfo:cs.boolean(),public_logs:cs.boolean(),public_tcbinfo:cs.boolean().optional()})),{action:kb,safeAction:Sb}=x($l,async(e,t)=>{let n=_b.parse(t),{cvmId:r}=H.parse(n),{public_sysinfo:o,public_logs:a,public_tcbinfo:s}=n;return await e.patch(`/cvms/${r}/visibility`,{public_sysinfo:o,public_logs:a,public_tcbinfo:s})}),Qc=Ue.object({name:Ue.string(),os_image_hash:Ue.string().nullable(),is_current:Ue.boolean()}),Eb=Ue.object({version:Ue.union([Ue.tuple([Ue.number(),Ue.number(),Ue.number(),Ue.number()]),Ue.tuple([Ue.number(),Ue.number(),Ue.number()])]),prod:Qc.nullable(),dev:Qc.nullable()}),Ib=Ue.array(Eb),Ab=H,{action:Pb,safeAction:$b}=x(Ib,async(e,t)=>{let{cvmId:n}=Ab.parse(t);return await e.get(`/cvms/${n}/available-os-images`)}),Rb=nt(Ke.extend({os_image_name:Fl.string().min(1,"OS image name is required")})),{action:xb,safeAction:Db}=x(Fl.void(),async(e,t)=>{let n=Rb.parse(t),{cvmId:r}=H.parse(n),{os_image_name:o}=n;await e.patch(`/cvms/${r}/os-image`,{os_image_name:o})}),Tb=Et.object({id:Et.string().optional(),instance_id:Et.string().optional(),name:Et.string(),status:Et.string(),uptime:Et.string().optional(),exited_at:Et.string().optional(),boot_progress:Et.string().optional(),boot_error:Et.string().optional(),shutdown_progress:Et.string().optional()}),Mb=H,{action:Lb,safeAction:Ub}=x(Tb,async(e,t)=>{let{cvmId:n}=Mb.parse(t);return await e.get(`/cvms/${n}/state`)}),Vl=We.object({id:We.string(),user_id:We.string(),name:We.string(),public_key:We.string(),fingerprint:We.string(),key_type:We.string(),source:We.string(),key_metadata:We.record(We.unknown()).nullable().optional(),last_synced_at:We.string().nullable().optional(),created_at:We.string(),updated_at:We.string()}),Ob=We.array(Vl);async function Hl(e){let t=await e.get("/user/ssh-keys");return Ob.parse(t)}async function Or(e){try{return{success:!0,data:await Hl(e)}}catch(t){return t&&typeof t=="object"&&("status"in t||"issues"in t)?{success:!1,error:t}:{success:!1,error:{name:"Error",message:t instanceof Error?t.message:String(t)}}}}var Nb=en.object({github_username:en.string().min(1)}),jb=en.object({github_username:en.string(),keys_added:en.number().int(),keys_skipped:en.number().int(),errors:en.array(en.string()).default([])}),{action:Fb,safeAction:Is}=x(jb,async(e,t)=>{let{github_username:n}=Nb.parse(t);return await e.post("/user/ssh-keys/github-profile",{github_username:n})}),Vb=ls.object({name:ls.string().min(1),public_key:ls.string().min(1)}),{action:Hb,safeAction:As}=x(Vl,async(e,t)=>{let{name:n,public_key:r}=Vb.parse(t);return await e.post("/user/ssh-keys",{name:n,public_key:r})}),zb=us.object({keyId:us.string().min(1)}),{action:Kb,safeAction:Ps}=x(us.void(),async(e,t)=>{let{keyId:n}=zb.parse(t);await e.delete(`/user/ssh-keys/${n}`)}),Gb=yn.object({synced_count:yn.number().int(),keys_added:yn.number().int(),keys_updated:yn.number().int(),keys_removed:yn.number().int(),errors:yn.array(yn.string()).default([])}),{action:qb,safeAction:Bb}=Sl(Gb,async e=>await e.post("/user/ssh-keys/github-sync",{})),Wb=Re.object({name:Re.string(),slug:Re.string(),version:Re.string(),os_image_hash:Re.string().nullable(),is_dev:Re.boolean(),requires_gpu:Re.boolean()}).passthrough(),Jb=Re.object({page:Re.number().int().min(1).optional(),page_size:Re.number().int().min(1).optional(),is_dev:Re.boolean().optional()}).strict(),Yb=Re.object({items:Re.array(Wb),total:Re.number(),page:Re.number(),page_size:Re.number(),pages:Re.number()}).passthrough(),{action:Zb,safeAction:$s}=x(Yb,async(e,t)=>{let n=Jb.parse(t??{});return await e.get("/os-images",{params:n})}),Xb=be.object({device_id:be.string(),node_name:be.string().nullable().optional(),on_chain_allowed:be.boolean().nullable()}).passthrough(),Qb=be.object({name:be.string(),version:be.string(),os_image_hash:be.string().nullable(),on_chain_allowed:be.boolean().nullable()}).passthrough(),ew=be.object({contract_address:be.string(),chain_id:be.number(),chain_name:be.string(),devices:be.array(Xb),os_images:be.array(Qb)}).passthrough(),tw=be.object({chain_name:be.string(),chain_id:be.number(),contracts:be.array(ew)}).passthrough(),nw=be.object({chain:be.string()}).strict(),{action:rw,safeAction:Rs}=x(tw,async(e,t)=>{let{chain:n}=nw.parse(t);return await e.get(`/kms/on-chain/${n}`)});function rt(e={}){let t=Ky(e),n={getCurrentUser:wl,safeGetCurrentUser:Oe,getAvailableNodes:nv,safeGetAvailableNodes:bt,listAllInstanceTypeFamilies:fs,safeListAllInstanceTypeFamilies:iv,listFamilyInstanceTypes:gs,safeListFamilyInstanceTypes:cv,listWorkspaces:pv,safeListWorkspaces:dv,getWorkspace:uv,safeGetWorkspace:fv,getCvmInfo:Dl,safeGetCvmInfo:G,getCvmList:Tl,safeGetCvmList:Lr,provisionCvm:Uv,safeProvisionCvm:bs,commitCvmProvision:Nv,safeCommitCvmProvision:Ro,getCvmComposeFile:Kv,safeGetCvmComposeFile:Gv,provisionCvmComposeFileUpdate:Wv,safeProvisionCvmComposeFileUpdate:Jv,commitCvmComposeFileUpdate:Xv,safeCommitCvmComposeFileUpdate:Qv,updateCvmEnvs:oC,safeUpdateCvmEnvs:xo,updateDockerCompose:lC,safeUpdateDockerCompose:mC,updatePreLaunchScript:gC,safeUpdatePreLaunchScript:hC,getCvmPreLaunchScript:CC,safeGetCvmPreLaunchScript:bC,startCvm:LC,safeStartCvm:_s,stopCvm:OC,safeStopCvm:ks,shutdownCvm:jC,safeShutdownCvm:FC,restartCvm:zC,safeRestartCvm:Ss,deleteCvm:qC,safeDeleteCvm:Ur,getCvmStats:ZC,safeGetCvmStats:XC,getCvmNetwork:nb,safeGetCvmNetwork:rb,getCvmDockerCompose:sb,safeGetCvmDockerCompose:ib,getCvmContainersStats:pb,safeGetCvmContainersStats:Es,getCvmAttestation:yb,safeGetCvmAttestation:vb,updateCvmResources:bb,safeUpdateCvmResources:wb,updateCvmVisibility:kb,safeUpdateCvmVisibility:Sb,getAvailableOsImages:Pb,safeGetAvailableOsImages:$b,updateOsImage:xb,safeUpdateOsImage:Db,getKmsInfo:_C,safeGetKmsInfo:kC,getKmsList:IC,safeGetKmsList:ws,getAppEnvEncryptPubKey:$C,safeGetAppEnvEncryptPubKey:Qn,nextAppIds:DC,safeNextAppIds:TC,getCvmState:Lb,safeGetCvmState:Ub,listSshKeys:Hl,safeListSshKeys:Or,importGithubProfileSshKeys:Fb,safeImportGithubProfileSshKeys:Is,createSshKey:Hb,safeCreateSshKey:As,deleteSshKey:Kb,safeDeleteSshKey:Ps,syncGithubSshKeys:qb,safeSyncGithubSshKeys:Bb,getOsImages:Zb,safeGetOsImages:$s,getKmsOnChainDetail:rw,safeGetKmsOnChainDetail:Rs};return t.extend(n)}var el=R.object({vm_uuid:R.string().nullable(),app_id:R.string(),name:R.string().default(""),status:R.string(),vcpu:R.number().int(),memory:R.number().int(),disk_size:R.number().int(),teepod_id:R.number().int(),teepod_name:R.string(),region_identifier:R.string().nullable().optional(),kms_type:R.string().nullable().optional(),instance_type:R.string().nullable().optional(),listed:R.boolean().nullable().optional(),base_image:R.string().nullable().optional(),kms_slug:R.string().nullable().optional(),kms_id:R.string().nullable().optional(),instance_id:R.string().nullable().optional(),machine_info:hs.nullable().optional(),updated_at:R.string().nullable().optional()}),ow=R.object({display_name:R.string().nullable().optional(),avatar_url:R.string().nullable().optional(),description:R.string().nullable().optional(),custom_domain:R.string().nullable().optional()}),aw=R.object({id:R.string(),name:R.string(),app_id:R.string(),app_provision_type:R.string().nullable().optional(),app_icon_url:R.string().nullable().optional(),created_at:R.string(),kms_type:R.string(),profile:ow.nullable().optional(),current_cvm:el.nullable().optional(),cvms:R.array(el).default([]),cvm_count:R.number().int().default(0)}),sw=R.object({id:R.null().optional(),app_id:R.string(),name:R.null().optional(),app_provision_type:R.null().optional(),app_icon_url:R.null().optional(),created_at:R.null().optional(),kms_type:R.null().optional(),current_cvm:R.null().optional(),cvms:R.null().optional(),cvm_count:R.null().optional()}),zl=R.union([aw,sw]),iw=R.object({dstack_apps:R.array(zl),page:R.number().int(),page_size:R.number().int(),total:R.number().int(),total_pages:R.number().int()}),cw=X.object({id:X.string(),name:X.string(),app_id:X.string(),app_provision_type:X.string().nullable().optional(),app_icon_url:X.string().nullable().optional(),created_at:X.string(),kms_type:X.string(),profile:X.object({display_name:X.string().nullable().optional(),avatar_url:X.string().nullable().optional(),description:X.string().nullable().optional(),custom_domain:X.string().nullable().optional()}).nullable().optional(),current_cvm:Tr.nullable().optional(),cvms:X.array(Tr).default([]),cvm_count:X.number().int().default(0)}),lw=X.object({id:X.null().optional(),app_id:X.string(),name:X.null().optional(),app_provision_type:X.null().optional(),app_icon_url:X.null().optional(),created_at:X.null().optional(),kms_type:X.null().optional(),current_cvm:X.null().optional(),cvms:X.null().optional(),cvm_count:X.null().optional()}),Kl=X.union([cw,lw]),mw=X.object({dstack_apps:X.array(Kl),page:X.number().int(),page_size:X.number().int(),total:X.number().int(),total_pages:X.number().int()}),Gl=J.object({object_type:J.literal("cvm"),id:J.string().nullable().optional(),name:J.string().nullable().optional(),app_id:J.string().nullable().optional(),vm_uuid:J.string().nullable().optional()}),pw=J.object({revision_id:J.string(),app_id:J.string(),vm_uuid:J.string(),compose_hash:J.string(),created_at:J.string(),trace_id:J.string().nullable().optional(),operation_type:J.string(),triggered_by:vs.nullable().optional(),cvm:Gl.nullable().optional(),workspace:Cs.nullable().optional()}),p$=J.object({revision_id:J.string(),app_id:J.string(),vm_uuid:J.string(),compose_hash:J.string(),compose_file:J.union([J.record(J.any()),J.string()]).nullable().optional(),encrypted_env:J.string(),user_config:J.string(),created_at:J.string(),trace_id:J.string().nullable().optional(),operation_type:J.string(),triggered_by:vs.nullable().optional(),cvm:Gl.nullable().optional(),workspace:Cs.nullable().optional()}),d$=J.object({revisions:J.array(pw),total:J.number().int(),page:J.number().int(),page_size:J.number().int(),total_pages:J.number().int()});function ht(e){if(typeof e=="string"){if(e.startsWith("0x")&&rl(e))return e;if(rl(`0x${e}`))return`0x${e}`}throw new Error(`Invalid hex value: ${e}`)}var ql=class extends Error{constructor(e,t,n){super(e),this.code=t,this.details=n,this.name="NetworkError"}};var At=class extends Error{constructor(e,t,n){super(e),this.hash=t,this.details=n,this.name="TransactionError"}};async function gw(e,t){try{let n=await e.walletClient.getChainId();return{isCorrectNetwork:n===t,currentChainId:n}}catch(n){throw new ql(`Failed to check network status: ${n instanceof Error?n.message:"Unknown error"}`,"NETWORK_CHECK_FAILED",n)}}async function hw(e,t,n){try{let r=await e.getBalance({address:t});return{address:t,balance:r,sufficient:n?r>=n:!0,required:n}}catch(r){throw new ql(`Failed to check balance: ${r instanceof Error?r.message:"Unknown error"}`,"BALANCE_CHECK_FAILED",r)}}async function yw(e,t,n={}){let{timeout:r=6e4,pollingInterval:o=2e3,confirmations:a=1}=n,s=Date.now();return new Promise((i,l)=>{let p=async()=>{try{let m=await e.getTransactionReceipt({hash:t});if(m){if(a>1&&await e.getBlockNumber()-m.blockNumber+1n<BigInt(a)){if(Date.now()-s>=r){l(new At(`Transaction confirmation timeout after ${r}ms`,t));return}setTimeout(p,o);return}i(m)}else{if(Date.now()-s>=r){l(new At(`Transaction receipt timeout after ${r}ms`,t));return}setTimeout(p,o)}}catch(m){if(Date.now()-s>=r){l(new At(`Transaction receipt timeout after ${r}ms`,t,m));return}setTimeout(p,o)}};p()})}async function Nr(e,t){let{targetChainId:n,minBalance:r,requiredAddress:o}=t,a=await gw(e,n),s=await hw(e.publicClient,e.address,r),i=o?e.address.toLowerCase()===o.toLowerCase():!0;return{networkValid:a.isCorrectNetwork,balanceValid:s.sufficient,addressValid:i,details:{currentChainId:a.currentChainId,balance:s.balance,address:e.address}}}function tr(){let e={state:"idle"},t,n,r=i=>{e={...e,...i}},o=()=>{t&&(clearTimeout(t),t=void 0),n&&(n.abort(),n=void 0),e={state:"idle"}},a=()=>{n&&n.abort(),t&&(clearTimeout(t),t=void 0),r({state:"error",aborted:!0,error:"Transaction aborted by user"})};return{get status(){return{...e}},get isIdle(){return e.state==="idle"},get isSubmitting(){return e.state==="submitting"},get isPending(){return e.state==="pending"},get isSuccess(){return e.state==="success"},get isError(){return e.state==="error"},get isTimeout(){return e.state==="timeout"},get isAborted(){return e.aborted===!0},get isComplete(){return["success","error","timeout"].includes(e.state)},abort:a,reset:o,execute:async(i,l,p,m={})=>{let{timeout:d=6e4,confirmations:f=1,onSubmitted:u,onConfirmed:h,onError:g,signal:y}=m;try{if(o(),n=new AbortController,y){if(y.aborted)throw new At("Operation was aborted before execution");y.addEventListener("abort",()=>{a()})}if(r({state:"submitting",startTime:Date.now(),error:void 0,hash:void 0,receipt:void 0,aborted:!1}),n.signal.aborted)throw new At("Transaction aborted");let b=await i(l,...p);if(n.signal.aborted)throw new At("Transaction aborted after submission",b);r({state:"pending",hash:b,submitTime:Date.now()}),u?.(b),d>0&&(t=setTimeout(()=>{e.state==="pending"&&!n?.signal.aborted&&r({state:"timeout",error:`Transaction timeout after ${d}ms`})},d));let w=await Promise.race([yw(l.publicClient,b,{timeout:d,confirmations:f}),new Promise((k,_)=>{n?.signal.addEventListener("abort",()=>{_(new At("Transaction aborted while waiting for receipt",b))})})]);t&&(clearTimeout(t),t=void 0);let S=w.status==="success";if(r({state:S?"success":"error",receipt:w,confirmTime:Date.now(),error:S?void 0:"Transaction failed on-chain"}),S)h?.(w);else{let k=new At("Transaction failed on-chain",b,w);throw g?.(k,b),k}return{hash:b,receipt:w,success:S}}catch(b){let w=b instanceof At?b:new At(`Transaction execution failed: ${b instanceof Error?b.message:"Unknown error"}`,e.hash,b);throw r({state:"error",error:w.message}),g?.(w,e.hash),w}}}}async function jr(e,t,n,r={},o={}){let{maxRetries:a=3,initialDelay:s=1e3,maxDelay:i=1e4,backoffFactor:l=2,retryCondition:p=()=>!0}=o,m,d=s;for(let f=0;f<=a;f++)try{return await tr().execute(e,t,n,r)}catch(u){if(m=u instanceof Error?u:new Error(String(u)),f===a||!p(m))break;await new Promise(h=>setTimeout(h,d)),d=Math.min(d*l,i)}throw m}var Bl=[{inputs:[{name:"deployer",type:"address"},{name:"disableUpgrades",type:"bool"},{name:"allowAnyDevice",type:"bool"},{name:"deviceId",type:"bytes32"},{name:"composeHash",type:"bytes32"}],name:"deployAndRegisterApp",outputs:[{name:"",type:"address"}],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"appId",type:"address",indexed:!0},{name:"deployer",type:"address",indexed:!0}],name:"AppDeployedViaFactory",type:"event",anonymous:!1},{inputs:[{name:"appId",type:"address",indexed:!1}],name:"AppRegistered",type:"event",anonymous:!1}],vw=we.object({chain:we.unknown().optional(),rpcUrl:we.string().optional(),kmsContractAddress:we.string(),privateKey:we.string().optional(),walletClient:we.unknown().optional(),publicClient:we.unknown().optional(),allowAnyDevice:we.boolean().optional().default(!1),deviceId:we.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),composeHash:we.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),disableUpgrades:we.boolean().optional().default(!1),skipPrerequisiteChecks:we.boolean().optional().default(!1),minBalance:we.string().optional()}).passthrough(),Cw=vw.refine(e=>{let t=!!e.privateKey,n=!!e.walletClient;return t!==n},{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>{let t=!!e.publicClient,n=!!e.walletClient,r=!!e.chain;return t&&n?!0:r},{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),bw=we.object({appId:we.string(),appAuthAddress:we.string(),deployer:we.string(),transactionHash:we.string(),blockNumber:we.bigint().optional(),gasUsed:we.bigint().optional()}).passthrough();function ww(e,t,n){try{let r=uw({abi:Bl,eventName:"AppDeployedViaFactory",logs:e.logs,strict:!1});if(r.length===0)throw e.status==="reverted"?new Error(`Transaction failed: ${e.transactionHash}`):new Error(`Transaction ${e.transactionHash} has no AppDeployedViaFactory events. The deployment failed. Status: ${e.status}. Found ${e.logs.length} logs.`);let o=r[0];if(!o?.args)throw new Error("Event has no data");let{appId:a,deployer:s}=o.args;if(!a)throw new Error("Event missing appId");return{appId:a,appAuthAddress:a,deployer:t,transactionHash:e.transactionHash,blockNumber:e.blockNumber,gasUsed:e.gasUsed}}catch(r){throw r instanceof Error?r:new Error(`Parse failed: ${r}`)}}async function _w(e,t){let n=Cw.parse(e),{chain:r,rpcUrl:o,kmsContractAddress:a,privateKey:s,walletClient:i,publicClient:l,allowAnyDevice:p=!1,deviceId:m="0000000000000000000000000000000000000000000000000000000000000000",composeHash:d="0000000000000000000000000000000000000000000000000000000000000000",disableUpgrades:f=!1,skipPrerequisiteChecks:u=!1,minBalance:h,timeout:g=12e4,retryOptions:y,signal:b,onTransactionStateChange:w,onTransactionSubmitted:S,onTransactionConfirmed:k}=n,_="0000000000000000000000000000000000000000000000000000000000000000",$=m!==_&&m!=="0x"+_?!1:p,M,U,z,re;if(s){let ue=fw(s);if(l){if(typeof l!="object"||!l)throw new Error("publicClient is invalid");M=l}else{if(!r)throw new Error("Chain required for publicClient");M=tl({chain:r,transport:ms(o)})}if(!r)throw new Error("Chain required for walletClient");U=dw({account:ue,chain:r,transport:ms(o)}),z=ue.address,re=r.id}else if(i){if(typeof i!="object"||!i)throw new Error("walletClient is invalid");if(U=i,l){if(typeof l!="object"||!l)throw new Error("publicClient is invalid");M=l}else{if(!r)throw new Error("Chain required for publicClient");M=tl({chain:r,transport:ms(o)})}if(!U.account?.address)throw new Error("WalletClient needs an account");z=U.account.address,r?re=r.id:re=await U.getChainId()}else throw new Error("Need privateKey or walletClient");let ae={publicClient:M,walletClient:U,address:z,chainId:re},oe=tr();if(w&&typeof w=="function"){let ue=()=>{w(oe.status),oe.isComplete||setTimeout(ue,100)};setTimeout(ue,10)}if(!u){let ue={targetChainId:re,minBalance:h?nl(h):nl("0.001")},Ln=await Nr(ae,ue);if(!Ln.networkValid)throw new Error(`Wrong network. Need chain ${ue.targetChainId}, got ${Ln.details.currentChainId}`);if(!Ln.balanceValid){let Wt=Number(ue.minBalance)/1e18,yh=Number(Ln.details.balance)/1e18;throw new Error(`Not enough ETH. Need ${Wt}, have ${yh.toFixed(6)}`)}}let F=ht(m),Z=ht(d),_e=`0x${F.slice(2).padEnd(64,"0")}`,Mt=`0x${Z.slice(2).padEnd(64,"0")}`,Mn=async ue=>{try{let Wt=await ue.publicClient.getCode({address:a});if(!Wt||Wt==="0x")throw new Error(`No contract at ${a}`)}catch(Wt){if(Wt instanceof Error&&Wt.message.includes("No contract at"))throw Wt}let Ln={address:a,abi:Bl,functionName:"deployAndRegisterApp",args:[ue.address,f,$,_e,Mt],account:ue.walletClient.account||ue.address,chain:r||null};return await ue.walletClient.writeContract(Ln)},Er=y?await jr(Mn,ae,[],{timeout:g,confirmations:1,onSubmitted:S,onConfirmed:k,signal:b},y):await oe.execute(Mn,ae,[],{timeout:g,confirmations:1,onSubmitted:S,onConfirmed:k,signal:b}),gn=ww(Er.receipt,z,a);return t?.schema===!1?gn:(t?.schema||bw).parse(gn)}async function Wl(e,t){try{return{success:!0,data:await _w(e,t)}}catch(n){let r=n instanceof Error?n.message:"Unknown deployment error";return{success:!1,error:{isRequestError:!0,message:r,status:500,detail:r}}}}var Jl=[{inputs:[{name:"composeHash",type:"bytes32"}],name:"addComposeHash",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{name:"composeHash",type:"bytes32",indexed:!1}],name:"ComposeHashAdded",type:"event",anonymous:!1}],Iw=fe.object({chain:fe.unknown().optional(),rpcUrl:fe.string().optional(),appId:fe.string(),composeHash:fe.string(),privateKey:fe.string().optional(),walletClient:fe.unknown().optional(),publicClient:fe.unknown().optional(),skipPrerequisiteChecks:fe.boolean().optional().default(!1),minBalance:fe.string().optional(),timeout:fe.number().optional().default(12e4),retryOptions:fe.unknown().optional(),signal:fe.unknown().optional(),onTransactionStateChange:fe.function().optional(),onTransactionSubmitted:fe.function().optional(),onTransactionConfirmed:fe.function().optional()}).passthrough().refine(e=>{let t=!!e.privateKey,n=!!e.walletClient;return t!==n},{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>{let t=!!e.publicClient,n=!!e.walletClient,r=!!e.chain;return t&&n?!0:r},{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),Aw=fe.object({composeHash:fe.string(),appId:fe.string(),transactionHash:fe.string(),blockNumber:fe.bigint().optional(),gasUsed:fe.bigint().optional()}).passthrough();function Pw(e,t,n,r){console.log(e.logs);try{let o=Sw({abi:Jl,eventName:"ComposeHashAdded",logs:e.logs,strict:!1});if(o.length>0){let a=o[0];a?.args?.composeHash!==t&&console.warn(`Event compose hash (${a?.args?.composeHash}) does not match expected (${t})`)}return{composeHash:t,appAuthAddress:n,appId:r,transactionHash:e.transactionHash,blockNumber:e.blockNumber,gasUsed:e.gasUsed}}catch(o){return console.warn("Failed to parse ComposeHashAdded event, returning basic result:",o),{composeHash:t,appAuthAddress:n,appId:r,transactionHash:e.transactionHash,blockNumber:e.blockNumber,gasUsed:e.gasUsed}}}async function $w(e,t){let n=Iw.parse(e),{chain:r,rpcUrl:o,appId:a,composeHash:s,privateKey:i,walletClient:l,publicClient:p,timeout:m=12e4,retryOptions:d,signal:f,onTransactionStateChange:u,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:b}=n,w,S,k,_,I=a.startsWith("0x")?a:`0x${a}`;if(i){let F=Ew(i);if(p)w=p;else{if(!r)throw new Error("Chain required when creating publicClient");w=ol({chain:r,transport:ps(o)})}if(!r)throw new Error("Chain required when creating walletClient");S=kw({account:F,chain:r,transport:ps(o)}),k=F.address,_=r.id}else if(l){if(S=l,p)w=p;else{if(!r)throw new Error("Chain required when creating publicClient");w=ol({chain:r,transport:ps(o)})}if(!S.account?.address)throw new Error("WalletClient must have an account with address");k=S.account.address,_=r?r.id:await S.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let $={publicClient:w,walletClient:S,address:k,chainId:_},M=tr();if(u&&typeof u=="function"){let F=()=>{u(M.status),M.isComplete||setTimeout(F,100)};setTimeout(F,10)}if(!y){let F={targetChainId:_,minBalance:b?al(b):al("0.001")},Z=await Nr($,F);if(!Z.networkValid)throw new Error(`Network mismatch: Expected chain ${F.targetChainId}, but wallet is on chain ${Z.details.currentChainId}`);if(!Z.balanceValid){let _e=Number(F.minBalance)/1e18,Mt=Number(Z.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${_e} ETH, but account has ${Mt.toFixed(6)} ETH`)}}let U=await w.readContract({address:I,abi:[{inputs:[],name:"owner",outputs:[{type:"address"}],stateMutability:"view",type:"function"}],functionName:"owner"});if(U.toLowerCase()!==k.toLowerCase())throw new Error(`Sender ${k} is not the owner of contract ${I}. Contract owner is ${U}.`);let z=async F=>await F.walletClient.writeContract({address:I,abi:Jl,functionName:"addComposeHash",args:[ht(s)],account:F.walletClient.account||F.address,chain:r||null}),re=d?await jr(z,$,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await M.execute(z,$,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),ae=Pw(re.receipt,ht(s),I,a);return t?.schema===!1?ae:(t?.schema||Aw).parse(ae)}async function nn(e,t){try{return{success:!0,data:await $w(e,t)}}catch(n){let r=n instanceof Error?n.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:r,status:500,detail:r}}}}var $t=[{inputs:[{internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"addDevice",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"removeDevice",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bool",name:"_allowAnyDevice",type:"bool"}],name:"setAllowAnyDevice",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"allowedDeviceIds",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"allowAnyDevice",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"",type:"bytes32"}],name:"allowedComposeHashes",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"}],name:"OwnableInvalidOwner",type:"error"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"OwnableUnauthorizedAccount",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"DeviceAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"deviceId",type:"bytes32"}],name:"DeviceRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bool",name:"allowAny",type:"bool"}],name:"AllowAnyDeviceSet",type:"event"}],Dw=ge.object({chain:ge.unknown().optional(),rpcUrl:ge.string().optional(),appAddress:ge.string(),deviceId:ge.string(),privateKey:ge.string().optional(),walletClient:ge.unknown().optional(),publicClient:ge.unknown().optional(),skipPrerequisiteChecks:ge.boolean().optional().default(!1),minBalance:ge.string().optional(),timeout:ge.number().optional().default(12e4),retryOptions:ge.unknown().optional(),signal:ge.unknown().optional(),onTransactionStateChange:ge.function().optional(),onTransactionSubmitted:ge.function().optional(),onTransactionConfirmed:ge.function().optional()}).passthrough().refine(e=>!!e.privateKey!=!!e.walletClient,{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>e.publicClient&&e.walletClient?!0:!!e.chain,{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),Tw=ge.object({appAddress:ge.string(),deviceId:ge.string(),transactionHash:ge.string(),blockNumber:ge.bigint().optional(),gasUsed:ge.bigint().optional()}).passthrough();async function Mw(e,t){let n=Dw.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:l,publicClient:p,timeout:m=12e4,retryOptions:d,signal:f,onTransactionStateChange:u,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:b}=n,w=a.startsWith("0x")?a:`0x${a}`,S=ht(s),k,_,I,$;if(i){let Z=xw(i),_e=il(o,{timeout:m});k=p||sl({chain:r,transport:_e}),_=Rw({account:Z,chain:r,transport:_e}),I=Z.address,$=r.id}else if(l){if(_=l,k=p||sl({chain:r,transport:il(o,{timeout:m})}),!_.account?.address)throw new Error("WalletClient must have an account with address");I=_.account.address,$=r?r.id:await _.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let M={publicClient:k,walletClient:_,address:I,chainId:$},U=tr();if(u&&typeof u=="function"){let Z=()=>{u(U.status),U.isComplete||setTimeout(Z,100)};setTimeout(Z,10)}if(!y){let Z={targetChainId:$,minBalance:b?cl(b):cl("0.001")},_e=await Nr(M,Z);if(!_e.networkValid)throw new Error(`Network mismatch: Expected chain ${Z.targetChainId}, but wallet is on chain ${_e.details.currentChainId}`);if(!_e.balanceValid){let Mt=Number(Z.minBalance)/1e18,Mn=Number(_e.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Mt} ETH, but account has ${Mn.toFixed(6)} ETH`)}}let z=await k.readContract({address:w,abi:$t,functionName:"owner"});if(z.toLowerCase()!==I.toLowerCase())throw new Error(`Sender ${I} is not the owner of contract ${w}. Contract owner is ${z}.`);let re=async Z=>Z.walletClient.writeContract({address:w,abi:$t,functionName:"addDevice",args:[S],account:Z.walletClient.account||Z.address,chain:r||null}),ae=d?await jr(re,M,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await U.execute(re,M,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),oe={appAddress:w,deviceId:S,transactionHash:ae.receipt.transactionHash,blockNumber:ae.receipt.blockNumber,gasUsed:ae.receipt.gasUsed};return t?.schema===!1?oe:(t?.schema||Tw).parse(oe)}async function rn(e,t){try{return{success:!0,data:await Mw(e,t)}}catch(n){let r=n instanceof Error?n.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:r,status:500,detail:r}}}}var Ow=he.object({chain:he.unknown().optional(),rpcUrl:he.string().optional(),appAddress:he.string(),deviceId:he.string(),privateKey:he.string().optional(),walletClient:he.unknown().optional(),publicClient:he.unknown().optional(),skipPrerequisiteChecks:he.boolean().optional().default(!1),minBalance:he.string().optional(),timeout:he.number().optional().default(12e4),retryOptions:he.unknown().optional(),signal:he.unknown().optional(),onTransactionStateChange:he.function().optional(),onTransactionSubmitted:he.function().optional(),onTransactionConfirmed:he.function().optional()}).passthrough().refine(e=>!!e.privateKey!=!!e.walletClient,{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>e.publicClient&&e.walletClient?!0:!!e.chain,{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),Nw=he.object({appAddress:he.string(),deviceId:he.string(),transactionHash:he.string(),blockNumber:he.bigint().optional(),gasUsed:he.bigint().optional()}).passthrough();async function jw(e,t){let n=Ow.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:l,publicClient:p,timeout:m=12e4,retryOptions:d,signal:f,onTransactionStateChange:u,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:b}=n,w=a.startsWith("0x")?a:`0x${a}`,S=ht(s),k,_,I,$;if(i){let F=Uw(i),Z=ml(o,{timeout:m});k=p||ll({chain:r,transport:Z}),_=Lw({account:F,chain:r,transport:Z}),I=F.address,$=r.id}else if(l){if(_=l,k=p||ll({chain:r,transport:ml(o,{timeout:m})}),!_.account?.address)throw new Error("WalletClient must have an account with address");I=_.account.address,$=r?r.id:await _.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let M={publicClient:k,walletClient:_,address:I,chainId:$},U=tr();if(u&&typeof u=="function"){let F=()=>{u(U.status),U.isComplete||setTimeout(F,100)};setTimeout(F,10)}if(!y){let F={targetChainId:$,minBalance:b?pl(b):pl("0.001")},Z=await Nr(M,F);if(!Z.networkValid)throw new Error(`Network mismatch: Expected chain ${F.targetChainId}, but wallet is on chain ${Z.details.currentChainId}`);if(!Z.balanceValid){let _e=Number(F.minBalance)/1e18,Mt=Number(Z.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${_e} ETH, but account has ${Mt.toFixed(6)} ETH`)}}let z=async F=>F.walletClient.writeContract({address:w,abi:$t,functionName:"removeDevice",args:[S],account:F.walletClient.account||F.address,chain:r||null}),re=d?await jr(z,M,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await U.execute(z,M,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),ae={appAddress:w,deviceId:S,transactionHash:re.receipt.transactionHash,blockNumber:re.receipt.blockNumber,gasUsed:re.receipt.gasUsed};return t?.schema===!1?ae:(t?.schema||Nw).parse(ae)}async function Yl(e,t){try{return{success:!0,data:await jw(e,t)}}catch(n){let r=n instanceof Error?n.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:r,status:500,detail:r}}}}var Hw=ye.object({chain:ye.unknown().optional(),rpcUrl:ye.string().optional(),appAddress:ye.string(),allow:ye.boolean(),privateKey:ye.string().optional(),walletClient:ye.unknown().optional(),publicClient:ye.unknown().optional(),skipPrerequisiteChecks:ye.boolean().optional().default(!1),minBalance:ye.string().optional(),timeout:ye.number().optional().default(12e4),retryOptions:ye.unknown().optional(),signal:ye.unknown().optional(),onTransactionStateChange:ye.function().optional(),onTransactionSubmitted:ye.function().optional(),onTransactionConfirmed:ye.function().optional()}).passthrough().refine(e=>!!e.privateKey!=!!e.walletClient,{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>e.publicClient&&e.walletClient?!0:!!e.chain,{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),zw=ye.object({appAddress:ye.string(),allow:ye.boolean(),transactionHash:ye.string(),blockNumber:ye.bigint().optional(),gasUsed:ye.bigint().optional()}).passthrough();async function Kw(e,t){let n=Hw.parse(e),{chain:r,rpcUrl:o,appAddress:a,allow:s,privateKey:i,walletClient:l,publicClient:p,timeout:m=12e4,retryOptions:d,signal:f,onTransactionStateChange:u,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:b}=n,w=a.startsWith("0x")?a:`0x${a}`,S,k,_,I;if(i){let oe=Vw(i),F=ul(o,{timeout:m});S=p||dl({chain:r,transport:F}),k=Fw({account:oe,chain:r,transport:F}),_=oe.address,I=r.id}else if(l){if(k=l,S=p||dl({chain:r,transport:ul(o,{timeout:m})}),!k.account?.address)throw new Error("WalletClient must have an account with address");_=k.account.address,I=r?r.id:await k.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let $={publicClient:S,walletClient:k,address:_,chainId:I},M=tr();if(u&&typeof u=="function"){let oe=()=>{u(M.status),M.isComplete||setTimeout(oe,100)};setTimeout(oe,10)}if(!y){let oe={targetChainId:I,minBalance:b?fl(b):fl("0.001")},F=await Nr($,oe);if(!F.networkValid)throw new Error(`Network mismatch: Expected chain ${oe.targetChainId}, but wallet is on chain ${F.details.currentChainId}`);if(!F.balanceValid){let Z=Number(oe.minBalance)/1e18,_e=Number(F.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Z} ETH, but account has ${_e.toFixed(6)} ETH`)}}let U=async oe=>oe.walletClient.writeContract({address:w,abi:$t,functionName:"setAllowAnyDevice",args:[s],account:oe.walletClient.account||oe.address,chain:r||null}),z=d?await jr(U,$,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await M.execute(U,$,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),re={appAddress:w,allow:s,transactionHash:z.receipt.transactionHash,blockNumber:z.receipt.blockNumber,gasUsed:z.receipt.gasUsed};return t?.schema===!1?re:(t?.schema||zw).parse(re)}async function Zl(e,t){try{return{success:!0,data:await Kw(e,t)}}catch(n){let r=n instanceof Error?n.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:r,status:500,detail:r}}}}var F$=Kn.object({appAddress:Kn.string(),owner:Kn.string(),allowAnyDevice:Kn.boolean(),devices:Kn.array(Kn.string())});async function Do(e){let{chain:t,rpcUrl:n,appAddress:r,deviceIds:o,publicClient:a}=e,s=r.startsWith("0x")?r:`0x${r}`,i=a||(()=>{if(!t)throw new Error("Chain is required when publicClient is not provided");return Gw({chain:t,transport:qw(n)})})(),[l,p]=await Promise.all([i.readContract({address:s,abi:$t,functionName:"allowAnyDevice"}),i.readContract({address:s,abi:$t,functionName:"owner"})]);if(l)return{appAddress:s,owner:p,allowAnyDevice:!0,devices:o.map(d=>ht(d))};let m;if(o.length===0)m=[];else{let d=o.map(u=>({address:s,abi:$t,functionName:"allowedDeviceIds",args:[ht(u)]})),f=await i.multicall({contracts:d});m=o.map((u,h)=>({deviceId:ht(u),allowed:f[h]?.status==="success"&&f[h]?.result===!0})).filter(u=>u.allowed).map(u=>u.deviceId)}return{appAddress:s,owner:p,allowAnyDevice:!1,devices:m}}async function Jw(e){let{chain:t,rpcUrl:n,appAddress:r,deviceId:o,composeHash:a,publicClient:s}=e,i=r.startsWith("0x")?r:`0x${r}`,l=ht(o),p=ht(a),m=s||(()=>{if(!t)throw new Error("Chain is required when publicClient is not provided");return Bw({chain:t,transport:Ww(n)})})(),d=[{address:i,abi:$t,functionName:"allowAnyDevice"},{address:i,abi:$t,functionName:"allowedDeviceIds",args:[l]},{address:i,abi:$t,functionName:"allowedComposeHashes",args:[p]}],f=await m.multicall({contracts:d}),u=f[0]?.status==="success"&&f[0]?.result===!0,h=f[1]?.status==="success"&&f[1]?.result===!0,g=f[2]?.status==="success"&&f[2]?.result===!0;return{allowAnyDevice:u,deviceAllowed:u||h,composeHashAllowed:g}}async function bn(e){try{return{success:!0,data:await Jw(e)}}catch(t){let n=t instanceof Error?t.message:"Unknown blockchain error";return{success:!1,error:{isRequestError:!0,message:n,status:500,detail:n}}}}var Yw=Rl;var Zw=Gn.object({items:Gn.array(Yw),total:Gn.number(),page:Gn.number(),page_size:Gn.number(),pages:Gn.number()}).passthrough(),{action:J$,safeAction:Xl}=x(Zw,async(e,t)=>{let{teamSlug:n,page:r,pageSize:o}=t,a=new URLSearchParams;r!==void 0&&a.append("page",r.toString()),o!==void 0&&a.append("page_size",o.toString());let s=a.toString()?`/workspaces/${n}/nodes?${a.toString()}`:`/workspaces/${n}/nodes`;return await e.get(s)}),Jn=gt.object({limit:gt.number(),remaining:gt.number()}).passthrough(),Xw=gt.object({vm_slots:Jn,vcpu:Jn,memory_mb:Jn,disk_gb:Jn}).passthrough(),Qw=gt.object({gpus:Jn,in_use:gt.number(),misconfigured:gt.number()}).passthrough(),e_=gt.object({team_slug:gt.string(),tier:gt.string(),quotas:Xw,reserved_nodes:Jn,reserved_gpu:Qw,as_of:gt.string()}).passthrough(),{action:Z$,safeAction:X$}=x(e_,async(e,t)=>await e.get(`/workspaces/${t.teamSlug}/quotas`)),n_=nt(Ke.extend({node_id:t_.number().optional()})),{action:eR,safeAction:tR}=x(er,async(e,t)=>{let n=n_.parse(t),{cvmId:r}=H.parse(n),{node_id:o}=n;return await e.post(`/cvms/${r}/replicas`,{node_id:o})}),rR=qn.object({target:qn.string().describe("Target status to wait for (e.g., 'running', 'stopped')"),interval:qn.number().min(5).max(30).default(5).describe("Polling interval in seconds"),timeout:qn.number().min(10).max(600).default(300).describe("Timeout per attempt in seconds"),maxRetries:qn.number().min(0).default(Number.POSITIVE_INFINITY).describe("Maximum number of retry attempts (Infinity for unlimited)"),retryDelay:qn.number().min(0).default(5e3).describe("Delay between retries in milliseconds")});var r_=nt(Ke.extend({docker_compose_file:W.string().optional(),pre_launch_script:W.string().optional(),allowed_envs:W.array(W.string()).optional(),public_logs:W.boolean().optional(),public_sysinfo:W.boolean().optional(),public_tcbinfo:W.boolean().optional(),encrypted_env:W.string().optional(),user_config:W.string().optional(),gpus:W.object({count:W.number(),product_name:W.string().optional()}).optional(),vcpu:W.number().optional(),memory:W.number().optional(),disk_size:W.number().optional(),image:W.string().optional(),shutdown_timeout:W.number().optional(),allow_force_stop:W.boolean().optional(),prepareOnly:W.boolean().optional()})),o_=W.object({requiresOnChainHash:W.literal(!1),correlationId:W.string()}),a_=W.object({requiresOnChainHash:W.literal(!0),composeHash:W.string(),appId:W.string(),deviceId:W.string(),kmsInfo:Ct,commitToken:W.string().optional(),commitUrl:W.string().optional(),apiCommitUrl:W.string().optional(),onchainStatus:W.object({compose_hash_allowed:W.boolean(),device_id_allowed:W.boolean(),is_allowed:W.boolean()}).optional()}),s_=W.discriminatedUnion("requiresOnChainHash",[o_,a_]);function i_(e){let t={};if(!e||typeof e!="object")return t;let r=e.details;if(!Array.isArray(r))return t;for(let o of r)o&&typeof o=="object"&&"field"in o&&"value"in o&&(t[o.field]=o.value);return t}var{action:aR,safeAction:Ql}=x(s_,async(e,t)=>{let n=r_.parse(t),{cvmId:r}=H.parse(n),{id:o,uuid:a,app_id:s,instance_id:i,name:l,prepareOnly:p,...m}=n;try{return{requiresOnChainHash:!1,correlationId:(p?await e.patch(`/cvms/${r}`,m,{headers:{"X-Prepare-Only":"true"}}):await e.patch(`/cvms/${r}`,m)).correlation_id}}catch(d){if(d instanceof yt&&d.status===465){let f=i_(d.detail);return{requiresOnChainHash:!0,composeHash:f.compose_hash,appId:String(f.app_id),deviceId:f.device_id,kmsInfo:f.kms_info,commitToken:f.commit_token,commitUrl:f.commit_url,apiCommitUrl:f.api_commit_url,onchainStatus:f.onchain_status}}throw d}}),c_=nt(Ke.extend({composeHash:Eo.string().describe("Compose hash from patchCvm Phase 1 response"),transactionHash:Eo.string().describe("Transaction hash proving on-chain registration")})),l_=Eo.object({correlationId:Eo.string()}),{action:iR,safeAction:em}=x(l_,async(e,t)=>{let n=c_.parse(t),{cvmId:r}=H.parse(n);return{correlationId:(await e.patch(`/cvms/${r}`,{},{headers:{"X-Compose-Hash":n.composeHash,"X-Transaction-Hash":n.transactionHash}})).correlation_id}}),m_=nt(Ke.extend({token:Zn.string().describe("One-time commit token from prepare-only flow"),composeHash:Zn.string().describe("Compose hash from Phase 1 response"),transactionHash:Zn.string().describe("Transaction hash proving on-chain registration")})),p_=Zn.object({correlationId:Zn.string(),status:Zn.string()}),{action:lR,safeAction:tm}=x(p_,async(e,t)=>{let n=m_.parse(t),{cvmId:r}=H.parse(n),o=await e.post(`/cvms/${r}/commit-update`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash});return{correlationId:o.correlation_id,status:o.status}}),nm=ut.object({cvm_id:ut.number().int(),identifier:ut.string(),status:ut.enum(["updated","unchanged","skipped","conflict","error"]),old_instance_id:ut.string().nullable().optional(),new_instance_id:ut.string().nullable().optional(),source:ut.enum(["teepod_state","teepod_info","gateway","none"]),verified_with_gateway:ut.boolean(),reason:ut.string().nullable().optional()}),d_=nt(Ke.extend({overwrite:ut.boolean().optional(),dry_run:ut.boolean().optional()})),{action:pR,safeAction:dR}=x(nm,async(e,t)=>{let n=d_.parse(t),{cvmId:r}=H.parse(n),{overwrite:o,dry_run:a}=n;return await e.patch(`/cvms/${r}/instance-id`,{overwrite:o,dry_run:a})}),u_=$e.object({cvm_ids:$e.array($e.string()).optional(),running_only:$e.boolean().optional(),missing_only:$e.boolean().optional(),overwrite:$e.boolean().optional(),limit:$e.number().int().min(1).max(500).optional(),dry_run:$e.boolean().optional()}).strict(),f_=$e.object({total:$e.number().int(),scanned:$e.number().int(),updated:$e.number().int(),unchanged:$e.number().int(),skipped:$e.number().int(),conflicts:$e.number().int(),errors:$e.number().int(),items:$e.array(nm)}),{action:fR,safeAction:gR}=x(f_,async(e,t)=>{let n=u_.parse(t);return await e.patch("/cvms/instance-ids",n)}),g_=Fe.object({vm_uuid:Fe.string(),status:Fe.string(),uptime:Fe.string().nullable().optional(),in_progress:Fe.boolean(),boot_progress:Fe.string().nullable().optional(),boot_error:Fe.string().nullable().optional(),operation_type:Fe.string().nullable().optional(),operation_started_at:Fe.string().nullable().optional(),correlation_id:Fe.string().nullable().optional()}),h_=Fe.record(Fe.string(),g_),y_=Fe.object({vmUuids:Fe.array(Fe.string())}),{action:yR,safeAction:To}=x(h_,async(e,t)=>{let{vmUuids:n}=y_.parse(t);return await e.post("/status/batch",{vm_uuids:n})}),v_=Dr.object({hostname:Dr.string().nullable().optional(),ssh_authorized_keys:Dr.array(Dr.string()).default([]),default_gateway_domain:Dr.string().nullable().optional()}),C_=H,{action:CR,safeAction:rm}=x(v_,async(e,t)=>{let{cvmId:n}=C_.parse(t);return await e.get(`/cvms/${n}/user_config`)}),xs=Ve.object({cvm_id:Ve.number().optional(),app_contract_address:Ve.string(),compose_hash:Ve.string(),device_id:Ve.string(),compose_hash_allowed:Ve.boolean(),allow_any_device:Ve.boolean(),device_id_allowed:Ve.boolean().nullable().optional(),is_allowed:Ve.boolean(),error:Ve.string().nullable().optional()}),b_=Ve.object({cvmId:Ve.string().min(1),compose_hash:Ve.string().optional(),node_id:Ve.number().optional(),device_id:Ve.string().optional()}),w_=b_,{action:wR,safeAction:_R}=x(xs,async(e,t)=>{let{cvmId:n,...r}=w_.parse(t);return await e.post(`/cvms/${n}/is-allowed`,r)}),__=Bn.object({appId:Bn.string().min(1),compose_hash:Bn.string(),node_id:Bn.number().optional(),device_id:Bn.string().optional(),chain_id:Bn.number().optional()}),{action:SR,safeAction:ER}=x(xs,async(e,t)=>{let{appId:n,...r}=__.parse(t);return await e.post(`/apps/${n}/is-allowed`,r)}),k_=ct.object({is_onchain:ct.boolean(),results:ct.array(xs.extend({cvm_id:ct.number()})).default([]),total:ct.number().default(0),allowed_count:ct.number().default(0),denied_count:ct.number().default(0),error_count:ct.number().default(0),skipped_cvm_ids:ct.array(ct.number()).default([])}),S_=ct.object({appId:ct.string().min(1)}),{action:AR,safeAction:PR}=x(k_,async(e,t)=>{let{appId:n}=S_.parse(t);return await e.post(`/apps/${n}/cvms/is-allowed`,{})}),E_=tt.object({page:tt.number().int().min(1).optional(),page_size:tt.number().int().min(1).max(100).optional(),search:tt.string().optional(),status:tt.array(tt.string()).optional(),listed:tt.boolean().optional(),base_image:tt.string().optional(),instance_type:tt.string().optional(),kms_slug:tt.string().optional(),kms_type:tt.string().optional(),node:tt.string().optional(),region:tt.string().optional()}).strict();function I_(e){return e==="2025-10-28"?iw:mw}async function A_(e,t){let n=E_.parse(t??{}),r=await e.get("/apps",{params:n});return I_(e.config.version).parse(r)}async function om(e,t){try{return{success:!0,data:await A_(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var P_=gl.object({appId:gl.string().min(1)}).strict();function $_(e){return e==="2025-10-28"?zl:Kl}async function R_(e,t){let{appId:n}=P_.parse(t),r=await e.get(`/apps/${n}`);return $_(e.config.version).parse(r)}async function am(e,t){try{return{success:!0,data:await R_(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var x_=Io.object({appId:Io.string().min(1)}).strict();function D_(e){return e==="2025-10-28"?Io.array(Pl):Io.array(Tr)}async function T_(e,t){let{appId:n}=x_.parse(t),r=await e.get(`/apps/${n}/cvms`);return D_(e.config.version).parse(r)}async function nr(e,t){try{return{success:!0,data:await T_(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var M_=Ut.object({appId:Ut.string().min(1),node_id:Ut.number().optional(),docker_compose_file:Ut.string().optional(),pre_launch_script:Ut.string().optional(),encrypted_env:Ut.string().optional(),compose_hash:Ut.string().optional(),token:Ut.string().optional(),transaction_hash:Ut.string().optional()}).strict(),{action:TR,safeAction:MR}=x(er,async(e,t)=>{let n=M_.parse(t),{appId:r,...o}=n;return await e.post(`/apps/${r}/instances`,o)}),L_=ze.object({device_id:ze.string(),node_name:ze.string().nullable(),cvm_ids:ze.array(ze.number()),allowed_onchain:ze.boolean(),status:ze.string()}),U_=ze.object({is_onchain_kms:ze.boolean(),allow_any_device:ze.boolean().nullable().optional(),chain_id:ze.number().nullable().optional(),app_contract_address:ze.string().nullable().optional(),devices:ze.array(L_).optional().default([])}),O_=ze.object({appId:ze.string().min(1)}).strict();async function N_(e,t){let{appId:n}=O_.parse(t),r=await e.get(`/apps/${n}/device-allowlist`);return U_.parse(r)}async function Mo(e,t){try{return{success:!0,data:await N_(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var OR=_o.object({appId:_o.string().min(1),page:_o.number().int().min(1).optional(),page_size:_o.number().int().min(1).max(1e3).optional()}).strict();var jR=ko.object({appId:ko.string().min(1),revisionId:ko.string().min(1),rawComposeFile:ko.boolean().optional()}).strict();var VR=je.object({statuses:je.array(je.string()),image_versions:je.array(je.string()),instance_types:je.array(je.string()),kms_slugs:je.array(je.string()),kms_types:je.array(je.string()),regions:je.array(je.string()),nodes:je.array(je.string())});var j_=Q.object({contract_address:Q.string(),chain_id:Q.string().nullable(),version:Q.string(),url:Q.string(),gateway_app_id:Q.string().nullable(),gateway_app_url:Q.string(),kms_type:Q.string()}),hl=Q.object({app_id:Q.string().optional(),instance_id:Q.string().optional(),app_name:Q.string().optional(),device_id:Q.string().optional()}).passthrough().nullable(),F_=Q.object({vm_uuid:Q.string().nullable().optional(),name:Q.string().optional(),instance_id:Q.string().nullable().optional(),status:Q.string().optional(),image_version:Q.string().nullable().optional(),quote:Q.string().nullable().optional(),ppid:Q.string().optional(),device_id:Q.string().optional(),tcb_info:jl.nullable().optional(),app_certificates:Q.array(Nl).nullable().optional(),compose_file:Q.string().nullable().optional(),error:Q.string().nullable().optional()}),V_=Q.object({app_id:Q.string(),contract_address:Q.string(),kms_info:j_,instances:Q.array(F_),kms_guest_agent_info:hl,gateway_guest_agent_info:hl,qemu_version:Q.string().nullable()}),H_=Q.object({appId:Q.string().min(1)}).strict(),{action:zR,safeAction:KR}=x(V_,async(e,t)=>{let{appId:n}=H_.parse(t);return await e.get(`/apps/${n}/attestations`)}),z_=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function K_(e){let t={},n=e.toString();n=n.replace(/\r\n?/gm,`
25
+ `);let r;for(;(r=z_.exec(n))!=null;){let o=r[1];if(!o)continue;let a=r[2]||"";a=a.trim();let s=a[0];a=a.replace(/^(['"`])([\s\S]*)\1$/gm,"$2"),s==='"'&&(a=a.replace(/\\n/g,`
26
+ `),a=a.replace(/\\r/g,"\r")),t[o]=a}return t}function rr(e){let t=K_(e),n=[];for(let[r,o]of Object.entries(t))n.push({key:r,value:o});return n}function Lo(e){return e.split(/[\s-]+/).filter(Boolean).map((t,n)=>n===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function sm(e){return e===void 0?[]:Array.isArray(e)?[...e]:[e]}function im(e,t){let n={};for(let i of t.flagConfig.descriptors.values()){let l=t.flags[i.canonicalKey];l!==void 0&&(n[i.target]=l)}for(let i of t.flagConfig.negatedLookup.values())i.negatedKey&&t.flags[i.negatedKey]&&(n[i.target]=!1);t.passThrough.length>0&&(n["--"]=t.passThrough);let r={},o=e.arguments??[],a=[...t.positionals],s=0;for(let i of o){let l=i.target??Lo(i.name);if(i.variadic){r[l]=a.slice(s),s=a.length;break}a[s]!==void 0&&(r[l]=a[s]),s+=1}return{options:n,positionals:r,raw:{flags:t.flags,positionals:t.positionals}}}import Q_ from"arg";var B_={name:"help",shorthand:"h",description:"Show help information for the current command",type:"boolean",target:"help"},W_={name:"version",shorthand:"v",description:"Show CLI version",type:"boolean",target:"version"},O={name:"interactive",shorthand:"i",description:"Enable interactive mode",type:"boolean",target:"interactive",group:"basic"},J_={name:"interactive",description:"Enable interactive mode for commands that support it",type:"boolean",target:"interactive",group:"basic"},cm={name:"api-token",description:"API token for authenticating with Phala Cloud",type:"string",target:"apiToken",aliases:["api-key"],argumentName:"token",group:"basic"},ke={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json",group:"basic"},Y_={name:"profile",description:"Temporarily use a different auth profile for this command",type:"string",target:"profile",argumentName:"profile",group:"basic"},Z_={name:"api-version",description:"API version to use (e.g. 2025-10-28, 2026-01-21)",type:"string",target:"apiVersion",group:"advanced"},on=[cm],Y={name:"cvm_id",description:"CVM identifier (UUID, app_id, instance_id, or name)",required:!1,target:"cvmId"},wn={name:"cvm-id",description:"CVM identifier (UUID, app_id, instance_id, or name)",type:"string",target:"cvmId"},lm={name:"uuid",description:"[DEPRECATED] Use --cvm-id instead. CVM UUID.",type:"string",target:"cvmId",deprecated:!0,group:"deprecated"},Ze={name:"private-key",description:"Private key for signing on-chain transactions (or set PRIVATE_KEY env var)",type:"string",target:"privateKey",group:"advanced"},Ge={name:"rpc-url",description:"RPC URL for on-chain KMS transactions (or set ETH_RPC_URL env var)",type:"string",target:"rpcUrl",group:"advanced"},or={name:"transaction-hash",description:"Transaction hash proving on-chain compose hash registration. Pass `already-registered` to skip the proof and rely on state-only verification.",type:"string",target:"transactionHash",group:"advanced"},_n=[B_,W_,cm,ke,J_,wn,Y_,Z_];import mm from"arg";function pm(e){let t={},n=new Map,r=new Map;if(!e)return{spec:t,descriptors:n,negatedLookup:r};for(let o of e){let a=`--${o.name}`,s=o.target??Lo(o.name),i=X_(o.type);n.set(a,{option:o,canonicalKey:a,target:s,negatedKey:o.negatedName?`--${o.negatedName}`:void 0}),t[a]=i,o.shorthand&&(t[`-${o.shorthand}`]=a);for(let l of sm(o.aliases))t[`--${l}`]=a;if(o.negatedName){let l=`--${o.negatedName}`;if(o.type!=="boolean")throw new Error(`Negated option is only supported for boolean types: ${o.name}`);t[l]=mm.flag(()=>!0),r.set(l,{option:o,canonicalKey:a,target:s,negatedKey:l})}}return{spec:t,descriptors:n,negatedLookup:r}}function X_(e){switch(e){case"string":return(t="")=>t;case"number":return(t,n)=>{let r=Number(t);if(Number.isNaN(r))throw new Error(`Invalid value for ${n}: expected a number.`);return r};case"boolean":return mm.flag(()=>!0);case"string[]":return(t,n,r)=>{let o=Array.isArray(r)?[...r]:[];if(t==="")throw new Error(`Option ${n} expects a value.`);return o.push(t),o};case"number[]":return(t,n,r)=>{let o=Array.isArray(r)?[...r]:[],a=Number(t);if(Number.isNaN(a))throw new Error(`Invalid value for ${n}: expected a number.`);return o.push(a),o};default:throw new Error(`Unsupported option type: ${e}`)}}function ek(e){let t=e.indexOf("--");return t===-1?[[...e],[]]:[e.slice(0,t),e.slice(t+1)]}function Fr(e,t,n={}){let r=[..._n,...t?[...t]:[]],o=pm(r),{permissive:a=!1,stopAtPositional:s=!1}=n,[i,l]=ek(e),p=Q_(o.spec,{argv:i,permissive:a,stopAtPositional:s}),{_:m,...d}=p;return{positionals:m??[],flags:d,flagConfig:o,passThrough:l}}var an=Object.freeze({envs:Object.freeze({name:"envs",description:"All environment variables recognized by the Phala CLI. Command-line flags always take precedence over environment variables when both are set.",content:`# Environment Variables
27
+
28
+ All environment variables recognized by the Phala CLI. Command-line flags always take precedence over environment variables when both are set.
29
+
30
+ ## Authentication
31
+
32
+ - \`PHALA_CLOUD_API_KEY\` \u2014 API token. Overrides the token stored by \`phala login\`.
33
+ - \`PHALA_CLOUD_API_PREFIX\` \u2014 API base URL. Default: \`https://cloud-api.phala.com/api/v1\`.
34
+
35
+ The \`@phala/cloud\` JS SDK also reads both directly when \`createClient()\` is
36
+ called without explicit config.
37
+
38
+ ## On-chain KMS
39
+
40
+ These variables apply to \`deploy\`, \`allow-devices\`, \`cvms replicate\`, and
41
+ \`envs update\` when the CVM uses Ethereum or Base KMS:
42
+
43
+ - \`PRIVATE_KEY\` \u2014 Private key for signing on-chain transactions.
44
+ Precedence: \`--private-key\` > \`PRIVATE_KEY\`.
45
+ - \`ETH_RPC_URL\` \u2014 RPC endpoint. Follows the foundry/cast convention, so an
46
+ existing \`ETH_RPC_URL\` from those tools works automatically.
47
+ Precedence: \`--rpc-url\` > \`ETH_RPC_URL\` > chain default.
48
+
49
+ Example:
50
+
51
+ export ETH_RPC_URL=https://mainnet.base.org
52
+ export PRIVATE_KEY=0x...
53
+ phala deploy --kms base
54
+
55
+ ## Debug logging
56
+
57
+ \`DEBUG\` has two independent consumers that behave differently:
58
+
59
+ - **CLI debug output** \u2014 any non-empty value enables the CLI's own debug
60
+ messages on stderr (gray prefix).
61
+ - **API request logging** \u2014 the \`@phala/cloud\` JS SDK uses the \`debug\` npm
62
+ package with namespace \`phala::api-client\`. Set \`DEBUG=phala::api-client\`
63
+ to print every HTTP request in cURL-like format (method, URL, headers,
64
+ body).
65
+
66
+ Examples:
67
+
68
+ # CLI debug only
69
+ DEBUG=1 phala deploy
70
+
71
+ # API request cURL logging (also triggers CLI debug, since "phala::api-client" is truthy)
72
+ DEBUG=phala::api-client phala deploy
73
+
74
+ # Everything
75
+ DEBUG=* phala deploy
76
+
77
+ ## Self-update
78
+
79
+ - \`PHALA_UPDATE_CHANNEL\` \u2014 Release channel for \`phala self update\` (e.g. \`latest\`, \`beta\`).
80
+ - \`PHALA_DISABLE_UPDATE_CHECK\` \u2014 Any truthy value disables the background update notice.
81
+ - \`CI\` \u2014 Standard CI flag. Any truthy value disables the update notice.
82
+
83
+ ## Miscellaneous
84
+
85
+ - \`CLOUD_URL\` \u2014 Override the Phala Cloud portal URL used in printed links.
86
+ Default: \`https://cloud.phala.com\`.
87
+
88
+ ## Internal (undocumented)
89
+
90
+ - \`PHALA_CLOUD_DIR\` \u2014 Override the credentials directory. Default: \`~/.phala-cloud\`.
91
+ Testing only.
92
+
93
+ ## See also
94
+
95
+ - \`phala api --help\` for API-specific flags and env vars
96
+ - \`phala login --help\` for authentication flow
97
+ - \`phala deploy --help\` for on-chain KMS flags
98
+ `})});function Uo(e){return e==="unstable"?" [UNSTABLE]":e==="deprecated"?" [DEPRECATED]":""}function tk(e,t){let n=Object.values(an);if(n.length!==0){e.push("Help topics:");for(let r of n)e.push(` ${r.name.padEnd(18)}${r.description}`.trimEnd());e.push(""),e.push(`Use "${t} help <topic>" to read a topic.`),e.push("")}}function No(e){let{registry:t,executableName:n}=e,r=[];r.push(`Usage: ${n} <command> [options]`),r.push("");let o=t.getChildren(),a=l=>{switch(l){case"deploy":return"Deploy:";case"manage":return"Manage:";case"cvm-ops":return"CVM operations:";case"profile":return"Profile / auth:";case"advanced":return"Advanced:";case"deprecated":return"Deprecated:"}},s=["deploy","manage","cvm-ops","profile","advanced","deprecated"],i=l=>{let p=l.command?.meta??l.group?.meta;if(p?.category)return p.category;let m=l.name??"";return p?.stability==="deprecated"?"deprecated":m==="nodes"||m==="deploy"?"deploy":m==="apps"||m==="cvms"||m==="link"||m==="simulator"?"manage":m==="ssh"||m==="cp"||m==="ps"||m==="logs"?"cvm-ops":m==="login"||m==="logout"||m==="switch"||m==="status"?"profile":m==="api"||m==="self"?"advanced":m==="auth"||m==="config"||m==="docker"?"deprecated":"advanced"};for(let l of s){let p=o.filter(m=>i(m)===l).sort((m,d)=>(m.name??"").localeCompare(d.name??""));if(p.length!==0){r.push(a(l));for(let m of p){let d=m.command?.meta??m.group?.meta,f=(d?.description??"").split(`
99
+ `)[0],u=d?.stability,h=u?Uo(u):"",g=m.name??"",y=d?.aliases,b=y?.length?`${g} (${y.join(", ")})`:g;r.push(` ${b.padEnd(18)}${f}${h}`.trimEnd())}r.push("")}}tk(r,n),r.push("Global options:");for(let l of _n){let p=Oo(l),m=Math.max(24,p.length+2);r.push(` ${p.padEnd(m)}${l.description??""}`.trimEnd())}return r.join(`
100
+ `)}function dm(e){let{registry:t,executableName:n,groupPath:r}=e,o=t.getNode(r);if(!o?.group)return No({registry:t,executableName:n});let a=[],s=r.join(" "),i=`${n} ${s}`;a.push(`Usage: ${i} <command> [options]`),a.push(""),o.group.meta.description&&(a.push(o.group.meta.description),a.push(""));let l=t.getChildren(r);if(l.length>0){a.push("Available commands:");for(let p of l){let m=p.command?.meta??p.group?.meta,d=(m?.description??"").split(`
101
+ `)[0],f=m?.stability,u=f?Uo(f):"",h=p.name??"",g=m?.aliases,y=g?.length?`${h} (${g.join(", ")})`:h;a.push(` ${y.padEnd(18)}${d}${u}`.trimEnd())}a.push("")}a.push("Global options:");for(let p of _n){let m=Oo(p),d=Math.max(24,m.length+2);a.push(` ${m.padEnd(d)}${p.description??""}`.trimEnd())}return a.join(`
102
+ `)}function Ds(e){let{executableName:t,definition:n,registry:r}=e,o=nk({executableName:t,definition:n}),a=Uo(n.meta.stability),s=[o,"",`${n.meta.description}${a}`],i=n.meta.arguments??[];if(i.length>0){s.push(""),s.push("Arguments:");for(let y of i){let b=ok(y);s.push(` ${b.padEnd(18)}${y.description??""}`.trimEnd())}}let l=[...n.meta.options??[]],p=new Set;(n.path.length===1&&(n.path[0]==="login"||n.path[0]==="api")||n.path.length===2&&n.path[0]==="auth"&&n.path[1]==="login")&&p.add("profile");let m=l.filter(y=>!y.hidden),d=new Map(m.map(y=>[y.name,y])),f=_n.filter(y=>!y.hidden).filter(y=>!p.has(y.name)).map(y=>d.get(y.name)??y),u=new Set(f.map(y=>y.name)),h=m.filter(y=>!u.has(y.name));if(f.length>0){let y=new Set(h.map(b=>b.shorthand).filter(b=>typeof b=="string"&&b.length>0));s.push(""),s.push("Global options:");for(let b of f){let w=!b.shorthand||!y.has(b.shorthand),S=Oo(b,{includeShorthand:w}),k=Math.max(24,S.length+2);s.push(` ${S.padEnd(k)}${b.description??""}`.trimEnd())}}if(h.length>0){let y=k=>k.group==="deprecated"||k.deprecated?!0:(k.description??"").includes("[DEPRECATED]"),b=k=>k.group?k.group:y(k)?"deprecated":"basic",w={basic:[],advanced:[],deprecated:[]};for(let k of h)w[b(k)].push(k);let S=(k,_)=>{if(_.length!==0){s.push(""),s.push(k);for(let I of _){let $=Oo(I),M=Math.max(24,$.length+2);s.push(` ${$.padEnd(M)}${I.description??""}`.trimEnd())}}};S("Basic options:",w.basic),S("Advanced options:",w.advanced),S("Deprecated options:",w.deprecated)}if(n.meta.passThrough&&(s.push(""),s.push("Pass-through (after --):"),s.push(` ${n.meta.passThrough.description}`),n.meta.passThrough.examples&&n.meta.passThrough.examples.length>0)){s.push(""),s.push(" Examples:");for(let y of n.meta.passThrough.examples)s.push(` ${y}`)}if(n.meta.examples&&n.meta.examples.length>0){s.push(""),s.push("Examples:");for(let y of n.meta.examples)s.push(` # ${y.name}`),s.push(` ${y.value}`)}let g=r.getChildren(n.path);if(g.length>0){s.push(""),s.push("Subcommands:");for(let y of g){let b=y.command?.meta??y.group?.meta,w=(b?.description??"").split(`
103
+ `)[0],S=b?.stability,k=S?Uo(S):"",_=y.name??"",I=b?.aliases,$=I?.length?`${_} (${I.join(", ")})`:_;s.push(` ${$.padEnd(18)}${w}${k}`.trimEnd())}}return s.join(`
104
+ `)}function nk({executableName:e,definition:t}){let n=[e,...t.path],o=(t.meta.arguments??[]).map(p=>rk(p)).join(" "),s=(t.meta.options?.length??0)>0?" [options]":"",i=o?` ${o}`:"",l=t.meta.passThrough?" [--] [...]":"";return`Usage: ${n.join(" ")}${s}${i}${l}`}function rk(e){let t=`<${e.name}>`;return e.variadic?`${t}...`:e.required===!1?`[${t}]`:t}function ok(e){return e.variadic?`<${e.name}...>`:e.required===!1?`<${e.name}>?`:`<${e.name}>`}function Oo(e,{includeShorthand:t=!0}={}){let n=[];t&&e.shorthand&&n.push(`-${e.shorthand}`);let r=`--${e.name}`;if(e.argumentName?r+=` ${e.argumentName.toUpperCase()}`:e.type!=="boolean"&&(r+=" <value>"),n.push(r),e.aliases&&e.aliases.length>0)for(let o of e.aliases){let a=`--${o}`;e.argumentName?a+=` ${e.argumentName.toUpperCase()}`:e.type!=="boolean"&&(a+=" <value>"),n.push(a)}return e.type==="boolean"&&e.negatedName&&n.push(`--${e.negatedName}`),n.join(", ")}var um;function fm(e){return Cn.includes(e)}function gm(e){um=e}function Ts(){return um}var Ms=!1;function Vr(e){Ms=e}function ee(){return Ms}function Ls(){return!Ms}import ck from"path";import jo from"fs-extra";import ym from"@iarna/toml";import{z as wt}from"zod";import qe from"chalk";import ak from"ora";function sk(e,t){let n=e.split(/\s+/),r=[],o="";for(let a of n){let s=o.length===0?a:`${o} ${a}`;s.length<=t?o=s:(o.length>0&&r.push(o),o=a)}return o.length>0&&r.push(o),r}function ik(e,t){if(e.length<=t)return[e];let n=[],r=0;for(;r<e.length;)n.push(e.slice(r,r+t)),r+=t;return n}function hm(e,t){let n=[];for(let r of e.split(`
105
+ `)){if(r.length<=t){n.push(r);continue}if(r.indexOf(" ")===-1){n.push(...ik(r,t));continue}let o=sk(r,t);n.push(...o)}if(n.length===0){let r=e.trim();n.push(r)}return n}var c={error:(e,...t)=>{ee()||(process.stderr.write(`${qe.red("\u2717")} ${qe.red(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
106
+ `))},warn:(e,...t)=>{ee()||(process.stderr.write(`${qe.yellow("\u26A0")} ${qe.yellow(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
107
+ `))},info:(e,...t)=>{ee()||(process.stderr.write(`${qe.blue("\u2139")} ${qe.blue(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
108
+ `))},success:(e,...t)=>{ee()||(process.stderr.write(`${qe.green("\u2713")} ${qe.green(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
109
+ `))},debug:(e,...t)=>{ee()||process.env.DEBUG&&(process.stderr.write(`${qe.gray("\u{1F50D}")} ${qe.gray(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
110
+ `))},table:(e,t)=>{if(!ee()){if(e.length===0){console.log(qe.yellow("No data to display"));return}if(t){let n;typeof t[0]=="string"?n=t.map(s=>({key:s,header:s})):n=t;let r={};for(let s of n){let i=s.header||String(s.key);r[String(s.key)]=i.length}for(let s of e)for(let i of n){let l=String(typeof i.key=="string"&&!(i.key in s)?"":s[String(i.key)]??"");r[String(i.key)]=Math.max(r[String(i.key)],l.length)}let o=[];for(let s of n){let i=s.header||String(s.key);o.push(qe.bold(i.padEnd(r[String(s.key)])))}console.log(o.join(" "));let a=[];for(let s of n)a.push("-".repeat(r[String(s.key)]));console.log(a.join(" "));for(let s of e){let i=[];for(let l of n){let p=String(typeof l.key=="string"&&!(l.key in s)?"":s[String(l.key)]??"");i.push(p.padEnd(r[String(l.key)]))}console.log(i.join(" "))}}else{let n=e[0],r=Object.keys(n),o={};for(let i of r)o[i]=i.length;for(let i of e)for(let l of r){let p=String(i[l]??"");o[l]=Math.max(o[l],p.length)}let a=[];for(let i of r)a.push(qe.bold(i.padEnd(o[i])));console.log(a.join(" "));let s=[];for(let i of r)s.push("-".repeat(o[i]));console.log(s.join(" "));for(let i of e){let l=[];for(let p of r){let m=String(i[p]??"");l.push(m.padEnd(o[p]))}console.log(l.join(" "))}}}},keyValueTable:(e,t)=>{if(ee())return;let{borderStyle:n="single",keyColor:r=qe.blue,valueColor:o=qe.white,maxWidth:a=process.stdout.columns||80}=t||{},i={single:{topLeft:"\u250C",topRight:"\u2510",bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",vertical:"\u2502",cross:"\u253C",leftT:"\u251C",rightT:"\u2524"},double:{topLeft:"\u2554",topRight:"\u2557",bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",vertical:"\u2551",cross:"\u256C",leftT:"\u2560",rightT:"\u2563"},rounded:{topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",vertical:"\u2502",cross:"\u253C",leftT:"\u251C",rightT:"\u2524"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomLeft:"\u2517",bottomRight:"\u251B",horizontal:"\u2501",vertical:"\u2503",cross:"\u254B",leftT:"\u2523",rightT:"\u252B"},none:{topLeft:"",topRight:"",bottomLeft:"",bottomRight:"",horizontal:"",vertical:"",cross:"",leftT:"",rightT:""}}[n],l=0,p=0;for(let[h,g]of Object.entries(e)){l=Math.max(l,h.length);let y=String(g??"");p=Math.max(p,y.length)}let m=4,d=1,f=a-m-d;if(l+p>f){let h=l/(l+p);l=Math.floor(f*h),p=f-l}let u=l+p+m+d;n!=="none"&&console.log(i.topLeft+i.horizontal.repeat(u-2)+i.topRight);for(let[h,g]of Object.entries(e)){let y=h,b=String(g??""),w=hm(y,l),S=hm(b,p),k=Math.max(w.length,S.length);for(;w.length<k;)w.push("");for(;S.length<k;)S.push("");for(let _=0;_<k;_++){let I=w[_].padEnd(l),$=S[_].padEnd(p);console.log(n!=="none"?`${i.vertical} ${r(I)} ${i.vertical} ${o($)} ${i.vertical}`:`${r(I)} : ${o($)}`)}}n!=="none"&&console.log(i.bottomLeft+i.horizontal.repeat(u-2)+i.bottomRight)},break:()=>{ee()||process.stderr.write(`
111
+ `)},startSpinner:e=>{if(ee())return{stop:()=>{}};let t=ak(e).start();return{stop:(n=!0,r)=>{r&&(t.text=r),n?t.succeed():t.fail()}}},logDetailedError(e,t){if(ee())return;let n=t?`[${t}] `:"",r=a=>a!==null&&typeof a=="object"&&"isRequestError"in a&&a.isRequestError===!0&&"status"in a&&"message"in a&&"data"in a,o=a=>a!==null&&typeof a=="object"&&"issues"in a&&Array.isArray(a.issues);if(r(e)){process.stderr.write(`${n}HTTP ${e.status}: ${e.message}
38
112
  `),e.data!==void 0&&e.data!==null&&process.stderr.write(`${JSON.stringify(e.data,null,2)}
39
- `);return}if(o(e)){process.stderr.write(`${r}Validation error: ${JSON.stringify(e.issues)}
40
- `);return}e instanceof Error?process.stderr.write(`${r}${e.message}
41
- `):process.stderr.write(`${r}${String(e)}
42
- `)}};var xl=Xe.extend({profile:at.string().optional(),api_version:at.enum(Yt).optional(),gateway_domain:at.string().optional(),gateway_port:at.number().int().positive().optional(),compose_file:at.string().optional(),env_file:at.string().optional(),public_logs:at.boolean().optional(),public_sysinfo:at.boolean().optional(),listed:at.boolean().optional()}),mn="phala.toml";function cs(){return _w.join(process.cwd(),mn)}function so(){return ao.existsSync(cs())}function Sw(){let e=cs();if(!ao.existsSync(e))throw new Error(`Project configuration file not found: ${mn}
43
- Run 'phala init' to create one.`);try{let t=ao.readFileSync(e,"utf8"),r=Al.parse(t),n=xl.parse(r);if(n.id||n.uuid||n.app_id||n.instance_id||n.name){let{cvmId:o}=G.parse(n);return{...n,cvm_id:o}}return n}catch(t){if(t instanceof at.ZodError){let r=t.issues.map(n=>` - ${n.path.join(".")}: ${n.message}`).join(`
113
+ `);return}if(o(e)){process.stderr.write(`${n}Validation error: ${JSON.stringify(e.issues)}
114
+ `);return}e instanceof Error?process.stderr.write(`${n}${e.message}
115
+ `):process.stderr.write(`${n}${String(e)}
116
+ `)}};var vm=Ke.extend({profile:wt.string().optional(),api_version:wt.enum(Cn).optional(),gateway_domain:wt.string().optional(),gateway_port:wt.number().int().positive().optional(),compose_file:wt.string().optional(),env_file:wt.string().optional(),public_logs:wt.boolean().optional(),public_sysinfo:wt.boolean().optional(),listed:wt.boolean().optional()}),Hr="phala.toml";function Us(){return ck.join(process.cwd(),Hr)}function zr(){return jo.existsSync(Us())}function lk(){let e=Us();if(!jo.existsSync(e))throw new Error(`Project configuration file not found: ${Hr}
117
+ Run 'phala init' to create one.`);try{let t=jo.readFileSync(e,"utf8"),n=ym.parse(t),r=vm.parse(n);if(r.id||r.uuid||r.app_id||r.instance_id||r.name){let{cvmId:o}=H.parse(r);return{...r,cvm_id:o}}return r}catch(t){if(t instanceof wt.ZodError){let n=t.issues.map(r=>` - ${r.path.join(".")}: ${r.message}`).join(`
44
118
  `);throw new Error(`Invalid project configuration:
45
- ${r}`)}throw new Error(`Failed to parse ${mn}: ${t instanceof Error?t.message:String(t)}`)}}function Pl(e){let t=cs();try{let r=xl.parse(e),n=Al.stringify(r);ao.writeFileSync(t,n,"utf8"),i.success(`Project configuration saved to ${mn}`)}catch(r){if(r instanceof at.ZodError){let n=r.issues.map(o=>` - ${o.path.join(".")}: ${o.message}`).join(`
119
+ ${n}`)}throw new Error(`Failed to parse ${Hr}: ${t instanceof Error?t.message:String(t)}`)}}function Os(e){let t=Us();try{let n=vm.parse(e),r=ym.stringify(n);jo.writeFileSync(t,r,"utf8"),c.success(`Project configuration saved to ${Hr}`)}catch(n){if(n instanceof wt.ZodError){let r=n.issues.map(o=>` - ${o.path.join(".")}: ${o.message}`).join(`
46
120
  `);throw new Error(`Invalid configuration:
47
- ${n}`)}throw new Error(`Failed to save ${mn}: ${r instanceof Error?r.message:String(r)}`)}}function pn(){return so()?Sw():{}}function $l(e){if(!e)return;let{cvmId:t}=G.parse({id:e});return t}import _t from"fs";import kw from"os";import co from"path";var gt="https://cloud-api.phala.com/api/v1";function lo(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:co.join(kw.homedir(),".phala-cloud")}function un(){return co.join(lo(),"credentials.json")}function ls(){return co.join(lo(),"api-key")}function Dl(){return co.join(lo(),"docker-credentials.json")}function Rl(){let e=lo();_t.existsSync(e)||_t.mkdirSync(e,{recursive:!0})}function io(e){return typeof e=="string"&&e.trim().length>0}function mo(e){let t=e.trim();return t.length===0?"default":t}function Ge(){try{let e=un();if(!_t.existsSync(e))return null;let t=_t.readFileSync(e,"utf8"),r=JSON.parse(t);if(!r||typeof r!="object")return null;let n=r;return n.schema_version!==1||!io(n.current_profile)||!n.profiles||typeof n.profiles!="object"?null:n}catch(e){return i.error("Failed to read credentials file:",e),null}}function ms(e){Rl(),_t.writeFileSync(un(),JSON.stringify(e,null,2),{mode:384,encoding:"utf8"})}function Ml(e){let t=Ge(),r=mo(e.profile||e.projectProfile||t?.current_profile||"default"),n=e.env.PHALA_CLOUD_API_PREFIX,o=t?.profiles?.[r]?.api_prefix,a=(n&&n.trim().length>0?n:o&&o.trim().length>0?o:gt)??gt,s=n?"env":o?"file":"default";if(io(e.apiToken))return{apiKey:e.apiToken,baseURL:a,profileName:r,tokenSource:"flag",apiPrefixSource:s};if(io(e.env.PHALA_CLOUD_API_KEY))return{apiKey:e.env.PHALA_CLOUD_API_KEY,baseURL:a,profileName:r,tokenSource:"env",apiPrefixSource:s};let c=t?.profiles?.[r]?.token;return io(c)?{apiKey:c,baseURL:a,profileName:r,tokenSource:"file",apiPrefixSource:s}:{apiKey:null,baseURL:a,profileName:r,tokenSource:"none",apiPrefixSource:s}}function Rr(e){let t=mo(e.profileName),r=(e.apiPrefix||gt).trim(),n=Ge(),a=e.setCurrent??!0?t:n?.current_profile||t,s=e.workspaceSlug?{name:e.workspaceName,slug:e.workspaceSlug}:{name:e.workspaceName},c={schema_version:1,current_profile:a,profiles:{...n?.profiles||{},[t]:{token:e.token,api_prefix:r.length>0?r:gt,workspace:s,user:e.user,updated_at:new Date().toISOString()}}};ms(c)}function po(e){let t=Ge();if(!t)return;let r=mo(e||t.current_profile),n={...t.profiles};delete n[r];let o=Object.keys(n);if(o.length===0){try{_t.unlinkSync(un())}catch(c){i.error("Failed to remove credentials file:",c)}return}let s={schema_version:1,current_profile:t.current_profile===r?o[0]:t.current_profile,profiles:n};ms(s)}function dn(){let e=Ge();return e?Object.keys(e.profiles):[]}function ps(e){let t=mo(e),r=Ge();if(!r)throw new Error("No credentials file found. Please login first.");if(!r.profiles[t])throw new Error(`Profile "${t}" not found`);r.current_profile!==t&&ms({...r,current_profile:t})}function Qt(){let e=Ge();if(!e)return null;let t=e.current_profile,r=e.profiles[t];return r?{name:t,info:r}:null}async function us(e){Rl();try{_t.writeFileSync(Dl(),JSON.stringify(e,null,2),{mode:384}),i.success("Docker information saved successfully.")}catch(t){throw i.error("Failed to save Docker information:",t),t}}async function St(){try{let e=Dl();if(_t.existsSync(e)){let t=_t.readFileSync(e,"utf8");return JSON.parse(t)}return null}catch(e){return i.error("Failed to read Docker credentials:",e),null}}var Tl="2026-01-21";function Ew(){return{env:process.env,projectConfig:pn()}}function ht(e,t){let r=e??Ew();return Ml({env:r.env,apiToken:t?.apiToken,profile:t?.profile,projectProfile:r.projectConfig.profile})}async function k(e,t){let r=ht(e,t),n=as()??Tl;return Qe({apiKey:r.apiKey??void 0,baseURL:r.baseURL,version:n})}async function uo(e,t){let r=ht(e,t);return{client:await k(e,t),auth:r}}async function fo(e,t){let r=as()??Tl;return Qe({apiKey:e,baseURL:t?.baseURL,version:r})}import{z as y}from"zod";var Iw=y.object({password:y.string(),registry:y.string().nullable(),username:y.string()}),Jx=y.object({docker_compose_file:y.string(),docker_config:Iw.optional().nullable(),features:y.array(y.string()),kms_enabled:y.boolean(),manifest_version:y.number(),name:y.string(),public_logs:y.boolean(),public_sysinfo:y.boolean(),runner:y.string().optional(),salt:y.string().nullable().optional(),tproxy_enabled:y.boolean(),version:y.string().optional()}).passthrough(),Ll=y.object({id:y.number(),name:y.string(),status:y.string(),teepod_id:y.number().nullable(),teepod:y.object({id:y.number(),name:y.string()}).nullable(),user_id:y.number().nullable(),app_id:y.string(),vm_uuid:y.string().nullable(),instance_id:y.string().nullable(),app_url:y.string().nullable(),base_image:y.string().nullable(),vcpu:y.number(),memory:y.number(),disk_size:y.number(),manifest_version:y.number().nullable(),version:y.string().nullable(),runner:y.string().nullable(),docker_compose_file:y.string().nullable(),features:y.array(y.string()).nullable(),created_at:y.string(),encrypted_env_pubkey:y.string().nullable()}),Yx=y.object({key:y.string(),value:y.string()}),Aw=y.object({is_online:y.boolean(),is_public:y.boolean(),error:y.string().nullable(),internal_ip:y.string(),latest_handshake:y.string(),public_urls:y.array(y.object({app:y.string(),instance:y.string()}))}),Nl=y.object({id:y.number(),name:y.string(),status:y.string(),teepod_id:y.number(),teepod:y.object({id:y.number(),name:y.string()}),user_id:y.number().nullable(),app_id:y.string(),vm_uuid:y.string().nullable(),instance_id:y.string().nullable(),app_url:y.string().nullable(),base_image:y.string().nullable(),vcpu:y.number(),memory:y.number(),disk_size:y.number(),manifest_version:y.number().nullable(),version:y.string().nullable(),runner:y.string().nullable(),docker_compose_file:y.string().nullable(),features:y.array(y.string()).nullable(),created_at:y.string(),encrypted_env_pubkey:y.string().nullable()}),Ul=y.object({is_online:y.boolean(),is_public:y.boolean(),error:y.string().nullable(),app_certificates:y.array(y.object({subject:y.object({common_name:y.string().nullable(),organization:y.string().nullable(),country:y.string().nullable(),state:y.string().nullable().optional(),locality:y.string().nullable().optional()}),issuer:y.object({common_name:y.string().nullable(),organization:y.string().nullable(),country:y.string().nullable()}),serial_number:y.string(),not_before:y.string(),not_after:y.string(),version:y.string(),fingerprint:y.string(),signature_algorithm:y.string(),sans:y.string().nullable(),is_ca:y.boolean(),position_in_chain:y.number(),quote:y.string().nullable()})).nullable(),tcb_info:y.object({mrtd:y.string(),rootfs_hash:y.string(),rtmr0:y.string(),rtmr1:y.string(),rtmr2:y.string(),rtmr3:y.string(),event_log:y.array(y.object({imr:y.number(),event_type:y.number(),digest:y.string(),event:y.string(),event_payload:y.string()}))}).nullable(),compose_file:y.string().nullable()}),xw=y.object({name:y.string(),description:y.string().optional(),version:y.array(y.number()).optional(),is_dev:y.boolean().optional(),os_image_hash:y.string().nullable().optional(),rootfs_hash:y.string().optional(),shared_ro:y.boolean().optional(),cmdline:y.string().optional(),kernel:y.string().optional(),initrd:y.string().optional(),hda:y.string().nullable().optional(),rootfs:y.string().optional(),bios:y.string().optional()}),Zx=y.object({teepod_id:y.number().nullable(),id:y.number().optional(),name:y.string(),listed:y.boolean().optional(),resource_score:y.number().optional(),remaining_vcpu:y.number().optional(),remaining_memory:y.number().optional(),remaining_cvm_slots:y.number().optional(),images:y.array(xw).optional(),region_identifier:y.string().optional(),dedicated_for_team_id:y.number().nullable().optional(),support_onchain_kms:y.boolean().optional(),fmspc:y.string().nullable().optional(),device_id:y.string().nullable().optional()});import Pw from"inquirer";async function Ol(e){let t=await k(),r=await rn(t,{id:e});if(!r.success)throw new Error(r.error.message);return r.data}async function Fl(){let e=i.startSpinner("Fetching available CVMs"),t=await k(),r=await tn(t);if(e.stop(!0),!r.success){i.error(`Failed to fetch CVMs: ${r.error.message}`);return}let{items:n}=r.data;if(n.length===0){i.info("No CVMs found for your account");return}let o=n.map(s=>({name:`${s.name} (${s.app_id??s.id}) - ${s.status}`,value:s.app_id??s.id})),{selectedCvm:a}=await Pw.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:o}]);return a}async function jl(e){let t=await k(),r=e.replace(/^app_/,""),n=await t.get(`cvms/app_${r}/attestation`);try{return Ul.parse(n)}catch(o){return i.debug(`Validation error: ${o instanceof Error?o.message:String(o)}`),{is_online:!!n?.is_online,is_public:!!n?.is_public,error:typeof n?.error=="string"?n.error:null,app_certificates:Array.isArray(n?.app_certificates)?n.app_certificates:null,tcb_info:n?.tcb_info||null,compose_file:typeof n?.compose_file=="string"?n.compose_file:null}}}async function Vl(e,t){let r=await k(),n=e.replace(/^app_/,""),o=await r.post(`cvms/app_${n}/replicas`,t);return Nl.parse(o)}async function ds(e,t,r,n,o){let a=await k(),s=e.replace(/^app_/,""),c={};if(t!==void 0&&(c.vcpu=t),r!==void 0&&(c.memory=r),n!==void 0&&(c.disk_size=n),o!==void 0&&(c.allow_restart=o),Object.keys(c).length===0)throw new Error("At least one resource parameter must be provided");return await a.patch(`cvms/app_${s}/resources`,c),!0}async function zl(e){return await(await k()).post("cvms/pubkey/from_cvm_configuration",e)}async function Kl(e){let r=await(await k()).post("cvms/from_cvm_configuration",e);return Ll.parse(r)}async function Gl(e,t){let r=await k(),n=e.replace(/^app_/,"");return await r.put(`cvms/app_${n}/compose`,t)}async function Hl(e=!1){let t=await k(),r="teepods/available";return e&&(r+="?v03x_only=1"),await t.get(r)}function Vt(e,t){let r=[];t.since&&r.push(`since=${encodeURIComponent(t.since)}`),t.until&&r.push(`until=${encodeURIComponent(t.until)}`),t.follow&&r.push("follow"),t.text&&r.push("text"),t.bare&&r.push("bare"),t.tail!==void 0&&(r.push(`tail=${t.tail}`),r.push(`lines=${t.tail}`)),t.timestamps&&r.push("timestamps"),(t.ansi??!0)&&r.push("ansi");let n=e.includes("?")?"&":"?";return e+n+r.join("&")}async function ql(e,t){let r=e.body?.getReader();if(!r)throw new Error("No response body available for streaming");let n=new TextDecoder;for(;;){let{done:o,value:a}=await r.read();if(o)break;t(n.decode(a,{stream:!0}))}}function $w(e){return!e||/\s/.test(e)||e.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(e)}function Dw(e){if(!$w(e))return e;try{return Buffer.from(e,"base64").toString("utf-8")}catch{return e}}function go(e){let t=e.trim();if(!t)return null;try{let r=JSON.parse(t);return typeof r.message!="string"?null:{channel:r.channel==="stderr"?"stderr":"stdout",message:Dw(r.message)}}catch{return null}}function Rw(e){let t=e.split(/\r?\n/),r=[];for(let n of t){if(!n.trim())continue;let o=go(n);if(o){r.push(o);continue}r.push({channel:"stdout",message:`${n}
48
- `})}return r}function Mw(e){let t=e.split(/\r?\n/),r="";for(let n of t){let o=go(n);if(o){r+=o.message;continue}n.trim()&&(r+=`${n}
49
- `)}return r}async function Tw(e,t){let r=e.body?.getReader();if(!r)throw new Error("No response body available for streaming");let n=new TextDecoder,o="",a="unknown",s=c=>{let l=go(c);if(l){t(l.message);return}c.trim()&&t(`${c}
50
- `)};for(;;){let{done:c,value:l}=await r.read();if(c)break;let m=n.decode(l,{stream:!0});if(a==="raw"){t(m);continue}if(o+=m,a==="unknown")if(o.trimStart().startsWith("{"))a="structured";else{a="raw",t(o),o="";continue}let p=o.indexOf(`
51
- `);for(;p>=0;){let u=o.slice(0,p);o=o.slice(p+1),s(u),p=o.indexOf(`
52
- `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function Lw(e,t){let r=e.body?.getReader();if(!r)throw new Error("No response body available for streaming");let n=new TextDecoder,o="",a="unknown",s=c=>{let l=go(c);if(l){t(l);return}c.trim()&&t({channel:"stdout",message:`${c}
53
- `})};for(;;){let{done:c,value:l}=await r.read();if(c)break;let m=n.decode(l,{stream:!0});if(a==="raw"){t({channel:"stdout",message:m});continue}if(o+=m,a==="unknown")if(o.trimStart().startsWith("{"))a="structured";else{a="raw",t({channel:"stdout",message:o}),o="";continue}let p=o.indexOf(`
54
- `);for(;p>=0;){let u=o.slice(0,p);o=o.slice(p+1),s(u),p=o.indexOf(`
55
- `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function fs(e,t){let n=await(await k()).get(`cvms/${e}`,{headers:{"X-Phala-Version":"2025-10-28"}});if(!n.syslog_endpoint)throw new Error(`No syslog endpoint available for CVM '${e}'`);return`${n.syslog_endpoint}&ch=${t}`}async function Bl(e){return fs(e,"serial")}async function ho(e,t,r=!0){let o=await(await k()).get(`cvms/${e}/composition`);if(!o.containers?.length)throw new Error(`No containers found for CVM '${e}'`);let a=o.containers;if(t&&(a=a.filter(c=>c.names.some(m=>m===t||m===`/${t}`)?!0:r?c.id.startsWith(t):!1),!a.length))throw new Error(`Container '${t}' not found in CVM '${e}'`);let s=a.find(c=>c.log_endpoint);if(!s?.log_endpoint)throw new Error(`No log endpoints available for CVM '${e}'`);return s.log_endpoint}async function Wl(e,t={}){let r=await Bl(e),n=Vt(r,t),o=await fetch(n);if(!o.ok)throw new Error(`Failed to fetch serial logs: ${o.status} ${o.statusText}`);return o.text()}async function Jl(e,t={}){let r=await ho(e,t.container,t.matchContainerIdPrefix??!0),n=t.text??!0,o=t.bare??!0,a=Vt(r,{...t,text:n,bare:o}),s=await fetch(a);if(!s.ok)throw new Error(`Failed to fetch container logs: ${s.status} ${s.statusText}`);let c=await s.text();return c.trimStart().startsWith("{")?Mw(c):c}async function Yl(e,t={}){let r=await ho(e,t.container,t.matchContainerIdPrefix??!0),n=Vt(r,{...t,text:!1,bare:!1}),o=await fetch(n);if(!o.ok)throw new Error(`Failed to fetch container logs: ${o.status} ${o.statusText}`);let a=await o.text();return a.trimStart().startsWith("{")?Rw(a):[{channel:"stdout",message:a}]}async function Zl(e,t,r={},n){let o=await ho(e,r.container,r.matchContainerIdPrefix??!0),a=Vt(o,{...r,follow:!0,text:!1,bare:!1}),s=await fetch(a,{signal:n});if(!s.ok)throw new Error(`Failed to stream container logs: ${s.status} ${s.statusText}`);await Lw(s,t)}async function Xl(e,t,r={},n){let o=await Bl(e),a=Vt(o,{...r,follow:!0}),s=await fetch(a,{signal:n});if(!s.ok)throw new Error(`Failed to stream serial logs: ${s.status} ${s.statusText}`);await ql(s,t)}async function Ql(e,t,r={},n){let o=await ho(e,r.container,r.matchContainerIdPrefix??!0),a=r.text??!0,s=r.bare??!0,c=Vt(o,{...r,follow:!0,text:a,bare:s}),l=await fetch(c,{signal:n});if(!l.ok)throw new Error(`Failed to stream container logs: ${l.status} ${l.statusText}`);await Tw(l,t)}async function em(e,t,r={}){let n=await fs(e,t),o=Vt(n,r),a=await fetch(o);if(!a.ok)throw new Error(`Failed to fetch CVM ${t} logs: ${a.status} ${a.statusText}`);return a.text()}async function tm(e,t,r,n={},o){let a=await fs(e,t),s=Vt(a,{...n,follow:!0}),c=await fetch(s,{signal:o});if(!c.ok)throw new Error(`Failed to stream CVM ${t} logs: ${c.status} ${c.statusText}`);await ql(c,r)}async function rm(e){let t=await k(),r=e.replace(/^app_/,""),n=await Q(t,{app_id:r});if(!n.success)throw new Error(n.error.message);return n.data.status}import zt from"chalk";import tr from"semver";import fn from"fs";import Nw from"os";import nm from"path";var gs={};function om(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:nm.join(Nw.homedir(),".phala-cloud")}function yo(){return nm.join(om(),"state.json")}function Uw(){let e=om();fn.existsSync(e)||fn.mkdirSync(e,{recursive:!0})}function gn(){try{let e=yo();if(!fn.existsSync(e))return gs;let t=fn.readFileSync(e,"utf8"),r=JSON.parse(t);return!r||typeof r!="object"?gs:r}catch{return gs}}function er(e){Uw();let t={...gn(),...e};fn.writeFileSync(yo(),JSON.stringify(t,null,2),{mode:384,encoding:"utf8"})}function Mr(e){return gn()[e]}function am(e,t){er({[e]:t})}function sm(){return gn()}function vo(){return typeof process.versions.bun=="string"?"bun":"node"}function Ow(e){let t=e.replace(/\\/g,"/");if(/[/\\]\.bun[/\\]/.test(t))return"bun";if(/pnpm/.test(t))return"pnpm";if(/[/\\]\.yarn[/\\]|yarn[/\\]global/.test(t))return"yarn"}function hn(e,t){if(t==="bun")return"bun";let r=e.npm_config_user_agent;if(r){let a=(r.split(" ")[0]??"").split("/")[0];if(a==="pnpm")return"pnpm";if(a==="yarn")return"yarn";if(a==="npm")return"npm";if(a==="bun")return"bun"}let n=process.argv[1];if(n){let o=Ow(n);if(o)return o}return"npm"}function yn(e,t){switch(e){case"bun":return`bun add -g --no-cache ${t}`;case"pnpm":return`pnpm add -g ${t}`;case"yarn":return`yarn global add ${t}`;default:return`npm i -g ${t}`}}function im(e,t){switch(e){case"bun":return{command:"bun",args:["add","-g","--no-cache",t]};case"pnpm":return{command:"pnpm",args:["add","-g",t]};case"yarn":return{command:"yarn",args:["global","add",t]};default:return{command:"npm",args:["i","-g",t]}}}var Fw=200,jw=1440*60*1e3,Vw="Phala-Network/phala-cloud",cm="cli-v";function pm(e,t){return`https://github.com/${Vw}/compare/${cm}${e}...${cm}${t}`}function bo(e){return e?e==="1"||e.toLowerCase()==="true":!1}function lm(e){return typeof e=="string"&&e.trim().length>0}function zw(e){return e.startsWith("@")?e.replace("/","%2F"):e}function Kw(e){let r=tr.parse(e)?.prerelease?.[0];return typeof r=="string"&&r.length>0?r:void 0}function um(e,t,r){if(lm(t.PHALA_UPDATE_CHANNEL))return t.PHALA_UPDATE_CHANNEL;let n=r.get("updateCheckChannel");return lm(n)?n:Kw(e)??"latest"}function Gw(e){return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function hs(e,t){return`${e}_${Gw(t)}`}function mm(e,t){let r=e.get(t);if(typeof r=="number"&&Number.isFinite(r))return r;if(typeof r=="string"){let n=Number(r);return Number.isFinite(n)?n:void 0}}function dm(){return{get(e){return Mr(e)},save(e){er(e)}}}function Co(e){let{executableName:t,packageName:r,currentVersion:n,runtime:o,env:a,isJson:s,stderrIsTTY:c,configStore:l=dm()}=e;try{if(!c||s||bo(a.CI)||bo(a.PHALA_DISABLE_UPDATE_CHECK)||l.get("disableUpdateNotice")===!0)return null;let m=tr.valid(n);if(!m)return null;let p=um(n,a,l),u=hs("updateCheckLatest",p),d=l.get(u)??(p==="latest"?l.get("updateCheckLatest"):void 0),f=typeof d=="string"?tr.valid(d):null;if(!f||!tr.gt(f,m))return null;let g=hn(a,o),h=g==="bun"?`${r}@${f}`:p==="latest"?`${r}@latest`:`${r}@${p}`,v=yn(g,h),w=pm(m,f);return{message:`${[zt.yellow(`Update available: v${m} -> v${f}${p==="latest"?"":` (${p})`}.`),zt.gray(w),zt.gray(`Update with: "${t} self update" (or "${v}").`),zt.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
121
+ ${r}`)}throw new Error(`Failed to save ${Hr}: ${n instanceof Error?n.message:String(n)}`)}}function ar(){return zr()?lk():{}}function Cm(e){if(!e)return;let{cvmId:t}=H.parse({id:e});return t}import Ot from"fs";import mk from"os";import Vo from"path";var Rt="https://cloud-api.phala.com/api/v1";function Ho(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:Vo.join(mk.homedir(),".phala-cloud")}function Kr(){return Vo.join(Ho(),"credentials.json")}function Ns(){return Vo.join(Ho(),"api-key")}function bm(){return Vo.join(Ho(),"docker-credentials.json")}function wm(){let e=Ho();Ot.existsSync(e)||Ot.mkdirSync(e,{recursive:!0})}function Fo(e){return typeof e=="string"&&e.trim().length>0}function sr(e){let t=e.trim();return t.length===0?"default":t}function De(){try{let e=Kr();if(!Ot.existsSync(e))return null;let t=Ot.readFileSync(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return null;let r=n;return r.schema_version!==1||!Fo(r.current_profile)||!r.profiles||typeof r.profiles!="object"?null:r}catch(e){return c.error("Failed to read credentials file:",e),null}}function zo(e){wm(),Ot.writeFileSync(Kr(),JSON.stringify(e,null,2),{mode:384,encoding:"utf8"})}function _m(e){let t=De(),n=sr(e.profile||e.projectProfile||t?.current_profile||"default"),r=n;if(t&&!t.profiles[r]){let p=Object.entries(t.profiles).find(([,m])=>m?.workspace?.slug===n);if(p)r=p[0];else{let m=Object.entries(t.profiles).find(([,d])=>d?.workspace?.name===n);m&&(r=m[0])}}let o=e.env.PHALA_CLOUD_API_PREFIX,a=t?.profiles?.[r]?.api_prefix,s=(o&&o.trim().length>0?o:a&&a.trim().length>0?a:Rt)??Rt,i=o?"env":a?"file":"default";if(Fo(e.apiToken))return{apiKey:e.apiToken,baseURL:s,profileName:r,tokenSource:"flag",apiPrefixSource:i};if(Fo(e.env.PHALA_CLOUD_API_KEY))return{apiKey:e.env.PHALA_CLOUD_API_KEY,baseURL:s,profileName:r,tokenSource:"env",apiPrefixSource:i};let l=t?.profiles?.[r]?.token;return Fo(l)?{apiKey:l,baseURL:s,profileName:r,tokenSource:"file",apiPrefixSource:i}:{apiKey:null,baseURL:s,profileName:r,tokenSource:"none",apiPrefixSource:i}}function ir(e){let t=sr(e.profileName),n=(e.apiPrefix||Rt).trim(),r=De(),a=e.setCurrent??!0?t:r?.current_profile||t,s=e.workspaceSlug?{name:e.workspaceName,slug:e.workspaceSlug}:{name:e.workspaceName},i={schema_version:1,current_profile:a,profiles:{...r?.profiles||{},[t]:{token:e.token,api_prefix:n.length>0?n:Rt,workspace:s,user:e.user,updated_at:new Date().toISOString()}}};zo(i)}function cr(e){let t=De();if(!t)return;let n=sr(e||t.current_profile),r={...t.profiles};delete r[n];let o=Object.keys(r);if(o.length===0){try{Ot.unlinkSync(Kr())}catch(i){c.error("Failed to remove credentials file:",i)}return}let s={schema_version:1,current_profile:t.current_profile===n?o[0]:t.current_profile,profiles:r};zo(s)}function km(e,t){let n=sr(e),r=sr(t),o=De();if(!o)throw new Error("No credentials file found. Please login first.");if(!o.profiles[n])throw new Error(`Profile "${n}" not found`);if(o.profiles[r])throw new Error(`Profile "${r}" already exists`);let a={...o.profiles};a[r]=a[n],delete a[n];let s=o.current_profile===n?r:o.current_profile;zo({...o,current_profile:s,profiles:a})}function xt(){let e=De();return e?Object.keys(e.profiles):[]}function lr(e){let t=sr(e),n=De();if(!n)throw new Error("No credentials file found. Please login first.");if(!n.profiles[t])throw new Error(`Profile "${t}" not found`);n.current_profile!==t&&zo({...n,current_profile:t})}function Te(){let e=De();if(!e)return null;let t=e.current_profile,n=e.profiles[t];return n?{name:t,info:n}:null}async function js(e){wm();try{Ot.writeFileSync(bm(),JSON.stringify(e,null,2),{mode:384}),c.success("Docker information saved successfully.")}catch(t){throw c.error("Failed to save Docker information:",t),t}}async function Nt(){try{let e=bm();if(Ot.existsSync(e)){let t=Ot.readFileSync(e,"utf8");return JSON.parse(t)}return null}catch(e){return c.error("Failed to read Docker credentials:",e),null}}var Sm="2026-01-21";function pk(){return{env:process.env,projectConfig:ar()}}function _t(e,t){let n=e??pk();return _m({env:n.env,apiToken:t?.apiToken??n.globalOptions?.apiToken,profile:t?.profile??n.globalOptions?.profile,projectProfile:n.projectConfig.profile})}async function E(e,t){let n=_t(e,t),r=Ts()??Sm;return rt({apiKey:n.apiKey??void 0,baseURL:n.baseURL,version:r})}async function Ko(e,t){let n=_t(e,t);return{client:await E(e,t),auth:n}}async function Go(e,t){let n=Ts()??Sm;return rt({apiKey:e,baseURL:t?.baseURL,version:n})}import{z as v}from"zod";var dk=v.object({password:v.string(),registry:v.string().nullable(),username:v.string()}),Hx=v.object({docker_compose_file:v.string(),docker_config:dk.optional().nullable(),features:v.array(v.string()),kms_enabled:v.boolean(),manifest_version:v.number(),name:v.string(),public_logs:v.boolean(),public_sysinfo:v.boolean(),runner:v.string().optional(),salt:v.string().nullable().optional(),tproxy_enabled:v.boolean(),version:v.string().optional()}).passthrough(),Em=v.object({id:v.number(),name:v.string(),status:v.string(),teepod_id:v.number().nullable(),teepod:v.object({id:v.number(),name:v.string()}).nullable(),user_id:v.number().nullable(),app_id:v.string(),vm_uuid:v.string().nullable(),instance_id:v.string().nullable(),app_url:v.string().nullable(),base_image:v.string().nullable(),vcpu:v.number(),memory:v.number(),disk_size:v.number(),manifest_version:v.number().nullable(),version:v.string().nullable(),runner:v.string().nullable(),docker_compose_file:v.string().nullable(),features:v.array(v.string()).nullable(),created_at:v.string(),encrypted_env_pubkey:v.string().nullable()}),zx=v.object({key:v.string(),value:v.string()}),uk=v.object({is_online:v.boolean(),is_public:v.boolean(),error:v.string().nullable(),internal_ip:v.string(),latest_handshake:v.string(),public_urls:v.array(v.object({app:v.string(),instance:v.string()}))}),fk=v.object({id:v.number(),name:v.string(),status:v.string(),teepod_id:v.number(),teepod:v.object({id:v.number(),name:v.string()}),user_id:v.number().nullable().optional(),app_id:v.string(),vm_uuid:v.string().nullable().optional(),instance_id:v.string().nullable().optional(),app_url:v.string().nullable().optional(),base_image:v.string().nullable().optional(),vcpu:v.number(),memory:v.number(),disk_size:v.number(),manifest_version:v.number().nullable().optional(),version:v.string().nullable().optional(),runner:v.string().nullable().optional(),docker_compose_file:v.string().nullable().optional(),features:v.array(v.string()).nullable().optional(),created_at:v.string(),encrypted_env_pubkey:v.string().nullable().optional()}),Im=v.object({is_online:v.boolean(),is_public:v.boolean(),error:v.string().nullable(),app_certificates:v.array(v.object({subject:v.object({common_name:v.string().nullable(),organization:v.string().nullable(),country:v.string().nullable(),state:v.string().nullable().optional(),locality:v.string().nullable().optional()}),issuer:v.object({common_name:v.string().nullable(),organization:v.string().nullable(),country:v.string().nullable()}),serial_number:v.string(),not_before:v.string(),not_after:v.string(),version:v.string(),fingerprint:v.string(),signature_algorithm:v.string(),sans:v.string().nullable(),is_ca:v.boolean(),position_in_chain:v.number(),quote:v.string().nullable()})).nullable(),tcb_info:v.object({mrtd:v.string(),rootfs_hash:v.string(),rtmr0:v.string(),rtmr1:v.string(),rtmr2:v.string(),rtmr3:v.string(),event_log:v.array(v.object({imr:v.number(),event_type:v.number(),digest:v.string(),event:v.string(),event_payload:v.string()}))}).nullable(),compose_file:v.string().nullable()}),gk=v.object({name:v.string(),description:v.string().optional(),version:v.array(v.number()).optional(),is_dev:v.boolean().optional(),os_image_hash:v.string().nullable().optional(),rootfs_hash:v.string().optional(),shared_ro:v.boolean().optional(),cmdline:v.string().optional(),kernel:v.string().optional(),initrd:v.string().optional(),hda:v.string().nullable().optional(),rootfs:v.string().optional(),bios:v.string().optional()}),Kx=v.object({teepod_id:v.number().nullable(),id:v.number().optional(),name:v.string(),listed:v.boolean().optional(),resource_score:v.number().optional(),remaining_vcpu:v.number().optional(),remaining_memory:v.number().optional(),remaining_cvm_slots:v.number().optional(),images:v.array(gk).optional(),region_identifier:v.string().optional(),dedicated_for_team_id:v.number().nullable().optional(),support_onchain_kms:v.boolean().optional(),fmspc:v.string().nullable().optional(),device_id:v.string().nullable().optional()});import hk from"inquirer";async function Am(){let e=c.startSpinner("Fetching available CVMs"),t=await E(),n=await Lr(t);if(e.stop(!0),!n.success){c.error(`Failed to fetch CVMs: ${n.error.message}`);return}let{items:r}=n.data;if(r.length===0){c.info("No CVMs found for your account");return}let o=r.map(s=>({name:`${s.name} (${s.app_id??s.id}) - ${s.status}`,value:s.app_id??s.id})),{selectedCvm:a}=await hk.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:o}]);return a}async function Pm(e){let t=await E(),n=e.replace(/^app_/,""),r=await t.get(`cvms/app_${n}/attestation`);try{return Im.parse(r)}catch(o){return c.debug(`Validation error: ${o instanceof Error?o.message:String(o)}`),{is_online:!!r?.is_online,is_public:!!r?.is_public,error:typeof r?.error=="string"?r.error:null,app_certificates:Array.isArray(r?.app_certificates)?r.app_certificates:null,tcb_info:r?.tcb_info||null,compose_file:typeof r?.compose_file=="string"?r.compose_file:null}}}async function Fs(e,t,n,r,o){let a=await E(),s=e.replace(/^app_/,""),i={};if(t!==void 0&&(i.vcpu=t),n!==void 0&&(i.memory=n),r!==void 0&&(i.disk_size=r),o!==void 0&&(i.allow_restart=o),Object.keys(i).length===0)throw new Error("At least one resource parameter must be provided");return await a.patch(`cvms/app_${s}/resources`,i),!0}async function $m(e){return await(await E()).post("cvms/pubkey/from_cvm_configuration",e)}async function Rm(e){let n=await(await E()).post("cvms/from_cvm_configuration",e);return Em.parse(n)}async function xm(e,t){let n=await E(),r=e.replace(/^app_/,"");return await n.put(`cvms/app_${r}/compose`,t)}async function Dm(e=!1){let t=await E(),n="teepods/available";return e&&(n+="?v03x_only=1"),await t.get(n)}function sn(e,t){let n=[];t.since&&n.push(`since=${encodeURIComponent(t.since)}`),t.until&&n.push(`until=${encodeURIComponent(t.until)}`),t.follow&&n.push("follow"),t.text&&n.push("text"),t.bare&&n.push("bare"),t.tail!==void 0&&(n.push(`tail=${t.tail}`),n.push(`lines=${t.tail}`)),t.timestamps&&n.push("timestamps"),(t.ansi??!0)&&n.push("ansi");let r=e.includes("?")?"&":"?";return e+r+n.join("&")}async function Tm(e,t){let n=e.body?.getReader();if(!n)throw new Error("No response body available for streaming");let r=new TextDecoder;for(;;){let{done:o,value:a}=await n.read();if(o)break;t(r.decode(a,{stream:!0}))}}function yk(e){return!e||/\s/.test(e)||e.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(e)}function vk(e){if(!yk(e))return e;try{return Buffer.from(e,"base64").toString("utf-8")}catch{return e}}function qo(e){let t=e.trim();if(!t)return null;try{let n=JSON.parse(t);return typeof n.message!="string"?null:{channel:n.channel==="stderr"?"stderr":"stdout",message:vk(n.message)}}catch{return null}}function Ck(e){let t=e.split(/\r?\n/),n=[];for(let r of t){if(!r.trim())continue;let o=qo(r);if(o){n.push(o);continue}n.push({channel:"stdout",message:`${r}
122
+ `})}return n}function bk(e){let t=e.split(/\r?\n/),n="";for(let r of t){let o=qo(r);if(o){n+=o.message;continue}r.trim()&&(n+=`${r}
123
+ `)}return n}async function wk(e,t){let n=e.body?.getReader();if(!n)throw new Error("No response body available for streaming");let r=new TextDecoder,o="",a="unknown",s=i=>{let l=qo(i);if(l){t(l.message);return}i.trim()&&t(`${i}
124
+ `)};for(;;){let{done:i,value:l}=await n.read();if(i)break;let p=r.decode(l,{stream:!0});if(a==="raw"){t(p);continue}if(o+=p,a==="unknown")if(o.trimStart().startsWith("{"))a="structured";else{a="raw",t(o),o="";continue}let m=o.indexOf(`
125
+ `);for(;m>=0;){let d=o.slice(0,m);o=o.slice(m+1),s(d),m=o.indexOf(`
126
+ `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function _k(e,t){let n=e.body?.getReader();if(!n)throw new Error("No response body available for streaming");let r=new TextDecoder,o="",a="unknown",s=i=>{let l=qo(i);if(l){t(l);return}i.trim()&&t({channel:"stdout",message:`${i}
127
+ `})};for(;;){let{done:i,value:l}=await n.read();if(i)break;let p=r.decode(l,{stream:!0});if(a==="raw"){t({channel:"stdout",message:p});continue}if(o+=p,a==="unknown")if(o.trimStart().startsWith("{"))a="structured";else{a="raw",t({channel:"stdout",message:o}),o="";continue}let m=o.indexOf(`
128
+ `);for(;m>=0;){let d=o.slice(0,m);o=o.slice(m+1),s(d),m=o.indexOf(`
129
+ `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function Vs(e,t){let r=await(await E()).get(`cvms/${e}`,{headers:{"X-Phala-Version":"2025-10-28"}});if(!r.syslog_endpoint)throw new Error(`No syslog endpoint available for CVM '${e}'`);return`${r.syslog_endpoint}&ch=${t}`}async function Mm(e){return Vs(e,"serial")}async function Bo(e,t,n=!0){let o=await(await E()).get(`cvms/${e}/composition`);if(!o.containers?.length)throw new Error(`No containers found for CVM '${e}'`);let a=o.containers;if(t&&(a=a.filter(i=>i.names.some(p=>p===t||p===`/${t}`)?!0:n?i.id.startsWith(t):!1),!a.length))throw new Error(`Container '${t}' not found in CVM '${e}'`);let s=a.find(i=>i.log_endpoint);if(!s?.log_endpoint)throw new Error(`No log endpoints available for CVM '${e}'`);return s.log_endpoint}async function Lm(e,t={}){let n=await Mm(e),r=sn(n,t),o=await fetch(r);if(!o.ok)throw new Error(`Failed to fetch serial logs: ${o.status} ${o.statusText}`);return o.text()}async function Um(e,t={}){let n=await Bo(e,t.container,t.matchContainerIdPrefix??!0),r=t.text??!0,o=t.bare??!0,a=sn(n,{...t,text:r,bare:o}),s=await fetch(a);if(!s.ok)throw new Error(`Failed to fetch container logs: ${s.status} ${s.statusText}`);let i=await s.text();return i.trimStart().startsWith("{")?bk(i):i}async function Om(e,t={}){let n=await Bo(e,t.container,t.matchContainerIdPrefix??!0),r=sn(n,{...t,text:!1,bare:!1}),o=await fetch(r);if(!o.ok)throw new Error(`Failed to fetch container logs: ${o.status} ${o.statusText}`);let a=await o.text();return a.trimStart().startsWith("{")?Ck(a):[{channel:"stdout",message:a}]}async function Nm(e,t,n={},r){let o=await Bo(e,n.container,n.matchContainerIdPrefix??!0),a=sn(o,{...n,follow:!0,text:!1,bare:!1}),s=await fetch(a,{signal:r});if(!s.ok)throw new Error(`Failed to stream container logs: ${s.status} ${s.statusText}`);await _k(s,t)}async function jm(e,t,n={},r){let o=await Mm(e),a=sn(o,{...n,follow:!0}),s=await fetch(a,{signal:r});if(!s.ok)throw new Error(`Failed to stream serial logs: ${s.status} ${s.statusText}`);await Tm(s,t)}async function Fm(e,t,n={},r){let o=await Bo(e,n.container,n.matchContainerIdPrefix??!0),a=n.text??!0,s=n.bare??!0,i=sn(o,{...n,follow:!0,text:a,bare:s}),l=await fetch(i,{signal:r});if(!l.ok)throw new Error(`Failed to stream container logs: ${l.status} ${l.statusText}`);await wk(l,t)}async function Vm(e,t,n={}){let r=await Vs(e,t),o=sn(r,n),a=await fetch(o);if(!a.ok)throw new Error(`Failed to fetch CVM ${t} logs: ${a.status} ${a.statusText}`);return a.text()}async function Hm(e,t,n,r={},o){let a=await Vs(e,t),s=sn(a,{...r,follow:!0}),i=await fetch(s,{signal:o});if(!i.ok)throw new Error(`Failed to stream CVM ${t} logs: ${i.status} ${i.statusText}`);await Tm(i,n)}async function zm(e){let t=await E(),n=e.replace(/^app_/,""),r=await G(t,{app_id:n});if(!r.success)throw new Error(r.error.message);return r.data.status}import cn from"chalk";import Sn from"semver";import Gr from"fs";import kk from"os";import Km from"path";var Hs={};function Gm(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:Km.join(kk.homedir(),".phala-cloud")}function Wo(){return Km.join(Gm(),"state.json")}function Sk(){let e=Gm();Gr.existsSync(e)||Gr.mkdirSync(e,{recursive:!0})}function qr(){try{let e=Wo();if(!Gr.existsSync(e))return Hs;let t=Gr.readFileSync(e,"utf8"),n=JSON.parse(t);return!n||typeof n!="object"?Hs:n}catch{return Hs}}function kn(e){Sk();let t={...qr(),...e};Gr.writeFileSync(Wo(),JSON.stringify(t,null,2),{mode:384,encoding:"utf8"})}function mr(e){return qr()[e]}function qm(e,t){kn({[e]:t})}function Bm(){return qr()}function Jo(){return typeof process.versions.bun=="string"?"bun":"node"}function Ek(e){let t=e.replace(/\\/g,"/");if(/[/\\]\.bun[/\\]/.test(t))return"bun";if(/pnpm/.test(t))return"pnpm";if(/[/\\]\.yarn[/\\]|yarn[/\\]global/.test(t))return"yarn"}function Br(e,t){if(t==="bun")return"bun";let n=e.npm_config_user_agent;if(n){let a=(n.split(" ")[0]??"").split("/")[0];if(a==="pnpm")return"pnpm";if(a==="yarn")return"yarn";if(a==="npm")return"npm";if(a==="bun")return"bun"}let r=process.argv[1];if(r){let o=Ek(r);if(o)return o}return"npm"}function Wr(e,t){switch(e){case"bun":return`bun add -g --no-cache ${t}`;case"pnpm":return`pnpm add -g ${t}`;case"yarn":return`yarn global add ${t}`;default:return`npm i -g ${t}`}}function Wm(e,t){switch(e){case"bun":return{command:"bun",args:["add","-g","--no-cache",t]};case"pnpm":return{command:"pnpm",args:["add","-g",t]};case"yarn":return{command:"yarn",args:["global","add",t]};default:return{command:"npm",args:["i","-g",t]}}}var Ik=200,Ak=1440*60*1e3,Pk="Phala-Network/phala-cloud",Jm="cli-v";function Xm(e,t){return`https://github.com/${Pk}/compare/${Jm}${e}...${Jm}${t}`}function Yo(e){return e?e==="1"||e.toLowerCase()==="true":!1}function Ym(e){return typeof e=="string"&&e.trim().length>0}function $k(e){return e.startsWith("@")?e.replace("/","%2F"):e}function Rk(e){let n=Sn.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function Qm(e,t,n){if(Ym(t.PHALA_UPDATE_CHANNEL))return t.PHALA_UPDATE_CHANNEL;let r=n.get("updateCheckChannel");return Ym(r)?r:Rk(e)??"latest"}function xk(e){return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function zs(e,t){return`${e}_${xk(t)}`}function Zm(e,t){let n=e.get(t);if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n=="string"){let r=Number(n);return Number.isFinite(r)?r:void 0}}function ep(){return{get(e){return mr(e)},save(e){kn(e)}}}function Zo(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:l=ep()}=e;try{if(!i||s||Yo(a.CI)||Yo(a.PHALA_DISABLE_UPDATE_CHECK)||l.get("disableUpdateNotice")===!0)return null;let p=Sn.valid(r);if(!p)return null;let m=Qm(r,a,l),d=zs("updateCheckLatest",m),f=l.get(d)??(m==="latest"?l.get("updateCheckLatest"):void 0),u=typeof f=="string"?Sn.valid(f):null;if(!u||!Sn.gt(u,p))return null;let h=Br(a,o),g=h==="bun"?`${n}@${u}`:m==="latest"?`${n}@latest`:`${n}@${m}`,y=Wr(h,g),b=Xm(p,u);return{message:`${[cn.yellow(`Update available: v${p} -> v${u}${m==="latest"?"":` (${m})`}.`),cn.gray(b),cn.gray(`Update with: "${t} self update" (or "${y}").`),cn.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
56
130
  `)}
57
- `,currentVersion:m,latestVersion:f,packageName:r}}catch{return null}}async function wo(e){let{executableName:t,packageName:r,currentVersion:n,runtime:o,env:a,isJson:s,stderrIsTTY:c,now:l=Date.now(),timeoutMs:m=Fw,ttlMs:p=jw,fetchImpl:u=fetch,configStore:d=dm()}=e;try{if(!c||s||bo(a.CI)||bo(a.PHALA_DISABLE_UPDATE_CHECK)||d.get("disableUpdateNotice")===!0)return null;let f=um(n,a,d),g=hs("updateCheckLastAt",f),h=mm(d,g)??(f==="latest"?mm(d,"updateCheckLastAt"):void 0);if(h&&l-h<p)return Co({executableName:t,packageName:r,currentVersion:n,runtime:o,env:a,isJson:s,stderrIsTTY:c,configStore:d});let w=`https://registry.npmjs.org/${zw(r)}`,C=new AbortController,_=setTimeout(()=>C.abort(),m);_.unref?.();let S,E=null;try{if(S=await u(w,{signal:C.signal,headers:{accept:"application/json"}}),!S.ok)return null;let x=await S.json();if(!x||typeof x!="object")return null;let P=x["dist-tags"];if(!P||typeof P!="object")return null;let O=P[f]??P.latest;if(typeof O!="string")return null;E=tr.valid(O);let V=tr.valid(n);if(!E||!V||!tr.gt(E,V))return null;let te=hn(a,o),oe=te==="bun"?`${r}@${E}`:f==="latest"?`${r}@latest`:`${r}@${f}`,Re=yn(te,oe),z=pm(V,E);return{message:`${[zt.yellow(`Update available: v${V} -> v${E}${f==="latest"?"":` (${f})`}.`),zt.gray(z),zt.gray(`Update with: "${t} self update" (or "${Re}").`),zt.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
131
+ `,currentVersion:p,latestVersion:u,packageName:n}}catch{return null}}async function Xo(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,now:l=Date.now(),timeoutMs:p=Ik,ttlMs:m=Ak,fetchImpl:d=fetch,configStore:f=ep()}=e;try{if(!i||s||Yo(a.CI)||Yo(a.PHALA_DISABLE_UPDATE_CHECK)||f.get("disableUpdateNotice")===!0)return null;let u=Qm(r,a,f),h=zs("updateCheckLastAt",u),g=Zm(f,h)??(u==="latest"?Zm(f,"updateCheckLastAt"):void 0);if(g&&l-g<m)return Zo({executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:f});let b=`https://registry.npmjs.org/${$k(n)}`,w=new AbortController,S=setTimeout(()=>w.abort(),p);S.unref?.();let k,_=null;try{if(k=await d(b,{signal:w.signal,headers:{accept:"application/json"}}),!k.ok)return null;let I=await k.json();if(!I||typeof I!="object")return null;let $=I["dist-tags"];if(!$||typeof $!="object")return null;let M=$[u]??$.latest;if(typeof M!="string")return null;_=Sn.valid(M);let U=Sn.valid(r);if(!_||!U||!Sn.gt(_,U))return null;let z=Br(a,o),re=z==="bun"?`${n}@${_}`:u==="latest"?`${n}@latest`:`${n}@${u}`,ae=Wr(z,re),oe=Xm(U,_);return{message:`${[cn.yellow(`Update available: v${U} -> v${_}${u==="latest"?"":` (${u})`}.`),cn.gray(oe),cn.gray(`Update with: "${t} self update" (or "${ae}").`),cn.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
58
132
  `)}
59
- `,currentVersion:V,latestVersion:E,packageName:r}}finally{clearTimeout(_);let x=hs("updateCheckLatest",f);d.save({[g]:l,...E?{[x]:E}:{},...f==="latest"?{updateCheckLastAt:l,...E?{updateCheckLatest:E}:{}}:{}})}}catch{return null}}async function gm(e){let{registry:t,argv:r,executableName:n,version:o,packageName:a,packageVersion:s,runtime:c,stdout:l,stderr:m,stdin:p,env:u,cwd:d}=e,f=Bw(r);if((f.length>0?t.getNode(f):null)?.group){let _=r.slice(f.length),S=cn(_,void 0);if(S.flags["--help"]||S.positionals.length===0)return fm({registry:t,argv:r,executableName:n,version:o,packageName:a,packageVersion:s,runtime:c,env:u,stdout:l,stderr:m,groupPath:f})}let h=t.resolveCommand(f);if(!h)return f.length>1&&t.getNode([f[0]])?.group?fm({registry:t,argv:r,executableName:n,version:o,packageName:a,packageVersion:s,runtime:c,env:u,stdout:l,stderr:m,groupPath:[f[0]]}):qw({registry:t,argv:r,executableName:n,version:o,packageName:a,packageVersion:s,runtime:c,env:u,stdout:l,stderr:m});let{definition:v,consumed:w}=h,C=r.slice(w.length);try{let _=cn(C,v.meta.options);ln(_.flags["--json"]===!0);let S=_.flags["--api-version"];if(typeof S=="string"){if(!kl(S))return m.write(`Invalid API version "${S}". Supported versions: ${Yt.join(", ")}
60
- `),1;El(S)}if(_.flags["--version"])return l.write(`${o}
61
- `),0;if(_.flags["--help"])return l.write(`${os({executableName:n,definition:v,registry:t})}
62
- `),0;let x=!(v.path[0]==="self"&&v.path[1]==="update")?wo({executableName:n,packageName:a,currentVersion:s,runtime:c,env:u,isJson:_.flags["--json"]===!0,stderrIsTTY:m.isTTY===!0}):Promise.resolve(null);v.meta.stability==="deprecated"&&m.write(Tr.yellow(`Warning: This command is deprecated and may be removed in a future version.
63
- `));let P=yl(v.meta,_),O={...P.options,...P.positionals,options:P.options,positionals:P.positionals,raw:P.raw},V,te="cvmId"in O?O.cvmId:void 0,oe="interactive"in O&&O.interactive===!0;_.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] 'cvmId' in mergedInput:","cvmId"in O),console.log("[DISPATCHER DEBUG] rawCvmId:",te),console.log("[DISPATCHER DEBUG] mergedInput keys:",Object.keys(O)));let Re=[...v.meta.arguments??[],...v.meta.options??[]].some(ee=>ee.target==="cvmId"||ee.name==="cvm-id"||ee.name==="cvm_id");if(oe&&Re){let ee=await Fl();ee&&(V={app_id:ee})}if(!V&&te&&typeof te=="string"&&(V={id:te}),!V){let ee=pn().cvm_id;ee&&(V={id:ee})}_.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] final cvmId:",JSON.stringify(V)),console.log("[DISPATCHER DEBUG] cvmId type:",typeof V),console.log("[DISPATCHER DEBUG] cvmId is undefined:",V===void 0));let z={argv:C,rawFlags:_.flags,rawPositionals:_.positionals,cwd:d,env:u,stdout:l,stderr:m,stdin:p,projectConfig:pn(),cvmId:V,cli:{executableName:n,packageName:a,packageVersion:s,runtime:c},success(ee){if(ne()){let bt=typeof ee=="string"?{success:!0,message:ee}:{success:!0,...typeof ee=="object"&&ee!==null?ee:{data:ee}};l.write(`${JSON.stringify(bt,null,2)}
64
- `)}else typeof ee=="string"?l.write(`${Tr.green("\u2713")} ${Tr.green(ee)}
65
- `):(l.write(`${Tr.green("\u2713")} Success
66
- `),l.write(`${JSON.stringify(ee,null,2)}
67
- `))},fail(ee,bt){ne()?l.write(`${JSON.stringify({success:!1,error:ee,...bt&&{details:bt}},null,2)}
68
- `):(m.write(`${Tr.red("\u2717")} ${Tr.red(ee)}
69
- `),bt&&m.write(`${JSON.stringify(bt,null,2)}
70
- `))}};_.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId after creation:",JSON.stringify(z.cvmId));let L=v.schema.parse(O);_.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId before handler:",JSON.stringify(z.cvmId));let ve=await v.run(L,z),Fe=await x;return typeof ve=="number"?(ve===0&&Fe&&!ne()&&m.write(Fe.message),ve):(Fe&&!ne()&&m.write(Fe.message),0)}catch(_){if(_ instanceof Hw){let S=_.issues.some(x=>x.code==="invalid_type"&&x.received==="undefined"&&x.message==="Required"),E=C.some(x=>!x.startsWith("-"));return S&&!E?(l.write(`${os({executableName:n,definition:v,registry:t})}
71
- `),0):(m.write(Ww(_)),1)}if(ys(_))return m.write(`${_.message}
72
- `),1;throw _}}function qw(e){let{registry:t,argv:r,executableName:n,version:o,packageName:a,packageVersion:s,runtime:c,env:l,stdout:m,stderr:p}=e;try{let u=cn(r,void 0);if(u.flags["--version"])return m.write(`${o}
73
- `),0;if(u.flags["--help"])return m.write(`${oo({registry:t,executableName:n})}
74
- `),0;if(u.positionals.length===0){m.write(`${oo({registry:t,executableName:n})}
75
- `);let f=Co({executableName:n,packageName:a,currentVersion:s,runtime:c,env:l,isJson:!1,stderrIsTTY:p.isTTY===!0});return f&&p.write(f.message),0}let d=u.positionals.join(" ");return p.write(`Unknown command "${d}". Run \`${n} --help\` for a list of commands.
76
- `),1}catch(u){if(ys(u))return p.write(`${u.message}
77
- `),1;throw u}}function fm(e){let{registry:t,argv:r,executableName:n,version:o,packageName:a,packageVersion:s,runtime:c,env:l,stdout:m,stderr:p,groupPath:u}=e;try{let d=r.slice(u.length),f=cn(d,void 0);if(f.flags["--version"])return m.write(`${o}
78
- `),0;if(f.flags["--help"]||f.positionals.length===0){if(m.write(`${_l({registry:t,executableName:n,groupPath:u})}
79
- `),!f.flags["--help"]){let v=Co({executableName:n,packageName:a,currentVersion:s,runtime:c,env:l,isJson:!1,stderrIsTTY:p.isTTY===!0});v&&p.write(v.message)}return 0}let g=f.positionals.join(" "),h=u.join(" ");return p.write(`Unknown subcommand "${g}" for "${h}". Run \`${n} ${h} --help\` for a list of subcommands.
80
- `),1}catch(d){if(ys(d))return p.write(`${d.message}
81
- `),1;throw d}}function Bw(e){let t=[];for(let r of e){if(r.startsWith("-"))break;t.push(r)}return t}function Ww(e){let t=e.issues[0];return t?`Invalid value for "${t.path.length>0?t.path.join("."):"input"}": ${t.message}
133
+ `,currentVersion:U,latestVersion:_,packageName:n}}finally{clearTimeout(S);let I=zs("updateCheckLatest",u);f.save({[h]:l,..._?{[I]:_}:{},...u==="latest"?{updateCheckLastAt:l,..._?{updateCheckLatest:_}:{}}:{}})}}catch{return null}}async function np(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,stdout:l,stderr:p,stdin:m,env:d,cwd:f}=e,u=Mk(n);if((u.length>0?t.getNode(u):null)?.group){let _=n.slice(u.length),I=Fr(_,void 0);if(I.flags["--help"]||I.positionals.length===0)return tp({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:l,stderr:p,groupPath:u})}let g=t.resolveCommand(u);if(!g)return u.length>1&&t.getNode([u[0]])?.group?tp({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:l,stderr:p,groupPath:[u[0]]}):Tk({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:l,stderr:p});let{definition:y,consumed:b,remaining:w}=g;if(w.length>0&&(!y.meta.arguments||y.meta.arguments.length===0)){let _=b.join(" "),I=w.join(" ");return p.write(`Unknown subcommand "${I}" for "${_}". Run \`${r} ${_} --help\` for usage.
134
+ `),1}let S=n.slice(b.length),k=ar();try{let _=Fr(S,y.meta.options);Vr(_.flags["--json"]===!0);let I=_.flags["--api-version"];if(typeof I=="string"){if(!fm(I))return p.write(`Invalid API version "${I}". Supported versions: ${Cn.join(", ")}
135
+ `),1;gm(I)}if(_.flags["--version"])return l.write(`${o}
136
+ `),0;if(_.flags["--help"])return l.write(`${Ds({executableName:r,definition:y,registry:t})}
137
+ `),0;let M=!(y.path[0]==="self"&&y.path[1]==="update")?Xo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:d,isJson:_.flags["--json"]===!0,stderrIsTTY:p.isTTY===!0}):Promise.resolve(null);y.meta.stability==="deprecated"&&p.write(pr.yellow(`Warning: This command is deprecated and may be removed in a future version.
138
+ `));let U=im(y.meta,_),z={apiToken:typeof U.options.apiToken=="string"?U.options.apiToken:void 0,json:U.options.json===!0,interactive:U.options.json===!0?!1:U.options.interactive===!0,profile:typeof U.options.profile=="string"?U.options.profile:void 0,apiVersion:typeof I=="string"?I:void 0},re={...U.options,...U.positionals,options:U.options,positionals:U.positionals,raw:U.raw},ae,oe="cvmId"in re?re.cvmId:void 0,F=z.interactive;_.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] 'cvmId' in mergedInput:","cvmId"in re),console.log("[DISPATCHER DEBUG] rawCvmId:",oe),console.log("[DISPATCHER DEBUG] mergedInput keys:",Object.keys(re)));let Z=[...y.meta.arguments??[],...y.meta.options??[]].some(de=>de.target==="cvmId"||de.name==="cvm-id"||de.name==="cvm_id");if(F&&Z){let de=await Am();de&&(ae={app_id:de})}if(!ae&&oe&&typeof oe=="string"&&(ae={id:oe}),!ae){let de=k.cvm_id;de&&(ae={id:de})}_.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] final cvmId:",JSON.stringify(ae)),console.log("[DISPATCHER DEBUG] cvmId type:",typeof ae),console.log("[DISPATCHER DEBUG] cvmId is undefined:",ae===void 0));let _e={argv:S,rawFlags:_.flags,rawPositionals:_.positionals,cwd:f,env:d,stdout:l,stderr:p,stdin:m,projectConfig:k,globalOptions:z,cvmId:ae,cli:{executableName:r,packageName:a,packageVersion:s,runtime:i},success(de){if(ee()){let ue=typeof de=="string"?{success:!0,message:de}:{success:!0,...typeof de=="object"&&de!==null?de:{data:de}};l.write(`${JSON.stringify(ue,null,2)}
139
+ `)}else typeof de=="string"?l.write(`${pr.green("\u2713")} ${pr.green(de)}
140
+ `):(l.write(`${pr.green("\u2713")} Success
141
+ `),l.write(`${JSON.stringify(de,null,2)}
142
+ `))},fail(de,ue){ee()?l.write(`${JSON.stringify({success:!1,error:de,...ue&&{details:ue}},null,2)}
143
+ `):(p.write(`${pr.red("\u2717")} ${pr.red(de)}
144
+ `),ue&&p.write(`${JSON.stringify(ue,null,2)}
145
+ `))}};_.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId after creation:",JSON.stringify(_e.cvmId));let Mt=y.schema.parse(re),Mn=Object.freeze({...Mt,json:z.json,interactive:z.interactive,...z.apiToken!==void 0?{apiToken:z.apiToken}:{},...z.profile!==void 0?{profile:z.profile}:{}});_.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId before handler:",JSON.stringify(_e.cvmId));let Er=await y.run(Mn,_e),gn=await M;return typeof Er=="number"?(Er===0&&gn&&!ee()&&p.write(gn.message),Er):(gn&&!ee()&&p.write(gn.message),0)}catch(_){if(_ instanceof Dk){let I=_.issues.some(M=>M.code==="invalid_type"&&M.received==="undefined"&&M.message==="Required"),$=S.some(M=>!M.startsWith("-"));return I&&!$?(l.write(`${Ds({executableName:r,definition:y,registry:t})}
146
+ `),0):(p.write(Lk(_)),1)}if(Ks(_))return p.write(`${_.message}
147
+ `),1;throw _}}function Tk(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:l,stdout:p,stderr:m}=e;try{let d=Fr(n,void 0);if(d.flags["--version"])return p.write(`${o}
148
+ `),0;if(d.flags["--help"])return p.write(`${No({registry:t,executableName:r})}
149
+ `),0;if(d.positionals.length===0){p.write(`${No({registry:t,executableName:r})}
150
+ `);let u=Zo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:l,isJson:!1,stderrIsTTY:m.isTTY===!0});return u&&m.write(u.message),0}let f=d.positionals.join(" ");return m.write(`Unknown command "${f}". Run \`${r} --help\` for a list of commands.
151
+ `),1}catch(d){if(Ks(d))return m.write(`${d.message}
152
+ `),1;throw d}}function tp(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:l,stdout:p,stderr:m,groupPath:d}=e;try{let f=n.slice(d.length),u=Fr(f,void 0);if(u.flags["--version"])return p.write(`${o}
153
+ `),0;if(u.flags["--help"]||u.positionals.length===0){if(p.write(`${dm({registry:t,executableName:r,groupPath:d})}
154
+ `),!u.flags["--help"]){let y=Zo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:l,isJson:!1,stderrIsTTY:m.isTTY===!0});y&&m.write(y.message)}return 0}let h=u.positionals.join(" "),g=d.join(" ");return m.write(`Unknown subcommand "${h}" for "${g}". Run \`${r} ${g} --help\` for a list of subcommands.
155
+ `),1}catch(f){if(Ks(f))return m.write(`${f.message}
156
+ `),1;throw f}}function Mk(e){let t=[];for(let n of e){if(n.startsWith("-"))break;t.push(n)}return t}function Lk(e){let t=e.issues[0];return t?`Invalid value for "${t.path.length>0?t.path.join("."):"input"}": ${t.message}
82
157
  `:`${e.message}
83
- `}function ys(e){return e instanceof Error&&Object.prototype.hasOwnProperty.call(e,"code")&&typeof e.code=="string"}import ym from"crypto";import rr from"fs";import Lr from"os";import vm from"path";function Jw(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:vm.join(Lr.homedir(),".phala-cloud")}function Yw(){return vm.join(Jw(),"config.json")}function hm(e){return/^[0-9a-fA-F]+$/.test(e)}function Zw(e){let r=e.trim().split(":");if(r.length!==2)return!1;let[n,o]=r;return n.length===32&&hm(n)&&o.length>0&&hm(o)}function Xw(){let e=[Lr.hostname(),Lr.platform(),Lr.arch(),Lr.cpus()[0]?.model||"",Lr.userInfo().username],t=ym.createHash("sha256");return t.update(e.join("|")),t.digest()}function Qw(e){let t=Xw(),r=e.trim().split(":");if(r.length!==2)throw new Error("Invalid legacy encrypted format");let n=Buffer.from(r[0],"hex"),o=r[1],a=ym.createDecipheriv("aes-256-cbc",t.slice(0,32),n),s=a.update(o,"hex","utf8");return s+=a.final("utf8"),s}function vn(e){try{rr.unlinkSync(e)}catch{}}function e_(e){let t={};for(let[r,n]of Object.entries(e))(r==="disableUpdateNotice"||r==="updateCheckChannel"||r==="updateCheckLastAt"||r==="updateCheckLatest"||r.startsWith("updateCheckLastAt_")||r.startsWith("updateCheckLatest_"))&&(t[r]=n);return t}function t_(){return async({token:e,baseURL:t})=>{let r=Qe({apiKey:e,baseURL:t}),n=await Pe(r);return n.success?{success:!0,data:{username:n.data.user.username,email:n.data.user.email,workspace_name:n.data.workspace.name,workspace_slug:n.data.workspace.slug||void 0}}:{success:!1}}}async function bm(e){await r_(e),await n_(e)}async function r_(e){let t=un();if(rr.existsSync(t)){let c=ls();rr.existsSync(c)&&vn(c);return}let r=ls();if(!rr.existsSync(r))return;let n=rr.readFileSync(r,"utf8").trim();if(!n)return;let o;try{o=Zw(n)?Qw(n):n}catch{e.stderr.write(`Legacy credentials could not be migrated (possibly due to machine change). Please run 'phala login' again.
84
- `);return}let a=e.env.PHALA_CLOUD_API_PREFIX||gt,s=e.fetchCurrentUser??t_();try{let c=await s({token:o,baseURL:a});if(!c.success){e.stderr.write(`Legacy credentials appear invalid or expired. Please run 'phala login' again.
85
- `);return}let l=c.data,m=l.workspace_name||"default",p=l.workspace_slug,u=p||"default";Rr({profileName:u,token:o,apiPrefix:a,workspaceName:m,workspaceSlug:p,user:{username:l.username||"unknown",email:l.email},setCurrent:!0}),vn(r),e.stderr.write(`Migrated legacy credentials into ${t} (profile: ${u}).
158
+ `}function Ks(e){return e instanceof Error&&Object.prototype.hasOwnProperty.call(e,"code")&&typeof e.code=="string"}import op from"crypto";import En from"fs";import dr from"os";import ap from"path";function Uk(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:ap.join(dr.homedir(),".phala-cloud")}function Ok(){return ap.join(Uk(),"config.json")}function rp(e){return/^[0-9a-fA-F]+$/.test(e)}function Nk(e){let n=e.trim().split(":");if(n.length!==2)return!1;let[r,o]=n;return r.length===32&&rp(r)&&o.length>0&&rp(o)}function jk(){let e=[dr.hostname(),dr.platform(),dr.arch(),dr.cpus()[0]?.model||"",dr.userInfo().username],t=op.createHash("sha256");return t.update(e.join("|")),t.digest()}function Fk(e){let t=jk(),n=e.trim().split(":");if(n.length!==2)throw new Error("Invalid legacy encrypted format");let r=Buffer.from(n[0],"hex"),o=n[1],a=op.createDecipheriv("aes-256-cbc",t.slice(0,32),r),s=a.update(o,"hex","utf8");return s+=a.final("utf8"),s}function Jr(e){try{En.unlinkSync(e)}catch{}}function Vk(e){let t={};for(let[n,r]of Object.entries(e))(n==="disableUpdateNotice"||n==="updateCheckChannel"||n==="updateCheckLastAt"||n==="updateCheckLatest"||n.startsWith("updateCheckLastAt_")||n.startsWith("updateCheckLatest_"))&&(t[n]=r);return t}function Hk(){return async({token:e,baseURL:t})=>{let n=rt({apiKey:e,baseURL:t}),r=await Oe(n);return r.success?{success:!0,data:{username:r.data.user.username,email:r.data.user.email,workspace_name:r.data.workspace.name,workspace_slug:r.data.workspace.slug||void 0}}:{success:!1}}}async function sp(e){await zk(e),await Kk(e)}async function zk(e){let t=Kr();if(En.existsSync(t)){let i=Ns();En.existsSync(i)&&Jr(i);return}let n=Ns();if(!En.existsSync(n))return;let r=En.readFileSync(n,"utf8").trim();if(!r)return;let o;try{o=Nk(r)?Fk(r):r}catch{e.stderr.write(`Legacy credentials could not be migrated (possibly due to machine change). Please run 'phala login' again.
159
+ `);return}let a=e.env.PHALA_CLOUD_API_PREFIX||Rt,s=e.fetchCurrentUser??Hk();try{let i=await s({token:o,baseURL:a});if(!i.success){e.stderr.write(`Legacy credentials appear invalid or expired. Please run 'phala login' again.
160
+ `);return}let l=i.data,p=l.workspace_name||"default",m=l.workspace_slug,d=m||"default";ir({profileName:d,token:o,apiPrefix:a,workspaceName:p,workspaceSlug:m,user:{username:l.username||"unknown",email:l.email},setCurrent:!0}),Jr(n),e.stderr.write(`Migrated legacy credentials into ${t} (profile: ${d}).
86
161
  `)}catch{e.stderr.write(`Legacy credentials could not be migrated. Please run 'phala login' again.
87
- `)}}async function n_(e){let t=yo(),r=Yw();if(rr.existsSync(r))try{let n=rr.readFileSync(r,"utf8"),o=JSON.parse(n);if(!o||typeof o!="object"){vn(r);return}let a=e_(o);if(Object.keys(a).length>0){let s=gn();er({...s,...a}),e.stderr.write(`Migrated legacy config into ${t}.
88
- `)}vn(r)}catch{vn(r)}}function Cm(e){return{name:e,children:new Map,aliasMap:new Map}}var _o=class{constructor(){this.root=Cm(null)}registerGroup(t){let r=this.ensurePath(t.path);r.group=t;let n=this.getParentNode(t.path);if(n&&t.meta.aliases){let o=t.path[t.path.length-1];for(let a of t.meta.aliases)n.aliasMap.set(a,o)}}registerCommand(t){let r=this.ensurePath(t.path);r.command=t;let n=this.getParentNode(t.path);if(n&&t.meta.aliases){let o=t.path[t.path.length-1];for(let a of t.meta.aliases)n.aliasMap.set(a,o)}}resolveCommand(t){let r=this.root,n;for(let c=0;c<t.length;c+=1){let l=t[c],m=this.getChild(r,l);if(!m)break;r=m,r.command&&(n={node:r,depth:c+1})}if(!n)return;let o=t.slice(0,n.depth),a=t.slice(n.depth),s=n.node.command;return s?{definition:s,consumed:o,remaining:a}:null}getChildren(t=[]){let r=this.getNode(t);return r?[...r.children.values()]:[]}getNode(t){let r=this.root;for(let n of t){let o=this.getChild(r,n);if(!o)return;r=o}return r}ensurePath(t){let r=this.root;for(let n of t){let o=r.children.get(n);o||(o=Cm(n),r.children.set(n,o)),r=o}return r}getParentNode(t){if(t.length!==0)return this.getNode(t.slice(0,-1))}getChild(t,r){let n=t.children.get(r);if(n)return n;let o=t.aliasMap.get(r);if(o)return t.children.get(o)}};import{readFileSync as vs}from"fs";import{dirname as s_,join as i_}from"path";import{fileURLToPath as c_}from"url";function b(e){return{path:e.path,meta:e.meta,schema:e.schema,run:e.handler}}import o_ from"@michaelhomer/jqjs";function wm(e,t){let n=[...o_.compile(t)(e)];return n.length===1?n[0]:n}function _m(e,t=2){return e==null?String(e):typeof e=="string"?e:JSON.stringify(e,null,t)}import{z as De}from"zod";var a_=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],Sm={name:"api",category:"advanced",description:`Make an authenticated HTTP request to Phala Cloud API.
162
+ `)}}async function Kk(e){let t=Wo(),n=Ok();if(En.existsSync(n))try{let r=En.readFileSync(n,"utf8"),o=JSON.parse(r);if(!o||typeof o!="object"){Jr(n);return}let a=Vk(o);if(Object.keys(a).length>0){let s=qr();kn({...s,...a}),e.stderr.write(`Migrated legacy config into ${t}.
163
+ `)}Jr(n)}catch{Jr(n)}}function ip(e){return{name:e,children:new Map,aliasMap:new Map}}var Qo=class{constructor(){this.root=ip(null)}registerGroup(t){let n=this.ensurePath(t.path);n.group=t;let r=this.getParentNode(t.path);if(r&&t.meta.aliases){let o=t.path[t.path.length-1];for(let a of t.meta.aliases)r.aliasMap.set(a,o)}}registerCommand(t){let n=this.ensurePath(t.path);n.command=t;let r=this.getParentNode(t.path);if(r&&t.meta.aliases){let o=t.path[t.path.length-1];for(let a of t.meta.aliases)r.aliasMap.set(a,o)}}resolveCommand(t){let n=this.root,r;for(let i=0;i<t.length;i+=1){let l=t[i],p=this.getChild(n,l);if(!p)break;n=p,n.command&&(r={node:n,depth:i+1})}if(!r)return;let o=t.slice(0,r.depth),a=t.slice(r.depth),s=r.node.command;return s?{definition:s,consumed:o,remaining:a}:null}getChildren(t=[]){let n=this.getNode(t);return n?[...n.children.values()]:[]}getNode(t){let n=this.root;for(let r of t){let o=this.getChild(n,r);if(!o)return;n=o}return n}ensurePath(t){let n=this.root;for(let r of t){let o=n.children.get(r);o||(o=ip(r),n.children.set(r,o)),n=o}return n}getParentNode(t){if(t.length!==0)return this.getNode(t.slice(0,-1))}getChild(t,n){let r=t.children.get(n);if(r)return r;let o=t.aliasMap.get(n);if(o)return t.children.get(o)}};import{readFileSync as Gs}from"fs";import{dirname as Bk,join as Wk}from"path";import{fileURLToPath as Jk}from"url";function C(e){return{path:e.path,meta:e.meta,schema:e.schema,run:e.handler}}import Gk from"@michaelhomer/jqjs";function cp(e,t){let r=[...Gk.compile(t)(e)];return r.length===1?r[0]:r}function lp(e,t=2){return e==null?String(e):typeof e=="string"?e:JSON.stringify(e,null,t)}import{z as Ne}from"zod";var qk=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],mp={name:"api",category:"advanced",description:`Make an authenticated HTTP request to Phala Cloud API.
89
164
 
90
165
  The endpoint should be an API path like "/cvms" or "/users/me".
91
166
 
@@ -108,15 +183,15 @@ Use -q to filter JSON output with jq syntax (built-in, no jq installation needed
108
183
  ENVIRONMENT VARIABLES
109
184
 
110
185
  PHALA_CLOUD_API_KEY Override the API key (useful for CI/CD)
111
- PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...jt,{name:"method",shorthand:"X",description:"HTTP method (default: GET)",type:"string",target:"method"},{name:"query",shorthand:"f",description:"Query parameter: key=value (use key=@file to read from file)",type:"string[]",target:"query"},{name:"field",shorthand:"F",description:"Body field: key=value (string) or key:=value (typed JSON). Supports @file",type:"string[]",target:"field"},{name:"header",shorthand:"H",description:"HTTP header: key:value",type:"string[]",target:"header"},{name:"data",shorthand:"d",description:"Request body data (cURL-style)",type:"string[]",target:"data"},{name:"input",description:'Read body from file (use "-" for stdin)',type:"string",target:"input"},{name:"include",shorthand:"i",description:"Print response headers",type:"boolean",target:"include"},{name:"jq",shorthand:"q",description:"Filter output with jq expression",type:"string",target:"jq"},{name:"silent",description:"Don't print response body",type:"boolean",target:"silent"}],examples:[{name:"List CVMs",value:"phala api /cvms"},{name:"Get CVM by app ID",value:"phala api /cvms/app_xxx"},{name:"Filter with jq",value:"phala api /cvms -q '.items[].name'"},{name:"GET with query params",value:"phala api /endpoint -f status=active -f page=2"},{name:"POST with body fields",value:"phala api /endpoint -X POST -F name=foo -F count:=10"},{name:"POST with cURL-style -d",value:`phala api /endpoint -X POST -d '{"foo":"bar"}'`},{name:"POST from file",value:"phala api /endpoint -X POST --input data.json"},{name:"Query params + body combined",value:"phala api /endpoint -X POST -f page=1 -F name=foo"},{name:"Body field from file",value:"phala api /endpoint -X POST -F config:=@settings.json"},{name:"Show response headers",value:"phala api /cvms -i"}]},km=De.object({endpoint:De.string(),method:De.enum(a_).default("GET").transform(e=>e.toUpperCase()),query:De.array(De.string()).optional(),field:De.array(De.string()).optional(),header:De.array(De.string()).optional(),data:De.array(De.string()).optional(),input:De.string().optional(),include:De.boolean().default(!1),jq:De.string().optional(),silent:De.boolean().default(!1),apiToken:De.string().optional()});var l_=c_(import.meta.url),m_=s_(l_),p_=i_(m_,"../../../package.json"),Em="unknown";try{Em=JSON.parse(vs(p_,"utf-8")).version||"unknown"}catch{}function So(e){return e==="-"?vs(0,"utf-8"):vs(e,"utf-8")}function u_(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(/^-?\d+$/.test(e))return Number.parseInt(e,10);if(/^-?\d+\.\d+$/.test(e))return Number.parseFloat(e);if(e.startsWith("[")||e.startsWith("{"))try{return JSON.parse(e)}catch{}return e}function d_(e){let t={};for(let r of e??[]){let n=r.indexOf("=");if(n>0){let o=r.slice(0,n),a=r.slice(n+1);a.startsWith("@")?t[o]=So(a.slice(1)):t[o]=a}}return t}function f_(e){let t={};for(let r of e??[]){let n=r.indexOf(":=");if(n>0){let a=r.slice(0,n),s=r.slice(n+2);if(s.startsWith("@")){let c=s.slice(1),l=So(c);try{t[a]=JSON.parse(l)}catch{throw new Error(`Failed to parse JSON from file "${c}" for field "${a}"`)}}else t[a]=u_(s);continue}let o=r.indexOf("=");if(o>0){let a=r.slice(0,o),s=r.slice(o+1);s.startsWith("@")?t[a]=So(s.slice(1)):t[a]=s}}return t}function g_(e){let t={};for(let r of e??[]){let n=r.indexOf(":");if(n>0){let o=r.slice(0,n).trim(),a=r.slice(n+1).trim();t[o]=a}}return t}function h_(e,t){let r=t.toLowerCase();return Object.keys(e).some(n=>n.toLowerCase()===r)}function y_(e){return!["GET","HEAD","OPTIONS"].includes(e)}function Im(e){let t=e.field&&e.field.length>0;if(e.input&&e.data&&e.data.length>0)throw new Error('"-d/--data" cannot be used with "--input"');if(t&&e.data&&e.data.length>0)throw new Error('"-d/--data" cannot be used with "-F/--field"');if(t&&e.input)throw new Error('"--input" cannot be used with "-F/--field"');if(e.input){let r=So(e.input);try{return{body:JSON.parse(r)}}catch{return{body:r}}}if(e.data&&e.data.length>0){let r=e.data.length===1?e.data[0]:e.data.join("&"),n=r.trim();if(n.startsWith("{")||n.startsWith("["))try{return{body:JSON.parse(n)}}catch{}return{body:r,defaultContentType:"application/x-www-form-urlencoded"}}if(t){let r=f_(e.field);return Object.keys(r).length===0?{body:void 0}:{body:r}}return{body:void 0}}function v_(e,t){let{body:r}=Im(e),n=d_(e.query),o=t;if(Object.keys(n).length>0){let a=new URLSearchParams;for(let[c,l]of Object.entries(n))a.append(c,l);let s=o.includes("?")?"&":"?";o=`${o}${s}${a.toString()}`}return{method:e.method,endpoint:o,body:r}}async function b_(e,t){let r=ht(t,{apiToken:e.apiToken});if(!r.apiKey)return t.stderr.write(`Error: Not authenticated. Run "phala login" first.
112
- `),1;let n=Qe({apiKey:r.apiKey,baseURL:r.baseURL,headers:{"User-Agent":`phala-cli/${Em}`}}),o=g_(e.header),a=e.endpoint.startsWith("/")?e.endpoint:`/${e.endpoint}`,s=a.indexOf("?"),c=s>=0?`${a.slice(0,s)}?${new URLSearchParams(a.slice(s+1)).toString()}`:a;try{let{defaultContentType:l}=Im(e);l&&!h_(o,"content-type")&&(o["Content-Type"]=l);let m=v_(e,c);if(m.body!==void 0&&!y_(m.method))return t.stderr.write(`Error: ${m.method} does not support a request body. Use -X POST (or PUT/PATCH) to send body data.
113
- `),1;let p=await n.requestFull(m.endpoint,{method:m.method,body:m.body,headers:o});if(e.include&&(t.stdout.write(`HTTP/1.1 ${p.status} ${p.statusText}
114
- `),p.headers.forEach((u,d)=>{t.stdout.write(`${d}: ${u}
186
+ PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...on,{name:"method",shorthand:"X",description:"HTTP method (default: GET)",type:"string",target:"method"},{name:"query",shorthand:"f",description:"Query parameter: key=value (use key=@file to read from file)",type:"string[]",target:"query"},{name:"field",shorthand:"F",description:"Body field: key=value (string) or key:=value (typed JSON). Supports @file",type:"string[]",target:"field"},{name:"header",shorthand:"H",description:"HTTP header: key:value",type:"string[]",target:"header"},{name:"data",shorthand:"d",description:"Request body data (cURL-style)",type:"string[]",target:"data"},{name:"input",description:'Read body from file (use "-" for stdin)',type:"string",target:"input"},{name:"include",shorthand:"i",description:"Print response headers",type:"boolean",target:"include"},{name:"jq",shorthand:"q",description:"Filter output with jq expression",type:"string",target:"jq"},{name:"silent",description:"Don't print response body",type:"boolean",target:"silent"}],examples:[{name:"List CVMs",value:"phala api /cvms"},{name:"Get CVM by app ID",value:"phala api /cvms/app_xxx"},{name:"Filter with jq",value:"phala api /cvms -q '.items[].name'"},{name:"GET with query params",value:"phala api /endpoint -f status=active -f page=2"},{name:"POST with body fields",value:"phala api /endpoint -X POST -F name=foo -F count:=10"},{name:"POST with cURL-style -d",value:`phala api /endpoint -X POST -d '{"foo":"bar"}'`},{name:"POST from file",value:"phala api /endpoint -X POST --input data.json"},{name:"Query params + body combined",value:"phala api /endpoint -X POST -f page=1 -F name=foo"},{name:"Body field from file",value:"phala api /endpoint -X POST -F config:=@settings.json"},{name:"Show response headers",value:"phala api /cvms -i"}]},pp=Ne.object({endpoint:Ne.string(),method:Ne.enum(qk).default("GET").transform(e=>e.toUpperCase()),query:Ne.array(Ne.string()).optional(),field:Ne.array(Ne.string()).optional(),header:Ne.array(Ne.string()).optional(),data:Ne.array(Ne.string()).optional(),input:Ne.string().optional(),include:Ne.boolean().default(!1),jq:Ne.string().optional(),silent:Ne.boolean().default(!1),apiToken:Ne.string().optional()});var Yk=Jk(import.meta.url),Zk=Bk(Yk),Xk=Wk(Zk,"../../../package.json"),dp="unknown";try{dp=JSON.parse(Gs(Xk,"utf-8")).version||"unknown"}catch{}function ea(e){return e==="-"?Gs(0,"utf-8"):Gs(e,"utf-8")}function Qk(e){if(e==="true")return!0;if(e==="false")return!1;if(e==="null")return null;if(/^-?\d+$/.test(e))return Number.parseInt(e,10);if(/^-?\d+\.\d+$/.test(e))return Number.parseFloat(e);if(e.startsWith("[")||e.startsWith("{"))try{return JSON.parse(e)}catch{}return e}function eS(e){let t={};for(let n of e??[]){let r=n.indexOf("=");if(r>0){let o=n.slice(0,r),a=n.slice(r+1);a.startsWith("@")?t[o]=ea(a.slice(1)):t[o]=a}}return t}function tS(e){let t={};for(let n of e??[]){let r=n.indexOf(":=");if(r>0){let a=n.slice(0,r),s=n.slice(r+2);if(s.startsWith("@")){let i=s.slice(1),l=ea(i);try{t[a]=JSON.parse(l)}catch{throw new Error(`Failed to parse JSON from file "${i}" for field "${a}"`)}}else t[a]=Qk(s);continue}let o=n.indexOf("=");if(o>0){let a=n.slice(0,o),s=n.slice(o+1);s.startsWith("@")?t[a]=ea(s.slice(1)):t[a]=s}}return t}function nS(e){let t={};for(let n of e??[]){let r=n.indexOf(":");if(r>0){let o=n.slice(0,r).trim(),a=n.slice(r+1).trim();t[o]=a}}return t}function rS(e,t){let n=t.toLowerCase();return Object.keys(e).some(r=>r.toLowerCase()===n)}function oS(e){return!["GET","HEAD","OPTIONS"].includes(e)}function up(e){let t=e.field&&e.field.length>0;if(e.input&&e.data&&e.data.length>0)throw new Error('"-d/--data" cannot be used with "--input"');if(t&&e.data&&e.data.length>0)throw new Error('"-d/--data" cannot be used with "-F/--field"');if(t&&e.input)throw new Error('"--input" cannot be used with "-F/--field"');if(e.input){let n=ea(e.input);try{return{body:JSON.parse(n)}}catch{return{body:n}}}if(e.data&&e.data.length>0){let n=e.data.length===1?e.data[0]:e.data.join("&"),r=n.trim();if(r.startsWith("{")||r.startsWith("["))try{return{body:JSON.parse(r)}}catch{}return{body:n,defaultContentType:"application/x-www-form-urlencoded"}}if(t){let n=tS(e.field);return Object.keys(n).length===0?{body:void 0}:{body:n}}return{body:void 0}}function aS(e,t){let{body:n}=up(e),r=eS(e.query),o=t;if(Object.keys(r).length>0){let a=new URLSearchParams;for(let[i,l]of Object.entries(r))a.append(i,l);let s=o.includes("?")?"&":"?";o=`${o}${s}${a.toString()}`}return{method:e.method,endpoint:o,body:n}}async function sS(e,t){let n=_t(t,{apiToken:e.apiToken});if(!n.apiKey)return t.stderr.write(`Error: Not authenticated. Run "phala login" first.
187
+ `),1;let r=rt({apiKey:n.apiKey,baseURL:n.baseURL,headers:{"User-Agent":`phala-cli/${dp}`}}),o=nS(e.header),a=e.endpoint.startsWith("/")?e.endpoint:`/${e.endpoint}`,s=a.indexOf("?"),i=s>=0?`${a.slice(0,s)}?${new URLSearchParams(a.slice(s+1)).toString()}`:a;try{let{defaultContentType:l}=up(e);l&&!rS(o,"content-type")&&(o["Content-Type"]=l);let p=aS(e,i);if(p.body!==void 0&&!oS(p.method))return t.stderr.write(`Error: ${p.method} does not support a request body. Use -X POST (or PUT/PATCH) to send body data.
188
+ `),1;let m=await r.requestFull(p.endpoint,{method:p.method,body:p.body,headers:o});if(e.include&&(t.stdout.write(`HTTP/1.1 ${m.status} ${m.statusText}
189
+ `),m.headers.forEach((d,f)=>{t.stdout.write(`${f}: ${d}
115
190
  `)}),t.stdout.write(`
116
- `)),!e.silent&&p.data!==void 0){let u=p.data;if(e.jq)try{u=wm(u,e.jq)}catch(f){return t.stderr.write(`Error: jq filter failed: ${f.message}
117
- `),1}let d=_m(u);t.stdout.write(`${d}
118
- `)}return p.ok?0:1}catch(l){let m=l;return t.stderr.write(`Error: ${m.message}
119
- `),1}}var Am=b({path:["api"],meta:Sm,schema:km,handler:b_});var xm={path:["auth"],meta:{name:"auth",category:"deprecated",description:"Authenticate with Phala Cloud",stability:"deprecated"}};import C_ from"prompts";var he=process.env.CLOUD_URL||"https://cloud.phala.com";var bn=1,Cn=2048,nr=40,bs="dstack-0.3.6",Pm=`version: '3.8'
191
+ `)),!e.silent&&m.data!==void 0){let d=m.data;if(e.jq)try{d=cp(d,e.jq)}catch(u){return t.stderr.write(`Error: jq filter failed: ${u.message}
192
+ `),1}let f=lp(d);t.stdout.write(`${f}
193
+ `)}return m.ok?0:1}catch(l){let p=l;return t.stderr.write(`Error: ${p.message}
194
+ `),1}}var fp=C({path:["api"],meta:mp,schema:pp,handler:sS});var gp={path:["auth"],meta:{name:"auth",category:"deprecated",description:"Authenticate with Phala Cloud",stability:"deprecated"}};import iS from"prompts";var se=process.env.CLOUD_URL||"https://cloud.phala.com";var Yr=1,Zr=2048,In=40,qs="dstack-0.3.6",hp=`version: '3.8'
120
195
  services:
121
196
  postgres:
122
197
  image: ankane/pgvector:latest
@@ -161,7 +236,7 @@ networks:
161
236
  driver: bridge
162
237
 
163
238
  volumes:
164
- postgres-data:`,$m=`version: '3.8'
239
+ postgres-data:`,yp=`version: '3.8'
165
240
  services:
166
241
  app:
167
242
  image: {{imageName}}
@@ -172,51 +247,57 @@ services:
172
247
  {{#each envVars}} - {{{this}}}
173
248
  {{/each}}
174
249
  restart: always
175
- `;import{z as ko}from"zod";var Dm={name:"login",description:"Authenticate with Phala Cloud (use 'phala login' instead)",stability:"deprecated",arguments:[{name:"api-key",description:"API key (triggers device flow if omitted)",required:!1,target:"apiKey"}],options:[{name:"manual",description:"Enter API key manually",type:"boolean"},{name:"no-open",description:"Skip browser launch",type:"boolean"}]},Rm=ko.object({apiKey:ko.string().min(1,"API key cannot be empty").optional(),manual:ko.boolean().optional(),noOpen:ko.boolean().optional()});async function Cs(e){let t=await fo(e.apiKey,{baseURL:e.baseURL}),r=await Pe(t);if(!r.success||!r.data?.user.username)throw new Error("Invalid API key");return{username:r.data.user.username,email:r.data.user.email,workspace_name:r.data.workspace.name,workspace_slug:r.data.workspace.slug||void 0}}async function w_(e){let t,r=await C_({type:"password",name:"apiKey",message:"Enter your API key:",validate:async n=>{if(!n||n.trim().length===0)return"API key cannot be empty";try{return t=await Cs({apiKey:n,baseURL:e.baseURL}),!0}catch(o){return o instanceof Error?o.message:"Invalid API key"}}});if(!r.apiKey)throw new Error("API key input cancelled");return t||(t=await Cs({apiKey:r.apiKey,baseURL:e.baseURL})),{apiKey:r.apiKey,user:t}}async function __(e,t){i.warn('The "phala auth login" command is deprecated and will be removed in a future version.'),i.info('Please use "phala login" instead for a better experience.'),i.break();try{let r=t.env.PHALA_CLOUD_API_PREFIX||gt,n=e.apiKey,o;if(n)o=await Cs({apiKey:n,baseURL:r});else{let l=await w_({baseURL:r});n=l.apiKey,o=l.user}if(!o)throw new Error("Failed to validate API key");let a=o.workspace_name||"default",s=o.workspace_slug,c=a;return Rr({profileName:c,token:n,apiPrefix:r,workspaceName:a,workspaceSlug:s,user:{username:o.username,email:o.email},setCurrent:!0}),i.success(`Welcome ${o.username}! Credentials saved successfully (profile: ${c})`),i.break(),i.info(`Open in Web UI at ${he}/dashboard/`),0}catch(r){return i.error("Failed to set API key"),i.logDetailedError(r),1}}var Mm=b({path:["auth","login"],meta:Dm,schema:Rm,handler:__});import{z as S_}from"zod";var Tm={name:"logout",description:"Remove stored API key (use 'phala logout' instead)",stability:"deprecated"},Lm=S_.object({});async function k_(e,t){i.warn('The "phala auth logout" command is deprecated and will be removed in a future version.'),i.info('Please use "phala logout" instead.'),i.break();try{let n=Ge()?.current_profile;return po(),i.success(n?`Credentials removed successfully (profile: ${n})`:"Credentials removed successfully"),0}catch(r){return i.error("Failed to remove credentials"),i.logDetailedError(r),1}}var Nm=b({path:["auth","logout"],meta:Tm,schema:Lm,handler:k_});import{z as Eo}from"zod";var ie={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},ws={name:"debug",shorthand:"d",description:"Enable debug output",type:"boolean",target:"debug"},Um={name:"status",category:"profile",description:"Check authentication status",stability:"stable",options:[...jt,ie,ws],examples:[{name:"Show login status",value:"phala status"},{name:"Get status as JSON",value:"phala status --json"}]},Io=Eo.object({json:Eo.boolean().default(!1),debug:Eo.boolean().default(!1),apiToken:Eo.string().optional()});async function _s(e,t){let r=e.debug||t.env.DEBUG?.toLowerCase()==="true",{client:n,auth:o}=await uo(t,{apiToken:e.apiToken});if(!o.apiKey)return i.warn('Not authenticated. Please set an API key with "phala login"'),0;r&&(i.debug(`Using API key: ${o.apiKey.substring(0,5)}... (source=${o.tokenSource}, profile=${o.profileName})`),i.debug(`Using API prefix: ${o.baseURL} (source=${o.apiPrefixSource})`));try{let a=await Pe(n);if(!a.success)return i.error("Failed to get user information"),a.error&&i.error(`Error: ${a.error.message}`),t.fail(a.error?.message||"Failed to get user information"),1;let s=a.data,c=o.baseURL,l=n.config.version;if(e.json)return t.success({apiUrl:c,apiVersion:l,username:s.user.username,team_name:s.workspace.name,profile:o.profileName}),0;if(t.stdout.write(`Integrated API: ${c}
250
+ `;import{z as ta}from"zod";var vp={name:"login",description:"Authenticate with Phala Cloud (use 'phala login' instead)",stability:"deprecated",arguments:[{name:"api-key",description:"API key (triggers device flow if omitted)",required:!1,target:"apiKey"}],options:[{name:"manual",description:"Enter API key manually",type:"boolean"},{name:"no-open",description:"Skip browser launch",type:"boolean"}]},Cp=ta.object({apiKey:ta.string().min(1,"API key cannot be empty").optional(),manual:ta.boolean().optional(),noOpen:ta.boolean().optional()});async function Bs(e){let t=await Go(e.apiKey,{baseURL:e.baseURL}),n=await Oe(t);if(!n.success||!n.data?.user.username)throw new Error("Invalid API key");return{username:n.data.user.username,email:n.data.user.email,workspace_name:n.data.workspace.name,workspace_slug:n.data.workspace.slug||void 0}}async function cS(e){let t,n=await iS({type:"password",name:"apiKey",message:"Enter your API key:",validate:async r=>{if(!r||r.trim().length===0)return"API key cannot be empty";try{return t=await Bs({apiKey:r,baseURL:e.baseURL}),!0}catch(o){return o instanceof Error?o.message:"Invalid API key"}}});if(!n.apiKey)throw new Error("API key input cancelled");return t||(t=await Bs({apiKey:n.apiKey,baseURL:e.baseURL})),{apiKey:n.apiKey,user:t}}async function lS(e,t){c.warn('The "phala auth login" command is deprecated and will be removed in a future version.'),c.info('Please use "phala login" instead for a better experience.'),c.break();try{let n=t.env.PHALA_CLOUD_API_PREFIX||Rt,r=e.apiKey,o;if(r)o=await Bs({apiKey:r,baseURL:n});else{let l=await cS({baseURL:n});r=l.apiKey,o=l.user}if(!o)throw new Error("Failed to validate API key");let a=o.workspace_name||"default",s=o.workspace_slug,i=s||"default";return ir({profileName:i,token:r,apiPrefix:n,workspaceName:a,workspaceSlug:s,user:{username:o.username,email:o.email},setCurrent:!0}),c.success(`Welcome ${o.username}! Credentials saved successfully (profile: ${i})`),c.break(),c.info(`Open in Web UI at ${se}/dashboard/`),0}catch(n){return c.error("Failed to set API key"),c.logDetailedError(n),1}}var bp=C({path:["auth","login"],meta:vp,schema:Cp,handler:lS});import{z as mS}from"zod";var wp={name:"logout",description:"Remove stored API key (use 'phala logout' instead)",stability:"deprecated"},_p=mS.object({});async function pS(e,t){c.warn('The "phala auth logout" command is deprecated and will be removed in a future version.'),c.info('Please use "phala logout" instead.'),c.break();try{let r=De()?.current_profile;cr();let o=r?`Credentials removed successfully (profile: ${r})`:"Credentials removed successfully";return t.globalOptions?.json?(t.success({message:o,profile:r||null}),0):(c.success(o),0)}catch(n){return t.globalOptions?.json?(t.fail("Failed to remove credentials"),1):(c.error("Failed to remove credentials"),c.logDetailedError(n),1)}}var kp=C({path:["auth","logout"],meta:wp,schema:_p,handler:pS});import{z as na}from"zod";var pe={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Ws={name:"debug",shorthand:"d",description:"Enable debug output",type:"boolean",target:"debug"},Sp={name:"status",category:"profile",description:"Check authentication status",stability:"stable",options:[...on,pe,Ws],examples:[{name:"Show login status",value:"phala status"},{name:"Get status as JSON",value:"phala status --json"}]},ra=na.object({json:na.boolean().default(!1),debug:na.boolean().default(!1),apiToken:na.string().optional()});async function Js(e,t){let n=e.debug||t.env.DEBUG?.toLowerCase()==="true",{client:r,auth:o}=await Ko(t,{apiToken:e.apiToken});if(!o.apiKey)return c.warn('Not authenticated. Please set an API key with "phala login"'),0;n&&(c.debug(`Using API key: ${o.apiKey.substring(0,5)}... (source=${o.tokenSource}, profile=${o.profileName})`),c.debug(`Using API prefix: ${o.baseURL} (source=${o.apiPrefixSource})`));try{let a=await Oe(r);if(!a.success)return c.error("Failed to get user information"),a.error&&c.error(`Error: ${a.error.message}`),t.fail(a.error?.message||"Failed to get user information"),1;let s=a.data,i=o.baseURL,l=r.config.version;if(e.json)return t.success({apiUrl:i,apiVersion:l,username:s.user.username,team_name:s.workspace.name,profile:o.profileName}),0;if(t.stdout.write(`Integrated API: ${i}
176
251
  `),t.stdout.write(`API Version: ${l}
177
252
  `),t.stdout.write(`Logged in as: ${s.user.username}
178
253
  `),t.stdout.write(`Current Workspace: ${s.workspace.name}
179
254
  `),t.stdout.write(`Current Profile: ${o.profileName}
180
- `),t.cli){let m=await wo({executableName:t.cli.executableName,packageName:t.cli.packageName,currentVersion:t.cli.packageVersion,runtime:t.cli.runtime,env:t.env,isJson:!1,stderrIsTTY:t.stderr.isTTY===!0,ttlMs:0,timeoutMs:5e3});m?t.stderr.write(`
181
- ${m.message}`):t.stdout.write(`CLI is up to date.
182
- `)}return 0}catch(a){return i.error("Authentication failed. Your API key may be invalid or expired."),i.info('Please set a new API key with "phala login"'),r&&i.logDetailedError(a),t.fail("Authentication failed. Your API key may be invalid or expired."),1}}var Om=b({path:["status"],meta:Um,schema:Io,handler:_s});var Fm={name:"status",description:"Check auth status (use 'phala status' instead)",stability:"deprecated",options:[...jt,ie,ws]},jm=Io;var Vm=b({path:["auth","status"],meta:Fm,schema:jm,handler:async(e,t)=>(e.json||(i.warn('The "phala auth status" command is deprecated and will be removed in a future version.'),i.info('Please use "phala status" instead.'),i.break()),_s(e,t))});var Ss={group:xm,commands:[Mm,Nm,Vm]};var zm={path:["config"],meta:{name:"config",category:"deprecated",description:"Manage local CLI state",stability:"deprecated"}};import{z as Km}from"zod";var Gm={name:"get",description:"Get a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0}]},Hm=Km.object({key:Km.string()});async function E_(e,t){i.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let r=Mr(e.key);return r===void 0?(t.stderr.write(`Configuration key '${e.key}' not found
183
- `),1):(t.stdout.write(`${e.key}: ${JSON.stringify(r)}
184
- `),0)}catch(r){return t.stderr.write(`Failed to get configuration value
185
- `),i.logDetailedError(r),1}}var qm=b({path:["config","get"],meta:Gm,schema:Hm,handler:E_});import{z as Bm}from"zod";var Wm={name:"list",aliases:["ls"],description:"List config values",stability:"stable",options:[{name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json"}]},Jm=Bm.object({json:Bm.boolean().default(!1)});async function I_(e,t){i.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let r=sm();if(e.json)return t.success(r),0;t.stdout.write(`Configuration values:
186
- `);for(let[n,o]of Object.entries(r))t.stdout.write(`${n}: ${JSON.stringify(o)}
187
- `);return 0}catch(r){return i.logDetailedError(r),t.fail("Failed to list configuration values"),1}}var Ym=b({path:["config","list"],meta:Wm,schema:Jm,handler:I_});import{z as ks}from"zod";var Zm={name:"set",description:"Set a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0},{name:"value",description:"Configuration value",required:!0}]},Xm=ks.object({key:ks.string(),value:ks.string()});async function A_(e,t){try{let r=e.value;if(e.value.startsWith("{")||e.value.startsWith("[")||e.value==="true"||e.value==="false"||!Number.isNaN(Number(e.value)))try{r=JSON.parse(e.value)}catch{}return i.warn('The "phala config" commands are deprecated and will be removed in a future version.'),am(e.key,r),t.stdout.write(`Configuration value for '${e.key}' set successfully
188
- `),0}catch(r){return t.stderr.write(`Failed to set configuration value
189
- `),i.logDetailedError(r),1}}var Qm=b({path:["config","set"],meta:Zm,schema:Xm,handler:A_});var Es={group:zm,commands:[qm,Ym,Qm]};var ep={path:["cvms"],meta:{name:"cvms",category:"manage",description:"Manage CVMs",stability:"unstable"}};import xo from"chalk";import{z as Ao}from"zod";var tp={name:"attestation",description:"Get CVM attestation",stability:"unstable",arguments:[B],options:[ie,N],examples:[{name:"Show attestation summary",value:"phala cvms attestation"},{name:"Output full attestation JSON",value:"phala cvms attestation --json"}]},rp=Ao.object({cvmId:Ao.string().optional(),interactive:Ao.boolean().default(!1),json:Ao.boolean().default(!1)});async function x_(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=await Q(r,t.cvmId);if(!n.success)return t.fail(n.error.message),1;let o=n.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s=i.startSpinner(`Fetching attestation information for CVM app_${a}...`);try{let c=await jl(a);if(s.stop(!0),!c)return t.fail("No attestation information found"),1;if(e.json)return t.success(c),0;if(i.success("Attestation Summary:"),i.keyValueTable({Status:c.is_online?xo.green("Online"):xo.red("Offline"),"Public Access":c.is_public?xo.green("Enabled"):xo.yellow("Disabled"),Error:c.error||"None",Certificates:`${c.app_certificates?.length||0} found`},{borderStyle:"rounded"}),c.app_certificates?.length&&c.app_certificates.forEach((l,m)=>{i.break(),i.success(`Certificate #${m+1} (${l.position_in_chain===0?"End Entity":"CA"}):`),i.keyValueTable({Subject:`${l.subject.common_name||"Unknown"}${l.subject.organization?` (${l.subject.organization})`:""}`,Issuer:`${l.issuer.common_name||"Unknown"}${l.issuer.organization?` (${l.issuer.organization})`:""}`,"Serial Number":l.serial_number,Validity:`${new Date(l.not_before).toLocaleString()} to ${new Date(l.not_after).toLocaleString()}`,Fingerprint:l.fingerprint,"Signature Algorithm":l.signature_algorithm,"Is CA":l.is_ca?"Yes":"No","Position in Chain":l.position_in_chain},{borderStyle:"rounded"})}),c.tcb_info&&(i.break(),i.success("Trusted Computing Base (TCB) Information:"),i.keyValueTable({Mrtd:c.tcb_info.mrtd,"Rootfs Hash":c.tcb_info.rootfs_hash,Rtmr0:c.tcb_info.rtmr0,Rtmr1:c.tcb_info.rtmr1,Rtmr2:c.tcb_info.rtmr2,Rtmr3:c.tcb_info.rtmr3,"Event Log Entries":`${c.tcb_info.event_log.length} entries`},{borderStyle:"rounded"}),c.tcb_info.event_log?.length)){i.break(),i.success("Event Log (Showing entries to reproduce RTMR3):");let l=c.tcb_info.event_log.filter(m=>m.event).map(m=>({Event:m.event,IMR:m.imr.toString(),"Event Type":m.event_type.toString(),Payload:m.event_payload}));i.table(l,[{key:"Event",header:"Event"},{key:"IMR",header:"IMR"},{key:"Event Type",header:"Type"},{key:"Payload",header:"Payload"}]),c.tcb_info.event_log.length>l.length&&i.info("To see all full attestation data, use --json"),i.break(),i.success("To reproduce RTMR3, use the tool at https://rtmr3-calculator.vercel.app/")}return 0}catch(c){throw s.stop(!1),c}}catch(r){return i.logDetailedError(r),t.fail(`Failed to get attestation information: ${r instanceof Error?r.message:String(r)}`),1}}var np=b({path:["cvms","attestation"],meta:tp,schema:rp,handler:x_});import pp from"fs";import M_ from"path";import Is from"fs";import As from"path";import P_ from"inquirer";function We(e,t=process.cwd()){let r=As.resolve(t,e);if(!Is.existsSync(r))throw new Error(`File not found at ${r}`);return!0}async function kt(e,t,r="file",n=process.cwd()){return(await P_.prompt([{type:"input",name:r,message:e,default:t,validate:a=>{let s=As.resolve(n,a);return Is.existsSync(s)?!0:`File not found at ${s}`}}]))[r]}function Nr(e,t){for(let r of e){let n=As.join(process.cwd(),r);if(Is.existsSync(n))return t?i.info(t.replace("{path}",n)):i.info(`File detected: ${n}`),r}}import*as op from"fs";var wn=(e,t)=>{let r={};if(e){for(let n of e)if(n.includes("=")){let[o,...a]=n.split("="),s=a.join("=");o&&(r[o]=s)}}if(t){let n=op.readFileSync(t,"utf8");for(let o of n.split(`
190
- `)){if(!o.trim()||o.trim().startsWith("#"))continue;let a=-1,s=!1,c="";for(let h=0;h<o.length;h++)if((o[h]==='"'||o[h]==="'"||o[h]==="`")&&(h===0||o[h-1]!=="\\"))s&&o[h]===c?(s=!1,c=""):s||(s=!0,c=o[h]);else if(o[h]==="="&&!s){a=h;break}else if(o[h]==="#"&&!s)break;if(a===-1){o.trim().startsWith("#");continue}let l=o.substring(0,a).trim(),m=o.substring(a+1),p=!1,u="",d=-1;for(let h=0;h<m.length;h++)if((m[h]==='"'||m[h]==="'"||m[h]==="`")&&(h===0||m[h-1]!=="\\"))p&&m[h]===u?(p=!1,u=""):p||(p=!0,u=m[h]);else if(m[h]==="#"&&!p&&h>0&&m[h-1]===" "){d=h-1;break}else if(m[h]==="#"&&!p&&h===0){d=h;break}d!==-1&&(m=m.substring(0,d)),m===void 0&&(m="");let f=m.charAt(0),g=m.charAt(m.length-1);f==='"'&&g==='"'||f==="'"&&g==="'"||f==="`"&&g==="`"?(m=m.substring(1,m.length-1),f==='"'&&(m=m.replace(/\\\\n/g,`
191
- `))):m=m.trim(),l&&(r[l]=m)}}return Object.entries(r).map(([n,o])=>({key:n,value:o}))};import{execSync as Et,spawn as $_}from"child_process";import*as Y from"fs";import*as xs from"net";import*as yt from"os";import*as et from"path";var Ie={version:"0.5.3",baseUrl:"https://github.com/Dstack-TEE/dstack/releases/download/v0.5.3",installDir:et.join(yt.homedir(),".phala-cloud","simulator"),defaultLogPath:et.join(yt.homedir(),".phala-cloud","logs","dstack-simulator.log"),platforms:{darwin:{filename:"dstack-simulator-0.5.3-aarch64-apple-darwin.tgz",extractedFolder:"0.5.3",socketPath:et.join(yt.homedir(),".phala-cloud","simulator","0.5.3","dstack.sock")},linux:{filename:"dstack-simulator-0.5.3-x86_64-linux-musl.tgz",extractedFolder:"0.5.3",socketPath:et.join(yt.homedir(),".phala-cloud","simulator","0.5.3","dstack.sock")},win32:{filename:"dstack-simulator-0.5.3-x86_64-pc-windows-msvc.tgz",extractedFolder:"dstack-simulator-0.5.3-x86_64-pc-windows-msvc",socketPath:"127.0.0.1:8090"}}};function ap(){try{if(!Y.existsSync(Ie.installDir))return!1;let e=yt.platform();if(!Ie.platforms[e])throw new Error(`Unsupported platform: ${e}`);let t=et.join(Ie.installDir,Ie.platforms[e].extractedFolder);if(!Y.existsSync(t))return!1;let n=et.join(t,e==="win32"?"dstack-simulator.exe":"dstack-simulator");return Y.existsSync(n)}catch(e){return i.error("Error checking if simulator is installed:",e),!1}}function _n(){let e=yt.platform();if(!Ie.platforms[e])throw new Error(`Unsupported platform: ${e}. Only darwin, linux, and win32 are supported.`);return e}async function sp(e){let t=r=>{i.info(r),e&&e(r)};try{let r=_n(),n=Ie.platforms[r];if(r==="win32"){try{Et("tar --version",{stdio:"ignore"})}catch{throw new Error("Windows 10 build 17063 or later is required (includes tar command). Please update your Windows version.")}throw new Error("Windows platform is currently not supported. Support will be added in a future release.")}Y.existsSync(Ie.installDir)||(i.info(`Creating installation directory at ${Ie.installDir}`),Y.mkdirSync(Ie.installDir,{recursive:!0})),process.chdir(Ie.installDir);let o=`${Ie.baseUrl}/${n.filename}`;i.info(`Downloading simulator from ${o}`),Et(`wget ${o}`,{stdio:"inherit"});let a=et.join(Ie.installDir,n.extractedFolder);Y.existsSync(a)||Y.mkdirSync(a,{recursive:!0}),i.info(`Extracting ${n.filename} to ${a}`);let s=`tar -xvf "${n.filename}" -C "${a}" --strip-components=1`;i.debug(`Running: ${s}`);try{Et(s,{stdio:"inherit"}),Y.unlinkSync(n.filename)}catch(c){throw i.error(`Failed to extract ${n.filename}:`,c),new Error("Failed to extract simulator archive. Make sure you have sufficient permissions and disk space.")}i.success("Simulator installation completed successfully")}catch(r){throw i.error("Error installing simulator:",r),new Error(`Failed to install simulator: ${r}`)}}var Ps=()=>et.join(yt.tmpdir(),"dstack-simulator.pid");function D_(e){return Buffer.byteLength(e,"utf8")>104}function Po(){try{let e=Ps();if(Y.existsSync(e)){let t=Number.parseInt(Y.readFileSync(e,"utf-8").trim(),10);try{return process.kill(t,0),t}catch{Y.unlinkSync(e)}}return null}catch(e){return i.warn("Error checking simulator PID:",e),null}}function R_(e,t){try{let r=Ps();t&&i.info(`Saving simulator PID ${e} to: ${r}`),Y.writeFileSync(r,e.toString(),"utf-8")}catch(r){i.warn("Failed to save simulator PID:",r)}}async function ip(e={}){try{let t=_n(),r=Ie.platforms[t],n=et.join(Ie.installDir,r.extractedFolder),o=Po();if(o)throw new Error(`Simulator is already running with PID: ${o}`);if(t!=="win32"&&D_(r.socketPath))throw new Error(`Socket path is too long (${r.socketPath.length} chars, max 104): ${r.socketPath}`);if(t!=="win32"&&Y.existsSync(r.socketPath)){i.warn(`Removing existing socket file: ${r.socketPath}`);try{Y.unlinkSync(r.socketPath)}catch(m){i.warn(`Failed to remove existing socket file: ${m}`)}}process.chdir(n);let a=t==="win32"?"dstack-simulator.exe":"./dstack-simulator";e.verbose&&t!=="win32"&&i.info(`Using socket path: ${r.socketPath}`);let s={background:e.background??!0,logToFile:e.logToFile??!0,logFilePath:e.logFilePath??Ie.defaultLogPath};if(s.logToFile){let m=et.dirname(s.logFilePath);Y.existsSync(m)||Y.mkdirSync(m,{recursive:!0}),e.verbose&&i.info(`Simulator logs will be written to: ${s.logFilePath}`)}e.verbose&&i.info(`Starting simulator with: ${a}`);let c=s.logToFile?["ignore",Y.openSync(s.logFilePath,"a"),Y.openSync(s.logFilePath,"a")]:"inherit",l=$_(a,[],{stdio:c,shell:t==="win32",detached:s.background});if(s.logToFile&&Array.isArray(c)&&(typeof c[1]=="number"&&Y.closeSync(c[1]),typeof c[2]=="number"&&Y.closeSync(c[2])),s.logToFile){let p=`
255
+ `),t.cli){let p=await Xo({executableName:t.cli.executableName,packageName:t.cli.packageName,currentVersion:t.cli.packageVersion,runtime:t.cli.runtime,env:t.env,isJson:!1,stderrIsTTY:t.stderr.isTTY===!0,ttlMs:0,timeoutMs:5e3});p?t.stderr.write(`
256
+ ${p.message}`):t.stdout.write(`CLI is up to date.
257
+ `)}return 0}catch(a){return c.error("Authentication failed. Your API key may be invalid or expired."),c.info('Please set a new API key with "phala login"'),n&&c.logDetailedError(a),t.fail("Authentication failed. Your API key may be invalid or expired."),1}}var Ep=C({path:["status"],meta:Sp,schema:ra,handler:Js});var Ip={name:"status",description:"Check auth status (use 'phala status' instead)",stability:"deprecated",options:[...on,pe,Ws]},Ap=ra;var Pp=C({path:["auth","status"],meta:Ip,schema:Ap,handler:async(e,t)=>(e.json||(c.warn('The "phala auth status" command is deprecated and will be removed in a future version.'),c.info('Please use "phala status" instead.'),c.break()),Js(e,t))});var Ys={group:gp,commands:[bp,kp,Pp]};var $p={path:["config"],meta:{name:"config",category:"deprecated",description:"Manage local CLI state",stability:"deprecated"}};import{z as Rp}from"zod";var xp={name:"get",description:"Get a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0}]},Dp=Rp.object({key:Rp.string()});async function dS(e,t){c.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=mr(e.key);return n===void 0?(t.stderr.write(`Configuration key '${e.key}' not found
258
+ `),1):(t.stdout.write(`${e.key}: ${JSON.stringify(n)}
259
+ `),0)}catch(n){return t.stderr.write(`Failed to get configuration value
260
+ `),c.logDetailedError(n),1}}var Tp=C({path:["config","get"],meta:xp,schema:Dp,handler:dS});import{z as Mp}from"zod";var Lp={name:"list",aliases:["ls"],description:"List config values",stability:"stable",options:[{name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json"}]},Up=Mp.object({json:Mp.boolean().default(!1)});async function uS(e,t){c.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=Bm();if(e.json)return t.success(n),0;t.stdout.write(`Configuration values:
261
+ `);for(let[r,o]of Object.entries(n))t.stdout.write(`${r}: ${JSON.stringify(o)}
262
+ `);return 0}catch(n){return c.logDetailedError(n),t.fail("Failed to list configuration values"),1}}var Op=C({path:["config","list"],meta:Lp,schema:Up,handler:uS});import{z as Zs}from"zod";var Np={name:"set",description:"Set a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0},{name:"value",description:"Configuration value",required:!0}]},jp=Zs.object({key:Zs.string(),value:Zs.string()});async function fS(e,t){try{let n=e.value;if(e.value.startsWith("{")||e.value.startsWith("[")||e.value==="true"||e.value==="false"||!Number.isNaN(Number(e.value)))try{n=JSON.parse(e.value)}catch{}return c.warn('The "phala config" commands are deprecated and will be removed in a future version.'),qm(e.key,n),t.stdout.write(`Configuration value for '${e.key}' set successfully
263
+ `),0}catch(n){return t.stderr.write(`Failed to set configuration value
264
+ `),c.logDetailedError(n),1}}var Fp=C({path:["config","set"],meta:Np,schema:jp,handler:fS});var Xs={group:$p,commands:[Tp,Op,Fp]};var Vp={path:["cvms"],meta:{name:"cvms",category:"manage",description:"Manage CVMs",stability:"unstable"}};import aa from"chalk";import{z as oa}from"zod";var Hp={name:"attestation",description:"Get CVM attestation",stability:"unstable",arguments:[Y],options:[pe,O],examples:[{name:"Show attestation summary",value:"phala cvms attestation"},{name:"Output full attestation JSON",value:"phala cvms attestation --json"}]},zp=oa.object({cvmId:oa.string().optional(),interactive:oa.boolean().default(!1),json:oa.boolean().default(!1)});async function gS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s=c.startSpinner(`Fetching attestation information for CVM app_${a}...`);try{let i=await Pm(a);if(s.stop(!0),!i)return t.fail("No attestation information found"),1;if(e.json)return t.success(i),0;if(c.success("Attestation Summary:"),c.keyValueTable({Status:i.is_online?aa.green("Online"):aa.red("Offline"),"Public Access":i.is_public?aa.green("Enabled"):aa.yellow("Disabled"),Error:i.error||"None",Certificates:`${i.app_certificates?.length||0} found`},{borderStyle:"rounded"}),i.app_certificates?.length&&i.app_certificates.forEach((l,p)=>{c.break(),c.success(`Certificate #${p+1} (${l.position_in_chain===0?"End Entity":"CA"}):`),c.keyValueTable({Subject:`${l.subject.common_name||"Unknown"}${l.subject.organization?` (${l.subject.organization})`:""}`,Issuer:`${l.issuer.common_name||"Unknown"}${l.issuer.organization?` (${l.issuer.organization})`:""}`,"Serial Number":l.serial_number,Validity:`${new Date(l.not_before).toLocaleString()} to ${new Date(l.not_after).toLocaleString()}`,Fingerprint:l.fingerprint,"Signature Algorithm":l.signature_algorithm,"Is CA":l.is_ca?"Yes":"No","Position in Chain":l.position_in_chain},{borderStyle:"rounded"})}),i.tcb_info&&(c.break(),c.success("Trusted Computing Base (TCB) Information:"),c.keyValueTable({Mrtd:i.tcb_info.mrtd,"Rootfs Hash":i.tcb_info.rootfs_hash,Rtmr0:i.tcb_info.rtmr0,Rtmr1:i.tcb_info.rtmr1,Rtmr2:i.tcb_info.rtmr2,Rtmr3:i.tcb_info.rtmr3,"Event Log Entries":`${i.tcb_info.event_log.length} entries`},{borderStyle:"rounded"}),i.tcb_info.event_log?.length)){c.break(),c.success("Event Log (Showing entries to reproduce RTMR3):");let l=i.tcb_info.event_log.filter(p=>p.event).map(p=>({Event:p.event,IMR:p.imr.toString(),"Event Type":p.event_type.toString(),Payload:p.event_payload}));c.table(l,[{key:"Event",header:"Event"},{key:"IMR",header:"IMR"},{key:"Event Type",header:"Type"},{key:"Payload",header:"Payload"}]),i.tcb_info.event_log.length>l.length&&c.info("To see all full attestation data, use --json"),c.break(),c.success("To reproduce RTMR3, use the tool at https://rtmr3-calculator.vercel.app/")}return 0}catch(i){throw s.stop(!1),i}}catch(n){return c.logDetailedError(n),t.fail(`Failed to get attestation information: ${n instanceof Error?n.message:String(n)}`),1}}var Kp=C({path:["cvms","attestation"],meta:Hp,schema:zp,handler:gS});import Xp from"fs";import bS from"path";import Qs from"fs";import ei from"path";import hS from"inquirer";function ot(e,t=process.cwd()){let n=ei.resolve(t,e);if(!Qs.existsSync(n))throw new Error(`File not found at ${n}`);return!0}async function jt(e,t,n="file",r=process.cwd()){return(await hS.prompt([{type:"input",name:n,message:e,default:t,validate:a=>{let s=ei.resolve(r,a);return Qs.existsSync(s)?!0:`File not found at ${s}`}}]))[n]}function ur(e,t){for(let n of e){let r=ei.join(process.cwd(),n);if(Qs.existsSync(r))return t?c.info(t.replace("{path}",r)):c.info(`File detected: ${r}`),n}}import*as Gp from"fs";var Xr=(e,t)=>{let n={};if(e){for(let r of e)if(r.includes("=")){let[o,...a]=r.split("="),s=a.join("=");o&&(n[o]=s)}}if(t){let r=Gp.readFileSync(t,"utf8");for(let o of r.split(`
265
+ `)){if(!o.trim()||o.trim().startsWith("#"))continue;let a=-1,s=!1,i="";for(let g=0;g<o.length;g++)if((o[g]==='"'||o[g]==="'"||o[g]==="`")&&(g===0||o[g-1]!=="\\"))s&&o[g]===i?(s=!1,i=""):s||(s=!0,i=o[g]);else if(o[g]==="="&&!s){a=g;break}else if(o[g]==="#"&&!s)break;if(a===-1){o.trim().startsWith("#");continue}let l=o.substring(0,a).trim(),p=o.substring(a+1),m=!1,d="",f=-1;for(let g=0;g<p.length;g++)if((p[g]==='"'||p[g]==="'"||p[g]==="`")&&(g===0||p[g-1]!=="\\"))m&&p[g]===d?(m=!1,d=""):m||(m=!0,d=p[g]);else if(p[g]==="#"&&!m&&g>0&&p[g-1]===" "){f=g-1;break}else if(p[g]==="#"&&!m&&g===0){f=g;break}f!==-1&&(p=p.substring(0,f)),p===void 0&&(p="");let u=p.charAt(0),h=p.charAt(p.length-1);u==='"'&&h==='"'||u==="'"&&h==="'"||u==="`"&&h==="`"?(p=p.substring(1,p.length-1),u==='"'&&(p=p.replace(/\\\\n/g,`
266
+ `))):p=p.trim(),l&&(n[l]=p)}}return Object.entries(n).map(([r,o])=>({key:r,value:o}))};import{execSync as Ft,spawn as yS}from"child_process";import*as te from"fs";import*as ti from"net";import*as Dt from"os";import*as lt from"path";var Me={version:"0.5.3",baseUrl:"https://github.com/Dstack-TEE/dstack/releases/download/v0.5.3",installDir:lt.join(Dt.homedir(),".phala-cloud","simulator"),defaultLogPath:lt.join(Dt.homedir(),".phala-cloud","logs","dstack-simulator.log"),platforms:{darwin:{filename:"dstack-simulator-0.5.3-aarch64-apple-darwin.tgz",extractedFolder:"0.5.3",socketPath:lt.join(Dt.homedir(),".phala-cloud","simulator","0.5.3","dstack.sock")},linux:{filename:"dstack-simulator-0.5.3-x86_64-linux-musl.tgz",extractedFolder:"0.5.3",socketPath:lt.join(Dt.homedir(),".phala-cloud","simulator","0.5.3","dstack.sock")},win32:{filename:"dstack-simulator-0.5.3-x86_64-pc-windows-msvc.tgz",extractedFolder:"dstack-simulator-0.5.3-x86_64-pc-windows-msvc",socketPath:"127.0.0.1:8090"}}};function qp(){try{if(!te.existsSync(Me.installDir))return!1;let e=Dt.platform();if(!Me.platforms[e])throw new Error(`Unsupported platform: ${e}`);let t=lt.join(Me.installDir,Me.platforms[e].extractedFolder);if(!te.existsSync(t))return!1;let r=lt.join(t,e==="win32"?"dstack-simulator.exe":"dstack-simulator");return te.existsSync(r)}catch(e){return c.error("Error checking if simulator is installed:",e),!1}}function Qr(){let e=Dt.platform();if(!Me.platforms[e])throw new Error(`Unsupported platform: ${e}. Only darwin, linux, and win32 are supported.`);return e}async function Bp(e){let t=n=>{c.info(n),e&&e(n)};try{let n=Qr(),r=Me.platforms[n];if(n==="win32"){try{Ft("tar --version",{stdio:"ignore"})}catch{throw new Error("Windows 10 build 17063 or later is required (includes tar command). Please update your Windows version.")}throw new Error("Windows platform is currently not supported. Support will be added in a future release.")}te.existsSync(Me.installDir)||(c.info(`Creating installation directory at ${Me.installDir}`),te.mkdirSync(Me.installDir,{recursive:!0})),process.chdir(Me.installDir);let o=`${Me.baseUrl}/${r.filename}`;c.info(`Downloading simulator from ${o}`),Ft(`wget ${o}`,{stdio:"inherit"});let a=lt.join(Me.installDir,r.extractedFolder);te.existsSync(a)||te.mkdirSync(a,{recursive:!0}),c.info(`Extracting ${r.filename} to ${a}`);let s=`tar -xvf "${r.filename}" -C "${a}" --strip-components=1`;c.debug(`Running: ${s}`);try{Ft(s,{stdio:"inherit"}),te.unlinkSync(r.filename)}catch(i){throw c.error(`Failed to extract ${r.filename}:`,i),new Error("Failed to extract simulator archive. Make sure you have sufficient permissions and disk space.")}c.success("Simulator installation completed successfully")}catch(n){throw c.error("Error installing simulator:",n),new Error(`Failed to install simulator: ${n}`)}}var ni=()=>lt.join(Dt.tmpdir(),"dstack-simulator.pid");function vS(e){return Buffer.byteLength(e,"utf8")>104}function sa(){try{let e=ni();if(te.existsSync(e)){let t=Number.parseInt(te.readFileSync(e,"utf-8").trim(),10);try{return process.kill(t,0),t}catch{te.unlinkSync(e)}}return null}catch(e){return c.warn("Error checking simulator PID:",e),null}}function CS(e,t){try{let n=ni();t&&c.info(`Saving simulator PID ${e} to: ${n}`),te.writeFileSync(n,e.toString(),"utf-8")}catch(n){c.warn("Failed to save simulator PID:",n)}}async function Wp(e={}){try{let t=Qr(),n=Me.platforms[t],r=lt.join(Me.installDir,n.extractedFolder),o=sa();if(o)throw new Error(`Simulator is already running with PID: ${o}`);if(t!=="win32"&&vS(n.socketPath))throw new Error(`Socket path is too long (${n.socketPath.length} chars, max 104): ${n.socketPath}`);if(t!=="win32"&&te.existsSync(n.socketPath)){c.warn(`Removing existing socket file: ${n.socketPath}`);try{te.unlinkSync(n.socketPath)}catch(p){c.warn(`Failed to remove existing socket file: ${p}`)}}process.chdir(r);let a=t==="win32"?"dstack-simulator.exe":"./dstack-simulator";e.verbose&&t!=="win32"&&c.info(`Using socket path: ${n.socketPath}`);let s={background:e.background??!0,logToFile:e.logToFile??!0,logFilePath:e.logFilePath??Me.defaultLogPath};if(s.logToFile){let p=lt.dirname(s.logFilePath);te.existsSync(p)||te.mkdirSync(p,{recursive:!0}),e.verbose&&c.info(`Simulator logs will be written to: ${s.logFilePath}`)}e.verbose&&c.info(`Starting simulator with: ${a}`);let i=s.logToFile?["ignore",te.openSync(s.logFilePath,"a"),te.openSync(s.logFilePath,"a")]:"inherit",l=yS(a,[],{stdio:i,shell:t==="win32",detached:s.background});if(s.logToFile&&Array.isArray(i)&&(typeof i[1]=="number"&&te.closeSync(i[1]),typeof i[2]=="number"&&te.closeSync(i[2])),s.logToFile){let m=`
192
267
  === Simulator started at ${new Date().toISOString()} ===
193
268
  Command: ${a}
194
269
 
195
- `;Y.appendFileSync(s.logFilePath,p)}return l.pid&&R_(l.pid,e.verbose),s.background&&(l.unref(),e.verbose&&i.success("Simulator is running in the background")),await Ds(),l}catch(t){throw i.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function Sn(){try{let e=_n(),t=Ie.platforms[e];if(e==="darwin"||e==="linux"){let r=t.socketPath;return Y.existsSync(r)?new Promise(n=>{let o=xs.createConnection({path:r}).on("connect",()=>{o.end(),n(!0)}).on("error",()=>{n(!1)});setTimeout(()=>{o.end(),n(!1)},1e3)}):!1}if(e==="win32"){let r="127.0.0.1";return new Promise(o=>{let a=xs.createConnection({host:r,port:8090}).on("connect",()=>{a.end(),o(!0)}).on("error",()=>{o(!1)});setTimeout(()=>{a.end(),o(!1)},1e3)})}return!1}catch(e){return i.error("Error checking if simulator is running:",e),!1}}async function cp(){try{let e=Po();if(!await Sn()&&!e)return i.info("Simulator is not running"),!0;let r=_n(),n=!1;if(r==="win32")try{e?(i.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Et("taskkill /F /IM dstack-simulator.exe",{stdio:"ignore"}),n=!0}catch(a){if(a.code!=="ESRCH")return i.error("Failed to stop simulator:",a),!1;n=!0}else try{e?(i.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Et("pkill -f dstack-simulator",{stdio:"ignore"}),n=!0}catch(a){if(a.code!=="ESRCH")return i.error("Failed to stop simulator:",a),!1;n=!0}let o=Ps();if(Y.existsSync(o))try{Y.unlinkSync(o)}catch(a){i.warn("Failed to remove PID file:",a)}return await or(),n&&i.success("Simulator stopped successfully"),n}catch(e){return i.error("Error stopping simulator:",e),!1}}function $s(){let e=_n(),t=Ie.platforms[e];return e==="win32"?"http://127.0.0.1:8090":`${t.socketPath||"/tmp/dstack.sock"}`}async function Ds(e){try{let t=$s(),r=e||t;await Et(`export DSTACK_SIMULATOR_ENDPOINT=${r}`);let n=r.replace(/dstack\.sock$/,"tappd.sock");return await Et(`export TAPPD_SIMULATOR_ENDPOINT=${n}`),i.success("Setting environment for current process..."),i.success(` DSTACK_SIMULATOR_ENDPOINT=${r}`),i.success(` TAPPD_SIMULATOR_ENDPOINT=${n}`),r}catch(t){throw i.error("Error setting simulator endpoint environment variable:",t),new Error(`Failed to set simulator endpoint: ${t}`)}}async function or(){try{return await Et("unset DSTACK_SIMULATOR_ENDPOINT"),await Et("unset TAPPD_SIMULATOR_ENDPOINT"),i.debug("Deleted simulator endpoint environment variables from current process"),!0}catch(e){return i.warn("Error while unsetting simulator endpoint environment variables:",e),!1}}import up from"inquirer";import{z as st}from"zod";var lp={name:"create",description:'Create a new CVM (use "phala deploy" instead)',stability:"deprecated",options:[{name:"name",shorthand:"n",description:"Name of the CVM",type:"string",target:"name"},{name:"compose",shorthand:"c",description:"Path to Docker Compose file",type:"string",target:"compose"},{name:"vcpu",description:`Virtual CPUs (default: ${bn})`,type:"string",target:"vcpu"},{name:"memory",description:`Memory in MB (default: ${Cn})`,type:"string",target:"memory"},{name:"disk-size",description:`Disk size in GB (default: ${nr})`,type:"string",target:"diskSize"},{name:"teepod-id",description:"TEEPod ID (auto-selected if omitted)",type:"string",target:"teepodId"},{name:"image",description:"dstack image version (uses default if omitted)",type:"string",target:"image"},{name:"env-file",shorthand:"e",description:"Path to environment file",type:"string",target:"envFile"},{name:"skip-env",description:"Skip env var prompt",type:"boolean",target:"skipEnv"},{name:"debug",description:"Enable debug output",type:"boolean",target:"debug"}],examples:[{name:"Create a CVM interactively",value:"phala cvms create"},{name:"Create using predefined values",value:"phala cvms create --name demo --compose ./docker-compose.yml"}]},mp=st.object({name:st.string().optional(),compose:st.string().optional(),vcpu:st.string().optional(),memory:st.string().optional(),diskSize:st.string().optional(),teepodId:st.string().optional(),image:st.string().optional(),envFile:st.string().optional(),skipEnv:st.boolean().default(!1),debug:st.boolean().default(!1)});async function T_(e){if(e)return e;let{value:t}=await up.prompt([{type:"input",name:"value",message:"Enter a name for the CVM:",validate:r=>{let n=r.trim();return n?n.length>20?"CVM name must be less than 20 characters":n.length<3?"CVM name must be at least 3 characters":/^[a-zA-Z0-9_-]+$/.test(n)?!0:"CVM name must contain only letters, numbers, underscores, and hyphens":"CVM name is required"}}]);return t.trim()}async function L_(e){if(e)return e;let r=Nr(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return await kt("Enter the path to your Docker Compose file:",r,"file")}async function N_(e){if(e.envFile)return wn([],e.envFile);if(e.skipEnv)return i.info("Skipping environment variable prompt"),[];let{shouldSkip:t}=await up.prompt([{type:"confirm",name:"shouldSkip",message:"Do you want to skip environment variable prompt?",default:!0}]);if(t)return i.info("Skipping environment variable prompt"),[];let r=await kt("Enter the path to your environment file:",".env","file");return wn([],r)}function Rs(e,t){if(!e)return t;let r=Number(e);return Number.isFinite(r)?r:t}function U_(e,t){return!Number.isFinite(t)||t<=0?`Invalid ${e}: ${t}`:null}async function O_(e,t){if(!t.nodes.length)return;if(!e)return t.nodes[0];let r=Number(e);return t.nodes.find(n=>n.teepod_id===r)}function F_(e,t){let r=e.images??[];return t?r.find(n=>n.name===t):r.find(n=>n.name===bs)}async function j_(e,t){try{i.warn('\u26A0\uFE0F This command is deprecated. Please use "phala deploy" instead.'),i.warn("\u26A0\uFE0F This legacy API will be maintained but may have limited support.\\n");let r=await T_(e.name),n=await L_(e.compose),o=M_.resolve(n);if(!pp.existsSync(o))return i.error(`Docker Compose file not found: ${o}`),1;let a=pp.readFileSync(o,"utf8");await or(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?i.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?i.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):i.info("\u{1F510} Using public DockerHub registry...");let s=[];try{s=await N_(e)}catch(E){return i.error(`Failed to read environment file: ${E instanceof Error?E.message:String(E)}`),1}let c=Rs(e.vcpu,bn),l=Rs(e.memory,Cn),m=Rs(e.diskSize,nr);for(let[E,x]of[["number of vCPUs",c],["memory",l],["disk size",m]]){let P=U_(E,x);if(P)return i.error(P),1}let p=i.startSpinner("Fetching available TEEPods"),u=await Hl(!0);p.stop(!0);let d=await O_(e.teepodId,u);if(!d)return i.error("Failed to find suitable TEEPod"),1;let f=F_(d,e.image);if(!f)return i.error(e.image?`Failed to find selected image: ${e.image}`:`Failed to find default image ${bs}`),1;let g={teepod_id:d.teepod_id,name:r,image:f.name,vcpu:c,memory:l,disk_size:m,compose_manifest:{docker_compose_file:a,docker_config:{url:"",username:"",password:""},features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:r,public_logs:!0,public_sysinfo:!0,runner:"docker-compose",tproxy_enabled:!0},listed:!1},h=i.startSpinner("Getting public key from CVM"),v=await zl(g);if(h.stop(!0),!v)return i.error("Failed to get public key from CVM"),1;let w=i.startSpinner("Encrypting environment variables"),C=await(0,$e.encryptEnvVars)(s,v.app_env_encrypt_pubkey);w.stop(!0),e.debug&&(i.debug("Public key:",v.app_env_encrypt_pubkey),i.debug("Encrypted environment variables:",C),i.debug("Environment variables:",JSON.stringify(s)));let _=i.startSpinner("Creating CVM"),S=await Kl({...g,encrypted_env:C,app_env_encrypt_pubkey:v.app_env_encrypt_pubkey,app_id_salt:v.app_id_salt});return _.stop(!0),S?(i.success("CVM created successfully"),i.break(),i.keyValueTable({"CVM ID":S.id,Name:S.name,Status:S.status,"App ID":`app_${S.app_id}`,"App URL":S.app_url||`${he}/dashboard/cvms/app_${S.app_id}`},{borderStyle:"rounded"}),i.info(""),i.success(`Your CVM is being created. You can check its status with:
196
- phala cvms get app_${S.app_id}`),0):(i.error("Failed to create CVM"),1)}catch(r){return i.error(`Failed to create CVM: ${r instanceof Error?r.message:String(r)}`),1}}var dp=b({path:["cvms","create"],meta:lp,schema:mp,handler:j_});import V_ from"inquirer";import{z as kn}from"zod";var fp={name:"delete",description:"Delete a CVM",stability:"unstable",arguments:[B],options:[N,{name:"force",shorthand:"f",description:"Skip confirmation prompt",type:"boolean",target:"force"},{name:"yes",shorthand:"y",description:"Alias for --force (skip confirmation prompt)",type:"boolean",target:"yes"}],examples:[{name:"Delete a CVM interactively",value:"phala cvms delete"},{name:"Delete CVM by app_id",value:"phala cvms delete app_123 --force"},{name:"Delete CVM by UUID",value:"phala cvms delete 550e8400-e29b-41d4-a716-446655440000 -f"},{name:"Delete CVM by name",value:"phala cvms delete my-app --yes"}]},gp=kn.object({cvmId:kn.string().optional(),interactive:kn.boolean().default(!1),force:kn.boolean().default(!1),yes:kn.boolean().default(!1)});async function z_(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=await Q(r,t.cvmId);if(!n.success)return t.fail(n.error.message),1;let o=n.data;if(!o)return t.fail("CVM not found"),1;let a=o.name||`app_${o.app_id}`;if(!e.force&&!e.yes){let{confirm:l}=await V_.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete CVM "${a}"? This action cannot be undone.`,default:!1}]);if(!l)return i.info("Deletion cancelled"),0}let s=i.startSpinner(`Deleting CVM ${a}`),c=await Ya(r,t.cvmId);return s.stop(!0),c.success?(i.success(`CVM ${a} deleted successfully`),0):(i.error(`Failed to delete CVM ${a}: ${c.error.message}`),1)}catch(r){return i.error("Failed to delete CVM"),i.logDetailedError(r),1}}var hp=b({path:["cvms","delete"],meta:fp,schema:gp,handler:z_});import Do from"chalk";function ce(e,t){let r={};for(let o of e){r[o]=o.length;for(let a of t)r[o]=Math.max(r[o],(a[o]??"").length)}let n=o=>e.map(a=>(o[a]??"").padEnd(r[a])).join(" ");console.log(n(Object.fromEntries(e.map(o=>[o,o]))));for(let o of t)console.log(n(o))}import{z as $o}from"zod";var yp={name:"device-allowlist",description:"Show device allowlist status for a CVM's app",stability:"unstable",arguments:[B],options:[ie,N],examples:[{name:"Check device allowlist",value:"phala cvms device-allowlist app_abc123"}]},vp=$o.object({cvmId:$o.string().optional(),json:$o.boolean().default(!1),interactive:$o.boolean().default(!1)});async function K_(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=await Q(r,t.cvmId);if(!n.success)return t.fail(n.error.message),1;let o=n.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id;if(!a)return t.fail("CVM has no app_id assigned yet."),1;let s=await eo(r,{appId:a});if(!s.success)return t.fail(s.error.message),1;let c=s.data;if(e.json)return t.success(c),0;if(!c.is_onchain_kms)return i.info("This app does not use on-chain KMS."),0;if(i.info(`Chain: ${c.chain_id??"N/A"} Contract: ${c.app_contract_address??"N/A"}`),i.info(`Allow Any Device: ${c.allow_any_device?Do.green("yes"):Do.red("no")}`),c.devices.length===0)return i.info("No devices found for this app."),0;let l=["DEVICE_ID","NODE","CVMS","STATUS"],m=c.devices.map(p=>({DEVICE_ID:p.device_id,NODE:p.node_name??"-",CVMS:p.cvm_ids.join(", ")||"-",STATUS:p.status==="allowed"?Do.green(p.status):Do.red(p.status)}));return ce(l,m),0}catch(r){return i.logDetailedError(r),t.fail(`Failed to get device allowlist: ${r instanceof Error?r.message:String(r)}`),1}}var bp=b({path:["cvms","device-allowlist"],meta:yp,schema:vp,handler:K_});import Ms from"chalk";import{z as Ro}from"zod";var Cp={name:"get",description:"Get details of a CVM",stability:"unstable",arguments:[B],options:[ie,N],examples:[{name:"Get CVM interactively",value:"phala cvms get"},{name:"By app_id",value:"phala cvms get app_abc123"},{name:"By UUID",value:"phala cvms get 550e8400-e29b-41d4-a716-446655440000"},{name:"By name",value:"phala cvms get my-app"}]},wp=Ro.object({cvmId:Ro.string().optional(),json:Ro.boolean().default(!1),interactive:Ro.boolean().default(!1)});async function G_(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=i.startSpinner("Fetching CVM details"),n=await k(),o=await Q(n,t.cvmId);if(r.stop(!0),!o.success)return t.fail(o.error.message),1;let a=o.data;if(!a)return t.fail("CVM not found"),1;if(e.json)return t.success(a),0;i.break();let s=a.status==="running"?Ms.green(a.status):a.status==="stopped"?Ms.red(a.status):Ms.yellow(a.status);return i.keyValueTable({Name:a.name,"App ID":`app_${a.app_id}`,Status:s,vCPU:a.resource.vcpu,Memory:a.resource.memory_in_gb!=null?`${a.resource.memory_in_gb} GB`:"N/A","Disk Size":a.resource.disk_in_gb!=null?`${a.resource.disk_in_gb} GB`:"N/A","Dstack Image":a.os?.name,"App URL":`${he}/dashboard/cvms/app_${a.app_id}`}),0}catch(r){return i.logDetailedError(r),t.fail(`Failed to get CVM details: ${r instanceof Error?r.message:String(r)}`),1}}var _p=b({path:["cvms","get"],meta:Cp,schema:wp,handler:G_});import To from"chalk";function H_(e,t){if(t<=0)return[Array.from(e)];let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}async function Mo(e,t){let r=await gl(e,{page:t.page,page_size:t.pageSize,search:t.search,status:t.status,listed:t.listed,base_image:t.baseImage,instance_type:t.instanceType,kms_type:t.kmsType,node:t.node,region:t.region});if(!r.success)return{success:!1,error:{message:r.error.message}};let n=r.data,a=(n.dstack_apps??[]).filter(m=>m.current_cvm&&typeof m.current_cvm=="object"&&"vm_uuid"in m.current_cvm&&!!m.current_cvm.vm_uuid),s=a.map(m=>m.current_cvm?.vm_uuid).filter(m=>typeof m=="string"&&m.length>0),c={};for(let m of H_(s,100)){let p=await dl(e,{vmUuids:m});if(!p.success)return{success:!1,error:{message:p.error.message}};for(let[u,d]of Object.entries(p.data))c[u]={status:d.status,uptime:d.uptime,in_progress:d.in_progress}}let l=[];for(let m of a){let p=m.current_cvm;if(!p?.vm_uuid)continue;let u=c[p.vm_uuid],d=u?u.status:typeof p.status=="string"?p.status:"unknown";l.push({appId:m.app_id,cvmName:p.name,status:d,uptime:u?.uptime})}return{success:!0,data:{page:n.page,pageSize:n.page_size,total:n.total,totalPages:n.total_pages,items:l}}}import{z as Je}from"zod";var Sp={name:"list",aliases:["ls"],description:"List CVMs",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},{name:"search",description:"Search by name, app_id, vm_uuid, or instance_id",type:"string",target:"search",group:"basic"},{name:"status",description:"Filter by CVM status (can be specified multiple times)",type:"string[]",target:"status",group:"basic"},{name:"listed",description:"Filter by listed status",type:"boolean",target:"listed",negatedName:"no-listed",group:"basic"},{name:"base-image",description:"Filter by base image name",type:"string",target:"baseImage",group:"basic"},{name:"instance-type",description:"Filter by instance type",type:"string",target:"instanceType",group:"basic"},{name:"kms-type",description:"Filter by KMS type",type:"string",target:"kmsType",group:"basic"},{name:"node",description:"Filter by node name",type:"string",target:"node",group:"basic"},{name:"region",description:"Filter by region identifier",type:"string",target:"region",group:"basic"},Ee],examples:[{name:"List CVMs",value:"phala cvms ls"},{name:"Second page",value:"phala cvms ls --page 2"},{name:"Search by name",value:"phala cvms ls --search my-cvm"},{name:"Filter by status",value:"phala cvms ls --status running"},{name:"Output as JSON",value:"phala cvms ls --json"}]},kp=Je.object({page:Je.coerce.number().int().min(1).default(1),pageSize:Je.coerce.number().int().min(1).max(100).default(50),search:Je.string().optional(),status:Je.array(Je.string()).optional(),listed:Je.boolean().optional(),baseImage:Je.string().optional(),instanceType:Je.string().optional(),kmsType:Je.string().optional(),node:Je.string().optional(),region:Je.string().optional(),json:Je.boolean().default(!1)});function q_(e){return e.toLowerCase().endsWith("ing")?To.yellow(e):e==="running"?To.green(e):e==="stopped"?To.red(e):To.yellow(e)}async function B_(e,t){try{let r=await k(),n=await Mo(r,{page:e.page,pageSize:e.pageSize,search:e.search,status:e.status,listed:e.listed,baseImage:e.baseImage,instanceType:e.instanceType,kmsType:e.kmsType,node:e.node,region:e.region});if(n.success===!1)return t.fail(n.error.message),1;let o=n.data;if(e.json)return t.success(o),0;let a=["APP_ID","CVM","STATUS","UPTIME"],s=o.items.map(c=>({APP_ID:c.appId,CVM:c.cvmName,STATUS:q_(c.status),UPTIME:c.uptime??"-"}));return s.length===0?(i.info("No CVMs found"),0):(ce(a,s),i.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(r){return i.logDetailedError(r),t.fail(`Failed to list CVMs: ${r instanceof Error?r.message:String(r)}`),1}}var Ep=b({path:["cvms","list"],meta:Sp,schema:kp,handler:B_});import{z as W_}from"zod";var Ip={name:"list-nodes",description:"List worker nodes",stability:"unstable"},Ap=W_.object({});async function J_(e,t){try{let r=await k(),n=await Zt(r);if(!n.success)throw new Error(n.error.message);let{nodes:o,kms_list:a}=n.data;if(!o||o.length===0)return i.info("No available nodes found."),0;i.info("Available Nodes:");for(let s of o)if(i.info("----------------------------------------"),i.info(` ID: ${s.teepod_id}`),i.info(` Name: ${s.name}`),i.info(` Region: ${s.region_identifier}`),i.info(` FMSPC: ${s.fmspc||"N/A"}`),i.info(` Device ID: ${s.device_id||"N/A"}`),i.info(` Support Onchain KMS: ${s.support_onchain_kms}`),i.info(" Images:"),s.images&&s.images.length>0)for(let c of s.images)i.info(` - ${c.name}`),i.info(` Hash: ${c.os_image_hash||"N/A"}`);else i.info(" N/A");if(a&&a.length>0){i.info(`
197
- Available KMS Instances:`);for(let s of a)i.info("----------------------------------------"),i.info(` ID: ${s.id}`),i.info(` URL: ${s.url}`),i.info(` Version: ${s.version}`),i.info(` Chain ID: ${s.chain_id}`),i.info(` Contract Address: ${s.kms_contract_address}`),i.info(` Gateway App ID: ${s.gateway_app_id}`)}return 0}catch(r){return i.error("Failed to list available nodes"),i.logDetailedError(r),1}}var xp=b({path:["cvms","list-nodes"],meta:Ip,schema:Ap,handler:J_});async function En(e){try{let t=await k(),r=await Q(t,{id:e});if(r.success&&r.data.public_logs===!1)return i.warn("Logs are disabled for this CVM (public_logs=false)."),i.warn("To enable logs, run:"),i.warn(` phala deploy --cvm-id ${e} --public-logs`),!0}catch(t){i.debug?.(`Failed to check CVM info: ${t}`)}return!1}function Lo(e,t){return async function(n,o){if(!o.cvmId)return o.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:a}=G.parse(o.cvmId),s=t(n),c=e.logType==="serial"?"serial":"container";try{if(n.follow){if(n.json)return o.fail("Cannot use --json with --follow"),1;i.info(`Streaming ${c} logs (press Ctrl+C to stop)...`),i.break();let m=new AbortController,p=!1,u=()=>{p=!0,m.abort()};process.on("SIGINT",u),process.on("SIGTERM",u);try{await e.streamLogs(a,d=>process.stdout.write(d),s,m.signal)}catch(d){if(d.name!=="AbortError")throw d}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u)}return p&&(i.break(),i.info("Stopped streaming logs")),0}let l=await e.fetchLogs(a,s);return n.json?(o.success({logs:l,cvm_id:a}),0):(l.trim()?console.log(l):await En(a)||i.info("No logs available"),0)}catch(l){return o.fail(`Failed to fetch ${c} logs: ${l instanceof Error?l.message:String(l)}`),await En(a),1}}}import{z as Kt}from"zod";var Pp={name:"logs",description:"Fetch container logs from a CVM",stability:"deprecated",arguments:[B],options:[{name:"tail",shorthand:"n",description:"Lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream logs in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},{name:"container",shorthand:"c",description:"Container name or ID (defaults to first)",type:"string",target:"container"},ie,N],examples:[{name:"Show container logs from a CVM",value:"phala cvms logs app_abc123"},{name:"Show last 100 lines of logs",value:"phala cvms logs app_abc123 --tail 100"},{name:"Follow logs in real-time",value:"phala cvms logs app_abc123 --follow"},{name:"Show logs from a specific container",value:"phala cvms logs app_abc123 --container my-service"},{name:"Show logs with timestamps",value:"phala cvms logs app_abc123 --timestamps"}]},$p=Kt.object({cvmId:Kt.string().optional(),tail:Kt.number().optional(),follow:Kt.boolean().default(!1),timestamps:Kt.boolean().default(!1),container:Kt.string().optional(),json:Kt.boolean().default(!1),interactive:Kt.boolean().default(!1)});var Y_=Lo({logType:"container",fetchLogs:Jl,streamLogs:Ql},e=>({tail:e.tail,timestamps:e.timestamps,container:e.container})),Dp=b({path:["cvms","logs"],meta:Pp,schema:$p,handler:Y_});import Tp from"fs";import Z_ from"path";import{z as In}from"zod";var Rp={name:"replicate",description:"Create a replica of an existing CVM",stability:"unstable",arguments:[B],options:[{name:"teepod-id",description:"TEEPod ID for replica",type:"string",target:"teepodId"},{name:"env-file",shorthand:"e",description:"Path to environment file",type:"string",target:"envFile"},N],examples:[{name:"Replicate a CVM",value:"phala cvms replicate 1234 --teepod-id 5"}]},Mp=In.object({cvmId:In.string().optional(),teepodId:In.string().optional(),envFile:In.string().optional(),interactive:In.boolean().default(!1)});function X_(e){return Tp.readFileSync(e,"utf-8").split(`
198
- `).filter(r=>r.trim()!==""&&!r.trim().startsWith("#")).map(r=>{let[n,...o]=r.split("=");return{key:n.trim(),value:o.join("=").trim()}})}async function Q_(e,t){try{if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:r}=G.parse(t.cvmId),n;if(e.envFile){let s=Z_.resolve(process.cwd(),e.envFile);if(!Tp.existsSync(s))throw new Error(`Environment file not found: ${s}`);let c=X_(s),l=await Ol(r);i.info("Encrypting environment variables..."),n=await(0,$e.encryptEnvVars)(c,l.env_pubkey)}let o={};e.teepodId&&(o.teepod_id=Number.parseInt(e.teepodId,10)),n&&(o.encrypted_env=n);let a=await Vl(r,o);return i.success(`Successfully created replica of CVM UUID: ${r} with App ID: ${a.app_id}`),i.keyValueTable({"CVM UUID":a.vm_uuid.replace(/-/g,""),"App ID":a.app_id,Name:a.name,Status:a.status,TEEPod:`${a.teepod.name} (ID: ${a.teepod_id})`,vCPUs:a.vcpu,Memory:`${a.memory} MB`,"Disk Size":`${a.disk_size} GB`,"App URL":a.app_url||`${process.env.CLOUD_URL||"https://cloud.phala.com"}/dashboard/cvms/${a.vm_uuid.replace(/-/g,"")}`},{borderStyle:"rounded"}),i.success(`Your CVM replica is being created. You can check its status with:
199
- phala cvms get ${a.app_id}`),0}catch(r){return i.error("Failed to create CVM replica"),i.logDetailedError(r),1}}var Lp=b({path:["cvms","replicate"],meta:Rp,schema:Mp,handler:Q_});import Gt from"chalk";import Ns from"inquirer";async function It(e,t={}){let{maxRetries:r=100,retryDelayMs:n=3e3,spinner:o,logRetries:a=!0}=t,s;for(let l=0;l<=r;l++)try{return await e()}catch(m){s=m;let p=m;if((p.message?.includes("409")||p.status===409||p.message?.includes("Conflict"))&&l<r)o&&o.stop(!0),a&&i.warn(`CVM is busy, retrying in ${n}ms... (attempt ${l+1}/${r})`),await new Promise(d=>setTimeout(d,n));else throw m}let c=s;throw new Error(`Failed after ${r} retries due to conflicts: ${c?.message||String(s)}`)}import{z as At}from"zod";var Np={name:"resize",description:"Resize resources for a CVM",stability:"unstable",arguments:[B],options:[N,{name:"vcpu",shorthand:"v",description:"Virtual CPUs",type:"string",target:"vcpu"},{name:"memory",shorthand:"m",description:"Memory in MB",type:"string",target:"memory"},{name:"disk-size",shorthand:"d",description:"Disk size in GB",type:"string",target:"diskSize"},{name:"allow-restart",shorthand:"r",description:"Allow CVM restart",type:"string",target:"allowRestart"},{name:"yes",shorthand:"y",description:"Skip confirmation",type:"boolean",target:"yes"},{name:"json",description:"Output in JSON format",type:"boolean",target:"json"}],examples:[{name:"Resize CVM interactively",value:"phala cvms resize"},{name:"Resize without confirmation",value:"phala cvms resize app_123 --vcpu 4 --memory 4096 --disk-size 120 --yes"}]},Up=At.object({cvmId:At.string().optional(),interactive:At.boolean().default(!1),vcpu:At.string().optional(),memory:At.string().optional(),diskSize:At.string().optional(),allowRestart:At.string().optional(),yes:At.boolean().default(!1),json:At.boolean().default(!1)});function Ts(e,t){if(e===void 0)return;let r=Number.parseInt(e,10);if(Number.isNaN(r)||r<0)throw new Error(`Please provide a valid non-negative number for ${t}`);return r}function eS(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(["true","1","yes","y"].includes(t))return!0;if(["false","0","no","n"].includes(t))return!1;throw new Error(`Invalid value for --allow-restart: ${e}`)}async function Ls(e,t){return(await Ns.prompt([{type:"input",name:"value",message:e,default:t,validate:n=>{let o=Number.parseInt(n,10);return Number.isNaN(o)||o<0?"Please enter a valid non-negative number":!0},filter:n=>Number.parseInt(n,10)}])).value}async function tS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=await Q(r,t.cvmId);if(!n.success)return t.fail(n.error.message),1;let o=n.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s,c,l,m;try{s=Ts(e.vcpu,"--vcpu"),c=Ts(e.memory,"--memory"),l=Ts(e.diskSize,"--disk-size"),m=eS(e.allowRestart)}catch(p){return i.error(p instanceof Error?p.message:String(p)),1}if(is()?(s===void 0&&(s=await Ls("Enter number of vCPUs:",o.resource.vcpu??void 0)),c===void 0&&(c=await Ls("Enter memory in MB:",o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0)),l===void 0&&(l=await Ls("Enter disk size in GB:",o.resource.disk_in_gb??void 0)),m===void 0&&(m=(await Ns.prompt([{type:"confirm",name:"allowRestart",message:"Allow restart of the CVM if needed for resizing?",default:!1}])).allowRestart)):(s===void 0&&(s=o.resource.vcpu??void 0),c===void 0&&(c=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0),l===void 0&&(l=o.resource.disk_in_gb??void 0),m===void 0&&(m=!0)),is()){let p=o.resource.vcpu,u=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0,d=o.resource.disk_in_gb;if(i.keyValueTable({vCPUs:p!==s?`${Gt.red(p)} -> ${Gt.green(s)}`:p,Memory:u!==c?`${Gt.red(u)} MB -> ${Gt.green(c)} MB`:u,"Disk Size":d!==l?`${Gt.red(d)} GB -> ${Gt.green(l)} GB`:d,"Allow Restart":m?Gt.green("Yes"):Gt.red("No")}),!e.yes){let{confirm:g}=await Ns.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to resize CVM app_${a}?`,default:!1}]);if(!g)return i.info("Resize operation cancelled"),0}let f=i.startSpinner(`Resizing CVM with App ID app_${a}`);await It(()=>ds(a,s,c,l,m?1:0),{spinner:f}),f.stop(!0),i.break(),i.success(`Your CVM is being resized. You can check the dashboard for more details:
200
- ${he}/dashboard/cvms/app_${a}`)}else await It(()=>ds(a,s,c,l,m?1:0)),t.success({app_id:a,vcpu:s,memory:c,disk_size:l,allow_restart:m});return 0}catch(r){return i.error("Failed to resize CVM"),i.logDetailedError(r),t.fail(r instanceof Error?r.message:String(r)),1}}var Op=b({path:["cvms","resize"],meta:Np,schema:Up,handler:tS});async function No(e,t=3e5){let r=await k(),n=Date.now(),o=2e3;for(i.info("Waiting for CVM to be ready...");Date.now()-n<t;){try{let a=await Q(r,{id:e});if(!a.success)i.warn(`Failed to get CVM info: ${a.error.message}`);else{let s=a.data,c=s.status,l=s.in_progress,m=Math.floor((Date.now()-n)/1e3);if(i.info(` [${m}s] status=${c}, in_progress=${l}`),c==="running"&&!l){let p=Math.floor((Date.now()-n)/1e3);i.success(`CVM is ready (took ${p}s)`);return}}}catch(a){i.warn(`Error checking CVM status: ${a}`)}await new Promise(a=>setTimeout(a,o))}throw new Error(`Timeout waiting for CVM to be ready (${Math.floor(t/1e3)}s)`)}import{z as Us}from"zod";var Fp={name:"restart",description:"Restart a CVM",stability:"stable",arguments:[B],options:[N],examples:[{name:"By app_id",value:"phala cvms restart app_123"},{name:"By UUID",value:"phala cvms restart 550e8400-e29b-41d4-a716-446655440000"},{name:"By name",value:"phala cvms restart my-app"}]},jp=Us.object({cvmId:Us.string().optional(),interactive:Us.boolean().default(!1)});async function rS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=await Q(r,t.cvmId);if(!n.success)return t.fail(n.error.message),1;let o=n.data;o.progress?.target&&(i.warn("CVM is currently in progress (updating/restarting). Waiting for operation to complete..."),await No(o.vm_uuid,3e5));let a=i.startSpinner("Restarting CVM"),s=t.cvmId,c=await It(()=>Ja(r,s),{spinner:a});if(a.stop(!0),!c.success)return i.error(`Failed to restart CVM: ${c.error.message}`),1;let l=c.data;return i.break(),i.keyValueTable({"CVM ID":l.id,Name:l.name,Status:l.status,"App ID":`app_${l.app_id}`,"App URL":l.app_url||`${he}/dashboard/cvms/app_${l.app_id}`},{borderStyle:"rounded"}),i.break(),i.success(`Your CVM is being restarted. You can check the dashboard for more details:
201
- ${he}/dashboard/cvms/app_${l.app_id}`),0}catch(r){return i.error("Failed to restart CVM"),i.logDetailedError(r),1}}var Vp=b({path:["cvms","restart"],meta:Fp,schema:jp,handler:rS});import{z as ar}from"zod";var zp={name:"serial-logs",description:"Fetch VM serial console logs from a CVM",stability:"deprecated",arguments:[B],options:[{name:"tail",shorthand:"n",description:"Lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream logs in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},ie,N],examples:[{name:"Show VM serial logs",value:"phala cvms serial-logs app_abc123"},{name:"Show last 100 lines of serial logs",value:"phala cvms serial-logs app_abc123 --tail 100"},{name:"Follow serial logs in real-time",value:"phala cvms serial-logs app_abc123 --follow"},{name:"Show serial logs with timestamps",value:"phala cvms serial-logs app_abc123 --timestamps"}]},Kp=ar.object({cvmId:ar.string().optional(),tail:ar.number().optional(),follow:ar.boolean().default(!1),timestamps:ar.boolean().default(!1),json:ar.boolean().default(!1),interactive:ar.boolean().default(!1)});var nS=Lo({logType:"serial",fetchLogs:Wl,streamLogs:Xl},e=>({tail:e.tail,timestamps:e.timestamps})),Gp=b({path:["cvms","serial-logs"],meta:zp,schema:Kp,handler:nS});import{z as Os}from"zod";var Hp={name:"start",description:"Start a stopped CVM",stability:"stable",arguments:[B],options:[N],examples:[{name:"Start CVM by app_id",value:"phala cvms start app_123"},{name:"Start CVM by UUID",value:"phala cvms start 550e8400-e29b-41d4-a716-446655440000"},{name:"Start CVM by name",value:"phala cvms start my-app"}]},qp=Os.object({cvmId:Os.string().optional(),interactive:Os.boolean().default(!1)});async function oS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=i.startSpinner("Starting CVM"),o=t.cvmId,a=await It(()=>Ba(r,o),{spinner:n});if(n.stop(!0),!a.success)return i.error(`Failed to start CVM: ${a.error.message}`),1;let s=a.data;return i.break(),i.keyValueTable({"CVM ID":s.id,Name:s.name,Status:s.status,"App ID":`app_${s.app_id}`},{borderStyle:"rounded"}),i.break(),i.success(`Your CVM is being started. You can check the dashboard for more details:
202
- ${he}/dashboard/cvms/app_${s.app_id}`),0}catch(r){return i.error("Failed to start CVM"),i.logDetailedError(r),1}}var Bp=b({path:["cvms","start"],meta:Hp,schema:qp,handler:oS});import{z as Fs}from"zod";var Wp={name:"stop",description:"Stop a running CVM",stability:"stable",arguments:[B],options:[N],examples:[{name:"Stop CVM by app_id",value:"phala cvms stop app_123"},{name:"Stop CVM by UUID",value:"phala cvms stop 550e8400-e29b-41d4-a716-446655440000"},{name:"Stop CVM by name",value:"phala cvms stop my-app"}]},Jp=Fs.object({cvmId:Fs.string().optional(),interactive:Fs.boolean().default(!1)});async function aS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=i.startSpinner("Stopping CVM"),o=t.cvmId,a=await It(()=>Wa(r,o),{spinner:n});if(n.stop(!0),!a.success)return i.error(`Failed to stop CVM: ${a.error.message}`),1;let s=a.data;return i.break(),i.keyValueTable({"CVM ID":s.id,Name:s.name,Status:s.status,"App ID":`app_${s.app_id}`},{borderStyle:"rounded"}),i.break(),i.success(`Your CVM is being stopped. You can check the dashboard for more details:
203
- ${he}/dashboard/cvms/app_${s.app_id}`),0}catch(r){return i.error("Failed to stop CVM"),i.logDetailedError(r),1}}var Yp=b({path:["cvms","stop"],meta:Wp,schema:Jp,handler:aS});import sS from"fs";import{z as Ur}from"zod";var Zp={name:"upgrade",description:'Upgrade a CVM to a new version (use "phala deploy" instead)',stability:"deprecated",arguments:[B],options:[N,{name:"compose",shorthand:"c",description:"Path to Docker Compose file",type:"string",target:"compose"},{name:"env-file",shorthand:"e",description:"Path to environment file",type:"string",target:"envFile"},{name:"debug",description:"Enable debug output",type:"boolean",target:"debug"}],examples:[{name:"Upgrade a CVM interactively",value:"phala cvms upgrade"},{name:"Upgrade using a compose file",value:"phala cvms upgrade app_123 --compose ./docker-compose.yml"}]},Xp=Ur.object({cvmId:Ur.string().optional(),interactive:Ur.boolean().default(!1),compose:Ur.string().optional(),envFile:Ur.string().optional(),debug:Ur.boolean().default(!1)});async function iS(e){if(e.compose)return e.compose;let r=Nr(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return kt("Enter the path to your Docker Compose file:",r,"file")}async function cS(e,t){try{if(i.warn('\u26A0\uFE0F This command is deprecated. Please use "phala deploy" instead.'),i.warn(`\u26A0\uFE0F This legacy API will be maintained but may have limited support.
204
- `),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let r=await k(),n=await Q(r,t.cvmId);if(!n.success)return t.fail(n.error.message),1;let o=n.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s=o,c=await iS(e),l="";if(c)try{l=sS.readFileSync(c,"utf8")}catch(g){return i.error(`Failed to read Docker Compose file: ${g instanceof Error?g.message:String(g)}`),1}await or(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?i.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?i.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):i.info("\u{1F510} Using public DockerHub registry...");let m,p=[];if(e.envFile)try{let g=wn([],e.envFile);m=await(0,$e.encryptEnvVars)(g,s.kms_info?.encrypted_env_pubkey),p=g.map(h=>h.key)}catch(g){return i.error(`Failed to read environment file: ${g instanceof Error?g.message:String(g)}`),1}let u={compose_manifest:{docker_compose_file:l,manifest_version:1,runner:"docker-compose",version:"1.0.0",features:["kms","tproxy-net"],name:`app_${a}`,allowed_envs:p},encrypted_env:m,allow_restart:!0,env_keys:p},d=i.startSpinner(`Upgrading CVM app_${a}`),f=await Gl(a,u);return f?(d.stop(!0),f.detail&&i.info(`Details: ${f.detail}`),i.break(),i.success(`Your CVM is being upgraded. You can check the dashboard for more details:
205
- ${he}/dashboard/cvms/app_${a}`),0):(d.stop(!1),i.error("Failed to upgrade CVM"),1)}catch(r){return i.error(`Failed to upgrade CVM: ${r instanceof Error?r.message:String(r)}`),e.debug&&i.error("Full Error:",r),1}}var Qp=b({path:["cvms","upgrade"],meta:Zp,schema:Xp,handler:cS});var Uo={group:ep,commands:[np,dp,hp,bp,_p,Ep,xp,Dp,Lp,Op,Vp,Gp,Bp,Yp,Qp],subgroups:[]};import{z as Z}from"zod";var eu={name:"deploy",category:"deploy",description:"Deploy new CVM or update existing one",stability:"stable",arguments:[],options:[Dr,bl,N,{name:"debug",description:"Enable debug logging",type:"boolean",target:"debug",group:"advanced"},{name:"name",shorthand:"n",description:"CVM name (defaults to directory name)",type:"string",target:"name",group:"basic"},{name:"compose",shorthand:"c",description:"Path to Docker Compose file (default: docker-compose.yml)",type:"string",target:"compose",group:"basic"},{name:"instance-type",shorthand:"t",description:"Instance type (e.g., tdx.small, auto-selected if omitted)",type:"string",target:"instanceType",group:"basic"},{name:"vcpu",description:"Use --instance-type instead",type:"string",target:"vcpu",deprecated:!0,group:"deprecated"},{name:"memory",description:"Use --instance-type instead",type:"string",target:"memory",deprecated:!0,group:"deprecated"},{name:"disk-size",description:`Disk size with unit (e.g., 50G, default: ${nr}GB)`,type:"string",target:"diskSize",group:"advanced"},{name:"fs",description:"Filesystem type (ext4 or zfs, default: zfs)",type:"string",target:"fs",group:"advanced"},{name:"image",description:"OS image version (auto-selected if omitted)",type:"string",target:"image",group:"advanced"},{name:"region",shorthand:"r",description:"Preferred region (e.g., us-west, auto-selected if omitted)",type:"string",target:"region",group:"basic"},{name:"node-id",description:"Node ID (auto-selected if omitted)",type:"string",target:"nodeId",group:"advanced"},{name:"env",shorthand:"e",description:"Environment variable (KEY=VALUE) or env file path (repeatable)",type:"string[]",target:"env",group:"basic"},{name:"env-file",description:"Use -e instead",type:"string",target:"envFile",deprecated:!0,group:"deprecated"},{name:"kms",description:"KMS type: phala (default), ethereum/eth, or base",type:"string",target:"kms",group:"basic"},{name:"kms-id",description:"Use --kms instead",type:"string",target:"kmsId",deprecated:!0,group:"deprecated"},{name:"custom-app-id",description:"Custom App ID (requires --nonce for PHALA KMS)",type:"string",target:"customAppId",group:"advanced"},{name:"nonce",description:"Nonce for deterministic app_id (requires --custom-app-id, PHALA KMS only)",type:"string",target:"nonce",group:"advanced"},{name:"pre-launch-script",description:"Path to pre-launch script",type:"string",target:"preLaunchScript",group:"advanced"},{name:"private-key",description:"Private key for signing transactions.",type:"string",target:"privateKey",group:"advanced"},{name:"rpc-url",description:"RPC URL for the blockchain.",type:"string",target:"rpcUrl",group:"advanced"},{name:"wait",description:"Wait for deployment/update completion",type:"boolean",target:"wait",group:"basic"},{name:"ssh-pubkey",description:"SSH public key path (default: ~/.ssh/id_rsa.pub)",type:"string",target:"sshPubkey",group:"basic"},{name:"dev-os",description:"Use dev OS image (requires SSH key)",type:"boolean",target:"devOs",negatedName:"no-dev-os",group:"basic"},{name:"public-logs",description:"Make CVM logs publicly accessible (default: true)",type:"boolean",target:"publicLogs",negatedName:"no-public-logs"},{name:"public-sysinfo",description:"Make CVM system info publicly accessible (default: true)",type:"boolean",target:"publicSysinfo",negatedName:"no-public-sysinfo"},{name:"listed",description:"List CVM on the public Trust Center (default: false)",type:"boolean",target:"listed",negatedName:"no-listed"}],examples:[{name:"Deploy new CVM",value:"phala deploy"},{name:"Deploy with environment variables",value:"phala deploy -e NODE_ENV=production -e DEBUG=true"},{name:"Deploy with env file",value:"phala deploy -e .env"},{name:"Deploy with specific instance type",value:"phala deploy --instance-type tdx.medium"},{name:"Deploy to specific region",value:"phala deploy --region us-west"},{name:"Deploy with Ethereum KMS",value:"phala deploy --kms ethereum --private-key <key> --rpc-url <url>"},{name:"Update existing CVM by ID",value:"phala deploy --cvm-id app_abc123"},{name:"Update CVM with new compose file and env",value:"phala deploy --cvm-id my-app --compose ./new-docker-compose.yml -e .env"},{name:"Update CVM and wait for completion",value:"phala deploy --cvm-id app_abc123 --wait"},{name:"Update CVM from phala.toml",value:"phala deploy"},{name:"Deploy with logs and sysinfo disabled",value:"phala deploy --no-public-logs --no-public-sysinfo"},{name:"Deploy and list on Trust Center",value:"phala deploy --listed"},{name:"Update existing CVM to disable logs",value:"phala deploy --cvm-id app_123 --no-public-logs"}]},tu=Z.object({compose:Z.string().optional(),json:Z.boolean().default(!1),debug:Z.boolean().default(!1),apiToken:Z.string().optional(),name:Z.string().optional(),instanceType:Z.string().optional(),vcpu:Z.string().optional(),memory:Z.string().optional(),diskSize:Z.string().optional(),fs:Z.enum(["ext4","zfs"]).optional(),image:Z.string().optional(),region:Z.string().optional(),nodeId:Z.string().optional(),env:Z.array(Z.string()).optional(),envFile:Z.string().optional(),interactive:Z.boolean().default(!1),kms:Z.enum(["phala","ethereum","eth","base"]).default("phala"),kmsId:Z.string().optional(),cvmId:Z.string().optional(),customAppId:Z.string().optional(),nonce:Z.string().optional(),preLaunchScript:Z.string().optional(),privateKey:Z.string().optional(),rpcUrl:Z.string().optional(),wait:Z.boolean().default(!1),sshPubkey:Z.string().optional(),devOs:Z.boolean().optional(),publicLogs:Z.boolean().optional(),publicSysinfo:Z.boolean().optional(),listed:Z.boolean().optional()});import xt from"path";import au from"os";function lS(e){let t=e.indexOf("=");if(t===-1)return!1;let r=e.substring(0,t);return r.includes("/")||r.includes("\\")?!1:/^[A-Za-z_][A-Za-z0-9_]*$/.test(r)}function Oo(e){let t={files:[],keyValues:[]};for(let r of e)if(lS(r)){let n=r.indexOf("="),o=r.substring(0,n),a=r.substring(n+1);t.keyValues.push({key:o,value:a})}else t.files.push(r);return t}function Fo(e){let t=new Map;for(let r of e)t.set(r.key,r.value);return Array.from(t.entries()).map(([r,n])=>({key:r,value:n}))}function ru(e,t="B"){if(!e||typeof e!="string")throw new Error("Invalid input: must be a non-empty string");let r=e.trim().match(/^(\d+(?:\.\d+)?)\s*([KkMmGgTt][Bb]?)?$/);if(!r)throw new Error(`Invalid format: ${e}. Expected format: <number>[unit] (e.g., 2G, 500MB, 1T)`);let n=Number.parseFloat(r[1]),o=(r[2]||t).toUpperCase().replace("B",""),a={K:1024,M:1024*1024,G:1024*1024*1024,T:1024*1024*1024*1024,"":1};if(!(o in a))throw new Error(`Unsupported unit: ${o}. Supported units: B, K/KB, M/MB, G/GB, T/TB`);return Math.round(n*a[o])}function nu(e){let t=ru(e,"MB"),r=Math.round(t/(1024*1024));if(r%1024!==0)throw new Error(`Memory must be a multiple of 1GB (1024MB). Got: ${r}MB`);return r}function ou(e){let t=ru(e,"GB"),r=Math.round(t/(1024*1024*1024));if(r%1!==0)throw new Error(`Disk size must be a multiple of 1GB. Got: ${r}GB`);return r}import jo from"dedent";import tt from"fs-extra";import Vo from"inquirer";function mS(e,t){if(e instanceof en)return t.json?{success:!1,error_code:e.errorCode,message:e.message,details:e.structuredDetails,suggestions:e.suggestions,links:e.links}:Jn(e);if(e&&typeof e=="object"&&"response"in e){let o=e.response?.data?.detail;if(o&&typeof o=="object"&&"error_code"in o){let{error_code:a,message:s,details:c,suggestions:l,links:m}=o;if(t.json)return{success:!1,error_code:a,message:s,details:c,suggestions:l,links:m};let p=`
270
+ `;te.appendFileSync(s.logFilePath,m)}return l.pid&&CS(l.pid,e.verbose),s.background&&(l.unref(),e.verbose&&c.success("Simulator is running in the background")),await oi(),l}catch(t){throw c.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function eo(){try{let e=Qr(),t=Me.platforms[e];if(e==="darwin"||e==="linux"){let n=t.socketPath;return te.existsSync(n)?new Promise(r=>{let o=ti.createConnection({path:n}).on("connect",()=>{o.end(),r(!0)}).on("error",()=>{r(!1)});setTimeout(()=>{o.end(),r(!1)},1e3)}):!1}if(e==="win32"){let n="127.0.0.1";return new Promise(o=>{let a=ti.createConnection({host:n,port:8090}).on("connect",()=>{a.end(),o(!0)}).on("error",()=>{o(!1)});setTimeout(()=>{a.end(),o(!1)},1e3)})}return!1}catch(e){return c.error("Error checking if simulator is running:",e),!1}}async function Jp(){try{let e=sa();if(!await eo()&&!e)return c.info("Simulator is not running"),!0;let n=Qr(),r=!1;if(n==="win32")try{e?(c.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Ft("taskkill /F /IM dstack-simulator.exe",{stdio:"ignore"}),r=!0}catch(a){if(a.code!=="ESRCH")return c.error("Failed to stop simulator:",a),!1;r=!0}else try{e?(c.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Ft("pkill -f dstack-simulator",{stdio:"ignore"}),r=!0}catch(a){if(a.code!=="ESRCH")return c.error("Failed to stop simulator:",a),!1;r=!0}let o=ni();if(te.existsSync(o))try{te.unlinkSync(o)}catch(a){c.warn("Failed to remove PID file:",a)}return await An(),r&&c.success("Simulator stopped successfully"),r}catch(e){return c.error("Error stopping simulator:",e),!1}}function ri(){let e=Qr(),t=Me.platforms[e];return e==="win32"?"http://127.0.0.1:8090":`${t.socketPath||"/tmp/dstack.sock"}`}async function oi(e){try{let t=ri(),n=e||t;await Ft(`export DSTACK_SIMULATOR_ENDPOINT=${n}`);let r=n.replace(/dstack\.sock$/,"tappd.sock");return await Ft(`export TAPPD_SIMULATOR_ENDPOINT=${r}`),c.success("Setting environment for current process..."),c.success(` DSTACK_SIMULATOR_ENDPOINT=${n}`),c.success(` TAPPD_SIMULATOR_ENDPOINT=${r}`),n}catch(t){throw c.error("Error setting simulator endpoint environment variable:",t),new Error(`Failed to set simulator endpoint: ${t}`)}}async function An(){try{return await Ft("unset DSTACK_SIMULATOR_ENDPOINT"),await Ft("unset TAPPD_SIMULATOR_ENDPOINT"),c.debug("Deleted simulator endpoint environment variables from current process"),!0}catch(e){return c.warn("Error while unsetting simulator endpoint environment variables:",e),!1}}import Qp from"inquirer";import{z as kt}from"zod";var Yp={name:"create",description:'Create a new CVM (use "phala deploy" instead)',stability:"deprecated",options:[{name:"name",shorthand:"n",description:"Name of the CVM",type:"string",target:"name"},{name:"compose",shorthand:"c",description:"Path to Docker Compose file",type:"string",target:"compose"},{name:"vcpu",description:`Virtual CPUs (default: ${Yr})`,type:"string",target:"vcpu"},{name:"memory",description:`Memory in MB (default: ${Zr})`,type:"string",target:"memory"},{name:"disk-size",description:`Disk size in GB (default: ${In})`,type:"string",target:"diskSize"},{name:"teepod-id",description:"TEEPod ID (auto-selected if omitted)",type:"string",target:"teepodId"},{name:"image",description:"dstack image version (uses default if omitted)",type:"string",target:"image"},{name:"env-file",shorthand:"e",description:"Path to environment file",type:"string",target:"envFile"},{name:"skip-env",description:"Skip env var prompt",type:"boolean",target:"skipEnv"},{name:"debug",description:"Enable debug output",type:"boolean",target:"debug"}],examples:[{name:"Create a CVM interactively",value:"phala cvms create"},{name:"Create using predefined values",value:"phala cvms create --name demo --compose ./docker-compose.yml"}]},Zp=kt.object({name:kt.string().optional(),compose:kt.string().optional(),vcpu:kt.string().optional(),memory:kt.string().optional(),diskSize:kt.string().optional(),teepodId:kt.string().optional(),image:kt.string().optional(),envFile:kt.string().optional(),skipEnv:kt.boolean().default(!1),debug:kt.boolean().default(!1)});async function wS(e){if(e)return e;let{value:t}=await Qp.prompt([{type:"input",name:"value",message:"Enter a name for the CVM:",validate:n=>{let r=n.trim();return r?r.length>20?"CVM name must be less than 20 characters":r.length<3?"CVM name must be at least 3 characters":/^[a-zA-Z0-9_-]+$/.test(r)?!0:"CVM name must contain only letters, numbers, underscores, and hyphens":"CVM name is required"}}]);return t.trim()}async function _S(e){if(e)return e;let n=ur(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return await jt("Enter the path to your Docker Compose file:",n,"file")}async function kS(e){if(e.envFile)return Xr([],e.envFile);if(e.skipEnv)return c.info("Skipping environment variable prompt"),[];let{shouldSkip:t}=await Qp.prompt([{type:"confirm",name:"shouldSkip",message:"Do you want to skip environment variable prompt?",default:!0}]);if(t)return c.info("Skipping environment variable prompt"),[];let n=await jt("Enter the path to your environment file:",".env","file");return Xr([],n)}function ai(e,t){if(!e)return t;let n=Number(e);return Number.isFinite(n)?n:t}function SS(e,t){return!Number.isFinite(t)||t<=0?`Invalid ${e}: ${t}`:null}async function ES(e,t){if(!t.nodes.length)return;if(!e)return t.nodes[0];let n=Number(e);return t.nodes.find(r=>r.teepod_id===n)}function IS(e,t){let n=e.images??[];return t?n.find(r=>r.name===t):n.find(r=>r.name===qs)}async function AS(e,t){try{c.warn('\u26A0\uFE0F This command is deprecated. Please use "phala deploy" instead.'),c.warn("\u26A0\uFE0F This legacy API will be maintained but may have limited support.\\n");let n=await wS(e.name),r=await _S(e.compose),o=bS.resolve(r);if(!Xp.existsSync(o))return c.error(`Docker Compose file not found: ${o}`),1;let a=Xp.readFileSync(o,"utf8");await An(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?c.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?c.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):c.info("\u{1F510} Using public DockerHub registry...");let s=[];try{s=await kS(e)}catch(_){return c.error(`Failed to read environment file: ${_ instanceof Error?_.message:String(_)}`),1}let i=ai(e.vcpu,Yr),l=ai(e.memory,Zr),p=ai(e.diskSize,In);for(let[_,I]of[["number of vCPUs",i],["memory",l],["disk size",p]]){let $=SS(_,I);if($)return c.error($),1}let m=c.startSpinner("Fetching available TEEPods"),d=await Dm(!0);m.stop(!0);let f=await ES(e.teepodId,d);if(!f)return c.error("Failed to find suitable TEEPod"),1;let u=IS(f,e.image);if(!u)return c.error(e.image?`Failed to find selected image: ${e.image}`:`Failed to find default image ${qs}`),1;let h={teepod_id:f.teepod_id,name:n,image:u.name,vcpu:i,memory:l,disk_size:p,compose_manifest:{docker_compose_file:a,docker_config:{url:"",username:"",password:""},features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:n,public_logs:!0,public_sysinfo:!0,runner:"docker-compose",tproxy_enabled:!0},listed:!1},g=c.startSpinner("Getting public key from CVM"),y=await $m(h);if(g.stop(!0),!y)return c.error("Failed to get public key from CVM"),1;let b=c.startSpinner("Encrypting environment variables"),w=await(0,Ie.encryptEnvVars)(s,y.app_env_encrypt_pubkey);b.stop(!0),e.debug&&(c.debug("Public key:",y.app_env_encrypt_pubkey),c.debug("Encrypted environment variables:",w),c.debug("Environment variables:",JSON.stringify(s)));let S=c.startSpinner("Creating CVM"),k=await Rm({...h,encrypted_env:w,app_env_encrypt_pubkey:y.app_env_encrypt_pubkey,app_id_salt:y.app_id_salt});return S.stop(!0),k?(c.success("CVM created successfully"),c.break(),c.keyValueTable({"CVM ID":k.id,Name:k.name,Status:k.status,"App ID":`app_${k.app_id}`,"App URL":k.app_url||`${se}/dashboard/cvms/app_${k.app_id}`},{borderStyle:"rounded"}),c.info(""),c.success(`Your CVM is being created. You can check its status with:
271
+ phala cvms get app_${k.app_id}`),0):(c.error("Failed to create CVM"),1)}catch(n){return c.error(`Failed to create CVM: ${n instanceof Error?n.message:String(n)}`),1}}var ed=C({path:["cvms","create"],meta:Yp,schema:Zp,handler:AS});import PS from"inquirer";import{z as to}from"zod";var td={name:"delete",description:"Delete a CVM",stability:"unstable",arguments:[Y],options:[O,{name:"force",shorthand:"f",description:"Skip confirmation prompt",type:"boolean",target:"force"},{name:"yes",shorthand:"y",description:"Alias for --force (skip confirmation prompt)",type:"boolean",target:"yes"}],examples:[{name:"Delete a CVM interactively",value:"phala cvms delete"},{name:"Delete CVM by app_id",value:"phala cvms delete app_123 --force"},{name:"Delete CVM by UUID",value:"phala cvms delete 550e8400-e29b-41d4-a716-446655440000 -f"},{name:"Delete CVM by name",value:"phala cvms delete my-app --yes"}]},nd=to.object({cvmId:to.string().optional(),interactive:to.boolean().default(!1),force:to.boolean().default(!1),yes:to.boolean().default(!1)});async function $S(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=await G(n,t.cvmId);if(!o.success)return t.fail(o.error.message),1;let a=o.data;if(!a)return t.fail("CVM not found"),1;let s=a.name||`app_${a.app_id}`;if(!e.force&&!e.yes){let{confirm:p}=await PS.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete CVM "${s}"? This action cannot be undone.`,default:!1}]);if(!p)return r?(t.success({deleted:!1,cancelled:!0,cvm:s}),0):(c.info("Deletion cancelled"),0)}let i=c.startSpinner(`Deleting CVM ${s}`),l=await Ur(n,t.cvmId);return i.stop(!0),l.success?r?(t.success({deleted:!0,cvm:s}),0):(c.success(`CVM ${s} deleted successfully`),0):(t.fail(`Failed to delete CVM ${s}: ${l.error.message}`),1)}catch(n){return t.fail("Failed to delete CVM"),c.logDetailedError(n),1}}var rd=C({path:["cvms","delete"],meta:td,schema:nd,handler:$S});import ca from"chalk";var RS=/\x1b\[[0-9;]*m/g,od=e=>e.replace(RS,"").length,xS=(e,t)=>e+" ".repeat(Math.max(0,t-od(e)));function ce(e,t){let n={};for(let o of e){n[o]=o.length;for(let a of t)n[o]=Math.max(n[o],od(a[o]??""))}let r=o=>e.map(a=>xS(o[a]??"",n[a])).join(" ");console.log(r(Object.fromEntries(e.map(o=>[o,o]))));for(let o of t)console.log(r(o))}import{z as ia}from"zod";var ad={name:"device-allowlist",description:"Show device allowlist status for a CVM's app",stability:"unstable",arguments:[Y],options:[pe,O],examples:[{name:"Check device allowlist",value:"phala cvms device-allowlist app_abc123"}]},sd=ia.object({cvmId:ia.string().optional(),json:ia.boolean().default(!1),interactive:ia.boolean().default(!1)});async function DS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id;if(!a)return t.fail("CVM has no app_id assigned yet."),1;let s=await Mo(n,{appId:a});if(!s.success)return t.fail(s.error.message),1;let i=s.data;if(e.json)return t.success(i),0;if(!i.is_onchain_kms)return c.info("This app does not use on-chain KMS."),0;if(c.info(`Chain: ${i.chain_id??"N/A"} Contract: ${i.app_contract_address??"N/A"}`),c.info(`Allow Any Device: ${i.allow_any_device?ca.green("yes"):ca.red("no")}`),i.devices.length===0)return c.info("No devices found for this app."),0;let l=["DEVICE_ID","NODE","CVMS","STATUS"],p=i.devices.map(m=>({DEVICE_ID:m.device_id,NODE:m.node_name??"-",CVMS:m.cvm_ids.join(", ")||"-",STATUS:m.status==="allowed"?ca.green(m.status):ca.red(m.status)}));return ce(l,p),0}catch(n){return c.logDetailedError(n),t.fail(`Failed to get device allowlist: ${n instanceof Error?n.message:String(n)}`),1}}var id=C({path:["cvms","device-allowlist"],meta:ad,schema:sd,handler:DS});import si from"chalk";import{z as la}from"zod";var cd={name:"get",description:"Get details of a CVM",stability:"unstable",arguments:[Y],options:[pe,O],examples:[{name:"Get CVM interactively",value:"phala cvms get"},{name:"By app_id",value:"phala cvms get app_abc123"},{name:"By UUID",value:"phala cvms get 550e8400-e29b-41d4-a716-446655440000"},{name:"By name",value:"phala cvms get my-app"}]},ld=la.object({cvmId:la.string().optional(),json:la.boolean().default(!1),interactive:la.boolean().default(!1)});async function TS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=c.startSpinner("Fetching CVM details"),r=await E(t),o=await G(r,t.cvmId);if(n.stop(!0),!o.success)return t.fail(o.error.message),1;let a=o.data;if(!a)return t.fail("CVM not found"),1;if(e.json)return t.success(a),0;c.break();let s=a.status==="running"?si.green(a.status):a.status==="stopped"?si.red(a.status):si.yellow(a.status);return c.keyValueTable({Name:a.name,"App ID":`app_${a.app_id}`,Status:s,vCPU:a.resource.vcpu,Memory:a.resource.memory_in_gb!=null?`${a.resource.memory_in_gb} GB`:"N/A","Disk Size":a.resource.disk_in_gb!=null?`${a.resource.disk_in_gb} GB`:"N/A","Dstack Image":a.os?.name,"App URL":`${se}/dashboard/cvms/app_${a.app_id}`}),0}catch(n){return c.logDetailedError(n),t.fail(`Failed to get CVM details: ${n instanceof Error?n.message:String(n)}`),1}}var md=C({path:["cvms","get"],meta:cd,schema:ld,handler:TS});import pa from"chalk";function MS(e,t){if(t<=0)return[Array.from(e)];let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}async function ma(e,t){let n=await om(e,{page:t.page,page_size:t.pageSize,search:t.search,status:t.status,listed:t.listed,base_image:t.baseImage,instance_type:t.instanceType,kms_type:t.kmsType,node:t.node,region:t.region});if(!n.success)return{success:!1,error:{message:n.error.message}};let r=n.data,a=(r.dstack_apps??[]).filter(p=>p.current_cvm&&typeof p.current_cvm=="object"&&"vm_uuid"in p.current_cvm&&!!p.current_cvm.vm_uuid),s=a.map(p=>p.current_cvm?.vm_uuid).filter(p=>typeof p=="string"&&p.length>0),i={};for(let p of MS(s,100)){let m=await To(e,{vmUuids:p});if(!m.success)return{success:!1,error:{message:m.error.message}};for(let[d,f]of Object.entries(m.data))i[d]={status:f.status,uptime:f.uptime,in_progress:f.in_progress}}let l=[];for(let p of a){let m=p.current_cvm;if(!m?.vm_uuid)continue;let d=i[m.vm_uuid],f=d?d.status:typeof m.status=="string"?m.status:"unknown";l.push({appId:p.app_id,cvmName:m.name,status:f,uptime:d?.uptime})}return{success:!0,data:{page:r.page,pageSize:r.page_size,total:r.total,totalPages:r.total_pages,items:l}}}import{z as at}from"zod";var pd={name:"list",aliases:["ls"],description:"List CVMs",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},{name:"search",description:"Search by name, app_id, vm_uuid, or instance_id",type:"string",target:"search",group:"basic"},{name:"status",description:"Filter by CVM status (can be specified multiple times)",type:"string[]",target:"status",group:"basic"},{name:"listed",description:"Filter by listed status",type:"boolean",target:"listed",negatedName:"no-listed",group:"basic"},{name:"base-image",description:"Filter by base image name",type:"string",target:"baseImage",group:"basic"},{name:"instance-type",description:"Filter by instance type",type:"string",target:"instanceType",group:"basic"},{name:"kms-type",description:"Filter by KMS type",type:"string",target:"kmsType",group:"basic"},{name:"node",description:"Filter by node name",type:"string",target:"node",group:"basic"},{name:"region",description:"Filter by region identifier",type:"string",target:"region",group:"basic"},ke],examples:[{name:"List CVMs",value:"phala cvms ls"},{name:"Second page",value:"phala cvms ls --page 2"},{name:"Search by name",value:"phala cvms ls --search my-cvm"},{name:"Filter by status",value:"phala cvms ls --status running"},{name:"Output as JSON",value:"phala cvms ls --json"}]},dd=at.object({page:at.coerce.number().int().min(1).default(1),pageSize:at.coerce.number().int().min(1).max(100).default(50),search:at.string().optional(),status:at.array(at.string()).optional(),listed:at.boolean().optional(),baseImage:at.string().optional(),instanceType:at.string().optional(),kmsType:at.string().optional(),node:at.string().optional(),region:at.string().optional(),json:at.boolean().default(!1)});function LS(e){return e.toLowerCase().endsWith("ing")?pa.yellow(e):e==="running"?pa.green(e):e==="stopped"?pa.red(e):pa.yellow(e)}async function US(e,t){try{let n=await E(t),r=await ma(n,{page:e.page,pageSize:e.pageSize,search:e.search,status:e.status,listed:e.listed,baseImage:e.baseImage,instanceType:e.instanceType,kmsType:e.kmsType,node:e.node,region:e.region});if(r.success===!1)return t.fail(r.error.message),1;let o=r.data;if(e.json)return t.success(o),0;let a=["APP_ID","CVM","STATUS","UPTIME"],s=o.items.map(i=>({APP_ID:i.appId,CVM:i.cvmName,STATUS:LS(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(c.info("No CVMs found"),0):(ce(a,s),c.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(n){return c.logDetailedError(n),t.fail(`Failed to list CVMs: ${n instanceof Error?n.message:String(n)}`),1}}var ud=C({path:["cvms","list"],meta:pd,schema:dd,handler:US});import{z as OS}from"zod";var fd={name:"list-nodes",description:"List worker nodes",stability:"unstable"},gd=OS.object({});async function NS(e,t){try{let n=await E(t),r=await bt(n),o=t.globalOptions?.json===!0;if(!r.success)throw new Error(r.error.message);let{nodes:a,kms_list:s}=r.data;if(o)return t.success({nodes:a??[],kmsList:s??[]}),0;if(!a||a.length===0)return c.info("No available nodes found."),0;c.info("Available Nodes:");for(let i of a)if(c.info("----------------------------------------"),c.info(` ID: ${i.teepod_id}`),c.info(` Name: ${i.name}`),c.info(` Region: ${i.region_identifier}`),c.info(` FMSPC: ${i.fmspc||"N/A"}`),c.info(` Device ID: ${i.device_id||"N/A"}`),c.info(` Support Onchain KMS: ${i.support_onchain_kms}`),c.info(" Images:"),i.images&&i.images.length>0)for(let l of i.images)c.info(` - ${l.name}`),c.info(` Hash: ${l.os_image_hash||"N/A"}`);else c.info(" N/A");if(s&&s.length>0){c.info(`
272
+ Available KMS Instances:`);for(let i of s)c.info("----------------------------------------"),c.info(` ID: ${i.id}`),c.info(` URL: ${i.url}`),c.info(` Version: ${i.version}`),c.info(` Chain ID: ${i.chain_id}`),c.info(` Contract Address: ${i.kms_contract_address}`),c.info(` Gateway App ID: ${i.gateway_app_id}`)}return 0}catch(n){return t.fail("Failed to list available nodes"),c.logDetailedError(n),1}}var hd=C({path:["cvms","list-nodes"],meta:fd,schema:gd,handler:NS});async function no(e,t){try{let n=await E(t),r=await G(n,{id:e});if(r.success&&r.data.public_logs===!1)return c.warn("Logs are disabled for this CVM (public_logs=false)."),c.warn("To enable logs, run:"),c.warn(` phala deploy --cvm-id ${e} --public-logs`),!0}catch(n){c.debug?.(`Failed to check CVM info: ${n}`)}return!1}function da(e,t){return async function(r,o){if(!o.cvmId)return o.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:a}=H.parse(o.cvmId),s=t(r),i=e.logType==="serial"?"serial":"container";try{if(r.follow){if(r.json)return o.fail("Cannot use --json with --follow"),1;c.info(`Streaming ${i} logs (press Ctrl+C to stop)...`),c.break();let p=new AbortController,m=!1,d=()=>{m=!0,p.abort()};process.on("SIGINT",d),process.on("SIGTERM",d);try{await e.streamLogs(a,f=>process.stdout.write(f),s,p.signal)}catch(f){if(f.name!=="AbortError")throw f}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d)}return m&&(c.break(),c.info("Stopped streaming logs")),0}let l=await e.fetchLogs(a,s);return r.json?(o.success({logs:l,cvm_id:a}),0):(l.trim()?console.log(l):await no(a,o)||c.info("No logs available"),0)}catch(l){return o.fail(`Failed to fetch ${i} logs: ${l instanceof Error?l.message:String(l)}`),await no(a,o),1}}}import{z as ln}from"zod";var yd={name:"logs",description:"Fetch container logs from a CVM",stability:"deprecated",arguments:[Y],options:[{name:"tail",shorthand:"n",description:"Lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream logs in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},{name:"container",shorthand:"c",description:"Container name or ID (defaults to first)",type:"string",target:"container"},pe,O],examples:[{name:"Show container logs from a CVM",value:"phala cvms logs app_abc123"},{name:"Show last 100 lines of logs",value:"phala cvms logs app_abc123 --tail 100"},{name:"Follow logs in real-time",value:"phala cvms logs app_abc123 --follow"},{name:"Show logs from a specific container",value:"phala cvms logs app_abc123 --container my-service"},{name:"Show logs with timestamps",value:"phala cvms logs app_abc123 --timestamps"}]},vd=ln.object({cvmId:ln.string().optional(),tail:ln.number().optional(),follow:ln.boolean().default(!1),timestamps:ln.boolean().default(!1),container:ln.string().optional(),json:ln.boolean().default(!1),interactive:ln.boolean().default(!1)});var jS=da({logType:"container",fetchLogs:Um,streamLogs:Fm},e=>({tail:e.tail,timestamps:e.timestamps,container:e.container})),Cd=C({path:["cvms","logs"],meta:yd,schema:vd,handler:jS});import Sd from"fs";import FS from"path";async function mn(e,t){if(t.kms_info?.chain_id!=null){let o=t.kms_type;if(!o)throw new Error("KMS type is required for decentralized KMS");if(!t.app_id)throw new Error("app_id is required for decentralized KMS");let a=await Qn(e,{app_id:t.app_id,kms:o});if(!a.success)throw c.logDetailedError(a.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get encryption public key: ${a.error.message}`);return a.data.public_key}let r=t.kms_info?.encrypted_env_pubkey;if(!r)throw new Error("CVM does not have an encryption public key. The CVM may not support encrypted environment variables.");return r}import{z as mt}from"zod";var bd={name:"replicate",description:"Create a replica of an existing CVM",stability:"unstable",arguments:[Y],options:[{name:"node-id",aliases:["teepod-id"],description:"Target node ID for the replica.",type:"string",target:"nodeId"},{name:"compose-hash",description:"Compose hash to replicate. Required when the source app has multiple live instances.",type:"string",target:"composeHash"},{name:"env-file",shorthand:"e",description:"Path to environment file.",type:"string",target:"envFile"},Ze,Ge,{name:"prepare-only",description:"Prepare the replica and generate a commit token. Skips all on-chain operations.",type:"boolean",target:"prepareOnly",group:"advanced"},{name:"commit",description:"Commit a previously prepared replica using a commit token. Requires --token, --compose-hash, and --transaction-hash.",type:"boolean",target:"commit",group:"advanced"},{name:"token",description:"Commit token from a prepare-only replica request.",type:"string",target:"token",group:"advanced"},or,O],examples:[{name:"Replicate a CVM",value:"phala cvms replicate 1234 --node-id 5"},{name:"Prepare a replica for multisig approval",value:"phala cvms replicate 1234 --node-id 5 --compose-hash <hash> --prepare-only"},{name:"Commit a prepared replica",value:"phala cvms replicate 1234 --commit --token <token> --compose-hash <hash> --transaction-hash <tx-hash>"}]},wd=mt.object({cvmId:mt.string().optional(),nodeId:mt.string().optional(),composeHash:mt.string().optional(),envFile:mt.string().optional(),privateKey:mt.string().optional(),rpcUrl:mt.string().optional(),prepareOnly:mt.boolean().default(!1),commit:mt.boolean().default(!1),token:mt.string().optional(),transactionHash:mt.string().optional(),interactive:mt.boolean().default(!1)});function VS(e){return Sd.readFileSync(e,"utf-8").split(`
273
+ `).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function HS(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function zS(e){if(e.status!==465)return null;let n=HS(e);return{composeHash:String(n.compose_hash??""),appId:String(n.app_id??""),deviceId:String(n.device_id??""),kmsInfo:n.kms_info,commitToken:n.commit_token,commitUrl:n.commit_url,apiCommitUrl:n.api_commit_url,onchainStatus:n.onchain_status}}async function KS(e,t,n){if(!n)return;let r=FS.resolve(process.cwd(),n);if(!Sd.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=VS(r),a=await mn(e,t);return(0,Ie.encryptEnvVars)(o,a)}async function GS(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await bt(e);if(!r.success){let a="error"in r?r.error:void 0;throw new Error(a?.message||`Failed to resolve node name "${n}"`)}let o=r.data.nodes.filter(a=>a.name.toLowerCase()===n.toLowerCase());if(o.length===0)throw new Error(`Node "${n}" not found.`);if(o.length>1)throw new Error(`Node name "${n}" is ambiguous (${o.length} matches). Use an explicit node ID.`);return o[0].teepod_id}function ii(e,t,n){if(ee()){t.success(e);return}let r=typeof e.vm_uuid=="string"?e.vm_uuid:"",o=n?.workspace?.slug||t.projectConfig.slug||"",a=n?.workspace?.name||o||"-",s=o&&o!==a?`${a} (${o})`:o||a,i=r.replace(/-/g,""),l=o&&i&&typeof e.app_id=="string"?`${se}/${o}/apps/${e.app_id}/instances/${i}`:typeof e.app_url=="string"?e.app_url:"-",p=typeof e.teepod=="object"&&e.teepod!==null&&"name"in e.teepod&&typeof e.teepod.name=="string"?e.teepod.name:typeof e.teepod_name=="string"?e.teepod_name:"-",m=n?.kms_type||"-",d=[`Source CVM ID: ${t.cvmId?.id||e.source_cvm_id||"-"}`,`Team: ${s}`,`CVM UUID: ${r||"-"}`,`App ID: ${e.app_id}`,`Name: ${e.name}`,`Status: ${e.status}`,`KMS: ${m}`,`Node: ${p} (ID: ${e.teepod_id})`,`vCPUs: ${e.vcpu}`,`Memory: ${e.memory} MB`,`Disk Size: ${e.disk_size} GB`,`App URL: ${l}`];t.stdout.write(`${d.join(`
274
+ `)}
275
+ `)}function _d(e,t){if(ee()){t.success({success:!0,prepare_only:!0,...e});return}let n=o=>o&&!o.startsWith("0x")?`0x${o}`:o,r=["CVM replica prepared successfully (pending on-chain approval).","",`Compose Hash: ${n(e.composeHash)}`,`App ID: ${n(e.appId)}`,`Device ID: ${n(e.deviceId)}`];if(e.commitToken&&r.push(`Commit Token: ${e.commitToken}`),e.commitUrl&&r.push(`Commit URL: ${e.commitUrl}`),e.apiCommitUrl&&r.push(`API Commit URL: ${e.apiCommitUrl}`),e.onchainStatus&&(r.push("","On-chain Status:",` Compose Hash: ${e.onchainStatus.compose_hash_allowed?"registered":"NOT registered"}`,` Device ID: ${e.onchainStatus.device_id_allowed?"registered":"NOT registered"}`),e.onchainStatus.is_allowed&&r.push(" All prerequisites met. You can commit with --transaction-hash already-registered.")),e.commitToken){let o=e.composeHash.startsWith("0x")?e.composeHash:`0x${e.composeHash}`;r.push("","To complete the replica after on-chain approval:"," phala cvms replicate <cvm-id> \\"," --commit \\",` --token ${e.commitToken} \\`,` --compose-hash ${o} \\`," --transaction-hash <tx-hash>")}t.stdout.write(`${r.join(`
276
+ `)}
277
+ `)}async function kd(e,t,n){return e.post(`/cvms/${t}/commit-replica`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash})}async function qS(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let r=await E(t),o,a=await G(r,t.cvmId);if(a.success)o=a.data;else if(a.error&&typeof a.error=="object"&&"errorCode"in a.error&&a.error.errorCode==="ERR-03-010"){let m=(t.cvmId?.id??"").replace(/^app_/,"").replace(/^0x/,"").toLowerCase(),d=await nr(r,{appId:m});if(!d.success||d.data.length===0)throw a.error;let f=d.data[0];if(!f.vm_uuid)throw a.error;let u=await G(r,{id:f.vm_uuid});if(!u.success)throw u.error;o=u.data}else throw a.error;if(!o.vm_uuid)throw new Error("Source CVM has no vm_uuid");if(n.commit){if(!n.token)throw new Error("--token is required for --commit mode");if(!n.composeHash)throw new Error("--compose-hash is required for --commit mode");let p=await kd(r,o.vm_uuid,{token:n.token,composeHash:n.composeHash,transactionHash:n.transactionHash||"already-registered"});return ii(p,t,o),0}let s=await KS(r,o,n.envFile),i=await GS(r,n.nodeId),l={};i!==void 0&&(l.node_id=i),s&&(l.encrypted_env=s),n.composeHash&&(l.compose_hash=n.composeHash);try{let p=await r.post(`/cvms/${o.vm_uuid}/replicas`,l,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return ii(p,t,o),0}catch(p){if(!(p instanceof vt))throw p;let m=zS(p);if(!m)throw p;if(n.prepareOnly)return _d(m,t),0;if(!m.commitToken)throw new Error("Replica prepare response did not include a commit token");let d=o.kms_info?.chain;if(!d)throw new Error("Source CVM kms_info is missing chain configuration");if(!o.app_id)throw new Error("Source CVM is missing app_id required for on-chain approval");let f=await bn({chain:d,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:m.deviceId,composeHash:m.composeHash});if(!f.success){let b="error"in f?f.error:void 0;throw new Error(b?.message||"Failed to check on-chain prerequisites")}let u=n.transactionHash||"already-registered",h=!f.data.deviceAllowed,g=!f.data.composeHashAllowed;if(h||g){let b=[];g&&b.push("compose hash"),h&&b.push("device");let w=n.privateKey||process.env.PRIVATE_KEY;if(!w)throw _d(m,t),new Error(`On-chain registration required: ${b.join(", ")} not registered. Pass --private-key or set PRIVATE_KEY to register automatically, or use --prepare-only to handle registration separately.`);let S=w;if(h){let k=await rn({chain:d,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:m.deviceId,privateKey:S});if(!k.success){let _="error"in k?k.error:void 0;throw new Error(_?.message||"Failed to register device on-chain")}}if(g){let k=await nn({chain:d,rpcUrl:n.rpcUrl,appId:o.app_id,composeHash:m.composeHash,privateKey:S});if(!k.success){let _="error"in k?k.error:void 0;throw new Error(_?.message||"Failed to register compose hash on-chain")}u=String(k.data.transactionHash||"already-registered")}}let y=await kd(r,o.vm_uuid,{token:m.commitToken,composeHash:m.composeHash,transactionHash:u});return ii(y,t,o),0}}catch(r){if(c.error("Failed to create CVM replica"),r instanceof vt){process.stderr.write(`${tn(r)}
278
+ `);let o=r.links;if(o&&o.length>0)for(let a of o)process.stderr.write(` ${a.label}: ${a.url}
279
+ `);return 1}return r instanceof Error?(process.stderr.write(`${Po(r)}
280
+ `),1):(c.logDetailedError(r),1)}}var Ed=C({path:["cvms","replicate"],meta:bd,schema:wd,handler:qS});import pn from"chalk";import mi from"inquirer";async function Vt(e,t={}){let{maxRetries:n=100,retryDelayMs:r=3e3,spinner:o,logRetries:a=!0}=t,s;for(let l=0;l<=n;l++)try{return await e()}catch(p){s=p;let m=p;if((m.message?.includes("409")||m.status===409||m.message?.includes("Conflict"))&&l<n)o&&o.stop(!0),a&&c.warn(`CVM is busy, retrying in ${r}ms... (attempt ${l+1}/${n})`),await new Promise(f=>setTimeout(f,r));else throw p}let i=s;throw new Error(`Failed after ${n} retries due to conflicts: ${i?.message||String(s)}`)}import{z as Ht}from"zod";var Id={name:"resize",description:"Resize resources for a CVM",stability:"unstable",arguments:[Y],options:[O,{name:"vcpu",shorthand:"v",description:"Virtual CPUs",type:"string",target:"vcpu"},{name:"memory",shorthand:"m",description:"Memory in MB",type:"string",target:"memory"},{name:"disk-size",shorthand:"d",description:"Disk size in GB",type:"string",target:"diskSize"},{name:"allow-restart",shorthand:"r",description:"Allow CVM restart",type:"string",target:"allowRestart"},{name:"yes",shorthand:"y",description:"Skip confirmation",type:"boolean",target:"yes"},{name:"json",description:"Output in JSON format",type:"boolean",target:"json"}],examples:[{name:"Resize CVM interactively",value:"phala cvms resize"},{name:"Resize without confirmation",value:"phala cvms resize app_123 --vcpu 4 --memory 4096 --disk-size 120 --yes"}]},Ad=Ht.object({cvmId:Ht.string().optional(),interactive:Ht.boolean().default(!1),vcpu:Ht.string().optional(),memory:Ht.string().optional(),diskSize:Ht.string().optional(),allowRestart:Ht.string().optional(),yes:Ht.boolean().default(!1),json:Ht.boolean().default(!1)});function ci(e,t){if(e===void 0)return;let n=Number.parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`Please provide a valid non-negative number for ${t}`);return n}function BS(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(["true","1","yes","y"].includes(t))return!0;if(["false","0","no","n"].includes(t))return!1;throw new Error(`Invalid value for --allow-restart: ${e}`)}async function li(e,t){return(await mi.prompt([{type:"input",name:"value",message:e,default:t,validate:r=>{let o=Number.parseInt(r,10);return Number.isNaN(o)||o<0?"Please enter a valid non-negative number":!0},filter:r=>Number.parseInt(r,10)}])).value}async function WS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s,i,l,p;try{s=ci(e.vcpu,"--vcpu"),i=ci(e.memory,"--memory"),l=ci(e.diskSize,"--disk-size"),p=BS(e.allowRestart)}catch(m){return c.error(m instanceof Error?m.message:String(m)),1}if(Ls()?(s===void 0&&(s=await li("Enter number of vCPUs:",o.resource.vcpu??void 0)),i===void 0&&(i=await li("Enter memory in MB:",o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0)),l===void 0&&(l=await li("Enter disk size in GB:",o.resource.disk_in_gb??void 0)),p===void 0&&(p=(await mi.prompt([{type:"confirm",name:"allowRestart",message:"Allow restart of the CVM if needed for resizing?",default:!1}])).allowRestart)):(s===void 0&&(s=o.resource.vcpu??void 0),i===void 0&&(i=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0),l===void 0&&(l=o.resource.disk_in_gb??void 0),p===void 0&&(p=!0)),Ls()){let m=o.resource.vcpu,d=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0,f=o.resource.disk_in_gb;if(c.keyValueTable({vCPUs:m!==s?`${pn.red(m)} -> ${pn.green(s)}`:m,Memory:d!==i?`${pn.red(d)} MB -> ${pn.green(i)} MB`:d,"Disk Size":f!==l?`${pn.red(f)} GB -> ${pn.green(l)} GB`:f,"Allow Restart":p?pn.green("Yes"):pn.red("No")}),!e.yes){let{confirm:h}=await mi.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to resize CVM app_${a}?`,default:!1}]);if(!h)return c.info("Resize operation cancelled"),0}let u=c.startSpinner(`Resizing CVM with App ID app_${a}`);await Vt(()=>Fs(a,s,i,l,p?1:0),{spinner:u}),u.stop(!0),c.break(),c.success(`Your CVM is being resized. You can check the dashboard for more details:
281
+ ${se}/dashboard/cvms/app_${a}`)}else await Vt(()=>Fs(a,s,i,l,p?1:0)),t.success({app_id:a,vcpu:s,memory:i,disk_size:l,allow_restart:p});return 0}catch(n){return c.error("Failed to resize CVM"),c.logDetailedError(n),t.fail(n instanceof Error?n.message:String(n)),1}}var Pd=C({path:["cvms","resize"],meta:Id,schema:Ad,handler:WS});async function ua(e,t=3e5,n){let r=await E(n),o=Date.now(),a=2e3;for(c.info("Waiting for CVM to be ready...");Date.now()-o<t;){try{let s=await G(r,{id:e});if(!s.success)c.warn(`Failed to get CVM info: ${s.error.message}`);else{let i=s.data,l=i.status,p=i.in_progress,m=Math.floor((Date.now()-o)/1e3);if(c.info(` [${m}s] status=${l}, in_progress=${p}`),l==="running"&&!p){let d=Math.floor((Date.now()-o)/1e3);c.success(`CVM is ready (took ${d}s)`);return}}}catch(s){c.warn(`Error checking CVM status: ${s}`)}await new Promise(s=>setTimeout(s,a))}throw new Error(`Timeout waiting for CVM to be ready (${Math.floor(t/1e3)}s)`)}import{z as pi}from"zod";var $d={name:"restart",description:"Restart a CVM",stability:"stable",arguments:[Y],options:[O],examples:[{name:"By app_id",value:"phala cvms restart app_123"},{name:"By UUID",value:"phala cvms restart 550e8400-e29b-41d4-a716-446655440000"},{name:"By name",value:"phala cvms restart my-app"}]},Rd=pi.object({cvmId:pi.string().optional(),interactive:pi.boolean().default(!1)});async function JS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=await G(n,t.cvmId);if(!o.success)return t.fail(o.error.message),1;let a=o.data;a.progress?.target&&(c.warn("CVM is currently in progress (updating/restarting). Waiting for operation to complete..."),await ua(a.vm_uuid,3e5,t));let s=c.startSpinner("Restarting CVM"),i=t.cvmId,l=await Vt(()=>Ss(n,i),{spinner:s});if(s.stop(!0),!l.success)return t.fail(`Failed to restart CVM: ${l.error.message}`),1;let p=l.data;return r?(t.success({cvm:p,dashboardUrl:`${se}/dashboard/cvms/app_${p.app_id}`,message:"CVM restart requested"}),0):(c.break(),c.keyValueTable({"CVM ID":p.id,Name:p.name,Status:p.status,"App ID":`app_${p.app_id}`,"App URL":p.app_url||`${se}/dashboard/cvms/app_${p.app_id}`},{borderStyle:"rounded"}),c.break(),c.success(`Your CVM is being restarted. You can check the dashboard for more details:
282
+ ${se}/dashboard/cvms/app_${p.app_id}`),0)}catch(n){return t.fail("Failed to restart CVM"),c.logDetailedError(n),1}}var xd=C({path:["cvms","restart"],meta:$d,schema:Rd,handler:JS});import{z as Pn}from"zod";var Dd={name:"serial-logs",description:"Fetch VM serial console logs from a CVM",stability:"deprecated",arguments:[Y],options:[{name:"tail",shorthand:"n",description:"Lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream logs in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},pe,O],examples:[{name:"Show VM serial logs",value:"phala cvms serial-logs app_abc123"},{name:"Show last 100 lines of serial logs",value:"phala cvms serial-logs app_abc123 --tail 100"},{name:"Follow serial logs in real-time",value:"phala cvms serial-logs app_abc123 --follow"},{name:"Show serial logs with timestamps",value:"phala cvms serial-logs app_abc123 --timestamps"}]},Td=Pn.object({cvmId:Pn.string().optional(),tail:Pn.number().optional(),follow:Pn.boolean().default(!1),timestamps:Pn.boolean().default(!1),json:Pn.boolean().default(!1),interactive:Pn.boolean().default(!1)});var YS=da({logType:"serial",fetchLogs:Lm,streamLogs:jm},e=>({tail:e.tail,timestamps:e.timestamps})),Md=C({path:["cvms","serial-logs"],meta:Dd,schema:Td,handler:YS});import{z as di}from"zod";var Ld={name:"start",description:"Start a stopped CVM",stability:"stable",arguments:[Y],options:[O],examples:[{name:"Start CVM by app_id",value:"phala cvms start app_123"},{name:"Start CVM by UUID",value:"phala cvms start 550e8400-e29b-41d4-a716-446655440000"},{name:"Start CVM by name",value:"phala cvms start my-app"}]},Ud=di.object({cvmId:di.string().optional(),interactive:di.boolean().default(!1)});async function ZS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=c.startSpinner("Starting CVM"),a=t.cvmId,s=await Vt(()=>_s(n,a),{spinner:o});if(o.stop(!0),!s.success)return t.fail(`Failed to start CVM: ${s.error.message}`),1;let i=s.data;return r?(t.success({cvm:i,dashboardUrl:`${se}/dashboard/cvms/app_${i.app_id}`,message:"CVM start requested"}),0):(c.break(),c.keyValueTable({"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`},{borderStyle:"rounded"}),c.break(),c.success(`Your CVM is being started. You can check the dashboard for more details:
283
+ ${se}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.fail("Failed to start CVM"),c.logDetailedError(n),1}}var Od=C({path:["cvms","start"],meta:Ld,schema:Ud,handler:ZS});import{z as ui}from"zod";var Nd={name:"stop",description:"Stop a running CVM",stability:"stable",arguments:[Y],options:[O],examples:[{name:"Stop CVM by app_id",value:"phala cvms stop app_123"},{name:"Stop CVM by UUID",value:"phala cvms stop 550e8400-e29b-41d4-a716-446655440000"},{name:"Stop CVM by name",value:"phala cvms stop my-app"}]},jd=ui.object({cvmId:ui.string().optional(),interactive:ui.boolean().default(!1)});async function XS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=c.startSpinner("Stopping CVM"),a=t.cvmId,s=await Vt(()=>ks(n,a),{spinner:o});if(o.stop(!0),!s.success)return t.fail(`Failed to stop CVM: ${s.error.message}`),1;let i=s.data;return r?(t.success({cvm:i,dashboardUrl:`${se}/dashboard/cvms/app_${i.app_id}`,message:"CVM stop requested"}),0):(c.break(),c.keyValueTable({"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`},{borderStyle:"rounded"}),c.break(),c.success(`Your CVM is being stopped. You can check the dashboard for more details:
284
+ ${se}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.fail("Failed to stop CVM"),c.logDetailedError(n),1}}var Fd=C({path:["cvms","stop"],meta:Nd,schema:jd,handler:XS});import QS from"fs";import{z as fr}from"zod";var Vd={name:"upgrade",description:'Upgrade a CVM to a new version (use "phala deploy" instead)',stability:"deprecated",arguments:[Y],options:[O,{name:"compose",shorthand:"c",description:"Path to Docker Compose file",type:"string",target:"compose"},{name:"env-file",shorthand:"e",description:"Path to environment file",type:"string",target:"envFile"},{name:"debug",description:"Enable debug output",type:"boolean",target:"debug"}],examples:[{name:"Upgrade a CVM interactively",value:"phala cvms upgrade"},{name:"Upgrade using a compose file",value:"phala cvms upgrade app_123 --compose ./docker-compose.yml"}]},Hd=fr.object({cvmId:fr.string().optional(),interactive:fr.boolean().default(!1),compose:fr.string().optional(),envFile:fr.string().optional(),debug:fr.boolean().default(!1)});async function e0(e){if(e.compose)return e.compose;let n=ur(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return jt("Enter the path to your Docker Compose file:",n,"file")}async function t0(e,t){try{if(c.warn('\u26A0\uFE0F This command is deprecated. Please use "phala deploy" instead.'),c.warn(`\u26A0\uFE0F This legacy API will be maintained but may have limited support.
285
+ `),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s=o,i=await e0(e),l="";if(i)try{l=QS.readFileSync(i,"utf8")}catch(h){return c.error(`Failed to read Docker Compose file: ${h instanceof Error?h.message:String(h)}`),1}await An(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?c.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?c.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):c.info("\u{1F510} Using public DockerHub registry...");let p,m=[];if(e.envFile)try{let h=Xr([],e.envFile);p=await(0,Ie.encryptEnvVars)(h,s.kms_info?.encrypted_env_pubkey),m=h.map(g=>g.key)}catch(h){return c.error(`Failed to read environment file: ${h instanceof Error?h.message:String(h)}`),1}let d={compose_manifest:{docker_compose_file:l,manifest_version:1,runner:"docker-compose",version:"1.0.0",features:["kms","tproxy-net"],name:`app_${a}`,allowed_envs:m},encrypted_env:p,allow_restart:!0,env_keys:m},f=c.startSpinner(`Upgrading CVM app_${a}`),u=await xm(a,d);return u?(f.stop(!0),u.detail&&c.info(`Details: ${u.detail}`),c.break(),c.success(`Your CVM is being upgraded. You can check the dashboard for more details:
286
+ ${se}/dashboard/cvms/app_${a}`),0):(f.stop(!1),c.error("Failed to upgrade CVM"),1)}catch(n){return c.error(`Failed to upgrade CVM: ${n instanceof Error?n.message:String(n)}`),e.debug&&c.error("Full Error:",n),1}}var zd=C({path:["cvms","upgrade"],meta:Vd,schema:Hd,handler:t0});var fa={group:Vp,commands:[Kp,ed,rd,id,md,ud,hd,Cd,Ed,Pd,xd,Md,Od,Fd,zd],subgroups:[]};import{z as q}from"zod";var Kd={name:"deploy",category:"deploy",description:"Deploy new CVM or update existing one",stability:"stable",arguments:[],options:[wn,lm,O,{name:"debug",description:"Enable debug logging",type:"boolean",target:"debug",group:"advanced"},{name:"name",shorthand:"n",description:"CVM name (defaults to directory name)",type:"string",target:"name",group:"basic"},{name:"compose",shorthand:"c",description:"Path to Docker Compose file (default: docker-compose.yml)",type:"string",target:"compose",group:"basic"},{name:"instance-type",shorthand:"t",description:"Instance type (e.g., tdx.small, auto-selected if omitted)",type:"string",target:"instanceType",group:"basic"},{name:"vcpu",description:"Use --instance-type instead",type:"string",target:"vcpu",deprecated:!0,group:"deprecated"},{name:"memory",description:"Use --instance-type instead",type:"string",target:"memory",deprecated:!0,group:"deprecated"},{name:"disk-size",description:`Disk size with unit (e.g., 50G, default: ${In}GB)`,type:"string",target:"diskSize",group:"advanced"},{name:"fs",description:"Filesystem type (ext4 or zfs, default: zfs)",type:"string",target:"fs",group:"advanced"},{name:"image",description:"OS image version (auto-selected if omitted)",type:"string",target:"image",group:"advanced"},{name:"region",shorthand:"r",description:"Preferred region (e.g., us-west, auto-selected if omitted)",type:"string",target:"region",group:"basic"},{name:"node-id",description:"Node ID (auto-selected if omitted)",type:"string",target:"nodeId",group:"advanced"},{name:"env",shorthand:"e",description:"Environment variable (KEY=VALUE) or env file path (repeatable)",type:"string[]",target:"env",group:"basic"},{name:"env-file",description:"Use -e instead",type:"string",target:"envFile",deprecated:!0,group:"deprecated"},{name:"kms",description:"KMS type: phala (default), ethereum/eth, or base",type:"string",target:"kms",group:"basic"},{name:"kms-id",description:"Use --kms instead",type:"string",target:"kmsId",deprecated:!0,group:"deprecated"},{name:"custom-app-id",description:"Custom App ID (requires --nonce for PHALA KMS)",type:"string",target:"customAppId",group:"advanced"},{name:"nonce",description:"Nonce for deterministic app_id (requires --custom-app-id, PHALA KMS only)",type:"string",target:"nonce",group:"advanced"},{name:"pre-launch-script",description:"Path to pre-launch script",type:"string",target:"preLaunchScript",group:"advanced"},Ze,Ge,{name:"wait",description:"Wait for deployment/update completion",type:"boolean",target:"wait",group:"basic"},{name:"ssh-pubkey",description:"SSH public key path (default: ~/.ssh/id_rsa.pub)",type:"string",target:"sshPubkey",group:"basic"},{name:"dev-os",description:"Use dev OS image (requires SSH key)",type:"boolean",target:"devOs",negatedName:"no-dev-os",group:"basic"},{name:"prepare-only",description:"Prepare the update and generate a commit token. Skips all on-chain operations. Intended for multisig workflows.",type:"boolean",target:"prepareOnly",group:"advanced"},{name:"commit",description:"Commit a previously prepared update using a commit token. Requires --token; --compose-hash and --transaction-hash are read from the token when omitted.",type:"boolean",target:"commit",group:"advanced"},{name:"token",description:"Commit token from a prepare-only update.",type:"string",target:"token",group:"advanced"},{name:"compose-hash",description:"Compose hash from a prepare-only update. Optional in --commit mode when the token can provide it.",type:"string",target:"composeHash",group:"advanced"},or,{name:"public-logs",description:"Make CVM logs publicly accessible (default: true)",type:"boolean",target:"publicLogs",negatedName:"no-public-logs"},{name:"public-sysinfo",description:"Make CVM system info publicly accessible (default: true)",type:"boolean",target:"publicSysinfo",negatedName:"no-public-sysinfo"},{name:"listed",description:"List CVM on the public Trust Center (default: false)",type:"boolean",target:"listed",negatedName:"no-listed"}],examples:[{name:"Deploy new CVM",value:"phala deploy"},{name:"Deploy with environment variables",value:"phala deploy -e NODE_ENV=production -e DEBUG=true"},{name:"Deploy with env file",value:"phala deploy -e .env"},{name:"Deploy with specific instance type",value:"phala deploy --instance-type tdx.medium"},{name:"Deploy to specific region",value:"phala deploy --region us-west"},{name:"Deploy with Ethereum KMS",value:"phala deploy --kms ethereum --private-key <key> --rpc-url <url>"},{name:"Update existing CVM by ID",value:"phala deploy --cvm-id app_abc123"},{name:"Update CVM with new compose file and env",value:"phala deploy --cvm-id my-app --compose ./new-docker-compose.yml -e .env"},{name:"Update CVM and wait for completion",value:"phala deploy --cvm-id app_abc123 --wait"},{name:"Update CVM from phala.toml",value:"phala deploy"},{name:"Deploy with logs and sysinfo disabled",value:"phala deploy --no-public-logs --no-public-sysinfo"},{name:"Deploy and list on Trust Center",value:"phala deploy --listed"},{name:"Update existing CVM to disable logs",value:"phala deploy --cvm-id app_123 --no-public-logs"},{name:"Prepare update for multisig approval",value:"phala deploy --cvm-id app_123 --prepare-only -c docker-compose.yml"},{name:"Commit a prepared update",value:"phala deploy --cvm-id app_123 --commit --token <token> --compose-hash 0x... --transaction-hash 0x..."}]},Gd=q.object({compose:q.string().optional(),json:q.boolean().default(!1),debug:q.boolean().default(!1),apiToken:q.string().optional(),name:q.string().optional(),instanceType:q.string().optional(),vcpu:q.string().optional(),memory:q.string().optional(),diskSize:q.string().optional(),fs:q.enum(["ext4","zfs"]).optional(),image:q.string().optional(),region:q.string().optional(),nodeId:q.string().optional(),env:q.array(q.string()).optional(),envFile:q.string().optional(),interactive:q.boolean().default(!1),kms:q.enum(["phala","ethereum","eth","base"]).default("phala"),kmsId:q.string().optional(),cvmId:q.string().optional(),customAppId:q.string().optional(),nonce:q.string().optional(),preLaunchScript:q.string().optional(),privateKey:q.string().optional(),rpcUrl:q.string().optional(),wait:q.boolean().default(!1),sshPubkey:q.string().optional(),devOs:q.boolean().optional(),publicLogs:q.boolean().optional(),publicSysinfo:q.boolean().optional(),listed:q.boolean().optional(),prepareOnly:q.boolean().default(!1),commit:q.boolean().default(!1),token:q.string().optional(),composeHash:q.string().optional(),transactionHash:q.string().optional()});import zt from"path";import Jd from"os";function n0(e){let t=e.indexOf("=");if(t===-1)return!1;let n=e.substring(0,t);return n.includes("/")||n.includes("\\")?!1:/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)}function ga(e){let t={files:[],keyValues:[]};for(let n of e)if(n0(n)){let r=n.indexOf("="),o=n.substring(0,r),a=n.substring(r+1);t.keyValues.push({key:o,value:a})}else t.files.push(n);return t}function ha(e){let t=new Map;for(let n of e)t.set(n.key,n.value);return Array.from(t.entries()).map(([n,r])=>({key:n,value:r}))}function qd(e,t="B"){if(!e||typeof e!="string")throw new Error("Invalid input: must be a non-empty string");let n=e.trim().match(/^(\d+(?:\.\d+)?)\s*([KkMmGgTt][Bb]?)?$/);if(!n)throw new Error(`Invalid format: ${e}. Expected format: <number>[unit] (e.g., 2G, 500MB, 1T)`);let r=Number.parseFloat(n[1]),o=(n[2]||t).toUpperCase().replace("B",""),a={K:1024,M:1024*1024,G:1024*1024*1024,T:1024*1024*1024*1024,"":1};if(!(o in a))throw new Error(`Unsupported unit: ${o}. Supported units: B, K/KB, M/MB, G/GB, T/TB`);return Math.round(r*a[o])}function Bd(e){let t=qd(e,"MB"),n=Math.round(t/(1024*1024));if(n%1024!==0)throw new Error(`Memory must be a multiple of 1GB (1024MB). Got: ${n}MB`);return n}function Wd(e){let t=qd(e,"GB"),n=Math.round(t/(1024*1024*1024));if(n%1!==0)throw new Error(`Disk size must be a multiple of 1GB. Got: ${n}GB`);return n}import ya from"dedent";import pt from"fs-extra";import va from"inquirer";function Yd(e,t){if(e instanceof vt)return t.json?{success:!1,error_code:e.errorCode,message:e.message,details:e.structuredDetails,suggestions:e.suggestions,links:e.links}:tn(e);if(e&&typeof e=="object"&&"response"in e){let o=e.response?.data?.detail;if(o&&typeof o=="object"&&"error_code"in o){let{error_code:a,message:s,details:i,suggestions:l,links:p}=o;if(t.json)return{success:!1,error_code:a,message:s,details:i,suggestions:l,links:p};let m=`
206
287
  Error [${a}]: ${s}
207
- `;if(c&&c.length>0){p+=`
288
+ `;if(i&&i.length>0){m+=`
208
289
  Details:
209
- `;for(let u of c)u.message?p+=` - ${u.message}
210
- `:u.field&&u.value!==void 0&&(p+=` - ${u.field}: ${u.value}
211
- `)}if(l&&l.length>0){p+=`
290
+ `;for(let d of i)d.message?m+=` - ${d.message}
291
+ `:d.field&&d.value!==void 0&&(m+=` - ${d.field}: ${d.value}
292
+ `)}if(l&&l.length>0){m+=`
212
293
  Suggestions:
213
- `;for(let u of l)p+=` - ${u}
214
- `}if(m&&m.length>0){p+=`
294
+ `;for(let d of l)m+=` - ${d}
295
+ `}if(p&&p.length>0){m+=`
215
296
  Learn more:
216
- `;for(let u of m)p+=` - ${u.label}: ${u.url}
217
- `}return p}}let r=e instanceof Error?e.message:String(e||"Unknown error");return t.json?{success:!1,error:r}:`
218
- Error: ${r}
219
- `}var su="2025-10-28";async function pS({apiToken:e,interactive:t}){let r=ht(void 0,{apiToken:e});if(r.apiKey)return Qe({apiKey:r.apiKey,baseURL:r.baseURL,version:su});if(t){let{apiToken:n}=await Vo.prompt([{type:"password",name:"apiToken",message:"Enter your API token:",validate:o=>o.trim()?!0:"API token is required"}]);return Qe({apiKey:n,baseURL:r.baseURL,version:su})}throw new Error("API token is required. Please run 'phala login' or set PHALA_CLOUD_API_KEY environment variable")}async function uS({dockerComposePath:e,interactive:t}){if(!e)if(t){let n=Nr(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e=await kt("Enter the path to your Docker Compose file:",n,"file")}else throw new Error(jo(`
297
+ `;for(let d of p)m+=` - ${d.label}: ${d.url}
298
+ `}return m}}let n=e instanceof Error?e.message:String(e||"Unknown error");return t.json?{success:!1,error:n}:`
299
+ Error: ${n}
300
+ `}var fi="2025-10-28";async function r0({context:e,apiToken:t,interactive:n}){let r=_t(e,{apiToken:t});if(r.apiKey)return rt({apiKey:r.apiKey,baseURL:r.baseURL,version:fi});if(n){let{apiToken:o}=await va.prompt([{type:"password",name:"apiToken",message:"Enter your API token:",validate:a=>a.trim()?!0:"API token is required"}]);return rt({apiKey:o,baseURL:r.baseURL,version:fi})}throw new Error("API token is required. Please run 'phala login' or set PHALA_CLOUD_API_KEY environment variable")}async function o0({dockerComposePath:e,interactive:t}){if(!e)if(t){let r=ur(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e=await jt("Enter the path to your Docker Compose file:",r,"file")}else throw new Error(ya(`
220
301
  Docker Compose file is required.
221
302
 
222
303
  Usage examples:
@@ -232,7 +313,7 @@ Error: ${r}
232
313
  --rpc-url <url> RPC URL for the blockchain
233
314
 
234
315
  Run with --interactive for guided setup
235
- `));if(!tt.existsSync(e))throw new Error(`Docker compose file not found: ${e}`);return tt.readFileSync(e,"utf8")}var dS=async(e,t)=>{let r=e.privateKey||process.env.PRIVATE_KEY;if(t&&!e.privateKey)if(e.interactive)r=(await Vo.prompt([{type:"password",name:"privateKey",message:"Enter your private key:",validate:o=>o.trim()?!0:"Private key is required"}])).privateKey;else throw new Error("When using on-chain KMS, either --private-key (or PRIVATE_KEY env) must be provided");return r};function iu(e){e.kmsId&&i.warn("--kms-id is deprecated. Use --kms instead.");let t=(e.kms??"phala").toLowerCase(),r;switch(t){case"eth":case"ethereum":r="ETHEREUM";break;case"base":r="BASE";break;default:r="PHALA";break}return{kmsType:r,deprecatedKmsId:e.kmsId}}var fS=async e=>{let t=e.name;if(e.name){if(!Ar(e.name))throw new Error(`Invalid CVM name: "${e.name}". Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens.`);return e.name}let r=xt.basename(process.cwd()),n=Hc(r);return e.interactive?t=(await Vo.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:n,validate:a=>a.trim()?Ar(a.trim())?!0:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens":"CVM name is required"}])).name:t=n,t},gS=async e=>{let t=[];if(e.envFile&&typeof e.envFile=="string"){i.warn("--env-file is deprecated. Use -e <file> or -e KEY=VALUE instead.");try{let r=tt.readFileSync(e.envFile,{encoding:"utf8"});t.push(...$r(r))}catch(r){throw new Error(`Error reading environment file ${e.envFile}: ${r instanceof Error?r.message:String(r)}`)}}if(e.env&&e.env.length>0){let r=Oo(e.env);for(let n of r.files){let o=xt.resolve(process.cwd(),n);if(!tt.existsSync(o))throw new Error(`Environment file not found: ${n}`);try{let a=tt.readFileSync(o,{encoding:"utf8"});t.push(...$r(a))}catch(a){throw new Error(`Error reading environment file ${n}: ${a instanceof Error?a.message:String(a)}`)}}t.push(...r.keyValues)}if(e.interactive&&t.length===0&&!e.env&&!e.envFile){let{envPath:r}=await Vo.prompt([{type:"input",name:"envPath",message:"Enter the path to your environment file (leave empty to skip):",default:"",validate:n=>{if(!n||n.trim()==="")return!0;let o=xt.resolve(process.cwd(),n);return tt.existsSync(o)?!0:`File not found at ${o}`}}]);if(r.trim()){let n=xt.resolve(process.cwd(),r.trim()),o=tt.readFileSync(n,{encoding:"utf8"});t.push(...$r(o))}}if(t.length!==0)return Fo(t)},hS=async e=>{let t=e.sshPubkey;if(!(e.devOs===!1&&!e.sshPubkey)){if(t){if(t.startsWith("~")&&(t=xt.join(au.homedir(),t.slice(1))),!tt.existsSync(t))throw new Error(`SSH public key file not found: ${t}`)}else{let r=au.homedir(),n=[xt.join(r,".ssh","id_rsa.pub"),xt.join(r,".ssh","id_ed25519.pub"),xt.join(r,".ssh","id_ecdsa.pub"),xt.join(r,".ssh","id_dsa.pub")];for(let o of n)if(tt.existsSync(o)){t=o;break}if(!t){if(e.devOs)throw new Error(jo(`
316
+ `));if(!pt.existsSync(e))throw new Error(`Docker compose file not found: ${e}`);return pt.readFileSync(e,"utf8")}var a0=async(e,t)=>{let n=e.privateKey||process.env.PRIVATE_KEY;if(t&&!e.privateKey)if(e.interactive)n=(await va.prompt([{type:"password",name:"privateKey",message:"Enter your private key:",validate:o=>o.trim()?!0:"Private key is required"}])).privateKey;else throw new Error("When using on-chain KMS, either --private-key (or PRIVATE_KEY env) must be provided");return n};function Zd(e){e.kmsId&&c.warn("--kms-id is deprecated. Use --kms instead.");let t=(e.kms??"phala").toLowerCase(),n;switch(t){case"eth":case"ethereum":n="ETHEREUM";break;case"base":n="BASE";break;default:n="PHALA";break}return{kmsType:n,deprecatedKmsId:e.kmsId}}var s0=async e=>{let t=e.name;if(e.name){if(!Xn(e.name))throw new Error(`Invalid CVM name: "${e.name}". Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens.`);return e.name}let n=zt.basename(process.cwd()),r=xl(n);return e.interactive?t=(await va.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:r,validate:a=>a.trim()?Xn(a.trim())?!0:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens":"CVM name is required"}])).name:t=r,t},i0=async e=>{let t=[];if(e.envFile&&typeof e.envFile=="string"){c.warn("--env-file is deprecated. Use -e <file> or -e KEY=VALUE instead.");try{let n=pt.readFileSync(e.envFile,{encoding:"utf8"});t.push(...rr(n))}catch(n){throw new Error(`Error reading environment file ${e.envFile}: ${n instanceof Error?n.message:String(n)}`)}}if(e.env&&e.env.length>0){let n=ga(e.env);for(let r of n.files){let o=zt.resolve(process.cwd(),r);if(!pt.existsSync(o))throw new Error(`Environment file not found: ${r}`);try{let a=pt.readFileSync(o,{encoding:"utf8"});t.push(...rr(a))}catch(a){throw new Error(`Error reading environment file ${r}: ${a instanceof Error?a.message:String(a)}`)}}t.push(...n.keyValues)}if(e.interactive&&t.length===0&&!e.env&&!e.envFile){let{envPath:n}=await va.prompt([{type:"input",name:"envPath",message:"Enter the path to your environment file (leave empty to skip):",default:"",validate:r=>{if(!r||r.trim()==="")return!0;let o=zt.resolve(process.cwd(),r);return pt.existsSync(o)?!0:`File not found at ${o}`}}]);if(n.trim()){let r=zt.resolve(process.cwd(),n.trim()),o=pt.readFileSync(r,{encoding:"utf8"});t.push(...rr(o))}}if(t.length!==0)return ha(t)},c0=async e=>{let t=e.sshPubkey;if(!(e.devOs===!1&&!e.sshPubkey)){if(t){if(t.startsWith("~")&&(t=zt.join(Jd.homedir(),t.slice(1))),!pt.existsSync(t))throw new Error(`SSH public key file not found: ${t}`)}else{let n=Jd.homedir(),r=[zt.join(n,".ssh","id_rsa.pub"),zt.join(n,".ssh","id_ed25519.pub"),zt.join(n,".ssh","id_ecdsa.pub"),zt.join(n,".ssh","id_dsa.pub")];for(let o of r)if(pt.existsSync(o)){t=o;break}if(!t){if(e.devOs)throw new Error(ya(`
236
317
  SSH public key is required for dev images but not found.
237
318
 
238
319
  Searched for:
@@ -244,38 +325,49 @@ Error: ${r}
244
325
  Please either:
245
326
  1. Create an SSH key pair: ssh-keygen -t rsa
246
327
  2. Specify a different key file: --ssh-pubkey <path>
247
- `));return}}try{let r=tt.readFileSync(t,"utf8").trim();return i.info(`Using SSH public key from ${t}`),r}catch(r){throw new Error(`Failed to read SSH public key from ${t}: ${r instanceof Error?r.message:String(r)}`)}}};var yS=(e,t)=>({publicLogs:e.publicLogs??t?.public_logs??!0,publicSysinfo:e.publicSysinfo??t?.public_sysinfo??!0,listed:e.listed??t?.listed??!1}),vS=(e,t,r,n,o,a,s)=>{let c={name:"",docker_compose_file:r,allowed_envs:n?.map(d=>d.key)||[],public_logs:o.publicLogs,public_sysinfo:o.publicSysinfo};s&&(c.pre_launch_script=s),e.fs&&(c.storage_fs=e.fs);let l={name:t,compose_file:c,listed:o.listed},{kmsType:m,deprecatedKmsId:p}=a??iu(e);e.instanceType&&(l.instance_type=e.instanceType),e.vcpu&&(l.vcpu=Number(e.vcpu)),e.memory&&(l.memory=nu(e.memory)),e.diskSize&&(l.disk_size=ou(e.diskSize)),e.nodeId&&(l.teepod_id=Number(e.nodeId)),e.region&&(l.region=e.region),e.image&&(l.image=e.image),l.kms=m,p&&(l.kms_id=p);let u=m==="ETHEREUM"||m==="BASE";if(e.devOs===!0?l.prefer_dev=!0:(e.devOs===!1||u)&&(l.prefer_dev=!1),e.customAppId&&(l.app_id=e.customAppId,m==="PHALA")){if(!e.nonce)throw new Error("--nonce is required when using --custom-app-id with PHALA KMS.");let d=Number(e.nonce);if(Number.isNaN(d))throw new Error(`Invalid nonce value: "${e.nonce}". Nonce must be a valid number.`);l.nonce=d}if(e.nonce&&!e.customAppId)throw new Error("--nonce requires --custom-app-id to be specified.");return l},bS=async(e,t,r,n,o,a,s,c)=>{let l=iu(e),m=await fS(e),p=await hS(e),u=[...r||[]];p&&u.push({key:"DSTACK_AUTHORIZED_KEYS",value:p});let d=yS(e,s),f=vS(e,m,t,u,d,l,c);o.write(`Provisioning CVM ${m}...
248
- `);let g=await Ka(n,f);if(!g.success){let S=mS(g.error,e);throw i.error("Error in provisioning CVM:",S),g.error}let h=g.data,v,w=h.kms_info;if(!h.app_id&&!!w?.chain_id&&!!w?.kms_contract_address){if(!w?.chain_id||!w?.chain)throw new Error("KMS chain info is missing from provision response. Please retry or contact support.");if(!w?.kms_contract_address)throw new Error("KMS contract address is missing from provision response. Please retry or contact support.");let S=await dS(e,w.chain_id),E=await sl({chain:w.chain,rpcUrl:e.rpcUrl,kmsContractAddress:w.kms_contract_address,privateKey:S,deviceId:h.device_id,composeHash:h.compose_hash});if(!E.success){i.logDetailedError(E,"Deploy App Auth");let oe=typeof E=="object"&&E!==null?JSON.stringify(E):String(E);throw new Error(`Deployment contract failed: ${oe}`)}let x=E.data,P=w.slug||w.id;if(!P)throw new Error("KMS reference (slug or id) is missing from provision response");let O=await xr(n,{app_id:x.appId,kms:P});if(!O.success)throw i.logDetailedError(O.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get app env encrypt pubkey: ${O.error.message}`);let V=O.data,te=await(0,$e.encryptEnvVars)(u,V.public_key);v=await Yn(n,{app_id:x.appId,encrypted_env:te,compose_hash:h.compose_hash,kms_id:P,contract_address:x.appAuthAddress,deployer_address:x.deployer})}else{let S=u&&u.length>0?await(0,$e.encryptEnvVars)(u,h.app_env_encrypt_pubkey):void 0;v=await Yn(n,{app_id:h.app_id,encrypted_env:S,compose_hash:h.compose_hash,kms_id:l.deprecatedKmsId})}if(!v.success)throw i.logDetailedError(v.error,"Commit CVM Provision"),new Error(`Failed to commit CVM provision: ${v.error.message}`);let _=v.data;if(e?.json!==!1)o.write(`${JSON.stringify({success:!0,vm_uuid:_.vm_uuid,name:_.name,app_id:_.app_id,dashboard_url:`${he}/dashboard/cvms/${_.vm_uuid}`},null,2)}
249
- `);else{let S=jo`
328
+ `));return}}try{let n=pt.readFileSync(t,"utf8").trim();return c.info(`Using SSH public key from ${t}`),n}catch(n){throw new Error(`Failed to read SSH public key from ${t}: ${n instanceof Error?n.message:String(n)}`)}}};var l0=(e,t)=>({publicLogs:e.publicLogs??t?.public_logs??!0,publicSysinfo:e.publicSysinfo??t?.public_sysinfo??!0,listed:e.listed??t?.listed??!1}),m0=(e,t,n,r,o,a,s)=>{let i={name:"",docker_compose_file:n,allowed_envs:r?.map(f=>f.key)||[],public_logs:o.publicLogs,public_sysinfo:o.publicSysinfo};s&&(i.pre_launch_script=s),e.fs&&(i.storage_fs=e.fs);let l={name:t,compose_file:i,listed:o.listed},{kmsType:p,deprecatedKmsId:m}=a??Zd(e);e.instanceType&&(l.instance_type=e.instanceType),e.vcpu&&(l.vcpu=Number(e.vcpu)),e.memory&&(l.memory=Bd(e.memory)),e.diskSize&&(l.disk_size=Wd(e.diskSize)),e.nodeId&&(l.teepod_id=Number(e.nodeId)),e.region&&(l.region=e.region),e.image&&(l.image=e.image),l.kms=p,m&&(l.kms_id=m);let d=p==="ETHEREUM"||p==="BASE";if(e.devOs===!0?l.prefer_dev=!0:(e.devOs===!1||d)&&(l.prefer_dev=!1),e.customAppId&&(l.app_id=e.customAppId,p==="PHALA")){if(!e.nonce)throw new Error("--nonce is required when using --custom-app-id with PHALA KMS.");let f=Number(e.nonce);if(Number.isNaN(f))throw new Error(`Invalid nonce value: "${e.nonce}". Nonce must be a valid number.`);l.nonce=f}if(e.nonce&&!e.customAppId)throw new Error("--nonce requires --custom-app-id to be specified.");return l},p0=async(e,t,n,r,o,a,s,i)=>{let l=Zd(e),p=await s0(e),m=await c0(e),d=[...n||[]];m&&d.push({key:"DSTACK_AUTHORIZED_KEYS",value:m});let f=l0(e,s),u=m0(e,p,t,d,f,l,i);o.write(`Provisioning CVM ${p}...
329
+ `);let h=await bs(r,u);if(!h.success){let k=Yd(h.error,e);throw c.error("Error in provisioning CVM:",k),h.error}let g=h.data,y,b=g.kms_info;if(!g.app_id&&!!b?.chain_id&&!!b?.kms_contract_address){if(!b?.chain_id||!b?.chain)throw new Error("KMS chain info is missing from provision response. Please retry or contact support.");if(!b?.kms_contract_address)throw new Error("KMS contract address is missing from provision response. Please retry or contact support.");let k=await a0(e,b.chain_id),_=await Wl({chain:b.chain,rpcUrl:e.rpcUrl,kmsContractAddress:b.kms_contract_address,privateKey:k,deviceId:g.device_id,composeHash:g.compose_hash});if(!_.success){c.logDetailedError(_,"Deploy App Auth");let re=typeof _=="object"&&_!==null?JSON.stringify(_):String(_);throw new Error(`Deployment contract failed: ${re}`)}let I=_.data,$=b.slug||b.id;if(!$)throw new Error("KMS reference (slug or id) is missing from provision response");let M=await Qn(r,{app_id:I.appId,kms:$});if(!M.success)throw c.logDetailedError(M.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get app env encrypt pubkey: ${M.error.message}`);let U=M.data,z=await(0,Ie.encryptEnvVars)(d,U.public_key);y=await Ro(r,{app_id:I.appId,encrypted_env:z,compose_hash:g.compose_hash,kms_id:$,contract_address:I.appAuthAddress,deployer_address:I.deployer})}else{let k=d&&d.length>0?await(0,Ie.encryptEnvVars)(d,g.app_env_encrypt_pubkey):void 0;y=await Ro(r,{app_id:g.app_id,encrypted_env:k,compose_hash:g.compose_hash,kms_id:l.deprecatedKmsId})}if(!y.success)throw c.logDetailedError(y.error,"Commit CVM Provision"),new Error(`Failed to commit CVM provision: ${y.error.message}`);let S=y.data;if(e?.json!==!1)o.write(`${JSON.stringify({success:!0,vm_uuid:S.vm_uuid,name:S.name,app_id:S.app_id,dashboard_url:`${se}/dashboard/cvms/${S.vm_uuid}`},null,2)}
330
+ `);else{let k=ya`
250
331
  CVM created successfully!
251
332
 
252
- CVM ID: ${_.vm_uuid}
253
- Name: ${_.name}
254
- App ID: ${_.app_id}
255
- Dashboard URL: ${he}/dashboard/cvms/${_.vm_uuid}
256
- `;o.write(`${S}
257
- `)}},CS=async(e,t,r,n,o,a)=>{let[s,c]=await Promise.all([Q(n,{id:e.uuid}),rn(n,{id:e.uuid})]);if(!s.success)throw i.logDetailedError(s.error,"Get CVM Info"),new Error(`Failed to get cvm info: ${s.error.message}`);if(!c.success)throw i.logDetailedError(c.error,"Get CVM Compose File"),new Error(`Failed to get cvm compose file: ${c.error.message}`);let l=s.data,m=c.data;m.docker_compose_file=t,a&&(m.pre_launch_script=a),r&&r.length>0&&(m.allowed_envs=r.map(v=>v.key)),i.info(`Preparing update for CVM ${e.uuid}...`);let p=await Ga(n,{id:e.uuid,app_compose:m,update_env_vars:!!(r&&r.length>0)});if(!p.success)throw i.logDetailedError(p.error,"Provision CVM Compose File Update"),new Error(`Failed to provision cvm compose file: ${p.error.message}`);let u=p.data,d;if(l.kms_info?.chain_id){if(!e.privateKey)throw new Error("Private key is required for contract DstackApp");e.debug&&(console.log("[DEBUG] provision.compose_hash:",u.compose_hash),console.log("[DEBUG] cvm.app_id:",l.app_id));let v=await Xn({chain:l.kms_info?.chain,rpcUrl:e.rpcUrl,appId:l.app_id,composeHash:u.compose_hash,privateKey:e.privateKey});if(!v.success){i.logDetailedError(v,"Add Compose Hash");let w=typeof v=="object"&&v!==null?JSON.stringify(v):String(v);throw new Error(`Failed to add compose hash: ${w}`)}if(e.debug){let w=v.data;console.log("[DEBUG] addComposeHash.transactionHash:",w.transactionHash),console.log("[DEBUG] addComposeHash.composeHash:",w.composeHash)}if(r&&r.length>0){let w=l.kms_info?.slug||l.kms_info?.id;if(!w)throw new Error("KMS slug or id is required for decentralized KMS");let C=await xr(n,{app_id:l.app_id,kms:w});if(!C.success)throw i.logDetailedError(C.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get app env encrypt pubkey: ${C.error.message}`);let _=C.data;d=await(0,$e.encryptEnvVars)(r,_.public_key)}}else if(r&&r.length>0){if(!l.encrypted_env_pubkey)throw new Error("CVM encrypted_env_pubkey is required for centralized KMS");d=await(0,$e.encryptEnvVars)(r,l.encrypted_env_pubkey)}let f={id:e.uuid,compose_hash:u.compose_hash,encrypted_env:d,env_keys:r?.length?r.map(v=>v.key):void 0,update_env_vars:r?.length?!0:void 0};e.debug&&console.log("[DEBUG] commit.compose_hash:",f.compose_hash);let g=await Ha(n,f);if(!g.success)throw i.logDetailedError(g.error,"Commit CVM Compose File Update"),new Error(`Failed to commit CVM compose file update: ${g.error.message}`);let h=e.publicLogs!==void 0||e.publicSysinfo!==void 0;if(e.wait||h){i.info("Waiting for update to complete...");try{await No(e.uuid,3e5)}catch(v){throw i.logDetailedError(v,"Wait for CVM Ready"),new Error(`Wait failed: ${v instanceof Error?v.message:String(v)}`)}}if(h){let v=await Xa(n,{id:e.uuid,public_logs:e.publicLogs??l.public_logs,public_sysinfo:e.publicSysinfo??l.public_sysinfo});v.success?i.info("CVM visibility settings updated"):"status"in v.error&&v.error.status===409?i.warn("Cannot update visibility while CVM operation is in progress. Please wait and try again."):i.warn(`Failed to update visibility: ${v.error.message}`)}e?.json!==!1?o.write(`${JSON.stringify({success:!0,vm_uuid:e.uuid,name:l.name,app_id:l.app_id,dashboard_url:`${he}/dashboard/cvms/${e.uuid}`},null,2)}
258
- `):o.write(`CVM compose file updated successfully!
259
- `)};async function cu(e,t){try{let r=e.compose||t.projectConfig.compose_file,n=await pS({apiToken:e.apiToken,interactive:e.interactive}),o=await uS({dockerComposePath:r,interactive:e.interactive}),a;if(e.preLaunchScript){if(!tt.existsSync(e.preLaunchScript))throw new Error(`Pre-launch script file not found: ${e.preLaunchScript}`);a=tt.readFileSync(e.preLaunchScript,"utf8")}let s=Buffer.byteLength(o,"utf8"),c=a?Buffer.byteLength(a,"utf8"):0,l=s+c;if(l>Qr){let f=Qr/1024,g=Math.ceil(l/1024);throw new Error(`Combined size of docker compose file and pre-launch script is too large (${g}KB). Maximum allowed size is ${f}KB.`)}let m={...e,env:e.env&&e.env.length>0?e.env:t.projectConfig.env_file?[t.projectConfig.env_file]:void 0},p=await gS(m);e.debug&&(console.log("[DEBUG] context.cvmId:",JSON.stringify(t.cvmId)),console.log("[DEBUG] input.cvmId:",e.cvmId));let u=t.cvmId?G.parse(t.cvmId).cvmId:void 0;e.debug&&(console.log("[DEBUG] resolved uuid:",u),console.log("[DEBUG] isUpdate:",!!u)),!!u?await CS({...e,uuid:u},o,p,n,t.stdout,a):await bS(e,o,p??[],n,t.stdout,t.stderr,t.projectConfig,a)}catch(r){throw e.json!==!1?t.stderr.write(`${JSON.stringify({success:!1,error:r instanceof Error?r.message:String(r),stack:e.debug&&r instanceof Error?r.stack:void 0},null,2)}
260
- `):t.stderr.write(`${jo`${r instanceof Error?r.message:String(r)}`}
261
- `),r}}async function wS(e,t){try{return await cu(e,t),0}catch{return 1}}var lu=b({path:["deploy"],meta:eu,schema:tu,handler:wS});var mu={path:["envs"],meta:{name:"envs",category:"manage",description:"Encrypt and update CVM sealed environment variables",stability:"stable"}};import pu from"fs";import _S from"path";function zo(e){let t=Oo(e),r=[];for(let n of t.files){let o=_S.resolve(n);if(!pu.existsSync(o))throw new Error(`Environment file not found: ${n}`);let a=pu.readFileSync(o,"utf8"),s=$r(a);r.push(...s)}return r.push(...t.keyValues),Fo(r)}async function Ko(e,t){if(t.kms_info?.chain_id!=null){let o=t.kms_type;if(!o)throw new Error("KMS type is required for decentralized KMS");if(!t.app_id)throw new Error("app_id is required for decentralized KMS");let a=await xr(e,{app_id:t.app_id,kms:o});if(!a.success)throw i.logDetailedError(a.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get encryption public key: ${a.error.message}`);return a.data.public_key}let n=t.kms_info?.encrypted_env_pubkey;if(!n)throw new Error("CVM does not have an encryption public key. The CVM may not support encrypted environment variables.");return n}import{z as Or}from"zod";var uu={name:"encrypt",description:"Encrypt environment variables for a CVM (sealed, only readable inside TEE)",stability:"stable",arguments:[B],options:[N,{name:"env",shorthand:"e",description:"Environment variable (KEY=VALUE) or env file path (repeatable)",type:"string[]",target:"env",group:"basic"},{name:"no-newline",shorthand:"n",description:"Do not print trailing newline (useful for piping)",type:"boolean",target:"noNewline",group:"basic"}],examples:[{name:"Encrypt inline variables",value:"phala envs encrypt app_abc123 -e SECRET=value -e API_KEY=xxx"},{name:"Encrypt from env file",value:"phala envs encrypt app_abc123 -e .env"},{name:"Encrypt with CVM from phala.toml",value:"phala envs encrypt -e .env.production"},{name:"Pipe to file for later use",value:"phala envs encrypt app_abc123 -e .env > encrypted.hex"},{name:"Pipe without trailing newline",value:"phala envs encrypt app_abc123 -n -e .env | some-tool"}]},du=Or.object({cvmId:Or.string().optional(),env:Or.array(Or.string()).min(1,"At least one -e argument is required"),noNewline:Or.boolean().default(!1),interactive:Or.boolean().default(!1)});async function SS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Pass a CVM identifier or set it in phala.toml."),1;try{let r=zo(e.env);if(r.length===0)return t.fail("No environment variables found in the provided inputs."),1;let n=await k(),o=await Q(n,t.cvmId);if(!o.success)return t.fail(o.error.message),1;let a=o.data,s=await Ko(n,a),c=await(0,$e.encryptEnvVars)(r,s);return process.stdout.write(e.noNewline?c:`${c}
262
- `),0}catch(r){return t.fail(r instanceof Error?r.message:String(r)),1}}var fu=b({path:["envs","encrypt"],meta:uu,schema:du,handler:SS});import{z as Ht}from"zod";var gu={name:"update",description:"Encrypt and push sealed environment variables to a CVM (only readable inside TEE)",stability:"stable",arguments:[B],options:[N,{name:"env",shorthand:"e",description:"Environment variable (KEY=VALUE) or env file path (repeatable)",type:"string[]",target:"env",group:"basic"},{name:"encrypted-env",description:"Pre-encrypted environment variables as hex string (from 'phala envs encrypt')",type:"string",target:"encryptedEnv",group:"basic"},{name:"private-key",description:"Private key for signing on-chain transactions (or set PRIVATE_KEY env var)",type:"string",target:"privateKey",group:"advanced"},{name:"rpc-url",description:"RPC URL for the blockchain",type:"string",target:"rpcUrl",group:"advanced"}],examples:[{name:"Update with inline variables",value:"phala envs update app_abc123 -e SECRET=newvalue -e API_KEY=xxx"},{name:"Update from env file",value:"phala envs update app_abc123 -e .env.production"},{name:"Update with CVM from phala.toml",value:"phala envs update -e .env"},{name:"Update with pre-encrypted hex (from 'phala envs encrypt')",value:"phala envs update app_abc123 --encrypted-env $(phala envs encrypt app_abc123 -e .env)"},{name:"Update with on-chain KMS",value:"phala envs update app_abc123 -e .env --private-key <key>"}]},hu=Ht.object({cvmId:Ht.string().optional(),env:Ht.array(Ht.string()).optional(),encryptedEnv:Ht.string().optional(),privateKey:Ht.string().optional(),rpcUrl:Ht.string().optional(),interactive:Ht.boolean().default(!1)});async function kS(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Pass a CVM identifier or set it in phala.toml."),1;let r=e.env&&e.env.length>0,n=!!e.encryptedEnv;if(!r&&!n)return t.fail("Provide either -e (environment variables) or --encrypted-env (pre-encrypted hex)."),1;if(r&&n)return t.fail("Cannot use both -e and --encrypted-env at the same time."),1;try{let o=await k(),a=await Q(o,t.cvmId);if(!a.success)return t.fail(a.error.message),1;let s=a.data,c,l;if(r&&e.env){let u=zo(e.env);if(u.length===0)return t.fail("No environment variables found in the provided inputs."),1;l=u.map(f=>f.key);let d=await Ko(o,s);c=await(0,$e.encryptEnvVars)(u,d)}else if(e.encryptedEnv)c=e.encryptedEnv;else return t.fail("No environment input provided."),1;i.info("Updating environment variables...");let m=await Zn(o,{id:s.id,encrypted_env:c,env_keys:l});if(!m.success)return t.fail(m.error.message),1;let p=m.data;if(p.status==="in_progress")return i.success(`Environment update initiated (correlation_id: ${p.correlation_id})`),0;if(p.status==="precondition_required"){let u=e.privateKey||process.env.PRIVATE_KEY;if(!u)return t.fail("On-chain KMS requires a private key. Use --private-key or set PRIVATE_KEY env var."),1;i.info("Environment key list changed \u2014 registering compose hash on-chain...");let d=p.kms_info.chain;if(!d)return t.fail(`Unsupported chain_id ${p.kms_info.chain_id} \u2014 update @phala/cloud to add support.`),1;let f=await Xn({chain:d,rpcUrl:e.rpcUrl,appId:p.app_id,composeHash:p.compose_hash,privateKey:u});if(!f.success)return i.logDetailedError(f,"Add Compose Hash"),t.fail("Failed to register compose hash on-chain."),1;let g=f.data;i.info("Completing environment update...");let h=await Zn(o,{id:s.id,encrypted_env:c,env_keys:l,compose_hash:p.compose_hash,transaction_hash:g.transactionHash});return h.success?h.data.status==="in_progress"?(i.success(`Environment update initiated (correlation_id: ${h.data.correlation_id})`),0):(t.fail("Unexpected response after on-chain verification."),1):(t.fail(h.error.message),1)}return t.fail(`Unexpected response status: ${p.status}`),1}catch(o){return t.fail(o instanceof Error?o.message:String(o)),1}}var yu=b({path:["envs","update"],meta:gu,schema:hu,handler:kS});var js={group:mu,commands:[fu,yu]};import{z as JS}from"zod";var vu={path:["docker"],meta:{name:"docker",description:"Docker Hub login and image management",stability:"deprecated"}};import NS from"fs";import xu from"path";import Pu from"inquirer";import{exec as $S,spawn as DS}from"child_process";import Pt from"fs";import Su from"os";import An from"path";import{promisify as RS}from"util";import{execa as MS}from"execa";import TS from"handlebars";import{INVALID as ES,ParseStatus as IS,ZodIssueCode as Fr,ZodParsedType as bu,ZodType as AS,addIssueToContext as jr,z as Cu}from"zod";var xS="ZodDecimal",PS=/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/,wu=class e extends AS{constructor(){super(...arguments);this.max=this.lte;this.min=this.gte}_parse(r){if(r.data!==null&&typeof r.data=="object"&&"toNumber"in r.data&&(r.data=r.data.toNumber()),this._def.coerce&&(r.data=Number(r.data)),this._getType(r)!==bu.number){let s=this._getOrReturnCtx(r);return jr(s,{code:Fr.invalid_type,expected:bu.number,received:s.parsedType}),ES}let o,a=new IS;for(let s of this._def.checks)if(s.kind==="precision"){let c=r.data.toString().match(PS);Math.max((c[1]?c[1].length:0)-(c[2]?Number.parseInt(c[2],10):0),0)>s.value&&(o=this._getOrReturnCtx(r,o),jr(o,{code:Fr.custom,message:s.message,params:{precision:s.value}}),a.dirty())}else s.kind==="wholeNumber"?r.data.toString().split(".")[0].length>s.value&&(o=this._getOrReturnCtx(r,o),jr(o,{code:Fr.custom,message:s.message,params:{wholeNumber:s.value}}),a.dirty()):s.kind==="min"?(s.inclusive?r.data<s.value:r.data<=s.value)&&(o=this._getOrReturnCtx(r,o),jr(o,{code:Fr.too_small,minimum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="max"?(s.inclusive?r.data>s.value:r.data>=s.value)&&(o=this._getOrReturnCtx(r,o),jr(o,{code:Fr.too_big,maximum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="finite"&&(Number.isFinite(r.data)||(o=this._getOrReturnCtx(r,o),jr(o,{code:Fr.not_finite,message:s.message}),a.dirty()));return{status:a.value,value:r.data}}static{this.create=r=>new e({checks:[],typeName:xS,coerce:r?.coerce??!1})}setLimit(r,n,o,a){return new e({...this._def,checks:[...this._def.checks,{kind:r,value:n,inclusive:o,message:a}]})}_addCheck(r){return new e({...this._def,checks:[...this._def.checks,r]})}lte(r,n){return this.setLimit("max",r,!0,n)}lt(r,n){return this.setLimit("max",r,!1,n)}gt(r,n){return this.setLimit("min",r,!1,n)}gte(r,n){return this.setLimit("min",r,!0,n)}precision(r,n){return this._addCheck({kind:"precision",value:r,message:n})}wholeNumber(r,n){return this._addCheck({kind:"wholeNumber",value:r,message:n})}get minValue(){let r=null;for(let n of this._def.checks)n.kind==="min"&&(r===null||n.value>r)&&(r=n.value);return r}get maxValue(){let r=null;for(let n of this._def.checks)n.kind==="max"&&(r===null||n.value<r)&&(r=n.value);return r}positive(r){return this._addCheck({kind:"min",value:0,inclusive:!1,message:r})}negative(r){return this._addCheck({kind:"max",value:0,inclusive:!1,message:r})}nonpositive(r){return this._addCheck({kind:"max",value:0,inclusive:!0,message:r})}nonnegative(r){return this._addCheck({kind:"min",value:0,inclusive:!0,message:r})}finite(r){return this._addCheck({kind:"finite",message:r})}safe(r){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:r})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:r})}get isFinite(){let r=null,n=null;for(let o of this._def.checks){if(o.kind==="finite")return!0;o.kind==="min"?(n===null||o.value>n)&&(n=o.value):o.kind==="max"&&(r===null||o.value<r)&&(r=o.value)}return Number.isFinite(n)&&Number.isFinite(r)}},_u=Cu.object({template:Cu.string().min(1,"Template cannot be empty")});var xn=RS($S),ku=".phala-cloud/logs",LS=".phala-cloud/compose",Eu=10,He=class{constructor(t,r,n){this.image=t,this.username=r||"",this.registry=n||""}ensureLogsDir(){let t=An.resolve(ku);Pt.existsSync(t)||Pt.mkdirSync(t,{recursive:!0})}getLogFilePath(t,r){let n=new Date().toISOString().replace(/[:.]/g,"-");return An.resolve(ku,`${r||this.image}-${t}-${n}.log`)}getSystemArchitecture(){let t=Su.arch();switch(t){case"arm":case"arm64":return"arm64";case"x64":return"amd64";default:return t}}spawnProcess(t,r,n,o){return new Promise((a,s)=>{let c=DS(t,r);this.ensureLogsDir();let l=this.getLogFilePath(n,o),m=Pt.createWriteStream(l,{flags:"a"}),p=[],u=(d,f=!1)=>{let g=d.toString().split(`
263
- `);m.write(d);for(let h of g)if(h.trim()){p.push(h),p.length>Eu&&p.shift(),console.clear(),console.log(`Latest ${Eu} lines (full log at ${l}):`),console.log("-".repeat(50));for(let v of p)f?console.error(v):console.log(v)}};c.stdout.on("data",d=>u(d)),c.stderr.on("data",d=>u(d,!0)),c.on("close",d=>{m.end(),d===0?(console.log(`
264
- Operation completed. Full log available at: ${l}`),a()):s(new Error(`Process exited with code ${d}. Check log file: ${l}`))}),c.on("error",d=>{m.end(),s(d)})})}setCredentials(t,r){this.username=t,r&&(this.registry=r)}async buildImage(t,r){try{let n=this.getSystemArchitecture(),o=`${this.username}/${this.image}:${r}`,a=i.startSpinner(`Building Docker image ${this.username}/${this.image}:${r}`);We(t);let s=["build","-t",o,"-f",t];return n==="arm64"&&(console.log("Detected arm64 architecture, using --platform linux/amd64"),s.push("--platform","linux/amd64")),s.push("."),await this.spawnProcess("docker",s,"build",this.image),a.stop(!0,`Docker image ${o} built successfully`),!0}catch(n){return i.error(`Failed to build Docker image: ${n instanceof Error?n.message:String(n)}`),!1}}async pushImage(t){try{let r=i.startSpinner(`Pushing Docker image ${t} to Docker Hub`);if(!await St())throw r.stop(!1),new Error('Docker credentials not found. Please log in first with "phala docker login"');let o=t;return console.log(`Pushing image ${o} to Docker Hub...`),await this.spawnProcess("docker",["push",o],"push",t.replace(/.*\/+([\w-]+):.*$/g,"$1")),r.stop(!0,`Docker image ${o} pushed successfully`),!0}catch(r){return i.error(`Failed to push Docker image: ${r instanceof Error?r.message:String(r)}`),!1}}async login(t,r,n){try{let o=i.startSpinner(`Logging in to Docker Hub as ${t}`);if(await this.checkLogin())return o.stop(!0,"Already logged in to Docker Hub"),this.setCredentials(t,n),!0;if(!r)throw o.stop(!1),new Error("Password is required for Docker login");try{await MS("docker",["login",...n?[n]:[],"-u",t,"--password-stdin"],{input:r,timeout:1e4})}catch(s){throw s.timedOut?(o.stop(!1),new Error("Docker login timed out. Please check your credentials and try again.")):s}return o.stop(!0,"Logged in to Docker Hub successfully"),this.setCredentials(t,n),!0}catch(o){return i.error(`Failed to login to Docker Hub: ${o instanceof Error?o.message:String(o)}`),!1}}async checkLogin(){try{let t=Su.homedir(),r=An.join(t,".docker","config.json");if(!Pt.existsSync(r))return!1;let n=JSON.parse(Pt.readFileSync(r,"utf-8"));return!!(n?.auths&&Object.keys(n.auths).length>0)}catch(t){return i.debug(`Docker login check failed: ${t instanceof Error?t.message:String(t)}`),!1}}async buildComposeFile(t,r,n){if(!this.username)throw new Error("Docker Hub username is required for building compose file");let o=n==="eliza"?Pm:$m,a=_u.parse({template:o}),s=An.resolve(LS);Pt.existsSync(s)||(i.info(`Creating directory: ${s}`),Pt.mkdirSync(s,{recursive:!0}));let c=[];r&&(c=Pt.readFileSync(r,"utf-8").split(`
265
- `).filter(f=>f&&!f.startsWith("#")).map(f=>{let g=f.indexOf("#");return g>0?f.substring(0,g).trim():f.trim()}).filter(f=>f.includes("=")).map(f=>{let[g,h]=f.split("=",2),v=g.trim();return(h?h.trim():"")===""?null:`${v}=${v}`}).filter(Boolean));let l=t,p=TS.compile(a.template,{noEscape:!0})({imageName:l,envVars:c.map(d=>d.replace(/=.*/,`=\${${d.split("=")[0]}}`))}),u=An.join(s,`${t.replace(/.*\/+([\w-]+):.*$/g,"$1")}-tee-compose.yaml`);return Pt.writeFileSync(u,p),i.success(`Backup of docker compose file created at: ${u}`),u}async runComposeLocally(t,r){try{let n=i.startSpinner(`Running Docker Compose file at ${t}`);We(t);let o=["-f",t,"up","-d"];return r&&(We(r),o.splice(2,0,"--env-file",r)),await xn(`docker compose ${o.join(" ")}`),n.stop(!0,"Docker Compose file running successfully"),!0}catch(n){return i.error(`Failed to run Docker Compose file: ${n instanceof Error?n.message:String(n)}`),!1}}async runSimulator(t,r){try{i.info(`Running TEE simulator with image ${t}`),i.info("Pulling latest simulator image..."),await xn(`docker pull ${t}`),i.info("Starting simulator in background...");let{stdout:n}=await xn(`docker run -d --name tee-simulator --rm -p ${r}:${r} ${t}`),o=n.trim();return i.success(`TEE simulator running successfully. Container ID: ${o}`),i.break(),i.break(),i.info("Useful commands:"),i.info(`- View logs: docker logs -f ${o}`),i.info(`- Stop simulator: docker stop ${o}`),Ds(`http://localhost:${r}`),!0}catch(n){return i.error(`Failed to run TEE simulator: ${n instanceof Error?n.message:String(n)}`),!1}}async stopSimulator(){try{let t=i.startSpinner("Stopping TEE simulator...");return await xn("docker stop tee-simulator"),await or(),t.stop(!0,"TEE simulator stopped successfully"),!0}catch(t){return i.error(`Failed to stop TEE simulator: ${t instanceof Error?t.message:String(t)}`),!1}}static async listLocalImages(){try{let{stdout:t}=await xn('docker images --format "{{.Repository}}:{{.Tag}}"'),n=(await St())?.username;return t.split(`
266
- `).filter(a=>a&&!a.includes("<none>")).filter(a=>a.includes(`${n}/`)).map(a=>({imageName:a}))}catch(t){return i.error(`Failed to list local Docker images: ${t instanceof Error?t.message:String(t)}`),[]}}};import{z as Go}from"zod";var Iu={name:"build",description:"Build a Docker image",stability:"unstable",options:[{name:"image",shorthand:"i",description:"Image name",type:"string",target:"image"},{name:"tag",shorthand:"t",description:"Image tag",type:"string",target:"tag"},{name:"file",shorthand:"f",description:"Path to Dockerfile",type:"string",target:"file"}],examples:[{name:"Build docker image with prompts",value:"phala docker build"},{name:"Build docker image with options",value:"phala docker build --image myapp --tag latest"}]},Au=Go.object({image:Go.string().optional(),tag:Go.string().optional(),file:Go.string().default("Dockerfile")});async function US(e,t){try{let r=await St();if(!r)return i.error('Docker information not found. Please login first with "phala docker login"'),1;let n=e.image;n||(n=(await Pu.prompt([{type:"input",name:"image",message:"Enter the Docker image name:",validate:m=>m.trim()?!0:"Image name is required"}])).image);let o=e.tag;o||(o=(await Pu.prompt([{type:"input",name:"tag",message:"Enter the Docker image tag:",default:"latest",validate:m=>m.trim()?!0:"Tag is required"}])).tag);let a=xu.resolve(process.cwd(),e.file);if(!NS.existsSync(a)){i.info(`Default Dockerfile not found at ${a}`);let l=await kt("Enter the path to your Dockerfile:","Dockerfile","file");a=xu.resolve(process.cwd(),l)}return await new He(n,r.username,r.registry).buildImage(a,o)?(i.success(`Docker image ${r.username}/${n}:${o} built successfully`),0):(i.error("Failed to build Docker image"),1)}catch(r){return i.error("Failed to build Docker image"),i.logDetailedError(r),1}}var $u=b({path:["docker","build"],meta:Iu,schema:Au,handler:US});import $n from"fs";import Ho from"path";import Dn from"inquirer";import{z as Pn}from"zod";var Du={name:"generate",description:"Generate a Docker Compose file",stability:"unstable",options:[{name:"image",shorthand:"i",description:"Docker image name (e.g. phala/phala-cloud)",type:"string",target:"image"},{name:"env-file",shorthand:"e",description:"Path to env file",type:"string",target:"envFile"},{name:"output",shorthand:"o",description:"Output path for docker-compose.yml",type:"string",target:"output"},{name:"template",description:"Template for docker-compose.yml",type:"string",target:"template"}]},Ru=Pn.object({image:Pn.string().optional(),envFile:Pn.string().optional(),output:Pn.string().optional(),template:Pn.string().optional()});async function OS(e){if(e)return e;let t=await He.listLocalImages();if(t.length===0)throw new Error('No local Docker images found. Please build an image first with "phala docker build"');let r=Array.from(new Set(t.map(o=>o.imageName))),{selectedImage:n}=await Dn.prompt([{type:"list",name:"selectedImage",message:"Select an image to use in the compose file:",choices:r}]);return n}async function FS(e){if(e)return We(e),e;let t=Ho.join(process.cwd(),".env");if($n.existsSync(t)){let{useDefault:n}=await Dn.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);if(n)return t}let{envPath:r}=await Dn.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:n=>{try{return We(n),!0}catch{return`File not found: ${n}`}}}]);return r}async function jS(e){let t=e??Ho.join(process.cwd(),"docker-compose.yml");if($n.existsSync(t)){let{confirmOverwrite:n}=await Dn.prompt([{type:"confirm",name:"confirmOverwrite",message:`File ${t} already exists. Overwrite?`,default:!1}]);if(!n){let{customPath:o}=await Dn.prompt([{type:"input",name:"customPath",message:"Enter alternative output path:",default:Ho.join(process.cwd(),"docker-generated-compose.yml")}]);t=o}}let r=Ho.dirname(t);return $n.existsSync(r)||(i.info(`Creating directory: ${r}`),$n.mkdirSync(r,{recursive:!0})),t}async function VS(e,t){try{let r=await St();if(!r||!r.username)throw new Error('Docker Hub username not found. Please login first with "phala docker login"');let n=await OS(e.image),o=await FS(e.envFile),a=await jS(e.output);o?i.info(`Generating Docker Compose file for ${n} using env file: ${o}`):i.info(`Generating Docker Compose file for ${n} without env file`);let c=await new He("",r.username,r.registry).buildComposeFile(n,o,e.template);return c!==a&&$n.copyFileSync(c,a),i.success(`Docker Compose file generated successfully: ${a}`),0}catch(r){return i.error("Failed to generate Docker Compose file"),i.logDetailedError(r),1}}var Mu=b({path:["docker","generate"],meta:Du,schema:Ru,handler:VS});import Nu from"prompts";import{z as qo}from"zod";var Tu={name:"login",description:"Login to Docker Hub",stability:"unstable",options:[{name:"username",shorthand:"u",description:"Docker Hub username",type:"string",target:"username"},{name:"password",shorthand:"p",description:"Docker Hub password",type:"string",target:"password"},{name:"registry",shorthand:"r",description:"Docker registry URL",type:"string",target:"registry"}]},Lu=qo.object({username:qo.string().optional(),password:qo.string().optional(),registry:qo.string().optional()});async function zS(e,t){try{let r=e.username,n=e.password,o=e.registry;if(!r){i.info("First we need your Docker Hub username to check if you are already logged in.");let l=await Nu({type:"text",name:"username",message:"Enter your Docker Hub username:",validate:m=>m.length>0?!0:"Username cannot be empty"});if(!l.username)return i.error("Username is required"),1;r=l.username}let a=new He("",r,o);if(await a.login(r))return i.success(`${r} is logged in to Docker Hub`),await us({username:r,registry:o||null}),0;if(!n){let l=await Nu({type:"password",name:"password",message:"Enter your Docker Hub password:",validate:m=>m.length>0?!0:"Password cannot be empty"});if(!l.password)return i.error("Password is required"),1;n=l.password}return await a.login(r,n,o)?(await us({username:r,registry:o||null}),i.success("Logged in to Docker Hub successfully"),0):(i.error("Failed to login to Docker Hub"),1)}catch(r){return i.error("Failed to login to Docker Hub"),i.logDetailedError(r),1}}var Uu=b({path:["docker","login"],meta:Tu,schema:Lu,handler:zS});import KS from"inquirer";import{z as Ou}from"zod";var Fu={name:"push",description:"Push a Docker image to Docker Hub",stability:"unstable",options:[{name:"image",shorthand:"i",description:"Full image name (e.g. username/image:tag)",type:"string",target:"image"}]},ju=Ou.object({image:Ou.string().optional()});async function GS(e){if(e)return e;let t=await He.listLocalImages();if(t.length===0)throw new Error('No local Docker images found. Please build an image first with "phala docker build"');let r=Array.from(new Set(t.map(o=>o.imageName))),{selectedImage:n}=await KS.prompt([{type:"list",name:"selectedImage",message:"Select an image to push:",choices:r}]);return n}async function HS(e,t){try{let r=await St();if(!r)throw new Error('Docker information not found. Please login first with "phala docker login"');let n=await GS(e.image);return await new He("",r.username,r.registry).pushImage(n)?(i.success(`Docker image ${n} pushed successfully`),0):(i.error("Failed to push Docker image"),1)}catch(r){return i.error("Failed to push Docker image"),i.logDetailedError(r),1}}var Vu=b({path:["docker","push"],meta:Fu,schema:ju,handler:HS});import Gu from"fs";import Hu from"path";import Wo from"inquirer";import{z as Bo}from"zod";var zu={name:"run",description:"Run a Docker Compose setup",stability:"unstable",options:[{name:"compose",shorthand:"c",description:"Path to docker-compose.yml file",type:"string",target:"compose"},{name:"env-file",shorthand:"e",description:"Path to environment variables file",type:"string",target:"envFile"},{name:"skip-env",description:"Skip env file prompt",type:"boolean",target:"skipEnv"}]},Ku=Bo.object({compose:Bo.string().optional(),envFile:Bo.string().optional(),skipEnv:Bo.boolean().default(!0)});async function qS(e){if(e)return We(e),e;let t=Hu.join(process.cwd(),"docker-compose.yml");if(Gu.existsSync(t)){let{useDefault:n}=await Wo.prompt([{type:"confirm",name:"useDefault",message:"Use docker-compose.yml in current directory?",default:!0}]);if(n)return t}let{composePath:r}=await Wo.prompt([{type:"input",name:"composePath",message:"Enter path to docker-compose.yml file:",validate:n=>{try{return We(n),!0}catch{return"File not found"}}}]);return r}async function BS(e,t){if(t)return e;if(e)return We(e),e;let r=Hu.join(process.cwd(),".env");if(Gu.existsSync(r)){let{useDefault:o}=await Wo.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);if(o)return r}let{envPath:n}=await Wo.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:o=>{try{return We(o),!0}catch{return`File not found: ${o}`}}}]);return n}async function WS(e,t){try{let r=await qS(e.compose),n=await BS(e.envFile,e.skipEnv),o=new He("");return n?(i.info(`Validating env file: ${n}`),We(n),i.info(`Running Docker Compose with compose file: ${r} and env file: ${n}`)):i.info(`Running Docker Compose with compose file: ${r} without env file`),await o.runComposeLocally(r,n)?(i.success("Docker Compose is running"),0):(i.error("Failed to run Docker Compose"),1)}catch(r){return i.error("Failed to run Docker Compose"),i.logDetailedError(r),1}}var qu=b({path:["docker","run"],meta:zu,schema:Ku,handler:WS});var YS={name:"docker",description:"Docker Hub login and image management",stability:"deprecated"},ZS=JS.object({});async function XS(e,t){return t.stdout.write(`Available docker subcommands: login, build, push, generate, run. Use 'phala docker <command> --help' for details.
267
- `),0}var QS=b({path:["docker"],meta:YS,schema:ZS,handler:XS}),Vs={group:vu,commands:[QS,Uu,$u,Vu,Mu,qu]};import Gs from"path";import Qu from"fs-extra";import vt from"chalk";import Ks from"inquirer";import Vr from"chalk";import ek from"open";import tk from"ora";import rk from"prompts";import{z as sr}from"zod";var Bu={name:"login",category:"profile",description:"Authenticate with Phala Cloud",stability:"stable",arguments:[{name:"api-key",description:"API key (triggers device flow if omitted)",required:!1,target:"apiKey"}],options:[{name:"manual",description:"Enter API key manually",type:"boolean"},{name:"no-open",description:"Skip browser launch",type:"boolean",target:"noOpen"},{name:"profile",description:"Profile name (defaults to workspace slug)",type:"string",target:"profile"},{name:"print-token",description:"Print token to stdout without saving",type:"boolean",target:"printToken"},{name:"url",description:"Custom API endpoint URL",type:"string",target:"url"}]},Wu=sr.object({apiKey:sr.string().min(1,"API key cannot be empty").optional(),manual:sr.boolean().optional(),noOpen:sr.boolean().optional(),profile:sr.string().min(1).optional(),printToken:sr.boolean().optional(),url:sr.string().url().optional()});function Ju(e){let{detail:t}=e;if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t;if(r.error&&typeof r.error=="string"&&!r.error_code)return{error:r.error,error_description:typeof r.error_description=="string"?r.error_description:void 0}}return null}function qt(e,t=""){e.write(`${t}
268
- `)}async function Jo(e){let t=await fo(e.apiKey,{baseURL:e.baseURL}),r=await Pe(t);if(!r.success||!r.data?.user.username)throw new Error("Invalid API key");return r.data}async function nk(e){let t,r=await rk({type:"password",name:"apiKey",message:"Enter your API key:",validate:async n=>{if(!n||n.trim().length===0)return"API key cannot be empty";try{return t=await Jo({apiKey:n,baseURL:e.baseURL}),!0}catch(o){return o instanceof Error?o.message:"Invalid API key"}}});if(!r.apiKey)throw new Error("API key input cancelled");return t||(t=await Jo({apiKey:r.apiKey,baseURL:e.baseURL})),{apiKey:r.apiKey,user:t}}async function ok(e,t){let r=Qe({useCookieAuth:!0,baseURL:t.baseURL}),n=await r.post("/auth/device/code",{client_id:"phala-cli",scope:"user:profile cvms:* nodes:*"}),{device_code:o,user_code:a,verification_uri_complete:s,interval:c,expires_in:l}=n,m=c,p=t.printToken?e.stderr:e.stdout;if(qt(p),qt(p,Vr.bold("To authenticate, visit:")),qt(p,Vr.cyan(s)),qt(p),qt(p,`${Vr.bold("And enter code:")} ${Vr.yellow(a)}`),qt(p),!t.noOpen)try{await ek(s),qt(p,"Opening browser automatically...")}catch{qt(p,"Could not open browser automatically. Please visit the URL above.")}let u=tk("Waiting for authorization...").start(),d=Date.now()+l*1e3;for(;Date.now()<d;){await new Promise(f=>setTimeout(f,m*1e3));try{let f=await r.post("/auth/device/token",{device_code:o,grant_type:"urn:ietf:params:oauth:grant-type:device_code"});return u.succeed("Authorization successful!"),f.access_token}catch(f){if(f instanceof en)throw u.stop(),new Error(Jn(f));if(f instanceof Wn){let g=Ju(f);if(g)switch(g.error){case"authorization_pending":continue;case"slow_down":m+=5;continue;case"expired_token":throw u.fail("Authorization expired"),new Error(g.error_description||"Device authorization expired. Please try again.");case"access_denied":throw u.fail("Authorization denied"),new Error(g.error_description||"You denied the authorization request.");default:throw u.fail("Authorization failed"),new Error(`Authorization failed: ${g.error_description||g.error}`)}}throw u.fail("Request failed"),f}}throw u.fail("Authorization timed out"),new Error("Authorization timed out. Please try again.")}async function Yo(e,t){try{if(e.printToken&&e.manual)throw new Error("--print-token is not compatible with --manual");let r=e.url||t.env.PHALA_CLOUD_API_PREFIX||gt,n,o;if(e.apiKey)n=e.apiKey,o=await Jo({apiKey:n,baseURL:r});else if(e.manual){let l=await nk({baseURL:r});n=l.apiKey,o=l.user}else n=await ok(t,{noOpen:e.noOpen,printToken:e.printToken,baseURL:r}),o=await Jo({apiKey:n,baseURL:r});if(!o)throw new Error("Failed to validate API key");if(e.printToken)return t.stdout.write(`${n}
269
- `),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,c=e.profile||s||"default";return Rr({profileName:c,token:n,apiPrefix:r,workspaceName:a,workspaceSlug:s,user:{username:o.user.username,email:o.user.email},setCurrent:!0}),t.stdout.write(Vr.green(`Welcome ${o.user.username}! Credentials saved successfully (profile: ${c})
270
- `)),0}catch(r){let n=r instanceof Error?r.message:String(r);return t.stderr.write(Vr.red(`Failed to authenticate: ${n}
271
- `)),1}}var Yu=b({path:["login"],meta:Bu,schema:Wu,handler:Yo});import{z as zs}from"zod";var ak={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Zu={name:"link",category:"manage",description:"Link a local directory to a CVM",stability:"unstable",arguments:[{name:"cvm-id",description:"CVM ID or name (interactive if omitted)",required:!1,target:"cvmId"}],options:[ak],examples:[{name:"Link by name or ID",value:"phala link my-cvm-name"},{name:"Link interactively",value:"phala link"}]},Xu=zs.object({cvmId:zs.string().optional(),json:zs.boolean().default(!1)});function sk(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function ed(){let e=["docker-compose.yml","docker-compose.yaml"];for(let t of e)if(Qu.existsSync(Gs.join(process.cwd(),t)))return t}function td(){let e=".env.production";if(Qu.existsSync(Gs.join(process.cwd(),e)))return e}async function rd(e){let t=ht(e).apiKey;if(!t){if(i.info(`Not authenticated. Starting login flow...
272
- `),await Yo({manual:!1,noOpen:!1},e)!==0||(t=ht(e).apiKey,!t))return null;console.log()}let r=await k(e),n=await Pe(r);if(!n.success){if(i.info(`API key expired or invalid. Starting login flow...
273
- `),await Yo({manual:!1,noOpen:!1},e)!==0||(t=ht(e).apiKey,!t))return null;let a=await k(e),s=await Pe(a);return s.success?(i.success(`Authenticated as ${s.data.user.username}`),console.log(),{apiKey:t,workspaceName:s.data.workspace.name||"default"}):null}return i.success(`Authenticated as ${n.data.user.username}`),console.log(),{apiKey:t,workspaceName:n.data.workspace.name||"default"}}function nd(e){let t={name:e.cvmName,profile:e.profile};e.composeFile&&(t.compose_file=e.composeFile),e.envFile&&(t.env_file=e.envFile),Pl(t),console.log(),console.log(vt.bold("Created phala.toml:")),console.log(vt.dim(` name = "${e.cvmName}"`)),console.log(vt.dim(` profile = "${e.profile}"`)),e.composeFile&&console.log(vt.dim(` compose_file = "${e.composeFile}"`)),e.envFile&&console.log(vt.dim(` env_file = "${e.envFile}"`)),console.log(),i.success("Project linked successfully!"),i.info('Run "phala deploy" to update your CVM.')}async function ik(e,t){try{return e.cvmId?await ck(e.cvmId,t):await lk(t)}catch(r){if(sk(r))return console.log(),i.info("Link cancelled."),0;throw r}}async function ck(e,t){let r=await rd(t);if(!r)return t.fail("Authentication failed."),1;let{workspaceName:n}=r,o=await k(t),a=await Q(o,{id:e});if(!a.success)return t.fail(`CVM not found: ${e}`),1;let c=a.data.name||e;if(i.success(`Found CVM: ${c}`),so()){let{overwrite:p}=await Ks.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!p)return i.info("Link cancelled."),0}let l=ed(),m=td();return(l||m)&&(console.log(),i.info("Detected local files:"),l&&console.log(vt.green(` \u2713 ${l}`)),m&&console.log(vt.green(` \u2713 ${m}`))),nd({cvmName:c,composeFile:l,envFile:m,profile:n}),0}async function lk(e){let t=await rd(e);if(!t)return e.fail("Authentication failed."),1;let{workspaceName:r}=t,n=i.startSpinner("Fetching your CVMs..."),o=await k(e),a=await tn(o);if(n.stop(!0),!a.success)return e.fail(`Failed to fetch CVMs: ${a.error.message}`),1;let c=a.data.items??[];if(c.length===0)return i.warn("You don't have any CVMs yet."),i.info('Deploy your first CVM with "phala deploy"'),0;let l=Gs.basename(process.cwd()),m=c.map(g=>{let h=g.hosted?.app_id||g.hosted?.id||"",v=g.name||g.hosted?.name||"Unnamed",w=g.status||g.hosted?.status||"Unknown";return{name:`${v} (${h}) - Status: ${w}`,value:v,cvmName:v}}),p=m.findIndex(g=>g.cvmName.toLowerCase()===l.toLowerCase());console.log(vt.bold(`Found ${c.length} CVM(s):
274
- `));let{selectedCvm:u}=await Ks.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM to link:",choices:m.map(g=>({name:g.name,value:g.value})),default:p>=0?p:0}]);if(so()){let{overwrite:g}=await Ks.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!g)return i.info("Link cancelled."),0}let d=ed(),f=td();return console.log(),(d||f)&&(i.info("Detected local files:"),d&&console.log(vt.green(` \u2713 ${d}`)),f&&console.log(vt.green(` \u2713 ${f}`)),console.log()),nd({cvmName:u,composeFile:d,envFile:f,profile:r}),0}var od=b({path:["link"],meta:Zu,schema:Xu,handler:ik});import{z as mk}from"zod";var ad={name:"logout",category:"profile",description:"Remove stored API key",stability:"stable"},sd=mk.object({});async function pk(e,t){try{let n=Ge()?.current_profile;return po(),i.success(n?`Credentials removed successfully (profile: ${n})`:"Credentials removed successfully"),0}catch(r){return i.error("Failed to remove credentials"),i.logDetailedError(r),1}}var id=b({path:["logout"],meta:ad,schema:sd,handler:pk});var cd={path:["kms"],meta:{name:"kms",category:"deploy",description:"Manage on-chain KMS contracts",stability:"unstable"}};import{z as ld}from"zod";var md={name:"list",aliases:["ls"],description:"List on-chain KMS contracts",stability:"unstable",options:[Ee],examples:[{name:"List on-chain KMS",value:"phala kms list"},{name:"Output as JSON",value:"phala kms list --json"}]},Hs=ld.object({json:ld.boolean().default(!1)});var uk={1:"ethereum",8453:"base",31337:"anvil"};async function pd(e,t){try{let r=await k(),n=await qa(r,{is_onchain:!0,page_size:100});if(!n.success)return t.fail(n.error.message),1;let o=n.data;if(e.json)return t.success(o),0;let a=new Map;for(let l of o.items){let m=`${l.kms_contract_address}:${l.chain_id}`;a.has(m)||a.set(m,{address:l.kms_contract_address??"-",chain:uk[l.chain_id??0]??`chain-${l.chain_id}`})}let s=["CHAIN","CONTRACT_ADDRESS"],c=[...a.values()].map(l=>({CHAIN:l.chain,CONTRACT_ADDRESS:l.address}));return c.length===0?(i.info("No on-chain KMS contracts found"),0):(ce(s,c),0)}catch(r){return i.logDetailedError(r),t.fail(`Failed to list KMS: ${r instanceof Error?r.message:String(r)}`),1}}var dk={name:"kms",description:"List and manage on-chain KMS contracts",stability:"unstable"},ud=b({path:["kms","list"],meta:md,schema:Hs,handler:pd}),dd=b({path:["kms"],meta:dk,schema:Hs,handler:pd});import{z as fd}from"zod";var qs=e=>({name:e,description:`Show on-chain KMS details for ${e}`,stability:"unstable",options:[Ee],examples:[{name:`Show ${e} KMS details`,value:`phala kms ${e}`},{name:"Output as JSON",value:`phala kms ${e} --json`}]}),Bs=fd.object({json:fd.boolean().default(!1)});function gd(e){return async function(r,n){try{let o=await k(),a=await ns(o,{chain:e});if(!a.success)return n.fail(a.error.message),1;let s=a.data;if(r.json)return n.success(s),0;if(s.contracts.length===0)return i.info(`No KMS contracts found on ${e}`),0;for(let c of s.contracts){if(i.info(`Contract: ${c.contract_address} (${c.chain_name})`),i.break(),c.devices.length>0){i.info("Devices:");let l=["DEVICE_ID","NODE"],m=c.devices.map(p=>({DEVICE_ID:p.device_id,NODE:typeof p.node_name=="string"&&p.node_name.length>0?p.node_name:"-"}));ce(l,m)}else i.info("Devices: none");if(i.break(),c.os_images.length>0){i.info("OS Images:");let l=["NAME","VERSION","OS_IMAGE_HASH"],m=c.os_images.map(p=>({NAME:p.name,VERSION:p.version,OS_IMAGE_HASH:p.os_image_hash??"-"}));ce(l,m)}else i.info("OS Images: none");i.break()}return 0}catch(o){return i.logDetailedError(o),n.fail(`Failed to get KMS details for ${e}: ${o instanceof Error?o.message:String(o)}`),1}}}var hd=b({path:["kms","ethereum"],meta:qs("ethereum"),schema:Bs,handler:gd("ethereum")}),yd=b({path:["kms","base"],meta:qs("base"),schema:Bs,handler:gd("base")});var Ws={group:cd,commands:[dd,ud,hd,yd]};var vd={path:["nodes"],meta:{name:"nodes",category:"deploy",description:"Manage TEE nodes",stability:"unstable"}};import{z as Zo}from"zod";var bd={name:"list",aliases:["ls"],description:"List workspace nodes",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},Ee],examples:[{name:"List nodes (page 1)",value:"phala nodes list"},{name:"List nodes (page 2)",value:"phala nodes list --page 2"},{name:"Output as JSON",value:"phala nodes list --json"}]},Js=Zo.object({page:Zo.coerce.number().int().min(1).default(1),pageSize:Zo.coerce.number().int().min(1).max(100).default(30),json:Zo.boolean().default(!1)});async function Cd(e,t){try{let r=await k(),n=await Pe(r);if(!n.success)return t.fail(n.error.message),1;let o=n.data.workspace.slug;if(!o)return t.fail("Workspace slug is not available. Please contact support."),1;let a=await pl(r,{teamSlug:o,page:e.page,pageSize:e.pageSize});if(!a.success)return t.fail(a.error.message),1;let s=a.data;if(e.json)return t.success(s),0;let c=["ID","NAME","REGION","PPID","DEVICE_ID","VERSION"],l=s.items.map(m=>({ID:m.id?.toString()??"-",NAME:m.name??"-",REGION:m.region??"-",PPID:m.ppid??"-",DEVICE_ID:m.device_id??"-",VERSION:m.version?.split(" ")[0]??"-"}));return l.length===0?(i.info("No nodes found"),0):(ce(c,l),i.info(`Page ${s.page}/${s.pages} (total ${s.total})`),0)}catch(r){return i.logDetailedError(r),t.fail(`Failed to list nodes: ${r instanceof Error?r.message:String(r)}`),1}}var fk={name:"nodes",description:"List and manage TEE nodes",stability:"unstable"},wd=b({path:["nodes","list"],meta:bd,schema:Js,handler:Cd}),_d=b({path:["nodes"],meta:fk,schema:Js,handler:Cd});var Ys={group:vd,commands:[_d,wd]};import{z as ir}from"zod";var Sd={name:"os-images",category:"deploy",description:"List available OS images",stability:"unstable",options:[{name:"dev",description:"Show only dev images",type:"boolean",target:"dev",group:"basic"},{name:"prod",description:"Show only prod images",type:"boolean",target:"prod",group:"basic"},{name:"page",description:"Page number (1-indexed)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Items per page (max 100)",type:"number",target:"pageSize",group:"basic"},{name:"all",description:"Fetch all pages",type:"boolean",target:"all",group:"basic"},Ee],examples:[{name:"List all OS images",value:"phala os-images"},{name:"List prod images only",value:"phala os-images --prod"},{name:"List page 2 with page size 20",value:"phala os-images --page 2 --page-size 20"},{name:"Fetch all pages",value:"phala os-images --all"},{name:"Output as JSON",value:"phala os-images --json"}]},kd=ir.object({dev:ir.boolean().default(!1),prod:ir.boolean().default(!1),page:ir.number().int().min(1).default(1),pageSize:ir.number().int().min(1).max(100).default(100),all:ir.boolean().default(!1),json:ir.boolean().default(!1)});async function gk(e,t){try{let r=await k(),n=e.dev?!0:e.prod?!1:void 0,o=async m=>await rs(r,{page:m,page_size:e.pageSize,is_dev:n}),a=await o(e.page);if(!a.success)return t.fail(a.error.message),1;let s=a.data;if(e.all&&s.pages>s.page){let m=[...s.items];for(let p=s.page+1;p<=s.pages;p++){let u=await o(p);if(!u.success)return t.fail(u.error.message),1;m.push(...u.data.items)}s={...s,items:m,page_size:m.length,page:1,pages:1}}if(e.json)return t.success(s),0;let c=["NAME","VERSION","OS_IMAGE_HASH","DEV","GPU"],l=s.items.map(m=>({NAME:m.name,VERSION:m.version,OS_IMAGE_HASH:m.os_image_hash??"-",DEV:m.is_dev?"yes":"no",GPU:m.requires_gpu?"yes":"no"}));return l.length===0?(i.info("No OS images found"),0):(ce(c,l),i.info(`Total: ${s.total}`),0)}catch(r){return i.logDetailedError(r),t.fail(`Failed to list OS images: ${r instanceof Error?r.message:String(r)}`),1}}var Ed=b({path:["os-images"],meta:Sd,schema:kd,handler:gk});import{z as bk}from"zod";var Id={path:["simulator"],meta:{name:"simulator",category:"manage",description:"TEE simulator commands",stability:"unstable"}};import{z as Zs}from"zod";var Ad={name:"start",description:"Start the TEE simulator",stability:"unstable",options:[{name:"port",shorthand:"p",description:"Simulator port (default: 8090)",type:"string",target:"port"},{name:"verbose",shorthand:"v",description:"Enable verbose output",type:"boolean",target:"verbose"}]},xd=Zs.object({port:Zs.string().default("8090"),verbose:Zs.boolean().default(!1)});async function hk(e,t){try{return ap()||await sp(),await Sn()?(i.success("TEE simulator is already running"),0):(await ip({verbose:e.verbose}),i.success("TEE simulator started successfully"),0)}catch(r){return i.error("Failed to start TEE simulator"),i.logDetailedError(r),1}}var Pd=b({path:["simulator","start"],meta:Ad,schema:xd,handler:hk});import{z as yk}from"zod";var $d={name:"stop",description:"Stop the TEE simulator",stability:"unstable"},Dd=yk.object({});async function vk(e,t){try{return await cp()?(i.success("TEE simulator stopped successfully"),0):(i.error("Failed to stop TEE simulator"),1)}catch(r){return i.error("Failed to stop TEE simulator"),i.logDetailedError(r),1}}var Rd=b({path:["simulator","stop"],meta:$d,schema:Dd,handler:vk});var Ck={name:"simulator",description:"TEE simulator commands",stability:"unstable"},wk=bk.object({});async function _k(e,t){try{let r=await Sn(),n=Po();if(r&&n){let a=$s(),s=a.replace(/dstack\.sock$/,"tappd.sock");t.stdout.write(`\u2713 TEE simulator is running (PID: ${n})\\n`),t.stdout.write(`
333
+ CVM ID: ${S.vm_uuid}
334
+ Name: ${S.name}
335
+ App ID: ${S.app_id}
336
+ Dashboard URL: ${se}/dashboard/cvms/${S.vm_uuid}
337
+ `;o.write(`${k}
338
+ `)}},d0=async(e,t,n,r,o,a,s)=>{let i=await G(r,{id:e.uuid});if(!i.success)throw c.logDetailedError(i.error,"Get CVM Info"),new Error(`Failed to get cvm info: ${i.error.message}`);let l=i.data,p;if(n&&n.length>0)if(l.kms_info?.chain_id){let u=l.kms_info?.slug||l.kms_info?.id;if(!u)throw new Error("KMS slug or id is required for decentralized KMS");let h=await Qn(r,{app_id:l.app_id,kms:u});if(!h.success)throw c.logDetailedError(h.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get app env encrypt pubkey: ${h.error.message}`);let g=h.data;p=await(0,Ie.encryptEnvVars)(n,g.public_key)}else{if(!l.encrypted_env_pubkey)throw new Error("CVM encrypted_env_pubkey is required for centralized KMS");p=await(0,Ie.encryptEnvVars)(n,l.encrypted_env_pubkey)}let m={id:e.uuid,docker_compose_file:t};s&&(m.pre_launch_script=s),n&&n.length>0&&(m.allowed_envs=n.map(u=>u.key)),p&&(m.encrypted_env=p),e.publicLogs!==void 0&&(m.public_logs=e.publicLogs),e.publicSysinfo!==void 0&&(m.public_sysinfo=e.publicSysinfo),e.prepareOnly&&(m.prepareOnly=!0),c.info(`Updating CVM ${e.uuid}...`);let d=await Ql(r,m);if(!d.success){let u=Yd(d.error,e);throw c.error("Error updating CVM:",u),d.error}let f=d.data;if(e.prepareOnly&&!f.requiresOnChainHash){let u="--prepare-only has no effect on this CVM: it does not use on-chain KMS. The update was applied directly.";e.json!==!1?o.write(`${JSON.stringify({success:!0,prepare_only:!1,message:u},null,2)}
339
+ `):c.warn(u);return}if(f.requiresOnChainHash){if(e.prepareOnly){let w=f.kmsInfo?.chain_id,S=f.kmsInfo?.chain,k=l.app_id,_=S?.blockExplorers?.default?.url,I=_&&k?`${_}/address/${k.startsWith("0x")?k:`0x${k}`}`:void 0,$=f.composeHash.startsWith("0x")?f.composeHash:`0x${f.composeHash}`,M=f.onchainStatus,U={success:!0,prepare_only:!0,compose_hash:$,app_id:l.app_id,device_id:f.deviceId,kms_info:f.kmsInfo,chain_id:w,contract_explorer_url:I,onchain_status:M,commit_token:f.commitToken,commit_url:f.commitUrl,api_commit_url:f.apiCommitUrl};if(e.json!==!1)o.write(`${JSON.stringify(U,null,2)}
340
+ `);else{let z=["CVM update prepared successfully (pending on-chain approval).","",`Compose Hash: ${$}`,`App ID: ${l.app_id}`,`Device ID: ${f.deviceId}`];if(w&&z.push(`Chain: ${S?.name||"Unknown"} (ID: ${w})`),I&&z.push(`Contract: ${I}`),z.push(`Commit Token: ${f.commitToken||"N/A"}`,`Commit URL: ${f.commitUrl||"N/A"}`,`API Commit URL: ${f.apiCommitUrl||"N/A"} (POST)`),M){let re=M.compose_hash_allowed?"registered":"NOT registered",ae=M.device_id_allowed?"registered":"NOT registered";z.push("","On-chain Status:",` Compose Hash: ${re}`,` Device ID: ${ae}`),M.is_allowed&&z.push(" All prerequisites met. You can commit with --transaction-hash already-registered.")}z.push("","To complete the update after on-chain approval:",` phala deploy --cvm-id ${e.uuid} \\`," --commit \\",` --token ${f.commitToken||"<token>"} \\`,` --compose-hash ${$} \\`," --transaction-hash <tx-hash>"),o.write(`${z.join(`
341
+ `)}
342
+ `)}return}if(!e.privateKey)throw new Error("Private key is required for contract DstackApp");e.debug&&(console.log("[DEBUG] patchCvm.composeHash:",f.composeHash),console.log("[DEBUG] cvm.app_id:",l.app_id),console.log("[DEBUG] patchCvm.deviceId:",f.deviceId));let u=await bn({chain:l.kms_info?.chain,rpcUrl:e.rpcUrl,appAddress:l.app_id,deviceId:f.deviceId,composeHash:f.composeHash});if(!u.success){let w=u.error;throw new Error(`Failed to check on-chain prerequisites (contract: ${l.app_id}): ${w.message}`)}if(e.debug&&console.log("[DEBUG] prereqs:",u.data),!u.data.deviceAllowed){c.info("Device not registered on-chain, adding...");let w=await rn({chain:l.kms_info?.chain,rpcUrl:e.rpcUrl,appAddress:l.app_id,deviceId:f.deviceId,privateKey:e.privateKey});if(!w.success){let S=w.error;throw new Error(`Failed to register device on-chain (device: ${f.deviceId.slice(0,10)}...): ${S.message}`)}}let h=await nn({chain:l.kms_info?.chain,rpcUrl:e.rpcUrl,appId:l.app_id,composeHash:f.composeHash,privateKey:e.privateKey});if(!h.success){let w=h.error;throw new Error(`Failed to register compose hash on-chain (hash: ${f.composeHash.slice(0,10)}...): ${w.message}`)}let y=h.data.transactionHash;e.debug&&console.log("[DEBUG] transactionHash:",y);let b=await em(r,{id:e.uuid,composeHash:f.composeHash,transactionHash:y});if(!b.success){let w=b.error.message,S="status"in b.error?b.error.status:void 0;throw S===466?new Error("Compose hash expired. Please retry the update from the beginning."):S===467?new Error(`Transaction verification failed on backend. Hash: ${y}`):S===468?new Error(`Compose hash not found on-chain. Contract: ${l.app_id}`):new Error(`Failed to confirm CVM update after on-chain registration: ${w}`)}}if(e.wait){c.info("Waiting for update to complete...");try{await ua(e.uuid,3e5,a)}catch(u){throw c.logDetailedError(u,"Wait for CVM Ready"),new Error(`Wait failed: ${u instanceof Error?u.message:String(u)}`)}}e?.json!==!1?o.write(`${JSON.stringify({success:!0,vm_uuid:e.uuid,name:l.name,app_id:l.app_id,dashboard_url:`${se}/dashboard/cvms/${e.uuid}`},null,2)}
343
+ `):o.write(`CVM updated successfully!
344
+ `)},u0=async(e,t,n)=>{if(!e.token)throw new Error("--token is required for --commit mode");if(!e.uuid)throw new Error("--cvm-id is required for --commit mode");e.transactionHash||c.info("No --transaction-hash provided, using 'already-registered' (state-only check)"),c.info(`Committing CVM update for ${e.uuid}...`);let r=await tm(t,{id:e.uuid,token:e.token,composeHash:e.composeHash||"",transactionHash:e.transactionHash||""});if(!r.success){let o=r.error instanceof Error?r.error.message:String(r.error),s=o.includes("expired")||o.includes("Invalid")?" Run --prepare-only again to get a new commit token.":"";throw new Error(`Failed to commit CVM update: ${o}${s}`)}e.json!==!1?n.write(`${JSON.stringify({success:!0,vm_uuid:e.uuid,correlation_id:r.data.correlationId,status:r.data.status},null,2)}
345
+ `):n.write(`CVM update committed successfully! Correlation ID: ${r.data.correlationId}
346
+ `)};async function Xd(e,t){try{if(e.commit){let u=_t(t,{apiToken:e.apiToken}),h=rt({apiKey:u.apiKey,baseURL:u.baseURL,version:fi}),g=t.cvmId?H.parse(t.cvmId).cvmId:void 0;await u0({...e,uuid:g},h,t.stdout);return}let n=e.compose||t.projectConfig.compose_file,r=await r0({context:t,apiToken:e.apiToken,interactive:e.interactive}),o=await o0({dockerComposePath:n,interactive:e.interactive}),a;if(e.preLaunchScript){if(!pt.existsSync(e.preLaunchScript))throw new Error(`Pre-launch script file not found: ${e.preLaunchScript}`);a=pt.readFileSync(e.preLaunchScript,"utf8")}let s=Buffer.byteLength(o,"utf8"),i=a?Buffer.byteLength(a,"utf8"):0,l=s+i;if(l>Mr){let u=Mr/1024,h=Math.ceil(l/1024);throw new Error(`Combined size of docker compose file and pre-launch script is too large (${h}KB). Maximum allowed size is ${u}KB.`)}let p={...e,env:e.env&&e.env.length>0?e.env:t.projectConfig.env_file?[t.projectConfig.env_file]:void 0,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},m=await i0(p);e.debug&&(console.log("[DEBUG] context.cvmId:",JSON.stringify(t.cvmId)),console.log("[DEBUG] input.cvmId:",e.cvmId));let d=t.cvmId?H.parse(t.cvmId).cvmId:void 0;e.debug&&(console.log("[DEBUG] resolved uuid:",d),console.log("[DEBUG] isUpdate:",!!d)),!!d?await d0({...e,uuid:d},o,m,r,t.stdout,t,a):await p0(e,o,m??[],r,t.stdout,t.stderr,t.projectConfig,a)}catch(n){throw e.json!==!1?t.stderr.write(`${JSON.stringify({success:!1,error:n instanceof Error?n.message:String(n),stack:e.debug&&n instanceof Error?n.stack:void 0},null,2)}
347
+ `):t.stderr.write(`${ya`${n instanceof Error?n.message:String(n)}`}
348
+ `),n}}async function f0(e,t){try{return await Xd(e,t),0}catch{return 1}}var Qd=C({path:["deploy"],meta:Kd,schema:Gd,handler:f0});var eu={path:["envs"],meta:{name:"envs",category:"manage",description:"Encrypt and update CVM sealed environment variables",stability:"stable"}};import tu from"fs";import g0 from"path";function Ca(e){let t=ga(e),n=[];for(let r of t.files){let o=g0.resolve(r);if(!tu.existsSync(o))throw new Error(`Environment file not found: ${r}`);let a=tu.readFileSync(o,"utf8"),s=rr(a);n.push(...s)}return n.push(...t.keyValues),ha(n)}import{z as gr}from"zod";var nu={name:"encrypt",description:"Encrypt environment variables for a CVM (sealed, only readable inside TEE)",stability:"stable",arguments:[Y],options:[O,{name:"env",shorthand:"e",description:"Environment variable (KEY=VALUE) or env file path (repeatable)",type:"string[]",target:"env",group:"basic"},{name:"no-newline",shorthand:"n",description:"Do not print trailing newline (useful for piping)",type:"boolean",target:"noNewline",group:"basic"}],examples:[{name:"Encrypt inline variables",value:"phala envs encrypt app_abc123 -e SECRET=value -e API_KEY=xxx"},{name:"Encrypt from env file",value:"phala envs encrypt app_abc123 -e .env"},{name:"Encrypt with CVM from phala.toml",value:"phala envs encrypt -e .env.production"},{name:"Pipe to file for later use",value:"phala envs encrypt app_abc123 -e .env > encrypted.hex"},{name:"Pipe without trailing newline",value:"phala envs encrypt app_abc123 -n -e .env | some-tool"}]},ru=gr.object({cvmId:gr.string().optional(),env:gr.array(gr.string()).min(1,"At least one -e argument is required"),noNewline:gr.boolean().default(!1),interactive:gr.boolean().default(!1)});async function h0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Pass a CVM identifier or set it in phala.toml."),1;try{let n=Ca(e.env);if(n.length===0)return t.fail("No environment variables found in the provided inputs."),1;let r=await E(t),o=await G(r,t.cvmId);if(!o.success)return t.fail(o.error.message),1;let a=o.data,s=await mn(r,a),i=await(0,Ie.encryptEnvVars)(n,s);return process.stdout.write(e.noNewline?i:`${i}
349
+ `),0}catch(n){return t.fail(n instanceof Error?n.message:String(n)),1}}var ou=C({path:["envs","encrypt"],meta:nu,schema:ru,handler:h0});import{z as dn}from"zod";var au={name:"update",description:"Encrypt and push sealed environment variables to a CVM (only readable inside TEE)",stability:"stable",arguments:[Y],options:[O,{name:"env",shorthand:"e",description:"Environment variable (KEY=VALUE) or env file path (repeatable)",type:"string[]",target:"env",group:"basic"},{name:"encrypted-env",description:"Pre-encrypted environment variables as hex string (from 'phala envs encrypt')",type:"string",target:"encryptedEnv",group:"basic"},Ze,Ge],examples:[{name:"Update with inline variables",value:"phala envs update app_abc123 -e SECRET=newvalue -e API_KEY=xxx"},{name:"Update from env file",value:"phala envs update app_abc123 -e .env.production"},{name:"Update with CVM from phala.toml",value:"phala envs update -e .env"},{name:"Update with pre-encrypted hex (from 'phala envs encrypt')",value:"phala envs update app_abc123 --encrypted-env $(phala envs encrypt app_abc123 -e .env)"},{name:"Update with on-chain KMS",value:"phala envs update app_abc123 -e .env --private-key <key>"}]},su=dn.object({cvmId:dn.string().optional(),env:dn.array(dn.string()).optional(),encryptedEnv:dn.string().optional(),privateKey:dn.string().optional(),rpcUrl:dn.string().optional(),interactive:dn.boolean().default(!1)});async function y0(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};if(!t.cvmId)return t.fail("No CVM ID provided. Pass a CVM identifier or set it in phala.toml."),1;let r=n.env&&n.env.length>0,o=!!n.encryptedEnv;if(!r&&!o)return t.fail("Provide either -e (environment variables) or --encrypted-env (pre-encrypted hex)."),1;if(r&&o)return t.fail("Cannot use both -e and --encrypted-env at the same time."),1;try{let a=await E(t),s=await G(a,t.cvmId);if(!s.success)return t.fail(s.error.message),1;let i=s.data,l,p;if(r&&n.env){let f=Ca(n.env);if(f.length===0)return t.fail("No environment variables found in the provided inputs."),1;p=f.map(h=>h.key);let u=await mn(a,i);l=await(0,Ie.encryptEnvVars)(f,u)}else if(n.encryptedEnv)l=n.encryptedEnv;else return t.fail("No environment input provided."),1;c.info("Updating environment variables...");let m=await xo(a,{id:i.id,encrypted_env:l,env_keys:p});if(!m.success)return t.fail(m.error.message),1;let d=m.data;if(d.status==="in_progress")return c.success(`Environment update initiated (correlation_id: ${d.correlation_id})`),0;if(d.status==="precondition_required"){let f=n.privateKey||process.env.PRIVATE_KEY;if(!f)return t.fail("On-chain KMS requires a private key. Use --private-key or set PRIVATE_KEY env var."),1;c.info("Environment key list changed \u2014 registering compose hash on-chain...");let u=d.kms_info.chain;if(!u)return t.fail(`Unsupported chain_id ${d.kms_info.chain_id} \u2014 update @phala/cloud to add support.`),1;let h=await nn({chain:u,rpcUrl:n.rpcUrl,appId:d.app_id,composeHash:d.compose_hash,privateKey:f});if(!h.success)return c.logDetailedError(h,"Add Compose Hash"),t.fail("Failed to register compose hash on-chain."),1;let g=h.data;c.info("Completing environment update...");let y=await xo(a,{id:i.id,encrypted_env:l,env_keys:p,compose_hash:d.compose_hash,transaction_hash:g.transactionHash});return y.success?y.data.status==="in_progress"?(c.success(`Environment update initiated (correlation_id: ${y.data.correlation_id})`),0):(t.fail("Unexpected response after on-chain verification."),1):(t.fail(y.error.message),1)}return t.fail(`Unexpected response status: ${d.status}`),1}catch(a){return t.fail(a instanceof Error?a.message:String(a)),1}}var iu=C({path:["envs","update"],meta:au,schema:su,handler:y0});var gi={group:eu,commands:[ou,iu]};import{z as H0}from"zod";var cu={path:["docker"],meta:{name:"docker",description:"Docker Hub login and image management",stability:"deprecated"}};import $0 from"fs";import vu from"path";import Cu from"inquirer";import{exec as k0,spawn as S0}from"child_process";import Kt from"fs";import uu from"os";import ro from"path";import{promisify as E0}from"util";import{execa as I0}from"execa";import A0 from"handlebars";import{INVALID as v0,ParseStatus as C0,ZodIssueCode as hr,ZodParsedType as lu,ZodType as b0,addIssueToContext as yr,z as mu}from"zod";var w0="ZodDecimal",_0=/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/,pu=class e extends b0{constructor(){super(...arguments);this.max=this.lte;this.min=this.gte}_parse(n){if(n.data!==null&&typeof n.data=="object"&&"toNumber"in n.data&&(n.data=n.data.toNumber()),this._def.coerce&&(n.data=Number(n.data)),this._getType(n)!==lu.number){let s=this._getOrReturnCtx(n);return yr(s,{code:hr.invalid_type,expected:lu.number,received:s.parsedType}),v0}let o,a=new C0;for(let s of this._def.checks)if(s.kind==="precision"){let i=n.data.toString().match(_0);Math.max((i[1]?i[1].length:0)-(i[2]?Number.parseInt(i[2],10):0),0)>s.value&&(o=this._getOrReturnCtx(n,o),yr(o,{code:hr.custom,message:s.message,params:{precision:s.value}}),a.dirty())}else s.kind==="wholeNumber"?n.data.toString().split(".")[0].length>s.value&&(o=this._getOrReturnCtx(n,o),yr(o,{code:hr.custom,message:s.message,params:{wholeNumber:s.value}}),a.dirty()):s.kind==="min"?(s.inclusive?n.data<s.value:n.data<=s.value)&&(o=this._getOrReturnCtx(n,o),yr(o,{code:hr.too_small,minimum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="max"?(s.inclusive?n.data>s.value:n.data>=s.value)&&(o=this._getOrReturnCtx(n,o),yr(o,{code:hr.too_big,maximum:s.value,type:"number",inclusive:s.inclusive,exact:!1,message:s.message}),a.dirty()):s.kind==="finite"&&(Number.isFinite(n.data)||(o=this._getOrReturnCtx(n,o),yr(o,{code:hr.not_finite,message:s.message}),a.dirty()));return{status:a.value,value:n.data}}static{this.create=n=>new e({checks:[],typeName:w0,coerce:n?.coerce??!1})}setLimit(n,r,o,a){return new e({...this._def,checks:[...this._def.checks,{kind:n,value:r,inclusive:o,message:a}]})}_addCheck(n){return new e({...this._def,checks:[...this._def.checks,n]})}lte(n,r){return this.setLimit("max",n,!0,r)}lt(n,r){return this.setLimit("max",n,!1,r)}gt(n,r){return this.setLimit("min",n,!1,r)}gte(n,r){return this.setLimit("min",n,!0,r)}precision(n,r){return this._addCheck({kind:"precision",value:n,message:r})}wholeNumber(n,r){return this._addCheck({kind:"wholeNumber",value:n,message:r})}get minValue(){let n=null;for(let r of this._def.checks)r.kind==="min"&&(n===null||r.value>n)&&(n=r.value);return n}get maxValue(){let n=null;for(let r of this._def.checks)r.kind==="max"&&(n===null||r.value<n)&&(n=r.value);return n}positive(n){return this._addCheck({kind:"min",value:0,inclusive:!1,message:n})}negative(n){return this._addCheck({kind:"max",value:0,inclusive:!1,message:n})}nonpositive(n){return this._addCheck({kind:"max",value:0,inclusive:!0,message:n})}nonnegative(n){return this._addCheck({kind:"min",value:0,inclusive:!0,message:n})}finite(n){return this._addCheck({kind:"finite",message:n})}safe(n){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:n})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:n})}get isFinite(){let n=null,r=null;for(let o of this._def.checks){if(o.kind==="finite")return!0;o.kind==="min"?(r===null||o.value>r)&&(r=o.value):o.kind==="max"&&(n===null||o.value<n)&&(n=o.value)}return Number.isFinite(r)&&Number.isFinite(n)}},du=mu.object({template:mu.string().min(1,"Template cannot be empty")});var oo=E0(k0),fu=".phala-cloud/logs",P0=".phala-cloud/compose",gu=10,Xe=class{constructor(t,n,r){this.image=t,this.username=n||"",this.registry=r||""}ensureLogsDir(){let t=ro.resolve(fu);Kt.existsSync(t)||Kt.mkdirSync(t,{recursive:!0})}getLogFilePath(t,n){let r=new Date().toISOString().replace(/[:.]/g,"-");return ro.resolve(fu,`${n||this.image}-${t}-${r}.log`)}getSystemArchitecture(){let t=uu.arch();switch(t){case"arm":case"arm64":return"arm64";case"x64":return"amd64";default:return t}}spawnProcess(t,n,r,o){return new Promise((a,s)=>{let i=S0(t,n);this.ensureLogsDir();let l=this.getLogFilePath(r,o),p=Kt.createWriteStream(l,{flags:"a"}),m=[],d=(f,u=!1)=>{let h=f.toString().split(`
350
+ `);p.write(f);for(let g of h)if(g.trim()){m.push(g),m.length>gu&&m.shift(),console.clear(),console.log(`Latest ${gu} lines (full log at ${l}):`),console.log("-".repeat(50));for(let y of m)u?console.error(y):console.log(y)}};i.stdout.on("data",f=>d(f)),i.stderr.on("data",f=>d(f,!0)),i.on("close",f=>{p.end(),f===0?(console.log(`
351
+ Operation completed. Full log available at: ${l}`),a()):s(new Error(`Process exited with code ${f}. Check log file: ${l}`))}),i.on("error",f=>{p.end(),s(f)})})}setCredentials(t,n){this.username=t,n&&(this.registry=n)}async buildImage(t,n){try{let r=this.getSystemArchitecture(),o=`${this.username}/${this.image}:${n}`,a=c.startSpinner(`Building Docker image ${this.username}/${this.image}:${n}`);ot(t);let s=["build","-t",o,"-f",t];return r==="arm64"&&(console.log("Detected arm64 architecture, using --platform linux/amd64"),s.push("--platform","linux/amd64")),s.push("."),await this.spawnProcess("docker",s,"build",this.image),a.stop(!0,`Docker image ${o} built successfully`),!0}catch(r){return c.error(`Failed to build Docker image: ${r instanceof Error?r.message:String(r)}`),!1}}async pushImage(t){try{let n=c.startSpinner(`Pushing Docker image ${t} to Docker Hub`);if(!await Nt())throw n.stop(!1),new Error('Docker credentials not found. Please log in first with "phala docker login"');let o=t;return console.log(`Pushing image ${o} to Docker Hub...`),await this.spawnProcess("docker",["push",o],"push",t.replace(/.*\/+([\w-]+):.*$/g,"$1")),n.stop(!0,`Docker image ${o} pushed successfully`),!0}catch(n){return c.error(`Failed to push Docker image: ${n instanceof Error?n.message:String(n)}`),!1}}async login(t,n,r){try{let o=c.startSpinner(`Logging in to Docker Hub as ${t}`);if(await this.checkLogin())return o.stop(!0,"Already logged in to Docker Hub"),this.setCredentials(t,r),!0;if(!n)throw o.stop(!1),new Error("Password is required for Docker login");try{await I0("docker",["login",...r?[r]:[],"-u",t,"--password-stdin"],{input:n,timeout:1e4})}catch(s){throw s.timedOut?(o.stop(!1),new Error("Docker login timed out. Please check your credentials and try again.")):s}return o.stop(!0,"Logged in to Docker Hub successfully"),this.setCredentials(t,r),!0}catch(o){return c.error(`Failed to login to Docker Hub: ${o instanceof Error?o.message:String(o)}`),!1}}async checkLogin(){try{let t=uu.homedir(),n=ro.join(t,".docker","config.json");if(!Kt.existsSync(n))return!1;let r=JSON.parse(Kt.readFileSync(n,"utf-8"));return!!(r?.auths&&Object.keys(r.auths).length>0)}catch(t){return c.debug(`Docker login check failed: ${t instanceof Error?t.message:String(t)}`),!1}}async buildComposeFile(t,n,r){if(!this.username)throw new Error("Docker Hub username is required for building compose file");let o=r==="eliza"?hp:yp,a=du.parse({template:o}),s=ro.resolve(P0);Kt.existsSync(s)||(c.info(`Creating directory: ${s}`),Kt.mkdirSync(s,{recursive:!0}));let i=[];n&&(i=Kt.readFileSync(n,"utf-8").split(`
352
+ `).filter(u=>u&&!u.startsWith("#")).map(u=>{let h=u.indexOf("#");return h>0?u.substring(0,h).trim():u.trim()}).filter(u=>u.includes("=")).map(u=>{let[h,g]=u.split("=",2),y=h.trim();return(g?g.trim():"")===""?null:`${y}=${y}`}).filter(Boolean));let l=t,m=A0.compile(a.template,{noEscape:!0})({imageName:l,envVars:i.map(f=>f.replace(/=.*/,`=\${${f.split("=")[0]}}`))}),d=ro.join(s,`${t.replace(/.*\/+([\w-]+):.*$/g,"$1")}-tee-compose.yaml`);return Kt.writeFileSync(d,m),c.success(`Backup of docker compose file created at: ${d}`),d}async runComposeLocally(t,n){try{let r=c.startSpinner(`Running Docker Compose file at ${t}`);ot(t);let o=["-f",t,"up","-d"];return n&&(ot(n),o.splice(2,0,"--env-file",n)),await oo(`docker compose ${o.join(" ")}`),r.stop(!0,"Docker Compose file running successfully"),!0}catch(r){return c.error(`Failed to run Docker Compose file: ${r instanceof Error?r.message:String(r)}`),!1}}async runSimulator(t,n){try{c.info(`Running TEE simulator with image ${t}`),c.info("Pulling latest simulator image..."),await oo(`docker pull ${t}`),c.info("Starting simulator in background...");let{stdout:r}=await oo(`docker run -d --name tee-simulator --rm -p ${n}:${n} ${t}`),o=r.trim();return c.success(`TEE simulator running successfully. Container ID: ${o}`),c.break(),c.break(),c.info("Useful commands:"),c.info(`- View logs: docker logs -f ${o}`),c.info(`- Stop simulator: docker stop ${o}`),oi(`http://localhost:${n}`),!0}catch(r){return c.error(`Failed to run TEE simulator: ${r instanceof Error?r.message:String(r)}`),!1}}async stopSimulator(){try{let t=c.startSpinner("Stopping TEE simulator...");return await oo("docker stop tee-simulator"),await An(),t.stop(!0,"TEE simulator stopped successfully"),!0}catch(t){return c.error(`Failed to stop TEE simulator: ${t instanceof Error?t.message:String(t)}`),!1}}static async listLocalImages(){try{let{stdout:t}=await oo('docker images --format "{{.Repository}}:{{.Tag}}"'),r=(await Nt())?.username;return t.split(`
353
+ `).filter(a=>a&&!a.includes("<none>")).filter(a=>a.includes(`${r}/`)).map(a=>({imageName:a}))}catch(t){return c.error(`Failed to list local Docker images: ${t instanceof Error?t.message:String(t)}`),[]}}};import{z as ba}from"zod";var hu={name:"build",description:"Build a Docker image",stability:"unstable",options:[{name:"image",shorthand:"i",description:"Image name",type:"string",target:"image"},{name:"tag",shorthand:"t",description:"Image tag",type:"string",target:"tag"},{name:"file",shorthand:"f",description:"Path to Dockerfile",type:"string",target:"file"}],examples:[{name:"Build docker image with prompts",value:"phala docker build"},{name:"Build docker image with options",value:"phala docker build --image myapp --tag latest"}]},yu=ba.object({image:ba.string().optional(),tag:ba.string().optional(),file:ba.string().default("Dockerfile")});async function R0(e,t){try{let n=await Nt();if(!n)return c.error('Docker information not found. Please login first with "phala docker login"'),1;let r=e.image;r||(r=(await Cu.prompt([{type:"input",name:"image",message:"Enter the Docker image name:",validate:p=>p.trim()?!0:"Image name is required"}])).image);let o=e.tag;o||(o=(await Cu.prompt([{type:"input",name:"tag",message:"Enter the Docker image tag:",default:"latest",validate:p=>p.trim()?!0:"Tag is required"}])).tag);let a=vu.resolve(process.cwd(),e.file);if(!$0.existsSync(a)){c.info(`Default Dockerfile not found at ${a}`);let l=await jt("Enter the path to your Dockerfile:","Dockerfile","file");a=vu.resolve(process.cwd(),l)}return await new Xe(r,n.username,n.registry).buildImage(a,o)?(c.success(`Docker image ${n.username}/${r}:${o} built successfully`),0):(c.error("Failed to build Docker image"),1)}catch(n){return c.error("Failed to build Docker image"),c.logDetailedError(n),1}}var bu=C({path:["docker","build"],meta:hu,schema:yu,handler:R0});import so from"fs";import wa from"path";import io from"inquirer";import{z as ao}from"zod";var wu={name:"generate",description:"Generate a Docker Compose file",stability:"unstable",options:[{name:"image",shorthand:"i",description:"Docker image name (e.g. phala/phala-cloud)",type:"string",target:"image"},{name:"env-file",shorthand:"e",description:"Path to env file",type:"string",target:"envFile"},{name:"output",shorthand:"o",description:"Output path for docker-compose.yml",type:"string",target:"output"},{name:"template",description:"Template for docker-compose.yml",type:"string",target:"template"}]},_u=ao.object({image:ao.string().optional(),envFile:ao.string().optional(),output:ao.string().optional(),template:ao.string().optional()});async function x0(e){if(e)return e;let t=await Xe.listLocalImages();if(t.length===0)throw new Error('No local Docker images found. Please build an image first with "phala docker build"');let n=Array.from(new Set(t.map(o=>o.imageName))),{selectedImage:r}=await io.prompt([{type:"list",name:"selectedImage",message:"Select an image to use in the compose file:",choices:n}]);return r}async function D0(e){if(e)return ot(e),e;let t=wa.join(process.cwd(),".env");if(so.existsSync(t)){let{useDefault:r}=await io.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);if(r)return t}let{envPath:n}=await io.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:r=>{try{return ot(r),!0}catch{return`File not found: ${r}`}}}]);return n}async function T0(e){let t=e??wa.join(process.cwd(),"docker-compose.yml");if(so.existsSync(t)){let{confirmOverwrite:r}=await io.prompt([{type:"confirm",name:"confirmOverwrite",message:`File ${t} already exists. Overwrite?`,default:!1}]);if(!r){let{customPath:o}=await io.prompt([{type:"input",name:"customPath",message:"Enter alternative output path:",default:wa.join(process.cwd(),"docker-generated-compose.yml")}]);t=o}}let n=wa.dirname(t);return so.existsSync(n)||(c.info(`Creating directory: ${n}`),so.mkdirSync(n,{recursive:!0})),t}async function M0(e,t){try{let n=await Nt();if(!n||!n.username)throw new Error('Docker Hub username not found. Please login first with "phala docker login"');let r=await x0(e.image),o=await D0(e.envFile),a=await T0(e.output);o?c.info(`Generating Docker Compose file for ${r} using env file: ${o}`):c.info(`Generating Docker Compose file for ${r} without env file`);let i=await new Xe("",n.username,n.registry).buildComposeFile(r,o,e.template);return i!==a&&so.copyFileSync(i,a),c.success(`Docker Compose file generated successfully: ${a}`),0}catch(n){return c.error("Failed to generate Docker Compose file"),c.logDetailedError(n),1}}var ku=C({path:["docker","generate"],meta:wu,schema:_u,handler:M0});import Iu from"prompts";import{z as _a}from"zod";var Su={name:"login",description:"Login to Docker Hub",stability:"unstable",options:[{name:"username",shorthand:"u",description:"Docker Hub username",type:"string",target:"username"},{name:"password",shorthand:"p",description:"Docker Hub password",type:"string",target:"password"},{name:"registry",shorthand:"r",description:"Docker registry URL",type:"string",target:"registry"}]},Eu=_a.object({username:_a.string().optional(),password:_a.string().optional(),registry:_a.string().optional()});async function L0(e,t){try{let n=e.username,r=e.password,o=e.registry;if(!n){c.info("First we need your Docker Hub username to check if you are already logged in.");let l=await Iu({type:"text",name:"username",message:"Enter your Docker Hub username:",validate:p=>p.length>0?!0:"Username cannot be empty"});if(!l.username)return c.error("Username is required"),1;n=l.username}let a=new Xe("",n,o);if(await a.login(n))return c.success(`${n} is logged in to Docker Hub`),await js({username:n,registry:o||null}),0;if(!r){let l=await Iu({type:"password",name:"password",message:"Enter your Docker Hub password:",validate:p=>p.length>0?!0:"Password cannot be empty"});if(!l.password)return c.error("Password is required"),1;r=l.password}return await a.login(n,r,o)?(await js({username:n,registry:o||null}),c.success("Logged in to Docker Hub successfully"),0):(c.error("Failed to login to Docker Hub"),1)}catch(n){return c.error("Failed to login to Docker Hub"),c.logDetailedError(n),1}}var Au=C({path:["docker","login"],meta:Su,schema:Eu,handler:L0});import U0 from"inquirer";import{z as Pu}from"zod";var $u={name:"push",description:"Push a Docker image to Docker Hub",stability:"unstable",options:[{name:"image",shorthand:"i",description:"Full image name (e.g. username/image:tag)",type:"string",target:"image"}]},Ru=Pu.object({image:Pu.string().optional()});async function O0(e){if(e)return e;let t=await Xe.listLocalImages();if(t.length===0)throw new Error('No local Docker images found. Please build an image first with "phala docker build"');let n=Array.from(new Set(t.map(o=>o.imageName))),{selectedImage:r}=await U0.prompt([{type:"list",name:"selectedImage",message:"Select an image to push:",choices:n}]);return r}async function N0(e,t){try{let n=await Nt();if(!n)throw new Error('Docker information not found. Please login first with "phala docker login"');let r=await O0(e.image);return await new Xe("",n.username,n.registry).pushImage(r)?(c.success(`Docker image ${r} pushed successfully`),0):(c.error("Failed to push Docker image"),1)}catch(n){return c.error("Failed to push Docker image"),c.logDetailedError(n),1}}var xu=C({path:["docker","push"],meta:$u,schema:Ru,handler:N0});import Mu from"fs";import Lu from"path";import Sa from"inquirer";import{z as ka}from"zod";var Du={name:"run",description:"Run a Docker Compose setup",stability:"unstable",options:[{name:"compose",shorthand:"c",description:"Path to docker-compose.yml file",type:"string",target:"compose"},{name:"env-file",shorthand:"e",description:"Path to environment variables file",type:"string",target:"envFile"},{name:"skip-env",description:"Skip env file prompt",type:"boolean",target:"skipEnv"}]},Tu=ka.object({compose:ka.string().optional(),envFile:ka.string().optional(),skipEnv:ka.boolean().default(!0)});async function j0(e){if(e)return ot(e),e;let t=Lu.join(process.cwd(),"docker-compose.yml");if(Mu.existsSync(t)){let{useDefault:r}=await Sa.prompt([{type:"confirm",name:"useDefault",message:"Use docker-compose.yml in current directory?",default:!0}]);if(r)return t}let{composePath:n}=await Sa.prompt([{type:"input",name:"composePath",message:"Enter path to docker-compose.yml file:",validate:r=>{try{return ot(r),!0}catch{return"File not found"}}}]);return n}async function F0(e,t){if(t)return e;if(e)return ot(e),e;let n=Lu.join(process.cwd(),".env");if(Mu.existsSync(n)){let{useDefault:o}=await Sa.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);if(o)return n}let{envPath:r}=await Sa.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:o=>{try{return ot(o),!0}catch{return`File not found: ${o}`}}}]);return r}async function V0(e,t){try{let n=await j0(e.compose),r=await F0(e.envFile,e.skipEnv),o=new Xe("");return r?(c.info(`Validating env file: ${r}`),ot(r),c.info(`Running Docker Compose with compose file: ${n} and env file: ${r}`)):c.info(`Running Docker Compose with compose file: ${n} without env file`),await o.runComposeLocally(n,r)?(c.success("Docker Compose is running"),0):(c.error("Failed to run Docker Compose"),1)}catch(n){return c.error("Failed to run Docker Compose"),c.logDetailedError(n),1}}var Uu=C({path:["docker","run"],meta:Du,schema:Tu,handler:V0});var z0={name:"docker",description:"Docker Hub login and image management",stability:"deprecated"},K0=H0.object({});async function G0(e,t){return t.stdout.write(`Available docker subcommands: login, build, push, generate, run. Use 'phala docker <command> --help' for details.
354
+ `),0}var q0=C({path:["docker"],meta:z0,schema:K0,handler:G0}),hi={group:cu,commands:[q0,Au,bu,xu,ku,Uu]};import{z as Ou}from"zod";function B0(){let e=[{name:"List available help topics",value:"phala help"}];for(let t of Object.values(an))e.push({name:`Show "${t.name}" topic`,value:`phala help ${t.name}`});return e}var Nu={name:"help",category:"advanced",description:"Show help topics bundled with the CLI",stability:"stable",arguments:[{name:"topic",description:"Help topic name (see `phala help` for the list)",required:!1,target:"topic"}],examples:B0()},ju=Ou.object({topic:Ou.string().optional()});function W0(){let e=Object.values(an);if(e.length===0)return`This build contains no help topics.
355
+ `;let t=["Available help topics:",""];for(let n of e)t.push(` ${n.name.padEnd(18)}${n.description}`.trimEnd());return t.push(""),t.push('Use "phala help <topic>" to read a topic.'),`${t.join(`
356
+ `)}
357
+ `}async function J0(e,t){if(!e.topic)return t.stdout.write(W0()),0;let n=e.topic.trim().toLowerCase(),r=an[n];if(!r){let a=Object.keys(an).sort().join(", ");return t.fail(a?`Unknown help topic "${e.topic}". Available: ${a}`:`Unknown help topic "${e.topic}". This build contains no help topics.`),1}let o=r.content.endsWith(`
358
+ `)?r.content:`${r.content}
359
+ `;return t.stdout.write(o),0}var Fu=C({path:["help"],meta:Nu,schema:ju,handler:J0});import Aa from"path";import Bu from"fs-extra";import St from"chalk";import vi from"inquirer";import vr from"chalk";import Y0 from"open";import Z0 from"ora";import X0 from"prompts";import{z as $n}from"zod";var Vu={name:"login",category:"profile",description:"Authenticate with Phala Cloud",stability:"stable",arguments:[{name:"api-key",description:"API key (triggers device flow if omitted)",required:!1,target:"apiKey"}],options:[{name:"manual",description:"Enter API key manually",type:"boolean"},{name:"no-open",description:"Skip browser launch",type:"boolean",target:"noOpen"},{name:"profile",description:"Profile name (defaults to workspace slug)",type:"string",target:"profile"},{name:"print-token",description:"Print token to stdout without saving",type:"boolean",target:"printToken"},{name:"url",description:"Custom API endpoint URL",type:"string",target:"url"}]},Hu=$n.object({apiKey:$n.string().min(1,"API key cannot be empty").optional(),manual:$n.boolean().optional(),noOpen:$n.boolean().optional(),profile:$n.string().min(1).optional(),printToken:$n.boolean().optional(),url:$n.string().url().optional()});function zu(e){let{detail:t}=e;if(t&&typeof t=="object"&&!Array.isArray(t)){let n=t;if(n.error&&typeof n.error=="string"&&!n.error_code)return{error:n.error,error_description:typeof n.error_description=="string"?n.error_description:void 0}}return null}function un(e,t=""){e.write(`${t}
360
+ `)}async function Ea(e){let t=await Go(e.apiKey,{baseURL:e.baseURL}),n=await Oe(t);if(!n.success||!n.data?.user.username)throw new Error("Invalid API key");return n.data}async function Q0(e){let t,n=await X0({type:"password",name:"apiKey",message:"Enter your API key:",validate:async r=>{if(!r||r.trim().length===0)return"API key cannot be empty";try{return t=await Ea({apiKey:r,baseURL:e.baseURL}),!0}catch(o){return o instanceof Error?o.message:"Invalid API key"}}});if(!n.apiKey)throw new Error("API key input cancelled");return t||(t=await Ea({apiKey:n.apiKey,baseURL:e.baseURL})),{apiKey:n.apiKey,user:t}}async function eE(e,t){let n=rt({useCookieAuth:!0,baseURL:t.baseURL}),r=await n.post("/auth/device/code",{client_id:"phala-cli",scope:"user:profile cvms:* nodes:*"}),{device_code:o,user_code:a,verification_uri_complete:s,interval:i,expires_in:l}=r,p=i,m=t.printToken?e.stderr:e.stdout;if(un(m),un(m,vr.bold("To authenticate, visit:")),un(m,vr.cyan(s)),un(m),un(m,`${vr.bold("And enter code:")} ${vr.yellow(a)}`),un(m),!t.noOpen)try{await Y0(s),un(m,"Opening browser automatically...")}catch{un(m,"Could not open browser automatically. Please visit the URL above.")}let d=Z0("Waiting for authorization...").start(),f=Date.now()+l*1e3;for(;Date.now()<f;){await new Promise(u=>setTimeout(u,p*1e3));try{let u=await n.post("/auth/device/token",{device_code:o,grant_type:"urn:ietf:params:oauth:grant-type:device_code"});return d.succeed("Authorization successful!"),u.access_token}catch(u){if(u instanceof vt)throw d.stop(),new Error(tn(u));if(u instanceof Ao){let h=zu(u);if(h)switch(h.error){case"authorization_pending":continue;case"slow_down":p+=5;continue;case"expired_token":throw d.fail("Authorization expired"),new Error(h.error_description||"Device authorization expired. Please try again.");case"access_denied":throw d.fail("Authorization denied"),new Error(h.error_description||"You denied the authorization request.");default:throw d.fail("Authorization failed"),new Error(`Authorization failed: ${h.error_description||h.error}`)}}throw d.fail("Request failed"),u}}throw d.fail("Authorization timed out"),new Error("Authorization timed out. Please try again.")}async function Ia(e,t){try{if(e.printToken&&e.manual)throw new Error("--print-token is not compatible with --manual");let n=e.url||t.env.PHALA_CLOUD_API_PREFIX||Rt,r,o;if(e.apiKey)r=e.apiKey,o=await Ea({apiKey:r,baseURL:n});else if(e.manual){let l=await Q0({baseURL:n});r=l.apiKey,o=l.user}else r=await eE(t,{noOpen:e.noOpen,printToken:e.printToken,baseURL:n}),o=await Ea({apiKey:r,baseURL:n});if(!o)throw new Error("Failed to validate API key");if(e.printToken)return t.stdout.write(`${r}
361
+ `),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,i=e.profile||s||"default";return ir({profileName:i,token:r,apiPrefix:n,workspaceName:a,workspaceSlug:s,user:{username:o.user.username,email:o.user.email},setCurrent:!0}),t.stdout.write(vr.green(`Welcome ${o.user.username}! Credentials saved successfully (profile: ${i})
362
+ `)),0}catch(n){let r=n instanceof Error?n.message:String(n);return t.stderr.write(vr.red(`Failed to authenticate: ${r}
363
+ `)),1}}var Ku=C({path:["login"],meta:Vu,schema:Hu,handler:Ia});import{z as yi}from"zod";var tE={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Gu={name:"link",category:"manage",description:"Link a local directory to a CVM",stability:"unstable",arguments:[{name:"cvm-id",description:"CVM ID or name (interactive if omitted)",required:!1,target:"cvmId"}],options:[tE],examples:[{name:"Link by name or ID",value:"phala link my-cvm-name"},{name:"Link interactively",value:"phala link"}]},qu=yi.object({cvmId:yi.string().optional(),json:yi.boolean().default(!1)});function nE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function Wu(){let e=["docker-compose.yml","docker-compose.yaml"];for(let t of e)if(Bu.existsSync(Aa.join(process.cwd(),t)))return t}function Ju(){let e=".env.production";if(Bu.existsSync(Aa.join(process.cwd(),e)))return e}var rE=/^(0x)?[0-9a-f]{40}$/i;function oE(e){return rE.test(e)}function aE(e){return e.replace(/^0x/i,"").toLowerCase()}async function Ci(e){let t=_t(e);if(!t.apiKey){if(c.info(`Not authenticated. Starting login flow...
364
+ `),await Ia({manual:!1,noOpen:!1},e)!==0||(t=_t(e),!t.apiKey))return null;console.log()}let n=a=>{let s=a.workspace?.name||"default",i=a.workspace?.slug?` (${a.workspace.slug})`:"";c.success(`Authenticated as ${a.user?.username||"unknown"}`),c.info(`Workspace: ${s}${i}`),console.log()},r=await E(e),o=await Oe(r);if(!o.success){if(c.info(`API key expired or invalid. Starting login flow...
365
+ `),await Ia({manual:!1,noOpen:!1},e)!==0||(t=_t(e),!t.apiKey))return null;let s=await E(e),i=await Oe(s);return i.success?(n(i.data),{apiKey:t.apiKey,profileName:t.profileName,workspaceName:i.data.workspace.name||"default",workspaceSlug:i.data.workspace.slug}):null}return n(o.data),{apiKey:t.apiKey,profileName:t.profileName,workspaceName:o.data.workspace.name||"default",workspaceSlug:o.data.workspace.slug}}function Yu(e){let t={name:e.cvmName,profile:e.profile};e.appId&&(t.app_id=e.appId),e.composeFile&&(t.compose_file=e.composeFile),e.envFile&&(t.env_file=e.envFile),Os(t),console.log(),console.log(St.bold("Created phala.toml:")),console.log(St.dim(` name = "${e.cvmName}"`)),e.appId&&console.log(St.dim(` app_id = "${e.appId}"`)),console.log(St.dim(` profile = "${e.profile}"`)),e.composeFile&&console.log(St.dim(` compose_file = "${e.composeFile}"`)),e.envFile&&console.log(St.dim(` env_file = "${e.envFile}"`)),console.log(),c.success("Project linked successfully!"),c.info('Run "phala deploy" to update your CVM.')}async function sE(e,t){try{if(e.cvmId)return await cE(e.cvmId,t);if(zr()){let n=ar();if(n.cvm_id&&!n.app_id)return await iE(n,t)}return await lE(t)}catch(n){if(nE(n))return console.log(),c.info("Link cancelled."),0;throw n}}async function iE(e,t){if(!await Ci(t))return t.fail("Authentication failed."),1;let r=await E(t),o=await G(r,{id:e.cvm_id});if(!o.success)return t.fail(`Failed to fetch CVM info for ${e.cvm_id}: ${o.error?.message||"Unknown error"}`),1;let a=o.data;if(!a.app_id)return c.warn("CVM does not have an app_id. No upgrade needed."),0;let{cvm_id:s,...i}=e,l={...i,app_id:a.app_id};return Os(l),c.success(`Updated phala.toml with app_id = "${a.app_id}"`),0}async function cE(e,t){let n=await Ci(t);if(!n)return t.fail("Authentication failed."),1;let r=n.profileName,o=await E(t),a,s;if(oE(e)){let p=aE(e),m=await am(o,{appId:p});if(!m.success)return t.fail(`App not found: ${p}`),1;let d=m.data;s=d.app_id,a=d.current_cvm?.name||d.name||Aa.basename(process.cwd()),c.success(`Found app: ${s}`)}else{let p=await G(o,{id:e});if(!p.success)return t.fail(`CVM not found: ${e}`),1;let m=p.data;a=m.name||e,s=m.app_id||void 0,c.success(`Found CVM: ${a}`)}if(zr()){let{overwrite:p}=await vi.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!p)return c.info("Link cancelled."),0}let i=Wu(),l=Ju();return(i||l)&&(console.log(),c.info("Detected local files:"),i&&console.log(St.green(` \u2713 ${i}`)),l&&console.log(St.green(` \u2713 ${l}`))),Yu({cvmName:a,appId:s,composeFile:i,envFile:l,profile:r}),0}async function lE(e){let t=await Ci(e);if(!t)return e.fail("Authentication failed."),1;let n=t.profileName,r=c.startSpinner("Fetching your CVMs..."),o=await E(e),a=await Lr(o);if(r.stop(!0),!a.success)return e.fail(`Failed to fetch CVMs: ${a.error.message}`),1;let i=a.data.items??[];if(i.length===0)return c.warn("You don't have any CVMs yet."),c.info('Deploy your first CVM with "phala deploy"'),0;let l=Aa.basename(process.cwd()),p=i.map(g=>{let y=g.hosted?.app_id||g.hosted?.id||"",b=g.name||g.hosted?.name||"Unnamed",w=g.status||g.hosted?.status||"Unknown",S=g.hosted?.app_id||void 0;return{name:`${b} (${y}) - Status: ${w}`,value:b,cvmName:b,appId:S}}),m=p.findIndex(g=>g.cvmName.toLowerCase()===l.toLowerCase());console.log(St.bold(`Found ${i.length} CVM(s):
366
+ `));let{selectedCvm:d}=await vi.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM to link:",choices:p.map(g=>({name:g.name,value:g.value})),default:m>=0?m:0}]);if(zr()){let{overwrite:g}=await vi.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!g)return c.info("Link cancelled."),0}let f=Wu(),u=Ju();console.log(),(f||u)&&(c.info("Detected local files:"),f&&console.log(St.green(` \u2713 ${f}`)),u&&console.log(St.green(` \u2713 ${u}`)),console.log());let h=p.find(g=>g.value===d);return Yu({cvmName:d,appId:h?.appId,composeFile:f,envFile:u,profile:n}),0}var Zu=C({path:["link"],meta:Gu,schema:qu,handler:sE});import{z as mE}from"zod";var Xu={name:"logout",category:"profile",description:"Remove stored API key",stability:"stable"},Qu=mE.object({});async function pE(e,t){try{let r=De()?.current_profile;cr();let o=r?`Credentials removed successfully (profile: ${r})`:"Credentials removed successfully";return t.globalOptions?.json?(t.success({message:o,profile:r||null}),0):(c.success(o),0)}catch(n){return t.globalOptions?.json?(t.fail("Failed to remove credentials"),1):(c.error("Failed to remove credentials"),c.logDetailedError(n),1)}}var ef=C({path:["logout"],meta:Xu,schema:Qu,handler:pE});var tf={path:["kms"],meta:{name:"kms",category:"deploy",description:"Manage on-chain KMS contracts",stability:"unstable"}};import{z as nf}from"zod";var rf={name:"list",aliases:["ls"],description:"List on-chain KMS contracts",stability:"unstable",options:[ke],examples:[{name:"List on-chain KMS",value:"phala kms list"},{name:"Output as JSON",value:"phala kms list --json"}]},bi=nf.object({json:nf.boolean().default(!1)});var dE={1:"ethereum",8453:"base",31337:"anvil"};async function of(e,t){try{let n=await E(t),r=await ws(n,{is_onchain:!0,page_size:100});if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(e.json)return t.success(o),0;let a=new Map;for(let l of o.items){let p=`${l.kms_contract_address}:${l.chain_id}`;a.has(p)||a.set(p,{address:l.kms_contract_address??"-",chain:dE[l.chain_id??0]??`chain-${l.chain_id}`})}let s=["CHAIN","CONTRACT_ADDRESS"],i=[...a.values()].map(l=>({CHAIN:l.chain,CONTRACT_ADDRESS:l.address}));return i.length===0?(c.info("No on-chain KMS contracts found"),0):(ce(s,i),0)}catch(n){return c.logDetailedError(n),t.fail(`Failed to list KMS: ${n instanceof Error?n.message:String(n)}`),1}}var uE={name:"kms",description:"List and manage on-chain KMS contracts",stability:"unstable"},af=C({path:["kms","list"],meta:rf,schema:bi,handler:of}),sf=C({path:["kms"],meta:uE,schema:bi,handler:of});import{z as cf}from"zod";var wi=e=>({name:e,description:`Show on-chain KMS details for ${e}`,stability:"unstable",options:[ke],examples:[{name:`Show ${e} KMS details`,value:`phala kms ${e}`},{name:"Output as JSON",value:`phala kms ${e} --json`}]}),_i=cf.object({json:cf.boolean().default(!1)});function lf(e){return async function(n,r){try{let o=await E(r),a=await Rs(o,{chain:e});if(!a.success)return r.fail(a.error.message),1;let s=a.data;if(n.json)return r.success(s),0;if(s.contracts.length===0)return c.info(`No KMS contracts found on ${e}`),0;for(let i of s.contracts){if(c.info(`Contract: ${i.contract_address} (${i.chain_name})`),c.break(),i.devices.length>0){c.info("Devices:");let l=["DEVICE_ID","NODE"],p=i.devices.map(m=>({DEVICE_ID:m.device_id,NODE:typeof m.node_name=="string"&&m.node_name.length>0?m.node_name:"-"}));ce(l,p)}else c.info("Devices: none");if(c.break(),i.os_images.length>0){c.info("OS Images:");let l=["NAME","VERSION","OS_IMAGE_HASH"],p=i.os_images.map(m=>({NAME:m.name,VERSION:m.version,OS_IMAGE_HASH:m.os_image_hash??"-"}));ce(l,p)}else c.info("OS Images: none");c.break()}return 0}catch(o){return c.logDetailedError(o),r.fail(`Failed to get KMS details for ${e}: ${o instanceof Error?o.message:String(o)}`),1}}}var mf=C({path:["kms","ethereum"],meta:wi("ethereum"),schema:_i,handler:lf("ethereum")}),pf=C({path:["kms","base"],meta:wi("base"),schema:_i,handler:lf("base")});var ki={group:tf,commands:[sf,af,mf,pf]};var df={path:["nodes"],meta:{name:"nodes",category:"deploy",description:"Manage TEE nodes",stability:"unstable"}};import{z as Pa}from"zod";var uf={name:"list",aliases:["ls"],description:"List workspace nodes",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},ke],examples:[{name:"List nodes (page 1)",value:"phala nodes list"},{name:"List nodes (page 2)",value:"phala nodes list --page 2"},{name:"Output as JSON",value:"phala nodes list --json"}]},Si=Pa.object({page:Pa.coerce.number().int().min(1).default(1),pageSize:Pa.coerce.number().int().min(1).max(100).default(30),json:Pa.boolean().default(!1)});async function ff(e,t){try{let n=await E(t),r=await Oe(n);if(!r.success)return t.fail(r.error.message),1;let o=r.data.workspace.slug;if(!o)return t.fail("Workspace slug is not available. Please contact support."),1;let a=await Xl(n,{teamSlug:o,page:e.page,pageSize:e.pageSize});if(!a.success)return t.fail(a.error.message),1;let s=a.data;if(e.json)return t.success(s),0;let i=["ID","NAME","REGION","PPID","DEVICE_ID","VERSION"],l=s.items.map(p=>({ID:p.id?.toString()??"-",NAME:p.name??"-",REGION:p.region??"-",PPID:p.ppid??"-",DEVICE_ID:p.device_id??"-",VERSION:p.version?.split(" ")[0]??"-"}));return l.length===0?(c.info("No nodes found"),0):(ce(i,l),c.info(`Page ${s.page}/${s.pages} (total ${s.total})`),0)}catch(n){return c.logDetailedError(n),t.fail(`Failed to list nodes: ${n instanceof Error?n.message:String(n)}`),1}}var fE={name:"nodes",description:"List and manage TEE nodes",stability:"unstable"},gf=C({path:["nodes","list"],meta:uf,schema:Si,handler:ff}),hf=C({path:["nodes"],meta:fE,schema:Si,handler:ff});var Ei={group:df,commands:[hf,gf]};import{z as Rn}from"zod";var yf={name:"os-images",category:"deploy",description:"List available OS images",stability:"unstable",options:[{name:"dev",description:"Show only dev images",type:"boolean",target:"dev",group:"basic"},{name:"prod",description:"Show only prod images",type:"boolean",target:"prod",group:"basic"},{name:"page",description:"Page number (1-indexed)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Items per page (max 100)",type:"number",target:"pageSize",group:"basic"},{name:"all",description:"Fetch all pages",type:"boolean",target:"all",group:"basic"},ke],examples:[{name:"List all OS images",value:"phala os-images"},{name:"List prod images only",value:"phala os-images --prod"},{name:"List page 2 with page size 20",value:"phala os-images --page 2 --page-size 20"},{name:"Fetch all pages",value:"phala os-images --all"},{name:"Output as JSON",value:"phala os-images --json"}]},vf=Rn.object({dev:Rn.boolean().default(!1),prod:Rn.boolean().default(!1),page:Rn.number().int().min(1).default(1),pageSize:Rn.number().int().min(1).max(100).default(100),all:Rn.boolean().default(!1),json:Rn.boolean().default(!1)});async function gE(e,t){try{let n=await E(t),r=e.dev?!0:e.prod?!1:void 0,o=async p=>await $s(n,{page:p,page_size:e.pageSize,is_dev:r}),a=await o(e.page);if(!a.success)return t.fail(a.error.message),1;let s=a.data;if(e.all&&s.pages>s.page){let p=[...s.items];for(let m=s.page+1;m<=s.pages;m++){let d=await o(m);if(!d.success)return t.fail(d.error.message),1;p.push(...d.data.items)}s={...s,items:p,page_size:p.length,page:1,pages:1}}if(e.json)return t.success(s),0;let i=["NAME","VERSION","OS_IMAGE_HASH","DEV","GPU"],l=s.items.map(p=>({NAME:p.name,VERSION:p.version,OS_IMAGE_HASH:p.os_image_hash??"-",DEV:p.is_dev?"yes":"no",GPU:p.requires_gpu?"yes":"no"}));return l.length===0?(c.info("No OS images found"),0):(ce(i,l),c.info(`Total: ${s.total}`),0)}catch(n){return c.logDetailedError(n),t.fail(`Failed to list OS images: ${n instanceof Error?n.message:String(n)}`),1}}var Cf=C({path:["os-images"],meta:yf,schema:vf,handler:gE});import{z as CE}from"zod";var bf={path:["simulator"],meta:{name:"simulator",category:"manage",description:"TEE simulator commands",stability:"unstable"}};import{z as Ii}from"zod";var wf={name:"start",description:"Start the TEE simulator",stability:"unstable",options:[{name:"port",shorthand:"p",description:"Simulator port (default: 8090)",type:"string",target:"port"},{name:"verbose",shorthand:"v",description:"Enable verbose output",type:"boolean",target:"verbose"}]},_f=Ii.object({port:Ii.string().default("8090"),verbose:Ii.boolean().default(!1)});async function hE(e,t){try{return qp()||await Bp(),await eo()?(c.success("TEE simulator is already running"),0):(await Wp({verbose:e.verbose}),c.success("TEE simulator started successfully"),0)}catch(n){return c.error("Failed to start TEE simulator"),c.logDetailedError(n),1}}var kf=C({path:["simulator","start"],meta:wf,schema:_f,handler:hE});import{z as yE}from"zod";var Sf={name:"stop",description:"Stop the TEE simulator",stability:"unstable"},Ef=yE.object({});async function vE(e,t){try{return await Jp()?(c.success("TEE simulator stopped successfully"),0):(c.error("Failed to stop TEE simulator"),1)}catch(n){return c.error("Failed to stop TEE simulator"),c.logDetailedError(n),1}}var If=C({path:["simulator","stop"],meta:Sf,schema:Ef,handler:vE});var bE={name:"simulator",description:"TEE simulator commands",stability:"unstable"},wE=CE.object({});async function _E(e,t){try{let n=await eo(),r=sa();if(n&&r){let a=ri(),s=a.replace(/dstack\.sock$/,"tappd.sock");t.stdout.write(`\u2713 TEE simulator is running (PID: ${r})\\n`),t.stdout.write(`
275
367
  Set these environment variables to use the simulator:
276
368
  `),t.stdout.write(` export DSTACK_SIMULATOR_ENDPOINT=${a}\\n`),t.stdout.write(` export TAPPD_SIMULATOR_ENDPOINT=${s}\\n`)}else t.stdout.write(`TEE simulator is not running\\n
277
369
  `),t.stdout.write(`To start the simulator, run:
278
- `),t.stdout.write(" phala simulator start\\n");return 0}catch(r){return t.stderr.write(`Error checking simulator status: ${r instanceof Error?r.message:String(r)}\\n`),1}}var Sk=b({path:["simulator"],meta:Ck,schema:wk,handler:_k}),Xs={group:Id,commands:[Sk,Pd,Rd]};import{z as kk}from"zod";var Md={name:"profiles",category:"profile",description:"List auth profiles",stability:"stable",arguments:[],options:[]},Td=kk.object({});async function Ek(e,t){let r=dn(),n=Qt();if(r.length===0)return i.warn("No profiles found. Please login first."),0;let o=Ge(),a=["PROFILE","WORKSPACE","USER","API ENDPOINT",""],s=r.map(c=>{let l=n?.name===c,m=o?.profiles[c];return{PROFILE:c,WORKSPACE:m?.workspace?.name||"",USER:m?.user?.username||"","API ENDPOINT":m?.api_prefix||"","":l?"*":""}});return ce(a,s),0}var Ld=b({path:["profiles"],meta:Md,schema:Td,handler:Ek});import Ik from"chalk";import Ak from"inquirer";import{z as Qs}from"zod";var Nd={name:"switch",category:"profile",description:"Switch auth profiles",stability:"unstable",arguments:[{name:"profile-name",description:"Profile name",required:!0,target:"profileName"}],options:[{name:"interactive",shorthand:"i",description:"Select profile interactively",type:"boolean",target:"interactive"}]},Ud=Qs.object({profileName:Qs.string().min(1).optional(),interactive:Qs.boolean().default(!1)});function xk(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function Pk(e,t){try{return e.interactive?await $k():e.profileName?Dk(e.profileName):(i.error("Missing required argument: profile-name"),i.info("Usage: phala switch <profile-name>"),i.info(" phala switch -i"),1)}catch(r){if(xk(r))return console.log(),i.info("Switch cancelled."),0;let n=r instanceof Error?r.message:String(r);if(n.includes("not found")){i.error(n);let o=dn();if(o.length>0){i.info("Available profiles:");for(let a of o)console.log(Ik.gray(` - ${a}`))}else i.info("No profiles found. Please login first.")}else i.error("Failed to switch profile"),i.logDetailedError(r);return 1}}async function $k(){let e=dn(),t=Qt();if(e.length===0)return i.warn("No profiles found. Please login first."),1;if(e.length===1)return i.info(`Only one profile available: ${e[0]}`),0;let r=Ge(),n=e.map(s=>{let l=r?.profiles[s]?.workspace?.name||"unknown",p=t?.name===s?" (current)":"";return{name:`${s} (workspace: ${l})${p}`,value:s}}),{selectedProfile:o}=await Ak.prompt([{type:"list",name:"selectedProfile",message:"Select a profile to switch to:",choices:n,default:t?.name}]);if(o===t?.name)return i.info(`Already using profile "${o}"`),0;ps(o);let a=Qt();return i.success(`Switched to profile "${o}"`),a?.info.workspace?.name&&i.info(`Workspace: ${a.info.workspace.name}`),0}function Dk(e){if(Qt()?.name===e)return i.info(`Already using profile "${e}"`),0;ps(e);let r=Qt();return i.success(`Switched to profile "${e}"`),r?.info.workspace?.name&&i.info(`Workspace: ${r.info.workspace.name}`),0}var Od=b({path:["switch"],meta:Nd,schema:Ud,handler:Pk});import{z as zr}from"zod";import{readFileSync as Lk}from"fs";import{dirname as Nk,join as Uk}from"path";import{fileURLToPath as Ok}from"url";function Fd(e,t,r){switch(t){case"bash":return Rk(e,r);case"zsh":return Mk(e,r);case"fish":return Tk(e,r)}}function Rk(e,t){let r=t?`
370
+ `),t.stdout.write(" phala simulator start\\n");return 0}catch(n){return t.stderr.write(`Error checking simulator status: ${n instanceof Error?n.message:String(n)}\\n`),1}}var kE=C({path:["simulator"],meta:bE,schema:wE,handler:_E}),Ai={group:bf,commands:[kE,kf,If]};import{z as SE}from"zod";var Af={name:"profiles",category:"profile",description:"List auth profiles",stability:"stable",arguments:[],options:[],aliases:["list"]},Pf=SE.object({});import EE from"chalk";import IE from"inquirer";import{z as Pi}from"zod";var $f={name:"use",category:"profile",description:"Switch to an auth profile",stability:"stable",arguments:[{name:"profile-name",description:"Profile name",required:!0,target:"profileName"}],options:[{name:"interactive",shorthand:"i",description:"Select profile interactively",type:"boolean",target:"interactive"}]},Rf=Pi.object({profileName:Pi.string().min(1).optional(),interactive:Pi.boolean().default(!1)});function AE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function PE(e,t){try{return e.interactive?await $E(t):e.profileName?RE(e.profileName,t):t.globalOptions?.json?(t.fail("Missing required argument: profile-name"),1):(c.error("Missing required argument: profile-name"),c.info("Usage: phala profiles use <profile-name>"),c.info(" phala profiles use -i"),1)}catch(n){if(AE(n))return console.log(),t.globalOptions?.json?(t.success({cancelled:!0}),0):(c.info("Switch cancelled."),0);let r=n instanceof Error?n.message:String(n);if(t.globalOptions?.json)return t.fail(r),1;if(r.includes("not found")){c.error(r);let o=xt();if(o.length>0){c.info("Available profiles:");for(let a of o)console.log(EE.gray(` - ${a}`))}else c.info("No profiles found. Please login first.")}else c.error("Failed to switch profile"),c.logDetailedError(n);return 1}}async function $E(e){let t=xt(),n=Te();if(t.length===0)return e.globalOptions?.json?(e.fail("No profiles found. Please login first."),1):(c.warn("No profiles found. Please login first."),1);if(t.length===1)return e.globalOptions?.json?(e.success({profile:t[0],workspace:n?.info.workspace?.name||null,changed:!1}),0):(c.info(`Only one profile available: ${t[0]}`),0);let r=De(),o=t.map(i=>{let p=r?.profiles[i]?.workspace?.name||"unknown",d=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${p})${d}`,value:i}}),{selectedProfile:a}=await IE.prompt([{type:"list",name:"selectedProfile",message:"Select a profile to switch to:",choices:o,default:n?.name}]);if(a===n?.name)return e.globalOptions?.json?(e.success({profile:a,workspace:n?.info.workspace?.name||null,changed:!1}),0):(c.info(`Already using profile "${a}"`),0);lr(a);let s=Te();return e.globalOptions?.json?(e.success({profile:a,workspace:s?.info.workspace?.name||null,changed:!0}),0):(c.success(`Switched to profile "${a}"`),s?.info.workspace?.name&&c.info(`Workspace: ${s.info.workspace.name}`),0)}function RE(e,t){let n=Te();if(n?.name===e)return t.globalOptions?.json?(t.success({profile:e,workspace:n.info.workspace?.name||null,changed:!1}),0):(c.info(`Already using profile "${e}"`),0);lr(e);let r=Te();return t.globalOptions?.json?(t.success({profile:e,workspace:r?.info.workspace?.name||null,changed:!0}),0):(c.success(`Switched to profile "${e}"`),r?.info.workspace?.name&&c.info(`Workspace: ${r.info.workspace.name}`),0)}var $i=C({path:["profiles","use"],meta:$f,schema:Rf,handler:PE});import{z as Ri}from"zod";var xf={name:"rename",category:"profile",description:"Rename an auth profile",stability:"stable",arguments:[{name:"old-name",description:"Current profile name",required:!0,target:"oldName"},{name:"new-name",description:"New profile name",required:!0,target:"newName"}],options:[],aliases:["mv"]},Df=Ri.object({oldName:Ri.string().min(1),newName:Ri.string().min(1)});async function xE(e,t){try{let n=Te()?.name===e.oldName;return km(e.oldName,e.newName),t.globalOptions?.json?(t.success({oldName:e.oldName,newName:e.newName,wasActive:n}),0):(c.success(`Renamed profile "${e.oldName}" to "${e.newName}"`),n&&c.info(`Current profile updated to "${e.newName}"`),0)}catch(n){let r=n instanceof Error?n.message:String(n);return t.globalOptions?.json?(t.fail(r),1):(c.error(r),1)}}var xi=C({path:["profiles","rename"],meta:xf,schema:Df,handler:xE});import{z as Tf}from"zod";var Mf={name:"delete",category:"profile",description:"Delete an auth profile",stability:"stable",arguments:[{name:"profile-name",description:"Profile name",required:!0,target:"profileName"}],options:[],aliases:["rm"]},Lf=Tf.object({profileName:Tf.string().min(1)});async function DE(e,t){try{let n=Te()?.name===e.profileName;if(!xt().includes(e.profileName))return t.globalOptions?.json?(t.fail(`Profile "${e.profileName}" not found`),1):(c.error(`Profile "${e.profileName}" not found`),1);cr(e.profileName);let o=Te();return t.globalOptions?.json?(t.success({deleted:e.profileName,wasActive:n,currentProfile:o?.name||null}),0):(c.success(`Deleted profile "${e.profileName}"`),n&&(o?c.info(`Switched to profile "${o.name}"`):c.info("No profiles remaining. Please login again.")),0)}catch(n){let r=n instanceof Error?n.message:String(n);return t.globalOptions?.json?(t.fail(r),1):(c.error(r),1)}}var Di=C({path:["profiles","delete"],meta:Mf,schema:Lf,handler:DE});async function TE(e,t){let n=xt(),r=Te();if(n.length===0)return t.globalOptions?.json?(t.success({profiles:[]}),0):(c.warn("No profiles found. Please login first."),0);let o=De(),a=["PROFILE","SLUG","WORKSPACE","USER","API ENDPOINT",""],s=n.map(i=>{let l=r?.name===i,p=o?.profiles[i];return{PROFILE:i,SLUG:p?.workspace?.slug||"",WORKSPACE:p?.workspace?.name||"",USER:p?.user?.username||"","API ENDPOINT":p?.api_prefix||"","":l?"*":""}});return t.globalOptions?.json?(t.success({profiles:n.map(i=>({name:i,slug:o?.profiles[i]?.workspace?.slug||null,workspace:o?.profiles[i]?.workspace?.name||null,user:o?.profiles[i]?.user?.username||null,apiEndpoint:o?.profiles[i]?.api_prefix||null,current:r?.name===i}))}),0):(ce(a,s),0)}var Uf=C({path:["profiles"],meta:Af,schema:Pf,handler:TE});import ME from"chalk";import LE from"inquirer";import{z as Ti}from"zod";var Of={name:"switch",category:"profile",description:"Switch auth profiles",stability:"unstable",arguments:[{name:"profile-name",description:"Profile name",required:!0,target:"profileName"}],options:[{name:"interactive",shorthand:"i",description:"Select profile interactively",type:"boolean",target:"interactive"}]},Nf=Ti.object({profileName:Ti.string().min(1).optional(),interactive:Ti.boolean().default(!1)});function UE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function OE(e,t){try{return e.interactive?await NE(t):e.profileName?jE(e.profileName,t):t.globalOptions?.json?(t.fail("Missing required argument: profile-name"),1):(c.error("Missing required argument: profile-name"),c.info("Usage: phala switch <profile-name>"),c.info(" phala switch -i"),1)}catch(n){if(UE(n))return console.log(),t.globalOptions?.json?(t.success({cancelled:!0}),0):(c.info("Switch cancelled."),0);let r=n instanceof Error?n.message:String(n);if(t.globalOptions?.json)return t.fail(r),1;if(r.includes("not found")){c.error(r);let o=xt();if(o.length>0){c.info("Available profiles:");for(let a of o)console.log(ME.gray(` - ${a}`))}else c.info("No profiles found. Please login first.")}else c.error("Failed to switch profile"),c.logDetailedError(n);return 1}}async function NE(e){let t=xt(),n=Te();if(t.length===0)return e.globalOptions?.json?(e.fail("No profiles found. Please login first."),1):(c.warn("No profiles found. Please login first."),1);if(t.length===1)return e.globalOptions?.json?(e.success({profile:t[0],workspace:n?.info.workspace?.name||null,changed:!1}),0):(c.info(`Only one profile available: ${t[0]}`),0);let r=De(),o=t.map(i=>{let p=r?.profiles[i]?.workspace?.name||"unknown",d=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${p})${d}`,value:i}}),{selectedProfile:a}=await LE.prompt([{type:"list",name:"selectedProfile",message:"Select a profile to switch to:",choices:o,default:n?.name}]);if(a===n?.name)return e.globalOptions?.json?(e.success({profile:a,workspace:n?.info.workspace?.name||null,changed:!1}),0):(c.info(`Already using profile "${a}"`),0);lr(a);let s=Te();return e.globalOptions?.json?(e.success({profile:a,workspace:s?.info.workspace?.name||null,changed:!0}),0):(c.success(`Switched to profile "${a}"`),s?.info.workspace?.name&&c.info(`Workspace: ${s.info.workspace.name}`),0)}function jE(e,t){let n=Te();if(n?.name===e)return t.globalOptions?.json?(t.success({profile:e,workspace:n.info.workspace?.name||null,changed:!1}),0):(c.info(`Already using profile "${e}"`),0);lr(e);let r=Te();return t.globalOptions?.json?(t.success({profile:e,workspace:r?.info.workspace?.name||null,changed:!0}),0):(c.success(`Switched to profile "${e}"`),r?.info.workspace?.name&&c.info(`Workspace: ${r.info.workspace.name}`),0)}var jf=C({path:["switch"],meta:Of,schema:Nf,handler:OE});import{z as Cr}from"zod";import{readFileSync as zE}from"fs";import{dirname as KE,join as GE}from"path";import{fileURLToPath as qE}from"url";function Ff(e,t,n){switch(t){case"bash":return FE(e,n);case"zsh":return VE(e,n);case"fish":return HE(e,n)}}function FE(e,t){let n=t?`
279
371
  # Version check (once per day)
280
372
  local completion_version="${t}"
281
373
  local check_file=~/."${e}"/completion-check
@@ -304,7 +396,7 @@ _${e}_completions() {
304
396
  local cur="\${COMP_WORDS[COMP_CWORD]}"
305
397
  local prev="\${COMP_WORDS[COMP_CWORD-1]}"
306
398
  local line="\${COMP_LINE}"
307
- ${r}
399
+ ${n}
308
400
  # Call the CLI's completion endpoint
309
401
  local completions=$( ${e} __complete -- "\${line}" "\${cur}" 2>/dev/null )
310
402
 
@@ -312,7 +404,7 @@ ${r}
312
404
  }
313
405
 
314
406
  complete -F _${e}_completions ${e}
315
- `.trim()}function Mk(e,t){let r=t?`
407
+ `.trim()}function VE(e,t){let n=t?`
316
408
  # Version check (once per day)
317
409
  local completion_version="${t}"
318
410
  local check_file=~/."${e}"/completion-check
@@ -339,7 +431,7 @@ complete -F _${e}_completions ${e}
339
431
 
340
432
  _${e}() {
341
433
  local line state
342
- ${r}
434
+ ${n}
343
435
  _arguments -C \\
344
436
  "1: :->cmds" \\
345
437
  "*::arg:->args"
@@ -357,7 +449,7 @@ ${r}
357
449
  }
358
450
 
359
451
  _${e}
360
- `.trim()}function Tk(e,t){let r=t?`
452
+ `.trim()}function HE(e,t){let n=t?`
361
453
  # Version check (once per day)
362
454
  set -l completion_version "${t}"
363
455
  set -l check_file ~/."${e}"/completion-check
@@ -385,20 +477,20 @@ _${e}
385
477
  function __${e}_complete
386
478
  set -l line (commandline -cp)
387
479
  set -l token (commandline -ct)
388
- ${r}
480
+ ${n}
389
481
  ${e} __complete -- $line $token 2>/dev/null
390
482
  end
391
483
 
392
484
  complete -c ${e} -f -a "(__${e}_complete)"
393
- `.trim()}function Fk(){try{let e=Ok(import.meta.url),t=Nk(e),r=Uk(t,"../package.json");return JSON.parse(Lk(r,"utf-8")).version}catch{return"unknown"}}var jk={name:"__complete",description:"Internal command for shell completion",stability:"stable",arguments:[{name:"line",description:"Full command line",required:!0},{name:"fragment",description:"Current word being completed",required:!0}]},Vk=zr.object({line:zr.string(),fragment:zr.string()});async function zk(e,t){return t.stdout.write(`
394
- `),0}var fF=b({path:["__complete"],meta:jk,schema:Vk,handler:zk}),Kk={name:"completion",description:"Generate shell completion scripts",stability:"stable",options:[{name:"shell",type:"string",description:"Shell type (bash, zsh, fish)"},{name:"fig",type:"boolean",description:"Generate Fig/Amazon Q completion spec"}]},Gk=zr.object({shell:zr.enum(["bash","zsh","fish"]).optional(),fig:zr.boolean().optional()});async function Hk(e,t){if(e.fig)return t.stdout.write(`Fig spec generation requires registry access. See fig-spec.ts for implementation.
395
- `),0;let r=e.shell||qk();if(!r)return t.stderr.write(`Could not detect shell. Please specify with --shell (bash, zsh, or fish)
396
- `),1;let n=Fk(),o=Fd("phala",r,n);switch(t.stdout.write(`# Add this to your shell configuration file:
485
+ `.trim()}function BE(){try{let e=qE(import.meta.url),t=KE(e),n=GE(t,"../package.json");return JSON.parse(zE(n,"utf-8")).version}catch{return"unknown"}}var WE={name:"__complete",description:"Internal command for shell completion",stability:"stable",arguments:[{name:"line",description:"Full command line",required:!0},{name:"fragment",description:"Current word being completed",required:!0}]},JE=Cr.object({line:Cr.string(),fragment:Cr.string()});async function YE(e,t){return t.stdout.write(`
486
+ `),0}var GV=C({path:["__complete"],meta:WE,schema:JE,handler:YE}),ZE={name:"completion",description:"Generate shell completion scripts",stability:"stable",options:[{name:"shell",type:"string",description:"Shell type (bash, zsh, fish)"},{name:"fig",type:"boolean",description:"Generate Fig/Amazon Q completion spec"}]},XE=Cr.object({shell:Cr.enum(["bash","zsh","fish"]).optional(),fig:Cr.boolean().optional()});async function QE(e,t){if(e.fig)return t.stdout.write(`Fig spec generation requires registry access. See fig-spec.ts for implementation.
487
+ `),0;let n=e.shell||eI();if(!n)return t.stderr.write(`Could not detect shell. Please specify with --shell (bash, zsh, or fish)
488
+ `),1;let r=BE(),o=Ff("phala",n,r);switch(t.stdout.write(`# Add this to your shell configuration file:
397
489
 
398
490
  `),t.stdout.write(`${o}
399
491
 
400
492
  `),t.stdout.write(`# Installation instructions:
401
- `),r){case"bash":t.stdout.write(`# For bash, add to ~/.bashrc:
493
+ `),n){case"bash":t.stdout.write(`# For bash, add to ~/.bashrc:
402
494
  `),t.stdout.write(`# phala completion --shell bash >> ~/.bashrc
403
495
  `),t.stdout.write(`# source ~/.bashrc
404
496
  `);break;case"zsh":t.stdout.write(`# For zsh, add to ~/.zshrc:
@@ -406,21 +498,31 @@ complete -c ${e} -f -a "(__${e}_complete)"
406
498
  `),t.stdout.write(`# source ~/.zshrc
407
499
  `);break;case"fish":t.stdout.write(`# For fish, run:
408
500
  `),t.stdout.write(`# phala completion --shell fish > ~/.config/fish/completions/phala.fish
409
- `);break}return 0}function qk(){let e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":null}var jd=b({path:["completion"],meta:Kk,schema:Gk,handler:Hk});import{spawn as r0}from"child_process";import n0 from"chalk";import{execSync as Bk}from"child_process";import{existsSync as Vd,readFileSync as Wk}from"fs";import{homedir as Rn,platform as Jk}from"os";import{basename as Yk,join as Mn}from"path";import zd from"chalk";var cr=class extends Error{constructor(r,n){super(`CVM is not running (current status: ${zd.yellow(r)})`);this.status=r;this.cvmId=n;this.name="CvmNotRunningError"}},lr=class extends Error{constructor(r){super("CVM is not registered on any gateway.");this.cvmId=r;this.name="NoGatewayError"}};function Xo(e){let t=e.lastIndexOf(":");if(t>0){let r=e.substring(t+1);if(/^\d+$/.test(r))return{host:e.substring(0,t),port:r}}return{host:e}}function ei(){let e=[Mn(Rn(),".ssh","id_rsa"),Mn(Rn(),".ssh","id_ed25519"),Mn(Rn(),".ssh","id_ecdsa"),Mn(Rn(),".ssh","id_dsa")];for(let t of e)if(Vd(t))return t}function Kd(e){if(e){let t=e.startsWith("~")?Mn(Rn(),e.slice(1)):e;if(!Vd(t))throw new Error(`SSH key file not found: ${t}`);return t}return ei()}function Tn(e){return e?e.toLowerCase().includes("dev"):!1}function Zk(e){if(!e||typeof e!="object")return;if("gateway_domain"in e){let r=e.gateway_domain;return typeof r=="string"&&r.length>0?r:void 0}let t=e.gateway;if(t&&typeof t=="object"){let r=t.base_domain;if(typeof r=="string"&&r.length>0)return r}}function Xk(e){if(!e||typeof e!="object")return{};if("base_image"in e){let r=e.base_image;return{baseImage:typeof r=="string"?r:void 0,isDev:typeof r=="string"?Tn(r):void 0}}let t=e.os;if(t&&typeof t=="object"){let r=t.name,n=t.is_dev;return{baseImage:typeof r=="string"?r:void 0,isDev:typeof n=="boolean"?n:void 0}}return{}}function Qk(e,t){if(e&&typeof e=="object"&&"app_id"in e){let r=e.app_id;if(typeof r=="string"&&r.length>0)return r.startsWith("app_")?r.slice(4):r}if(t.startsWith("app_"))return t.slice(4);if(/^[0-9a-f]{40}$/i.test(t))return t}async function Qo(e,t){let r=await e.getCvmInfo({id:t}),n=Zk(r);if(!n)throw new lr(t);if(r.status!=="running")throw new cr(r.status,t);let{baseImage:o,isDev:a}=Xk(r),s=Qk(r,t);if(!s)throw new Error("CVM does not have an app_id usable for gateway SSH/SCP.");return{appId:s,gatewayDomain:n,status:r.status,baseImage:o,isDevImage:a}}function ea(e,t){return`${e}-22.${t}`}function ta(e,t){return e!=="443"?e:t||"443"}function ra(e){return/^[a-zA-Z0-9_./:@=-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function e0(){try{return Bk("openssl version",{encoding:"utf-8"}).toLowerCase().includes("libressl")}catch{return!1}}function t0(e){if(Yk(e).toLowerCase().includes("ed25519"))return!0;try{let r=Wk(e,"utf-8");return r.includes("ssh-ed25519")||r.includes("ED25519")}catch{return!1}}function na(e){Jk()==="darwin"&&e0()&&t0(e)&&(i.warn("Detected LibreSSL with ed25519 key on macOS. This combination may cause SSH connection issues."),i.info(`If\xB7you\xB7experience\xB7problems,\xB7install\xB7OpenSSL\xB7via\xB7Homebrew:\xB7${zd.cyan("brew\xB7install\xB7openssl")}`),i.info("Then ensure Homebrew's OpenSSL is in your PATH before /usr/bin"))}function oa(e,t){return["-o",`ProxyCommand=${e?"openssl s_client -quiet -connect %h:%p":"openssl s_client -quiet -connect %h:%p 2>/dev/null"}`,"-o","StrictHostKeyChecking=no","-o","UserKnownHostsFile=/dev/null","-o",`ConnectTimeout=${t}`]}import{z as $t}from"zod";var Gd={name:"ssh",category:"cvm-ops",description:"Connect to a CVM via SSH",stability:"unstable",arguments:[B],options:[N,{name:"port",shorthand:"p",description:"Gateway port (priority: CLI > phala.toml > 443)",type:"string",target:"port"},{name:"gateway",shorthand:"g",description:"Gateway domain (priority: CLI > phala.toml > API)",type:"string",target:"gatewayDomain"},{name:"timeout",shorthand:"t",description:"Connection timeout in seconds (default: 30)",type:"string",target:"timeout"},{name:"verbose",shorthand:"v",description:"Show verbose connection details",type:"boolean",target:"verbose"},{name:"dry-run",description:"Print SSH command without executing",type:"boolean",target:"dryRun"}],passThrough:{description:"All arguments after -- are passed directly to ssh. Common options: -i (identity file), -L (local forward), -R (remote forward), -D (SOCKS proxy), -N (no command), -v (ssh verbose). Any trailing arguments are executed as remote command. Note: -o ProxyCommand is blocked.",examples:["-- -L 8080:localhost:80","-- -i ~/.ssh/key -D 1080 -N","-- ls -la /app"]},examples:[{name:"Connect from phala.toml",value:"phala ssh"},{name:"Connect to CVM",value:"phala ssh app_123"},{name:"Offline mode",value:"phala ssh app_123 -g dstack-pha-prod7.phala.network -p 16185"},{name:"Connect with custom SSH key",value:"phala ssh app_123 -- -i ~/.ssh/custom_key"},{name:"Forward local port 8080 to remote port 80",value:"phala ssh app_123 -- -L 8080:localhost:80"},{name:"SOCKS proxy without remote command",value:"phala ssh app_123 -- -D 1080 -N"},{name:"Execute remote command",value:"phala ssh app_123 -- ls -la /app"},{name:"Connect with verbose output for debugging",value:"phala ssh app_123 -v"},{name:"Print the SSH command without executing",value:"phala ssh app_123 --dry-run -- -L 8080:localhost:80"}]},Hd=$t.object({cvmId:$t.string().optional(),port:$t.string().default("443"),gatewayDomain:$t.string().optional(),timeout:$t.string().default("30"),verbose:$t.boolean().default(!1),dryRun:$t.boolean().default(!1),"--":$t.array($t.string()).optional()});function o0(e){for(let t=0;t<e.length;t++){let r=e[t];if(r==="-o"&&t+1<e.length&&e[t+1].toLowerCase().startsWith("proxycommand")||r.toLowerCase().startsWith("-oproxycommand"))return"-o ProxyCommand"}return null}async function a0(e,t){try{if(!t.cvmId)return t.fail("No CVM ID provided. Either pass a CVM ID as argument or configure it in phala.toml."),1;let{cvmId:r}=G.parse(t.cvmId),n=e["--"]??[],o=o0(n);if(o)return i.error(`${o} is not allowed as it would break the TLS gateway connection.`),1;let a=e.gatewayDomain??t.projectConfig.gateway_domain,s=e.port!=="443"?e.port:t.projectConfig.gateway_port?.toString()??"443",c,l;if(a)l=a,c=r.startsWith("app_")?r.substring(4):r;else try{let C=await k(),_=await Qo(C,r);c=_.appId,l=_.gatewayDomain,(_.isDevImage??Tn(_.baseImage))===!1&&i.warn("This CVM is not using a dev image. SSH access may not be available.")}catch(C){return C instanceof lr?i.error(C.message):C instanceof cr?(i.error(C.message),i.info("Please start the CVM first using: phala cvms start")):i.error(C instanceof Error?C.message:"Failed to fetch CVM info"),1}let m=Xo(l),p=ta(s,m.port),u=ea(c,m.host),d=ei();d&&na(d),e.verbose&&i.info(`Connecting to ${n0.cyan(u)}:${p}...`);let f=oa(e.verbose,e.timeout),{options:g,command:h}=s0(n),v=[];if(e.verbose&&v.push("-v"),v.push(...f,"-p",p,...g,`root@${u}`,...h),e.dryRun){let C=v.map(_=>ra(_));return t.stdout.write(`ssh ${C.join(" ")}
410
- `),0}let w=r0("ssh",v,{stdio:"inherit"});return w.on("error",C=>{i.break(),i.error(`SSH connection failed: ${C.message}`)}),new Promise(C=>{w.on("close",_=>{i.break(),_===0?(i.success("Connection closed"),C(0)):(i.error(`Connection failed with code ${_}`),C(_??1))})})}catch(r){return i.error("Failed to connect via SSH"),r instanceof Error?i.error(r.message):i.error(String(r)),1}}function s0(e){let t=[],r=[],n=new Set(["-b","-c","-D","-E","-e","-F","-I","-i","-J","-L","-l","-m","-O","-o","-P","-p","-R","-S","-W","-w"]),o=0,a=!1;for(;o<e.length;){let s=e[o];if(a){r.push(s),o++;continue}if(s.startsWith("-")){t.push(s);let c=s.length===2?s:s.slice(0,2);n.has(c)&&s.length===2&&o+1<e.length&&(o++,t.push(e[o])),o++}else a=!0,r.push(s),o++}return{options:t,command:r}}var qd=b({path:["ssh"],meta:Gd,schema:Hd,handler:a0});import{spawn as i0}from"child_process";import ti from"chalk";import{z as Dt}from"zod";var Bd={name:"cp",category:"cvm-ops",description:"Copy files to/from a CVM via SCP",stability:"unstable",arguments:[{name:"source",description:"Source path (local or cvm-name:path, use :path for phala.toml cvm_id)",required:!0,target:"source"},{name:"destination",description:"Destination path (local or cvm-name:path, use :path for phala.toml cvm_id)",required:!0,target:"destination"}],options:[{name:"identity",shorthand:"i",description:"SSH identity file (private key)",type:"string",target:"identity"},{name:"port",shorthand:"p",description:"SSH port (priority: CLI > phala.toml > 443)",type:"string",target:"port"},{name:"gateway",shorthand:"g",description:"Gateway domain (priority: CLI > phala.toml > API)",type:"string",target:"gatewayDomain"},{name:"recursive",shorthand:"r",description:"Recursively copy directories",type:"boolean",target:"recursive"},{name:"verbose",shorthand:"v",description:"Show verbose SCP details",type:"boolean",target:"verbose"},{name:"dry-run",description:"Print SCP command without executing",type:"boolean",target:"dryRun"}],examples:[{name:"Upload from phala.toml",value:"phala cp ./local.txt :/root/remote.txt"},{name:"Upload to CVM",value:"phala cp ./local.txt app_123:/root/remote.txt"},{name:"Download from CVM",value:"phala cp app_123:/root/remote.txt ./local.txt"},{name:"Offline mode",value:"phala cp -g dstack-pha-prod7.phala.network -p 16185 ./file.txt app_123:/root/"},{name:"Upload directory recursively",value:"phala cp -r ./local_dir app_123:/root/remote_dir"},{name:"Copy with custom SSH key",value:"phala cp -i ~/.ssh/custom_key app_123:/root/file.txt ./file.txt"},{name:"Print the SCP command without executing",value:"phala cp ./local.txt app_123:/root/remote.txt --dry-run"}]},Wd=Dt.object({source:Dt.string(),destination:Dt.string(),identity:Dt.string().optional(),port:Dt.string().default("443"),gatewayDomain:Dt.string().optional(),recursive:Dt.boolean().default(!1),verbose:Dt.boolean().default(!1),dryRun:Dt.boolean().default(!1)});function Jd(e){let t=e.match(/^([^:]+):(.+)$/);return t?{isRemote:!0,cvmId:t[1],path:t[2]}:{isRemote:!1,path:e}}async function c0(e,t){try{let r=Jd(e.source),n=Jd(e.destination);if(r.isRemote===n.isRemote)return i.error("Either source or destination must be a remote path in format: cvm-id:path"),i.info("Examples:"),i.info(" phala cp ./local.txt app_123:/root/remote.txt"),i.info(" phala cp app_123:/root/remote.txt ./local.txt"),1;let o=r.isRemote?r:n,a;if(o.cvmId?a=$l(o.cvmId):t.cvmId&&(a=G.parse(t.cvmId).cvmId),!a)return t.fail("No CVM ID provided. Either use format cvm-id:path or configure it in phala.toml."),1;let s=e.gatewayDomain??t.projectConfig.gateway_domain,c=e.port!=="443"?e.port:t.projectConfig.gateway_port?.toString()??"443",l,m;if(s)m=s,l=a.startsWith("app_")?a.substring(4):a;else try{let x=await k(),P=await Qo(x,a);l=P.appId,m=P.gatewayDomain,(P.isDevImage??Tn(P.baseImage))===!1&&i.warn("This CVM is not using a dev image. SCP access may not be available.")}catch(x){return x instanceof lr?i.error(x.message):x instanceof cr?(i.error(x.message),i.info("Please start the CVM first using: phala cvms start")):i.error(x instanceof Error?x.message:"Failed to fetch CVM info"),1}let p=Xo(m),u=ta(c,p.port),d=ea(l,p.host),f=Kd(e.identity);f?na(f):i.warn("No default SSH key found. SCP will use ssh-agent or prompt for password."),e.verbose&&i.info(`Connecting to ${ti.cyan(d)}:${u}...`);let h=[...oa(e.verbose,"30"),"-P",u];e.verbose&&h.unshift("-v"),f&&h.push("-i",f),e.recursive&&h.push("-r");let v=r.isRemote?`root@${d}:${r.path}`:r.path,w=n.isRemote?`root@${d}:${n.path}`:n.path;if(h.push(v,w),e.dryRun){let x=h.map(P=>ra(P));return t.stdout.write(`scp ${x.join(" ")}
411
- `),0}let C=r.isRemote?"download":"upload",_=r.isRemote?n.path:r.path,S=r.isRemote?r.path:n.path;i.info(`${C==="upload"?"Uploading":"Downloading"} ${ti.cyan(_)} ${C==="upload"?"to":"from"} ${ti.cyan(S)}...`);let E=i0("scp",h,{stdio:"inherit"});return E.on("error",x=>{i.break(),i.error(`SCP failed: ${x.message}`)}),new Promise(x=>{E.on("close",P=>{i.break(),P===0?(i.success(`${C==="upload"?"Upload":"Download"} completed`),x(0)):(i.error(`Transfer failed with code ${P}`),x(P??1))})})}catch(r){return i.error("Failed to copy file via SCP"),r instanceof Error&&i.error(r.message),1}}var Yd=b({path:["cp"],meta:Bd,schema:Wd,handler:c0});import{z as aa}from"zod";var Zd={name:"ps",category:"cvm-ops",description:"List containers of a CVM",stability:"stable",arguments:[B],options:[Dr,Ee,N],examples:[{name:"List containers interactively",value:"phala ps"},{name:"List containers by app_id",value:"phala ps app_abc123"},{name:"List containers by name",value:"phala ps my-app"},{name:"Output as JSON",value:"phala ps app_abc123 --json"}]},Xd=aa.object({cvmId:aa.string().optional(),json:aa.boolean().default(!1),interactive:aa.boolean().default(!1)});function l0(e){let r=Date.now()/1e3-e;return r<60?"Less than a minute ago":r<3600?`${Math.floor(r/60)} minutes ago`:r<86400?`${Math.floor(r/3600)} hours ago`:r<86400*30?`${Math.floor(r/86400)} days ago`:r<86400*365?`${Math.floor(r/(86400*30))} months ago`:`${Math.floor(r/(86400*365))} years ago`}function m0(e){let t=e[0]??"";return t.startsWith("/")?t.slice(1):t}async function p0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let r=await k(),n=await Za(r,t.cvmId);if(!n.success)return t.fail(n.error.message),1;let o=n.data;if(!o.is_online){let p=o.error??"CVM is offline";return e.json?(t.success({containers:[],error:p}),0):(i.warn(p),0)}let a=o.containers??[];if(e.json)return t.success({containers:a}),0;if(a.length===0)return i.info("No containers running"),0;let s=["NAME","IMAGE","CREATED","STATUS","STATE"],c=a.map(p=>({NAME:m0(p.names),IMAGE:p.image,CREATED:l0(p.created),STATUS:p.status,STATE:p.state})),l={};for(let p of s){l[p]=p.length;for(let u of c)l[p]=Math.max(l[p],u[p].length)}let m=p=>s.map(u=>p[u].padEnd(l[u])).join(" ");console.log(m(Object.fromEntries(s.map(p=>[p,p]))));for(let p of c)console.log(m(p));return 0}catch(r){return i.logDetailedError(r),t.fail(`Failed to list containers: ${r instanceof Error?r.message:String(r)}`),1}}var Qd=b({path:["ps"],meta:Zd,schema:Xd,handler:p0});import{z as qe}from"zod";var ef={name:"logs",category:"cvm-ops",description:"Fetch logs from a CVM",stability:"unstable",arguments:[{name:"container-name",description:"Container name to fetch logs from",required:!1,target:"containerName"}],options:[{name:"serial",description:"CVM serial console (boot, kernel, docker-compose)",type:"boolean",target:"serial"},{name:"cvm-stdout",description:"CVM stdout channel",type:"boolean",target:"cvmStdout"},{name:"cvm-stderr",description:"CVM stderr channel",type:"boolean",target:"cvmStderr"},{name:"stderr",description:"Include container stderr (container mode only)",type:"boolean",target:"stderr"},{name:"tail",shorthand:"n",description:"Number of lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},{name:"since",description:"Start time (RFC3339 or relative, e.g. 42m)",type:"string",target:"since",argumentName:"since"},{name:"until",description:"End time (RFC3339 or relative)",type:"string",target:"until",argumentName:"until"},Dr,ie,N],examples:[{name:"Container stdout",value:"phala logs my-service"},{name:"Container stderr",value:"phala logs my-service --stderr"},{name:"Follow container logs",value:"phala logs my-service -f"},{name:"CVM serial console",value:"phala logs --serial"},{name:"CVM stdout channel",value:"phala logs --cvm-stdout"},{name:"CVM stderr channel",value:"phala logs --cvm-stderr"},{name:"Last 100 lines",value:"phala logs my-service -n 100"},{name:"Specify CVM",value:"phala logs my-service --cvm-id app_abc123"}]},tf=qe.object({containerName:qe.string().optional(),cvmId:qe.string().optional(),serial:qe.boolean().default(!1),cvmStdout:qe.boolean().default(!1),cvmStderr:qe.boolean().default(!1),stderr:qe.boolean().default(!1),since:qe.string().optional(),until:qe.string().optional(),tail:qe.number().optional(),follow:qe.boolean().default(!1),timestamps:qe.boolean().default(!1),json:qe.boolean().default(!1),interactive:qe.boolean().default(!1)});function rf(e,t,r){if(e.channel==="stdout"){t.includeStdout&&r.stdout.write(e.message);return}t.includeStderr&&r.stderr.write(e.message)}function u0(e){let t=[e.serial&&"serial",e.cvmStdout&&"stdout",e.cvmStderr&&"stderr"].filter(Boolean);return t.length>1?null:t.length===1?{type:"cvm",channel:t[0]}:e.containerName?{type:"container",containerName:e.containerName}:null}async function d0(e,t){if(ln(e.json),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:r}=G.parse(t.cvmId),n=[e.serial,e.cvmStdout,e.cvmStderr].filter(Boolean).length;if(n>1)return t.fail("--serial, --cvm-stdout, and --cvm-stderr are mutually exclusive"),1;let o=n===1;if(e.containerName&&o)return t.fail("Cannot combine container name with --serial/--cvm-stdout/--cvm-stderr. Use container name for container logs, or CVM flags for CVM-level logs."),1;if(e.stderr&&o)return t.fail("--stderr is only valid in container mode, not with CVM flags"),1;let a=u0(e);if(!a)try{let s=await rm(r);s==="running"?a={type:"container"}:(i.warn(`CVM is ${s}. Falling back to serial console logs.`),i.warn("Use --serial, --cvm-stdout, or --cvm-stderr for specific CVM channels."),a={type:"cvm",channel:"serial"})}catch{a={type:"container"}}return a.type==="cvm"?f0(r,a.channel,e,t):g0(r,a.containerName,e,t)}async function f0(e,t,r,n){try{if(r.follow){if(r.json)return n.fail("Cannot use --json with --follow"),1;let a=new AbortController,s=()=>a.abort();process.on("SIGINT",s),process.on("SIGTERM",s);try{await tm(e,t,c=>n.stdout.write(c),{tail:r.tail,timestamps:r.timestamps,since:r.since,until:r.until},a.signal)}catch(c){if(c.name!=="AbortError")throw c}finally{process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}return 0}let o=await em(e,t,{tail:r.tail,timestamps:r.timestamps,since:r.since,until:r.until});return r.json?(n.success({logs:o,cvm_id:e,channel:t}),0):(o.trim()?n.stdout.write(o):i.info(`No ${t} logs available`),0)}catch(o){return n.fail(`Failed to fetch CVM ${t} logs: ${o instanceof Error?o.message:String(o)}`),1}}async function g0(e,t,r,n){let o={includeStdout:!0,includeStderr:r.stderr},a={container:t,since:r.since,until:r.until,tail:r.tail,timestamps:r.timestamps,matchContainerIdPrefix:!1};try{if(r.follow){if(r.json)return n.fail("Cannot use --json with --follow"),1;let p=new AbortController,u=()=>p.abort();process.on("SIGINT",u),process.on("SIGTERM",u);try{await Zl(e,d=>rf(d,o,n),a,p.signal)}catch(d){if(d.name!=="AbortError")throw d}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u)}return 0}let c=(await Yl(e,a)).filter(p=>p.channel==="stderr"?o.includeStderr:o.includeStdout),l=c.map(p=>p.message).join("");if(r.json)return n.success({logs:l,cvm_id:e}),0;if(l.trim()){for(let p of c)rf(p,o,n);return 0}return await En(e)||i.info("No logs available"),0}catch(s){return n.fail(`Failed to fetch container logs: ${s instanceof Error?s.message:String(s)}`),await En(e),1}}var nf=b({path:["logs"],meta:ef,schema:tf,handler:d0});var of={path:["self"],meta:{name:"self",category:"advanced",description:"CLI self-management",stability:"unstable"}};import w0 from"prompts";import{execa as _0}from"execa";import sa from"semver";import Rt from"chalk";import{z as Kr}from"zod";var h0={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},y0={name:"yes",shorthand:"y",description:"Skip confirmation prompt",type:"boolean",target:"yes"},v0={name:"dry-run",description:"Print update command without executing",type:"boolean",target:"dryRun"},b0={name:"package-manager",description:"Override package manager (npm|pnpm|yarn|bun)",type:"string",target:"packageManager",aliases:["pm"],argumentName:"name"},C0={name:"channel",description:"Release channel/dist-tag (e.g. latest, beta, next)",type:"string",target:"channel",argumentName:"tag"},af={name:"update",description:"Update the Phala CLI",stability:"unstable",options:[h0,y0,v0,b0,C0],examples:[{name:"Update CLI",value:"phala self update"},{name:"Dry run",value:"phala self update --dry-run"},{name:"Beta channel",value:"phala self update --channel beta"}]},sf=Kr.object({json:Kr.boolean().default(!1),yes:Kr.boolean().default(!1),dryRun:Kr.boolean().default(!1),packageManager:Kr.enum(["npm","pnpm","yarn","bun"]).optional(),channel:Kr.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/).optional()});var cf="Phala-Network/phala-cloud",ri="cli-v";function S0(e,t){return`https://github.com/${cf}/compare/${ri}${e}...${ri}${t}`}function k0(e){return`https://github.com/${cf}/releases/tag/${ri}${e}`}function Ln(e){return typeof e=="string"&&e.trim().length>0}function E0(e){return e.startsWith("@")?e.replace("/","%2F"):e}async function I0(e,t){let n=`https://registry.npmjs.org/${E0(e)}`,o=new AbortController,a=setTimeout(()=>o.abort(),5e3);try{let s=await fetch(n,{signal:o.signal,headers:{accept:"application/json"}});if(!s.ok)return{latestVersion:null,error:`Registry returned ${s.status}`};let c=await s.json();if(!c||typeof c!="object")return{latestVersion:null,error:"Invalid registry response"};let l=c["dist-tags"];if(!l||typeof l!="object")return{latestVersion:null,error:"No dist-tags in response"};let m=l[t]??l.latest;return typeof m!="string"?{latestVersion:null,error:`Channel "${t}" not found`}:{latestVersion:sa.valid(m)}}catch(s){return s instanceof Error&&s.name==="AbortError"?{latestVersion:null,error:"Request timed out"}:{latestVersion:null,error:String(s)}}finally{clearTimeout(a)}}function A0(e){if(typeof e!="object"||e===null||!("code"in e))return;let t=e.code;return typeof t=="string"?t:void 0}function x0(e){let r=sa.parse(e)?.prerelease?.[0];return typeof r=="string"&&r.length>0?r:void 0}function P0(e,t,r,n){let o=[],a=n instanceof Error&&typeof n.message=="string"?n.message:String(n),s=A0(n);(/permission denied|eacces|not permitted/i.test(a)||n instanceof Error&&(s==="EACCES"||s==="EPERM"))&&o.push(`Permission error while running "${r}". Ensure your global install prefix is writable (avoid sudo if possible).`),/command not found|not recognized as an internal|ENOENT/i.test(a)&&o.push(`Package manager "${t}" not found. Install it or rerun with --package-manager npm|pnpm|yarn|bun.`);let c=e.NVM_DIR;t==="npm"&&Ln(c)&&o.push(`Detected nvm (NVM_DIR=${c}). Make sure the intended Node version is active (e.g. "nvm use <version>") and your npm global bin is on PATH.`);let l=e.FNM_DIR;return t==="npm"&&Ln(l)&&o.push(`Detected fnm (FNM_DIR=${l}). Ensure your shell has fnm env loaded (e.g. eval "$(fnm env)") so the correct node/npm are on PATH.`),o}function $0(e,t,r){if(Ln(e))return e.trim();if(Ln(r.PHALA_UPDATE_CHANNEL))return r.PHALA_UPDATE_CHANNEL;let n=Mr("updateCheckChannel");return Ln(n)?n:x0(t)??"latest"}async function D0(e,t){let r=t.cli?.packageName??"phala",n=t.cli?.runtime??vo(),o=e.packageManager??hn(t.env,n),a=t.cli?.packageVersion??"0.0.0",s=$0(e.channel,a,t.env);e.json||t.stderr.write(Rt.gray(`Checking for updates...
412
- `));let{latestVersion:c,error:l}=await I0(r,s);if(c){let S=Date.now(),E=s.replace(/[^a-zA-Z0-9_-]/g,"_");er({[`updateCheckLastAt_${E}`]:S,[`updateCheckLatest_${E}`]:c,...s==="latest"?{updateCheckLastAt:S,updateCheckLatest:c}:{}})}let m=sa.valid(a),p=c&&m&&!sa.gt(c,m),u=!p&&c&&m?S0(m,c):void 0,d=c?k0(c):void 0;e.json||(l?(t.stderr.write(Rt.yellow(`Warning: Could not fetch latest version: ${l}
413
- `)),t.stderr.write(Rt.gray(`Current version: v${a}
414
- `))):c&&(t.stderr.write(Rt.gray(`Current version: v${a}
415
- `)),t.stderr.write(Rt.gray(`Latest version: v${c}${s!=="latest"?` (${s})`:""}
416
- `)),p?t.stderr.write(Rt.green(`You are already on the latest version.
417
- `)):(t.stderr.write(Rt.yellow(`Update available: v${a} \u2192 v${c}
418
- `)),u&&t.stderr.write(Rt.gray(`${u}
419
- `)))));let f=o==="bun"&&c?`${r}@${c}`:s==="latest"?`${r}@latest`:`${r}@${s}`,g=yn(o,f),{command:h,args:v}=im(o,f);if(e.json&&e.dryRun)return t.success({command:g,dryRun:!0,currentVersion:a,latestVersion:c,isUpToDate:p,releaseUrl:d,changelogUrl:u}),0;if(e.dryRun)return t.stderr.write(Rt.gray(`Command: ${g}
420
- `)),0;let w=t.stderr.isTTY===!0&&e.json!==!0;if(!e.yes&&!w){let S=`Non-interactive session detected. Re-run with --yes to apply the update, or use --dry-run to print the command.
421
- `;return e.json?(t.success({command:g,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:c,isUpToDate:p,releaseUrl:d,changelogUrl:u}),0):(t.stderr.write(S),1)}let C=p?`Already up to date. Reinstall anyway with "${g}"?`:`Run "${g}"?`;if(!(e.yes||await w0({type:"confirm",name:"ok",message:C,initial:!p}).then(S=>S.ok===!0)))return e.json&&t.success({command:g,ran:!1,currentVersion:a,latestVersion:c,isUpToDate:p,releaseUrl:d,changelogUrl:u}),0;try{return await _0(h,v,{stdio:"inherit"}),e.json?(t.success({command:g,ran:!0,currentVersion:a,latestVersion:c,isUpToDate:p,releaseUrl:d,changelogUrl:u}),0):(i.success("Update completed"),0)}catch(S){let E=P0(t.env,o,g,S);if(i.logDetailedError(S),t.fail("Self update failed",{command:g,hints:E.length>0?E:void 0}),!e.json&&E.length>0)for(let x of E)i.info(x);return 1}}var lf=b({path:["self","update"],meta:af,schema:sf,handler:D0});var ni={group:of,commands:[lf]};import ia from"chalk";import{z as Ye}from"zod";var mf={name:"apps",category:"manage",description:"List dstack apps",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},{name:"search",description:"Search by name, app_id, vm_uuid, or instance_id",type:"string",target:"search",group:"basic"},{name:"status",description:"Filter by CVM status (can be specified multiple times)",type:"string[]",target:"status",group:"basic"},{name:"listed",description:"Filter by listed status",type:"boolean",target:"listed",negatedName:"no-listed",group:"basic"},{name:"base-image",description:"Filter by base image name",type:"string",target:"baseImage",group:"basic"},{name:"instance-type",description:"Filter by instance type",type:"string",target:"instanceType",group:"basic"},{name:"kms-type",description:"Filter by KMS type",type:"string",target:"kmsType",group:"basic"},{name:"node",description:"Filter by node name",type:"string",target:"node",group:"basic"},{name:"region",description:"Filter by region identifier",type:"string",target:"region",group:"basic"},Ee],examples:[{name:"List apps",value:"phala apps"},{name:"Second page",value:"phala apps --page 2"},{name:"Search by name",value:"phala apps --search my-app"},{name:"Filter by status",value:"phala apps --status running"},{name:"Output as JSON",value:"phala apps --json"}]},pf=Ye.object({page:Ye.coerce.number().int().min(1).default(1),pageSize:Ye.coerce.number().int().min(1).max(100).default(50),search:Ye.string().optional(),status:Ye.array(Ye.string()).optional(),listed:Ye.boolean().optional(),baseImage:Ye.string().optional(),instanceType:Ye.string().optional(),kmsType:Ye.string().optional(),node:Ye.string().optional(),region:Ye.string().optional(),json:Ye.boolean().default(!1)});function R0(e){return e.toLowerCase().endsWith("ing")?ia.yellow(e):e==="running"?ia.green(e):e==="stopped"?ia.red(e):ia.yellow(e)}async function M0(e,t){try{let r=await k(),n=await Mo(r,{page:e.page,pageSize:e.pageSize,search:e.search,status:e.status,listed:e.listed,baseImage:e.baseImage,instanceType:e.instanceType,kmsType:e.kmsType,node:e.node,region:e.region});if(n.success===!1)return t.fail(n.error.message),1;let o=n.data;if(e.json)return t.success(o),0;let a=["APP_ID","CVM","STATUS","UPTIME"],s=o.items.map(c=>({APP_ID:c.appId,CVM:c.cvmName,STATUS:R0(c.status),UPTIME:c.uptime??"-"}));return s.length===0?(i.info("No CVMs found"),0):(ce(a,s),i.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(r){return i.logDetailedError(r),t.fail(`Failed to list apps: ${r instanceof Error?r.message:String(r)}`),1}}var uf=b({path:["apps"],meta:mf,schema:pf,handler:M0});import{z as oi}from"zod";var df={name:"instance-types",category:"deploy",description:"List available instance types",stability:"unstable",arguments:[{name:"family",description:"Instance type family (cpu, gpu)",required:!1,target:"family"}],options:[Ee],examples:[{name:"List all instance type families",value:"phala instance-types"},{name:"List CPU instance types",value:"phala instance-types cpu"},{name:"List GPU instance types",value:"phala instance-types gpu"},{name:"Output as JSON",value:"phala instance-types --json"}]},ff=oi.object({family:oi.string().optional(),json:oi.boolean().default(!1)});function gf(e){return(e/1024).toFixed(0)}function hf(e){return`$${e}`}async function T0(e,t){try{let r=await k();if(e.family){let a=await Oa(r,{family:e.family});if(e.json)return t.success(a),0;let s=["ID","NAME","vCPU","Memory(GB)","Hourly Rate","GPU"],c=a.items.map(l=>({ID:l.id,NAME:l.name,vCPU:l.vcpu.toString(),"Memory(GB)":gf(l.memory_mb),"Hourly Rate":hf(l.hourly_rate),GPU:l.requires_gpu?"Yes":"No"}));return c.length===0?(i.info(`No instance types found for family '${e.family}'`),0):(ce(s,c),i.info(`Total: ${a.total} instance types`),0)}let n=await Ua(r);if(e.json)return t.success(n),0;if(n.result.length===0)return i.info("No instance types found"),0;let o=["ID","NAME","vCPU","Memory(GB)","Hourly Rate"];for(let a of n.result){i.info(`
422
- Family: ${a.name} (${a.total} types)`);let s=a.items.map(c=>({ID:c.id,NAME:c.name,vCPU:c.vcpu.toString(),"Memory(GB)":gf(c.memory_mb),"Hourly Rate":hf(c.hourly_rate)}));ce(o,s)}return 0}catch(r){return i.logDetailedError(r),t.fail(`Failed to list instance types: ${r instanceof Error?r.message:String(r)}`),1}}var yf=b({path:["instance-types"],meta:df,schema:ff,handler:T0});import{z as vf}from"zod";var bf={name:"runtime-config",description:"Show the runtime configuration of a CVM",stability:"stable",category:"cvm-ops",arguments:[B],options:[N],examples:[{name:"Show runtime config by app_id",value:"phala runtime-config app_123"},{name:"Show runtime config by name",value:"phala runtime-config my-app"}]},Cf=vf.object({cvmId:vf.string().optional()});async function L0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Either pass a CVM ID as argument or configure it in phala.toml."),1;try{let r=await k(),n=await fl(r,t.cvmId);if(!n.success)return t.fail(`Failed to get runtime config: ${n.error.message}`),1;let o=n.data;if(ne())return t.success(o),0;if(console.log(`Hostname: ${o.hostname??"-"}`),console.log(`Gateway Domain: ${o.default_gateway_domain??"-"}`),console.log(`SSH Keys: ${o.ssh_authorized_keys.length>0?`${o.ssh_authorized_keys.length} key(s)`:"none"}`),o.ssh_authorized_keys.length>0){console.log(),console.log("SSH Authorized Keys:");for(let a of o.ssh_authorized_keys)console.log(` ${a}`)}return 0}catch(r){return i.logDetailedError(r),t.fail("Failed to get CVM runtime config"),1}}var wf=b({path:["runtime-config"],meta:bf,schema:Cf,handler:L0});import{existsSync as kf,readFileSync as O0}from"fs";import{basename as F0,join as ca}from"path";import{homedir as la,hostname as j0}from"os";import{z as ai}from"zod";var N0={name:"name",description:"Name for the SSH key (default: key file name)",type:"string",target:"name"},U0={name:"key-file",description:"Path to SSH public key file (default: ~/.ssh/id_ed25519.pub or ~/.ssh/id_rsa.pub)",type:"string",target:"keyFile"},_f={name:"add",description:"Add a local SSH public key to your account",stability:"stable",options:[N0,U0],examples:[{name:"Add default SSH key",value:"phala ssh-keys add"},{name:"Add a specific key with a name",value:"phala ssh-keys add --name my-laptop --key-file ~/.ssh/id_ed25519.pub"}]},Sf=ai.object({name:ai.string().optional(),keyFile:ai.string().optional()});function V0(){let e=[ca(la(),".ssh","id_ed25519.pub"),ca(la(),".ssh","id_rsa.pub"),ca(la(),".ssh","id_ecdsa.pub")];for(let t of e)if(kf(t))return t}async function z0(e,t){try{let r=e.keyFile;if(r?.startsWith("~/")&&(r=ca(la(),r.slice(2))),!r&&(r=V0(),!r))return t.fail("No SSH public key found. Specify one with --key-file or generate one with ssh-keygen."),1;if(!kf(r))return t.fail(`SSH public key file not found: ${r}`),1;let n=O0(r,"utf-8").trim(),o=e.name??`${j0()}-${F0(r,".pub")}`,a=await k(),s=await es(a,{name:o,public_key:n});return s.success?ne()?(t.success(s.data),0):(i.success(`Added SSH key "${o}" (${s.data.key_type}, ${s.data.fingerprint})`),0):(t.fail(`Failed to add SSH key: ${s.error.message}`),1)}catch(r){return i.logDetailedError(r),t.fail("Failed to add SSH key"),1}}var Ef=b({path:["ssh-keys","add"],meta:_f,schema:Sf,handler:z0});var If={path:["ssh-keys"],meta:{name:"ssh-keys",category:"manage",description:"Manage SSH keys",stability:"stable"}};import{z as Af}from"zod";var K0={name:"github_username",description:"GitHub username to import SSH keys from",required:!0,target:"githubUsername"},xf={name:"import-github",description:"Import SSH keys from a GitHub user's public profile",stability:"stable",arguments:[K0],examples:[{name:"Import SSH keys from a GitHub profile",value:"phala ssh-keys import-github octocat"}]},Pf=Af.object({githubUsername:Af.string()});async function G0(e,t){try{let r=await k(),n=i.startSpinner(`Importing SSH keys from github.com/${e.githubUsername}`),o=await Qa(r,{github_username:e.githubUsername});if(n.stop(!0),!o.success)return t.fail(`Failed to import SSH keys: ${o.error.message}`),1;if(ne())return t.success(o.data),0;let{keys_added:a,keys_skipped:s,errors:c}=o.data;if(c.length>0){i.warn(`${c.length} key(s) could not be imported:`);for(let l of c)i.warn(` ${l}`)}return a>0?i.success(`Added ${a} SSH key(s) from github.com/${e.githubUsername} (${s} skipped)`):i.info("No new keys added (all keys already exist)"),0}catch(r){return i.logDetailedError(r),t.fail("Failed to import SSH keys"),1}}var $f=b({path:["ssh-keys","import-github"],meta:xf,schema:Pf,handler:G0});import{z as H0}from"zod";var Df={name:"list",aliases:["ls"],description:"List SSH keys for the current user",stability:"stable",examples:[{name:"List all SSH keys",value:"phala ssh-keys list"}]},Rf=H0.object({});async function q0(e,t){try{let r=await k(),n=await on(r);if(!n.success)return t.fail(`Failed to list SSH keys: ${n.error.message}`),1;let o=n.data;if(ne())return t.success(o),0;if(o.length===0)return i.info("No SSH keys found"),0;let a=["ID","NAME","TYPE","FINGERPRINT","SOURCE","CREATED"],s=o.map(c=>({ID:c.id,NAME:c.name,TYPE:c.key_type,FINGERPRINT:c.fingerprint,SOURCE:c.source,CREATED:c.created_at.slice(0,10)}));return ce(a,s),0}catch(r){return i.logDetailedError(r),t.fail("Failed to list SSH keys"),1}}var Mf=b({path:["ssh-keys","list"],meta:Df,schema:Rf,handler:q0});import W0 from"inquirer";import{z as si}from"zod";var B0={name:"key_id",description:"SSH key ID to remove (from `phala ssh-keys list`)",required:!1,target:"keyId"},Tf={name:"remove",aliases:["rm"],description:"Remove an SSH key from your account",stability:"stable",arguments:[B0],options:[N],examples:[{name:"Remove an SSH key by ID",value:"phala ssh-keys remove sshkey_xxx"},{name:"Interactive selection",value:"phala ssh-keys rm -i"}]},Lf=si.object({keyId:si.string().optional(),interactive:si.boolean().default(!1)});async function J0(){let e=i.startSpinner("Fetching SSH keys"),t=await k(),r=await on(t);if(e.stop(!0),!r.success){i.error(`Failed to fetch SSH keys: ${r.error.message}`);return}let n=r.data;if(n.length===0){i.info("No SSH keys found");return}let o=n.map(s=>({name:`${s.id} ${s.name} (${s.key_type}, ${s.fingerprint})`,value:s.id})),{selectedKey:a}=await W0.prompt([{type:"list",name:"selectedKey",message:"Select an SSH key to remove:",choices:o}]);return a}async function Y0(e,t){try{let r=e.keyId;if(!r&&e.interactive&&(r=await J0(),!r))return 0;if(!r)return t.fail("Missing key_id. Use `phala ssh-keys rm <key_id>` or `phala ssh-keys rm -i` for interactive selection."),1;let n=await k(),o=await ts(n,{keyId:r});return o.success?ne()?(t.success({keyId:r,removed:!0}),0):(i.success(`SSH key ${r} removed`),0):(t.fail(`Failed to remove SSH key: ${o.error.message}`),1)}catch(r){return i.logDetailedError(r),t.fail("Failed to remove SSH key"),1}}var Nf=b({path:["ssh-keys","remove"],meta:Tf,schema:Lf,handler:Y0});var ii={group:If,commands:[Mf,Ef,Nf,$f]};import{z as ci}from"zod";var Uf={name:"whoami",category:"profile",description:"Print the current user",stability:"stable",options:[...jt,ie],examples:[{name:"Show current user",value:"phala whoami"},{name:"JSON output",value:"phala whoami --json"}]},Of=ci.object({json:ci.boolean().default(!1),apiToken:ci.string().optional()});async function Z0(e,t){let{client:r,auth:n}=await uo(t,{apiToken:e.apiToken});if(!n.apiKey)return t.fail('Not authenticated. Run "phala login" first.'),1;let o=await Pe(r);if(!o.success)return t.fail(o.error?.message||"Failed to get user information"),1;let{user:a,workspace:s}=o.data;return e.json?(t.success({username:a.username,email:a.email,workspace:s.name,profile:n.profileName}),0):(t.stdout.write(`${a.username} (${s.name})
423
- `),0)}var Ff=b({path:["whoami"],meta:Uf,schema:Of,handler:Z0});import Qf from"chalk";import tg from"inquirer";import{createPublicClient as X0,createWalletClient as Q0,http as eg}from"viem";import{privateKeyToAccount as eE,nonceManager as tE}from"viem/accounts";import{z as j}from"zod";var Gr={name:"cvm",description:"CVM identifier (UUID, app_id, instance_id, or name)",required:!0,target:"cvm"},jf={path:["allow-devices"],meta:{name:"allow-devices",description:"Manage on-chain device allowlist for a CVM's app contract",stability:"unstable"}},Vf={name:"list",aliases:["ls"],description:"List allowed devices from the on-chain contract",stability:"unstable",arguments:[Gr],options:[ie],examples:[{name:"List devices on-chain",value:"phala allow-devices list app_abc123"}]},zf=j.object({cvm:j.string(),json:j.boolean().default(!1)}),Kf={name:"add",description:"Add device(s) to the on-chain allowlist",stability:"unstable",arguments:[Gr,{name:"device_id",description:"Device ID (bytes32 hex) or node name to resolve device_id from available nodes",required:!1,target:"deviceId"}],options:[{name:"private-key",description:"Private key for signing the transaction",type:"string",target:"privateKey",group:"advanced"},{name:"rpc-url",description:"Custom RPC URL for the blockchain",type:"string",target:"rpcUrl",group:"advanced"},{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ie,N],examples:[{name:"Add device to allowlist",value:"phala allow-devices add app_abc123 0xaabb... --private-key 0x..."},{name:"Interactive multi-select from available nodes",value:"phala allow-devices add app_abc123 -i --private-key 0x..."}]},Gf=j.object({cvm:j.string(),deviceId:j.string().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1),interactive:j.boolean().default(!1)}),Hf={name:"remove",aliases:["rm"],description:"Remove device(s) from the on-chain allowlist",stability:"unstable",arguments:[Gr,{name:"device_id",description:"Device ID (bytes32 hex) or node name to resolve device_id from available nodes",required:!1,target:"deviceId"}],options:[{name:"private-key",description:"Private key for signing the transaction",type:"string",target:"privateKey",group:"advanced"},{name:"rpc-url",description:"Custom RPC URL for the blockchain",type:"string",target:"rpcUrl",group:"advanced"},{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ie,N],examples:[{name:"Remove device from allowlist",value:"phala allow-devices remove app_abc123 0xaabb... --private-key 0x..."},{name:"Interactive multi-select from allowed devices",value:"phala allow-devices remove app_abc123 -i --private-key 0x..."}]},qf=j.object({cvm:j.string(),deviceId:j.string().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1),interactive:j.boolean().default(!1)}),Bf={name:"allow-any",description:"Set allow-any-device flag on the contract",stability:"unstable",arguments:[Gr],options:[{name:"enable",description:"Enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Disable allow-any-device",type:"boolean",target:"disable"},{name:"private-key",description:"Private key for signing the transaction",type:"string",target:"privateKey",group:"advanced"},{name:"rpc-url",description:"Custom RPC URL for the blockchain",type:"string",target:"rpcUrl",group:"advanced"},{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ie],examples:[{name:"Enable allow-any-device",value:"phala allow-devices allow-any app_abc123 --enable --private-key 0x..."},{name:"Disable allow-any-device",value:"phala allow-devices allow-any app_abc123 --disable --private-key 0x..."}]},Wf=j.object({cvm:j.string(),enable:j.boolean().optional(),disable:j.boolean().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1)}),Jf={name:"disallow-any",description:"Disable allow-any-device on the contract",stability:"unstable",arguments:[Gr],options:[{name:"private-key",description:"Private key for signing the transaction",type:"string",target:"privateKey",group:"advanced"},{name:"rpc-url",description:"Custom RPC URL for the blockchain",type:"string",target:"rpcUrl",group:"advanced"},{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ie],examples:[{name:"Disable allow-any-device",value:"phala allow-devices disallow-any app_abc123 --private-key 0x..."}]},Yf=j.object({cvm:j.string(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1)}),Zf={name:"toggle-allow-any",description:"Toggle allow-any-device on the contract (or force via --enable/--disable)",stability:"unstable",arguments:[Gr],options:[{name:"enable",description:"Force enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Force disable allow-any-device",type:"boolean",target:"disable"},{name:"private-key",description:"Private key for signing the transaction",type:"string",target:"privateKey",group:"advanced"},{name:"rpc-url",description:"Custom RPC URL for the blockchain",type:"string",target:"rpcUrl",group:"advanced"},{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ie],examples:[{name:"Toggle based on current state",value:"phala allow-devices toggle-allow-any app_abc123 --private-key 0x..."},{name:"Force enable",value:"phala allow-devices toggle-allow-any app_abc123 --enable --private-key 0x..."}]},Xf=j.object({cvm:j.string(),enable:j.boolean().optional(),disable:j.boolean().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1)});var rE=/^(0x)?[0-9a-fA-F]{64}$/;function mr(e){return(e.startsWith("0x")?e:`0x${e}`).toLowerCase()}function ma(e){return rE.test(e)}function li(e,t){if(!t)return null;let r=e.blockExplorers?.default?.url;return r?`${r}/tx/${t}`:null}function nE(e){return e.enable&&e.disable||!e.enable&&!e.disable?null:!!e.enable}function oE(e){return e.enable&&e.disable?null:e.enable===!0?!0:e.disable===!0?!1:!(e.currentValue??!1)}function aE(e){return new Set(e.map(t=>mr(t.device_id)))}async function mi(e){let{chain:t,rpcUrl:r,appAddress:n,deviceIds:o,condition:a,description:s}=e,c=e.timeoutMs??6e4,l=e.intervalMs??2e3,m=Date.now()+c;for(;Date.now()<m;){let p=await Qn({chain:t,rpcUrl:r,appAddress:n,deviceIds:o});if(a(p))return!0;await new Promise(u=>{setTimeout(u,l)})}return i.warn(`Timeout waiting for on-chain state: ${s}`),!1}function rg(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function pi(e){let t=e.privateKey||process.env.PRIVATE_KEY;if(!t)throw new Error("Private key required. Use --private-key or set PRIVATE_KEY env var.");return t.startsWith("0x")?t:`0x${t}`}function ng(e,t,r){let n=eE(t,{nonceManager:tE}),o=X0({chain:e,transport:eg(r)}),a=Q0({account:n,chain:e,transport:eg(r)});return{publicClient:o,walletClient:a}}async function og(e){if(ma(e))return mr(e);if(e.startsWith("0x"))throw new Error(`Invalid device ID format: ${e}. Expected 32-byte hex (0x + 64 hex chars).`);let t=await k(),r=await Zt(t);if(!r.success)throw new Error(`Failed to resolve node name "${e}": ${r.error.message}`);let n=r.data.nodes.filter(a=>a.name.toLowerCase()===e.toLowerCase());if(n.length===0)throw new Error(`Node "${e}" not found. Provide a valid node name or device ID.`);if(n.length>1)throw new Error(`Node name "${e}" is ambiguous (${n.length} matches). Use an explicit device ID.`);let o=n[0].device_id;if(!o||!ma(o))throw new Error(`Node "${n[0].name}" has no valid device_id. Use an explicit device ID.`);return mr(o)}async function Hr(e,t){let r=await k(),n=await Q(r,{id:e});if(!n.success)return t.fail(n.error.message),null;let o=n.data;if(!o)return t.fail("CVM not found"),null;let a=o.app_id;if(!a)return t.fail("CVM has no app_id assigned yet."),null;let s=await eo(r,{appId:a});if(!s.success)return t.fail(s.error.message),null;let c=s.data;if(!c.is_onchain_kms)return t.fail("This app does not use on-chain KMS. Device management requires an on-chain KMS."),null;if(!c.chain_id||!c.app_contract_address)return t.fail("Missing chain_id or app_contract_address in allowlist response."),null;let l=Na[c.chain_id];return l?{chain:l,chainId:c.chain_id,appContractAddress:c.app_contract_address,allowlist:c}:(t.fail(`Unsupported chain_id: ${c.chain_id}`),null)}async function sE(e,t){try{let r=await Hr(e.cvm,t);if(!r)return 1;let{chain:n,appContractAddress:o}=r,a=await k(),s=await Zt(a),c=new Map;if(s.success)for(let d of s.data.nodes)d.device_id&&ma(d.device_id)&&c.set(mr(d.device_id),d.name);else i.warn("Could not fetch platform nodes \u2014 node names will not be shown.");let l=Array.from(c.keys()),m=await Qn({chain:n,appAddress:o,deviceIds:l});if(e.json)return t.success({appAddress:o,chain:n.name,owner:m.owner,allowAnyDevice:m.allowAnyDevice,devices:m.devices.map(d=>({deviceId:d,nodeName:c.get(d.toLowerCase())??null}))}),0;if(i.info(`Contract: ${o}`),i.info(`Chain: ${n.name}`),i.info(`Owner: ${m.owner}`),i.info(`Allow Any Device: ${m.allowAnyDevice?Qf.green("yes"):Qf.red("no")}`),m.devices.length===0)return i.info("No devices found"),0;let p=["DEVICE_ID","NODE"],u=m.devices.map(d=>({DEVICE_ID:d,NODE:c.get(d.toLowerCase())??"-"}));return ce(p,u),0}catch(r){return i.logDetailedError(r),t.fail(`Failed: ${r instanceof Error?r.message:String(r)}`),1}}async function iE(e,t){try{let r=await Hr(e.cvm,t);if(!r)return 1;let{chain:n,appContractAddress:o,allowlist:a}=r,s=pi(e),c;if(e.interactive&&!e.deviceId){let u=await k(),d=await Zt(u);if(!d.success)return t.fail(d.error.message),1;let f=aE(a.devices),g=d.data.nodes.filter(v=>v.device_id&&ma(v.device_id)&&!f.has(mr(v.device_id)));if(g.length===0)return i.info("All available devices are already in the allowlist."),0;let{selected:h}=await tg.prompt([{type:"checkbox",name:"selected",message:"Select devices to add:",choices:g.map(v=>({name:`${v.name} ${v.device_id}`,value:v.device_id}))}]);if(h.length===0)return i.info("No devices selected."),0;c=h.map(v=>mr(v))}else if(e.deviceId)c=[await og(e.deviceId)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let{publicClient:l,walletClient:m}=ng(n,s,e.rpcUrl),p=[];for(let u of c){let d=await cl({chain:n,appAddress:o,deviceId:u,walletClient:m,publicClient:l,skipPrerequisiteChecks:!0});if(!d.success){let g=d;return t.fail(`Failed to add ${u}: ${g.error.message}`),1}let f=d.data;p.push({deviceId:u,txHash:f.transactionHash,explorer:li(n,f.transactionHash)})}if(e.json)return t.success(p),0;for(let u of p)i.success(`Added ${u.deviceId}`),i.info(`Transaction: ${u.txHash}`),u.explorer&&i.info(`Explorer: ${u.explorer}`);if(e.wait){if(!await mi({chain:n,rpcUrl:e.rpcUrl,appAddress:o,deviceIds:c,description:"devices to be allowed",condition:d=>d.allowAnyDevice?!0:c.every(f=>d.devices.some(g=>g.toLowerCase()===f.toLowerCase()))}))return t.fail("Devices not observed on-chain within timeout."),1;i.success("On-chain allowlist updated.")}else i.info("Backend allowlist API may lag behind chain. Use --wait to verify via RPC.");return 0}catch(r){return rg(r)?(i.info("Cancelled."),0):(i.logDetailedError(r),t.fail(`Failed: ${r instanceof Error?r.message:String(r)}`),1)}}async function cE(e,t){try{let r=await Hr(e.cvm,t);if(!r)return 1;let{chain:n,appContractAddress:o,allowlist:a}=r,s=pi(e),c;if(e.interactive&&!e.deviceId){let u=a.devices.filter(f=>f.status==="allowed");if(u.length===0)return t.fail("No allowed devices found to remove."),1;let{selected:d}=await tg.prompt([{type:"checkbox",name:"selected",message:"Select devices to remove:",choices:u.map(f=>({name:`${f.node_name??"-"} ${f.device_id}`,value:f.device_id}))}]);if(d.length===0)return i.info("No devices selected."),0;c=d.map(f=>mr(f))}else if(e.deviceId)c=[await og(e.deviceId)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let{publicClient:l,walletClient:m}=ng(n,s,e.rpcUrl),p=[];for(let u of c){let d=await ll({chain:n,appAddress:o,deviceId:u,walletClient:m,publicClient:l,skipPrerequisiteChecks:!0});if(!d.success){let g=d;return t.fail(`Failed to remove ${u}: ${g.error.message}`),1}let f=d.data;p.push({deviceId:u,txHash:f.transactionHash,explorer:li(n,f.transactionHash)})}if(e.json)return t.success(p),0;for(let u of p)i.success(`Removed ${u.deviceId}`),i.info(`Transaction: ${u.txHash}`),u.explorer&&i.info(`Explorer: ${u.explorer}`);if(e.wait)if((await Qn({chain:n,rpcUrl:e.rpcUrl,appAddress:o,deviceIds:[]})).allowAnyDevice)i.warn("allowAnyDevice is enabled \u2014 removed devices still appear as allowed. Disable allow-any-device first if you want per-device enforcement.");else{if(!await mi({chain:n,rpcUrl:e.rpcUrl,appAddress:o,deviceIds:c,description:"devices to be removed",condition:f=>c.every(g=>!f.devices.some(h=>h.toLowerCase()===g.toLowerCase()))}))return t.fail("Devices still appear on-chain after timeout."),1;i.success("On-chain allowlist updated.")}else i.info("Backend allowlist API may lag behind chain. Use --wait to verify via RPC.");return 0}catch(r){return rg(r)?(i.info("Cancelled."),0):(i.logDetailedError(r),t.fail(`Failed: ${r instanceof Error?r.message:String(r)}`),1)}}async function lE(e,t){let r=nE(e);if(r===null)return t.fail(e.enable&&e.disable?"Cannot use both --enable and --disable.":"Specify --enable or --disable to set the allow-any-device flag."),1;try{let n=await Hr(e.cvm,t);return n?await ui(e,t,{chain:n.chain,appContractAddress:n.appContractAddress,allow:r}):1}catch(n){return i.logDetailedError(n),t.fail(`Failed: ${n instanceof Error?n.message:String(n)}`),1}}async function mE(e,t){try{let r=await Hr(e.cvm,t);return r?await ui(e,t,{chain:r.chain,appContractAddress:r.appContractAddress,allow:!1}):1}catch(r){return i.logDetailedError(r),t.fail(`Failed: ${r instanceof Error?r.message:String(r)}`),1}}async function pE(e,t){try{let r=await Hr(e.cvm,t);if(!r)return 1;let n=oE({enable:e.enable,disable:e.disable,currentValue:r.allowlist.allow_any_device});return n===null?(t.fail("Cannot use both --enable and --disable."),1):await ui(e,t,{chain:r.chain,appContractAddress:r.appContractAddress,allow:n})}catch(r){return i.logDetailedError(r),t.fail(`Failed: ${r instanceof Error?r.message:String(r)}`),1}}async function ui(e,t,r){let{chain:n,appContractAddress:o,allow:a}=r,s=pi(e),c=await ml({chain:n,rpcUrl:e.rpcUrl,appAddress:o,allow:a,privateKey:s});if(!c.success){let p=c;return t.fail(p.error.message),1}let l=c.data,m=li(n,l.transactionHash);if(e.json)return t.success({...l,explorer:m??void 0}),0;if(i.success(`Allow-any-device ${a?"enabled":"disabled"} successfully!`),i.info(`Transaction: ${l.transactionHash}`),m&&i.info(`Explorer: ${m}`),e.wait){if(!await mi({chain:n,rpcUrl:e.rpcUrl,appAddress:o,deviceIds:[],description:`allowAnyDevice=${a}`,condition:u=>u.allowAnyDevice===a}))return t.fail(`allowAnyDevice did not become ${a} within timeout.`),1;i.success("On-chain allow-any state updated.")}else i.info("Backend allowlist API may lag behind chain. Use --wait to verify via RPC.");return 0}var uE=b({path:["allow-devices","list"],meta:Vf,schema:zf,handler:sE}),dE=b({path:["allow-devices","add"],meta:Kf,schema:Gf,handler:iE}),fE=b({path:["allow-devices","remove"],meta:Hf,schema:qf,handler:cE}),gE=b({path:["allow-devices","allow-any"],meta:Bf,schema:Wf,handler:lE}),hE=b({path:["allow-devices","disallow-any"],meta:Jf,schema:Yf,handler:mE}),yE=b({path:["allow-devices","toggle-allow-any"],meta:Zf,schema:Xf,handler:pE}),di={group:jf,commands:[uE,dE,fE,gE,hE,yE]};var _E=wE(import.meta.url),SE=bE(_E),kE=CE(SE,"../package.json"),pa=JSON.parse(vE(kE,"utf-8")),EE="+62338ec",IE=`v${pa.version}${EE}`,AE=vo(),U=new _o;U.registerCommand(lu);U.registerCommand(uf);U.registerCommand(yf);U.registerCommand(od);U.registerCommand(qd);U.registerCommand(Yd);U.registerCommand(Qd);U.registerCommand(nf);U.registerCommand(wf);U.registerCommand(Yu);U.registerCommand(id);U.registerCommand(Ld);U.registerCommand(Od);U.registerCommand(Am);U.registerCommand(Om);U.registerCommand(Ff);U.registerCommand(jd);U.registerCommand(Ed);U.registerGroup(ni.group);for(let e of ni.commands)U.registerCommand(e);U.registerGroup(Ss.group);for(let e of Ss.commands)U.registerCommand(e);U.registerGroup(Es.group);for(let e of Es.commands)U.registerCommand(e);U.registerGroup(Uo.group);for(let e of Uo.commands)U.registerCommand(e);for(let e of Uo.subgroups??[]){U.registerGroup(e.group);for(let t of e.commands)U.registerCommand(t)}U.registerGroup(js.group);for(let e of js.commands)U.registerCommand(e);U.registerGroup(ii.group);for(let e of ii.commands)U.registerCommand(e);U.registerGroup(Vs.group);for(let e of Vs.commands)U.registerCommand(e);U.registerGroup(Ws.group);for(let e of Ws.commands)U.registerCommand(e);U.registerGroup(Ys.group);for(let e of Ys.commands)U.registerCommand(e);U.registerGroup(Xs.group);for(let e of Xs.commands)U.registerCommand(e);U.registerGroup(di.group);for(let e of di.commands)U.registerCommand(e);process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function xE(){await bm({env:process.env,stderr:process.stderr});let e=await gm({registry:U,argv:process.argv.slice(2),executableName:pa.name??"phala",version:IE,packageName:pa.name??"phala",packageVersion:pa.version,runtime:AE,cwd:process.cwd(),env:process.env,stdout:process.stdout,stderr:process.stderr,stdin:process.stdin});process.exit(e)}xE().catch(e=>{console.error("An error occurred:",e),process.exit(1)});
501
+ `);break}return 0}function eI(){let e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":null}var Vf=C({path:["completion"],meta:ZE,schema:XE,handler:QE});import{spawn as mI}from"child_process";import pI from"chalk";import{execSync as tI}from"child_process";import{existsSync as Hf,readFileSync as nI}from"fs";import{homedir as co,platform as rI}from"os";import{basename as oI,join as lo}from"path";import zf from"chalk";var xn=class extends Error{constructor(n,r){super(`CVM is not running (current status: ${zf.yellow(n)})`);this.status=n;this.cvmId=r;this.name="CvmNotRunningError"}},Dn=class extends Error{constructor(n){super("CVM is not registered on any gateway.");this.cvmId=n;this.name="NoGatewayError"}};function $a(e){let t=e.lastIndexOf(":");if(t>0){let n=e.substring(t+1);if(/^\d+$/.test(n))return{host:e.substring(0,t),port:n}}return{host:e}}function Mi(){let e=[lo(co(),".ssh","id_rsa"),lo(co(),".ssh","id_ed25519"),lo(co(),".ssh","id_ecdsa"),lo(co(),".ssh","id_dsa")];for(let t of e)if(Hf(t))return t}function Kf(e){if(e){let t=e.startsWith("~")?lo(co(),e.slice(1)):e;if(!Hf(t))throw new Error(`SSH key file not found: ${t}`);return t}return Mi()}function mo(e){return e?e.toLowerCase().includes("dev"):!1}function aI(e){if(!e||typeof e!="object")return;if("gateway_domain"in e){let n=e.gateway_domain;return typeof n=="string"&&n.length>0?n:void 0}let t=e.gateway;if(t&&typeof t=="object"){let n=t.base_domain;if(typeof n=="string"&&n.length>0)return n}}function sI(e){if(!e||typeof e!="object")return{};if("base_image"in e){let n=e.base_image;return{baseImage:typeof n=="string"?n:void 0,isDev:typeof n=="string"?mo(n):void 0}}let t=e.os;if(t&&typeof t=="object"){let n=t.name,r=t.is_dev;return{baseImage:typeof n=="string"?n:void 0,isDev:typeof r=="boolean"?r:void 0}}return{}}function iI(e,t){if(e&&typeof e=="object"&&"app_id"in e){let n=e.app_id;if(typeof n=="string"&&n.length>0)return n.startsWith("app_")?n.slice(4):n}if(t.startsWith("app_"))return t.slice(4);if(/^[0-9a-f]{40}$/i.test(t))return t}async function Ra(e,t){let n=await e.getCvmInfo({id:t}),r=aI(n);if(!r)throw new Dn(t);if(n.status!=="running")throw new xn(n.status,t);let{baseImage:o,isDev:a}=sI(n),s=iI(n,t);if(!s)throw new Error("CVM does not have an app_id usable for gateway SSH/SCP.");return{appId:s,gatewayDomain:r,status:n.status,baseImage:o,isDevImage:a}}function xa(e,t){return`${e}-22.${t}`}function Da(e,t){return e!=="443"?e:t||"443"}function Ta(e){return/^[a-zA-Z0-9_./:@=-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function cI(){try{return tI("openssl version",{encoding:"utf-8"}).toLowerCase().includes("libressl")}catch{return!1}}function lI(e){if(oI(e).toLowerCase().includes("ed25519"))return!0;try{let n=nI(e,"utf-8");return n.includes("ssh-ed25519")||n.includes("ED25519")}catch{return!1}}function Ma(e){rI()==="darwin"&&cI()&&lI(e)&&(c.warn("Detected LibreSSL with ed25519 key on macOS. This combination may cause SSH connection issues."),c.info(`If\xB7you\xB7experience\xB7problems,\xB7install\xB7OpenSSL\xB7via\xB7Homebrew:\xB7${zf.cyan("brew\xB7install\xB7openssl")}`),c.info("Then ensure Homebrew's OpenSSL is in your PATH before /usr/bin"))}function La(e,t){return["-o",`ProxyCommand=${e?"openssl s_client -quiet -connect %h:%p":"openssl s_client -quiet -connect %h:%p 2>/dev/null"}`,"-o","StrictHostKeyChecking=no","-o","UserKnownHostsFile=/dev/null","-o",`ConnectTimeout=${t}`]}import{z as Gt}from"zod";var Gf={name:"ssh",category:"cvm-ops",description:"Connect to a CVM via SSH",stability:"unstable",arguments:[Y],options:[O,{name:"port",shorthand:"p",description:"Gateway port (priority: CLI > phala.toml > 443)",type:"string",target:"port"},{name:"gateway",shorthand:"g",description:"Gateway domain (priority: CLI > phala.toml > API)",type:"string",target:"gatewayDomain"},{name:"timeout",shorthand:"t",description:"Connection timeout in seconds (default: 30)",type:"string",target:"timeout"},{name:"verbose",shorthand:"v",description:"Show verbose connection details",type:"boolean",target:"verbose"},{name:"dry-run",description:"Print SSH command without executing",type:"boolean",target:"dryRun"}],passThrough:{description:"All arguments after -- are passed directly to ssh. Common options: -i (identity file), -L (local forward), -R (remote forward), -D (SOCKS proxy), -N (no command), -v (ssh verbose). Any trailing arguments are executed as remote command. Note: -o ProxyCommand is blocked.",examples:["-- -L 8080:localhost:80","-- -i ~/.ssh/key -D 1080 -N","-- ls -la /app"]},examples:[{name:"Connect from phala.toml",value:"phala ssh"},{name:"Connect to CVM",value:"phala ssh app_123"},{name:"Offline mode",value:"phala ssh app_123 -g dstack-pha-prod7.phala.network -p 16185"},{name:"Connect with custom SSH key",value:"phala ssh app_123 -- -i ~/.ssh/custom_key"},{name:"Forward local port 8080 to remote port 80",value:"phala ssh app_123 -- -L 8080:localhost:80"},{name:"SOCKS proxy without remote command",value:"phala ssh app_123 -- -D 1080 -N"},{name:"Execute remote command",value:"phala ssh app_123 -- ls -la /app"},{name:"Connect with verbose output for debugging",value:"phala ssh app_123 -v"},{name:"Print the SSH command without executing",value:"phala ssh app_123 --dry-run -- -L 8080:localhost:80"}]},qf=Gt.object({cvmId:Gt.string().optional(),port:Gt.string().default("443"),gatewayDomain:Gt.string().optional(),timeout:Gt.string().default("30"),verbose:Gt.boolean().default(!1),dryRun:Gt.boolean().default(!1),"--":Gt.array(Gt.string()).optional()});function dI(e){for(let t=0;t<e.length;t++){let n=e[t];if(n==="-o"&&t+1<e.length&&e[t+1].toLowerCase().startsWith("proxycommand")||n.toLowerCase().startsWith("-oproxycommand"))return"-o ProxyCommand"}return null}async function uI(e,t){try{if(!t.cvmId)return t.fail("No CVM ID provided. Either pass a CVM ID as argument or configure it in phala.toml."),1;let{cvmId:n}=H.parse(t.cvmId),r=e["--"]??[],o=dI(r);if(o)return c.error(`${o} is not allowed as it would break the TLS gateway connection.`),1;let a=e.gatewayDomain??t.projectConfig.gateway_domain,s=e.port!=="443"?e.port:t.projectConfig.gateway_port?.toString()??"443",i,l;if(a)l=a,i=n.startsWith("app_")?n.substring(4):n;else try{let w=await E(t),S=await Ra(w,n);i=S.appId,l=S.gatewayDomain,(S.isDevImage??mo(S.baseImage))===!1&&c.warn("This CVM is not using a dev image. SSH access may not be available.")}catch(w){return w instanceof Dn?c.error(w.message):w instanceof xn?(c.error(w.message),c.info("Please start the CVM first using: phala cvms start")):c.error(w instanceof Error?w.message:"Failed to fetch CVM info"),1}let p=$a(l),m=Da(s,p.port),d=xa(i,p.host),f=Mi();f&&Ma(f),e.verbose&&c.info(`Connecting to ${pI.cyan(d)}:${m}...`);let u=La(e.verbose,e.timeout),{options:h,command:g}=fI(r),y=[];if(e.verbose&&y.push("-v"),y.push(...u,"-p",m,...h,`root@${d}`,...g),e.dryRun){let w=y.map(S=>Ta(S));return t.stdout.write(`ssh ${w.join(" ")}
502
+ `),0}let b=mI("ssh",y,{stdio:"inherit"});return b.on("error",w=>{c.break(),c.error(`SSH connection failed: ${w.message}`)}),new Promise(w=>{b.on("close",S=>{c.break(),S===0?(c.success("Connection closed"),w(0)):(c.error(`Connection failed with code ${S}`),w(S??1))})})}catch(n){return c.error("Failed to connect via SSH"),n instanceof Error?c.error(n.message):c.error(String(n)),1}}function fI(e){let t=[],n=[],r=new Set(["-b","-c","-D","-E","-e","-F","-I","-i","-J","-L","-l","-m","-O","-o","-P","-p","-R","-S","-W","-w"]),o=0,a=!1;for(;o<e.length;){let s=e[o];if(a){n.push(s),o++;continue}if(s.startsWith("-")){t.push(s);let i=s.length===2?s:s.slice(0,2);r.has(i)&&s.length===2&&o+1<e.length&&(o++,t.push(e[o])),o++}else a=!0,n.push(s),o++}return{options:t,command:n}}var Bf=C({path:["ssh"],meta:Gf,schema:qf,handler:uI});import{spawn as gI}from"child_process";import Li from"chalk";import{z as qt}from"zod";var Wf={name:"cp",category:"cvm-ops",description:"Copy files to/from a CVM via SCP",stability:"unstable",arguments:[{name:"source",description:"Source path (local or cvm-name:path, use :path for phala.toml cvm_id)",required:!0,target:"source"},{name:"destination",description:"Destination path (local or cvm-name:path, use :path for phala.toml cvm_id)",required:!0,target:"destination"}],options:[{name:"identity",shorthand:"i",description:"SSH identity file (private key)",type:"string",target:"identity"},{name:"port",shorthand:"p",description:"SSH port (priority: CLI > phala.toml > 443)",type:"string",target:"port"},{name:"gateway",shorthand:"g",description:"Gateway domain (priority: CLI > phala.toml > API)",type:"string",target:"gatewayDomain"},{name:"recursive",shorthand:"r",description:"Recursively copy directories",type:"boolean",target:"recursive"},{name:"verbose",shorthand:"v",description:"Show verbose SCP details",type:"boolean",target:"verbose"},{name:"dry-run",description:"Print SCP command without executing",type:"boolean",target:"dryRun"}],examples:[{name:"Upload from phala.toml",value:"phala cp ./local.txt :/root/remote.txt"},{name:"Upload to CVM",value:"phala cp ./local.txt app_123:/root/remote.txt"},{name:"Download from CVM",value:"phala cp app_123:/root/remote.txt ./local.txt"},{name:"Offline mode",value:"phala cp -g dstack-pha-prod7.phala.network -p 16185 ./file.txt app_123:/root/"},{name:"Upload directory recursively",value:"phala cp -r ./local_dir app_123:/root/remote_dir"},{name:"Copy with custom SSH key",value:"phala cp -i ~/.ssh/custom_key app_123:/root/file.txt ./file.txt"},{name:"Print the SCP command without executing",value:"phala cp ./local.txt app_123:/root/remote.txt --dry-run"}]},Jf=qt.object({source:qt.string(),destination:qt.string(),identity:qt.string().optional(),port:qt.string().default("443"),gatewayDomain:qt.string().optional(),recursive:qt.boolean().default(!1),verbose:qt.boolean().default(!1),dryRun:qt.boolean().default(!1)});function Yf(e){let t=e.match(/^([^:]+):(.+)$/);return t?{isRemote:!0,cvmId:t[1],path:t[2]}:{isRemote:!1,path:e}}async function hI(e,t){try{let n=Yf(e.source),r=Yf(e.destination);if(n.isRemote===r.isRemote)return c.error("Either source or destination must be a remote path in format: cvm-id:path"),c.info("Examples:"),c.info(" phala cp ./local.txt app_123:/root/remote.txt"),c.info(" phala cp app_123:/root/remote.txt ./local.txt"),1;let o=n.isRemote?n:r,a;if(o.cvmId?a=Cm(o.cvmId):t.cvmId&&(a=H.parse(t.cvmId).cvmId),!a)return t.fail("No CVM ID provided. Either use format cvm-id:path or configure it in phala.toml."),1;let s=e.gatewayDomain??t.projectConfig.gateway_domain,i=e.port!=="443"?e.port:t.projectConfig.gateway_port?.toString()??"443",l,p;if(s)p=s,l=a.startsWith("app_")?a.substring(4):a;else try{let I=await E(t),$=await Ra(I,a);l=$.appId,p=$.gatewayDomain,($.isDevImage??mo($.baseImage))===!1&&c.warn("This CVM is not using a dev image. SCP access may not be available.")}catch(I){return I instanceof Dn?c.error(I.message):I instanceof xn?(c.error(I.message),c.info("Please start the CVM first using: phala cvms start")):c.error(I instanceof Error?I.message:"Failed to fetch CVM info"),1}let m=$a(p),d=Da(i,m.port),f=xa(l,m.host),u=Kf(e.identity);u?Ma(u):c.warn("No default SSH key found. SCP will use ssh-agent or prompt for password."),e.verbose&&c.info(`Connecting to ${Li.cyan(f)}:${d}...`);let g=[...La(e.verbose,"30"),"-P",d];e.verbose&&g.unshift("-v"),u&&g.push("-i",u),e.recursive&&g.push("-r");let y=n.isRemote?`root@${f}:${n.path}`:n.path,b=r.isRemote?`root@${f}:${r.path}`:r.path;if(g.push(y,b),e.dryRun){let I=g.map($=>Ta($));return t.stdout.write(`scp ${I.join(" ")}
503
+ `),0}let w=n.isRemote?"download":"upload",S=n.isRemote?r.path:n.path,k=n.isRemote?n.path:r.path;c.info(`${w==="upload"?"Uploading":"Downloading"} ${Li.cyan(S)} ${w==="upload"?"to":"from"} ${Li.cyan(k)}...`);let _=gI("scp",g,{stdio:"inherit"});return _.on("error",I=>{c.break(),c.error(`SCP failed: ${I.message}`)}),new Promise(I=>{_.on("close",$=>{c.break(),$===0?(c.success(`${w==="upload"?"Upload":"Download"} completed`),I(0)):(c.error(`Transfer failed with code ${$}`),I($??1))})})}catch(n){return c.error("Failed to copy file via SCP"),n instanceof Error&&c.error(n.message),1}}var Zf=C({path:["cp"],meta:Wf,schema:Jf,handler:hI});import{z as Ua}from"zod";var Xf={name:"ps",category:"cvm-ops",description:"List containers of a CVM",stability:"stable",arguments:[Y],options:[wn,ke,O],examples:[{name:"List containers interactively",value:"phala ps"},{name:"List containers by app_id",value:"phala ps app_abc123"},{name:"List containers by name",value:"phala ps my-app"},{name:"Output as JSON",value:"phala ps app_abc123 --json"}]},Qf=Ua.object({cvmId:Ua.string().optional(),json:Ua.boolean().default(!1),interactive:Ua.boolean().default(!1)});function yI(e){let n=Date.now()/1e3-e;return n<60?"Less than a minute ago":n<3600?`${Math.floor(n/60)} minutes ago`:n<86400?`${Math.floor(n/3600)} hours ago`:n<86400*30?`${Math.floor(n/86400)} days ago`:n<86400*365?`${Math.floor(n/(86400*30))} months ago`:`${Math.floor(n/(86400*365))} years ago`}function vI(e){let t=e[0]??"";return t.startsWith("/")?t.slice(1):t}async function CI(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await Es(n,t.cvmId);if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(!o.is_online){let m=o.error??"CVM is offline";return e.json?(t.success({containers:[],error:m}),0):(c.warn(m),0)}let a=o.containers??[];if(e.json)return t.success({containers:a}),0;if(a.length===0)return c.info("No containers running"),0;let s=["NAME","IMAGE","CREATED","STATUS","STATE"],i=a.map(m=>({NAME:vI(m.names),IMAGE:m.image,CREATED:yI(m.created),STATUS:m.status,STATE:m.state})),l={};for(let m of s){l[m]=m.length;for(let d of i)l[m]=Math.max(l[m],d[m].length)}let p=m=>s.map(d=>m[d].padEnd(l[d])).join(" ");console.log(p(Object.fromEntries(s.map(m=>[m,m]))));for(let m of i)console.log(p(m));return 0}catch(n){return c.logDetailedError(n),t.fail(`Failed to list containers: ${n instanceof Error?n.message:String(n)}`),1}}var eg=C({path:["ps"],meta:Xf,schema:Qf,handler:CI});import{z as Qe}from"zod";var tg={name:"logs",category:"cvm-ops",description:"Fetch logs from a CVM",stability:"unstable",arguments:[{name:"container-name",description:"Container name to fetch logs from",required:!1,target:"containerName"}],options:[{name:"serial",description:"CVM serial console (boot, kernel, docker-compose)",type:"boolean",target:"serial"},{name:"cvm-stdout",description:"CVM stdout channel",type:"boolean",target:"cvmStdout"},{name:"cvm-stderr",description:"CVM stderr channel",type:"boolean",target:"cvmStderr"},{name:"stderr",description:"Include container stderr (container mode only)",type:"boolean",target:"stderr"},{name:"tail",shorthand:"n",description:"Number of lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},{name:"since",description:"Start time (RFC3339 or relative, e.g. 42m)",type:"string",target:"since",argumentName:"since"},{name:"until",description:"End time (RFC3339 or relative)",type:"string",target:"until",argumentName:"until"},wn,pe,O],examples:[{name:"Container stdout",value:"phala logs my-service"},{name:"Container stderr",value:"phala logs my-service --stderr"},{name:"Follow container logs",value:"phala logs my-service -f"},{name:"CVM serial console",value:"phala logs --serial"},{name:"CVM stdout channel",value:"phala logs --cvm-stdout"},{name:"CVM stderr channel",value:"phala logs --cvm-stderr"},{name:"Last 100 lines",value:"phala logs my-service -n 100"},{name:"Specify CVM",value:"phala logs my-service --cvm-id app_abc123"}]},ng=Qe.object({containerName:Qe.string().optional(),cvmId:Qe.string().optional(),serial:Qe.boolean().default(!1),cvmStdout:Qe.boolean().default(!1),cvmStderr:Qe.boolean().default(!1),stderr:Qe.boolean().default(!1),since:Qe.string().optional(),until:Qe.string().optional(),tail:Qe.number().optional(),follow:Qe.boolean().default(!1),timestamps:Qe.boolean().default(!1),json:Qe.boolean().default(!1),interactive:Qe.boolean().default(!1)});function rg(e,t,n){if(e.channel==="stdout"){t.includeStdout&&n.stdout.write(e.message);return}t.includeStderr&&n.stderr.write(e.message)}function bI(e){let t=[e.serial&&"serial",e.cvmStdout&&"stdout",e.cvmStderr&&"stderr"].filter(Boolean);return t.length>1?null:t.length===1?{type:"cvm",channel:t[0]}:e.containerName?{type:"container",containerName:e.containerName}:null}async function wI(e,t){if(Vr(e.json),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:n}=H.parse(t.cvmId),r=[e.serial,e.cvmStdout,e.cvmStderr].filter(Boolean).length;if(r>1)return t.fail("--serial, --cvm-stdout, and --cvm-stderr are mutually exclusive"),1;let o=r===1;if(e.containerName&&o)return t.fail("Cannot combine container name with --serial/--cvm-stdout/--cvm-stderr. Use container name for container logs, or CVM flags for CVM-level logs."),1;if(e.stderr&&o)return t.fail("--stderr is only valid in container mode, not with CVM flags"),1;let a=bI(e);if(!a)try{let s=await zm(n);s==="running"?a={type:"container"}:(c.warn(`CVM is ${s}. Falling back to serial console logs.`),c.warn("Use --serial, --cvm-stdout, or --cvm-stderr for specific CVM channels."),a={type:"cvm",channel:"serial"})}catch{a={type:"container"}}return a.type==="cvm"?_I(n,a.channel,e,t):kI(n,a.containerName,e,t)}async function _I(e,t,n,r){try{if(n.follow){if(n.json)return r.fail("Cannot use --json with --follow"),1;let a=new AbortController,s=()=>a.abort();process.on("SIGINT",s),process.on("SIGTERM",s);try{await Hm(e,t,i=>r.stdout.write(i),{tail:n.tail,timestamps:n.timestamps,since:n.since,until:n.until},a.signal)}catch(i){if(i.name!=="AbortError")throw i}finally{process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}return 0}let o=await Vm(e,t,{tail:n.tail,timestamps:n.timestamps,since:n.since,until:n.until});return n.json?(r.success({logs:o,cvm_id:e,channel:t}),0):(o.trim()?r.stdout.write(o):c.info(`No ${t} logs available`),0)}catch(o){return r.fail(`Failed to fetch CVM ${t} logs: ${o instanceof Error?o.message:String(o)}`),1}}async function kI(e,t,n,r){let o={includeStdout:!0,includeStderr:n.stderr},a={container:t,since:n.since,until:n.until,tail:n.tail,timestamps:n.timestamps,matchContainerIdPrefix:!1};try{if(n.follow){if(n.json)return r.fail("Cannot use --json with --follow"),1;let m=new AbortController,d=()=>m.abort();process.on("SIGINT",d),process.on("SIGTERM",d);try{await Nm(e,f=>rg(f,o,r),a,m.signal)}catch(f){if(f.name!=="AbortError")throw f}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d)}return 0}let i=(await Om(e,a)).filter(m=>m.channel==="stderr"?o.includeStderr:o.includeStdout),l=i.map(m=>m.message).join("");if(n.json)return r.success({logs:l,cvm_id:e}),0;if(l.trim()){for(let m of i)rg(m,o,r);return 0}return await no(e)||c.info("No logs available"),0}catch(s){return r.fail(`Failed to fetch container logs: ${s instanceof Error?s.message:String(s)}`),await no(e),1}}var og=C({path:["logs"],meta:tg,schema:ng,handler:wI});var ag={path:["self"],meta:{name:"self",category:"advanced",description:"CLI self-management",stability:"unstable"}};import $I from"prompts";import{execa as RI}from"execa";import Oa from"semver";import Bt from"chalk";import{z as br}from"zod";var SI={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},EI={name:"yes",shorthand:"y",description:"Skip confirmation prompt",type:"boolean",target:"yes"},II={name:"dry-run",description:"Print update command without executing",type:"boolean",target:"dryRun"},AI={name:"package-manager",description:"Override package manager (npm|pnpm|yarn|bun)",type:"string",target:"packageManager",aliases:["pm"],argumentName:"name"},PI={name:"channel",description:"Release channel/dist-tag (e.g. latest, beta, next)",type:"string",target:"channel",argumentName:"tag"},sg={name:"update",description:"Update the Phala CLI",stability:"unstable",options:[SI,EI,II,AI,PI],examples:[{name:"Update CLI",value:"phala self update"},{name:"Dry run",value:"phala self update --dry-run"},{name:"Beta channel",value:"phala self update --channel beta"}]},ig=br.object({json:br.boolean().default(!1),yes:br.boolean().default(!1),dryRun:br.boolean().default(!1),packageManager:br.enum(["npm","pnpm","yarn","bun"]).optional(),channel:br.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/).optional()});var cg="Phala-Network/phala-cloud",Ui="cli-v";function xI(e,t){return`https://github.com/${cg}/compare/${Ui}${e}...${Ui}${t}`}function DI(e){return`https://github.com/${cg}/releases/tag/${Ui}${e}`}function po(e){return typeof e=="string"&&e.trim().length>0}function TI(e){return e.startsWith("@")?e.replace("/","%2F"):e}async function MI(e,t){let r=`https://registry.npmjs.org/${TI(e)}`,o=new AbortController,a=setTimeout(()=>o.abort(),5e3);try{let s=await fetch(r,{signal:o.signal,headers:{accept:"application/json"}});if(!s.ok)return{latestVersion:null,error:`Registry returned ${s.status}`};let i=await s.json();if(!i||typeof i!="object")return{latestVersion:null,error:"Invalid registry response"};let l=i["dist-tags"];if(!l||typeof l!="object")return{latestVersion:null,error:"No dist-tags in response"};let p=l[t]??l.latest;return typeof p!="string"?{latestVersion:null,error:`Channel "${t}" not found`}:{latestVersion:Oa.valid(p)}}catch(s){return s instanceof Error&&s.name==="AbortError"?{latestVersion:null,error:"Request timed out"}:{latestVersion:null,error:String(s)}}finally{clearTimeout(a)}}function LI(e){if(typeof e!="object"||e===null||!("code"in e))return;let t=e.code;return typeof t=="string"?t:void 0}function UI(e){let n=Oa.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function OI(e,t,n,r){let o=[],a=r instanceof Error&&typeof r.message=="string"?r.message:String(r),s=LI(r);(/permission denied|eacces|not permitted/i.test(a)||r instanceof Error&&(s==="EACCES"||s==="EPERM"))&&o.push(`Permission error while running "${n}". Ensure your global install prefix is writable (avoid sudo if possible).`),/command not found|not recognized as an internal|ENOENT/i.test(a)&&o.push(`Package manager "${t}" not found. Install it or rerun with --package-manager npm|pnpm|yarn|bun.`);let i=e.NVM_DIR;t==="npm"&&po(i)&&o.push(`Detected nvm (NVM_DIR=${i}). Make sure the intended Node version is active (e.g. "nvm use <version>") and your npm global bin is on PATH.`);let l=e.FNM_DIR;return t==="npm"&&po(l)&&o.push(`Detected fnm (FNM_DIR=${l}). Ensure your shell has fnm env loaded (e.g. eval "$(fnm env)") so the correct node/npm are on PATH.`),o}function NI(e,t,n){if(po(e))return e.trim();if(po(n.PHALA_UPDATE_CHANNEL))return n.PHALA_UPDATE_CHANNEL;let r=mr("updateCheckChannel");return po(r)?r:UI(t)??"latest"}async function jI(e,t){let n=t.cli?.packageName??"phala",r=t.cli?.runtime??Jo(),o=e.packageManager??Br(t.env,r),a=t.cli?.packageVersion??"0.0.0",s=NI(e.channel,a,t.env);e.json||t.stderr.write(Bt.gray(`Checking for updates...
504
+ `));let{latestVersion:i,error:l}=await MI(n,s);if(i){let k=Date.now(),_=s.replace(/[^a-zA-Z0-9_-]/g,"_");kn({[`updateCheckLastAt_${_}`]:k,[`updateCheckLatest_${_}`]:i,...s==="latest"?{updateCheckLastAt:k,updateCheckLatest:i}:{}})}let p=Oa.valid(a),m=i&&p&&!Oa.gt(i,p),d=!m&&i&&p?xI(p,i):void 0,f=i?DI(i):void 0;e.json||(l?(t.stderr.write(Bt.yellow(`Warning: Could not fetch latest version: ${l}
505
+ `)),t.stderr.write(Bt.gray(`Current version: v${a}
506
+ `))):i&&(t.stderr.write(Bt.gray(`Current version: v${a}
507
+ `)),t.stderr.write(Bt.gray(`Latest version: v${i}${s!=="latest"?` (${s})`:""}
508
+ `)),m?t.stderr.write(Bt.green(`You are already on the latest version.
509
+ `)):(t.stderr.write(Bt.yellow(`Update available: v${a} \u2192 v${i}
510
+ `)),d&&t.stderr.write(Bt.gray(`${d}
511
+ `)))));let u=o==="bun"&&i?`${n}@${i}`:s==="latest"?`${n}@latest`:`${n}@${s}`,h=Wr(o,u),{command:g,args:y}=Wm(o,u);if(e.json&&e.dryRun)return t.success({command:h,dryRun:!0,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:f,changelogUrl:d}),0;if(e.dryRun)return t.stderr.write(Bt.gray(`Command: ${h}
512
+ `)),0;let b=t.stderr.isTTY===!0&&e.json!==!0;if(!e.yes&&!b){let k=`Non-interactive session detected. Re-run with --yes to apply the update, or use --dry-run to print the command.
513
+ `;return e.json?(t.success({command:h,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:f,changelogUrl:d}),0):(t.stderr.write(k),1)}let w=m?`Already up to date. Reinstall anyway with "${h}"?`:`Run "${h}"?`;if(!(e.yes||await $I({type:"confirm",name:"ok",message:w,initial:!m}).then(k=>k.ok===!0)))return e.json&&t.success({command:h,ran:!1,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:f,changelogUrl:d}),0;try{return await RI(g,y,{stdio:"inherit"}),e.json?(t.success({command:h,ran:!0,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:f,changelogUrl:d}),0):(c.success("Update completed"),0)}catch(k){let _=OI(t.env,o,h,k);if(c.logDetailedError(k),t.fail("Self update failed",{command:h,hints:_.length>0?_:void 0}),!e.json&&_.length>0)for(let I of _)c.info(I);return 1}}var lg=C({path:["self","update"],meta:sg,schema:ig,handler:jI});var Oi={group:ag,commands:[lg]};import Na from"chalk";import{z as st}from"zod";var mg={name:"apps",category:"manage",description:"List dstack apps",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},{name:"search",description:"Search by name, app_id, vm_uuid, or instance_id",type:"string",target:"search",group:"basic"},{name:"status",description:"Filter by CVM status (can be specified multiple times)",type:"string[]",target:"status",group:"basic"},{name:"listed",description:"Filter by listed status",type:"boolean",target:"listed",negatedName:"no-listed",group:"basic"},{name:"base-image",description:"Filter by base image name",type:"string",target:"baseImage",group:"basic"},{name:"instance-type",description:"Filter by instance type",type:"string",target:"instanceType",group:"basic"},{name:"kms-type",description:"Filter by KMS type",type:"string",target:"kmsType",group:"basic"},{name:"node",description:"Filter by node name",type:"string",target:"node",group:"basic"},{name:"region",description:"Filter by region identifier",type:"string",target:"region",group:"basic"},ke],examples:[{name:"List apps",value:"phala apps"},{name:"Second page",value:"phala apps --page 2"},{name:"Search by name",value:"phala apps --search my-app"},{name:"Filter by status",value:"phala apps --status running"},{name:"Output as JSON",value:"phala apps --json"}]},pg=st.object({page:st.coerce.number().int().min(1).default(1),pageSize:st.coerce.number().int().min(1).max(100).default(50),search:st.string().optional(),status:st.array(st.string()).optional(),listed:st.boolean().optional(),baseImage:st.string().optional(),instanceType:st.string().optional(),kmsType:st.string().optional(),node:st.string().optional(),region:st.string().optional(),json:st.boolean().default(!1)});function FI(e){return e.toLowerCase().endsWith("ing")?Na.yellow(e):e==="running"?Na.green(e):e==="stopped"?Na.red(e):Na.yellow(e)}async function VI(e,t){try{let n=await E(t),r=await ma(n,{page:e.page,pageSize:e.pageSize,search:e.search,status:e.status,listed:e.listed,baseImage:e.baseImage,instanceType:e.instanceType,kmsType:e.kmsType,node:e.node,region:e.region});if(r.success===!1)return t.fail(r.error.message),1;let o=r.data;if(e.json)return t.success(o),0;let a=["APP_ID","CVM","STATUS","UPTIME"],s=o.items.map(i=>({APP_ID:i.appId,CVM:i.cvmName,STATUS:FI(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(c.info("No CVMs found"),0):(ce(a,s),c.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(n){return c.logDetailedError(n),t.fail(`Failed to list apps: ${n instanceof Error?n.message:String(n)}`),1}}var dg=C({path:["apps"],meta:mg,schema:pg,handler:VI});var ug={path:["instances"],meta:{name:"instances",description:"Manage app instances",stability:"unstable",category:"manage"}};import ja from"chalk";import{z as Ni}from"zod";var fg={name:"ls",description:"List instances of an app",stability:"unstable",options:[{name:"app-id",description:"App ID (hex identifier). Defaults to app_id in phala.toml.",type:"string",target:"appId"},ke],examples:[{name:"List instances for app in phala.toml",value:"phala instances ls"},{name:"List instances for a specific app",value:"phala instances ls --app-id <app-id>"},{name:"Output as JSON",value:"phala instances ls --app-id <app-id> --json"}]},gg=Ni.object({appId:Ni.string().optional(),json:Ni.boolean().default(!1)});function HI(e){return e.toLowerCase().endsWith("ing")?ja.yellow(e):e==="running"?ja.green(e):e==="stopped"?ja.red(e):ja.yellow(e)}function zI(e,t){let n=e.appId||t.projectConfig.app_id;if(!n)throw new Error("No app ID provided. Pass --app-id or run `phala link` to create phala.toml with app_id.");return n.replace(/^app_/,"").replace(/^0x/,"").toLowerCase()}async function KI(e,t){try{let n=zI(e,t),r=await E(t),o=await nr(r,{appId:n});if(!o.success){let m="error"in o?o.error:void 0;return t.fail(m?.message||"Failed to list instances"),1}let a=o.data,s=a.map(m=>m.vm_uuid).filter(m=>typeof m=="string"&&m.length>0),i={};if(s.length>0){let m=await To(r,{vmUuids:s});if(m.success)for(let[d,f]of Object.entries(m.data))i[d]={status:f.status,uptime:f.uptime}}if(e.json){let m=a.map(d=>({...d,status:d.vm_uuid?i[d.vm_uuid]?.status??d.status:d.status,uptime:d.vm_uuid?i[d.vm_uuid]?.uptime??null:null}));return t.success(m),0}if(a.length===0)return c.info("No instances found"),0;let l=["UUID","NODE","REGION","STATUS","NAME","UPTIME"],p=a.map(m=>{let d=m.node_info&&typeof m.node_info=="object"?m.node_info.name??"-":"-",f=m.node_info&&typeof m.node_info=="object"?m.node_info.region??"-":"-",u=m.vm_uuid?i[m.vm_uuid]:void 0;return{UUID:m.vm_uuid??"-",NODE:d,REGION:f,STATUS:HI(u?.status??m.status),NAME:m.name,UPTIME:u?.uptime??"-"}});return ce(l,p),0}catch(n){return c.logDetailedError(n),t.fail(`Failed to list instances: ${n instanceof Error?n.message:String(n)}`),1}}var hg=C({path:["instances","ls"],meta:fg,schema:gg,handler:KI});import wr from"fs";import Fi from"path";import{z as et}from"zod";var yg={name:"add",description:"Create a new instance under an existing app",stability:"unstable",options:[{name:"app-id",description:"App ID (hex identifier). Defaults to app_id in phala.toml.",type:"string",target:"appId"},{name:"node-id",aliases:["teepod-id"],description:"Target node ID for the new instance.",type:"string",target:"nodeId"},{name:"compose-file",shorthand:"c",description:"Path to Docker Compose file.",type:"string",target:"composeFile"},{name:"pre-launch-script",description:"Path to pre-launch script file.",type:"string",target:"preLaunchScript"},{name:"env-file",shorthand:"e",description:"Path to environment file.",type:"string",target:"envFile"},Ze,Ge,{name:"prepare-only",description:"Prepare the instance and generate a commit token. Skips all on-chain operations.",type:"boolean",target:"prepareOnly",group:"advanced"},{name:"commit",description:"Commit a previously prepared instance using a commit token. Requires --token, --compose-hash, and --transaction-hash.",type:"boolean",target:"commit",group:"advanced"},{name:"token",description:"Commit token from a prepare-only request.",type:"string",target:"token",group:"advanced"},{name:"compose-hash",description:"Compose hash to use (existing revision).",type:"string",target:"composeHash"},or,O],examples:[{name:"Add instance with existing compose",value:"phala instances add --app-id <app-id> --node-id 5"},{name:"Add instance with new Docker Compose",value:"phala instances add --app-id <app-id> --node-id 5 --compose-file docker-compose.yml"},{name:"Prepare for multisig approval",value:"phala instances add --app-id <app-id> --node-id 5 --compose-file docker-compose.yml --prepare-only"},{name:"Commit a prepared instance",value:"phala instances add --app-id <app-id> --commit --token <token> --compose-hash <hash> --transaction-hash <tx-hash>"}]},vg=et.object({appId:et.string().optional(),nodeId:et.string().optional(),composeFile:et.string().optional(),preLaunchScript:et.string().optional(),envFile:et.string().optional(),privateKey:et.string().optional(),rpcUrl:et.string().optional(),prepareOnly:et.boolean().default(!1),commit:et.boolean().default(!1),token:et.string().optional(),composeHash:et.string().optional(),transactionHash:et.string().optional(),interactive:et.boolean().default(!1)});function GI(e){return wr.readFileSync(e,"utf-8").split(`
514
+ `).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function qI(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function BI(e){if(e.status!==465)return null;let n=qI(e);return{composeHash:String(n.compose_hash??""),appId:String(n.app_id??""),deviceId:String(n.device_id??""),kmsInfo:n.kms_info,commitToken:n.commit_token,commitUrl:n.commit_url,apiCommitUrl:n.api_commit_url,onchainStatus:n.onchain_status}}async function WI(e,t,n){if(!n)return;let r=Fi.resolve(process.cwd(),n);if(!wr.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=GI(r),a=await mn(e,t);return(0,Ie.encryptEnvVars)(o,a)}async function JI(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await bt(e);if(!r.success){let a="error"in r?r.error:void 0;throw new Error(a?.message||`Failed to resolve node name "${n}"`)}let o=r.data.nodes.filter(a=>a.name.toLowerCase()===n.toLowerCase());if(o.length===0)throw new Error(`Node "${n}" not found.`);if(o.length>1)throw new Error(`Node name "${n}" is ambiguous (${o.length} matches). Use an explicit node ID.`);return o[0].teepod_id}function ji(e,t){if(ee()){t.success(e);return}let n=typeof e.vm_uuid=="string"?e.vm_uuid:"",r=n.replace(/-/g,""),o=t.projectConfig.slug||"",a=o&&r&&typeof e.app_id=="string"?`${se}/${o}/apps/${e.app_id}/instances/${r}`:typeof e.app_url=="string"?e.app_url:"-",s=typeof e.teepod=="object"&&e.teepod!==null&&"name"in e.teepod&&typeof e.teepod.name=="string"?e.teepod.name:typeof e.teepod_name=="string"?e.teepod_name:"-",i=[`App ID: ${e.app_id||"-"}`,`CVM UUID: ${n||"-"}`,`Name: ${e.name}`,`Status: ${e.status}`,`Node: ${s} (ID: ${e.teepod_id})`,`vCPUs: ${e.vcpu}`,`Memory: ${e.memory} MB`,`Disk Size: ${e.disk_size} GB`,`App URL: ${a}`];t.stdout.write(`${i.join(`
515
+ `)}
516
+ `)}function Cg(e,t){if(ee()){t.success({success:!0,prepare_only:!0,...e});return}let n=o=>o&&!o.startsWith("0x")?`0x${o}`:o,r=["App instance prepared successfully (pending on-chain approval).","",`Compose Hash: ${n(e.composeHash)}`,`App ID: ${n(e.appId)}`,`Device ID: ${n(e.deviceId)}`];if(e.commitToken&&r.push(`Commit Token: ${e.commitToken}`),e.commitUrl&&r.push(`Commit URL: ${e.commitUrl}`),e.apiCommitUrl&&r.push(`API Commit URL: ${e.apiCommitUrl}`),e.onchainStatus&&(r.push("","On-chain Status:",` Compose Hash: ${e.onchainStatus.compose_hash_allowed?"registered":"NOT registered"}`,` Device ID: ${e.onchainStatus.device_id_allowed?"registered":"NOT registered"}`),e.onchainStatus.is_allowed&&r.push(" All prerequisites met. You can commit with --transaction-hash already-registered.")),e.commitToken){let o=e.composeHash.startsWith("0x")?e.composeHash:`0x${e.composeHash}`;r.push("","To complete the instance after on-chain approval:",` phala instances add --app-id ${e.appId} \\`," --commit \\",` --token ${e.commitToken} \\`,` --compose-hash ${o} \\`," --transaction-hash <tx-hash>")}t.stdout.write(`${r.join(`
517
+ `)}
518
+ `)}function YI(e,t){let n=e.appId||t.projectConfig.app_id;if(!n)throw new Error("No app ID provided. Pass --app-id or run `phala link` to create phala.toml with app_id.");return n.replace(/^app_/,"").replace(/^0x/,"").toLowerCase()}async function ZI(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{let r=YI(n,t),o=await E(t);if(n.commit){if(!n.token)throw new Error("--token is required for --commit mode");if(!n.composeHash)throw new Error("--compose-hash is required for --commit mode");let l=await o.post(`/apps/${r}/instances`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash||"already-registered"});return ji(l,t),0}let a;if(n.envFile){let l=await nr(o,{appId:r});if(!l.success||l.data.length===0)throw new Error(`No instances found for app ${r}. Cannot derive encryption key.`);let p=l.data[0];if(!p.vm_uuid)throw new Error("Template CVM has no vm_uuid");let m=await G(o,{id:p.vm_uuid});if(!m.success)throw new Error(`Failed to fetch CVM info: ${m.error?.message||"Unknown error"}`);a=await WI(o,m.data,n.envFile)}let s=await JI(o,n.nodeId),i={};if(s!==void 0&&(i.node_id=s),a&&(i.encrypted_env=a),n.composeHash&&(i.compose_hash=n.composeHash),n.composeFile){let l=Fi.resolve(process.cwd(),n.composeFile);if(!wr.existsSync(l))throw new Error(`Docker Compose file not found: ${l}`);i.docker_compose_file=wr.readFileSync(l,"utf-8")}if(n.preLaunchScript){let l=Fi.resolve(process.cwd(),n.preLaunchScript);if(!wr.existsSync(l))throw new Error(`Pre-launch script not found: ${l}`);i.pre_launch_script=wr.readFileSync(l,"utf-8")}try{let l=await o.post(`/apps/${r}/instances`,i,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return ji(l,t),0}catch(l){if(!(l instanceof vt))throw l;let p=BI(l);if(!p)throw l;if(n.prepareOnly)return Cg(p,t),0;if(!p.commitToken)throw new Error("Prepare response did not include a commit token");let m=p.kmsInfo?.chain;if(!m)throw new Error("App KMS info is missing chain configuration");let d=await bn({chain:m,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:p.deviceId,composeHash:p.composeHash});if(!d.success){let b="error"in d?d.error:void 0;throw new Error(b?.message||"Failed to check on-chain prerequisites")}let f=n.transactionHash||"already-registered",u=!d.data.deviceAllowed,h=!d.data.composeHashAllowed;if(u||h){let b=[];h&&b.push("compose hash"),u&&b.push("device");let w=n.privateKey||process.env.PRIVATE_KEY;if(!w)return Cg(p,t),0;let S=w;if(u){let k=await rn({chain:m,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:p.deviceId,privateKey:S});if(!k.success){let _="error"in k?k.error:void 0;throw new Error(_?.message||"Failed to register device on-chain")}}if(h){let k=await nn({chain:m,rpcUrl:n.rpcUrl,appId:`0x${r}`,composeHash:p.composeHash,privateKey:S});if(!k.success){let _="error"in k?k.error:void 0;throw new Error(_?.message||"Failed to register compose hash on-chain")}f=String(k.data.transactionHash||"already-registered")}}let g=10;for(let b=0;b<g;b++){let w=await bn({chain:m,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:p.deviceId,composeHash:p.composeHash});if(w.success&&w.data.composeHashAllowed&&w.data.deviceAllowed)break;if(b===g-1)throw new Error("On-chain prerequisites not met after waiting. Transactions may still be confirming. Retry with --commit using the token and transaction hash.");await new Promise(S=>setTimeout(S,3e3))}let y=await o.post(`/apps/${r}/instances`,{token:p.commitToken,compose_hash:p.composeHash,transaction_hash:f});return ji(y,t),0}}catch(r){if(c.error("Failed to create app instance"),r instanceof vt){process.stderr.write(`${tn(r)}
519
+ `);let o=r.links;if(o&&o.length>0)for(let a of o)process.stderr.write(` ${a.label}: ${a.url}
520
+ `);return 1}return r instanceof Error?(process.stderr.write(`${Po(r)}
521
+ `),1):(c.logDetailedError(r),1)}}var bg=C({path:["instances","add"],meta:yg,schema:vg,handler:ZI});import XI from"inquirer";import{z as uo}from"zod";var wg={name:"rm",description:"Delete one or more app instances by VM UUID",stability:"unstable",arguments:[{name:"vm_uuid...",description:"VM UUID(s) of the instances to delete",required:!0,variadic:!0,target:"vmUuids"}],options:[{name:"force",shorthand:"f",description:"Skip confirmation prompt",type:"boolean",target:"force"},{name:"yes",shorthand:"y",description:"Alias for --force (skip confirmation prompt)",type:"boolean",target:"yes"}],examples:[{name:"Delete a single instance",value:"phala instances rm 550e8400-e29b-41d4-a716-446655440000"},{name:"Delete multiple instances",value:"phala instances rm 550e8400-e29b-41d4-a716-446655440000 661f9511-f30c-52e5-b827-557766551111"},{name:"Delete without confirmation",value:"phala instances rm 550e8400-e29b-41d4-a716-446655440000 --force"}]},_g=uo.object({vmUuids:uo.array(uo.string()).min(1),force:uo.boolean().default(!1),yes:uo.boolean().default(!1)});async function QI(e,t){try{let n=await E(t),r=t.globalOptions?.json===!0;if(!e.force&&!e.yes){let s=e.vmUuids.length===1?`instance "${e.vmUuids[0]}"`:`${e.vmUuids.length} instances`,{confirm:i}=await XI.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete ${s}? This action cannot be undone.`,default:!1}]);if(!i)return r?(t.success({deleted:!1,cancelled:!0,vm_uuids:e.vmUuids}),0):(c.info("Deletion cancelled"),0)}let o=[];for(let s of e.vmUuids){let i=await Ur(n,{id:s});i.success?(o.push({vm_uuid:s,deleted:!0}),r||c.success(`Instance ${s} deleted successfully`)):(o.push({vm_uuid:s,deleted:!1,error:i.error.message}),r||c.error(`Failed to delete instance ${s}: ${i.error.message}`))}return r?(t.success(o),0):o.filter(s=>!s.deleted).length>0?1:0}catch(n){return t.fail("Failed to delete instance"),c.logDetailedError(n),1}}var kg=C({path:["instances","rm"],meta:wg,schema:_g,handler:QI});import{z as Vi}from"zod";var Sg={name:"instance-types",category:"deploy",description:"List available instance types",stability:"unstable",arguments:[{name:"family",description:"Instance type family (cpu, gpu)",required:!1,target:"family"}],options:[ke],examples:[{name:"List all instance type families",value:"phala instance-types"},{name:"List CPU instance types",value:"phala instance-types cpu"},{name:"List GPU instance types",value:"phala instance-types gpu"},{name:"Output as JSON",value:"phala instance-types --json"}]},Eg=Vi.object({family:Vi.string().optional(),json:Vi.boolean().default(!1)});function Ig(e){return(e/1024).toFixed(0)}function Ag(e){return`$${e}`}async function eA(e,t){try{let n=await E(t);if(e.family){let a=await gs(n,{family:e.family});if(e.json)return t.success(a),0;let s=["ID","NAME","vCPU","Memory(GB)","Hourly Rate","GPU"],i=a.items.map(l=>({ID:l.id,NAME:l.name,vCPU:l.vcpu.toString(),"Memory(GB)":Ig(l.memory_mb),"Hourly Rate":Ag(l.hourly_rate),GPU:l.requires_gpu?"Yes":"No"}));return i.length===0?(c.info(`No instance types found for family '${e.family}'`),0):(ce(s,i),c.info(`Total: ${a.total} instance types`),0)}let r=await fs(n);if(e.json)return t.success(r),0;if(r.result.length===0)return c.info("No instance types found"),0;let o=["ID","NAME","vCPU","Memory(GB)","Hourly Rate"];for(let a of r.result){c.info(`
522
+ Family: ${a.name} (${a.total} types)`);let s=a.items.map(i=>({ID:i.id,NAME:i.name,vCPU:i.vcpu.toString(),"Memory(GB)":Ig(i.memory_mb),"Hourly Rate":Ag(i.hourly_rate)}));ce(o,s)}return 0}catch(n){return c.logDetailedError(n),t.fail(`Failed to list instance types: ${n instanceof Error?n.message:String(n)}`),1}}var Pg=C({path:["instance-types"],meta:Sg,schema:Eg,handler:eA});import{z as $g}from"zod";var Rg={name:"runtime-config",description:"Show the runtime configuration of a CVM",stability:"stable",category:"cvm-ops",arguments:[Y],options:[O],examples:[{name:"Show runtime config by app_id",value:"phala runtime-config app_123"},{name:"Show runtime config by name",value:"phala runtime-config my-app"}]},xg=$g.object({cvmId:$g.string().optional()});async function tA(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Either pass a CVM ID as argument or configure it in phala.toml."),1;try{let n=await E(t),r=await rm(n,t.cvmId);if(!r.success)return t.fail(`Failed to get runtime config: ${r.error.message}`),1;let o=r.data;if(ee())return t.success(o),0;if(console.log(`Hostname: ${o.hostname??"-"}`),console.log(`Gateway Domain: ${o.default_gateway_domain??"-"}`),console.log(`SSH Keys: ${o.ssh_authorized_keys.length>0?`${o.ssh_authorized_keys.length} key(s)`:"none"}`),o.ssh_authorized_keys.length>0){console.log(),console.log("SSH Authorized Keys:");for(let a of o.ssh_authorized_keys)console.log(` ${a}`)}return 0}catch(n){return c.logDetailedError(n),t.fail("Failed to get CVM runtime config"),1}}var Dg=C({path:["runtime-config"],meta:Rg,schema:xg,handler:tA});import{existsSync as Lg,readFileSync as oA}from"fs";import{basename as aA,join as Fa}from"path";import{homedir as Va,hostname as sA}from"os";import{z as Hi}from"zod";var nA={name:"name",description:"Name for the SSH key (default: key file name)",type:"string",target:"name"},rA={name:"key-file",description:"Path to SSH public key file (default: ~/.ssh/id_ed25519.pub or ~/.ssh/id_rsa.pub)",type:"string",target:"keyFile"},Tg={name:"add",description:"Add a local SSH public key to your account",stability:"stable",options:[nA,rA],examples:[{name:"Add default SSH key",value:"phala ssh-keys add"},{name:"Add a specific key with a name",value:"phala ssh-keys add --name my-laptop --key-file ~/.ssh/id_ed25519.pub"}]},Mg=Hi.object({name:Hi.string().optional(),keyFile:Hi.string().optional()});function iA(){let e=[Fa(Va(),".ssh","id_ed25519.pub"),Fa(Va(),".ssh","id_rsa.pub"),Fa(Va(),".ssh","id_ecdsa.pub")];for(let t of e)if(Lg(t))return t}async function cA(e,t){try{let n=e.keyFile;if(n?.startsWith("~/")&&(n=Fa(Va(),n.slice(2))),!n&&(n=iA(),!n))return t.fail("No SSH public key found. Specify one with --key-file or generate one with ssh-keygen."),1;if(!Lg(n))return t.fail(`SSH public key file not found: ${n}`),1;let r=oA(n,"utf-8").trim(),o=e.name??`${sA()}-${aA(n,".pub")}`,a=await E(t),s=await As(a,{name:o,public_key:r});return s.success?ee()?(t.success(s.data),0):(c.success(`Added SSH key "${o}" (${s.data.key_type}, ${s.data.fingerprint})`),0):(t.fail(`Failed to add SSH key: ${s.error.message}`),1)}catch(n){return c.logDetailedError(n),t.fail("Failed to add SSH key"),1}}var Ug=C({path:["ssh-keys","add"],meta:Tg,schema:Mg,handler:cA});var Og={path:["ssh-keys"],meta:{name:"ssh-keys",category:"manage",description:"Manage SSH keys",stability:"stable"}};import{z as Ng}from"zod";var lA={name:"github_username",description:"GitHub username to import SSH keys from",required:!0,target:"githubUsername"},jg={name:"import-github",description:"Import SSH keys from a GitHub user's public profile",stability:"stable",arguments:[lA],examples:[{name:"Import SSH keys from a GitHub profile",value:"phala ssh-keys import-github octocat"}]},Fg=Ng.object({githubUsername:Ng.string()});async function mA(e,t){try{let n=await E(t),r=c.startSpinner(`Importing SSH keys from github.com/${e.githubUsername}`),o=await Is(n,{github_username:e.githubUsername});if(r.stop(!0),!o.success)return t.fail(`Failed to import SSH keys: ${o.error.message}`),1;if(ee())return t.success(o.data),0;let{keys_added:a,keys_skipped:s,errors:i}=o.data;if(i.length>0){c.warn(`${i.length} key(s) could not be imported:`);for(let l of i)c.warn(` ${l}`)}return a>0?c.success(`Added ${a} SSH key(s) from github.com/${e.githubUsername} (${s} skipped)`):c.info("No new keys added (all keys already exist)"),0}catch(n){return c.logDetailedError(n),t.fail("Failed to import SSH keys"),1}}var Vg=C({path:["ssh-keys","import-github"],meta:jg,schema:Fg,handler:mA});import{z as pA}from"zod";var Hg={name:"list",aliases:["ls"],description:"List SSH keys for the current user",stability:"stable",examples:[{name:"List all SSH keys",value:"phala ssh-keys list"}]},zg=pA.object({});async function dA(e,t){try{let n=await E(t),r=await Or(n);if(!r.success)return t.fail(`Failed to list SSH keys: ${r.error.message}`),1;let o=r.data;if(ee())return t.success(o),0;if(o.length===0)return c.info("No SSH keys found"),0;let a=["ID","NAME","TYPE","FINGERPRINT","SOURCE","CREATED"],s=o.map(i=>({ID:i.id,NAME:i.name,TYPE:i.key_type,FINGERPRINT:i.fingerprint,SOURCE:i.source,CREATED:i.created_at.slice(0,10)}));return ce(a,s),0}catch(n){return c.logDetailedError(n),t.fail("Failed to list SSH keys"),1}}var Kg=C({path:["ssh-keys","list"],meta:Hg,schema:zg,handler:dA});import fA from"inquirer";import{z as zi}from"zod";var uA={name:"key_id",description:"SSH key ID to remove (from `phala ssh-keys list`)",required:!1,target:"keyId"},Gg={name:"remove",aliases:["rm"],description:"Remove an SSH key from your account",stability:"stable",arguments:[uA],options:[O],examples:[{name:"Remove an SSH key by ID",value:"phala ssh-keys remove sshkey_xxx"},{name:"Interactive selection",value:"phala ssh-keys rm -i"}]},qg=zi.object({keyId:zi.string().optional(),interactive:zi.boolean().default(!1)});async function gA(e){let t=c.startSpinner("Fetching SSH keys"),n=await E(e),r=await Or(n);if(t.stop(!0),!r.success){c.error(`Failed to fetch SSH keys: ${r.error.message}`);return}let o=r.data;if(o.length===0){c.info("No SSH keys found");return}let a=o.map(i=>({name:`${i.id} ${i.name} (${i.key_type}, ${i.fingerprint})`,value:i.id})),{selectedKey:s}=await fA.prompt([{type:"list",name:"selectedKey",message:"Select an SSH key to remove:",choices:a}]);return s}async function hA(e,t){try{let n=e.keyId;if(!n&&e.interactive&&(n=await gA(t),!n))return 0;if(!n)return t.fail("Missing key_id. Use `phala ssh-keys rm <key_id>` or `phala ssh-keys rm -i` for interactive selection."),1;let r=await E(t),o=await Ps(r,{keyId:n});return o.success?ee()?(t.success({keyId:n,removed:!0}),0):(c.success(`SSH key ${n} removed`),0):(t.fail(`Failed to remove SSH key: ${o.error.message}`),1)}catch(n){return c.logDetailedError(n),t.fail("Failed to remove SSH key"),1}}var Bg=C({path:["ssh-keys","remove"],meta:Gg,schema:qg,handler:hA});var Ki={group:Og,commands:[Kg,Ug,Bg,Vg]};import{z as Gi}from"zod";var Wg={name:"whoami",category:"profile",description:"Print the current user",stability:"stable",options:[...on,pe],examples:[{name:"Show current user",value:"phala whoami"},{name:"JSON output",value:"phala whoami --json"}]},Jg=Gi.object({json:Gi.boolean().default(!1),apiToken:Gi.string().optional()});async function yA(e,t){let{client:n,auth:r}=await Ko(t,{apiToken:e.apiToken});if(!r.apiKey)return t.fail('Not authenticated. Run "phala login" first.'),1;let o=await Oe(n);if(!o.success)return t.fail(o.error?.message||"Failed to get user information"),1;let{user:a,workspace:s}=o.data;return e.json?(t.success({username:a.username,email:a.email,workspace:s.name,profile:r.profileName}),0):(t.stdout.write(`${a.username} (${s.name})
523
+ `),0)}var Yg=C({path:["whoami"],meta:Wg,schema:Jg,handler:yA});import dh from"inquirer";import{z as j}from"zod";var _r={name:"cvm",description:"CVM or app identifier (UUID, app_id, instance_id, or name)",required:!0,target:"cvm"},Zg={path:["allow-devices"],meta:{name:"allow-devices",description:"Manage on-chain device allowlist for an app contract",stability:"unstable"}},Xg={name:"list",aliases:["ls"],description:"List allowed devices from the on-chain contract",stability:"unstable",arguments:[_r],options:[Ge,pe],examples:[{name:"List devices on-chain",value:"phala allow-devices list app_abc123"}]},Qg=j.object({cvm:j.string(),rpcUrl:j.string().optional(),json:j.boolean().default(!1)}),eh={name:"add",description:"Add devices to the on-chain allowlist",stability:"unstable",arguments:[_r,{name:"device_id",description:"Device ID (bytes32 hex) or node name. Node names are resolved to device IDs from available nodes.",required:!1,target:"deviceId"}],options:[Ze,Ge,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},pe,O],examples:[{name:"Add device to allowlist",value:"phala allow-devices add app_abc123 0xaabb... --private-key 0x..."},{name:"Interactive multi-select from available nodes",value:"phala allow-devices add app_abc123 -i --private-key 0x..."}]},th=j.object({cvm:j.string(),deviceId:j.string().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1),interactive:j.boolean().default(!1)}),nh={name:"remove",aliases:["rm"],description:"Remove devices from the on-chain allowlist",stability:"unstable",arguments:[_r,{name:"device_id",description:"Device ID (bytes32 hex) or node name. Node names are resolved to device IDs from available nodes.",required:!1,target:"deviceId"}],options:[Ze,Ge,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},pe,O],examples:[{name:"Remove device from allowlist",value:"phala allow-devices remove app_abc123 0xaabb... --private-key 0x..."},{name:"Interactive multi-select from allowed devices",value:"phala allow-devices remove app_abc123 -i --private-key 0x..."}]},rh=j.object({cvm:j.string(),deviceId:j.string().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1),interactive:j.boolean().default(!1)}),oh={name:"allow-any",description:"Set the allow-any-device flag on the contract. Requires --enable or --disable.",stability:"unstable",arguments:[_r],options:[{name:"enable",description:"Enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Disable allow-any-device",type:"boolean",target:"disable"},Ze,Ge,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},pe],examples:[{name:"Enable allow-any-device",value:"phala allow-devices allow-any app_abc123 --enable --private-key 0x..."},{name:"Disable allow-any-device",value:"phala allow-devices allow-any app_abc123 --disable --private-key 0x..."}]},ah=j.object({cvm:j.string(),enable:j.boolean().optional(),disable:j.boolean().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1)}),sh={name:"disallow-any",description:"Disable allow-any-device on the contract. Equivalent to `allow-any --disable`.",stability:"unstable",arguments:[_r],options:[Ze,Ge,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},pe],examples:[{name:"Disable allow-any-device",value:"phala allow-devices disallow-any app_abc123 --private-key 0x..."}]},ih=j.object({cvm:j.string(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1)}),ch={name:"toggle-allow-any",description:"Toggle allow-any-device on the contract (or force via --enable/--disable)",stability:"unstable",arguments:[_r],options:[{name:"enable",description:"Force enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Force disable allow-any-device",type:"boolean",target:"disable"},Ze,Ge,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},pe],examples:[{name:"Toggle based on current state",value:"phala allow-devices toggle-allow-any app_abc123 --private-key 0x..."},{name:"Force enable",value:"phala allow-devices toggle-allow-any app_abc123 --enable --private-key 0x..."}]},lh=j.object({cvm:j.string(),enable:j.boolean().optional(),disable:j.boolean().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),json:j.boolean().default(!1)});var vA=/^(0x)?[0-9a-fA-F]{64}$/,uh=/^[0-9a-fA-F]{40}$/;function Tn(e){return(e.startsWith("0x")?e:`0x${e}`).toLowerCase()}function Ha(e){return vA.test(e)}function CA(e){return e.startsWith("app_")||uh.test(e)}function mh(e){let t=e.startsWith("app_")?e.slice(4):e;return uh.test(t)?t.toLowerCase():t}function Ka(e,t){if(!t)return null;let n=e.blockExplorers?.default?.url;return n?`${n}/tx/${t}`:null}var Ga=3e4,bA=15e3,za=class extends Error{constructor(t,n){super(`RPC request exceeded ${n}ms waiting for a response from ${t}`),this.name="RpcTimeoutError",this.rpcUrl=t,this.timeoutMs=n}},wA=[/timeout/i,/HttpRequestError/i,/TimeoutError/i,/fetch failed/i,/ECONN(?:REFUSED|RESET|ABORTED)/i,/ENOTFOUND/,/EAI_AGAIN/,/socket hang up/i,/network error/i,/\b429\b/,/\b502\b/,/\b503\b/,/\b504\b/,/\b1015\b/,/rate[\s-]?limit/i,/too many requests/i];function fh(e){if(e instanceof za)return!0;let t=[],n=e,r=0;for(;n&&r<5;){if(n instanceof Error)t.push(`${n.name}: ${n.message}`),n=n.cause;else{t.push(String(n));break}r+=1}let o=t.join(`
524
+ `);return wA.some(a=>a.test(o))}async function kr(e,t,n=Ga){let r;try{return await Promise.race([e,new Promise((o,a)=>{r=setTimeout(()=>{a(new za(t,n))},n)})])}finally{r&&clearTimeout(r)}}function fn(e,t){return t||e.rpcUrls.default.http[0]||"the default RPC"}function _A(e){switch(e){case 1:return"https://ethereum-rpc.publicnode.com";case 8453:return"https://base-rpc.publicnode.com";default:return null}}function kA(e){return`https://chainlist.org/chain/${e}`}var ph=new Set(["--private-key","--privateKey"]);function SA(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(ph.has(r)&&n+1<e.length){t.push(r,"$PRIVATE_KEY"),n+=1;continue}let o=r.indexOf("=");if(o>0&&ph.has(r.slice(0,o))){t.push(`${r.slice(0,o)}=$PRIVATE_KEY`);continue}t.push(r)}return t}function EA(e,t){let n=[],r=!1;for(let o=0;o<e.length;o+=1){let a=e[o];if(a==="--rpc-url"&&o+1<e.length){n.push("--rpc-url",t),o+=1,r=!0;continue}if(a.startsWith("--rpc-url=")){n.push(`--rpc-url=${t}`),r=!0;continue}n.push(a)}return r||n.push("--rpc-url",t),n}function IA(e){return/^[a-zA-Z0-9_\-./:=@,+%]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function AA(e){let t=process.argv.slice(2),n=SA(t);return["phala",...EA(n,e)].map(IA).join(" ")}function Ae(e=""){process.stderr.write(`${e}
525
+ `)}function PA(e,t){Ae(`The ${e.name} RPC endpoint (${t}) appears unreachable or rate-limited.`);let n=_A(e.id);n?(Ae("Retry with:"),Ae(` ${AA(n)}`)):Ae("Retry by appending --rpc-url <URL> to your command with a different endpoint."),Ae(),Ae(`More public ${e.name} RPC endpoints: ${kA(e.id)}`),Ae("For production workloads, register a paid provider for reliability:"),Ae(" Alchemy: https://www.alchemy.com"),Ae(" Infura: https://www.infura.io"),Ae(" QuickNode: https://www.quicknode.com")}function Tt(e,t,n,r=!1){r||!t||!n||fh(e)&&PA(t,n)}function qi(e){if(e.json)return;let{chain:t,description:n,txHash:r}=e;Ae(`${n} submitted: ${r}`);let o=Ka(t,r);o&&Ae(`Explorer: ${o}`),Ae("Waiting for 1 confirmation...")}function $A(e){return e.enable&&e.disable||!e.enable&&!e.disable?null:!!e.enable}function RA(e){return e.enable&&e.disable?null:e.enable===!0?!0:e.disable===!0?!1:!(e.currentValue??!1)}function xA(e){return new Set(e.map(t=>Tn(t.device_id)))}async function Bi(e){let{chain:t,rpcUrl:n,appAddress:r,deviceIds:o,condition:a,description:s}=e,i=e.timeoutMs??6e4,l=e.intervalMs??2e3,p=Date.now()+i,m=fn(t,n),d=e.json??!1,f;for(;Date.now()<p;){try{let u=await kr(Do({chain:t,rpcUrl:n,appAddress:r,deviceIds:o}),m,bA);if(a(u))return!0;f=void 0}catch(u){if(!fh(u))throw u;f=u}await new Promise(u=>{setTimeout(u,l)})}return d||Ae(`Warning: timeout waiting for on-chain state: ${s}`),f&&Tt(f,t,m,d),!1}function gh(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function Wi(e){let t=e.privateKey||process.env.PRIVATE_KEY;if(!t)throw new Error("Private key required. Use --private-key or set PRIVATE_KEY env var.");return t.startsWith("0x")?t:`0x${t}`}async function hh(e,t){if(Ha(e))return Tn(e);if(e.startsWith("0x"))throw new Error(`Invalid device ID format: ${e}. Expected 32-byte hex (0x + 64 hex chars).`);let n=await E(t),r=await bt(n);if(!r.success)throw new Error(`Failed to resolve node name "${e}": ${r.error.message}`);let o=r.data.nodes.filter(s=>s.name.toLowerCase()===e.toLowerCase());if(o.length===0)throw new Error(`Node "${e}" not found. Provide a valid node name or device ID.`);if(o.length>1)throw new Error(`Node name "${e}" is ambiguous (${o.length} matches). Use an explicit device ID.`);let a=o[0].device_id;if(!a||!Ha(a))throw new Error(`Node "${o[0].name}" has no valid device_id. Use an explicit device ID.`);return Tn(a)}async function Sr(e,t){let n=await E(t),r;if(CA(e))r=mh(e);else{let i=await G(n,{id:e});if(!i.success)return t.fail(i.error.message),null;let l=i.data;if(!l)return t.fail("CVM not found"),null;if(r=l.app_id,!r)return t.fail("CVM has no app_id assigned yet."),null}let o=await Mo(n,{appId:mh(r)});if(!o.success)return t.fail(o.error.message),null;let a=o.data;if(!a.is_onchain_kms)return t.fail("This app does not use on-chain KMS. Device management requires an on-chain KMS."),null;if(!a.chain_id||!a.app_contract_address)return t.fail("Missing chain_id or app_contract_address in allowlist response."),null;let s=$o[a.chain_id];return s?{chain:s,chainId:a.chain_id,appContractAddress:a.app_contract_address,allowlist:a}:(t.fail(`Unsupported chain_id: ${a.chain_id}`),null)}async function DA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Ae(s)},o,a;try{let s=await Sr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:l}=s;a=i,o=fn(i,n.rpcUrl);let p=await E(t),m=await bt(p),d=new Map;if(m.success)for(let y of m.data.nodes)y.device_id&&Ha(y.device_id)&&d.set(Tn(y.device_id),y.name);else r("Warning: could not fetch platform nodes \u2014 node names will not be shown.");let f=Array.from(d.keys()),u=await kr(Do({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceIds:f}),o);if(n.json)return t.success({appAddress:l,chain:i.name,owner:u.owner,allowAnyDevice:u.allowAnyDevice,devices:u.allowAnyDevice?[]:u.devices.map(y=>({deviceId:y,nodeName:d.get(y.toLowerCase())??null}))}),0;if(r(`Contract: ${l}`),r(`Chain: ${i.name}`),r(`Owner: ${u.owner}`),r(`Allow Any Device: ${u.allowAnyDevice?"yes":"no"}`),u.allowAnyDevice)return 0;if(u.devices.length===0)return r("No devices found"),0;let h=["DEVICE_ID","NODE"],g=u.devices.map(y=>({DEVICE_ID:y,NODE:d.get(y.toLowerCase())??"-"}));return ce(h,g),0}catch(s){return Tt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1}}async function TA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Ae(s)},o,a;try{let s=await Sr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:l,allowlist:p}=s;a=i,o=fn(i,n.rpcUrl);let m=Wi(n),d;if(n.interactive&&!n.deviceId){let u=await E(t),h=await bt(u);if(!h.success)return t.fail(h.error.message),1;let g=xA(p.devices),y=h.data.nodes.filter(w=>w.device_id&&Ha(w.device_id)&&!g.has(Tn(w.device_id)));if(y.length===0)return r("All available devices are already in the allowlist."),0;let{selected:b}=await dh.prompt([{type:"checkbox",name:"selected",message:"Select devices to add:",choices:y.map(w=>({name:`${w.name} ${w.device_id}`,value:w.device_id}))}]);if(b.length===0)return r("No devices selected."),0;d=b.map(w=>Tn(w))}else if(n.deviceId)d=[await hh(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let f=[];for(let u of d){r(`Submitting add-device transaction for ${u}...`),r(`RPC URL: ${o}`);let h=await kr(rn({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceId:u,privateKey:m,skipPrerequisiteChecks:!0,timeout:Ga,onTransactionSubmitted:y=>{qi({chain:i,description:`Add-device transaction for ${u}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Tt(new Error(y.error.message),i,o,n.json),t.fail(`Failed to add ${u}: ${y.error.message}`),1}let g=h.data;f.push({deviceId:u,txHash:g.transactionHash,explorer:Ka(i,g.transactionHash)})}if(n.json)return t.success(f),0;for(let u of f)r(`Added ${u.deviceId}`),r(`Transaction: ${u.txHash}`),u.explorer&&r(`Explorer: ${u.explorer}`);if(n.wait){if(!await Bi({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceIds:d,description:"devices to be allowed",json:n.json,condition:h=>h.allowAnyDevice?!0:d.every(g=>h.devices.some(y=>y.toLowerCase()===g.toLowerCase()))}))return t.fail("Devices not observed on-chain within timeout."),1;r("On-chain allowlist updated.")}else r("Backend allowlist API may lag behind chain. Use --wait to verify via RPC.");return 0}catch(s){return gh(s)?(r("Cancelled."),0):(Tt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1)}}async function MA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Ae(s)},o,a;try{let s=await Sr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:l,allowlist:p}=s;a=i,o=fn(i,n.rpcUrl);let m=Wi(n),d;if(n.interactive&&!n.deviceId){let u=p.devices.filter(g=>g.status==="allowed");if(u.length===0)return t.fail("No allowed devices found to remove."),1;let{selected:h}=await dh.prompt([{type:"checkbox",name:"selected",message:"Select devices to remove:",choices:u.map(g=>({name:`${g.node_name??"-"} ${g.device_id}`,value:g.device_id}))}]);if(h.length===0)return r("No devices selected."),0;d=h.map(g=>Tn(g))}else if(n.deviceId)d=[await hh(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let f=[];for(let u of d){r(`Submitting remove-device transaction for ${u}...`),r(`RPC URL: ${o}`);let h=await kr(Yl({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceId:u,privateKey:m,skipPrerequisiteChecks:!0,timeout:Ga,onTransactionSubmitted:y=>{qi({chain:i,description:`Remove-device transaction for ${u}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Tt(new Error(y.error.message),i,o,n.json),t.fail(`Failed to remove ${u}: ${y.error.message}`),1}let g=h.data;f.push({deviceId:u,txHash:g.transactionHash,explorer:Ka(i,g.transactionHash)})}if(n.json)return t.success(f),0;for(let u of f)r(`Removed ${u.deviceId}`),r(`Transaction: ${u.txHash}`),u.explorer&&r(`Explorer: ${u.explorer}`);if(n.wait)if((await kr(Do({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceIds:[]}),o)).allowAnyDevice)r("Warning: allowAnyDevice is enabled \u2014 removed devices still appear as allowed. Disable allow-any-device first if you want per-device enforcement.");else{if(!await Bi({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceIds:d,description:"devices to be removed",json:n.json,condition:g=>d.every(y=>!g.devices.some(b=>b.toLowerCase()===y.toLowerCase()))}))return t.fail("Devices still appear on-chain after timeout."),1;r("On-chain allowlist updated.")}else r("Backend allowlist API may lag behind chain. Use --wait to verify via RPC.");return 0}catch(s){return gh(s)?(r("Cancelled."),0):(Tt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1)}}async function LA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=$A(n);if(r===null)return t.fail(n.enable&&n.disable?"Cannot use both --enable and --disable.":"Specify --enable or --disable to set the allow-any-device flag."),1;let o,a;try{let s=await Sr(n.cvm,t);return s?(a=s.chain,o=fn(s.chain,n.rpcUrl),await Ji(n,t,{chain:s.chain,appContractAddress:s.appContractAddress,allow:r})):1}catch(s){return Tt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1}}async function UA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await Sr(n.cvm,t);return a?(o=a.chain,r=fn(a.chain,n.rpcUrl),await Ji(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:!1})):1}catch(a){return Tt(a,o,r,n.json),t.fail(`Failed: ${a instanceof Error?a.message:String(a)}`),1}}async function OA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await Sr(n.cvm,t);if(!a)return 1;o=a.chain,r=fn(a.chain,n.rpcUrl);let s=RA({enable:n.enable,disable:n.disable,currentValue:a.allowlist.allow_any_device});return s===null?(t.fail("Cannot use both --enable and --disable."),1):await Ji(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:s})}catch(a){return Tt(a,o,r,n.json),t.fail(`Failed: ${a instanceof Error?a.message:String(a)}`),1}}async function Ji(e,t,n){let r=e.json??!1,o=(u="")=>{r||Ae(u)},{chain:a,appContractAddress:s,allow:i}=n,l=Wi(e),p=fn(a,e.rpcUrl);o(`Submitting allow-any-device transaction (${i?"enable":"disable"})...`),o(`RPC URL: ${p}`);let m=await kr(Zl({chain:a,rpcUrl:e.rpcUrl,appAddress:s,allow:i,privateKey:l,timeout:Ga,onTransactionSubmitted:u=>{qi({chain:a,description:"Allow-any-device transaction",txHash:u,json:r})}}),p);if(!m.success){let u=m;return Tt(new Error(u.error.message),a,p,r),t.fail(u.error.message),1}let d=m.data,f=Ka(a,d.transactionHash);if(r)return t.success({...d,explorer:f??void 0}),0;if(o(`Allow-any-device ${i?"enabled":"disabled"} successfully!`),o(`Transaction: ${d.transactionHash}`),f&&o(`Explorer: ${f}`),e.wait){if(!await Bi({chain:a,rpcUrl:e.rpcUrl,appAddress:s,deviceIds:[],description:`allowAnyDevice=${i}`,json:r,condition:h=>h.allowAnyDevice===i}))return t.fail(`allowAnyDevice did not become ${i} within timeout.`),1;o("On-chain allow-any state updated.")}else o("Backend allowlist API may lag behind chain. Use --wait to verify via RPC.");return 0}var NA=C({path:["allow-devices","list"],meta:Xg,schema:Qg,handler:DA}),jA=C({path:["allow-devices","add"],meta:eh,schema:th,handler:TA}),FA=C({path:["allow-devices","remove"],meta:nh,schema:rh,handler:MA}),VA=C({path:["allow-devices","allow-any"],meta:oh,schema:ah,handler:LA}),HA=C({path:["allow-devices","disallow-any"],meta:sh,schema:ih,handler:UA}),zA=C({path:["allow-devices","toggle-allow-any"],meta:ch,schema:lh,handler:OA}),Yi={group:Zg,commands:[NA,jA,FA,VA,HA,zA]};var WA=BA(import.meta.url),JA=GA(WA),YA=qA(JA,"../package.json"),qa=JSON.parse(KA(YA,"utf-8")),ZA="+d27a321",XA=`v${qa.version}${ZA}`,QA=Jo(),T=new Qo;T.registerCommand(Qd);T.registerCommand(dg);T.registerGroup(ug);T.registerCommand(hg);T.registerCommand(bg);T.registerCommand(kg);T.registerCommand(Pg);T.registerCommand(Zu);T.registerCommand(Bf);T.registerCommand(Zf);T.registerCommand(eg);T.registerCommand(og);T.registerCommand(Dg);T.registerCommand(Ku);T.registerCommand(ef);T.registerCommand(Uf);T.registerCommand($i);T.registerCommand(xi);T.registerCommand(Di);T.registerCommand(jf);T.registerCommand(fp);T.registerCommand(Ep);T.registerCommand(Yg);T.registerCommand(Vf);T.registerCommand(Cf);T.registerCommand(Fu);T.registerGroup(Oi.group);for(let e of Oi.commands)T.registerCommand(e);T.registerGroup(Ys.group);for(let e of Ys.commands)T.registerCommand(e);T.registerGroup(Xs.group);for(let e of Xs.commands)T.registerCommand(e);T.registerGroup(fa.group);for(let e of fa.commands)T.registerCommand(e);for(let e of fa.subgroups??[]){T.registerGroup(e.group);for(let t of e.commands)T.registerCommand(t)}T.registerGroup(gi.group);for(let e of gi.commands)T.registerCommand(e);T.registerGroup(Ki.group);for(let e of Ki.commands)T.registerCommand(e);T.registerGroup(hi.group);for(let e of hi.commands)T.registerCommand(e);T.registerGroup(ki.group);for(let e of ki.commands)T.registerCommand(e);T.registerGroup(Ei.group);for(let e of Ei.commands)T.registerCommand(e);T.registerGroup(Ai.group);for(let e of Ai.commands)T.registerCommand(e);T.registerGroup(Yi.group);for(let e of Yi.commands)T.registerCommand(e);process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function eP(){await sp({env:process.env,stderr:process.stderr});let e=await np({registry:T,argv:process.argv.slice(2),executableName:qa.name??"phala",version:XA,packageName:qa.name??"phala",packageVersion:qa.version,runtime:QA,cwd:process.cwd(),env:process.env,stdout:process.stdout,stderr:process.stderr,stdin:process.stdin});process.exit(e)}eP().catch(e=>{console.error("An error occurred:",e),process.exit(1)});
424
526
  /*! Bundled license information:
425
527
 
426
528
  @noble/hashes/utils.js: