phala 1.1.19 → 1.1.20

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,29 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'module';const require = createRequire(import.meta.url);
3
- var _h=Object.create;var ec=Object.defineProperty;var kh=Object.getOwnPropertyDescriptor;var Sh=Object.getOwnPropertyNames;var Eh=Object.getPrototypeOf,Ih=Object.prototype.hasOwnProperty;var Yt=(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 ct=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ah=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Sh(t))!Ih.call(e,o)&&o!==n&&ec(e,o,{get:()=>t[o],enumerable:!(r=kh(t,o))||r.enumerable});return e};var Pr=(e,t,n)=>(n=e!=null?_h(Eh(e)):{},Ah(t||!e||!e.__esModule?ec(n,"default",{value:e,enumerable:!0}):n,e));var nc=ct((dP,tc)=>{var On=1e3,Nn=On*60,jn=Nn*60,yn=jn*24,Ph=yn*7,$h=yn*365.25;tc.exports=function(e,t){t=t||{};var n=typeof e;if(n==="string"&&e.length>0)return Rh(e);if(n==="number"&&isFinite(e))return t.long?Dh(e):xh(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function Rh(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*$h;case"weeks":case"week":case"w":return n*Ph;case"days":case"day":case"d":return n*yn;case"hours":case"hour":case"hrs":case"hr":case"h":return n*jn;case"minutes":case"minute":case"mins":case"min":case"m":return n*Nn;case"seconds":case"second":case"secs":case"sec":case"s":return n*On;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function xh(e){var t=Math.abs(e);return t>=yn?Math.round(e/yn)+"d":t>=jn?Math.round(e/jn)+"h":t>=Nn?Math.round(e/Nn)+"m":t>=On?Math.round(e/On)+"s":e+"ms"}function Dh(e){var t=Math.abs(e);return t>=yn?ho(e,t,yn,"day"):t>=jn?ho(e,t,jn,"hour"):t>=Nn?ho(e,t,Nn,"minute"):t>=On?ho(e,t,On,"second"):e+" ms"}function ho(e,t,n,r){var o=t>=n*1.5;return Math.round(e/n)+" "+r+(o?"s":"")}});var Ja=ct((uP,rc)=>{function Th(e){n.debug=n,n.default=n,n.coerce=l,n.disable=s,n.enable=o,n.enabled=i,n.humanize=nc(),n.destroy=m,Object.keys(e).forEach(p=>{n[p]=e[p]}),n.names=[],n.skips=[],n.formatters={};function t(p){let d=0;for(let f=0;f<p.length;f++)d=(d<<5)-d+p.charCodeAt(f),d|=0;return n.colors[Math.abs(d)%n.colors.length]}n.selectColor=t;function n(p){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 N=y[k];I=M.call(b,N),y.splice(k,1),k--}return I}),n.formatArgs.call(b,y),(b.log||n.log).apply(b,y)}return g.namespace=p,g.useColors=n.useColors(),g.color=n.selectColor(p),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(p)),h),set:y=>{f=y}}),typeof n.init=="function"&&n.init(g),g}function r(p,d){let f=n(this.namespace+(typeof d>"u"?":":d)+p);return f.log=this.log,f}function o(p){n.save(p),n.namespaces=p,n.names=[],n.skips=[];let d=(typeof p=="string"?p:"").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(p,d){let f=0,u=0,h=-1,g=0;for(;f<p.length;)if(u<d.length&&(d[u]===p[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 p=[...n.names,...n.skips.map(d=>"-"+d)].join(",");return n.enable(""),p}function i(p){for(let d of n.skips)if(a(p,d))return!1;for(let d of n.names)if(a(p,d))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 n.enable(n.load()),n}rc.exports=Th});var oc=ct((Je,yo)=>{Je.formatArgs=Lh;Je.save=Uh;Je.load=Oh;Je.useColors=Mh;Je.storage=Nh();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 Mh(){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 Lh(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+yo.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)}Je.log=console.debug||console.log||(()=>{});function Uh(e){try{e?Je.storage.setItem("debug",e):Je.storage.removeItem("debug")}catch{}}function Oh(){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 Nh(){try{return localStorage}catch{}}yo.exports=Ja()(Je);var{formatters:jh}=yo.exports;jh.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var sc=ct((Ee,Co)=>{var Fh=Yt("tty"),vo=Yt("util");Ee.init=Bh;Ee.log=Kh;Ee.formatArgs=Hh;Ee.save=Gh;Ee.load=qh;Ee.useColors=Vh;Ee.destroy=vo.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");Ee.colors=[6,2,3,4,5,1];try{let e=Yt("supports-color");e&&(e.stderr||e).level>=2&&(Ee.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{}Ee.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 Vh(){return"colors"in Ee.inspectOpts?!!Ee.inspectOpts.colors:Fh.isatty(process.stderr.fd)}function Hh(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(`
3
+ var Lg=Object.create;var $i=Object.defineProperty;var Ng=Object.getOwnPropertyDescriptor;var Og=Object.getOwnPropertyNames;var jg=Object.getPrototypeOf,Fg=Object.prototype.hasOwnProperty;var ka=(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 ur=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vg=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Og(t))!Fg.call(e,o)&&o!==n&&$i(e,o,{get:()=>t[o],enumerable:!(r=Ng(t,o))||r.enumerable});return e};var Hg=(e,t,n)=>(n=e!=null?Lg(jg(e)):{},Vg(t||!e||!e.__esModule?$i(n,"default",{value:e,enumerable:!0}):n,e));var Di=ur((wA,Ti)=>{var Sn=1e3,kn=Sn*60,In=kn*60,sn=In*24,zg=sn*7,Kg=sn*365.25;Ti.exports=function(e,t){t=t||{};var n=typeof e;if(n==="string"&&e.length>0)return qg(e);if(n==="number"&&isFinite(e))return t.long?Bg(e):Gg(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function qg(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*Kg;case"weeks":case"week":case"w":return n*zg;case"days":case"day":case"d":return n*sn;case"hours":case"hour":case"hrs":case"hr":case"h":return n*In;case"minutes":case"minute":case"mins":case"min":case"m":return n*kn;case"seconds":case"second":case"secs":case"sec":case"s":return n*Sn;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function Gg(e){var t=Math.abs(e);return t>=sn?Math.round(e/sn)+"d":t>=In?Math.round(e/In)+"h":t>=kn?Math.round(e/kn)+"m":t>=Sn?Math.round(e/Sn)+"s":e+"ms"}function Bg(e){var t=Math.abs(e);return t>=sn?Wr(e,t,sn,"day"):t>=In?Wr(e,t,In,"hour"):t>=kn?Wr(e,t,kn,"minute"):t>=Sn?Wr(e,t,Sn,"second"):e+" ms"}function Wr(e,t,n,r){var o=t>=n*1.5;return Math.round(e/n)+" "+r+(o?"s":"")}});var Ia=ur((_A,Mi)=>{function Wg(e){n.debug=n,n.default=n,n.coerce=c,n.disable=s,n.enable=o,n.enabled=i,n.humanize=Di(),n.destroy=l,Object.keys(e).forEach(p=>{n[p]=e[p]}),n.names=[],n.skips=[],n.formatters={};function t(p){let u=0;for(let f=0;f<p.length;f++)u=(u<<5)-u+p.charCodeAt(f),u|=0;return n.colors[Math.abs(u)%n.colors.length]}n.selectColor=t;function n(p){let u,f=null,d,h;function g(...y){if(!g.enabled)return;let k=g,_=Number(new Date),E=_-(u||_);k.diff=E,k.prev=u,k.curr=_,u=_,y[0]=n.coerce(y[0]),typeof y[0]!="string"&&y.unshift("%O");let S=0;y[0]=y[0].replace(/%([a-zA-Z%])/g,(I,x)=>{if(I==="%%")return"%";S++;let U=n.formatters[x];if(typeof U=="function"){let M=y[S];I=U.call(k,M),y.splice(S,1),S--}return I}),n.formatArgs.call(k,y),(k.log||n.log).apply(k,y)}return g.namespace=p,g.useColors=n.useColors(),g.color=n.selectColor(p),g.extend=r,g.destroy=n.destroy,Object.defineProperty(g,"enabled",{enumerable:!0,configurable:!1,get:()=>f!==null?f:(d!==n.namespaces&&(d=n.namespaces,h=n.enabled(p)),h),set:y=>{f=y}}),typeof n.init=="function"&&n.init(g),g}function r(p,u){let f=n(this.namespace+(typeof u>"u"?":":u)+p);return f.log=this.log,f}function o(p){n.save(p),n.namespaces=p,n.names=[],n.skips=[];let u=(typeof p=="string"?p:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let f of u)f[0]==="-"?n.skips.push(f.slice(1)):n.names.push(f)}function a(p,u){let f=0,d=0,h=-1,g=0;for(;f<p.length;)if(d<u.length&&(u[d]===p[f]||u[d]==="*"))u[d]==="*"?(h=d,g=f,d++):(f++,d++);else if(h!==-1)d=h+1,g++,f=g;else return!1;for(;d<u.length&&u[d]==="*";)d++;return d===u.length}function s(){let p=[...n.names,...n.skips.map(u=>"-"+u)].join(",");return n.enable(""),p}function i(p){for(let u of n.skips)if(a(p,u))return!1;for(let u of n.names)if(a(p,u))return!0;return!1}function c(p){return p instanceof Error?p.stack||p.message:p}function l(){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}Mi.exports=Wg});var Ui=ur((Ye,Jr)=>{Ye.formatArgs=Yg;Ye.save=Xg;Ye.load=Zg;Ye.useColors=Jg;Ye.storage=Qg();Ye.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`."))}})();Ye.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 Jg(){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 Yg(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+Jr.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)}Ye.log=console.debug||console.log||(()=>{});function Xg(e){try{e?Ye.storage.setItem("debug",e):Ye.storage.removeItem("debug")}catch{}}function Zg(){let e;try{e=Ye.storage.getItem("debug")||Ye.storage.getItem("DEBUG")}catch{}return!e&&typeof process<"u"&&"env"in process&&(e=process.env.DEBUG),e}function Qg(){try{return localStorage}catch{}}Jr.exports=Ia()(Ye);var{formatters:eh}=Jr.exports;eh.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var Ni=ur((Ie,Xr)=>{var th=ka("tty"),Yr=ka("util");Ie.init=ch;Ie.log=ah;Ie.formatArgs=rh;Ie.save=sh;Ie.load=ih;Ie.useColors=nh;Ie.destroy=Yr.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");Ie.colors=[6,2,3,4,5,1];try{let e=ka("supports-color");e&&(e.stderr||e).level>=2&&(Ie.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{}Ie.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 nh(){return"colors"in Ie.inspectOpts?!!Ie.inspectOpts.colors:th.isatty(process.stderr.fd)}function rh(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+"+Co.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=zh()+t+" "+e[0]}function zh(){return Ee.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Kh(...e){return process.stderr.write(vo.formatWithOptions(Ee.inspectOpts,...e)+`
6
- `)}function Gh(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function qh(){return process.env.DEBUG}function Bh(e){e.inspectOpts={};let t=Object.keys(Ee.inspectOpts);for(let n=0;n<t.length;n++)e.inspectOpts[t[n]]=Ee.inspectOpts[t[n]]}Co.exports=Ja()(Ee);var{formatters:ac}=Co.exports;ac.o=function(e){return this.inspectOpts.colors=this.useColors,vo.inspect(e,this.inspectOpts).split(`
7
- `).map(t=>t.trim()).join(" ")};ac.O=function(e){return this.inspectOpts.colors=this.useColors,vo.inspect(e,this.inspectOpts)}});var ic=ct((fP,Ya)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Ya.exports=oc():Ya.exports=sc()});var Qa=ct($r=>{"use strict";var Wh=$r&&$r.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty($r,"__esModule",{value:!0});$r.encryptEnvVars=Zh;var Za=Yt("@noble/curves/ed25519"),Xa=Wh(Yt("crypto"));function Jh(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 Yh(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Zh(e,t){let n=JSON.stringify({env:e}),r=Za.x25519.utils.randomPrivateKey(),o=Za.x25519.getPublicKey(r),a=Jh(t),s=Za.x25519.getSharedSecret(r,a),i=await Xa.default.subtle.importKey("raw",s,{name:"AES-GCM",length:256},!0,["encrypt"]),l=Xa.default.getRandomValues(new Uint8Array(12)),m=await Xa.default.subtle.encrypt({name:"AES-GCM",iv:l},i,new TextEncoder().encode(n)),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),Yh(p)}});var lc=ct(Rr=>{"use strict";var Xh=Rr&&Rr.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Rr,"__esModule",{value:!0});Rr.getComposeHash=ny;var Qh=Xh(Yt("crypto"));function es(e){return e==null?e:Array.isArray(e)?e.map(es):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return t[n]=es(r),t},{}):e}function ey(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 ty(e){let t=es(e);return JSON.stringify(t,(n,r)=>typeof r=="number"&&(isNaN(r)||!isFinite(r))?null:r)}function ny(e,t=!1){t&&(e=ey(e));let n=ty(e);return Qh.default.createHash("sha256").update(n,"utf8").digest("hex")}});var xc=ct(F=>{"use strict";Object.defineProperty(F,"__esModule",{value:!0});F.toBig=F.shrSL=F.shrSH=F.rotrSL=F.rotrSH=F.rotrBL=F.rotrBH=F.rotr32L=F.rotr32H=F.rotlSL=F.rotlSH=F.rotlBL=F.rotlBH=F.add5L=F.add5H=F.add4L=F.add4H=F.add3L=F.add3H=void 0;F.add=Sc;F.fromBig=ns;F.split=mc;var bo=BigInt(2**32-1),ts=BigInt(32);function ns(e,t=!1){return t?{h:Number(e&bo),l:Number(e>>ts&bo)}:{h:Number(e>>ts&bo)|0,l:Number(e&bo)|0}}function mc(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}=ns(e[a],t);[r[a],o[a]]=[s,i]}return[r,o]}var pc=(e,t)=>BigInt(e>>>0)<<ts|BigInt(t>>>0);F.toBig=pc;var dc=(e,t,n)=>e>>>n;F.shrSH=dc;var uc=(e,t,n)=>e<<32-n|t>>>n;F.shrSL=uc;var fc=(e,t,n)=>e>>>n|t<<32-n;F.rotrSH=fc;var gc=(e,t,n)=>e<<32-n|t>>>n;F.rotrSL=gc;var hc=(e,t,n)=>e<<64-n|t>>>n-32;F.rotrBH=hc;var yc=(e,t,n)=>e>>>n-32|t<<64-n;F.rotrBL=yc;var vc=(e,t)=>t;F.rotr32H=vc;var Cc=(e,t)=>e;F.rotr32L=Cc;var bc=(e,t,n)=>e<<n|t>>>32-n;F.rotlSH=bc;var wc=(e,t,n)=>t<<n|e>>>32-n;F.rotlSL=wc;var _c=(e,t,n)=>t<<n-32|e>>>64-n;F.rotlBH=_c;var kc=(e,t,n)=>e<<n-32|t>>>64-n;F.rotlBL=kc;function Sc(e,t,n,r){let o=(t>>>0)+(r>>>0);return{h:e+n+(o/2**32|0)|0,l:o|0}}var Ec=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0);F.add3L=Ec;var Ic=(e,t,n,r)=>t+n+r+(e/2**32|0)|0;F.add3H=Ic;var Ac=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0);F.add4L=Ac;var Pc=(e,t,n,r,o)=>t+n+r+o+(e/2**32|0)|0;F.add4H=Pc;var $c=(e,t,n,r,o)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(o>>>0);F.add5L=$c;var Rc=(e,t,n,r,o,a)=>t+n+r+o+a+(e/2**32|0)|0;F.add5H=Rc;var ry={fromBig:ns,split:mc,toBig:pc,shrSH:dc,shrSL:uc,rotrSH:fc,rotrSL:gc,rotrBH:hc,rotrBL:yc,rotr32H:vc,rotr32L:Cc,rotlSH:bc,rotlSL:wc,rotlBH:_c,rotlBL:kc,add:Sc,add3L:Ec,add3H:Ic,add4L:Ac,add4H:Pc,add5H:Rc,add5L:$c};F.default=ry});var Dc=ct(wo=>{"use strict";Object.defineProperty(wo,"__esModule",{value:!0});wo.crypto=void 0;var Zt=Yt("crypto");wo.crypto=Zt&&typeof Zt=="object"&&"webcrypto"in Zt?Zt.webcrypto:Zt&&typeof Zt=="object"&&"randomBytes"in Zt?Zt:void 0});var Fc=ct(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=Mc;D.anumber=rs;D.abytes=Vn;D.ahash=oy;D.aexists=ay;D.aoutput=sy;D.u8=iy;D.u32=cy;D.clean=ly;D.createView=my;D.rotr=py;D.rotl=dy;D.byteSwap=as;D.byteSwap32=Lc;D.bytesToHex=fy;D.hexToBytes=gy;D.asyncLoop=yy;D.utf8ToBytes=ss;D.bytesToUtf8=vy;D.toBytes=_o;D.kdfInputToBytes=Cy;D.concatBytes=by;D.checkOpts=wy;D.createHasher=Oc;D.createOptHasher=Nc;D.createXOFer=jc;D.randomBytes=_y;var Fn=Dc();function Mc(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"}function rs(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("positive integer expected, got "+e)}function Vn(e,...t){if(!Mc(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 oy(e){if(typeof e!="function"||typeof e.create!="function")throw new Error("Hash should be wrapped by utils.createHasher");rs(e.outputLen),rs(e.blockLen)}function ay(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 sy(e,t){Vn(e);let n=t.outputLen;if(e.length<n)throw new Error("digestInto() expects output buffer of length at least "+n)}function iy(e){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}function cy(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function ly(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}function my(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function py(e,t){return e<<32-t|e>>>t}function dy(e,t){return e<<t|e>>>32-t>>>0}D.isLE=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function as(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}D.swap8IfBE=D.isLE?e=>e:e=>as(e);D.byteSwapIfBE=D.swap8IfBE;function Lc(e){for(let t=0;t<e.length;t++)e[t]=as(e[t]);return e}D.swap32IfBE=D.isLE?e=>e:Lc;var Uc=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",uy=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function fy(e){if(Vn(e),Uc)return e.toHex();let t="";for(let n=0;n<e.length;n++)t+=uy[e[n]];return t}var Ut={_0:48,_9:57,A:65,F:70,a:97,f:102};function Tc(e){if(e>=Ut._0&&e<=Ut._9)return e-Ut._0;if(e>=Ut.A&&e<=Ut.F)return e-(Ut.A-10);if(e>=Ut.a&&e<=Ut.f)return e-(Ut.a-10)}function gy(e){if(typeof e!="string")throw new Error("hex string expected, got "+typeof e);if(Uc)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=Tc(e.charCodeAt(a)),i=Tc(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 hy=async()=>{};D.nextTick=hy;async function yy(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 ss(e){if(typeof e!="string")throw new Error("string expected");return new Uint8Array(new TextEncoder().encode(e))}function vy(e){return new TextDecoder().decode(e)}function _o(e){return typeof e=="string"&&(e=ss(e)),Vn(e),e}function Cy(e){return typeof e=="string"&&(e=ss(e)),Vn(e),e}function by(...e){let t=0;for(let r=0;r<e.length;r++){let o=e[r];Vn(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 wy(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 os=class{};D.Hash=os;function Oc(e){let t=r=>e().update(_o(r)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function Nc(e){let t=(r,o)=>e(o).update(_o(r)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=r=>e(r),t}function jc(e){let t=(r,o)=>e(o).update(_o(r)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=r=>e(r),t}D.wrapConstructor=Oc;D.wrapConstructorWithOpts=Nc;D.wrapXOFConstructorWithOpts=jc;function _y(e=32){if(Fn.crypto&&typeof Fn.crypto.getRandomValues=="function")return Fn.crypto.getRandomValues(new Uint8Array(e));if(Fn.crypto&&typeof Fn.crypto.randomBytes=="function")return Uint8Array.from(Fn.crypto.randomBytes(e));throw new Error("crypto.getRandomValues must be defined")}});var Jc=ct(me=>{"use strict";Object.defineProperty(me,"__esModule",{value:!0});me.shake256=me.shake128=me.keccak_512=me.keccak_384=me.keccak_256=me.keccak_224=me.sha3_512=me.sha3_384=me.sha3_256=me.sha3_224=me.Keccak=void 0;me.keccakP=Bc;var Dr=xc(),Ue=Fc(),ky=BigInt(0),xr=BigInt(1),Sy=BigInt(2),Ey=BigInt(7),Iy=BigInt(256),Ay=BigInt(113),zc=[],Kc=[],Gc=[];for(let e=0,t=xr,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],zc.push(2*(5*r+n)),Kc.push((e+1)*(e+2)/2%64);let o=ky;for(let a=0;a<7;a++)t=(t<<xr^(t>>Ey)*Ay)%Iy,t&Sy&&(o^=xr<<(xr<<BigInt(a))-xr);Gc.push(o)}var qc=(0,Dr.split)(Gc,!0),Py=qc[0],$y=qc[1],Vc=(e,t,n)=>n>32?(0,Dr.rotlBH)(e,t,n):(0,Dr.rotlSH)(e,t,n),Hc=(e,t,n)=>n>32?(0,Dr.rotlBL)(e,t,n):(0,Dr.rotlSL)(e,t,n);function Bc(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,m=n[l],p=n[l+1],d=Vc(m,p,1)^n[i],f=Hc(m,p,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=Kc[s],l=Vc(o,a,i),m=Hc(o,a,i),p=zc[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 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]^=Py[r],e[1]^=$y[r]}(0,Ue.clean)(n)}var Tr=class e extends Ue.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,Ue.anumber)(r),!(0<t&&t<200))throw new Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=(0,Ue.u32)(this.state)}clone(){return this._cloneInto()}keccak(){(0,Ue.swap32IfBE)(this.state32),Bc(this.state32,this.rounds),(0,Ue.swap32IfBE)(this.state32),this.posOut=0,this.pos=0}update(t){(0,Ue.aexists)(this),t=(0,Ue.toBytes)(t),(0,Ue.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,Ue.aexists)(this,!1),(0,Ue.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,Ue.anumber)(t),this.xofInto(new Uint8Array(t))}digestInto(t){if((0,Ue.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,Ue.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}};me.Keccak=Tr;var Xt=(e,t,n)=>(0,Ue.createHasher)(()=>new Tr(t,e,n));me.sha3_224=Xt(6,144,224/8);me.sha3_256=Xt(6,136,256/8);me.sha3_384=Xt(6,104,384/8);me.sha3_512=Xt(6,72,512/8);me.keccak_224=Xt(1,144,224/8);me.keccak_256=Xt(1,136,256/8);me.keccak_384=Xt(1,104,384/8);me.keccak_512=Xt(1,72,512/8);var Wc=(e,t,n)=>(0,Ue.createXOFer)((r={})=>new Tr(t,e,r.dkLen===void 0?n:r.dkLen,!0));me.shake128=Wc(31,168,128/8);me.shake256=Wc(31,136,256/8)});var Yc=ct(is=>{"use strict";Object.defineProperty(is,"__esModule",{value:!0});is.verifyEnvEncryptPublicKey=Dy;var Ry=Jc(),xy=Yt("@noble/curves/secp256k1");function Dy(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,Ry.keccak_256)(i);try{let m=t.slice(0,32),p=t.slice(32,64),d=t[64],f=new Uint8Array(64);f.set(m,0),f.set(p,32);let u=xy.secp256k1.Signature.fromCompact(f).addRecoveryBit(d).recoverPublicKey(l);return"0x"+Buffer.from(u.toRawBytes(!0)).toString("hex")}catch(m){return console.error("signature verification failed:",m),null}}});import{readFileSync as eP}from"fs";import{dirname as tP,join as nP}from"path";import{fileURLToPath as rP}from"url";import{ZodError as Hk}from"zod";import ur from"chalk";var bl=Pr(ic(),1);import{ofetch as Ty}from"ofetch";function cc(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 A$=Pr(Qa(),1),Ae=Pr(Qa(),1),tk=Pr(lc(),1),nk=Pr(Yc(),1);import{z as Ie}from"zod";import{z as pe}from"zod";import{z as Qt}from"zod";import{z as q}from"zod";import{z as en}from"zod";import{anvil as Xc,base as Qc,mainnet as el}from"viem/chains";import{z as O}from"zod";import{z as be}from"zod";import{z as Ne}from"zod";import{z as A}from"zod";import{z as P}from"zod";import{z as zn}from"zod";import{z as Kn}from"zod";import{z as L}from"zod";import{z as $e}from"zod";import{z as J}from"zod";import Jv from"crypto";import{z as gt}from"zod";import{z as ut}from"zod";import{z as De}from"zod";import{z as Ze}from"zod";import{z as Xe}from"zod";import{z as AC}from"zod";import{z as tl}from"zod";import{z as $t}from"zod";import{z as Zn}from"zod";import{z as Cn}from"zod";import{z as ce}from"zod";import{z as ZC}from"zod";import{z as eb}from"zod";import{z as re}from"zod";import{z as At}from"zod";import{z as fb}from"zod";import{z as Ce}from"zod";import{z as U}from"zod";import{z as Jn}from"zod";import{z as ms}from"zod";import{z as Oe}from"zod";import{z as Kl}from"zod";import{z as Et}from"zod";import{z as Ye}from"zod";import{z as tn}from"zod";import{z as ps}from"zod";import{z as gs}from"zod";import{z as vn}from"zod";import{z as xe}from"zod";import{z as we}from"zod";import{z as R}from"zod";import{z as ee}from"zod";import{z as Z}from"zod";import{z as _e}from"zod";import{createPublicClient as ol,createWalletClient as _w,http as ds,parseEventLogs as kw,parseEther as al}from"viem";import{privateKeyToAccount as Sw}from"viem/accounts";import{isHex as sl}from"viem";import{createPublicClient as x$,createWalletClient as D$,http as T$,custom as M$}from"viem";import{privateKeyToAccount as U$}from"viem/accounts";import{z as ge}from"zod";import{createPublicClient as il,createWalletClient as Tw,http as us,parseEventLogs as Mw,parseEther as cl}from"viem";import{privateKeyToAccount as Lw}from"viem/accounts";import{z as he}from"zod";import{createPublicClient as ll,createWalletClient as Fw,http as ml,parseEther as pl}from"viem";import{privateKeyToAccount as Vw}from"viem/accounts";import{z as ye}from"zod";import{createPublicClient as dl,createWalletClient as Gw,http as ul,parseEther as fl}from"viem";import{privateKeyToAccount as qw}from"viem/accounts";import{z as ve}from"zod";import{createPublicClient as gl,createWalletClient as Yw,http as hl,parseEther as yl}from"viem";import{privateKeyToAccount as Zw}from"viem/accounts";import{z as Gn}from"zod";import{createPublicClient as t_,http as n_}from"viem";import{createPublicClient as Q$,http as eR}from"viem";import{createPublicClient as nR,http as rR}from"viem";import{createPublicClient as r_,http as o_}from"viem";import{z as qn}from"zod";import{z as ht}from"zod";import{z as p_}from"zod";import{z as Bn}from"zod";import{z as Y}from"zod";import{z as Ao}from"zod";import{z as Xn}from"zod";import{z as ft}from"zod";import{z as Re}from"zod";import{z as He}from"zod";import{z as Mr}from"zod";import{z as ze}from"zod";import{z as Wn}from"zod";import{z as lt}from"zod";import{z as nt}from"zod";import{z as vl}from"zod";import{z as Po}from"zod";import{z as It}from"zod";import{z as Ke}from"zod";import{z as So}from"zod";import{z as Eo}from"zod";import{z as Ve}from"zod";import{z as B}from"zod";var My=Ie.object({detail:Ie.union([Ie.string(),Ie.array(Ie.object({msg:Ie.string(),type:Ie.string().optional(),ctx:Ie.record(Ie.unknown()).optional(),loc:Ie.array(Ie.union([Ie.string(),Ie.number()])).optional(),input:Ie.unknown().optional()}).passthrough()),Ie.record(Ie.unknown())]).optional(),type:Ie.string().optional(),code:Ie.string().optional()}),vt=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)}},cs=class Io extends vt{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=My.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 Io(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 Io(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 Io(t.message,{request:n??void 0,detail:t.message})}},wl=class extends vt{constructor(e,t){super(e,t),this.isValidationError=!0,this.validationErrors=t.validationErrors}},Ly=class extends vt{constructor(){super(...arguments),this.isAuthError=!0}},$o=class extends vt{constructor(){super(...arguments),this.isBusinessError=!0}},Uy=class extends vt{constructor(){super(...arguments),this.isServerError=!0}},Oy=class extends vt{constructor(){super(...arguments),this.isUnknownError=!0}};function Ny(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 _l(e){if(!Array.isArray(e))return{errors:[],message:typeof e=="string"?e:"Validation error"};let t=e.map((o,a)=>{let s=Ny(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 jy(e){return e===422?"validation":e===401||e===403?"auth":e>=400&&e<500?"business":e>=500?"server":"unknown"}function Fy(e,t,n){if(e===422&&Array.isArray(t)){let{message:r}=_l(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 Vy(e){let t=e.status??0,n=e.statusText??"Unknown Error",r=e.detail,o=zy(r);if(o)return new Ct(o.message,{status:t,statusText:n,detail:r,errorCode:o.error_code,structuredDetails:o.details,suggestions:o.suggestions,links:o.links});let a=jy(t),s=Fy(t,r,e.message),i={status:t,statusText:n,detail:r};if(a==="validation"&&Array.isArray(r)){let{errors:l}=_l(r);return new wl(s,{...i,validationErrors:l})}return a==="auth"?new Ly(s,i):a==="business"?new $o(s,i):a==="server"?new Uy(s,i):new Oy(s,i)}function Hy(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 ",m=o?`${s.field}: `:"";return`${a}${l}${m}${s.message}`}).join(`
8
- `)}function Ro(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 wl&&e.validationErrors.length>0&&(o.push(""),o.push(Hy(e.validationErrors,{showFields:n}))),o.join(`
9
- `)}var Ct=class extends $o{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 zy(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 nn(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 bn=["2025-10-28","2026-01-21"],Ky="2026-01-21",Hn=(0,bl.default)("phala::api-client");function Gy(e){return Object.entries(e).map(([t,n])=>` -H "${t}: ${n}"`).join(`
11
- `)}function qy(e){return e?` -d '${(typeof e=="string"?e:JSON.stringify(e,null,2)).replace(/'/g,"\\'")}'`:""}function Zc(e,t,n,r){let o=[];n.forEach((i,l)=>{o.push(`${l}: ${i}`)});let a=o.join(`
5
+ `+a),e.push(o+"m+"+Xr.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=oh()+t+" "+e[0]}function oh(){return Ie.inspectOpts.hideDate?"":new Date().toISOString()+" "}function ah(...e){return process.stderr.write(Yr.formatWithOptions(Ie.inspectOpts,...e)+`
6
+ `)}function sh(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function ih(){return process.env.DEBUG}function ch(e){e.inspectOpts={};let t=Object.keys(Ie.inspectOpts);for(let n=0;n<t.length;n++)e.inspectOpts[t[n]]=Ie.inspectOpts[t[n]]}Xr.exports=Ia()(Ie);var{formatters:Li}=Xr.exports;Li.o=function(e){return this.inspectOpts.colors=this.useColors,Yr.inspect(e,this.inspectOpts).split(`
7
+ `).map(t=>t.trim()).join(" ")};Li.O=function(e){return this.inspectOpts.colors=this.useColors,Yr.inspect(e,this.inspectOpts)}});var Oi=ur((SA,Ea)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Ea.exports=Ui():Ea.exports=Ni()});import{readFileSync as lA}from"fs";import{dirname as mA,join as pA}from"path";import{fileURLToPath as uA}from"url";import{ZodError as dS}from"zod";import Qn from"chalk";var Ac=Hg(Oi(),1);import{ofetch as $h}from"ofetch";function ji(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)})}}}import{z as Ee}from"zod";import{z as me}from"zod";import{z as qt}from"zod";import{z as K}from"zod";import{z as w}from"zod";import{z as R}from"zod";import{z as Dt}from"zod";import{anvil as oc,base as ac,mainnet as sc}from"viem/chains";import{z as T}from"zod";import{z as Ce}from"zod";import{z as Ae}from"zod";import{z as An}from"zod";import{z as Rn}from"zod";import{z as P}from"zod";import{z as ee}from"zod";import{z as F}from"zod";import Qy from"crypto";import{z as ct}from"zod";import{z as ft}from"zod";import{z as Te}from"zod";import{z as De}from"zod";import{z as Me}from"zod";import{z as Dv}from"zod";import{z as Pn}from"zod";import{z as rt}from"zod";import{z as ic}from"zod";import{z as kt}from"zod";import{z as It}from"zod";import{z as Ge}from"zod";import{z as cc}from"zod";import{z as vr}from"zod";import{z as Un}from"zod";import{z as ln}from"zod";import{z as se}from"zod";import{z as kb}from"zod";import{z as Eb}from"zod";import{z as re}from"zod";import{z as _t}from"zod";import{z as Fb}from"zod";import{z as be}from"zod";import{z as N}from"zod";import{z as Mt}from"zod";import{z as La}from"zod";import{z as Fe}from"zod";import{z as yl}from"zod";import{z as Ct}from"zod";import{z as Xe}from"zod";import{z as Gt}from"zod";import{z as Na}from"zod";import{z as Va}from"zod";import{z as cn}from"zod";import{z as $e}from"zod";import{z as pe}from"zod";import{z as H}from"zod";import{z as de}from"zod";import{z as Y}from"zod";import{z as _e}from"zod";import{createPublicClient as pc,createWalletClient as BC,http as Oa,parseEventLogs as WC,parseEther as uc}from"viem";import{privateKeyToAccount as JC}from"viem/accounts";import{x25519 as Aa}from"@noble/curves/ed25519";function lh(e){return e=e.startsWith("0x")?e.slice(2):e,new Uint8Array(e.match(/.{1,2}/g)?.map(t=>parseInt(t,16))??[])}function mh(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function je(e,t){let n=JSON.stringify({env:e}),r=Aa.utils.randomPrivateKey(),o=Aa.getPublicKey(r),a=lh(t),s=Aa.getSharedSecret(r,a),i=await crypto.subtle.importKey("raw",new Uint8Array(s),{name:"AES-GCM",length:256},!0,["encrypt"]),c=crypto.getRandomValues(new Uint8Array(12)),l=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},i,new TextEncoder().encode(n)),p=new Uint8Array(o.length+c.length+l.byteLength);return p.set(o),p.set(c,o.length),p.set(new Uint8Array(l),o.length+c.length),mh(p)}import{keccak256 as YC,toBytes as to,toHex as XC}from"viem";import{isHex as dc}from"viem";import{createPublicClient as nP,createWalletClient as rP,http as oP,custom as aP}from"viem";import{privateKeyToAccount as iP}from"viem/accounts";import{z as ge}from"zod";import{createPublicClient as fc,createWalletClient as cw,http as ja,parseEventLogs as lw,parseEther as gc}from"viem";import{privateKeyToAccount as mw}from"viem/accounts";import{z as he}from"zod";import{createPublicClient as hc,createWalletClient as gw,http as yc,parseEther as vc}from"viem";import{privateKeyToAccount as hw}from"viem/accounts";import{z as ye}from"zod";import{createPublicClient as bc,createWalletClient as Cw,http as Cc,parseEther as wc}from"viem";import{privateKeyToAccount as ww}from"viem/accounts";import{z as ve}from"zod";import{createPublicClient as _c,createWalletClient as Iw,http as Sc,parseEther as kc}from"viem";import{privateKeyToAccount as Ew}from"viem/accounts";import{z as xn}from"zod";import{createPublicClient as xw,http as $w}from"viem";import{createPublicClient as kP,http as IP}from"viem";import{createPublicClient as AP,http as RP}from"viem";import{createPublicClient as Tw,http as Dw}from"viem";import{z as $n}from"zod";import{z as gt}from"zod";import{z as Fw}from"zod";import{z as Tn}from"zod";import{z as W}from"zod";import{z as oo}from"zod";import{z as Ln}from"zod";import{z as nt}from"zod";import{z as Se}from"zod";import{z as oe}from"zod";import{z as gr}from"zod";import{z as xe}from"zod";import{z as Dn}from"zod";import{z as Ue}from"zod";import{z as tt}from"zod";import{z as Ic}from"zod";import{z as br}from"zod";import{z as wt}from"zod";import{z as ke}from"zod";import{z as no}from"zod";import{z as ro}from"zod";import{z as qe}from"zod";import{z as q}from"zod";function ph(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"}function Ra(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("positive integer expected, got "+e)}function dr(e,...t){if(!ph(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 Pa(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 Fi(e,t){dr(e);let n=t.outputLen;if(e.length<n)throw new Error("digestInto() expects output buffer of length at least "+n)}function Vi(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function xa(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}var uh=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function dh(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function fh(e){for(let t=0;t<e.length;t++)e[t]=dh(e[t]);return e}var $a=uh?e=>e:fh;function gh(e){if(typeof e!="string")throw new Error("string expected");return new Uint8Array(new TextEncoder().encode(e))}function Ta(e){return typeof e=="string"&&(e=gh(e)),dr(e),e}var Zr=class{};function Hi(e){let t=r=>e().update(Ta(r)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}var Qr=BigInt(4294967295),zi=BigInt(32);function hh(e,t=!1){return t?{h:Number(e&Qr),l:Number(e>>zi&Qr)}:{h:Number(e>>zi&Qr)|0,l:Number(e&Qr)|0}}function Ki(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}=hh(e[a],t);[r[a],o[a]]=[s,i]}return[r,o]}var qi=(e,t,n)=>e<<n|t>>>32-n,Gi=(e,t,n)=>t<<n|e>>>32-n,Bi=(e,t,n)=>t<<n-32|e>>>64-n,Wi=(e,t,n)=>e<<n-32|t>>>64-n;var yh=BigInt(0),fr=BigInt(1),vh=BigInt(2),bh=BigInt(7),Ch=BigInt(256),wh=BigInt(113),Xi=[],Zi=[],Qi=[];for(let e=0,t=fr,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],Xi.push(2*(5*r+n)),Zi.push((e+1)*(e+2)/2%64);let o=yh;for(let a=0;a<7;a++)t=(t<<fr^(t>>bh)*wh)%Ch,t&vh&&(o^=fr<<(fr<<BigInt(a))-fr);Qi.push(o)}var ec=Ki(Qi,!0),_h=ec[0],Sh=ec[1],Ji=(e,t,n)=>n>32?Bi(e,t,n):qi(e,t,n),Yi=(e,t,n)=>n>32?Wi(e,t,n):Gi(e,t,n);function kh(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,c=(s+2)%10,l=n[c],p=n[c+1],u=Ji(l,p,1)^n[i],f=Yi(l,p,1)^n[i+1];for(let d=0;d<50;d+=10)e[s+d]^=u,e[s+d+1]^=f}let o=e[2],a=e[3];for(let s=0;s<24;s++){let i=Zi[s],c=Ji(o,a,i),l=Yi(o,a,i),p=Xi[s];o=e[p],a=e[p+1],e[p]=c,e[p+1]=l}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]^=_h[r],e[1]^=Sh[r]}xa(n)}var Da=class e extends Zr{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,Ra(r),!(0<t&&t<200))throw new Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=Vi(this.state)}clone(){return this._cloneInto()}keccak(){$a(this.state32),kh(this.state32,this.rounds),$a(this.state32),this.posOut=0,this.pos=0}update(t){Pa(this),t=Ta(t),dr(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){Pa(this,!1),dr(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 Ra(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(Fi(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,xa(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}},Ih=(e,t,n)=>Hi(()=>new Da(t,e,n));var tc=Ih(1,136,256/8);import{secp256k1 as Eh}from"@noble/curves/secp256k1";function Ah(e){if((e.startsWith("0x")||e.startsWith("0X"))&&(e=e.slice(2)),e.length%2!==0||!/^[0-9a-fA-F]*$/.test(e))return null;let t=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)t[n/2]=parseInt(e.substr(n,2),16);return t}function Rh(e){return Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function Ph(...e){let t=e.reduce((o,a)=>o+a.length,0),n=new Uint8Array(t),r=0;for(let o of e)n.set(o,r),r+=o.length;return n}function xh(e,t){try{let n=t.slice(0,64),r=t[64],o=Eh.Signature.fromCompact(n).addRecoveryBit(r).recoverPublicKey(e);return"0x"+Rh(o.toRawBytes(!0))}catch(n){return console.error("signature verification failed:",n),null}}function Ma(e,t,n){if(t.length!==65)return null;let r=Ah(n);if(!r)return null;let o=new TextEncoder().encode("dstack-env-encrypt-pubkey"),a=new TextEncoder().encode(":"),s=Ph(o,a,r,e);return xh(tc(s),t)}var Th=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()});function Dh(e){if(!e||typeof e!="object")return;let t=e.request_id;return typeof t=="string"?t:void 0}function Mh(e){return e?.headers?.get("X-Request-ID")??void 0}function nc(e){if(typeof e!="string")return;let t=e.trim().toUpperCase();return t.length>0?t:void 0}var lt=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,this.requestId=t.requestId,this.request=t.request,this.requestMethod=t.requestMethod,this.data=t.data,this.code=t.code,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},yr=class hr extends lt{constructor(t,n){super(t,{status:n?.status??0,statusText:n?.statusText??"Unknown Error",detail:n?.detail||t,requestId:n?.requestId,request:n?.request,requestMethod:n?.requestMethod,data:n?.data,code:n?.code}),this.name="RequestError",this.isRequestError=!0,this.data=n?.data,this.request=n?.request,this.requestMethod=n?.requestMethod,this.response=n?.response,this.type=n?.type}static fromFetchError(t){let n=Dh(t.data),r=Mh(t.response),o=n??r,a=nc(t.options?.method),s=Th.safeParse(t.data);if(s.success){let c=s.data.detail??(t.data&&typeof t.data=="object"&&"error_code"in t.data?t.data:void 0);return new hr(t.message,{status:t.status??void 0,statusText:t.statusText??void 0,data:t.data,request:t.request??void 0,requestMethod:a,response:t.response??void 0,detail:c,code:s.data.code??void 0,type:s.data.type??void 0,requestId:o})}if(t.cause?.name==="TimeoutError"||t.message?.includes("[TimeoutError]")){let c="Request timed out. The server did not respond in time.";return new hr(c,{status:0,statusText:"Request Timeout",data:t.data,request:t.request??void 0,requestMethod:a,response:t.response??void 0,detail:c,code:"TIMEOUT",requestId:o})}return new hr(t.message,{status:t.status??void 0,statusText:t.statusText??void 0,data:t.data,request:t.request??void 0,requestMethod:a,response:t.response??void 0,detail:t.data?.detail||t.message||"Unknown API error",code:t.status?.toString()??void 0,requestId:o})}static fromError(t,n,r){return new hr(t.message,{request:n??void 0,requestMethod:nc(r),detail:t.message})}},Rc=class extends lt{constructor(e,t){super(e,t),this.isValidationError=!0,this.validationErrors=t.validationErrors}},Uh=class extends lt{constructor(){super(...arguments),this.isAuthError=!0}},ao=class extends lt{constructor(){super(...arguments),this.isBusinessError=!0}},Lh=class extends lt{constructor(){super(...arguments),this.isServerError=!0}},Nh=class extends lt{constructor(){super(...arguments),this.isUnknownError=!0}};function Oh(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 Pc(e){if(!Array.isArray(e))return{errors:[],message:typeof e=="string"?e:"Validation error"};let t=e.map((o,a)=>{let s=Oh(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 jh(e){return e===422?"validation":e===401||e===403?"auth":e>=400&&e<500?"business":e>=500?"server":"unknown"}function Fh(e,t,n){if(e===422&&Array.isArray(t)){let{message:r}=Pc(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 Vh(e){let t=e.status??0,n=e.statusText??"Unknown Error",r=e.detail,o=Kh(r);if(o)return new yt(o.message,{status:t,statusText:n,detail:r,requestId:o.request_id??e.requestId,request:e.request,requestMethod:e.requestMethod,data:e.data,errorCode:o.error_code,structuredDetails:o.details,suggestions:o.suggestions,links:o.links});let a=jh(t),s=Fh(t,r,e.message),i={status:t,statusText:n,detail:r,requestId:e.requestId,request:e.request,requestMethod:e.requestMethod,data:e.data,code:e.code};if(a==="validation"&&Array.isArray(r)){let{errors:c}=Pc(r);return new Rc(s,{...i,validationErrors:c})}return a==="auth"?new Uh(s,i):a==="business"?new ao(s,i):a==="server"?new Lh(s,i):new Nh(s,i)}function Hh(e,t){let{numbered:n=!0,indent:r=2,showFields:o=!0}=t??{},a=" ".repeat(r);return e.map((s,i)=>{let c=n?`${i+1}. `:"\u2022 ",l=o?`${s.field}: `:"";return`${a}${c}${l}${s.message}`}).join(`
8
+ `)}function so(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 Rc&&e.validationErrors.length>0&&(o.push(""),o.push(Hh(e.validationErrors,{showFields:n}))),o.join(`
9
+ `)}function zh(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);try{return JSON.stringify(e)}catch{return String(e)}}var yt=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 Kh(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,request_id:typeof t.request_id=="string"?t.request_id:void 0,details:t.details,suggestions:t.suggestions,links:t.links}:null}function Bt(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.requestId&&a.push(`Request ID: ${e.requestId}`),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}: ${zh(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 mn=["2025-10-28","2026-01-21","2026-05-22","2026-06-23"],qh="2026-06-23",En=(0,Ac.default)("phala::api-client");function Gh(e){return Object.entries(e).map(([t,n])=>` -H "${t}: ${n}"`).join(`
11
+ `)}function Bh(e){return e?` -d '${(typeof e=="string"?e:JSON.stringify(e,null,2)).replace(/'/g,"\\'")}'`:""}function rc(e,t,n,r){let o=[];n.forEach((i,c)=>{o.push(`${c}: ${i}`)});let a=o.join(`
12
12
  `),s=typeof r=="string"?r:JSON.stringify(r,null,2);return[`< HTTP/1.1 ${e} ${t}`,a?`< ${a.replace(/\n/g,`
13
13
  < `)}`:"","",s].filter(Boolean).join(`
14
- `)}var By=class kl{constructor(t={}){this.emitter=cc();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&&bn.includes(t.version)?t.version:Ky;this.config={...t,apiKey:n,baseURL:r,version:o};let{apiKey:a,baseURL:s,timeout:i,headers:l,useCookieAuth:m,onResponseError:p,...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)}),!m&&a&&(f["X-API-Key"]=a),this.fetchInstance=Ty.create({baseURL:s,timeout:i||3e4,headers:f,...m?{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(Hn.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}"`,Gy(w),h.body?qy(h.body):""].filter(Boolean).join(`
15
- `);Hn(`
14
+ `)}var Wh=class xc{constructor(t={}){this.emitter=ji();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&&mn.includes(t.version)?t.version:qh;this.config={...t,apiKey:n,baseURL:r,version:o};let{apiKey:a,baseURL:s,timeout:i,headers:c,useCookieAuth:l,onResponseError:p,...u}=this.config,f={"X-Phala-Version":o,"Content-Type":"application/json"};c&&typeof c=="object"&&Object.entries(c).forEach(([d,h])=>{typeof h=="string"&&(f[d]=h)}),!l&&a&&(f["X-API-Key"]=a),this.fetchInstance=$h.create({baseURL:s,timeout:i||6e4,headers:f,...l?{credentials:"include"}:{},...u,onRequest({request:d,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(En.enabled){let g=h.method||"GET",y=typeof d=="string"?d:d.url,k=y.startsWith("http")?y:`${s}${y}`,_={};h.headers&&typeof h.headers=="object"&&Object.entries(h.headers).forEach(([S,b])=>{typeof b=="string"&&(_[S]=b)});let E=[`> curl -X ${g} "${k}"`,Gh(_),h.body?Bh(h.body):""].filter(Boolean).join(`
15
+ `);En(`
16
16
  === REQUEST ===
17
17
  %s
18
- `,S)}},onResponse({request:u,response:h,options:g}){if(Hn.enabled){let y=g.method||"GET",b=typeof u=="string"?u:u.url;Hn(`
18
+ `,E)}},onResponse({request:d,response:h,options:g}){if(En.enabled){let y=g.method||"GET",k=typeof d=="string"?d:d.url;En(`
19
19
  === RESPONSE [%s %s] (%dms) ===
20
20
  %s
21
- `,y,b,h.headers.get("x-response-time")||"?",Zc(h.status,h.statusText,h.headers,h._data))}},onResponseError:({request:u,response:h,options:g})=>{if(Hn.enabled){console.warn(`HTTP ${h.status}: ${h.url}`);let y=g.method||"GET",b=typeof u=="string"?u:u.url;Hn(`
21
+ `,y,k,h.headers.get("x-response-time")||"?",rc(h.status,h.statusText,h.headers,h._data))}},onResponseError:({request:d,response:h,options:g})=>{if(En.enabled){console.warn(`HTTP ${h.status}: ${h.url}`);let y=g.method||"GET",k=typeof d=="string"?d:d.url;En(`
22
22
  === ERROR RESPONSE [%s %s] ===
23
23
  %s
24
- `,y,b,Zc(h.status,h.statusText,h.headers,h._data))}p&&p({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?cs.fromFetchError(t):t instanceof Error?cs.fromError(t):new cs("Unknown error occurred",{detail:"Unknown error occurred"})}emitError(t){let n=Vy(t);return this.emitter.emit("error",n),n}async safeRequest(t){try{return{success:!0,data:await t()}}catch(n){if(n instanceof vt)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 kl({...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 Wy(e={}){return new By(e)}var Jy=pe.object({username:pe.string(),email:pe.string(),role:pe.enum(["admin","user"]),avatar:pe.string(),email_verified:pe.boolean(),totp_enabled:pe.boolean(),has_backup_codes:pe.boolean(),flag_has_password:pe.boolean()}).passthrough(),Yy=pe.object({id:pe.string(),name:pe.string(),slug:pe.string().nullable(),tier:pe.string(),role:pe.string(),avatar:pe.string().nullable().optional()}).passthrough(),Zy=pe.object({balance:pe.string().or(pe.number()),granted_balance:pe.string().or(pe.number()),is_post_paid:pe.boolean(),outstanding_amount:pe.string().or(pe.number()).nullable()}).passthrough(),Xy=pe.object({user:Jy,workspace:Yy,credits:Zy}).passthrough(),Qy=Qt.object({username:Qt.string(),email:Qt.string(),credits:Qt.number(),granted_credits:Qt.number(),avatar:Qt.string(),team_name:Qt.string(),team_tier:Qt.string()}).passthrough();function ev(e){return e==="2025-10-28"?Qy:Xy}async function Sl(e,t){let n=await e.get("/auth/me");return t?.schema===!1?n:(t?.schema||ev(e.config.version)).parse(n)}async function je(e,t){try{return{success:!0,data:await Sl(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 xo={[el.id]:el,[Qc.id]:Qc,[Xc.id]:Xc},tv=en.object({id:en.string(),slug:en.string().nullable(),url:en.string(),version:en.string(),chain_id:en.number().nullable(),kms_contract_address:en.string().nullable().transform(e=>e),gateway_app_id:en.string().nullable().transform(e=>e)}).passthrough(),bt=tv.transform(e=>{if(e.chain_id!=null){let t=xo[e.chain_id];if(t)return{...e,chain:t}}return e});function El(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 Il(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 hs(e,t){function n(s,i){return r(s,i)}async function r(s,i){El(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=Il(i);if(l)return l;let m=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 m.success?i?.schema===!1?{success:!0,data:m.data}:(i?.schema||e).safeParse(m.data):m}return{action:n,safeAction:o}}function x(e,t){function n(s,...i){let[l,m]=i;return r(s,l,m)}async function r(s,i,l){El(l);let m=await t(s,i);return l?.schema===!1?m:(l?.schema||e).parse(m)}function o(s,...i){let[l,m]=i;return a(s,l,m)}async function a(s,i,l){let m=Il(l);if(m)return m;let p=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 p.success?l?.schema===!1?{success:!0,data:p.data}:(l?.schema||e).safeParse(p.data):p}return{action:n,safeAction:o}}var nv=q.object({name:q.string(),is_dev:q.boolean(),version:q.union([q.tuple([q.number(),q.number(),q.number()]),q.tuple([q.number(),q.number(),q.number(),q.number()])]),os_image_hash:q.string().nullable().optional()}).passthrough(),Al=q.object({teepod_id:q.number(),name:q.string(),listed:q.boolean(),resource_score:q.number(),remaining_vcpu:q.number(),remaining_memory:q.number(),remaining_cvm_slots:q.number(),images:q.array(nv),support_onchain_kms:q.boolean().optional(),fmspc:q.string().nullable().optional(),device_id:q.string().nullable().optional(),region_identifier:q.string().nullable().optional(),default_kms:q.string().nullable().optional(),kms_list:q.array(q.string()).default([])}).passthrough(),Pl=q.object({max_instances:q.number().nullable().optional(),max_vcpu:q.number().nullable().optional(),max_memory:q.number().nullable().optional(),max_disk:q.number().nullable().optional()}).passthrough(),rv=q.object({tier:q.string(),capacity:Pl,nodes:q.array(Al),kms_list:q.array(bt)}).passthrough(),{action:ov,safeAction:Ot}=hs(rv,async e=>await e.get("/teepods/available")),Qn=O.union([O.number(),O.string()]),av=O.object({has_reserved_gpus:O.boolean(),reserved_gpu_count:O.number(),has_public_gpus:O.boolean(),public_gpu_count:O.number()}).passthrough(),sv=O.object({id:Qn,slug:O.string().nullable().optional(),url:O.string(),version:O.string().nullable().optional(),kms_type:O.string(),chain_id:O.number().nullable().optional(),kms_contract_id:Qn.nullable().optional(),kms_contract_address:O.string().nullable().optional(),gateway_app_id:O.string().nullable().optional(),supported_os_images:O.array(O.string()).default([])}).passthrough(),iv=O.object({teepod_id:O.number(),kms_id:Qn,kms_type:O.string(),kms_contract_id:Qn.nullable().optional(),kms_contract_address:O.string().nullable().optional(),supported_os_images:O.array(O.string()).default([])}).passthrough(),cv=O.object({id:Qn,teepod_id:O.number().nullable().optional(),kms_contract_id:Qn,rpc_url:O.string().nullable().optional(),domain_suffix:O.string().nullable().optional(),enabled:O.boolean()}).passthrough(),lv=O.object({id:O.string(),name:O.string(),vcpu:O.number(),memory_mb:O.number(),default_disk_size_gb:O.number(),requires_gpu:O.boolean(),requires_gpu_count:O.number(),family:O.string().nullable().optional(),display_order:O.number().nullable().optional()}).passthrough(),mv=O.object({tier:O.string(),capacity:Pl,nodes:O.array(Al),kms_nodes:O.array(sv),node_kms_relations:O.array(iv),gateway_nodes:O.array(cv),instance_types:O.array(lv),gpu_availability:av}).passthrough(),{action:pv,safeAction:dv}=hs(mv,async e=>await e.get("/teepods/cvm-create-resources")),$l=be.object({id:be.string(),name:be.string(),description:be.string(),vcpu:be.number(),memory_mb:be.number(),hourly_rate:be.string(),requires_gpu:be.boolean(),default_disk_size_gb:be.number().default(20),family:be.string().nullable()}).passthrough(),uv=be.object({name:be.string(),items:be.array($l),total:be.number()}).strict(),fv=be.object({result:be.array(uv)}).strict(),gv=be.object({items:be.array($l),total:be.number(),family:be.string()}).strict(),hv=be.object({family:be.string()}).strict(),{action:ys,safeAction:yv}=x(fv,async e=>await e.get("/instance-types")),{action:vs,safeAction:vv}=x(gv,async(e,t)=>{let n=hv.parse(t);return await e.get(`/instance-types/${n.family}`)}),Rl=Ne.object({id:Ne.string(),name:Ne.string(),slug:Ne.string().nullable(),avatar_url:Ne.string().nullable().optional(),tier:Ne.string(),role:Ne.string(),is_default:Ne.boolean(),created_at:Ne.string(),confidential_models_enabled:Ne.boolean().optional()}).passthrough(),Cv=Ne.object({has_more:Ne.boolean(),next_cursor:Ne.string().nullable(),total:Ne.number().nullable()}).passthrough(),bv=Ne.object({data:Ne.array(Rl),pagination:Cv}).passthrough(),{action:wv,safeAction:_v}=x(bv,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:kv,safeAction:Sv}=x(Rl,async(e,t)=>await e.get(`/workspaces/${t}`)),Ev=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()}),Iv=A.object({id:A.number(),username:A.string()}),xl=A.object({id:A.number(),name:A.string(),region_identifier:A.string().nullable().optional()}),Cs=A.object({vcpu:A.number(),memory:A.number(),disk_size:A.number(),gpu_count:A.number().default(0)}),bs=A.object({app:A.string(),instance:A.string()}),Dl=A.object({hosted:Ev,name:A.string(),managed_user:Iv.nullable(),node:xl.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:bt.nullable(),vcpu:A.number().nullable(),memory:A.number().nullable(),disk_size:A.number().nullable(),gateway_domain:A.string().nullable(),public_urls:A.array(bs),machine_info:Cs.nullable().optional(),updated_at:A.string().nullable().optional()}),Tl=A.object({id:A.number(),name:A.string(),status:A.string(),in_progress:A.boolean().optional().default(!1),teepod_id:A.number().nullable(),teepod:xl.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:bt.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(bs).optional().default([]),gateway_domain:A.string().optional().nullable(),machine_info:Cs.optional().nullable(),updated_at:A.string().optional().nullable()}),Av=A.object({items:A.array(Dl),total:A.number(),page:A.number(),page_size:A.number(),pages:A.number()}),Pv=P.enum(["skip","hourly","monthly"]),$v=P.enum(["phala","ethereum","base","legacy"]),ws=P.object({object_type:P.literal("user"),id:P.string().nullable().optional(),username:P.string().nullable().optional(),avatar_url:P.string().nullable().optional()}),_s=P.object({object_type:P.literal("workspace"),id:P.string(),name:P.string(),slug:P.string().nullable().optional(),avatar_url:P.string().nullable().optional()}),Rv=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:Pv.nullable().optional()}),xv=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()}),Dv=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()}),Tv=Dv.transform(e=>{if(e.chain_id!=null){let t=xo[e.chain_id];if(t)return{...e,chain:t}}return e}),Mv=P.object({target:P.string().nullable().optional(),started_at:P.string().nullable().optional(),correlation_id:P.string().nullable().optional()}),Lv=P.object({base_domain:P.string().nullable().optional(),cname:P.string().nullable().optional()}),Ml=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 Lr=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:Rv,node_info:Ml.nullable().optional(),os:xv.nullable().optional(),kms_type:$v.nullable().optional(),kms_info:Tv.nullable().optional(),status:P.string(),progress:Mv.nullable().optional(),compose_hash:P.string().nullable().optional(),gateway:Lv,services:P.array(P.record(P.any())).optional().default([]),endpoints:P.array(bs).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:_s.nullable().optional(),creator:ws.nullable().optional()}),Uv=Lr.extend({compose_file:P.union([P.record(P.any()),P.string()]).nullable().optional()}),Ov=P.object({items:P.array(Lr),total:P.number(),page:P.number(),page_size:P.number(),pages:P.number()});function er(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 Ll(e){if(typeof e!="string")return ko();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)||!er(t)?ko():t}function ko(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,6);return`dstack-app-${e}-${t}`}var Ge=zn.object({id:zn.string().optional(),uuid:zn.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:zn.string().optional(),instance_id:zn.string().optional(),name:zn.string().refine(er,{message:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens"}).optional()}),rt=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"}),Nv=rt(Ge),z=Nv.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}}),jv=z;function Fv(e){return e==="2025-10-28"?Tl:Uv}async function Ul(e,t){let{cvmId:n}=jv.parse(t),r=await e.get(`/cvms/${n}`);return Fv(e.config.version).parse(r)}async function W(e,t){try{return{success:!0,data:await Ul(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 Vv=Kn.object({page:Kn.number().int().min(1).optional(),page_size:Kn.number().int().min(1).optional(),node_id:Kn.number().int().min(1).optional(),teepod_id:Kn.number().int().min(1).optional(),user_id:Kn.string().optional()}).strict();function Hv(e){return e==="2025-10-28"?Av:Ov}async function Ol(e,t){let n=Vv.parse(t??{}),r=await e.get("/cvms/paginated",{params:n});return Hv(e.config.version).parse(r)}async function Or(e,t){try{return{success:!0,data:await Ol(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 Ur=200*1024;function Nl(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>Ur){let i=Ur/1024,l=Math.ceil(s/1024);n.addIssue({code:$e.ZodIssueCode.custom,message:`Combined size of docker_compose_file and pre_launch_script must not exceed ${i}KB (current: ${l}KB)`})}}var jl=$e.object({allowed_envs:$e.array($e.string()).optional(),docker_compose_file:$e.string(),features:$e.array($e.string()).optional(),name:$e.string().optional(),manifest_version:$e.number().optional(),kms_enabled:$e.boolean().optional(),public_logs:$e.boolean().optional(),public_sysinfo:$e.boolean().optional(),tproxy_enabled:$e.boolean().optional(),storage_fs:$e.enum(["ext4","zfs"]).optional(),pre_launch_script:$e.string().optional(),env_pubkey:$e.string().optional(),salt:$e.string().optional().nullable()}).passthrough().superRefine((e,t)=>{Nl(e.docker_compose_file,e.pre_launch_script,t)}),zv=L.object({app_id:L.string().nullable().optional(),app_env_encrypt_pubkey:L.string().nullable().optional(),compose_hash:L.string(),kms_info:bt.nullable().optional(),fmspc:L.string().nullable().optional(),device_id:L.string().nullable().optional(),os_image_hash:L.string().nullable().optional(),instance_type:L.string().nullable().optional(),teepod_id:L.number().nullable().optional(),node_id:L.number().nullable().optional(),kms_id:L.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}),ls="Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens",Kv=L.object({node_id:L.number().optional(),teepod_id:L.number().optional(),region:L.string().optional(),name:L.string().min(5,ls).max(63,ls).refine(e=>er(e),ls),instance_type:L.string().optional(),image:L.string().optional(),vcpu:L.number().optional(),memory:L.number().optional(),disk_size:L.number().optional(),compose_file:L.object({allowed_envs:L.array(L.string()).optional(),pre_launch_script:L.string().optional(),docker_compose_file:L.string().optional(),name:L.string().optional().default(""),kms_enabled:L.boolean().optional(),public_logs:L.boolean().optional(),public_sysinfo:L.boolean().optional(),gateway_enabled:L.boolean().optional(),tproxy_enabled:L.boolean().optional(),storage_fs:L.enum(["ext4","zfs"]).optional()}).passthrough().superRefine((e,t)=>{Nl(e.docker_compose_file,e.pre_launch_script,t)}),listed:L.boolean().optional(),kms_id:L.string().optional(),kms:L.enum(["PHALA","ETHEREUM","BASE"]).optional(),kms_contract:L.string().optional(),kms_contract_id:L.union([L.string(),L.number()]).optional(),key_provider_mode:L.enum(["kms","local"]).optional(),skip_gateway:L.boolean().optional(),env_keys:L.array(L.string()).optional(),nonce:L.number().optional(),app_id:L.string().optional()}).passthrough().transform(e=>!e.instance_type&&!e.vcpu&&!e.memory?{...e,instance_type:"tdx.small"}:e);function Gv(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:qv,safeAction:ks}=x(zv,async(e,t)=>{let n=Kv.parse(t),r=Gv(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)}),Bv=J.object({id:J.number(),name:J.string(),status:J.string(),teepod_id:J.number(),teepod:J.object({id:J.number(),name:J.string()}).nullable(),user_id:J.number().nullable(),app_id:J.string().nullable(),vm_uuid:J.string().nullable(),instance_id:J.string().nullable(),app_url:J.string().nullable().default(null),base_image:J.string().nullable(),vcpu:J.number(),memory:J.number(),disk_size:J.number(),manifest_version:J.number().nullable().default(2),version:J.string().nullable().default("1.0.0"),runner:J.string().nullable().default("docker-compose"),docker_compose_file:J.string().nullable(),features:J.array(J.string()).nullable().default(["kms","tproxy-net"]),created_at:J.string(),encrypted_env_pubkey:J.string().nullable().optional(),app_auth_contract_address:J.string().nullable().optional(),deployer_address:J.string().nullable().optional()}).passthrough(),VP=J.object({encrypted_env:J.string().optional().nullable(),app_id:J.string(),compose_hash:J.string(),kms_id:J.string().optional(),contract_address:J.string().optional(),deployer_address:J.string().optional(),env_keys:J.array(J.string()).optional().nullable()}).passthrough(),{action:Wv,safeAction:Do}=x(Bv,async(e,t)=>await e.post("/cvms",t));function fs(e){return e==null?e:Array.isArray(e)?e.map(fs):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return t[n]=fs(r),t},{}):e}function Fl(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 Vl(e){let t=fs(e),n=JSON.stringify(t,null,4);return n=n.replace(/": /g,'":'),n}function Yv(e){let t=Fl(e),n=Vl(t);return Jv.createHash("sha256").update(n,"utf8").digest("hex")}function Zv(e){let t=e;return{...e,getHash:()=>Yv(t),toString:()=>Vl(Fl(t))}}var Xv=jl.transform(e=>Zv(e)),Qv=z,{action:eC,safeAction:tC}=x(Xv,async(e,t)=>{let{cvmId:n}=Qv.parse(t);return await e.get(`/cvms/${n}/compose_file`)}),nC=gt.object({id:gt.string().optional(),uuid:gt.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:gt.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:gt.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:jl,update_env_vars:gt.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})),rC=gt.object({app_id:gt.string().nullable(),device_id:gt.string().nullable(),compose_hash:gt.string(),kms_info:bt.nullable().optional(),compose_hash_registered:gt.boolean().optional().default(!1)}).passthrough(),{action:oC,safeAction:aC}=x(rC,async(e,t)=>{let n=nC.parse(t);return await e.post(`/cvms/${n.cvmId}/compose_file/provision`,n.request)}),sC=ut.object({id:ut.string().optional(),uuid:ut.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:ut.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:ut.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:ut.string().min(1,"Compose hash is required"),encrypted_env:ut.string().optional(),env_keys:ut.array(ut.string()).optional(),update_env_vars:ut.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})),iC=ut.any().transform(()=>{}),{action:cC,safeAction:lC}=x(iC,async(e,t)=>{let n=sC.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})}),mC=rt(Ge.extend({encrypted_env:De.string().describe("Encrypted environment variables (hex string)"),env_keys:De.array(De.string()).optional().describe("List of allowed environment variable keys"),compose_hash:De.string().optional().describe("Compose hash for verification (Phase 2, required when env_keys changes)"),transaction_hash:De.string().optional().describe("On-chain transaction hash for verification (Phase 2, required when env_keys changes)")})).transform(e=>{let{cvmId:t}=z.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}}),pC=De.object({status:De.literal("in_progress"),message:De.string(),correlation_id:De.string(),allowed_envs_changed:De.boolean()}),dC=De.object({status:De.literal("precondition_required"),message:De.string(),compose_hash:De.string(),app_id:De.string(),device_id:De.string(),kms_info:bt}),uC=De.union([pC,dC]),{action:fC,safeAction:To}=x(uC,async(e,t)=>{let n=mC.parse(t);try{return await e.patch(`/cvms/${n.cvmId}/envs`,n.request)}catch(r){if(r instanceof vt&&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"),m=i.get("app_id"),p=i.get("device_id"),d=i.get("kms_info");if(l&&m)return{status:"precondition_required",message:a.message||"Compose hash verification required",compose_hash:l,app_id:m,device_id:p||"",kms_info:d}}}}throw r}}),gC=rt(Ge.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}=z.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}}),hC=Ze.object({status:Ze.literal("in_progress"),message:Ze.string(),correlation_id:Ze.string()}),yC=Ze.object({status:Ze.literal("precondition_required"),message:Ze.string(),compose_hash:Ze.string(),app_id:Ze.string(),device_id:Ze.string(),kms_info:bt}),vC=Ze.union([hC,yC]),{action:CC,safeAction:bC}=x(vC,async(e,t)=>{let n=gC.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 vt&&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])),m=l.get("compose_hash"),p=l.get("app_id"),d=l.get("device_id"),f=l.get("kms_info");if(m&&p)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:m,app_id:p,device_id:d||"",kms_info:f}}}}throw o}}),wC=rt(Ge.extend({pre_launch_script:Xe.string().describe("Pre-launch script content (shell script)"),compose_hash:Xe.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:Xe.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=z.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}}),_C=Xe.object({status:Xe.literal("in_progress"),message:Xe.string(),correlation_id:Xe.string()}),kC=Xe.object({status:Xe.literal("precondition_required"),message:Xe.string(),compose_hash:Xe.string(),app_id:Xe.string(),device_id:Xe.string(),kms_info:bt}),SC=Xe.union([_C,kC]),{action:EC,safeAction:IC}=x(SC,async(e,t)=>{let n=wC.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 vt&&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])),m=l.get("compose_hash"),p=l.get("app_id"),d=l.get("device_id"),f=l.get("kms_info");if(m&&p)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:m,app_id:p,device_id:d||"",kms_info:f}}}}throw o}}),PC=z,{action:$C,safeAction:RC}=x(AC.string(),async(e,t)=>{let{cvmId:n}=PC.parse(t);return await e.get(`/cvms/${n}/pre-launch-script`)}),xC=tl.object({kms_id:tl.string().min(1,"KMS ID is required")}),{action:DC,safeAction:TC}=x(bt,async(e,t)=>{let n=xC.parse(t);return await e.get(`/kms/${n.kms_id}`)}),MC=$t.object({page:$t.number().int().min(1).optional(),page_size:$t.number().int().min(1).optional(),is_onchain:$t.boolean().optional()}).strict(),LC=$t.object({items:$t.array(bt),total:$t.number(),page:$t.number(),page_size:$t.number(),pages:$t.number()}).strict(),{action:UC,safeAction:Ss}=x(LC,async(e,t)=>{let n=MC.parse(t??{});return await e.get("/kms",{params:n})}),OC=Zn.object({kms:Zn.string().min(1,"KMS ID or slug is required"),app_id:Zn.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(),NC=Zn.object({public_key:Zn.string(),signature:Zn.string()}).strict(),{action:jC,safeAction:tr}=x(NC,async(e,t)=>{let n=OC.parse(t);return await e.get(`/kms/${n.kms}/pubkey/${n.app_id}`)}),FC=Cn.object({counts:Cn.number().int().min(1).max(20).optional().default(1)}).strict(),VC=Cn.object({app_ids:Cn.array(Cn.object({app_id:Cn.string(),nonce:Cn.number().int().min(0)}))}).strict(),{action:HC,safeAction:zC}=x(VC,async(e,t)=>{let n=FC.parse(t??{}),r=new URLSearchParams;return r.append("counts",n.counts.toString()),await e.get(`/kms/phala/next_app_id?${r.toString()}`)}),nr=ce.object({id:ce.number(),name:ce.string(),status:ce.string(),teepod_id:ce.number(),teepod:ce.object({id:ce.number(),name:ce.string(),region_identifier:ce.string().nullable().optional()}).optional().nullable(),user_id:ce.number().optional().nullable(),app_id:ce.string(),vm_uuid:ce.string().nullable(),instance_id:ce.string().nullable(),app_url:ce.string().optional().nullable(),base_image:ce.string().optional().nullable(),vcpu:ce.number(),memory:ce.number(),disk_size:ce.number(),manifest_version:ce.number().optional().nullable(),version:ce.string().optional().nullable(),runner:ce.string().optional().nullable(),docker_compose_file:ce.string().optional().nullable(),features:ce.array(ce.string()).optional().nullable(),created_at:ce.string(),encrypted_env_pubkey:ce.string().nullable()}),KC=z,{action:GC,safeAction:Es}=x(nr,async(e,t)=>{let{cvmId:n}=KC.parse(t);return await e.post(`/cvms/${n}/start`)}),qC=z,{action:BC,safeAction:Is}=x(nr,async(e,t)=>{let{cvmId:n}=qC.parse(t);return await e.post(`/cvms/${n}/stop`)}),WC=z,{action:JC,safeAction:YC}=x(nr,async(e,t)=>{let{cvmId:n}=WC.parse(t);return await e.post(`/cvms/${n}/shutdown`)}),XC=rt(Ge.extend({force:ZC.boolean().optional()})),{action:QC,safeAction:As}=x(nr,async(e,t)=>{let n=XC.parse(t),{cvmId:r}=z.parse(n),{force:o=!1}=n;return await e.post(`/cvms/${r}/restart`,{force:o})}),tb=z,{action:nb,safeAction:Nr}=x(eb.void(),async(e,t)=>{let{cvmId:n}=tb.parse(t);await e.delete(`/cvms/${n}`)}),rb=re.object({name:re.string(),mount_point:re.string(),total_size:re.number(),free_size:re.number()}),ob=re.object({os_name:re.string(),os_version:re.string(),kernel_version:re.string(),cpu_model:re.string(),num_cpus:re.number(),total_memory:re.number(),available_memory:re.number(),used_memory:re.number(),free_memory:re.number(),total_swap:re.number(),used_swap:re.number(),free_swap:re.number(),uptime:re.number(),loadavg_one:re.number(),loadavg_five:re.number(),loadavg_fifteen:re.number(),disks:re.array(rb)}),ab=re.object({is_online:re.boolean(),is_public:re.boolean().default(!1),error:re.string().nullable(),sysinfo:ob.nullable(),status:re.string().nullable(),in_progress:re.boolean().default(!1),boot_progress:re.string().nullable(),boot_error:re.string().nullable()}),sb=z,{action:ib,safeAction:cb}=x(ab,async(e,t)=>{let{cvmId:n}=sb.parse(t);return await e.get(`/cvms/${n}/stats`)}),lb=At.object({app:At.string(),instance:At.string()}),mb=At.object({is_online:At.boolean(),is_public:At.boolean().default(!0),error:At.string().nullable(),internal_ip:At.string().nullable(),latest_handshake:At.string().nullable(),public_urls:At.array(lb).nullable()}),pb=z,{action:db,safeAction:ub}=x(mb,async(e,t)=>{let{cvmId:n}=pb.parse(t);return await e.get(`/cvms/${n}/network`)}),gb=z,{action:hb,safeAction:yb}=x(fb.string(),async(e,t)=>{let{cvmId:n}=gb.parse(t);return await e.get(`/cvms/${n}/docker-compose.yml`)}),vb=Ce.object({id:Ce.string(),names:Ce.array(Ce.string()),image:Ce.string(),image_id:Ce.string(),command:Ce.string().nullable().optional(),created:Ce.number(),state:Ce.string(),status:Ce.string(),log_endpoint:Ce.string().nullable()}),Cb=Ce.object({is_online:Ce.boolean(),is_public:Ce.boolean().default(!0),error:Ce.string().nullable(),docker_compose_file:Ce.string().nullable(),manifest_version:Ce.number().nullable(),version:Ce.string().nullable(),runner:Ce.string().nullable(),features:Ce.array(Ce.string()).nullable(),containers:Ce.array(vb).nullable()}),bb=z,{action:wb,safeAction:Ps}=x(Cb,async(e,t)=>{let{cvmId:n}=bb.parse(t);return await e.get(`/cvms/${n}/composition`)}),_b=U.object({common_name:U.string().nullable(),organization:U.string().nullable(),country:U.string().nullable(),state:U.string().nullable(),locality:U.string().nullable()}),kb=U.object({common_name:U.string().nullable(),organization:U.string().nullable(),country:U.string().nullable()}),Hl=U.object({subject:_b,issuer:kb,serial_number:U.string(),not_before:U.string(),not_after:U.string(),version:U.string(),fingerprint:U.string(),signature_algorithm:U.string(),sans:U.array(U.string()).nullable(),is_ca:U.boolean(),position_in_chain:U.number().nullable(),quote:U.string().nullable(),app_id:U.string().nullable().optional(),cert_usage:U.string().nullable().optional()}),Sb=U.object({imr:U.number(),event_type:U.number(),digest:U.string(),event:U.string(),event_payload:U.string()}),zl=U.object({mrtd:U.string(),rootfs_hash:U.string().nullable().optional(),rtmr0:U.string(),rtmr1:U.string(),rtmr2:U.string(),rtmr3:U.string(),event_log:U.array(Sb),app_compose:U.string()}),Eb=U.object({name:U.string().nullable(),is_online:U.boolean(),is_public:U.boolean().default(!0),error:U.string().nullable(),app_certificates:U.array(Hl).nullable(),tcb_info:zl.nullable(),compose_file:U.string().nullable()}),Ib=z,{action:Ab,safeAction:Pb}=x(Eb,async(e,t)=>{let{cvmId:n}=Ib.parse(t);return await e.get(`/cvms/${n}/attestation`)}),$b=rt(Ge.extend({vcpu:Jn.number().optional(),memory:Jn.number().optional(),disk_size:Jn.number().optional(),instance_type:Jn.string().optional(),allow_restart:Jn.boolean().optional()})),{action:Rb,safeAction:xb}=x(Jn.void(),async(e,t)=>{let n=$b.parse(t),{cvmId:r}=z.parse(n),{...o}=n;await e.patch(`/cvms/${r}/resources`,o)}),Db=rt(Ge.extend({public_sysinfo:ms.boolean(),public_logs:ms.boolean(),public_tcbinfo:ms.boolean().optional()})),{action:Tb,safeAction:Mb}=x(Tl,async(e,t)=>{let n=Db.parse(t),{cvmId:r}=z.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})}),nl=Oe.object({name:Oe.string(),os_image_hash:Oe.string().nullable(),is_current:Oe.boolean()}),Lb=Oe.object({version:Oe.union([Oe.tuple([Oe.number(),Oe.number(),Oe.number(),Oe.number()]),Oe.tuple([Oe.number(),Oe.number(),Oe.number()])]),prod:nl.nullable(),dev:nl.nullable()}),Ub=Oe.array(Lb),Ob=z,{action:Nb,safeAction:jb}=x(Ub,async(e,t)=>{let{cvmId:n}=Ob.parse(t);return await e.get(`/cvms/${n}/available-os-images`)}),Fb=rt(Ge.extend({os_image_name:Kl.string().min(1,"OS image name is required")})),{action:Vb,safeAction:Hb}=x(Kl.void(),async(e,t)=>{let n=Fb.parse(t),{cvmId:r}=z.parse(n),{os_image_name:o}=n;await e.patch(`/cvms/${r}/os-image`,{os_image_name:o})}),zb=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()}),Kb=z,{action:Gb,safeAction:qb}=x(zb,async(e,t)=>{let{cvmId:n}=Kb.parse(t);return await e.get(`/cvms/${n}/state`)}),Gl=Ye.object({id:Ye.string(),user_id:Ye.string(),name:Ye.string(),public_key:Ye.string(),fingerprint:Ye.string(),key_type:Ye.string(),source:Ye.string(),key_metadata:Ye.record(Ye.unknown()).nullable().optional(),last_synced_at:Ye.string().nullable().optional(),created_at:Ye.string(),updated_at:Ye.string()}),Bb=Ye.array(Gl);async function ql(e){let t=await e.get("/user/ssh-keys");return Bb.parse(t)}async function jr(e){try{return{success:!0,data:await ql(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 Wb=tn.object({github_username:tn.string().min(1)}),Jb=tn.object({github_username:tn.string(),keys_added:tn.number().int(),keys_skipped:tn.number().int(),errors:tn.array(tn.string()).default([])}),{action:Yb,safeAction:$s}=x(Jb,async(e,t)=>{let{github_username:n}=Wb.parse(t);return await e.post("/user/ssh-keys/github-profile",{github_username:n})}),Zb=ps.object({name:ps.string().min(1),public_key:ps.string().min(1)}),{action:Xb,safeAction:Rs}=x(Gl,async(e,t)=>{let{name:n,public_key:r}=Zb.parse(t);return await e.post("/user/ssh-keys",{name:n,public_key:r})}),Qb=gs.object({keyId:gs.string().min(1)}),{action:ew,safeAction:xs}=x(gs.void(),async(e,t)=>{let{keyId:n}=Qb.parse(t);await e.delete(`/user/ssh-keys/${n}`)}),tw=vn.object({synced_count:vn.number().int(),keys_added:vn.number().int(),keys_updated:vn.number().int(),keys_removed:vn.number().int(),errors:vn.array(vn.string()).default([])}),{action:nw,safeAction:rw}=hs(tw,async e=>await e.post("/user/ssh-keys/github-sync",{})),ow=xe.object({name:xe.string(),slug:xe.string(),version:xe.string(),os_image_hash:xe.string().nullable(),is_dev:xe.boolean(),requires_gpu:xe.boolean()}).passthrough(),aw=xe.object({page:xe.number().int().min(1).optional(),page_size:xe.number().int().min(1).optional(),is_dev:xe.boolean().optional()}).strict(),sw=xe.object({items:xe.array(ow),total:xe.number(),page:xe.number(),page_size:xe.number(),pages:xe.number()}).passthrough(),{action:iw,safeAction:Ds}=x(sw,async(e,t)=>{let n=aw.parse(t??{});return await e.get("/os-images",{params:n})}),cw=we.object({device_id:we.string(),node_name:we.string().nullable().optional(),on_chain_allowed:we.boolean().nullable()}).passthrough(),lw=we.object({name:we.string(),version:we.string(),os_image_hash:we.string().nullable(),on_chain_allowed:we.boolean().nullable()}).passthrough(),mw=we.object({contract_address:we.string(),chain_id:we.number(),chain_name:we.string(),devices:we.array(cw),os_images:we.array(lw)}).passthrough(),pw=we.object({chain_name:we.string(),chain_id:we.number(),contracts:we.array(mw)}).passthrough(),dw=we.object({chain:we.string()}).strict(),{action:uw,safeAction:Ts}=x(pw,async(e,t)=>{let{chain:n}=dw.parse(t);return await e.get(`/kms/on-chain/${n}`)});function ot(e={}){let t=Wy(e),n={getCurrentUser:Sl,safeGetCurrentUser:je,getAvailableNodes:ov,safeGetAvailableNodes:Ot,getCvmCreateResources:pv,safeGetCvmCreateResources:dv,listAllInstanceTypeFamilies:ys,safeListAllInstanceTypeFamilies:yv,listFamilyInstanceTypes:vs,safeListFamilyInstanceTypes:vv,listWorkspaces:wv,safeListWorkspaces:_v,getWorkspace:kv,safeGetWorkspace:Sv,getCvmInfo:Ul,safeGetCvmInfo:W,getCvmList:Ol,safeGetCvmList:Or,provisionCvm:qv,safeProvisionCvm:ks,commitCvmProvision:Wv,safeCommitCvmProvision:Do,getCvmComposeFile:eC,safeGetCvmComposeFile:tC,provisionCvmComposeFileUpdate:oC,safeProvisionCvmComposeFileUpdate:aC,commitCvmComposeFileUpdate:cC,safeCommitCvmComposeFileUpdate:lC,updateCvmEnvs:fC,safeUpdateCvmEnvs:To,updateDockerCompose:CC,safeUpdateDockerCompose:bC,updatePreLaunchScript:EC,safeUpdatePreLaunchScript:IC,getCvmPreLaunchScript:$C,safeGetCvmPreLaunchScript:RC,startCvm:GC,safeStartCvm:Es,stopCvm:BC,safeStopCvm:Is,shutdownCvm:JC,safeShutdownCvm:YC,restartCvm:QC,safeRestartCvm:As,deleteCvm:nb,safeDeleteCvm:Nr,getCvmStats:ib,safeGetCvmStats:cb,getCvmNetwork:db,safeGetCvmNetwork:ub,getCvmDockerCompose:hb,safeGetCvmDockerCompose:yb,getCvmContainersStats:wb,safeGetCvmContainersStats:Ps,getCvmAttestation:Ab,safeGetCvmAttestation:Pb,updateCvmResources:Rb,safeUpdateCvmResources:xb,updateCvmVisibility:Tb,safeUpdateCvmVisibility:Mb,getAvailableOsImages:Nb,safeGetAvailableOsImages:jb,updateOsImage:Vb,safeUpdateOsImage:Hb,getKmsInfo:DC,safeGetKmsInfo:TC,getKmsList:UC,safeGetKmsList:Ss,getAppEnvEncryptPubKey:jC,safeGetAppEnvEncryptPubKey:tr,nextAppIds:HC,safeNextAppIds:zC,getCvmState:Gb,safeGetCvmState:qb,listSshKeys:ql,safeListSshKeys:jr,importGithubProfileSshKeys:Yb,safeImportGithubProfileSshKeys:$s,createSshKey:Xb,safeCreateSshKey:Rs,deleteSshKey:ew,safeDeleteSshKey:xs,syncGithubSshKeys:nw,safeSyncGithubSshKeys:rw,getOsImages:iw,safeGetOsImages:Ds,getKmsOnChainDetail:uw,safeGetKmsOnChainDetail:Ts};return t.extend(n)}var rl=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:Cs.nullable().optional(),updated_at:R.string().nullable().optional()}),fw=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()}),gw=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:fw.nullable().optional(),current_cvm:rl.nullable().optional(),cvms:R.array(rl).default([]),cvm_count:R.number().int().default(0)}),hw=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()}),Bl=R.union([gw,hw]),yw=R.object({dstack_apps:R.array(Bl),page:R.number().int(),page_size:R.number().int(),total:R.number().int(),total_pages:R.number().int()}),vw=ee.object({id:ee.string(),name:ee.string(),app_id:ee.string(),app_provision_type:ee.string().nullable().optional(),app_icon_url:ee.string().nullable().optional(),created_at:ee.string(),kms_type:ee.string(),profile:ee.object({display_name:ee.string().nullable().optional(),avatar_url:ee.string().nullable().optional(),description:ee.string().nullable().optional(),custom_domain:ee.string().nullable().optional()}).nullable().optional(),current_cvm:Lr.nullable().optional(),cvms:ee.array(Lr).default([]),cvm_count:ee.number().int().default(0)}),Cw=ee.object({id:ee.null().optional(),app_id:ee.string(),name:ee.null().optional(),app_provision_type:ee.null().optional(),app_icon_url:ee.null().optional(),created_at:ee.null().optional(),kms_type:ee.null().optional(),current_cvm:ee.null().optional(),cvms:ee.null().optional(),cvm_count:ee.null().optional()}),Wl=ee.union([vw,Cw]),bw=ee.object({dstack_apps:ee.array(Wl),page:ee.number().int(),page_size:ee.number().int(),total:ee.number().int(),total_pages:ee.number().int()}),Jl=Z.object({object_type:Z.literal("cvm"),id:Z.string().nullable().optional(),name:Z.string().nullable().optional(),app_id:Z.string().nullable().optional(),vm_uuid:Z.string().nullable().optional()}),ww=Z.object({revision_id:Z.string(),app_id:Z.string(),vm_uuid:Z.string(),compose_hash:Z.string(),created_at:Z.string(),trace_id:Z.string().nullable().optional(),operation_type:Z.string(),triggered_by:ws.nullable().optional(),cvm:Jl.nullable().optional(),workspace:_s.nullable().optional()}),_$=Z.object({revision_id:Z.string(),app_id:Z.string(),vm_uuid:Z.string(),compose_hash:Z.string(),compose_file:Z.union([Z.record(Z.any()),Z.string()]).nullable().optional(),encrypted_env:Z.string(),user_config:Z.string(),created_at:Z.string(),trace_id:Z.string().nullable().optional(),operation_type:Z.string(),triggered_by:ws.nullable().optional(),cvm:Jl.nullable().optional(),workspace:_s.nullable().optional()}),k$=Z.object({revisions:Z.array(ww),total:Z.number().int(),page:Z.number().int(),page_size:Z.number().int(),total_pages:Z.number().int()});function yt(e){if(typeof e=="string"){if(e.startsWith("0x")&&sl(e))return e;if(sl(`0x${e}`))return`0x${e}`}throw new Error(`Invalid hex value: ${e}`)}var Yl=class extends Error{constructor(e,t,n){super(e),this.code=t,this.details=n,this.name="NetworkError"}};var Pt=class extends Error{constructor(e,t,n){super(e),this.hash=t,this.details=n,this.name="TransactionError"}};async function Ew(e,t){try{let n=await e.walletClient.getChainId();return{isCorrectNetwork:n===t,currentChainId:n}}catch(n){throw new Yl(`Failed to check network status: ${n instanceof Error?n.message:"Unknown error"}`,"NETWORK_CHECK_FAILED",n)}}async function Iw(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 Yl(`Failed to check balance: ${r instanceof Error?r.message:"Unknown error"}`,"BALANCE_CHECK_FAILED",r)}}async function Aw(e,t,n={}){let{timeout:r=6e4,pollingInterval:o=2e3,confirmations:a=1}=n,s=Date.now();return new Promise((i,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>=r){l(new Pt(`Transaction confirmation timeout after ${r}ms`,t));return}setTimeout(m,o);return}i(p)}else{if(Date.now()-s>=r){l(new Pt(`Transaction receipt timeout after ${r}ms`,t));return}setTimeout(m,o)}}catch(p){if(Date.now()-s>=r){l(new Pt(`Transaction receipt timeout after ${r}ms`,t,p));return}setTimeout(m,o)}};m()})}async function Fr(e,t){let{targetChainId:n,minBalance:r,requiredAddress:o}=t,a=await Ew(e,n),s=await Iw(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 rr(){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,m,p={})=>{let{timeout:d=6e4,confirmations:f=1,onSubmitted:u,onConfirmed:h,onError:g,signal:y}=p;try{if(o(),n=new AbortController,y){if(y.aborted)throw new Pt("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 Pt("Transaction aborted");let b=await i(l,...m);if(n.signal.aborted)throw new Pt("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([Aw(l.publicClient,b,{timeout:d,confirmations:f}),new Promise((k,_)=>{n?.signal.addEventListener("abort",()=>{_(new Pt("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 Pt("Transaction failed on-chain",b,w);throw g?.(k,b),k}return{hash:b,receipt:w,success:S}}catch(b){let w=b instanceof Pt?b:new Pt(`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 Vr(e,t,n,r={},o={}){let{maxRetries:a=3,initialDelay:s=1e3,maxDelay:i=1e4,backoffFactor:l=2,retryCondition:m=()=>!0}=o,p,d=s;for(let f=0;f<=a;f++)try{return await rr().execute(e,t,n,r)}catch(u){if(p=u instanceof Error?u:new Error(String(u)),f===a||!m(p))break;await new Promise(h=>setTimeout(h,d)),d=Math.min(d*l,i)}throw p}var Zl=[{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}],Pw=_e.object({chain:_e.unknown().optional(),rpcUrl:_e.string().optional(),kmsContractAddress:_e.string(),privateKey:_e.string().optional(),walletClient:_e.unknown().optional(),publicClient:_e.unknown().optional(),allowAnyDevice:_e.boolean().optional().default(!1),deviceId:_e.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),composeHash:_e.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),disableUpgrades:_e.boolean().optional().default(!1),skipPrerequisiteChecks:_e.boolean().optional().default(!1),minBalance:_e.string().optional()}).passthrough(),$w=Pw.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"]}),Rw=_e.object({appId:_e.string(),appAuthAddress:_e.string(),deployer:_e.string(),transactionHash:_e.string(),blockNumber:_e.bigint().optional(),gasUsed:_e.bigint().optional()}).passthrough();function xw(e,t,n){try{let r=kw({abi:Zl,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 Dw(e,t){let n=$w.parse(e),{chain:r,rpcUrl:o,kmsContractAddress:a,privateKey:s,walletClient:i,publicClient:l,allowAnyDevice:m=!1,deviceId:p="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",$=p!==_&&p!=="0x"+_?!1:m,M,N,G,oe;if(s){let fe=Sw(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=ol({chain:r,transport:ds(o)})}if(!r)throw new Error("Chain required for walletClient");N=_w({account:fe,chain:r,transport:ds(o)}),G=fe.address,oe=r.id}else if(i){if(typeof i!="object"||!i)throw new Error("walletClient is invalid");if(N=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=ol({chain:r,transport:ds(o)})}if(!N.account?.address)throw new Error("WalletClient needs an account");G=N.account.address,r?oe=r.id:oe=await N.getChainId()}else throw new Error("Need privateKey or walletClient");let se={publicClient:M,walletClient:N,address:G,chainId:oe},ae=rr();if(w&&typeof w=="function"){let fe=()=>{w(ae.status),ae.isComplete||setTimeout(fe,100)};setTimeout(fe,10)}if(!u){let fe={targetChainId:oe,minBalance:h?al(h):al("0.001")},Un=await Fr(se,fe);if(!Un.networkValid)throw new Error(`Wrong network. Need chain ${fe.targetChainId}, got ${Un.details.currentChainId}`);if(!Un.balanceValid){let Jt=Number(fe.minBalance)/1e18,wh=Number(Un.details.balance)/1e18;throw new Error(`Not enough ETH. Need ${Jt}, have ${wh.toFixed(6)}`)}}let H=yt(p),Q=yt(d),ke=`0x${H.slice(2).padEnd(64,"0")}`,Lt=`0x${Q.slice(2).padEnd(64,"0")}`,Ln=async fe=>{try{let Jt=await fe.publicClient.getCode({address:a});if(!Jt||Jt==="0x")throw new Error(`No contract at ${a}`)}catch(Jt){if(Jt instanceof Error&&Jt.message.includes("No contract at"))throw Jt}let Un={address:a,abi:Zl,functionName:"deployAndRegisterApp",args:[fe.address,f,$,ke,Lt],account:fe.walletClient.account||fe.address,chain:r||null};return await fe.walletClient.writeContract(Un)},Ar=y?await Vr(Ln,se,[],{timeout:g,confirmations:1,onSubmitted:S,onConfirmed:k,signal:b},y):await ae.execute(Ln,se,[],{timeout:g,confirmations:1,onSubmitted:S,onConfirmed:k,signal:b}),hn=xw(Ar.receipt,G,a);return t?.schema===!1?hn:(t?.schema||Rw).parse(hn)}async function Xl(e,t){try{return{success:!0,data:await Dw(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 Ql=[{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}],Uw=ge.object({chain:ge.unknown().optional(),rpcUrl:ge.string().optional(),appId:ge.string(),composeHash: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=>{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"]}),Ow=ge.object({composeHash:ge.string(),appId:ge.string(),transactionHash:ge.string(),blockNumber:ge.bigint().optional(),gasUsed:ge.bigint().optional()}).passthrough();function Nw(e,t,n,r){console.log(e.logs);try{let o=Mw({abi:Ql,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 jw(e,t){let n=Uw.parse(e),{chain:r,rpcUrl:o,appId:a,composeHash:s,privateKey:i,walletClient:l,publicClient:m,timeout:p=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 H=Lw(i);if(m)w=m;else{if(!r)throw new Error("Chain required when creating publicClient");w=il({chain:r,transport:us(o)})}if(!r)throw new Error("Chain required when creating walletClient");S=Tw({account:H,chain:r,transport:us(o)}),k=H.address,_=r.id}else if(l){if(S=l,m)w=m;else{if(!r)throw new Error("Chain required when creating publicClient");w=il({chain:r,transport:us(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=rr();if(u&&typeof u=="function"){let H=()=>{u(M.status),M.isComplete||setTimeout(H,100)};setTimeout(H,10)}if(!y){let H={targetChainId:_,minBalance:b?cl(b):cl("0.001")},Q=await Fr($,H);if(!Q.networkValid)throw new Error(`Network mismatch: Expected chain ${H.targetChainId}, but wallet is on chain ${Q.details.currentChainId}`);if(!Q.balanceValid){let ke=Number(H.minBalance)/1e18,Lt=Number(Q.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${ke} ETH, but account has ${Lt.toFixed(6)} ETH`)}}let N=await w.readContract({address:I,abi:[{inputs:[],name:"owner",outputs:[{type:"address"}],stateMutability:"view",type:"function"}],functionName:"owner"});if(N.toLowerCase()!==k.toLowerCase())throw new Error(`Sender ${k} is not the owner of contract ${I}. Contract owner is ${N}.`);let G=async H=>await H.walletClient.writeContract({address:I,abi:Ql,functionName:"addComposeHash",args:[yt(s)],account:H.walletClient.account||H.address,chain:r||null}),oe=d?await Vr(G,$,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await M.execute(G,$,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),se=Nw(oe.receipt,yt(s),I,a);return t?.schema===!1?se:(t?.schema||Ow).parse(se)}async function rn(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 Rt=[{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"}],Hw=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"]}),zw=he.object({appAddress:he.string(),deviceId:he.string(),transactionHash:he.string(),blockNumber:he.bigint().optional(),gasUsed:he.bigint().optional()}).passthrough();async function Kw(e,t){let n=Hw.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:l,publicClient:m,timeout:p=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=yt(s),k,_,I,$;if(i){let Q=Vw(i),ke=ml(o,{timeout:p});k=m||ll({chain:r,transport:ke}),_=Fw({account:Q,chain:r,transport:ke}),I=Q.address,$=r.id}else if(l){if(_=l,k=m||ll({chain:r,transport:ml(o,{timeout:p})}),!_.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:$},N=rr();if(u&&typeof u=="function"){let Q=()=>{u(N.status),N.isComplete||setTimeout(Q,100)};setTimeout(Q,10)}if(!y){let Q={targetChainId:$,minBalance:b?pl(b):pl("0.001")},ke=await Fr(M,Q);if(!ke.networkValid)throw new Error(`Network mismatch: Expected chain ${Q.targetChainId}, but wallet is on chain ${ke.details.currentChainId}`);if(!ke.balanceValid){let Lt=Number(Q.minBalance)/1e18,Ln=Number(ke.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Lt} ETH, but account has ${Ln.toFixed(6)} ETH`)}}let G=await k.readContract({address:w,abi:Rt,functionName:"owner"});if(G.toLowerCase()!==I.toLowerCase())throw new Error(`Sender ${I} is not the owner of contract ${w}. Contract owner is ${G}.`);let oe=async Q=>Q.walletClient.writeContract({address:w,abi:Rt,functionName:"addDevice",args:[S],account:Q.walletClient.account||Q.address,chain:r||null}),se=d?await Vr(oe,M,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await N.execute(oe,M,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),ae={appAddress:w,deviceId:S,transactionHash:se.receipt.transactionHash,blockNumber:se.receipt.blockNumber,gasUsed:se.receipt.gasUsed};return t?.schema===!1?ae:(t?.schema||zw).parse(ae)}async function on(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 Bw=ye.object({chain:ye.unknown().optional(),rpcUrl:ye.string().optional(),appAddress:ye.string(),deviceId:ye.string(),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"]}),Ww=ye.object({appAddress:ye.string(),deviceId:ye.string(),transactionHash:ye.string(),blockNumber:ye.bigint().optional(),gasUsed:ye.bigint().optional()}).passthrough();async function Jw(e,t){let n=Bw.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:l,publicClient:m,timeout:p=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=yt(s),k,_,I,$;if(i){let H=qw(i),Q=ul(o,{timeout:p});k=m||dl({chain:r,transport:Q}),_=Gw({account:H,chain:r,transport:Q}),I=H.address,$=r.id}else if(l){if(_=l,k=m||dl({chain:r,transport:ul(o,{timeout:p})}),!_.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:$},N=rr();if(u&&typeof u=="function"){let H=()=>{u(N.status),N.isComplete||setTimeout(H,100)};setTimeout(H,10)}if(!y){let H={targetChainId:$,minBalance:b?fl(b):fl("0.001")},Q=await Fr(M,H);if(!Q.networkValid)throw new Error(`Network mismatch: Expected chain ${H.targetChainId}, but wallet is on chain ${Q.details.currentChainId}`);if(!Q.balanceValid){let ke=Number(H.minBalance)/1e18,Lt=Number(Q.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${ke} ETH, but account has ${Lt.toFixed(6)} ETH`)}}let G=async H=>H.walletClient.writeContract({address:w,abi:Rt,functionName:"removeDevice",args:[S],account:H.walletClient.account||H.address,chain:r||null}),oe=d?await Vr(G,M,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await N.execute(G,M,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),se={appAddress:w,deviceId:S,transactionHash:oe.receipt.transactionHash,blockNumber:oe.receipt.blockNumber,gasUsed:oe.receipt.gasUsed};return t?.schema===!1?se:(t?.schema||Ww).parse(se)}async function em(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 Xw=ve.object({chain:ve.unknown().optional(),rpcUrl:ve.string().optional(),appAddress:ve.string(),allow:ve.boolean(),privateKey:ve.string().optional(),walletClient:ve.unknown().optional(),publicClient:ve.unknown().optional(),skipPrerequisiteChecks:ve.boolean().optional().default(!1),minBalance:ve.string().optional(),timeout:ve.number().optional().default(12e4),retryOptions:ve.unknown().optional(),signal:ve.unknown().optional(),onTransactionStateChange:ve.function().optional(),onTransactionSubmitted:ve.function().optional(),onTransactionConfirmed:ve.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"]}),Qw=ve.object({appAddress:ve.string(),allow:ve.boolean(),transactionHash:ve.string(),blockNumber:ve.bigint().optional(),gasUsed:ve.bigint().optional()}).passthrough();async function e_(e,t){let n=Xw.parse(e),{chain:r,rpcUrl:o,appAddress:a,allow:s,privateKey:i,walletClient:l,publicClient:m,timeout:p=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 ae=Zw(i),H=hl(o,{timeout:p});S=m||gl({chain:r,transport:H}),k=Yw({account:ae,chain:r,transport:H}),_=ae.address,I=r.id}else if(l){if(k=l,S=m||gl({chain:r,transport:hl(o,{timeout:p})}),!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=rr();if(u&&typeof u=="function"){let ae=()=>{u(M.status),M.isComplete||setTimeout(ae,100)};setTimeout(ae,10)}if(!y){let ae={targetChainId:I,minBalance:b?yl(b):yl("0.001")},H=await Fr($,ae);if(!H.networkValid)throw new Error(`Network mismatch: Expected chain ${ae.targetChainId}, but wallet is on chain ${H.details.currentChainId}`);if(!H.balanceValid){let Q=Number(ae.minBalance)/1e18,ke=Number(H.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Q} ETH, but account has ${ke.toFixed(6)} ETH`)}}let N=async ae=>ae.walletClient.writeContract({address:w,abi:Rt,functionName:"setAllowAnyDevice",args:[s],account:ae.walletClient.account||ae.address,chain:r||null}),G=d?await Vr(N,$,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},d):await M.execute(N,$,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),oe={appAddress:w,allow:s,transactionHash:G.receipt.transactionHash,blockNumber:G.receipt.blockNumber,gasUsed:G.receipt.gasUsed};return t?.schema===!1?oe:(t?.schema||Qw).parse(oe)}async function tm(e,t){try{return{success:!0,data:await e_(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 Z$=Gn.object({appAddress:Gn.string(),owner:Gn.string(),allowAnyDevice:Gn.boolean(),devices:Gn.array(Gn.string())});async function Mo(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 t_({chain:t,transport:n_(n)})})(),[l,m]=await Promise.all([i.readContract({address:s,abi:Rt,functionName:"allowAnyDevice"}),i.readContract({address:s,abi:Rt,functionName:"owner"})]);if(l)return{appAddress:s,owner:m,allowAnyDevice:!0,devices:o.map(d=>yt(d))};let p;if(o.length===0)p=[];else{let d=o.map(u=>({address:s,abi:Rt,functionName:"allowedDeviceIds",args:[yt(u)]})),f=await i.multicall({contracts:d});p=o.map((u,h)=>({deviceId:yt(u),allowed:f[h]?.status==="success"&&f[h]?.result===!0})).filter(u=>u.allowed).map(u=>u.deviceId)}return{appAddress:s,owner:m,allowAnyDevice:!1,devices:p}}async function a_(e){let{chain:t,rpcUrl:n,appAddress:r,deviceId:o,composeHash:a,publicClient:s}=e,i=r.startsWith("0x")?r:`0x${r}`,l=yt(o),m=yt(a),p=s||(()=>{if(!t)throw new Error("Chain is required when publicClient is not provided");return r_({chain:t,transport:o_(n)})})(),d=[{address:i,abi:Rt,functionName:"allowAnyDevice"},{address:i,abi:Rt,functionName:"allowedDeviceIds",args:[l]},{address:i,abi:Rt,functionName:"allowedComposeHashes",args:[m]}],f=await p.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 wn(e){try{return{success:!0,data:await a_(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 s_=Ml;var i_=qn.object({items:qn.array(s_),total:qn.number(),page:qn.number(),page_size:qn.number(),pages:qn.number()}).passthrough(),{action:sR,safeAction:nm}=x(i_,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)}),Yn=ht.object({limit:ht.number(),remaining:ht.number()}).passthrough(),c_=ht.object({vm_slots:Yn,vcpu:Yn,memory_mb:Yn,disk_gb:Yn}).passthrough(),l_=ht.object({gpus:Yn,in_use:ht.number(),misconfigured:ht.number()}).passthrough(),m_=ht.object({team_slug:ht.string(),tier:ht.string(),quotas:c_,reserved_nodes:Yn,reserved_gpu:l_,as_of:ht.string()}).passthrough(),{action:cR,safeAction:lR}=x(m_,async(e,t)=>await e.get(`/workspaces/${t.teamSlug}/quotas`)),d_=rt(Ge.extend({node_id:p_.number().optional()})),{action:pR,safeAction:dR}=x(nr,async(e,t)=>{let n=d_.parse(t),{cvmId:r}=z.parse(n),{node_id:o}=n;return await e.post(`/cvms/${r}/replicas`,{node_id:o})}),fR=Bn.object({target:Bn.string().describe("Target status to wait for (e.g., 'running', 'stopped')"),interval:Bn.number().min(5).max(30).default(5).describe("Polling interval in seconds"),timeout:Bn.number().min(10).max(600).default(300).describe("Timeout per attempt in seconds"),maxRetries:Bn.number().min(0).default(Number.POSITIVE_INFINITY).describe("Maximum number of retry attempts (Infinity for unlimited)"),retryDelay:Bn.number().min(0).default(5e3).describe("Delay between retries in milliseconds")});var u_=rt(Ge.extend({docker_compose_file:Y.string().optional(),pre_launch_script:Y.string().optional(),allowed_envs:Y.array(Y.string()).optional(),public_logs:Y.boolean().optional(),public_sysinfo:Y.boolean().optional(),public_tcbinfo:Y.boolean().optional(),encrypted_env:Y.string().optional(),user_config:Y.string().optional(),gpus:Y.object({count:Y.number(),product_name:Y.string().optional()}).optional(),vcpu:Y.number().optional(),memory:Y.number().optional(),disk_size:Y.number().optional(),image:Y.string().optional(),shutdown_timeout:Y.number().optional(),allow_force_stop:Y.boolean().optional(),prepareOnly:Y.boolean().optional()})),f_=Y.object({requiresOnChainHash:Y.literal(!1),correlationId:Y.string()}),g_=Y.object({requiresOnChainHash:Y.literal(!0),composeHash:Y.string(),appId:Y.string(),deviceId:Y.string(),kmsInfo:bt,commitToken:Y.string().optional(),commitUrl:Y.string().optional(),apiCommitUrl:Y.string().optional(),onchainStatus:Y.object({compose_hash_allowed:Y.boolean(),device_id_allowed:Y.boolean(),is_allowed:Y.boolean()}).optional()}),h_=Y.discriminatedUnion("requiresOnChainHash",[f_,g_]);function y_(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:hR,safeAction:rm}=x(h_,async(e,t)=>{let n=u_.parse(t),{cvmId:r}=z.parse(n),{id:o,uuid:a,app_id:s,instance_id:i,name:l,prepareOnly:m,...p}=n;try{return{requiresOnChainHash:!1,correlationId:(m?await e.patch(`/cvms/${r}`,p,{headers:{"X-Prepare-Only":"true"}}):await e.patch(`/cvms/${r}`,p)).correlation_id}}catch(d){if(d instanceof vt&&d.status===465){let f=y_(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}}),v_=rt(Ge.extend({composeHash:Ao.string().describe("Compose hash from patchCvm Phase 1 response"),transactionHash:Ao.string().describe("Transaction hash proving on-chain registration")})),C_=Ao.object({correlationId:Ao.string()}),{action:vR,safeAction:om}=x(C_,async(e,t)=>{let n=v_.parse(t),{cvmId:r}=z.parse(n);return{correlationId:(await e.patch(`/cvms/${r}`,{},{headers:{"X-Compose-Hash":n.composeHash,"X-Transaction-Hash":n.transactionHash}})).correlation_id}}),b_=rt(Ge.extend({token:Xn.string().describe("One-time commit token from prepare-only flow"),composeHash:Xn.string().describe("Compose hash from Phase 1 response"),transactionHash:Xn.string().describe("Transaction hash proving on-chain registration")})),w_=Xn.object({correlationId:Xn.string(),status:Xn.string()}),{action:bR,safeAction:am}=x(w_,async(e,t)=>{let n=b_.parse(t),{cvmId:r}=z.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}}),sm=ft.object({cvm_id:ft.number().int(),identifier:ft.string(),status:ft.enum(["updated","unchanged","skipped","conflict","error"]),old_instance_id:ft.string().nullable().optional(),new_instance_id:ft.string().nullable().optional(),source:ft.enum(["teepod_state","teepod_info","gateway","none"]),verified_with_gateway:ft.boolean(),reason:ft.string().nullable().optional()}),__=rt(Ge.extend({overwrite:ft.boolean().optional(),dry_run:ft.boolean().optional()})),{action:_R,safeAction:kR}=x(sm,async(e,t)=>{let n=__.parse(t),{cvmId:r}=z.parse(n),{overwrite:o,dry_run:a}=n;return await e.patch(`/cvms/${r}/instance-id`,{overwrite:o,dry_run:a})}),k_=Re.object({cvm_ids:Re.array(Re.string()).optional(),running_only:Re.boolean().optional(),missing_only:Re.boolean().optional(),overwrite:Re.boolean().optional(),limit:Re.number().int().min(1).max(500).optional(),dry_run:Re.boolean().optional()}).strict(),S_=Re.object({total:Re.number().int(),scanned:Re.number().int(),updated:Re.number().int(),unchanged:Re.number().int(),skipped:Re.number().int(),conflicts:Re.number().int(),errors:Re.number().int(),items:Re.array(sm)}),{action:ER,safeAction:IR}=x(S_,async(e,t)=>{let n=k_.parse(t);return await e.patch("/cvms/instance-ids",n)}),E_=He.object({vm_uuid:He.string(),status:He.string(),uptime:He.string().nullable().optional(),in_progress:He.boolean(),boot_progress:He.string().nullable().optional(),boot_error:He.string().nullable().optional(),operation_type:He.string().nullable().optional(),operation_started_at:He.string().nullable().optional(),correlation_id:He.string().nullable().optional()}),I_=He.record(He.string(),E_),A_=He.object({vmUuids:He.array(He.string())}),{action:PR,safeAction:Lo}=x(I_,async(e,t)=>{let{vmUuids:n}=A_.parse(t);return await e.post("/status/batch",{vm_uuids:n})}),P_=Mr.object({hostname:Mr.string().nullable().optional(),ssh_authorized_keys:Mr.array(Mr.string()).default([]),default_gateway_domain:Mr.string().nullable().optional()}),$_=z,{action:RR,safeAction:im}=x(P_,async(e,t)=>{let{cvmId:n}=$_.parse(t);return await e.get(`/cvms/${n}/user_config`)}),Ms=ze.object({cvm_id:ze.number().optional(),app_contract_address:ze.string(),compose_hash:ze.string(),device_id:ze.string(),compose_hash_allowed:ze.boolean(),allow_any_device:ze.boolean(),device_id_allowed:ze.boolean().nullable().optional(),is_allowed:ze.boolean(),error:ze.string().nullable().optional()}),R_=ze.object({cvmId:ze.string().min(1),compose_hash:ze.string().optional(),node_id:ze.number().optional(),device_id:ze.string().optional()}),x_=R_,{action:DR,safeAction:TR}=x(Ms,async(e,t)=>{let{cvmId:n,...r}=x_.parse(t);return await e.post(`/cvms/${n}/is-allowed`,r)}),D_=Wn.object({appId:Wn.string().min(1),compose_hash:Wn.string(),node_id:Wn.number().optional(),device_id:Wn.string().optional(),chain_id:Wn.number().optional()}),{action:LR,safeAction:UR}=x(Ms,async(e,t)=>{let{appId:n,...r}=D_.parse(t);return await e.post(`/apps/${n}/is-allowed`,r)}),T_=lt.object({is_onchain:lt.boolean(),results:lt.array(Ms.extend({cvm_id:lt.number()})).default([]),total:lt.number().default(0),allowed_count:lt.number().default(0),denied_count:lt.number().default(0),error_count:lt.number().default(0),skipped_cvm_ids:lt.array(lt.number()).default([])}),M_=lt.object({appId:lt.string().min(1)}),{action:NR,safeAction:jR}=x(T_,async(e,t)=>{let{appId:n}=M_.parse(t);return await e.post(`/apps/${n}/cvms/is-allowed`,{})}),L_=nt.object({page:nt.number().int().min(1).optional(),page_size:nt.number().int().min(1).max(100).optional(),search:nt.string().optional(),status:nt.array(nt.string()).optional(),listed:nt.boolean().optional(),base_image:nt.string().optional(),instance_type:nt.string().optional(),kms_slug:nt.string().optional(),kms_type:nt.string().optional(),node:nt.string().optional(),region:nt.string().optional()}).strict();function U_(e){return e==="2025-10-28"?yw:bw}async function O_(e,t){let n=L_.parse(t??{}),r=await e.get("/apps",{params:n});return U_(e.config.version).parse(r)}async function cm(e,t){try{return{success:!0,data:await O_(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 N_=vl.object({appId:vl.string().min(1)}).strict();function j_(e){return e==="2025-10-28"?Bl:Wl}async function F_(e,t){let{appId:n}=N_.parse(t),r=await e.get(`/apps/${n}`);return j_(e.config.version).parse(r)}async function lm(e,t){try{return{success:!0,data:await F_(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 V_=Po.object({appId:Po.string().min(1)}).strict();function H_(e){return e==="2025-10-28"?Po.array(Dl):Po.array(Lr)}async function z_(e,t){let{appId:n}=V_.parse(t),r=await e.get(`/apps/${n}/cvms`);return H_(e.config.version).parse(r)}async function or(e,t){try{return{success:!0,data:await z_(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 K_=It.object({appId:It.string().min(1),name:It.string().optional(),node_id:It.number().optional(),docker_compose_file:It.string().optional(),pre_launch_script:It.string().optional(),encrypted_env:It.string().optional(),compose_hash:It.string().optional(),token:It.string().optional(),transaction_hash:It.string().optional()}).strict(),{action:KR,safeAction:GR}=x(nr,async(e,t)=>{let n=K_.parse(t),{appId:r,...o}=n;return await e.post(`/apps/${r}/instances`,o)}),G_=Ke.object({device_id:Ke.string(),node_name:Ke.string().nullable(),cvm_ids:Ke.array(Ke.number()),allowed_onchain:Ke.boolean(),status:Ke.string()}),q_=Ke.object({is_onchain_kms:Ke.boolean(),allow_any_device:Ke.boolean().nullable().optional(),chain_id:Ke.number().nullable().optional(),app_contract_address:Ke.string().nullable().optional(),devices:Ke.array(G_).optional().default([])}),B_=Ke.object({appId:Ke.string().min(1)}).strict();async function W_(e,t){let{appId:n}=B_.parse(t),r=await e.get(`/apps/${n}/device-allowlist`);return q_.parse(r)}async function Uo(e,t){try{return{success:!0,data:await W_(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 WR=So.object({appId:So.string().min(1),page:So.number().int().min(1).optional(),page_size:So.number().int().min(1).max(1e3).optional()}).strict();var YR=Eo.object({appId:Eo.string().min(1),revisionId:Eo.string().min(1),rawComposeFile:Eo.boolean().optional()}).strict();var XR=Ve.object({statuses:Ve.array(Ve.string()),image_versions:Ve.array(Ve.string()),instance_types:Ve.array(Ve.string()),kms_slugs:Ve.array(Ve.string()),kms_types:Ve.array(Ve.string()),regions:Ve.array(Ve.string()),nodes:Ve.array(Ve.string())});var J_=B.object({contract_address:B.string(),chain_id:B.string().nullable(),version:B.string(),url:B.string(),gateway_app_id:B.string().nullable(),gateway_app_url:B.string(),kms_type:B.string()}),Cl=B.object({app_id:B.string().optional(),instance_id:B.string().optional(),app_name:B.string().optional(),device_id:B.string().optional()}).passthrough().nullable(),Y_=B.object({vm_uuid:B.string().nullable().optional(),name:B.string().optional(),instance_id:B.string().nullable().optional(),status:B.string().optional(),image_version:B.string().nullable().optional(),quote:B.string().nullable().optional(),ppid:B.string().optional(),ppid_sha256:B.string().nullable().optional(),device_id:B.string().optional(),fmspc:B.string().nullable().optional(),tee_tcb_svn:B.string().nullable().optional(),cpusvn:B.string().nullable().optional(),pcesvn:B.number().nullable().optional(),tcb_info:zl.nullable().optional(),app_certificates:B.array(Hl).nullable().optional(),compose_file:B.string().nullable().optional(),error:B.string().nullable().optional()}),Z_=B.object({app_id:B.string(),contract_address:B.string(),kms_info:J_,instances:B.array(Y_),kms_guest_agent_info:Cl,gateway_guest_agent_info:Cl,qemu_version:B.string().nullable()}),X_=B.object({appId:B.string().min(1)}).strict(),{action:ex,safeAction:tx}=x(Z_,async(e,t)=>{let{appId:n}=X_.parse(t);return await e.get(`/apps/${n}/attestations`)}),Q_=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function ek(e){let t={},n=e.toString();n=n.replace(/\r\n?/gm,`
25
- `);let r;for(;(r=Q_.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 ar(e){let t=ek(e),n=[];for(let[r,o]of Object.entries(t))n.push({key:r,value:o});return n}function Oo(e){return e.split(/[\s-]+/).filter(Boolean).map((t,n)=>n===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function mm(e){return e===void 0?[]:Array.isArray(e)?[...e]:[e]}function pm(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??Oo(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 lk from"arg";var rk={name:"help",shorthand:"h",description:"Show help information for the current command",type:"boolean",target:"help"},ok={name:"version",shorthand:"v",description:"Show CLI version",type:"boolean",target:"version"},j={name:"interactive",shorthand:"i",description:"Enable interactive mode",type:"boolean",target:"interactive",group:"basic"},ak={name:"interactive",description:"Enable interactive mode for commands that support it",type:"boolean",target:"interactive",group:"basic"},dm={name:"api-token",description:"API token for authenticating with Phala Cloud",type:"string",target:"apiToken",aliases:["api-key"],argumentName:"token",group:"basic"},Se={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json",group:"basic"},sk={name:"profile",description:"Temporarily use a different auth profile for this command",type:"string",target:"profile",argumentName:"profile",group:"basic"},ik={name:"api-version",description:"API version to use (e.g. 2025-10-28, 2026-01-21)",type:"string",target:"apiVersion",group:"advanced"},an=[dm],X={name:"cvm_id",description:"CVM identifier (UUID, app_id, instance_id, or name)",required:!1,target:"cvmId"},_n={name:"cvm-id",description:"CVM identifier (UUID, app_id, instance_id, or name)",type:"string",target:"cvmId"},um={name:"uuid",description:"[DEPRECATED] Use --cvm-id instead. CVM UUID.",type:"string",target:"cvmId",deprecated:!0,group:"deprecated"},Qe={name:"private-key",description:"Private key for signing on-chain transactions (or set PRIVATE_KEY env var)",type:"string",target:"privateKey",group:"advanced"},qe={name:"rpc-url",description:"RPC URL for on-chain KMS transactions (or set ETH_RPC_URL env var)",type:"string",target:"rpcUrl",group:"advanced"},sr={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"},kn=[rk,ok,dm,Se,ak,_n,sk,ik];import fm from"arg";function gm(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??Oo(o.name),i=ck(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 mm(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]=fm.flag(()=>!0),r.set(l,{option:o,canonicalKey:a,target:s,negatedKey:l})}}return{spec:t,descriptors:n,negatedLookup:r}}function ck(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 fm.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 mk(e){let t=e.indexOf("--");return t===-1?[[...e],[]]:[e.slice(0,t),e.slice(t+1)]}function Hr(e,t,n={}){let r=[...kn,...t?[...t]:[]],o=gm(r),{permissive:a=!1,stopAtPositional:s=!1}=n,[i,l]=mk(e),m=lk(o.spec,{argv:i,permissive:a,stopAtPositional:s}),{_:p,...d}=m;return{positionals:p??[],flags:d,flagConfig:o,passThrough:l}}var sn=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
24
+ `,y,k,rc(h.status,h.statusText,h.headers,h._data))}p&&p({request:d,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?yr.fromFetchError(t):t instanceof Error?yr.fromError(t):new yr("Unknown error occurred",{detail:"Unknown error occurred"})}emitError(t){let n=Vh(t);return this.emitter.emit("error",n),n}async safeRequest(t){try{return{success:!0,data:await t()}}catch(n){if(n instanceof lt)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 xc({...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 Jh(e={}){return new Wh(e)}var Yh=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(),Xh=me.object({id:me.string(),name:me.string(),slug:me.string().nullable(),tier:me.string(),role:me.string(),avatar:me.string().nullable().optional()}).passthrough(),Zh=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(),Qh=me.object({user:Yh,workspace:Xh,credits:Zh}).passthrough(),ey=qt.object({username:qt.string(),email:qt.string(),credits:qt.number(),granted_credits:qt.number(),avatar:qt.string(),team_name:qt.string(),team_tier:qt.string()}).passthrough();function ty(e){return e==="2025-10-28"?ey:Qh}async function $c(e,t){let n=await e.get("/auth/me");return t?.schema===!1?n:(t?.schema||ty(e.config.version)).parse(n)}async function Ve(e,t){try{return{success:!0,data:await $c(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 At={[sc.id]:sc,[ac.id]:ac,[oc.id]:oc},ny=Dt.object({id:Dt.string(),slug:Dt.string().nullable(),url:Dt.string(),version:Dt.string(),chain_id:Dt.number().nullable(),kms_contract_address:Dt.string().nullable().transform(e=>e),gateway_app_id:Dt.string().nullable().transform(e=>e),k256_pubkey:Dt.string().nullable().optional()}).passthrough(),mt=ny.transform(e=>{if(e.chain_id!=null){let t=At[e.chain_id];if(t)return{...e,chain:t}}return e}),Tc=R.union([R.number(),R.string()]),ry=R.object({id:R.string(),name:R.string(),status:R.string(),uptime:R.string(),app_url:R.string().nullable(),app_id:R.string(),instance_id:R.string().nullable(),configuration:R.any().optional(),exited_at:R.string().nullable(),boot_progress:R.string().nullable(),boot_error:R.string().nullable(),shutdown_progress:R.string().nullable(),image_version:R.string().nullable()}),oy=R.object({id:Tc,username:R.string()}),Dc=R.object({id:R.number(),name:R.string(),region_identifier:R.string().nullable().optional()}),Ha=R.object({vcpu:R.number(),memory:R.number(),disk_size:R.number(),gpu_count:R.number().default(0)}),za=R.object({app:R.string(),instance:R.string()}),Mc=R.object({hosted:ry,name:R.string(),managed_user:oy.nullable(),node:Dc.nullable(),listed:R.boolean().default(!1),status:R.string(),in_progress:R.boolean().default(!1),dapp_dashboard_url:R.string().nullable(),syslog_endpoint:R.string().nullable(),allow_upgrade:R.boolean().default(!1),project_id:R.string().nullable(),project_type:R.string().nullable(),billing_period:R.string().nullable(),kms_info:mt.nullable(),vcpu:R.number().nullable(),memory:R.number().nullable(),disk_size:R.number().nullable(),gateway_domain:R.string().nullable(),public_urls:R.array(za),machine_info:Ha.nullable().optional(),updated_at:R.string().nullable().optional()}),Uc=R.object({id:Tc,name:R.string(),status:R.string(),in_progress:R.boolean().optional().default(!1),teepod_id:R.number().nullable(),teepod:Dc.optional().nullable(),app_id:R.string(),vm_uuid:R.string().nullable(),instance_id:R.string().nullable(),vcpu:R.number(),memory:R.number(),disk_size:R.number(),base_image:R.string().nullable(),encrypted_env_pubkey:R.string().nullable(),listed:R.boolean().optional().default(!1),project_id:R.string().optional().nullable(),project_type:R.string().optional().nullable(),instance_type:R.string().optional().nullable(),public_sysinfo:R.boolean().optional().default(!1),public_logs:R.boolean().optional().default(!1),dapp_dashboard_url:R.string().optional().nullable(),syslog_endpoint:R.string().optional().nullable(),kms_info:mt.optional().nullable(),contract_address:R.string().optional().nullable(),deployer_address:R.string().optional().nullable(),scheduled_delete_at:R.string().optional().nullable(),public_urls:R.array(za).optional().default([]),gateway_domain:R.string().optional().nullable(),machine_info:Ha.optional().nullable(),updated_at:R.string().optional().nullable()}),ay=R.object({items:R.array(Mc),total:R.number(),page:R.number(),page_size:R.number(),pages:R.number()}),sy=w.enum(["skip","hourly","monthly"]),iy=w.enum(["phala","ethereum","base","legacy"]),Ka=w.object({object_type:w.literal("user"),id:w.string().nullable().optional(),username:w.string().nullable().optional(),avatar_url:w.string().nullable().optional()}),qa=w.object({object_type:w.literal("workspace"),id:w.string(),name:w.string(),slug:w.string().nullable().optional(),avatar_url:w.string().nullable().optional()}),cy=w.object({instance_type:w.string().nullable().optional(),vcpu:w.number().int().nullable().optional(),memory_in_gb:w.number().nullable().optional(),disk_in_gb:w.number().int().nullable().optional(),gpus:w.number().int().nullable().optional(),compute_billing_price:w.string().nullable().optional(),billing_period:sy.nullable().optional()}),ly=w.object({total:w.string().nullable().optional(),compute:w.string().nullable().optional(),disk:w.string().nullable().optional()}),my=w.object({order_id:w.string(),status:w.string(),pricing_plan:w.string().nullable().optional(),commitment_days:w.number().int().nullable().optional(),agreed_hourly_rate:w.string().nullable().optional(),hourly_billing_start_time:w.string().nullable().optional(),activated_at:w.string().nullable().optional(),completed_at:w.string().nullable().optional(),cancelled_at:w.string().nullable().optional(),decoupled_at:w.string().nullable().optional(),sku_code:w.string().nullable().optional(),sku_display_name:w.string().nullable().optional()}),py=w.object({name:w.string().nullable().optional(),version:w.string().nullable().optional(),is_dev:w.boolean().nullable().optional(),os_image_hash:w.string().nullable().optional()}),uy=w.object({chain_id:w.number().int().nullable().optional(),dstack_kms_address:w.string().nullable().optional(),dstack_app_address:w.string().nullable().optional(),deployer_address:w.string().nullable().optional(),rpc_endpoint:w.string().nullable().optional(),encrypted_env_pubkey:w.string().nullable().optional()}),dy=uy.transform(e=>{if(e.chain_id!=null){let t=At[e.chain_id];if(t)return{...e,chain:t}}return e}),fy=w.object({target:w.string().nullable().optional(),started_at:w.string().nullable().optional(),correlation_id:w.string().nullable().optional()}),gy=w.object({base_domain:w.string().nullable().optional(),cname:w.string().nullable().optional()}),hy=w.object({serial:w.string().nullable().optional(),stdout:w.string().nullable().optional(),stderr:w.string().nullable().optional(),container_log_base:w.string().nullable().optional()}),Lc=w.object({device_id:w.string(),algorithm_version:w.string(),enabled:w.boolean()}),Nc=w.object({object_type:w.literal("node"),id:w.number().int().nullable().optional(),name:w.string().nullable().optional(),region:w.string().nullable().optional(),device_id:w.string().nullable().optional(),device_ids:w.array(Lc).default([]),ppid:w.string().nullable().optional(),status:w.string().nullable().optional(),version:w.string().nullable().optional()});var Nn=w.object({id:w.string(),name:w.string(),app_id:w.string().nullable().optional(),vm_uuid:w.string().nullable().optional(),instance_id:w.string().nullable().optional(),resource:cy,node_info:Nc.nullable().optional(),os:py.nullable().optional(),kms_type:iy.nullable().optional(),kms_info:dy.nullable().optional(),status:w.string(),in_progress:w.boolean().optional().default(!1),progress:fy.nullable().optional(),compose_hash:w.string().nullable().optional(),docker_compose_hash:w.string().nullable().optional(),pre_launch_script_hash:w.string().nullable().optional(),gateway:gy,logs:hy.optional().default({}),services:w.array(w.record(w.any())).optional().default([]),endpoints:w.array(za).nullable().optional(),public_logs:w.boolean().optional(),public_sysinfo:w.boolean().optional(),public_tcbinfo:w.boolean().optional(),gateway_enabled:w.boolean().optional(),secure_time:w.boolean().optional(),listed:w.boolean().optional().default(!1),storage_fs:w.string().optional(),workspace:qa.nullable().optional(),creator:Ka.nullable().optional(),created_at:w.string().nullable().optional(),deleted_at:w.string().nullable().optional(),project_type:w.string().nullable().optional(),hourly_rate:ly.nullable().optional(),billing_interval:w.string().nullable().optional(),gpu_rental_order:my.nullable().optional()}),Cr=Nn.extend({id:w.string()}),yy=Nn.extend({compose_file:w.union([w.record(w.any()),w.string()]).nullable().optional()}),vy=Cr.extend({compose_file:w.union([w.record(w.any()),w.string()]).nullable().optional()}),Oc=w.object({items:w.array(Nn),total:w.number(),page:w.number(),page_size:w.number(),pages:w.number()}),by=Oc.extend({items:w.array(Cr)});function jc(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 Fc(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 Vc(e,t){function n(s,i){return r(s,i)}async function r(s,i){jc(i);let c=await t(s);return i?.schema===!1?c:(i?.schema||e).parse(c)}function o(s,i){return a(s,i)}async function a(s,i){let c=Fc(i);if(c)return c;let l=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 l.success?i?.schema===!1?{success:!0,data:l.data}:(i?.schema||e).safeParse(l.data):l}return{action:n,safeAction:o}}function L(e,t){function n(s,...i){let[c,l]=i;return r(s,c,l)}async function r(s,i,c){jc(c);let l=await t(s,i);return c?.schema===!1?l:(c?.schema||e).parse(l)}function o(s,...i){let[c,l]=i;return a(s,c,l)}async function a(s,i,c){let l=Fc(c);if(l)return l;let p=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 p.success?c?.schema===!1?{success:!0,data:p.data}:(c?.schema||e).safeParse(p.data):p}return{action:n,safeAction:o}}var Cy=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(),Hc=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(Cy),support_onchain_kms:K.boolean().optional(),fmspc:K.string().nullable().optional(),device_id:K.string().nullable().optional(),device_ids:K.array(Lc).default([]),region_identifier:K.string().nullable().optional(),default_kms:K.string().nullable().optional(),kms_list:K.array(K.string()).default([])}).passthrough(),zc=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(),wy=K.object({tier:K.string(),capacity:zc,nodes:K.array(Hc),kms_list:K.array(mt)}).passthrough(),{action:_y,safeAction:Ut}=Vc(wy,async e=>await e.get("/teepods/available")),On=T.union([T.number(),T.string()]),jn=T.string(),Sy=T.object({has_reserved_gpus:T.boolean(),reserved_gpu_count:T.number(),has_public_gpus:T.boolean(),public_gpu_count:T.number()}).passthrough(),Kc=T.object({id:On,slug:T.string().nullable().optional(),url:T.string(),version:T.string().nullable().optional(),kms_type:T.string(),chain_id:T.number().nullable().optional(),kms_contract_id:On.nullable().optional(),kms_contract_address:T.string().nullable().optional(),gateway_app_id:T.string().nullable().optional(),supported_os_images:T.array(T.string()).default([])}).passthrough(),qc=T.object({teepod_id:T.number(),kms_id:On,kms_type:T.string(),kms_contract_id:On.nullable().optional(),kms_contract_address:T.string().nullable().optional(),supported_os_images:T.array(T.string()).default([])}).passthrough(),Gc=T.object({id:On,teepod_id:T.number().nullable().optional(),kms_contract_id:On,rpc_url:T.string().nullable().optional(),domain_suffix:T.string().nullable().optional(),enabled:T.boolean()}).passthrough(),ky=Kc.extend({id:jn,kms_contract_id:jn.nullable().optional()}),Iy=qc.extend({kms_id:jn,kms_contract_id:jn.nullable().optional()}),Ey=Gc.extend({id:jn,kms_contract_id:jn}),Ay=T.object({id:T.string(),name:T.string(),vcpu:T.number(),memory_mb:T.number(),default_disk_size_gb:T.number(),requires_gpu:T.boolean(),requires_gpu_count:T.number(),family:T.string().nullable().optional(),display_order:T.number().nullable().optional()}).passthrough(),Bc=T.object({tier:T.string(),capacity:zc,nodes:T.array(Hc),kms_nodes:T.array(Kc),node_kms_relations:T.array(qc),gateway_nodes:T.array(Gc),instance_types:T.array(Ay),gpu_availability:Sy}).passthrough(),Ry=Bc.extend({kms_nodes:T.array(ky),node_kms_relations:T.array(Iy),gateway_nodes:T.array(Ey)});function Wc(e){return e==="2026-01-21"?Bc:Ry}async function Py(e,t){let n=await e.get("/teepods/cvm-create-resources");return t?.schema===!1?n:(t?.schema||Wc(e.config.version)).parse(n)}async function xy(e,t){try{let n=await e.get("/teepods/cvm-create-resources");return t?.schema===!1?{success:!0,data:n}:{success:!0,data:(t?.schema||Wc(e.config.version)).parse(n)}}catch(n){return{success:!1,error:n}}}var Jc=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(),$y=Ce.object({name:Ce.string(),items:Ce.array(Jc),total:Ce.number()}).strict(),Ty=Ce.object({result:Ce.array($y)}).strict(),Dy=Ce.object({items:Ce.array(Jc),total:Ce.number(),family:Ce.string()}).strict(),My=Ce.object({family:Ce.string()}).strict(),{action:Ga,safeAction:Uy}=L(Ty,async e=>await e.get("/instance-types")),{action:Ba,safeAction:Ly}=L(Dy,async(e,t)=>{let n=My.parse(t);return await e.get(`/instance-types/${n.family}`)}),Yc=Ae.object({id:Ae.string(),name:Ae.string(),slug:Ae.string().nullable(),avatar_url:Ae.string().nullable().optional(),tier:Ae.string(),role:Ae.string(),is_default:Ae.boolean(),created_at:Ae.string(),confidential_models_enabled:Ae.boolean().optional(),billing_status:Ae.enum(["active","suspended","abandoned"]).default("active"),suspended_at:Ae.string().nullable().optional()}).passthrough(),Ny=Ae.object({has_more:Ae.boolean(),next_cursor:Ae.string().nullable(),total:Ae.number().nullable()}).passthrough(),Oy=Ae.object({data:Ae.array(Yc),pagination:Ny}).passthrough(),{action:jy,safeAction:Fy}=L(Oy,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:Vy,safeAction:Hy}=L(Yc,async(e,t)=>await e.get(`/workspaces/${t}`));function Fn(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 Xc(e){if(typeof e!="string")return eo();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)||!Fn(t)?eo():t}function eo(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,6);return`dstack-app-${e}-${t}`}var He=An.object({id:An.string().optional(),uuid:An.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:An.string().optional(),instance_id:An.string().optional(),name:An.string().refine(Fn,{message:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens"}).optional()}),Ze=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"}),zy=Ze(He),z=zy.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}}),Ky=z;function qy(e){return e==="2025-10-28"?Uc:e==="2026-01-21"?yy:vy}async function Zc(e,t){let{cvmId:n}=Ky.parse(t),r=await e.get(`/cvms/${n}`);return qy(e.config.version).parse(r)}async function G(e,t){try{return{success:!0,data:await Zc(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 Gy=Rn.object({page:Rn.number().int().min(1).optional(),page_size:Rn.number().int().min(1).optional(),family:Rn.enum(["all","cpu","gpu"]).optional(),instance_types:Rn.array(Rn.string()).optional()}).strict();function By(e){return e==="2025-10-28"?ay:e==="2026-01-21"?Oc:by}async function Qc(e,t){let n=Gy.parse(t??{}),r=await e.get("/cvms/paginated",{params:n});return By(e.config.version).parse(r)}async function _r(e,t){try{return{success:!0,data:await Qc(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 wr=200*1024;function el(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>wr){let i=wr/1024,c=Math.ceil(s/1024);n.addIssue({code:ee.ZodIssueCode.custom,message:`Combined size of docker_compose_file and pre_launch_script must not exceed ${i}KB (current: ${c}KB)`})}}var tl=ee.object({allowed_envs:ee.array(ee.string()).optional(),docker_compose_file:ee.string(),features:ee.array(ee.string()).optional(),name:ee.string().optional(),manifest_version:ee.number().optional(),runner:ee.string().optional(),kms_enabled:ee.boolean().optional(),gateway_enabled:ee.boolean().optional(),tproxy_enabled:ee.boolean().optional(),local_key_provider_enabled:ee.boolean().optional(),key_provider:ee.enum(["none","kms","local","tpm"]).optional(),key_provider_id:ee.string().optional(),public_logs:ee.boolean().optional(),public_sysinfo:ee.boolean().optional(),public_tcbinfo:ee.boolean().optional(),no_instance_id:ee.boolean().optional(),secure_time:ee.boolean().optional(),port_policy:ee.object({ports:ee.array(ee.object({port:ee.number().int().min(1).max(65535),pp:ee.boolean()})),restrict_mode:ee.boolean()}).optional(),storage_fs:ee.enum(["ext4","zfs"]).optional(),swap_size:ee.string().optional(),pre_launch_script:ee.string().optional(),env_pubkey:ee.string().optional(),salt:ee.string().optional().nullable()}).passthrough().superRefine((e,t)=>{el(e.docker_compose_file,e.pre_launch_script,t)}),Wy=P.object({app_id:P.string().nullable().optional(),app_env_encrypt_pubkey:P.string().nullable().optional(),compose_hash:P.string(),kms_info:mt.nullable().optional(),fmspc:P.string().nullable().optional(),device_id:P.string().nullable().optional(),os_image_hash:P.string().nullable().optional(),instance_type:P.string().nullable().optional(),teepod_id:P.number().nullable().optional(),node_id:P.number().nullable().optional(),kms_id:P.string().nullable().optional(),kms_contract_id:P.union([P.string(),P.number()]).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}),Ua="Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens",Jy=P.object({node_id:P.number().optional(),teepod_id:P.number().optional(),region:P.string().optional(),name:P.string().min(5,Ua).max(63,Ua).refine(e=>Fn(e),Ua),instance_type:P.string().optional(),image:P.string().optional(),vcpu:P.number().optional(),memory:P.number().optional(),disk_size:P.number().optional(),compose_file:P.object({allowed_envs:P.array(P.string()).optional(),pre_launch_script:P.string().optional(),docker_compose_file:P.string().optional(),name:P.string().optional().default(""),kms_enabled:P.boolean().optional(),gateway_enabled:P.boolean().optional(),tproxy_enabled:P.boolean().optional(),local_key_provider_enabled:P.boolean().optional(),key_provider:P.enum(["none","kms","local","tpm"]).optional(),key_provider_id:P.string().optional(),public_logs:P.boolean().optional(),public_sysinfo:P.boolean().optional(),public_tcbinfo:P.boolean().optional(),no_instance_id:P.boolean().optional(),secure_time:P.boolean().optional(),storage_fs:P.enum(["ext4","zfs"]).optional(),swap_size:P.string().optional(),port_policy:P.object({ports:P.array(P.object({port:P.number(),pp:P.boolean()})),restrict_mode:P.boolean()}).optional()}).passthrough().superRefine((e,t)=>{el(e.docker_compose_file,e.pre_launch_script,t)}),listed:P.boolean().optional(),kms_id:P.string().optional(),kms:P.enum(["PHALA","ETHEREUM","BASE"]).optional(),kms_contract:P.string().optional(),kms_contract_id:P.union([P.string(),P.number()]).optional(),key_provider_mode:P.enum(["kms","local"]).optional(),skip_gateway:P.boolean().optional(),env_keys:P.array(P.string()).optional(),nonce:P.number().optional(),app_id:P.string().optional()}).passthrough().transform(e=>!e.instance_type&&!e.vcpu&&!e.memory?{...e,instance_type:"tdx.small"}:e);function Yy(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:Xy,safeAction:Wa}=L(Wy,async(e,t)=>{let n=Jy.parse(t),r=Yy(n);return typeof r.teepod_id=="number"&&typeof r.node_id!="number"&&console.warn("[phala/cloud] teepod_id is deprecated, please use node_id instead."),await e.post("/cvms/provision",r)}),nl=F.object({name:F.string(),status:F.string(),teepod_id:F.number(),teepod:F.object({id:F.number(),name:F.string()}).nullable(),app_id:F.string().nullable(),vm_uuid:F.string().nullable(),instance_id:F.string().nullable(),app_url:F.string().nullable().default(null),base_image:F.string().nullable(),vcpu:F.number(),memory:F.number(),disk_size:F.number(),manifest_version:F.number().nullable().default(2),version:F.string().nullable().default("1.0.0"),runner:F.string().nullable().default("docker-compose"),docker_compose_file:F.string().nullable(),features:F.array(F.string()).nullable().default(["kms","tproxy-net"]),created_at:F.string(),encrypted_env_pubkey:F.string().nullable().optional(),app_auth_contract_address:F.string().nullable().optional(),deployer_address:F.string().nullable().optional()}).passthrough(),rl=nl.extend({id:F.number(),user_id:F.number().nullable()}),ol=nl.extend({id:F.string(),user_id:F.string().nullable()}),rR=F.union([rl,ol]);var oR=F.object({encrypted_env:F.string().optional().nullable(),app_id:F.string(),compose_hash:F.string(),kms_id:F.string().optional(),kms_contract_id:F.union([F.string(),F.number()]).optional(),contract_address:F.string().optional(),deployer_address:F.string().optional(),env_keys:F.array(F.string()).optional().nullable()}).passthrough();function Zy(e){return e==="2026-01-21"?rl:ol}async function al(e,t){let n=await e.post("/cvms",t);return Zy(e.config.version).parse(n)}async function io(e,t){try{return{success:!0,data:await al(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)}}}}function Fa(e){return e==null?e:Array.isArray(e)?e.map(Fa):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return t[n]=Fa(r),t},{}):e}function sl(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 il(e){let t=Fa(e),n=JSON.stringify(t,null,4);return n=n.replace(/": /g,'":'),n}function ev(e){let t=sl(e),n=il(t);return Qy.createHash("sha256").update(n,"utf8").digest("hex")}function tv(e){let t=e;return{...e,getHash:()=>ev(t),toString:()=>il(sl(t))}}var nv=tl.transform(e=>tv(e)),rv=z,{action:ov,safeAction:av}=L(nv,async(e,t)=>{let{cvmId:n}=rv.parse(t);return await e.get(`/cvms/${n}/compose_file`)}),sv=ct.object({id:ct.string().optional(),uuid:ct.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:ct.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:ct.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:tl,update_env_vars:ct.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})),iv=ct.object({app_id:ct.string().nullable(),device_id:ct.string().nullable(),compose_hash:ct.string(),kms_info:mt.nullable().optional(),compose_hash_registered:ct.boolean().optional().default(!1),compose_unchanged:ct.boolean().optional().default(!1)}).passthrough(),{action:cv,safeAction:lv}=L(iv,async(e,t)=>{let n=sv.parse(t);return await e.post(`/cvms/${n.cvmId}/compose_file/provision`,n.request)}),mv=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(),compose_hash:ft.string().min(1,"Compose hash is required"),encrypted_env:ft.string().optional(),env_keys:ft.array(ft.string()).optional(),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,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})),pv=ft.any().transform(()=>{}),{action:uv,safeAction:dv}=L(pv,async(e,t)=>{let n=mv.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})}),fv=Ze(He.extend({encrypted_env:Te.string().describe("Encrypted environment variables (hex string)"),env_keys:Te.array(Te.string()).optional().describe("List of allowed environment variable keys"),compose_hash:Te.string().optional().describe("Compose hash for verification (Phase 2, required when env_keys changes)"),transaction_hash:Te.string().optional().describe("On-chain transaction hash for verification (Phase 2, required when env_keys changes)")})).transform(e=>{let{cvmId:t}=z.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}}),gv=Te.object({status:Te.literal("in_progress"),message:Te.string(),correlation_id:Te.string(),allowed_envs_changed:Te.boolean()}),hv=Te.object({status:Te.literal("precondition_required"),message:Te.string(),compose_hash:Te.string(),app_id:Te.string(),device_id:Te.string(),kms_info:mt}),yv=Te.union([gv,hv]),{action:vv,safeAction:co}=L(yv,async(e,t)=>{let n=fv.parse(t);try{return await e.patch(`/cvms/${n.cvmId}/envs`,n.request)}catch(r){if(r instanceof lt&&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])),c=i.get("compose_hash"),l=i.get("app_id"),p=i.get("device_id"),u=i.get("kms_info");if(c&&l)return{status:"precondition_required",message:a.message||"Compose hash verification required",compose_hash:c,app_id:l,device_id:p||"",kms_info:u}}}}throw r}}),bv=Ze(He.extend({docker_compose_file:De.string().describe("Docker Compose YAML content"),compose_hash:De.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:De.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=z.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}}),Cv=De.object({status:De.literal("in_progress"),message:De.string(),correlation_id:De.string()}),wv=De.object({status:De.literal("precondition_required"),message:De.string(),compose_hash:De.string(),app_id:De.string(),device_id:De.string(),kms_info:mt}),_v=De.object({status:De.literal("no_change"),message:De.string()}),Sv=De.union([Cv,wv,_v]),{action:kv,safeAction:Iv}=L(Sv,async(e,t)=>{let n=bv.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 lt&&o.status===465){let a=o.detail;if(a&&typeof a=="object"){let s=a,i=s.details;if(i&&Array.isArray(i)){let c=new Map(i.map(d=>[d.field,d.value])),l=c.get("compose_hash"),p=c.get("app_id"),u=c.get("device_id"),f=c.get("kms_info");if(l&&p)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:l,app_id:p,device_id:u||"",kms_info:f}}}}throw o}}),Ev=Ze(He.extend({pre_launch_script:Me.string().describe("Pre-launch script content (shell script)"),compose_hash:Me.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:Me.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=z.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}}),Av=Me.object({status:Me.literal("in_progress"),message:Me.string(),correlation_id:Me.string()}),Rv=Me.object({status:Me.literal("precondition_required"),message:Me.string(),compose_hash:Me.string(),app_id:Me.string(),device_id:Me.string(),kms_info:mt}),Pv=Me.object({status:Me.literal("no_change"),message:Me.string()}),xv=Me.union([Av,Rv,Pv]),{action:$v,safeAction:Tv}=L(xv,async(e,t)=>{let n=Ev.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 lt&&o.status===465){let a=o.detail;if(a&&typeof a=="object"){let s=a,i=s.details;if(i&&Array.isArray(i)){let c=new Map(i.map(d=>[d.field,d.value])),l=c.get("compose_hash"),p=c.get("app_id"),u=c.get("device_id"),f=c.get("kms_info");if(l&&p)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:l,app_id:p,device_id:u||"",kms_info:f}}}}throw o}}),Mv=z,{action:Uv,safeAction:Lv}=L(Dv.string(),async(e,t)=>{let{cvmId:n}=Mv.parse(t);return await e.get(`/cvms/${n}/pre-launch-script`)}),Nv=z,Ov=Pn.object({current_hash:Pn.string().nullable(),latest_official_hash:Pn.string(),is_official:Pn.boolean(),is_latest:Pn.boolean(),can_upgrade:Pn.boolean()}),{action:jv,safeAction:Fv}=L(Ov,async(e,t)=>{let{cvmId:n}=Nv.parse(t);return await e.get(`/cvms/${n}/pre-launch-script/upgrade-status`)}),Vv=Ze(He.extend({compose_hash:rt.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:rt.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=z.parse(e);return{cvmId:t,request:{compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),Hv=rt.object({status:rt.literal("in_progress"),message:rt.string(),correlation_id:rt.string()}),zv=rt.object({status:rt.literal("precondition_required"),message:rt.string(),compose_hash:rt.string(),app_id:rt.string(),device_id:rt.string(),kms_info:mt}),Kv=rt.union([Hv,zv]),{action:qv,safeAction:Gv}=L(Kv,async(e,t)=>{let n=Vv.parse(t),r={};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.post(`/cvms/${n.cvmId}/pre-launch-script/upgrade-to-latest-official`,void 0,{headers:r})}catch(o){if(o instanceof lt&&o.status===465){let a=o.detail;if(a&&typeof a=="object"){let s=a,i=s.details;if(i&&Array.isArray(i)){let c=new Map(i.map(d=>[d.field,d.value])),l=c.get("compose_hash"),p=c.get("app_id"),u=c.get("device_id"),f=c.get("kms_info");if(l&&p)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:l,app_id:p,device_id:u||"",kms_info:f}}}}throw o}}),Bv=ic.object({kms_id:ic.string().min(1,"KMS ID is required")}),{action:Wv,safeAction:Jv}=L(mt,async(e,t)=>{let n=Bv.parse(t);return await e.get(`/kms/${n.kms_id}`,{headers:{"X-Phala-Version":"2026-05-22"}})}),Yv=kt.object({page:kt.number().int().min(1).optional(),page_size:kt.number().int().min(1).optional(),is_onchain:kt.boolean().optional()}).strict(),Xv=kt.object({items:kt.array(mt),total:kt.number(),page:kt.number(),page_size:kt.number(),pages:kt.number()}).strict(),{action:Zv,safeAction:Qv}=L(Xv,async(e,t)=>{let n=Yv.parse(t??{});return await e.get("/kms",{params:n,headers:{"X-Phala-Version":"2026-05-22"}})}),cl=Ge.object({id:Ge.string(),slug:Ge.string().nullable(),label:Ge.string().nullable(),contract_address:Ge.string(),chain_id:Ge.number(),k256_pubkey:Ge.string().nullable(),ca_pubkey:Ge.string().nullable(),node_count:Ge.number()}).passthrough(),eb=Ge.object({id:Ge.string(),slug:Ge.string().nullable(),url:Ge.string(),version:Ge.string(),kms_type:Ge.string()}).passthrough(),tb="2026-06-23",nb=It.object({page:It.number().int().min(1).optional(),page_size:It.number().int().min(1).optional(),is_onchain:It.boolean().optional()}).strict(),rb=It.object({items:It.array(cl),total:It.number(),page:It.number(),page_size:It.number(),pages:It.number()}).strict(),{action:ob,safeAction:Ja}=L(rb,async(e,t)=>{let n=nb.parse(t??{});return await e.get("/kms",{params:n,headers:{"X-Phala-Version":tb}})}),ab="2026-06-23",sb=cc.object({slug:cc.string().min(1,"KMS contract slug is required")}).strict(),{action:ib,safeAction:Ya}=L(cl,async(e,t)=>{let{slug:n}=sb.parse(t);return await e.get(`/kms/${n}`,{headers:{"X-Phala-Version":ab}})}),cb="2026-06-23",lb=vr.object({slug:vr.string().min(1,"KMS contract slug is required")}).strict(),mb=vr.object({items:vr.array(eb),total:vr.number()}).strict(),{action:pb,safeAction:Xa}=L(mb,async(e,t)=>{let{slug:n}=lb.parse(t);return await e.get(`/kms/${n}/nodes`,{headers:{"X-Phala-Version":cb}})}),ub=Un.object({kms:Un.string().min(1,"KMS ID or slug is required"),app_id:Un.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(),db=Un.object({public_key:Un.string(),signature:Un.string()}).strict(),{action:fb,safeAction:Vn}=L(db,async(e,t)=>{let n=ub.parse(t);return await e.get(`/kms/${n.kms}/pubkey/${n.app_id}`,{headers:{"X-Phala-Version":"2026-05-22"}})}),gb=ln.object({counts:ln.number().int().min(1).max(20).optional().default(1)}).strict(),hb=ln.object({app_ids:ln.array(ln.object({app_id:ln.string(),nonce:ln.number().int().min(0)}))}).strict(),{action:yb,safeAction:vb}=L(hb,async(e,t)=>{let n=gb.parse(t??{}),r=new URLSearchParams;return r.append("counts",n.counts.toString()),await e.get(`/kms/phala/next_app_id?${r.toString()}`)}),ll=se.object({name:se.string(),status:se.string(),teepod_id:se.number(),teepod:se.object({id:se.number(),name:se.string(),region_identifier:se.string().nullable().optional()}).optional().nullable(),app_id:se.string(),vm_uuid:se.string().nullable(),instance_id:se.string().nullable(),app_url:se.string().optional().nullable(),base_image:se.string().optional().nullable(),vcpu:se.number(),memory:se.number(),disk_size:se.number(),manifest_version:se.number().optional().nullable(),version:se.string().optional().nullable(),runner:se.string().optional().nullable(),docker_compose_file:se.string().optional().nullable(),features:se.array(se.string()).optional().nullable(),created_at:se.string(),encrypted_env_pubkey:se.string().nullable()}),ml=ll.extend({id:se.number(),user_id:se.number().optional().nullable()}),Za=ll.extend({id:se.string(),user_id:se.string().optional().nullable()}),SR=se.union([ml,Za]),bb=Za;function lo(e){return e==="2026-01-21"?ml:Za}var Cb=z;async function pl(e,t){let{cvmId:n}=Cb.parse(t),r=await e.post(`/cvms/${n}/start`);return lo(e.config.version).parse(r)}async function Qa(e,t){try{return{success:!0,data:await pl(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 wb=z;async function ul(e,t){let{cvmId:n}=wb.parse(t),r=await e.post(`/cvms/${n}/stop`);return lo(e.config.version).parse(r)}async function es(e,t){try{return{success:!0,data:await ul(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 _b=z;async function dl(e,t){let{cvmId:n}=_b.parse(t),r=await e.post(`/cvms/${n}/shutdown`);return lo(e.config.version).parse(r)}async function Sb(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 Ib=Ze(He.extend({force:kb.boolean().optional()}));async function fl(e,t){let n=Ib.parse(t),{cvmId:r}=z.parse(n),{force:o=!1}=n,a=await e.post(`/cvms/${r}/restart`,{force:o});return lo(e.config.version).parse(a)}async function ts(e,t){try{return{success:!0,data:await fl(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 Ab=z,{action:Rb,safeAction:Sr}=L(Eb.void(),async(e,t)=>{let{cvmId:n}=Ab.parse(t);await e.delete(`/cvms/${n}`)}),Pb=re.object({name:re.string(),mount_point:re.string(),total_size:re.number(),free_size:re.number()}),xb=re.object({os_name:re.string(),os_version:re.string(),kernel_version:re.string(),cpu_model:re.string(),num_cpus:re.number(),total_memory:re.number(),available_memory:re.number(),used_memory:re.number(),free_memory:re.number(),total_swap:re.number(),used_swap:re.number(),free_swap:re.number(),uptime:re.number(),loadavg_one:re.number(),loadavg_five:re.number(),loadavg_fifteen:re.number(),disks:re.array(Pb)}),$b=re.object({is_online:re.boolean(),is_public:re.boolean().default(!1),error:re.string().nullable(),sysinfo:xb.nullable(),status:re.string().nullable(),in_progress:re.boolean().default(!1),boot_progress:re.string().nullable(),boot_error:re.string().nullable()}),Tb=z,{action:Db,safeAction:Mb}=L($b,async(e,t)=>{let{cvmId:n}=Tb.parse(t);return await e.get(`/cvms/${n}/stats`)}),Ub=_t.object({app:_t.string(),instance:_t.string()}),Lb=_t.object({is_online:_t.boolean(),is_public:_t.boolean().default(!0),error:_t.string().nullable(),internal_ip:_t.string().nullable(),latest_handshake:_t.string().nullable(),public_urls:_t.array(Ub).nullable()}),Nb=z,{action:Ob,safeAction:jb}=L(Lb,async(e,t)=>{let{cvmId:n}=Nb.parse(t);return await e.get(`/cvms/${n}/network`)}),Vb=z,{action:Hb,safeAction:zb}=L(Fb.string(),async(e,t)=>{let{cvmId:n}=Vb.parse(t);return await e.get(`/cvms/${n}/docker-compose.yml`)}),Kb=be.object({id:be.string(),names:be.array(be.string()),image:be.string(),image_id:be.string(),command:be.string().nullable().optional(),created:be.number(),state:be.string(),status:be.string(),log_endpoint:be.string().nullable()}),qb=be.object({is_online:be.boolean(),is_public:be.boolean().default(!0),error:be.string().nullable(),docker_compose_file:be.string().nullable(),manifest_version:be.number().nullable(),version:be.string().nullable(),runner:be.string().nullable(),features:be.array(be.string()).nullable(),containers:be.array(Kb).nullable()}),Gb=z,{action:Bb,safeAction:ns}=L(qb,async(e,t)=>{let{cvmId:n}=Gb.parse(t);return await e.get(`/cvms/${n}/composition`)}),Wb=N.object({common_name:N.string().nullable(),organization:N.string().nullable(),country:N.string().nullable(),state:N.string().nullable(),locality:N.string().nullable()}),Jb=N.object({common_name:N.string().nullable(),organization:N.string().nullable(),country:N.string().nullable()}),gl=N.object({subject:Wb,issuer:Jb,serial_number:N.string(),not_before:N.string(),not_after:N.string(),version:N.string(),fingerprint:N.string(),signature_algorithm:N.string(),sans:N.array(N.string()).nullable(),is_ca:N.boolean(),position_in_chain:N.number().nullable(),quote:N.string().nullable(),app_id:N.string().nullable().optional(),cert_usage:N.string().nullable().optional()}),Yb=N.object({imr:N.number(),event_type:N.number(),digest:N.string(),event:N.string(),event_payload:N.string()}),hl=N.object({mrtd:N.string(),rootfs_hash:N.string().nullable().optional(),rtmr0:N.string(),rtmr1:N.string(),rtmr2:N.string(),rtmr3:N.string(),event_log:N.array(Yb),app_compose:N.string()}),Xb=N.object({name:N.string().nullable(),is_online:N.boolean(),is_public:N.boolean().default(!0),error:N.string().nullable(),app_certificates:N.array(gl).nullable(),tcb_info:hl.nullable(),compose_file:N.string().nullable()}),Zb=z,{action:Qb,safeAction:eC}=L(Xb,async(e,t)=>{let{cvmId:n}=Zb.parse(t);return await e.get(`/cvms/${n}/attestation`)}),tC=Ze(He.extend({vcpu:Mt.number().optional(),memory:Mt.number().optional(),disk_size:Mt.number().optional(),instance_type:Mt.string().optional(),allow_restart:Mt.boolean().optional()})),nC=Mt.object({message:Mt.string(),correlation_id:Mt.string(),status:Mt.string()}),{action:rC,safeAction:oC}=L(nC,async(e,t)=>{let n=tC.parse(t),{cvmId:r}=z.parse(n),{...o}=n;return await e.patch(`/cvms/${r}`,o)}),aC=Ze(He.extend({public_sysinfo:La.boolean(),public_logs:La.boolean(),public_tcbinfo:La.boolean().optional()})),{action:sC,safeAction:iC}=L(Uc,async(e,t)=>{let n=aC.parse(t),{cvmId:r}=z.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})}),lc=Fe.object({name:Fe.string(),os_image_hash:Fe.string().nullable(),is_current:Fe.boolean()}),cC=Fe.object({version:Fe.union([Fe.tuple([Fe.number(),Fe.number(),Fe.number(),Fe.number()]),Fe.tuple([Fe.number(),Fe.number(),Fe.number()])]),prod:lc.nullable(),dev:lc.nullable()}),lC=Fe.array(cC),mC=z,{action:pC,safeAction:uC}=L(lC,async(e,t)=>{let{cvmId:n}=mC.parse(t);return await e.get(`/cvms/${n}/available-os-images`)}),dC=Ze(He.extend({os_image_name:yl.string().min(1,"OS image name is required")})),{action:fC,safeAction:gC}=L(yl.void(),async(e,t)=>{let n=dC.parse(t),{cvmId:r}=z.parse(n),{os_image_name:o}=n;await e.patch(`/cvms/${r}/os-image`,{os_image_name:o})}),hC=Ct.object({id:Ct.string().optional(),instance_id:Ct.string().optional(),name:Ct.string(),status:Ct.string(),uptime:Ct.string().optional(),exited_at:Ct.string().optional(),boot_progress:Ct.string().optional(),boot_error:Ct.string().optional(),shutdown_progress:Ct.string().optional()}),yC=z,{action:vC,safeAction:bC}=L(hC,async(e,t)=>{let{cvmId:n}=yC.parse(t);return await e.get(`/cvms/${n}/state`)}),vl=Xe.object({id:Xe.string(),user_id:Xe.string(),name:Xe.string(),public_key:Xe.string(),fingerprint:Xe.string(),key_type:Xe.string(),source:Xe.string(),key_metadata:Xe.record(Xe.unknown()).nullable().optional(),last_synced_at:Xe.string().nullable().optional(),created_at:Xe.string(),updated_at:Xe.string()}),CC=Xe.array(vl);async function bl(e){let t=await e.get("/user/ssh-keys");return CC.parse(t)}async function kr(e){try{return{success:!0,data:await bl(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 wC=Gt.object({github_username:Gt.string().min(1)}),_C=Gt.object({github_username:Gt.string(),keys_added:Gt.number().int(),keys_skipped:Gt.number().int(),errors:Gt.array(Gt.string()).default([])}),{action:SC,safeAction:rs}=L(_C,async(e,t)=>{let{github_username:n}=wC.parse(t);return await e.post("/user/ssh-keys/github-profile",{github_username:n})}),kC=Na.object({name:Na.string().min(1),public_key:Na.string().min(1)}),{action:IC,safeAction:os}=L(vl,async(e,t)=>{let{name:n,public_key:r}=kC.parse(t);return await e.post("/user/ssh-keys",{name:n,public_key:r})}),EC=Va.object({keyId:Va.string().min(1)}),{action:AC,safeAction:as}=L(Va.void(),async(e,t)=>{let{keyId:n}=EC.parse(t);await e.delete(`/user/ssh-keys/${n}`)}),RC=cn.object({synced_count:cn.number().int(),keys_added:cn.number().int(),keys_updated:cn.number().int(),keys_removed:cn.number().int(),errors:cn.array(cn.string()).default([])}),{action:PC,safeAction:xC}=Vc(RC,async e=>await e.post("/user/ssh-keys/github-sync",{})),$C=$e.object({name:$e.string(),slug:$e.string(),version:$e.string(),os_image_hash:$e.string().nullable(),is_dev:$e.boolean(),requires_gpu:$e.boolean()}).passthrough(),TC=$e.object({page:$e.number().int().min(1).optional(),page_size:$e.number().int().min(1).optional(),is_dev:$e.boolean().optional()}).strict(),DC=$e.object({items:$e.array($C),total:$e.number(),page:$e.number(),page_size:$e.number(),pages:$e.number()}).passthrough(),{action:MC,safeAction:ss}=L(DC,async(e,t)=>{let n=TC.parse(t??{});return await e.get("/os-images",{params:n})}),UC=pe.object({device_id:pe.string(),node_name:pe.string().nullable().optional(),on_chain_allowed:pe.boolean().nullable()}).passthrough(),LC=pe.object({name:pe.string(),version:pe.string(),os_image_hash:pe.string().nullable(),on_chain_allowed:pe.boolean().nullable()}).passthrough(),NC=pe.object({contract_address:pe.string(),chain_id:pe.number(),chain_name:pe.string(),k256_pubkey:pe.string().nullable().optional(),ca_pubkey:pe.string().nullable().optional(),gateway_contract_address:pe.string().nullable().optional(),devices:pe.array(UC),os_images:pe.array(LC)}).passthrough(),OC=pe.object({chain_name:pe.string(),chain_id:pe.number(),contracts:pe.array(NC)}).passthrough(),jC=pe.object({chain:pe.string()}).strict(),{action:FC,safeAction:is}=L(OC,async(e,t)=>{let{chain:n}=jC.parse(t);return await e.get(`/kms/on-chain/${n}`)});function ot(e={}){let t=Jh(e),n={getCurrentUser:$c,safeGetCurrentUser:Ve,getAvailableNodes:_y,safeGetAvailableNodes:Ut,getCvmCreateResources:Py,safeGetCvmCreateResources:xy,listAllInstanceTypeFamilies:Ga,safeListAllInstanceTypeFamilies:Uy,listFamilyInstanceTypes:Ba,safeListFamilyInstanceTypes:Ly,listWorkspaces:jy,safeListWorkspaces:Fy,getWorkspace:Vy,safeGetWorkspace:Hy,getCvmInfo:Zc,safeGetCvmInfo:G,getCvmList:Qc,safeGetCvmList:_r,provisionCvm:Xy,safeProvisionCvm:Wa,commitCvmProvision:al,safeCommitCvmProvision:io,getCvmComposeFile:ov,safeGetCvmComposeFile:av,provisionCvmComposeFileUpdate:cv,safeProvisionCvmComposeFileUpdate:lv,commitCvmComposeFileUpdate:uv,safeCommitCvmComposeFileUpdate:dv,updateCvmEnvs:vv,safeUpdateCvmEnvs:co,updateDockerCompose:kv,safeUpdateDockerCompose:Iv,updatePreLaunchScript:$v,safeUpdatePreLaunchScript:Tv,getCvmPreLaunchScript:Uv,safeGetCvmPreLaunchScript:Lv,getPreLaunchScriptUpgradeStatus:jv,safeGetPreLaunchScriptUpgradeStatus:Fv,upgradePreLaunchScript:qv,safeUpgradePreLaunchScript:Gv,startCvm:pl,safeStartCvm:Qa,stopCvm:ul,safeStopCvm:es,shutdownCvm:dl,safeShutdownCvm:Sb,restartCvm:fl,safeRestartCvm:ts,deleteCvm:Rb,safeDeleteCvm:Sr,getCvmStats:Db,safeGetCvmStats:Mb,getCvmNetwork:Ob,safeGetCvmNetwork:jb,getCvmDockerCompose:Hb,safeGetCvmDockerCompose:zb,getCvmContainersStats:Bb,safeGetCvmContainersStats:ns,getCvmAttestation:Qb,safeGetCvmAttestation:eC,updateCvmResources:rC,safeUpdateCvmResources:oC,updateCvmVisibility:sC,safeUpdateCvmVisibility:iC,getAvailableOsImages:pC,safeGetAvailableOsImages:uC,updateOsImage:fC,safeUpdateOsImage:gC,getKmsInfo:Wv,safeGetKmsInfo:Jv,getKmsList:Zv,safeGetKmsList:Qv,listKmsContracts:ob,safeListKmsContracts:Ja,getKmsContract:ib,safeGetKmsContract:Ya,listKmsContractNodes:pb,safeListKmsContractNodes:Xa,getAppEnvEncryptPubKey:fb,safeGetAppEnvEncryptPubKey:Vn,nextAppIds:yb,safeNextAppIds:vb,getCvmState:vC,safeGetCvmState:bC,listSshKeys:bl,safeListSshKeys:kr,importGithubProfileSshKeys:SC,safeImportGithubProfileSshKeys:rs,createSshKey:IC,safeCreateSshKey:os,deleteSshKey:AC,safeDeleteSshKey:as,syncGithubSshKeys:PC,safeSyncGithubSshKeys:xC,getOsImages:MC,safeGetOsImages:ss,getKmsOnChainDetail:FC,safeGetKmsOnChainDetail:is};return t.extend(n)}var mc=H.object({vm_uuid:H.string().nullable(),app_id:H.string(),name:H.string().default(""),status:H.string(),vcpu:H.number().int(),memory:H.number().int(),disk_size:H.number().int(),teepod_id:H.number().int(),teepod_name:H.string(),region_identifier:H.string().nullable().optional(),kms_type:H.string().nullable().optional(),instance_type:H.string().nullable().optional(),listed:H.boolean().nullable().optional(),base_image:H.string().nullable().optional(),kms_slug:H.string().nullable().optional(),kms_id:H.string().nullable().optional(),kms_contract_id:H.string().nullable().optional(),instance_id:H.string().nullable().optional(),machine_info:Ha.nullable().optional(),updated_at:H.string().nullable().optional()}),VC=H.object({display_name:H.string().nullable().optional(),avatar_url:H.string().nullable().optional(),description:H.string().nullable().optional(),custom_domain:H.string().nullable().optional()}),HC=H.object({id:H.string(),name:H.string(),app_id:H.string(),app_provision_type:H.string().nullable().optional(),app_icon_url:H.string().nullable().optional(),created_at:H.string(),kms_type:H.string(),profile:VC.nullable().optional(),current_cvm:mc.nullable().optional(),cvms:H.array(mc).default([]),cvm_count:H.number().int().default(0)}),Cl=HC,zC=H.object({dstack_apps:H.array(Cl),page:H.number().int(),page_size:H.number().int(),total:H.number().int(),total_pages:H.number().int()}),wl=de.object({id:de.string(),name:de.string(),app_id:de.string(),app_provision_type:de.string().nullable().optional(),app_icon_url:de.string().nullable().optional(),created_at:de.string(),kms_type:de.string(),profile:de.object({display_name:de.string().nullable().optional(),avatar_url:de.string().nullable().optional(),description:de.string().nullable().optional(),custom_domain:de.string().nullable().optional()}).nullable().optional(),current_cvm:Nn.nullable().optional(),cvms:de.array(Nn).default([]),cvm_count:de.number().int().default(0)}),KC=wl.extend({current_cvm:Cr.nullable().optional(),cvms:de.array(Cr).default([])}),_l=wl,Sl=KC,kl=de.object({dstack_apps:de.array(_l),page:de.number().int(),page_size:de.number().int(),total:de.number().int(),total_pages:de.number().int()}),qC=kl.extend({dstack_apps:de.array(Sl)}),Il=Y.object({object_type:Y.literal("cvm"),id:Y.string().nullable().optional(),name:Y.string().nullable().optional(),app_id:Y.string().nullable().optional(),vm_uuid:Y.string().nullable().optional()}),GC=Y.object({revision_id:Y.string(),app_id:Y.string(),vm_uuid:Y.string(),compose_hash:Y.string(),created_at:Y.string(),trace_id:Y.string().nullable().optional(),operation_type:Y.string(),triggered_by:Ka.nullable().optional(),cvm:Il.nullable().optional(),workspace:qa.nullable().optional()}),GR=Y.object({revision_id:Y.string(),app_id:Y.string(),vm_uuid:Y.string(),compose_hash:Y.string(),compose_file:Y.union([Y.record(Y.any()),Y.string()]).nullable().optional(),encrypted_env:Y.string(),user_config:Y.string(),created_at:Y.string(),trace_id:Y.string().nullable().optional(),operation_type:Y.string(),triggered_by:Ka.nullable().optional(),cvm:Il.nullable().optional(),workspace:qa.nullable().optional()}),BR=Y.object({revisions:Y.array(GC),total:Y.number().int(),page:Y.number().int(),page_size:Y.number().int(),total_pages:Y.number().int()}),ZC=48,QC={none:0,local:1,kms:2,tpm:3};function El(e){let t=to(e.compose_hash),n=to(e.app_id),r=QC[e.key_provider_type],o=e.key_provider_id==="0x"?new Uint8Array(0):to(e.key_provider_id),a=new Uint8Array(t.length+n.length+1+o.length),s=0;a.set(t,s),s+=t.length,a.set(n,s),s+=n.length,a[s]=r,s+=1,a.set(o,s);let i=YC(a),c=to(i),l=new Uint8Array(ZC);return l[0]=2,l.set(c,1),XC(l)}function ht(e){if(typeof e=="string"){if(e.startsWith("0x")&&dc(e))return e;if(dc(`0x${e}`))return`0x${e}`}throw new Error(`Invalid hex value: ${e}`)}var Al=class extends Error{constructor(e,t,n){super(e),this.code=t,this.details=n,this.name="NetworkError"}};var St=class extends Error{constructor(e,t,n){super(e),this.hash=t,this.details=n,this.name="TransactionError"}};async function ew(e,t){try{let n=await e.walletClient.getChainId();return{isCorrectNetwork:n===t,currentChainId:n}}catch(n){throw new Al(`Failed to check network status: ${n instanceof Error?n.message:"Unknown error"}`,"NETWORK_CHECK_FAILED",n)}}async function tw(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 Al(`Failed to check balance: ${r instanceof Error?r.message:"Unknown error"}`,"BALANCE_CHECK_FAILED",r)}}async function nw(e,t,n={}){let{timeout:r=6e4,pollingInterval:o=2e3,confirmations:a=1}=n,s=Date.now();return new Promise((i,c)=>{let l=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>=r){c(new St(`Transaction confirmation timeout after ${r}ms`,t));return}setTimeout(l,o);return}i(p)}else{if(Date.now()-s>=r){c(new St(`Transaction receipt timeout after ${r}ms`,t));return}setTimeout(l,o)}}catch(p){if(Date.now()-s>=r){c(new St(`Transaction receipt timeout after ${r}ms`,t,p));return}setTimeout(l,o)}};l()})}async function Ir(e,t){let{targetChainId:n,minBalance:r,requiredAddress:o}=t,a=await ew(e,n),s=await tw(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 Hn(){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,c,l,p={})=>{let{timeout:u=6e4,confirmations:f=1,onSubmitted:d,onConfirmed:h,onError:g,signal:y}=p;try{if(o(),n=new AbortController,y){if(y.aborted)throw new St("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 St("Transaction aborted");let k=await i(c,...l);if(n.signal.aborted)throw new St("Transaction aborted after submission",k);r({state:"pending",hash:k,submitTime:Date.now()}),d?.(k),u>0&&(t=setTimeout(()=>{e.state==="pending"&&!n?.signal.aborted&&r({state:"timeout",error:`Transaction timeout after ${u}ms`})},u));let _=await Promise.race([nw(c.publicClient,k,{timeout:u,confirmations:f}),new Promise((S,b)=>{n?.signal.addEventListener("abort",()=>{b(new St("Transaction aborted while waiting for receipt",k))})})]);t&&(clearTimeout(t),t=void 0);let E=_.status==="success";if(r({state:E?"success":"error",receipt:_,confirmTime:Date.now(),error:E?void 0:"Transaction failed on-chain"}),E)h?.(_);else{let S=new St("Transaction failed on-chain",k,_);throw g?.(S,k),S}return{hash:k,receipt:_,success:E}}catch(k){let _=k instanceof St?k:new St(`Transaction execution failed: ${k instanceof Error?k.message:"Unknown error"}`,e.hash,k);throw r({state:"error",error:_.message}),g?.(_,e.hash),_}}}}async function Er(e,t,n,r={},o={}){let{maxRetries:a=3,initialDelay:s=1e3,maxDelay:i=1e4,backoffFactor:c=2,retryCondition:l=()=>!0}=o,p,u=s;for(let f=0;f<=a;f++)try{return await Hn().execute(e,t,n,r)}catch(d){if(p=d instanceof Error?d:new Error(String(d)),f===a||!l(p))break;await new Promise(h=>setTimeout(h,u)),u=Math.min(u*c,i)}throw p}var Rl=[{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}],rw=_e.object({chain:_e.unknown().optional(),rpcUrl:_e.string().optional(),kmsContractAddress:_e.string(),privateKey:_e.string().optional(),walletClient:_e.unknown().optional(),publicClient:_e.unknown().optional(),allowAnyDevice:_e.boolean().optional().default(!1),deviceId:_e.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),composeHash:_e.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),disableUpgrades:_e.boolean().optional().default(!1),skipPrerequisiteChecks:_e.boolean().optional().default(!1),minBalance:_e.string().optional()}).passthrough(),ow=rw.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=_e.object({appId:_e.string(),appAuthAddress:_e.string(),deployer:_e.string(),transactionHash:_e.string(),blockNumber:_e.bigint().optional(),gasUsed:_e.bigint().optional()}).passthrough();function sw(e,t,n){try{let r=WC({abi:Rl,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 iw(e,t){let n=ow.parse(e),{chain:r,rpcUrl:o,kmsContractAddress:a,privateKey:s,walletClient:i,publicClient:c,allowAnyDevice:l=!1,deviceId:p="0000000000000000000000000000000000000000000000000000000000000000",composeHash:u="0000000000000000000000000000000000000000000000000000000000000000",disableUpgrades:f=!1,skipPrerequisiteChecks:d=!1,minBalance:h,timeout:g=12e4,retryOptions:y,signal:k,onTransactionStateChange:_,onTransactionSubmitted:E,onTransactionConfirmed:S}=n,b="0000000000000000000000000000000000000000000000000000000000000000",x=p!==b&&p!=="0x"+b?!1:l,U,M,J,ce;if(s){let we=JC(s);if(c){if(typeof c!="object"||!c)throw new Error("publicClient is invalid");U=c}else{if(!r)throw new Error("Chain required for publicClient");U=pc({chain:r,transport:Oa(o)})}if(!r)throw new Error("Chain required for walletClient");M=BC({account:we,chain:r,transport:Oa(o)}),J=we.address,ce=r.id}else if(i){if(typeof i!="object"||!i)throw new Error("walletClient is invalid");if(M=i,c){if(typeof c!="object"||!c)throw new Error("publicClient is invalid");U=c}else{if(!r)throw new Error("Chain required for publicClient");U=pc({chain:r,transport:Oa(o)})}if(!M.account?.address)throw new Error("WalletClient needs an account");J=M.account.address,r?ce=r.id:ce=await M.getChainId()}else throw new Error("Need privateKey or walletClient");let Z={publicClient:U,walletClient:M,address:J,chainId:ce},Q=Hn();if(_&&typeof _=="function"){let we=()=>{_(Q.status),Q.isComplete||setTimeout(we,100)};setTimeout(we,10)}if(!d){let we={targetChainId:ce,minBalance:h?uc(h):uc("0.001")},ae=await Ir(Z,we);if(!ae.networkValid)throw new Error(`Wrong network. Need chain ${we.targetChainId}, got ${ae.details.currentChainId}`);if(!ae.balanceValid){let Ke=Number(we.minBalance)/1e18,Ug=Number(ae.details.balance)/1e18;throw new Error(`Not enough ETH. Need ${Ke}, have ${Ug.toFixed(6)}`)}}let $=ht(p),B=ht(u),Pe=`0x${$.slice(2).padEnd(64,"0")}`,Tt=`0x${B.slice(2).padEnd(64,"0")}`,Kt=async we=>{try{let Ke=await we.publicClient.getCode({address:a});if(!Ke||Ke==="0x")throw new Error(`No contract at ${a}`)}catch(Ke){if(Ke instanceof Error&&Ke.message.includes("No contract at"))throw Ke}let ae={address:a,abi:Rl,functionName:"deployAndRegisterApp",args:[we.address,f,x,Pe,Tt],account:we.walletClient.account||we.address,chain:r||null};return await we.walletClient.writeContract(ae)},Sa=y?await Er(Kt,Z,[],{timeout:g,confirmations:1,onSubmitted:E,onConfirmed:S,signal:k},y):await Q.execute(Kt,Z,[],{timeout:g,confirmations:1,onSubmitted:E,onConfirmed:S,signal:k}),Gr=sw(Sa.receipt,J,a);return t?.schema===!1?Gr:(t?.schema||aw).parse(Gr)}async function Pl(e,t){try{return{success:!0,data:await iw(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 xl=[{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}],pw=ge.object({chain:ge.unknown().optional(),rpcUrl:ge.string().optional(),appId:ge.string(),composeHash: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=>{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"]}),uw=ge.object({composeHash:ge.string(),appId:ge.string(),transactionHash:ge.string(),blockNumber:ge.bigint().optional(),gasUsed:ge.bigint().optional()}).passthrough();function dw(e,t,n,r){console.log(e.logs);try{let o=lw({abi:xl,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 fw(e,t){let n=pw.parse(e),{chain:r,rpcUrl:o,appId:a,composeHash:s,privateKey:i,walletClient:c,publicClient:l,timeout:p=12e4,retryOptions:u,signal:f,onTransactionStateChange:d,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,_,E,S,b,I=a.startsWith("0x")?a:`0x${a}`;if(i){let $=mw(i);if(l)_=l;else{if(!r)throw new Error("Chain required when creating publicClient");_=fc({chain:r,transport:ja(o)})}if(!r)throw new Error("Chain required when creating walletClient");E=cw({account:$,chain:r,transport:ja(o)}),S=$.address,b=r.id}else if(c){if(E=c,l)_=l;else{if(!r)throw new Error("Chain required when creating publicClient");_=fc({chain:r,transport:ja(o)})}if(!E.account?.address)throw new Error("WalletClient must have an account with address");S=E.account.address,b=r?r.id:await E.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let x={publicClient:_,walletClient:E,address:S,chainId:b},U=Hn();if(d&&typeof d=="function"){let $=()=>{d(U.status),U.isComplete||setTimeout($,100)};setTimeout($,10)}if(!y){let $={targetChainId:b,minBalance:k?gc(k):gc("0.001")},B=await Ir(x,$);if(!B.networkValid)throw new Error(`Network mismatch: Expected chain ${$.targetChainId}, but wallet is on chain ${B.details.currentChainId}`);if(!B.balanceValid){let Pe=Number($.minBalance)/1e18,Tt=Number(B.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Pe} ETH, but account has ${Tt.toFixed(6)} ETH`)}}let M=await _.readContract({address:I,abi:[{inputs:[],name:"owner",outputs:[{type:"address"}],stateMutability:"view",type:"function"}],functionName:"owner"});if(M.toLowerCase()!==S.toLowerCase())throw new Error(`Sender ${S} is not the owner of contract ${I}. Contract owner is ${M}.`);let J=async $=>await $.walletClient.writeContract({address:I,abi:xl,functionName:"addComposeHash",args:[ht(s)],account:$.walletClient.account||$.address,chain:r||null}),ce=u?await Er(J,x,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},u):await U.execute(J,x,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),Z=dw(ce.receipt,ht(s),I,a);return t?.schema===!1?Z:(t?.schema||uw).parse(Z)}async function Wt(e,t){try{return{success:!0,data:await fw(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 Et=[{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"}],yw=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"]}),vw=he.object({appAddress:he.string(),deviceId:he.string(),transactionHash:he.string(),blockNumber:he.bigint().optional(),gasUsed:he.bigint().optional()}).passthrough();async function bw(e,t){let n=yw.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:c,publicClient:l,timeout:p=12e4,retryOptions:u,signal:f,onTransactionStateChange:d,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,_=a.startsWith("0x")?a:`0x${a}`,E=ht(s),S,b,I,x;if(i){let B=hw(i),Pe=yc(o,{timeout:p});S=l||hc({chain:r,transport:Pe}),b=gw({account:B,chain:r,transport:Pe}),I=B.address,x=r.id}else if(c){if(b=c,S=l||hc({chain:r,transport:yc(o,{timeout:p})}),!b.account?.address)throw new Error("WalletClient must have an account with address");I=b.account.address,x=r?r.id:await b.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let U={publicClient:S,walletClient:b,address:I,chainId:x},M=Hn();if(d&&typeof d=="function"){let B=()=>{d(M.status),M.isComplete||setTimeout(B,100)};setTimeout(B,10)}if(!y){let B={targetChainId:x,minBalance:k?vc(k):vc("0.001")},Pe=await Ir(U,B);if(!Pe.networkValid)throw new Error(`Network mismatch: Expected chain ${B.targetChainId}, but wallet is on chain ${Pe.details.currentChainId}`);if(!Pe.balanceValid){let Tt=Number(B.minBalance)/1e18,Kt=Number(Pe.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Tt} ETH, but account has ${Kt.toFixed(6)} ETH`)}}let J=await S.readContract({address:_,abi:Et,functionName:"owner"});if(J.toLowerCase()!==I.toLowerCase())throw new Error(`Sender ${I} is not the owner of contract ${_}. Contract owner is ${J}.`);let ce=async B=>B.walletClient.writeContract({address:_,abi:Et,functionName:"addDevice",args:[E],account:B.walletClient.account||B.address,chain:r||null}),Z=u?await Er(ce,U,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},u):await M.execute(ce,U,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),Q={appAddress:_,deviceId:E,transactionHash:Z.receipt.transactionHash,blockNumber:Z.receipt.blockNumber,gasUsed:Z.receipt.gasUsed};return t?.schema===!1?Q:(t?.schema||vw).parse(Q)}async function Jt(e,t){try{return{success:!0,data:await bw(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 _w=ye.object({chain:ye.unknown().optional(),rpcUrl:ye.string().optional(),appAddress:ye.string(),deviceId:ye.string(),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"]}),Sw=ye.object({appAddress:ye.string(),deviceId:ye.string(),transactionHash:ye.string(),blockNumber:ye.bigint().optional(),gasUsed:ye.bigint().optional()}).passthrough();async function kw(e,t){let n=_w.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:c,publicClient:l,timeout:p=12e4,retryOptions:u,signal:f,onTransactionStateChange:d,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,_=a.startsWith("0x")?a:`0x${a}`,E=ht(s),S,b,I,x;if(i){let $=ww(i),B=Cc(o,{timeout:p});S=l||bc({chain:r,transport:B}),b=Cw({account:$,chain:r,transport:B}),I=$.address,x=r.id}else if(c){if(b=c,S=l||bc({chain:r,transport:Cc(o,{timeout:p})}),!b.account?.address)throw new Error("WalletClient must have an account with address");I=b.account.address,x=r?r.id:await b.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let U={publicClient:S,walletClient:b,address:I,chainId:x},M=Hn();if(d&&typeof d=="function"){let $=()=>{d(M.status),M.isComplete||setTimeout($,100)};setTimeout($,10)}if(!y){let $={targetChainId:x,minBalance:k?wc(k):wc("0.001")},B=await Ir(U,$);if(!B.networkValid)throw new Error(`Network mismatch: Expected chain ${$.targetChainId}, but wallet is on chain ${B.details.currentChainId}`);if(!B.balanceValid){let Pe=Number($.minBalance)/1e18,Tt=Number(B.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Pe} ETH, but account has ${Tt.toFixed(6)} ETH`)}}let J=async $=>$.walletClient.writeContract({address:_,abi:Et,functionName:"removeDevice",args:[E],account:$.walletClient.account||$.address,chain:r||null}),ce=u?await Er(J,U,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},u):await M.execute(J,U,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),Z={appAddress:_,deviceId:E,transactionHash:ce.receipt.transactionHash,blockNumber:ce.receipt.blockNumber,gasUsed:ce.receipt.gasUsed};return t?.schema===!1?Z:(t?.schema||Sw).parse(Z)}async function $l(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 Aw=ve.object({chain:ve.unknown().optional(),rpcUrl:ve.string().optional(),appAddress:ve.string(),allow:ve.boolean(),privateKey:ve.string().optional(),walletClient:ve.unknown().optional(),publicClient:ve.unknown().optional(),skipPrerequisiteChecks:ve.boolean().optional().default(!1),minBalance:ve.string().optional(),timeout:ve.number().optional().default(12e4),retryOptions:ve.unknown().optional(),signal:ve.unknown().optional(),onTransactionStateChange:ve.function().optional(),onTransactionSubmitted:ve.function().optional(),onTransactionConfirmed:ve.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"]}),Rw=ve.object({appAddress:ve.string(),allow:ve.boolean(),transactionHash:ve.string(),blockNumber:ve.bigint().optional(),gasUsed:ve.bigint().optional()}).passthrough();async function Pw(e,t){let n=Aw.parse(e),{chain:r,rpcUrl:o,appAddress:a,allow:s,privateKey:i,walletClient:c,publicClient:l,timeout:p=12e4,retryOptions:u,signal:f,onTransactionStateChange:d,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,_=a.startsWith("0x")?a:`0x${a}`,E,S,b,I;if(i){let Q=Ew(i),$=Sc(o,{timeout:p});E=l||_c({chain:r,transport:$}),S=Iw({account:Q,chain:r,transport:$}),b=Q.address,I=r.id}else if(c){if(S=c,E=l||_c({chain:r,transport:Sc(o,{timeout:p})}),!S.account?.address)throw new Error("WalletClient must have an account with address");b=S.account.address,I=r?r.id:await S.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let x={publicClient:E,walletClient:S,address:b,chainId:I},U=Hn();if(d&&typeof d=="function"){let Q=()=>{d(U.status),U.isComplete||setTimeout(Q,100)};setTimeout(Q,10)}if(!y){let Q={targetChainId:I,minBalance:k?kc(k):kc("0.001")},$=await Ir(x,Q);if(!$.networkValid)throw new Error(`Network mismatch: Expected chain ${Q.targetChainId}, but wallet is on chain ${$.details.currentChainId}`);if(!$.balanceValid){let B=Number(Q.minBalance)/1e18,Pe=Number($.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${B} ETH, but account has ${Pe.toFixed(6)} ETH`)}}let M=async Q=>Q.walletClient.writeContract({address:_,abi:Et,functionName:"setAllowAnyDevice",args:[s],account:Q.walletClient.account||Q.address,chain:r||null}),J=u?await Er(M,x,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f},u):await U.execute(M,x,[],{timeout:p,confirmations:1,onSubmitted:h,onConfirmed:g,signal:f}),ce={appAddress:_,allow:s,transactionHash:J.receipt.transactionHash,blockNumber:J.receipt.blockNumber,gasUsed:J.receipt.gasUsed};return t?.schema===!1?ce:(t?.schema||Rw).parse(ce)}async function Tl(e,t){try{return{success:!0,data:await Pw(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 _P=xn.object({appAddress:xn.string(),owner:xn.string(),allowAnyDevice:xn.boolean(),devices:xn.array(xn.string())});async function mo(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 xw({chain:t,transport:$w(n)})})(),[c,l]=await Promise.all([i.readContract({address:s,abi:Et,functionName:"allowAnyDevice"}),i.readContract({address:s,abi:Et,functionName:"owner"})]);if(c)return{appAddress:s,owner:l,allowAnyDevice:!0,devices:o.map(u=>ht(u))};let p;if(o.length===0)p=[];else{let u=o.map(d=>({address:s,abi:Et,functionName:"allowedDeviceIds",args:[ht(d)]})),f=await i.multicall({contracts:u});p=o.map((d,h)=>({deviceId:ht(d),allowed:f[h]?.status==="success"&&f[h]?.result===!0})).filter(d=>d.allowed).map(d=>d.deviceId)}return{appAddress:s,owner:l,allowAnyDevice:!1,devices:p}}async function Mw(e){let{chain:t,rpcUrl:n,appAddress:r,deviceId:o,composeHash:a,publicClient:s}=e,i=r.startsWith("0x")?r:`0x${r}`,c=ht(o),l=ht(a),p=s||(()=>{if(!t)throw new Error("Chain is required when publicClient is not provided");return Tw({chain:t,transport:Dw(n)})})(),u=[{address:i,abi:Et,functionName:"allowAnyDevice"},{address:i,abi:Et,functionName:"allowedDeviceIds",args:[c]},{address:i,abi:Et,functionName:"allowedComposeHashes",args:[l]}],f=await p.multicall({contracts:u}),d=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:d,deviceAllowed:d||h,composeHashAllowed:g}}async function pn(e){try{return{success:!0,data:await Mw(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 Uw=Nc;var Lw=$n.object({items:$n.array(Uw),total:$n.number(),page:$n.number(),page_size:$n.number(),pages:$n.number()}).passthrough(),{action:$P,safeAction:Dl}=L(Lw,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)}),Mn=gt.object({limit:gt.number(),remaining:gt.number()}).passthrough(),Nw=gt.object({vm_slots:Mn,vcpu:Mn,memory_mb:Mn,disk_gb:Mn}).passthrough(),Ow=gt.object({gpus:Mn,in_use:gt.number(),misconfigured:gt.number()}).passthrough(),jw=gt.object({team_slug:gt.string(),tier:gt.string(),quotas:Nw,reserved_nodes:Mn,reserved_gpu:Ow,as_of:gt.string()}).passthrough(),{action:DP,safeAction:MP}=L(jw,async(e,t)=>await e.get(`/workspaces/${t.teamSlug}/quotas`)),LP=Ze(He.extend({node_id:Fw.number().optional()}));var OP=Tn.object({target:Tn.string().describe("Target status to wait for (e.g., 'running', 'stopped')"),interval:Tn.number().min(5).max(30).default(5).describe("Polling interval in seconds"),timeout:Tn.number().min(10).max(600).default(300).describe("Timeout per attempt in seconds"),maxRetries:Tn.number().min(0).default(Number.POSITIVE_INFINITY).describe("Maximum number of retry attempts (Infinity for unlimited)"),retryDelay:Tn.number().min(0).default(5e3).describe("Delay between retries in milliseconds")});var Vw=Ze(He.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()})),Hw=W.object({requiresOnChainHash:W.literal(!1),correlationId:W.string()}),zw=W.object({requiresOnChainHash:W.literal(!0),composeHash:W.string(),appId:W.string(),deviceId:W.string(),kmsInfo:mt,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()}),Kw=W.discriminatedUnion("requiresOnChainHash",[Hw,zw]);function qw(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:FP,safeAction:Ml}=L(Kw,async(e,t)=>{let n=Vw.parse(t),{cvmId:r}=z.parse(n),{id:o,uuid:a,app_id:s,instance_id:i,name:c,prepareOnly:l,...p}=n;try{return{requiresOnChainHash:!1,correlationId:(l?await e.patch(`/cvms/${r}`,p,{headers:{"X-Prepare-Only":"true"}}):await e.patch(`/cvms/${r}`,p)).correlation_id}}catch(u){if(u instanceof lt&&u.status===465){let f=qw(u.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 u}}),Gw=Ze(He.extend({composeHash:oo.string().describe("Compose hash from patchCvm Phase 1 response"),transactionHash:oo.string().describe("Transaction hash proving on-chain registration")})),Bw=oo.object({correlationId:oo.string()}),{action:HP,safeAction:Ul}=L(Bw,async(e,t)=>{let n=Gw.parse(t),{cvmId:r}=z.parse(n);return{correlationId:(await e.patch(`/cvms/${r}`,{},{headers:{"X-Compose-Hash":n.composeHash,"X-Transaction-Hash":n.transactionHash}})).correlation_id}}),Ww=Ze(He.extend({token:Ln.string().describe("One-time commit token from prepare-only flow"),composeHash:Ln.string().describe("Compose hash from Phase 1 response"),transactionHash:Ln.string().describe("Transaction hash proving on-chain registration")})),Jw=Ln.object({correlationId:Ln.string(),status:Ln.string()}),{action:KP,safeAction:Ll}=L(Jw,async(e,t)=>{let n=Ww.parse(t),{cvmId:r}=z.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}}),Nl=nt.object({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()}),cs=Nl.extend({cvm_id:nt.number().nullable()}),ls=Nl.extend({cvm_id:nt.string().nullable()}),GP=nt.union([cs,ls]);var BP=Ze(He.extend({overwrite:nt.boolean().optional(),dry_run:nt.boolean().optional()}));var JP=Se.object({cvm_ids:Se.array(Se.string()).optional(),running_only:Se.boolean().optional(),missing_only:Se.boolean().optional(),overwrite:Se.boolean().optional(),limit:Se.number().int().min(1).max(500).optional(),dry_run:Se.boolean().optional()}).strict(),ms=Se.object({total:Se.number().int(),scanned:Se.number().int(),updated:Se.number().int(),unchanged:Se.number().int(),skipped:Se.number().int(),conflicts:Se.number().int(),errors:Se.number().int()}),YP=ms.extend({items:Se.array(cs)}),XP=ms.extend({items:Se.array(ls)}),ZP=ms.extend({items:Se.array(Se.union([cs,ls]))});var Yw=oe.object({cpu_percent:oe.number().nullable().optional(),memory_used_bytes:oe.number().nullable().optional(),memory_total_bytes:oe.number().nullable().optional(),disk_used_bytes:oe.number().nullable().optional(),disk_total_bytes:oe.number().nullable().optional(),egress_bytes:oe.number().nullable().optional()}),Xw=oe.object({vm_uuid:oe.string(),status:oe.string(),uptime:oe.string().nullable().optional(),in_progress:oe.boolean(),boot_progress:oe.string().nullable().optional(),boot_error:oe.string().nullable().optional(),shutdown_progress:oe.string().nullable().optional(),events:oe.array(oe.object({event:oe.string(),body:oe.string(),timestamp:oe.number()})).default([]),operation:oe.object({type:oe.string().nullable().optional(),phase:oe.string().nullable().optional(),started_at:oe.string().nullable().optional(),correlation_id:oe.string().nullable().optional()}).nullable().optional(),resource_usage:Yw.nullable().optional()}),Zw=oe.record(oe.string(),Xw),Qw=oe.object({vmUuids:oe.array(oe.string())}),{action:ex,safeAction:po}=L(Zw,async(e,t)=>{let{vmUuids:n}=Qw.parse(t);return await e.post("/status/batch",{vm_uuids:n})}),e_=gr.object({hostname:gr.string().nullable().optional(),ssh_authorized_keys:gr.array(gr.string()).default([]),default_gateway_domain:gr.string().nullable().optional()}),t_=z,{action:nx,safeAction:Ol}=L(e_,async(e,t)=>{let{cvmId:n}=t_.parse(t);return await e.get(`/cvms/${n}/user_config`)}),jl=xe.object({app_contract_address:xe.string(),compose_hash:xe.string(),device_id:xe.string(),compose_hash_allowed:xe.boolean(),allow_any_device:xe.boolean(),device_id_allowed:xe.boolean().nullable().optional(),is_allowed:xe.boolean(),error:xe.string().nullable().optional()}),Fl=jl.extend({cvm_id:xe.number().optional()}),ps=jl.extend({cvm_id:xe.string().optional()}),ox=xe.union([Fl,ps]),n_=ps,ax=xe.object({cvmId:xe.string().min(1),compose_hash:xe.string().optional(),node_id:xe.number().optional(),device_id:xe.string().optional()});var r_=Dn.object({appId:Dn.string().min(1),compose_hash:Dn.string(),node_id:Dn.number().optional(),device_id:Dn.string().optional(),chain_id:Dn.number().optional()}),{action:ix,safeAction:cx}=L(n_,async(e,t)=>{let{appId:n,...r}=r_.parse(t);return await e.post(`/apps/${n}/is-allowed`,r)}),Vl=Ue.object({is_onchain:Ue.boolean(),total:Ue.number().default(0),allowed_count:Ue.number().default(0),denied_count:Ue.number().default(0),error_count:Ue.number().default(0)}),o_=Vl.extend({results:Ue.array(Fl.extend({cvm_id:Ue.number()})).default([]),skipped_cvm_ids:Ue.array(Ue.number()).default([])}),a_=Vl.extend({results:Ue.array(ps.extend({cvm_id:Ue.string()})).default([]),skipped_cvm_ids:Ue.array(Ue.string()).default([])}),mx=Ue.union([o_,a_]);var px=Ue.object({appId:Ue.string().min(1)});var s_=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"?zC:e==="2026-01-21"?kl:qC}async function c_(e,t){let n=s_.parse(t??{}),r=await e.get("/apps",{params:n});return i_(e.config.version).parse(r)}async function Hl(e,t){try{return{success:!0,data:await c_(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 l_=Ic.object({appId:Ic.string().min(1)}).strict();function m_(e){return e==="2025-10-28"?Cl:e==="2026-01-21"?_l:Sl}async function p_(e,t){let{appId:n}=l_.parse(t),r=await e.get(`/apps/${n}`);return m_(e.config.version).parse(r)}async function zl(e,t){try{return{success:!0,data:await p_(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 u_=br.object({appId:br.string().min(1)}).strict();function d_(e){return e==="2025-10-28"?br.array(Mc):e==="2026-01-21"?br.array(Nn):br.array(Cr)}async function f_(e,t){let{appId:n}=u_.parse(t),r=await e.get(`/apps/${n}/cvms`);return d_(e.config.version).parse(r)}async function zn(e,t){try{return{success:!0,data:await f_(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 g_=wt.object({appId:wt.string().min(1),name:wt.string().optional(),node_id:wt.number().optional(),docker_compose_file:wt.string().optional(),pre_launch_script:wt.string().optional(),encrypted_env:wt.string().optional(),compose_hash:wt.string().optional(),token:wt.string().optional(),transaction_hash:wt.string().optional()}).strict(),{action:hx,safeAction:yx}=L(bb,async(e,t)=>{let n=g_.parse(t),{appId:r,...o}=n;return await e.post(`/apps/${r}/instances`,o)}),Kl=ke.object({device_id:ke.string(),node_name:ke.string().nullable(),allowed_onchain:ke.boolean(),status:ke.string()}),ql=Kl.extend({cvm_ids:ke.array(ke.number())}),Gl=Kl.extend({cvm_ids:ke.array(ke.string())}),Bl=ke.object({is_onchain_kms:ke.boolean(),allow_any_device:ke.boolean().nullable().optional(),chain_id:ke.number().nullable().optional(),app_contract_address:ke.string().nullable().optional()}),Wl=Bl.extend({devices:ke.array(ql).optional().default([])}),Jl=Bl.extend({devices:ke.array(Gl).optional().default([])}),bx=ke.union([ql,Gl]),Cx=ke.union([Wl,Jl]);function h_(e){return e==="2026-01-21"?Wl:Jl}var y_=ke.object({appId:ke.string().min(1)}).strict();async function v_(e,t){let{appId:n}=y_.parse(t),r=await e.get(`/apps/${n}/device-allowlist`);return h_(e.config.version).parse(r)}async function uo(e,t){try{return{success:!0,data:await v_(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=no.object({appId:no.string().min(1),page:no.number().int().min(1).optional(),page_size:no.number().int().min(1).max(1e3).optional()}).strict();var kx=ro.object({appId:ro.string().min(1),revisionId:ro.string().min(1),rawComposeFile:ro.boolean().optional()}).strict();var Ex=qe.object({statuses:qe.array(qe.string()),image_versions:qe.array(qe.string()),instance_types:qe.array(qe.string()),kms_slugs:qe.array(qe.string()),kms_types:qe.array(qe.string()),regions:qe.array(qe.string()),nodes:qe.array(qe.string())});var b_=q.object({contract_address:q.string(),chain_id:q.number().nullable(),version:q.string(),url:q.string(),gateway_app_id:q.string().nullable(),gateway_app_url:q.string(),kms_type:q.string()}),Ec=q.object({app_id:q.string().optional(),instance_id:q.string().optional(),app_name:q.string().optional(),device_id:q.string().optional()}).passthrough().nullable(),C_=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(),ppid_sha256:q.string().nullable().optional(),device_id:q.string().optional(),fmspc:q.string().nullable().optional(),tee_tcb_svn:q.string().nullable().optional(),mr_config_id:q.string().nullable().optional(),cpusvn:q.string().nullable().optional(),pcesvn:q.number().nullable().optional(),tcb_info:hl.nullable().optional(),app_certificates:q.array(gl).nullable().optional(),compose_file:q.string().nullable().optional(),error:q.string().nullable().optional()}),w_=q.object({app_id:q.string(),contract_address:q.string(),kms_info:b_,instances:q.array(C_),kms_guest_agent_info:Ec,gateway_guest_agent_info:Ec,qemu_version:q.string().nullable()}),__=q.object({appId:q.string().min(1)}).strict(),{action:Rx,safeAction:Px}=L(w_,async(e,t)=>{let{appId:n}=__.parse(t);return await e.get(`/apps/${n}/attestations`)}),S_=/(?:^|^)\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=S_.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 Kn(e){let t=k_(e),n=[];for(let[r,o]of Object.entries(t))n.push({key:r,value:o});return n}function fo(e){return e.split(/[\s-]+/).filter(Boolean).map((t,n)=>n===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Yl(e){return e===void 0?[]:Array.isArray(e)?[...e]:[e]}function Xl(e,t){let n={};for(let i of t.flagConfig.descriptors.values()){let c=t.flags[i.canonicalKey];c!==void 0&&(n[i.target]=c)}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 c=i.target??fo(i.name);if(i.variadic){r[c]=a.slice(s),s=a.length;break}a[s]!==void 0&&(r[c]=a[s]),s+=1}return{options:n,positionals:r,raw:{flags:t.flags,positionals:t.positionals}}}import T_ from"arg";var I_={name:"help",shorthand:"h",description:"Show help information for the current command",type:"boolean",target:"help"},E_={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"},A_={name:"interactive",description:"Enable interactive mode for commands that support it",type:"boolean",target:"interactive",group:"basic"},Zl={name:"api-token",description:"API token for authenticating with Phala Cloud",type:"string",target:"apiToken",aliases:["api-key"],argumentName:"token",group:"basic"},fe={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json",group:"basic"},R_={name:"profile",description:"Temporarily use a different auth profile for this command",type:"string",target:"profile",argumentName:"profile",group:"basic"},P_={name:"api-version",description:"API version to use (e.g. 2026-01-21, 2026-05-22, 2026-06-23)",type:"string",target:"apiVersion",group:"advanced"},x_={name:"timeout",description:"Request timeout in seconds (default 60)",type:"number",target:"timeout",argumentName:"seconds",group:"advanced"},Yt=[Zl],X={name:"cvm_id",description:"CVM identifier (UUID, app_id, instance_id, or name)",required:!1,target:"cvmId"},un={name:"cvm-id",description:"CVM identifier (UUID, app_id, instance_id, or name)",type:"string",target:"cvmId"},Ql={name:"uuid",description:"[DEPRECATED] Use --cvm-id instead. CVM UUID.",type:"string",target:"cvmId",deprecated:!0,group:"deprecated"},Qe={name:"private-key",description:"Private key for signing on-chain transactions (or set PRIVATE_KEY env var)",type:"string",target:"privateKey",group:"advanced"},Be={name:"rpc-url",description:"RPC URL for on-chain KMS transactions (or set ETH_RPC_URL env var)",type:"string",target:"rpcUrl",group:"advanced"},qn={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"},dn=[I_,E_,Zl,fe,A_,un,R_,P_,x_];import em from"arg";function tm(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??fo(o.name),i=$_(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 c of Yl(o.aliases))t[`--${c}`]=a;if(o.negatedName){let c=`--${o.negatedName}`;if(o.type!=="boolean")throw new Error(`Negated option is only supported for boolean types: ${o.name}`);t[c]=em.flag(()=>!0),r.set(c,{option:o,canonicalKey:a,target:s,negatedKey:c})}}return{spec:t,descriptors:n,negatedLookup:r}}function $_(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 em.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 D_(e){let t=e.indexOf("--");return t===-1?[[...e],[]]:[e.slice(0,t),e.slice(t+1)]}function Ar(e,t,n={}){let r=[...dn,...t?[...t]:[]],o=tm(r),{permissive:a=!1,stopAtPositional:s=!1}=n,[i,c]=D_(e),l=T_(o.spec,{argv:i,permissive:a,stopAtPositional:s}),{_:p,...u}=l;return{positionals:p??[],flags:u,flagConfig:o,passThrough:c}}var Xt=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
27
 
28
28
  All environment variables recognized by the Phala CLI. Command-line flags always take precedence over environment variables when both are set.
29
29
 
@@ -95,72 +95,73 @@ Examples:
95
95
  - \`phala api --help\` for API-specific flags and env vars
96
96
  - \`phala login --help\` for authentication flow
97
97
  - \`phala deploy --help\` for on-chain KMS flags
98
- `})});function No(e){return e==="unstable"?" [UNSTABLE]":e==="deprecated"?" [DEPRECATED]":""}function pk(e,t){let n=Object.values(sn);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 Fo(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 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=>i(p)===l).sort((p,d)=>(p.name??"").localeCompare(d.name??""));if(m.length!==0){r.push(a(l));for(let p of m){let d=p.command?.meta??p.group?.meta,f=(d?.description??"").split(`
99
- `)[0],u=d?.stability,h=u?No(u):"",g=p.name??"",y=d?.aliases,b=y?.length?`${g} (${y.join(", ")})`:g;r.push(` ${b.padEnd(18)}${f}${h}`.trimEnd())}r.push("")}}pk(r,n),r.push("Global options:");for(let l of kn){let m=jo(l),p=Math.max(24,m.length+2);r.push(` ${m.padEnd(p)}${l.description??""}`.trimEnd())}return r.join(`
100
- `)}function hm(e){let{registry:t,executableName:n,groupPath:r}=e,o=t.getNode(r);if(!o?.group)return Fo({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 m of l){let p=m.command?.meta??m.group?.meta,d=(p?.description??"").split(`
101
- `)[0],f=p?.stability,u=f?No(f):"",h=m.name??"",g=p?.aliases,y=g?.length?`${h} (${g.join(", ")})`:h;a.push(` ${y.padEnd(18)}${d}${u}`.trimEnd())}a.push("")}a.push("Global options:");for(let m of kn){let p=jo(m),d=Math.max(24,p.length+2);a.push(` ${p.padEnd(d)}${m.description??""}`.trimEnd())}return a.join(`
102
- `)}function Ls(e){let{executableName:t,definition:n,registry:r}=e,o=dk({executableName:t,definition:n}),a=No(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=fk(y);s.push(` ${b.padEnd(18)}${y.description??""}`.trimEnd())}}let l=[...n.meta.options??[]],m=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")&&m.add("profile");let p=l.filter(y=>!y.hidden),d=new Map(p.map(y=>[y.name,y])),f=kn.filter(y=>!y.hidden).filter(y=>!m.has(y.name)).map(y=>d.get(y.name)??y),u=new Set(f.map(y=>y.name)),h=p.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=jo(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 $=jo(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?No(S):"",_=y.name??"",I=b?.aliases,$=I?.length?`${_} (${I.join(", ")})`:_;s.push(` ${$.padEnd(18)}${w}${k}`.trimEnd())}}return s.join(`
104
- `)}function dk({executableName:e,definition:t}){let n=[e,...t.path],o=(t.meta.arguments??[]).map(m=>uk(m)).join(" "),s=(t.meta.options?.length??0)>0?" [options]":"",i=o?` ${o}`:"",l=t.meta.passThrough?" [--] [...]":"";return`Usage: ${n.join(" ")}${s}${i}${l}`}function uk(e){let t=`<${e.name}>`;return e.variadic?`${t}...`:e.required===!1?`[${t}]`:t}function fk(e){return e.variadic?`<${e.name}...>`:e.required===!1?`<${e.name}>?`:`<${e.name}>`}function jo(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 ym;function vm(e){return bn.includes(e)}function Cm(e){ym=e}function Us(){return ym}var Os=!1;function zr(e){Os=e}function te(){return Os}function Ns(){return!Os}import vk from"path";import Vo from"fs-extra";import wm from"@iarna/toml";import{z as wt}from"zod";import Be from"chalk";import gk from"ora";function hk(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 yk(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 bm(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(...yk(r,t));continue}let o=hk(r,t);n.push(...o)}if(n.length===0){let r=e.trim();n.push(r)}return n}var c={error:(e,...t)=>{te()||(process.stderr.write(`${Be.red("\u2717")} ${Be.red(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
106
- `))},warn:(e,...t)=>{te()||(process.stderr.write(`${Be.yellow("\u26A0")} ${Be.yellow(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
107
- `))},info:(e,...t)=>{te()||(process.stderr.write(`${Be.blue("\u2139")} ${Be.blue(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
108
- `))},success:(e,...t)=>{te()||(process.stderr.write(`${Be.green("\u2713")} ${Be.green(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
109
- `))},debug:(e,...t)=>{te()||process.env.DEBUG&&(process.stderr.write(`${Be.gray("\u{1F50D}")} ${Be.gray(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
110
- `))},table:(e,t)=>{if(!te()){if(e.length===0){console.log(Be.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(Be.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 m=String(typeof l.key=="string"&&!(l.key in s)?"":s[String(l.key)]??"");i.push(m.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 m=String(i[l]??"");o[l]=Math.max(o[l],m.length)}let a=[];for(let i of r)a.push(Be.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 m of r){let p=String(i[m]??"");l.push(p.padEnd(o[m]))}console.log(l.join(" "))}}}},keyValueTable:(e,t)=>{if(te())return;let{borderStyle:n="single",keyColor:r=Be.blue,valueColor:o=Be.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,m=0;for(let[h,g]of Object.entries(e)){l=Math.max(l,h.length);let y=String(g??"");m=Math.max(m,y.length)}let p=4,d=1,f=a-p-d;if(l+m>f){let h=l/(l+m);l=Math.floor(f*h),m=f-l}let u=l+m+p+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=bm(y,l),S=bm(b,m),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(m);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:()=>{te()||process.stderr.write(`
111
- `)},startSpinner:e=>{if(te())return{stop:()=>{}};let t=gk(e).start();return{stop:(n=!0,r)=>{r&&(t.text=r),n?t.succeed():t.fail()}}},logDetailedError(e,t){if(te())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}
112
- `),e.data!==void 0&&e.data!==null&&process.stderr.write(`${JSON.stringify(e.data,null,2)}
113
- `);return}if(o(e)){process.stderr.write(`${n}Validation error: ${JSON.stringify(e.issues)}
98
+ `})});function go(e){return e==="unstable"?" [UNSTABLE]":e==="deprecated"?" [DEPRECATED]":""}function M_(e,t){let n=Object.values(Xt);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 yo(e){let{registry:t,executableName:n}=e,r=[];r.push(`Usage: ${n} <command> [options]`),r.push("");let o=t.getChildren(),a=c=>{switch(c){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=c=>{let l=c.command?.meta??c.group?.meta;if(l?.category)return l.category;let p=c.name??"";return l?.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"?"deprecated":"advanced"};for(let c of s){let l=o.filter(p=>i(p)===c).sort((p,u)=>(p.name??"").localeCompare(u.name??""));if(l.length!==0){r.push(a(c));for(let p of l){let u=p.command?.meta??p.group?.meta,f=(u?.description??"").split(`
99
+ `)[0],d=u?.stability,h=d?go(d):"",g=p.name??"",y=u?.aliases,k=y?.length?`${g} (${y.join(", ")})`:g;r.push(` ${k.padEnd(18)}${f}${h}`.trimEnd())}r.push("")}}M_(r,n),r.push("Global options:");for(let c of dn){let l=ho(c),p=Math.max(24,l.length+2);r.push(` ${l.padEnd(p)}${c.description??""}`.trimEnd())}return r.join(`
100
+ `)}function nm(e){let{registry:t,executableName:n,groupPath:r}=e,o=t.getNode(r);if(!o?.group)return yo({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 c=t.getChildren(r);if(c.length>0){a.push("Available commands:");for(let l of c){let p=l.command?.meta??l.group?.meta,u=(p?.description??"").split(`
101
+ `)[0],f=p?.stability,d=f?go(f):"",h=l.name??"",g=p?.aliases,y=g?.length?`${h} (${g.join(", ")})`:h;a.push(` ${y.padEnd(18)}${u}${d}`.trimEnd())}a.push("")}a.push("Global options:");for(let l of dn){let p=ho(l),u=Math.max(24,p.length+2);a.push(` ${p.padEnd(u)}${l.description??""}`.trimEnd())}return a.join(`
102
+ `)}function us(e){let{executableName:t,definition:n,registry:r}=e,o=U_({executableName:t,definition:n}),a=go(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 k=N_(y);s.push(` ${k.padEnd(18)}${y.description??""}`.trimEnd())}}let c=[...n.meta.options??[]],l=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")&&l.add("profile");let p=c.filter(y=>!y.hidden),u=new Map(p.map(y=>[y.name,y])),f=dn.filter(y=>!y.hidden).filter(y=>!l.has(y.name)).map(y=>u.get(y.name)??y),d=new Set(f.map(y=>y.name)),h=p.filter(y=>!d.has(y.name));if(f.length>0){let y=new Set(h.map(k=>k.shorthand).filter(k=>typeof k=="string"&&k.length>0));s.push(""),s.push("Global options:");for(let k of f){let _=!k.shorthand||!y.has(k.shorthand),E=ho(k,{includeShorthand:_}),S=Math.max(24,E.length+2);s.push(` ${E.padEnd(S)}${k.description??""}`.trimEnd())}}if(h.length>0){let y=S=>S.group==="deprecated"||S.deprecated?!0:(S.description??"").includes("[DEPRECATED]"),k=S=>S.group?S.group:y(S)?"deprecated":"basic",_={basic:[],advanced:[],deprecated:[]};for(let S of h)_[k(S)].push(S);let E=(S,b)=>{if(b.length!==0){s.push(""),s.push(S);for(let I of b){let x=ho(I),U=Math.max(24,x.length+2);s.push(` ${x.padEnd(U)}${I.description??""}`.trimEnd())}}};E("Basic options:",_.basic),E("Advanced options:",_.advanced),E("Deprecated options:",_.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 k=y.command?.meta??y.group?.meta,_=(k?.description??"").split(`
103
+ `)[0],E=k?.stability,S=E?go(E):"",b=y.name??"",I=k?.aliases,x=I?.length?`${b} (${I.join(", ")})`:b;s.push(` ${x.padEnd(18)}${_}${S}`.trimEnd())}}return s.join(`
104
+ `)}function U_({executableName:e,definition:t}){let n=[e,...t.path],o=(t.meta.arguments??[]).map(l=>L_(l)).join(" "),s=(t.meta.options?.length??0)>0?" [options]":"",i=o?` ${o}`:"",c=t.meta.passThrough?" [--] [...]":"";return`Usage: ${n.join(" ")}${s}${i}${c}`}function L_(e){let t=`<${e.name}>`;return e.variadic?`${t}...`:e.required===!1?`[${t}]`:t}function N_(e){return e.variadic?`<${e.name}...>`:e.required===!1?`<${e.name}>?`:`<${e.name}>`}function ho(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 rm;function om(e){return mn.includes(e)}function am(e){rm=e}function ds(){return rm}var fs=!1;function Rr(e){fs=e}function te(){return fs}function gs(){return!fs}import V_ from"path";import vo from"fs-extra";import im from"@iarna/toml";import{z as at}from"zod";import We from"chalk";import O_ from"ora";function j_(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 F_(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 sm(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(...F_(r,t));continue}let o=j_(r,t);n.push(...o)}if(n.length===0){let r=e.trim();n.push(r)}return n}var m={error:(e,...t)=>{te()||(process.stderr.write(`${We.red("\u2717")} ${We.red(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
106
+ `))},warn:(e,...t)=>{te()||(process.stderr.write(`${We.yellow("\u26A0")} ${We.yellow(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
107
+ `))},info:(e,...t)=>{te()||(process.stderr.write(`${We.blue("\u2139")} ${We.blue(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
108
+ `))},success:(e,...t)=>{te()||(process.stderr.write(`${We.green("\u2713")} ${We.green(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
109
+ `))},debug:(e,...t)=>{te()||process.env.DEBUG&&(process.stderr.write(`${We.gray("\u{1F50D}")} ${We.gray(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
110
+ `))},table:(e,t)=>{if(!te()){if(e.length===0){console.log(We.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 c=String(typeof i.key=="string"&&!(i.key in s)?"":s[String(i.key)]??"");r[String(i.key)]=Math.max(r[String(i.key)],c.length)}let o=[];for(let s of n){let i=s.header||String(s.key);o.push(We.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 c of n){let l=String(typeof c.key=="string"&&!(c.key in s)?"":s[String(c.key)]??"");i.push(l.padEnd(r[String(c.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 c of r){let l=String(i[c]??"");o[c]=Math.max(o[c],l.length)}let a=[];for(let i of r)a.push(We.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 c=[];for(let l of r){let p=String(i[l]??"");c.push(p.padEnd(o[l]))}console.log(c.join(" "))}}}},keyValueTable:(e,t)=>{if(te())return;let{borderStyle:n="single",keyColor:r=We.blue,valueColor:o=We.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],c=0,l=0;for(let[h,g]of Object.entries(e)){c=Math.max(c,h.length);let y=String(g??"");l=Math.max(l,y.length)}let p=4,u=1,f=a-p-u;if(c+l>f){let h=c/(c+l);c=Math.floor(f*h),l=f-c}let d=c+l+p+u;n!=="none"&&console.log(i.topLeft+i.horizontal.repeat(d-2)+i.topRight);for(let[h,g]of Object.entries(e)){let y=h,k=String(g??""),_=sm(y,c),E=sm(k,l),S=Math.max(_.length,E.length);for(;_.length<S;)_.push("");for(;E.length<S;)E.push("");for(let b=0;b<S;b++){let I=_[b].padEnd(c),x=E[b].padEnd(l);console.log(n!=="none"?`${i.vertical} ${r(I)} ${i.vertical} ${o(x)} ${i.vertical}`:`${r(I)} : ${o(x)}`)}}n!=="none"&&console.log(i.bottomLeft+i.horizontal.repeat(d-2)+i.bottomRight)},break:()=>{te()||process.stderr.write(`
111
+ `)},startSpinner:e=>{if(te())return{stop:()=>{}};let t=O_(e).start();return{stop:(n=!0,r)=>{r&&(t.text=r),n?t.succeed():t.fail()}}},logDetailedError(e,t){if(te())return;let n=t?`[${t}] `:"",r=(s,i)=>{let c,l=typeof i=="string"?i:void 0;if(typeof s=="string"&&(c=s),s instanceof URL&&(c=s.toString()),typeof Request<"u"&&s instanceof Request&&(c=s.url,l??=s.method),!c)return;let p=l?.trim().toUpperCase();return p?`${p} ${c}`:c},o=s=>s!==null&&typeof s=="object"&&("status"in s||"detail"in s||"requestId"in s);if((s=>s!==null&&typeof s=="object"&&"issues"in s&&Array.isArray(s.issues))(e)){process.stderr.write(`${n}Validation error: ${JSON.stringify(e.issues)}
112
+ `);return}if(o(e)){let s=[],i=r(e.request,e.requestMethod);if(i&&s.push(`${n}Request: ${i}`),typeof e.status=="number"&&e.status>0){let c=e.statusText??"";s.push(`${n}HTTP ${e.status}${c?` ${c}`:""}`)}typeof e.requestId=="string"&&e.requestId.length>0&&s.push(`${n}Request ID: ${e.requestId}`),e.data!==void 0&&e.data!==null&&s.push(JSON.stringify(e.data,null,2)),s.length>0&&process.stderr.write(`${s.join(`
113
+ `)}
114
114
  `);return}e instanceof Error?process.stderr.write(`${n}${e.message}
115
115
  `):process.stderr.write(`${n}${String(e)}
116
- `)}};var _m=Ge.extend({profile:wt.string().optional(),api_version:wt.enum(bn).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()}),Kr="phala.toml";function js(){return vk.join(process.cwd(),Kr)}function Gr(){return Vo.existsSync(js())}function Ck(){let e=js();if(!Vo.existsSync(e))throw new Error(`Project configuration file not found: ${Kr}
117
- Run 'phala init' to create one.`);try{let t=Vo.readFileSync(e,"utf8"),n=wm.parse(t),r=_m.parse(n);if(r.id||r.uuid||r.app_id||r.instance_id||r.name){let{cvmId:o}=z.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(`
116
+ `)}};var cm=He.extend({profile:at.string().optional(),api_version:at.enum(mn).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(),public_tcbinfo:at.boolean().optional(),secure_time:at.boolean().optional(),listed:at.boolean().optional()}),Pr="phala.toml";function hs(){return V_.join(process.cwd(),Pr)}function xr(){return vo.existsSync(hs())}function H_(){let e=hs();if(!vo.existsSync(e))throw new Error(`Project configuration file not found: ${Pr}
117
+ Run 'phala init' to create one.`);try{let t=vo.readFileSync(e,"utf8"),n=im.parse(t),r=cm.parse(n);if(r.id||r.uuid||r.app_id||r.instance_id||r.name){let{cvmId:o}=z.parse(r);return{...r,cvm_id:o}}return r}catch(t){if(t instanceof at.ZodError){let n=t.issues.map(r=>` - ${r.path.join(".")}: ${r.message}`).join(`
118
118
  `);throw new Error(`Invalid project configuration:
119
- ${n}`)}throw new Error(`Failed to parse ${Kr}: ${t instanceof Error?t.message:String(t)}`)}}function Fs(e){let t=js();try{let n=_m.parse(e),r=wm.stringify(n);Vo.writeFileSync(t,r,"utf8"),c.success(`Project configuration saved to ${Kr}`)}catch(n){if(n instanceof wt.ZodError){let r=n.issues.map(o=>` - ${o.path.join(".")}: ${o.message}`).join(`
119
+ ${n}`)}throw new Error(`Failed to parse ${Pr}: ${t instanceof Error?t.message:String(t)}`)}}function ys(e){let t=hs();try{let n=cm.parse(e),r=im.stringify(n);vo.writeFileSync(t,r,"utf8"),m.success(`Project configuration saved to ${Pr}`)}catch(n){if(n instanceof at.ZodError){let r=n.issues.map(o=>` - ${o.path.join(".")}: ${o.message}`).join(`
120
120
  `);throw new Error(`Invalid configuration:
121
- ${r}`)}throw new Error(`Failed to save ${Kr}: ${n instanceof Error?n.message:String(n)}`)}}function ir(){return Gr()?Ck():{}}function km(e){if(!e)return;let{cvmId:t}=z.parse({id:e});return t}import Nt from"fs";import bk from"os";import zo from"path";var xt="https://cloud-api.phala.com/api/v1";function Ko(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:zo.join(bk.homedir(),".phala-cloud")}function qr(){return zo.join(Ko(),"credentials.json")}function Vs(){return zo.join(Ko(),"api-key")}function Sm(){return zo.join(Ko(),"docker-credentials.json")}function Em(){let e=Ko();Nt.existsSync(e)||Nt.mkdirSync(e,{recursive:!0})}function Ho(e){return typeof e=="string"&&e.trim().length>0}function cr(e){let t=e.trim();return t.length===0?"default":t}function Te(){try{let e=qr();if(!Nt.existsSync(e))return null;let t=Nt.readFileSync(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return null;let r=n;return r.schema_version!==1||!Ho(r.current_profile)||!r.profiles||typeof r.profiles!="object"?null:r}catch(e){return c.error("Failed to read credentials file:",e),null}}function Go(e){Em(),Nt.writeFileSync(qr(),JSON.stringify(e,null,2),{mode:384,encoding:"utf8"})}function Im(e){let t=Te(),n=cr(e.profile||e.projectProfile||t?.current_profile||"default"),r=n;if(t&&!t.profiles[r]){let m=Object.entries(t.profiles).find(([,p])=>p?.workspace?.slug===n);if(m)r=m[0];else{let p=Object.entries(t.profiles).find(([,d])=>d?.workspace?.name===n);p&&(r=p[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:xt)??xt,i=o?"env":a?"file":"default";if(Ho(e.apiToken))return{apiKey:e.apiToken,baseURL:s,profileName:r,tokenSource:"flag",apiPrefixSource:i};if(Ho(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 Ho(l)?{apiKey:l,baseURL:s,profileName:r,tokenSource:"file",apiPrefixSource:i}:{apiKey:null,baseURL:s,profileName:r,tokenSource:"none",apiPrefixSource:i}}function lr(e){let t=cr(e.profileName),n=(e.apiPrefix||xt).trim(),r=Te(),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:xt,workspace:s,user:e.user,updated_at:new Date().toISOString()}}};Go(i)}function mr(e){let t=Te();if(!t)return;let n=cr(e||t.current_profile),r={...t.profiles};delete r[n];let o=Object.keys(r);if(o.length===0){try{Nt.unlinkSync(qr())}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};Go(s)}function Am(e,t){let n=cr(e),r=cr(t),o=Te();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;Go({...o,current_profile:s,profiles:a})}function Dt(){let e=Te();return e?Object.keys(e.profiles):[]}function pr(e){let t=cr(e),n=Te();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&&Go({...n,current_profile:t})}function Me(){let e=Te();if(!e)return null;let t=e.current_profile,n=e.profiles[t];return n?{name:t,info:n}:null}async function Hs(e){Em();try{Nt.writeFileSync(Sm(),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 jt(){try{let e=Sm();if(Nt.existsSync(e)){let t=Nt.readFileSync(e,"utf8");return JSON.parse(t)}return null}catch(e){return c.error("Failed to read Docker credentials:",e),null}}var Pm="2026-01-21";function wk(){return{env:process.env,projectConfig:ir()}}function _t(e,t){let n=e??wk();return Im({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=Us()??Pm;return ot({apiKey:n.apiKey??void 0,baseURL:n.baseURL,version:r})}async function qo(e,t){let n=_t(e,t);return{client:await E(e,t),auth:n}}async function Bo(e,t){let n=Us()??Pm;return ot({apiKey:e,baseURL:t?.baseURL,version:n})}import{z as v}from"zod";var _k=v.object({password:v.string(),registry:v.string().nullable(),username:v.string()}),Qx=v.object({docker_compose_file:v.string(),docker_config:_k.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(),$m=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()}),eD=v.object({key:v.string(),value:v.string()}),kk=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()}))}),Sk=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()}),Rm=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()}),Ek=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()}),tD=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(Ek).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 Ik from"inquirer";async function xm(){let e=c.startSpinner("Fetching available CVMs"),t=await E(),n=await Or(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 Ik.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:o}]);return a}async function Dm(e){let t=await E(),n=e.replace(/^app_/,""),r=await t.get(`cvms/app_${n}/attestation`);try{return Rm.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 zs(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 Tm(e){return await(await E()).post("cvms/pubkey/from_cvm_configuration",e)}async function Mm(e){let n=await(await E()).post("cvms/from_cvm_configuration",e);return $m.parse(n)}async function Lm(e,t){let n=await E(),r=e.replace(/^app_/,"");return await n.put(`cvms/app_${r}/compose`,t)}async function Um(e=!1){let t=await E(),n="teepods/available";return e&&(n+="?v03x_only=1"),await t.get(n)}function cn(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 Om(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 Ak(e){return!e||/\s/.test(e)||e.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(e)}function Pk(e){if(!Ak(e))return e;try{return Buffer.from(e,"base64").toString("utf-8")}catch{return e}}function Wo(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:Pk(n.message)}}catch{return null}}function $k(e){let t=e.split(/\r?\n/),n=[];for(let r of t){if(!r.trim())continue;let o=Wo(r);if(o){n.push(o);continue}n.push({channel:"stdout",message:`${r}
122
- `})}return n}function Rk(e){let t=e.split(/\r?\n/),n="";for(let r of t){let o=Wo(r);if(o){n+=o.message;continue}r.trim()&&(n+=`${r}
123
- `)}return n}async function xk(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=Wo(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 m=r.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(`
125
- `);for(;p>=0;){let d=o.slice(0,p);o=o.slice(p+1),s(d),p=o.indexOf(`
126
- `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function Dk(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=Wo(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 m=r.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(`
128
- `);for(;p>=0;){let d=o.slice(0,p);o=o.slice(p+1),s(d),p=o.indexOf(`
129
- `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function Ks(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 Nm(e){return Ks(e,"serial")}async function Jo(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(m=>m===t||m===`/${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 jm(e,t={}){let n=await Nm(e),r=cn(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 Fm(e,t={}){let n=await Jo(e,t.container,t.matchContainerIdPrefix??!0),r=t.text??!0,o=t.bare??!0,a=cn(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("{")?Rk(i):i}async function Vm(e,t={}){let n=await Jo(e,t.container,t.matchContainerIdPrefix??!0),r=cn(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("{")?$k(a):[{channel:"stdout",message:a}]}async function Hm(e,t,n={},r){let o=await Jo(e,n.container,n.matchContainerIdPrefix??!0),a=cn(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 Dk(s,t)}async function zm(e,t,n={},r){let o=await Nm(e),a=cn(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 Om(s,t)}async function Km(e,t,n={},r){let o=await Jo(e,n.container,n.matchContainerIdPrefix??!0),a=n.text??!0,s=n.bare??!0,i=cn(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 xk(l,t)}async function Gm(e,t,n={}){let r=await Ks(e,t),o=cn(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 qm(e,t,n,r={},o){let a=await Ks(e,t),s=cn(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 Om(i,n)}async function Bm(e){let t=await E(),n=e.replace(/^app_/,""),r=await W(t,{app_id:n});if(!r.success)throw new Error(r.error.message);return r.data.status}import ln from"chalk";import En from"semver";import Br from"fs";import Tk from"os";import Wm from"path";var Gs={};function Jm(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:Wm.join(Tk.homedir(),".phala-cloud")}function Yo(){return Wm.join(Jm(),"state.json")}function Mk(){let e=Jm();Br.existsSync(e)||Br.mkdirSync(e,{recursive:!0})}function Wr(){try{let e=Yo();if(!Br.existsSync(e))return Gs;let t=Br.readFileSync(e,"utf8"),n=JSON.parse(t);return!n||typeof n!="object"?Gs:n}catch{return Gs}}function Sn(e){Mk();let t={...Wr(),...e};Br.writeFileSync(Yo(),JSON.stringify(t,null,2),{mode:384,encoding:"utf8"})}function dr(e){return Wr()[e]}function Ym(e,t){Sn({[e]:t})}function Zm(){return Wr()}function Zo(){return typeof process.versions.bun=="string"?"bun":"node"}function Lk(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 Jr(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=Lk(r);if(o)return o}return"npm"}function Yr(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 Xm(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 Uk=200,Ok=1440*60*1e3,Nk="Phala-Network/phala-cloud",Qm="cli-v";function np(e,t){return`https://github.com/${Nk}/compare/${Qm}${e}...${Qm}${t}`}function Xo(e){return e?e==="1"||e.toLowerCase()==="true":!1}function ep(e){return typeof e=="string"&&e.trim().length>0}function jk(e){return e.startsWith("@")?e.replace("/","%2F"):e}function Fk(e){let n=En.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function rp(e,t,n){if(ep(t.PHALA_UPDATE_CHANNEL))return t.PHALA_UPDATE_CHANNEL;let r=n.get("updateCheckChannel");return ep(r)?r:Fk(e)??"latest"}function Vk(e){return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function qs(e,t){return`${e}_${Vk(t)}`}function tp(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 op(){return{get(e){return dr(e)},save(e){Sn(e)}}}function Qo(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:l=op()}=e;try{if(!i||s||Xo(a.CI)||Xo(a.PHALA_DISABLE_UPDATE_CHECK)||l.get("disableUpdateNotice")===!0)return null;let m=En.valid(r);if(!m)return null;let p=rp(r,a,l),d=qs("updateCheckLatest",p),f=l.get(d)??(p==="latest"?l.get("updateCheckLatest"):void 0),u=typeof f=="string"?En.valid(f):null;if(!u||!En.gt(u,m))return null;let h=Jr(a,o),g=h==="bun"?`${n}@${u}`:p==="latest"?`${n}@latest`:`${n}@${p}`,y=Yr(h,g),b=np(m,u);return{message:`${[ln.yellow(`Update available: v${m} -> v${u}${p==="latest"?"":` (${p})`}.`),ln.gray(b),ln.gray(`Update with: "${t} self update" (or "${y}").`),ln.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
121
+ ${r}`)}throw new Error(`Failed to save ${Pr}: ${n instanceof Error?n.message:String(n)}`)}}function Gn(){return xr()?H_():{}}function lm(e){if(!e)return;let{cvmId:t}=z.parse({id:e});return t}import Bn from"fs";import z_ from"os";import vs from"path";var Rt="https://cloud-api.phala.com/api/v1";function bs(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:vs.join(z_.homedir(),".phala-cloud")}function $r(){return vs.join(bs(),"credentials.json")}function Cs(){return vs.join(bs(),"api-key")}function K_(){let e=bs();Bn.existsSync(e)||Bn.mkdirSync(e,{recursive:!0})}function bo(e){return typeof e=="string"&&e.trim().length>0}function Wn(e){let t=e.trim();return t.length===0?"default":t}function Le(){try{let e=$r();if(!Bn.existsSync(e))return null;let t=Bn.readFileSync(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return null;let r=n;return r.schema_version!==1||!bo(r.current_profile)||!r.profiles||typeof r.profiles!="object"?null:r}catch(e){return m.error("Failed to read credentials file:",e),null}}function Co(e){K_(),Bn.writeFileSync($r(),JSON.stringify(e,null,2),{mode:384,encoding:"utf8"})}function mm(e){let t=Le(),n=Wn(e.profile||e.projectProfile||t?.current_profile||"default"),r=n;if(t&&!t.profiles[r]){let l=Object.entries(t.profiles).find(([,p])=>p?.workspace?.slug===n);if(l)r=l[0];else{let p=Object.entries(t.profiles).find(([,u])=>u?.workspace?.name===n);p&&(r=p[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(bo(e.apiToken))return{apiKey:e.apiToken,baseURL:s,profileName:r,tokenSource:"flag",apiPrefixSource:i};if(bo(e.env.PHALA_CLOUD_API_KEY))return{apiKey:e.env.PHALA_CLOUD_API_KEY,baseURL:s,profileName:r,tokenSource:"env",apiPrefixSource:i};let c=t?.profiles?.[r]?.token;return bo(c)?{apiKey:c,baseURL:s,profileName:r,tokenSource:"file",apiPrefixSource:i}:{apiKey:null,baseURL:s,profileName:r,tokenSource:"none",apiPrefixSource:i}}function Jn(e){let t=Wn(e.profileName),n=(e.apiPrefix||Rt).trim(),r=Le(),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()}}};Co(i)}function Yn(e){let t=Le();if(!t)return;let n=Wn(e||t.current_profile),r={...t.profiles};delete r[n];let o=Object.keys(r);if(o.length===0){try{Bn.unlinkSync($r())}catch(i){m.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};Co(s)}function pm(e,t){let n=Wn(e),r=Wn(t),o=Le();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;Co({...o,current_profile:s,profiles:a})}function Pt(){let e=Le();return e?Object.keys(e.profiles):[]}function Xn(e){let t=Wn(e),n=Le();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&&Co({...n,current_profile:t})}function Ne(){let e=Le();if(!e)return null;let t=e.current_profile,n=e.profiles[t];return n?{name:t,info:n}:null}var um="2026-06-23",q_=60;function ws(e){return e?.globalOptions?.timeout??q_}function G_(){return{env:process.env,projectConfig:Gn()}}function vt(e,t){let n=e??G_();return mm({env:n.env,apiToken:t?.apiToken??n.globalOptions?.apiToken,profile:t?.profile??n.globalOptions?.profile,projectProfile:n.projectConfig.profile})}async function A(e,t){let n=vt(e,t),r=ds()??um,o=ws(e);return ot({apiKey:n.apiKey??void 0,baseURL:n.baseURL,version:r,timeout:o*1e3})}async function wo(e,t){let n=vt(e,t);return{client:await A(e,t),auth:n}}async function _o(e,t){let n=ds()??um;return ot({apiKey:e,baseURL:t?.baseURL,version:n})}import{z as C}from"zod";var B_=C.object({password:C.string(),registry:C.string().nullable(),username:C.string()}),x$=C.object({docker_compose_file:C.string(),docker_config:B_.optional().nullable(),features:C.array(C.string()),kms_enabled:C.boolean(),manifest_version:C.number(),name:C.string(),public_logs:C.boolean(),public_sysinfo:C.boolean(),runner:C.string().optional(),salt:C.string().nullable().optional(),tproxy_enabled:C.boolean(),version:C.string().optional()}).passthrough(),$$=C.object({key:C.string(),value:C.string()}),W_=C.object({is_online:C.boolean(),is_public:C.boolean(),error:C.string().nullable(),internal_ip:C.string(),latest_handshake:C.string(),public_urls:C.array(C.object({app:C.string(),instance:C.string()}))}),J_=C.object({id:C.string(),name:C.string(),status:C.string(),teepod_id:C.number(),teepod:C.object({id:C.number(),name:C.string()}),user_id:C.string().nullable().optional(),app_id:C.string(),vm_uuid:C.string().nullable().optional(),instance_id:C.string().nullable().optional(),app_url:C.string().nullable().optional(),base_image:C.string().nullable().optional(),vcpu:C.number(),memory:C.number(),disk_size:C.number(),manifest_version:C.number().nullable().optional(),version:C.string().nullable().optional(),runner:C.string().nullable().optional(),docker_compose_file:C.string().nullable().optional(),features:C.array(C.string()).nullable().optional(),created_at:C.string(),encrypted_env_pubkey:C.string().nullable().optional()}),dm=C.object({is_online:C.boolean(),is_public:C.boolean(),error:C.string().nullable(),app_certificates:C.array(C.object({subject:C.object({common_name:C.string().nullable(),organization:C.string().nullable(),country:C.string().nullable(),state:C.string().nullable().optional(),locality:C.string().nullable().optional()}),issuer:C.object({common_name:C.string().nullable(),organization:C.string().nullable(),country:C.string().nullable()}),serial_number:C.string(),not_before:C.string(),not_after:C.string(),version:C.string(),fingerprint:C.string(),signature_algorithm:C.string(),sans:C.string().nullable(),is_ca:C.boolean(),position_in_chain:C.number(),quote:C.string().nullable()})).nullable(),tcb_info:C.object({mrtd:C.string(),rootfs_hash:C.string(),rtmr0:C.string(),rtmr1:C.string(),rtmr2:C.string(),rtmr3:C.string(),event_log:C.array(C.object({imr:C.number(),event_type:C.number(),digest:C.string(),event:C.string(),event_payload:C.string()}))}).nullable(),compose_file:C.string().nullable()}),Y_=C.object({name:C.string(),description:C.string().optional(),version:C.array(C.number()).optional(),is_dev:C.boolean().optional(),os_image_hash:C.string().nullable().optional(),rootfs_hash:C.string().optional(),shared_ro:C.boolean().optional(),cmdline:C.string().optional(),kernel:C.string().optional(),initrd:C.string().optional(),hda:C.string().nullable().optional(),rootfs:C.string().optional(),bios:C.string().optional()}),T$=C.object({teepod_id:C.number().nullable(),id:C.number().optional(),name:C.string(),listed:C.boolean().optional(),resource_score:C.number().optional(),remaining_vcpu:C.number().optional(),remaining_memory:C.number().optional(),remaining_cvm_slots:C.number().optional(),images:C.array(Y_).optional(),region_identifier:C.string().optional(),dedicated_for_team_id:C.number().nullable().optional(),support_onchain_kms:C.boolean().optional(),fmspc:C.string().nullable().optional(),device_id:C.string().nullable().optional()});import X_ from"inquirer";async function fm(){let e=m.startSpinner("Fetching available CVMs"),t=await A(),n=await _r(t);if(e.stop(!0),!n.success){m.error(`Failed to fetch CVMs: ${n.error.message}`);return}let{items:r}=n.data;if(r.length===0){m.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 X_.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:o}]);return a}async function gm(e){let t=await A(),n=e.replace(/^app_/,""),r=await t.get(`cvms/app_${n}/attestation`);try{return dm.parse(r)}catch(o){return m.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 _s(e,t,n,r,o){let a=await A(),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}`,i),!0}async function hm(e,t){let n=await A(),r=e.replace(/^app_/,"");return await n.put(`cvms/app_${r}/compose`,t)}function Zt(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 ym(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 Z_(e){return!e||/\s/.test(e)||e.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(e)}function Q_(e){if(!Z_(e))return e;try{return Buffer.from(e,"base64").toString("utf-8")}catch{return e}}function So(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:Q_(n.message)}}catch{return null}}function eS(e){let t=e.split(/\r?\n/),n=[];for(let r of t){if(!r.trim())continue;let o=So(r);if(o){n.push(o);continue}n.push({channel:"stdout",message:`${r}
122
+ `})}return n}function tS(e){let t=e.split(/\r?\n/),n="";for(let r of t){let o=So(r);if(o){n+=o.message;continue}r.trim()&&(n+=`${r}
123
+ `)}return n}async function nS(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 c=So(i);if(c){t(c.message);return}i.trim()&&t(`${i}
124
+ `)};for(;;){let{done:i,value:c}=await n.read();if(i)break;let l=r.decode(c,{stream:!0});if(a==="raw"){t(l);continue}if(o+=l,a==="unknown")if(o.trimStart().startsWith("{"))a="structured";else{a="raw",t(o),o="";continue}let p=o.indexOf(`
125
+ `);for(;p>=0;){let u=o.slice(0,p);o=o.slice(p+1),s(u),p=o.indexOf(`
126
+ `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function rS(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 c=So(i);if(c){t(c);return}i.trim()&&t({channel:"stdout",message:`${i}
127
+ `})};for(;;){let{done:i,value:c}=await n.read();if(i)break;let l=r.decode(c,{stream:!0});if(a==="raw"){t({channel:"stdout",message:l});continue}if(o+=l,a==="unknown")if(o.trimStart().startsWith("{"))a="structured";else{a="raw",t({channel:"stdout",message:o}),o="";continue}let p=o.indexOf(`
128
+ `);for(;p>=0;){let u=o.slice(0,p);o=o.slice(p+1),s(u),p=o.indexOf(`
129
+ `)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function Ss(e,t){let r=await(await A()).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 vm(e){return Ss(e,"serial")}async function ko(e,t,n=!0){let o=await(await A()).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(l=>l===t||l===`/${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 bm(e,t={}){let n=await vm(e),r=Zt(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 Cm(e,t={}){let n=await ko(e,t.container,t.matchContainerIdPrefix??!0),r=t.text??!0,o=t.bare??!0,a=Zt(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("{")?tS(i):i}async function wm(e,t={}){let n=await ko(e,t.container,t.matchContainerIdPrefix??!0),r=Zt(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("{")?eS(a):[{channel:"stdout",message:a}]}async function _m(e,t,n={},r){let o=await ko(e,n.container,n.matchContainerIdPrefix??!0),a=Zt(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 rS(s,t)}async function Sm(e,t,n={},r){let o=await vm(e),a=Zt(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 ym(s,t)}async function km(e,t,n={},r){let o=await ko(e,n.container,n.matchContainerIdPrefix??!0),a=n.text??!0,s=n.bare??!0,i=Zt(o,{...n,follow:!0,text:a,bare:s}),c=await fetch(i,{signal:r});if(!c.ok)throw new Error(`Failed to stream container logs: ${c.status} ${c.statusText}`);await nS(c,t)}async function Im(e,t,n={}){let r=await Ss(e,t),o=Zt(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 Em(e,t,n,r={},o){let a=await Ss(e,t),s=Zt(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 ym(i,n)}async function Am(e){let t=await A(),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 Qt from"chalk";import gn from"semver";import Tr from"fs";import oS from"os";import Rm from"path";var ks={};function Pm(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:Rm.join(oS.homedir(),".phala-cloud")}function Io(){return Rm.join(Pm(),"state.json")}function aS(){let e=Pm();Tr.existsSync(e)||Tr.mkdirSync(e,{recursive:!0})}function Dr(){try{let e=Io();if(!Tr.existsSync(e))return ks;let t=Tr.readFileSync(e,"utf8"),n=JSON.parse(t);return!n||typeof n!="object"?ks:n}catch{return ks}}function fn(e){aS();let t={...Dr(),...e};Tr.writeFileSync(Io(),JSON.stringify(t,null,2),{mode:384,encoding:"utf8"})}function Zn(e){return Dr()[e]}function xm(e,t){fn({[e]:t})}function $m(){return Dr()}function Eo(){return typeof process.versions.bun=="string"?"bun":"node"}function sS(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 Mr(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=sS(r);if(o)return o}return"npm"}function Ur(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 Tm(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 iS=200,cS=1440*60*1e3,lS="Phala-Network/phala-cloud",Dm="cli-v";function Lm(e,t){return`https://github.com/${lS}/compare/${Dm}${e}...${Dm}${t}`}function Ao(e){return e?e==="1"||e.toLowerCase()==="true":!1}function Mm(e){return typeof e=="string"&&e.trim().length>0}function mS(e){return e.startsWith("@")?e.replace("/","%2F"):e}function pS(e){let n=gn.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function Nm(e,t,n){if(Mm(t.PHALA_UPDATE_CHANNEL))return t.PHALA_UPDATE_CHANNEL;let r=n.get("updateCheckChannel");return Mm(r)?r:pS(e)??"latest"}function uS(e){return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function Is(e,t){return`${e}_${uS(t)}`}function Um(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 Om(){return{get(e){return Zn(e)},save(e){fn(e)}}}function Ro(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:c=Om()}=e;try{if(!i||s||Ao(a.CI)||Ao(a.PHALA_DISABLE_UPDATE_CHECK)||c.get("disableUpdateNotice")===!0)return null;let l=gn.valid(r);if(!l)return null;let p=Nm(r,a,c),u=Is("updateCheckLatest",p),f=c.get(u)??(p==="latest"?c.get("updateCheckLatest"):void 0),d=typeof f=="string"?gn.valid(f):null;if(!d||!gn.gt(d,l))return null;let h=Mr(a,o),g=h==="bun"?`${n}@${d}`:p==="latest"?`${n}@latest`:`${n}@${p}`,y=Ur(h,g),k=Lm(l,d);return{message:`${[Qt.yellow(`Update available: v${l} -> v${d}${p==="latest"?"":` (${p})`}.`),Qt.gray(k),Qt.gray(`Update with: "${t} self update" (or "${y}").`),Qt.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
130
130
  `)}
131
- `,currentVersion:m,latestVersion:u,packageName:n}}catch{return null}}async function ea(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,now:l=Date.now(),timeoutMs:m=Uk,ttlMs:p=Ok,fetchImpl:d=fetch,configStore:f=op()}=e;try{if(!i||s||Xo(a.CI)||Xo(a.PHALA_DISABLE_UPDATE_CHECK)||f.get("disableUpdateNotice")===!0)return null;let u=rp(r,a,f),h=qs("updateCheckLastAt",u),g=tp(f,h)??(u==="latest"?tp(f,"updateCheckLastAt"):void 0);if(g&&l-g<p)return Qo({executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:f});let b=`https://registry.npmjs.org/${jk(n)}`,w=new AbortController,S=setTimeout(()=>w.abort(),m);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;_=En.valid(M);let N=En.valid(r);if(!_||!N||!En.gt(_,N))return null;let G=Jr(a,o),oe=G==="bun"?`${n}@${_}`:u==="latest"?`${n}@latest`:`${n}@${u}`,se=Yr(G,oe),ae=np(N,_);return{message:`${[ln.yellow(`Update available: v${N} -> v${_}${u==="latest"?"":` (${u})`}.`),ln.gray(ae),ln.gray(`Update with: "${t} self update" (or "${se}").`),ln.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
131
+ `,currentVersion:l,latestVersion:d,packageName:n}}catch{return null}}async function Po(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,now:c=Date.now(),timeoutMs:l=iS,ttlMs:p=cS,fetchImpl:u=fetch,configStore:f=Om()}=e;try{if(!i||s||Ao(a.CI)||Ao(a.PHALA_DISABLE_UPDATE_CHECK)||f.get("disableUpdateNotice")===!0)return null;let d=Nm(r,a,f),h=Is("updateCheckLastAt",d),g=Um(f,h)??(d==="latest"?Um(f,"updateCheckLastAt"):void 0);if(g&&c-g<p)return Ro({executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:f});let k=`https://registry.npmjs.org/${mS(n)}`,_=new AbortController,E=setTimeout(()=>_.abort(),l);E.unref?.();let S,b=null;try{if(S=await u(k,{signal:_.signal,headers:{accept:"application/json"}}),!S.ok)return null;let I=await S.json();if(!I||typeof I!="object")return null;let x=I["dist-tags"];if(!x||typeof x!="object")return null;let U=x[d]??x.latest;if(typeof U!="string")return null;b=gn.valid(U);let M=gn.valid(r);if(!b||!M||!gn.gt(b,M))return null;let J=Mr(a,o),ce=J==="bun"?`${n}@${b}`:d==="latest"?`${n}@latest`:`${n}@${d}`,Z=Ur(J,ce),Q=Lm(M,b);return{message:`${[Qt.yellow(`Update available: v${M} -> v${b}${d==="latest"?"":` (${d})`}.`),Qt.gray(Q),Qt.gray(`Update with: "${t} self update" (or "${Z}").`),Qt.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
132
132
  `)}
133
- `,currentVersion:N,latestVersion:_,packageName:n}}finally{clearTimeout(S);let I=qs("updateCheckLatest",u);f.save({[h]:l,..._?{[I]:_}:{},...u==="latest"?{updateCheckLastAt:l,..._?{updateCheckLatest:_}:{}}:{}})}}catch{return null}}async function sp(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,stdout:l,stderr:m,stdin:p,env:d,cwd:f}=e,u=Kk(n);if((u.length>0?t.getNode(u):null)?.group){let _=n.slice(u.length),I=Hr(_,void 0);if(I.flags["--help"]||I.positionals.length===0)return ap({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:l,stderr:m,groupPath:u})}let g=t.resolveCommand(u);if(!g)return u.length>1&&t.getNode([u[0]])?.group?ap({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:l,stderr:m,groupPath:[u[0]]}):zk({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:l,stderr:m});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 m.write(`Unknown subcommand "${I}" for "${_}". Run \`${r} ${_} --help\` for usage.
134
- `),1}let S=n.slice(b.length),k=ir();try{let _=Hr(S,y.meta.options);zr(_.flags["--json"]===!0);let I=_.flags["--api-version"];if(typeof I=="string"){if(!vm(I))return m.write(`Invalid API version "${I}". Supported versions: ${bn.join(", ")}
135
- `),1;Cm(I)}if(_.flags["--version"])return l.write(`${o}
136
- `),0;if(_.flags["--help"])return l.write(`${Ls({executableName:r,definition:y,registry:t})}
137
- `),0;let M=!(y.path[0]==="self"&&y.path[1]==="update")?ea({executableName:r,packageName:a,currentVersion:s,runtime:i,env:d,isJson:_.flags["--json"]===!0,stderrIsTTY:m.isTTY===!0}):Promise.resolve(null);y.meta.stability==="deprecated"&&m.write(ur.yellow(`Warning: This command is deprecated and may be removed in a future version.
138
- `));let N=pm(y.meta,_),G={apiToken:typeof N.options.apiToken=="string"?N.options.apiToken:void 0,json:N.options.json===!0,interactive:N.options.json===!0?!1:N.options.interactive===!0,profile:typeof N.options.profile=="string"?N.options.profile:void 0,apiVersion:typeof I=="string"?I:void 0},oe={...N.options,...N.positionals,options:N.options,positionals:N.positionals,raw:N.raw},se,ae="cvmId"in oe?oe.cvmId:void 0,H=G.interactive;_.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] 'cvmId' in mergedInput:","cvmId"in oe),console.log("[DISPATCHER DEBUG] rawCvmId:",ae),console.log("[DISPATCHER DEBUG] mergedInput keys:",Object.keys(oe)));let Q=[...y.meta.arguments??[],...y.meta.options??[]].some(ue=>ue.target==="cvmId"||ue.name==="cvm-id"||ue.name==="cvm_id");if(H&&Q){let ue=await xm();ue&&(se={app_id:ue})}if(!se&&ae&&typeof ae=="string"&&(se={id:ae}),!se){let ue=k.cvm_id;ue&&(se={id:ue})}_.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] final cvmId:",JSON.stringify(se)),console.log("[DISPATCHER DEBUG] cvmId type:",typeof se),console.log("[DISPATCHER DEBUG] cvmId is undefined:",se===void 0));let ke={argv:S,rawFlags:_.flags,rawPositionals:_.positionals,cwd:f,env:d,stdout:l,stderr:m,stdin:p,projectConfig:k,globalOptions:G,cvmId:se,cli:{executableName:r,packageName:a,packageVersion:s,runtime:i},success(ue){if(te()){let fe=typeof ue=="string"?{success:!0,message:ue}:{success:!0,...typeof ue=="object"&&ue!==null?ue:{data:ue}};l.write(`${JSON.stringify(fe,null,2)}
139
- `)}else typeof ue=="string"?l.write(`${ur.green("\u2713")} ${ur.green(ue)}
140
- `):(l.write(`${ur.green("\u2713")} Success
141
- `),l.write(`${JSON.stringify(ue,null,2)}
142
- `))},fail(ue,fe){te()?l.write(`${JSON.stringify({success:!1,error:ue,...fe&&{details:fe}},null,2)}
143
- `):(m.write(`${ur.red("\u2717")} ${ur.red(ue)}
144
- `),fe&&m.write(`${JSON.stringify(fe,null,2)}
145
- `))}};_.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId after creation:",JSON.stringify(ke.cvmId));let Lt=y.schema.parse(oe),Ln=Object.freeze({...Lt,json:G.json,interactive:G.interactive,...G.apiToken!==void 0?{apiToken:G.apiToken}:{},...G.profile!==void 0?{profile:G.profile}:{}});_.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId before handler:",JSON.stringify(ke.cvmId));let Ar=await y.run(Ln,ke),hn=await M;return typeof Ar=="number"?(Ar===0&&hn&&!te()&&m.write(hn.message),Ar):(hn&&!te()&&m.write(hn.message),0)}catch(_){if(_ instanceof Hk){let I=_.issues.some(M=>M.code==="invalid_type"&&M.received==="undefined"&&M.message==="Required"),$=S.some(M=>!M.startsWith("-"));return I&&!$?(l.write(`${Ls({executableName:r,definition:y,registry:t})}
146
- `),0):(m.write(Gk(_)),1)}if(Bs(_))return m.write(`${_.message}
147
- `),1;throw _}}function zk(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:l,stdout:m,stderr:p}=e;try{let d=Hr(n,void 0);if(d.flags["--version"])return m.write(`${o}
148
- `),0;if(d.flags["--help"])return m.write(`${Fo({registry:t,executableName:r})}
149
- `),0;if(d.positionals.length===0){m.write(`${Fo({registry:t,executableName:r})}
150
- `);let u=Qo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:l,isJson:!1,stderrIsTTY:p.isTTY===!0});return u&&p.write(u.message),0}let f=d.positionals.join(" ");return p.write(`Unknown command "${f}". Run \`${r} --help\` for a list of commands.
151
- `),1}catch(d){if(Bs(d))return p.write(`${d.message}
152
- `),1;throw d}}function ap(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:l,stdout:m,stderr:p,groupPath:d}=e;try{let f=n.slice(d.length),u=Hr(f,void 0);if(u.flags["--version"])return m.write(`${o}
153
- `),0;if(u.flags["--help"]||u.positionals.length===0){if(m.write(`${hm({registry:t,executableName:r,groupPath:d})}
154
- `),!u.flags["--help"]){let y=Qo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:l,isJson:!1,stderrIsTTY:p.isTTY===!0});y&&p.write(y.message)}return 0}let h=u.positionals.join(" "),g=d.join(" ");return p.write(`Unknown subcommand "${h}" for "${g}". Run \`${r} ${g} --help\` for a list of subcommands.
155
- `),1}catch(f){if(Bs(f))return p.write(`${f.message}
156
- `),1;throw f}}function Kk(e){let t=[];for(let n of e){if(n.startsWith("-"))break;t.push(n)}return t}function Gk(e){let t=e.issues[0];return t?`Invalid value for "${t.path.length>0?t.path.join("."):"input"}": ${t.message}
133
+ `,currentVersion:M,latestVersion:b,packageName:n}}finally{clearTimeout(E);let I=Is("updateCheckLatest",d);f.save({[h]:c,...b?{[I]:b}:{},...d==="latest"?{updateCheckLastAt:c,...b?{updateCheckLatest:b}:{}}:{}})}}catch{return null}}async function Fm(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,stdout:c,stderr:l,stdin:p,env:u,cwd:f}=e,d=gS(n);if((d.length>0?t.getNode(d):null)?.group){let b=n.slice(d.length),I=Ar(b,void 0);if(I.flags["--help"]||I.positionals.length===0)return jm({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:u,stdout:c,stderr:l,groupPath:d})}let g=t.resolveCommand(d);if(!g)return d.length>1&&t.getNode([d[0]])?.group?jm({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:u,stdout:c,stderr:l,groupPath:[d[0]]}):fS({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:u,stdout:c,stderr:l});let{definition:y,consumed:k,remaining:_}=g;if(_.length>0&&(!y.meta.arguments||y.meta.arguments.length===0)){let b=k.join(" "),I=_.join(" ");return l.write(`Unknown subcommand "${I}" for "${b}". Run \`${r} ${b} --help\` for usage.
134
+ `),1}let E=n.slice(k.length),S=Gn();try{let b=Ar(E,y.meta.options);Rr(b.flags["--json"]===!0);let I=b.flags["--api-version"];if(typeof I=="string"){if(!om(I))return l.write(`Invalid API version "${I}". Supported versions: ${mn.join(", ")}
135
+ `),1;am(I)}if(b.flags["--version"])return c.write(`${o}
136
+ `),0;if(b.flags["--help"])return c.write(`${us({executableName:r,definition:y,registry:t})}
137
+ `),0;let U=!(y.path[0]==="self"&&y.path[1]==="update")?Po({executableName:r,packageName:a,currentVersion:s,runtime:i,env:u,isJson:b.flags["--json"]===!0,stderrIsTTY:l.isTTY===!0}):Promise.resolve(null);y.meta.stability==="deprecated"&&l.write(Qn.yellow(`Warning: This command is deprecated and may be removed in a future version.
138
+ `));let M=Xl(y.meta,b),J=M.options.timeout,ce;if(typeof J=="number"){if(!Number.isFinite(J)||J<=0)return l.write(`Invalid --timeout value "${J}". Must be a positive number of seconds.
139
+ `),1;ce=J}let Z={apiToken:typeof M.options.apiToken=="string"?M.options.apiToken:void 0,json:M.options.json===!0,interactive:M.options.json===!0?!1:M.options.interactive===!0,profile:typeof M.options.profile=="string"?M.options.profile:void 0,apiVersion:typeof I=="string"?I:void 0,timeout:ce},Q={...M.options,...M.positionals,options:M.options,positionals:M.positionals,raw:M.raw},$,B="cvmId"in Q?Q.cvmId:void 0,Pe=Z.interactive;b.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] 'cvmId' in mergedInput:","cvmId"in Q),console.log("[DISPATCHER DEBUG] rawCvmId:",B),console.log("[DISPATCHER DEBUG] mergedInput keys:",Object.keys(Q)));let Tt=[...y.meta.arguments??[],...y.meta.options??[]].some(ae=>ae.target==="cvmId"||ae.name==="cvm-id"||ae.name==="cvm_id");if(Pe&&Tt){let ae=await fm();ae&&($={app_id:ae})}if(!$&&B&&typeof B=="string"&&($={id:B}),!$){let ae=S.cvm_id;ae&&($={id:ae})}b.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] final cvmId:",JSON.stringify($)),console.log("[DISPATCHER DEBUG] cvmId type:",typeof $),console.log("[DISPATCHER DEBUG] cvmId is undefined:",$===void 0));let Kt={argv:E,rawFlags:b.flags,rawPositionals:b.positionals,cwd:f,env:u,stdout:c,stderr:l,stdin:p,projectConfig:S,globalOptions:Z,cvmId:$,cli:{executableName:r,packageName:a,packageVersion:s,runtime:i},success(ae){if(te()){let Ke=typeof ae=="string"?{success:!0,message:ae}:{success:!0,...typeof ae=="object"&&ae!==null?ae:{data:ae}};c.write(`${JSON.stringify(Ke,null,2)}
140
+ `)}else typeof ae=="string"?c.write(`${Qn.green("\u2713")} ${Qn.green(ae)}
141
+ `):(c.write(`${Qn.green("\u2713")} Success
142
+ `),c.write(`${JSON.stringify(ae,null,2)}
143
+ `))},fail(ae,Ke){te()?c.write(`${JSON.stringify({success:!1,error:ae,...Ke&&{details:Ke}},null,2)}
144
+ `):(l.write(`${Qn.red("\u2717")} ${Qn.red(ae)}
145
+ `),Ke&&l.write(`${JSON.stringify(Ke,null,2)}
146
+ `))}};b.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId after creation:",JSON.stringify(Kt.cvmId));let Sa=y.schema.parse(Q),Gr=Object.freeze({...Sa,json:Z.json,interactive:Z.interactive,...Z.apiToken!==void 0?{apiToken:Z.apiToken}:{},...Z.profile!==void 0?{profile:Z.profile}:{}});b.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId before handler:",JSON.stringify(Kt.cvmId));let Br=await y.run(Gr,Kt),we=await U;return typeof Br=="number"?(Br===0&&we&&!te()&&l.write(we.message),Br):(we&&!te()&&l.write(we.message),0)}catch(b){if(b instanceof dS){let I=b.issues.some(U=>U.code==="invalid_type"&&U.received==="undefined"&&U.message==="Required"),x=E.some(U=>!U.startsWith("-"));return I&&!x?(c.write(`${us({executableName:r,definition:y,registry:t})}
147
+ `),0):(l.write(hS(b)),1)}if(Es(b))return l.write(`${b.message}
148
+ `),1;throw b}}function fS(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:c,stdout:l,stderr:p}=e;try{let u=Ar(n,void 0);if(u.flags["--version"])return l.write(`${o}
149
+ `),0;if(u.flags["--help"])return l.write(`${yo({registry:t,executableName:r})}
150
+ `),0;if(u.positionals.length===0){l.write(`${yo({registry:t,executableName:r})}
151
+ `);let d=Ro({executableName:r,packageName:a,currentVersion:s,runtime:i,env:c,isJson:!1,stderrIsTTY:p.isTTY===!0});return d&&p.write(d.message),0}let f=u.positionals.join(" ");return p.write(`Unknown command "${f}". Run \`${r} --help\` for a list of commands.
152
+ `),1}catch(u){if(Es(u))return p.write(`${u.message}
153
+ `),1;throw u}}function jm(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:c,stdout:l,stderr:p,groupPath:u}=e;try{let f=n.slice(u.length),d=Ar(f,void 0);if(d.flags["--version"])return l.write(`${o}
154
+ `),0;if(d.flags["--help"]||d.positionals.length===0){if(l.write(`${nm({registry:t,executableName:r,groupPath:u})}
155
+ `),!d.flags["--help"]){let y=Ro({executableName:r,packageName:a,currentVersion:s,runtime:i,env:c,isJson:!1,stderrIsTTY:p.isTTY===!0});y&&p.write(y.message)}return 0}let h=d.positionals.join(" "),g=u.join(" ");return p.write(`Unknown subcommand "${h}" for "${g}". Run \`${r} ${g} --help\` for a list of subcommands.
156
+ `),1}catch(f){if(Es(f))return p.write(`${f.message}
157
+ `),1;throw f}}function gS(e){let t=[];for(let n of e){if(n.startsWith("-"))break;t.push(n)}return t}function hS(e){let t=e.issues[0];return t?`Invalid value for "${t.path.length>0?t.path.join("."):"input"}": ${t.message}
157
158
  `:`${e.message}
158
- `}function Bs(e){return e instanceof Error&&Object.prototype.hasOwnProperty.call(e,"code")&&typeof e.code=="string"}import cp from"crypto";import In from"fs";import fr from"os";import lp from"path";function qk(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:lp.join(fr.homedir(),".phala-cloud")}function Bk(){return lp.join(qk(),"config.json")}function ip(e){return/^[0-9a-fA-F]+$/.test(e)}function Wk(e){let n=e.trim().split(":");if(n.length!==2)return!1;let[r,o]=n;return r.length===32&&ip(r)&&o.length>0&&ip(o)}function Jk(){let e=[fr.hostname(),fr.platform(),fr.arch(),fr.cpus()[0]?.model||"",fr.userInfo().username],t=cp.createHash("sha256");return t.update(e.join("|")),t.digest()}function Yk(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=cp.createDecipheriv("aes-256-cbc",t.slice(0,32),r),s=a.update(o,"hex","utf8");return s+=a.final("utf8"),s}function Zr(e){try{In.unlinkSync(e)}catch{}}function Zk(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 Xk(){return async({token:e,baseURL:t})=>{let n=ot({apiKey:e,baseURL:t}),r=await je(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 mp(e){await Qk(e),await eS(e)}async function Qk(e){let t=qr();if(In.existsSync(t)){let i=Vs();In.existsSync(i)&&Zr(i);return}let n=Vs();if(!In.existsSync(n))return;let r=In.readFileSync(n,"utf8").trim();if(!r)return;let o;try{o=Wk(r)?Yk(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||xt,s=e.fetchCurrentUser??Xk();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,m=l.workspace_name||"default",p=l.workspace_slug,d=p||"default";lr({profileName:d,token:o,apiPrefix:a,workspaceName:m,workspaceSlug:p,user:{username:l.username||"unknown",email:l.email},setCurrent:!0}),Zr(n),e.stderr.write(`Migrated legacy credentials into ${t} (profile: ${d}).
159
+ `}function Es(e){return e instanceof Error&&Object.prototype.hasOwnProperty.call(e,"code")&&typeof e.code=="string"}import Hm from"crypto";import hn from"fs";import er from"os";import zm from"path";function yS(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:zm.join(er.homedir(),".phala-cloud")}function vS(){return zm.join(yS(),"config.json")}function Vm(e){return/^[0-9a-fA-F]+$/.test(e)}function bS(e){let n=e.trim().split(":");if(n.length!==2)return!1;let[r,o]=n;return r.length===32&&Vm(r)&&o.length>0&&Vm(o)}function CS(){let e=[er.hostname(),er.platform(),er.arch(),er.cpus()[0]?.model||"",er.userInfo().username],t=Hm.createHash("sha256");return t.update(e.join("|")),t.digest()}function wS(e){let t=CS(),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=Hm.createDecipheriv("aes-256-cbc",t.slice(0,32),r),s=a.update(o,"hex","utf8");return s+=a.final("utf8"),s}function Lr(e){try{hn.unlinkSync(e)}catch{}}function _S(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 SS(){return async({token:e,baseURL:t})=>{let n=ot({apiKey:e,baseURL:t}),r=await Ve(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 Km(e){await kS(e),await IS(e)}async function kS(e){let t=$r();if(hn.existsSync(t)){let i=Cs();hn.existsSync(i)&&Lr(i);return}let n=Cs();if(!hn.existsSync(n))return;let r=hn.readFileSync(n,"utf8").trim();if(!r)return;let o;try{o=bS(r)?wS(r):r}catch{e.stderr.write(`Legacy credentials could not be migrated (possibly due to machine change). Please run 'phala login' again.
160
+ `);return}let a=e.env.PHALA_CLOUD_API_PREFIX||Rt,s=e.fetchCurrentUser??SS();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.
161
+ `);return}let c=i.data,l=c.workspace_name||"default",p=c.workspace_slug,u=p||"default";Jn({profileName:u,token:o,apiPrefix:a,workspaceName:l,workspaceSlug:p,user:{username:c.username||"unknown",email:c.email},setCurrent:!0}),Lr(n),e.stderr.write(`Migrated legacy credentials into ${t} (profile: ${u}).
161
162
  `)}catch{e.stderr.write(`Legacy credentials could not be migrated. Please run 'phala login' again.
162
- `)}}async function eS(e){let t=Yo(),n=Bk();if(In.existsSync(n))try{let r=In.readFileSync(n,"utf8"),o=JSON.parse(r);if(!o||typeof o!="object"){Zr(n);return}let a=Zk(o);if(Object.keys(a).length>0){let s=Wr();Sn({...s,...a}),e.stderr.write(`Migrated legacy config into ${t}.
163
- `)}Zr(n)}catch{Zr(n)}}function pp(e){return{name:e,children:new Map,aliasMap:new Map}}var ta=class{constructor(){this.root=pp(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],m=this.getChild(n,l);if(!m)break;n=m,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=pp(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 Ws}from"fs";import{dirname as rS,join as oS}from"path";import{fileURLToPath as aS}from"url";function C(e){return{path:e.path,meta:e.meta,schema:e.schema,run:e.handler}}import tS from"@michaelhomer/jqjs";function dp(e,t){let r=[...tS.compile(t)(e)];return r.length===1?r[0]:r}function up(e,t=2){return e==null?String(e):typeof e=="string"?e:JSON.stringify(e,null,t)}import{z as Fe}from"zod";var nS=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],fp={name:"api",category:"advanced",description:`Make an authenticated HTTP request to Phala Cloud API.
163
+ `)}}async function IS(e){let t=Io(),n=vS();if(hn.existsSync(n))try{let r=hn.readFileSync(n,"utf8"),o=JSON.parse(r);if(!o||typeof o!="object"){Lr(n);return}let a=_S(o);if(Object.keys(a).length>0){let s=Dr();fn({...s,...a}),e.stderr.write(`Migrated legacy config into ${t}.
164
+ `)}Lr(n)}catch{Lr(n)}}function qm(e){return{name:e,children:new Map,aliasMap:new Map}}var xo=class{constructor(){this.root=qm(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 c=t[i],l=this.getChild(n,c);if(!l)break;n=l,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=qm(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 Rs}from"fs";import{dirname as AS,join as RS}from"path";import{fileURLToPath as PS}from"url";function v(e){return{path:e.path,meta:e.meta,schema:e.schema,run:e.handler}}import ES from"@michaelhomer/jqjs";function Gm(e,t){let r=[...ES.compile(t)(e)];return r.length===1?r[0]:r}function Bm(e,t=2){return e==null?String(e):typeof e=="string"?e:JSON.stringify(e,null,t)}import{z as ze}from"zod";var As=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],Wm={name:"api",category:"advanced",description:`Make an authenticated HTTP request to Phala Cloud API.
164
165
 
165
166
  The endpoint should be an API path like "/cvms" or "/users/me".
166
167
 
@@ -183,123 +184,81 @@ Use -q to filter JSON output with jq syntax (built-in, no jq installation needed
183
184
  ENVIRONMENT VARIABLES
184
185
 
185
186
  PHALA_CLOUD_API_KEY Override the API key (useful for CI/CD)
186
- PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...an,{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"}]},gp=Fe.object({endpoint:Fe.string(),method:Fe.enum(nS).default("GET").transform(e=>e.toUpperCase()),query:Fe.array(Fe.string()).optional(),field:Fe.array(Fe.string()).optional(),header:Fe.array(Fe.string()).optional(),data:Fe.array(Fe.string()).optional(),input:Fe.string().optional(),include:Fe.boolean().default(!1),jq:Fe.string().optional(),silent:Fe.boolean().default(!1),apiToken:Fe.string().optional()});var sS=aS(import.meta.url),iS=rS(sS),cS=oS(iS,"../../../package.json"),hp="unknown";try{hp=JSON.parse(Ws(cS,"utf-8")).version||"unknown"}catch{}function na(e){return e==="-"?Ws(0,"utf-8"):Ws(e,"utf-8")}function lS(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 mS(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]=na(a.slice(1)):t[o]=a}}return t}function pS(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=na(i);try{t[a]=JSON.parse(l)}catch{throw new Error(`Failed to parse JSON from file "${i}" for field "${a}"`)}}else t[a]=lS(s);continue}let o=n.indexOf("=");if(o>0){let a=n.slice(0,o),s=n.slice(o+1);s.startsWith("@")?t[a]=na(s.slice(1)):t[a]=s}}return t}function dS(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 uS(e,t){let n=t.toLowerCase();return Object.keys(e).some(r=>r.toLowerCase()===n)}function fS(e){return!["GET","HEAD","OPTIONS"].includes(e)}function yp(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=na(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=pS(e.field);return Object.keys(n).length===0?{body:void 0}:{body:n}}return{body:void 0}}function gS(e,t){let{body:n}=yp(e),r=mS(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 hS(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=ot({apiKey:n.apiKey,baseURL:n.baseURL,headers:{"User-Agent":`phala-cli/${hp}`}}),o=dS(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}=yp(e);l&&!uS(o,"content-type")&&(o["Content-Type"]=l);let m=gS(e,i);if(m.body!==void 0&&!fS(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.
188
- `),1;let p=await r.requestFull(m.endpoint,{method:m.method,body:m.body,headers:o});if(e.include&&(t.stdout.write(`HTTP/1.1 ${p.status} ${p.statusText}
189
- `),p.headers.forEach((d,f)=>{t.stdout.write(`${f}: ${d}
187
+ PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...Yt,{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"}]},Jm=ze.object({endpoint:ze.string(),method:ze.enum(As).default("GET").transform(e=>e.toUpperCase()),query:ze.array(ze.string()).optional(),field:ze.array(ze.string()).optional(),header:ze.array(ze.string()).optional(),data:ze.array(ze.string()).optional(),input:ze.string().optional(),include:ze.boolean().default(!1),jq:ze.string().optional(),silent:ze.boolean().default(!1),apiToken:ze.string().optional()});var xS=PS(import.meta.url),$S=AS(xS),TS=RS($S,"../../../package.json"),Ym="unknown";try{Ym=JSON.parse(Rs(TS,"utf-8")).version||"unknown"}catch{}function $o(e){return e==="-"?Rs(0,"utf-8"):Rs(e,"utf-8")}function DS(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 MS(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]=$o(a.slice(1)):t[o]=a}}return t}function US(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),c=$o(i);try{t[a]=JSON.parse(c)}catch{throw new Error(`Failed to parse JSON from file "${i}" for field "${a}"`)}}else t[a]=DS(s);continue}let o=n.indexOf("=");if(o>0){let a=n.slice(0,o),s=n.slice(o+1);s.startsWith("@")?t[a]=$o(s.slice(1)):t[a]=s}}return t}function LS(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 NS(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 Xm(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=$o(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=US(e.field);return Object.keys(n).length===0?{body:void 0}:{body:n}}return{body:void 0}}var jS=new Set(As);function FS(e){return jS.has(e.toUpperCase())}function VS(e,t="phala"){let[n,r]=e;if(!n||!r||!FS(n))return;let o=n.toUpperCase(),a=r.startsWith("/")?r:`/${r}`;return[`Error: Invalid API command usage. "${n}" looks like an HTTP method, but methods must be passed with -X/--method.`,"","Correct examples:",` ${t} api ${a}`,` ${t} api ${a} -X ${o}`].join(`
188
+ `)}function HS(e,t){let{body:n}=Xm(e),r=MS(e.query),o=t;if(Object.keys(r).length>0){let a=new URLSearchParams;for(let[i,c]of Object.entries(r))a.append(i,c);let s=o.includes("?")?"&":"?";o=`${o}${s}${a.toString()}`}return{method:e.method,endpoint:o,body:n}}async function zS(e,t){let n=VS(t.rawPositionals,t.cli?.executableName);if(n)return t.stderr.write(`${n}
189
+ `),1;let r=vt(t,{apiToken:e.apiToken});if(!r.apiKey)return t.stderr.write(`Error: Not authenticated. Run "phala login" first.
190
+ `),1;let o=ot({apiKey:r.apiKey,baseURL:r.baseURL,headers:{"User-Agent":`phala-cli/${Ym}`}}),a=LS(e.header),s=e.endpoint.startsWith("/")?e.endpoint:`/${e.endpoint}`,i=s.indexOf("?"),c=i>=0?`${s.slice(0,i)}?${new URLSearchParams(s.slice(i+1)).toString()}`:s;try{let{defaultContentType:l}=Xm(e);l&&!NS(a,"content-type")&&(a["Content-Type"]=l);let p=HS(e,c);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.
191
+ `),1;let u=await o.requestFull(p.endpoint,{method:p.method,body:p.body,headers:a});if(e.include&&(t.stdout.write(`HTTP/1.1 ${u.status} ${u.statusText}
192
+ `),u.headers.forEach((f,d)=>{t.stdout.write(`${d}: ${f}
190
193
  `)}),t.stdout.write(`
191
- `)),!e.silent&&p.data!==void 0){let d=p.data;if(e.jq)try{d=dp(d,e.jq)}catch(u){return t.stderr.write(`Error: jq filter failed: ${u.message}
192
- `),1}let f=up(d);t.stdout.write(`${f}
193
- `)}return p.ok?0:1}catch(l){let m=l;return t.stderr.write(`Error: ${m.message}
194
- `),1}}var vp=C({path:["api"],meta:fp,schema:gp,handler:hS});var Cp={path:["auth"],meta:{name:"auth",category:"deprecated",description:"Authenticate with Phala Cloud",stability:"deprecated"}};import yS from"prompts";var ie=process.env.CLOUD_URL||"https://cloud.phala.com";var Xr=1,Qr=2048,An=40,Js="dstack-0.3.6",bp=`version: '3.8'
195
- services:
196
- postgres:
197
- image: ankane/pgvector:latest
198
- environment:
199
- - POSTGRES_PASSWORD=postgres
200
- - POSTGRES_USER=postgres
201
- - POSTGRES_DB=eliza
202
- - PGDATA=/var/lib/postgresql/data/pgdata
203
- volumes:
204
- - postgres-data:/var/lib/postgresql/data:rw
205
- ports:
206
- - '127.0.0.1:5432:5432'
207
- healthcheck:
208
- test: ['CMD-SHELL', 'pg_isready -U $\${POSTGRES_USER} -d $\${POSTGRES_DB}']
209
- interval: 5s
210
- timeout: 5s
211
- retries: 5
212
- restart: always
213
- networks:
214
- - eliza-network
215
- eliza:
216
- image: {{imageName}}
217
- command: bun run start
218
- volumes:
219
- - /var/run/tappd.sock:/var/run/tappd.sock
220
- environment:
221
- {{#each envVars}} - {{{this}}}
222
- {{/each}}
223
- ports:
224
- - '3000:3000'
225
- - '50000-50100:50000-50100/udp'
226
- depends_on:
227
- postgres:
228
- condition: service_healthy
229
- restart: always
230
- networks:
231
- - eliza-network
232
-
233
-
234
- networks:
235
- eliza-network:
236
- driver: bridge
237
-
238
- volumes:
239
- postgres-data:`,wp=`version: '3.8'
240
- services:
241
- app:
242
- image: {{imageName}}
243
- container_name: app
244
- volumes:
245
- - /var/run/tappd.sock:/var/run/tappd.sock
246
- environment:
247
- {{#each envVars}} - {{{this}}}
248
- {{/each}}
249
- restart: always
250
- `;import{z as ra}from"zod";var _p={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"}]},kp=ra.object({apiKey:ra.string().min(1,"API key cannot be empty").optional(),manual:ra.boolean().optional(),noOpen:ra.boolean().optional()});async function Ys(e){let t=await Bo(e.apiKey,{baseURL:e.baseURL}),n=await je(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 vS(e){let t,n=await yS({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 Ys({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 Ys({apiKey:n.apiKey,baseURL:e.baseURL})),{apiKey:n.apiKey,user:t}}async function CS(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||xt,r=e.apiKey,o;if(r)o=await Ys({apiKey:r,baseURL:n});else{let l=await vS({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 lr({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 ${ie}/dashboard/`),0}catch(n){return c.error("Failed to set API key"),c.logDetailedError(n),1}}var Sp=C({path:["auth","login"],meta:_p,schema:kp,handler:CS});import{z as bS}from"zod";var Ep={name:"logout",description:"Remove stored API key (use 'phala logout' instead)",stability:"deprecated"},Ip=bS.object({});async function wS(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=Te()?.current_profile;mr();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 Ap=C({path:["auth","logout"],meta:Ep,schema:Ip,handler:wS});import{z as oa}from"zod";var de={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Zs={name:"debug",shorthand:"d",description:"Enable debug output",type:"boolean",target:"debug"},Pp={name:"status",category:"profile",description:"Check authentication status",stability:"stable",options:[...an,de,Zs],examples:[{name:"Show login status",value:"phala status"},{name:"Get status as JSON",value:"phala status --json"}]},aa=oa.object({json:oa.boolean().default(!1),debug:oa.boolean().default(!1),apiToken:oa.string().optional()});async function Xs(e,t){let n=e.debug||t.env.DEBUG?.toLowerCase()==="true",{client:r,auth:o}=await qo(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 je(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}
251
- `),t.stdout.write(`API Version: ${l}
194
+ `)),!e.silent&&u.data!==void 0){let f=u.data;if(e.jq)try{f=Gm(f,e.jq)}catch(h){return t.stderr.write(`Error: jq filter failed: ${h.message}
195
+ `),1}let d=Bm(f);t.stdout.write(`${d}
196
+ `)}return u.ok?0:1}catch(l){let p=l;return t.stderr.write(`Error: ${p.message}
197
+ `),1}}var Zm=v({path:["api"],meta:Wm,schema:Jm,handler:zS});var Qm={path:["auth"],meta:{name:"auth",category:"deprecated",description:"Authenticate with Phala Cloud",stability:"deprecated"}};import KS from"prompts";var le=process.env.CLOUD_URL||"https://cloud.phala.com";var Ps=40;import{z as To}from"zod";var ep={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"}]},tp=To.object({apiKey:To.string().min(1,"API key cannot be empty").optional(),manual:To.boolean().optional(),noOpen:To.boolean().optional()});async function xs(e){let t=await _o(e.apiKey,{baseURL:e.baseURL}),n=await Ve(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 qS(e){let t,n=await KS({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 xs({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 xs({apiKey:n.apiKey,baseURL:e.baseURL})),{apiKey:n.apiKey,user:t}}async function GS(e,t){m.warn('The "phala auth login" command is deprecated and will be removed in a future version.'),m.info('Please use "phala login" instead for a better experience.'),m.break();try{let n=t.env.PHALA_CLOUD_API_PREFIX||Rt,r=e.apiKey,o;if(r)o=await xs({apiKey:r,baseURL:n});else{let c=await qS({baseURL:n});r=c.apiKey,o=c.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 Jn({profileName:i,token:r,apiPrefix:n,workspaceName:a,workspaceSlug:s,user:{username:o.username,email:o.email},setCurrent:!0}),m.success(`Welcome ${o.username}! Credentials saved successfully (profile: ${i})`),m.break(),m.info(`Open in Web UI at ${le}/dashboard/`),0}catch(n){return m.error("Failed to set API key"),m.logDetailedError(n),1}}var np=v({path:["auth","login"],meta:ep,schema:tp,handler:GS});import{z as BS}from"zod";var rp={name:"logout",description:"Remove stored API key (use 'phala logout' instead)",stability:"deprecated"},op=BS.object({});async function WS(e,t){m.warn('The "phala auth logout" command is deprecated and will be removed in a future version.'),m.info('Please use "phala logout" instead.'),m.break();try{let r=Le()?.current_profile;Yn();let o=r?`Credentials removed successfully (profile: ${r})`:"Credentials removed successfully";return t.globalOptions?.json?(t.success({message:o,profile:r||null}),0):(m.success(o),0)}catch(n){return t.globalOptions?.json?(t.fail("Failed to remove credentials"),1):(m.error("Failed to remove credentials"),m.logDetailedError(n),1)}}var ap=v({path:["auth","logout"],meta:rp,schema:op,handler:WS});import{z as Do}from"zod";var ue={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},$s={name:"debug",shorthand:"d",description:"Enable debug output",type:"boolean",target:"debug"},sp={name:"status",category:"profile",description:"Check authentication status",stability:"stable",options:[...Yt,ue,$s],examples:[{name:"Show login status",value:"phala status"},{name:"Get status as JSON",value:"phala status --json"}]},Mo=Do.object({json:Do.boolean().default(!1),debug:Do.boolean().default(!1),apiToken:Do.string().optional()});async function Ts(e,t){let n=e.debug||t.env.DEBUG?.toLowerCase()==="true",{client:r,auth:o}=await wo(t,{apiToken:e.apiToken});if(!o.apiKey)return m.warn('Not authenticated. Please set an API key with "phala login"'),0;n&&(m.debug(`Using API key: ${o.apiKey.substring(0,5)}... (source=${o.tokenSource}, profile=${o.profileName})`),m.debug(`Using API prefix: ${o.baseURL} (source=${o.apiPrefixSource})`));try{let a=await Ve(r);if(!a.success)return m.error("Failed to get user information"),a.error&&m.error(`Error: ${a.error.message}`),t.fail(a.error?.message||"Failed to get user information"),1;let s=a.data,i=o.baseURL,c=r.config.version;if(e.json)return t.success({apiUrl:i,apiVersion:c,username:s.user.username,team_name:s.workspace.name,profile:o.profileName}),0;if(t.stdout.write(`Integrated API: ${i}
198
+ `),t.stdout.write(`API Version: ${c}
252
199
  `),t.stdout.write(`Logged in as: ${s.user.username}
253
200
  `),t.stdout.write(`Current Workspace: ${s.workspace.name}
254
201
  `),t.stdout.write(`Current Profile: ${o.profileName}
255
- `),t.cli){let m=await ea({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(`
256
- ${m.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 $p=C({path:["status"],meta:Pp,schema:aa,handler:Xs});var Rp={name:"status",description:"Check auth status (use 'phala status' instead)",stability:"deprecated",options:[...an,de,Zs]},xp=aa;var Dp=C({path:["auth","status"],meta:Rp,schema:xp,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()),Xs(e,t))});var Qs={group:Cp,commands:[Sp,Ap,Dp]};var Tp={path:["config"],meta:{name:"config",category:"deprecated",description:"Manage local CLI state",stability:"deprecated"}};import{z as Mp}from"zod";var Lp={name:"get",description:"Get a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0}]},Up=Mp.object({key:Mp.string()});async function _S(e,t){c.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=dr(e.key);return n===void 0?(t.stderr.write(`Configuration key '${e.key}' not found
202
+ `),t.cli){let l=await Po({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});l?t.stderr.write(`
203
+ ${l.message}`):t.stdout.write(`CLI is up to date.
204
+ `)}return 0}catch(a){return m.error("Authentication failed. Your API key may be invalid or expired."),m.info('Please set a new API key with "phala login"'),n&&m.logDetailedError(a),t.fail("Authentication failed. Your API key may be invalid or expired."),1}}var ip=v({path:["status"],meta:sp,schema:Mo,handler:Ts});var cp={name:"status",description:"Check auth status (use 'phala status' instead)",stability:"deprecated",options:[...Yt,ue,$s]},lp=Mo;var mp=v({path:["auth","status"],meta:cp,schema:lp,handler:async(e,t)=>(e.json||(m.warn('The "phala auth status" command is deprecated and will be removed in a future version.'),m.info('Please use "phala status" instead.'),m.break()),Ts(e,t))});var Ds={group:Qm,commands:[np,ap,mp]};var pp={path:["config"],meta:{name:"config",category:"deprecated",description:"Manage local CLI state",stability:"deprecated"}};import{z as up}from"zod";var dp={name:"get",description:"Get a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0}]},fp=up.object({key:up.string()});async function JS(e,t){m.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=Zn(e.key);return n===void 0?(t.stderr.write(`Configuration key '${e.key}' not found
258
205
  `),1):(t.stdout.write(`${e.key}: ${JSON.stringify(n)}
259
206
  `),0)}catch(n){return t.stderr.write(`Failed to get configuration value
260
- `),c.logDetailedError(n),1}}var Op=C({path:["config","get"],meta:Lp,schema:Up,handler:_S});import{z as Np}from"zod";var jp={name:"list",aliases:["ls"],description:"List config values",stability:"stable",options:[{name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json"}]},Fp=Np.object({json:Np.boolean().default(!1)});async function kS(e,t){c.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=Zm();if(e.json)return t.success(n),0;t.stdout.write(`Configuration values:
207
+ `),m.logDetailedError(n),1}}var gp=v({path:["config","get"],meta:dp,schema:fp,handler:JS});import{z as hp}from"zod";var yp={name:"list",aliases:["ls"],description:"List config values",stability:"stable",options:[{name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json"}]},vp=hp.object({json:hp.boolean().default(!1)});async function YS(e,t){m.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=$m();if(e.json)return t.success(n),0;t.stdout.write(`Configuration values:
261
208
  `);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 Vp=C({path:["config","list"],meta:jp,schema:Fp,handler:kS});import{z as ei}from"zod";var Hp={name:"set",description:"Set a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0},{name:"value",description:"Configuration value",required:!0}]},zp=ei.object({key:ei.string(),value:ei.string()});async function SS(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.'),Ym(e.key,n),t.stdout.write(`Configuration value for '${e.key}' set successfully
209
+ `);return 0}catch(n){return m.logDetailedError(n),t.fail("Failed to list configuration values"),1}}var bp=v({path:["config","list"],meta:yp,schema:vp,handler:YS});import{z as Ms}from"zod";var Cp={name:"set",description:"Set a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0},{name:"value",description:"Configuration value",required:!0}]},wp=Ms.object({key:Ms.string(),value:Ms.string()});async function XS(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 m.warn('The "phala config" commands are deprecated and will be removed in a future version.'),xm(e.key,n),t.stdout.write(`Configuration value for '${e.key}' set successfully
263
210
  `),0}catch(n){return t.stderr.write(`Failed to set configuration value
264
- `),c.logDetailedError(n),1}}var Kp=C({path:["config","set"],meta:Hp,schema:zp,handler:SS});var ti={group:Tp,commands:[Op,Vp,Kp]};var Gp={path:["cvms"],meta:{name:"cvms",category:"manage",description:"Manage CVMs",stability:"unstable"}};import ia from"chalk";import{z as sa}from"zod";var qp={name:"attestation",description:"Get CVM attestation",stability:"unstable",arguments:[X],options:[de,j],examples:[{name:"Show attestation summary",value:"phala cvms attestation"},{name:"Output full attestation JSON",value:"phala cvms attestation --json"}]},Bp=sa.object({cvmId:sa.string().optional(),interactive:sa.boolean().default(!1),json:sa.boolean().default(!1)});async function ES(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 W(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 Dm(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?ia.green("Online"):ia.red("Offline"),"Public Access":i.is_public?ia.green("Enabled"):ia.yellow("Disabled"),Error:i.error||"None",Certificates:`${i.app_certificates?.length||0} found`},{borderStyle:"rounded"}),i.app_certificates?.length&&i.app_certificates.forEach((l,m)=>{c.break(),c.success(`Certificate #${m+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(m=>m.event).map(m=>({Event:m.event,IMR:m.imr.toString(),"Event Type":m.event_type.toString(),Payload:m.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 Wp=C({path:["cvms","attestation"],meta:qp,schema:Bp,handler:ES});import nd from"fs";import RS from"path";import ni from"fs";import ri from"path";import IS from"inquirer";function at(e,t=process.cwd()){let n=ri.resolve(t,e);if(!ni.existsSync(n))throw new Error(`File not found at ${n}`);return!0}async function Ft(e,t,n="file",r=process.cwd()){return(await IS.prompt([{type:"input",name:n,message:e,default:t,validate:a=>{let s=ri.resolve(r,a);return ni.existsSync(s)?!0:`File not found at ${s}`}}]))[n]}function gr(e,t){for(let n of e){let r=ri.join(process.cwd(),n);if(ni.existsSync(r))return t?c.info(t.replace("{path}",r)):c.info(`File detected: ${r}`),n}}import*as Jp from"fs";var eo=(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=Jp.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(),m=o.substring(a+1),p=!1,d="",f=-1;for(let g=0;g<m.length;g++)if((m[g]==='"'||m[g]==="'"||m[g]==="`")&&(g===0||m[g-1]!=="\\"))p&&m[g]===d?(p=!1,d=""):p||(p=!0,d=m[g]);else if(m[g]==="#"&&!p&&g>0&&m[g-1]===" "){f=g-1;break}else if(m[g]==="#"&&!p&&g===0){f=g;break}f!==-1&&(m=m.substring(0,f)),m===void 0&&(m="");let u=m.charAt(0),h=m.charAt(m.length-1);u==='"'&&h==='"'||u==="'"&&h==="'"||u==="`"&&h==="`"?(m=m.substring(1,m.length-1),u==='"'&&(m=m.replace(/\\\\n/g,`
266
- `))):m=m.trim(),l&&(n[l]=m)}}return Object.entries(n).map(([r,o])=>({key:r,value:o}))};import{execSync as Vt,spawn as AS}from"child_process";import*as ne from"fs";import*as oi from"net";import*as Tt from"os";import*as mt from"path";var Le={version:"0.5.3",baseUrl:"https://github.com/Dstack-TEE/dstack/releases/download/v0.5.3",installDir:mt.join(Tt.homedir(),".phala-cloud","simulator"),defaultLogPath:mt.join(Tt.homedir(),".phala-cloud","logs","dstack-simulator.log"),platforms:{darwin:{filename:"dstack-simulator-0.5.3-aarch64-apple-darwin.tgz",extractedFolder:"0.5.3",socketPath:mt.join(Tt.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:mt.join(Tt.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 Yp(){try{if(!ne.existsSync(Le.installDir))return!1;let e=Tt.platform();if(!Le.platforms[e])throw new Error(`Unsupported platform: ${e}`);let t=mt.join(Le.installDir,Le.platforms[e].extractedFolder);if(!ne.existsSync(t))return!1;let r=mt.join(t,e==="win32"?"dstack-simulator.exe":"dstack-simulator");return ne.existsSync(r)}catch(e){return c.error("Error checking if simulator is installed:",e),!1}}function to(){let e=Tt.platform();if(!Le.platforms[e])throw new Error(`Unsupported platform: ${e}. Only darwin, linux, and win32 are supported.`);return e}async function Zp(e){let t=n=>{c.info(n),e&&e(n)};try{let n=to(),r=Le.platforms[n];if(n==="win32"){try{Vt("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.")}ne.existsSync(Le.installDir)||(c.info(`Creating installation directory at ${Le.installDir}`),ne.mkdirSync(Le.installDir,{recursive:!0})),process.chdir(Le.installDir);let o=`${Le.baseUrl}/${r.filename}`;c.info(`Downloading simulator from ${o}`),Vt(`wget ${o}`,{stdio:"inherit"});let a=mt.join(Le.installDir,r.extractedFolder);ne.existsSync(a)||ne.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{Vt(s,{stdio:"inherit"}),ne.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 ai=()=>mt.join(Tt.tmpdir(),"dstack-simulator.pid");function PS(e){return Buffer.byteLength(e,"utf8")>104}function ca(){try{let e=ai();if(ne.existsSync(e)){let t=Number.parseInt(ne.readFileSync(e,"utf-8").trim(),10);try{return process.kill(t,0),t}catch{ne.unlinkSync(e)}}return null}catch(e){return c.warn("Error checking simulator PID:",e),null}}function $S(e,t){try{let n=ai();t&&c.info(`Saving simulator PID ${e} to: ${n}`),ne.writeFileSync(n,e.toString(),"utf-8")}catch(n){c.warn("Failed to save simulator PID:",n)}}async function Xp(e={}){try{let t=to(),n=Le.platforms[t],r=mt.join(Le.installDir,n.extractedFolder),o=ca();if(o)throw new Error(`Simulator is already running with PID: ${o}`);if(t!=="win32"&&PS(n.socketPath))throw new Error(`Socket path is too long (${n.socketPath.length} chars, max 104): ${n.socketPath}`);if(t!=="win32"&&ne.existsSync(n.socketPath)){c.warn(`Removing existing socket file: ${n.socketPath}`);try{ne.unlinkSync(n.socketPath)}catch(m){c.warn(`Failed to remove existing socket file: ${m}`)}}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??Le.defaultLogPath};if(s.logToFile){let m=mt.dirname(s.logFilePath);ne.existsSync(m)||ne.mkdirSync(m,{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",ne.openSync(s.logFilePath,"a"),ne.openSync(s.logFilePath,"a")]:"inherit",l=AS(a,[],{stdio:i,shell:t==="win32",detached:s.background});if(s.logToFile&&Array.isArray(i)&&(typeof i[1]=="number"&&ne.closeSync(i[1]),typeof i[2]=="number"&&ne.closeSync(i[2])),s.logToFile){let p=`
267
- === Simulator started at ${new Date().toISOString()} ===
268
- Command: ${a}
269
-
270
- `;ne.appendFileSync(s.logFilePath,p)}return l.pid&&$S(l.pid,e.verbose),s.background&&(l.unref(),e.verbose&&c.success("Simulator is running in the background")),await ii(),l}catch(t){throw c.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function no(){try{let e=to(),t=Le.platforms[e];if(e==="darwin"||e==="linux"){let n=t.socketPath;return ne.existsSync(n)?new Promise(r=>{let o=oi.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=oi.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 Qp(){try{let e=ca();if(!await no()&&!e)return c.info("Simulator is not running"),!0;let n=to(),r=!1;if(n==="win32")try{e?(c.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Vt("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")):Vt("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=ai();if(ne.existsSync(o))try{ne.unlinkSync(o)}catch(a){c.warn("Failed to remove PID file:",a)}return await Pn(),r&&c.success("Simulator stopped successfully"),r}catch(e){return c.error("Error stopping simulator:",e),!1}}function si(){let e=to(),t=Le.platforms[e];return e==="win32"?"http://127.0.0.1:8090":`${t.socketPath||"/tmp/dstack.sock"}`}async function ii(e){try{let t=si(),n=e||t;await Vt(`export DSTACK_SIMULATOR_ENDPOINT=${n}`);let r=n.replace(/dstack\.sock$/,"tappd.sock");return await Vt(`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 Pn(){try{return await Vt("unset DSTACK_SIMULATOR_ENDPOINT"),await Vt("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 rd from"inquirer";import{z as kt}from"zod";var ed={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: ${Xr})`,type:"string",target:"vcpu"},{name:"memory",description:`Memory in MB (default: ${Qr})`,type:"string",target:"memory"},{name:"disk-size",description:`Disk size in GB (default: ${An})`,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"}]},td=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 xS(e){if(e)return e;let{value:t}=await rd.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 DS(e){if(e)return e;let n=gr(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return await Ft("Enter the path to your Docker Compose file:",n,"file")}async function TS(e){if(e.envFile)return eo([],e.envFile);if(e.skipEnv)return c.info("Skipping environment variable prompt"),[];let{shouldSkip:t}=await rd.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 Ft("Enter the path to your environment file:",".env","file");return eo([],n)}function ci(e,t){if(!e)return t;let n=Number(e);return Number.isFinite(n)?n:t}function MS(e,t){return!Number.isFinite(t)||t<=0?`Invalid ${e}: ${t}`:null}async function LS(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 US(e,t){let n=e.images??[];return t?n.find(r=>r.name===t):n.find(r=>r.name===Js)}async function OS(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 xS(e.name),r=await DS(e.compose),o=RS.resolve(r);if(!nd.existsSync(o))return c.error(`Docker Compose file not found: ${o}`),1;let a=nd.readFileSync(o,"utf8");await Pn(),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 TS(e)}catch(_){return c.error(`Failed to read environment file: ${_ instanceof Error?_.message:String(_)}`),1}let i=ci(e.vcpu,Xr),l=ci(e.memory,Qr),m=ci(e.diskSize,An);for(let[_,I]of[["number of vCPUs",i],["memory",l],["disk size",m]]){let $=MS(_,I);if($)return c.error($),1}let p=c.startSpinner("Fetching available TEEPods"),d=await Um(!0);p.stop(!0);let f=await LS(e.teepodId,d);if(!f)return c.error("Failed to find suitable TEEPod"),1;let u=US(f,e.image);if(!u)return c.error(e.image?`Failed to find selected image: ${e.image}`:`Failed to find default image ${Js}`),1;let h={teepod_id:f.teepod_id,name:n,image:u.name,vcpu:i,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: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 Tm(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,Ae.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 Mm({...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||`${ie}/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 od=C({path:["cvms","create"],meta:ed,schema:td,handler:OS});import NS from"inquirer";import{z as ro}from"zod";var ad={name:"delete",description:"Delete a CVM",stability:"unstable",arguments:[X],options:[j,{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"}]},sd=ro.object({cvmId:ro.string().optional(),interactive:ro.boolean().default(!1),force:ro.boolean().default(!1),yes:ro.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 W(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:m}=await NS.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete CVM "${s}"? This action cannot be undone.`,default:!1}]);if(!m)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 Nr(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 id=C({path:["cvms","delete"],meta:ad,schema:sd,handler:jS});import ma from"chalk";var FS=/\x1b\[[0-9;]*m/g,cd=e=>e.replace(FS,"").length,VS=(e,t)=>e+" ".repeat(Math.max(0,t-cd(e)));function le(e,t){let n={};for(let o of e){n[o]=o.length;for(let a of t)n[o]=Math.max(n[o],cd(a[o]??""))}let r=o=>e.map(a=>VS(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 la}from"zod";var ld={name:"device-allowlist",description:"Show device allowlist status for a CVM's app",stability:"unstable",arguments:[X],options:[de,j],examples:[{name:"Check device allowlist",value:"phala cvms device-allowlist app_abc123"}]},md=la.object({cvmId:la.string().optional(),json:la.boolean().default(!1),interactive:la.boolean().default(!1)});async function HS(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 W(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 Uo(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?ma.green("yes"):ma.red("no")}`),i.devices.length===0)return c.info("No devices found for this app."),0;let l=["DEVICE_ID","NODE","CVMS","STATUS"],m=i.devices.map(p=>({DEVICE_ID:p.device_id,NODE:p.node_name??"-",CVMS:p.cvm_ids.join(", ")||"-",STATUS:p.status==="allowed"?ma.green(p.status):ma.red(p.status)}));return le(l,m),0}catch(n){return c.logDetailedError(n),t.fail(`Failed to get device allowlist: ${n instanceof Error?n.message:String(n)}`),1}}var pd=C({path:["cvms","device-allowlist"],meta:ld,schema:md,handler:HS});import li from"chalk";import{z as pa}from"zod";var dd={name:"get",description:"Get details of a CVM",stability:"unstable",arguments:[X],options:[de,j],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"}]},ud=pa.object({cvmId:pa.string().optional(),json:pa.boolean().default(!1),interactive:pa.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=c.startSpinner("Fetching CVM details"),r=await E(t),o=await W(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"?li.green(a.status):a.status==="stopped"?li.red(a.status):li.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":`${ie}/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 fd=C({path:["cvms","get"],meta:dd,schema:ud,handler:zS});import ua from"chalk";function KS(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 da(e,t){let n=await cm(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(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),i={};for(let m of KS(s,100)){let p=await Lo(e,{vmUuids:m});if(!p.success)return{success:!1,error:{message:p.error.message}};for(let[d,f]of Object.entries(p.data))i[d]={status:f.status,uptime:f.uptime,in_progress:f.in_progress}}let l=[];for(let m of a){let p=m.current_cvm;if(!p?.vm_uuid)continue;let d=i[p.vm_uuid],f=d?d.status:typeof p.status=="string"?p.status:"unknown";l.push({appId:m.app_id,cvmName:p.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 st}from"zod";var gd={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"},Se],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"}]},hd=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 GS(e){return e.toLowerCase().endsWith("ing")?ua.yellow(e):e==="running"?ua.green(e):e==="stopped"?ua.red(e):ua.yellow(e)}async function qS(e,t){try{let n=await E(t),r=await da(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:GS(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(c.info("No CVMs found"),0):(le(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 yd=C({path:["cvms","list"],meta:gd,schema:hd,handler:qS});import{z as BS}from"zod";var vd={name:"list-nodes",description:"List worker nodes",stability:"unstable"},Cd=BS.object({});async function WS(e,t){try{let n=await E(t),r=t.globalOptions?.json===!0,o=await n.get("teepods/cvm-create-resources"),{nodes:a,kms_nodes:s,gateway_nodes:i,instance_types:l}=o;if(r)return t.success({nodes:a??[],kmsList:s??[],gatewayNodes:i??[],instanceTypes:l??[]}),0;if(!a||a.length===0)return c.info("No available nodes found."),0;c.info("Available Nodes:");for(let m of a)if(c.info("----------------------------------------"),c.info(` ID: ${m.teepod_id}`),c.info(` Name: ${m.name}`),c.info(` Region: ${m.region_identifier}`),c.info(` FMSPC: ${m.fmspc||"N/A"}`),c.info(` Device ID: ${m.device_id||"N/A"}`),c.info(` Support Onchain KMS: ${m.support_onchain_kms}`),c.info(" Images:"),m.images&&m.images.length>0)for(let p of m.images)c.info(` - ${p.name}`),c.info(` Hash: ${p.os_image_hash||"N/A"}`);else c.info(" N/A");if(s&&s.length>0){c.info(`
272
- Available KMS Instances:`);for(let m of s)c.info("----------------------------------------"),c.info(` ID: ${m.id}`),c.info(` URL: ${m.url}`),c.info(` Version: ${m.version}`),c.info(` KMS Type: ${m.kms_type}`),c.info(` Chain ID: ${m.chain_id}`),c.info(` Contract ID: ${m.kms_contract_id}`),c.info(` Contract Address: ${m.kms_contract_address}`),c.info(` Gateway App ID: ${m.gateway_app_id}`)}if(i&&i.length>0){c.info(`
273
- Available Gateways:`);for(let m of i)c.info("----------------------------------------"),c.info(` ID: ${m.id}`),c.info(` TEEPod ID: ${m.teepod_id??"N/A"}`),c.info(` Contract ID: ${m.kms_contract_id}`),c.info(` RPC URL: ${m.rpc_url??"N/A"}`),c.info(` Domain Suffix: ${m.domain_suffix??"N/A"}`)}if(l&&l.length>0){c.info(`
274
- Available Instance Types:`);for(let m of l)c.info("----------------------------------------"),c.info(` ID: ${m.id}`),c.info(` Name: ${m.name}`),c.info(` vCPU: ${m.vcpu}`),c.info(` Memory MB: ${m.memory_mb}`),c.info(` Default Disk GB: ${m.default_disk_size_gb}`),c.info(` Requires GPU: ${m.requires_gpu}`)}return 0}catch(n){return t.fail("Failed to list available nodes"),c.logDetailedError(n),1}}var bd=C({path:["cvms","list-nodes"],meta:vd,schema:Cd,handler:WS});async function oo(e,t){try{let n=await E(t),r=await W(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 fa(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}=z.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 m=new AbortController,p=!1,d=()=>{p=!0,m.abort()};process.on("SIGINT",d),process.on("SIGTERM",d);try{await e.streamLogs(a,f=>process.stdout.write(f),s,m.signal)}catch(f){if(f.name!=="AbortError")throw f}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d)}return p&&(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 oo(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 oo(a,o),1}}}import{z as mn}from"zod";var wd={name:"logs",description:"Fetch container logs from a CVM",stability:"deprecated",arguments:[X],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"},de,j],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"}]},_d=mn.object({cvmId:mn.string().optional(),tail:mn.number().optional(),follow:mn.boolean().default(!1),timestamps:mn.boolean().default(!1),container:mn.string().optional(),json:mn.boolean().default(!1),interactive:mn.boolean().default(!1)});var JS=fa({logType:"container",fetchLogs:Fm,streamLogs:Km},e=>({tail:e.tail,timestamps:e.timestamps,container:e.container})),kd=C({path:["cvms","logs"],meta:wd,schema:_d,handler:JS});import Pd from"fs";import YS from"path";async function pn(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 tr(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 pt}from"zod";var Sd={name:"replicate",description:"Create a replica of an existing CVM",stability:"unstable",arguments:[X],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"},Qe,qe,{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"},sr,j],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>"}]},Ed=pt.object({cvmId:pt.string().optional(),nodeId:pt.string().optional(),composeHash:pt.string().optional(),envFile:pt.string().optional(),privateKey:pt.string().optional(),rpcUrl:pt.string().optional(),prepareOnly:pt.boolean().default(!1),commit:pt.boolean().default(!1),token:pt.string().optional(),transactionHash:pt.string().optional(),interactive:pt.boolean().default(!1)});function ZS(e){return Pd.readFileSync(e,"utf-8").split(`
275
- `).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function XS(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function QS(e){if(e.status!==465)return null;let n=XS(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 e0(e,t,n){if(!n)return;let r=YS.resolve(process.cwd(),n);if(!Pd.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=ZS(r),a=await pn(e,t);return(0,Ae.encryptEnvVars)(o,a)}async function t0(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Ot(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 mi(e,t,n){if(te()){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"?`${ie}/${o}/apps/${e.app_id}/instances/${i}`:typeof e.app_url=="string"?e.app_url:"-",m=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:"-",p=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: ${p}`,`Node: ${m} (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(`
211
+ `),m.logDetailedError(n),1}}var _p=v({path:["config","set"],meta:Cp,schema:wp,handler:XS});var Us={group:pp,commands:[gp,bp,_p]};var Sp={path:["cvms"],meta:{name:"cvms",category:"manage",description:"Manage CVMs",stability:"unstable"}};import Lo from"chalk";import{z as Uo}from"zod";var kp={name:"attestation",description:"Get CVM attestation",stability:"unstable",arguments:[X],options:[ue,O],examples:[{name:"Show attestation summary",value:"phala cvms attestation"},{name:"Output full attestation JSON",value:"phala cvms attestation --json"}]},Ip=Uo.object({cvmId:Uo.string().optional(),interactive:Uo.boolean().default(!1),json:Uo.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 A(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=m.startSpinner(`Fetching attestation information for CVM app_${a}...`);try{let i=await gm(a);if(s.stop(!0),!i)return t.fail("No attestation information found"),1;if(e.json)return t.success(i),0;if(m.success("Attestation Summary:"),m.keyValueTable({Status:i.is_online?Lo.green("Online"):Lo.red("Offline"),"Public Access":i.is_public?Lo.green("Enabled"):Lo.yellow("Disabled"),Error:i.error||"None",Certificates:`${i.app_certificates?.length||0} found`},{borderStyle:"rounded"}),i.app_certificates?.length&&i.app_certificates.forEach((c,l)=>{m.break(),m.success(`Certificate #${l+1} (${c.position_in_chain===0?"End Entity":"CA"}):`),m.keyValueTable({Subject:`${c.subject.common_name||"Unknown"}${c.subject.organization?` (${c.subject.organization})`:""}`,Issuer:`${c.issuer.common_name||"Unknown"}${c.issuer.organization?` (${c.issuer.organization})`:""}`,"Serial Number":c.serial_number,Validity:`${new Date(c.not_before).toLocaleString()} to ${new Date(c.not_after).toLocaleString()}`,Fingerprint:c.fingerprint,"Signature Algorithm":c.signature_algorithm,"Is CA":c.is_ca?"Yes":"No","Position in Chain":c.position_in_chain},{borderStyle:"rounded"})}),i.tcb_info&&(m.break(),m.success("Trusted Computing Base (TCB) Information:"),m.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)){m.break(),m.success("Event Log (Showing entries to reproduce RTMR3):");let c=i.tcb_info.event_log.filter(l=>l.event).map(l=>({Event:l.event,IMR:l.imr.toString(),"Event Type":l.event_type.toString(),Payload:l.event_payload}));m.table(c,[{key:"Event",header:"Event"},{key:"IMR",header:"IMR"},{key:"Event Type",header:"Type"},{key:"Payload",header:"Payload"}]),i.tcb_info.event_log.length>c.length&&m.info("To see all full attestation data, use --json"),m.break(),m.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 m.logDetailedError(n),t.fail(`Failed to get attestation information: ${n instanceof Error?n.message:String(n)}`),1}}var Ep=v({path:["cvms","attestation"],meta:kp,schema:Ip,handler:ZS});import QS from"inquirer";import{z as Nr}from"zod";var Ap={name:"delete",description:"Delete a CVM",stability:"unstable",arguments:[X],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"}]},Rp=Nr.object({cvmId:Nr.string().optional(),interactive:Nr.boolean().default(!1),force:Nr.boolean().default(!1),yes:Nr.boolean().default(!1)});async function ek(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await A(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:l}=await QS.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete CVM "${s}"? This action cannot be undone.`,default:!1}]);if(!l)return r?(t.success({deleted:!1,cancelled:!0,cvm:s}),0):(m.info("Deletion cancelled"),0)}let i=m.startSpinner(`Deleting CVM ${s}`),c=await Sr(n,t.cvmId);return i.stop(!0),c.success?r?(t.success({deleted:!0,cvm:s}),0):(m.success(`CVM ${s} deleted successfully`),0):(t.fail(`Failed to delete CVM ${s}: ${c.error.message}`),1)}catch(n){return t.fail("Failed to delete CVM"),m.logDetailedError(n),1}}var Pp=v({path:["cvms","delete"],meta:Ap,schema:Rp,handler:ek});import Oo from"chalk";var tk=/\x1b\[[0-9;]*m/g,xp=e=>e.replace(tk,"").length,nk=(e,t)=>e+" ".repeat(Math.max(0,t-xp(e)));function ie(e,t){let n={};for(let o of e){n[o]=o.length;for(let a of t)n[o]=Math.max(n[o],xp(a[o]??""))}let r=o=>e.map(a=>nk(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 No}from"zod";var $p={name:"device-allowlist",description:"Show device allowlist status for a CVM's app",stability:"unstable",arguments:[X],options:[ue,O],examples:[{name:"Check device allowlist",value:"phala cvms device-allowlist app_abc123"}]},Tp=No.object({cvmId:No.string().optional(),json:No.boolean().default(!1),interactive:No.boolean().default(!1)});async function rk(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await A(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 uo(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 m.info("This app does not use on-chain KMS."),0;if(m.info(`Chain: ${i.chain_id??"N/A"} Contract: ${i.app_contract_address??"N/A"}`),m.info(`Allow Any Device: ${i.allow_any_device?Oo.green("yes"):Oo.red("no")}`),i.devices.length===0)return m.info("No devices found for this app."),0;let c=["DEVICE_ID","NODE","CVMS","STATUS"],l=i.devices.map(p=>({DEVICE_ID:p.device_id,NODE:p.node_name??"-",CVMS:p.cvm_ids.join(", ")||"-",STATUS:p.status==="allowed"?Oo.green(p.status):Oo.red(p.status)}));return ie(c,l),0}catch(n){return m.logDetailedError(n),t.fail(`Failed to get device allowlist: ${n instanceof Error?n.message:String(n)}`),1}}var Dp=v({path:["cvms","device-allowlist"],meta:$p,schema:Tp,handler:rk});import Ls from"chalk";import{z as jo}from"zod";var Mp={name:"get",description:"Get details of a CVM",stability:"unstable",arguments:[X],options:[ue,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"}]},Up=jo.object({cvmId:jo.string().optional(),json:jo.boolean().default(!1),interactive:jo.boolean().default(!1)});async function ok(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=m.startSpinner("Fetching CVM details"),r=await A(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;m.break();let s=a.status==="running"?Ls.green(a.status):a.status==="stopped"?Ls.red(a.status):Ls.yellow(a.status);return m.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":`${le}/dashboard/cvms/app_${a.app_id}`}),0}catch(n){return m.logDetailedError(n),t.fail(`Failed to get CVM details: ${n instanceof Error?n.message:String(n)}`),1}}var Lp=v({path:["cvms","get"],meta:Mp,schema:Up,handler:ok});import Vo from"chalk";function ak(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 Fo(e,t){let n=await Hl(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,cause:n.error}};let r=n.data,a=(r.dstack_apps??[]).filter(l=>l.current_cvm&&typeof l.current_cvm=="object"&&"vm_uuid"in l.current_cvm&&!!l.current_cvm.vm_uuid),s=a.map(l=>l.current_cvm?.vm_uuid).filter(l=>typeof l=="string"&&l.length>0),i={};for(let l of ak(s,100)){let p=await po(e,{vmUuids:l});if(!p.success)return{success:!1,error:{message:p.error.message,cause:p.error}};for(let[u,f]of Object.entries(p.data))i[u]={status:f.status,uptime:f.uptime,in_progress:f.in_progress}}let c=[];for(let l of a){let p=l.current_cvm;if(!p?.vm_uuid)continue;let u=i[p.vm_uuid],f=u?u.status:typeof p.status=="string"?p.status:"unknown";c.push({appId:l.app_id,cvmName:p.name,status:f,uptime:u?.uptime})}return{success:!0,data:{page:r.page,pageSize:r.page_size,total:r.total,totalPages:r.total_pages,items:c}}}import{z as st}from"zod";var Np={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"},fe],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"}]},Op=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 sk(e){return e!==null&&typeof e=="object"&&"code"in e&&e.code==="TIMEOUT"}function ik(e){return`Request timed out after ${e}s.
212
+ Retry with --timeout <seconds> to allow more time.`}function ck(e){return e.toLowerCase().endsWith("ing")?Vo.yellow(e):e==="running"?Vo.green(e):e==="stopped"?Vo.red(e):Vo.yellow(e)}async function lk(e,t){try{let n=await A(t),r=await Fo(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){let i=r.error.cause;m.logDetailedError(i??r.error);let c=sk(i)?ik(ws(t)):r.error.message;return t.fail(c),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:ck(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(m.info("No CVMs found"),0):(ie(a,s),m.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(n){return m.logDetailedError(n),t.fail(`Failed to list CVMs: ${n instanceof Error?n.message:String(n)}`),1}}var jp=v({path:["cvms","list"],meta:Np,schema:Op,handler:lk});import{z as mk}from"zod";var Fp={name:"list-nodes",description:"List worker nodes",stability:"unstable"},Vp=mk.object({});async function pk(e,t){try{let n=await A(t),r=t.globalOptions?.json===!0,o=await n.get("teepods/cvm-create-resources"),{nodes:a,kms_nodes:s,gateway_nodes:i,instance_types:c}=o;if(r)return t.success({nodes:a??[],kmsList:s??[],gatewayNodes:i??[],instanceTypes:c??[]}),0;if(!a||a.length===0)return m.info("No available nodes found."),0;m.info("Available Nodes:");for(let l of a)if(m.info("----------------------------------------"),m.info(` ID: ${l.teepod_id}`),m.info(` Name: ${l.name}`),m.info(` Region: ${l.region_identifier}`),m.info(` FMSPC: ${l.fmspc||"N/A"}`),m.info(` Device ID: ${l.device_id||"N/A"}`),m.info(` Support Onchain KMS: ${l.support_onchain_kms}`),m.info(" Images:"),l.images&&l.images.length>0)for(let p of l.images)m.info(` - ${p.name}`),m.info(` Hash: ${p.os_image_hash||"N/A"}`);else m.info(" N/A");if(s&&s.length>0){m.info(`
213
+ Available KMS Instances:`);for(let l of s)m.info("----------------------------------------"),m.info(` ID: ${l.id}`),m.info(` URL: ${l.url}`),m.info(` Version: ${l.version}`),m.info(` KMS Type: ${l.kms_type}`),m.info(` Chain ID: ${l.chain_id}`),m.info(` Contract ID: ${l.kms_contract_id}`),m.info(` Contract Address: ${l.kms_contract_address}`),m.info(` Gateway App ID: ${l.gateway_app_id}`)}if(i&&i.length>0){m.info(`
214
+ Available Gateways:`);for(let l of i)m.info("----------------------------------------"),m.info(` ID: ${l.id}`),m.info(` TEEPod ID: ${l.teepod_id??"N/A"}`),m.info(` Contract ID: ${l.kms_contract_id}`),m.info(` RPC URL: ${l.rpc_url??"N/A"}`),m.info(` Domain Suffix: ${l.domain_suffix??"N/A"}`)}if(c&&c.length>0){m.info(`
215
+ Available Instance Types:`);for(let l of c)m.info("----------------------------------------"),m.info(` ID: ${l.id}`),m.info(` Name: ${l.name}`),m.info(` vCPU: ${l.vcpu}`),m.info(` Memory MB: ${l.memory_mb}`),m.info(` Default Disk GB: ${l.default_disk_size_gb}`),m.info(` Requires GPU: ${l.requires_gpu}`)}return 0}catch(n){return t.fail("Failed to list available nodes"),m.logDetailedError(n),1}}var Hp=v({path:["cvms","list-nodes"],meta:Fp,schema:Vp,handler:pk});async function Or(e,t){try{let n=await A(t),r=await G(n,{id:e});if(r.success&&r.data.public_logs===!1)return m.warn("Logs are disabled for this CVM (public_logs=false)."),m.warn("To enable logs, run:"),m.warn(` phala deploy --cvm-id ${e} --public-logs`),!0}catch(n){m.debug?.(`Failed to check CVM info: ${n}`)}return!1}function Ho(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}=z.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;m.info(`Streaming ${i} logs (press Ctrl+C to stop)...`),m.break();let l=new AbortController,p=!1,u=()=>{p=!0,l.abort()};process.on("SIGINT",u),process.on("SIGTERM",u);try{await e.streamLogs(a,f=>process.stdout.write(f),s,l.signal)}catch(f){if(f.name!=="AbortError")throw f}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u)}return p&&(m.break(),m.info("Stopped streaming logs")),0}let c=await e.fetchLogs(a,s);return r.json?(o.success({logs:c,cvm_id:a}),0):(c.trim()?console.log(c):await Or(a,o)||m.info("No logs available"),0)}catch(c){return o.fail(`Failed to fetch ${i} logs: ${c instanceof Error?c.message:String(c)}`),await Or(a,o),1}}}import{z as en}from"zod";var zp={name:"logs",description:"Fetch container logs from a CVM",stability:"deprecated",arguments:[X],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"},ue,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"}]},Kp=en.object({cvmId:en.string().optional(),tail:en.number().optional(),follow:en.boolean().default(!1),timestamps:en.boolean().default(!1),container:en.string().optional(),json:en.boolean().default(!1),interactive:en.boolean().default(!1)});var uk=Ho({logType:"container",fetchLogs:Cm,streamLogs:km},e=>({tail:e.tail,timestamps:e.timestamps,container:e.container})),qp=v({path:["cvms","logs"],meta:zp,schema:Kp,handler:uk});import Qp from"fs";import dk from"path";function Wp(e){return e.startsWith("0x")?e.slice(2):e}function Gp(e){return Wp(e).toLowerCase()}function Bp(e,t){let n=Wp(e);if(n.length%2!==0||!/^[0-9a-fA-F]*$/.test(n))throw new Error(`Invalid ${t}`);return new Uint8Array(Buffer.from(n,"hex"))}function zo(e,t,n){if(!n)throw new Error("KMS k256_pubkey is required to verify encryption public key");let r=Ma(Bp(e.public_key,"encryption public key"),Bp(e.signature,"encryption public key signature"),t);if(!r)throw new Error("Invalid encryption public key signature");if(Gp(r)!==Gp(n))throw new Error("Encryption public key signature does not match KMS");return e.public_key}async function tn(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 Vn(e,{app_id:t.app_id,kms:o});if(!a.success)throw m.logDetailedError(a.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get encryption public key: ${a.error.message}`);return zo(a.data,t.app_id,t.kms_info?.k256_pubkey)}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 pt}from"zod";var Jp={name:"replicate",description:"Create a replica of an existing CVM",stability:"unstable",arguments:[X],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"},Qe,Be,{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"},qn,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>"}]},Yp=pt.object({cvmId:pt.string().optional(),nodeId:pt.string().optional(),composeHash:pt.string().optional(),envFile:pt.string().optional(),privateKey:pt.string().optional(),rpcUrl:pt.string().optional(),prepareOnly:pt.boolean().default(!1),commit:pt.boolean().default(!1),token:pt.string().optional(),transactionHash:pt.string().optional(),interactive:pt.boolean().default(!1)});function fk(e){return Qp.readFileSync(e,"utf-8").split(`
216
+ `).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function gk(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function hk(e){if(e.status!==465)return null;let n=gk(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 yk(e,t,n){if(!n)return;let r=dk.resolve(process.cwd(),n);if(!Qp.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=fk(r),a=await tn(e,t);return je(o,a)}async function vk(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Ut(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 Ns(e,t,n){if(te()){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,""),c=o&&i&&typeof e.app_id=="string"?`${le}/${o}/apps/${e.app_id}/instances/${i}`:typeof e.app_url=="string"?e.app_url:"-",l=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:"-",p=n?.kms_type||"-",u=[`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: ${p}`,`Node: ${l} (ID: ${e.teepod_id})`,`vCPUs: ${e.vcpu}`,`Memory: ${e.memory} MB`,`Disk Size: ${e.disk_size} GB`,`App URL: ${c}`];t.stdout.write(`${u.join(`
276
217
  `)}
277
- `)}function Id(e,t){if(te()){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(`
218
+ `)}function Xp(e,t){if(te()){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(`
278
219
  `)}
279
- `)}async function Ad(e,t,n){return e.post(`/cvms/${t}/commit-replica`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash})}async function n0(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 W(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 p=(t.cvmId?.id??"").replace(/^app_/,"").replace(/^0x/,"").toLowerCase(),d=await or(r,{appId:p});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 W(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 m=await Ad(r,o.vm_uuid,{token:n.token,composeHash:n.composeHash,transactionHash:n.transactionHash||"already-registered"});return mi(m,t,o),0}let s=await e0(r,o,n.envFile),i=await t0(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 m=await r.post(`/cvms/${o.vm_uuid}/replicas`,l,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return mi(m,t,o),0}catch(m){if(!(m instanceof Ct))throw m;let p=QS(m);if(!p)throw m;if(n.prepareOnly)return Id(p,t),0;if(!p.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 wn({chain:d,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:p.deviceId,composeHash:p.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 Id(p,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 on({chain:d,rpcUrl:n.rpcUrl,appAddress:o.app_id,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(g){let k=await rn({chain:d,rpcUrl:n.rpcUrl,appId:o.app_id,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")}u=String(k.data.transactionHash||"already-registered")}}let y=await Ad(r,o.vm_uuid,{token:p.commitToken,composeHash:p.composeHash,transactionHash:u});return mi(y,t,o),0}}catch(r){if(c.error("Failed to create CVM replica"),r instanceof Ct){process.stderr.write(`${nn(r)}
220
+ `)}async function Zp(e,t,n){return e.post(`/cvms/${t}/commit-replica`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash})}async function bk(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 A(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 p=(t.cvmId?.id??"").replace(/^app_/,"").replace(/^0x/,"").toLowerCase(),u=await zn(r,{appId:p});if(!u.success||u.data.length===0)throw a.error;let f=u.data[0];if(!f.vm_uuid)throw a.error;let d=await G(r,{id:f.vm_uuid});if(!d.success)throw d.error;o=d.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 l=await Zp(r,o.vm_uuid,{token:n.token,composeHash:n.composeHash,transactionHash:n.transactionHash||"already-registered"});return Ns(l,t,o),0}let s=await yk(r,o,n.envFile),i=await vk(r,n.nodeId),c={};i!==void 0&&(c.node_id=i),s&&(c.encrypted_env=s),n.composeHash&&(c.compose_hash=n.composeHash);try{let l=await r.post(`/cvms/${o.vm_uuid}/replicas`,c,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return Ns(l,t,o),0}catch(l){if(!(l instanceof yt))throw l;let p=hk(l);if(!p)throw l;if(n.prepareOnly)return Xp(p,t),0;if(!p.commitToken)throw new Error("Replica prepare response did not include a commit token");let u=o.kms_info?.chain_id,f=u!=null?At[u]:void 0;if(!f)throw new Error(u!=null?`Source CVM chain id ${u} is not supported by this CLI build`:"Source CVM kms_info is missing chain_id");if(!o.app_id)throw new Error("Source CVM is missing app_id required for on-chain approval");let d=await pn({chain:f,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:p.deviceId,composeHash:p.composeHash});if(!d.success){let _="error"in d?d.error:void 0;throw new Error(_?.message||"Failed to check on-chain prerequisites")}let h=n.transactionHash||"already-registered",g=!d.data.deviceAllowed,y=!d.data.composeHashAllowed;if(g||y){let _=[];y&&_.push("compose hash"),g&&_.push("device");let E=n.privateKey||process.env.PRIVATE_KEY;if(!E)throw Xp(p,t),new Error(`On-chain registration required: ${_.join(", ")} not registered. Pass --private-key or set PRIVATE_KEY to register automatically, or use --prepare-only to handle registration separately.`);let S=E;if(g){let b=await Jt({chain:f,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:p.deviceId,privateKey:S});if(!b.success){let I="error"in b?b.error:void 0;throw new Error(I?.message||"Failed to register device on-chain")}}if(y){let b=await Wt({chain:f,rpcUrl:n.rpcUrl,appId:o.app_id,composeHash:p.composeHash,privateKey:S});if(!b.success){let I="error"in b?b.error:void 0;throw new Error(I?.message||"Failed to register compose hash on-chain")}h=String(b.data.transactionHash||"already-registered")}}let k=await Zp(r,o.vm_uuid,{token:p.commitToken,composeHash:p.composeHash,transactionHash:h});return Ns(k,t,o),0}}catch(r){if(m.error("Failed to create CVM replica"),r instanceof yt){process.stderr.write(`${Bt(r)}
280
221
  `);let o=r.links;if(o&&o.length>0)for(let a of o)process.stderr.write(` ${a.label}: ${a.url}
281
- `);return 1}return r instanceof Error?(process.stderr.write(`${Ro(r)}
282
- `),1):(c.logDetailedError(r),1)}}var $d=C({path:["cvms","replicate"],meta:Sd,schema:Ed,handler:n0});import dn from"chalk";import ui from"inquirer";async function Ht(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(m){s=m;let p=m;if((p.message?.includes("409")||p.status===409||p.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 m}let i=s;throw new Error(`Failed after ${n} retries due to conflicts: ${i?.message||String(s)}`)}import{z as zt}from"zod";var Rd={name:"resize",description:"Resize resources for a CVM",stability:"unstable",arguments:[X],options:[j,{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"}]},xd=zt.object({cvmId:zt.string().optional(),interactive:zt.boolean().default(!1),vcpu:zt.string().optional(),memory:zt.string().optional(),diskSize:zt.string().optional(),allowRestart:zt.string().optional(),yes:zt.boolean().default(!1),json:zt.boolean().default(!1)});function pi(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 r0(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 di(e,t){return(await ui.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 o0(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 W(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,m;try{s=pi(e.vcpu,"--vcpu"),i=pi(e.memory,"--memory"),l=pi(e.diskSize,"--disk-size"),m=r0(e.allowRestart)}catch(p){return c.error(p instanceof Error?p.message:String(p)),1}if(Ns()?(s===void 0&&(s=await di("Enter number of vCPUs:",o.resource.vcpu??void 0)),i===void 0&&(i=await di("Enter memory in MB:",o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0)),l===void 0&&(l=await di("Enter disk size in GB:",o.resource.disk_in_gb??void 0)),m===void 0&&(m=(await ui.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),m===void 0&&(m=!0)),Ns()){let p=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:p!==s?`${dn.red(p)} -> ${dn.green(s)}`:p,Memory:d!==i?`${dn.red(d)} MB -> ${dn.green(i)} MB`:d,"Disk Size":f!==l?`${dn.red(f)} GB -> ${dn.green(l)} GB`:f,"Allow Restart":m?dn.green("Yes"):dn.red("No")}),!e.yes){let{confirm:h}=await ui.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 Ht(()=>zs(a,s,i,l,m?1:0),{spinner:u}),u.stop(!0),c.break(),c.success(`Your CVM is being resized. You can check the dashboard for more details:
283
- ${ie}/dashboard/cvms/app_${a}`)}else await Ht(()=>zs(a,s,i,l,m?1:0)),t.success({app_id:a,vcpu:s,memory:i,disk_size:l,allow_restart:m});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 Dd=C({path:["cvms","resize"],meta:Rd,schema:xd,handler:o0});async function ga(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 W(r,{id:e});if(!s.success)c.warn(`Failed to get CVM info: ${s.error.message}`);else{let i=s.data,l=i.status,m=i.in_progress,p=Math.floor((Date.now()-o)/1e3);if(c.info(` [${p}s] status=${l}, in_progress=${m}`),l==="running"&&!m){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 fi}from"zod";var Td={name:"restart",description:"Restart a CVM",stability:"stable",arguments:[X],options:[j],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"}]},Md=fi.object({cvmId:fi.string().optional(),interactive:fi.boolean().default(!1)});async function a0(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 W(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 ga(a.vm_uuid,3e5,t));let s=c.startSpinner("Restarting CVM"),i=t.cvmId,l=await Ht(()=>As(n,i),{spinner:s});if(s.stop(!0),!l.success)return t.fail(`Failed to restart CVM: ${l.error.message}`),1;let m=l.data;return r?(t.success({cvm:m,dashboardUrl:`${ie}/dashboard/cvms/app_${m.app_id}`,message:"CVM restart requested"}),0):(c.break(),c.keyValueTable({"CVM ID":m.id,Name:m.name,Status:m.status,"App ID":`app_${m.app_id}`,"App URL":m.app_url||`${ie}/dashboard/cvms/app_${m.app_id}`},{borderStyle:"rounded"}),c.break(),c.success(`Your CVM is being restarted. You can check the dashboard for more details:
284
- ${ie}/dashboard/cvms/app_${m.app_id}`),0)}catch(n){return t.fail("Failed to restart CVM"),c.logDetailedError(n),1}}var Ld=C({path:["cvms","restart"],meta:Td,schema:Md,handler:a0});import{z as $n}from"zod";var Ud={name:"serial-logs",description:"Fetch VM serial console logs from a CVM",stability:"deprecated",arguments:[X],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"},de,j],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"}]},Od=$n.object({cvmId:$n.string().optional(),tail:$n.number().optional(),follow:$n.boolean().default(!1),timestamps:$n.boolean().default(!1),json:$n.boolean().default(!1),interactive:$n.boolean().default(!1)});var s0=fa({logType:"serial",fetchLogs:jm,streamLogs:zm},e=>({tail:e.tail,timestamps:e.timestamps})),Nd=C({path:["cvms","serial-logs"],meta:Ud,schema:Od,handler:s0});import{z as gi}from"zod";var jd={name:"start",description:"Start a stopped CVM",stability:"stable",arguments:[X],options:[j],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"}]},Fd=gi.object({cvmId:gi.string().optional(),interactive:gi.boolean().default(!1)});async function i0(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 Ht(()=>Es(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:`${ie}/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:
285
- ${ie}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.fail("Failed to start CVM"),c.logDetailedError(n),1}}var Vd=C({path:["cvms","start"],meta:jd,schema:Fd,handler:i0});import{z as hi}from"zod";var Hd={name:"stop",description:"Stop a running CVM",stability:"stable",arguments:[X],options:[j],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"}]},zd=hi.object({cvmId:hi.string().optional(),interactive:hi.boolean().default(!1)});async function c0(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 Ht(()=>Is(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:`${ie}/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:
286
- ${ie}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.fail("Failed to stop CVM"),c.logDetailedError(n),1}}var Kd=C({path:["cvms","stop"],meta:Hd,schema:zd,handler:c0});import l0 from"fs";import{z as hr}from"zod";var Gd={name:"upgrade",description:'Upgrade a CVM to a new version (use "phala deploy" instead)',stability:"deprecated",arguments:[X],options:[j,{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"}]},qd=hr.object({cvmId:hr.string().optional(),interactive:hr.boolean().default(!1),compose:hr.string().optional(),envFile:hr.string().optional(),debug:hr.boolean().default(!1)});async function m0(e){if(e.compose)return e.compose;let n=gr(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return Ft("Enter the path to your Docker Compose file:",n,"file")}async function p0(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.
287
- `),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let n=await E(t),r=await W(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 m0(e),l="";if(i)try{l=l0.readFileSync(i,"utf8")}catch(h){return c.error(`Failed to read Docker Compose file: ${h instanceof Error?h.message:String(h)}`),1}await Pn(),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 m,p=[];if(e.envFile)try{let h=eo([],e.envFile);m=await(0,Ae.encryptEnvVars)(h,s.kms_info?.encrypted_env_pubkey),p=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:p},encrypted_env:m,allow_restart:!0,env_keys:p},f=c.startSpinner(`Upgrading CVM app_${a}`),u=await Lm(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:
288
- ${ie}/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 Bd=C({path:["cvms","upgrade"],meta:Gd,schema:qd,handler:p0});var ha={group:Gp,commands:[Wp,od,id,pd,fd,yd,bd,kd,$d,Dd,Ld,Nd,Vd,Kd,Bd],subgroups:[]};import{z as K}from"zod";var Wd={name:"deploy",category:"deploy",description:"Deploy new CVM or update existing one",stability:"stable",arguments:[],options:[_n,um,j,{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: ${An}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:"kms-contract",description:"KMS contract address",type:"string",target:"kmsContract",group:"advanced"},{name:"kms-contract-id",description:"KMS contract ID",type:"string",target:"kmsContractId",group:"advanced"},{name:"key-provider-mode",description:"Key provider mode: kms or local",type:"string",target:"keyProviderMode",group:"advanced"},{name:"skip-gateway",description:"Skip gateway matching",type:"boolean",target:"skipGateway",group:"advanced"},{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"},Qe,qe,{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"},sr,{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..."}]},Jd=K.object({compose:K.string().optional(),json:K.boolean().default(!1),debug:K.boolean().default(!1),apiToken:K.string().optional(),name:K.string().optional(),instanceType:K.string().optional(),vcpu:K.string().optional(),memory:K.string().optional(),diskSize:K.string().optional(),fs:K.enum(["ext4","zfs"]).optional(),image:K.string().optional(),region:K.string().optional(),nodeId:K.string().optional(),env:K.array(K.string()).optional(),envFile:K.string().optional(),interactive:K.boolean().default(!1),kms:K.enum(["phala","ethereum","eth","base"]).default("phala"),kmsId:K.string().optional(),kmsContract:K.string().optional(),kmsContractId:K.string().optional(),keyProviderMode:K.enum(["kms","local"]).optional(),skipGateway:K.boolean().optional(),cvmId:K.string().optional(),customAppId:K.string().optional(),nonce:K.string().optional(),preLaunchScript:K.string().optional(),privateKey:K.string().optional(),rpcUrl:K.string().optional(),wait:K.boolean().default(!1),sshPubkey:K.string().optional(),devOs:K.boolean().optional(),publicLogs:K.boolean().optional(),publicSysinfo:K.boolean().optional(),listed:K.boolean().optional(),prepareOnly:K.boolean().default(!1),commit:K.boolean().default(!1),token:K.string().optional(),composeHash:K.string().optional(),transactionHash:K.string().optional()});import Kt from"path";import Qd from"os";function d0(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 ya(e){let t={files:[],keyValues:[]};for(let n of e)if(d0(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 va(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 Yd(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 Zd(e){let t=Yd(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 Xd(e){let t=Yd(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 Ca from"dedent";import dt from"fs-extra";import ba from"inquirer";function eu(e,t){if(e instanceof Ct)return t.json?{success:!1,error_code:e.errorCode,message:e.message,details:e.structuredDetails,suggestions:e.suggestions,links:e.links}:nn(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:m}=o;if(t.json)return{success:!1,error_code:a,message:s,details:i,suggestions:l,links:m};let p=`
222
+ `);return 1}return r instanceof Error?(process.stderr.write(`${so(r)}
223
+ `),1):(m.logDetailedError(r),1)}}var eu=v({path:["cvms","replicate"],meta:Jp,schema:Yp,handler:bk});import nn from"chalk";import Fs from"inquirer";async function Lt(e,t={}){let{maxRetries:n=100,retryDelayMs:r=3e3,spinner:o,logRetries:a=!0}=t,s;for(let c=0;c<=n;c++)try{return await e()}catch(l){s=l;let p=l;if((p.message?.includes("409")||p.status===409||p.message?.includes("Conflict"))&&c<n)o&&o.stop(!0),a&&m.warn(`CVM is busy, retrying in ${r}ms... (attempt ${c+1}/${n})`),await new Promise(f=>setTimeout(f,r));else throw l}let i=s;throw new Error(`Failed after ${n} retries due to conflicts: ${i?.message||String(s)}`)}import{z as Nt}from"zod";var tu={name:"resize",description:"Resize resources for a CVM",stability:"unstable",arguments:[X],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"}]},nu=Nt.object({cvmId:Nt.string().optional(),interactive:Nt.boolean().default(!1),vcpu:Nt.string().optional(),memory:Nt.string().optional(),diskSize:Nt.string().optional(),allowRestart:Nt.string().optional(),yes:Nt.boolean().default(!1),json:Nt.boolean().default(!1)});function Os(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 Ck(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 js(e,t){return(await Fs.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 wk(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await A(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,c,l;try{s=Os(e.vcpu,"--vcpu"),i=Os(e.memory,"--memory"),c=Os(e.diskSize,"--disk-size"),l=Ck(e.allowRestart)}catch(p){return m.error(p instanceof Error?p.message:String(p)),1}if(gs()?(s===void 0&&(s=await js("Enter number of vCPUs:",o.resource.vcpu??void 0)),i===void 0&&(i=await js("Enter memory in MB:",o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0)),c===void 0&&(c=await js("Enter disk size in GB:",o.resource.disk_in_gb??void 0)),l===void 0&&(l=(await Fs.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),c===void 0&&(c=o.resource.disk_in_gb??void 0),l===void 0&&(l=!0)),gs()){let p=o.resource.vcpu,u=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0,f=o.resource.disk_in_gb;if(m.keyValueTable({vCPUs:p!==s?`${nn.red(p)} -> ${nn.green(s)}`:p,Memory:u!==i?`${nn.red(u)} MB -> ${nn.green(i)} MB`:u,"Disk Size":f!==c?`${nn.red(f)} GB -> ${nn.green(c)} GB`:f,"Allow Restart":l?nn.green("Yes"):nn.red("No")}),!e.yes){let{confirm:h}=await Fs.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to resize CVM app_${a}?`,default:!1}]);if(!h)return m.info("Resize operation cancelled"),0}let d=m.startSpinner(`Resizing CVM with App ID app_${a}`);await Lt(()=>_s(a,s,i,c,l?1:0),{spinner:d}),d.stop(!0),m.break(),m.success(`Your CVM is being resized. You can check the dashboard for more details:
224
+ ${le}/dashboard/cvms/app_${a}`)}else await Lt(()=>_s(a,s,i,c,l?1:0)),t.success({app_id:a,vcpu:s,memory:i,disk_size:c,allow_restart:l});return 0}catch(n){return m.error("Failed to resize CVM"),m.logDetailedError(n),t.fail(n instanceof Error?n.message:String(n)),1}}var ru=v({path:["cvms","resize"],meta:tu,schema:nu,handler:wk});async function Ko(e,t=3e5,n){let r=await A(n),o=Date.now(),a=2e3;for(m.info("Waiting for CVM to be ready...");Date.now()-o<t;){try{let s=await G(r,{id:e});if(!s.success)m.warn(`Failed to get CVM info: ${s.error.message}`);else{let i=s.data,c=i.status,l=i.in_progress,p=Math.floor((Date.now()-o)/1e3);if(m.info(` [${p}s] status=${c}, in_progress=${l}`),c==="running"&&!l){let u=Math.floor((Date.now()-o)/1e3);m.success(`CVM is ready (took ${u}s)`);return}}}catch(s){m.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 Vs}from"zod";var ou={name:"restart",description:"Restart a CVM",stability:"stable",arguments:[X],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"}]},au=Vs.object({cvmId:Vs.string().optional(),interactive:Vs.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 n=await A(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&&(m.warn("CVM is currently in progress (updating/restarting). Waiting for operation to complete..."),await Ko(a.vm_uuid,3e5,t));let s=m.startSpinner("Restarting CVM"),i=t.cvmId,c=await Lt(()=>ts(n,i),{spinner:s});if(s.stop(!0),!c.success)return t.fail(`Failed to restart CVM: ${c.error.message}`),1;let l=c.data;return r?(t.success({cvm:l,dashboardUrl:`${le}/dashboard/cvms/app_${l.app_id}`,message:"CVM restart requested"}),0):(m.break(),m.keyValueTable({"CVM ID":l.id,Name:l.name,Status:l.status,"App ID":`app_${l.app_id}`,"App URL":l.app_url||`${le}/dashboard/cvms/app_${l.app_id}`},{borderStyle:"rounded"}),m.break(),m.success(`Your CVM is being restarted. You can check the dashboard for more details:
225
+ ${le}/dashboard/cvms/app_${l.app_id}`),0)}catch(n){return t.fail("Failed to restart CVM"),m.logDetailedError(n),1}}var su=v({path:["cvms","restart"],meta:ou,schema:au,handler:_k});import{z as yn}from"zod";var iu={name:"serial-logs",description:"Fetch VM serial console logs from a CVM",stability:"deprecated",arguments:[X],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"},ue,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"}]},cu=yn.object({cvmId:yn.string().optional(),tail:yn.number().optional(),follow:yn.boolean().default(!1),timestamps:yn.boolean().default(!1),json:yn.boolean().default(!1),interactive:yn.boolean().default(!1)});var Sk=Ho({logType:"serial",fetchLogs:bm,streamLogs:Sm},e=>({tail:e.tail,timestamps:e.timestamps})),lu=v({path:["cvms","serial-logs"],meta:iu,schema:cu,handler:Sk});import{z as Hs}from"zod";var mu={name:"start",description:"Start a stopped CVM",stability:"stable",arguments:[X],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"}]},pu=Hs.object({cvmId:Hs.string().optional(),interactive:Hs.boolean().default(!1)});async function kk(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await A(t),r=t.globalOptions?.json===!0,o=m.startSpinner("Starting CVM"),a=t.cvmId,s=await Lt(()=>Qa(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:`${le}/dashboard/cvms/app_${i.app_id}`,message:"CVM start requested"}),0):(m.break(),m.keyValueTable({"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`},{borderStyle:"rounded"}),m.break(),m.success(`Your CVM is being started. You can check the dashboard for more details:
226
+ ${le}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.fail("Failed to start CVM"),m.logDetailedError(n),1}}var uu=v({path:["cvms","start"],meta:mu,schema:pu,handler:kk});import{z as zs}from"zod";var du={name:"stop",description:"Stop a running CVM",stability:"stable",arguments:[X],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"}]},fu=zs.object({cvmId:zs.string().optional(),interactive:zs.boolean().default(!1)});async function Ik(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await A(t),r=t.globalOptions?.json===!0,o=m.startSpinner("Stopping CVM"),a=t.cvmId,s=await Lt(()=>es(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:`${le}/dashboard/cvms/app_${i.app_id}`,message:"CVM stop requested"}),0):(m.break(),m.keyValueTable({"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`},{borderStyle:"rounded"}),m.break(),m.success(`Your CVM is being stopped. You can check the dashboard for more details:
227
+ ${le}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.fail("Failed to stop CVM"),m.logDetailedError(n),1}}var gu=v({path:["cvms","stop"],meta:du,schema:fu,handler:Ik});import $k from"fs";import hu from"fs";import yu from"path";import Ek from"inquirer";async function qo(e,t,n="file",r=process.cwd()){return(await Ek.prompt([{type:"input",name:n,message:e,default:t,validate:a=>{let s=yu.resolve(r,a);return hu.existsSync(s)?!0:`File not found at ${s}`}}]))[n]}function Go(e,t){for(let n of e){let r=yu.join(process.cwd(),n);if(hu.existsSync(r))return t?m.info(t.replace("{path}",r)):m.info(`File detected: ${r}`),n}}import*as vu from"fs";var bu=(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=vu.readFileSync(t,"utf8");for(let o of r.split(`
228
+ `)){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 c=o.substring(0,a).trim(),l=o.substring(a+1),p=!1,u="",f=-1;for(let g=0;g<l.length;g++)if((l[g]==='"'||l[g]==="'"||l[g]==="`")&&(g===0||l[g-1]!=="\\"))p&&l[g]===u?(p=!1,u=""):p||(p=!0,u=l[g]);else if(l[g]==="#"&&!p&&g>0&&l[g-1]===" "){f=g-1;break}else if(l[g]==="#"&&!p&&g===0){f=g;break}f!==-1&&(l=l.substring(0,f)),l===void 0&&(l="");let d=l.charAt(0),h=l.charAt(l.length-1);d==='"'&&h==='"'||d==="'"&&h==="'"||d==="`"&&h==="`"?(l=l.substring(1,l.length-1),d==='"'&&(l=l.replace(/\\\\n/g,`
229
+ `))):l=l.trim(),c&&(n[c]=l)}}return Object.entries(n).map(([r,o])=>({key:r,value:o}))};import{execSync as Ot,spawn as Ak}from"child_process";import*as ne from"fs";import*as Ks from"net";import*as xt from"os";import*as ut from"path";var Oe={version:"0.5.3",baseUrl:"https://github.com/Dstack-TEE/dstack/releases/download/v0.5.3",installDir:ut.join(xt.homedir(),".phala-cloud","simulator"),defaultLogPath:ut.join(xt.homedir(),".phala-cloud","logs","dstack-simulator.log"),platforms:{darwin:{filename:"dstack-simulator-0.5.3-aarch64-apple-darwin.tgz",extractedFolder:"0.5.3",socketPath:ut.join(xt.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:ut.join(xt.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 Cu(){try{if(!ne.existsSync(Oe.installDir))return!1;let e=xt.platform();if(!Oe.platforms[e])throw new Error(`Unsupported platform: ${e}`);let t=ut.join(Oe.installDir,Oe.platforms[e].extractedFolder);if(!ne.existsSync(t))return!1;let r=ut.join(t,e==="win32"?"dstack-simulator.exe":"dstack-simulator");return ne.existsSync(r)}catch(e){return m.error("Error checking if simulator is installed:",e),!1}}function jr(){let e=xt.platform();if(!Oe.platforms[e])throw new Error(`Unsupported platform: ${e}. Only darwin, linux, and win32 are supported.`);return e}async function wu(e){let t=n=>{m.info(n),e&&e(n)};try{let n=jr(),r=Oe.platforms[n];if(n==="win32"){try{Ot("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.")}ne.existsSync(Oe.installDir)||(m.info(`Creating installation directory at ${Oe.installDir}`),ne.mkdirSync(Oe.installDir,{recursive:!0})),process.chdir(Oe.installDir);let o=`${Oe.baseUrl}/${r.filename}`;m.info(`Downloading simulator from ${o}`),Ot(`wget ${o}`,{stdio:"inherit"});let a=ut.join(Oe.installDir,r.extractedFolder);ne.existsSync(a)||ne.mkdirSync(a,{recursive:!0}),m.info(`Extracting ${r.filename} to ${a}`);let s=`tar -xvf "${r.filename}" -C "${a}" --strip-components=1`;m.debug(`Running: ${s}`);try{Ot(s,{stdio:"inherit"}),ne.unlinkSync(r.filename)}catch(i){throw m.error(`Failed to extract ${r.filename}:`,i),new Error("Failed to extract simulator archive. Make sure you have sufficient permissions and disk space.")}m.success("Simulator installation completed successfully")}catch(n){throw m.error("Error installing simulator:",n),new Error(`Failed to install simulator: ${n}`)}}var qs=()=>ut.join(xt.tmpdir(),"dstack-simulator.pid");function Rk(e){return Buffer.byteLength(e,"utf8")>104}function Bo(){try{let e=qs();if(ne.existsSync(e)){let t=Number.parseInt(ne.readFileSync(e,"utf-8").trim(),10);try{return process.kill(t,0),t}catch{ne.unlinkSync(e)}}return null}catch(e){return m.warn("Error checking simulator PID:",e),null}}function Pk(e,t){try{let n=qs();t&&m.info(`Saving simulator PID ${e} to: ${n}`),ne.writeFileSync(n,e.toString(),"utf-8")}catch(n){m.warn("Failed to save simulator PID:",n)}}async function _u(e={}){try{let t=jr(),n=Oe.platforms[t],r=ut.join(Oe.installDir,n.extractedFolder),o=Bo();if(o)throw new Error(`Simulator is already running with PID: ${o}`);if(t!=="win32"&&Rk(n.socketPath))throw new Error(`Socket path is too long (${n.socketPath.length} chars, max 104): ${n.socketPath}`);if(t!=="win32"&&ne.existsSync(n.socketPath)){m.warn(`Removing existing socket file: ${n.socketPath}`);try{ne.unlinkSync(n.socketPath)}catch(l){m.warn(`Failed to remove existing socket file: ${l}`)}}process.chdir(r);let a=t==="win32"?"dstack-simulator.exe":"./dstack-simulator";e.verbose&&t!=="win32"&&m.info(`Using socket path: ${n.socketPath}`);let s={background:e.background??!0,logToFile:e.logToFile??!0,logFilePath:e.logFilePath??Oe.defaultLogPath};if(s.logToFile){let l=ut.dirname(s.logFilePath);ne.existsSync(l)||ne.mkdirSync(l,{recursive:!0}),e.verbose&&m.info(`Simulator logs will be written to: ${s.logFilePath}`)}e.verbose&&m.info(`Starting simulator with: ${a}`);let i=s.logToFile?["ignore",ne.openSync(s.logFilePath,"a"),ne.openSync(s.logFilePath,"a")]:"inherit",c=Ak(a,[],{stdio:i,shell:t==="win32",detached:s.background});if(s.logToFile&&Array.isArray(i)&&(typeof i[1]=="number"&&ne.closeSync(i[1]),typeof i[2]=="number"&&ne.closeSync(i[2])),s.logToFile){let p=`
230
+ === Simulator started at ${new Date().toISOString()} ===
231
+ Command: ${a}
232
+
233
+ `;ne.appendFileSync(s.logFilePath,p)}return c.pid&&Pk(c.pid,e.verbose),s.background&&(c.unref(),e.verbose&&m.success("Simulator is running in the background")),await xk(),c}catch(t){throw m.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function Fr(){try{let e=jr(),t=Oe.platforms[e];if(e==="darwin"||e==="linux"){let n=t.socketPath;return ne.existsSync(n)?new Promise(r=>{let o=Ks.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=Ks.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 m.error("Error checking if simulator is running:",e),!1}}async function Su(){try{let e=Bo();if(!await Fr()&&!e)return m.info("Simulator is not running"),!0;let n=jr(),r=!1;if(n==="win32")try{e?(m.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Ot("taskkill /F /IM dstack-simulator.exe",{stdio:"ignore"}),r=!0}catch(a){if(a.code!=="ESRCH")return m.error("Failed to stop simulator:",a),!1;r=!0}else try{e?(m.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Ot("pkill -f dstack-simulator",{stdio:"ignore"}),r=!0}catch(a){if(a.code!=="ESRCH")return m.error("Failed to stop simulator:",a),!1;r=!0}let o=qs();if(ne.existsSync(o))try{ne.unlinkSync(o)}catch(a){m.warn("Failed to remove PID file:",a)}return await Bs(),r&&m.success("Simulator stopped successfully"),r}catch(e){return m.error("Error stopping simulator:",e),!1}}function Gs(){let e=jr(),t=Oe.platforms[e];return e==="win32"?"http://127.0.0.1:8090":`${t.socketPath||"/tmp/dstack.sock"}`}async function xk(e){try{let t=Gs(),n=e||t;await Ot(`export DSTACK_SIMULATOR_ENDPOINT=${n}`);let r=n.replace(/dstack\.sock$/,"tappd.sock");return await Ot(`export TAPPD_SIMULATOR_ENDPOINT=${r}`),m.success("Setting environment for current process..."),m.success(` DSTACK_SIMULATOR_ENDPOINT=${n}`),m.success(` TAPPD_SIMULATOR_ENDPOINT=${r}`),n}catch(t){throw m.error("Error setting simulator endpoint environment variable:",t),new Error(`Failed to set simulator endpoint: ${t}`)}}async function Bs(){try{return await Ot("unset DSTACK_SIMULATOR_ENDPOINT"),await Ot("unset TAPPD_SIMULATOR_ENDPOINT"),m.debug("Deleted simulator endpoint environment variables from current process"),!0}catch(e){return m.warn("Error while unsetting simulator endpoint environment variables:",e),!1}}import{z as tr}from"zod";var ku={name:"upgrade",description:'Upgrade a CVM to a new version (use "phala deploy" instead)',stability:"deprecated",arguments:[X],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"}]},Iu=tr.object({cvmId:tr.string().optional(),interactive:tr.boolean().default(!1),compose:tr.string().optional(),envFile:tr.string().optional(),debug:tr.boolean().default(!1)});async function Tk(e){if(e.compose)return e.compose;let n=Go(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return qo("Enter the path to your Docker Compose file:",n,"file")}async function Dk(e,t){try{if(m.warn('\u26A0\uFE0F This command is deprecated. Please use "phala deploy" instead.'),m.warn(`\u26A0\uFE0F This legacy API will be maintained but may have limited support.
234
+ `),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let n=await A(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 Tk(e),c="";if(i)try{c=$k.readFileSync(i,"utf8")}catch(h){return m.error(`Failed to read Docker Compose file: ${h instanceof Error?h.message:String(h)}`),1}await Bs(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?m.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?m.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):m.info("\u{1F510} Using public DockerHub registry...");let l,p=[];if(e.envFile)try{let h=bu([],e.envFile);l=await je(h,s.kms_info?.encrypted_env_pubkey),p=h.map(g=>g.key)}catch(h){return m.error(`Failed to read environment file: ${h instanceof Error?h.message:String(h)}`),1}let u={compose_manifest:{docker_compose_file:c,manifest_version:1,runner:"docker-compose",version:"1.0.0",features:["kms","tproxy-net"],name:`app_${a}`,allowed_envs:p},encrypted_env:l,allow_restart:!0,env_keys:p},f=m.startSpinner(`Upgrading CVM app_${a}`),d=await hm(a,u);return d?(f.stop(!0),d.detail&&m.info(`Details: ${d.detail}`),m.break(),m.success(`Your CVM is being upgraded. You can check the dashboard for more details:
235
+ ${le}/dashboard/cvms/app_${a}`),0):(f.stop(!1),m.error("Failed to upgrade CVM"),1)}catch(n){return m.error(`Failed to upgrade CVM: ${n instanceof Error?n.message:String(n)}`),e.debug&&m.error("Full Error:",n),1}}var Eu=v({path:["cvms","upgrade"],meta:ku,schema:Iu,handler:Dk});var Wo={group:Sp,commands:[Ep,Pp,Dp,Lp,jp,Hp,qp,eu,ru,su,lu,uu,gu,Eu],subgroups:[]};import{z as j}from"zod";var Au={name:"deploy",category:"deploy",description:"Deploy new CVM or update existing one",stability:"stable",arguments:[],options:[un,Ql,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: ${Ps}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:"kms-contract",description:"KMS contract address",type:"string",target:"kmsContract",group:"advanced"},{name:"kms-contract-id",description:"KMS contract ID",type:"string",target:"kmsContractId",group:"advanced"},{name:"key-provider-mode",description:"Key provider mode: kms or local",type:"string",target:"keyProviderMode",group:"advanced"},{name:"experimental-key-provider-type",description:"Set key_provider in compose (kms, local, tpm). Backend resolves key_provider_id for kms; local/tpm require manual key_provider_id. Computes and displays mr_config_id after provision.",type:"string",target:"experimentalKeyProviderType",group:"advanced"},{name:"skip-gateway",description:"Skip gateway matching",type:"boolean",target:"skipGateway",group:"advanced"},{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"},Qe,Be,{name:"wait",description:"Wait for deployment/update completion",type:"boolean",target:"wait",group:"basic"},{name:"force-stop",description:"Force stop an existing CVM instead of requesting graceful shutdown",type:"boolean",target:"forceStop",group:"advanced"},{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"},qn,{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:"public-tcbinfo",description:"Make attestation data publicly accessible (default: true)",type:"boolean",target:"publicTcbinfo",negatedName:"no-public-tcbinfo"},{name:"secure-time",description:"Enable secure time (default: false)",type:"boolean",target:"secureTime",negatedName:"no-secure-time"},{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..."}]},Ru=j.object({compose:j.string().optional(),json:j.boolean().default(!1),debug:j.boolean().default(!1),apiToken:j.string().optional(),name:j.string().optional(),instanceType:j.string().optional(),vcpu:j.string().optional(),memory:j.string().optional(),diskSize:j.string().optional(),fs:j.enum(["ext4","zfs"]).optional(),image:j.string().optional(),region:j.string().optional(),nodeId:j.string().optional(),env:j.array(j.string()).optional(),envFile:j.string().optional(),interactive:j.boolean().default(!1),kms:j.enum(["phala","ethereum","eth","base"]).default("phala"),kmsId:j.string().optional(),kmsContract:j.string().optional(),kmsContractId:j.string().optional(),keyProviderMode:j.enum(["kms","local"]).optional(),experimentalKeyProviderType:j.enum(["kms","local","tpm"]).optional(),skipGateway:j.boolean().optional(),cvmId:j.string().optional(),customAppId:j.string().optional(),nonce:j.string().optional(),preLaunchScript:j.string().optional(),privateKey:j.string().optional(),rpcUrl:j.string().optional(),wait:j.boolean().default(!1),forceStop:j.boolean().default(!1),sshPubkey:j.string().optional(),devOs:j.boolean().optional(),publicLogs:j.boolean().optional(),publicSysinfo:j.boolean().optional(),publicTcbinfo:j.boolean().optional(),secureTime:j.boolean().optional(),listed:j.boolean().optional(),prepareOnly:j.boolean().default(!1),commit:j.boolean().default(!1),token:j.string().optional(),composeHash:j.string().optional(),transactionHash:j.string().optional()});import jt from"path";import Tu from"os";function Mk(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 Jo(e){let t={files:[],keyValues:[]};for(let n of e)if(Mk(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 Yo(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 Pu(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 xu(e){let t=Pu(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 $u(e){let t=Pu(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 Xo from"dedent";import dt from"fs-extra";import Zo from"inquirer";function Uk(e,t){t&&(e.allow_force_stop=!0)}function Du(e,t){if(e instanceof yt)return t.json?{success:!1,error_code:e.errorCode,message:e.message,details:e.structuredDetails,suggestions:e.suggestions,links:e.links}:Bt(e);if(e instanceof yr&&typeof e.detail=="object"&&e.detail!==null&&"error_code"in e.detail){let{error_code:r,message:o,details:a,suggestions:s,links:i}=e.detail;if(t.json)return{success:!1,error_code:r,message:o,details:a,suggestions:s,links:i};let c=`
236
+ Error [${r}]: ${o}
237
+ `;if(a&&a.length>0){c+=`
238
+ Details:
239
+ `;for(let l of a)l.message?c+=` - ${l.message}
240
+ `:l.field&&l.value!==void 0&&(c+=` - ${l.field}: ${l.value}
241
+ `)}if(s&&s.length>0){c+=`
242
+ Suggestions:
243
+ `;for(let l of s)c+=` - ${l}
244
+ `}if(i&&i.length>0){c+=`
245
+ Learn more:
246
+ `;for(let l of i)c+=` - ${l.label}: ${l.url}
247
+ `}return c}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:c,links:l}=o;if(t.json)return{success:!1,error_code:a,message:s,details:i,suggestions:c,links:l};let p=`
289
248
  Error [${a}]: ${s}
290
249
  `;if(i&&i.length>0){p+=`
291
250
  Details:
292
- `;for(let d of i)d.message?p+=` - ${d.message}
293
- `:d.field&&d.value!==void 0&&(p+=` - ${d.field}: ${d.value}
294
- `)}if(l&&l.length>0){p+=`
251
+ `;for(let u of i)u.message?p+=` - ${u.message}
252
+ `:u.field&&u.value!==void 0&&(p+=` - ${u.field}: ${u.value}
253
+ `)}if(c&&c.length>0){p+=`
295
254
  Suggestions:
296
- `;for(let d of l)p+=` - ${d}
297
- `}if(m&&m.length>0){p+=`
255
+ `;for(let u of c)p+=` - ${u}
256
+ `}if(l&&l.length>0){p+=`
298
257
  Learn more:
299
- `;for(let d of m)p+=` - ${d.label}: ${d.url}
258
+ `;for(let u of l)p+=` - ${u.label}: ${u.url}
300
259
  `}return p}}let n=e instanceof Error?e.message:String(e||"Unknown error");return t.json?{success:!1,error:n}:`
301
260
  Error: ${n}
302
- `}var yi="2025-10-28";async function u0({context:e,apiToken:t,interactive:n}){let r=_t(e,{apiToken:t});if(r.apiKey)return ot({apiKey:r.apiKey,baseURL:r.baseURL,version:yi});if(n){let{apiToken:o}=await ba.prompt([{type:"password",name:"apiToken",message:"Enter your API token:",validate:a=>a.trim()?!0:"API token is required"}]);return ot({apiKey:o,baseURL:r.baseURL,version:yi})}throw new Error("API token is required. Please run 'phala login' or set PHALA_CLOUD_API_KEY environment variable")}async function f0({dockerComposePath:e,interactive:t}){if(!e)if(t){let r=gr(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e=await Ft("Enter the path to your Docker Compose file:",r,"file")}else throw new Error(Ca(`
261
+ `}var Ws="2026-05-22";async function Lk({context:e,apiToken:t,interactive:n}){let r=vt(e,{apiToken:t});if(r.apiKey)return ot({apiKey:r.apiKey,baseURL:r.baseURL,version:Ws});if(n){let{apiToken:o}=await Zo.prompt([{type:"password",name:"apiToken",message:"Enter your API token:",validate:a=>a.trim()?!0:"API token is required"}]);return ot({apiKey:o,baseURL:r.baseURL,version:Ws})}throw new Error("API token is required. Please run 'phala login' or set PHALA_CLOUD_API_KEY environment variable")}async function Nk({dockerComposePath:e,interactive:t}){if(!e)if(t){let r=Go(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e=await qo("Enter the path to your Docker Compose file:",r,"file")}else throw new Error(Xo(`
303
262
  Docker Compose file is required.
304
263
 
305
264
  Usage examples:
@@ -315,7 +274,7 @@ Error: ${n}
315
274
  --rpc-url <url> RPC URL for the blockchain
316
275
 
317
276
  Run with --interactive for guided setup
318
- `));if(!dt.existsSync(e))throw new Error(`Docker compose file not found: ${e}`);return dt.readFileSync(e,"utf8")}var g0=async(e,t)=>{let n=e.privateKey||process.env.PRIVATE_KEY;if(t&&!e.privateKey)if(e.interactive)n=(await ba.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 tu(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 h0=async e=>{let t=e.name;if(e.name){if(!er(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=Kt.basename(process.cwd()),r=Ll(n);return e.interactive?t=(await ba.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:r,validate:a=>a.trim()?er(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},y0=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=dt.readFileSync(e.envFile,{encoding:"utf8"});t.push(...ar(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=ya(e.env);for(let r of n.files){let o=Kt.resolve(process.cwd(),r);if(!dt.existsSync(o))throw new Error(`Environment file not found: ${r}`);try{let a=dt.readFileSync(o,{encoding:"utf8"});t.push(...ar(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 ba.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=Kt.resolve(process.cwd(),r);return dt.existsSync(o)?!0:`File not found at ${o}`}}]);if(n.trim()){let r=Kt.resolve(process.cwd(),n.trim()),o=dt.readFileSync(r,{encoding:"utf8"});t.push(...ar(o))}}if(t.length!==0)return va(t)},v0=async e=>{let t=e.sshPubkey;if(!(e.devOs===!1&&!e.sshPubkey)){if(t){if(t.startsWith("~")&&(t=Kt.join(Qd.homedir(),t.slice(1))),!dt.existsSync(t))throw new Error(`SSH public key file not found: ${t}`)}else{let n=Qd.homedir(),r=[Kt.join(n,".ssh","id_rsa.pub"),Kt.join(n,".ssh","id_ed25519.pub"),Kt.join(n,".ssh","id_ecdsa.pub"),Kt.join(n,".ssh","id_dsa.pub")];for(let o of r)if(dt.existsSync(o)){t=o;break}if(!t){if(e.devOs)throw new Error(Ca(`
277
+ `));if(!dt.existsSync(e))throw new Error(`Docker compose file not found: ${e}`);return dt.readFileSync(e,"utf8")}var Ok=async(e,t)=>{let n=e.privateKey||process.env.PRIVATE_KEY;if(t&&!e.privateKey)if(e.interactive)n=(await Zo.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 Mu(e){e.kmsId&&m.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 jk=async e=>{let t=e.name;if(e.name){if(!Fn(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=jt.basename(process.cwd()),r=Xc(n);return e.interactive?t=(await Zo.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:r,validate:a=>a.trim()?Fn(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},Fk=async e=>{let t=[];if(e.envFile&&typeof e.envFile=="string"){m.warn("--env-file is deprecated. Use -e <file> or -e KEY=VALUE instead.");try{let n=dt.readFileSync(e.envFile,{encoding:"utf8"});t.push(...Kn(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=Jo(e.env);for(let r of n.files){let o=jt.resolve(process.cwd(),r);if(!dt.existsSync(o))throw new Error(`Environment file not found: ${r}`);try{let a=dt.readFileSync(o,{encoding:"utf8"});t.push(...Kn(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 Zo.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=jt.resolve(process.cwd(),r);return dt.existsSync(o)?!0:`File not found at ${o}`}}]);if(n.trim()){let r=jt.resolve(process.cwd(),n.trim()),o=dt.readFileSync(r,{encoding:"utf8"});t.push(...Kn(o))}}if(t.length!==0)return Yo(t)},Vk=async e=>{let t=e.sshPubkey;if(e.devOs!==!1){if(t){if(t.startsWith("~")&&(t=jt.join(Tu.homedir(),t.slice(1))),!dt.existsSync(t))throw new Error(`SSH public key file not found: ${t}`)}else{let n=Tu.homedir(),r=[jt.join(n,".ssh","id_rsa.pub"),jt.join(n,".ssh","id_ed25519.pub"),jt.join(n,".ssh","id_ecdsa.pub"),jt.join(n,".ssh","id_dsa.pub")];for(let o of r)if(dt.existsSync(o)){t=o;break}if(!t){if(e.devOs)throw new Error(Xo(`
319
278
  SSH public key is required for dev images but not found.
320
279
 
321
280
  Searched for:
@@ -327,49 +286,44 @@ Error: ${n}
327
286
  Please either:
328
287
  1. Create an SSH key pair: ssh-keygen -t rsa
329
288
  2. Specify a different key file: --ssh-pubkey <path>
330
- `));return}}try{let n=dt.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 C0=(e,t)=>({publicLogs:e.publicLogs??t?.public_logs??!0,publicSysinfo:e.publicSysinfo??t?.public_sysinfo??!0,listed:e.listed??t?.listed??!1}),b0=(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:m,deprecatedKmsId:p}=a??tu(e);e.instanceType&&(l.instance_type=e.instanceType),e.vcpu&&(l.vcpu=Number(e.vcpu)),e.memory&&(l.memory=Zd(e.memory)),e.diskSize&&(l.disk_size=Xd(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),e.kmsContract&&(l.kms_contract=e.kmsContract),e.kmsContractId&&(l.kms_contract_id=e.kmsContractId),e.keyProviderMode&&(l.key_provider_mode=e.keyProviderMode),e.skipGateway===!0&&(l.skip_gateway=!0);let d=m==="ETHEREUM"||m==="BASE";if(e.devOs===!0?l.prefer_dev=!0:(e.devOs===!1||d)&&(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 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},w0=async(e,t,n,r,o,a,s,i)=>{let l=tu(e),m=await h0(e),p=await v0(e),d=[...n||[]];p&&d.push({key:"DSTACK_AUTHORIZED_KEYS",value:p});let f=C0(e,s),u=b0(e,m,t,d,f,l,i);o.write(`Provisioning CVM ${m}...
331
- `);let h=await ks(r,u);if(!h.success){let k=eu(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 g0(e,b.chain_id),_=await Xl({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 oe=typeof _=="object"&&_!==null?JSON.stringify(_):String(_);throw new Error(`Deployment contract failed: ${oe}`)}let I=_.data,$=b.slug||b.id;if(!$)throw new Error("KMS reference (slug or id) is missing from provision response");let M=await tr(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 N=M.data,G=await(0,Ae.encryptEnvVars)(d,N.public_key);y=await Do(r,{app_id:I.appId,encrypted_env:G,compose_hash:g.compose_hash,kms_id:$,contract_address:I.appAuthAddress,deployer_address:I.deployer})}else{let k=d&&d.length>0?await(0,Ae.encryptEnvVars)(d,g.app_env_encrypt_pubkey):void 0;y=await Do(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:`${ie}/dashboard/cvms/${S.vm_uuid}`},null,2)}
332
- `);else{let k=Ca`
289
+ `));return}}try{let n=dt.readFileSync(t,"utf8").trim();return m.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 Hk=(e,t)=>({publicLogs:e.publicLogs??t?.public_logs??!0,publicSysinfo:e.publicSysinfo??t?.public_sysinfo??!0,publicTcbinfo:e.publicTcbinfo??t?.public_tcbinfo??!0,secureTime:e.secureTime??t?.secure_time??!1,listed:e.listed??t?.listed??!1}),zk=(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,public_tcbinfo:o.publicTcbinfo,secure_time:o.secureTime};s&&(i.pre_launch_script=s),e.fs&&(i.storage_fs=e.fs),e.experimentalKeyProviderType&&(i.key_provider=e.experimentalKeyProviderType);let c={name:t,compose_file:i,listed:o.listed},{kmsType:l,deprecatedKmsId:p}=a??Mu(e);e.instanceType&&(c.instance_type=e.instanceType),e.vcpu&&(c.vcpu=Number(e.vcpu)),e.memory&&(c.memory=xu(e.memory)),e.diskSize&&(c.disk_size=$u(e.diskSize)),e.nodeId&&(c.teepod_id=Number(e.nodeId)),e.region&&(c.region=e.region),e.image&&(c.image=e.image),c.kms=l,e.kmsContract&&(c.kms_contract=e.kmsContract),e.kmsContractId&&(c.kms_contract_id=e.kmsContractId),e.keyProviderMode&&(c.key_provider_mode=e.keyProviderMode),e.skipGateway===!0&&(c.skip_gateway=!0);let u=l==="ETHEREUM"||l==="BASE";if(e.devOs===!0?c.prefer_dev=!0:(e.devOs===!1||u)&&(c.prefer_dev=!1),e.customAppId&&(c.app_id=e.customAppId,l==="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.`);c.nonce=f}if(e.nonce&&!e.customAppId)throw new Error("--nonce requires --custom-app-id to be specified.");return c},Kk=async(e,t,n,r,o,a,s,i)=>{let c=Mu(e),l=await jk(e),p=await Vk(e),u=[...n||[]];p&&u.push({key:"DSTACK_AUTHORIZED_KEYS",value:p});let f=Hk(e,s),d=zk(e,l,t,u,f,c,i);o.write(`Provisioning CVM ${l}...
290
+ `);let h=await Wa(r,d);if(!h.success){let S=Du(h.error,e);throw m.error("Error in provisioning CVM:",S),h.error}let g=h.data,y,k=g.kms_info;if(e.experimentalKeyProviderType&&g.app_id&&g.compose_hash){let S=e.experimentalKeyProviderType,b=k?.k256_pubkey||"",I=El({compose_hash:`0x${g.compose_hash}`,app_id:`0x${g.app_id}`,key_provider_type:S,key_provider_id:b?`0x${b}`:"0x"});m.info(`mr_config_id (v2): ${I}`)}if(!g.app_id&&!!k?.chain_id&&!!k?.kms_contract_address){if(!k?.chain_id||!k?.chain)throw new Error("KMS chain info is missing from provision response. Please retry or contact support.");if(!k?.kms_contract_address)throw new Error("KMS contract address is missing from provision response. Please retry or contact support.");let S=await Ok(e,k.chain_id),b=await Pl({chain:k.chain,rpcUrl:e.rpcUrl,kmsContractAddress:k.kms_contract_address,privateKey:S,deviceId:g.device_id,composeHash:g.compose_hash});if(!b.success){m.logDetailedError(b,"Deploy App Auth");let ce=typeof b=="object"&&b!==null?JSON.stringify(b):String(b);throw new Error(`Deployment contract failed: ${ce}`)}let I=b.data,x=k.slug||k.id;if(!x)throw new Error("KMS reference (slug or id) is missing from provision response");let U=await Vn(r,{app_id:I.appId,kms:x});if(!U.success)throw m.logDetailedError(U.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get app env encrypt pubkey: ${U.error.message}`);let M=zo(U.data,I.appId,k.k256_pubkey),J=await je(u,M);y=await io(r,{app_id:I.appId,encrypted_env:J,compose_hash:g.compose_hash,kms_id:x,contract_address:I.appAuthAddress,deployer_address:I.deployer})}else{let S=u&&u.length>0?await je(u,g.app_env_encrypt_pubkey):void 0;y=await io(r,{app_id:g.app_id,encrypted_env:S,compose_hash:g.compose_hash,kms_id:c.deprecatedKmsId})}if(!y.success)throw m.logDetailedError(y.error,"Commit CVM Provision"),new Error(`Failed to commit CVM provision: ${y.error.message}`);let E=y.data;if(e?.json!==!1)o.write(`${JSON.stringify({success:!0,vm_uuid:E.vm_uuid,name:E.name,app_id:E.app_id,dashboard_url:`${le}/dashboard/cvms/${E.vm_uuid}`},null,2)}
291
+ `);else{let S=Xo`
333
292
  CVM created successfully!
334
293
 
335
- CVM ID: ${S.vm_uuid}
336
- Name: ${S.name}
337
- App ID: ${S.app_id}
338
- Dashboard URL: ${ie}/dashboard/cvms/${S.vm_uuid}
339
- `;o.write(`${k}
340
- `)}},_0=async(e,t,n,r,o,a,s)=>{let i=await W(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,m;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 tr(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;m=await(0,Ae.encryptEnvVars)(n,g.public_key)}else{if(!l.encrypted_env_pubkey)throw new Error("CVM encrypted_env_pubkey is required for centralized KMS");m=await(0,Ae.encryptEnvVars)(n,l.encrypted_env_pubkey)}let p={id:e.uuid,docker_compose_file:t};s&&(p.pre_launch_script=s),n&&n.length>0&&(p.allowed_envs=n.map(u=>u.key)),m&&(p.encrypted_env=m),e.publicLogs!==void 0&&(p.public_logs=e.publicLogs),e.publicSysinfo!==void 0&&(p.public_sysinfo=e.publicSysinfo),e.prepareOnly&&(p.prepareOnly=!0),c.info(`Updating CVM ${e.uuid}...`);let d=await rm(r,p);if(!d.success){let u=eu(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)}
341
- `):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,N={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(N,null,2)}
342
- `);else{let G=["CVM update prepared successfully (pending on-chain approval).","",`Compose Hash: ${$}`,`App ID: ${l.app_id}`,`Device ID: ${f.deviceId}`];if(w&&G.push(`Chain: ${S?.name||"Unknown"} (ID: ${w})`),I&&G.push(`Contract: ${I}`),G.push(`Commit Token: ${f.commitToken||"N/A"}`,`Commit URL: ${f.commitUrl||"N/A"}`,`API Commit URL: ${f.apiCommitUrl||"N/A"} (POST)`),M){let oe=M.compose_hash_allowed?"registered":"NOT registered",se=M.device_id_allowed?"registered":"NOT registered";G.push("","On-chain Status:",` Compose Hash: ${oe}`,` Device ID: ${se}`),M.is_allowed&&G.push(" All prerequisites met. You can commit with --transaction-hash already-registered.")}G.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(`${G.join(`
294
+ CVM ID: ${E.vm_uuid}
295
+ Name: ${E.name}
296
+ App ID: ${E.app_id}
297
+ Dashboard URL: ${le}/dashboard/cvms/${E.vm_uuid}
298
+ `;o.write(`${S}
299
+ `)}},qk=async(e,t,n,r,o,a,s)=>{let i=await G(r,{id:e.uuid});if(!i.success)throw m.logDetailedError(i.error,"Get CVM Info"),new Error(`Failed to get cvm info: ${i.error.message}`);let c=i.data,l;if(n&&n.length>0)if(c.kms_info?.chain_id){let d=c.kms_info?.slug||c.kms_info?.id;if(!d)throw new Error("KMS slug or id is required for decentralized KMS");let h=await Vn(r,{app_id:c.app_id,kms:d});if(!h.success)throw m.logDetailedError(h.error,"Get App Env Encrypt PubKey"),new Error(`Failed to get app env encrypt pubkey: ${h.error.message}`);let g=zo(h.data,c.app_id,c.kms_info.k256_pubkey);l=await je(n,g)}else{if(!c.encrypted_env_pubkey)throw new Error("CVM encrypted_env_pubkey is required for centralized KMS");l=await je(n,c.encrypted_env_pubkey)}let p={id:e.uuid,docker_compose_file:t};s&&(p.pre_launch_script=s),n&&n.length>0&&(p.allowed_envs=n.map(d=>d.key)),l&&(p.encrypted_env=l),e.publicLogs!==void 0&&(p.public_logs=e.publicLogs),e.publicSysinfo!==void 0&&(p.public_sysinfo=e.publicSysinfo),Uk(p,e.forceStop),e.prepareOnly&&(p.prepareOnly=!0),m.info(`Updating CVM ${e.uuid}...`);let u=await Ml(r,p);if(!u.success){let d=Du(u.error,e);throw m.error("Error updating CVM:",d),u.error}let f=u.data;if(e.prepareOnly&&!f.requiresOnChainHash){let d="--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:d},null,2)}
300
+ `):m.warn(d);return}if(f.requiresOnChainHash){if(e.prepareOnly){let S=f.kmsInfo?.chain_id,b=f.kmsInfo?.chain,I=c.app_id,x=b?.blockExplorers?.default?.url,U=x&&I?`${x}/address/${I.startsWith("0x")?I:`0x${I}`}`:void 0,M=f.composeHash.startsWith("0x")?f.composeHash:`0x${f.composeHash}`,J=f.onchainStatus,ce={success:!0,prepare_only:!0,compose_hash:M,app_id:c.app_id,device_id:f.deviceId,kms_info:f.kmsInfo,chain_id:S,contract_explorer_url:U,onchain_status:J,commit_token:f.commitToken,commit_url:f.commitUrl,api_commit_url:f.apiCommitUrl};if(e.json!==!1)o.write(`${JSON.stringify(ce,null,2)}
301
+ `);else{let Z=["CVM update prepared successfully (pending on-chain approval).","",`Compose Hash: ${M}`,`App ID: ${c.app_id}`,`Device ID: ${f.deviceId}`];if(S&&Z.push(`Chain: ${b?.name||"Unknown"} (ID: ${S})`),U&&Z.push(`Contract: ${U}`),Z.push(`Commit Token: ${f.commitToken||"N/A"}`,`Commit URL: ${f.commitUrl||"N/A"}`,`API Commit URL: ${f.apiCommitUrl||"N/A"} (POST)`),J){let Q=J.compose_hash_allowed?"registered":"NOT registered",$=J.device_id_allowed?"registered":"NOT registered";Z.push("","On-chain Status:",` Compose Hash: ${Q}`,` Device ID: ${$}`),J.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 ${M} \\`," --transaction-hash <tx-hash>"),o.write(`${Z.join(`
343
302
  `)}
344
- `)}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 wn({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 on({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 rn({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 om(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 ga(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:`${ie}/dashboard/cvms/${e.uuid}`},null,2)}
303
+ `)}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:",c.app_id),console.log("[DEBUG] patchCvm.deviceId:",f.deviceId));let d=c.kms_info?.chain_id,h=d!=null?At[d]:void 0;if(!h)throw new Error(d!=null?`CVM chain id ${d} is not supported by this CLI build`:"CVM kms_info is missing chain_id");let g=await pn({chain:h,rpcUrl:e.rpcUrl,appAddress:c.app_id,deviceId:f.deviceId,composeHash:f.composeHash});if(!g.success){let S=g.error;throw new Error(`Failed to check on-chain prerequisites (contract: ${c.app_id}): ${S.message}`)}if(e.debug&&console.log("[DEBUG] prereqs:",g.data),!g.data.deviceAllowed){m.info("Device not registered on-chain, adding...");let S=await Jt({chain:h,rpcUrl:e.rpcUrl,appAddress:c.app_id,deviceId:f.deviceId,privateKey:e.privateKey});if(!S.success){let b=S.error;throw new Error(`Failed to register device on-chain (device: ${f.deviceId.slice(0,10)}...): ${b.message}`)}}let y=await Wt({chain:h,rpcUrl:e.rpcUrl,appId:c.app_id,composeHash:f.composeHash,privateKey:e.privateKey});if(!y.success){let S=y.error;throw new Error(`Failed to register compose hash on-chain (hash: ${f.composeHash.slice(0,10)}...): ${S.message}`)}let _=y.data.transactionHash;e.debug&&console.log("[DEBUG] transactionHash:",_);let E=await Ul(r,{id:e.uuid,composeHash:f.composeHash,transactionHash:_});if(!E.success){let S=E.error.message,b="status"in E.error?E.error.status:void 0;throw b===466?new Error("Compose hash expired. Please retry the update from the beginning."):b===467?new Error(`Transaction verification failed on backend. Hash: ${_}`):b===468?new Error(`Compose hash not found on-chain. Contract: ${c.app_id}`):new Error(`Failed to confirm CVM update after on-chain registration: ${S}`)}}if(e.wait){m.info("Waiting for update to complete...");try{await Ko(e.uuid,3e5,a)}catch(d){throw m.logDetailedError(d,"Wait for CVM Ready"),new Error(`Wait failed: ${d instanceof Error?d.message:String(d)}`)}}e?.json!==!1?o.write(`${JSON.stringify({success:!0,vm_uuid:e.uuid,name:c.name,app_id:c.app_id,dashboard_url:`${le}/dashboard/cvms/${e.uuid}`},null,2)}
345
304
  `):o.write(`CVM updated successfully!
346
- `)},k0=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 am(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)}
305
+ `)},Gk=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||m.info("No --transaction-hash provided, using 'already-registered' (state-only check)"),m.info(`Committing CVM update for ${e.uuid}...`);let r=await Ll(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)}
347
306
  `):n.write(`CVM update committed successfully! Correlation ID: ${r.data.correlationId}
348
- `)};async function nu(e,t){try{if(e.commit){let u=_t(t,{apiToken:e.apiToken}),h=ot({apiKey:u.apiKey,baseURL:u.baseURL,version:yi}),g=t.cvmId?z.parse(t.cvmId).cvmId:void 0;await k0({...e,uuid:g},h,t.stdout);return}let n=e.compose||t.projectConfig.compose_file,r=await u0({context:t,apiToken:e.apiToken,interactive:e.interactive}),o=await f0({dockerComposePath:n,interactive:e.interactive}),a;if(e.preLaunchScript){if(!dt.existsSync(e.preLaunchScript))throw new Error(`Pre-launch script file not found: ${e.preLaunchScript}`);a=dt.readFileSync(e.preLaunchScript,"utf8")}let s=Buffer.byteLength(o,"utf8"),i=a?Buffer.byteLength(a,"utf8"):0,l=s+i;if(l>Ur){let u=Ur/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 m={...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},p=await y0(m);e.debug&&(console.log("[DEBUG] context.cvmId:",JSON.stringify(t.cvmId)),console.log("[DEBUG] input.cvmId:",e.cvmId));let d=t.cvmId?z.parse(t.cvmId).cvmId:void 0;e.debug&&(console.log("[DEBUG] resolved uuid:",d),console.log("[DEBUG] isUpdate:",!!d)),!!d?await _0({...e,uuid:d},o,p,r,t.stdout,t,a):await w0(e,o,p??[],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)}
349
- `):t.stderr.write(`${Ca`${n instanceof Error?n.message:String(n)}`}
350
- `),n}}async function S0(e,t){try{return await nu(e,t),0}catch{return 1}}var ru=C({path:["deploy"],meta:Wd,schema:Jd,handler:S0});var ou={path:["envs"],meta:{name:"envs",category:"manage",description:"Encrypt and update CVM sealed environment variables",stability:"stable"}};import au from"fs";import E0 from"path";function wa(e){let t=ya(e),n=[];for(let r of t.files){let o=E0.resolve(r);if(!au.existsSync(o))throw new Error(`Environment file not found: ${r}`);let a=au.readFileSync(o,"utf8"),s=ar(a);n.push(...s)}return n.push(...t.keyValues),va(n)}import{z as yr}from"zod";var su={name:"encrypt",description:"Encrypt environment variables for a CVM (sealed, only readable inside TEE)",stability:"stable",arguments:[X],options:[j,{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"}]},iu=yr.object({cvmId:yr.string().optional(),env:yr.array(yr.string()).min(1,"At least one -e argument is required"),noNewline:yr.boolean().default(!1),interactive:yr.boolean().default(!1)});async function I0(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=wa(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 W(r,t.cvmId);if(!o.success)return t.fail(o.error.message),1;let a=o.data,s=await pn(r,a),i=await(0,Ae.encryptEnvVars)(n,s);return process.stdout.write(e.noNewline?i:`${i}
351
- `),0}catch(n){return t.fail(n instanceof Error?n.message:String(n)),1}}var cu=C({path:["envs","encrypt"],meta:su,schema:iu,handler:I0});import{z as un}from"zod";var lu={name:"update",description:"Encrypt and push sealed environment variables to a CVM (only readable inside TEE)",stability:"stable",arguments:[X],options:[j,{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"},Qe,qe],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>"}]},mu=un.object({cvmId:un.string().optional(),env:un.array(un.string()).optional(),encryptedEnv:un.string().optional(),privateKey:un.string().optional(),rpcUrl:un.string().optional(),interactive:un.boolean().default(!1)});async function A0(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 W(a,t.cvmId);if(!s.success)return t.fail(s.error.message),1;let i=s.data,l,m;if(r&&n.env){let f=wa(n.env);if(f.length===0)return t.fail("No environment variables found in the provided inputs."),1;m=f.map(h=>h.key);let u=await pn(a,i);l=await(0,Ae.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 p=await To(a,{id:i.id,encrypted_env:l,env_keys:m});if(!p.success)return t.fail(p.error.message),1;let d=p.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 rn({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 To(a,{id:i.id,encrypted_env:l,env_keys:m,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 pu=C({path:["envs","update"],meta:lu,schema:mu,handler:A0});var vi={group:ou,commands:[cu,pu]};import{z as X0}from"zod";var du={path:["docker"],meta:{name:"docker",description:"Docker Hub login and image management",stability:"deprecated"}};import j0 from"fs";import _u from"path";import ku from"inquirer";import{exec as T0,spawn as M0}from"child_process";import Gt from"fs";import yu from"os";import ao from"path";import{promisify as L0}from"util";import{execa as U0}from"execa";import O0 from"handlebars";import{INVALID as P0,ParseStatus as $0,ZodIssueCode as vr,ZodParsedType as uu,ZodType as R0,addIssueToContext as Cr,z as fu}from"zod";var x0="ZodDecimal",D0=/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/,gu=class e extends R0{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)!==uu.number){let s=this._getOrReturnCtx(n);return Cr(s,{code:vr.invalid_type,expected:uu.number,received:s.parsedType}),P0}let o,a=new $0;for(let s of this._def.checks)if(s.kind==="precision"){let i=n.data.toString().match(D0);Math.max((i[1]?i[1].length:0)-(i[2]?Number.parseInt(i[2],10):0),0)>s.value&&(o=this._getOrReturnCtx(n,o),Cr(o,{code:vr.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),Cr(o,{code:vr.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),Cr(o,{code:vr.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),Cr(o,{code:vr.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),Cr(o,{code:vr.not_finite,message:s.message}),a.dirty()));return{status:a.value,value:n.data}}static{this.create=n=>new e({checks:[],typeName:x0,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)}},hu=fu.object({template:fu.string().min(1,"Template cannot be empty")});var so=L0(T0),vu=".phala-cloud/logs",N0=".phala-cloud/compose",Cu=10,et=class{constructor(t,n,r){this.image=t,this.username=n||"",this.registry=r||""}ensureLogsDir(){let t=ao.resolve(vu);Gt.existsSync(t)||Gt.mkdirSync(t,{recursive:!0})}getLogFilePath(t,n){let r=new Date().toISOString().replace(/[:.]/g,"-");return ao.resolve(vu,`${n||this.image}-${t}-${r}.log`)}getSystemArchitecture(){let t=yu.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=M0(t,n);this.ensureLogsDir();let l=this.getLogFilePath(r,o),m=Gt.createWriteStream(l,{flags:"a"}),p=[],d=(f,u=!1)=>{let h=f.toString().split(`
352
- `);m.write(f);for(let g of h)if(g.trim()){p.push(g),p.length>Cu&&p.shift(),console.clear(),console.log(`Latest ${Cu} lines (full log at ${l}):`),console.log("-".repeat(50));for(let y of p)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=>{m.end(),f===0?(console.log(`
353
- Operation completed. Full log available at: ${l}`),a()):s(new Error(`Process exited with code ${f}. Check log file: ${l}`))}),i.on("error",f=>{m.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}`);at(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 jt())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 U0("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=yu.homedir(),n=ao.join(t,".docker","config.json");if(!Gt.existsSync(n))return!1;let r=JSON.parse(Gt.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"?bp:wp,a=hu.parse({template:o}),s=ao.resolve(N0);Gt.existsSync(s)||(c.info(`Creating directory: ${s}`),Gt.mkdirSync(s,{recursive:!0}));let i=[];n&&(i=Gt.readFileSync(n,"utf-8").split(`
354
- `).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,p=O0.compile(a.template,{noEscape:!0})({imageName:l,envVars:i.map(f=>f.replace(/=.*/,`=\${${f.split("=")[0]}}`))}),d=ao.join(s,`${t.replace(/.*\/+([\w-]+):.*$/g,"$1")}-tee-compose.yaml`);return Gt.writeFileSync(d,p),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}`);at(t);let o=["-f",t,"up","-d"];return n&&(at(n),o.splice(2,0,"--env-file",n)),await so(`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 so(`docker pull ${t}`),c.info("Starting simulator in background...");let{stdout:r}=await so(`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}`),ii(`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 so("docker stop tee-simulator"),await Pn(),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 so('docker images --format "{{.Repository}}:{{.Tag}}"'),r=(await jt())?.username;return t.split(`
355
- `).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 _a}from"zod";var bu={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"}]},wu=_a.object({image:_a.string().optional(),tag:_a.string().optional(),file:_a.string().default("Dockerfile")});async function F0(e,t){try{let n=await jt();if(!n)return c.error('Docker information not found. Please login first with "phala docker login"'),1;let r=e.image;r||(r=(await ku.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 ku.prompt([{type:"input",name:"tag",message:"Enter the Docker image tag:",default:"latest",validate:m=>m.trim()?!0:"Tag is required"}])).tag);let a=_u.resolve(process.cwd(),e.file);if(!j0.existsSync(a)){c.info(`Default Dockerfile not found at ${a}`);let l=await Ft("Enter the path to your Dockerfile:","Dockerfile","file");a=_u.resolve(process.cwd(),l)}return await new et(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 Su=C({path:["docker","build"],meta:bu,schema:wu,handler:F0});import co from"fs";import ka from"path";import lo from"inquirer";import{z as io}from"zod";var Eu={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"}]},Iu=io.object({image:io.string().optional(),envFile:io.string().optional(),output:io.string().optional(),template:io.string().optional()});async function V0(e){if(e)return e;let t=await et.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 lo.prompt([{type:"list",name:"selectedImage",message:"Select an image to use in the compose file:",choices:n}]);return r}async function H0(e){if(e)return at(e),e;let t=ka.join(process.cwd(),".env");if(co.existsSync(t)){let{useDefault:r}=await lo.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);if(r)return t}let{envPath:n}=await lo.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:r=>{try{return at(r),!0}catch{return`File not found: ${r}`}}}]);return n}async function z0(e){let t=e??ka.join(process.cwd(),"docker-compose.yml");if(co.existsSync(t)){let{confirmOverwrite:r}=await lo.prompt([{type:"confirm",name:"confirmOverwrite",message:`File ${t} already exists. Overwrite?`,default:!1}]);if(!r){let{customPath:o}=await lo.prompt([{type:"input",name:"customPath",message:"Enter alternative output path:",default:ka.join(process.cwd(),"docker-generated-compose.yml")}]);t=o}}let n=ka.dirname(t);return co.existsSync(n)||(c.info(`Creating directory: ${n}`),co.mkdirSync(n,{recursive:!0})),t}async function K0(e,t){try{let n=await jt();if(!n||!n.username)throw new Error('Docker Hub username not found. Please login first with "phala docker login"');let r=await V0(e.image),o=await H0(e.envFile),a=await z0(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 et("",n.username,n.registry).buildComposeFile(r,o,e.template);return i!==a&&co.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 Au=C({path:["docker","generate"],meta:Eu,schema:Iu,handler:K0});import Ru from"prompts";import{z as Sa}from"zod";var Pu={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"}]},$u=Sa.object({username:Sa.string().optional(),password:Sa.string().optional(),registry:Sa.string().optional()});async function G0(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 Ru({type:"text",name:"username",message:"Enter your Docker Hub username:",validate:m=>m.length>0?!0:"Username cannot be empty"});if(!l.username)return c.error("Username is required"),1;n=l.username}let a=new et("",n,o);if(await a.login(n))return c.success(`${n} is logged in to Docker Hub`),await Hs({username:n,registry:o||null}),0;if(!r){let l=await Ru({type:"password",name:"password",message:"Enter your Docker Hub password:",validate:m=>m.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 Hs({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 xu=C({path:["docker","login"],meta:Pu,schema:$u,handler:G0});import q0 from"inquirer";import{z as Du}from"zod";var Tu={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"}]},Mu=Du.object({image:Du.string().optional()});async function B0(e){if(e)return e;let t=await et.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 q0.prompt([{type:"list",name:"selectedImage",message:"Select an image to push:",choices:n}]);return r}async function W0(e,t){try{let n=await jt();if(!n)throw new Error('Docker information not found. Please login first with "phala docker login"');let r=await B0(e.image);return await new et("",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 Lu=C({path:["docker","push"],meta:Tu,schema:Mu,handler:W0});import Nu from"fs";import ju from"path";import Ia from"inquirer";import{z as Ea}from"zod";var Uu={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"}]},Ou=Ea.object({compose:Ea.string().optional(),envFile:Ea.string().optional(),skipEnv:Ea.boolean().default(!0)});async function J0(e){if(e)return at(e),e;let t=ju.join(process.cwd(),"docker-compose.yml");if(Nu.existsSync(t)){let{useDefault:r}=await Ia.prompt([{type:"confirm",name:"useDefault",message:"Use docker-compose.yml in current directory?",default:!0}]);if(r)return t}let{composePath:n}=await Ia.prompt([{type:"input",name:"composePath",message:"Enter path to docker-compose.yml file:",validate:r=>{try{return at(r),!0}catch{return"File not found"}}}]);return n}async function Y0(e,t){if(t)return e;if(e)return at(e),e;let n=ju.join(process.cwd(),".env");if(Nu.existsSync(n)){let{useDefault:o}=await Ia.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);if(o)return n}let{envPath:r}=await Ia.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:o=>{try{return at(o),!0}catch{return`File not found: ${o}`}}}]);return r}async function Z0(e,t){try{let n=await J0(e.compose),r=await Y0(e.envFile,e.skipEnv),o=new et("");return r?(c.info(`Validating env file: ${r}`),at(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 Fu=C({path:["docker","run"],meta:Uu,schema:Ou,handler:Z0});var Q0={name:"docker",description:"Docker Hub login and image management",stability:"deprecated"},eE=X0.object({});async function tE(e,t){return t.stdout.write(`Available docker subcommands: login, build, push, generate, run. Use 'phala docker <command> --help' for details.
356
- `),0}var nE=C({path:["docker"],meta:Q0,schema:eE,handler:tE}),Ci={group:du,commands:[nE,xu,Su,Lu,Au,Fu]};import{z as Vu}from"zod";function rE(){let e=[{name:"List available help topics",value:"phala help"}];for(let t of Object.values(sn))e.push({name:`Show "${t.name}" topic`,value:`phala help ${t.name}`});return e}var Hu={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:rE()},zu=Vu.object({topic:Vu.string().optional()});function oE(){let e=Object.values(sn);if(e.length===0)return`This build contains no help topics.
307
+ `)};async function Uu(e,t){try{if(e.commit){let d=vt(t,{apiToken:e.apiToken}),h=ot({apiKey:d.apiKey,baseURL:d.baseURL,version:Ws}),g=t.cvmId?z.parse(t.cvmId).cvmId:void 0;await Gk({...e,uuid:g},h,t.stdout);return}let n=e.compose||t.projectConfig.compose_file,r=await Lk({context:t,apiToken:e.apiToken,interactive:e.interactive}),o=await Nk({dockerComposePath:n,interactive:e.interactive}),a;if(e.preLaunchScript){if(!dt.existsSync(e.preLaunchScript))throw new Error(`Pre-launch script file not found: ${e.preLaunchScript}`);a=dt.readFileSync(e.preLaunchScript,"utf8")}let s=Buffer.byteLength(o,"utf8"),i=a?Buffer.byteLength(a,"utf8"):0,c=s+i;if(c>wr){let d=wr/1024,h=Math.ceil(c/1024);throw new Error(`Combined size of docker compose file and pre-launch script is too large (${h}KB). Maximum allowed size is ${d}KB.`)}let l={...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},p=await Fk(l);e.debug&&(console.log("[DEBUG] context.cvmId:",JSON.stringify(t.cvmId)),console.log("[DEBUG] input.cvmId:",e.cvmId));let u=t.cvmId?z.parse(t.cvmId).cvmId:void 0;e.debug&&(console.log("[DEBUG] resolved uuid:",u),console.log("[DEBUG] isUpdate:",!!u)),!!u?await qk({...e,uuid:u},o,p,r,t.stdout,t,a):await Kk(e,o,p??[],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)}
308
+ `):t.stderr.write(`${Xo`${n instanceof Error?n.message:String(n)}`}
309
+ `),n}}async function Bk(e,t){try{return await Uu(e,t),0}catch{return 1}}var Lu=v({path:["deploy"],meta:Au,schema:Ru,handler:Bk});var Nu={path:["envs"],meta:{name:"envs",category:"manage",description:"Encrypt and update CVM sealed environment variables",stability:"stable"}};import Ou from"fs";import Wk from"path";function Qo(e){let t=Jo(e),n=[];for(let r of t.files){let o=Wk.resolve(r);if(!Ou.existsSync(o))throw new Error(`Environment file not found: ${r}`);let a=Ou.readFileSync(o,"utf8"),s=Kn(a);n.push(...s)}return n.push(...t.keyValues),Yo(n)}import{z as nr}from"zod";var ju={name:"encrypt",description:"Encrypt environment variables for a CVM (sealed, only readable inside TEE)",stability:"stable",arguments:[X],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"}]},Fu=nr.object({cvmId:nr.string().optional(),env:nr.array(nr.string()).min(1,"At least one -e argument is required"),noNewline:nr.boolean().default(!1),interactive:nr.boolean().default(!1)});async function Jk(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=Qo(e.env);if(n.length===0)return t.fail("No environment variables found in the provided inputs."),1;let r=await A(t),o=await G(r,t.cvmId);if(!o.success)return t.fail(o.error.message),1;let a=o.data,s=await tn(r,a),i=await je(n,s);return process.stdout.write(e.noNewline?i:`${i}
310
+ `),0}catch(n){return t.fail(n instanceof Error?n.message:String(n)),1}}var Vu=v({path:["envs","encrypt"],meta:ju,schema:Fu,handler:Jk});import{z as rn}from"zod";var Hu={name:"update",description:"Encrypt and push sealed environment variables to a CVM (only readable inside TEE)",stability:"stable",arguments:[X],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"},Qe,Be],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>"}]},zu=rn.object({cvmId:rn.string().optional(),env:rn.array(rn.string()).optional(),encryptedEnv:rn.string().optional(),privateKey:rn.string().optional(),rpcUrl:rn.string().optional(),interactive:rn.boolean().default(!1)});async function Yk(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 A(t),s=await G(a,t.cvmId);if(!s.success)return t.fail(s.error.message),1;let i=s.data,c,l;if(r&&n.env){let f=Qo(n.env);if(f.length===0)return t.fail("No environment variables found in the provided inputs."),1;l=f.map(h=>h.key);let d=await tn(a,i);c=await je(f,d)}else if(n.encryptedEnv)c=n.encryptedEnv;else return t.fail("No environment input provided."),1;m.info("Updating environment variables...");let p=await co(a,{id:i.id,encrypted_env:c,env_keys:l});if(!p.success)return t.fail(p.error.message),1;let u=p.data;if(u.status==="in_progress")return m.success(`Environment update initiated (correlation_id: ${u.correlation_id})`),0;if(u.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;m.info("Environment key list changed \u2014 registering compose hash on-chain...");let d=u.kms_info.chain;if(!d)return t.fail(`Unsupported chain_id ${u.kms_info.chain_id} \u2014 update @phala/cloud to add support.`),1;let h=await Wt({chain:d,rpcUrl:n.rpcUrl,appId:u.app_id,composeHash:u.compose_hash,privateKey:f});if(!h.success)return m.logDetailedError(h,"Add Compose Hash"),t.fail("Failed to register compose hash on-chain."),1;let g=h.data;m.info("Completing environment update...");let y=await co(a,{id:i.id,encrypted_env:c,env_keys:l,compose_hash:u.compose_hash,transaction_hash:g.transactionHash});return y.success?y.data.status==="in_progress"?(m.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: ${u.status}`),1}catch(a){return t.fail(a instanceof Error?a.message:String(a)),1}}var Ku=v({path:["envs","update"],meta:Hu,schema:zu,handler:Yk});var Js={group:Nu,commands:[Vu,Ku]};import{z as qu}from"zod";function Xk(){let e=[{name:"List available help topics",value:"phala help"}];for(let t of Object.values(Xt))e.push({name:`Show "${t.name}" topic`,value:`phala help ${t.name}`});return e}var Gu={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:Xk()},Bu=qu.object({topic:qu.string().optional()});function Zk(){let e=Object.values(Xt);if(e.length===0)return`This build contains no help topics.
357
311
  `;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(`
358
312
  `)}
359
- `}async function aE(e,t){if(!e.topic)return t.stdout.write(oE()),0;let n=e.topic.trim().toLowerCase(),r=sn[n];if(!r){let a=Object.keys(sn).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(`
313
+ `}async function Qk(e,t){if(!e.topic)return t.stdout.write(Zk()),0;let n=e.topic.trim().toLowerCase(),r=Xt[n];if(!r){let a=Object.keys(Xt).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(`
360
314
  `)?r.content:`${r.content}
361
- `;return t.stdout.write(o),0}var Ku=C({path:["help"],meta:Hu,schema:zu,handler:aE});import $a from"path";import Zu from"fs-extra";import St from"chalk";import wi from"inquirer";import br from"chalk";import sE from"open";import iE from"ora";import cE from"prompts";import{z as Rn}from"zod";var Gu={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"}]},qu=Rn.object({apiKey:Rn.string().min(1,"API key cannot be empty").optional(),manual:Rn.boolean().optional(),noOpen:Rn.boolean().optional(),profile:Rn.string().min(1).optional(),printToken:Rn.boolean().optional(),url:Rn.string().url().optional()});function Bu(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 fn(e,t=""){e.write(`${t}
362
- `)}async function Aa(e){let t=await Bo(e.apiKey,{baseURL:e.baseURL}),n=await je(t);if(!n.success||!n.data?.user.username)throw new Error("Invalid API key");return n.data}async function lE(e){let t,n=await cE({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 Aa({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 Aa({apiKey:n.apiKey,baseURL:e.baseURL})),{apiKey:n.apiKey,user:t}}async function mE(e,t){let n=ot({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,m=i,p=t.printToken?e.stderr:e.stdout;if(fn(p),fn(p,br.bold("To authenticate, visit:")),fn(p,br.cyan(s)),fn(p),fn(p,`${br.bold("And enter code:")} ${br.yellow(a)}`),fn(p),!t.noOpen)try{await sE(s),fn(p,"Opening browser automatically...")}catch{fn(p,"Could not open browser automatically. Please visit the URL above.")}let d=iE("Waiting for authorization...").start(),f=Date.now()+l*1e3;for(;Date.now()<f;){await new Promise(u=>setTimeout(u,m*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 Ct)throw d.stop(),new Error(nn(u));if(u instanceof $o){let h=Bu(u);if(h)switch(h.error){case"authorization_pending":continue;case"slow_down":m+=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 Pa(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||xt,r,o;if(e.apiKey)r=e.apiKey,o=await Aa({apiKey:r,baseURL:n});else if(e.manual){let l=await lE({baseURL:n});r=l.apiKey,o=l.user}else r=await mE(t,{noOpen:e.noOpen,printToken:e.printToken,baseURL:n}),o=await Aa({apiKey:r,baseURL:n});if(!o)throw new Error("Failed to validate API key");if(e.printToken)return t.stdout.write(`${r}
363
- `),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,i=e.profile||s||"default";return lr({profileName:i,token:r,apiPrefix:n,workspaceName:a,workspaceSlug:s,user:{username:o.user.username,email:o.user.email},setCurrent:!0}),t.stdout.write(br.green(`Welcome ${o.user.username}! Credentials saved successfully (profile: ${i})
364
- `)),0}catch(n){let r=n instanceof Error?n.message:String(n);return t.stderr.write(br.red(`Failed to authenticate: ${r}
365
- `)),1}}var Wu=C({path:["login"],meta:Gu,schema:qu,handler:Pa});import{z as bi}from"zod";var pE={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Ju={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:[pE],examples:[{name:"Link by name or ID",value:"phala link my-cvm-name"},{name:"Link interactively",value:"phala link"}]},Yu=bi.object({cvmId:bi.string().optional(),json:bi.boolean().default(!1)});function dE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function Xu(){let e=["docker-compose.yml","docker-compose.yaml"];for(let t of e)if(Zu.existsSync($a.join(process.cwd(),t)))return t}function Qu(){let e=".env.production";if(Zu.existsSync($a.join(process.cwd(),e)))return e}var uE=/^(0x)?[0-9a-f]{40}$/i;function fE(e){return uE.test(e)}function gE(e){return e.replace(/^0x/i,"").toLowerCase()}async function _i(e){let t=_t(e);if(!t.apiKey){if(c.info(`Not authenticated. Starting login flow...
366
- `),await Pa({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 je(r);if(!o.success){if(c.info(`API key expired or invalid. Starting login flow...
367
- `),await Pa({manual:!1,noOpen:!1},e)!==0||(t=_t(e),!t.apiKey))return null;let s=await E(e),i=await je(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 ef(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),Fs(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 hE(e,t){try{if(e.cvmId)return await vE(e.cvmId,t);if(Gr()){let n=ir();if(n.cvm_id&&!n.app_id)return await yE(n,t)}return await CE(t)}catch(n){if(dE(n))return console.log(),c.info("Link cancelled."),0;throw n}}async function yE(e,t){if(!await _i(t))return t.fail("Authentication failed."),1;let r=await E(t),o=await W(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 Fs(l),c.success(`Updated phala.toml with app_id = "${a.app_id}"`),0}async function vE(e,t){let n=await _i(t);if(!n)return t.fail("Authentication failed."),1;let r=n.profileName,o=await E(t),a,s;if(fE(e)){let m=gE(e),p=await lm(o,{appId:m});if(!p.success)return t.fail(`App not found: ${m}`),1;let d=p.data;s=d.app_id,a=d.current_cvm?.name||d.name||$a.basename(process.cwd()),c.success(`Found app: ${s}`)}else{let m=await W(o,{id:e});if(!m.success)return t.fail(`CVM not found: ${e}`),1;let p=m.data;a=p.name||e,s=p.app_id||void 0,c.success(`Found CVM: ${a}`)}if(Gr()){let{overwrite:m}=await wi.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!m)return c.info("Link cancelled."),0}let i=Xu(),l=Qu();return(i||l)&&(console.log(),c.info("Detected local files:"),i&&console.log(St.green(` \u2713 ${i}`)),l&&console.log(St.green(` \u2713 ${l}`))),ef({cvmName:a,appId:s,composeFile:i,envFile:l,profile:r}),0}async function CE(e){let t=await _i(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 Or(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=$a.basename(process.cwd()),m=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}}),p=m.findIndex(g=>g.cvmName.toLowerCase()===l.toLowerCase());console.log(St.bold(`Found ${i.length} CVM(s):
368
- `));let{selectedCvm:d}=await wi.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(Gr()){let{overwrite:g}=await wi.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!g)return c.info("Link cancelled."),0}let f=Xu(),u=Qu();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=m.find(g=>g.value===d);return ef({cvmName:d,appId:h?.appId,composeFile:f,envFile:u,profile:n}),0}var tf=C({path:["link"],meta:Ju,schema:Yu,handler:hE});import{z as bE}from"zod";var nf={name:"logout",category:"profile",description:"Remove stored API key",stability:"stable"},rf=bE.object({});async function wE(e,t){try{let r=Te()?.current_profile;mr();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 of=C({path:["logout"],meta:nf,schema:rf,handler:wE});var af={path:["kms"],meta:{name:"kms",category:"deploy",description:"Manage on-chain KMS contracts",stability:"unstable"}};import{z as sf}from"zod";var cf={name:"list",aliases:["ls"],description:"List on-chain KMS contracts",stability:"unstable",options:[Se],examples:[{name:"List on-chain KMS",value:"phala kms list"},{name:"Output as JSON",value:"phala kms list --json"}]},ki=sf.object({json:sf.boolean().default(!1)});var _E={1:"ethereum",8453:"base",31337:"anvil"};async function lf(e,t){try{let n=await E(t),r=await Ss(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 m=`${l.kms_contract_address}:${l.chain_id}`;a.has(m)||a.set(m,{address:l.kms_contract_address??"-",chain:_E[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):(le(s,i),0)}catch(n){return c.logDetailedError(n),t.fail(`Failed to list KMS: ${n instanceof Error?n.message:String(n)}`),1}}var kE={name:"kms",description:"List and manage on-chain KMS contracts",stability:"unstable"},mf=C({path:["kms","list"],meta:cf,schema:ki,handler:lf}),pf=C({path:["kms"],meta:kE,schema:ki,handler:lf});import{z as df}from"zod";var Si=e=>({name:e,description:`Show on-chain KMS details for ${e}`,stability:"unstable",options:[Se],examples:[{name:`Show ${e} KMS details`,value:`phala kms ${e}`},{name:"Output as JSON",value:`phala kms ${e} --json`}]}),Ei=df.object({json:df.boolean().default(!1)});function uf(e){return async function(n,r){try{let o=await E(r),a=await Ts(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"],m=i.devices.map(p=>({DEVICE_ID:p.device_id,NODE:typeof p.node_name=="string"&&p.node_name.length>0?p.node_name:"-"}));le(l,m)}else c.info("Devices: none");if(c.break(),i.os_images.length>0){c.info("OS Images:");let l=["NAME","VERSION","OS_IMAGE_HASH"],m=i.os_images.map(p=>({NAME:p.name,VERSION:p.version,OS_IMAGE_HASH:p.os_image_hash??"-"}));le(l,m)}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 ff=C({path:["kms","ethereum"],meta:Si("ethereum"),schema:Ei,handler:uf("ethereum")}),gf=C({path:["kms","base"],meta:Si("base"),schema:Ei,handler:uf("base")});var Ii={group:af,commands:[pf,mf,ff,gf]};var hf={path:["nodes"],meta:{name:"nodes",category:"deploy",description:"Manage TEE nodes",stability:"unstable"}};import{z as Ra}from"zod";var yf={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"},Se],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"}]},Ai=Ra.object({page:Ra.coerce.number().int().min(1).default(1),pageSize:Ra.coerce.number().int().min(1).max(100).default(30),json:Ra.boolean().default(!1)});async function vf(e,t){try{let n=await E(t),r=await je(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 nm(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(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?(c.info("No nodes found"),0):(le(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 SE={name:"nodes",description:"List and manage TEE nodes",stability:"unstable"},Cf=C({path:["nodes","list"],meta:yf,schema:Ai,handler:vf}),bf=C({path:["nodes"],meta:SE,schema:Ai,handler:vf});var Pi={group:hf,commands:[bf,Cf]};import{z as xn}from"zod";var wf={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"},Se],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"}]},_f=xn.object({dev:xn.boolean().default(!1),prod:xn.boolean().default(!1),page:xn.number().int().min(1).default(1),pageSize:xn.number().int().min(1).max(100).default(100),all:xn.boolean().default(!1),json:xn.boolean().default(!1)});async function EE(e,t){try{let n=await E(t),r=e.dev?!0:e.prod?!1:void 0,o=async m=>await Ds(n,{page:m,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 m=[...s.items];for(let p=s.page+1;p<=s.pages;p++){let d=await o(p);if(!d.success)return t.fail(d.error.message),1;m.push(...d.data.items)}s={...s,items:m,page_size:m.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(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?(c.info("No OS images found"),0):(le(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 kf=C({path:["os-images"],meta:wf,schema:_f,handler:EE});import{z as $E}from"zod";var Sf={path:["simulator"],meta:{name:"simulator",category:"manage",description:"TEE simulator commands",stability:"unstable"}};import{z as $i}from"zod";var Ef={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"}]},If=$i.object({port:$i.string().default("8090"),verbose:$i.boolean().default(!1)});async function IE(e,t){try{return Yp()||await Zp(),await no()?(c.success("TEE simulator is already running"),0):(await Xp({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 Af=C({path:["simulator","start"],meta:Ef,schema:If,handler:IE});import{z as AE}from"zod";var Pf={name:"stop",description:"Stop the TEE simulator",stability:"unstable"},$f=AE.object({});async function PE(e,t){try{return await Qp()?(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 Rf=C({path:["simulator","stop"],meta:Pf,schema:$f,handler:PE});var RE={name:"simulator",description:"TEE simulator commands",stability:"unstable"},xE=$E.object({});async function DE(e,t){try{let n=await no(),r=ca();if(n&&r){let a=si(),s=a.replace(/dstack\.sock$/,"tappd.sock");t.stdout.write(`\u2713 TEE simulator is running (PID: ${r})\\n`),t.stdout.write(`
315
+ `;return t.stdout.write(o),0}var Wu=v({path:["help"],meta:Gu,schema:Bu,handler:Qk});import na from"path";import td from"fs-extra";import bt from"chalk";import Xs from"inquirer";import rr from"chalk";import e0 from"open";import t0 from"ora";import n0 from"prompts";import{z as vn}from"zod";var Ju={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"}]},Yu=vn.object({apiKey:vn.string().min(1,"API key cannot be empty").optional(),manual:vn.boolean().optional(),noOpen:vn.boolean().optional(),profile:vn.string().min(1).optional(),printToken:vn.boolean().optional(),url:vn.string().url().optional()});function Xu(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 on(e,t=""){e.write(`${t}
316
+ `)}async function ea(e){let t=await _o(e.apiKey,{baseURL:e.baseURL}),n=await Ve(t);if(!n.success||!n.data?.user.username)throw new Error("Invalid API key");return n.data}async function r0(e){let t,n=await n0({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 o0(e,t){let n=ot({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:c}=r,l=i,p=t.printToken?e.stderr:e.stdout;if(on(p),on(p,rr.bold("To authenticate, visit:")),on(p,rr.cyan(s)),on(p),on(p,`${rr.bold("And enter code:")} ${rr.yellow(a)}`),on(p),!t.noOpen)try{await e0(s),on(p,"Opening browser automatically...")}catch{on(p,"Could not open browser automatically. Please visit the URL above.")}let u=t0("Waiting for authorization...").start(),f=Date.now()+c*1e3;for(;Date.now()<f;){await new Promise(d=>setTimeout(d,l*1e3));try{let d=await n.post("/auth/device/token",{device_code:o,grant_type:"urn:ietf:params:oauth:grant-type:device_code"});return u.succeed("Authorization successful!"),d.access_token}catch(d){if(d instanceof yt)throw u.stop(),new Error(Bt(d));if(d instanceof ao){let h=Xu(d);if(h)switch(h.error){case"authorization_pending":continue;case"slow_down":l+=5;continue;case"expired_token":throw u.fail("Authorization expired"),new Error(h.error_description||"Device authorization expired. Please try again.");case"access_denied":throw u.fail("Authorization denied"),new Error(h.error_description||"You denied the authorization request.");default:throw u.fail("Authorization failed"),new Error(`Authorization failed: ${h.error_description||h.error}`)}}throw u.fail("Request failed"),d}}throw u.fail("Authorization timed out"),new Error("Authorization timed out. Please try again.")}async function ta(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 c=await r0({baseURL:n});r=c.apiKey,o=c.user}else r=await o0(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}
317
+ `),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,i=e.profile||s||"default";return Jn({profileName:i,token:r,apiPrefix:n,workspaceName:a,workspaceSlug:s,user:{username:o.user.username,email:o.user.email},setCurrent:!0}),t.stdout.write(rr.green(`Welcome ${o.user.username}! Credentials saved successfully (profile: ${i})
318
+ `)),0}catch(n){let r=n instanceof Error?n.message:String(n);return t.stderr.write(rr.red(`Failed to authenticate: ${r}
319
+ `)),1}}var Zu=v({path:["login"],meta:Ju,schema:Yu,handler:ta});import{z as Ys}from"zod";var a0={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Qu={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:[a0],examples:[{name:"Link by name or ID",value:"phala link my-cvm-name"},{name:"Link interactively",value:"phala link"}]},ed=Ys.object({cvmId:Ys.string().optional(),json:Ys.boolean().default(!1)});function s0(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function nd(){let e=["docker-compose.yml","docker-compose.yaml"];for(let t of e)if(td.existsSync(na.join(process.cwd(),t)))return t}function rd(){let e=".env.production";if(td.existsSync(na.join(process.cwd(),e)))return e}var i0=/^(0x)?[0-9a-f]{40}$/i;function c0(e){return i0.test(e)}function l0(e){return e.replace(/^0x/i,"").toLowerCase()}async function Zs(e){let t=vt(e);if(!t.apiKey){if(m.info(`Not authenticated. Starting login flow...
320
+ `),await ta({manual:!1,noOpen:!1},e)!==0||(t=vt(e),!t.apiKey))return null;console.log()}let n=a=>{let s=a.workspace?.name||"default",i=a.workspace?.slug?` (${a.workspace.slug})`:"";m.success(`Authenticated as ${a.user?.username||"unknown"}`),m.info(`Workspace: ${s}${i}`),console.log()},r=await A(e),o=await Ve(r);if(!o.success){if(m.info(`API key expired or invalid. Starting login flow...
321
+ `),await ta({manual:!1,noOpen:!1},e)!==0||(t=vt(e),!t.apiKey))return null;let s=await A(e),i=await Ve(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 od(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),ys(t),console.log(),console.log(bt.bold("Created phala.toml:")),console.log(bt.dim(` name = "${e.cvmName}"`)),e.appId&&console.log(bt.dim(` app_id = "${e.appId}"`)),console.log(bt.dim(` profile = "${e.profile}"`)),e.composeFile&&console.log(bt.dim(` compose_file = "${e.composeFile}"`)),e.envFile&&console.log(bt.dim(` env_file = "${e.envFile}"`)),console.log(),m.success("Project linked successfully!"),m.info('Run "phala deploy" to update your CVM.')}async function m0(e,t){try{if(e.cvmId)return await u0(e.cvmId,t);if(xr()){let n=Gn();if(n.cvm_id&&!n.app_id)return await p0(n,t)}return await d0(t)}catch(n){if(s0(n))return console.log(),m.info("Link cancelled."),0;throw n}}async function p0(e,t){if(!await Zs(t))return t.fail("Authentication failed."),1;let r=await A(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 m.warn("CVM does not have an app_id. No upgrade needed."),0;let{cvm_id:s,...i}=e,c={...i,app_id:a.app_id};return ys(c),m.success(`Updated phala.toml with app_id = "${a.app_id}"`),0}async function u0(e,t){let n=await Zs(t);if(!n)return t.fail("Authentication failed."),1;let r=n.profileName,o=await A(t),a,s;if(c0(e)){let l=l0(e),p=await zl(o,{appId:l});if(!p.success)return t.fail(`App not found: ${l}`),1;let u=p.data;s=u.app_id,a=u.current_cvm?.name||u.name||na.basename(process.cwd()),m.success(`Found app: ${s}`)}else{let l=await G(o,{id:e});if(!l.success)return t.fail(`CVM not found: ${e}`),1;let p=l.data;a=p.name||e,s=p.app_id||void 0,m.success(`Found CVM: ${a}`)}if(xr()){let{overwrite:l}=await Xs.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!l)return m.info("Link cancelled."),0}let i=nd(),c=rd();return(i||c)&&(console.log(),m.info("Detected local files:"),i&&console.log(bt.green(` \u2713 ${i}`)),c&&console.log(bt.green(` \u2713 ${c}`))),od({cvmName:a,appId:s,composeFile:i,envFile:c,profile:r}),0}async function d0(e){let t=await Zs(e);if(!t)return e.fail("Authentication failed."),1;let n=t.profileName,r=m.startSpinner("Fetching your CVMs..."),o=await A(e),a=await _r(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 m.warn("You don't have any CVMs yet."),m.info('Deploy your first CVM with "phala deploy"'),0;let c=na.basename(process.cwd()),l=i.map(g=>{let y=g.hosted?.app_id||g.hosted?.id||"",k=g.name||g.hosted?.name||"Unnamed",_=g.status||g.hosted?.status||"Unknown",E=g.hosted?.app_id||void 0;return{name:`${k} (${y}) - Status: ${_}`,value:k,cvmName:k,appId:E}}),p=l.findIndex(g=>g.cvmName.toLowerCase()===c.toLowerCase());console.log(bt.bold(`Found ${i.length} CVM(s):
322
+ `));let{selectedCvm:u}=await Xs.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM to link:",choices:l.map(g=>({name:g.name,value:g.value})),default:p>=0?p:0}]);if(xr()){let{overwrite:g}=await Xs.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!g)return m.info("Link cancelled."),0}let f=nd(),d=rd();console.log(),(f||d)&&(m.info("Detected local files:"),f&&console.log(bt.green(` \u2713 ${f}`)),d&&console.log(bt.green(` \u2713 ${d}`)),console.log());let h=l.find(g=>g.value===u);return od({cvmName:u,appId:h?.appId,composeFile:f,envFile:d,profile:n}),0}var ad=v({path:["link"],meta:Qu,schema:ed,handler:m0});import{z as f0}from"zod";var sd={name:"logout",category:"profile",description:"Remove stored API key",stability:"stable"},id=f0.object({});async function g0(e,t){try{let r=Le()?.current_profile;Yn();let o=r?`Credentials removed successfully (profile: ${r})`:"Credentials removed successfully";return t.globalOptions?.json?(t.success({message:o,profile:r||null}),0):(m.success(o),0)}catch(n){return t.globalOptions?.json?(t.fail("Failed to remove credentials"),1):(m.error("Failed to remove credentials"),m.logDetailedError(n),1)}}var cd=v({path:["logout"],meta:sd,schema:id,handler:g0});var ld={path:["kms"],meta:{name:"kms",category:"deploy",description:"Manage on-chain KMS contracts",stability:"unstable"}};import{z as md}from"zod";var pd={name:"list",aliases:["ls"],description:"List KMS contracts",stability:"unstable",options:[fe],examples:[{name:"List KMS contracts",value:"phala kms list"},{name:"Output as JSON",value:"phala kms list --json"}]},Qs=md.object({json:md.boolean().default(!1)});var h0={0:"phala",1:"ethereum",8453:"base",31337:"anvil"};function y0(e){return h0[e]??`chain-${e}`}async function ud(e,t){try{let n=await A(t),r=await Ja(n,{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;if(o.items.length===0)return m.info("No KMS contracts found"),0;let a=["SLUG","LABEL","CHAIN","CONTRACT_ADDRESS","NODES"],s=o.items.map(i=>({SLUG:i.slug??"-",LABEL:i.label??"-",CHAIN:y0(i.chain_id),CONTRACT_ADDRESS:i.contract_address,NODES:String(i.node_count)}));return ie(a,s),0}catch(n){return m.logDetailedError(n),t.fail(`Failed to list KMS contracts: ${n instanceof Error?n.message:String(n)}`),1}}var v0={name:"kms",description:"List and manage KMS contracts",stability:"unstable"},dd=v({path:["kms","list"],meta:pd,schema:Qs,handler:ud}),fd=v({path:["kms"],meta:v0,schema:Qs,handler:ud});import{z as ei}from"zod";var b0={name:"slug",description:"KMS contract slug (e.g. phala, base, ethereum)",required:!0,target:"slug"},gd={name:"nodes",description:"List the KMS nodes (with RPC url) under a contract",stability:"unstable",arguments:[b0],options:[fe],examples:[{name:"List nodes of the phala KMS contract",value:"phala kms nodes phala"},{name:"Output as JSON",value:"phala kms nodes phala --json"}]},hd=ei.object({slug:ei.string(),json:ei.boolean().default(!1)});async function C0(e,t){try{let n=await A(t),r=await Xa(n,{slug:e.slug});if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(e.json)return t.success(o),0;if(o.items.length===0)return m.info(`No KMS nodes found for contract '${e.slug}'`),0;let a=["SLUG","URL","VERSION","TYPE"],s=o.items.map(i=>({SLUG:i.slug??"-",URL:i.url,VERSION:i.version,TYPE:i.kms_type}));return ie(a,s),0}catch(n){return m.logDetailedError(n),t.fail(`Failed to list KMS contract nodes: ${n instanceof Error?n.message:String(n)}`),1}}var yd=v({path:["kms","nodes"],meta:gd,schema:hd,handler:C0});import{z as vd}from"zod";var ti=e=>({name:e,description:`Show on-chain KMS details for ${e}`,stability:"unstable",options:[fe],examples:[{name:`Show ${e} KMS details`,value:`phala kms ${e}`},{name:"Output as JSON",value:`phala kms ${e} --json`}]}),ra=vd.object({json:vd.boolean().default(!1)});var w0={1:"https://etherscan.io",8453:"https://basescan.org"};function bd(e,t){let n=w0[e];return n?`${n}/address/${t}`:null}function Cd(e){return e===!0?"yes":e===!1?"no":"-"}function or(e){return e?e.startsWith("0x")?e:`0x${e}`:"-"}var _0=13;function Ft(e,t){console.log(`${e.padEnd(_0)}${t}`)}function S0(e,t){let n=e.split(".").map(a=>Number.parseInt(a,10)||0),r=t.split(".").map(a=>Number.parseInt(a,10)||0),o=Math.max(n.length,r.length);for(let a=0;a<o;a++){let s=(r[a]??0)-(n[a]??0);if(s!==0)return s}return 0}function wd(e){return async function(n,r){try{let o=await A(r),a=await is(o,{chain:e});if(!a.success)return r.fail(a.error.message),1;let s=a.data;return n.json?(r.success(s),0):s.contracts.length===0?(m.info(`No KMS contracts found on ${e}`),0):(s.contracts.forEach((i,c)=>{c>0&&console.log(""),Ft("Contract",i.contract_address);let l=bd(i.chain_id,i.contract_address);if(l&&Ft("",l),i.gateway_contract_address){Ft("Gateway",i.gateway_contract_address);let p=bd(i.chain_id,i.gateway_contract_address);p&&Ft("",p)}if(Ft("K256 pubkey",or(i.k256_pubkey)),Ft("CA pubkey",or(i.ca_pubkey)),console.log(""),console.log("Devices (nodes currently hosting this KMS)"),i.devices.length>0){let p=["DEVICE_ID","NODE","ON_CHAIN"],u=i.devices.map(f=>({DEVICE_ID:or(f.device_id),NODE:typeof f.node_name=="string"&&f.node_name.length>0?f.node_name:"-",ON_CHAIN:Cd(f.on_chain_allowed)}));ie(p,u)}else console.log(" none");if(console.log(""),console.log("Allowed OS Images (this KMS permits deploying)"),i.os_images.length>0){let p=["NAME","VERSION","OS_IMAGE_HASH","ON_CHAIN"],u=[...i.os_images].sort((f,d)=>S0(f.version,d.version)).map(f=>({NAME:f.name,VERSION:f.version,OS_IMAGE_HASH:or(f.os_image_hash),ON_CHAIN:Cd(f.on_chain_allowed)}));ie(p,u)}else console.log(" none")}),0)}catch(o){return m.logDetailedError(o),r.fail(`Failed to get KMS details for ${e}: ${o instanceof Error?o.message:String(o)}`),1}}}var _d=v({path:["kms","ethereum"],meta:ti("ethereum"),schema:ra,handler:wd("ethereum")}),Sd=v({path:["kms","base"],meta:ti("base"),schema:ra,handler:wd("base")});async function k0(e,t){try{let n=await A(t),r=await Ya(n,{slug:"phala"});if(!r.success)return t.fail(r.error.message),1;let o=r.data;return e.json?(t.success(o),0):(o.label&&Ft("Name",o.label),Ft("K256 pubkey",or(o.k256_pubkey)),Ft("CA pubkey",or(o.ca_pubkey)),0)}catch(n){return m.logDetailedError(n),t.fail(`Failed to get Phala KMS details: ${n instanceof Error?n.message:String(n)}`),1}}var kd=v({path:["kms","phala"],meta:{name:"phala",description:"Show the off-chain Phala KMS root keys",stability:"unstable",options:[fe],examples:[{name:"Show Phala KMS keys",value:"phala kms phala"},{name:"Output as JSON",value:"phala kms phala --json"}]},schema:ra,handler:k0});var ni={group:ld,commands:[fd,dd,yd,_d,Sd,kd]};var Id={path:["nodes"],meta:{name:"nodes",category:"deploy",description:"Manage TEE nodes",stability:"unstable"}};import{z as oa}from"zod";var Ed={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"},fe],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"}]},ri=oa.object({page:oa.coerce.number().int().min(1).default(1),pageSize:oa.coerce.number().int().min(1).max(100).default(30),json:oa.boolean().default(!1)});async function Ad(e,t){try{let n=await A(t),r=await Ve(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 Dl(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"],c=s.items.map(l=>({ID:l.id?.toString()??"-",NAME:l.name??"-",REGION:l.region??"-",PPID:l.ppid??"-",DEVICE_ID:l.device_id??"-",VERSION:l.version?.split(" ")[0]??"-"}));return c.length===0?(m.info("No nodes found"),0):(ie(i,c),m.info(`Page ${s.page}/${s.pages} (total ${s.total})`),0)}catch(n){return m.logDetailedError(n),t.fail(`Failed to list nodes: ${n instanceof Error?n.message:String(n)}`),1}}var I0={name:"nodes",description:"List and manage TEE nodes",stability:"unstable"},Rd=v({path:["nodes","list"],meta:Ed,schema:ri,handler:Ad}),Pd=v({path:["nodes"],meta:I0,schema:ri,handler:Ad});var oi={group:Id,commands:[Pd,Rd]};import{z as bn}from"zod";var xd={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"},fe],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"}]},$d=bn.object({dev:bn.boolean().default(!1),prod:bn.boolean().default(!1),page:bn.number().int().min(1).default(1),pageSize:bn.number().int().min(1).max(100).default(100),all:bn.boolean().default(!1),json:bn.boolean().default(!1)});async function E0(e,t){try{let n=await A(t),r=e.dev?!0:e.prod?!1:void 0,o=async l=>await ss(n,{page:l,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 l=[...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;l.push(...u.data.items)}s={...s,items:l,page_size:l.length,page:1,pages:1}}if(e.json)return t.success(s),0;let i=["NAME","VERSION","OS_IMAGE_HASH","DEV","GPU"],c=s.items.map(l=>({NAME:l.name,VERSION:l.version,OS_IMAGE_HASH:l.os_image_hash??"-",DEV:l.is_dev?"yes":"no",GPU:l.requires_gpu?"yes":"no"}));return c.length===0?(m.info("No OS images found"),0):(ie(i,c),m.info(`Total: ${s.total}`),0)}catch(n){return m.logDetailedError(n),t.fail(`Failed to list OS images: ${n instanceof Error?n.message:String(n)}`),1}}var Td=v({path:["os-images"],meta:xd,schema:$d,handler:E0});import{z as x0}from"zod";var Dd={path:["simulator"],meta:{name:"simulator",category:"manage",description:"TEE simulator commands",stability:"unstable"}};import{z as ai}from"zod";var Md={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"}]},Ud=ai.object({port:ai.string().default("8090"),verbose:ai.boolean().default(!1)});async function A0(e,t){try{return Cu()||await wu(),await Fr()?(m.success("TEE simulator is already running"),0):(await _u({verbose:e.verbose}),m.success("TEE simulator started successfully"),0)}catch(n){return m.error("Failed to start TEE simulator"),m.logDetailedError(n),1}}var Ld=v({path:["simulator","start"],meta:Md,schema:Ud,handler:A0});import{z as R0}from"zod";var Nd={name:"stop",description:"Stop the TEE simulator",stability:"unstable"},Od=R0.object({});async function P0(e,t){try{return await Su()?(m.success("TEE simulator stopped successfully"),0):(m.error("Failed to stop TEE simulator"),1)}catch(n){return m.error("Failed to stop TEE simulator"),m.logDetailedError(n),1}}var jd=v({path:["simulator","stop"],meta:Nd,schema:Od,handler:P0});var $0={name:"simulator",description:"TEE simulator commands",stability:"unstable"},T0=x0.object({});async function D0(e,t){try{let n=await Fr(),r=Bo();if(n&&r){let a=Gs(),s=a.replace(/dstack\.sock$/,"tappd.sock");t.stdout.write(`\u2713 TEE simulator is running (PID: ${r})\\n`),t.stdout.write(`
369
323
  Set these environment variables to use the simulator:
370
324
  `),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
371
325
  `),t.stdout.write(`To start the simulator, run:
372
- `),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 TE=C({path:["simulator"],meta:RE,schema:xE,handler:DE}),Ri={group:Sf,commands:[TE,Af,Rf]};import{z as ME}from"zod";var xf={name:"profiles",category:"profile",description:"List auth profiles",stability:"stable",arguments:[],options:[],aliases:["list"]},Df=ME.object({});import LE from"chalk";import UE from"inquirer";import{z as xi}from"zod";var Tf={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"}]},Mf=xi.object({profileName:xi.string().min(1).optional(),interactive:xi.boolean().default(!1)});function OE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function NE(e,t){try{return e.interactive?await jE(t):e.profileName?FE(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(OE(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=Dt();if(o.length>0){c.info("Available profiles:");for(let a of o)console.log(LE.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 jE(e){let t=Dt(),n=Me();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=Te(),o=t.map(i=>{let m=r?.profiles[i]?.workspace?.name||"unknown",d=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${m})${d}`,value:i}}),{selectedProfile:a}=await UE.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);pr(a);let s=Me();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 FE(e,t){let n=Me();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);pr(e);let r=Me();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 Di=C({path:["profiles","use"],meta:Tf,schema:Mf,handler:NE});import{z as Ti}from"zod";var Lf={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"]},Uf=Ti.object({oldName:Ti.string().min(1),newName:Ti.string().min(1)});async function VE(e,t){try{let n=Me()?.name===e.oldName;return Am(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 Mi=C({path:["profiles","rename"],meta:Lf,schema:Uf,handler:VE});import{z as Of}from"zod";var Nf={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"]},jf=Of.object({profileName:Of.string().min(1)});async function HE(e,t){try{let n=Me()?.name===e.profileName;if(!Dt().includes(e.profileName))return t.globalOptions?.json?(t.fail(`Profile "${e.profileName}" not found`),1):(c.error(`Profile "${e.profileName}" not found`),1);mr(e.profileName);let o=Me();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 Li=C({path:["profiles","delete"],meta:Nf,schema:jf,handler:HE});async function zE(e,t){let n=Dt(),r=Me();if(n.length===0)return t.globalOptions?.json?(t.success({profiles:[]}),0):(c.warn("No profiles found. Please login first."),0);let o=Te(),a=["PROFILE","SLUG","WORKSPACE","USER","API ENDPOINT",""],s=n.map(i=>{let l=r?.name===i,m=o?.profiles[i];return{PROFILE:i,SLUG:m?.workspace?.slug||"",WORKSPACE:m?.workspace?.name||"",USER:m?.user?.username||"","API ENDPOINT":m?.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):(le(a,s),0)}var Ff=C({path:["profiles"],meta:xf,schema:Df,handler:zE});import KE from"chalk";import GE from"inquirer";import{z as Ui}from"zod";var Vf={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"}]},Hf=Ui.object({profileName:Ui.string().min(1).optional(),interactive:Ui.boolean().default(!1)});function qE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function BE(e,t){try{return e.interactive?await WE(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(qE(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=Dt();if(o.length>0){c.info("Available profiles:");for(let a of o)console.log(KE.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 WE(e){let t=Dt(),n=Me();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=Te(),o=t.map(i=>{let m=r?.profiles[i]?.workspace?.name||"unknown",d=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${m})${d}`,value:i}}),{selectedProfile:a}=await GE.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);pr(a);let s=Me();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=Me();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);pr(e);let r=Me();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 zf=C({path:["switch"],meta:Vf,schema:Hf,handler:BE});import{z as wr}from"zod";import{readFileSync as QE}from"fs";import{dirname as eI,join as tI}from"path";import{fileURLToPath as nI}from"url";function Kf(e,t,n){switch(t){case"bash":return YE(e,n);case"zsh":return ZE(e,n);case"fish":return XE(e,n)}}function YE(e,t){let n=t?`
326
+ `),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 M0=v({path:["simulator"],meta:$0,schema:T0,handler:D0}),si={group:Dd,commands:[M0,Ld,jd]};import{z as U0}from"zod";var Fd={name:"profiles",category:"profile",description:"List auth profiles",stability:"stable",arguments:[],options:[],aliases:["list"]},Vd=U0.object({});import L0 from"chalk";import N0 from"inquirer";import{z as ii}from"zod";var Hd={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"}]},zd=ii.object({profileName:ii.string().min(1).optional(),interactive:ii.boolean().default(!1)});function O0(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function j0(e,t){try{return e.interactive?await F0(t):e.profileName?V0(e.profileName,t):t.globalOptions?.json?(t.fail("Missing required argument: profile-name"),1):(m.error("Missing required argument: profile-name"),m.info("Usage: phala profiles use <profile-name>"),m.info(" phala profiles use -i"),1)}catch(n){if(O0(n))return console.log(),t.globalOptions?.json?(t.success({cancelled:!0}),0):(m.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")){m.error(r);let o=Pt();if(o.length>0){m.info("Available profiles:");for(let a of o)console.log(L0.gray(` - ${a}`))}else m.info("No profiles found. Please login first.")}else m.error("Failed to switch profile"),m.logDetailedError(n);return 1}}async function F0(e){let t=Pt(),n=Ne();if(t.length===0)return e.globalOptions?.json?(e.fail("No profiles found. Please login first."),1):(m.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):(m.info(`Only one profile available: ${t[0]}`),0);let r=Le(),o=t.map(i=>{let l=r?.profiles[i]?.workspace?.name||"unknown",u=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${l})${u}`,value:i}}),{selectedProfile:a}=await N0.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):(m.info(`Already using profile "${a}"`),0);Xn(a);let s=Ne();return e.globalOptions?.json?(e.success({profile:a,workspace:s?.info.workspace?.name||null,changed:!0}),0):(m.success(`Switched to profile "${a}"`),s?.info.workspace?.name&&m.info(`Workspace: ${s.info.workspace.name}`),0)}function V0(e,t){let n=Ne();if(n?.name===e)return t.globalOptions?.json?(t.success({profile:e,workspace:n.info.workspace?.name||null,changed:!1}),0):(m.info(`Already using profile "${e}"`),0);Xn(e);let r=Ne();return t.globalOptions?.json?(t.success({profile:e,workspace:r?.info.workspace?.name||null,changed:!0}),0):(m.success(`Switched to profile "${e}"`),r?.info.workspace?.name&&m.info(`Workspace: ${r.info.workspace.name}`),0)}var ci=v({path:["profiles","use"],meta:Hd,schema:zd,handler:j0});import{z as li}from"zod";var Kd={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"]},qd=li.object({oldName:li.string().min(1),newName:li.string().min(1)});async function H0(e,t){try{let n=Ne()?.name===e.oldName;return pm(e.oldName,e.newName),t.globalOptions?.json?(t.success({oldName:e.oldName,newName:e.newName,wasActive:n}),0):(m.success(`Renamed profile "${e.oldName}" to "${e.newName}"`),n&&m.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):(m.error(r),1)}}var mi=v({path:["profiles","rename"],meta:Kd,schema:qd,handler:H0});import{z as Gd}from"zod";var Bd={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"]},Wd=Gd.object({profileName:Gd.string().min(1)});async function z0(e,t){try{let n=Ne()?.name===e.profileName;if(!Pt().includes(e.profileName))return t.globalOptions?.json?(t.fail(`Profile "${e.profileName}" not found`),1):(m.error(`Profile "${e.profileName}" not found`),1);Yn(e.profileName);let o=Ne();return t.globalOptions?.json?(t.success({deleted:e.profileName,wasActive:n,currentProfile:o?.name||null}),0):(m.success(`Deleted profile "${e.profileName}"`),n&&(o?m.info(`Switched to profile "${o.name}"`):m.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):(m.error(r),1)}}var pi=v({path:["profiles","delete"],meta:Bd,schema:Wd,handler:z0});async function K0(e,t){let n=Pt(),r=Ne();if(n.length===0)return t.globalOptions?.json?(t.success({profiles:[]}),0):(m.warn("No profiles found. Please login first."),0);let o=Le(),a=["PROFILE","SLUG","WORKSPACE","USER","API ENDPOINT",""],s=n.map(i=>{let c=r?.name===i,l=o?.profiles[i];return{PROFILE:i,SLUG:l?.workspace?.slug||"",WORKSPACE:l?.workspace?.name||"",USER:l?.user?.username||"","API ENDPOINT":l?.api_prefix||"","":c?"*":""}});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):(ie(a,s),0)}var Jd=v({path:["profiles"],meta:Fd,schema:Vd,handler:K0});import q0 from"chalk";import G0 from"inquirer";import{z as ui}from"zod";var Yd={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"}]},Xd=ui.object({profileName:ui.string().min(1).optional(),interactive:ui.boolean().default(!1)});function B0(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function W0(e,t){try{return e.interactive?await J0(t):e.profileName?Y0(e.profileName,t):t.globalOptions?.json?(t.fail("Missing required argument: profile-name"),1):(m.error("Missing required argument: profile-name"),m.info("Usage: phala switch <profile-name>"),m.info(" phala switch -i"),1)}catch(n){if(B0(n))return console.log(),t.globalOptions?.json?(t.success({cancelled:!0}),0):(m.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")){m.error(r);let o=Pt();if(o.length>0){m.info("Available profiles:");for(let a of o)console.log(q0.gray(` - ${a}`))}else m.info("No profiles found. Please login first.")}else m.error("Failed to switch profile"),m.logDetailedError(n);return 1}}async function J0(e){let t=Pt(),n=Ne();if(t.length===0)return e.globalOptions?.json?(e.fail("No profiles found. Please login first."),1):(m.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):(m.info(`Only one profile available: ${t[0]}`),0);let r=Le(),o=t.map(i=>{let l=r?.profiles[i]?.workspace?.name||"unknown",u=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${l})${u}`,value:i}}),{selectedProfile:a}=await G0.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):(m.info(`Already using profile "${a}"`),0);Xn(a);let s=Ne();return e.globalOptions?.json?(e.success({profile:a,workspace:s?.info.workspace?.name||null,changed:!0}),0):(m.success(`Switched to profile "${a}"`),s?.info.workspace?.name&&m.info(`Workspace: ${s.info.workspace.name}`),0)}function Y0(e,t){let n=Ne();if(n?.name===e)return t.globalOptions?.json?(t.success({profile:e,workspace:n.info.workspace?.name||null,changed:!1}),0):(m.info(`Already using profile "${e}"`),0);Xn(e);let r=Ne();return t.globalOptions?.json?(t.success({profile:e,workspace:r?.info.workspace?.name||null,changed:!0}),0):(m.success(`Switched to profile "${e}"`),r?.info.workspace?.name&&m.info(`Workspace: ${r.info.workspace.name}`),0)}var Zd=v({path:["switch"],meta:Yd,schema:Xd,handler:W0});import{z as ar}from"zod";import{readFileSync as eI}from"fs";import{dirname as tI,join as nI}from"path";import{fileURLToPath as rI}from"url";function Qd(e,t,n){switch(t){case"bash":return X0(e,n);case"zsh":return Z0(e,n);case"fish":return Q0(e,n)}}function X0(e,t){let n=t?`
373
327
  # Version check (once per day)
374
328
  local completion_version="${t}"
375
329
  local check_file=~/."${e}"/completion-check
@@ -406,7 +360,7 @@ ${n}
406
360
  }
407
361
 
408
362
  complete -F _${e}_completions ${e}
409
- `.trim()}function ZE(e,t){let n=t?`
363
+ `.trim()}function Z0(e,t){let n=t?`
410
364
  # Version check (once per day)
411
365
  local completion_version="${t}"
412
366
  local check_file=~/."${e}"/completion-check
@@ -451,7 +405,7 @@ ${n}
451
405
  }
452
406
 
453
407
  _${e}
454
- `.trim()}function XE(e,t){let n=t?`
408
+ `.trim()}function Q0(e,t){let n=t?`
455
409
  # Version check (once per day)
456
410
  set -l completion_version "${t}"
457
411
  set -l check_file ~/."${e}"/completion-check
@@ -484,10 +438,10 @@ ${n}
484
438
  end
485
439
 
486
440
  complete -c ${e} -f -a "(__${e}_complete)"
487
- `.trim()}function rI(){try{let e=nI(import.meta.url),t=eI(e),n=tI(t,"../package.json");return JSON.parse(QE(n,"utf-8")).version}catch{return"unknown"}}var oI={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}]},aI=wr.object({line:wr.string(),fragment:wr.string()});async function sI(e,t){return t.stdout.write(`
488
- `),0}var tH=C({path:["__complete"],meta:oI,schema:aI,handler:sI}),iI={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"}]},cI=wr.object({shell:wr.enum(["bash","zsh","fish"]).optional(),fig:wr.boolean().optional()});async function lI(e,t){if(e.fig)return t.stdout.write(`Fig spec generation requires registry access. See fig-spec.ts for implementation.
489
- `),0;let n=e.shell||mI();if(!n)return t.stderr.write(`Could not detect shell. Please specify with --shell (bash, zsh, or fish)
490
- `),1;let r=rI(),o=Kf("phala",n,r);switch(t.stdout.write(`# Add this to your shell configuration file:
441
+ `.trim()}function oI(){try{let e=rI(import.meta.url),t=tI(e),n=nI(t,"../package.json");return JSON.parse(eI(n,"utf-8")).version}catch{return"unknown"}}var aI={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}]},sI=ar.object({line:ar.string(),fragment:ar.string()});async function iI(e,t){return t.stdout.write(`
442
+ `),0}var aF=v({path:["__complete"],meta:aI,schema:sI,handler:iI}),cI={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"}]},lI=ar.object({shell:ar.enum(["bash","zsh","fish"]).optional(),fig:ar.boolean().optional()});async function mI(e,t){if(e.fig)return t.stdout.write(`Fig spec generation requires registry access. See fig-spec.ts for implementation.
443
+ `),0;let n=e.shell||pI();if(!n)return t.stderr.write(`Could not detect shell. Please specify with --shell (bash, zsh, or fish)
444
+ `),1;let r=oI(),o=Qd("phala",n,r);switch(t.stdout.write(`# Add this to your shell configuration file:
491
445
 
492
446
  `),t.stdout.write(`${o}
493
447
 
@@ -500,34 +454,47 @@ complete -c ${e} -f -a "(__${e}_complete)"
500
454
  `),t.stdout.write(`# source ~/.zshrc
501
455
  `);break;case"fish":t.stdout.write(`# For fish, run:
502
456
  `),t.stdout.write(`# phala completion --shell fish > ~/.config/fish/completions/phala.fish
503
- `);break}return 0}function mI(){let e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":null}var Gf=C({path:["completion"],meta:iI,schema:cI,handler:lI});import{spawn as bI}from"child_process";import wI from"chalk";import{execSync as pI}from"child_process";import{existsSync as qf,readFileSync as dI}from"fs";import{homedir as mo,platform as uI}from"os";import{basename as fI,join as po}from"path";import Bf from"chalk";var Dn=class extends Error{constructor(n,r){super(`CVM is not running (current status: ${Bf.yellow(n)})`);this.status=n;this.cvmId=r;this.name="CvmNotRunningError"}},Tn=class extends Error{constructor(n){super("CVM is not registered on any gateway.");this.cvmId=n;this.name="NoGatewayError"}};function xa(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 Oi(){let e=[po(mo(),".ssh","id_rsa"),po(mo(),".ssh","id_ed25519"),po(mo(),".ssh","id_ecdsa"),po(mo(),".ssh","id_dsa")];for(let t of e)if(qf(t))return t}function Wf(e){if(e){let t=e.startsWith("~")?po(mo(),e.slice(1)):e;if(!qf(t))throw new Error(`SSH key file not found: ${t}`);return t}return Oi()}function uo(e){return e?e.toLowerCase().includes("dev"):!1}function gI(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 hI(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"?uo(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 yI(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 Da(e,t){let n=await e.getCvmInfo({id:t}),r=gI(n);if(!r)throw new Tn(t);if(n.status!=="running")throw new Dn(n.status,t);let{baseImage:o,isDev:a}=hI(n),s=yI(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 Ta(e,t){return`${e}-22.${t}`}function Ma(e,t){return e!=="443"?e:t||"443"}function La(e){return/^[a-zA-Z0-9_./:@=-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function vI(){try{return pI("openssl version",{encoding:"utf-8"}).toLowerCase().includes("libressl")}catch{return!1}}function CI(e){if(fI(e).toLowerCase().includes("ed25519"))return!0;try{let n=dI(e,"utf-8");return n.includes("ssh-ed25519")||n.includes("ED25519")}catch{return!1}}function Ua(e){uI()==="darwin"&&vI()&&CI(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${Bf.cyan("brew\xB7install\xB7openssl")}`),c.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 qt}from"zod";var Jf={name:"ssh",category:"cvm-ops",description:"Connect to a CVM via SSH",stability:"unstable",arguments:[X],options:[j,{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"}]},Yf=qt.object({cvmId:qt.string().optional(),port:qt.string().default("443"),gatewayDomain:qt.string().optional(),timeout:qt.string().default("30"),verbose:qt.boolean().default(!1),dryRun:qt.boolean().default(!1),"--":qt.array(qt.string()).optional()});function _I(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 kI(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}=z.parse(t.cvmId),r=e["--"]??[],o=_I(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 Da(w,n);i=S.appId,l=S.gatewayDomain,(S.isDevImage??uo(S.baseImage))===!1&&c.warn("This CVM is not using a dev image. SSH access may not be available.")}catch(w){return w instanceof Tn?c.error(w.message):w instanceof Dn?(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 m=xa(l),p=Ma(s,m.port),d=Ta(i,m.host),f=Oi();f&&Ua(f),e.verbose&&c.info(`Connecting to ${wI.cyan(d)}:${p}...`);let u=Oa(e.verbose,e.timeout),{options:h,command:g}=SI(r),y=[];if(e.verbose&&y.push("-v"),y.push(...u,"-p",p,...h,`root@${d}`,...g),e.dryRun){let w=y.map(S=>La(S));return t.stdout.write(`ssh ${w.join(" ")}
504
- `),0}let b=bI("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 SI(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 Zf=C({path:["ssh"],meta:Jf,schema:Yf,handler:kI});import{spawn as EI}from"child_process";import Ni from"chalk";import{z as Bt}from"zod";var Xf={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"}]},Qf=Bt.object({source:Bt.string(),destination:Bt.string(),identity:Bt.string().optional(),port:Bt.string().default("443"),gatewayDomain:Bt.string().optional(),recursive:Bt.boolean().default(!1),verbose:Bt.boolean().default(!1),dryRun:Bt.boolean().default(!1)});function eg(e){let t=e.match(/^([^:]+):(.+)$/);return t?{isRemote:!0,cvmId:t[1],path:t[2]}:{isRemote:!1,path:e}}async function II(e,t){try{let n=eg(e.source),r=eg(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=km(o.cvmId):t.cvmId&&(a=z.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,m;if(s)m=s,l=a.startsWith("app_")?a.substring(4):a;else try{let I=await E(t),$=await Da(I,a);l=$.appId,m=$.gatewayDomain,($.isDevImage??uo($.baseImage))===!1&&c.warn("This CVM is not using a dev image. SCP access may not be available.")}catch(I){return I instanceof Tn?c.error(I.message):I instanceof Dn?(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 p=xa(m),d=Ma(i,p.port),f=Ta(l,p.host),u=Wf(e.identity);u?Ua(u):c.warn("No default SSH key found. SCP will use ssh-agent or prompt for password."),e.verbose&&c.info(`Connecting to ${Ni.cyan(f)}:${d}...`);let g=[...Oa(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($=>La($));return t.stdout.write(`scp ${I.join(" ")}
505
- `),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"} ${Ni.cyan(S)} ${w==="upload"?"to":"from"} ${Ni.cyan(k)}...`);let _=EI("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 tg=C({path:["cp"],meta:Xf,schema:Qf,handler:II});import{z as Na}from"zod";var ng={name:"ps",category:"cvm-ops",description:"List containers of a CVM",stability:"stable",arguments:[X],options:[_n,Se,j],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"}]},rg=Na.object({cvmId:Na.string().optional(),json:Na.boolean().default(!1),interactive:Na.boolean().default(!1)});function AI(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 PI(e){let t=e[0]??"";return t.startsWith("/")?t.slice(1):t}async function $I(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 Ps(n,t.cvmId);if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(!o.is_online){let p=o.error??"CVM is offline";return e.json?(t.success({containers:[],error:p}),0):(c.warn(p),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(p=>({NAME:PI(p.names),IMAGE:p.image,CREATED:AI(p.created),STATUS:p.status,STATE:p.state})),l={};for(let p of s){l[p]=p.length;for(let d of i)l[p]=Math.max(l[p],d[p].length)}let m=p=>s.map(d=>p[d].padEnd(l[d])).join(" ");console.log(m(Object.fromEntries(s.map(p=>[p,p]))));for(let p of i)console.log(m(p));return 0}catch(n){return c.logDetailedError(n),t.fail(`Failed to list containers: ${n instanceof Error?n.message:String(n)}`),1}}var og=C({path:["ps"],meta:ng,schema:rg,handler:$I});import{z as tt}from"zod";var ag={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"},_n,de,j],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"}]},sg=tt.object({containerName:tt.string().optional(),cvmId:tt.string().optional(),serial:tt.boolean().default(!1),cvmStdout:tt.boolean().default(!1),cvmStderr:tt.boolean().default(!1),stderr:tt.boolean().default(!1),since:tt.string().optional(),until:tt.string().optional(),tail:tt.number().optional(),follow:tt.boolean().default(!1),timestamps:tt.boolean().default(!1),json:tt.boolean().default(!1),interactive:tt.boolean().default(!1)});function ig(e,t,n){if(e.channel==="stdout"){t.includeStdout&&n.stdout.write(e.message);return}t.includeStderr&&n.stderr.write(e.message)}function RI(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 xI(e,t){if(zr(e.json),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:n}=z.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=RI(e);if(!a)try{let s=await Bm(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"?DI(n,a.channel,e,t):TI(n,a.containerName,e,t)}async function DI(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 qm(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 Gm(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 TI(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 p=new AbortController,d=()=>p.abort();process.on("SIGINT",d),process.on("SIGTERM",d);try{await Hm(e,f=>ig(f,o,r),a,p.signal)}catch(f){if(f.name!=="AbortError")throw f}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d)}return 0}let i=(await Vm(e,a)).filter(p=>p.channel==="stderr"?o.includeStderr:o.includeStdout),l=i.map(p=>p.message).join("");if(n.json)return r.success({logs:l,cvm_id:e}),0;if(l.trim()){for(let p of i)ig(p,o,r);return 0}return await oo(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 oo(e),1}}var cg=C({path:["logs"],meta:ag,schema:sg,handler:xI});var lg={path:["self"],meta:{name:"self",category:"advanced",description:"CLI self-management",stability:"unstable"}};import jI from"prompts";import{execa as FI}from"execa";import ja from"semver";import Wt from"chalk";import{z as _r}from"zod";var MI={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},LI={name:"yes",shorthand:"y",description:"Skip confirmation prompt",type:"boolean",target:"yes"},UI={name:"dry-run",description:"Print update command without executing",type:"boolean",target:"dryRun"},OI={name:"package-manager",description:"Override package manager (npm|pnpm|yarn|bun)",type:"string",target:"packageManager",aliases:["pm"],argumentName:"name"},NI={name:"channel",description:"Release channel/dist-tag (e.g. latest, beta, next)",type:"string",target:"channel",argumentName:"tag"},mg={name:"update",description:"Update the Phala CLI",stability:"unstable",options:[MI,LI,UI,OI,NI],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"}]},pg=_r.object({json:_r.boolean().default(!1),yes:_r.boolean().default(!1),dryRun:_r.boolean().default(!1),packageManager:_r.enum(["npm","pnpm","yarn","bun"]).optional(),channel:_r.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/).optional()});var dg="Phala-Network/phala-cloud",ji="cli-v";function VI(e,t){return`https://github.com/${dg}/compare/${ji}${e}...${ji}${t}`}function HI(e){return`https://github.com/${dg}/releases/tag/${ji}${e}`}function fo(e){return typeof e=="string"&&e.trim().length>0}function zI(e){return e.startsWith("@")?e.replace("/","%2F"):e}async function KI(e,t){let r=`https://registry.npmjs.org/${zI(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 m=l[t]??l.latest;return typeof m!="string"?{latestVersion:null,error:`Channel "${t}" not found`}:{latestVersion:ja.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 GI(e){if(typeof e!="object"||e===null||!("code"in e))return;let t=e.code;return typeof t=="string"?t:void 0}function qI(e){let n=ja.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function BI(e,t,n,r){let o=[],a=r instanceof Error&&typeof r.message=="string"?r.message:String(r),s=GI(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"&&fo(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"&&fo(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 WI(e,t,n){if(fo(e))return e.trim();if(fo(n.PHALA_UPDATE_CHANNEL))return n.PHALA_UPDATE_CHANNEL;let r=dr("updateCheckChannel");return fo(r)?r:qI(t)??"latest"}async function JI(e,t){let n=t.cli?.packageName??"phala",r=t.cli?.runtime??Zo(),o=e.packageManager??Jr(t.env,r),a=t.cli?.packageVersion??"0.0.0",s=WI(e.channel,a,t.env);e.json||t.stderr.write(Wt.gray(`Checking for updates...
506
- `));let{latestVersion:i,error:l}=await KI(n,s);if(i){let k=Date.now(),_=s.replace(/[^a-zA-Z0-9_-]/g,"_");Sn({[`updateCheckLastAt_${_}`]:k,[`updateCheckLatest_${_}`]:i,...s==="latest"?{updateCheckLastAt:k,updateCheckLatest:i}:{}})}let m=ja.valid(a),p=i&&m&&!ja.gt(i,m),d=!p&&i&&m?VI(m,i):void 0,f=i?HI(i):void 0;e.json||(l?(t.stderr.write(Wt.yellow(`Warning: Could not fetch latest version: ${l}
507
- `)),t.stderr.write(Wt.gray(`Current version: v${a}
508
- `))):i&&(t.stderr.write(Wt.gray(`Current version: v${a}
509
- `)),t.stderr.write(Wt.gray(`Latest version: v${i}${s!=="latest"?` (${s})`:""}
510
- `)),p?t.stderr.write(Wt.green(`You are already on the latest version.
511
- `)):(t.stderr.write(Wt.yellow(`Update available: v${a} \u2192 v${i}
512
- `)),d&&t.stderr.write(Wt.gray(`${d}
513
- `)))));let u=o==="bun"&&i?`${n}@${i}`:s==="latest"?`${n}@latest`:`${n}@${s}`,h=Yr(o,u),{command:g,args:y}=Xm(o,u);if(e.json&&e.dryRun)return t.success({command:h,dryRun:!0,currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:d}),0;if(e.dryRun)return t.stderr.write(Wt.gray(`Command: ${h}
514
- `)),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.
515
- `;return e.json?(t.success({command:h,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:d}),0):(t.stderr.write(k),1)}let w=p?`Already up to date. Reinstall anyway with "${h}"?`:`Run "${h}"?`;if(!(e.yes||await jI({type:"confirm",name:"ok",message:w,initial:!p}).then(k=>k.ok===!0)))return e.json&&t.success({command:h,ran:!1,currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:d}),0;try{return await FI(g,y,{stdio:"inherit"}),e.json?(t.success({command:h,ran:!0,currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:d}),0):(c.success("Update completed"),0)}catch(k){let _=BI(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 ug=C({path:["self","update"],meta:mg,schema:pg,handler:JI});var Fi={group:lg,commands:[ug]};import Fa from"chalk";import{z as it}from"zod";var fg={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"},Se],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"}]},gg=it.object({page:it.coerce.number().int().min(1).default(1),pageSize:it.coerce.number().int().min(1).max(100).default(50),search:it.string().optional(),status:it.array(it.string()).optional(),listed:it.boolean().optional(),baseImage:it.string().optional(),instanceType:it.string().optional(),kmsType:it.string().optional(),node:it.string().optional(),region:it.string().optional(),json:it.boolean().default(!1)});function YI(e){return e.toLowerCase().endsWith("ing")?Fa.yellow(e):e==="running"?Fa.green(e):e==="stopped"?Fa.red(e):Fa.yellow(e)}async function ZI(e,t){try{let n=await E(t),r=await da(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:YI(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(c.info("No CVMs found"),0):(le(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 hg=C({path:["apps"],meta:fg,schema:gg,handler:ZI});var yg={path:["instances"],meta:{name:"instances",description:"Manage app instances",stability:"unstable",category:"manage"}};import Va from"chalk";import{z as Vi}from"zod";var vg={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"},Se],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"}]},Cg=Vi.object({appId:Vi.string().optional(),json:Vi.boolean().default(!1)});function XI(e){return e.toLowerCase().endsWith("ing")?Va.yellow(e):e==="running"?Va.green(e):e==="stopped"?Va.red(e):Va.yellow(e)}function QI(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 eA(e,t){try{let n=QI(e,t),r=await E(t),o=await or(r,{appId:n});if(!o.success){let p="error"in o?o.error:void 0;return t.fail(p?.message||"Failed to list instances"),1}let a=o.data,s=a.map(p=>p.vm_uuid).filter(p=>typeof p=="string"&&p.length>0),i={};if(s.length>0){let p=await Lo(r,{vmUuids:s});if(p.success)for(let[d,f]of Object.entries(p.data))i[d]={status:f.status,uptime:f.uptime}}if(e.json){let p=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(p),0}if(a.length===0)return c.info("No instances found"),0;let l=["UUID","NODE","REGION","STATUS","NAME","UPTIME"],m=a.map(p=>{let d=p.node_info&&typeof p.node_info=="object"?p.node_info.name??"-":"-",f=p.node_info&&typeof p.node_info=="object"?p.node_info.region??"-":"-",u=p.vm_uuid?i[p.vm_uuid]:void 0;return{UUID:p.vm_uuid??"-",NODE:d,REGION:f,STATUS:XI(u?.status??p.status),NAME:p.name,UPTIME:u?.uptime??"-"}});return le(l,m),0}catch(n){return c.logDetailedError(n),t.fail(`Failed to list instances: ${n instanceof Error?n.message:String(n)}`),1}}var bg=C({path:["instances","ls"],meta:vg,schema:Cg,handler:eA});import kr from"fs";import zi from"path";import{z as We}from"zod";var wg={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:"name",description:"Custom CVM name for the new instance.",type:"string",target:"name"},{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"},Qe,qe,{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"},sr,j],examples:[{name:"Add instance with existing compose",value:"phala instances add --app-id <app-id> --node-id 5"},{name:"Add instance with custom name",value:"phala instances add --app-id <app-id> --name redis-0 --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>"}]},_g=We.object({appId:We.string().optional(),name:We.string().optional(),nodeId:We.string().optional(),composeFile:We.string().optional(),preLaunchScript:We.string().optional(),envFile:We.string().optional(),privateKey:We.string().optional(),rpcUrl:We.string().optional(),prepareOnly:We.boolean().default(!1),commit:We.boolean().default(!1),token:We.string().optional(),composeHash:We.string().optional(),transactionHash:We.string().optional(),interactive:We.boolean().default(!1)});function tA(e){return kr.readFileSync(e,"utf-8").split(`
516
- `).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function nA(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function rA(e){if(e.status!==465)return null;let n=nA(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 oA(e,t,n){if(!n)return;let r=zi.resolve(process.cwd(),n);if(!kr.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=tA(r),a=await pn(e,t);return(0,Ae.encryptEnvVars)(o,a)}async function aA(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Ot(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 Hi(e,t){if(te()){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"?`${ie}/${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(`
457
+ `);break}return 0}function pI(){let e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":null}var ef=v({path:["completion"],meta:cI,schema:lI,handler:mI});import{spawn as wI}from"child_process";import _I from"chalk";import{execSync as uI}from"child_process";import{existsSync as tf,readFileSync as dI}from"fs";import{homedir as Vr,platform as fI}from"os";import{basename as gI,join as Hr}from"path";import nf from"chalk";var Cn=class extends Error{constructor(n,r){super(`CVM is not running (current status: ${nf.yellow(n)})`);this.status=n;this.cvmId=r;this.name="CvmNotRunningError"}},wn=class extends Error{constructor(n){super("CVM is not registered on any gateway.");this.cvmId=n;this.name="NoGatewayError"}};function aa(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 di(){let e=[Hr(Vr(),".ssh","id_rsa"),Hr(Vr(),".ssh","id_ed25519"),Hr(Vr(),".ssh","id_ecdsa"),Hr(Vr(),".ssh","id_dsa")];for(let t of e)if(tf(t))return t}function rf(e){if(e){let t=e.startsWith("~")?Hr(Vr(),e.slice(1)):e;if(!tf(t))throw new Error(`SSH key file not found: ${t}`);return t}return di()}function zr(e){return e?e.toLowerCase().includes("dev"):!1}function hI(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 yI(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"?zr(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 vI(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 sa(e,t){let n=await e.getCvmInfo({id:t}),r=hI(n);if(!r)throw new wn(t);if(n.status!=="running")throw new Cn(n.status,t);let{baseImage:o,isDev:a}=yI(n),s=vI(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 ia(e,t){return`${e}-22.${t}`}function ca(e,t){return e!=="443"?e:t||"443"}function la(e){return/^[a-zA-Z0-9_./:@=-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function bI(){try{return uI("openssl version",{encoding:"utf-8"}).toLowerCase().includes("libressl")}catch{return!1}}function CI(e){if(gI(e).toLowerCase().includes("ed25519"))return!0;try{let n=dI(e,"utf-8");return n.includes("ssh-ed25519")||n.includes("ED25519")}catch{return!1}}function ma(e){fI()==="darwin"&&bI()&&CI(e)&&(m.warn("Detected LibreSSL with ed25519 key on macOS. This combination may cause SSH connection issues."),m.info(`If\xB7you\xB7experience\xB7problems,\xB7install\xB7OpenSSL\xB7via\xB7Homebrew:\xB7${nf.cyan("brew\xB7install\xB7openssl")}`),m.info("Then ensure Homebrew's OpenSSL is in your PATH before /usr/bin"))}function pa(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 Vt}from"zod";var of={name:"ssh",category:"cvm-ops",description:"Connect to a CVM via SSH",stability:"unstable",arguments:[X],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"}]},af=Vt.object({cvmId:Vt.string().optional(),port:Vt.string().default("443"),gatewayDomain:Vt.string().optional(),timeout:Vt.string().default("30"),verbose:Vt.boolean().default(!1),dryRun:Vt.boolean().default(!1),"--":Vt.array(Vt.string()).optional()});function SI(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 kI(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}=z.parse(t.cvmId),r=e["--"]??[],o=SI(r);if(o)return m.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,c;if(a)c=a,i=n.startsWith("app_")?n.substring(4):n;else try{let _=await A(t),E=await sa(_,n);i=E.appId,c=E.gatewayDomain,(E.isDevImage??zr(E.baseImage))===!1&&m.warn("This CVM is not using a dev image. SSH access may not be available.")}catch(_){return _ instanceof wn?m.error(_.message):_ instanceof Cn?(m.error(_.message),m.info("Please start the CVM first using: phala cvms start")):m.error(_ instanceof Error?_.message:"Failed to fetch CVM info"),1}let l=aa(c),p=ca(s,l.port),u=ia(i,l.host),f=di();f&&ma(f),e.verbose&&m.info(`Connecting to ${_I.cyan(u)}:${p}...`);let d=pa(e.verbose,e.timeout),{options:h,command:g}=II(r),y=[];if(e.verbose&&y.push("-v"),y.push(...d,"-p",p,...h,`root@${u}`,...g),e.dryRun){let _=y.map(E=>la(E));return t.stdout.write(`ssh ${_.join(" ")}
458
+ `),0}let k=wI("ssh",y,{stdio:"inherit"});return k.on("error",_=>{m.break(),m.error(`SSH connection failed: ${_.message}`)}),new Promise(_=>{k.on("close",E=>{m.break(),E===0?(m.success("Connection closed"),_(0)):(m.error(`Connection failed with code ${E}`),_(E??1))})})}catch(n){return m.error("Failed to connect via SSH"),n instanceof Error?m.error(n.message):m.error(String(n)),1}}function II(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 sf=v({path:["ssh"],meta:of,schema:af,handler:kI});import{spawn as EI}from"child_process";import fi from"chalk";import{z as Ht}from"zod";var cf={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"}]},lf=Ht.object({source:Ht.string(),destination:Ht.string(),identity:Ht.string().optional(),port:Ht.string().default("443"),gatewayDomain:Ht.string().optional(),recursive:Ht.boolean().default(!1),verbose:Ht.boolean().default(!1),dryRun:Ht.boolean().default(!1)});function mf(e){let t=e.match(/^([^:]+):(.+)$/);return t?{isRemote:!0,cvmId:t[1],path:t[2]}:{isRemote:!1,path:e}}async function AI(e,t){try{let n=mf(e.source),r=mf(e.destination);if(n.isRemote===r.isRemote)return m.error("Either source or destination must be a remote path in format: cvm-id:path"),m.info("Examples:"),m.info(" phala cp ./local.txt app_123:/root/remote.txt"),m.info(" phala cp app_123:/root/remote.txt ./local.txt"),1;let o=n.isRemote?n:r,a;if(o.cvmId?a=lm(o.cvmId):t.cvmId&&(a=z.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",c,l;if(s)l=s,c=a.startsWith("app_")?a.substring(4):a;else try{let I=await A(t),x=await sa(I,a);c=x.appId,l=x.gatewayDomain,(x.isDevImage??zr(x.baseImage))===!1&&m.warn("This CVM is not using a dev image. SCP access may not be available.")}catch(I){return I instanceof wn?m.error(I.message):I instanceof Cn?(m.error(I.message),m.info("Please start the CVM first using: phala cvms start")):m.error(I instanceof Error?I.message:"Failed to fetch CVM info"),1}let p=aa(l),u=ca(i,p.port),f=ia(c,p.host),d=rf(e.identity);d?ma(d):m.warn("No default SSH key found. SCP will use ssh-agent or prompt for password."),e.verbose&&m.info(`Connecting to ${fi.cyan(f)}:${u}...`);let g=[...pa(e.verbose,"30"),"-P",u];e.verbose&&g.unshift("-v"),d&&g.push("-i",d),e.recursive&&g.push("-r");let y=n.isRemote?`root@${f}:${n.path}`:n.path,k=r.isRemote?`root@${f}:${r.path}`:r.path;if(g.push(y,k),e.dryRun){let I=g.map(x=>la(x));return t.stdout.write(`scp ${I.join(" ")}
459
+ `),0}let _=n.isRemote?"download":"upload",E=n.isRemote?r.path:n.path,S=n.isRemote?n.path:r.path;m.info(`${_==="upload"?"Uploading":"Downloading"} ${fi.cyan(E)} ${_==="upload"?"to":"from"} ${fi.cyan(S)}...`);let b=EI("scp",g,{stdio:"inherit"});return b.on("error",I=>{m.break(),m.error(`SCP failed: ${I.message}`)}),new Promise(I=>{b.on("close",x=>{m.break(),x===0?(m.success(`${_==="upload"?"Upload":"Download"} completed`),I(0)):(m.error(`Transfer failed with code ${x}`),I(x??1))})})}catch(n){return m.error("Failed to copy file via SCP"),n instanceof Error&&m.error(n.message),1}}var pf=v({path:["cp"],meta:cf,schema:lf,handler:AI});import{z as ua}from"zod";var uf={name:"ps",category:"cvm-ops",description:"List containers of a CVM",stability:"stable",arguments:[X],options:[un,fe,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"}]},df=ua.object({cvmId:ua.string().optional(),json:ua.boolean().default(!1),interactive:ua.boolean().default(!1)});function RI(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 PI(e){let t=e[0]??"";return t.startsWith("/")?t.slice(1):t}async function xI(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await A(t),r=await ns(n,t.cvmId);if(!r.success)return t.fail(r.error.message),1;let o=r.data;if(!o.is_online){let p=o.error??"CVM is offline";return e.json?(t.success({containers:[],error:p}),0):(m.warn(p),0)}let a=o.containers??[];if(e.json)return t.success({containers:a}),0;if(a.length===0)return m.info("No containers running"),0;let s=["NAME","IMAGE","CREATED","STATUS","STATE"],i=a.map(p=>({NAME:PI(p.names),IMAGE:p.image,CREATED:RI(p.created),STATUS:p.status,STATE:p.state})),c={};for(let p of s){c[p]=p.length;for(let u of i)c[p]=Math.max(c[p],u[p].length)}let l=p=>s.map(u=>p[u].padEnd(c[u])).join(" ");console.log(l(Object.fromEntries(s.map(p=>[p,p]))));for(let p of i)console.log(l(p));return 0}catch(n){return m.logDetailedError(n),t.fail(`Failed to list containers: ${n instanceof Error?n.message:String(n)}`),1}}var ff=v({path:["ps"],meta:uf,schema:df,handler:xI});import{z as et}from"zod";var gf={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"},un,ue,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"}]},hf=et.object({containerName:et.string().optional(),cvmId:et.string().optional(),serial:et.boolean().default(!1),cvmStdout:et.boolean().default(!1),cvmStderr:et.boolean().default(!1),stderr:et.boolean().default(!1),since:et.string().optional(),until:et.string().optional(),tail:et.number().optional(),follow:et.boolean().default(!1),timestamps:et.boolean().default(!1),json:et.boolean().default(!1),interactive:et.boolean().default(!1)});function yf(e,t,n){if(e.channel==="stdout"){t.includeStdout&&n.stdout.write(e.message);return}t.includeStderr&&n.stderr.write(e.message)}function $I(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 TI(e,t){if(Rr(e.json),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:n}=z.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=$I(e);if(!a)try{let s=await Am(n);s==="running"?a={type:"container"}:(m.warn(`CVM is ${s}. Falling back to serial console logs.`),m.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"?DI(n,a.channel,e,t):MI(n,a.containerName,e,t)}async function DI(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 Em(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 Im(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):m.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 MI(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 p=new AbortController,u=()=>p.abort();process.on("SIGINT",u),process.on("SIGTERM",u);try{await _m(e,f=>yf(f,o,r),a,p.signal)}catch(f){if(f.name!=="AbortError")throw f}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u)}return 0}let i=(await wm(e,a)).filter(p=>p.channel==="stderr"?o.includeStderr:o.includeStdout),c=i.map(p=>p.message).join("");if(n.json)return r.success({logs:c,cvm_id:e}),0;if(c.trim()){for(let p of i)yf(p,o,r);return 0}return await Or(e)||m.info("No logs available"),0}catch(s){return r.fail(`Failed to fetch container logs: ${s instanceof Error?s.message:String(s)}`),await Or(e),1}}var vf=v({path:["logs"],meta:gf,schema:hf,handler:TI});var bf={path:["self"],meta:{name:"self",category:"advanced",description:"CLI self-management",stability:"unstable"}};import FI from"prompts";import{execa as VI}from"execa";import da from"semver";import zt from"chalk";import{z as sr}from"zod";var UI={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},LI={name:"yes",shorthand:"y",description:"Skip confirmation prompt",type:"boolean",target:"yes"},NI={name:"dry-run",description:"Print update command without executing",type:"boolean",target:"dryRun"},OI={name:"package-manager",description:"Override package manager (npm|pnpm|yarn|bun)",type:"string",target:"packageManager",aliases:["pm"],argumentName:"name"},jI={name:"channel",description:"Release channel/dist-tag (e.g. latest, beta, next)",type:"string",target:"channel",argumentName:"tag"},Cf={name:"update",description:"Update the Phala CLI",stability:"unstable",options:[UI,LI,NI,OI,jI],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"}]},wf=sr.object({json:sr.boolean().default(!1),yes:sr.boolean().default(!1),dryRun:sr.boolean().default(!1),packageManager:sr.enum(["npm","pnpm","yarn","bun"]).optional(),channel:sr.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/).optional()});var _f="Phala-Network/phala-cloud",gi="cli-v";function HI(e,t){return`https://github.com/${_f}/compare/${gi}${e}...${gi}${t}`}function zI(e){return`https://github.com/${_f}/releases/tag/${gi}${e}`}function Kr(e){return typeof e=="string"&&e.trim().length>0}function KI(e){return e.startsWith("@")?e.replace("/","%2F"):e}async function qI(e,t){let r=`https://registry.npmjs.org/${KI(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 c=i["dist-tags"];if(!c||typeof c!="object")return{latestVersion:null,error:"No dist-tags in response"};let l=c[t]??c.latest;return typeof l!="string"?{latestVersion:null,error:`Channel "${t}" not found`}:{latestVersion:da.valid(l)}}catch(s){return s instanceof Error&&s.name==="AbortError"?{latestVersion:null,error:"Request timed out"}:{latestVersion:null,error:String(s)}}finally{clearTimeout(a)}}function GI(e){if(typeof e!="object"||e===null||!("code"in e))return;let t=e.code;return typeof t=="string"?t:void 0}function BI(e){let n=da.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function WI(e,t,n,r){let o=[],a=r instanceof Error&&typeof r.message=="string"?r.message:String(r),s=GI(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"&&Kr(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 c=e.FNM_DIR;return t==="npm"&&Kr(c)&&o.push(`Detected fnm (FNM_DIR=${c}). Ensure your shell has fnm env loaded (e.g. eval "$(fnm env)") so the correct node/npm are on PATH.`),o}function JI(e,t,n){if(Kr(e))return e.trim();if(Kr(n.PHALA_UPDATE_CHANNEL))return n.PHALA_UPDATE_CHANNEL;let r=Zn("updateCheckChannel");return Kr(r)?r:BI(t)??"latest"}async function YI(e,t){let n=t.cli?.packageName??"phala",r=t.cli?.runtime??Eo(),o=e.packageManager??Mr(t.env,r),a=t.cli?.packageVersion??"0.0.0",s=JI(e.channel,a,t.env);e.json||t.stderr.write(zt.gray(`Checking for updates...
460
+ `));let{latestVersion:i,error:c}=await qI(n,s);if(i){let S=Date.now(),b=s.replace(/[^a-zA-Z0-9_-]/g,"_");fn({[`updateCheckLastAt_${b}`]:S,[`updateCheckLatest_${b}`]:i,...s==="latest"?{updateCheckLastAt:S,updateCheckLatest:i}:{}})}let l=da.valid(a),p=i&&l&&!da.gt(i,l),u=!p&&i&&l?HI(l,i):void 0,f=i?zI(i):void 0;e.json||(c?(t.stderr.write(zt.yellow(`Warning: Could not fetch latest version: ${c}
461
+ `)),t.stderr.write(zt.gray(`Current version: v${a}
462
+ `))):i&&(t.stderr.write(zt.gray(`Current version: v${a}
463
+ `)),t.stderr.write(zt.gray(`Latest version: v${i}${s!=="latest"?` (${s})`:""}
464
+ `)),p?t.stderr.write(zt.green(`You are already on the latest version.
465
+ `)):(t.stderr.write(zt.yellow(`Update available: v${a} \u2192 v${i}
466
+ `)),u&&t.stderr.write(zt.gray(`${u}
467
+ `)))));let d=o==="bun"&&i?`${n}@${i}`:s==="latest"?`${n}@latest`:`${n}@${s}`,h=Ur(o,d),{command:g,args:y}=Tm(o,d);if(e.json&&e.dryRun)return t.success({command:h,dryRun:!0,currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:u}),0;if(e.dryRun)return t.stderr.write(zt.gray(`Command: ${h}
468
+ `)),0;let k=t.stderr.isTTY===!0&&e.json!==!0;if(!e.yes&&!k){let S=`Non-interactive session detected. Re-run with --yes to apply the update, or use --dry-run to print the command.
469
+ `;return e.json?(t.success({command:h,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:u}),0):(t.stderr.write(S),1)}let _=p?`Already up to date. Reinstall anyway with "${h}"?`:`Run "${h}"?`;if(!(e.yes||await FI({type:"confirm",name:"ok",message:_,initial:!p}).then(S=>S.ok===!0)))return e.json&&t.success({command:h,ran:!1,currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:u}),0;try{return await VI(g,y,{stdio:"inherit"}),e.json?(t.success({command:h,ran:!0,currentVersion:a,latestVersion:i,isUpToDate:p,releaseUrl:f,changelogUrl:u}),0):(m.success("Update completed"),0)}catch(S){let b=WI(t.env,o,h,S);if(m.logDetailedError(S),t.fail("Self update failed",{command:h,hints:b.length>0?b:void 0}),!e.json&&b.length>0)for(let I of b)m.info(I);return 1}}var Sf=v({path:["self","update"],meta:Cf,schema:wf,handler:YI});var hi={group:bf,commands:[Sf]};import fa from"chalk";import{z as it}from"zod";var kf={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"},fe],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"}]},If=it.object({page:it.coerce.number().int().min(1).default(1),pageSize:it.coerce.number().int().min(1).max(100).default(50),search:it.string().optional(),status:it.array(it.string()).optional(),listed:it.boolean().optional(),baseImage:it.string().optional(),instanceType:it.string().optional(),kmsType:it.string().optional(),node:it.string().optional(),region:it.string().optional(),json:it.boolean().default(!1)});function XI(e){return e.toLowerCase().endsWith("ing")?fa.yellow(e):e==="running"?fa.green(e):e==="stopped"?fa.red(e):fa.yellow(e)}async function ZI(e,t){try{let n=await A(t),r=await Fo(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){let i=r.error.cause;return m.logDetailedError(i??r.error),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:XI(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(m.info("No CVMs found"),0):(ie(a,s),m.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(n){return m.logDetailedError(n),t.fail(`Failed to list apps: ${n instanceof Error?n.message:String(n)}`),1}}var Ef=v({path:["apps"],meta:kf,schema:If,handler:ZI});var Af={path:["instances"],meta:{name:"instances",description:"Manage app instances",stability:"unstable",category:"manage"}};import ga from"chalk";import{z as yi}from"zod";var Rf={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"},fe],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"}]},Pf=yi.object({appId:yi.string().optional(),json:yi.boolean().default(!1)});function QI(e){return e.toLowerCase().endsWith("ing")?ga.yellow(e):e==="running"?ga.green(e):e==="stopped"?ga.red(e):ga.yellow(e)}function eE(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 tE(e,t){try{let n=eE(e,t),r=await A(t),o=await zn(r,{appId:n});if(!o.success){let p="error"in o?o.error:void 0;return t.fail(p?.message||"Failed to list instances"),1}let a=o.data,s=a.map(p=>p.vm_uuid).filter(p=>typeof p=="string"&&p.length>0),i={};if(s.length>0){let p=await po(r,{vmUuids:s});if(p.success)for(let[u,f]of Object.entries(p.data))i[u]={status:f.status,uptime:f.uptime}}if(e.json){let p=a.map(u=>({...u,status:u.vm_uuid?i[u.vm_uuid]?.status??u.status:u.status,uptime:u.vm_uuid?i[u.vm_uuid]?.uptime??null:null}));return t.success(p),0}if(a.length===0)return m.info("No instances found"),0;let c=["UUID","NODE","REGION","STATUS","NAME","UPTIME"],l=a.map(p=>{let u=p.node_info&&typeof p.node_info=="object"?p.node_info.name??"-":"-",f=p.node_info&&typeof p.node_info=="object"?p.node_info.region??"-":"-",d=p.vm_uuid?i[p.vm_uuid]:void 0;return{UUID:p.vm_uuid??"-",NODE:u,REGION:f,STATUS:QI(d?.status??p.status),NAME:p.name,UPTIME:d?.uptime??"-"}});return ie(c,l),0}catch(n){return m.logDetailedError(n),t.fail(`Failed to list instances: ${n instanceof Error?n.message:String(n)}`),1}}var xf=v({path:["instances","ls"],meta:Rf,schema:Pf,handler:tE});import ir from"fs";import bi from"path";import{z as Je}from"zod";var $f={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:"name",description:"Custom CVM name for the new instance.",type:"string",target:"name"},{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"},Qe,Be,{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"},qn,O],examples:[{name:"Add instance with existing compose",value:"phala instances add --app-id <app-id> --node-id 5"},{name:"Add instance with custom name",value:"phala instances add --app-id <app-id> --name redis-0 --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>"}]},Tf=Je.object({appId:Je.string().optional(),name:Je.string().optional(),nodeId:Je.string().optional(),composeFile:Je.string().optional(),preLaunchScript:Je.string().optional(),envFile:Je.string().optional(),privateKey:Je.string().optional(),rpcUrl:Je.string().optional(),prepareOnly:Je.boolean().default(!1),commit:Je.boolean().default(!1),token:Je.string().optional(),composeHash:Je.string().optional(),transactionHash:Je.string().optional(),interactive:Je.boolean().default(!1)});function nE(e){return ir.readFileSync(e,"utf-8").split(`
470
+ `).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function rE(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function oE(e){if(e.status!==465)return null;let n=rE(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 aE(e,t,n){if(!n)return;let r=bi.resolve(process.cwd(),n);if(!ir.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=nE(r),a=await tn(e,t);return je(o,a)}async function sE(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Ut(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 vi(e,t){if(te()){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"?`${le}/${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(`
517
471
  `)}
518
- `)}function kg(e,t){if(te()){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(`
472
+ `)}function Df(e,t){if(te()){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(`
519
473
  `)}
520
- `)}function sA(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 iA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{let r=sA(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 Hi(l,t),0}let a;if(n.envFile){let l=await or(o,{appId:r});if(!l.success||l.data.length===0)throw new Error(`No instances found for app ${r}. Cannot derive encryption key.`);let m=l.data[0];if(!m.vm_uuid)throw new Error("Template CVM has no vm_uuid");let p=await W(o,{id:m.vm_uuid});if(!p.success)throw new Error(`Failed to fetch CVM info: ${p.error?.message||"Unknown error"}`);a=await oA(o,p.data,n.envFile)}let s=await aA(o,n.nodeId),i={};if(n.name&&(i.name=n.name),s!==void 0&&(i.node_id=s),a&&(i.encrypted_env=a),n.composeHash&&(i.compose_hash=n.composeHash),n.composeFile){let l=zi.resolve(process.cwd(),n.composeFile);if(!kr.existsSync(l))throw new Error(`Docker Compose file not found: ${l}`);i.docker_compose_file=kr.readFileSync(l,"utf-8")}if(n.preLaunchScript){let l=zi.resolve(process.cwd(),n.preLaunchScript);if(!kr.existsSync(l))throw new Error(`Pre-launch script not found: ${l}`);i.pre_launch_script=kr.readFileSync(l,"utf-8")}try{let l=await o.post(`/apps/${r}/instances`,i,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return Hi(l,t),0}catch(l){if(!(l instanceof Ct))throw l;let m=rA(l);if(!m)throw l;if(n.prepareOnly)return kg(m,t),0;if(!m.commitToken)throw new Error("Prepare response did not include a commit token");let p=m.kmsInfo?.chain;if(!p)throw new Error("App KMS info is missing chain configuration");let d=await wn({chain:p,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:m.deviceId,composeHash:m.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 kg(m,t),0;let S=w;if(u){let k=await on({chain:p,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,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(h){let k=await rn({chain:p,rpcUrl:n.rpcUrl,appId:`0x${r}`,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")}f=String(k.data.transactionHash||"already-registered")}}let g=10;for(let b=0;b<g;b++){let w=await wn({chain:p,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:m.deviceId,composeHash:m.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:m.commitToken,compose_hash:m.composeHash,transaction_hash:f});return Hi(y,t),0}}catch(r){if(c.error("Failed to create app instance"),r instanceof Ct){process.stderr.write(`${nn(r)}
474
+ `)}function iE(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 cE(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{let r=iE(n,t),o=await A(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 c=await o.post(`/apps/${r}/instances`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash||"already-registered"});return vi(c,t),0}let a;if(n.envFile){let c=await zn(o,{appId:r});if(!c.success||c.data.length===0)throw new Error(`No instances found for app ${r}. Cannot derive encryption key.`);let l=c.data[0];if(!l.vm_uuid)throw new Error("Template CVM has no vm_uuid");let p=await G(o,{id:l.vm_uuid});if(!p.success)throw new Error(`Failed to fetch CVM info: ${p.error?.message||"Unknown error"}`);a=await aE(o,p.data,n.envFile)}let s=await sE(o,n.nodeId),i={};if(n.name&&(i.name=n.name),s!==void 0&&(i.node_id=s),a&&(i.encrypted_env=a),n.composeHash&&(i.compose_hash=n.composeHash),n.composeFile){let c=bi.resolve(process.cwd(),n.composeFile);if(!ir.existsSync(c))throw new Error(`Docker Compose file not found: ${c}`);i.docker_compose_file=ir.readFileSync(c,"utf-8")}if(n.preLaunchScript){let c=bi.resolve(process.cwd(),n.preLaunchScript);if(!ir.existsSync(c))throw new Error(`Pre-launch script not found: ${c}`);i.pre_launch_script=ir.readFileSync(c,"utf-8")}try{let c=await o.post(`/apps/${r}/instances`,i,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return vi(c,t),0}catch(c){if(!(c instanceof yt))throw c;let l=oE(c);if(!l)throw c;if(n.prepareOnly)return Df(l,t),0;if(!l.commitToken)throw new Error("Prepare response did not include a commit token");let p=l.kmsInfo?.chain_id,u=p!=null?At[p]:void 0;if(!u)throw new Error(p!=null?`Chain id ${p} is not supported by this CLI build`:"App KMS info is missing chain_id");let f=await pn({chain:u,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,composeHash:l.composeHash});if(!f.success){let _="error"in f?f.error:void 0;throw new Error(_?.message||"Failed to check on-chain prerequisites")}let d=n.transactionHash||"already-registered",h=!f.data.deviceAllowed,g=!f.data.composeHashAllowed;if(h||g){let _=[];g&&_.push("compose hash"),h&&_.push("device");let E=n.privateKey||process.env.PRIVATE_KEY;if(!E)return Df(l,t),0;let S=E;if(h){let b=await Jt({chain:u,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,privateKey:S});if(!b.success){let I="error"in b?b.error:void 0;throw new Error(I?.message||"Failed to register device on-chain")}}if(g){let b=await Wt({chain:u,rpcUrl:n.rpcUrl,appId:`0x${r}`,composeHash:l.composeHash,privateKey:S});if(!b.success){let I="error"in b?b.error:void 0;throw new Error(I?.message||"Failed to register compose hash on-chain")}d=String(b.data.transactionHash||"already-registered")}}let y=10;for(let _=0;_<y;_++){let E=await pn({chain:u,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,composeHash:l.composeHash});if(E.success&&E.data.composeHashAllowed&&E.data.deviceAllowed)break;if(_===y-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 k=await o.post(`/apps/${r}/instances`,{token:l.commitToken,compose_hash:l.composeHash,transaction_hash:d});return vi(k,t),0}}catch(r){if(m.error("Failed to create app instance"),r instanceof yt){process.stderr.write(`${Bt(r)}
521
475
  `);let o=r.links;if(o&&o.length>0)for(let a of o)process.stderr.write(` ${a.label}: ${a.url}
522
- `);return 1}return r instanceof Error?(process.stderr.write(`${Ro(r)}
523
- `),1):(c.logDetailedError(r),1)}}var Sg=C({path:["instances","add"],meta:wg,schema:_g,handler:iA});import cA from"inquirer";import{z as go}from"zod";var Eg={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"}]},Ig=go.object({vmUuids:go.array(go.string()).min(1),force:go.boolean().default(!1),yes:go.boolean().default(!1)});async function lA(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 cA.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 Nr(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 Ag=C({path:["instances","rm"],meta:Eg,schema:Ig,handler:lA});import{z as Ki}from"zod";var Pg={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:[Se],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"}]},$g=Ki.object({family:Ki.string().optional(),json:Ki.boolean().default(!1)});function Rg(e){return(e/1024).toFixed(0)}function xg(e){return`$${e}`}async function mA(e,t){try{let n=await E(t);if(e.family){let a=await vs(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)":Rg(l.memory_mb),"Hourly Rate":xg(l.hourly_rate),GPU:l.requires_gpu?"Yes":"No"}));return i.length===0?(c.info(`No instance types found for family '${e.family}'`),0):(le(s,i),c.info(`Total: ${a.total} instance types`),0)}let r=await ys(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(`
524
- Family: ${a.name} (${a.total} types)`);let s=a.items.map(i=>({ID:i.id,NAME:i.name,vCPU:i.vcpu.toString(),"Memory(GB)":Rg(i.memory_mb),"Hourly Rate":xg(i.hourly_rate)}));le(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 Dg=C({path:["instance-types"],meta:Pg,schema:$g,handler:mA});import{z as Tg}from"zod";var Mg={name:"runtime-config",description:"Show the runtime configuration of a CVM",stability:"stable",category:"cvm-ops",arguments:[X],options:[j],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"}]},Lg=Tg.object({cvmId:Tg.string().optional()});async function pA(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 im(n,t.cvmId);if(!r.success)return t.fail(`Failed to get runtime config: ${r.error.message}`),1;let o=r.data;if(te())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 Ug=C({path:["runtime-config"],meta:Mg,schema:Lg,handler:pA});import{existsSync as jg,readFileSync as fA}from"fs";import{basename as gA,join as Ha}from"path";import{homedir as za,hostname as hA}from"os";import{z as Gi}from"zod";var dA={name:"name",description:"Name for the SSH key (default: key file name)",type:"string",target:"name"},uA={name:"key-file",description:"Path to SSH public key file (default: ~/.ssh/id_ed25519.pub or ~/.ssh/id_rsa.pub)",type:"string",target:"keyFile"},Og={name:"add",description:"Add a local SSH public key to your account",stability:"stable",options:[dA,uA],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"}]},Ng=Gi.object({name:Gi.string().optional(),keyFile:Gi.string().optional()});function yA(){let e=[Ha(za(),".ssh","id_ed25519.pub"),Ha(za(),".ssh","id_rsa.pub"),Ha(za(),".ssh","id_ecdsa.pub")];for(let t of e)if(jg(t))return t}async function vA(e,t){try{let n=e.keyFile;if(n?.startsWith("~/")&&(n=Ha(za(),n.slice(2))),!n&&(n=yA(),!n))return t.fail("No SSH public key found. Specify one with --key-file or generate one with ssh-keygen."),1;if(!jg(n))return t.fail(`SSH public key file not found: ${n}`),1;let r=fA(n,"utf-8").trim(),o=e.name??`${hA()}-${gA(n,".pub")}`,a=await E(t),s=await Rs(a,{name:o,public_key:r});return s.success?te()?(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 Fg=C({path:["ssh-keys","add"],meta:Og,schema:Ng,handler:vA});var Vg={path:["ssh-keys"],meta:{name:"ssh-keys",category:"manage",description:"Manage SSH keys",stability:"stable"}};import{z as Hg}from"zod";var CA={name:"github_username",description:"GitHub username to import SSH keys from",required:!0,target:"githubUsername"},zg={name:"import-github",description:"Import SSH keys from a GitHub user's public profile",stability:"stable",arguments:[CA],examples:[{name:"Import SSH keys from a GitHub profile",value:"phala ssh-keys import-github octocat"}]},Kg=Hg.object({githubUsername:Hg.string()});async function bA(e,t){try{let n=await E(t),r=c.startSpinner(`Importing SSH keys from github.com/${e.githubUsername}`),o=await $s(n,{github_username:e.githubUsername});if(r.stop(!0),!o.success)return t.fail(`Failed to import SSH keys: ${o.error.message}`),1;if(te())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 Gg=C({path:["ssh-keys","import-github"],meta:zg,schema:Kg,handler:bA});import{z as wA}from"zod";var qg={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"}]},Bg=wA.object({});async function _A(e,t){try{let n=await E(t),r=await jr(n);if(!r.success)return t.fail(`Failed to list SSH keys: ${r.error.message}`),1;let o=r.data;if(te())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 le(a,s),0}catch(n){return c.logDetailedError(n),t.fail("Failed to list SSH keys"),1}}var Wg=C({path:["ssh-keys","list"],meta:qg,schema:Bg,handler:_A});import SA from"inquirer";import{z as qi}from"zod";var kA={name:"key_id",description:"SSH key ID to remove (from `phala ssh-keys list`)",required:!1,target:"keyId"},Jg={name:"remove",aliases:["rm"],description:"Remove an SSH key from your account",stability:"stable",arguments:[kA],options:[j],examples:[{name:"Remove an SSH key by ID",value:"phala ssh-keys remove sshkey_xxx"},{name:"Interactive selection",value:"phala ssh-keys rm -i"}]},Yg=qi.object({keyId:qi.string().optional(),interactive:qi.boolean().default(!1)});async function EA(e){let t=c.startSpinner("Fetching SSH keys"),n=await E(e),r=await jr(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 SA.prompt([{type:"list",name:"selectedKey",message:"Select an SSH key to remove:",choices:a}]);return s}async function IA(e,t){try{let n=e.keyId;if(!n&&e.interactive&&(n=await EA(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 xs(r,{keyId:n});return o.success?te()?(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 Zg=C({path:["ssh-keys","remove"],meta:Jg,schema:Yg,handler:IA});var Bi={group:Vg,commands:[Wg,Fg,Zg,Gg]};import{z as Wi}from"zod";var Xg={name:"whoami",category:"profile",description:"Print the current user",stability:"stable",options:[...an,de],examples:[{name:"Show current user",value:"phala whoami"},{name:"JSON output",value:"phala whoami --json"}]},Qg=Wi.object({json:Wi.boolean().default(!1),apiToken:Wi.string().optional()});async function AA(e,t){let{client:n,auth:r}=await qo(t,{apiToken:e.apiToken});if(!r.apiKey)return t.fail('Not authenticated. Run "phala login" first.'),1;let o=await je(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})
525
- `),0)}var eh=C({path:["whoami"],meta:Xg,schema:Qg,handler:AA});import hh from"inquirer";import{z as V}from"zod";var Sr={name:"cvm",description:"CVM or app identifier (UUID, app_id, instance_id, or name)",required:!0,target:"cvm"},th={path:["allow-devices"],meta:{name:"allow-devices",description:"Manage on-chain device allowlist for an app contract",stability:"unstable"}},nh={name:"list",aliases:["ls"],description:"List allowed devices from the on-chain contract",stability:"unstable",arguments:[Sr],options:[qe,de],examples:[{name:"List devices on-chain",value:"phala allow-devices list app_abc123"}]},rh=V.object({cvm:V.string(),rpcUrl:V.string().optional(),json:V.boolean().default(!1)}),oh={name:"add",description:"Add devices to the on-chain allowlist",stability:"unstable",arguments:[Sr,{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:[Qe,qe,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},de,j],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..."}]},ah=V.object({cvm:V.string(),deviceId:V.string().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1),interactive:V.boolean().default(!1)}),sh={name:"remove",aliases:["rm"],description:"Remove devices from the on-chain allowlist",stability:"unstable",arguments:[Sr,{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:[Qe,qe,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},de,j],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..."}]},ih=V.object({cvm:V.string(),deviceId:V.string().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1),interactive:V.boolean().default(!1)}),ch={name:"allow-any",description:"Set the allow-any-device flag on the contract. Requires --enable or --disable.",stability:"unstable",arguments:[Sr],options:[{name:"enable",description:"Enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Disable allow-any-device",type:"boolean",target:"disable"},Qe,qe,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},de],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..."}]},lh=V.object({cvm:V.string(),enable:V.boolean().optional(),disable:V.boolean().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1)}),mh={name:"disallow-any",description:"Disable allow-any-device on the contract. Equivalent to `allow-any --disable`.",stability:"unstable",arguments:[Sr],options:[Qe,qe,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},de],examples:[{name:"Disable allow-any-device",value:"phala allow-devices disallow-any app_abc123 --private-key 0x..."}]},ph=V.object({cvm:V.string(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1)}),dh={name:"toggle-allow-any",description:"Toggle allow-any-device on the contract (or force via --enable/--disable)",stability:"unstable",arguments:[Sr],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"},Qe,qe,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},de],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..."}]},uh=V.object({cvm:V.string(),enable:V.boolean().optional(),disable:V.boolean().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1)});var PA=/^(0x)?[0-9a-fA-F]{64}$/,yh=/^[0-9a-fA-F]{40}$/;function Mn(e){return(e.startsWith("0x")?e:`0x${e}`).toLowerCase()}function Ka(e){return PA.test(e)}function $A(e){return e.startsWith("app_")||yh.test(e)}function fh(e){let t=e.startsWith("app_")?e.slice(4):e;return yh.test(t)?t.toLowerCase():t}function qa(e,t){if(!t)return null;let n=e.blockExplorers?.default?.url;return n?`${n}/tx/${t}`:null}var Ba=3e4,RA=15e3,Ga=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}},xA=[/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 vh(e){if(e instanceof Ga)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(`
526
- `);return xA.some(a=>a.test(o))}async function Er(e,t,n=Ba){let r;try{return await Promise.race([e,new Promise((o,a)=>{r=setTimeout(()=>{a(new Ga(t,n))},n)})])}finally{r&&clearTimeout(r)}}function gn(e,t){return t||e.rpcUrls.default.http[0]||"the default RPC"}function DA(e){switch(e){case 1:return"https://ethereum-rpc.publicnode.com";case 8453:return"https://base-rpc.publicnode.com";default:return null}}function TA(e){return`https://chainlist.org/chain/${e}`}var gh=new Set(["--private-key","--privateKey"]);function MA(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(gh.has(r)&&n+1<e.length){t.push(r,"$PRIVATE_KEY"),n+=1;continue}let o=r.indexOf("=");if(o>0&&gh.has(r.slice(0,o))){t.push(`${r.slice(0,o)}=$PRIVATE_KEY`);continue}t.push(r)}return t}function LA(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 UA(e){return/^[a-zA-Z0-9_\-./:=@,+%]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function OA(e){let t=process.argv.slice(2),n=MA(t);return["phala",...LA(n,e)].map(UA).join(" ")}function Pe(e=""){process.stderr.write(`${e}
527
- `)}function NA(e,t){Pe(`The ${e.name} RPC endpoint (${t}) appears unreachable or rate-limited.`);let n=DA(e.id);n?(Pe("Retry with:"),Pe(` ${OA(n)}`)):Pe("Retry by appending --rpc-url <URL> to your command with a different endpoint."),Pe(),Pe(`More public ${e.name} RPC endpoints: ${TA(e.id)}`),Pe("For production workloads, register a paid provider for reliability:"),Pe(" Alchemy: https://www.alchemy.com"),Pe(" Infura: https://www.infura.io"),Pe(" QuickNode: https://www.quicknode.com")}function Mt(e,t,n,r=!1){r||!t||!n||vh(e)&&NA(t,n)}function Ji(e){if(e.json)return;let{chain:t,description:n,txHash:r}=e;Pe(`${n} submitted: ${r}`);let o=qa(t,r);o&&Pe(`Explorer: ${o}`),Pe("Waiting for 1 confirmation...")}function jA(e){return e.enable&&e.disable||!e.enable&&!e.disable?null:!!e.enable}function FA(e){return e.enable&&e.disable?null:e.enable===!0?!0:e.disable===!0?!1:!(e.currentValue??!1)}function VA(e){return new Set(e.map(t=>Mn(t.device_id)))}async function Yi(e){let{chain:t,rpcUrl:n,appAddress:r,deviceIds:o,condition:a,description:s}=e,i=e.timeoutMs??6e4,l=e.intervalMs??2e3,m=Date.now()+i,p=gn(t,n),d=e.json??!1,f;for(;Date.now()<m;){try{let u=await Er(Mo({chain:t,rpcUrl:n,appAddress:r,deviceIds:o}),p,RA);if(a(u))return!0;f=void 0}catch(u){if(!vh(u))throw u;f=u}await new Promise(u=>{setTimeout(u,l)})}return d||Pe(`Warning: timeout waiting for on-chain state: ${s}`),f&&Mt(f,t,p,d),!1}function Ch(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function Zi(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 bh(e,t){if(Ka(e))return Mn(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 Ot(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||!Ka(a))throw new Error(`Node "${o[0].name}" has no valid device_id. Use an explicit device ID.`);return Mn(a)}async function Ir(e,t){let n=await E(t),r;if($A(e))r=fh(e);else{let i=await W(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 Uo(n,{appId:fh(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=xo[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 HA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Pe(s)},o,a;try{let s=await Ir(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:l}=s;a=i,o=gn(i,n.rpcUrl);let m=await E(t),p=await Ot(m),d=new Map;if(p.success)for(let y of p.data.nodes)y.device_id&&Ka(y.device_id)&&d.set(Mn(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 Er(Mo({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 le(h,g),0}catch(s){return Mt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1}}async function zA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Pe(s)},o,a;try{let s=await Ir(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:l,allowlist:m}=s;a=i,o=gn(i,n.rpcUrl);let p=Zi(n),d;if(n.interactive&&!n.deviceId){let u=await E(t),h=await Ot(u);if(!h.success)return t.fail(h.error.message),1;let g=VA(m.devices),y=h.data.nodes.filter(w=>w.device_id&&Ka(w.device_id)&&!g.has(Mn(w.device_id)));if(y.length===0)return r("All available devices are already in the allowlist."),0;let{selected:b}=await hh.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=>Mn(w))}else if(n.deviceId)d=[await bh(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 Er(on({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceId:u,privateKey:p,skipPrerequisiteChecks:!0,timeout:Ba,onTransactionSubmitted:y=>{Ji({chain:i,description:`Add-device transaction for ${u}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Mt(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:qa(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 Yi({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 Ch(s)?(r("Cancelled."),0):(Mt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1)}}async function KA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Pe(s)},o,a;try{let s=await Ir(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:l,allowlist:m}=s;a=i,o=gn(i,n.rpcUrl);let p=Zi(n),d;if(n.interactive&&!n.deviceId){let u=m.devices.filter(g=>g.status==="allowed");if(u.length===0)return t.fail("No allowed devices found to remove."),1;let{selected:h}=await hh.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=>Mn(g))}else if(n.deviceId)d=[await bh(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 Er(em({chain:i,rpcUrl:n.rpcUrl,appAddress:l,deviceId:u,privateKey:p,skipPrerequisiteChecks:!0,timeout:Ba,onTransactionSubmitted:y=>{Ji({chain:i,description:`Remove-device transaction for ${u}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Mt(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:qa(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 Er(Mo({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 Yi({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 Ch(s)?(r("Cancelled."),0):(Mt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1)}}async function GA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=jA(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 Ir(n.cvm,t);return s?(a=s.chain,o=gn(s.chain,n.rpcUrl),await Xi(n,t,{chain:s.chain,appContractAddress:s.appContractAddress,allow:r})):1}catch(s){return Mt(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1}}async function qA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await Ir(n.cvm,t);return a?(o=a.chain,r=gn(a.chain,n.rpcUrl),await Xi(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:!1})):1}catch(a){return Mt(a,o,r,n.json),t.fail(`Failed: ${a instanceof Error?a.message:String(a)}`),1}}async function BA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await Ir(n.cvm,t);if(!a)return 1;o=a.chain,r=gn(a.chain,n.rpcUrl);let s=FA({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 Xi(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:s})}catch(a){return Mt(a,o,r,n.json),t.fail(`Failed: ${a instanceof Error?a.message:String(a)}`),1}}async function Xi(e,t,n){let r=e.json??!1,o=(u="")=>{r||Pe(u)},{chain:a,appContractAddress:s,allow:i}=n,l=Zi(e),m=gn(a,e.rpcUrl);o(`Submitting allow-any-device transaction (${i?"enable":"disable"})...`),o(`RPC URL: ${m}`);let p=await Er(tm({chain:a,rpcUrl:e.rpcUrl,appAddress:s,allow:i,privateKey:l,timeout:Ba,onTransactionSubmitted:u=>{Ji({chain:a,description:"Allow-any-device transaction",txHash:u,json:r})}}),m);if(!p.success){let u=p;return Mt(new Error(u.error.message),a,m,r),t.fail(u.error.message),1}let d=p.data,f=qa(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 Yi({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 WA=C({path:["allow-devices","list"],meta:nh,schema:rh,handler:HA}),JA=C({path:["allow-devices","add"],meta:oh,schema:ah,handler:zA}),YA=C({path:["allow-devices","remove"],meta:sh,schema:ih,handler:KA}),ZA=C({path:["allow-devices","allow-any"],meta:ch,schema:lh,handler:GA}),XA=C({path:["allow-devices","disallow-any"],meta:mh,schema:ph,handler:qA}),QA=C({path:["allow-devices","toggle-allow-any"],meta:dh,schema:uh,handler:BA}),Qi={group:th,commands:[WA,JA,YA,ZA,XA,QA]};var oP=rP(import.meta.url),aP=tP(oP),sP=nP(aP,"../package.json"),Wa=JSON.parse(eP(sP,"utf-8")),iP="+d2300dd",cP=`v${Wa.version}${iP}`,lP=Zo(),T=new ta;T.registerCommand(ru);T.registerCommand(hg);T.registerGroup(yg);T.registerCommand(bg);T.registerCommand(Sg);T.registerCommand(Ag);T.registerCommand(Dg);T.registerCommand(tf);T.registerCommand(Zf);T.registerCommand(tg);T.registerCommand(og);T.registerCommand(cg);T.registerCommand(Ug);T.registerCommand(Wu);T.registerCommand(of);T.registerCommand(Ff);T.registerCommand(Di);T.registerCommand(Mi);T.registerCommand(Li);T.registerCommand(zf);T.registerCommand(vp);T.registerCommand($p);T.registerCommand(eh);T.registerCommand(Gf);T.registerCommand(kf);T.registerCommand(Ku);T.registerGroup(Fi.group);for(let e of Fi.commands)T.registerCommand(e);T.registerGroup(Qs.group);for(let e of Qs.commands)T.registerCommand(e);T.registerGroup(ti.group);for(let e of ti.commands)T.registerCommand(e);T.registerGroup(ha.group);for(let e of ha.commands)T.registerCommand(e);for(let e of ha.subgroups??[]){T.registerGroup(e.group);for(let t of e.commands)T.registerCommand(t)}T.registerGroup(vi.group);for(let e of vi.commands)T.registerCommand(e);T.registerGroup(Bi.group);for(let e of Bi.commands)T.registerCommand(e);T.registerGroup(Ci.group);for(let e of Ci.commands)T.registerCommand(e);T.registerGroup(Ii.group);for(let e of Ii.commands)T.registerCommand(e);T.registerGroup(Pi.group);for(let e of Pi.commands)T.registerCommand(e);T.registerGroup(Ri.group);for(let e of Ri.commands)T.registerCommand(e);T.registerGroup(Qi.group);for(let e of Qi.commands)T.registerCommand(e);process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function mP(){await mp({env:process.env,stderr:process.stderr});let e=await sp({registry:T,argv:process.argv.slice(2),executableName:Wa.name??"phala",version:cP,packageName:Wa.name??"phala",packageVersion:Wa.version,runtime:lP,cwd:process.cwd(),env:process.env,stdout:process.stdout,stderr:process.stderr,stdin:process.stdin});process.exit(e)}mP().catch(e=>{console.error("An error occurred:",e),process.exit(1)});
476
+ `);return 1}return r instanceof Error?(process.stderr.write(`${so(r)}
477
+ `),1):(m.logDetailedError(r),1)}}var Mf=v({path:["instances","add"],meta:$f,schema:Tf,handler:cE});import lE from"inquirer";import{z as qr}from"zod";var Uf={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"}]},Lf=qr.object({vmUuids:qr.array(qr.string()).min(1),force:qr.boolean().default(!1),yes:qr.boolean().default(!1)});async function mE(e,t){try{let n=await A(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 lE.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):(m.info("Deletion cancelled"),0)}let o=[];for(let s of e.vmUuids){let i=await Sr(n,{id:s});i.success?(o.push({vm_uuid:s,deleted:!0}),r||m.success(`Instance ${s} deleted successfully`)):(o.push({vm_uuid:s,deleted:!1,error:i.error.message}),r||m.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"),m.logDetailedError(n),1}}var Nf=v({path:["instances","rm"],meta:Uf,schema:Lf,handler:mE});import{z as Ci}from"zod";var Of={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:[fe],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"}]},jf=Ci.object({family:Ci.string().optional(),json:Ci.boolean().default(!1)});function Ff(e){return(e/1024).toFixed(0)}function Vf(e){return`$${e}`}async function pE(e,t){try{let n=await A(t);if(e.family){let a=await Ba(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(c=>({ID:c.id,NAME:c.name,vCPU:c.vcpu.toString(),"Memory(GB)":Ff(c.memory_mb),"Hourly Rate":Vf(c.hourly_rate),GPU:c.requires_gpu?"Yes":"No"}));return i.length===0?(m.info(`No instance types found for family '${e.family}'`),0):(ie(s,i),m.info(`Total: ${a.total} instance types`),0)}let r=await Ga(n);if(e.json)return t.success(r),0;if(r.result.length===0)return m.info("No instance types found"),0;let o=["ID","NAME","vCPU","Memory(GB)","Hourly Rate"];for(let a of r.result){m.info(`
478
+ Family: ${a.name} (${a.total} types)`);let s=a.items.map(i=>({ID:i.id,NAME:i.name,vCPU:i.vcpu.toString(),"Memory(GB)":Ff(i.memory_mb),"Hourly Rate":Vf(i.hourly_rate)}));ie(o,s)}return 0}catch(n){return m.logDetailedError(n),t.fail(`Failed to list instance types: ${n instanceof Error?n.message:String(n)}`),1}}var Hf=v({path:["instance-types"],meta:Of,schema:jf,handler:pE});import{z as zf}from"zod";var Kf={name:"runtime-config",description:"Show the runtime configuration of a CVM",stability:"stable",category:"cvm-ops",arguments:[X],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"}]},qf=zf.object({cvmId:zf.string().optional()});async function uE(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 A(t),r=await Ol(n,t.cvmId);if(!r.success)return t.fail(`Failed to get runtime config: ${r.error.message}`),1;let o=r.data;if(te())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 m.logDetailedError(n),t.fail("Failed to get CVM runtime config"),1}}var Gf=v({path:["runtime-config"],meta:Kf,schema:qf,handler:uE});import{existsSync as Jf,readFileSync as gE}from"fs";import{basename as hE,join as ha}from"path";import{homedir as ya,hostname as yE}from"os";import{z as wi}from"zod";var dE={name:"name",description:"Name for the SSH key (default: key file name)",type:"string",target:"name"},fE={name:"key-file",description:"Path to SSH public key file (default: ~/.ssh/id_ed25519.pub or ~/.ssh/id_rsa.pub)",type:"string",target:"keyFile"},Bf={name:"add",description:"Add a local SSH public key to your account",stability:"stable",options:[dE,fE],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"}]},Wf=wi.object({name:wi.string().optional(),keyFile:wi.string().optional()});function vE(){let e=[ha(ya(),".ssh","id_ed25519.pub"),ha(ya(),".ssh","id_rsa.pub"),ha(ya(),".ssh","id_ecdsa.pub")];for(let t of e)if(Jf(t))return t}async function bE(e,t){try{let n=e.keyFile;if(n?.startsWith("~/")&&(n=ha(ya(),n.slice(2))),!n&&(n=vE(),!n))return t.fail("No SSH public key found. Specify one with --key-file or generate one with ssh-keygen."),1;if(!Jf(n))return t.fail(`SSH public key file not found: ${n}`),1;let r=gE(n,"utf-8").trim(),o=e.name??`${yE()}-${hE(n,".pub")}`,a=await A(t),s=await os(a,{name:o,public_key:r});return s.success?te()?(t.success(s.data),0):(m.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 m.logDetailedError(n),t.fail("Failed to add SSH key"),1}}var Yf=v({path:["ssh-keys","add"],meta:Bf,schema:Wf,handler:bE});var Xf={path:["ssh-keys"],meta:{name:"ssh-keys",category:"manage",description:"Manage SSH keys",stability:"stable"}};import{z as Zf}from"zod";var CE={name:"github_username",description:"GitHub username to import SSH keys from",required:!0,target:"githubUsername"},Qf={name:"import-github",description:"Import SSH keys from a GitHub user's public profile",stability:"stable",arguments:[CE],examples:[{name:"Import SSH keys from a GitHub profile",value:"phala ssh-keys import-github octocat"}]},eg=Zf.object({githubUsername:Zf.string()});async function wE(e,t){try{let n=await A(t),r=m.startSpinner(`Importing SSH keys from github.com/${e.githubUsername}`),o=await rs(n,{github_username:e.githubUsername});if(r.stop(!0),!o.success)return t.fail(`Failed to import SSH keys: ${o.error.message}`),1;if(te())return t.success(o.data),0;let{keys_added:a,keys_skipped:s,errors:i}=o.data;if(i.length>0){m.warn(`${i.length} key(s) could not be imported:`);for(let c of i)m.warn(` ${c}`)}return a>0?m.success(`Added ${a} SSH key(s) from github.com/${e.githubUsername} (${s} skipped)`):m.info("No new keys added (all keys already exist)"),0}catch(n){return m.logDetailedError(n),t.fail("Failed to import SSH keys"),1}}var tg=v({path:["ssh-keys","import-github"],meta:Qf,schema:eg,handler:wE});import{z as _E}from"zod";var ng={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"}]},rg=_E.object({});async function SE(e,t){try{let n=await A(t),r=await kr(n);if(!r.success)return t.fail(`Failed to list SSH keys: ${r.error.message}`),1;let o=r.data;if(te())return t.success(o),0;if(o.length===0)return m.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 ie(a,s),0}catch(n){return m.logDetailedError(n),t.fail("Failed to list SSH keys"),1}}var og=v({path:["ssh-keys","list"],meta:ng,schema:rg,handler:SE});import IE from"inquirer";import{z as _i}from"zod";var kE={name:"key_id",description:"SSH key ID to remove (from `phala ssh-keys list`)",required:!1,target:"keyId"},ag={name:"remove",aliases:["rm"],description:"Remove an SSH key from your account",stability:"stable",arguments:[kE],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"}]},sg=_i.object({keyId:_i.string().optional(),interactive:_i.boolean().default(!1)});async function EE(e){let t=m.startSpinner("Fetching SSH keys"),n=await A(e),r=await kr(n);if(t.stop(!0),!r.success){m.error(`Failed to fetch SSH keys: ${r.error.message}`);return}let o=r.data;if(o.length===0){m.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 IE.prompt([{type:"list",name:"selectedKey",message:"Select an SSH key to remove:",choices:a}]);return s}async function AE(e,t){try{let n=e.keyId;if(!n&&e.interactive&&(n=await EE(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 A(t),o=await as(r,{keyId:n});return o.success?te()?(t.success({keyId:n,removed:!0}),0):(m.success(`SSH key ${n} removed`),0):(t.fail(`Failed to remove SSH key: ${o.error.message}`),1)}catch(n){return m.logDetailedError(n),t.fail("Failed to remove SSH key"),1}}var ig=v({path:["ssh-keys","remove"],meta:ag,schema:sg,handler:AE});var Si={group:Xf,commands:[og,Yf,ig,tg]};import{z as ki}from"zod";var cg={name:"whoami",category:"profile",description:"Print the current user",stability:"stable",options:[...Yt,ue],examples:[{name:"Show current user",value:"phala whoami"},{name:"JSON output",value:"phala whoami --json"}]},lg=ki.object({json:ki.boolean().default(!1),apiToken:ki.string().optional()});async function RE(e,t){let{client:n,auth:r}=await wo(t,{apiToken:e.apiToken});if(!r.apiKey)return t.fail('Not authenticated. Run "phala login" first.'),1;let o=await Ve(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})
479
+ `),0)}var mg=v({path:["whoami"],meta:cg,schema:lg,handler:RE});import Eg from"inquirer";import{z as V}from"zod";var cr={name:"cvm",description:"CVM or app identifier (UUID, app_id, instance_id, or name)",required:!0,target:"cvm"},pg={path:["allow-devices"],meta:{name:"allow-devices",description:"Manage on-chain device allowlist for an app contract",stability:"unstable"}},ug={name:"list",aliases:["ls"],description:"List allowed devices from the on-chain contract",stability:"unstable",arguments:[cr],options:[Be,ue],examples:[{name:"List devices on-chain",value:"phala allow-devices list app_abc123"}]},dg=V.object({cvm:V.string(),rpcUrl:V.string().optional(),json:V.boolean().default(!1)}),fg={name:"add",description:"Add devices to the on-chain allowlist",stability:"unstable",arguments:[cr,{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:[Qe,Be,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ue,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..."}]},gg=V.object({cvm:V.string(),deviceId:V.string().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1),interactive:V.boolean().default(!1)}),hg={name:"remove",aliases:["rm"],description:"Remove devices from the on-chain allowlist",stability:"unstable",arguments:[cr,{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:[Qe,Be,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ue,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..."}]},yg=V.object({cvm:V.string(),deviceId:V.string().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1),interactive:V.boolean().default(!1)}),vg={name:"allow-any",description:"Set the allow-any-device flag on the contract. Requires --enable or --disable.",stability:"unstable",arguments:[cr],options:[{name:"enable",description:"Enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Disable allow-any-device",type:"boolean",target:"disable"},Qe,Be,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ue],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..."}]},bg=V.object({cvm:V.string(),enable:V.boolean().optional(),disable:V.boolean().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1)}),Cg={name:"disallow-any",description:"Disable allow-any-device on the contract. Equivalent to `allow-any --disable`.",stability:"unstable",arguments:[cr],options:[Qe,Be,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ue],examples:[{name:"Disable allow-any-device",value:"phala allow-devices disallow-any app_abc123 --private-key 0x..."}]},wg=V.object({cvm:V.string(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1)}),_g={name:"toggle-allow-any",description:"Toggle allow-any-device on the contract (or force via --enable/--disable)",stability:"unstable",arguments:[cr],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"},Qe,Be,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ue],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..."}]},Sg=V.object({cvm:V.string(),enable:V.boolean().optional(),disable:V.boolean().optional(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1)});var PE=/^(0x)?[0-9a-fA-F]{64}$/,Ag=/^[0-9a-fA-F]{40}$/;function _n(e){return(e.startsWith("0x")?e:`0x${e}`).toLowerCase()}function va(e){return PE.test(e)}function xE(e){return e.startsWith("app_")||Ag.test(e)}function kg(e){let t=e.startsWith("app_")?e.slice(4):e;return Ag.test(t)?t.toLowerCase():t}function Ca(e,t){if(!t)return null;let n=e.blockExplorers?.default?.url;return n?`${n}/tx/${t}`:null}var wa=3e4,$E=15e3,ba=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}},TE=[/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 Rg(e){if(e instanceof ba)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(`
480
+ `);return TE.some(a=>a.test(o))}async function lr(e,t,n=wa){let r;try{return await Promise.race([e,new Promise((o,a)=>{r=setTimeout(()=>{a(new ba(t,n))},n)})])}finally{r&&clearTimeout(r)}}function an(e,t){return t||e.rpcUrls.default.http[0]||"the default RPC"}function DE(e){switch(e){case 1:return"https://ethereum-rpc.publicnode.com";case 8453:return"https://base-rpc.publicnode.com";default:return null}}function ME(e){return`https://chainlist.org/chain/${e}`}var Ig=new Set(["--private-key","--privateKey"]);function UE(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(Ig.has(r)&&n+1<e.length){t.push(r,"$PRIVATE_KEY"),n+=1;continue}let o=r.indexOf("=");if(o>0&&Ig.has(r.slice(0,o))){t.push(`${r.slice(0,o)}=$PRIVATE_KEY`);continue}t.push(r)}return t}function LE(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 NE(e){return/^[a-zA-Z0-9_\-./:=@,+%]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function OE(e){let t=process.argv.slice(2),n=UE(t);return["phala",...LE(n,e)].map(NE).join(" ")}function Re(e=""){process.stderr.write(`${e}
481
+ `)}function jE(e,t){Re(`The ${e.name} RPC endpoint (${t}) appears unreachable or rate-limited.`);let n=DE(e.id);n?(Re("Retry with:"),Re(` ${OE(n)}`)):Re("Retry by appending --rpc-url <URL> to your command with a different endpoint."),Re(),Re(`More public ${e.name} RPC endpoints: ${ME(e.id)}`),Re("For production workloads, register a paid provider for reliability:"),Re(" Alchemy: https://www.alchemy.com"),Re(" Infura: https://www.infura.io"),Re(" QuickNode: https://www.quicknode.com")}function $t(e,t,n,r=!1){r||!t||!n||Rg(e)&&jE(t,n)}function Ii(e){if(e.json)return;let{chain:t,description:n,txHash:r}=e;Re(`${n} submitted: ${r}`);let o=Ca(t,r);o&&Re(`Explorer: ${o}`),Re("Waiting for 1 confirmation...")}function FE(e){return e.enable&&e.disable||!e.enable&&!e.disable?null:!!e.enable}function VE(e){return e.enable&&e.disable?null:e.enable===!0?!0:e.disable===!0?!1:!(e.currentValue??!1)}function HE(e){return new Set(e.map(t=>_n(t.device_id)))}async function Ei(e){let{chain:t,rpcUrl:n,appAddress:r,deviceIds:o,condition:a,description:s}=e,i=e.timeoutMs??6e4,c=e.intervalMs??2e3,l=Date.now()+i,p=an(t,n),u=e.json??!1,f;for(;Date.now()<l;){try{let d=await lr(mo({chain:t,rpcUrl:n,appAddress:r,deviceIds:o}),p,$E);if(a(d))return!0;f=void 0}catch(d){if(!Rg(d))throw d;f=d}await new Promise(d=>{setTimeout(d,c)})}return u||Re(`Warning: timeout waiting for on-chain state: ${s}`),f&&$t(f,t,p,u),!1}function Pg(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function Ai(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 xg(e,t){if(va(e))return _n(e);if(e.startsWith("0x"))throw new Error(`Invalid device ID format: ${e}. Expected 32-byte hex (0x + 64 hex chars).`);let n=await A(t),r=await Ut(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||!va(a))throw new Error(`Node "${o[0].name}" has no valid device_id. Use an explicit device ID.`);return _n(a)}async function mr(e,t){let n=await A(t),r;if(xE(e))r=kg(e);else{let i=await G(n,{id:e});if(!i.success)return t.fail(i.error.message),null;let c=i.data;if(!c)return t.fail("CVM not found"),null;if(r=c.app_id,!r)return t.fail("CVM has no app_id assigned yet."),null}let o=await uo(n,{appId:kg(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=At[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 zE(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Re(s)},o,a;try{let s=await mr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c}=s;a=i,o=an(i,n.rpcUrl);let l=await A(t),p=await Ut(l),u=new Map;if(p.success)for(let y of p.data.nodes)y.device_id&&va(y.device_id)&&u.set(_n(y.device_id),y.name);else r("Warning: could not fetch platform nodes \u2014 node names will not be shown.");let f=Array.from(u.keys()),d=await lr(mo({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceIds:f}),o);if(n.json)return t.success({appAddress:c,chain:i.name,owner:d.owner,allowAnyDevice:d.allowAnyDevice,devices:d.allowAnyDevice?[]:d.devices.map(y=>({deviceId:y,nodeName:u.get(y.toLowerCase())??null}))}),0;if(r(`Contract: ${c}`),r(`Chain: ${i.name}`),r(`Owner: ${d.owner}`),r(`Allow Any Device: ${d.allowAnyDevice?"yes":"no"}`),d.allowAnyDevice)return 0;if(d.devices.length===0)return r("No devices found"),0;let h=["DEVICE_ID","NODE"],g=d.devices.map(y=>({DEVICE_ID:y,NODE:u.get(y.toLowerCase())??"-"}));return ie(h,g),0}catch(s){return $t(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1}}async function KE(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Re(s)},o,a;try{let s=await mr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c,allowlist:l}=s;a=i,o=an(i,n.rpcUrl);let p=Ai(n),u;if(n.interactive&&!n.deviceId){let d=await A(t),h=await Ut(d);if(!h.success)return t.fail(h.error.message),1;let g=HE(l.devices),y=h.data.nodes.filter(_=>_.device_id&&va(_.device_id)&&!g.has(_n(_.device_id)));if(y.length===0)return r("All available devices are already in the allowlist."),0;let{selected:k}=await Eg.prompt([{type:"checkbox",name:"selected",message:"Select devices to add:",choices:y.map(_=>({name:`${_.name} ${_.device_id}`,value:_.device_id}))}]);if(k.length===0)return r("No devices selected."),0;u=k.map(_=>_n(_))}else if(n.deviceId)u=[await xg(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let f=[];for(let d of u){r(`Submitting add-device transaction for ${d}...`),r(`RPC URL: ${o}`);let h=await lr(Jt({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceId:d,privateKey:p,skipPrerequisiteChecks:!0,timeout:wa,onTransactionSubmitted:y=>{Ii({chain:i,description:`Add-device transaction for ${d}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return $t(new Error(y.error.message),i,o,n.json),t.fail(`Failed to add ${d}: ${y.error.message}`),1}let g=h.data;f.push({deviceId:d,txHash:g.transactionHash,explorer:Ca(i,g.transactionHash)})}if(n.json)return t.success(f),0;for(let d of f)r(`Added ${d.deviceId}`),r(`Transaction: ${d.txHash}`),d.explorer&&r(`Explorer: ${d.explorer}`);if(n.wait){if(!await Ei({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceIds:u,description:"devices to be allowed",json:n.json,condition:h=>h.allowAnyDevice?!0:u.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 Pg(s)?(r("Cancelled."),0):($t(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1)}}async function qE(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Re(s)},o,a;try{let s=await mr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c,allowlist:l}=s;a=i,o=an(i,n.rpcUrl);let p=Ai(n),u;if(n.interactive&&!n.deviceId){let d=l.devices.filter(g=>g.status==="allowed");if(d.length===0)return t.fail("No allowed devices found to remove."),1;let{selected:h}=await Eg.prompt([{type:"checkbox",name:"selected",message:"Select devices to remove:",choices:d.map(g=>({name:`${g.node_name??"-"} ${g.device_id}`,value:g.device_id}))}]);if(h.length===0)return r("No devices selected."),0;u=h.map(g=>_n(g))}else if(n.deviceId)u=[await xg(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let f=[];for(let d of u){r(`Submitting remove-device transaction for ${d}...`),r(`RPC URL: ${o}`);let h=await lr($l({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceId:d,privateKey:p,skipPrerequisiteChecks:!0,timeout:wa,onTransactionSubmitted:y=>{Ii({chain:i,description:`Remove-device transaction for ${d}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return $t(new Error(y.error.message),i,o,n.json),t.fail(`Failed to remove ${d}: ${y.error.message}`),1}let g=h.data;f.push({deviceId:d,txHash:g.transactionHash,explorer:Ca(i,g.transactionHash)})}if(n.json)return t.success(f),0;for(let d of f)r(`Removed ${d.deviceId}`),r(`Transaction: ${d.txHash}`),d.explorer&&r(`Explorer: ${d.explorer}`);if(n.wait)if((await lr(mo({chain:i,rpcUrl:n.rpcUrl,appAddress:c,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 Ei({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceIds:u,description:"devices to be removed",json:n.json,condition:g=>u.every(y=>!g.devices.some(k=>k.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 Pg(s)?(r("Cancelled."),0):($t(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1)}}async function GE(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=FE(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 mr(n.cvm,t);return s?(a=s.chain,o=an(s.chain,n.rpcUrl),await Ri(n,t,{chain:s.chain,appContractAddress:s.appContractAddress,allow:r})):1}catch(s){return $t(s,a,o,n.json),t.fail(`Failed: ${s instanceof Error?s.message:String(s)}`),1}}async function BE(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await mr(n.cvm,t);return a?(o=a.chain,r=an(a.chain,n.rpcUrl),await Ri(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:!1})):1}catch(a){return $t(a,o,r,n.json),t.fail(`Failed: ${a instanceof Error?a.message:String(a)}`),1}}async function WE(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await mr(n.cvm,t);if(!a)return 1;o=a.chain,r=an(a.chain,n.rpcUrl);let s=VE({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 Ri(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:s})}catch(a){return $t(a,o,r,n.json),t.fail(`Failed: ${a instanceof Error?a.message:String(a)}`),1}}async function Ri(e,t,n){let r=e.json??!1,o=(d="")=>{r||Re(d)},{chain:a,appContractAddress:s,allow:i}=n,c=Ai(e),l=an(a,e.rpcUrl);o(`Submitting allow-any-device transaction (${i?"enable":"disable"})...`),o(`RPC URL: ${l}`);let p=await lr(Tl({chain:a,rpcUrl:e.rpcUrl,appAddress:s,allow:i,privateKey:c,timeout:wa,onTransactionSubmitted:d=>{Ii({chain:a,description:"Allow-any-device transaction",txHash:d,json:r})}}),l);if(!p.success){let d=p;return $t(new Error(d.error.message),a,l,r),t.fail(d.error.message),1}let u=p.data,f=Ca(a,u.transactionHash);if(r)return t.success({...u,explorer:f??void 0}),0;if(o(`Allow-any-device ${i?"enabled":"disabled"} successfully!`),o(`Transaction: ${u.transactionHash}`),f&&o(`Explorer: ${f}`),e.wait){if(!await Ei({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 JE=v({path:["allow-devices","list"],meta:ug,schema:dg,handler:zE}),YE=v({path:["allow-devices","add"],meta:fg,schema:gg,handler:KE}),XE=v({path:["allow-devices","remove"],meta:hg,schema:yg,handler:qE}),ZE=v({path:["allow-devices","allow-any"],meta:vg,schema:bg,handler:GE}),QE=v({path:["allow-devices","disallow-any"],meta:Cg,schema:wg,handler:BE}),eA=v({path:["allow-devices","toggle-allow-any"],meta:_g,schema:Sg,handler:WE}),Pi={group:pg,commands:[JE,YE,XE,ZE,QE,eA]};import{readFileSync as tA}from"fs";import{keccak256 as Dg,hexToBytes as nA}from"viem";import{z as pr}from"zod";var $g={name:"keccak256sum",category:"advanced",description:"Compute or verify keccak256 checksums of hex inputs",stability:"stable",arguments:[{name:"hex-values",description:"Hex strings to hash, or checksum file path when using -c",required:!1,variadic:!0}],options:[{name:"check",shorthand:"c",description:"Read checksums from file and verify them",type:"boolean",target:"check"},{name:"quiet",description:"In check mode, suppress OK messages",type:"boolean",target:"quiet"},{name:"status",description:"In check mode, suppress all output; exit code indicates result",type:"boolean",target:"status"}],examples:[{name:"Hash concatenated hex values",value:"phala keccak256sum 4f475ed2...e099 8d8f406c...6aef 0x02 3059...9d9f"},{name:"Hash hex from stdin",value:"echo 'deadbeef' | phala keccak256sum"},{name:"Verify checksums from file",value:"phala keccak256sum -c checksums.txt"}]},Tg=pr.object({hexValues:pr.array(pr.string()),check:pr.boolean().default(!1),quiet:pr.boolean().default(!1),status:pr.boolean().default(!1)});function rA(e){let t=e.startsWith("0x")?e.slice(2):e;if(!/^[0-9a-fA-F]*$/.test(t)||t.length===0)throw new Error(`Invalid hex value: ${e}`);if(t.length%2!==0)throw new Error(`Hex value must have even length: ${e}`);return`0x${t.toLowerCase()}`}function oA(e){let t=e.reduce((o,a)=>o+a.length,0),n=new Uint8Array(t),r=0;for(let o of e)n.set(o,r),r+=o.length;return n}function xi(e){let t=e.map(o=>nA(rA(o))),n=oA(t);return Dg(n).slice(2)}function aA(e){return Dg(e).slice(2)}async function sA(e){let t=[];for await(let n of e)t.push(Buffer.from(n));return Buffer.concat(t).toString("utf-8").trim()}function iA(e,t,n){let r;try{r=tA(e,"utf-8")}catch{return n.fail(`${e}: No such file`),1}let o=r.split(`
482
+ `),a=0,s=0;for(let i of o){let c=i.trim();if(!c||c.startsWith("#"))continue;let l=c.match(/^([0-9a-fA-F]{64})\s{2}(.+)$/);if(!l){t.status||n.stderr.write(`keccak256sum: ${e}: improperly formatted line
483
+ `),a++;continue}let[,p,u]=l,f=u;if(u==="-"){t.status||n.stderr.write(`keccak256sum: -: cannot verify stdin from checksum file
484
+ `);continue}let d=u.split(/\s+/).filter(Boolean);try{let h=xi(d);s++,h===p.toLowerCase()?!t.quiet&&!t.status&&n.stdout.write(`${f}: OK
485
+ `):(a++,t.status||n.stdout.write(`${f}: FAILED
486
+ `))}catch{a++,t.status||n.stdout.write(`${f}: FAILED
487
+ `)}}return a>0&&!t.status&&n.stderr.write(`keccak256sum: WARNING: ${a} computed checksum(s) did NOT match
488
+ `),a>0?1:0}async function cA(e,t){if(e.check)return e.hexValues.length===0?(t.fail("No checksum file specified"),1):iA(e.hexValues[0],{quiet:e.quiet,status:e.status},t);if(e.hexValues.length>0)try{let n=xi(e.hexValues),r=e.hexValues.join(" ");return t.stdout.write(`${n} ${r}
489
+ `),0}catch(n){return t.fail(n instanceof Error?n.message:"Failed to compute keccak256"),1}if(t.stdin.isTTY)return t.stderr.write(`Usage: phala keccak256sum [options] <hex-value> [hex-value ...]
490
+
491
+ Compute or verify keccak256 checksums of hex inputs.
492
+ Read from stdin when no arguments are given.
493
+ `),1;try{let r=(await sA(t.stdin)).split(/\s+/).filter(Boolean),o;return r.length===0?o=aA(new Uint8Array(0)):o=xi(r),t.stdout.write(`${o} -
494
+ `),0}catch(n){return t.fail(n instanceof Error?n.message:"Failed to compute keccak256"),1}}var Mg=v({path:["keccak256sum"],meta:$g,schema:Tg,handler:cA});var dA=uA(import.meta.url),fA=mA(dA),gA=pA(fA,"../package.json"),_a=JSON.parse(lA(gA,"utf-8")),hA="+2db80c8",yA=`v${_a.version}${hA}`,vA=Eo(),D=new xo;D.registerCommand(Lu);D.registerCommand(Ef);D.registerGroup(Af);D.registerCommand(xf);D.registerCommand(Mf);D.registerCommand(Nf);D.registerCommand(Hf);D.registerCommand(ad);D.registerCommand(sf);D.registerCommand(pf);D.registerCommand(ff);D.registerCommand(vf);D.registerCommand(Gf);D.registerCommand(Zu);D.registerCommand(cd);D.registerCommand(Jd);D.registerCommand(ci);D.registerCommand(mi);D.registerCommand(pi);D.registerCommand(Zd);D.registerCommand(Zm);D.registerCommand(ip);D.registerCommand(mg);D.registerCommand(ef);D.registerCommand(Td);D.registerCommand(Mg);D.registerCommand(Wu);D.registerGroup(hi.group);for(let e of hi.commands)D.registerCommand(e);D.registerGroup(Ds.group);for(let e of Ds.commands)D.registerCommand(e);D.registerGroup(Us.group);for(let e of Us.commands)D.registerCommand(e);D.registerGroup(Wo.group);for(let e of Wo.commands)D.registerCommand(e);for(let e of Wo.subgroups??[]){D.registerGroup(e.group);for(let t of e.commands)D.registerCommand(t)}D.registerGroup(Js.group);for(let e of Js.commands)D.registerCommand(e);D.registerGroup(Si.group);for(let e of Si.commands)D.registerCommand(e);D.registerGroup(ni.group);for(let e of ni.commands)D.registerCommand(e);D.registerGroup(oi.group);for(let e of oi.commands)D.registerCommand(e);D.registerGroup(si.group);for(let e of si.commands)D.registerCommand(e);D.registerGroup(Pi.group);for(let e of Pi.commands)D.registerCommand(e);process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function bA(){await Km({env:process.env,stderr:process.stderr});let e=await Fm({registry:D,argv:process.argv.slice(2),executableName:_a.name??"phala",version:yA,packageName:_a.name??"phala",packageVersion:_a.version,runtime:vA,cwd:process.cwd(),env:process.env,stdout:process.stdout,stderr:process.stderr,stdin:process.stdin});process.exit(e)}bA().catch(e=>{console.error("An error occurred:",e),process.exit(1)});
528
495
  /*! Bundled license information:
529
496
 
530
- @noble/hashes/utils.js:
497
+ @noble/hashes/esm/utils.js:
531
498
  (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
532
499
  */
533
500
  //# sourceMappingURL=index.js.map