phala 1.1.20 → 1.1.21-beta.2
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/api/index.js +26 -26
- package/dist/index.js +187 -201
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'module';const require = createRequire(import.meta.url);
|
|
3
|
-
var
|
|
3
|
+
var kh=Object.create;var Ji=Object.defineProperty;var Ih=Object.getOwnPropertyDescriptor;var Eh=Object.getOwnPropertyNames;var Ah=Object.getPrototypeOf,Rh=Object.prototype.hasOwnProperty;var Oa=(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 yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var xh=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Eh(t))!Rh.call(e,o)&&o!==n&&Ji(e,o,{get:()=>t[o],enumerable:!(r=Ih(t,o))||r.enumerable});return e};var Ph=(e,t,n)=>(n=e!=null?kh(Ah(e)):{},xh(t||!e||!e.__esModule?Ji(n,"default",{value:e,enumerable:!0}):n,e));var Xi=yr((ER,Yi)=>{var Rn=1e3,xn=Rn*60,Pn=xn*60,pn=Pn*24,$h=pn*7,Th=pn*365.25;Yi.exports=function(e,t){t=t||{};var n=typeof e;if(n==="string"&&e.length>0)return Mh(e);if(n==="number"&&isFinite(e))return t.long?Uh(e):Dh(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function Mh(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*Th;case"weeks":case"week":case"w":return n*$h;case"days":case"day":case"d":return n*pn;case"hours":case"hour":case"hrs":case"hr":case"h":return n*Pn;case"minutes":case"minute":case"mins":case"min":case"m":return n*xn;case"seconds":case"second":case"secs":case"sec":case"s":return n*Rn;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function Dh(e){var t=Math.abs(e);return t>=pn?Math.round(e/pn)+"d":t>=Pn?Math.round(e/Pn)+"h":t>=xn?Math.round(e/xn)+"m":t>=Rn?Math.round(e/Rn)+"s":e+"ms"}function Uh(e){var t=Math.abs(e);return t>=pn?io(e,t,pn,"day"):t>=Pn?io(e,t,Pn,"hour"):t>=xn?io(e,t,xn,"minute"):t>=Rn?io(e,t,Rn,"second"):e+" ms"}function io(e,t,n,r){var o=t>=n*1.5;return Math.round(e/n)+" "+r+(o?"s":"")}});var ja=yr((AR,Zi)=>{function Lh(e){n.debug=n,n.default=n,n.coerce=c,n.disable=s,n.enable=o,n.enabled=i,n.humanize=Xi(),n.destroy=l,Object.keys(e).forEach(m=>{n[m]=e[m]}),n.names=[],n.skips=[],n.formatters={};function t(m){let u=0;for(let d=0;d<m.length;d++)u=(u<<5)-u+m.charCodeAt(d),u|=0;return n.colors[Math.abs(u)%n.colors.length]}n.selectColor=t;function n(m){let u,d=null,f,h;function g(...y){if(!g.enabled)return;let S=g,_=Number(new Date),I=_-(u||_);S.diff=I,S.prev=u,S.curr=_,u=_,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,(A,P)=>{if(A==="%%")return"%";k++;let L=n.formatters[P];if(typeof L=="function"){let D=y[k];A=L.call(S,D),y.splice(k,1),k--}return A}),n.formatArgs.call(S,y),(S.log||n.log).apply(S,y)}return g.namespace=m,g.useColors=n.useColors(),g.color=n.selectColor(m),g.extend=r,g.destroy=n.destroy,Object.defineProperty(g,"enabled",{enumerable:!0,configurable:!1,get:()=>d!==null?d:(f!==n.namespaces&&(f=n.namespaces,h=n.enabled(m)),h),set:y=>{d=y}}),typeof n.init=="function"&&n.init(g),g}function r(m,u){let d=n(this.namespace+(typeof u>"u"?":":u)+m);return d.log=this.log,d}function o(m){n.save(m),n.namespaces=m,n.names=[],n.skips=[];let u=(typeof m=="string"?m:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let d of u)d[0]==="-"?n.skips.push(d.slice(1)):n.names.push(d)}function a(m,u){let d=0,f=0,h=-1,g=0;for(;d<m.length;)if(f<u.length&&(u[f]===m[d]||u[f]==="*"))u[f]==="*"?(h=f,g=d,f++):(d++,f++);else if(h!==-1)f=h+1,g++,d=g;else return!1;for(;f<u.length&&u[f]==="*";)f++;return f===u.length}function s(){let m=[...n.names,...n.skips.map(u=>"-"+u)].join(",");return n.enable(""),m}function i(m){for(let u of n.skips)if(a(m,u))return!1;for(let u of n.names)if(a(m,u))return!0;return!1}function c(m){return m instanceof Error?m.stack||m.message:m}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}Zi.exports=Lh});var Qi=yr((Ye,co)=>{Ye.formatArgs=Oh;Ye.save=jh;Ye.load=Fh;Ye.useColors=Nh;Ye.storage=Vh();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 Nh(){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 Oh(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+co.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 jh(e){try{e?Ye.storage.setItem("debug",e):Ye.storage.removeItem("debug")}catch{}}function Fh(){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 Vh(){try{return localStorage}catch{}}co.exports=ja()(Ye);var{formatters:zh}=co.exports;zh.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var tc=yr((xe,mo)=>{var Hh=Oa("tty"),lo=Oa("util");xe.init=Yh;xe.log=Bh;xe.formatArgs=Kh;xe.save=Wh;xe.load=Jh;xe.useColors=qh;xe.destroy=lo.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");xe.colors=[6,2,3,4,5,1];try{let e=Oa("supports-color");e&&(e.stderr||e).level>=2&&(xe.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{}xe.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 qh(){return"colors"in xe.inspectOpts?!!xe.inspectOpts.colors:Hh.isatty(process.stderr.fd)}function Kh(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+"+
|
|
6
|
-
`)}function
|
|
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
|
-
`)}
|
|
9
|
-
`)}function
|
|
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(`
|
|
5
|
+
`+a),e.push(o+"m+"+mo.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=Gh()+t+" "+e[0]}function Gh(){return xe.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Bh(...e){return process.stderr.write(lo.formatWithOptions(xe.inspectOpts,...e)+`
|
|
6
|
+
`)}function Wh(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function Jh(){return process.env.DEBUG}function Yh(e){e.inspectOpts={};let t=Object.keys(xe.inspectOpts);for(let n=0;n<t.length;n++)e.inspectOpts[t[n]]=xe.inspectOpts[t[n]]}mo.exports=ja()(xe);var{formatters:ec}=mo.exports;ec.o=function(e){return this.inspectOpts.colors=this.useColors,lo.inspect(e,this.inspectOpts).split(`
|
|
7
|
+
`).map(t=>t.trim()).join(" ")};ec.O=function(e){return this.inspectOpts.colors=this.useColors,lo.inspect(e,this.inspectOpts)}});var nc=yr((RR,Fa)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Fa.exports=Qi():Fa.exports=tc()});import{once as dR}from"events";import{readFileSync as fR}from"fs";import{dirname as gR,join as hR}from"path";import{fileURLToPath as yR}from"url";import{ZodError as gk}from"zod";import rr from"chalk";var Gc=Ph(nc(),1);import{ofetch as vy}from"ofetch";function rc(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 Pe}from"zod";import{z as pe}from"zod";import{z as Yt}from"zod";import{z as q}from"zod";import{z as w}from"zod";import{z as R}from"zod";import{z as Ut}from"zod";import{anvil as _c,base as Sc,mainnet as kc}from"viem/chains";import{z as M}from"zod";import{z as we}from"zod";import{z as Ae}from"zod";import{z as Tn}from"zod";import{z as Mn}from"zod";import{z as x}from"zod";import{z as ne}from"zod";import{z as F}from"zod";import Vb from"crypto";import{z as lt}from"zod";import{z as ft}from"zod";import{z as Le}from"zod";import{z as Ne}from"zod";import{z as Oe}from"zod";import{z as wv}from"zod";import{z as Dn}from"zod";import{z as at}from"zod";import{z as Ic}from"zod";import{z as _t}from"zod";import{z as St}from"zod";import{z as Ge}from"zod";import{z as Ec}from"zod";import{z as Sr}from"zod";import{z as Fn}from"zod";import{z as dn}from"zod";import{z as ie}from"zod";import{z as uC}from"zod";import{z as fC}from"zod";import{z as ae}from"zod";import{z as Ct}from"zod";import{z as RC}from"zod";import{z as Ce}from"zod";import{z as N}from"zod";import{z as Lt}from"zod";import{z as Ya}from"zod";import{z as $e}from"zod";import{z as Ul}from"zod";import{z as bt}from"zod";import{z as Xe}from"zod";import{z as Xt}from"zod";import{z as Xa}from"zod";import{z as ts}from"zod";import{z as un}from"zod";import{z as Ue}from"zod";import{z as ue}from"zod";import{z}from"zod";import{z as ge}from"zod";import{z as Y}from"zod";import{z as ke}from"zod";import{createPublicClient as xc,createWalletClient as Uw,http as Za,parseEventLogs as Lw,parseEther as Pc}from"viem";import{privateKeyToAccount as Nw}from"viem/accounts";import{x25519 as Va}from"@noble/curves/ed25519";function Xh(e){return e=e.startsWith("0x")?e.slice(2):e,new Uint8Array(e.match(/.{1,2}/g)?.map(t=>parseInt(t,16))??[])}function Zh(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function qe(e,t){let n=JSON.stringify({env:e}),r=Va.utils.randomPrivateKey(),o=Va.getPublicKey(r),a=Xh(t),s=Va.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)),m=new Uint8Array(o.length+c.length+l.byteLength);return m.set(o),m.set(c,o.length),m.set(new Uint8Array(l),o.length+c.length),Zh(m)}import{keccak256 as Ow,toBytes as go,toHex as jw}from"viem";import{isHex as $c}from"viem";import{createPublicClient as iP,createWalletClient as cP,http as lP,custom as mP}from"viem";import{privateKeyToAccount as uP}from"viem/accounts";import{z as he}from"zod";import{createPublicClient as Tc,createWalletClient as Yw,http as Qa,parseEventLogs as Xw,parseEther as Mc}from"viem";import{privateKeyToAccount as Zw}from"viem/accounts";import{z as ye}from"zod";import{createPublicClient as Dc,createWalletClient as r_,http as Uc,parseEther as Lc}from"viem";import{privateKeyToAccount as o_}from"viem/accounts";import{z as be}from"zod";import{createPublicClient as Nc,createWalletClient as c_,http as Oc,parseEther as jc}from"viem";import{privateKeyToAccount as l_}from"viem/accounts";import{z as ve}from"zod";import{createPublicClient as Fc,createWalletClient as d_,http as Vc,parseEther as zc}from"viem";import{privateKeyToAccount as f_}from"viem/accounts";import{z as Un}from"zod";import{createPublicClient as b_,http as v_}from"viem";import{createPublicClient as xP,http as PP}from"viem";import{createPublicClient as TP,http as MP}from"viem";import{createPublicClient as C_,http as w_}from"viem";import{z as Ln}from"zod";import{z as gt}from"zod";import{z as Hc}from"zod";import{z as Nn}from"zod";import{z as W}from"zod";import{z as bo}from"zod";import{z as Vn}from"zod";import{z as ot}from"zod";import{z as Ie}from"zod";import{z as se}from"zod";import{z as Cr}from"zod";import{z as H_}from"zod";import{z as De}from"zod";import{z as On}from"zod";import{z as je}from"zod";import{z as rt}from"zod";import{z as qc}from"zod";import{z as kr}from"zod";import{z as vt}from"zod";import{z as Ee}from"zod";import{z as ho}from"zod";import{z as yo}from"zod";import{z as Ke}from"zod";import{z as K}from"zod";function Qh(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array"}function za(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("positive integer expected, got "+e)}function br(e,...t){if(!Qh(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 Ha(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 oc(e,t){br(e);let n=t.outputLen;if(e.length<n)throw new Error("digestInto() expects output buffer of length at least "+n)}function ac(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function qa(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}var ey=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function ty(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function ny(e){for(let t=0;t<e.length;t++)e[t]=ty(e[t]);return e}var Ka=ey?e=>e:ny;function ry(e){if(typeof e!="string")throw new Error("string expected");return new Uint8Array(new TextEncoder().encode(e))}function Ga(e){return typeof e=="string"&&(e=ry(e)),br(e),e}var po=class{};function sc(e){let t=r=>e().update(Ga(r)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}var uo=BigInt(4294967295),ic=BigInt(32);function oy(e,t=!1){return t?{h:Number(e&uo),l:Number(e>>ic&uo)}:{h:Number(e>>ic&uo)|0,l:Number(e&uo)|0}}function cc(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}=oy(e[a],t);[r[a],o[a]]=[s,i]}return[r,o]}var lc=(e,t,n)=>e<<n|t>>>32-n,mc=(e,t,n)=>t<<n|e>>>32-n,pc=(e,t,n)=>t<<n-32|e>>>64-n,uc=(e,t,n)=>e<<n-32|t>>>64-n;var ay=BigInt(0),vr=BigInt(1),sy=BigInt(2),iy=BigInt(7),cy=BigInt(256),ly=BigInt(113),gc=[],hc=[],yc=[];for(let e=0,t=vr,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],gc.push(2*(5*r+n)),hc.push((e+1)*(e+2)/2%64);let o=ay;for(let a=0;a<7;a++)t=(t<<vr^(t>>iy)*ly)%cy,t&sy&&(o^=vr<<(vr<<BigInt(a))-vr);yc.push(o)}var bc=cc(yc,!0),my=bc[0],py=bc[1],dc=(e,t,n)=>n>32?pc(e,t,n):lc(e,t,n),fc=(e,t,n)=>n>32?uc(e,t,n):mc(e,t,n);function uy(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],m=n[c+1],u=dc(l,m,1)^n[i],d=fc(l,m,1)^n[i+1];for(let f=0;f<50;f+=10)e[s+f]^=u,e[s+f+1]^=d}let o=e[2],a=e[3];for(let s=0;s<24;s++){let i=hc[s],c=dc(o,a,i),l=fc(o,a,i),m=gc[s];o=e[m],a=e[m+1],e[m]=c,e[m+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]^=my[r],e[1]^=py[r]}qa(n)}var Ba=class e extends po{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,za(r),!(0<t&&t<200))throw new Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=ac(this.state)}clone(){return this._cloneInto()}keccak(){Ka(this.state32),uy(this.state32,this.rounds),Ka(this.state32),this.posOut=0,this.pos=0}update(t){Ha(this),t=Ga(t),br(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){Ha(this,!1),br(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 za(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(oc(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,qa(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}},dy=(e,t,n)=>sc(()=>new Ba(t,e,n));var vc=dy(1,136,256/8);import{secp256k1 as fy}from"@noble/curves/secp256k1";function gy(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 hy(e){return Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function yy(...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 by(e,t){try{let n=t.slice(0,64),r=t[64],o=fy.Signature.fromCompact(n).addRecoveryBit(r).recoverPublicKey(e);return"0x"+hy(o.toRawBytes(!0))}catch(n){return console.error("signature verification failed:",n),null}}function Wa(e,t,n){if(t.length!==65)return null;let r=gy(n);if(!r)return null;let o=new TextEncoder().encode("dstack-env-encrypt-pubkey"),a=new TextEncoder().encode(":"),s=yy(o,a,r,e);return by(vc(s),t)}var Cy=Pe.object({detail:Pe.union([Pe.string(),Pe.array(Pe.object({msg:Pe.string(),type:Pe.string().optional(),ctx:Pe.record(Pe.unknown()).optional(),loc:Pe.array(Pe.union([Pe.string(),Pe.number()])).optional(),input:Pe.unknown().optional()}).passthrough()),Pe.record(Pe.unknown())]).optional(),type:Pe.string().optional(),code:Pe.string().optional()});function wy(e){if(!e||typeof e!="object")return;let t=e.request_id;return typeof t=="string"?t:void 0}function _y(e){return e?.headers?.get("X-Request-ID")??void 0}function Cc(e){if(typeof e!="string")return;let t=e.trim().toUpperCase();return t.length>0?t:void 0}var Ze=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)}},_r=class wr extends Ze{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=wy(t.data),r=_y(t.response),o=n??r,a=Cc(t.options?.method),s=Cy.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 wr(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 wr(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 wr(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 wr(t.message,{request:n??void 0,requestMethod:Cc(r),detail:t.message})}},Sy=class extends Ze{constructor(e,t){super(e,t),this.isValidationError=!0,this.validationErrors=t.validationErrors}},ky=class extends Ze{constructor(){super(...arguments),this.isAuthError=!0}},vo=class extends Ze{constructor(){super(...arguments),this.isBusinessError=!0}},Iy=class extends Ze{constructor(){super(...arguments),this.isServerError=!0}},Ey=class extends Ze{constructor(){super(...arguments),this.isUnknownError=!0}};function Ay(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 Bc(e){if(!Array.isArray(e))return{errors:[],message:typeof e=="string"?e:"Validation error"};let t=e.map((o,a)=>{let s=Ay(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 Ry(e){return e===422?"validation":e===401||e===403?"auth":e>=400&&e<500?"business":e>=500?"server":"unknown"}function xy(e,t,n){if(e===422&&Array.isArray(t)){let{message:r}=Bc(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 Py(e){let t=e.status??0,n=e.statusText??"Unknown Error",r=e.detail,o=Ty(r);if(o)return new It(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=Ry(t),s=xy(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}=Bc(r);return new Sy(s,{...i,validationErrors:c})}return a==="auth"?new ky(s,i):a==="business"?new vo(s,i):a==="server"?new Iy(s,i):new Ey(s,i)}function $y(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 It=class extends vo{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 Ty(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 Wc(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}: ${$y(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(`
|
|
8
|
+
`)}var fn=["2025-10-28","2026-01-21","2026-05-22","2026-06-23"],My="2026-06-23",$n=(0,Gc.default)("phala::api-client");function Dy(e){return Object.entries(e).map(([t,n])=>` -H "${t}: ${n}"`).join(`
|
|
9
|
+
`)}function Uy(e){return e?` -d '${(typeof e=="string"?e:JSON.stringify(e,null,2)).replace(/'/g,"\\'")}'`:""}function wc(e,t,n,r){let o=[];n.forEach((i,c)=>{o.push(`${c}: ${i}`)});let a=o.join(`
|
|
12
10
|
`),s=typeof r=="string"?r:JSON.stringify(r,null,2);return[`< HTTP/1.1 ${e} ${t}`,a?`< ${a.replace(/\n/g,`
|
|
13
11
|
< `)}`:"","",s].filter(Boolean).join(`
|
|
14
|
-
`)}var
|
|
15
|
-
`)
|
|
12
|
+
`)}var Ly=class Jc{constructor(t={}){this.emitter=rc();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&&fn.includes(t.version)?t.version:My;this.config={...t,apiKey:n,baseURL:r,version:o};let{apiKey:a,baseURL:s,timeout:i,headers:c,useCookieAuth:l,onResponseError:m,...u}=this.config,d={"X-Phala-Version":o,"Content-Type":"application/json"};c&&typeof c=="object"&&Object.entries(c).forEach(([f,h])=>{typeof h=="string"&&(d[f]=h)}),!l&&a&&(d["X-API-Key"]=a),this.fetchInstance=vy.create({baseURL:s,timeout:i||6e4,headers:d,...l?{credentials:"include"}:{},...u,onRequest({request:f,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($n.enabled){let g=h.method||"GET",y=typeof f=="string"?f:f.url,S=y.startsWith("http")?y:`${s}${y}`,_={};h.headers&&typeof h.headers=="object"&&Object.entries(h.headers).forEach(([k,v])=>{typeof v=="string"&&(_[k]=v)});let I=[`> curl -X ${g} "${S}"`,Dy(_),h.body?Uy(h.body):""].filter(Boolean).join(`
|
|
13
|
+
`);$n(`
|
|
16
14
|
=== REQUEST ===
|
|
17
15
|
%s
|
|
18
|
-
`,
|
|
16
|
+
`,I)}},onResponse({request:f,response:h,options:g}){if($n.enabled){let y=g.method||"GET",S=typeof f=="string"?f:f.url;$n(`
|
|
19
17
|
=== RESPONSE [%s %s] (%dms) ===
|
|
20
18
|
%s
|
|
21
|
-
`,y,
|
|
19
|
+
`,y,S,h.headers.get("x-response-time")||"?",wc(h.status,h.statusText,h.headers,h._data))}},onResponseError:({request:f,response:h,options:g})=>{if($n.enabled){console.warn(`HTTP ${h.status}: ${h.url}`);let y=g.method||"GET",S=typeof f=="string"?f:f.url;$n(`
|
|
22
20
|
=== ERROR RESPONSE [%s %s] ===
|
|
23
21
|
%s
|
|
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=
|
|
26
|
-
`),a=a.replace(/\\r/g,"\r")),t[o]=a}return t}function
|
|
22
|
+
`,y,S,wc(h.status,h.statusText,h.headers,h._data))}m&&m({request:f,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?_r.fromFetchError(t):t instanceof Error?_r.fromError(t):new _r("Unknown error occurred",{detail:"Unknown error occurred"})}emitError(t){let n=Py(t);return this.emitter.emit("error",n),n}async safeRequest(t){try{return{success:!0,data:await t()}}catch(n){if(n instanceof Ze)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 Jc({...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 Ny(e={}){return new Ly(e)}var Oy=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(),jy=pe.object({id:pe.string(),name:pe.string(),slug:pe.string().nullable(),tier:pe.string(),role:pe.string(),avatar:pe.string().nullable().optional()}).passthrough(),Fy=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(),Vy=pe.object({user:Oy,workspace:jy,credits:Fy}).passthrough(),zy=Yt.object({username:Yt.string(),email:Yt.string(),credits:Yt.number(),granted_credits:Yt.number(),avatar:Yt.string(),team_name:Yt.string(),team_tier:Yt.string()}).passthrough();function Hy(e){return e==="2025-10-28"?zy:Vy}async function Yc(e,t){let n=await e.get("/auth/me");return t?.schema===!1?n:(t?.schema||Hy(e.config.version)).parse(n)}async function Qe(e,t){try{return{success:!0,data:await Yc(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 Et={[kc.id]:kc,[Sc.id]:Sc,[_c.id]:_c},qy=Ut.object({id:Ut.string(),slug:Ut.string().nullable(),url:Ut.string(),version:Ut.string(),chain_id:Ut.number().nullable(),kms_contract_address:Ut.string().nullable().transform(e=>e),gateway_app_id:Ut.string().nullable().transform(e=>e),k256_pubkey:Ut.string().nullable().optional()}).passthrough(),mt=qy.transform(e=>{if(e.chain_id!=null){let t=Et[e.chain_id];if(t)return{...e,chain:t}}return e}),Xc=R.union([R.number(),R.string()]),Ky=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()}),Gy=R.object({id:Xc,username:R.string()}),Zc=R.object({id:R.number(),name:R.string(),region_identifier:R.string().nullable().optional()}),ns=R.object({vcpu:R.number(),memory:R.number(),disk_size:R.number(),gpu_count:R.number().default(0)}),rs=R.object({app:R.string(),instance:R.string()}),Qc=R.object({hosted:Ky,name:R.string(),managed_user:Gy.nullable(),node:Zc.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(rs),machine_info:ns.nullable().optional(),updated_at:R.string().nullable().optional()}),el=R.object({id:Xc,name:R.string(),status:R.string(),in_progress:R.boolean().optional().default(!1),teepod_id:R.number().nullable(),teepod:Zc.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),managed_env: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(rs).optional().default([]),gateway_domain:R.string().optional().nullable(),machine_info:ns.optional().nullable(),updated_at:R.string().optional().nullable()}),By=R.object({items:R.array(Qc),total:R.number(),page:R.number(),page_size:R.number(),pages:R.number()}),Wy=w.enum(["skip","hourly","monthly"]),Jy=w.enum(["phala","ethereum","base","legacy"]),os=w.object({object_type:w.literal("user"),id:w.string().nullable().optional(),username:w.string().nullable().optional(),avatar_url:w.string().nullable().optional()}),as=w.object({object_type:w.literal("workspace"),id:w.string(),name:w.string(),slug:w.string().nullable().optional(),avatar_url:w.string().nullable().optional()}),Yy=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:Wy.nullable().optional()}),Xy=w.object({total:w.string().nullable().optional(),compute:w.string().nullable().optional(),disk:w.string().nullable().optional()}),Zy=w.object({order_id:w.string(),status:w.string(),pricing_plan:w.string().nullable().optional(),commitment_days:w.number().int().nullable().optional(),auto_renew:w.boolean().optional().default(!1),expires_at:w.string().nullable().optional(),renewal_in_progress:w.boolean().optional().default(!1),renewal_next_attempt_at:w.string().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()}),Qy=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()}),eb=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()}),tb=eb.transform(e=>{if(e.chain_id!=null){let t=Et[e.chain_id];if(t)return{...e,chain:t}}return e}),nb=w.object({target:w.string().nullable().optional(),started_at:w.string().nullable().optional(),correlation_id:w.string().nullable().optional()}),rb=w.object({base_domain:w.string().nullable().optional(),cname:w.string().nullable().optional()}),ob=w.object({serial:w.string().nullable().optional(),stdout:w.string().nullable().optional(),stderr:w.string().nullable().optional(),container_log_base:w.string().nullable().optional()}),tl=w.object({device_id:w.string(),algorithm_version:w.string(),enabled:w.boolean()}),nl=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(tl).default([]),ppid:w.string().nullable().optional(),status:w.string().nullable().optional(),version:w.string().nullable().optional()});var zn=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:Yy,node_info:nl.nullable().optional(),os:Qy.nullable().optional(),kms_type:Jy.nullable().optional(),kms_info:tb.nullable().optional(),status:w.string(),in_progress:w.boolean().optional().default(!1),progress:nb.nullable().optional(),compose_hash:w.string().nullable().optional(),docker_compose_hash:w.string().nullable().optional(),pre_launch_script_hash:w.string().nullable().optional(),gateway:rb,logs:ob.optional().default({}),services:w.array(w.record(w.any())).optional().default([]),endpoints:w.array(rs).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(),managed_env:w.boolean().optional().default(!1),listed:w.boolean().optional().default(!1),storage_fs:w.string().optional(),workspace:as.nullable().optional(),creator:os.nullable().optional(),created_at:w.string().nullable().optional(),deleted_at:w.string().nullable().optional(),project_type:w.string().nullable().optional(),hourly_rate:Xy.nullable().optional(),billing_interval:w.string().nullable().optional(),gpu_rental_order:Zy.nullable().optional()}),Ir=zn.extend({id:w.string()}),ab=zn.extend({compose_file:w.union([w.record(w.any()),w.string()]).nullable().optional()}),sb=Ir.extend({compose_file:w.union([w.record(w.any()),w.string()]).nullable().optional()}),rl=w.object({items:w.array(zn),total:w.number(),page:w.number(),page_size:w.number(),pages:w.number()}),ib=rl.extend({items:w.array(Ir)});function ol(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 al(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 ss(e,t){function n(s,i){return r(s,i)}async function r(s,i){ol(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=al(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 U(e,t){function n(s,...i){let[c,l]=i;return r(s,c,l)}async function r(s,i,c){ol(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=al(c);if(l)return l;let m=await(async()=>{try{return{success:!0,data:await t(s,i)}}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?c?.schema===!1?{success:!0,data:m.data}:(c?.schema||e).safeParse(m.data):m}return{action:n,safeAction:o}}var cb=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(),sl=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(cb),support_onchain_kms:q.boolean().optional(),fmspc:q.string().nullable().optional(),device_id:q.string().nullable().optional(),device_ids:q.array(tl).default([]),region_identifier:q.string().nullable().optional(),default_kms:q.string().nullable().optional(),kms_list:q.array(q.string()).default([])}).passthrough(),il=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(),lb=q.object({tier:q.string(),capacity:il,nodes:q.array(sl),kms_list:q.array(mt)}).passthrough(),{action:mb,safeAction:Nt}=ss(lb,async e=>await e.get("/teepods/available")),Hn=M.union([M.number(),M.string()]),qn=M.string(),pb=M.object({has_reserved_gpus:M.boolean(),reserved_gpu_count:M.number(),has_public_gpus:M.boolean(),public_gpu_count:M.number()}).passthrough(),cl=M.object({id:Hn,slug:M.string().nullable().optional(),url:M.string(),version:M.string().nullable().optional(),kms_type:M.string(),chain_id:M.number().nullable().optional(),kms_contract_id:Hn.nullable().optional(),kms_contract_address:M.string().nullable().optional(),gateway_app_id:M.string().nullable().optional(),supported_os_images:M.array(M.string()).default([])}).passthrough(),ll=M.object({teepod_id:M.number(),kms_id:Hn,kms_type:M.string(),kms_contract_id:Hn.nullable().optional(),kms_contract_address:M.string().nullable().optional(),supported_os_images:M.array(M.string()).default([])}).passthrough(),ml=M.object({id:Hn,teepod_id:M.number().nullable().optional(),kms_contract_id:Hn,rpc_url:M.string().nullable().optional(),domain_suffix:M.string().nullable().optional(),enabled:M.boolean()}).passthrough(),ub=cl.extend({id:qn,kms_contract_id:qn.nullable().optional()}),db=ll.extend({kms_id:qn,kms_contract_id:qn.nullable().optional()}),fb=ml.extend({id:qn,kms_contract_id:qn}),gb=M.object({id:M.string(),name:M.string(),vcpu:M.number(),memory_mb:M.number(),default_disk_size_gb:M.number(),requires_gpu:M.boolean(),requires_gpu_count:M.number(),family:M.string().nullable().optional(),display_order:M.number().nullable().optional()}).passthrough(),pl=M.object({tier:M.string(),capacity:il,nodes:M.array(sl),kms_nodes:M.array(cl),node_kms_relations:M.array(ll),gateway_nodes:M.array(ml),instance_types:M.array(gb),gpu_availability:pb}).passthrough(),hb=pl.extend({kms_nodes:M.array(ub),node_kms_relations:M.array(db),gateway_nodes:M.array(fb)});function ul(e){return e==="2026-01-21"?pl:hb}async function yb(e,t){let n=await e.get("/teepods/cvm-create-resources");return t?.schema===!1?n:(t?.schema||ul(e.config.version)).parse(n)}async function bb(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||ul(e.config.version)).parse(n)}}catch(n){return{success:!1,error:n}}}var dl=we.object({id:we.string(),name:we.string(),description:we.string(),vcpu:we.number(),memory_mb:we.number(),hourly_rate:we.string(),requires_gpu:we.boolean(),default_disk_size_gb:we.number().default(20),family:we.string().nullable()}).passthrough(),vb=we.object({name:we.string(),items:we.array(dl),total:we.number()}).strict(),Cb=we.object({result:we.array(vb)}).strict(),wb=we.object({items:we.array(dl),total:we.number(),family:we.string()}).strict(),_b=we.object({family:we.string()}).strict(),{action:is,safeAction:Sb}=U(Cb,async e=>await e.get("/instance-types")),{action:cs,safeAction:kb}=U(wb,async(e,t)=>{let n=_b.parse(t);return await e.get(`/instance-types/${n.family}`)}),fl=Ae.object({id:Ae.string(),name:Ae.string(),slug:Ae.string().nullable(),avatar_url:Ae.string().nullable().optional(),description: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(),Ib=Ae.object({has_more:Ae.boolean(),next_cursor:Ae.string().nullable(),total:Ae.number().nullable()}).passthrough(),Eb=Ae.object({data:Ae.array(fl),pagination:Ib}).passthrough(),{action:Ab,safeAction:Rb}=U(Eb,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:xb,safeAction:Pb}=U(fl,async(e,t)=>await e.get(`/workspaces/${t}`));function Kn(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 gl(e){if(typeof e!="string")return fo();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)||!Kn(t)?fo():t}function fo(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,6);return`dstack-app-${e}-${t}`}var ze=Tn.object({id:Tn.string().optional(),uuid:Tn.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:Tn.string().optional(),instance_id:Tn.string().optional(),name:Tn.string().refine(Kn,{message:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens"}).optional()}),et=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"}),$b=et(ze),H=$b.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}}),Tb=H;function Mb(e){return e==="2025-10-28"?el:e==="2026-01-21"?ab:sb}async function hl(e,t){let{cvmId:n}=Tb.parse(t),r=await e.get(`/cvms/${n}`);return Mb(e.config.version).parse(r)}async function G(e,t){try{return{success:!0,data:await hl(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 Db=Mn.object({page:Mn.number().int().min(1).optional(),page_size:Mn.number().int().min(1).optional(),family:Mn.enum(["all","cpu","gpu"]).optional(),instance_types:Mn.array(Mn.string()).optional()}).strict();function Ub(e){return e==="2025-10-28"?By:e==="2026-01-21"?rl:ib}async function yl(e,t){let n=Db.parse(t??{}),r=await e.get("/cvms/paginated",{params:n});return Ub(e.config.version).parse(r)}async function Ar(e,t){try{return{success:!0,data:await yl(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 Er=200*1024;function bl(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>Er){let i=Er/1024,c=Math.ceil(s/1024);n.addIssue({code:ne.ZodIssueCode.custom,message:`Combined size of docker_compose_file and pre_launch_script must not exceed ${i}KB (current: ${c}KB)`})}}var vl=ne.object({allowed_envs:ne.array(ne.string()).optional(),docker_compose_file:ne.string(),features:ne.array(ne.string()).optional(),name:ne.string().optional(),manifest_version:ne.number().optional(),runner:ne.string().optional(),kms_enabled:ne.boolean().optional(),gateway_enabled:ne.boolean().optional(),tproxy_enabled:ne.boolean().optional(),local_key_provider_enabled:ne.boolean().optional(),key_provider:ne.enum(["none","kms","local","tpm"]).optional(),key_provider_id:ne.string().optional(),public_logs:ne.boolean().optional(),public_sysinfo:ne.boolean().optional(),public_tcbinfo:ne.boolean().optional(),no_instance_id:ne.boolean().optional(),secure_time:ne.boolean().optional(),port_policy:ne.object({ports:ne.array(ne.object({port:ne.number().int().min(1).max(65535),pp:ne.boolean()})),restrict_mode:ne.boolean()}).optional(),storage_fs:ne.enum(["ext4","zfs"]).optional(),swap_size:ne.string().optional(),pre_launch_script:ne.string().optional(),env_pubkey:ne.string().optional(),salt:ne.string().optional().nullable()}).passthrough().superRefine((e,t)=>{bl(e.docker_compose_file,e.pre_launch_script,t)}),Lb=x.object({app_id:x.string().nullable().optional(),app_env_encrypt_pubkey:x.string().nullable().optional(),compose_hash:x.string(),kms_info:mt.nullable().optional(),fmspc:x.string().nullable().optional(),device_id:x.string().nullable().optional(),os_image_hash:x.string().nullable().optional(),instance_type:x.string().nullable().optional(),teepod_id:x.number().nullable().optional(),node_id:x.number().nullable().optional(),kms_id:x.string().nullable().optional(),kms_contract_id:x.union([x.string(),x.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}),Ja="Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens",Nb=x.object({node_id:x.number().optional(),teepod_id:x.number().optional(),region:x.string().optional(),name:x.string().min(5,Ja).max(63,Ja).refine(e=>Kn(e),Ja),instance_type:x.string().optional(),image:x.string().optional(),vcpu:x.number().optional(),memory:x.number().optional(),disk_size:x.number().optional(),compose_file:x.object({allowed_envs:x.array(x.string()).optional(),pre_launch_script:x.string().optional(),docker_compose_file:x.string().optional(),name:x.string().optional().default(""),kms_enabled:x.boolean().optional(),gateway_enabled:x.boolean().optional(),tproxy_enabled:x.boolean().optional(),local_key_provider_enabled:x.boolean().optional(),key_provider:x.enum(["none","kms","local","tpm"]).optional(),key_provider_id:x.string().optional(),public_logs:x.boolean().optional(),public_sysinfo:x.boolean().optional(),public_tcbinfo:x.boolean().optional(),no_instance_id:x.boolean().optional(),secure_time:x.boolean().optional(),storage_fs:x.enum(["ext4","zfs"]).optional(),swap_size:x.string().optional(),port_policy:x.object({ports:x.array(x.object({port:x.number(),pp:x.boolean()})),restrict_mode:x.boolean()}).optional()}).passthrough().superRefine((e,t)=>{bl(e.docker_compose_file,e.pre_launch_script,t)}),listed:x.boolean().optional(),kms_id:x.string().optional(),kms:x.enum(["PHALA","ETHEREUM","BASE"]).optional(),kms_contract:x.string().optional(),kms_contract_id:x.union([x.string(),x.number()]).optional(),key_provider_mode:x.enum(["kms","local"]).optional(),skip_gateway:x.boolean().optional(),env_keys:x.array(x.string()).optional(),nonce:x.number().optional(),app_id:x.string().optional()}).passthrough().transform(e=>!e.instance_type&&!e.vcpu&&!e.memory?{...e,instance_type:"tdx.small"}:e);function Ob(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:jb,safeAction:ls}=U(Lb,async(e,t)=>{let n=Nb.parse(t),r=Ob(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)}),Cl=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(),wl=Cl.extend({id:F.number(),user_id:F.number().nullable()}),_l=Cl.extend({id:F.string(),user_id:F.string().nullable()}),cx=F.union([wl,_l]);var lx=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 Fb(e){return e==="2026-01-21"?wl:_l}async function Sl(e,t){let n=await e.post("/cvms",t);return Fb(e.config.version).parse(n)}async function Co(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)}}}}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 kl(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=es(e),n=JSON.stringify(t,null,4);return n=n.replace(/": /g,'":'),n}function zb(e){let t=kl(e),n=Il(t);return Vb.createHash("sha256").update(n,"utf8").digest("hex")}function Hb(e){let t=e;return{...e,getHash:()=>zb(t),toString:()=>Il(kl(t))}}var qb=vl.transform(e=>Hb(e)),Kb=H,{action:Gb,safeAction:Bb}=U(qb,async(e,t)=>{let{cvmId:n}=Kb.parse(t);return await e.get(`/cvms/${n}/compose_file`)}),Wb=lt.object({id:lt.string().optional(),uuid:lt.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:lt.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:lt.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:vl,update_env_vars:lt.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})),Jb=lt.object({app_id:lt.string().nullable(),device_id:lt.string().nullable(),compose_hash:lt.string(),kms_info:mt.nullable().optional(),compose_hash_registered:lt.boolean().optional().default(!1),compose_unchanged:lt.boolean().optional().default(!1)}).passthrough(),{action:Yb,safeAction:Xb}=U(Jb,async(e,t)=>{let n=Wb.parse(t);return await e.post(`/cvms/${n.cvmId}/compose_file/provision`,n.request)}),Zb=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})),Qb=ft.any().transform(()=>{}),{action:ev,safeAction:tv}=U(Qb,async(e,t)=>{let n=Zb.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})}),nv=et(ze.extend({encrypted_env:Le.string().describe("Encrypted environment variables (hex string)"),env_keys:Le.array(Le.string()).optional().describe("List of allowed environment variable keys"),compose_hash:Le.string().optional().describe("Compose hash for verification (Phase 2, required when env_keys changes)"),transaction_hash:Le.string().optional().describe("On-chain transaction hash for verification (Phase 2, required when env_keys changes)")})).transform(e=>{let{cvmId:t}=H.parse(e);return{cvmId:t,request:{encrypted_env:e.encrypted_env,env_keys:e.env_keys,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),rv=Le.object({status:Le.literal("in_progress"),message:Le.string(),correlation_id:Le.string(),allowed_envs_changed:Le.boolean()}),ov=Le.object({status:Le.literal("precondition_required"),message:Le.string(),compose_hash:Le.string(),app_id:Le.string(),device_id:Le.string(),kms_info:mt}),av=Le.union([rv,ov]),{action:sv,safeAction:wo}=U(av,async(e,t)=>{let n=nv.parse(t);try{return await e.patch(`/cvms/${n.cvmId}/envs`,n.request)}catch(r){if(r instanceof Ze&&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(d=>[d.field,d.value])),c=i.get("compose_hash"),l=i.get("app_id"),m=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:m||"",kms_info:u}}}}throw r}}),iv=et(ze.extend({docker_compose_file:Ne.string().describe("Docker Compose YAML content"),compose_hash:Ne.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:Ne.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=H.parse(e);return{cvmId:t,request:{docker_compose_file:e.docker_compose_file,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),cv=Ne.object({status:Ne.literal("in_progress"),message:Ne.string(),correlation_id:Ne.string()}),lv=Ne.object({status:Ne.literal("precondition_required"),message:Ne.string(),compose_hash:Ne.string(),app_id:Ne.string(),device_id:Ne.string(),kms_info:mt}),mv=Ne.object({status:Ne.literal("no_change"),message:Ne.string()}),pv=Ne.union([cv,lv,mv]),{action:uv,safeAction:dv}=U(pv,async(e,t)=>{let n=iv.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 Ze&&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(f=>[f.field,f.value])),l=c.get("compose_hash"),m=c.get("app_id"),u=c.get("device_id"),d=c.get("kms_info");if(l&&m)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:l,app_id:m,device_id:u||"",kms_info:d}}}}throw o}}),fv=et(ze.extend({pre_launch_script:Oe.string().describe("Pre-launch script content (shell script)"),compose_hash:Oe.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:Oe.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=H.parse(e);return{cvmId:t,request:{pre_launch_script:e.pre_launch_script,compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),gv=Oe.object({status:Oe.literal("in_progress"),message:Oe.string(),correlation_id:Oe.string()}),hv=Oe.object({status:Oe.literal("precondition_required"),message:Oe.string(),compose_hash:Oe.string(),app_id:Oe.string(),device_id:Oe.string(),kms_info:mt}),yv=Oe.object({status:Oe.literal("no_change"),message:Oe.string()}),bv=Oe.union([gv,hv,yv]),{action:vv,safeAction:Cv}=U(bv,async(e,t)=>{let n=fv.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 Ze&&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(f=>[f.field,f.value])),l=c.get("compose_hash"),m=c.get("app_id"),u=c.get("device_id"),d=c.get("kms_info");if(l&&m)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:l,app_id:m,device_id:u||"",kms_info:d}}}}throw o}}),_v=H,{action:Sv,safeAction:kv}=U(wv.string(),async(e,t)=>{let{cvmId:n}=_v.parse(t);return await e.get(`/cvms/${n}/pre-launch-script`)}),Iv=H,Ev=Dn.object({current_hash:Dn.string().nullable(),latest_official_hash:Dn.string(),is_official:Dn.boolean(),is_latest:Dn.boolean(),can_upgrade:Dn.boolean()}),{action:Av,safeAction:Rv}=U(Ev,async(e,t)=>{let{cvmId:n}=Iv.parse(t);return await e.get(`/cvms/${n}/pre-launch-script/upgrade-status`)}),xv=et(ze.extend({compose_hash:at.string().optional().describe("Compose hash for verification (Phase 2, contract-owned KMS only)"),transaction_hash:at.string().optional().describe("On-chain transaction hash for verification (Phase 2, contract-owned KMS only)")})).transform(e=>{let{cvmId:t}=H.parse(e);return{cvmId:t,request:{compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),Pv=at.object({status:at.literal("in_progress"),message:at.string(),correlation_id:at.string()}),$v=at.object({status:at.literal("precondition_required"),message:at.string(),compose_hash:at.string(),app_id:at.string(),device_id:at.string(),kms_info:mt}),Tv=at.union([Pv,$v]),{action:Mv,safeAction:Dv}=U(Tv,async(e,t)=>{let n=xv.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 Ze&&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(f=>[f.field,f.value])),l=c.get("compose_hash"),m=c.get("app_id"),u=c.get("device_id"),d=c.get("kms_info");if(l&&m)return{status:"precondition_required",message:s.message||"Compose hash verification required",compose_hash:l,app_id:m,device_id:u||"",kms_info:d}}}}throw o}}),Uv=Ic.object({kms_id:Ic.string().min(1,"KMS ID is required")}),{action:Lv,safeAction:Nv}=U(mt,async(e,t)=>{let n=Uv.parse(t);return await e.get(`/kms/${n.kms_id}`,{headers:{"X-Phala-Version":"2026-05-22"}})}),Ov=_t.object({page:_t.number().int().min(1).optional(),page_size:_t.number().int().min(1).optional(),is_onchain:_t.boolean().optional()}).strict(),jv=_t.object({items:_t.array(mt),total:_t.number(),page:_t.number(),page_size:_t.number(),pages:_t.number()}).strict(),{action:Fv,safeAction:Vv}=U(jv,async(e,t)=>{let n=Ov.parse(t??{});return await e.get("/kms",{params:n,headers:{"X-Phala-Version":"2026-05-22"}})}),El=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(),zv=Ge.object({id:Ge.string(),slug:Ge.string().nullable(),url:Ge.string(),version:Ge.string(),kms_type:Ge.string()}).passthrough(),Hv="2026-06-23",qv=St.object({page:St.number().int().min(1).optional(),page_size:St.number().int().min(1).optional(),is_onchain:St.boolean().optional()}).strict(),Kv=St.object({items:St.array(El),total:St.number(),page:St.number(),page_size:St.number(),pages:St.number()}).strict(),{action:Gv,safeAction:ms}=U(Kv,async(e,t)=>{let n=qv.parse(t??{});return await e.get("/kms",{params:n,headers:{"X-Phala-Version":Hv}})}),Bv="2026-06-23",Wv=Ec.object({slug:Ec.string().min(1,"KMS contract slug is required")}).strict(),{action:Jv,safeAction:ps}=U(El,async(e,t)=>{let{slug:n}=Wv.parse(t);return await e.get(`/kms/${n}`,{headers:{"X-Phala-Version":Bv}})}),Yv="2026-06-23",Xv=Sr.object({slug:Sr.string().min(1,"KMS contract slug is required")}).strict(),Zv=Sr.object({items:Sr.array(zv),total:Sr.number()}).strict(),{action:Qv,safeAction:us}=U(Zv,async(e,t)=>{let{slug:n}=Xv.parse(t);return await e.get(`/kms/${n}/nodes`,{headers:{"X-Phala-Version":Yv}})}),eC=Fn.object({kms:Fn.string().min(1,"KMS ID or slug is required"),app_id:Fn.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(),tC=Fn.object({public_key:Fn.string(),signature:Fn.string()}).strict(),{action:nC,safeAction:Rr}=U(tC,async(e,t)=>{let n=eC.parse(t);return await e.get(`/kms/${n.kms}/pubkey/${n.app_id}`)}),rC=dn.object({counts:dn.number().int().min(1).max(20).optional().default(1)}).strict(),oC=dn.object({app_ids:dn.array(dn.object({app_id:dn.string(),nonce:dn.number().int().min(0)}))}).strict(),{action:aC,safeAction:sC}=U(oC,async(e,t)=>{let n=rC.parse(t??{}),r=new URLSearchParams;return r.append("counts",n.counts.toString()),await e.get(`/kms/phala/next_app_id?${r.toString()}`)}),Al=ie.object({name:ie.string(),status:ie.string(),teepod_id:ie.number(),teepod:ie.object({id:ie.number(),name:ie.string(),region_identifier:ie.string().nullable().optional()}).optional().nullable(),app_id:ie.string(),vm_uuid:ie.string().nullable(),instance_id:ie.string().nullable(),app_url:ie.string().optional().nullable(),base_image:ie.string().optional().nullable(),vcpu:ie.number(),memory:ie.number(),disk_size:ie.number(),manifest_version:ie.number().optional().nullable(),version:ie.string().optional().nullable(),runner:ie.string().optional().nullable(),docker_compose_file:ie.string().optional().nullable(),features:ie.array(ie.string()).optional().nullable(),created_at:ie.string(),encrypted_env_pubkey:ie.string().nullable()}),Rl=Al.extend({id:ie.number(),user_id:ie.number().optional().nullable()}),ds=Al.extend({id:ie.string(),user_id:ie.string().optional().nullable()}),Rx=ie.union([Rl,ds]),iC=ds;function _o(e){return e==="2026-01-21"?Rl:ds}var cC=H;async function xl(e,t){let{cvmId:n}=cC.parse(t),r=await e.post(`/cvms/${n}/start`);return _o(e.config.version).parse(r)}async function fs(e,t){try{return{success:!0,data:await xl(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 lC=H;async function Pl(e,t){let{cvmId:n}=lC.parse(t),r=await e.post(`/cvms/${n}/stop`);return _o(e.config.version).parse(r)}async function gs(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 mC=H;async function $l(e,t){let{cvmId:n}=mC.parse(t),r=await e.post(`/cvms/${n}/shutdown`);return _o(e.config.version).parse(r)}async function pC(e,t){try{return{success:!0,data:await $l(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 dC=et(ze.extend({force:uC.boolean().optional()}));async function Tl(e,t){let n=dC.parse(t),{cvmId:r}=H.parse(n),{force:o=!1}=n,a=await e.post(`/cvms/${r}/restart`,{force:o});return _o(e.config.version).parse(a)}async function hs(e,t){try{return{success:!0,data:await Tl(e,t)}}catch(n){return n&&typeof n=="object"&&("status"in n||"issues"in n)?{success:!1,error:n}:{success:!1,error:{name:"Error",message:n instanceof Error?n.message:String(n)}}}}var gC=H,{action:hC,safeAction:xr}=U(fC.void(),async(e,t)=>{let{cvmId:n}=gC.parse(t);await e.delete(`/cvms/${n}`)}),yC=ae.object({name:ae.string(),mount_point:ae.string(),total_size:ae.number(),free_size:ae.number()}),bC=ae.object({os_name:ae.string(),os_version:ae.string(),kernel_version:ae.string(),cpu_model:ae.string(),num_cpus:ae.number(),total_memory:ae.number(),available_memory:ae.number(),used_memory:ae.number(),free_memory:ae.number(),total_swap:ae.number(),used_swap:ae.number(),free_swap:ae.number(),uptime:ae.number(),loadavg_one:ae.number(),loadavg_five:ae.number(),loadavg_fifteen:ae.number(),disks:ae.array(yC)}),vC=ae.object({is_online:ae.boolean(),is_public:ae.boolean().default(!1),error:ae.string().nullable(),sysinfo:bC.nullable(),status:ae.string().nullable(),in_progress:ae.boolean().default(!1),boot_progress:ae.string().nullable(),boot_error:ae.string().nullable()}),CC=H,{action:wC,safeAction:_C}=U(vC,async(e,t)=>{let{cvmId:n}=CC.parse(t);return await e.get(`/cvms/${n}/stats`)}),SC=Ct.object({app:Ct.string(),instance:Ct.string()}),kC=Ct.object({is_online:Ct.boolean(),is_public:Ct.boolean().default(!0),error:Ct.string().nullable(),internal_ip:Ct.string().nullable(),latest_handshake:Ct.string().nullable(),public_urls:Ct.array(SC).nullable()}),IC=H,{action:EC,safeAction:AC}=U(kC,async(e,t)=>{let{cvmId:n}=IC.parse(t);return await e.get(`/cvms/${n}/network`)}),xC=H,{action:PC,safeAction:$C}=U(RC.string(),async(e,t)=>{let{cvmId:n}=xC.parse(t);return await e.get(`/cvms/${n}/docker-compose.yml`)}),TC=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()}),MC=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(TC).nullable()}),DC=H,{action:UC,safeAction:ys}=U(MC,async(e,t)=>{let{cvmId:n}=DC.parse(t);return await e.get(`/cvms/${n}/composition`)}),LC=N.object({common_name:N.string().nullable(),organization:N.string().nullable(),country:N.string().nullable(),state:N.string().nullable(),locality:N.string().nullable()}),NC=N.object({common_name:N.string().nullable(),organization:N.string().nullable(),country:N.string().nullable()}),Ml=N.object({subject:LC,issuer:NC,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()}),OC=N.object({imr:N.number(),event_type:N.number(),digest:N.string(),event:N.string(),event_payload:N.string()}),Dl=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(OC),app_compose:N.string()}),jC=N.object({name:N.string().nullable(),is_online:N.boolean(),is_public:N.boolean().default(!0),error:N.string().nullable(),app_certificates:N.array(Ml).nullable(),tcb_info:Dl.nullable(),compose_file:N.string().nullable()}),FC=H,{action:VC,safeAction:zC}=U(jC,async(e,t)=>{let{cvmId:n}=FC.parse(t);return await e.get(`/cvms/${n}/attestation`)}),HC=et(ze.extend({vcpu:Lt.number().optional(),memory:Lt.number().optional(),disk_size:Lt.number().optional(),instance_type:Lt.string().optional(),allow_restart:Lt.boolean().optional()})),qC=Lt.object({message:Lt.string(),correlation_id:Lt.string(),status:Lt.string()}),{action:KC,safeAction:GC}=U(qC,async(e,t)=>{let n=HC.parse(t),{cvmId:r}=H.parse(n),{...o}=n;return await e.patch(`/cvms/${r}`,o)}),BC=et(ze.extend({public_sysinfo:Ya.boolean(),public_logs:Ya.boolean(),public_tcbinfo:Ya.boolean().optional()})),{action:WC,safeAction:JC}=U(el,async(e,t)=>{let n=BC.parse(t),{cvmId:r}=H.parse(n),{public_sysinfo:o,public_logs:a,public_tcbinfo:s}=n;return await e.patch(`/cvms/${r}/visibility`,{public_sysinfo:o,public_logs:a,public_tcbinfo:s})}),Ac=$e.object({name:$e.string(),slug:$e.string(),os_image_hash:$e.string().nullable(),is_current:$e.boolean(),enabled:$e.boolean()}),YC=$e.object({version:$e.union([$e.tuple([$e.number(),$e.number(),$e.number(),$e.number()]),$e.tuple([$e.number(),$e.number(),$e.number()])]),prod:Ac.nullable(),dev:Ac.nullable()}),XC=$e.array(YC),ZC=H,{action:QC,safeAction:ew}=U(XC,async(e,t)=>{let{cvmId:n}=ZC.parse(t);return await e.get(`/cvms/${n}/available-os-images`)}),tw=et(ze.extend({os_image_name:Ul.string().min(1,"OS image name is required")})),{action:nw,safeAction:rw}=U(Ul.void(),async(e,t)=>{let n=tw.parse(t),{cvmId:r}=H.parse(n),{os_image_name:o}=n;await e.patch(`/cvms/${r}/os-image`,{os_image_name:o})}),ow=bt.object({id:bt.string().optional(),instance_id:bt.string().optional(),name:bt.string(),status:bt.string(),uptime:bt.string().optional(),exited_at:bt.string().optional(),boot_progress:bt.string().optional(),boot_error:bt.string().optional(),shutdown_progress:bt.string().optional()}),aw=H,{action:sw,safeAction:iw}=U(ow,async(e,t)=>{let{cvmId:n}=aw.parse(t);return await e.get(`/cvms/${n}/state`)}),Ll=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()}),cw=Xe.array(Ll);async function Nl(e){let t=await e.get("/user/ssh-keys");return cw.parse(t)}async function Pr(e){try{return{success:!0,data:await Nl(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 lw=Xt.object({github_username:Xt.string().min(1)}),mw=Xt.object({github_username:Xt.string(),keys_added:Xt.number().int(),keys_skipped:Xt.number().int(),errors:Xt.array(Xt.string()).default([])}),{action:pw,safeAction:bs}=U(mw,async(e,t)=>{let{github_username:n}=lw.parse(t);return await e.post("/user/ssh-keys/github-profile",{github_username:n})}),uw=Xa.object({name:Xa.string().min(1),public_key:Xa.string().min(1)}),{action:dw,safeAction:vs}=U(Ll,async(e,t)=>{let{name:n,public_key:r}=uw.parse(t);return await e.post("/user/ssh-keys",{name:n,public_key:r})}),fw=ts.object({keyId:ts.string().min(1)}),{action:gw,safeAction:Cs}=U(ts.void(),async(e,t)=>{let{keyId:n}=fw.parse(t);await e.delete(`/user/ssh-keys/${n}`)}),hw=un.object({synced_count:un.number().int(),keys_added:un.number().int(),keys_updated:un.number().int(),keys_removed:un.number().int(),errors:un.array(un.string()).default([])}),{action:yw,safeAction:bw}=ss(hw,async e=>await e.post("/user/ssh-keys/github-sync",{})),vw=Ue.object({name:Ue.string(),slug:Ue.string(),version:Ue.string(),os_image_hash:Ue.string().nullable(),is_dev:Ue.boolean(),requires_gpu:Ue.boolean()}).passthrough(),Cw=Ue.object({page:Ue.number().int().min(1).optional(),page_size:Ue.number().int().min(1).optional(),is_dev:Ue.boolean().optional()}).strict(),ww=Ue.object({items:Ue.array(vw),total:Ue.number(),page:Ue.number(),page_size:Ue.number(),pages:Ue.number()}).passthrough(),{action:_w,safeAction:ws}=U(ww,async(e,t)=>{let n=Cw.parse(t??{});return await e.get("/os-images",{params:n})}),Sw=ue.object({device_id:ue.string(),node_name:ue.string().nullable().optional(),on_chain_allowed:ue.boolean().nullable()}).passthrough(),kw=ue.object({name:ue.string(),version:ue.string(),os_image_hash:ue.string().nullable(),on_chain_allowed:ue.boolean().nullable()}).passthrough(),Iw=ue.object({contract_address:ue.string(),chain_id:ue.number(),chain_name:ue.string(),k256_pubkey:ue.string().nullable().optional(),ca_pubkey:ue.string().nullable().optional(),gateway_contract_address:ue.string().nullable().optional(),devices:ue.array(Sw),os_images:ue.array(kw)}).passthrough(),Ew=ue.object({chain_name:ue.string(),chain_id:ue.number(),contracts:ue.array(Iw)}).passthrough(),Aw=ue.object({chain:ue.string()}).strict(),{action:Rw,safeAction:_s}=U(Ew,async(e,t)=>{let{chain:n}=Aw.parse(t);return await e.get(`/kms/on-chain/${n}`)});function Ot(e={}){let t=Ny(e),n={getCurrentUser:Yc,safeGetCurrentUser:Qe,getAvailableNodes:mb,safeGetAvailableNodes:Nt,getCvmCreateResources:yb,safeGetCvmCreateResources:bb,listAllInstanceTypeFamilies:is,safeListAllInstanceTypeFamilies:Sb,listFamilyInstanceTypes:cs,safeListFamilyInstanceTypes:kb,listWorkspaces:Ab,safeListWorkspaces:Rb,getWorkspace:xb,safeGetWorkspace:Pb,getCvmInfo:hl,safeGetCvmInfo:G,getCvmList:yl,safeGetCvmList:Ar,provisionCvm:jb,safeProvisionCvm:ls,commitCvmProvision:Sl,safeCommitCvmProvision:Co,getCvmComposeFile:Gb,safeGetCvmComposeFile:Bb,provisionCvmComposeFileUpdate:Yb,safeProvisionCvmComposeFileUpdate:Xb,commitCvmComposeFileUpdate:ev,safeCommitCvmComposeFileUpdate:tv,updateCvmEnvs:sv,safeUpdateCvmEnvs:wo,updateDockerCompose:uv,safeUpdateDockerCompose:dv,updatePreLaunchScript:vv,safeUpdatePreLaunchScript:Cv,getCvmPreLaunchScript:Sv,safeGetCvmPreLaunchScript:kv,getPreLaunchScriptUpgradeStatus:Av,safeGetPreLaunchScriptUpgradeStatus:Rv,upgradePreLaunchScript:Mv,safeUpgradePreLaunchScript:Dv,startCvm:xl,safeStartCvm:fs,stopCvm:Pl,safeStopCvm:gs,shutdownCvm:$l,safeShutdownCvm:pC,restartCvm:Tl,safeRestartCvm:hs,deleteCvm:hC,safeDeleteCvm:xr,getCvmStats:wC,safeGetCvmStats:_C,getCvmNetwork:EC,safeGetCvmNetwork:AC,getCvmDockerCompose:PC,safeGetCvmDockerCompose:$C,getCvmContainersStats:UC,safeGetCvmContainersStats:ys,getCvmAttestation:VC,safeGetCvmAttestation:zC,updateCvmResources:KC,safeUpdateCvmResources:GC,updateCvmVisibility:WC,safeUpdateCvmVisibility:JC,getAvailableOsImages:QC,safeGetAvailableOsImages:ew,updateOsImage:nw,safeUpdateOsImage:rw,getKmsInfo:Lv,safeGetKmsInfo:Nv,getKmsList:Fv,safeGetKmsList:Vv,listKmsContracts:Gv,safeListKmsContracts:ms,getKmsContract:Jv,safeGetKmsContract:ps,listKmsContractNodes:Qv,safeListKmsContractNodes:us,getAppEnvEncryptPubKey:nC,safeGetAppEnvEncryptPubKey:Rr,nextAppIds:aC,safeNextAppIds:sC,getCvmState:sw,safeGetCvmState:iw,listSshKeys:Nl,safeListSshKeys:Pr,importGithubProfileSshKeys:pw,safeImportGithubProfileSshKeys:bs,createSshKey:dw,safeCreateSshKey:vs,deleteSshKey:gw,safeDeleteSshKey:Cs,syncGithubSshKeys:yw,safeSyncGithubSshKeys:bw,getOsImages:_w,safeGetOsImages:ws,getKmsOnChainDetail:Rw,safeGetKmsOnChainDetail:_s};return t.extend(n)}var Rc=z.object({vm_uuid:z.string().nullable(),app_id:z.string(),name:z.string().default(""),status:z.string(),vcpu:z.number().int(),memory:z.number().int(),disk_size:z.number().int(),teepod_id:z.number().int(),teepod_name:z.string(),region_identifier:z.string().nullable().optional(),kms_type:z.string().nullable().optional(),instance_type:z.string().nullable().optional(),listed:z.boolean().nullable().optional(),base_image:z.string().nullable().optional(),kms_slug:z.string().nullable().optional(),kms_id:z.string().nullable().optional(),kms_contract_id:z.string().nullable().optional(),instance_id:z.string().nullable().optional(),machine_info:ns.nullable().optional(),updated_at:z.string().nullable().optional()}),xw=z.object({display_name:z.string().nullable().optional(),avatar_url:z.string().nullable().optional(),description:z.string().nullable().optional(),custom_domain:z.string().nullable().optional()}),Pw=z.object({id:z.string(),name:z.string(),app_id:z.string(),app_provision_type:z.string().nullable().optional(),app_icon_url:z.string().nullable().optional(),created_at:z.string(),kms_type:z.string(),profile:xw.nullable().optional(),current_cvm:Rc.nullable().optional(),cvms:z.array(Rc).default([]),cvm_count:z.number().int().default(0)}),Ol=Pw,$w=z.object({dstack_apps:z.array(Ol),page:z.number().int(),page_size:z.number().int(),total:z.number().int(),total_pages:z.number().int()}),jl=ge.object({id:ge.string(),name:ge.string(),app_id:ge.string(),app_provision_type:ge.string().nullable().optional(),app_icon_url:ge.string().nullable().optional(),created_at:ge.string(),kms_type:ge.string(),profile:ge.object({display_name:ge.string().nullable().optional(),avatar_url:ge.string().nullable().optional(),description:ge.string().nullable().optional(),custom_domain:ge.string().nullable().optional()}).nullable().optional(),current_cvm:zn.nullable().optional(),cvms:ge.array(zn).default([]),cvm_count:ge.number().int().default(0)}),Tw=jl.extend({current_cvm:Ir.nullable().optional(),cvms:ge.array(Ir).default([])}),Fl=jl,Vl=Tw,zl=ge.object({dstack_apps:ge.array(Fl),page:ge.number().int(),page_size:ge.number().int(),total:ge.number().int(),total_pages:ge.number().int()}),Mw=zl.extend({dstack_apps:ge.array(Vl)}),Hl=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()}),Dw=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:os.nullable().optional(),cvm:Hl.nullable().optional(),workspace:as.nullable().optional()}),Xx=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:os.nullable().optional(),cvm:Hl.nullable().optional(),workspace:as.nullable().optional()}),Zx=Y.object({revisions:Y.array(Dw),total:Y.number().int(),page:Y.number().int(),page_size:Y.number().int(),total_pages:Y.number().int()}),Fw=48,Vw={none:0,local:1,kms:2,tpm:3};function ql(e){let t=go(e.compose_hash),n=go(e.app_id),r=Vw[e.key_provider_type],o=e.key_provider_id==="0x"?new Uint8Array(0):go(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=Ow(a),c=go(i),l=new Uint8Array(Fw);return l[0]=2,l.set(c,1),jw(l)}function ht(e){if(typeof e=="string"){if(e.startsWith("0x")&&$c(e))return e;if($c(`0x${e}`))return`0x${e}`}throw new Error(`Invalid hex value: ${e}`)}var Kl=class extends Error{constructor(e,t,n){super(e),this.code=t,this.details=n,this.name="NetworkError"}};var wt=class extends Error{constructor(e,t,n){super(e),this.hash=t,this.details=n,this.name="TransactionError"}};async function zw(e,t){try{let n=await e.walletClient.getChainId();return{isCorrectNetwork:n===t,currentChainId:n}}catch(n){throw new Kl(`Failed to check network status: ${n instanceof Error?n.message:"Unknown error"}`,"NETWORK_CHECK_FAILED",n)}}async function Hw(e,t,n){try{let r=await e.getBalance({address:t});return{address:t,balance:r,sufficient:n?r>=n:!0,required:n}}catch(r){throw new Kl(`Failed to check balance: ${r instanceof Error?r.message:"Unknown error"}`,"BALANCE_CHECK_FAILED",r)}}async function qw(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 m=await e.getTransactionReceipt({hash:t});if(m){if(a>1&&await e.getBlockNumber()-m.blockNumber+1n<BigInt(a)){if(Date.now()-s>=r){c(new wt(`Transaction confirmation timeout after ${r}ms`,t));return}setTimeout(l,o);return}i(m)}else{if(Date.now()-s>=r){c(new wt(`Transaction receipt timeout after ${r}ms`,t));return}setTimeout(l,o)}}catch(m){if(Date.now()-s>=r){c(new wt(`Transaction receipt timeout after ${r}ms`,t,m));return}setTimeout(l,o)}};l()})}async function $r(e,t){let{targetChainId:n,minBalance:r,requiredAddress:o}=t,a=await zw(e,n),s=await Hw(e.publicClient,e.address,r),i=o?e.address.toLowerCase()===o.toLowerCase():!0;return{networkValid:a.isCorrectNetwork,balanceValid:s.sufficient,addressValid:i,details:{currentChainId:a.currentChainId,balance:s.balance,address:e.address}}}function Gn(){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,m={})=>{let{timeout:u=6e4,confirmations:d=1,onSubmitted:f,onConfirmed:h,onError:g,signal:y}=m;try{if(o(),n=new AbortController,y){if(y.aborted)throw new wt("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 wt("Transaction aborted");let S=await i(c,...l);if(n.signal.aborted)throw new wt("Transaction aborted after submission",S);r({state:"pending",hash:S,submitTime:Date.now()}),f?.(S),u>0&&(t=setTimeout(()=>{e.state==="pending"&&!n?.signal.aborted&&r({state:"timeout",error:`Transaction timeout after ${u}ms`})},u));let _=await Promise.race([qw(c.publicClient,S,{timeout:u,confirmations:d}),new Promise((k,v)=>{n?.signal.addEventListener("abort",()=>{v(new wt("Transaction aborted while waiting for receipt",S))})})]);t&&(clearTimeout(t),t=void 0);let I=_.status==="success";if(r({state:I?"success":"error",receipt:_,confirmTime:Date.now(),error:I?void 0:"Transaction failed on-chain"}),I)h?.(_);else{let k=new wt("Transaction failed on-chain",S,_);throw g?.(k,S),k}return{hash:S,receipt:_,success:I}}catch(S){let _=S instanceof wt?S:new wt(`Transaction execution failed: ${S instanceof Error?S.message:"Unknown error"}`,e.hash,S);throw r({state:"error",error:_.message}),g?.(_,e.hash),_}}}}async function Tr(e,t,n,r={},o={}){let{maxRetries:a=3,initialDelay:s=1e3,maxDelay:i=1e4,backoffFactor:c=2,retryCondition:l=()=>!0}=o,m,u=s;for(let d=0;d<=a;d++)try{return await Gn().execute(e,t,n,r)}catch(f){if(m=f instanceof Error?f:new Error(String(f)),d===a||!l(m))break;await new Promise(h=>setTimeout(h,u)),u=Math.min(u*c,i)}throw m}var Gl=[{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}],Kw=ke.object({chain:ke.unknown().optional(),rpcUrl:ke.string().optional(),kmsContractAddress:ke.string(),privateKey:ke.string().optional(),walletClient:ke.unknown().optional(),publicClient:ke.unknown().optional(),allowAnyDevice:ke.boolean().optional().default(!1),deviceId:ke.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),composeHash:ke.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),disableUpgrades:ke.boolean().optional().default(!1),skipPrerequisiteChecks:ke.boolean().optional().default(!1),minBalance:ke.string().optional()}).passthrough(),Gw=Kw.refine(e=>{let t=!!e.privateKey,n=!!e.walletClient;return t!==n},{message:"Either 'privateKey' or 'walletClient' must be provided, but not both",path:["privateKey","walletClient"]}).refine(e=>{let t=!!e.publicClient,n=!!e.walletClient,r=!!e.chain;return t&&n?!0:r},{message:"Chain is required when publicClient or walletClient is not provided",path:["chain"]}),Bw=ke.object({appId:ke.string(),appAuthAddress:ke.string(),deployer:ke.string(),transactionHash:ke.string(),blockNumber:ke.bigint().optional(),gasUsed:ke.bigint().optional()}).passthrough();function Ww(e,t,n){try{let r=Lw({abi:Gl,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 Jw(e,t){let n=Gw.parse(e),{chain:r,rpcUrl:o,kmsContractAddress:a,privateKey:s,walletClient:i,publicClient:c,allowAnyDevice:l=!1,deviceId:m="0000000000000000000000000000000000000000000000000000000000000000",composeHash:u="0000000000000000000000000000000000000000000000000000000000000000",disableUpgrades:d=!1,skipPrerequisiteChecks:f=!1,minBalance:h,timeout:g=12e4,retryOptions:y,signal:S,onTransactionStateChange:_,onTransactionSubmitted:I,onTransactionConfirmed:k}=n,v="0000000000000000000000000000000000000000000000000000000000000000",P=m!==v&&m!=="0x"+v?!1:l,L,D,J,me;if(s){let Se=Nw(s);if(c){if(typeof c!="object"||!c)throw new Error("publicClient is invalid");L=c}else{if(!r)throw new Error("Chain required for publicClient");L=xc({chain:r,transport:Za(o)})}if(!r)throw new Error("Chain required for walletClient");D=Uw({account:Se,chain:r,transport:Za(o)}),J=Se.address,me=r.id}else if(i){if(typeof i!="object"||!i)throw new Error("walletClient is invalid");if(D=i,c){if(typeof c!="object"||!c)throw new Error("publicClient is invalid");L=c}else{if(!r)throw new Error("Chain required for publicClient");L=xc({chain:r,transport:Za(o)})}if(!D.account?.address)throw new Error("WalletClient needs an account");J=D.account.address,r?me=r.id:me=await D.getChainId()}else throw new Error("Need privateKey or walletClient");let Z={publicClient:L,walletClient:D,address:J,chainId:me},te=Gn();if(_&&typeof _=="function"){let Se=()=>{_(te.status),te.isComplete||setTimeout(Se,100)};setTimeout(Se,10)}if(!f){let Se={targetChainId:me,minBalance:h?Pc(h):Pc("0.001")},oe=await $r(Z,Se);if(!oe.networkValid)throw new Error(`Wrong network. Need chain ${Se.targetChainId}, got ${oe.details.currentChainId}`);if(!oe.balanceValid){let _e=Number(Se.minBalance)/1e18,so=Number(oe.details.balance)/1e18;throw new Error(`Not enough ETH. Need ${_e}, have ${so.toFixed(6)}`)}}let T=ht(m),B=ht(u),Me=`0x${T.slice(2).padEnd(64,"0")}`,Dt=`0x${B.slice(2).padEnd(64,"0")}`,Jt=async Se=>{try{let _e=await Se.publicClient.getCode({address:a});if(!_e||_e==="0x")throw new Error(`No contract at ${a}`)}catch(_e){if(_e instanceof Error&&_e.message.includes("No contract at"))throw _e}let oe={address:a,abi:Gl,functionName:"deployAndRegisterApp",args:[Se.address,d,P,Me,Dt],account:Se.walletClient.account||Se.address,chain:r||null};return await Se.walletClient.writeContract(oe)},Na=y?await Tr(Jt,Z,[],{timeout:g,confirmations:1,onSubmitted:I,onConfirmed:k,signal:S},y):await te.execute(Jt,Z,[],{timeout:g,confirmations:1,onSubmitted:I,onConfirmed:k,signal:S}),oo=Ww(Na.receipt,J,a);return t?.schema===!1?oo:(t?.schema||Bw).parse(oo)}async function Bl(e,t){try{return{success:!0,data:await Jw(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 Wl=[{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}],Qw=he.object({chain:he.unknown().optional(),rpcUrl:he.string().optional(),appId:he.string(),composeHash: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=>{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"]}),e_=he.object({composeHash:he.string(),appId:he.string(),transactionHash:he.string(),blockNumber:he.bigint().optional(),gasUsed:he.bigint().optional()}).passthrough();function t_(e,t,n,r){console.log(e.logs);try{let o=Xw({abi:Wl,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 n_(e,t){let n=Qw.parse(e),{chain:r,rpcUrl:o,appId:a,composeHash:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:S}=n,_,I,k,v,A=a.startsWith("0x")?a:`0x${a}`;if(i){let T=Zw(i);if(l)_=l;else{if(!r)throw new Error("Chain required when creating publicClient");_=Tc({chain:r,transport:Qa(o)})}if(!r)throw new Error("Chain required when creating walletClient");I=Yw({account:T,chain:r,transport:Qa(o)}),k=T.address,v=r.id}else if(c){if(I=c,l)_=l;else{if(!r)throw new Error("Chain required when creating publicClient");_=Tc({chain:r,transport:Qa(o)})}if(!I.account?.address)throw new Error("WalletClient must have an account with address");k=I.account.address,v=r?r.id:await I.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let P={publicClient:_,walletClient:I,address:k,chainId:v},L=Gn();if(f&&typeof f=="function"){let T=()=>{f(L.status),L.isComplete||setTimeout(T,100)};setTimeout(T,10)}if(!y){let T={targetChainId:v,minBalance:S?Mc(S):Mc("0.001")},B=await $r(P,T);if(!B.networkValid)throw new Error(`Network mismatch: Expected chain ${T.targetChainId}, but wallet is on chain ${B.details.currentChainId}`);if(!B.balanceValid){let Me=Number(T.minBalance)/1e18,Dt=Number(B.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Me} ETH, but account has ${Dt.toFixed(6)} ETH`)}}let D=await _.readContract({address:A,abi:[{inputs:[],name:"owner",outputs:[{type:"address"}],stateMutability:"view",type:"function"}],functionName:"owner"});if(D.toLowerCase()!==k.toLowerCase())throw new Error(`Sender ${k} is not the owner of contract ${A}. Contract owner is ${D}.`);let J=async T=>await T.walletClient.writeContract({address:A,abi:Wl,functionName:"addComposeHash",args:[ht(s)],account:T.walletClient.account||T.address,chain:r||null}),me=u?await Tr(J,P,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d},u):await L.execute(J,P,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d}),Z=t_(me.receipt,ht(s),A,a);return t?.schema===!1?Z:(t?.schema||e_).parse(Z)}async function Zt(e,t){try{return{success:!0,data:await n_(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 kt=[{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"}],a_=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"]}),s_=ye.object({appAddress:ye.string(),deviceId:ye.string(),transactionHash:ye.string(),blockNumber:ye.bigint().optional(),gasUsed:ye.bigint().optional()}).passthrough();async function i_(e,t){let n=a_.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:S}=n,_=a.startsWith("0x")?a:`0x${a}`,I=ht(s),k,v,A,P;if(i){let B=o_(i),Me=Uc(o,{timeout:m});k=l||Dc({chain:r,transport:Me}),v=r_({account:B,chain:r,transport:Me}),A=B.address,P=r.id}else if(c){if(v=c,k=l||Dc({chain:r,transport:Uc(o,{timeout:m})}),!v.account?.address)throw new Error("WalletClient must have an account with address");A=v.account.address,P=r?r.id:await v.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let L={publicClient:k,walletClient:v,address:A,chainId:P},D=Gn();if(f&&typeof f=="function"){let B=()=>{f(D.status),D.isComplete||setTimeout(B,100)};setTimeout(B,10)}if(!y){let B={targetChainId:P,minBalance:S?Lc(S):Lc("0.001")},Me=await $r(L,B);if(!Me.networkValid)throw new Error(`Network mismatch: Expected chain ${B.targetChainId}, but wallet is on chain ${Me.details.currentChainId}`);if(!Me.balanceValid){let Dt=Number(B.minBalance)/1e18,Jt=Number(Me.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Dt} ETH, but account has ${Jt.toFixed(6)} ETH`)}}let J=await k.readContract({address:_,abi:kt,functionName:"owner"});if(J.toLowerCase()!==A.toLowerCase())throw new Error(`Sender ${A} is not the owner of contract ${_}. Contract owner is ${J}.`);let me=async B=>B.walletClient.writeContract({address:_,abi:kt,functionName:"addDevice",args:[I],account:B.walletClient.account||B.address,chain:r||null}),Z=u?await Tr(me,L,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d},u):await D.execute(me,L,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d}),te={appAddress:_,deviceId:I,transactionHash:Z.receipt.transactionHash,blockNumber:Z.receipt.blockNumber,gasUsed:Z.receipt.gasUsed};return t?.schema===!1?te:(t?.schema||s_).parse(te)}async function Qt(e,t){try{return{success:!0,data:await i_(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 m_=be.object({chain:be.unknown().optional(),rpcUrl:be.string().optional(),appAddress:be.string(),deviceId:be.string(),privateKey:be.string().optional(),walletClient:be.unknown().optional(),publicClient:be.unknown().optional(),skipPrerequisiteChecks:be.boolean().optional().default(!1),minBalance:be.string().optional(),timeout:be.number().optional().default(12e4),retryOptions:be.unknown().optional(),signal:be.unknown().optional(),onTransactionStateChange:be.function().optional(),onTransactionSubmitted:be.function().optional(),onTransactionConfirmed:be.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"]}),p_=be.object({appAddress:be.string(),deviceId:be.string(),transactionHash:be.string(),blockNumber:be.bigint().optional(),gasUsed:be.bigint().optional()}).passthrough();async function u_(e,t){let n=m_.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:S}=n,_=a.startsWith("0x")?a:`0x${a}`,I=ht(s),k,v,A,P;if(i){let T=l_(i),B=Oc(o,{timeout:m});k=l||Nc({chain:r,transport:B}),v=c_({account:T,chain:r,transport:B}),A=T.address,P=r.id}else if(c){if(v=c,k=l||Nc({chain:r,transport:Oc(o,{timeout:m})}),!v.account?.address)throw new Error("WalletClient must have an account with address");A=v.account.address,P=r?r.id:await v.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let L={publicClient:k,walletClient:v,address:A,chainId:P},D=Gn();if(f&&typeof f=="function"){let T=()=>{f(D.status),D.isComplete||setTimeout(T,100)};setTimeout(T,10)}if(!y){let T={targetChainId:P,minBalance:S?jc(S):jc("0.001")},B=await $r(L,T);if(!B.networkValid)throw new Error(`Network mismatch: Expected chain ${T.targetChainId}, but wallet is on chain ${B.details.currentChainId}`);if(!B.balanceValid){let Me=Number(T.minBalance)/1e18,Dt=Number(B.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Me} ETH, but account has ${Dt.toFixed(6)} ETH`)}}let J=async T=>T.walletClient.writeContract({address:_,abi:kt,functionName:"removeDevice",args:[I],account:T.walletClient.account||T.address,chain:r||null}),me=u?await Tr(J,L,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d},u):await D.execute(J,L,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d}),Z={appAddress:_,deviceId:I,transactionHash:me.receipt.transactionHash,blockNumber:me.receipt.blockNumber,gasUsed:me.receipt.gasUsed};return t?.schema===!1?Z:(t?.schema||p_).parse(Z)}async function Jl(e,t){try{return{success:!0,data:await u_(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 g_=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"]}),h_=ve.object({appAddress:ve.string(),allow:ve.boolean(),transactionHash:ve.string(),blockNumber:ve.bigint().optional(),gasUsed:ve.bigint().optional()}).passthrough();async function y_(e,t){let n=g_.parse(e),{chain:r,rpcUrl:o,appAddress:a,allow:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:u,signal:d,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:S}=n,_=a.startsWith("0x")?a:`0x${a}`,I,k,v,A;if(i){let te=f_(i),T=Vc(o,{timeout:m});I=l||Fc({chain:r,transport:T}),k=d_({account:te,chain:r,transport:T}),v=te.address,A=r.id}else if(c){if(k=c,I=l||Fc({chain:r,transport:Vc(o,{timeout:m})}),!k.account?.address)throw new Error("WalletClient must have an account with address");v=k.account.address,A=r?r.id:await k.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let P={publicClient:I,walletClient:k,address:v,chainId:A},L=Gn();if(f&&typeof f=="function"){let te=()=>{f(L.status),L.isComplete||setTimeout(te,100)};setTimeout(te,10)}if(!y){let te={targetChainId:A,minBalance:S?zc(S):zc("0.001")},T=await $r(P,te);if(!T.networkValid)throw new Error(`Network mismatch: Expected chain ${te.targetChainId}, but wallet is on chain ${T.details.currentChainId}`);if(!T.balanceValid){let B=Number(te.minBalance)/1e18,Me=Number(T.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${B} ETH, but account has ${Me.toFixed(6)} ETH`)}}let D=async te=>te.walletClient.writeContract({address:_,abi:kt,functionName:"setAllowAnyDevice",args:[s],account:te.walletClient.account||te.address,chain:r||null}),J=u?await Tr(D,P,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d},u):await L.execute(D,P,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:d}),me={appAddress:_,allow:s,transactionHash:J.receipt.transactionHash,blockNumber:J.receipt.blockNumber,gasUsed:J.receipt.gasUsed};return t?.schema===!1?me:(t?.schema||h_).parse(me)}async function Yl(e,t){try{return{success:!0,data:await y_(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 AP=Un.object({appAddress:Un.string(),owner:Un.string(),allowAnyDevice:Un.boolean(),devices:Un.array(Un.string())});async function So(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 b_({chain:t,transport:v_(n)})})(),[c,l]=await Promise.all([i.readContract({address:s,abi:kt,functionName:"allowAnyDevice"}),i.readContract({address:s,abi:kt,functionName:"owner"})]);if(c)return{appAddress:s,owner:l,allowAnyDevice:!0,devices:o.map(u=>ht(u))};let m;if(o.length===0)m=[];else{let u=o.map(f=>({address:s,abi:kt,functionName:"allowedDeviceIds",args:[ht(f)]})),d=await i.multicall({contracts:u});m=o.map((f,h)=>({deviceId:ht(f),allowed:d[h]?.status==="success"&&d[h]?.result===!0})).filter(f=>f.allowed).map(f=>f.deviceId)}return{appAddress:s,owner:l,allowAnyDevice:!1,devices:m}}async function __(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),m=s||(()=>{if(!t)throw new Error("Chain is required when publicClient is not provided");return C_({chain:t,transport:w_(n)})})(),u=[{address:i,abi:kt,functionName:"allowAnyDevice"},{address:i,abi:kt,functionName:"allowedDeviceIds",args:[c]},{address:i,abi:kt,functionName:"allowedComposeHashes",args:[l]}],d=await m.multicall({contracts:u}),f=d[0]?.status==="success"&&d[0]?.result===!0,h=d[1]?.status==="success"&&d[1]?.result===!0,g=d[2]?.status==="success"&&d[2]?.result===!0;return{allowAnyDevice:f,deviceAllowed:f||h,composeHashAllowed:g}}async function gn(e){try{return{success:!0,data:await __(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_=nl;var k_=Ln.object({items:Ln.array(S_),total:Ln.number(),page:Ln.number(),page_size:Ln.number(),pages:Ln.number()}).passthrough(),{action:LP,safeAction:Xl}=U(k_,async(e,t)=>{let{teamSlug:n,page:r,pageSize:o}=t,a=new URLSearchParams;r!==void 0&&a.append("page",r.toString()),o!==void 0&&a.append("page_size",o.toString());let s=a.toString()?`/workspaces/${n}/nodes?${a.toString()}`:`/workspaces/${n}/nodes`;return await e.get(s)}),jn=gt.object({limit:gt.number(),remaining:gt.number()}).passthrough(),I_=gt.object({vm_slots:jn,vcpu:jn,memory_mb:jn,disk_gb:jn}).passthrough(),E_=gt.object({gpus:jn,in_use:gt.number(),misconfigured:gt.number()}).passthrough(),A_=gt.object({team_slug:gt.string(),tier:gt.string(),quotas:I_,reserved_nodes:jn,reserved_gpu:E_,as_of:gt.string()}).passthrough(),{action:OP,safeAction:jP}=U(A_,async(e,t)=>await e.get(`/workspaces/${t.teamSlug}/quotas`)),VP=et(ze.extend({node_id:Hc.number().optional(),os_image:Hc.string().min(1).optional()}));var HP=Nn.object({target:Nn.string().describe("Target status to wait for (e.g., 'running', 'stopped')"),interval:Nn.number().min(5).max(30).default(5).describe("Polling interval in seconds"),timeout:Nn.number().min(10).max(600).default(300).describe("Timeout per attempt in seconds"),maxRetries:Nn.number().min(0).default(Number.POSITIVE_INFINITY).describe("Maximum number of retry attempts (Infinity for unlimited)"),retryDelay:Nn.number().min(0).default(5e3).describe("Delay between retries in milliseconds")});var R_=et(ze.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()})),x_=W.object({requiresOnChainHash:W.literal(!1),correlationId:W.string()}),P_=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()}),$_=W.discriminatedUnion("requiresOnChainHash",[x_,P_]);function T_(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:KP,safeAction:Zl}=U($_,async(e,t)=>{let n=R_.parse(t),{cvmId:r}=H.parse(n),{id:o,uuid:a,app_id:s,instance_id:i,name:c,prepareOnly:l,...m}=n;try{return{requiresOnChainHash:!1,correlationId:(l?await e.patch(`/cvms/${r}`,m,{headers:{"X-Prepare-Only":"true"}}):await e.patch(`/cvms/${r}`,m)).correlation_id}}catch(u){if(u instanceof Ze&&u.status===465){let d=T_(u.detail);return{requiresOnChainHash:!0,composeHash:d.compose_hash,appId:String(d.app_id),deviceId:d.device_id,kmsInfo:d.kms_info,commitToken:d.commit_token,commitUrl:d.commit_url,apiCommitUrl:d.api_commit_url,onchainStatus:d.onchain_status}}throw u}}),M_=et(ze.extend({composeHash:bo.string().describe("Compose hash from patchCvm Phase 1 response"),transactionHash:bo.string().describe("Transaction hash proving on-chain registration")})),D_=bo.object({correlationId:bo.string()}),{action:BP,safeAction:Ql}=U(D_,async(e,t)=>{let n=M_.parse(t),{cvmId:r}=H.parse(n);return{correlationId:(await e.patch(`/cvms/${r}`,{},{headers:{"X-Compose-Hash":n.composeHash,"X-Transaction-Hash":n.transactionHash}})).correlation_id}}),U_=et(ze.extend({token:Vn.string().describe("One-time commit token from prepare-only flow"),composeHash:Vn.string().describe("Compose hash from Phase 1 response"),transactionHash:Vn.string().describe("Transaction hash proving on-chain registration")})),L_=Vn.object({correlationId:Vn.string(),status:Vn.string()}),{action:JP,safeAction:em}=U(L_,async(e,t)=>{let n=U_.parse(t),{cvmId:r}=H.parse(n),o=await e.post(`/cvms/${r}/commit-update`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash});return{correlationId:o.correlation_id,status:o.status}}),tm=ot.object({identifier:ot.string(),status:ot.enum(["updated","unchanged","skipped","conflict","error"]),old_instance_id:ot.string().nullable().optional(),new_instance_id:ot.string().nullable().optional(),source:ot.enum(["teepod_state","teepod_info","gateway","none"]),verified_with_gateway:ot.boolean(),reason:ot.string().nullable().optional()}),Ss=tm.extend({cvm_id:ot.number().nullable()}),ks=tm.extend({cvm_id:ot.string().nullable()}),XP=ot.union([Ss,ks]);var ZP=et(ze.extend({overwrite:ot.boolean().optional(),dry_run:ot.boolean().optional()}));var e$=Ie.object({cvm_ids:Ie.array(Ie.string()).optional(),running_only:Ie.boolean().optional(),missing_only:Ie.boolean().optional(),overwrite:Ie.boolean().optional(),limit:Ie.number().int().min(1).max(500).optional(),dry_run:Ie.boolean().optional()}).strict(),Is=Ie.object({total:Ie.number().int(),scanned:Ie.number().int(),updated:Ie.number().int(),unchanged:Ie.number().int(),skipped:Ie.number().int(),conflicts:Ie.number().int(),errors:Ie.number().int()}),t$=Is.extend({items:Ie.array(Ss)}),n$=Is.extend({items:Ie.array(ks)}),r$=Is.extend({items:Ie.array(Ie.union([Ss,ks]))});var N_=se.object({cpu_percent:se.number().nullable().optional(),memory_used_bytes:se.number().nullable().optional(),memory_total_bytes:se.number().nullable().optional(),disk_used_bytes:se.number().nullable().optional(),disk_total_bytes:se.number().nullable().optional(),egress_bytes:se.number().nullable().optional()}),O_=se.object({vm_uuid:se.string(),status:se.string(),uptime:se.string().nullable().optional(),in_progress:se.boolean(),boot_progress:se.string().nullable().optional(),boot_error:se.string().nullable().optional(),shutdown_progress:se.string().nullable().optional(),events:se.array(se.object({event:se.string(),body:se.string(),timestamp:se.number()})).default([]),operation:se.object({type:se.string().nullable().optional(),phase:se.string().nullable().optional(),started_at:se.string().nullable().optional(),correlation_id:se.string().nullable().optional()}).nullable().optional(),resource_usage:N_.nullable().optional()}),j_=se.record(se.string(),O_),F_=se.object({vmUuids:se.array(se.string())}),{action:a$,safeAction:ko}=U(j_,async(e,t)=>{let{vmUuids:n}=F_.parse(t);return await e.post("/status/batch",{vm_uuids:n})}),V_=Cr.object({hostname:Cr.string().nullable().optional(),ssh_authorized_keys:Cr.array(Cr.string()).default([]),default_gateway_domain:Cr.string().nullable().optional()}),z_=H,{action:i$,safeAction:nm}=U(V_,async(e,t)=>{let{cvmId:n}=z_.parse(t);return await e.get(`/cvms/${n}/user_config`)}),{action:l$,safeAction:rm}=ss(H_.void(),async e=>{await e.delete("/tokens/self")}),om=De.object({app_contract_address:De.string(),compose_hash:De.string(),device_id:De.string(),compose_hash_allowed:De.boolean(),allow_any_device:De.boolean(),device_id_allowed:De.boolean().nullable().optional(),is_allowed:De.boolean(),error:De.string().nullable().optional()}),am=om.extend({cvm_id:De.number().optional()}),Es=om.extend({cvm_id:De.string().optional()}),p$=De.union([am,Es]),q_=Es,u$=De.object({cvmId:De.string().min(1),compose_hash:De.string().optional(),node_id:De.number().optional(),device_id:De.string().optional()});var K_=On.object({appId:On.string().min(1),compose_hash:On.string(),node_id:On.number().optional(),device_id:On.string().optional(),chain_id:On.number().optional()}),{action:f$,safeAction:g$}=U(q_,async(e,t)=>{let{appId:n,...r}=K_.parse(t);return await e.post(`/apps/${n}/is-allowed`,r)}),sm=je.object({is_onchain:je.boolean(),total:je.number().default(0),allowed_count:je.number().default(0),denied_count:je.number().default(0),error_count:je.number().default(0)}),G_=sm.extend({results:je.array(am.extend({cvm_id:je.number()})).default([]),skipped_cvm_ids:je.array(je.number()).default([])}),B_=sm.extend({results:je.array(Es.extend({cvm_id:je.string()})).default([]),skipped_cvm_ids:je.array(je.string()).default([])}),y$=je.union([G_,B_]);var b$=je.object({appId:je.string().min(1)});var W_=rt.object({page:rt.number().int().min(1).optional(),page_size:rt.number().int().min(1).max(100).optional(),search:rt.string().optional(),status:rt.array(rt.string()).optional(),listed:rt.boolean().optional(),base_image:rt.string().optional(),instance_type:rt.string().optional(),kms_slug:rt.string().optional(),kms_type:rt.string().optional(),node:rt.string().optional(),region:rt.string().optional()}).strict();function J_(e){return e==="2025-10-28"?$w:e==="2026-01-21"?zl:Mw}async function Y_(e,t){let n=W_.parse(t??{}),r=await e.get("/apps",{params:n});return J_(e.config.version).parse(r)}async function im(e,t){try{return{success:!0,data:await Y_(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_=qc.object({appId:qc.string().min(1)}).strict();function Z_(e){return e==="2025-10-28"?Ol:e==="2026-01-21"?Fl:Vl}async function Q_(e,t){let{appId:n}=X_.parse(t),r=await e.get(`/apps/${n}`);return Z_(e.config.version).parse(r)}async function cm(e,t){try{return{success:!0,data:await Q_(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 eS=kr.object({appId:kr.string().min(1)}).strict();function tS(e){return e==="2025-10-28"?kr.array(Qc):e==="2026-01-21"?kr.array(zn):kr.array(Ir)}async function nS(e,t){let{appId:n}=eS.parse(t),r=await e.get(`/apps/${n}/cvms`);return tS(e.config.version).parse(r)}async function Bn(e,t){try{return{success:!0,data:await nS(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 rS=vt.object({appId:vt.string().min(1),name:vt.string().optional(),node_id:vt.number().optional(),docker_compose_file:vt.string().optional(),pre_launch_script:vt.string().optional(),encrypted_env:vt.string().optional(),compose_hash:vt.string().optional(),token:vt.string().optional(),transaction_hash:vt.string().optional()}).strict(),{action:S$,safeAction:k$}=U(iC,async(e,t)=>{let n=rS.parse(t),{appId:r,...o}=n;return await e.post(`/apps/${r}/instances`,o)}),lm=Ee.object({device_id:Ee.string(),node_name:Ee.string().nullable(),allowed_onchain:Ee.boolean(),status:Ee.string()}),mm=lm.extend({cvm_ids:Ee.array(Ee.number())}),pm=lm.extend({cvm_ids:Ee.array(Ee.string())}),um=Ee.object({is_onchain_kms:Ee.boolean(),allow_any_device:Ee.boolean().nullable().optional(),chain_id:Ee.number().nullable().optional(),app_contract_address:Ee.string().nullable().optional()}),dm=um.extend({devices:Ee.array(mm).optional().default([])}),fm=um.extend({devices:Ee.array(pm).optional().default([])}),E$=Ee.union([mm,pm]),A$=Ee.union([dm,fm]);function oS(e){return e==="2026-01-21"?dm:fm}var aS=Ee.object({appId:Ee.string().min(1)}).strict();async function sS(e,t){let{appId:n}=aS.parse(t),r=await e.get(`/apps/${n}/device-allowlist`);return oS(e.config.version).parse(r)}async function Io(e,t){try{return{success:!0,data:await sS(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$=ho.object({appId:ho.string().min(1),page:ho.number().int().min(1).optional(),page_size:ho.number().int().min(1).max(1e3).optional()}).strict();var $$=yo.object({appId:yo.string().min(1),revisionId:yo.string().min(1),rawComposeFile:yo.boolean().optional()}).strict();var M$=Ke.object({statuses:Ke.array(Ke.string()),image_versions:Ke.array(Ke.string()),instance_types:Ke.array(Ke.string()),kms_slugs:Ke.array(Ke.string()),kms_types:Ke.array(Ke.string()),regions:Ke.array(Ke.string()),nodes:Ke.array(Ke.string())});var iS=K.object({contract_address:K.string(),chain_id:K.number().nullable(),version:K.string(),url:K.string(),gateway_app_id:K.string().nullable(),gateway_app_url:K.string(),kms_type:K.string()}),Kc=K.object({app_id:K.string().optional(),instance_id:K.string().optional(),app_name:K.string().optional(),device_id:K.string().optional()}).passthrough().nullable(),cS=K.object({vm_uuid:K.string().nullable().optional(),name:K.string().optional(),instance_id:K.string().nullable().optional(),status:K.string().optional(),image_version:K.string().nullable().optional(),quote:K.string().nullable().optional(),ppid:K.string().optional(),ppid_sha256:K.string().nullable().optional(),device_id:K.string().optional(),fmspc:K.string().nullable().optional(),tee_tcb_svn:K.string().nullable().optional(),mr_config_id:K.string().nullable().optional(),cpusvn:K.string().nullable().optional(),pcesvn:K.number().nullable().optional(),tcb_info:Dl.nullable().optional(),app_certificates:K.array(Ml).nullable().optional(),compose_file:K.string().nullable().optional(),error:K.string().nullable().optional()}),lS=K.object({app_id:K.string(),contract_address:K.string(),kms_info:iS,instances:K.array(cS),kms_guest_agent_info:Kc,gateway_guest_agent_info:Kc,qemu_version:K.string().nullable()}),mS=K.object({appId:K.string().min(1)}).strict(),{action:U$,safeAction:L$}=U(lS,async(e,t)=>{let{appId:n}=mS.parse(t);return await e.get(`/apps/${n}/attestations`)}),pS=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function uS(e){let t={},n=e.toString();n=n.replace(/\r\n?/gm,`
|
|
23
|
+
`);let r;for(;(r=pS.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,`
|
|
24
|
+
`),a=a.replace(/\\r/g,"\r")),t[o]=a}return t}function Wn(e){let t=uS(e),n=[];for(let[r,o]of Object.entries(t))n.push({key:r,value:o});return n}function Eo(e){return e.split(/[\s-]+/).filter(Boolean).map((t,n)=>n===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function gm(e){return e===void 0?[]:Array.isArray(e)?[...e]:[e]}function hm(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??Eo(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 CS from"arg";var dS={name:"help",shorthand:"h",description:"Show help information for the current command",type:"boolean",target:"help"},fS={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"},gS={name:"interactive",description:"Enable interactive mode for commands that support it",type:"boolean",target:"interactive",group:"basic"},ym={name:"api-token",description:"API token for authenticating with Phala Cloud",type:"string",target:"apiToken",aliases:["api-key"],argumentName:"token",group:"basic"},Q={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json",group:"basic"},hS={name:"profile",description:"Temporarily use a different auth profile for this command",type:"string",target:"profile",argumentName:"profile",group:"basic"},yS={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"},bS={name:"timeout",description:"Request timeout in seconds (default 60)",type:"number",target:"timeout",argumentName:"seconds",group:"advanced"},en=[ym],X={name:"cvm_id",description:"CVM identifier (UUID, app_id, instance_id, or name)",required:!1,target:"cvmId"},hn={name:"cvm-id",description:"CVM identifier (UUID, app_id, instance_id, or name)",type:"string",target:"cvmId"},bm={name:"uuid",description:"[DEPRECATED] Use --cvm-id instead. CVM UUID.",type:"string",target:"cvmId",deprecated:!0,group:"deprecated"},tt={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"},Jn={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"},yn=[dS,fS,ym,Q,gS,hn,hS,yS,bS];import vm from"arg";function Cm(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??Eo(o.name),i=vS(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 gm(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]=vm.flag(()=>!0),r.set(c,{option:o,canonicalKey:a,target:s,negatedKey:c})}}return{spec:t,descriptors:n,negatedLookup:r}}function vS(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 vm.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 wS(e){let t=e.indexOf("--");return t===-1?[[...e],[]]:[e.slice(0,t),e.slice(t+1)]}function Mr(e,t,n={}){let r=[...yn,...t?[...t]:[]],o=Cm(r),{permissive:a=!1,stopAtPositional:s=!1}=n,[i,c]=wS(e),l=CS(o.spec,{argv:i,permissive:a,stopAtPositional:s}),{_:m,...u}=l;return{positionals:m??[],flags:u,flagConfig:o,passThrough:c}}var tn=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
25
|
|
|
28
26
|
All environment variables recognized by the Phala CLI. Command-line flags always take precedence over environment variables when both are set.
|
|
29
27
|
|
|
@@ -95,73 +93,76 @@ Examples:
|
|
|
95
93
|
- \`phala api --help\` for API-specific flags and env vars
|
|
96
94
|
- \`phala login --help\` for authentication flow
|
|
97
95
|
- \`phala deploy --help\` for on-chain KMS flags
|
|
98
|
-
`})});function
|
|
99
|
-
`)[0],
|
|
100
|
-
`)}function
|
|
101
|
-
`)[0],
|
|
102
|
-
`)}function
|
|
103
|
-
`)[0],
|
|
104
|
-
`)}function
|
|
105
|
-
`)
|
|
106
|
-
`
|
|
107
|
-
`))},
|
|
108
|
-
`))},
|
|
109
|
-
`))},
|
|
110
|
-
`))},
|
|
111
|
-
`)},
|
|
96
|
+
`})});function Ao(e){return e==="unstable"?" [UNSTABLE]":e==="deprecated"?" [DEPRECATED]":""}function _S(e,t){let n=Object.values(tn);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 xo(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 m=c.name??"";return l?.stability==="deprecated"?"deprecated":m==="nodes"||m==="deploy"?"deploy":m==="apps"||m==="cvms"||m==="link"||m==="simulator"?"manage":m==="ssh"||m==="cp"||m==="ps"||m==="logs"?"cvm-ops":m==="login"||m==="logout"||m==="switch"||m==="status"?"profile":m==="api"||m==="self"?"advanced":m==="auth"||m==="config"?"deprecated":"advanced"};for(let c of s){let l=o.filter(m=>i(m)===c).sort((m,u)=>(m.name??"").localeCompare(u.name??""));if(l.length!==0){r.push(a(c));for(let m of l){let u=m.command?.meta??m.group?.meta,d=(u?.description??"").split(`
|
|
97
|
+
`)[0],f=u?.stability,h=f?Ao(f):"",g=m.name??"",y=u?.aliases,S=y?.length?`${g} (${y.join(", ")})`:g;r.push(` ${S.padEnd(18)}${d}${h}`.trimEnd())}r.push("")}}_S(r,n),r.push("Global options:");for(let c of yn){let l=Ro(c),m=Math.max(24,l.length+2);r.push(` ${l.padEnd(m)}${c.description??""}`.trimEnd())}return r.join(`
|
|
98
|
+
`)}function wm(e){let{registry:t,executableName:n,groupPath:r}=e,o=t.getNode(r);if(!o?.group)return xo({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 m=l.command?.meta??l.group?.meta,u=(m?.description??"").split(`
|
|
99
|
+
`)[0],d=m?.stability,f=d?Ao(d):"",h=l.name??"",g=m?.aliases,y=g?.length?`${h} (${g.join(", ")})`:h;a.push(` ${y.padEnd(18)}${u}${f}`.trimEnd())}a.push("")}a.push("Global options:");for(let l of yn){let m=Ro(l),u=Math.max(24,m.length+2);a.push(` ${m.padEnd(u)}${l.description??""}`.trimEnd())}return a.join(`
|
|
100
|
+
`)}function As(e){let{executableName:t,definition:n,registry:r}=e,o=SS({executableName:t,definition:n}),a=Ao(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 S=IS(y);s.push(` ${S.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 m=c.filter(y=>!y.hidden),u=new Map(m.map(y=>[y.name,y])),d=yn.filter(y=>!y.hidden).filter(y=>!l.has(y.name)).map(y=>u.get(y.name)??y),f=new Set(d.map(y=>y.name)),h=m.filter(y=>!f.has(y.name));if(d.length>0){let y=new Set(h.map(S=>S.shorthand).filter(S=>typeof S=="string"&&S.length>0));s.push(""),s.push("Global options:");for(let S of d){let _=!S.shorthand||!y.has(S.shorthand),I=Ro(S,{includeShorthand:_}),k=Math.max(24,I.length+2);s.push(` ${I.padEnd(k)}${S.description??""}`.trimEnd())}}if(h.length>0){let y=k=>k.group==="deprecated"||k.deprecated?!0:(k.description??"").includes("[DEPRECATED]"),S=k=>k.group?k.group:y(k)?"deprecated":"basic",_={basic:[],advanced:[],deprecated:[]};for(let k of h)_[S(k)].push(k);let I=(k,v)=>{if(v.length!==0){s.push(""),s.push(k);for(let A of v){let P=Ro(A),L=Math.max(24,P.length+2);s.push(` ${P.padEnd(L)}${A.description??""}`.trimEnd())}}};I("Basic options:",_.basic),I("Advanced options:",_.advanced),I("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 S=y.command?.meta??y.group?.meta,_=(S?.description??"").split(`
|
|
101
|
+
`)[0],I=S?.stability,k=I?Ao(I):"",v=y.name??"",A=S?.aliases,P=A?.length?`${v} (${A.join(", ")})`:v;s.push(` ${P.padEnd(18)}${_}${k}`.trimEnd())}}return s.join(`
|
|
102
|
+
`)}function SS({executableName:e,definition:t}){let n=[e,...t.path],o=(t.meta.arguments??[]).map(l=>kS(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 kS(e){let t=`<${e.name}>`;return e.variadic?`${t}...`:e.required===!1?`[${t}]`:t}function IS(e){return e.variadic?`<${e.name}...>`:e.required===!1?`<${e.name}>?`:`<${e.name}>`}function Ro(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 _m;function Sm(e){return fn.includes(e)}function km(e){_m=e}function Rs(){return _m}var xs=!1;function Dr(e){xs=e}function ee(){return xs}function Ps(){return!xs}import OS from"path";import Po from"fs-extra";import Pm from"@iarna/toml";import{z as st}from"zod";import We from"chalk";import ES from"ora";function bn(e){return e!==null&&typeof e=="object"}function AS(e){return bn(e)&&"cause"in e}function le(e){return typeof e!="string"?void 0:e.trim().length>0?e:void 0}function RS(e){if(!Array.isArray(e))return;let t=e.filter(n=>typeof n=="string");return t.length>0?t:void 0}function xS(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!bn(n))continue;let r=le(n.label),o=le(n.url);r&&o&&t.push({label:r,url:o})}return t.length>0?t:void 0}function PS(e){if(typeof e=="string"){let t=e.trim();return t.length>0?t:void 0}if(e instanceof URL)return e.toString();if(typeof Request<"u"&&e instanceof Request)return e.url;if(bn(e)){let t=le(e.url);if(t)return t;let n=le(e.href);if(n)return n}}function $S(e,t){let n=le(t)?.toUpperCase();if(n)return n;if(typeof Request<"u"&&e instanceof Request){let r=le(e.method)?.toUpperCase();if(r)return r}if(bn(e)){let r=le(e.method)?.toUpperCase();if(r)return r}}function TS(e,t){let n=PS(e);if(!n)return;let r=$S(e,t);return r?{method:r,url:n}:{url:n}}function Im(e){if(!bn(e))return{};let t=le(e.error_code),n=t&&!/^\d+$/.test(t)?t:void 0;return{message:le(e.message)??le(e.error),errorCode:n,requestId:le(e.request_id),details:e.details,suggestions:RS(e.suggestions),links:xS(e.links)}}function MS(e){if(typeof e=="string")return le(e);if(bn(e))return le(e.message)??le(e.error)}function DS(e){let t=le(e);if(t&&!/^\d+$/.test(t))return t}function Em(e,t){let n=Im(e.data),r=Im(e.detail),o=e instanceof It?{errorCode:e.errorCode,details:e.structuredDetails,suggestions:e.suggestions,links:e.links?.map(g=>({label:g.label,url:g.url}))}:void 0,a=le(o?e.message:void 0)??n.message??r.message??MS(e.detail)??le(e.message)??t??"Unknown error",s=o?.errorCode??n.errorCode??r.errorCode??DS(e.code),i=le(e.requestId)??n.requestId??r.requestId,c=typeof e.status=="number"&&e.status>0?e.status:void 0,l=c!==void 0?le(e.statusText):void 0,m=o?.details??n.details??r.details,u=o?.suggestions??n.suggestions??r.suggestions,d=o?.links??n.links??r.links,f=e.data!==void 0?e.data:void 0,h=TS(e.request,e.requestMethod);return{message:a,...s?{errorCode:s}:{},...i?{requestId:i}:{},...c!==void 0?{httpStatus:c}:{},...l?{statusText:l}:{},...h?{request:h}:{},...m!==void 0?{details:m}:{},...u?{suggestions:u}:{},...d?{links:d}:{},...f!==void 0?{response:f}:{},...e.stack?{stack:e.stack}:{}}}function $s(e){if(AS(e)&&e.cause!==void 0){let n=$s(e.cause),r=le(e.message);return n.message&&n.message!=="Unknown error"?n:r?{...n,message:r}:n}if(e instanceof It||e instanceof _r||e instanceof Ze)return Em(e);if(e instanceof Error)return{message:le(e.message)??"Unknown error",...e.stack?{stack:e.stack}:{}};let t=String(e||"Unknown error");return{message:t.length>0?t:"Unknown error"}}function US(e){if(!Array.isArray(e))return e==null?[]:[` - ${typeof e=="string"?e:JSON.stringify(e)}`];let t=[];for(let n of e){if(typeof n=="string"){t.push(` - ${n}`);continue}if(!bn(n)){t.push(` - ${String(n)}`);continue}let r=le(n.message);if(r){t.push(` - ${r}`);continue}let o=le(n.field);if(o&&n.value!==void 0){let a=typeof n.value=="string"||typeof n.value=="number"||typeof n.value=="boolean"?String(n.value):JSON.stringify(n.value);t.push(` - ${o}: ${a}`);continue}t.push(` - ${JSON.stringify(n)}`)}return t}function Rm(e,t={}){let n=[],r=le(t.operation);if(r&&n.push(`${r} failed.`),e.errorCode?n.push(`Error [${e.errorCode}]: ${e.message}`):n.push(`Message: ${e.message}`),e.request){let s=e.request.method?`${e.request.method} `:"";n.push(`Request: ${s}${e.request.url}`)}if(e.httpStatus!==void 0){let s=e.statusText?` ${e.statusText}`:"";n.push(`HTTP: ${e.httpStatus}${s}`)}e.requestId&&n.push(`Request ID: ${e.requestId}`);let o=US(e.details);if(o.length>0&&(n.push(""),n.push("Details:"),n.push(...o)),e.suggestions&&e.suggestions.length>0){n.push(""),n.push("Suggestions:");for(let s of e.suggestions)n.push(` - ${s}`)}if(e.links&&e.links.length>0){n.push(""),n.push("Learn more:");for(let s of e.links)n.push(` - ${s.label}: ${s.url}`)}let a=le(t.guidance);return a&&(n.push(""),n.push(a)),t.debug&&(e.response!==void 0&&(n.push(""),n.push("Response:"),n.push(JSON.stringify(e.response,null,2))),e.stack&&(n.push(""),n.push("Stack:"),n.push(e.stack))),`${n.join(`
|
|
103
|
+
`)}
|
|
104
|
+
`}function xm(e,t={}){let n=le(t.operation);return{success:!1,error:e.message,...n?{operation:n}:{},...e.errorCode?{error_code:e.errorCode}:{},...e.requestId?{request_id:e.requestId}:{},...e.httpStatus!==void 0?{http_status:e.httpStatus}:{},...e.statusText?{status_text:e.statusText}:{},...e.request?{request:e.request}:{},...e.details!==void 0?{details:e.details}:{},...e.suggestions?{suggestions:e.suggestions}:{},...e.links?{links:e.links}:{},...e.response!==void 0?{response:e.response}:{},...t.debug&&e.stack?{stack:e.stack}:{}}}function LS(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 NS(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 Am(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(...NS(r,t));continue}let o=LS(r,t);n.push(...o)}if(n.length===0){let r=e.trim();n.push(r)}return n}var p={error:(e,...t)=>{ee()||(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)=>{ee()||(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)=>{ee()||(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)=>{ee()||(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)=>{ee()||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(!ee()){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 m=String(i[l]??"");c.push(m.padEnd(o[l]))}console.log(c.join(" "))}}}},keyValueTable:(e,t)=>{if(ee())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 m=4,u=1,d=a-m-u;if(c+l>d){let h=c/(c+l);c=Math.floor(d*h),l=d-c}let f=c+l+m+u;n!=="none"&&console.log(i.topLeft+i.horizontal.repeat(f-2)+i.topRight);for(let[h,g]of Object.entries(e)){let y=h,S=String(g??""),_=Am(y,c),I=Am(S,l),k=Math.max(_.length,I.length);for(;_.length<k;)_.push("");for(;I.length<k;)I.push("");for(let v=0;v<k;v++){let A=_[v].padEnd(c),P=I[v].padEnd(l);console.log(n!=="none"?`${i.vertical} ${r(A)} ${i.vertical} ${o(P)} ${i.vertical}`:`${r(A)} : ${o(P)}`)}}n!=="none"&&console.log(i.bottomLeft+i.horizontal.repeat(f-2)+i.bottomRight)},break:()=>{ee()||process.stderr.write(`
|
|
111
|
+
`)},startSpinner:e=>{if(ee())return{stop:()=>{}};let t=ES(e).start();return{stop:(n=!0,r)=>{r&&(t.text=r),n?t.succeed():t.fail()}}},logDetailedError(e,t){if(ee())return;let n=t?`[${t}] `:"",r=(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 m=l?.trim().toUpperCase();return m?`${m} ${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
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
113
|
`)}
|
|
114
114
|
`);return}e instanceof Error?process.stderr.write(`${n}${e.message}
|
|
115
115
|
`):process.stderr.write(`${n}${String(e)}
|
|
116
|
-
`)}};var
|
|
117
|
-
Run 'phala init' to create one.`);try{let t=
|
|
116
|
+
`)}};var $m=ze.extend({profile:st.string().optional(),api_version:st.enum(fn).optional(),gateway_domain:st.string().optional(),gateway_port:st.number().int().positive().optional(),compose_file:st.string().optional(),env_file:st.string().optional(),public_logs:st.boolean().optional(),public_sysinfo:st.boolean().optional(),public_tcbinfo:st.boolean().optional(),secure_time:st.boolean().optional(),listed:st.boolean().optional()}),Ur="phala.toml";function Ts(){return OS.join(process.cwd(),Ur)}function Lr(){return Po.existsSync(Ts())}function jS(){let e=Ts();if(!Po.existsSync(e))throw new Error(`Project configuration file not found: ${Ur}
|
|
117
|
+
Run 'phala init' to create one.`);try{let t=Po.readFileSync(e,"utf8"),n=Pm.parse(t),r=$m.parse(n);if(r.id||r.uuid||r.app_id||r.instance_id||r.name){let{cvmId:o}=H.parse(r);return{...r,cvm_id:o}}return r}catch(t){if(t instanceof st.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 ${
|
|
119
|
+
${n}`)}throw new Error(`Failed to parse ${Ur}: ${t instanceof Error?t.message:String(t)}`)}}function Ms(e){let t=Ts();try{let n=$m.parse(e),r=Pm.stringify(n);Po.writeFileSync(t,r,"utf8"),p.success(`Project configuration saved to ${Ur}`)}catch(n){if(n instanceof st.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 ${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
|
|
123
|
-
`)}return n}async function
|
|
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
|
|
125
|
-
`);for(;
|
|
126
|
-
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function
|
|
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
|
|
128
|
-
`);for(;
|
|
129
|
-
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function
|
|
121
|
+
${r}`)}throw new Error(`Failed to save ${Ur}: ${n instanceof Error?n.message:String(n)}`)}}function Yn(){return Lr()?jS():{}}function Tm(e){if(!e)return;let{cvmId:t}=H.parse({id:e});return t}import Xn from"fs";import FS from"os";import Ds from"path";var At="https://cloud-api.phala.com/api/v1";function Us(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:Ds.join(FS.homedir(),".phala-cloud")}function Nr(){return Ds.join(Us(),"credentials.json")}function Ls(){return Ds.join(Us(),"api-key")}function VS(){let e=Us();Xn.existsSync(e)||Xn.mkdirSync(e,{recursive:!0})}function $o(e){return typeof e=="string"&&e.trim().length>0}function Zn(e){let t=e.trim();return t.length===0?"default":t}function Re(){try{let e=Nr();if(!Xn.existsSync(e))return null;let t=Xn.readFileSync(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return null;let r=n;return r.schema_version!==1||!$o(r.current_profile)||!r.profiles||typeof r.profiles!="object"?null:r}catch(e){return p.error("Failed to read credentials file:",e),null}}function To(e){VS(),Xn.writeFileSync(Nr(),JSON.stringify(e,null,2),{mode:384,encoding:"utf8"})}function Mm(e){let t=Re(),n=Zn(e.profile||e.projectProfile||t?.current_profile||"default"),r=n;if(t&&!t.profiles[r]){let l=Object.entries(t.profiles).find(([,m])=>m?.workspace?.slug===n);if(l)r=l[0];else{let m=Object.entries(t.profiles).find(([,u])=>u?.workspace?.name===n);m&&(r=m[0])}}let o=e.env.PHALA_CLOUD_API_PREFIX,a=t?.profiles?.[r]?.api_prefix,s=(o&&o.trim().length>0?o:a&&a.trim().length>0?a:At)??At,i=o?"env":a?"file":"default";if($o(e.apiToken))return{apiKey:e.apiToken,baseURL:s,profileName:r,tokenSource:"flag",apiPrefixSource:i};if($o(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 $o(c)?{apiKey:c,baseURL:s,profileName:r,tokenSource:"file",apiPrefixSource:i}:{apiKey:null,baseURL:s,profileName:r,tokenSource:"none",apiPrefixSource:i}}function Qn(e){let t=Zn(e.profileName),n=(e.apiPrefix||At).trim(),r=Re(),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:At,workspace:s,user:e.user,updated_at:new Date().toISOString()}}};To(i)}function Mo(e){let t=Re();if(!t)return;let n=Zn(e||t.current_profile),r={...t.profiles};delete r[n];let o=Object.keys(r);if(o.length===0){try{Xn.unlinkSync(Nr())}catch(i){p.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};To(s)}function Dm(e,t){let n=Zn(e),r=Zn(t),o=Re();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;To({...o,current_profile:s,profiles:a})}function Rt(){let e=Re();return e?Object.keys(e.profiles):[]}function er(e){let t=Zn(e),n=Re();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&&To({...n,current_profile:t})}function Fe(){let e=Re();if(!e)return null;let t=e.current_profile,n=e.profiles[t];return n?{name:t,info:n}:null}import{readFileSync as zS}from"fs";import{dirname as HS,join as Um}from"path";import{fileURLToPath as qS}from"url";function KS(){let e=HS(qS(import.meta.url)),t=[Um(e,"../../package.json"),Um(e,"../package.json")];for(let n of t)try{let r=JSON.parse(zS(n,"utf-8"));if(r.version)return r.version}catch{}return"unknown"}var GS=KS(),jt=`phala-cli/${GS}`;var Lm="2026-06-23",BS=60;function Or(e){return e?.globalOptions?.timeout??BS}function WS(){return{env:process.env,projectConfig:Yn()}}function xt(e,t){let n=e??WS();return Mm({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=xt(e,t),r=Rs()??Lm,o=Or(e);return Ot({apiKey:n.apiKey??void 0,baseURL:n.baseURL,version:r,timeout:o*1e3,headers:{"User-Agent":jt}})}async function Do(e,t){let n=xt(e,t);return{client:await E(e,t),auth:n}}async function jr(e,t){let n=Rs()??Lm;return Ot({apiKey:e,baseURL:t?.baseURL,version:n,headers:{"User-Agent":jt}})}async function tr(e){try{let t=await jr(e.apiKey,{baseURL:e.baseURL}),n=await rm(t);if(n.success)return{outcome:"revoked"};let r="status"in n.error&&typeof n.error.status=="number"?n.error.status:void 0;return r===401?{outcome:"already-invalid"}:r===404?{outcome:"unsupported"}:{outcome:"failed",message:n.error.message}}catch(t){return{outcome:"failed",message:t instanceof Error?t.message:String(t)}}}import{z as C}from"zod";var JS=C.object({password:C.string(),registry:C.string().nullable(),username:C.string()}),HT=C.object({docker_compose_file:C.string(),docker_config:JS.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(),qT=C.object({key:C.string(),value:C.string()}),YS=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()}))}),XS=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()}),Nm=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()}),ZS=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()}),KT=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(ZS).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 QS from"inquirer";async function Om(){let e=p.startSpinner("Fetching available CVMs"),t=await E(),n=await Ar(t);if(e.stop(!0),!n.success){p.error(`Failed to fetch CVMs: ${n.error.message}`);return}let{items:r}=n.data;if(r.length===0){p.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 QS.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:o}]);return a}async function jm(e){let t=await E(),n=e.replace(/^app_/,""),r=await t.get(`cvms/app_${n}/attestation`);try{return Nm.parse(r)}catch(o){return p.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 Ns(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}`,i),!0}async function Fm(e,t){let n=await E(),r=e.replace(/^app_/,"");return await n.put(`cvms/app_${r}/compose`,t)}function nn(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 Vm(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 ek(e){return!e||/\s/.test(e)||e.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(e)}function tk(e){if(!ek(e))return e;try{return Buffer.from(e,"base64").toString("utf-8")}catch{return e}}function Uo(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:tk(n.message)}}catch{return null}}function nk(e){let t=e.split(/\r?\n/),n=[];for(let r of t){if(!r.trim())continue;let o=Uo(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=Uo(r);if(o){n+=o.message;continue}r.trim()&&(n+=`${r}
|
|
123
|
+
`)}return n}async function ok(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=Uo(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 m=o.indexOf(`
|
|
125
|
+
`);for(;m>=0;){let u=o.slice(0,m);o=o.slice(m+1),s(u),m=o.indexOf(`
|
|
126
|
+
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function ak(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=Uo(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 m=o.indexOf(`
|
|
128
|
+
`);for(;m>=0;){let u=o.slice(0,m);o=o.slice(m+1),s(u),m=o.indexOf(`
|
|
129
|
+
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function Os(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 zm(e){return Os(e,"serial")}async function Lo(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(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 Hm(e,t={}){let n=await zm(e),r=nn(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 qm(e,t={}){let n=await Lo(e,t.container,t.matchContainerIdPrefix??!0),r=t.text??!0,o=t.bare??!0,a=nn(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 Km(e,t={}){let n=await Lo(e,t.container,t.matchContainerIdPrefix??!0),r=nn(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("{")?nk(a):[{channel:"stdout",message:a}]}async function Gm(e,t,n={},r){let o=await Lo(e,n.container,n.matchContainerIdPrefix??!0),a=nn(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 ak(s,t)}async function Bm(e,t,n={},r){let o=await zm(e),a=nn(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 Vm(s,t)}async function Wm(e,t,n={},r){let o=await Lo(e,n.container,n.matchContainerIdPrefix??!0),a=n.text??!0,s=n.bare??!0,i=nn(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 ok(c,t)}async function Jm(e,t,n={}){let r=await Os(e,t),o=nn(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 Ym(e,t,n,r={},o){let a=await Os(e,t),s=nn(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 Vm(i,n)}async function Xm(e){let t=await E(),n=e.replace(/^app_/,""),r=await G(t,{app_id:n});if(!r.success)throw new Error(r.error.message);return r.data.status}import rn from"chalk";import Cn from"semver";import Fr from"fs";import sk from"os";import Zm from"path";var js={};function Qm(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:Zm.join(sk.homedir(),".phala-cloud")}function No(){return Zm.join(Qm(),"state.json")}function ik(){let e=Qm();Fr.existsSync(e)||Fr.mkdirSync(e,{recursive:!0})}function Vr(){try{let e=No();if(!Fr.existsSync(e))return js;let t=Fr.readFileSync(e,"utf8"),n=JSON.parse(t);return!n||typeof n!="object"?js:n}catch{return js}}function vn(e){ik();let t={...Vr(),...e};Fr.writeFileSync(No(),JSON.stringify(t,null,2),{mode:384,encoding:"utf8"})}function nr(e){return Vr()[e]}function ep(e,t){vn({[e]:t})}function tp(){return Vr()}function Oo(){return typeof process.versions.bun=="string"?"bun":"node"}function ck(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 zr(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=ck(r);if(o)return o}return"npm"}function Hr(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 np(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 lk=200,mk=1440*60*1e3,pk="Phala-Network/phala-cloud",rp="cli-v";function sp(e,t){return`https://github.com/${pk}/compare/${rp}${e}...${rp}${t}`}function jo(e){return e?e==="1"||e.toLowerCase()==="true":!1}function op(e){return typeof e=="string"&&e.trim().length>0}function uk(e){return e.startsWith("@")?e.replace("/","%2F"):e}function dk(e){let n=Cn.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function ip(e,t,n){if(op(t.PHALA_UPDATE_CHANNEL))return t.PHALA_UPDATE_CHANNEL;let r=n.get("updateCheckChannel");return op(r)?r:dk(e)??"latest"}function fk(e){return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function Fs(e,t){return`${e}_${fk(t)}`}function ap(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 cp(){return{get(e){return nr(e)},save(e){vn(e)}}}function Fo(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:c=cp()}=e;try{if(!i||s||jo(a.CI)||jo(a.PHALA_DISABLE_UPDATE_CHECK)||c.get("disableUpdateNotice")===!0)return null;let l=Cn.valid(r);if(!l)return null;let m=ip(r,a,c),u=Fs("updateCheckLatest",m),d=c.get(u)??(m==="latest"?c.get("updateCheckLatest"):void 0),f=typeof d=="string"?Cn.valid(d):null;if(!f||!Cn.gt(f,l))return null;let h=zr(a,o),g=h==="bun"?`${n}@${f}`:m==="latest"?`${n}@latest`:`${n}@${m}`,y=Hr(h,g),S=sp(l,f);return{message:`${[rn.yellow(`Update available: v${l} -> v${f}${m==="latest"?"":` (${m})`}.`),rn.gray(S),rn.gray(`Update with: "${t} self update" (or "${y}").`),rn.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
|
|
130
130
|
`)}
|
|
131
|
-
`,currentVersion:l,latestVersion:
|
|
131
|
+
`,currentVersion:l,latestVersion:f,packageName:n}}catch{return null}}async function Vo(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,now:c=Date.now(),timeoutMs:l=lk,ttlMs:m=mk,fetchImpl:u=fetch,configStore:d=cp()}=e;try{if(!i||s||jo(a.CI)||jo(a.PHALA_DISABLE_UPDATE_CHECK)||d.get("disableUpdateNotice")===!0)return null;let f=ip(r,a,d),h=Fs("updateCheckLastAt",f),g=ap(d,h)??(f==="latest"?ap(d,"updateCheckLastAt"):void 0);if(g&&c-g<m)return Fo({executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:d});let S=`https://registry.npmjs.org/${uk(n)}`,_=new AbortController,I=setTimeout(()=>_.abort(),l);I.unref?.();let k,v=null;try{if(k=await u(S,{signal:_.signal,headers:{accept:"application/json"}}),!k.ok)return null;let A=await k.json();if(!A||typeof A!="object")return null;let P=A["dist-tags"];if(!P||typeof P!="object")return null;let L=P[f]??P.latest;if(typeof L!="string")return null;v=Cn.valid(L);let D=Cn.valid(r);if(!v||!D||!Cn.gt(v,D))return null;let J=zr(a,o),me=J==="bun"?`${n}@${v}`:f==="latest"?`${n}@latest`:`${n}@${f}`,Z=Hr(J,me),te=sp(D,v);return{message:`${[rn.yellow(`Update available: v${D} -> v${v}${f==="latest"?"":` (${f})`}.`),rn.gray(te),rn.gray(`Update with: "${t} self update" (or "${Z}").`),rn.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
|
|
132
132
|
`)}
|
|
133
|
-
`,currentVersion:
|
|
134
|
-
`),1}let
|
|
135
|
-
`),1;
|
|
136
|
-
`),0;if(
|
|
137
|
-
`),0;let
|
|
138
|
-
`));let
|
|
139
|
-
`),1;
|
|
140
|
-
`)}else typeof
|
|
141
|
-
`):(c.write(`${
|
|
142
|
-
`),c.write(`${JSON.stringify(
|
|
143
|
-
`))},fail(
|
|
144
|
-
`):(l.write(`${
|
|
145
|
-
`),
|
|
146
|
-
`))}
|
|
147
|
-
`),0):(l.write(
|
|
148
|
-
`),
|
|
149
|
-
`),0;if(u.flags["--
|
|
150
|
-
`),0;if(u.
|
|
151
|
-
`)
|
|
152
|
-
`),1}
|
|
153
|
-
`),1
|
|
154
|
-
`),0;if(
|
|
155
|
-
`)
|
|
156
|
-
`),1}
|
|
157
|
-
`),1
|
|
133
|
+
`,currentVersion:D,latestVersion:v,packageName:n}}finally{clearTimeout(I);let A=Fs("updateCheckLatest",f);d.save({[h]:c,...v?{[A]:v}:{},...f==="latest"?{updateCheckLastAt:c,...v?{updateCheckLatest:v}:{}}:{}})}}catch{return null}}async function mp(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,stdout:c,stderr:l,stdin:m,env:u,cwd:d}=e,f=yk(n);if((f.length>0?t.getNode(f):null)?.group){let v=n.slice(f.length),A=Mr(v,void 0);if(A.flags["--help"]||A.positionals.length===0)return lp({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:u,stdout:c,stderr:l,groupPath:f})}let g=t.resolveCommand(f);if(!g)return f.length>1&&t.getNode([f[0]])?.group?lp({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:u,stdout:c,stderr:l,groupPath:[f[0]]}):hk({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:u,stdout:c,stderr:l});let{definition:y,consumed:S,remaining:_}=g;if(_.length>0&&(!y.meta.arguments||y.meta.arguments.length===0)){let v=S.join(" "),A=_.join(" ");return l.write(`Unknown subcommand "${A}" for "${v}". Run \`${r} ${v} --help\` for usage.
|
|
134
|
+
`),1}let I=n.slice(S.length),k=Yn();try{let v=Mr(I,y.meta.options);Dr(v.flags["--json"]===!0);let A=v.flags["--api-version"];if(typeof A=="string"){if(!Sm(A))return l.write(`Invalid API version "${A}". Supported versions: ${fn.join(", ")}
|
|
135
|
+
`),1;km(A)}if(v.flags["--version"])return c.write(`${o}
|
|
136
|
+
`),0;if(v.flags["--help"])return c.write(`${As({executableName:r,definition:y,registry:t})}
|
|
137
|
+
`),0;let L=!(y.path[0]==="self"&&y.path[1]==="update")?Vo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:u,isJson:v.flags["--json"]===!0,stderrIsTTY:l.isTTY===!0}):Promise.resolve(null);y.meta.stability==="deprecated"&&l.write(rr.yellow(`Warning: This command is deprecated and may be removed in a future version.
|
|
138
|
+
`));let D=hm(y.meta,v),J=D.options.timeout,me;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;me=J}let Z={apiToken:typeof D.options.apiToken=="string"?D.options.apiToken:void 0,json:D.options.json===!0,interactive:D.options.json===!0?!1:D.options.interactive===!0,profile:typeof D.options.profile=="string"?D.options.profile:void 0,apiVersion:typeof A=="string"?A:void 0,timeout:me},te={...D.options,...D.positionals,options:D.options,positionals:D.positionals,raw:D.raw},T,B="cvmId"in te?te.cvmId:void 0,Me=Z.interactive;v.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] 'cvmId' in mergedInput:","cvmId"in te),console.log("[DISPATCHER DEBUG] rawCvmId:",B),console.log("[DISPATCHER DEBUG] mergedInput keys:",Object.keys(te)));let Dt=[...y.meta.arguments??[],...y.meta.options??[]].some(oe=>oe.target==="cvmId"||oe.name==="cvm-id"||oe.name==="cvm_id");if(Me&&Dt){let oe=await Om();oe&&(T={app_id:oe})}if(!T&&B&&typeof B=="string"&&(T={id:B}),!T){let oe=k.cvm_id;oe&&(T={id:oe})}v.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] final cvmId:",JSON.stringify(T)),console.log("[DISPATCHER DEBUG] cvmId type:",typeof T),console.log("[DISPATCHER DEBUG] cvmId is undefined:",T===void 0));let Jt={argv:I,rawFlags:v.flags,rawPositionals:v.positionals,cwd:d,env:u,stdout:c,stderr:l,stdin:m,projectConfig:k,globalOptions:Z,cvmId:T,cli:{executableName:r,packageName:a,packageVersion:s,runtime:i},success(oe){if(ee()){let _e=typeof oe=="string"?{success:!0,message:oe}:{success:!0,...typeof oe=="object"&&oe!==null?oe:{data:oe}};c.write(`${JSON.stringify(_e,null,2)}
|
|
140
|
+
`)}else typeof oe=="string"?c.write(`${rr.green("\u2713")} ${rr.green(oe)}
|
|
141
|
+
`):(c.write(`${rr.green("\u2713")} Success
|
|
142
|
+
`),c.write(`${JSON.stringify(oe,null,2)}
|
|
143
|
+
`))},fail(oe,_e){ee()?c.write(`${JSON.stringify({success:!1,error:oe,..._e&&{details:_e}},null,2)}
|
|
144
|
+
`):(l.write(`${rr.red("\u2717")} ${rr.red(oe)}
|
|
145
|
+
`),_e&&l.write(`${JSON.stringify(_e,null,2)}
|
|
146
|
+
`))},failWithError(oe,_e){let so=$s(oe);if(ee()){let Sh=xm(so,{operation:_e?.operation,debug:_e?.debug});c.write(`${JSON.stringify(Sh,null,2)}
|
|
147
|
+
`);return}l.write(Rm(so,{operation:_e?.operation,debug:_e?.debug,guidance:_e?.guidance}))}};v.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId after creation:",JSON.stringify(Jt.cvmId));let Na=y.schema.parse(te),oo=Object.freeze({...Na,json:Z.json,interactive:Z.interactive,...Z.apiToken!==void 0?{apiToken:Z.apiToken}:{},...Z.profile!==void 0?{profile:Z.profile}:{}});v.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId before handler:",JSON.stringify(Jt.cvmId));let ao=await y.run(oo,Jt),Se=await L;return typeof ao=="number"?(ao===0&&Se&&!ee()&&l.write(Se.message),ao):(Se&&!ee()&&l.write(Se.message),0)}catch(v){if(v instanceof gk){let A=v.issues.some(L=>L.code==="invalid_type"&&L.received==="undefined"&&L.message==="Required"),P=I.some(L=>!L.startsWith("-"));return A&&!P?(c.write(`${As({executableName:r,definition:y,registry:t})}
|
|
148
|
+
`),0):(l.write(bk(v)),1)}if(Vs(v))return l.write(`${v.message}
|
|
149
|
+
`),1;throw v}}function hk(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:c,stdout:l,stderr:m}=e;try{let u=Mr(n,void 0);if(u.flags["--version"])return l.write(`${o}
|
|
150
|
+
`),0;if(u.flags["--help"])return l.write(`${xo({registry:t,executableName:r})}
|
|
151
|
+
`),0;if(u.positionals.length===0){l.write(`${xo({registry:t,executableName:r})}
|
|
152
|
+
`);let f=Fo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:c,isJson:!1,stderrIsTTY:m.isTTY===!0});return f&&m.write(f.message),0}let d=u.positionals.join(" ");return m.write(`Unknown command "${d}". Run \`${r} --help\` for a list of commands.
|
|
153
|
+
`),1}catch(u){if(Vs(u))return m.write(`${u.message}
|
|
154
|
+
`),1;throw u}}function lp(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:c,stdout:l,stderr:m,groupPath:u}=e;try{let d=n.slice(u.length),f=Mr(d,void 0);if(f.flags["--version"])return l.write(`${o}
|
|
155
|
+
`),0;if(f.flags["--help"]||f.positionals.length===0){if(l.write(`${wm({registry:t,executableName:r,groupPath:u})}
|
|
156
|
+
`),!f.flags["--help"]){let y=Fo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:c,isJson:!1,stderrIsTTY:m.isTTY===!0});y&&m.write(y.message)}return 0}let h=f.positionals.join(" "),g=u.join(" ");return m.write(`Unknown subcommand "${h}" for "${g}". Run \`${r} ${g} --help\` for a list of subcommands.
|
|
157
|
+
`),1}catch(d){if(Vs(d))return m.write(`${d.message}
|
|
158
|
+
`),1;throw d}}function yk(e){let t=[];for(let n of e){if(n.startsWith("-"))break;t.push(n)}return t}function bk(e){let t=e.issues[0];return t?`Invalid value for "${t.path.length>0?t.path.join("."):"input"}": ${t.message}
|
|
158
159
|
`:`${e.message}
|
|
159
|
-
`}function
|
|
160
|
-
`);return}let a=e.env.PHALA_CLOUD_API_PREFIX||
|
|
161
|
-
`);return}let c=i.data,l=c.workspace_name||"default",
|
|
160
|
+
`}function Vs(e){return e instanceof Error&&Object.prototype.hasOwnProperty.call(e,"code")&&typeof e.code=="string"}import up from"crypto";import wn from"fs";import or from"os";import dp from"path";function vk(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:dp.join(or.homedir(),".phala-cloud")}function Ck(){return dp.join(vk(),"config.json")}function pp(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&&pp(r)&&o.length>0&&pp(o)}function _k(){let e=[or.hostname(),or.platform(),or.arch(),or.cpus()[0]?.model||"",or.userInfo().username],t=up.createHash("sha256");return t.update(e.join("|")),t.digest()}function Sk(e){let t=_k(),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=up.createDecipheriv("aes-256-cbc",t.slice(0,32),r),s=a.update(o,"hex","utf8");return s+=a.final("utf8"),s}function qr(e){try{wn.unlinkSync(e)}catch{}}function kk(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 Ik(){return async({token:e,baseURL:t})=>{let n=Ot({apiKey:e,baseURL:t,headers:{"User-Agent":jt}}),r=await Qe(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 fp(e){await Ek(e),await Ak(e)}async function Ek(e){let t=Nr();if(wn.existsSync(t)){let i=Ls();wn.existsSync(i)&&qr(i);return}let n=Ls();if(!wn.existsSync(n))return;let r=wn.readFileSync(n,"utf8").trim();if(!r)return;let o;try{o=wk(r)?Sk(r):r}catch{e.stderr.write(`Legacy credentials could not be migrated (possibly due to machine change). Please run 'phala login' again.
|
|
161
|
+
`);return}let a=e.env.PHALA_CLOUD_API_PREFIX||At,s=e.fetchCurrentUser??Ik();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.
|
|
162
|
+
`);return}let c=i.data,l=c.workspace_name||"default",m=c.workspace_slug,u=m||"default";Qn({profileName:u,token:o,apiPrefix:a,workspaceName:l,workspaceSlug:m,user:{username:c.username||"unknown",email:c.email},setCurrent:!0}),qr(n),e.stderr.write(`Migrated legacy credentials into ${t} (profile: ${u}).
|
|
162
163
|
`)}catch{e.stderr.write(`Legacy credentials could not be migrated. Please run 'phala login' again.
|
|
163
|
-
`)}}async function
|
|
164
|
-
`)}
|
|
164
|
+
`)}}async function Ak(e){let t=No(),n=Ck();if(wn.existsSync(n))try{let r=wn.readFileSync(n,"utf8"),o=JSON.parse(r);if(!o||typeof o!="object"){qr(n);return}let a=kk(o);if(Object.keys(a).length>0){let s=Vr();vn({...s,...a}),e.stderr.write(`Migrated legacy config into ${t}.
|
|
165
|
+
`)}qr(n)}catch{qr(n)}}function gp(e){return{name:e,children:new Map,aliasMap:new Map}}var zo=class{constructor(){this.root=gp(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=gp(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 Cp}from"fs";function b(e){return{path:e.path,meta:e.meta,schema:e.schema,run:e.handler}}import Rk from"@michaelhomer/jqjs";function hp(e,t){let r=[...Rk.compile(t)(e)];return r.length===1?r[0]:r}function yp(e,t=2){return e==null?String(e):typeof e=="string"?e:JSON.stringify(e,null,t)}import{z as He}from"zod";var zs=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],bp={name:"api",category:"advanced",description:`Make an authenticated HTTP request to Phala Cloud API.
|
|
165
166
|
|
|
166
167
|
The endpoint should be an API path like "/cvms" or "/users/me".
|
|
167
168
|
|
|
@@ -184,81 +185,46 @@ Use -q to filter JSON output with jq syntax (built-in, no jq installation needed
|
|
|
184
185
|
ENVIRONMENT VARIABLES
|
|
185
186
|
|
|
186
187
|
PHALA_CLOUD_API_KEY Override the API key (useful for CI/CD)
|
|
187
|
-
PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...
|
|
188
|
-
`)}function
|
|
189
|
-
`),1;let r=
|
|
190
|
-
`),1;let o=
|
|
191
|
-
`),1;let u=await o.requestFull(
|
|
192
|
-
`),u.headers.forEach((f
|
|
188
|
+
PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...en,{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"}]},vp=He.object({endpoint:He.string(),method:He.enum(zs).default("GET").transform(e=>e.toUpperCase()),query:He.array(He.string()).optional(),field:He.array(He.string()).optional(),header:He.array(He.string()).optional(),data:He.array(He.string()).optional(),input:He.string().optional(),include:He.boolean().default(!1),jq:He.string().optional(),silent:He.boolean().default(!1),apiToken:He.string().optional()});function Ho(e){return e==="-"?Cp(0,"utf-8"):Cp(e,"utf-8")}function xk(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 Pk(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),s=a.startsWith("@")?Ho(a.slice(1)):a,i=t[o];i===void 0?t[o]=s:Array.isArray(i)?i.push(s):t[o]=[i,s]}}return t}function $k(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=Ho(i);try{t[a]=JSON.parse(c)}catch{throw new Error(`Failed to parse JSON from file "${i}" for field "${a}"`)}}else t[a]=xk(s);continue}let o=n.indexOf("=");if(o>0){let a=n.slice(0,o),s=n.slice(o+1);s.startsWith("@")?t[a]=Ho(s.slice(1)):t[a]=s}}return t}function Tk(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 Mk(e,t){let n=t.toLowerCase();return Object.keys(e).some(r=>r.toLowerCase()===n)}function Dk(e){return!["GET","HEAD","OPTIONS"].includes(e)}function wp(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=Ho(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=$k(e.field);return Object.keys(n).length===0?{body:void 0}:{body:n}}return{body:void 0}}var Uk=new Set(zs);function Lk(e){return Uk.has(e.toUpperCase())}function Nk(e,t="phala"){let[n,r]=e;if(!n||!r||!Lk(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(`
|
|
189
|
+
`)}function Ok(e,t){let{body:n}=wp(e),r=Pk(e.query),o=t;if(Object.keys(r).length>0){let a=new URLSearchParams;for(let[i,c]of Object.entries(r))for(let l of Array.isArray(c)?c:[c])a.append(i,l);let s=o.includes("?")?"&":"?";o=`${o}${s}${a.toString()}`}return{method:e.method,endpoint:o,body:n}}async function jk(e,t){let n=Nk(t.rawPositionals,t.cli?.executableName);if(n)return t.stderr.write(`${n}
|
|
190
|
+
`),1;let r=xt(t,{apiToken:e.apiToken});if(!r.apiKey)return t.stderr.write(`Error: Not authenticated. Run "phala login" first.
|
|
191
|
+
`),1;let o=Ot({apiKey:r.apiKey,baseURL:r.baseURL,headers:{"User-Agent":jt}}),a=Tk(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}=wp(e);l&&!Mk(a,"content-type")&&(a["Content-Type"]=l);let m=Ok(e,c);if(m.body!==void 0&&!Dk(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.
|
|
192
|
+
`),1;let u=await o.requestFull(m.endpoint,{method:m.method,body:m.body,headers:a,responseType:"arrayBuffer"});if(e.include&&(t.stdout.write(`HTTP/1.1 ${u.status} ${u.statusText}
|
|
193
|
+
`),u.headers.forEach((d,f)=>{t.stdout.write(`${f}: ${d}
|
|
193
194
|
`)}),t.stdout.write(`
|
|
194
|
-
`)),!e.silent&&u.data!==void 0){let f=u.data
|
|
195
|
-
`),1
|
|
196
|
-
`)
|
|
197
|
-
`)
|
|
198
|
-
`),t.
|
|
199
|
-
`),t.stdout.write(`Logged in as: ${s.user.username}
|
|
200
|
-
`),t.stdout.write(`Current Workspace: ${s.workspace.name}
|
|
201
|
-
`),t.stdout.write(`Current Profile: ${o.profileName}
|
|
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
|
|
195
|
+
`)),!e.silent&&u.data!==void 0){let d=(u.headers.get("content-type")||"").toLowerCase(),f=(u.headers.get("content-disposition")||"").toLowerCase(),h=Buffer.from(u.data),g=d.includes("application/json")||d.includes("+json")||d.includes("text/json"),y=d.startsWith("text/")||d.includes("application/xml")||d.includes("application/javascript");if((f.includes("attachment")||d.includes("application/octet-stream")||d.includes("application/zip")||d.includes("application/pdf")||d.includes("application/vnd.")||d.includes("spreadsheet")||d.includes("application/x-"))&&!g)return e.jq?(t.stderr.write(`Error: jq filter (-q) cannot be applied to binary responses.
|
|
196
|
+
`),1):(t.stdout.write(h),u.ok?0:1);let _=h.toString("utf8"),I=_;if(g||!y&&_.length>0)try{I=JSON.parse(_)}catch{I=_}if(e.jq)try{I=hp(I,e.jq)}catch(v){return t.stderr.write(`Error: jq filter failed: ${v.message}
|
|
197
|
+
`),1}let k=yp(I);t.stdout.write(`${k}
|
|
198
|
+
`)}return u.ok?0:1}catch(l){let m=l;return t.stderr.write(`Error: ${m.message}
|
|
199
|
+
`),1}}var _p=b({path:["api"],meta:bp,schema:vp,handler:jk});var Sp={path:["auth"],meta:{name:"auth",category:"deprecated",description:"Authenticate with Phala Cloud",stability:"deprecated"}};import{z as qo}from"zod";var kp={name:"login",description:"Removed. 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"}]},Ip=qo.object({apiKey:qo.string().min(1,"API key cannot be empty").optional(),manual:qo.boolean().optional(),noOpen:qo.boolean().optional()});var Ep=b({path:["auth","login"],meta:kp,schema:Ip,handler:async()=>(p.error('The "phala auth login" command has been removed. Use "phala login" instead.'),1)});import{z as Fk}from"zod";var Ap={name:"logout",description:"Removed. Use 'phala logout' instead.",stability:"deprecated"},Rp=Fk.object({});var xp=b({path:["auth","logout"],meta:Ap,schema:Rp,handler:async()=>(p.error('The "phala auth logout" command has been removed. Use "phala logout" instead.'),1)});import{z as Ko}from"zod";var de={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Hs={name:"debug",shorthand:"d",description:"Enable debug output",type:"boolean",target:"debug"},Pp={name:"status",category:"profile",description:"Check authentication status",stability:"stable",options:[...en,de,Hs],examples:[{name:"Show login status",value:"phala status"},{name:"Get status as JSON",value:"phala status --json"}]},Go=Ko.object({json:Ko.boolean().default(!1),debug:Ko.boolean().default(!1),apiToken:Ko.string().optional()});var $p={name:"status",description:"Removed. Use 'phala status' instead.",stability:"deprecated",options:[...en,de,Hs]},Tp=Go;var Mp=b({path:["auth","status"],meta:$p,schema:Tp,handler:async()=>(p.error('The "phala auth status" command has been removed. Use "phala status" instead.'),1)});var qs={group:Sp,commands:[Ep,xp,Mp]};var Dp={path:["config"],meta:{name:"config",category:"deprecated",description:"Manage local CLI state",stability:"deprecated"}};import{z as Up}from"zod";var Lp={name:"get",description:"Get a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0}]},Np=Up.object({key:Up.string()});async function Vk(e,t){p.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=nr(e.key);return n===void 0?(t.stderr.write(`Configuration key '${e.key}' not found
|
|
205
200
|
`),1):(t.stdout.write(`${e.key}: ${JSON.stringify(n)}
|
|
206
201
|
`),0)}catch(n){return t.stderr.write(`Failed to get configuration value
|
|
207
|
-
`),
|
|
202
|
+
`),p.logDetailedError(n),1}}var Op=b({path:["config","get"],meta:Lp,schema:Np,handler:Vk});import{z as jp}from"zod";var Fp={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=jp.object({json:jp.boolean().default(!1)});async function zk(e,t){p.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=tp();if(e.json)return t.success(n),0;t.stdout.write(`Configuration values:
|
|
208
203
|
`);for(let[r,o]of Object.entries(n))t.stdout.write(`${r}: ${JSON.stringify(o)}
|
|
209
|
-
`);return 0}catch(n){return
|
|
204
|
+
`);return 0}catch(n){return p.logDetailedError(n),t.fail("Failed to list configuration values"),1}}var zp=b({path:["config","list"],meta:Fp,schema:Vp,handler:zk});import{z as Ks}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}]},qp=Ks.object({key:Ks.string(),value:Ks.string()});async function Hk(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 p.warn('The "phala config" commands are deprecated and will be removed in a future version.'),ep(e.key,n),t.stdout.write(`Configuration value for '${e.key}' set successfully
|
|
210
205
|
`),0}catch(n){return t.stderr.write(`Failed to set configuration value
|
|
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
|
|
213
|
-
Available KMS Instances:`);for(let l of s)
|
|
214
|
-
Available Gateways:`);for(let l of i)
|
|
215
|
-
Available Instance Types:`);for(let l of c)
|
|
216
|
-
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function
|
|
206
|
+
`),p.logDetailedError(n),1}}var Kp=b({path:["config","set"],meta:Hp,schema:qp,handler:Hk});var Gs={group:Dp,commands:[Op,zp,Kp]};var Gp={path:["cvms"],meta:{name:"cvms",category:"manage",description:"Manage CVMs",stability:"unstable"}};import Wo from"chalk";import{z as Bo}from"zod";var Bp={name:"attestation",description:"Get CVM attestation",stability:"unstable",arguments:[X],options:[de,O],examples:[{name:"Show attestation summary",value:"phala cvms attestation"},{name:"Output full attestation JSON",value:"phala cvms attestation --json"}]},Wp=Bo.object({cvmId:Bo.string().optional(),interactive:Bo.boolean().default(!1),json:Bo.boolean().default(!1)});async function qk(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"Get attestation",debug:!!e.debug}),1;let o=r.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s=p.startSpinner(`Fetching attestation information for CVM app_${a}...`);try{let i=await jm(a);if(s.stop(!0),!i)return t.fail("No attestation information found"),1;if(e.json)return t.success(i),0;if(p.success("Attestation Summary:"),p.keyValueTable({Status:i.is_online?Wo.green("Online"):Wo.red("Offline"),"Public Access":i.is_public?Wo.green("Enabled"):Wo.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)=>{p.break(),p.success(`Certificate #${l+1} (${c.position_in_chain===0?"End Entity":"CA"}):`),p.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&&(p.break(),p.success("Trusted Computing Base (TCB) Information:"),p.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)){p.break(),p.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}));p.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&&p.info("To see all full attestation data, use --json"),p.break(),p.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 t.failWithError(n,{operation:"Get attestation",debug:!!e.debug}),1}}var Jp=b({path:["cvms","attestation"],meta:Bp,schema:Wp,handler:qk});import Kk from"inquirer";import{z as Kr}from"zod";var Yp={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"}]},Xp=Kr.object({cvmId:Kr.string().optional(),interactive:Kr.boolean().default(!1),force:Kr.boolean().default(!1),yes:Kr.boolean().default(!1)});async function Gk(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=await G(n,t.cvmId);if(!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Delete CVM",debug:!!e.debug}),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 Kk.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):(p.info("Deletion cancelled"),0)}let i=p.startSpinner(`Deleting CVM ${s}`),c=await xr(n,t.cvmId);return i.stop(!0),c.success?r?(t.success({deleted:!0,cvm:s}),0):(p.success(`CVM ${s} deleted successfully`),0):(t.failWithError(c.error.cause??c.error,{operation:"Delete CVM",debug:!!e.debug}),1)}catch(n){return t.failWithError(n,{operation:"Delete CVM",debug:!!e.debug}),1}}var Zp=b({path:["cvms","delete"],meta:Yp,schema:Xp,handler:Gk});import Yo from"chalk";var Bk=/\x1b\[[0-9;]*m/g,Qp=e=>e.replace(Bk,"").length,Wk=(e,t)=>e+" ".repeat(Math.max(0,t-Qp(e)));function ce(e,t){let n={};for(let o of e){n[o]=o.length;for(let a of t)n[o]=Math.max(n[o],Qp(a[o]??""))}let r=o=>e.map(a=>Wk(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 Jo}from"zod";var eu={name:"device-allowlist",description:"Show device allowlist status for a CVM's app",stability:"unstable",arguments:[X],options:[de,O],examples:[{name:"Check device allowlist",value:"phala cvms device-allowlist app_abc123"}]},tu=Jo.object({cvmId:Jo.string().optional(),json:Jo.boolean().default(!1),interactive:Jo.boolean().default(!1)});async function Jk(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"Manage device allowlist",debug:!!e.debug}),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 Io(n,{appId:a});if(!s.success)return t.failWithError(s.error.cause??s.error,{operation:"Manage device allowlist",debug:!!e.debug}),1;let i=s.data;if(e.json)return t.success(i),0;if(!i.is_onchain_kms)return p.info("This app does not use on-chain KMS."),0;if(p.info(`Chain: ${i.chain_id??"N/A"} Contract: ${i.app_contract_address??"N/A"}`),p.info(`Allow Any Device: ${i.allow_any_device?Yo.green("yes"):Yo.red("no")}`),i.devices.length===0)return p.info("No devices found for this app."),0;let c=["DEVICE_ID","NODE","CVMS","STATUS"],l=i.devices.map(m=>({DEVICE_ID:m.device_id,NODE:m.node_name??"-",CVMS:m.cvm_ids.join(", ")||"-",STATUS:m.status==="allowed"?Yo.green(m.status):Yo.red(m.status)}));return ce(c,l),0}catch(n){return t.failWithError(n,{operation:"Manage device allowlist",debug:!!e.debug}),1}}var nu=b({path:["cvms","device-allowlist"],meta:eu,schema:tu,handler:Jk});import Ws from"chalk";var fe=process.env.CLOUD_URL||"https://cloud.phala.com";var Bs=40;import{z as Xo}from"zod";var ru={name:"get",description:"Get details of a CVM",stability:"unstable",arguments:[X],options:[de,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"}]},ou=Xo.object({cvmId:Xo.string().optional(),json:Xo.boolean().default(!1),interactive:Xo.boolean().default(!1)});async function Yk(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=p.startSpinner("Fetching CVM details"),r=await E(t),o=await G(r,t.cvmId);if(n.stop(!0),!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Get CVM",debug:!!e.debug}),1;let a=o.data;if(!a)return t.fail("CVM not found"),1;if(e.json)return t.success(a),0;p.break();let s=a.status==="running"?Ws.green(a.status):a.status==="stopped"?Ws.red(a.status):Ws.yellow(a.status);return p.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":`${fe}/dashboard/cvms/app_${a.app_id}`}),0}catch(n){return t.failWithError(n,{operation:"Get CVM",debug:!!e.debug}),1}}var au=b({path:["cvms","get"],meta:ru,schema:ou,handler:Yk});import Qo from"chalk";function Xk(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 Zo(e,t){let n=await im(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 Xk(s,100)){let m=await ko(e,{vmUuids:l});if(!m.success)return{success:!1,error:{message:m.error.message,cause:m.error}};for(let[u,d]of Object.entries(m.data))i[u]={status:d.status,uptime:d.uptime,in_progress:d.in_progress}}let c=[];for(let l of a){let m=l.current_cvm;if(!m?.vm_uuid)continue;let u=i[m.vm_uuid],d=u?u.status:typeof m.status=="string"?m.status:"unknown";c.push({appId:l.app_id,cvmName:m.name,status:d,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 it}from"zod";var su={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"},Q],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"}]},iu=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 Zk(e){return e!==null&&typeof e=="object"&&"code"in e&&e.code==="TIMEOUT"}function Qk(e){return`Request timed out after ${e}s.
|
|
207
|
+
Retry with --timeout <seconds> to allow more time.`}function e0(e){return e.toLowerCase().endsWith("ing")?Qo.yellow(e):e==="running"?Qo.green(e):e==="stopped"?Qo.red(e):Qo.yellow(e)}async function t0(e,t){try{let n=await E(t),r=await Zo(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 Zk(i)?(t.fail(Qk(Or(t))),1):(t.failWithError(i??r.error,{operation:"List CVMs",debug:!!e.debug}),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:e0(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(p.info("No CVMs found"),0):(ce(a,s),p.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(n){return t.failWithError(n,{operation:"List CVMs",debug:!!e.debug}),1}}var cu=b({path:["cvms","list"],meta:su,schema:iu,handler:t0});import{z as n0}from"zod";var lu={name:"list-nodes",description:"List worker nodes",stability:"unstable"},mu=n0.object({});async function r0(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:c}=o;if(r)return t.success({nodes:a??[],kmsList:s??[],gatewayNodes:i??[],instanceTypes:c??[]}),0;if(!a||a.length===0)return p.info("No available nodes found."),0;p.info("Available Nodes:");for(let l of a)if(p.info("----------------------------------------"),p.info(` ID: ${l.teepod_id}`),p.info(` Name: ${l.name}`),p.info(` Region: ${l.region_identifier}`),p.info(` FMSPC: ${l.fmspc||"N/A"}`),p.info(` Device ID: ${l.device_id||"N/A"}`),p.info(` Support Onchain KMS: ${l.support_onchain_kms}`),p.info(" Images:"),l.images&&l.images.length>0)for(let m of l.images)p.info(` - ${m.name}`),p.info(` Hash: ${m.os_image_hash||"N/A"}`);else p.info(" N/A");if(s&&s.length>0){p.info(`
|
|
208
|
+
Available KMS Instances:`);for(let l of s)p.info("----------------------------------------"),p.info(` ID: ${l.id}`),p.info(` URL: ${l.url}`),p.info(` Version: ${l.version}`),p.info(` KMS Type: ${l.kms_type}`),p.info(` Chain ID: ${l.chain_id}`),p.info(` Contract ID: ${l.kms_contract_id}`),p.info(` Contract Address: ${l.kms_contract_address}`),p.info(` Gateway App ID: ${l.gateway_app_id}`)}if(i&&i.length>0){p.info(`
|
|
209
|
+
Available Gateways:`);for(let l of i)p.info("----------------------------------------"),p.info(` ID: ${l.id}`),p.info(` TEEPod ID: ${l.teepod_id??"N/A"}`),p.info(` Contract ID: ${l.kms_contract_id}`),p.info(` RPC URL: ${l.rpc_url??"N/A"}`),p.info(` Domain Suffix: ${l.domain_suffix??"N/A"}`)}if(c&&c.length>0){p.info(`
|
|
210
|
+
Available Instance Types:`);for(let l of c)p.info("----------------------------------------"),p.info(` ID: ${l.id}`),p.info(` Name: ${l.name}`),p.info(` vCPU: ${l.vcpu}`),p.info(` Memory MB: ${l.memory_mb}`),p.info(` Default Disk GB: ${l.default_disk_size_gb}`),p.info(` Requires GPU: ${l.requires_gpu}`)}return 0}catch(n){return t.failWithError(n,{operation:"List CVM nodes",debug:!!e.debug}),1}}var pu=b({path:["cvms","list-nodes"],meta:lu,schema:mu,handler:r0});async function Gr(e,t){try{let n=await E(t),r=await G(n,{id:e});if(r.success&&r.data.public_logs===!1)return p.warn("Logs are disabled for this CVM (public_logs=false)."),p.warn("To enable logs, run:"),p.warn(` phala deploy --cvm-id ${e} --public-logs`),!0}catch(n){p.debug?.(`Failed to check CVM info: ${n}`)}return!1}function ea(e,t){return async function(r,o){if(!o.cvmId)return o.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:a}=H.parse(o.cvmId),s=t(r),i=e.logType==="serial"?"serial":"container";try{if(r.follow){if(r.json)return o.fail("Cannot use --json with --follow"),1;p.info(`Streaming ${i} logs (press Ctrl+C to stop)...`),p.break();let l=new AbortController,m=!1,u=()=>{m=!0,l.abort()};process.on("SIGINT",u),process.on("SIGTERM",u);try{await e.streamLogs(a,d=>process.stdout.write(d),s,l.signal)}catch(d){if(d.name!=="AbortError")throw d}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u)}return m&&(p.break(),p.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 Gr(a,o)||p.info("No logs available"),0)}catch(c){return o.failWithError(c,{operation:`Fetch ${i} logs`,debug:!!r.debug}),await Gr(a,o),1}}}import{z as on}from"zod";var uu={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,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"}]},du=on.object({cvmId:on.string().optional(),tail:on.number().optional(),follow:on.boolean().default(!1),timestamps:on.boolean().default(!1),container:on.string().optional(),json:on.boolean().default(!1),interactive:on.boolean().default(!1)});var o0=ea({logType:"container",fetchLogs:qm,streamLogs:Wm},e=>({tail:e.tail,timestamps:e.timestamps,container:e.container})),fu=b({path:["cvms","logs"],meta:uu,schema:du,handler:o0});import _u from"fs";import a0 from"path";function yu(e){return e.startsWith("0x")?e.slice(2):e}function gu(e){return yu(e).toLowerCase()}function hu(e,t){let n=yu(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 Js(e,t,n){if(!n)throw new Error("KMS k256_pubkey is required to verify encryption public key");let r=Wa(hu(e.public_key,"encryption public key"),hu(e.signature,"encryption public key signature"),t);if(!r)throw new Error("Invalid encryption public key signature");if(gu(r)!==gu(n))throw new Error("Encryption public key signature does not match KMS");return e.public_key}async function Pt(e,t){if(t.kms_info?.chain_id!=null){let o=t.kms_type||t.kms_info?.slug||(t.kms_info?.id!=null?String(t.kms_info.id):null);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 Rr(e,{app_id:t.app_id,kms:o});if(!a.success)throw a.error;return Js(a.data,t.app_id,t.kms_info?.k256_pubkey)}let r=t.kms_info?.encrypted_env_pubkey??t.encrypted_env_pubkey??null;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 bu={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"},tt,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"},Jn,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>"}]},vu=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 s0(e){return _u.readFileSync(e,"utf-8").split(`
|
|
211
|
+
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function i0(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function c0(e){if(e.status!==465)return null;let n=i0(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 l0(e,t,n){if(!n)return;let r=a0.resolve(process.cwd(),n);if(!_u.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=s0(r),a=await Pt(e,t);return qe(o,a)}async function m0(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Nt(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 Ys(e,t,n){if(ee()){t.success(e);return}let r=typeof e.vm_uuid=="string"?e.vm_uuid:"",o=n?.workspace?.slug||t.projectConfig.slug||"",a=n?.workspace?.name||o||"-",s=o&&o!==a?`${a} (${o})`:o||a,i=r.replace(/-/g,""),c=o&&i&&typeof e.app_id=="string"?`${fe}/${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:"-",m=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: ${m}`,`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(`
|
|
217
212
|
`)}
|
|
218
|
-
`)}function
|
|
213
|
+
`)}function Cu(e,t){if(ee()){t.success({success:!0,prepare_only:!0,...e});return}let n=o=>o&&!o.startsWith("0x")?`0x${o}`:o,r=["CVM replica prepared successfully (pending on-chain approval).","",`Compose Hash: ${n(e.composeHash)}`,`App ID: ${n(e.appId)}`,`Device ID: ${n(e.deviceId)}`];if(e.commitToken&&r.push(`Commit Token: ${e.commitToken}`),e.commitUrl&&r.push(`Commit URL: ${e.commitUrl}`),e.apiCommitUrl&&r.push(`API Commit URL: ${e.apiCommitUrl}`),e.onchainStatus&&(r.push("","On-chain Status:",` Compose Hash: ${e.onchainStatus.compose_hash_allowed?"registered":"NOT registered"}`,` Device ID: ${e.onchainStatus.device_id_allowed?"registered":"NOT registered"}`),e.onchainStatus.is_allowed&&r.push(" All prerequisites met. You can commit with --transaction-hash already-registered.")),e.commitToken){let o=e.composeHash.startsWith("0x")?e.composeHash:`0x${e.composeHash}`;r.push("","To complete the replica after on-chain approval:"," phala cvms replicate <cvm-id> \\"," --commit \\",` --token ${e.commitToken} \\`,` --compose-hash ${o} \\`," --transaction-hash <tx-hash>")}t.stdout.write(`${r.join(`
|
|
219
214
|
`)}
|
|
220
|
-
`)}async function
|
|
221
|
-
`);let o=r.
|
|
222
|
-
`)
|
|
223
|
-
`),
|
|
224
|
-
${
|
|
225
|
-
|
|
226
|
-
|
|
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=`
|
|
215
|
+
`)}async function wu(e,t,n){return e.post(`/cvms/${t}/commit-replica`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash})}async function p0(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let r=await E(t),o,a=await G(r,t.cvmId);if(a.success)o=a.data;else if(a.error&&typeof a.error=="object"&&"errorCode"in a.error&&a.error.errorCode==="ERR-03-010"){let m=(t.cvmId?.id??"").replace(/^app_/,"").replace(/^0x/,"").toLowerCase(),u=await Bn(r,{appId:m});if(!u.success||u.data.length===0)throw a.error;let d=u.data[0];if(!d.vm_uuid)throw a.error;let f=await G(r,{id:d.vm_uuid});if(!f.success)throw f.error;o=f.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 wu(r,o.vm_uuid,{token:n.token,composeHash:n.composeHash,transactionHash:n.transactionHash||"already-registered"});return Ys(l,t,o),0}let s=await l0(r,o,n.envFile),i=await m0(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 Ys(l,t,o),0}catch(l){if(!(l instanceof It))throw l;let m=c0(l);if(!m)throw l;if(n.prepareOnly)return Cu(m,t),0;if(!m.commitToken)throw new Error("Replica prepare response did not include a commit token");let u=o.kms_info?.chain_id,d=u!=null?Et[u]:void 0;if(!d)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 f=await gn({chain:d,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:m.deviceId,composeHash:m.composeHash});if(!f.success){let _="error"in f?f.error:void 0;throw new Error(_?.message||"Failed to check on-chain prerequisites")}let h=n.transactionHash||"already-registered",g=!f.data.deviceAllowed,y=!f.data.composeHashAllowed;if(g||y){let _=[];y&&_.push("compose hash"),g&&_.push("device");let I=n.privateKey||process.env.PRIVATE_KEY;if(!I)throw Cu(m,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 k=I;if(g){let v=await Qt({chain:d,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:m.deviceId,privateKey:k});if(!v.success){let A="error"in v?v.error:void 0;throw new Error(A?.message||"Failed to register device on-chain")}}if(y){let v=await Zt({chain:d,rpcUrl:n.rpcUrl,appId:o.app_id,composeHash:m.composeHash,privateKey:k});if(!v.success){let A="error"in v?v.error:void 0;throw new Error(A?.message||"Failed to register compose hash on-chain")}h=String(v.data.transactionHash||"already-registered")}}let S=await wu(r,o.vm_uuid,{token:m.commitToken,composeHash:m.composeHash,transactionHash:h});return Ys(S,t,o),0}}catch(r){return t.failWithError(r,{operation:"Replicate CVM",debug:!!n.debug}),1}}var Su=b({path:["cvms","replicate"],meta:bu,schema:vu,handler:p0});import an from"chalk";import Qs from"inquirer";async function Ft(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 m=l;if((m.message?.includes("409")||m.status===409||m.message?.includes("Conflict"))&&c<n)o&&o.stop(!0),a&&p.warn(`CVM is busy, retrying in ${r}ms... (attempt ${c+1}/${n})`),await new Promise(d=>setTimeout(d,r));else throw l}let i=s;throw new Error(`Failed after ${n} retries due to conflicts: ${i?.message||String(s)}`)}import{z as Vt}from"zod";var ku={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"}]},Iu=Vt.object({cvmId:Vt.string().optional(),interactive:Vt.boolean().default(!1),vcpu:Vt.string().optional(),memory:Vt.string().optional(),diskSize:Vt.string().optional(),allowRestart:Vt.string().optional(),yes:Vt.boolean().default(!1),json:Vt.boolean().default(!1)});function Xs(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 u0(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 Zs(e,t){return(await Qs.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 d0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"Resize CVM",debug:!!e.debug}),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=Xs(e.vcpu,"--vcpu"),i=Xs(e.memory,"--memory"),c=Xs(e.diskSize,"--disk-size"),l=u0(e.allowRestart)}catch(m){return p.error(m instanceof Error?m.message:String(m)),1}if(Ps()?(s===void 0&&(s=await Zs("Enter number of vCPUs:",o.resource.vcpu??void 0)),i===void 0&&(i=await Zs("Enter memory in MB:",o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0)),c===void 0&&(c=await Zs("Enter disk size in GB:",o.resource.disk_in_gb??void 0)),l===void 0&&(l=(await Qs.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)),Ps()){let m=o.resource.vcpu,u=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0,d=o.resource.disk_in_gb;if(p.keyValueTable({vCPUs:m!==s?`${an.red(m)} -> ${an.green(s)}`:m,Memory:u!==i?`${an.red(u)} MB -> ${an.green(i)} MB`:u,"Disk Size":d!==c?`${an.red(d)} GB -> ${an.green(c)} GB`:d,"Allow Restart":l?an.green("Yes"):an.red("No")}),!e.yes){let{confirm:h}=await Qs.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to resize CVM app_${a}?`,default:!1}]);if(!h)return p.info("Resize operation cancelled"),0}let f=p.startSpinner(`Resizing CVM with App ID app_${a}`);await Ft(()=>Ns(a,s,i,c,l?1:0),{spinner:f}),f.stop(!0),p.break(),p.success(`Your CVM is being resized. You can check the dashboard for more details:
|
|
216
|
+
${fe}/dashboard/cvms/app_${a}`)}else await Ft(()=>Ns(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 t.failWithError(n,{operation:"Resize CVM",debug:!!e.debug}),1}}var Eu=b({path:["cvms","resize"],meta:ku,schema:Iu,handler:d0});async function ta(e,t=3e5,n){let r=await E(n),o=Date.now(),a=2e3;for(p.info("Waiting for CVM to be ready...");Date.now()-o<t;){try{let s=await G(r,{id:e});if(!s.success)p.warn(`Failed to get CVM info: ${s.error.message}`);else{let i=s.data,c=i.status,l=i.in_progress,m=Math.floor((Date.now()-o)/1e3);if(p.info(` [${m}s] status=${c}, in_progress=${l}`),c==="running"&&!l){let u=Math.floor((Date.now()-o)/1e3);p.success(`CVM is ready (took ${u}s)`);return}}}catch(s){p.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 ei}from"zod";var Au={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"}]},Ru=ei.object({cvmId:ei.string().optional(),interactive:ei.boolean().default(!1)});async function f0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=await G(n,t.cvmId);if(!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Restart CVM",debug:!!e.debug}),1;let a=o.data;a.progress?.target&&(p.warn("CVM is currently in progress (updating/restarting). Waiting for operation to complete..."),await ta(a.vm_uuid,3e5,t));let s=p.startSpinner("Restarting CVM"),i=t.cvmId,c=await Ft(()=>hs(n,i),{spinner:s});if(s.stop(!0),!c.success)return t.failWithError(c.error.cause??c.error,{operation:"Restart CVM",debug:!!e.debug}),1;let l=c.data;return r?(t.success({cvm:l,dashboardUrl:`${fe}/dashboard/cvms/app_${l.app_id}`,message:"CVM restart requested"}),0):(p.break(),p.keyValueTable({"CVM ID":l.id,Name:l.name,Status:l.status,"App ID":`app_${l.app_id}`,"App URL":l.app_url||`${fe}/dashboard/cvms/app_${l.app_id}`},{borderStyle:"rounded"}),p.break(),p.success(`Your CVM is being restarted. You can check the dashboard for more details:
|
|
217
|
+
${fe}/dashboard/cvms/app_${l.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Restart CVM",debug:!!e.debug}),1}}var xu=b({path:["cvms","restart"],meta:Au,schema:Ru,handler:f0});import{z as _n}from"zod";var Pu={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,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"}]},$u=_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 g0=ea({logType:"serial",fetchLogs:Hm,streamLogs:Bm},e=>({tail:e.tail,timestamps:e.timestamps})),Tu=b({path:["cvms","serial-logs"],meta:Pu,schema:$u,handler:g0});import{z as ti}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"}]},Du=ti.object({cvmId:ti.string().optional(),interactive:ti.boolean().default(!1)});async function h0(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=p.startSpinner("Starting CVM"),a=t.cvmId,s=await Ft(()=>fs(n,a),{spinner:o});if(o.stop(!0),!s.success)return t.failWithError(s.error.cause??s.error,{operation:"Start CVM",debug:!!e.debug}),1;let i=s.data;return r?(t.success({cvm:i,dashboardUrl:`${fe}/dashboard/cvms/app_${i.app_id}`,message:"CVM start requested"}),0):(p.break(),p.keyValueTable({"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`},{borderStyle:"rounded"}),p.break(),p.success(`Your CVM is being started. You can check the dashboard for more details:
|
|
218
|
+
${fe}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Start CVM",debug:!!e.debug}),1}}var Uu=b({path:["cvms","start"],meta:Mu,schema:Du,handler:h0});import{z as ni}from"zod";var Lu={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"}]},Nu=ni.object({cvmId:ni.string().optional(),interactive:ni.boolean().default(!1)});async function y0(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=p.startSpinner("Stopping CVM"),a=t.cvmId,s=await Ft(()=>gs(n,a),{spinner:o});if(o.stop(!0),!s.success)return t.failWithError(s.error.cause??s.error,{operation:"Stop CVM",debug:!!e.debug}),1;let i=s.data;return r?(t.success({cvm:i,dashboardUrl:`${fe}/dashboard/cvms/app_${i.app_id}`,message:"CVM stop requested"}),0):(p.break(),p.keyValueTable({"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`},{borderStyle:"rounded"}),p.break(),p.success(`Your CVM is being stopped. You can check the dashboard for more details:
|
|
219
|
+
${fe}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Stop CVM",debug:!!e.debug}),1}}var Ou=b({path:["cvms","stop"],meta:Lu,schema:Nu,handler:y0});import S0 from"fs";import ju from"fs";import Fu from"path";import b0 from"inquirer";async function na(e,t,n="file",r=process.cwd()){return(await b0.prompt([{type:"input",name:n,message:e,default:t,validate:a=>{let s=Fu.resolve(r,a);return ju.existsSync(s)?!0:`File not found at ${s}`}}]))[n]}function ra(e,t){for(let n of e){let r=Fu.join(process.cwd(),n);if(ju.existsSync(r))return t?p.info(t.replace("{path}",r)):p.info(`File detected: ${r}`),n}}import*as Vu from"fs";var zu=(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(`
|
|
220
|
+
`)){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),m=!1,u="",d=-1;for(let g=0;g<l.length;g++)if((l[g]==='"'||l[g]==="'"||l[g]==="`")&&(g===0||l[g-1]!=="\\"))m&&l[g]===u?(m=!1,u=""):m||(m=!0,u=l[g]);else if(l[g]==="#"&&!m&&g>0&&l[g-1]===" "){d=g-1;break}else if(l[g]==="#"&&!m&&g===0){d=g;break}d!==-1&&(l=l.substring(0,d)),l===void 0&&(l="");let f=l.charAt(0),h=l.charAt(l.length-1);f==='"'&&h==='"'||f==="'"&&h==="'"||f==="`"&&h==="`"?(l=l.substring(1,l.length-1),f==='"'&&(l=l.replace(/\\\\n/g,`
|
|
221
|
+
`))):l=l.trim(),c&&(n[c]=l)}}return Object.entries(n).map(([r,o])=>({key:r,value:o}))};import{execSync as zt,spawn as v0}from"child_process";import*as re from"fs";import*as ri from"net";import*as $t from"os";import*as ut from"path";var Ve={version:"0.5.3",baseUrl:"https://github.com/Dstack-TEE/dstack/releases/download/v0.5.3",installDir:ut.join($t.homedir(),".phala-cloud","simulator"),defaultLogPath:ut.join($t.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($t.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($t.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 Hu(){try{if(!re.existsSync(Ve.installDir))return!1;let e=$t.platform();if(!Ve.platforms[e])throw new Error(`Unsupported platform: ${e}`);let t=ut.join(Ve.installDir,Ve.platforms[e].extractedFolder);if(!re.existsSync(t))return!1;let r=ut.join(t,e==="win32"?"dstack-simulator.exe":"dstack-simulator");return re.existsSync(r)}catch(e){return p.error("Error checking if simulator is installed:",e),!1}}function Br(){let e=$t.platform();if(!Ve.platforms[e])throw new Error(`Unsupported platform: ${e}. Only darwin, linux, and win32 are supported.`);return e}async function qu(e){let t=n=>{p.info(n),e&&e(n)};try{let n=Br(),r=Ve.platforms[n];if(n==="win32"){try{zt("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.")}re.existsSync(Ve.installDir)||(p.info(`Creating installation directory at ${Ve.installDir}`),re.mkdirSync(Ve.installDir,{recursive:!0})),process.chdir(Ve.installDir);let o=`${Ve.baseUrl}/${r.filename}`;p.info(`Downloading simulator from ${o}`),zt(`wget ${o}`,{stdio:"inherit"});let a=ut.join(Ve.installDir,r.extractedFolder);re.existsSync(a)||re.mkdirSync(a,{recursive:!0}),p.info(`Extracting ${r.filename} to ${a}`);let s=`tar -xvf "${r.filename}" -C "${a}" --strip-components=1`;p.debug(`Running: ${s}`);try{zt(s,{stdio:"inherit"}),re.unlinkSync(r.filename)}catch(i){throw p.error(`Failed to extract ${r.filename}:`,i),new Error("Failed to extract simulator archive. Make sure you have sufficient permissions and disk space.")}p.success("Simulator installation completed successfully")}catch(n){throw p.error("Error installing simulator:",n),new Error(`Failed to install simulator: ${n}`)}}var oi=()=>ut.join($t.tmpdir(),"dstack-simulator.pid");function C0(e){return Buffer.byteLength(e,"utf8")>104}function oa(){try{let e=oi();if(re.existsSync(e)){let t=Number.parseInt(re.readFileSync(e,"utf-8").trim(),10);try{return process.kill(t,0),t}catch{re.unlinkSync(e)}}return null}catch(e){return p.warn("Error checking simulator PID:",e),null}}function w0(e,t){try{let n=oi();t&&p.info(`Saving simulator PID ${e} to: ${n}`),re.writeFileSync(n,e.toString(),"utf-8")}catch(n){p.warn("Failed to save simulator PID:",n)}}async function Ku(e={}){try{let t=Br(),n=Ve.platforms[t],r=ut.join(Ve.installDir,n.extractedFolder),o=oa();if(o)throw new Error(`Simulator is already running with PID: ${o}`);if(t!=="win32"&&C0(n.socketPath))throw new Error(`Socket path is too long (${n.socketPath.length} chars, max 104): ${n.socketPath}`);if(t!=="win32"&&re.existsSync(n.socketPath)){p.warn(`Removing existing socket file: ${n.socketPath}`);try{re.unlinkSync(n.socketPath)}catch(l){p.warn(`Failed to remove existing socket file: ${l}`)}}process.chdir(r);let a=t==="win32"?"dstack-simulator.exe":"./dstack-simulator";e.verbose&&t!=="win32"&&p.info(`Using socket path: ${n.socketPath}`);let s={background:e.background??!0,logToFile:e.logToFile??!0,logFilePath:e.logFilePath??Ve.defaultLogPath};if(s.logToFile){let l=ut.dirname(s.logFilePath);re.existsSync(l)||re.mkdirSync(l,{recursive:!0}),e.verbose&&p.info(`Simulator logs will be written to: ${s.logFilePath}`)}e.verbose&&p.info(`Starting simulator with: ${a}`);let i=s.logToFile?["ignore",re.openSync(s.logFilePath,"a"),re.openSync(s.logFilePath,"a")]:"inherit",c=v0(a,[],{stdio:i,shell:t==="win32",detached:s.background});if(s.logToFile&&Array.isArray(i)&&(typeof i[1]=="number"&&re.closeSync(i[1]),typeof i[2]=="number"&&re.closeSync(i[2])),s.logToFile){let m=`
|
|
230
222
|
=== Simulator started at ${new Date().toISOString()} ===
|
|
231
223
|
Command: ${a}
|
|
232
224
|
|
|
233
|
-
`;
|
|
234
|
-
`),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let n=await
|
|
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=`
|
|
248
|
-
Error [${a}]: ${s}
|
|
249
|
-
`;if(i&&i.length>0){p+=`
|
|
250
|
-
Details:
|
|
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+=`
|
|
254
|
-
Suggestions:
|
|
255
|
-
`;for(let u of c)p+=` - ${u}
|
|
256
|
-
`}if(l&&l.length>0){p+=`
|
|
257
|
-
Learn more:
|
|
258
|
-
`;for(let u of l)p+=` - ${u.label}: ${u.url}
|
|
259
|
-
`}return p}}let n=e instanceof Error?e.message:String(e||"Unknown error");return t.json?{success:!1,error:n}:`
|
|
260
|
-
Error: ${n}
|
|
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(`
|
|
225
|
+
`;re.appendFileSync(s.logFilePath,m)}return c.pid&&w0(c.pid,e.verbose),s.background&&(c.unref(),e.verbose&&p.success("Simulator is running in the background")),await _0(),c}catch(t){throw p.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function Wr(){try{let e=Br(),t=Ve.platforms[e];if(e==="darwin"||e==="linux"){let n=t.socketPath;return re.existsSync(n)?new Promise(r=>{let o=ri.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=ri.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 p.error("Error checking if simulator is running:",e),!1}}async function Gu(){try{let e=oa();if(!await Wr()&&!e)return p.info("Simulator is not running"),!0;let n=Br(),r=!1;if(n==="win32")try{e?(p.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):zt("taskkill /F /IM dstack-simulator.exe",{stdio:"ignore"}),r=!0}catch(a){if(a.code!=="ESRCH")return p.error("Failed to stop simulator:",a),!1;r=!0}else try{e?(p.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):zt("pkill -f dstack-simulator",{stdio:"ignore"}),r=!0}catch(a){if(a.code!=="ESRCH")return p.error("Failed to stop simulator:",a),!1;r=!0}let o=oi();if(re.existsSync(o))try{re.unlinkSync(o)}catch(a){p.warn("Failed to remove PID file:",a)}return await si(),r&&p.success("Simulator stopped successfully"),r}catch(e){return p.error("Error stopping simulator:",e),!1}}function ai(){let e=Br(),t=Ve.platforms[e];return e==="win32"?"http://127.0.0.1:8090":`${t.socketPath||"/tmp/dstack.sock"}`}async function _0(e){try{let t=ai(),n=e||t;await zt(`export DSTACK_SIMULATOR_ENDPOINT=${n}`);let r=n.replace(/dstack\.sock$/,"tappd.sock");return await zt(`export TAPPD_SIMULATOR_ENDPOINT=${r}`),p.success("Setting environment for current process..."),p.success(` DSTACK_SIMULATOR_ENDPOINT=${n}`),p.success(` TAPPD_SIMULATOR_ENDPOINT=${r}`),n}catch(t){throw p.error("Error setting simulator endpoint environment variable:",t),new Error(`Failed to set simulator endpoint: ${t}`)}}async function si(){try{return await zt("unset DSTACK_SIMULATOR_ENDPOINT"),await zt("unset TAPPD_SIMULATOR_ENDPOINT"),p.debug("Deleted simulator endpoint environment variables from current process"),!0}catch(e){return p.warn("Error while unsetting simulator endpoint environment variables:",e),!1}}import{z as ar}from"zod";var Bu={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"}]},Wu=ar.object({cvmId:ar.string().optional(),interactive:ar.boolean().default(!1),compose:ar.string().optional(),envFile:ar.string().optional(),debug:ar.boolean().default(!1)});async function k0(e){if(e.compose)return e.compose;let n=ra(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return na("Enter the path to your Docker Compose file:",n,"file")}async function I0(e,t){try{if(p.warn('\u26A0\uFE0F This command is deprecated. Please use "phala deploy" instead.'),p.warn(`\u26A0\uFE0F This legacy API will be maintained but may have limited support.
|
|
226
|
+
`),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let n=await E(t),r=await G(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"Upgrade CVM",debug:!!e.debug}),1;let o=r.data;if(!o)return t.fail("CVM not found"),1;let a=o.app_id,s=o,i=await k0(e),c="";if(i)try{c=S0.readFileSync(i,"utf8")}catch(h){return p.error(`Failed to read Docker Compose file: ${h instanceof Error?h.message:String(h)}`),1}await si(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?p.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?p.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):p.info("\u{1F510} Using public DockerHub registry...");let l,m=[];if(e.envFile)try{let h=zu([],e.envFile);l=await qe(h,s.kms_info?.encrypted_env_pubkey),m=h.map(g=>g.key)}catch(h){return p.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:m},encrypted_env:l,allow_restart:!0,env_keys:m},d=p.startSpinner(`Upgrading CVM app_${a}`),f=await Fm(a,u);return f?(d.stop(!0),f.detail&&p.info(`Details: ${f.detail}`),p.break(),p.success(`Your CVM is being upgraded. You can check the dashboard for more details:
|
|
227
|
+
${fe}/dashboard/cvms/app_${a}`),0):(d.stop(!1),p.error("Failed to upgrade CVM"),1)}catch(n){return p.error(`Failed to upgrade CVM: ${n instanceof Error?n.message:String(n)}`),e.debug&&p.error("Full Error:",n),1}}var Ju=b({path:["cvms","upgrade"],meta:Bu,schema:Wu,handler:I0});var aa={group:Gp,commands:[Jp,Zp,nu,au,cu,pu,fu,Su,Eu,xu,Tu,Uu,Ou,Ju],subgroups:[]};import{z as j}from"zod";var Yu={name:"deploy",category:"deploy",description:"Deploy new CVM or update existing one",stability:"stable",arguments:[],options:[hn,bm,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: ${Bs}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"},tt,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"},Jn,{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..."}]},Xu=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 Ht from"path";import td from"os";function E0(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 sa(e){let t={files:[],keyValues:[]};for(let n of e)if(E0(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 ia(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 Zu(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 Qu(e){let t=Zu(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 ed(e){let t=Zu(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 ii from"dedent";import dt from"fs-extra";import ca from"inquirer";function A0(e,t){t&&(e.allow_force_stop=!0)}async function R0({context:e,apiToken:t,interactive:n}){let r=xt(e,{apiToken:t});if(r.apiKey)return E(e,{apiToken:t});if(n){let{apiToken:o}=await ca.prompt([{type:"password",name:"apiToken",message:"Enter your API token:",validate:a=>a.trim()?!0:"API token is required"}]);return jr(o,{baseURL:r.baseURL})}throw new Error("API token is required. Please run 'phala login' or set PHALA_CLOUD_API_KEY environment variable")}async function x0({dockerComposePath:e,interactive:t}){if(!e)if(t){let r=ra(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e=await na("Enter the path to your Docker Compose file:",r,"file")}else throw new Error(ii(`
|
|
262
228
|
Docker Compose file is required.
|
|
263
229
|
|
|
264
230
|
Usage examples:
|
|
@@ -274,7 +240,7 @@ Error: ${n}
|
|
|
274
240
|
--rpc-url <url> RPC URL for the blockchain
|
|
275
241
|
|
|
276
242
|
Run with --interactive for guided setup
|
|
277
|
-
`));if(!dt.existsSync(e))throw new Error(`Docker compose file not found: ${e}`);return dt.readFileSync(e,"utf8")}var
|
|
243
|
+
`));if(!dt.existsSync(e))throw new Error(`Docker compose file not found: ${e}`);return dt.readFileSync(e,"utf8")}var P0=async(e,t)=>{let n=e.privateKey||process.env.PRIVATE_KEY;if(t&&!e.privateKey)if(e.interactive)n=(await ca.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 nd(e){e.kmsId&&p.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 $0=async e=>{let t=e.name;if(e.name){if(!Kn(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=Ht.basename(process.cwd()),r=gl(n);return e.interactive?t=(await ca.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:r,validate:a=>a.trim()?Kn(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},T0=async e=>{let t=[];if(e.envFile&&typeof e.envFile=="string"){p.warn("--env-file is deprecated. Use -e <file> or -e KEY=VALUE instead.");try{let n=dt.readFileSync(e.envFile,{encoding:"utf8"});t.push(...Wn(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=sa(e.env);for(let r of n.files){let o=Ht.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(...Wn(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 ca.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=Ht.resolve(process.cwd(),r);return dt.existsSync(o)?!0:`File not found at ${o}`}}]);if(n.trim()){let r=Ht.resolve(process.cwd(),n.trim()),o=dt.readFileSync(r,{encoding:"utf8"});t.push(...Wn(o))}}if(t.length!==0)return ia(t)},M0=async e=>{let t=e.sshPubkey;if(e.devOs!==!1){if(t){if(t.startsWith("~")&&(t=Ht.join(td.homedir(),t.slice(1))),!dt.existsSync(t))throw new Error(`SSH public key file not found: ${t}`)}else{let n=td.homedir(),r=[Ht.join(n,".ssh","id_rsa.pub"),Ht.join(n,".ssh","id_ed25519.pub"),Ht.join(n,".ssh","id_ecdsa.pub"),Ht.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(ii(`
|
|
278
244
|
SSH public key is required for dev images but not found.
|
|
279
245
|
|
|
280
246
|
Searched for:
|
|
@@ -286,44 +252,67 @@ Error: ${n}
|
|
|
286
252
|
Please either:
|
|
287
253
|
1. Create an SSH key pair: ssh-keygen -t rsa
|
|
288
254
|
2. Specify a different key file: --ssh-pubkey <path>
|
|
289
|
-
`));return}}try{let n=dt.readFileSync(t,"utf8").trim();return
|
|
290
|
-
`);let h=await
|
|
291
|
-
`);else{let
|
|
255
|
+
`));return}}try{let n=dt.readFileSync(t,"utf8").trim();return p.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 D0=(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}),U0=(e,t,n,r,o,a,s)=>{let i={name:"",docker_compose_file:n,allowed_envs:r?.map(d=>d.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:m}=a??nd(e);e.instanceType&&(c.instance_type=e.instanceType),e.vcpu&&(c.vcpu=Number(e.vcpu)),e.memory&&(c.memory=Qu(e.memory)),e.diskSize&&(c.disk_size=ed(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 d=Number(e.nonce);if(Number.isNaN(d))throw new Error(`Invalid nonce value: "${e.nonce}". Nonce must be a valid number.`);c.nonce=d}if(e.nonce&&!e.customAppId)throw new Error("--nonce requires --custom-app-id to be specified.");return c},L0=async(e,t,n,r,o,a,s,i)=>{let c=nd(e),l=await $0(e),m=await M0(e),u=[...n||[]];m&&u.push({key:"DSTACK_AUTHORIZED_KEYS",value:m});let d=D0(e,s),f=U0(e,l,t,u,d,c,i);o.write(`Provisioning CVM ${l}...
|
|
256
|
+
`);let h=await ls(r,f);if(!h.success)throw h.error;let g=h.data,y,S=g.kms_info;if(e.experimentalKeyProviderType&&g.app_id&&g.compose_hash){let k=e.experimentalKeyProviderType,v=S?.k256_pubkey||"",A=ql({compose_hash:`0x${g.compose_hash}`,app_id:`0x${g.app_id}`,key_provider_type:k,key_provider_id:v?`0x${v}`:"0x"});p.info(`mr_config_id (v2): ${A}`)}if(!g.app_id&&!!S?.chain_id&&!!S?.kms_contract_address){if(!S?.chain_id||!S?.chain)throw new Error("KMS chain info is missing from provision response. Please retry or contact support.");if(!S?.kms_contract_address)throw new Error("KMS contract address is missing from provision response. Please retry or contact support.");let k=await P0(e,S.chain_id),v=await Bl({chain:S.chain,rpcUrl:e.rpcUrl,kmsContractAddress:S.kms_contract_address,privateKey:k,deviceId:g.device_id,composeHash:g.compose_hash});if(!v.success)throw v.error??new Error("Deployment contract failed");let A=v.data,P=S.slug||S.id;if(!P)throw new Error("KMS reference (slug or id) is missing from provision response");let L=await Rr(r,{app_id:A.appId,kms:P});if(!L.success)throw L.error;let D=Js(L.data,A.appId,S.k256_pubkey),J=await qe(u,D);y=await Co(r,{app_id:A.appId,encrypted_env:J,compose_hash:g.compose_hash,kms_id:P,contract_address:A.appAuthAddress,deployer_address:A.deployer})}else{let k=u&&u.length>0?await qe(u,g.app_env_encrypt_pubkey):void 0;y=await Co(r,{app_id:g.app_id,encrypted_env:k,compose_hash:g.compose_hash,kms_id:c.deprecatedKmsId})}if(!y.success)throw y.error;let I=y.data;if(e?.json!==!1)o.write(`${JSON.stringify({success:!0,vm_uuid:I.vm_uuid,name:I.name,app_id:I.app_id,dashboard_url:`${fe}/dashboard/cvms/${I.vm_uuid}`},null,2)}
|
|
257
|
+
`);else{let k=ii`
|
|
292
258
|
CVM created successfully!
|
|
293
259
|
|
|
294
|
-
CVM ID: ${
|
|
295
|
-
Name: ${
|
|
296
|
-
App ID: ${
|
|
297
|
-
Dashboard URL: ${
|
|
298
|
-
`;o.write(`${
|
|
299
|
-
`)}},
|
|
300
|
-
`):
|
|
301
|
-
`);else{let Z=["CVM update prepared successfully (pending on-chain approval).","",`Compose Hash: ${
|
|
260
|
+
CVM ID: ${I.vm_uuid}
|
|
261
|
+
Name: ${I.name}
|
|
262
|
+
App ID: ${I.app_id}
|
|
263
|
+
Dashboard URL: ${fe}/dashboard/cvms/${I.vm_uuid}
|
|
264
|
+
`;o.write(`${k}
|
|
265
|
+
`)}},N0=async(e,t,n,r,o,a,s)=>{let i=await G(r,{id:e.uuid});if(!i.success)throw i.error;let c=i.data,l;if(n&&n.length>0){let f=await Pt(r,c);l=await qe(n,f)}let m={id:e.uuid,docker_compose_file:t};s&&(m.pre_launch_script=s),n&&n.length>0&&(m.allowed_envs=n.map(f=>f.key)),l&&(m.encrypted_env=l),e.publicLogs!==void 0&&(m.public_logs=e.publicLogs),e.publicSysinfo!==void 0&&(m.public_sysinfo=e.publicSysinfo),A0(m,e.forceStop),e.prepareOnly&&(m.prepareOnly=!0),p.info(`Updating CVM ${e.uuid}...`);let u=await Zl(r,m);if(!u.success)throw u.error;let d=u.data;if(e.prepareOnly&&!d.requiresOnChainHash){let f="--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:f},null,2)}
|
|
266
|
+
`):p.warn(f);return}if(d.requiresOnChainHash){if(e.prepareOnly){let k=d.kmsInfo?.chain_id,v=d.kmsInfo?.chain,A=c.app_id,P=v?.blockExplorers?.default?.url,L=P&&A?`${P}/address/${A.startsWith("0x")?A:`0x${A}`}`:void 0,D=d.composeHash.startsWith("0x")?d.composeHash:`0x${d.composeHash}`,J=d.onchainStatus,me={success:!0,prepare_only:!0,compose_hash:D,app_id:c.app_id,device_id:d.deviceId,kms_info:d.kmsInfo,chain_id:k,contract_explorer_url:L,onchain_status:J,commit_token:d.commitToken,commit_url:d.commitUrl,api_commit_url:d.apiCommitUrl};if(e.json!==!1)o.write(`${JSON.stringify(me,null,2)}
|
|
267
|
+
`);else{let Z=["CVM update prepared successfully (pending on-chain approval).","",`Compose Hash: ${D}`,`App ID: ${c.app_id}`,`Device ID: ${d.deviceId}`];if(k&&Z.push(`Chain: ${v?.name||"Unknown"} (ID: ${k})`),L&&Z.push(`Contract: ${L}`),Z.push(`Commit Token: ${d.commitToken||"N/A"}`,`Commit URL: ${d.commitUrl||"N/A"}`,`API Commit URL: ${d.apiCommitUrl||"N/A"} (POST)`),J){let te=J.compose_hash_allowed?"registered":"NOT registered",T=J.device_id_allowed?"registered":"NOT registered";Z.push("","On-chain Status:",` Compose Hash: ${te}`,` Device ID: ${T}`),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 ${d.commitToken||"<token>"} \\`,` --compose-hash ${D} \\`," --transaction-hash <tx-hash>"),o.write(`${Z.join(`
|
|
302
268
|
`)}
|
|
303
|
-
`)}return}if(!e.privateKey)throw new Error("Private key is required for contract DstackApp");e.debug&&(console.log("[DEBUG] patchCvm.composeHash:",
|
|
269
|
+
`)}return}if(!e.privateKey)throw new Error("Private key is required for contract DstackApp");e.debug&&(console.log("[DEBUG] patchCvm.composeHash:",d.composeHash),console.log("[DEBUG] cvm.app_id:",c.app_id),console.log("[DEBUG] patchCvm.deviceId:",d.deviceId));let f=c.kms_info?.chain_id,h=f!=null?Et[f]:void 0;if(!h)throw new Error(f!=null?`CVM chain id ${f} is not supported by this CLI build`:"CVM kms_info is missing chain_id");let g=await gn({chain:h,rpcUrl:e.rpcUrl,appAddress:c.app_id,deviceId:d.deviceId,composeHash:d.composeHash});if(!g.success){let k=g.error;throw new Error(`Failed to check on-chain prerequisites (contract: ${c.app_id}): ${k.message}`)}if(e.debug&&console.log("[DEBUG] prereqs:",g.data),!g.data.deviceAllowed){p.info("Device not registered on-chain, adding...");let k=await Qt({chain:h,rpcUrl:e.rpcUrl,appAddress:c.app_id,deviceId:d.deviceId,privateKey:e.privateKey});if(!k.success){let v=k.error;throw new Error(`Failed to register device on-chain (device: ${d.deviceId.slice(0,10)}...): ${v.message}`)}}let y=await Zt({chain:h,rpcUrl:e.rpcUrl,appId:c.app_id,composeHash:d.composeHash,privateKey:e.privateKey});if(!y.success){let k=y.error;throw new Error(`Failed to register compose hash on-chain (hash: ${d.composeHash.slice(0,10)}...): ${k.message}`)}let _=y.data.transactionHash;e.debug&&console.log("[DEBUG] transactionHash:",_);let I=await Ql(r,{id:e.uuid,composeHash:d.composeHash,transactionHash:_});if(!I.success){let k=I.error.message,v="status"in I.error?I.error.status:void 0;throw v===466?new Error("Compose hash expired. Please retry the update from the beginning."):v===467?new Error(`Transaction verification failed on backend. Hash: ${_}`):v===468?new Error(`Compose hash not found on-chain. Contract: ${c.app_id}`):new Error(`Failed to confirm CVM update after on-chain registration: ${k}`)}}if(e.wait){p.info("Waiting for update to complete...");try{await ta(e.uuid,3e5,a)}catch(f){throw new Error(`Wait failed: ${f instanceof Error?f.message:String(f)}`)}}e?.json!==!1?o.write(`${JSON.stringify({success:!0,vm_uuid:e.uuid,name:c.name,app_id:c.app_id,dashboard_url:`${fe}/dashboard/cvms/${e.uuid}`},null,2)}
|
|
304
270
|
`):o.write(`CVM updated successfully!
|
|
305
|
-
`)},
|
|
271
|
+
`)},O0=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||p.info("No --transaction-hash provided, using 'already-registered' (state-only check)"),p.info(`Committing CVM update for ${e.uuid}...`);let r=await em(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)}
|
|
306
272
|
`):n.write(`CVM update committed successfully! Correlation ID: ${r.data.correlationId}
|
|
307
|
-
`)};async function
|
|
308
|
-
`):
|
|
309
|
-
`)
|
|
310
|
-
`)
|
|
273
|
+
`)};async function rd(e,t){try{if(e.commit){let f=await E(t,{apiToken:e.apiToken}),h=t.cvmId?H.parse(t.cvmId).cvmId:void 0;await O0({...e,uuid:h},f,t.stdout);return}let n=e.compose||t.projectConfig.compose_file,r=await R0({context:t,apiToken:e.apiToken,interactive:e.interactive}),o=await x0({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>Er){let f=Er/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 ${f}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},m=await T0(l);e.debug&&(console.log("[DEBUG] context.cvmId:",JSON.stringify(t.cvmId)),console.log("[DEBUG] input.cvmId:",e.cvmId));let u=t.cvmId?H.parse(t.cvmId).cvmId:void 0;return e.debug&&(console.log("[DEBUG] resolved uuid:",u),console.log("[DEBUG] isUpdate:",!!u)),!!u?await N0({...e,uuid:u},o,m,r,t.stdout,t,a):await L0(e,o,m??[],r,t.stdout,t.stderr,t.projectConfig,a),0}catch(n){let r=!!t.cvmId;return t.failWithError(n,{operation:r?"CVM update":"CVM deployment",debug:e.debug,guidance:r?"Check the CVM status before retrying. Include the Request ID when contacting support.":void 0}),1}}async function j0(e,t){return rd(e,t)}var od=b({path:["deploy"],meta:Yu,schema:Xu,handler:j0});var ad={path:["docs"],meta:{name:"docs",category:"advanced",description:"Search and read the live Phala documentation (docs.phala.com) from the terminal",stability:"unstable"}};var F0="https://docs.phala.com/mcp",V0=6e4;function sd(e=process.env){return e.PHALA_DOCS_MCP_URL||F0}function z0(e){let t=e.trim();if(t.startsWith("{"))return JSON.parse(t);let n;for(let r of t.split(`
|
|
274
|
+
`))if(r.startsWith("data:"))try{n=JSON.parse(r.slice(5).trim())}catch{}if(!n)throw new Error("Unexpected response from the docs server");return n}async function Jr(e,t,n={}){let r=n.url??sd(),o=n.timeoutMs??V0,a;try{a=await fetch(r,{method:"POST",signal:AbortSignal.timeout(o),headers:{"Content-Type":"application/json",Accept:"application/json, text/event-stream"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"tools/call",params:{name:e,arguments:t}})})}catch(l){throw l instanceof DOMException&&l.name==="TimeoutError"?new Error(`Phala docs server at ${r} did not respond within ${Math.round(o/1e3)}s. Try again shortly, or browse https://docs.phala.com directly.`):new Error(`Could not reach the Phala docs server at ${r}. Check your network connection, or browse https://docs.phala.com directly. (${l instanceof Error?l.message:String(l)})`)}if(!a.ok)throw new Error(`Phala docs server returned HTTP ${a.status}. Try again shortly, or browse https://docs.phala.com directly.`);let s=z0(await a.text());if(s.error)throw new Error(`Docs server error: ${s.error.message??JSON.stringify(s.error)}`);let i=s.result?.content,c=Array.isArray(i)?i.filter(l=>l?.type==="text"&&typeof l.text=="string").map(l=>l.text).join(`
|
|
275
|
+
`):"";if(s.result?.isError)throw new Error(c||"Docs tool call failed");return c}function H0(e){let t=0,n=e,r=e.match(/^exit:\s*(-?\d+)\r?\n?/);r&&(t=Number(r[1]),n=e.slice(r[0].length));let o=null,a=[],s=[];for(let i of n.split(`
|
|
276
|
+
`)){if(i==="--- stdout ---"){o="stdout";continue}if(i==="--- stderr ---"){o="stderr";continue}o==="stderr"?s.push(i):o==="stdout"&&a.push(i)}return o===null?{exit:t,stdout:n,stderr:""}:{exit:t,stdout:a.join(`
|
|
277
|
+
`),stderr:s.join(`
|
|
278
|
+
`)}}async function sr(e,t={}){let n=await Jr("query_docs_filesystem_phala",{command:e},t);return H0(n)}function Sn(e){return`'${e.replace(/'/g,"'\\''")}'`}function Tt(e){return{url:sd(e.env),timeoutMs:Or(e)*1e3}}function sn(e){let t=e.trim();return t=t.replace(/^https?:\/\/docs\.phala\.com/i,""),t=t.split("#")[0].split("?")[0],t.startsWith("/")||(t=`/${t}`),t}import{z as Yr}from"zod";var id={name:"feedback",category:"advanced",description:"Report a documentation problem (incorrect, outdated, or confusing content) to the Phala docs team",stability:"unstable",arguments:[{name:"page",description:"Docs page path the feedback is about (e.g. /phala-cloud/getting-started)",required:!0,target:"page"},{name:"message...",description:"Description of the issue",required:!0,variadic:!0,target:"message"}],options:[Q],examples:[{name:"Report an outdated page",value:'phala docs feedback /phala-cloud/getting-started "The login example still shows the deprecated auth command"'}]},cd=Yr.object({page:Yr.string().min(1),message:Yr.array(Yr.string()).min(1),json:Yr.boolean().default(!1)});async function q0(e,t){let n=sn(e.page).replace(/\.mdx$/,""),r=e.message.join(" ");try{let o=await Jr("submit_feedback",{path:n,feedback:r},Tt(t));return e.json?(t.success({path:n,feedback:r,response:o}),0):(t.stdout.write(`${o.trim()||"Feedback submitted. Thanks for helping improve the docs."}
|
|
279
|
+
`),0)}catch(o){return t.fail(o instanceof Error?o.message:String(o)),1}}var ld=b({path:["docs","feedback"],meta:id,schema:cd,handler:q0});import{z as Xr}from"zod";var md={name:"grep",category:"advanced",description:"Grep the full text of the Phala documentation (ripgrep, smart-case). For relevance-ranked results use `phala docs search`.",stability:"unstable",arguments:[{name:"pattern",description:"Regex pattern to search for",required:!0,target:"pattern"},{name:"path",description:"Docs path to search under (default: /)",required:!1,target:"path"}],options:[{name:"files",shorthand:"l",description:"Only list matching file paths",type:"boolean",target:"files"},Q],examples:[{name:"Find every mention of an env var",value:"phala docs grep PHALA_CLOUD_API_KEY"},{name:"Search within one section",value:'phala docs grep "attestation" /dstack'},{name:"List matching pages only",value:"phala docs grep tdx_quote --files"}]},pd=Xr.object({pattern:Xr.string().min(1),path:Xr.string().optional(),files:Xr.boolean().default(!1),json:Xr.boolean().default(!1)});async function K0(e,t){let n=e.path?sn(e.path):"/",r=e.files?"-Sl":"-Sn";try{let o=await sr(`rg ${r} -e ${Sn(e.pattern)} ${Sn(n)}`,Tt(t));if(o.exit!==0&&o.stderr.trim())return t.fail(o.stderr.trim()),1;let a=o.stdout;return e.json?(t.success({pattern:e.pattern,path:n,matches:a}),0):a.trim()?(t.stdout.write(a.endsWith(`
|
|
280
|
+
`)?a:`${a}
|
|
281
|
+
`),0):(t.stdout.write(`No matches for "${e.pattern}". Try \`phala docs search\` for relevance-ranked results.
|
|
282
|
+
`),0)}catch(o){return t.fail(o instanceof Error?o.message:String(o)),1}}var ud=b({path:["docs","grep"],meta:md,schema:pd,handler:K0});import{z as la}from"zod";var dd={name:"read",category:"advanced",description:"Read one or more Phala documentation pages in full. Accepts page paths from `phala docs search`/`phala docs tree` or docs.phala.com URLs.",stability:"unstable",arguments:[{name:"page...",description:"Page path (e.g. /phala-cloud/getting-started) or docs.phala.com URL",required:!0,variadic:!0,target:"pages"}],options:[Q],examples:[{name:"Read a page by path",value:"phala docs read /dstack/getting-started"},{name:"Read a page by URL",value:"phala docs read https://docs.phala.com/phala-cloud/getting-started/overview"},{name:"Read multiple pages",value:"phala docs read /dstack/overview /dstack/faqs"}]},fd=la.object({pages:la.array(la.string()).min(1),json:la.boolean().default(!1)});function G0(e){return/\.[a-z0-9]+$/i.test(e)?[e]:[`${e}.mdx`,e,`${e}/index.mdx`]}async function B0(e,t){let n=sn(e),r=G0(n),o=null;for(let s of r){let i=await sr(`cat ${Sn(s)}`,t);if(i.exit===0)return{page:e,resolvedPath:s,content:i.stdout,error:null};o=i}let a=r.length===1?o?.stderr.trim():void 0;return{page:e,resolvedPath:n,content:null,error:a||`Page not found: ${n}. Find pages with \`phala docs search <query>\` or \`phala docs tree\`.`}}async function W0(e,t){let n=Tt(t);try{let r=[];for(let a of e.pages)r.push(await B0(a,n));let o=r.filter(a=>a.error!==null);if(e.json)return o.length===r.length?(t.fail(o[0].error??"Failed to read docs",{results:r}),1):(t.success({pages:r}),0);for(let a of r)r.length>1&&t.stdout.write(`==> ${a.resolvedPath} <==
|
|
283
|
+
`),a.content!==null?t.stdout.write(a.content.endsWith(`
|
|
284
|
+
`)?a.content:`${a.content}
|
|
285
|
+
`):t.stderr.write(`${a.error}
|
|
286
|
+
`),r.length>1&&t.stdout.write(`
|
|
287
|
+
`);return o.length>0?1:0}catch(r){return t.fail(r instanceof Error?r.message:String(r)),1}}var gd=b({path:["docs","read"],meta:dd,schema:fd,handler:W0});import{z as ma}from"zod";var hd={name:"search",category:"advanced",description:"Search the live Phala documentation. Returns titles, links, and content excerpts. Use `phala docs read <page>` to read a full page.",stability:"unstable",arguments:[{name:"query...",description:"Search query (multiple words are joined)",required:!0,variadic:!0,target:"query"}],options:[Q],examples:[{name:"Search the docs",value:"phala docs search deploy a CVM with GPU"},{name:"Search and output JSON",value:'phala docs search "on-chain KMS" --json'}]},yd=ma.object({query:ma.array(ma.string()).min(1),json:ma.boolean().default(!1)});async function J0(e,t){let n=e.query.join(" ");try{let r=await Jr("search_phala",{query:n},Tt(t));return e.json?(t.success({query:n,results:r}),0):r.trim()?(t.stdout.write(r.endsWith(`
|
|
288
|
+
`)?r:`${r}
|
|
289
|
+
`),t.stdout.write("\nTip: read a full page with `phala docs read <page path>`.\n"),0):(t.stdout.write(`No results for "${n}". Try broader terms, or explore with \`phala docs tree\`.
|
|
290
|
+
`),0)}catch(r){return t.fail(r instanceof Error?r.message:String(r)),1}}var bd=b({path:["docs","search"],meta:hd,schema:yd,handler:J0});import{z as pa}from"zod";var vd={name:"tree",category:"advanced",description:"Show the structure of the Phala documentation site as a directory tree",stability:"unstable",arguments:[{name:"path",description:"Docs path to start from (default: /)",required:!1,target:"path"}],options:[{name:"depth",shorthand:"L",description:"Maximum depth to display (default: 2)",type:"number",target:"depth"},Q],examples:[{name:"Show the top-level docs structure",value:"phala docs tree"},{name:"Explore a section in depth",value:"phala docs tree /phala-cloud --depth 3"}]},Cd=pa.object({path:pa.string().optional(),depth:pa.coerce.number().int().min(1).max(10).default(2),json:pa.boolean().default(!1)});async function Y0(e,t){let n=e.path?sn(e.path):"/";try{let r=await sr(`tree ${Sn(n)} -L ${e.depth}`,Tt(t));return r.exit!==0?(t.fail(r.stderr.trim()||`Failed to list ${n}`),1):e.json?(t.success({path:n,depth:e.depth,tree:r.stdout}),0):(t.stdout.write(r.stdout.endsWith(`
|
|
291
|
+
`)?r.stdout:`${r.stdout}
|
|
292
|
+
`),t.stdout.write("\nTip: read a page with `phala docs read <path>`; search with `phala docs search <query>`.\n"),0)}catch(r){return t.fail(r instanceof Error?r.message:String(r)),1}}var wd=b({path:["docs","tree"],meta:vd,schema:Cd,handler:Y0});var ci={group:ad,commands:[bd,gd,wd,ud,ld]};var _d={path:["envs"],meta:{name:"envs",category:"manage",description:"Encrypt and update CVM sealed environment variables",stability:"stable"}};import Sd from"fs";import X0 from"path";function ua(e){let t=sa(e),n=[];for(let r of t.files){let o=X0.resolve(r);if(!Sd.existsSync(o))throw new Error(`Environment file not found: ${r}`);let a=Sd.readFileSync(o,"utf8"),s=Wn(a);n.push(...s)}return n.push(...t.keyValues),ia(n)}import{z as ir}from"zod";var kd={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"}]},Id=ir.object({cvmId:ir.string().optional(),env:ir.array(ir.string()).min(1,"At least one -e argument is required"),noNewline:ir.boolean().default(!1),interactive:ir.boolean().default(!1)});async function Z0(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=ua(e.env);if(n.length===0)return t.fail("No environment variables found in the provided inputs."),1;let r=await E(t),o=await G(r,t.cvmId);if(!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Encrypt envs",debug:!!e.debug}),1;let a=o.data,s=await Pt(r,a),i=await qe(n,s);return process.stdout.write(e.noNewline?i:`${i}
|
|
293
|
+
`),0}catch(n){return t.fail(n instanceof Error?n.message:String(n)),1}}var Ed=b({path:["envs","encrypt"],meta:kd,schema:Id,handler:Z0});import{z as cn}from"zod";var Ad={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"},tt,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>"}]},Rd=cn.object({cvmId:cn.string().optional(),env:cn.array(cn.string()).optional(),encryptedEnv:cn.string().optional(),privateKey:cn.string().optional(),rpcUrl:cn.string().optional(),interactive:cn.boolean().default(!1)});async function Q0(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};if(!t.cvmId)return t.fail("No CVM ID provided. Pass a CVM identifier or set it in phala.toml."),1;let r=n.env&&n.env.length>0,o=!!n.encryptedEnv;if(!r&&!o)return t.fail("Provide either -e (environment variables) or --encrypted-env (pre-encrypted hex)."),1;if(r&&o)return t.fail("Cannot use both -e and --encrypted-env at the same time."),1;try{let a=await E(t),s=await G(a,t.cvmId);if(!s.success)return t.failWithError(s.error.cause??s.error,{operation:"Update envs",debug:!!n.debug}),1;let i=s.data,c,l;if(r&&n.env){let d=ua(n.env);if(d.length===0)return t.fail("No environment variables found in the provided inputs."),1;l=d.map(h=>h.key);let f=await Pt(a,i);c=await qe(d,f)}else if(n.encryptedEnv)c=n.encryptedEnv;else return t.fail("No environment input provided."),1;p.info("Updating environment variables...");let m=await wo(a,{id:i.id,encrypted_env:c,env_keys:l});if(!m.success)return t.failWithError(m.error.cause??m.error,{operation:"Update envs",debug:!!n.debug}),1;let u=m.data;if(u.status==="in_progress")return p.success(`Environment update initiated (correlation_id: ${u.correlation_id})`),0;if(u.status==="precondition_required"){let d=n.privateKey||process.env.PRIVATE_KEY;if(!d)return t.fail("On-chain KMS requires a private key. Use --private-key or set PRIVATE_KEY env var."),1;p.info("Environment key list changed \u2014 registering compose hash on-chain...");let f=u.kms_info.chain;if(!f)return t.fail(`Unsupported chain_id ${u.kms_info.chain_id} \u2014 update @phala/cloud to add support.`),1;let h=await Zt({chain:f,rpcUrl:n.rpcUrl,appId:u.app_id,composeHash:u.compose_hash,privateKey:d});if(!h.success){let S=h;return t.failWithError(S.error??h,{operation:"Update envs",debug:!!n.debug}),1}let g=h.data;p.info("Completing environment update...");let y=await wo(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"?(p.success(`Environment update initiated (correlation_id: ${y.data.correlation_id})`),0):(t.fail("Unexpected response after on-chain verification."),1):(t.failWithError(y.error.cause??y.error,{operation:"Update envs",debug:!!n.debug}),1)}return t.fail(`Unexpected response status: ${u.status}`),1}catch(a){return t.fail(a instanceof Error?a.message:String(a)),1}}var xd=b({path:["envs","update"],meta:Ad,schema:Rd,handler:Q0});var li={group:_d,commands:[Ed,xd]};import{z as Pd}from"zod";function eI(){let e=[{name:"List available help topics",value:"phala help"}];for(let t of Object.values(tn))e.push({name:`Show "${t.name}" topic`,value:`phala help ${t.name}`});return e}var $d={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:eI()},Td=Pd.object({topic:Pd.string().optional()});function tI(){let e=Object.values(tn);if(e.length===0)return`This build contains no help topics.
|
|
311
294
|
`;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(`
|
|
312
295
|
`)}
|
|
313
|
-
`}async function
|
|
296
|
+
`}async function nI(e,t){if(!e.topic)return t.stdout.write(tI()),0;let n=e.topic.trim().toLowerCase(),r=tn[n];if(!r){let a=Object.keys(tn).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(`
|
|
314
297
|
`)?r.content:`${r.content}
|
|
315
|
-
`;return t.stdout.write(o),0}var
|
|
316
|
-
`)}async function
|
|
317
|
-
`),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,i=e.profile||s||"default";return
|
|
318
|
-
`)),0}catch(n){
|
|
319
|
-
`)
|
|
320
|
-
`),await
|
|
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(`
|
|
298
|
+
`;return t.stdout.write(o),0}var Md=b({path:["help"],meta:$d,schema:Td,handler:nI});import fa from"path";import Fd from"fs-extra";import yt from"chalk";import di from"inquirer";import Zr from"chalk";import rI from"open";import oI from"ora";import aI from"prompts";import{z as kn}from"zod";var Dd={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"}]},Ud=kn.object({apiKey:kn.string().min(1,"API key cannot be empty").optional(),manual:kn.boolean().optional(),noOpen:kn.boolean().optional(),profile:kn.string().min(1).optional(),printToken:kn.boolean().optional(),url:kn.string().url().optional()});function Ld(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 ln(e,t=""){e.write(`${t}
|
|
299
|
+
`)}async function cr(e){let t=await jr(e.apiKey,{baseURL:e.baseURL}),n=await Qe(t);if(!n.success||!n.data?.user.username)throw new Error("Invalid API key");return n.data}async function mi(e){let t,n=await aI({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 cr({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 cr({apiKey:n.apiKey,baseURL:e.baseURL})),{apiKey:n.apiKey,user:t}}async function pi(e,t){let n=Ot({useCookieAuth:!0,baseURL:t.baseURL,headers:{"User-Agent":jt}}),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=t.workspaceSlug?`${s}&workspace=${encodeURIComponent(t.workspaceSlug)}`:s,m=i,u=t.printToken?e.stderr:e.stdout;if(ln(u),ln(u,Zr.bold("To authenticate, visit:")),ln(u,Zr.cyan(l)),ln(u),ln(u,`${Zr.bold("And enter code:")} ${Zr.yellow(a)}`),ln(u),!t.noOpen)try{await rI(l),ln(u,"Opening browser automatically...")}catch{ln(u,"Could not open browser automatically. Please visit the URL above.")}let d=oI("Waiting for authorization...").start(),f=Date.now()+c*1e3;for(;Date.now()<f;){await new Promise(h=>setTimeout(h,m*1e3));try{let h=await n.post("/auth/device/token",{device_code:o,grant_type:"urn:ietf:params:oauth:grant-type:device_code"});return d.succeed("Authorization successful!"),h.access_token}catch(h){if(h instanceof It)throw d.stop(),new Error(Wc(h));if(h instanceof vo){let g=Ld(h);if(g)switch(g.error){case"authorization_pending":continue;case"slow_down":m+=5;continue;case"expired_token":throw d.fail("Authorization expired"),new Error(g.error_description||"Device authorization expired. Please try again.");case"access_denied":throw d.fail("Authorization denied"),new Error(g.error_description||"You denied the authorization request.");default:throw d.fail("Authorization failed"),new Error(`Authorization failed: ${g.error_description||g.error}`)}}throw d.fail("Request failed"),h}}throw d.fail("Authorization timed out"),new Error("Authorization timed out. Please try again.")}async function da(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||At,r,o;if(e.apiKey)r=e.apiKey,o=await cr({apiKey:r,baseURL:n});else if(e.manual){let c=await mi({baseURL:n});r=c.apiKey,o=c.user}else r=await pi(t,{noOpen:e.noOpen,printToken:e.printToken,baseURL:n}),o=await cr({apiKey:r,baseURL:n});if(!o)throw new Error("Failed to validate API key");if(e.printToken)return t.stdout.write(`${r}
|
|
300
|
+
`),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,i=e.profile||s||"default";return Qn({profileName:i,token:r,apiPrefix:n,workspaceName:a,workspaceSlug:s,user:{username:o.user.username,email:o.user.email},setCurrent:!0}),t.stdout.write(Zr.green(`Welcome ${o.user.username}! Credentials saved successfully (profile: ${i})
|
|
301
|
+
`)),0}catch(n){return t.failWithError(n,{operation:"Login",debug:!!e.debug}),1}}var Nd=b({path:["login"],meta:Dd,schema:Ud,handler:da});import{z as ui}from"zod";var sI={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},Od={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:[sI],examples:[{name:"Link by name or ID",value:"phala link my-cvm-name"},{name:"Link interactively",value:"phala link"}]},jd=ui.object({cvmId:ui.string().optional(),json:ui.boolean().default(!1)});function iI(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function Vd(){let e=["docker-compose.yml","docker-compose.yaml"];for(let t of e)if(Fd.existsSync(fa.join(process.cwd(),t)))return t}function zd(){let e=".env.production";if(Fd.existsSync(fa.join(process.cwd(),e)))return e}var cI=/^(0x)?[0-9a-f]{40}$/i;function lI(e){return cI.test(e)}function mI(e){return e.replace(/^0x/i,"").toLowerCase()}async function fi(e){let t=xt(e);if(!t.apiKey){if(p.info(`Not authenticated. Starting login flow...
|
|
302
|
+
`),await da({manual:!1,noOpen:!1},e)!==0||(t=xt(e),!t.apiKey))return null;console.log()}let n=a=>{let s=a.workspace?.name||"default",i=a.workspace?.slug?` (${a.workspace.slug})`:"";p.success(`Authenticated as ${a.user?.username||"unknown"}`),p.info(`Workspace: ${s}${i}`),console.log()},r=await E(e),o=await Qe(r);if(!o.success){if(p.info(`API key expired or invalid. Starting login flow...
|
|
303
|
+
`),await da({manual:!1,noOpen:!1},e)!==0||(t=xt(e),!t.apiKey))return null;let s=await E(e),i=await Qe(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 Hd(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),Ms(t),console.log(),console.log(yt.bold("Created phala.toml:")),console.log(yt.dim(` name = "${e.cvmName}"`)),e.appId&&console.log(yt.dim(` app_id = "${e.appId}"`)),console.log(yt.dim(` profile = "${e.profile}"`)),e.composeFile&&console.log(yt.dim(` compose_file = "${e.composeFile}"`)),e.envFile&&console.log(yt.dim(` env_file = "${e.envFile}"`)),console.log(),p.success("Project linked successfully!"),p.info('Run "phala deploy" to update your CVM.')}async function pI(e,t){try{if(e.cvmId)return await dI(e.cvmId,t);if(Lr()){let n=Yn();if(n.cvm_id&&!n.app_id)return await uI(n,t)}return await fI(t)}catch(n){if(iI(n))return console.log(),p.info("Link cancelled."),0;throw n}}async function uI(e,t){if(!await fi(t))return t.fail("Authentication failed."),1;let r=await E(t),o=await G(r,{id:e.cvm_id});if(!o.success)return t.fail(`Failed to fetch CVM info for ${e.cvm_id}: ${o.error?.message||"Unknown error"}`),1;let a=o.data;if(!a.app_id)return p.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 Ms(c),p.success(`Updated phala.toml with app_id = "${a.app_id}"`),0}async function dI(e,t){let n=await fi(t);if(!n)return t.fail("Authentication failed."),1;let r=n.profileName,o=await E(t),a,s;if(lI(e)){let l=mI(e),m=await cm(o,{appId:l});if(!m.success)return t.fail(`App not found: ${l}`),1;let u=m.data;s=u.app_id,a=u.current_cvm?.name||u.name||fa.basename(process.cwd()),p.success(`Found app: ${s}`)}else{let l=await G(o,{id:e});if(!l.success)return t.fail(`CVM not found: ${e}`),1;let m=l.data;a=m.name||e,s=m.app_id||void 0,p.success(`Found CVM: ${a}`)}if(Lr()){let{overwrite:l}=await di.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!l)return p.info("Link cancelled."),0}let i=Vd(),c=zd();return(i||c)&&(console.log(),p.info("Detected local files:"),i&&console.log(yt.green(` \u2713 ${i}`)),c&&console.log(yt.green(` \u2713 ${c}`))),Hd({cvmName:a,appId:s,composeFile:i,envFile:c,profile:r}),0}async function fI(e){let t=await fi(e);if(!t)return e.fail("Authentication failed."),1;let n=t.profileName,r=p.startSpinner("Fetching your CVMs..."),o=await E(e),a=await Ar(o);if(r.stop(!0),!a.success)return e.failWithError(a.error.cause??a.error,{operation:"Link project"}),1;let i=a.data.items??[];if(i.length===0)return p.warn("You don't have any CVMs yet."),p.info('Deploy your first CVM with "phala deploy"'),0;let c=fa.basename(process.cwd()),l=i.map(g=>{let y=g.hosted?.app_id||g.hosted?.id||"",S=g.name||g.hosted?.name||"Unnamed",_=g.status||g.hosted?.status||"Unknown",I=g.hosted?.app_id||void 0;return{name:`${S} (${y}) - Status: ${_}`,value:S,cvmName:S,appId:I}}),m=l.findIndex(g=>g.cvmName.toLowerCase()===c.toLowerCase());console.log(yt.bold(`Found ${i.length} CVM(s):
|
|
304
|
+
`));let{selectedCvm:u}=await di.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM to link:",choices:l.map(g=>({name:g.name,value:g.value})),default:m>=0?m:0}]);if(Lr()){let{overwrite:g}=await di.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!g)return p.info("Link cancelled."),0}let d=Vd(),f=zd();console.log(),(d||f)&&(p.info("Detected local files:"),d&&console.log(yt.green(` \u2713 ${d}`)),f&&console.log(yt.green(` \u2713 ${f}`)),console.log());let h=l.find(g=>g.value===u);return Hd({cvmName:u,appId:h?.appId,composeFile:d,envFile:f,profile:n}),0}var qd=b({path:["link"],meta:Od,schema:jd,handler:pI});import{z as gI}from"zod";var Kd={name:"logout",category:"profile",description:"Remove stored API key",stability:"stable"},Gd=gI.object({});async function hI(e,t){let n=t.globalOptions?.json===!0;try{let r=Re(),o=r?.current_profile,a=o?r?.profiles[o]:void 0,s=!1;if(a?.token){let c=await tr({apiKey:a.token,baseURL:a.api_prefix});s=c.outcome==="revoked",!n&&c.outcome==="failed"&&p.warn(`Could not revoke the API token on the server: ${c.message}`)}Mo();let i=o?`Credentials removed successfully (profile: ${o})`:"Credentials removed successfully";return n?(t.success({message:i,profile:o||null,revoked:s}),0):(p.success(i),s&&p.info("API token revoked on the server"),0)}catch(r){return n?(t.fail("Failed to remove credentials"),1):(p.error("Failed to remove credentials"),p.logDetailedError(r),1)}}var Bd=b({path:["logout"],meta:Kd,schema:Gd,handler:hI});var Wd={path:["kms"],meta:{name:"kms",category:"deploy",description:"Manage on-chain KMS contracts",stability:"unstable"}};import{z as Jd}from"zod";var Yd={name:"list",aliases:["ls"],description:"List KMS contracts",stability:"unstable",options:[Q],examples:[{name:"List KMS contracts",value:"phala kms list"},{name:"Output as JSON",value:"phala kms list --json"}]},gi=Jd.object({json:Jd.boolean().default(!1)});var yI={0:"phala",1:"ethereum",8453:"base",31337:"anvil"};function bI(e){return yI[e]??`chain-${e}`}async function Xd(e,t){try{let n=await E(t),r=await ms(n,{page_size:100});if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"List KMS",debug:!!e.debug}),1;let o=r.data;if(e.json)return t.success(o),0;if(o.items.length===0)return p.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:bI(i.chain_id),CONTRACT_ADDRESS:i.contract_address,NODES:String(i.node_count)}));return ce(a,s),0}catch(n){return t.failWithError(n,{operation:"List KMS",debug:!!e.debug}),1}}var vI={name:"kms",description:"List and manage KMS contracts",stability:"unstable"},Zd=b({path:["kms","list"],meta:Yd,schema:gi,handler:Xd}),Qd=b({path:["kms"],meta:vI,schema:gi,handler:Xd});import{z as hi}from"zod";var CI={name:"slug",description:"KMS contract slug (e.g. phala, base, ethereum)",required:!0,target:"slug"},ef={name:"nodes",description:"List the KMS nodes (with RPC url) under a contract",stability:"unstable",arguments:[CI],options:[Q],examples:[{name:"List nodes of the phala KMS contract",value:"phala kms nodes phala"},{name:"Output as JSON",value:"phala kms nodes phala --json"}]},tf=hi.object({slug:hi.string(),json:hi.boolean().default(!1)});async function wI(e,t){try{let n=await E(t),r=await us(n,{slug:e.slug});if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"List KMS nodes",debug:!!e.debug}),1;let o=r.data;if(e.json)return t.success(o),0;if(o.items.length===0)return p.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 ce(a,s),0}catch(n){return t.failWithError(n,{operation:"List KMS nodes",debug:!!e.debug}),1}}var nf=b({path:["kms","nodes"],meta:ef,schema:tf,handler:wI});import{z as rf}from"zod";var yi=e=>({name:e,description:`Show on-chain KMS details for ${e}`,stability:"unstable",options:[Q],examples:[{name:`Show ${e} KMS details`,value:`phala kms ${e}`},{name:"Output as JSON",value:`phala kms ${e} --json`}]}),ga=rf.object({json:rf.boolean().default(!1)});var _I={1:"https://etherscan.io",8453:"https://basescan.org"};function of(e,t){let n=_I[e];return n?`${n}/address/${t}`:null}function af(e){return e===!0?"yes":e===!1?"no":"-"}function lr(e){return e?e.startsWith("0x")?e:`0x${e}`:"-"}var SI=13;function qt(e,t){console.log(`${e.padEnd(SI)}${t}`)}function kI(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 sf(e){return async function(n,r){try{let o=await E(r),a=await _s(o,{chain:e});if(!a.success)return r.failWithError(a.error.cause??a.error,{operation:"List KMS chains",debug:!!n.debug}),1;let s=a.data;return n.json?(r.success(s),0):s.contracts.length===0?(p.info(`No KMS contracts found on ${e}`),0):(s.contracts.forEach((i,c)=>{c>0&&console.log(""),qt("Contract",i.contract_address);let l=of(i.chain_id,i.contract_address);if(l&&qt("",l),i.gateway_contract_address){qt("Gateway",i.gateway_contract_address);let m=of(i.chain_id,i.gateway_contract_address);m&&qt("",m)}if(qt("K256 pubkey",lr(i.k256_pubkey)),qt("CA pubkey",lr(i.ca_pubkey)),console.log(""),console.log("Devices (nodes currently hosting this KMS)"),i.devices.length>0){let m=["DEVICE_ID","NODE","ON_CHAIN"],u=i.devices.map(d=>({DEVICE_ID:lr(d.device_id),NODE:typeof d.node_name=="string"&&d.node_name.length>0?d.node_name:"-",ON_CHAIN:af(d.on_chain_allowed)}));ce(m,u)}else console.log(" none");if(console.log(""),console.log("Allowed OS Images (this KMS permits deploying)"),i.os_images.length>0){let m=["NAME","VERSION","OS_IMAGE_HASH","ON_CHAIN"],u=[...i.os_images].sort((d,f)=>kI(d.version,f.version)).map(d=>({NAME:d.name,VERSION:d.version,OS_IMAGE_HASH:lr(d.os_image_hash),ON_CHAIN:af(d.on_chain_allowed)}));ce(m,u)}else console.log(" none")}),0)}catch(o){return r.failWithError(o,{operation:"List KMS chains",debug:!!n.debug}),1}}}var cf=b({path:["kms","ethereum"],meta:yi("ethereum"),schema:ga,handler:sf("ethereum")}),lf=b({path:["kms","base"],meta:yi("base"),schema:ga,handler:sf("base")});async function II(e,t){try{let n=await E(t),r=await ps(n,{slug:"phala"});if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"List KMS chains",debug:!!e.debug}),1;let o=r.data;return e.json?(t.success(o),0):(o.label&&qt("Name",o.label),qt("K256 pubkey",lr(o.k256_pubkey)),qt("CA pubkey",lr(o.ca_pubkey)),0)}catch(n){return t.failWithError(n,{operation:"List KMS chains",debug:!!e.debug}),1}}var mf=b({path:["kms","phala"],meta:{name:"phala",description:"Show the off-chain Phala KMS root keys",stability:"unstable",options:[Q],examples:[{name:"Show Phala KMS keys",value:"phala kms phala"},{name:"Output as JSON",value:"phala kms phala --json"}]},schema:ga,handler:II});var bi={group:Wd,commands:[Qd,Zd,nf,cf,lf,mf]};var pf={path:["nodes"],meta:{name:"nodes",category:"deploy",description:"Manage TEE nodes",stability:"unstable"}};import{z as ha}from"zod";var uf={name:"list",aliases:["ls"],description:"List workspace nodes",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},Q],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"}]},vi=ha.object({page:ha.coerce.number().int().min(1).default(1),pageSize:ha.coerce.number().int().min(1).max(100).default(30),json:ha.boolean().default(!1)});async function df(e,t){try{let n=await E(t),r=await Qe(n);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"List nodes",debug:!!e.debug}),1;let o=r.data.workspace.slug;if(!o)return t.fail("Workspace slug is not available. Please contact support."),1;let a=await Xl(n,{teamSlug:o,page:e.page,pageSize:e.pageSize});if(!a.success)return t.failWithError(a.error.cause??a.error,{operation:"List nodes",debug:!!e.debug}),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?(p.info("No nodes found"),0):(ce(i,c),p.info(`Page ${s.page}/${s.pages} (total ${s.total})`),0)}catch(n){return t.failWithError(n,{operation:"List nodes",debug:!!e.debug}),1}}var EI={name:"nodes",description:"List and manage TEE nodes",stability:"unstable"},ff=b({path:["nodes","list"],meta:uf,schema:vi,handler:df}),gf=b({path:["nodes"],meta:EI,schema:vi,handler:df});var Ci={group:pf,commands:[gf,ff]};import{z as In}from"zod";var hf={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"},Q],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"}]},yf=In.object({dev:In.boolean().default(!1),prod:In.boolean().default(!1),page:In.number().int().min(1).default(1),pageSize:In.number().int().min(1).max(100).default(100),all:In.boolean().default(!1),json:In.boolean().default(!1)});async function AI(e,t){try{let n=await E(t),r=e.dev?!0:e.prod?!1:void 0,o=async l=>await ws(n,{page:l,page_size:e.pageSize,is_dev:r}),a=await o(e.page);if(!a.success)return t.failWithError(a.error.cause??a.error,{operation:"List OS images",debug:!!e.debug}),1;let s=a.data;if(e.all&&s.pages>s.page){let l=[...s.items];for(let m=s.page+1;m<=s.pages;m++){let u=await o(m);if(!u.success)return t.failWithError(u.error.cause??u.error,{operation:"List OS images",debug:!!e.debug}),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?(p.info("No OS images found"),0):(ce(i,c),p.info(`Total: ${s.total}`),0)}catch(n){return t.failWithError(n,{operation:"List OS images",debug:!!e.debug}),1}}var bf=b({path:["os-images"],meta:hf,schema:yf,handler:AI});import{z as $I}from"zod";var vf={path:["simulator"],meta:{name:"simulator",category:"manage",description:"TEE simulator commands",stability:"unstable"}};import{z as wi}from"zod";var Cf={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"}]},wf=wi.object({port:wi.string().default("8090"),verbose:wi.boolean().default(!1)});async function RI(e,t){try{return Hu()||await qu(),await Wr()?(p.success("TEE simulator is already running"),0):(await Ku({verbose:e.verbose}),p.success("TEE simulator started successfully"),0)}catch(n){return p.error("Failed to start TEE simulator"),p.logDetailedError(n),1}}var _f=b({path:["simulator","start"],meta:Cf,schema:wf,handler:RI});import{z as xI}from"zod";var Sf={name:"stop",description:"Stop the TEE simulator",stability:"unstable"},kf=xI.object({});async function PI(e,t){try{return await Gu()?(p.success("TEE simulator stopped successfully"),0):(p.error("Failed to stop TEE simulator"),1)}catch(n){return p.error("Failed to stop TEE simulator"),p.logDetailedError(n),1}}var If=b({path:["simulator","stop"],meta:Sf,schema:kf,handler:PI});var TI={name:"simulator",description:"TEE simulator commands",stability:"unstable"},MI=$I.object({});async function DI(e,t){try{let n=await Wr(),r=oa();if(n&&r){let a=ai(),s=a.replace(/dstack\.sock$/,"tappd.sock");t.stdout.write(`\u2713 TEE simulator is running (PID: ${r})\\n`),t.stdout.write(`
|
|
323
305
|
Set these environment variables to use the simulator:
|
|
324
306
|
`),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
|
|
325
307
|
`),t.stdout.write(`To start the simulator, run:
|
|
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
|
|
308
|
+
`),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 UI=b({path:["simulator"],meta:TI,schema:MI,handler:DI}),_i={group:vf,commands:[UI,_f,If]};async function LI(e,t){let n=e.debug||t.env.DEBUG?.toLowerCase()==="true",{client:r,auth:o}=await Do(t,{apiToken:e.apiToken});if(!o.apiKey)return p.warn('Not authenticated. Please set an API key with "phala login"'),0;n&&(p.debug(`Using API key: ${o.apiKey.substring(0,5)}... (source=${o.tokenSource}, profile=${o.profileName})`),p.debug(`Using API prefix: ${o.baseURL} (source=${o.apiPrefixSource})`));try{let a=await Qe(r);if(!a.success)return t.failWithError(a.error.cause??a.error,{operation:"Status",debug:n}),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}
|
|
309
|
+
`),t.stdout.write(`API Version: ${c}
|
|
310
|
+
`),t.stdout.write(`Logged in as: ${s.user.username}
|
|
311
|
+
`),t.stdout.write(`Current Workspace: ${s.workspace.name}
|
|
312
|
+
`),t.stdout.write(`Current Profile: ${o.profileName}
|
|
313
|
+
`),t.cli){let l=await Vo({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(`
|
|
314
|
+
${l.message}`):t.stdout.write(`CLI is up to date.
|
|
315
|
+
`)}return 0}catch(a){return t.failWithError(a,{operation:"Status",debug:n,guidance:'Please set a new API key with "phala login".'}),1}}var Ef=b({path:["status"],meta:Pp,schema:Go,handler:LI});import{z as NI}from"zod";var Af={name:"profiles",category:"profile",description:"List auth profiles",stability:"stable",arguments:[],options:[],aliases:["list"]},Rf=NI.object({});import OI from"chalk";import jI from"inquirer";import{z as Si}from"zod";var xf={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"}]},Pf=Si.object({profileName:Si.string().min(1).optional(),interactive:Si.boolean().default(!1)});function FI(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function VI(e,t){try{return e.interactive?await zI(t):e.profileName?HI(e.profileName,t):t.globalOptions?.json?(t.fail("Missing required argument: profile-name"),1):(p.error("Missing required argument: profile-name"),p.info("Usage: phala profiles use <profile-name>"),p.info(" phala profiles use -i"),1)}catch(n){if(FI(n))return console.log(),t.globalOptions?.json?(t.success({cancelled:!0}),0):(p.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")){p.error(r);let o=Rt();if(o.length>0){p.info("Available profiles:");for(let a of o)console.log(OI.gray(` - ${a}`))}else p.info("No profiles found. Please login first.")}else p.error("Failed to switch profile"),p.logDetailedError(n);return 1}}async function zI(e){let t=Rt(),n=Fe();if(t.length===0)return e.globalOptions?.json?(e.fail("No profiles found. Please login first."),1):(p.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):(p.info(`Only one profile available: ${t[0]}`),0);let r=Re(),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 jI.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):(p.info(`Already using profile "${a}"`),0);er(a);let s=Fe();return e.globalOptions?.json?(e.success({profile:a,workspace:s?.info.workspace?.name||null,changed:!0}),0):(p.success(`Switched to profile "${a}"`),s?.info.workspace?.name&&p.info(`Workspace: ${s.info.workspace.name}`),0)}function HI(e,t){let n=Fe();if(n?.name===e)return t.globalOptions?.json?(t.success({profile:e,workspace:n.info.workspace?.name||null,changed:!1}),0):(p.info(`Already using profile "${e}"`),0);er(e);let r=Fe();return t.globalOptions?.json?(t.success({profile:e,workspace:r?.info.workspace?.name||null,changed:!0}),0):(p.success(`Switched to profile "${e}"`),r?.info.workspace?.name&&p.info(`Workspace: ${r.info.workspace.name}`),0)}var ki=b({path:["profiles","use"],meta:xf,schema:Pf,handler:VI});import{z as Ii}from"zod";var $f={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"]},Tf=Ii.object({oldName:Ii.string().min(1),newName:Ii.string().min(1)});async function qI(e,t){try{let n=Fe()?.name===e.oldName;return Dm(e.oldName,e.newName),t.globalOptions?.json?(t.success({oldName:e.oldName,newName:e.newName,wasActive:n}),0):(p.success(`Renamed profile "${e.oldName}" to "${e.newName}"`),n&&p.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):(p.error(r),1)}}var Ei=b({path:["profiles","rename"],meta:$f,schema:Tf,handler:qI});import{z as Ai}from"zod";var Mf={name:"delete",category:"profile",description:"Delete one or more auth profiles",stability:"stable",arguments:[{name:"profile-names...",description:"Profile name(s) to delete",required:!0,variadic:!0,target:"profileNames"}],options:[],aliases:["rm"],examples:[{name:"Delete a single profile",value:"phala profiles delete my-profile"},{name:"Delete multiple profiles",value:"phala profiles delete profile-a profile-b"}]},Df=Ai.object({profileNames:Ai.array(Ai.string().min(1)).min(1)});async function KI(e,t){let n=t.globalOptions?.json===!0;try{let r=Re(),o=Rt(),a=e.profileNames.filter(u=>!o.includes(u));if(a.length>0){let u=a.length===1?`Profile "${a[0]}" not found`:`Profiles not found: ${a.map(d=>`"${d}"`).join(", ")}`;return n?(t.fail(u),1):(p.error(u),1)}let s=Fe()?.name,i=s!==void 0&&e.profileNames.includes(s),c=[],l=[];for(let u of e.profileNames){let d=r?.profiles[u];if(d?.token){let f=await tr({apiKey:d.token,baseURL:d.api_prefix});f.outcome==="revoked"?c.push(u):(l.push(u),!n&&f.outcome==="failed"&&p.warn(`Could not revoke token for profile "${u}" on the server: ${f.message}`))}Mo(u),n||p.success(`Deleted profile "${u}"`)}let m=Fe();return n?(t.success({deleted:e.profileNames,revoked:c,revokeSkipped:l,wasActive:i,currentProfile:m?.name||null}),0):(i&&(m?p.info(`Switched to profile "${m.name}"`):p.info("No profiles remaining. Please login again.")),0)}catch(r){let o=r instanceof Error?r.message:String(r);return n?(t.fail(o),1):(p.error(o),1)}}var Ri=b({path:["profiles","delete"],meta:Mf,schema:Df,handler:KI});import{z as ya}from"zod";var Uf={name:"refresh",category:"profile",description:"Re-authenticate a profile with a fresh API token",stability:"stable",arguments:[{name:"profile-name",description:"Profile name (defaults to the current profile)",required:!1,target:"profileName"}],options:[{name:"manual",description:"Enter API key manually (skip device flow)",type:"boolean"},{name:"no-open",description:"Skip browser launch",type:"boolean",target:"noOpen"}],examples:[{name:"Refresh the current profile via device flow",value:"phala profiles refresh"},{name:"Refresh a specific profile",value:"phala profiles refresh my-profile"},{name:"Refresh a profile by pasting a new API key",value:"phala profiles refresh my-profile --manual"}]},Lf=ya.object({profileName:ya.string().min(1).optional(),manual:ya.boolean().optional(),noOpen:ya.boolean().optional()});async function GI(e,t){let n=t.globalOptions?.json===!0;try{let r=Re(),o=e.profileName??r?.current_profile??void 0;if(!o){let u="No profile specified and no current profile. Please login first.";return n?(t.fail(u),1):(p.error(u),1)}let a=r?.profiles[o];if(!a){let u=`Profile "${o}" not found`;return n?(t.fail(u),1):(p.error(u),1)}let s=t.env.PHALA_CLOUD_API_PREFIX||a.api_prefix||At;if(a.token){let u=await tr({apiKey:a.token,baseURL:s});!n&&u.outcome==="revoked"&&p.info("Previous API token revoked on the server"),!n&&u.outcome==="failed"&&p.warn(`Could not revoke the previous token on the server: ${u.message}`)}let i,c;if(e.manual){let u=await mi({baseURL:s});i=u.apiKey,c=u.user}else i=await pi(t,{noOpen:e.noOpen,baseURL:s,workspaceSlug:a.workspace.slug}),c=await cr({apiKey:i,baseURL:s});let l=a.workspace.slug,m=c.workspace.slug;if(l&&m&&l!==m)throw new Error(`Workspace mismatch: profile "${o}" belongs to workspace "${l}", but the new token is bound to "${m}". Run the refresh again and authorize against "${l}".`);return Qn({profileName:o,token:i,apiPrefix:s,workspaceName:c.workspace.name||a.workspace.name,workspaceSlug:c.workspace.slug||a.workspace.slug,user:{username:c.user.username,email:c.user.email},setCurrent:r?.current_profile===o}),n?(t.success({refreshed:o,username:c.user.username}),0):(p.success(`Profile "${o}" refreshed (user: ${c.user.username})`),0)}catch(r){return t.failWithError(r,{operation:"Refresh profile",debug:!!e.debug}),1}}var xi=b({path:["profiles","refresh"],meta:Uf,schema:Lf,handler:GI});async function BI(e,t){let n=Rt(),r=Fe();if(n.length===0)return t.globalOptions?.json?(t.success({profiles:[]}),0):(p.warn("No profiles found. Please login first."),0);let o=Re(),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):(ce(a,s),0)}var Nf=b({path:["profiles"],meta:Af,schema:Rf,handler:BI});import WI from"chalk";import JI from"inquirer";import{z as Pi}from"zod";var Of={name:"switch",category:"profile",description:"Switch auth profiles",stability:"unstable",arguments:[{name:"profile-name",description:"Profile name",required:!0,target:"profileName"}],options:[{name:"interactive",shorthand:"i",description:"Select profile interactively",type:"boolean",target:"interactive"}]},jf=Pi.object({profileName:Pi.string().min(1).optional(),interactive:Pi.boolean().default(!1)});function YI(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function XI(e,t){try{return e.interactive?await ZI(t):e.profileName?QI(e.profileName,t):t.globalOptions?.json?(t.fail("Missing required argument: profile-name"),1):(p.error("Missing required argument: profile-name"),p.info("Usage: phala switch <profile-name>"),p.info(" phala switch -i"),1)}catch(n){if(YI(n))return console.log(),t.globalOptions?.json?(t.success({cancelled:!0}),0):(p.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")){p.error(r);let o=Rt();if(o.length>0){p.info("Available profiles:");for(let a of o)console.log(WI.gray(` - ${a}`))}else p.info("No profiles found. Please login first.")}else p.error("Failed to switch profile"),p.logDetailedError(n);return 1}}async function ZI(e){let t=Rt(),n=Fe();if(t.length===0)return e.globalOptions?.json?(e.fail("No profiles found. Please login first."),1):(p.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):(p.info(`Only one profile available: ${t[0]}`),0);let r=Re(),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 JI.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):(p.info(`Already using profile "${a}"`),0);er(a);let s=Fe();return e.globalOptions?.json?(e.success({profile:a,workspace:s?.info.workspace?.name||null,changed:!0}),0):(p.success(`Switched to profile "${a}"`),s?.info.workspace?.name&&p.info(`Workspace: ${s.info.workspace.name}`),0)}function QI(e,t){let n=Fe();if(n?.name===e)return t.globalOptions?.json?(t.success({profile:e,workspace:n.info.workspace?.name||null,changed:!1}),0):(p.info(`Already using profile "${e}"`),0);er(e);let r=Fe();return t.globalOptions?.json?(t.success({profile:e,workspace:r?.info.workspace?.name||null,changed:!0}),0):(p.success(`Switched to profile "${e}"`),r?.info.workspace?.name&&p.info(`Workspace: ${r.info.workspace.name}`),0)}var Ff=b({path:["switch"],meta:Of,schema:jf,handler:XI});import{z as mr}from"zod";import{readFileSync as rE}from"fs";import{dirname as oE,join as aE}from"path";import{fileURLToPath as sE}from"url";function Vf(e,t,n){switch(t){case"bash":return eE(e,n);case"zsh":return tE(e,n);case"fish":return nE(e,n)}}function eE(e,t){let n=t?`
|
|
327
316
|
# Version check (once per day)
|
|
328
317
|
local completion_version="${t}"
|
|
329
318
|
local check_file=~/."${e}"/completion-check
|
|
@@ -360,7 +349,7 @@ ${n}
|
|
|
360
349
|
}
|
|
361
350
|
|
|
362
351
|
complete -F _${e}_completions ${e}
|
|
363
|
-
`.trim()}function
|
|
352
|
+
`.trim()}function tE(e,t){let n=t?`
|
|
364
353
|
# Version check (once per day)
|
|
365
354
|
local completion_version="${t}"
|
|
366
355
|
local check_file=~/."${e}"/completion-check
|
|
@@ -405,7 +394,7 @@ ${n}
|
|
|
405
394
|
}
|
|
406
395
|
|
|
407
396
|
_${e}
|
|
408
|
-
`.trim()}function
|
|
397
|
+
`.trim()}function nE(e,t){let n=t?`
|
|
409
398
|
# Version check (once per day)
|
|
410
399
|
set -l completion_version "${t}"
|
|
411
400
|
set -l check_file ~/."${e}"/completion-check
|
|
@@ -438,10 +427,10 @@ ${n}
|
|
|
438
427
|
end
|
|
439
428
|
|
|
440
429
|
complete -c ${e} -f -a "(__${e}_complete)"
|
|
441
|
-
`.trim()}function
|
|
442
|
-
`),0}var
|
|
443
|
-
`),0;let n=e.shell||
|
|
444
|
-
`),1;let r=
|
|
430
|
+
`.trim()}function iE(){try{let e=sE(import.meta.url),t=oE(e),n=aE(t,"../package.json");return JSON.parse(rE(n,"utf-8")).version}catch{return"unknown"}}var cE={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}]},lE=mr.object({line:mr.string(),fragment:mr.string()});async function mE(e,t){return t.stdout.write(`
|
|
431
|
+
`),0}var fz=b({path:["__complete"],meta:cE,schema:lE,handler:mE}),pE={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"}]},uE=mr.object({shell:mr.enum(["bash","zsh","fish"]).optional(),fig:mr.boolean().optional()});async function dE(e,t){if(e.fig)return t.stdout.write(`Fig spec generation requires registry access. See fig-spec.ts for implementation.
|
|
432
|
+
`),0;let n=e.shell||fE();if(!n)return t.stderr.write(`Could not detect shell. Please specify with --shell (bash, zsh, or fish)
|
|
433
|
+
`),1;let r=iE(),o=Vf("phala",n,r);switch(t.stdout.write(`# Add this to your shell configuration file:
|
|
445
434
|
|
|
446
435
|
`),t.stdout.write(`${o}
|
|
447
436
|
|
|
@@ -454,44 +443,41 @@ complete -c ${e} -f -a "(__${e}_complete)"
|
|
|
454
443
|
`),t.stdout.write(`# source ~/.zshrc
|
|
455
444
|
`);break;case"fish":t.stdout.write(`# For fish, run:
|
|
456
445
|
`),t.stdout.write(`# phala completion --shell fish > ~/.config/fish/completions/phala.fish
|
|
457
|
-
`);break}return 0}function
|
|
458
|
-
`),0}let
|
|
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
|
|
461
|
-
`)),t.stderr.write(
|
|
462
|
-
`))):i&&(t.stderr.write(
|
|
463
|
-
`)),t.stderr.write(
|
|
464
|
-
`)),
|
|
465
|
-
`)):(t.stderr.write(
|
|
466
|
-
`)),u&&t.stderr.write(
|
|
467
|
-
`)))));let
|
|
468
|
-
`)),0;let
|
|
469
|
-
`;return e.json?(t.success({command:h,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:i,isUpToDate:
|
|
470
|
-
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function
|
|
446
|
+
`);break}return 0}function fE(){let e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":null}var zf=b({path:["completion"],meta:pE,schema:uE,handler:dE});import{spawn as IE}from"child_process";import EE from"chalk";import{execSync as gE}from"child_process";import{createHash as hE}from"crypto";import{existsSync as Hf,readFileSync as yE}from"fs";import{homedir as Qr,platform as bE}from"os";import{basename as vE,join as eo}from"path";import qf from"chalk";function Kf(e){let[t,n]=e.trim().split(/\s+/);if(!t||!n)return;let r=Buffer.from(n,"base64");if(r.length<4)return;let o=r.readUInt32BE(0);return o===0||r.length<4+o||r.subarray(4,4+o).toString("utf-8")!==t?void 0:`SHA256:${hE("sha256").update(r).digest("base64").replace(/=+$/,"")}`}var Kt=class extends Error{constructor(n,r){super(`CVM is not running (current status: ${qf.yellow(n)})`);this.status=n;this.cvmId=r;this.name="CvmNotRunningError"}},En=class extends Error{constructor(n){super("CVM is not registered on any gateway.");this.cvmId=n;this.name="NoGatewayError"}};function ba(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 $i(){let e=[eo(Qr(),".ssh","id_rsa"),eo(Qr(),".ssh","id_ed25519"),eo(Qr(),".ssh","id_ecdsa"),eo(Qr(),".ssh","id_dsa")];for(let t of e)if(Hf(t))return t}function Gf(e){if(e){let t=e.startsWith("~")?eo(Qr(),e.slice(1)):e;if(!Hf(t))throw new Error(`SSH key file not found: ${t}`);return t}return $i()}function to(e){return e?e.toLowerCase().includes("dev"):!1}function CE(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 wE(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"?to(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 _E(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 va(e,t){let n=await e.getCvmInfo({id:t}),r=CE(n);if(!r)throw new En(t);if(n.status!=="running")throw new Kt(n.status,t);let{baseImage:o,isDev:a}=wE(n),s=_E(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 Ca(e,t){return`${e}-22.${t}`}function wa(e,t){return e!=="443"?e:t||"443"}function _a(e){return/^[a-zA-Z0-9_./:@=-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function SE(){try{return gE("openssl version",{encoding:"utf-8"}).toLowerCase().includes("libressl")}catch{return!1}}function kE(e){if(vE(e).toLowerCase().includes("ed25519"))return!0;try{let n=yE(e,"utf-8");return n.includes("ssh-ed25519")||n.includes("ED25519")}catch{return!1}}function Sa(e){bE()==="darwin"&&SE()&&kE(e)&&(p.warn("Detected LibreSSL with ed25519 key on macOS. This combination may cause SSH connection issues."),p.info(`If\xB7you\xB7experience\xB7problems,\xB7install\xB7OpenSSL\xB7via\xB7Homebrew:\xB7${qf.cyan("brew\xB7install\xB7openssl")}`),p.info("Then ensure Homebrew's OpenSSL is in your PATH before /usr/bin"))}function ka(e,t){return["-o",`ProxyCommand=${e?"openssl s_client -quiet -connect %h:%p":"openssl s_client -quiet -connect %h:%p 2>/dev/null"}`,"-o","StrictHostKeyChecking=no","-o","UserKnownHostsFile=/dev/null","-o",`ConnectTimeout=${t}`]}import{z as Gt}from"zod";var Bf={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"}]},Wf=Gt.object({cvmId:Gt.string().optional(),port:Gt.string().default("443"),gatewayDomain:Gt.string().optional(),timeout:Gt.string().default("30"),verbose:Gt.boolean().default(!1),dryRun:Gt.boolean().default(!1),"--":Gt.array(Gt.string()).optional()});function AE(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 RE(e,t){try{if(!t.cvmId)return t.fail("No CVM ID provided. Either pass a CVM ID as argument or configure it in phala.toml."),1;let{cvmId:n}=H.parse(t.cvmId),r=e["--"]??[],o=AE(r);if(o)return p.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 E(t),I=await va(_,n);i=I.appId,c=I.gatewayDomain,(I.isDevImage??to(I.baseImage))===!1&&p.warn("This CVM is not using a dev image. SSH access may not be available.")}catch(_){return _ instanceof En||_ instanceof Kt?t.failWithError(_,{operation:"SSH connect",debug:!!e.debug,guidance:_ instanceof Kt?"Please start the CVM first using: phala cvms start":void 0}):t.failWithError(_,{operation:"SSH connect",debug:!!e.debug}),1}let l=ba(c),m=wa(s,l.port),u=Ca(i,l.host),d=$i();d&&Sa(d),e.verbose&&p.info(`Connecting to ${EE.cyan(u)}:${m}...`);let f=ka(e.verbose,e.timeout),{options:h,command:g}=xE(r),y=[];if(e.verbose&&y.push("-v"),y.push(...f,"-p",m,...h,`root@${u}`,...g),e.dryRun){let _=y.map(I=>_a(I));return t.stdout.write(`ssh ${_.join(" ")}
|
|
447
|
+
`),0}let S=IE("ssh",y,{stdio:"inherit"});return S.on("error",_=>{p.break(),p.error(`SSH connection failed: ${_.message}`)}),new Promise(_=>{S.on("close",I=>{p.break(),I===0?(p.success("Connection closed"),_(0)):(p.error(`Connection failed with code ${I}`),_(I??1))})})}catch(n){return p.error("Failed to connect via SSH"),n instanceof Error?p.error(n.message):p.error(String(n)),1}}function xE(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 Jf=b({path:["ssh"],meta:Bf,schema:Wf,handler:RE});import{spawn as PE}from"child_process";import Ti from"chalk";import{z as Bt}from"zod";var Yf={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"}]},Xf=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 Zf(e){let t=e.match(/^([^:]+):(.+)$/);return t?{isRemote:!0,cvmId:t[1],path:t[2]}:{isRemote:!1,path:e}}async function $E(e,t){try{let n=Zf(e.source),r=Zf(e.destination);if(n.isRemote===r.isRemote)return p.error("Either source or destination must be a remote path in format: cvm-id:path"),p.info("Examples:"),p.info(" phala cp ./local.txt app_123:/root/remote.txt"),p.info(" phala cp app_123:/root/remote.txt ./local.txt"),1;let o=n.isRemote?n:r,a;if(o.cvmId?a=Tm(o.cvmId):t.cvmId&&(a=H.parse(t.cvmId).cvmId),!a)return t.fail("No CVM ID provided. Either use format cvm-id:path or configure it in phala.toml."),1;let s=e.gatewayDomain??t.projectConfig.gateway_domain,i=e.port!=="443"?e.port:t.projectConfig.gateway_port?.toString()??"443",c,l;if(s)l=s,c=a.startsWith("app_")?a.substring(4):a;else try{let A=await E(t),P=await va(A,a);c=P.appId,l=P.gatewayDomain,(P.isDevImage??to(P.baseImage))===!1&&p.warn("This CVM is not using a dev image. SCP access may not be available.")}catch(A){return A instanceof En||A instanceof Kt?t.failWithError(A,{operation:"Copy file",debug:!!e.debug,guidance:A instanceof Kt?"Please start the CVM first using: phala cvms start":void 0}):t.failWithError(A,{operation:"Copy file",debug:!!e.debug}),1}let m=ba(l),u=wa(i,m.port),d=Ca(c,m.host),f=Gf(e.identity);f?Sa(f):p.warn("No default SSH key found. SCP will use ssh-agent or prompt for password."),e.verbose&&p.info(`Connecting to ${Ti.cyan(d)}:${u}...`);let g=[...ka(e.verbose,"30"),"-P",u];e.verbose&&g.unshift("-v"),f&&g.push("-i",f),e.recursive&&g.push("-r");let y=n.isRemote?`root@${d}:${n.path}`:n.path,S=r.isRemote?`root@${d}:${r.path}`:r.path;if(g.push(y,S),e.dryRun){let A=g.map(P=>_a(P));return t.stdout.write(`scp ${A.join(" ")}
|
|
448
|
+
`),0}let _=n.isRemote?"download":"upload",I=n.isRemote?r.path:n.path,k=n.isRemote?n.path:r.path;p.info(`${_==="upload"?"Uploading":"Downloading"} ${Ti.cyan(I)} ${_==="upload"?"to":"from"} ${Ti.cyan(k)}...`);let v=PE("scp",g,{stdio:"inherit"});return v.on("error",A=>{p.break(),p.error(`SCP failed: ${A.message}`)}),new Promise(A=>{v.on("close",P=>{p.break(),P===0?(p.success(`${_==="upload"?"Upload":"Download"} completed`),A(0)):(p.error(`Transfer failed with code ${P}`),A(P??1))})})}catch(n){return p.error("Failed to copy file via SCP"),n instanceof Error&&p.error(n.message),1}}var Qf=b({path:["cp"],meta:Yf,schema:Xf,handler:$E});import{z as Ia}from"zod";var eg={name:"ps",category:"cvm-ops",description:"List containers of a CVM",stability:"stable",arguments:[X],options:[hn,Q,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"}]},tg=Ia.object({cvmId:Ia.string().optional(),json:Ia.boolean().default(!1),interactive:Ia.boolean().default(!1)});function TE(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 ME(e){let t=e[0]??"";return t.startsWith("/")?t.slice(1):t}async function DE(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 ys(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"List containers",debug:!!e.debug}),1;let o=r.data;if(!o.is_online){let m=o.error??"CVM is offline";return e.json?(t.success({containers:[],error:m}),0):(p.warn(m),0)}let a=o.containers??[];if(e.json)return t.success({containers:a}),0;if(a.length===0)return p.info("No containers running"),0;let s=["NAME","IMAGE","CREATED","STATUS","STATE"],i=a.map(m=>({NAME:ME(m.names),IMAGE:m.image,CREATED:TE(m.created),STATUS:m.status,STATE:m.state})),c={};for(let m of s){c[m]=m.length;for(let u of i)c[m]=Math.max(c[m],u[m].length)}let l=m=>s.map(u=>m[u].padEnd(c[u])).join(" ");console.log(l(Object.fromEntries(s.map(m=>[m,m]))));for(let m of i)console.log(l(m));return 0}catch(n){return t.failWithError(n,{operation:"List containers",debug:!!e.debug}),1}}var ng=b({path:["ps"],meta:eg,schema:tg,handler:DE});import{z as nt}from"zod";var rg={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"},hn,de,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"}]},og=nt.object({containerName:nt.string().optional(),cvmId:nt.string().optional(),serial:nt.boolean().default(!1),cvmStdout:nt.boolean().default(!1),cvmStderr:nt.boolean().default(!1),stderr:nt.boolean().default(!1),since:nt.string().optional(),until:nt.string().optional(),tail:nt.number().optional(),follow:nt.boolean().default(!1),timestamps:nt.boolean().default(!1),json:nt.boolean().default(!1),interactive:nt.boolean().default(!1)});function ag(e,t,n){if(e.channel==="stdout"){t.includeStdout&&n.stdout.write(e.message);return}t.includeStderr&&n.stderr.write(e.message)}function UE(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 LE(e,t){if(Dr(e.json),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:n}=H.parse(t.cvmId),r=[e.serial,e.cvmStdout,e.cvmStderr].filter(Boolean).length;if(r>1)return t.fail("--serial, --cvm-stdout, and --cvm-stderr are mutually exclusive"),1;let o=r===1;if(e.containerName&&o)return t.fail("Cannot combine container name with --serial/--cvm-stdout/--cvm-stderr. Use container name for container logs, or CVM flags for CVM-level logs."),1;if(e.stderr&&o)return t.fail("--stderr is only valid in container mode, not with CVM flags"),1;let a=UE(e);if(!a)try{let s=await Xm(n);s==="running"?a={type:"container"}:(p.warn(`CVM is ${s}. Falling back to serial console logs.`),p.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"?NE(n,a.channel,e,t):OE(n,a.containerName,e,t)}async function NE(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 Ym(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 Jm(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):p.info(`No ${t} logs available`),0)}catch(o){return r.failWithError(o,{operation:`Fetch CVM ${t} logs`,debug:!!n.debug}),1}}async function OE(e,t,n,r){let o={includeStdout:!0,includeStderr:n.stderr},a={container:t,since:n.since,until:n.until,tail:n.tail,timestamps:n.timestamps,matchContainerIdPrefix:!1};try{if(n.follow){if(n.json)return r.fail("Cannot use --json with --follow"),1;let m=new AbortController,u=()=>m.abort();process.on("SIGINT",u),process.on("SIGTERM",u);try{await Gm(e,d=>ag(d,o,r),a,m.signal)}catch(d){if(d.name!=="AbortError")throw d}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",u)}return 0}let i=(await Km(e,a)).filter(m=>m.channel==="stderr"?o.includeStderr:o.includeStdout),c=i.map(m=>m.message).join("");if(n.json)return r.success({logs:c,cvm_id:e}),0;if(c.trim()){for(let m of i)ag(m,o,r);return 0}return await Gr(e)||p.info("No logs available"),0}catch(s){return r.failWithError(s,{operation:"Fetch container logs",debug:!!n.debug}),await Gr(e),1}}var sg=b({path:["logs"],meta:rg,schema:og,handler:LE});var ig={path:["self"],meta:{name:"self",category:"advanced",description:"CLI self-management",stability:"unstable"}};import qE from"prompts";import{execa as KE}from"execa";import Ea from"semver";import Wt from"chalk";import{z as pr}from"zod";var jE={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},FE={name:"yes",shorthand:"y",description:"Skip confirmation prompt",type:"boolean",target:"yes"},VE={name:"dry-run",description:"Print update command without executing",type:"boolean",target:"dryRun"},zE={name:"package-manager",description:"Override package manager (npm|pnpm|yarn|bun)",type:"string",target:"packageManager",aliases:["pm"],argumentName:"name"},HE={name:"channel",description:"Release channel/dist-tag (e.g. latest, beta, next)",type:"string",target:"channel",argumentName:"tag"},cg={name:"update",description:"Update the Phala CLI",stability:"unstable",options:[jE,FE,VE,zE,HE],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"}]},lg=pr.object({json:pr.boolean().default(!1),yes:pr.boolean().default(!1),dryRun:pr.boolean().default(!1),packageManager:pr.enum(["npm","pnpm","yarn","bun"]).optional(),channel:pr.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/).optional()});var mg="Phala-Network/phala-cloud",Mi="cli-v";function GE(e,t){return`https://github.com/${mg}/compare/${Mi}${e}...${Mi}${t}`}function BE(e){return`https://github.com/${mg}/releases/tag/${Mi}${e}`}function no(e){return typeof e=="string"&&e.trim().length>0}function WE(e){return e.startsWith("@")?e.replace("/","%2F"):e}async function JE(e,t){let r=`https://registry.npmjs.org/${WE(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:Ea.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 YE(e){if(typeof e!="object"||e===null||!("code"in e))return;let t=e.code;return typeof t=="string"?t:void 0}function XE(e){let n=Ea.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function ZE(e,t,n,r){let o=[],a=r instanceof Error&&typeof r.message=="string"?r.message:String(r),s=YE(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"&&no(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"&&no(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 QE(e,t,n){if(no(e))return e.trim();if(no(n.PHALA_UPDATE_CHANNEL))return n.PHALA_UPDATE_CHANNEL;let r=nr("updateCheckChannel");return no(r)?r:XE(t)??"latest"}async function eA(e,t){let n=t.cli?.packageName??"phala",r=t.cli?.runtime??Oo(),o=e.packageManager??zr(t.env,r),a=t.cli?.packageVersion??"0.0.0",s=QE(e.channel,a,t.env);e.json||t.stderr.write(Wt.gray(`Checking for updates...
|
|
449
|
+
`));let{latestVersion:i,error:c}=await JE(n,s);if(i){let k=Date.now(),v=s.replace(/[^a-zA-Z0-9_-]/g,"_");vn({[`updateCheckLastAt_${v}`]:k,[`updateCheckLatest_${v}`]:i,...s==="latest"?{updateCheckLastAt:k,updateCheckLatest:i}:{}})}let l=Ea.valid(a),m=i&&l&&!Ea.gt(i,l),u=!m&&i&&l?GE(l,i):void 0,d=i?BE(i):void 0;e.json||(c?(t.stderr.write(Wt.yellow(`Warning: Could not fetch latest version: ${c}
|
|
450
|
+
`)),t.stderr.write(Wt.gray(`Current version: v${a}
|
|
451
|
+
`))):i&&(t.stderr.write(Wt.gray(`Current version: v${a}
|
|
452
|
+
`)),t.stderr.write(Wt.gray(`Latest version: v${i}${s!=="latest"?` (${s})`:""}
|
|
453
|
+
`)),m?t.stderr.write(Wt.green(`You are already on the latest version.
|
|
454
|
+
`)):(t.stderr.write(Wt.yellow(`Update available: v${a} \u2192 v${i}
|
|
455
|
+
`)),u&&t.stderr.write(Wt.gray(`${u}
|
|
456
|
+
`)))));let f=o==="bun"&&i?`${n}@${i}`:s==="latest"?`${n}@latest`:`${n}@${s}`,h=Hr(o,f),{command:g,args:y}=np(o,f);if(e.json&&e.dryRun)return t.success({command:h,dryRun:!0,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:d,changelogUrl:u}),0;if(e.dryRun)return t.stderr.write(Wt.gray(`Command: ${h}
|
|
457
|
+
`)),0;let S=t.stderr.isTTY===!0&&e.json!==!0;if(!e.yes&&!S){let k=`Non-interactive session detected. Re-run with --yes to apply the update, or use --dry-run to print the command.
|
|
458
|
+
`;return e.json?(t.success({command:h,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:d,changelogUrl:u}),0):(t.stderr.write(k),1)}let _=m?`Already up to date. Reinstall anyway with "${h}"?`:`Run "${h}"?`;if(!(e.yes||await qE({type:"confirm",name:"ok",message:_,initial:!m}).then(k=>k.ok===!0)))return e.json&&t.success({command:h,ran:!1,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:d,changelogUrl:u}),0;try{return await KE(g,y,{stdio:"inherit"}),e.json?(t.success({command:h,ran:!0,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:d,changelogUrl:u}),0):(p.success("Update completed"),0)}catch(k){let v=ZE(t.env,o,h,k);if(p.logDetailedError(k),t.fail("Self update failed",{command:h,hints:v.length>0?v:void 0}),!e.json&&v.length>0)for(let A of v)p.info(A);return 1}}var pg=b({path:["self","update"],meta:cg,schema:lg,handler:eA});var Di={group:ig,commands:[pg]};import Aa from"chalk";import{z as ct}from"zod";var ug={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"},Q],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"}]},dg=ct.object({page:ct.coerce.number().int().min(1).default(1),pageSize:ct.coerce.number().int().min(1).max(100).default(50),search:ct.string().optional(),status:ct.array(ct.string()).optional(),listed:ct.boolean().optional(),baseImage:ct.string().optional(),instanceType:ct.string().optional(),kmsType:ct.string().optional(),node:ct.string().optional(),region:ct.string().optional(),json:ct.boolean().default(!1)});function tA(e){return e.toLowerCase().endsWith("ing")?Aa.yellow(e):e==="running"?Aa.green(e):e==="stopped"?Aa.red(e):Aa.yellow(e)}async function nA(e,t){try{let n=await E(t),r=await Zo(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.failWithError(r.error.cause??r.error,{operation:"List apps",debug:!!e.debug}),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:tA(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(p.info("No CVMs found"),0):(ce(a,s),p.info(`Page ${o.page}/${o.totalPages} (total ${o.total})`),0)}catch(n){return t.failWithError(n,{operation:"List apps",debug:!!e.debug}),1}}var fg=b({path:["apps"],meta:ug,schema:dg,handler:nA});var gg={path:["instances"],meta:{name:"instances",description:"Manage app instances",stability:"unstable",category:"manage"}};import Ra from"chalk";import{z as Ui}from"zod";var hg={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"},Q],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"}]},yg=Ui.object({appId:Ui.string().optional(),json:Ui.boolean().default(!1)});function rA(e){return e.toLowerCase().endsWith("ing")?Ra.yellow(e):e==="running"?Ra.green(e):e==="stopped"?Ra.red(e):Ra.yellow(e)}function oA(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 aA(e,t){try{let n=oA(e,t),r=await E(t),o=await Bn(r,{appId:n});if(!o.success){let m="error"in o?o.error:void 0;return t.fail(m?.message||"Failed to list instances"),1}let a=o.data,s=a.map(m=>m.vm_uuid).filter(m=>typeof m=="string"&&m.length>0),i={};if(s.length>0){let m=await ko(r,{vmUuids:s});if(m.success)for(let[u,d]of Object.entries(m.data))i[u]={status:d.status,uptime:d.uptime}}if(e.json){let m=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(m),0}if(a.length===0)return p.info("No instances found"),0;let c=["UUID","NODE","REGION","STATUS","NAME","UPTIME"],l=a.map(m=>{let u=m.node_info&&typeof m.node_info=="object"?m.node_info.name??"-":"-",d=m.node_info&&typeof m.node_info=="object"?m.node_info.region??"-":"-",f=m.vm_uuid?i[m.vm_uuid]:void 0;return{UUID:m.vm_uuid??"-",NODE:u,REGION:d,STATUS:rA(f?.status??m.status),NAME:m.name,UPTIME:f?.uptime??"-"}});return ce(c,l),0}catch(n){return t.failWithError(n,{operation:"List instances",debug:!!e.debug}),1}}var bg=b({path:["instances","ls"],meta:hg,schema:yg,handler:aA});import ur from"fs";import Ni from"path";import{z as Je}from"zod";var vg={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"},tt,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"},Jn,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>"}]},Cg=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 sA(e){return ur.readFileSync(e,"utf-8").split(`
|
|
459
|
+
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function iA(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function cA(e){if(e.status!==465)return null;let n=iA(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 lA(e,t,n){if(!n)return;let r=Ni.resolve(process.cwd(),n);if(!ur.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=sA(r),a=await Pt(e,t);return qe(o,a)}async function mA(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Nt(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 Li(e,t){if(ee()){t.success(e);return}let n=typeof e.vm_uuid=="string"?e.vm_uuid:"",r=n.replace(/-/g,""),o=t.projectConfig.slug||"",a=o&&r&&typeof e.app_id=="string"?`${fe}/${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(`
|
|
471
460
|
`)}
|
|
472
|
-
`)}function
|
|
461
|
+
`)}function wg(e,t){if(ee()){t.success({success:!0,prepare_only:!0,...e});return}let n=o=>o&&!o.startsWith("0x")?`0x${o}`:o,r=["App instance prepared successfully (pending on-chain approval).","",`Compose Hash: ${n(e.composeHash)}`,`App ID: ${n(e.appId)}`,`Device ID: ${n(e.deviceId)}`];if(e.commitToken&&r.push(`Commit Token: ${e.commitToken}`),e.commitUrl&&r.push(`Commit URL: ${e.commitUrl}`),e.apiCommitUrl&&r.push(`API Commit URL: ${e.apiCommitUrl}`),e.onchainStatus&&(r.push("","On-chain Status:",` Compose Hash: ${e.onchainStatus.compose_hash_allowed?"registered":"NOT registered"}`,` Device ID: ${e.onchainStatus.device_id_allowed?"registered":"NOT registered"}`),e.onchainStatus.is_allowed&&r.push(" All prerequisites met. You can commit with --transaction-hash already-registered.")),e.commitToken){let o=e.composeHash.startsWith("0x")?e.composeHash:`0x${e.composeHash}`;r.push("","To complete the instance after on-chain approval:",` phala instances add --app-id ${e.appId} \\`," --commit \\",` --token ${e.commitToken} \\`,` --compose-hash ${o} \\`," --transaction-hash <tx-hash>")}t.stdout.write(`${r.join(`
|
|
473
462
|
`)}
|
|
474
|
-
`)}function
|
|
475
|
-
`);let o=r.
|
|
476
|
-
`);
|
|
477
|
-
`)
|
|
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(`
|
|
463
|
+
`)}function pA(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 uA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{let r=pA(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 c=await o.post(`/apps/${r}/instances`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash||"already-registered"});return Li(c,t),0}let a;if(n.envFile){let c=await Bn(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 m=await G(o,{id:l.vm_uuid});if(!m.success)throw new Error(`Failed to fetch CVM info: ${m.error?.message||"Unknown error"}`);a=await lA(o,m.data,n.envFile)}let s=await mA(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=Ni.resolve(process.cwd(),n.composeFile);if(!ur.existsSync(c))throw new Error(`Docker Compose file not found: ${c}`);i.docker_compose_file=ur.readFileSync(c,"utf-8")}if(n.preLaunchScript){let c=Ni.resolve(process.cwd(),n.preLaunchScript);if(!ur.existsSync(c))throw new Error(`Pre-launch script not found: ${c}`);i.pre_launch_script=ur.readFileSync(c,"utf-8")}try{let c=await o.post(`/apps/${r}/instances`,i,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return Li(c,t),0}catch(c){if(!(c instanceof It))throw c;let l=cA(c);if(!l)throw c;if(n.prepareOnly)return wg(l,t),0;if(!l.commitToken)throw new Error("Prepare response did not include a commit token");let m=l.kmsInfo?.chain_id,u=m!=null?Et[m]:void 0;if(!u)throw new Error(m!=null?`Chain id ${m} is not supported by this CLI build`:"App KMS info is missing chain_id");let d=await gn({chain:u,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,composeHash:l.composeHash});if(!d.success){let _="error"in d?d.error:void 0;throw new Error(_?.message||"Failed to check on-chain prerequisites")}let f=n.transactionHash||"already-registered",h=!d.data.deviceAllowed,g=!d.data.composeHashAllowed;if(h||g){let _=[];g&&_.push("compose hash"),h&&_.push("device");let I=n.privateKey||process.env.PRIVATE_KEY;if(!I)return wg(l,t),0;let k=I;if(h){let v=await Qt({chain:u,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,privateKey:k});if(!v.success){let A="error"in v?v.error:void 0;throw new Error(A?.message||"Failed to register device on-chain")}}if(g){let v=await Zt({chain:u,rpcUrl:n.rpcUrl,appId:`0x${r}`,composeHash:l.composeHash,privateKey:k});if(!v.success){let A="error"in v?v.error:void 0;throw new Error(A?.message||"Failed to register compose hash on-chain")}f=String(v.data.transactionHash||"already-registered")}}let y=10;for(let _=0;_<y;_++){let I=await gn({chain:u,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,composeHash:l.composeHash});if(I.success&&I.data.composeHashAllowed&&I.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(k=>setTimeout(k,3e3))}let S=await o.post(`/apps/${r}/instances`,{token:l.commitToken,compose_hash:l.composeHash,transaction_hash:f});return Li(S,t),0}}catch(r){return t.failWithError(r,{operation:"Add instance",debug:!!n.debug}),1}}var _g=b({path:["instances","add"],meta:vg,schema:Cg,handler:uA});import dA from"inquirer";import{z as ro}from"zod";var Sg={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"}]},kg=ro.object({vmUuids:ro.array(ro.string()).min(1),force:ro.boolean().default(!1),yes:ro.boolean().default(!1)});async function fA(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 dA.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):(p.info("Deletion cancelled"),0)}let o=[];for(let s of e.vmUuids){let i=await xr(n,{id:s});i.success?(o.push({vm_uuid:s,deleted:!0}),r||p.success(`Instance ${s} deleted successfully`)):(o.push({vm_uuid:s,deleted:!1,error:i.error.message}),r||p.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.failWithError(n,{operation:"Remove instance",debug:!!e.debug}),1}}var Ig=b({path:["instances","rm"],meta:Sg,schema:kg,handler:fA});import{z as Oi}from"zod";var Eg={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:[Q],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"}]},Ag=Oi.object({family:Oi.string().optional(),json:Oi.boolean().default(!1)});function Rg(e){return(e/1024).toFixed(0)}function xg(e){return`$${e}`}async function gA(e,t){try{let n=await E(t);if(e.family){let a=await cs(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)":Rg(c.memory_mb),"Hourly Rate":xg(c.hourly_rate),GPU:c.requires_gpu?"Yes":"No"}));return i.length===0?(p.info(`No instance types found for family '${e.family}'`),0):(ce(s,i),p.info(`Total: ${a.total} instance types`),0)}let r=await is(n);if(e.json)return t.success(r),0;if(r.result.length===0)return p.info("No instance types found"),0;let o=["ID","NAME","vCPU","Memory(GB)","Hourly Rate"];for(let a of r.result){p.info(`
|
|
464
|
+
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)}));ce(o,s)}return 0}catch(n){return t.failWithError(n,{operation:"List instance types",debug:!!e.debug}),1}}var Pg=b({path:["instance-types"],meta:Eg,schema:Ag,handler:gA});import{z as $g}from"zod";var Tg={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"}]},Mg=$g.object({cvmId:$g.string().optional()});async function hA(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 nm(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"Get runtime config",debug:!!e.debug}),1;let o=r.data;if(ee())return t.success(o),0;if(console.log(`Hostname: ${o.hostname??"-"}`),console.log(`Gateway Domain: ${o.default_gateway_domain??"-"}`),console.log(`SSH Keys: ${o.ssh_authorized_keys.length>0?`${o.ssh_authorized_keys.length} key(s)`:"none"}`),o.ssh_authorized_keys.length>0){console.log(),console.log("SSH Authorized Keys:");for(let a of o.ssh_authorized_keys)console.log(` ${Kf(a)??"SHA256:<unrecognized>"}`),console.log(` ${a}`)}return 0}catch(n){return t.failWithError(n,{operation:"Get runtime config",debug:!!e.debug}),1}}var Dg=b({path:["runtime-config"],meta:Tg,schema:Mg,handler:hA});import{existsSync as Ng,readFileSync as vA}from"fs";import{basename as CA,join as xa}from"path";import{homedir as Pa,hostname as wA}from"os";import{z as ji}from"zod";var yA={name:"name",description:"Name for the SSH key (default: key file name)",type:"string",target:"name"},bA={name:"key-file",description:"Path to SSH public key file (default: ~/.ssh/id_ed25519.pub or ~/.ssh/id_rsa.pub)",type:"string",target:"keyFile"},Ug={name:"add",description:"Add a local SSH public key to your account",stability:"stable",options:[yA,bA],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"}]},Lg=ji.object({name:ji.string().optional(),keyFile:ji.string().optional()});function _A(){let e=[xa(Pa(),".ssh","id_ed25519.pub"),xa(Pa(),".ssh","id_rsa.pub"),xa(Pa(),".ssh","id_ecdsa.pub")];for(let t of e)if(Ng(t))return t}async function SA(e,t){try{let n=e.keyFile;if(n?.startsWith("~/")&&(n=xa(Pa(),n.slice(2))),!n&&(n=_A(),!n))return t.fail("No SSH public key found. Specify one with --key-file or generate one with ssh-keygen."),1;if(!Ng(n))return t.fail(`SSH public key file not found: ${n}`),1;let r=vA(n,"utf-8").trim(),o=e.name??`${wA()}-${CA(n,".pub")}`,a=await E(t),s=await vs(a,{name:o,public_key:r});return s.success?ee()?(t.success(s.data),0):(p.success(`Added SSH key "${o}" (${s.data.key_type}, ${s.data.fingerprint})`),0):(t.failWithError(s.error.cause??s.error,{operation:"Add SSH key",debug:!!e.debug}),1)}catch(n){return t.failWithError(n,{operation:"Add SSH key",debug:!!e.debug}),1}}var Og=b({path:["ssh-keys","add"],meta:Ug,schema:Lg,handler:SA});var jg={path:["ssh-keys"],meta:{name:"ssh-keys",category:"manage",description:"Manage SSH keys",stability:"stable"}};import{z as Fg}from"zod";var kA={name:"github_username",description:"GitHub username to import SSH keys from",required:!0,target:"githubUsername"},Vg={name:"import-github",description:"Import SSH keys from a GitHub user's public profile",stability:"stable",arguments:[kA],examples:[{name:"Import SSH keys from a GitHub profile",value:"phala ssh-keys import-github octocat"}]},zg=Fg.object({githubUsername:Fg.string()});async function IA(e,t){try{let n=await E(t),r=p.startSpinner(`Importing SSH keys from github.com/${e.githubUsername}`),o=await bs(n,{github_username:e.githubUsername});if(r.stop(!0),!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Import GitHub SSH keys",debug:!!e.debug}),1;if(ee())return t.success(o.data),0;let{keys_added:a,keys_skipped:s,errors:i}=o.data;if(i.length>0){p.warn(`${i.length} key(s) could not be imported:`);for(let c of i)p.warn(` ${c}`)}return a>0?p.success(`Added ${a} SSH key(s) from github.com/${e.githubUsername} (${s} skipped)`):p.info("No new keys added (all keys already exist)"),0}catch(n){return t.failWithError(n,{operation:"Import GitHub SSH keys",debug:!!e.debug}),1}}var Hg=b({path:["ssh-keys","import-github"],meta:Vg,schema:zg,handler:IA});import{z as EA}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"}]},Kg=EA.object({});async function AA(e,t){try{let n=await E(t),r=await Pr(n);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"List SSH keys",debug:!!e.debug}),1;let o=r.data;if(ee())return t.success(o),0;if(o.length===0)return p.info("No SSH keys found"),0;let a=["ID","NAME","TYPE","FINGERPRINT","SOURCE","CREATED"],s=o.map(i=>({ID:i.id,NAME:i.name,TYPE:i.key_type,FINGERPRINT:i.fingerprint,SOURCE:i.source,CREATED:i.created_at.slice(0,10)}));return ce(a,s),0}catch(n){return t.failWithError(n,{operation:"List SSH keys",debug:!!e.debug}),1}}var Gg=b({path:["ssh-keys","list"],meta:qg,schema:Kg,handler:AA});import xA from"inquirer";import{z as Fi}from"zod";var RA={name:"key_id",description:"SSH key ID to remove (from `phala ssh-keys list`)",required:!1,target:"keyId"},Bg={name:"remove",aliases:["rm"],description:"Remove an SSH key from your account",stability:"stable",arguments:[RA],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"}]},Wg=Fi.object({keyId:Fi.string().optional(),interactive:Fi.boolean().default(!1)});async function PA(e){let t=p.startSpinner("Fetching SSH keys"),n=await E(e),r=await Pr(n);if(t.stop(!0),!r.success){p.error(`Failed to fetch SSH keys: ${r.error.message}`);return}let o=r.data;if(o.length===0){p.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 xA.prompt([{type:"list",name:"selectedKey",message:"Select an SSH key to remove:",choices:a}]);return s}async function $A(e,t){try{let n=e.keyId;if(!n&&e.interactive&&(n=await PA(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 Cs(r,{keyId:n});return o.success?ee()?(t.success({keyId:n,removed:!0}),0):(p.success(`SSH key ${n} removed`),0):(t.failWithError(o.error.cause??o.error,{operation:"Remove SSH key",debug:!!e.debug}),1)}catch(n){return t.failWithError(n,{operation:"Remove SSH key",debug:!!e.debug}),1}}var Jg=b({path:["ssh-keys","remove"],meta:Bg,schema:Wg,handler:$A});var Vi={group:jg,commands:[Gg,Og,Jg,Hg]};import{z as zi}from"zod";var Yg={name:"whoami",category:"profile",description:"Print the current user",stability:"stable",options:[...en,de],examples:[{name:"Show current user",value:"phala whoami"},{name:"JSON output",value:"phala whoami --json"}]},Xg=zi.object({json:zi.boolean().default(!1),apiToken:zi.string().optional()});async function TA(e,t){let{client:n,auth:r}=await Do(t,{apiToken:e.apiToken});if(!r.apiKey)return t.fail('Not authenticated. Run "phala login" first.'),1;let o=await Qe(n);if(!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Whoami",debug:!!e.debug}),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})
|
|
465
|
+
`),0)}var Zg=b({path:["whoami"],meta:Yg,schema:Xg,handler:TA});import fh from"inquirer";import{z as V}from"zod";var dr={name:"cvm",description:"CVM or app identifier (UUID, app_id, instance_id, or name)",required:!0,target:"cvm"},Qg={path:["allow-devices"],meta:{name:"allow-devices",description:"Manage on-chain device allowlist for an app contract",stability:"unstable"}},eh={name:"list",aliases:["ls"],description:"List allowed devices from the on-chain contract",stability:"unstable",arguments:[dr],options:[Be,de],examples:[{name:"List devices on-chain",value:"phala allow-devices list app_abc123"}]},th=V.object({cvm:V.string(),rpcUrl:V.string().optional(),json:V.boolean().default(!1)}),nh={name:"add",description:"Add devices to the on-chain allowlist",stability:"unstable",arguments:[dr,{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:[tt,Be,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},de,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..."}]},rh=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)}),oh={name:"remove",aliases:["rm"],description:"Remove devices from the on-chain allowlist",stability:"unstable",arguments:[dr,{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:[tt,Be,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},de,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..."}]},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:"allow-any",description:"Set the allow-any-device flag on the contract. Requires --enable or --disable.",stability:"unstable",arguments:[dr],options:[{name:"enable",description:"Enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Disable allow-any-device",type:"boolean",target:"disable"},tt,Be,{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..."}]},ih=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)}),ch={name:"disallow-any",description:"Disable allow-any-device on the contract. Equivalent to `allow-any --disable`.",stability:"unstable",arguments:[dr],options:[tt,Be,{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..."}]},lh=V.object({cvm:V.string(),privateKey:V.string().optional(),rpcUrl:V.string().optional(),wait:V.boolean().default(!1),json:V.boolean().default(!1)}),mh={name:"toggle-allow-any",description:"Toggle allow-any-device on the contract (or force via --enable/--disable)",stability:"unstable",arguments:[dr],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"},tt,Be,{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..."}]},ph=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 MA=/^(0x)?[0-9a-fA-F]{64}$/,gh=/^[0-9a-fA-F]{40}$/;function An(e){return(e.startsWith("0x")?e:`0x${e}`).toLowerCase()}function $a(e){return MA.test(e)}function DA(e){return e.startsWith("app_")||gh.test(e)}function uh(e){let t=e.startsWith("app_")?e.slice(4):e;return gh.test(t)?t.toLowerCase():t}function Ma(e,t){if(!t)return null;let n=e.blockExplorers?.default?.url;return n?`${n}/tx/${t}`:null}var Da=3e4,UA=15e3,Ta=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}},LA=[/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 hh(e){if(e instanceof Ta)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(`
|
|
466
|
+
`);return LA.some(a=>a.test(o))}async function fr(e,t,n=Da){let r;try{return await Promise.race([e,new Promise((o,a)=>{r=setTimeout(()=>{a(new Ta(t,n))},n)})])}finally{r&&clearTimeout(r)}}function mn(e,t){return t||e.rpcUrls.default.http[0]||"the default RPC"}function NA(e){switch(e){case 1:return"https://ethereum-rpc.publicnode.com";case 8453:return"https://base-rpc.publicnode.com";default:return null}}function OA(e){return`https://chainlist.org/chain/${e}`}var dh=new Set(["--private-key","--privateKey"]);function jA(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(dh.has(r)&&n+1<e.length){t.push(r,"$PRIVATE_KEY"),n+=1;continue}let o=r.indexOf("=");if(o>0&&dh.has(r.slice(0,o))){t.push(`${r.slice(0,o)}=$PRIVATE_KEY`);continue}t.push(r)}return t}function FA(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 VA(e){return/^[a-zA-Z0-9_\-./:=@,+%]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function zA(e){let t=process.argv.slice(2),n=jA(t);return["phala",...FA(n,e)].map(VA).join(" ")}function Te(e=""){process.stderr.write(`${e}
|
|
467
|
+
`)}function HA(e,t){Te(`The ${e.name} RPC endpoint (${t}) appears unreachable or rate-limited.`);let n=NA(e.id);n?(Te("Retry with:"),Te(` ${zA(n)}`)):Te("Retry by appending --rpc-url <URL> to your command with a different endpoint."),Te(),Te(`More public ${e.name} RPC endpoints: ${OA(e.id)}`),Te("For production workloads, register a paid provider for reliability:"),Te(" Alchemy: https://www.alchemy.com"),Te(" Infura: https://www.infura.io"),Te(" QuickNode: https://www.quicknode.com")}function Mt(e,t,n,r=!1){r||!t||!n||hh(e)&&HA(t,n)}function Hi(e){if(e.json)return;let{chain:t,description:n,txHash:r}=e;Te(`${n} submitted: ${r}`);let o=Ma(t,r);o&&Te(`Explorer: ${o}`),Te("Waiting for 1 confirmation...")}function qA(e){return e.enable&&e.disable||!e.enable&&!e.disable?null:!!e.enable}function KA(e){return e.enable&&e.disable?null:e.enable===!0?!0:e.disable===!0?!1:!(e.currentValue??!1)}function GA(e){return new Set(e.map(t=>An(t.device_id)))}async function qi(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,m=mn(t,n),u=e.json??!1,d;for(;Date.now()<l;){try{let f=await fr(So({chain:t,rpcUrl:n,appAddress:r,deviceIds:o}),m,UA);if(a(f))return!0;d=void 0}catch(f){if(!hh(f))throw f;d=f}await new Promise(f=>{setTimeout(f,c)})}return u||Te(`Warning: timeout waiting for on-chain state: ${s}`),d&&Mt(d,t,m,u),!1}function yh(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function Ki(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($a(e))return An(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 Nt(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||!$a(a))throw new Error(`Node "${o[0].name}" has no valid device_id. Use an explicit device ID.`);return An(a)}async function gr(e,t){let n=await E(t),r;if(DA(e))r=uh(e);else{let i=await G(n,{id:e});if(!i.success)return t.failWithError(i.error.cause??i.error,{operation:"Manage devices"}),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 Io(n,{appId:uh(r)});if(!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Manage devices"}),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=Et[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 BA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Te(s)},o,a;try{let s=await gr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c}=s;a=i,o=mn(i,n.rpcUrl);let l=await E(t),m=await Nt(l),u=new Map;if(m.success)for(let y of m.data.nodes)y.device_id&&$a(y.device_id)&&u.set(An(y.device_id),y.name);else r("Warning: could not fetch platform nodes \u2014 node names will not be shown.");let d=Array.from(u.keys()),f=await fr(So({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceIds:d}),o);if(n.json)return t.success({appAddress:c,chain:i.name,owner:f.owner,allowAnyDevice:f.allowAnyDevice,devices:f.allowAnyDevice?[]:f.devices.map(y=>({deviceId:y,nodeName:u.get(y.toLowerCase())??null}))}),0;if(r(`Contract: ${c}`),r(`Chain: ${i.name}`),r(`Owner: ${f.owner}`),r(`Allow Any Device: ${f.allowAnyDevice?"yes":"no"}`),f.allowAnyDevice)return 0;if(f.devices.length===0)return r("No devices found"),0;let h=["DEVICE_ID","NODE"],g=f.devices.map(y=>({DEVICE_ID:y,NODE:u.get(y.toLowerCase())??"-"}));return ce(h,g),0}catch(s){return Mt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1}}async function WA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Te(s)},o,a;try{let s=await gr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c,allowlist:l}=s;a=i,o=mn(i,n.rpcUrl);let m=Ki(n),u;if(n.interactive&&!n.deviceId){let f=await E(t),h=await Nt(f);if(!h.success)return t.failWithError(h.error.cause??h.error,{operation:"Manage devices"}),1;let g=GA(l.devices),y=h.data.nodes.filter(_=>_.device_id&&$a(_.device_id)&&!g.has(An(_.device_id)));if(y.length===0)return r("All available devices are already in the allowlist."),0;let{selected:S}=await fh.prompt([{type:"checkbox",name:"selected",message:"Select devices to add:",choices:y.map(_=>({name:`${_.name} ${_.device_id}`,value:_.device_id}))}]);if(S.length===0)return r("No devices selected."),0;u=S.map(_=>An(_))}else if(n.deviceId)u=[await bh(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let d=[];for(let f of u){r(`Submitting add-device transaction for ${f}...`),r(`RPC URL: ${o}`);let h=await fr(Qt({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceId:f,privateKey:m,skipPrerequisiteChecks:!0,timeout:Da,onTransactionSubmitted:y=>{Hi({chain:i,description:`Add-device transaction for ${f}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Mt(new Error(y.error.message),i,o,n.json),t.failWithError(y.error,{operation:`Add device ${f}`}),1}let g=h.data;d.push({deviceId:f,txHash:g.transactionHash,explorer:Ma(i,g.transactionHash)})}if(n.json)return t.success(d),0;for(let f of d)r(`Added ${f.deviceId}`),r(`Transaction: ${f.txHash}`),f.explorer&&r(`Explorer: ${f.explorer}`);if(n.wait){if(!await qi({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 yh(s)?(r("Cancelled."),0):(Mt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1)}}async function JA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=(s="")=>{n.json||Te(s)},o,a;try{let s=await gr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c,allowlist:l}=s;a=i,o=mn(i,n.rpcUrl);let m=Ki(n),u;if(n.interactive&&!n.deviceId){let f=l.devices.filter(g=>g.status==="allowed");if(f.length===0)return t.fail("No allowed devices found to remove."),1;let{selected:h}=await fh.prompt([{type:"checkbox",name:"selected",message:"Select devices to remove:",choices:f.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=>An(g))}else if(n.deviceId)u=[await bh(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let d=[];for(let f of u){r(`Submitting remove-device transaction for ${f}...`),r(`RPC URL: ${o}`);let h=await fr(Jl({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceId:f,privateKey:m,skipPrerequisiteChecks:!0,timeout:Da,onTransactionSubmitted:y=>{Hi({chain:i,description:`Remove-device transaction for ${f}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Mt(new Error(y.error.message),i,o,n.json),t.failWithError(y.error,{operation:`Remove device ${f}`}),1}let g=h.data;d.push({deviceId:f,txHash:g.transactionHash,explorer:Ma(i,g.transactionHash)})}if(n.json)return t.success(d),0;for(let f of d)r(`Removed ${f.deviceId}`),r(`Transaction: ${f.txHash}`),f.explorer&&r(`Explorer: ${f.explorer}`);if(n.wait)if((await fr(So({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 qi({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(S=>S.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 yh(s)?(r("Cancelled."),0):(Mt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1)}}async function YA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=qA(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 gr(n.cvm,t);return s?(a=s.chain,o=mn(s.chain,n.rpcUrl),await Gi(n,t,{chain:s.chain,appContractAddress:s.appContractAddress,allow:r})):1}catch(s){return Mt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1}}async function XA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await gr(n.cvm,t);return a?(o=a.chain,r=mn(a.chain,n.rpcUrl),await Gi(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:!1})):1}catch(a){return Mt(a,o,r,n.json),t.failWithError(a,{operation:"Manage devices"}),1}}async function ZA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await gr(n.cvm,t);if(!a)return 1;o=a.chain,r=mn(a.chain,n.rpcUrl);let s=KA({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 Gi(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:s})}catch(a){return Mt(a,o,r,n.json),t.failWithError(a,{operation:"Manage devices"}),1}}async function Gi(e,t,n){let r=e.json??!1,o=(f="")=>{r||Te(f)},{chain:a,appContractAddress:s,allow:i}=n,c=Ki(e),l=mn(a,e.rpcUrl);o(`Submitting allow-any-device transaction (${i?"enable":"disable"})...`),o(`RPC URL: ${l}`);let m=await fr(Yl({chain:a,rpcUrl:e.rpcUrl,appAddress:s,allow:i,privateKey:c,timeout:Da,onTransactionSubmitted:f=>{Hi({chain:a,description:"Allow-any-device transaction",txHash:f,json:r})}}),l);if(!m.success){let f=m;return Mt(new Error(f.error.message),a,l,r),t.fail(f.error.message),1}let u=m.data,d=Ma(a,u.transactionHash);if(r)return t.success({...u,explorer:d??void 0}),0;if(o(`Allow-any-device ${i?"enabled":"disabled"} successfully!`),o(`Transaction: ${u.transactionHash}`),d&&o(`Explorer: ${d}`),e.wait){if(!await qi({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 QA=b({path:["allow-devices","list"],meta:eh,schema:th,handler:BA}),eR=b({path:["allow-devices","add"],meta:nh,schema:rh,handler:WA}),tR=b({path:["allow-devices","remove"],meta:oh,schema:ah,handler:JA}),nR=b({path:["allow-devices","allow-any"],meta:sh,schema:ih,handler:YA}),rR=b({path:["allow-devices","disallow-any"],meta:ch,schema:lh,handler:XA}),oR=b({path:["allow-devices","toggle-allow-any"],meta:mh,schema:ph,handler:ZA}),Bi={group:Qg,commands:[QA,eR,tR,nR,rR,oR]};import{readFileSync as aR}from"fs";import{keccak256 as wh,hexToBytes as sR}from"viem";import{z as hr}from"zod";var vh={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"}]},Ch=hr.object({hexValues:hr.array(hr.string()),check:hr.boolean().default(!1),quiet:hr.boolean().default(!1),status:hr.boolean().default(!1)});function iR(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 cR(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 Wi(e){let t=e.map(o=>sR(iR(o))),n=cR(t);return wh(n).slice(2)}function lR(e){return wh(e).slice(2)}async function mR(e){let t=[];for await(let n of e)t.push(Buffer.from(n));return Buffer.concat(t).toString("utf-8").trim()}function pR(e,t,n){let r;try{r=aR(e,"utf-8")}catch{return n.fail(`${e}: No such file`),1}let o=r.split(`
|
|
482
468
|
`),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[,
|
|
484
|
-
`);continue}let
|
|
485
|
-
`):(a++,t.status||n.stdout.write(`${
|
|
486
|
-
`))}catch{a++,t.status||n.stdout.write(`${
|
|
469
|
+
`),a++;continue}let[,m,u]=l,d=u;if(u==="-"){t.status||n.stderr.write(`keccak256sum: -: cannot verify stdin from checksum file
|
|
470
|
+
`);continue}let f=u.split(/\s+/).filter(Boolean);try{let h=Wi(f);s++,h===m.toLowerCase()?!t.quiet&&!t.status&&n.stdout.write(`${d}: OK
|
|
471
|
+
`):(a++,t.status||n.stdout.write(`${d}: FAILED
|
|
472
|
+
`))}catch{a++,t.status||n.stdout.write(`${d}: FAILED
|
|
487
473
|
`)}}return a>0&&!t.status&&n.stderr.write(`keccak256sum: WARNING: ${a} computed checksum(s) did NOT match
|
|
488
|
-
`),a>0?1:0}async function
|
|
474
|
+
`),a>0?1:0}async function uR(e,t){if(e.check)return e.hexValues.length===0?(t.fail("No checksum file specified"),1):pR(e.hexValues[0],{quiet:e.quiet,status:e.status},t);if(e.hexValues.length>0)try{let n=Wi(e.hexValues),r=e.hexValues.join(" ");return t.stdout.write(`${n} ${r}
|
|
489
475
|
`),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
476
|
|
|
491
477
|
Compute or verify keccak256 checksums of hex inputs.
|
|
492
478
|
Read from stdin when no arguments are given.
|
|
493
|
-
`),1;try{let r=(await
|
|
494
|
-
`),0}catch(n){return t.fail(n instanceof Error?n.message:"Failed to compute keccak256"),1}}var
|
|
479
|
+
`),1;try{let r=(await mR(t.stdin)).split(/\s+/).filter(Boolean),o;return r.length===0?o=lR(new Uint8Array(0)):o=Wi(r),t.stdout.write(`${o} -
|
|
480
|
+
`),0}catch(n){return t.fail(n instanceof Error?n.message:"Failed to compute keccak256"),1}}var _h=b({path:["keccak256sum"],meta:vh,schema:Ch,handler:uR});var bR=yR(import.meta.url),vR=gR(bR),CR=hR(vR,"../package.json"),Ua=JSON.parse(fR(CR,"utf-8")),wR="+272560d",_R=`v${Ua.version}${wR}`,SR=Oo(),$=new zo;$.registerCommand(od);$.registerCommand(fg);$.registerGroup(gg);$.registerCommand(bg);$.registerCommand(_g);$.registerCommand(Ig);$.registerCommand(Pg);$.registerCommand(qd);$.registerCommand(Jf);$.registerCommand(Qf);$.registerCommand(ng);$.registerCommand(sg);$.registerCommand(Dg);$.registerCommand(Nd);$.registerCommand(Bd);$.registerCommand(Nf);$.registerCommand(ki);$.registerCommand(Ei);$.registerCommand(Ri);$.registerCommand(xi);$.registerCommand(Ff);$.registerCommand(_p);$.registerCommand(Ef);$.registerCommand(Zg);$.registerCommand(zf);$.registerCommand(bf);$.registerCommand(_h);$.registerCommand(Md);$.registerGroup(Di.group);for(let e of Di.commands)$.registerCommand(e);$.registerGroup(qs.group);for(let e of qs.commands)$.registerCommand(e);$.registerGroup(Gs.group);for(let e of Gs.commands)$.registerCommand(e);$.registerGroup(ci.group);for(let e of ci.commands)$.registerCommand(e);$.registerGroup(aa.group);for(let e of aa.commands)$.registerCommand(e);for(let e of aa.subgroups??[]){$.registerGroup(e.group);for(let t of e.commands)$.registerCommand(t)}$.registerGroup(li.group);for(let e of li.commands)$.registerCommand(e);$.registerGroup(Vi.group);for(let e of Vi.commands)$.registerCommand(e);$.registerGroup(bi.group);for(let e of bi.commands)$.registerCommand(e);$.registerGroup(Ci.group);for(let e of Ci.commands)$.registerCommand(e);$.registerGroup(_i.group);for(let e of _i.commands)$.registerCommand(e);$.registerGroup(Bi.group);for(let e of Bi.commands)$.registerCommand(e);process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function La(e){e.destroyed||e.writableLength===0||await Promise.race([dR(e,"drain"),new Promise(t=>setTimeout(t,5e3))])}async function kR(){await fp({env:process.env,stderr:process.stderr});let e=await mp({registry:$,argv:process.argv.slice(2),executableName:Ua.name??"phala",version:_R,packageName:Ua.name??"phala",packageVersion:Ua.version,runtime:SR,cwd:process.cwd(),env:process.env,stdout:process.stdout,stderr:process.stderr,stdin:process.stdin});await Promise.all([La(process.stdout),La(process.stderr)]),process.exit(e)}kR().catch(async e=>{console.error("An error occurred:",e),await Promise.all([La(process.stdout),La(process.stderr)]),process.exit(1)});
|
|
495
481
|
/*! Bundled license information:
|
|
496
482
|
|
|
497
483
|
@noble/hashes/esm/utils.js:
|