phala 1.1.21 → 1.1.22
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.d.ts +10 -10
- package/dist/api/index.js +24 -24
- package/dist/index.js +160 -231
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,168 +1,97 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire } from 'module';const require = createRequire(import.meta.url);
|
|
3
|
-
var
|
|
3
|
+
var Xh=Object.create;var ic=Object.defineProperty;var Zh=Object.getOwnPropertyDescriptor;var Qh=Object.getOwnPropertyNames;var ey=Object.getPrototypeOf,ty=Object.prototype.hasOwnProperty;var Wa=(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 Ir=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ny=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Qh(t))!ty.call(e,o)&&o!==n&&ic(e,o,{get:()=>t[o],enumerable:!(r=Zh(t,o))||r.enumerable});return e};var ry=(e,t,n)=>(n=e!=null?Xh(ey(e)):{},ny(t||!e||!e.__esModule?ic(n,"default",{value:e,enumerable:!0}):n,e));var lc=Ir((hx,cc)=>{var Pn=1e3,$n=Pn*60,Tn=$n*60,un=Tn*24,oy=un*7,ay=un*365.25;cc.exports=function(e,t){t=t||{};var n=typeof e;if(n==="string"&&e.length>0)return sy(e);if(n==="number"&&isFinite(e))return t.long?cy(e):iy(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function sy(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*ay;case"weeks":case"week":case"w":return n*oy;case"days":case"day":case"d":return n*un;case"hours":case"hour":case"hrs":case"hr":case"h":return n*Tn;case"minutes":case"minute":case"mins":case"min":case"m":return n*$n;case"seconds":case"second":case"secs":case"sec":case"s":return n*Pn;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function iy(e){var t=Math.abs(e);return t>=un?Math.round(e/un)+"d":t>=Tn?Math.round(e/Tn)+"h":t>=$n?Math.round(e/$n)+"m":t>=Pn?Math.round(e/Pn)+"s":e+"ms"}function cy(e){var t=Math.abs(e);return t>=un?bo(e,t,un,"day"):t>=Tn?bo(e,t,Tn,"hour"):t>=$n?bo(e,t,$n,"minute"):t>=Pn?bo(e,t,Pn,"second"):e+" ms"}function bo(e,t,n,r){var o=t>=n*1.5;return Math.round(e/n)+" "+r+(o?"s":"")}});var Ja=Ir((yx,mc)=>{function ly(e){n.debug=n,n.default=n,n.coerce=c,n.disable=s,n.enable=o,n.enabled=i,n.humanize=lc(),n.destroy=l,Object.keys(e).forEach(m=>{n[m]=e[m]}),n.names=[],n.skips=[],n.formatters={};function t(m){let d=0;for(let u=0;u<m.length;u++)d=(d<<5)-d+m.charCodeAt(u),d|=0;return n.colors[Math.abs(d)%n.colors.length]}n.selectColor=t;function n(m){let d,u=null,f,h;function g(...y){if(!g.enabled)return;let k=g,v=Number(new Date),I=v-(d||v);k.diff=I,k.prev=d,k.curr=v,d=v,y[0]=n.coerce(y[0]),typeof y[0]!="string"&&y.unshift("%O");let S=0;y[0]=y[0].replace(/%([a-zA-Z%])/g,(A,x)=>{if(A==="%%")return"%";S++;let N=n.formatters[x];if(typeof N=="function"){let T=y[S];A=N.call(k,T),y.splice(S,1),S--}return A}),n.formatArgs.call(k,y),(k.log||n.log).apply(k,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:()=>u!==null?u:(f!==n.namespaces&&(f=n.namespaces,h=n.enabled(m)),h),set:y=>{u=y}}),typeof n.init=="function"&&n.init(g),g}function r(m,d){let u=n(this.namespace+(typeof d>"u"?":":d)+m);return u.log=this.log,u}function o(m){n.save(m),n.namespaces=m,n.names=[],n.skips=[];let d=(typeof m=="string"?m:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let u of d)u[0]==="-"?n.skips.push(u.slice(1)):n.names.push(u)}function a(m,d){let u=0,f=0,h=-1,g=0;for(;u<m.length;)if(f<d.length&&(d[f]===m[u]||d[f]==="*"))d[f]==="*"?(h=f,g=u,f++):(u++,f++);else if(h!==-1)f=h+1,g++,u=g;else return!1;for(;f<d.length&&d[f]==="*";)f++;return f===d.length}function s(){let m=[...n.names,...n.skips.map(d=>"-"+d)].join(",");return n.enable(""),m}function i(m){for(let d of n.skips)if(a(m,d))return!1;for(let d of n.names)if(a(m,d))return!0;return!1}function 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}mc.exports=ly});var pc=Ir((Ze,vo)=>{Ze.formatArgs=py;Ze.save=dy;Ze.load=uy;Ze.useColors=my;Ze.storage=fy();Ze.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`."))}})();Ze.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 my(){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 py(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+vo.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)}Ze.log=console.debug||console.log||(()=>{});function dy(e){try{e?Ze.storage.setItem("debug",e):Ze.storage.removeItem("debug")}catch{}}function uy(){let e;try{e=Ze.storage.getItem("debug")||Ze.storage.getItem("DEBUG")}catch{}return!e&&typeof process<"u"&&"env"in process&&(e=process.env.DEBUG),e}function fy(){try{return localStorage}catch{}}vo.exports=Ja()(Ze);var{formatters:gy}=vo.exports;gy.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}}});var uc=Ir((Pe,wo)=>{var hy=Wa("tty"),Co=Wa("util");Pe.init=ky;Pe.log=Cy;Pe.formatArgs=by;Pe.save=wy;Pe.load=_y;Pe.useColors=yy;Pe.destroy=Co.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");Pe.colors=[6,2,3,4,5,1];try{let e=Wa("supports-color");e&&(e.stderr||e).level>=2&&(Pe.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{}Pe.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 yy(){return"colors"in Pe.inspectOpts?!!Pe.inspectOpts.colors:hy.isatty(process.stderr.fd)}function by(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(" ")};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
|
|
9
|
-
`)}function
|
|
5
|
+
`+a),e.push(o+"m+"+wo.exports.humanize(this.diff)+"\x1B[0m")}else e[0]=vy()+t+" "+e[0]}function vy(){return Pe.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Cy(...e){return process.stderr.write(Co.formatWithOptions(Pe.inspectOpts,...e)+`
|
|
6
|
+
`)}function wy(e){e?process.env.DEBUG=e:delete process.env.DEBUG}function _y(){return process.env.DEBUG}function ky(e){e.inspectOpts={};let t=Object.keys(Pe.inspectOpts);for(let n=0;n<t.length;n++)e.inspectOpts[t[n]]=Pe.inspectOpts[t[n]]}wo.exports=Ja()(Pe);var{formatters:dc}=wo.exports;dc.o=function(e){return this.inspectOpts.colors=this.useColors,Co.inspect(e,this.inspectOpts).split(`
|
|
7
|
+
`).map(t=>t.trim()).join(" ")};dc.O=function(e){return this.inspectOpts.colors=this.useColors,Co.inspect(e,this.inspectOpts)}});var fc=Ir((bx,Ya)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?Ya.exports=pc():Ya.exports=uc()});import{once as rx}from"events";import{readFileSync as ox}from"fs";import{dirname as ax,join as sx}from"path";import{fileURLToPath as ix}from"url";var sl=ry(fc(),1);import{ofetch as Gy}from"ofetch";function gc(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 $e}from"zod";import{z as pe}from"zod";import{z as Xt}from"zod";import{z}from"zod";import{z as _}from"zod";import{z as R}from"zod";import{z as Lt}from"zod";import{anvil as Dc,base as Uc,mainnet as Lc}from"viem/chains";import{z as U}from"zod";import{z as we}from"zod";import{z as Ae}from"zod";import{z as Dn}from"zod";import{z as Un}from"zod";import{z as P}from"zod";import{z as ne}from"zod";import{z as V}from"zod";import fv from"crypto";import{z as mt}from"zod";import{z as gt}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 Ln}from"zod";import{z as at}from"zod";import{z as Nc}from"zod";import{z as kt}from"zod";import{z as St}from"zod";import{z as Be}from"zod";import{z as Oc}from"zod";import{z as Mr}from"zod";import{z as Hn}from"zod";import{z as gn}from"zod";import{z as ce}from"zod";import{z as jC}from"zod";import{z as VC}from"zod";import{z as ae}from"zod";import{z as wt}from"zod";import{z as tw}from"zod";import{z as Ce}from"zod";import{z as O}from"zod";import{z as Nt}from"zod";import{z as ss}from"zod";import{z as Re}from"zod";import{z as Jl}from"zod";import{z as vt}from"zod";import{z as Qe}from"zod";import{z as Zt}from"zod";import{z as is}from"zod";import{z as ps}from"zod";import{z as fn}from"zod";import{z as Ue}from"zod";import{z as de}from"zod";import{z as H}from"zod";import{z as ge}from"zod";import{z as Z}from"zod";import{z as Se}from"zod";import{createPublicClient as Vc,createWalletClient as c_,http as cs,parseEventLogs as l_,parseEther as Kc}from"viem";import{privateKeyToAccount as m_}from"viem/accounts";import{x25519 as Xa}from"@noble/curves/ed25519";function Sy(e){return e=e.startsWith("0x")?e.slice(2):e,new Uint8Array(e.match(/.{1,2}/g)?.map(t=>parseInt(t,16))??[])}function Iy(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=Xa.utils.randomPrivateKey(),o=Xa.getPublicKey(r),a=Sy(t),s=Xa.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),Iy(m)}import{concat as p_,keccak256 as JP,sha256 as d_,stringToBytes as Hc,toBytes as u_,toHex as f_}from"viem";import{isHex as qc}from"viem";import{createPublicClient as ZP,createWalletClient as QP,http as e$,custom as t$}from"viem";import{privateKeyToAccount as r$}from"viem/accounts";import{z as he}from"zod";import{createPublicClient as Gc,createWalletClient as E_,http as ls,parseEventLogs as A_,parseEther as Bc}from"viem";import{privateKeyToAccount as R_}from"viem/accounts";import{z as ye}from"zod";import{createPublicClient as Wc,createWalletClient as M_,http as Jc,parseEther as Yc}from"viem";import{privateKeyToAccount as D_}from"viem/accounts";import{z as be}from"zod";import{createPublicClient as Xc,createWalletClient as O_,http as Zc,parseEther as Qc}from"viem";import{privateKeyToAccount as j_}from"viem/accounts";import{z as ve}from"zod";import{createPublicClient as el,createWalletClient as H_,http as tl,parseEther as nl}from"viem";import{privateKeyToAccount as z_}from"viem/accounts";import{z as On}from"zod";import{createPublicClient as W_,http as J_}from"viem";import{createPublicClient as C$,http as w$}from"viem";import{createPublicClient as k$,http as S$}from"viem";import{createPublicClient as Y_,http as X_}from"viem";import{z as jn}from"zod";import{z as ht}from"zod";import{z as rl}from"zod";import{z as Fn}from"zod";import{z as Y}from"zod";import{z as Ao}from"zod";import{z as zn}from"zod";import{z as ot}from"zod";import{z as Ie}from"zod";import{z as se}from"zod";import{z as xr}from"zod";import{z as lt}from"zod";import{z as Pr}from"zod";import{z as _k}from"zod";import{z as De}from"zod";import{z as Vn}from"zod";import{z as je}from"zod";import{z as rt}from"zod";import{z as ol}from"zod";import{z as Dr}from"zod";import{z as Ct}from"zod";import{z as Ee}from"zod";import{z as Io}from"zod";import{z as Eo}from"zod";import{z as Ge}from"zod";import{z as B}from"zod";function Ey(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 Er(e,...t){if(!Ey(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 Qa(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 hc(e,t){Er(e);let n=t.outputLen;if(e.length<n)throw new Error("digestInto() expects output buffer of length at least "+n)}function yc(e){return new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function es(...e){for(let t=0;t<e.length;t++)e[t].fill(0)}var Ay=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function Ry(e){return e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255}function xy(e){for(let t=0;t<e.length;t++)e[t]=Ry(e[t]);return e}var ts=Ay?e=>e:xy;function Py(e){if(typeof e!="string")throw new Error("string expected");return new Uint8Array(new TextEncoder().encode(e))}function ns(e){return typeof e=="string"&&(e=Py(e)),Er(e),e}var _o=class{};function bc(e){let t=r=>e().update(ns(r)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}var ko=BigInt(4294967295),vc=BigInt(32);function $y(e,t=!1){return t?{h:Number(e&ko),l:Number(e>>vc&ko)}:{h:Number(e>>vc&ko)|0,l:Number(e&ko)|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}=$y(e[a],t);[r[a],o[a]]=[s,i]}return[r,o]}var wc=(e,t,n)=>e<<n|t>>>32-n,_c=(e,t,n)=>t<<n|e>>>32-n,kc=(e,t,n)=>t<<n-32|e>>>64-n,Sc=(e,t,n)=>e<<n-32|t>>>64-n;var Ty=BigInt(0),Ar=BigInt(1),My=BigInt(2),Dy=BigInt(7),Uy=BigInt(256),Ly=BigInt(113),Ac=[],Rc=[],xc=[];for(let e=0,t=Ar,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],Ac.push(2*(5*r+n)),Rc.push((e+1)*(e+2)/2%64);let o=Ty;for(let a=0;a<7;a++)t=(t<<Ar^(t>>Dy)*Ly)%Uy,t&My&&(o^=Ar<<(Ar<<BigInt(a))-Ar);xc.push(o)}var Pc=Cc(xc,!0),Ny=Pc[0],Oy=Pc[1],Ic=(e,t,n)=>n>32?kc(e,t,n):wc(e,t,n),Ec=(e,t,n)=>n>32?Sc(e,t,n):_c(e,t,n);function jy(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],d=Ic(l,m,1)^n[i],u=Ec(l,m,1)^n[i+1];for(let f=0;f<50;f+=10)e[s+f]^=d,e[s+f+1]^=u}let o=e[2],a=e[3];for(let s=0;s<24;s++){let i=Rc[s],c=Ic(o,a,i),l=Ec(o,a,i),m=Ac[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]^=Ny[r],e[1]^=Oy[r]}es(n)}var rs=class e extends _o{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=yc(this.state)}clone(){return this._cloneInto()}keccak(){ts(this.state32),jy(this.state32,this.rounds),ts(this.state32),this.posOut=0,this.pos=0}update(t){Qa(this),t=ns(t),Er(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){Qa(this,!1),Er(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(hc(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,es(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}},Fy=(e,t,n)=>bc(()=>new rs(t,e,n));var $c=Fy(1,136,256/8);import{secp256k1 as Vy}from"@noble/curves/secp256k1";function Ky(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 zy(...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 qy(e,t){try{let n=t.slice(0,64),r=t[64],o=Vy.Signature.fromCompact(n).addRecoveryBit(r).recoverPublicKey(e);return"0x"+Hy(o.toRawBytes(!0))}catch(n){return console.error("signature verification failed:",n),null}}function os(e,t,n){if(t.length!==65)return null;let r=Ky(n);if(!r)return null;let o=new TextEncoder().encode("dstack-env-encrypt-pubkey"),a=new TextEncoder().encode(":"),s=zy(o,a,r,e);return qy($c(s),t)}var By=$e.object({detail:$e.union([$e.string(),$e.array($e.object({msg:$e.string(),type:$e.string().optional(),ctx:$e.record($e.unknown()).optional(),loc:$e.array($e.union([$e.string(),$e.number()])).optional(),input:$e.unknown().optional()}).passthrough()),$e.record($e.unknown())]).optional(),type:$e.string().optional(),code:$e.string().optional()});function Wy(e){if(!e||typeof e!="object")return;let t=e.request_id;return typeof t=="string"?t:void 0}function Jy(e){return e?.headers?.get("X-Request-ID")??void 0}function Tc(e){if(typeof e!="string")return;let t=e.trim().toUpperCase();return t.length>0?t:void 0}var et=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)}},Tr=class $r extends et{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=Jy(t.response),o=n??r,a=Tc(t.options?.method),s=By.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 $r(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 $r(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 $r(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 $r(t.message,{request:n??void 0,requestMethod:Tc(r),detail:t.message})}},Yy=class extends et{constructor(e,t){super(e,t),this.isValidationError=!0,this.validationErrors=t.validationErrors}},Xy=class extends et{constructor(){super(...arguments),this.isAuthError=!0}},Ro=class extends et{constructor(){super(...arguments),this.isBusinessError=!0}},Zy=class extends et{constructor(){super(...arguments),this.isServerError=!0}},Qy=class extends et{constructor(){super(...arguments),this.isUnknownError=!0}};function eb(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 il(e){if(!Array.isArray(e))return{errors:[],message:typeof e=="string"?e:"Validation error"};let t=e.map((o,a)=>{let s=eb(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 tb(e){return e===422?"validation":e===401||e===403?"auth":e>=400&&e<500?"business":e>=500?"server":"unknown"}function nb(e,t,n){if(e===422&&Array.isArray(t)){let{message:r}=il(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 rb(e){let t=e.status??0,n=e.statusText??"Unknown Error",r=e.detail,o=ab(r);if(o)return new Et(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=tb(t),s=nb(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}=il(r);return new Yy(s,{...i,validationErrors:c})}return a==="auth"?new Xy(s,i):a==="business"?new Ro(s,i):a==="server"?new Zy(s,i):new Qy(s,i)}function ob(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 Et=class extends Ro{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 ab(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 cl(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}: ${ob(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 hn=["2025-10-28","2026-01-21","2026-05-22","2026-06-23"],sb="2026-06-23",Mn=(0,sl.default)("phala::api-client");function ib(e){return Object.entries(e).map(([t,n])=>` -H "${t}: ${n}"`).join(`
|
|
9
|
+
`)}function cb(e){return e?` -d '${(typeof e=="string"?e:JSON.stringify(e,null,2)).replace(/'/g,"\\'")}'`:""}function Mc(e,t,n,r){let o=[];n.forEach((i,c)=>{o.push(`${c}: ${i}`)});let a=o.join(`
|
|
10
10
|
`),s=typeof r=="string"?r:JSON.stringify(r,null,2);return[`< HTTP/1.1 ${e} ${t}`,a?`< ${a.replace(/\n/g,`
|
|
11
11
|
< `)}`:"","",s].filter(Boolean).join(`
|
|
12
|
-
`)}var
|
|
13
|
-
`)
|
|
12
|
+
`)}var lb=class ll{constructor(t={}){this.emitter=gc();let n=t.apiKey||process?.env?.PHALA_CLOUD_API_KEY,r=t.bearerToken||process?.env?.PHALA_OIDC_TOKEN,o=t.workspace||process?.env?.PHALA_CLOUD_WORKSPACE,a=t.baseURL||process?.env?.PHALA_CLOUD_API_PREFIX||"https://cloud-api.phala.com/api/v1",s=t.version&&hn.includes(t.version)?t.version:sb;this.config={...t,apiKey:n,bearerToken:r,workspace:o,baseURL:a,version:s};let{apiKey:i,bearerToken:c,workspace:l,baseURL:m,timeout:d,headers:u,useCookieAuth:f,onResponseError:h,...g}=this.config,y={"X-Phala-Version":s,"Content-Type":"application/json"};u&&typeof u=="object"&&Object.entries(u).forEach(([k,v])=>{typeof v=="string"&&(y[k]=v)}),!f&&i?y["X-API-Key"]=i:!f&&c&&(y.Authorization=`Bearer ${c}`),l&&typeof l=="string"&&l.trim().length>0&&(y["X-Phala-Workspace"]=l.trim()),this.fetchInstance=Gy.create({baseURL:m,timeout:d||6e4,headers:y,...f?{credentials:"include"}:{},...g,onRequest({request:k,options:v}){if(v.body instanceof FormData){let I=v.headers;I instanceof Headers?I.delete("content-type"):I&&typeof I=="object"&&!Array.isArray(I)&&(delete I["Content-Type"],delete I["content-type"])}if(Mn.enabled){let I=v.method||"GET",S=typeof k=="string"?k:k.url,C=S.startsWith("http")?S:`${m}${S}`,A={};v.headers&&typeof v.headers=="object"&&Object.entries(v.headers).forEach(([N,T])=>{typeof T=="string"&&(A[N]=T)});let x=[`> curl -X ${I} "${C}"`,ib(A),v.body?cb(v.body):""].filter(Boolean).join(`
|
|
13
|
+
`);Mn(`
|
|
14
14
|
=== REQUEST ===
|
|
15
15
|
%s
|
|
16
|
-
`,
|
|
16
|
+
`,x)}},onResponse({request:k,response:v,options:I}){if(Mn.enabled){let S=I.method||"GET",C=typeof k=="string"?k:k.url;Mn(`
|
|
17
17
|
=== RESPONSE [%s %s] (%dms) ===
|
|
18
18
|
%s
|
|
19
|
-
`,
|
|
19
|
+
`,S,C,v.headers.get("x-response-time")||"?",Mc(v.status,v.statusText,v.headers,v._data))}},onResponseError:({request:k,response:v,options:I})=>{if(Mn.enabled){console.warn(`HTTP ${v.status}: ${v.url}`);let S=I.method||"GET",C=typeof k=="string"?k:k.url;Mn(`
|
|
20
20
|
=== ERROR RESPONSE [%s %s] ===
|
|
21
21
|
%s
|
|
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=
|
|
24
|
-
`),a=a.replace(/\\r/g,"\r")),t[o]=a}return t}function
|
|
25
|
-
|
|
26
|
-
All environment variables recognized by the Phala CLI. Command-line flags always take precedence over environment variables when both are set.
|
|
27
|
-
|
|
28
|
-
## Authentication
|
|
29
|
-
|
|
30
|
-
- \`PHALA_CLOUD_API_KEY\` \u2014 API token. Overrides the token stored by \`phala login\`.
|
|
31
|
-
- \`PHALA_CLOUD_API_PREFIX\` \u2014 API base URL. Default: \`https://cloud-api.phala.com/api/v1\`.
|
|
32
|
-
|
|
33
|
-
The \`@phala/cloud\` JS SDK also reads both directly when \`createClient()\` is
|
|
34
|
-
called without explicit config.
|
|
35
|
-
|
|
36
|
-
## On-chain KMS
|
|
37
|
-
|
|
38
|
-
These variables apply to \`deploy\`, \`allow-devices\`, \`cvms replicate\`, and
|
|
39
|
-
\`envs update\` when the CVM uses Ethereum or Base KMS:
|
|
40
|
-
|
|
41
|
-
- \`PRIVATE_KEY\` \u2014 Private key for signing on-chain transactions.
|
|
42
|
-
Precedence: \`--private-key\` > \`PRIVATE_KEY\`.
|
|
43
|
-
- \`ETH_RPC_URL\` \u2014 RPC endpoint. Follows the foundry/cast convention, so an
|
|
44
|
-
existing \`ETH_RPC_URL\` from those tools works automatically.
|
|
45
|
-
Precedence: \`--rpc-url\` > \`ETH_RPC_URL\` > chain default.
|
|
46
|
-
|
|
47
|
-
Example:
|
|
48
|
-
|
|
49
|
-
export ETH_RPC_URL=https://mainnet.base.org
|
|
50
|
-
export PRIVATE_KEY=0x...
|
|
51
|
-
phala deploy --kms base
|
|
52
|
-
|
|
53
|
-
## Debug logging
|
|
54
|
-
|
|
55
|
-
\`DEBUG\` has two independent consumers that behave differently:
|
|
56
|
-
|
|
57
|
-
- **CLI debug output** \u2014 any non-empty value enables the CLI's own debug
|
|
58
|
-
messages on stderr (gray prefix).
|
|
59
|
-
- **API request logging** \u2014 the \`@phala/cloud\` JS SDK uses the \`debug\` npm
|
|
60
|
-
package with namespace \`phala::api-client\`. Set \`DEBUG=phala::api-client\`
|
|
61
|
-
to print every HTTP request in cURL-like format (method, URL, headers,
|
|
62
|
-
body).
|
|
63
|
-
|
|
64
|
-
Examples:
|
|
65
|
-
|
|
66
|
-
# CLI debug only
|
|
67
|
-
DEBUG=1 phala deploy
|
|
68
|
-
|
|
69
|
-
# API request cURL logging (also triggers CLI debug, since "phala::api-client" is truthy)
|
|
70
|
-
DEBUG=phala::api-client phala deploy
|
|
71
|
-
|
|
72
|
-
# Everything
|
|
73
|
-
DEBUG=* phala deploy
|
|
74
|
-
|
|
75
|
-
## Self-update
|
|
76
|
-
|
|
77
|
-
- \`PHALA_UPDATE_CHANNEL\` \u2014 Release channel for \`phala self update\` (e.g. \`latest\`, \`beta\`).
|
|
78
|
-
- \`PHALA_DISABLE_UPDATE_CHECK\` \u2014 Any truthy value disables the background update notice.
|
|
79
|
-
- \`CI\` \u2014 Standard CI flag. Any truthy value disables the update notice.
|
|
80
|
-
|
|
81
|
-
## Miscellaneous
|
|
82
|
-
|
|
83
|
-
- \`CLOUD_URL\` \u2014 Override the Phala Cloud portal URL used in printed links.
|
|
84
|
-
Default: \`https://cloud.phala.com\`.
|
|
85
|
-
|
|
86
|
-
## Internal (undocumented)
|
|
87
|
-
|
|
88
|
-
- \`PHALA_CLOUD_DIR\` \u2014 Override the credentials directory. Default: \`~/.phala-cloud\`.
|
|
89
|
-
Testing only.
|
|
90
|
-
|
|
91
|
-
## See also
|
|
92
|
-
|
|
93
|
-
- \`phala api --help\` for API-specific flags and env vars
|
|
94
|
-
- \`phala login --help\` for authentication flow
|
|
95
|
-
- \`phala deploy --help\` for on-chain KMS flags
|
|
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(`
|
|
22
|
+
`,S,C,Mc(v.status,v.statusText,v.headers,v._data))}h&&h({request:k,response:v,options:I})}})}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?Tr.fromFetchError(t):t instanceof Error?Tr.fromError(t):new Tr("Unknown error occurred",{detail:"Unknown error occurred"})}emitError(t){let n=rb(t);return this.emitter.emit("error",n),n}async safeRequest(t){try{return{success:!0,data:await t()}}catch(n){if(n instanceof et)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 ll({...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 mb(e={}){return new lb(e)}var pb=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(),db=pe.object({id:pe.string(),name:pe.string(),slug:pe.string().nullable(),tier:pe.string(),role:pe.string(),avatar:pe.string().nullable().optional()}).passthrough(),ub=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(),fb=pe.object({user:pb,workspace:db,credits:ub}).passthrough(),gb=Xt.object({username:Xt.string(),email:Xt.string(),credits:Xt.number(),granted_credits:Xt.number(),avatar:Xt.string(),team_name:Xt.string(),team_tier:Xt.string()}).passthrough();function hb(e){return e==="2025-10-28"?gb:fb}async function ml(e,t){let n=await e.get("/auth/me");return t?.schema===!1?n:(t?.schema||hb(e.config.version)).parse(n)}async function He(e,t){try{return{success:!0,data:await ml(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={[Lc.id]:Lc,[Uc.id]:Uc,[Dc.id]:Dc},yb=Lt.object({id:Lt.string(),slug:Lt.string().nullable(),url:Lt.string(),version:Lt.string(),chain_id:Lt.number().nullable(),kms_contract_address:Lt.string().nullable().transform(e=>e),gateway_app_id:Lt.string().nullable().transform(e=>e),k256_pubkey:Lt.string().nullable().optional()}).passthrough(),pt=yb.transform(e=>{if(e.chain_id!=null){let t=At[e.chain_id];if(t)return{...e,chain:t}}return e}),pl=R.union([R.number(),R.string()]),bb=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()}),vb=R.object({id:pl,username:R.string()}),dl=R.object({id:R.number(),name:R.string(),region_identifier:R.string().nullable().optional()}),ds=R.object({vcpu:R.number(),memory:R.number(),disk_size:R.number(),gpu_count:R.number().default(0)}),us=R.object({app:R.string(),instance:R.string()}),ul=R.object({hosted:bb,name:R.string(),managed_user:vb.nullable(),node:dl.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:pt.nullable(),vcpu:R.number().nullable(),memory:R.number().nullable(),disk_size:R.number().nullable(),gateway_domain:R.string().nullable(),public_urls:R.array(us),machine_info:ds.nullable().optional(),updated_at:R.string().nullable().optional()}),fl=R.object({id:pl,name:R.string(),status:R.string(),in_progress:R.boolean().optional().default(!1),teepod_id:R.number().nullable(),teepod:dl.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:pt.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(us).optional().default([]),gateway_domain:R.string().optional().nullable(),machine_info:ds.optional().nullable(),updated_at:R.string().optional().nullable()}),Cb=R.object({items:R.array(ul),total:R.number(),page:R.number(),page_size:R.number(),pages:R.number()}),wb=_.enum(["skip","hourly","monthly"]),_b=_.enum(["phala","ethereum","base","legacy"]),fs=_.object({object_type:_.literal("user"),id:_.string().nullable().optional(),username:_.string().nullable().optional(),avatar_url:_.string().nullable().optional()}),gs=_.object({object_type:_.literal("workspace"),id:_.string(),name:_.string(),slug:_.string().nullable().optional(),avatar_url:_.string().nullable().optional()}),kb=_.object({instance_type:_.string().nullable().optional(),vcpu:_.number().int().nullable().optional(),memory_in_gb:_.number().nullable().optional(),disk_in_gb:_.number().int().nullable().optional(),gpus:_.number().int().nullable().optional(),compute_billing_price:_.string().nullable().optional(),billing_period:wb.nullable().optional()}),Sb=_.object({total:_.string().nullable().optional(),compute:_.string().nullable().optional(),disk:_.string().nullable().optional()}),Ib=_.object({order_id:_.string(),status:_.string(),pricing_plan:_.string().nullable().optional(),commitment_days:_.number().int().nullable().optional(),auto_renew:_.boolean().optional().default(!1),expires_at:_.string().nullable().optional(),renewal_in_progress:_.boolean().optional().default(!1),renewal_next_attempt_at:_.string().nullable().optional(),agreed_hourly_rate:_.string().nullable().optional(),hourly_billing_start_time:_.string().nullable().optional(),activated_at:_.string().nullable().optional(),completed_at:_.string().nullable().optional(),cancelled_at:_.string().nullable().optional(),decoupled_at:_.string().nullable().optional(),sku_code:_.string().nullable().optional(),sku_display_name:_.string().nullable().optional()}),Eb=_.object({name:_.string().nullable().optional(),version:_.string().nullable().optional(),is_dev:_.boolean().nullable().optional(),os_image_hash:_.string().nullable().optional()}),Ab=_.object({chain_id:_.number().int().nullable().optional(),dstack_kms_address:_.string().nullable().optional(),dstack_app_address:_.string().nullable().optional(),deployer_address:_.string().nullable().optional(),rpc_endpoint:_.string().nullable().optional(),encrypted_env_pubkey:_.string().nullable().optional()}),Rb=Ab.transform(e=>{if(e.chain_id!=null){let t=At[e.chain_id];if(t)return{...e,chain:t}}return e}),xb=_.object({target:_.string().nullable().optional(),started_at:_.string().nullable().optional(),correlation_id:_.string().nullable().optional()}),Pb=_.object({base_domain:_.string().nullable().optional(),cname:_.string().nullable().optional()}),$b=_.object({serial:_.string().nullable().optional(),stdout:_.string().nullable().optional(),stderr:_.string().nullable().optional(),container_log_base:_.string().nullable().optional()}),gl=_.object({device_id:_.string(),algorithm_version:_.string(),enabled:_.boolean()}),hl=_.object({object_type:_.literal("node"),id:_.number().int().nullable().optional(),name:_.string().nullable().optional(),region:_.string().nullable().optional(),device_id:_.string().nullable().optional(),device_ids:_.array(gl).default([]),ppid:_.string().nullable().optional(),status:_.string().nullable().optional(),version:_.string().nullable().optional()});var qn=_.object({id:_.string(),name:_.string(),app_id:_.string().nullable().optional(),vm_uuid:_.string().nullable().optional(),instance_id:_.string().nullable().optional(),resource:kb,node_info:hl.nullable().optional(),os:Eb.nullable().optional(),kms_type:_b.nullable().optional(),kms_info:Rb.nullable().optional(),status:_.string(),in_progress:_.boolean().optional().default(!1),progress:xb.nullable().optional(),compose_hash:_.string().nullable().optional(),docker_compose_hash:_.string().nullable().optional(),pre_launch_script_hash:_.string().nullable().optional(),gateway:Pb,logs:$b.optional().default({}),services:_.array(_.record(_.any())).optional().default([]),endpoints:_.array(us).nullable().optional(),public_logs:_.boolean().optional(),public_sysinfo:_.boolean().optional(),public_tcbinfo:_.boolean().optional(),gateway_enabled:_.boolean().optional(),secure_time:_.boolean().optional(),managed_env:_.boolean().optional().default(!1),listed:_.boolean().optional().default(!1),storage_fs:_.string().optional(),workspace:gs.nullable().optional(),creator:fs.nullable().optional(),created_at:_.string().nullable().optional(),deleted_at:_.string().nullable().optional(),project_type:_.string().nullable().optional(),hourly_rate:Sb.nullable().optional(),billing_interval:_.string().nullable().optional(),gpu_rental_order:Ib.nullable().optional()}),Ur=qn.extend({id:_.string()}),Tb=qn.extend({compose_file:_.union([_.record(_.any()),_.string()]).nullable().optional()}),Mb=Ur.extend({compose_file:_.union([_.record(_.any()),_.string()]).nullable().optional()}),yl=_.object({items:_.array(qn),total:_.number(),page:_.number(),page_size:_.number(),pages:_.number()}),Db=yl.extend({items:_.array(Ur)});function bl(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 vl(e){if(e?.schema!==void 0&&e?.schema!==!1&&(typeof e.schema!="object"||e.schema===null||!("parse"in e.schema)||typeof e.schema.parse!="function"))return{success:!1,error:{name:"ZodError",message:"Invalid schema: must be a Zod schema object, false, or undefined",issues:[{code:"invalid_type",expected:"object",received:typeof e.schema,path:["schema"],message:"Invalid schema: must be a Zod schema object, false, or undefined"}]}}}function hs(e,t){function n(s,i){return r(s,i)}async function r(s,i){bl(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=vl(i);if(c)return c;let l=await(async()=>{try{return{success:!0,data:await t(s)}}catch(d){return d&&typeof d=="object"&&"status"in d?{success:!1,error:d}:d&&typeof d=="object"&&"issues"in d?{success:!1,error:d}:{success:!1,error:{name:"Error",message:d instanceof Error?d.message:String(d)}}}})();return 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){bl(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=vl(c);if(l)return l;let m=await(async()=>{try{return{success:!0,data:await t(s,i)}}catch(u){return u&&typeof u=="object"&&"status"in u?{success:!1,error:u}:u&&typeof u=="object"&&"issues"in u?{success:!1,error:u}:{success:!1,error:{name:"Error",message:u instanceof Error?u.message:String(u)}}}})();return m.success?c?.schema===!1?{success:!0,data:m.data}:(c?.schema||e).safeParse(m.data):m}return{action:n,safeAction:o}}var Ub=z.object({name:z.string(),is_dev:z.boolean(),version:z.union([z.tuple([z.number(),z.number(),z.number()]),z.tuple([z.number(),z.number(),z.number(),z.number()])]),os_image_hash:z.string().nullable().optional()}).passthrough(),Cl=z.object({teepod_id:z.number(),name:z.string(),listed:z.boolean(),resource_score:z.number(),remaining_vcpu:z.number(),remaining_memory:z.number(),remaining_cvm_slots:z.number(),images:z.array(Ub),support_onchain_kms:z.boolean().optional(),fmspc:z.string().nullable().optional(),device_id:z.string().nullable().optional(),device_ids:z.array(gl).default([]),region_identifier:z.string().nullable().optional(),default_kms:z.string().nullable().optional(),kms_list:z.array(z.string()).default([])}).passthrough(),wl=z.object({max_instances:z.number().nullable().optional(),max_vcpu:z.number().nullable().optional(),max_memory:z.number().nullable().optional(),max_disk:z.number().nullable().optional()}).passthrough(),Lb=z.object({tier:z.string(),capacity:wl,nodes:z.array(Cl),kms_list:z.array(pt)}).passthrough(),{action:Nb,safeAction:Ot}=hs(Lb,async e=>await e.get("/teepods/available")),Gn=U.union([U.number(),U.string()]),Bn=U.string(),Ob=U.object({has_reserved_gpus:U.boolean(),reserved_gpu_count:U.number(),has_public_gpus:U.boolean(),public_gpu_count:U.number()}).passthrough(),_l=U.object({id:Gn,slug:U.string().nullable().optional(),url:U.string(),version:U.string().nullable().optional(),kms_type:U.string(),chain_id:U.number().nullable().optional(),kms_contract_id:Gn.nullable().optional(),kms_contract_address:U.string().nullable().optional(),gateway_app_id:U.string().nullable().optional(),supported_os_images:U.array(U.string()).default([])}).passthrough(),kl=U.object({teepod_id:U.number(),kms_id:Gn,kms_type:U.string(),kms_contract_id:Gn.nullable().optional(),kms_contract_address:U.string().nullable().optional(),supported_os_images:U.array(U.string()).default([])}).passthrough(),Sl=U.object({id:Gn,teepod_id:U.number().nullable().optional(),kms_contract_id:Gn,rpc_url:U.string().nullable().optional(),domain_suffix:U.string().nullable().optional(),enabled:U.boolean()}).passthrough(),jb=_l.extend({id:Bn,kms_contract_id:Bn.nullable().optional()}),Fb=kl.extend({kms_id:Bn,kms_contract_id:Bn.nullable().optional()}),Vb=Sl.extend({id:Bn,kms_contract_id:Bn}),Kb=U.object({id:U.string(),name:U.string(),vcpu:U.number(),memory_mb:U.number(),default_disk_size_gb:U.number(),requires_gpu:U.boolean(),requires_gpu_count:U.number(),family:U.string().nullable().optional(),display_order:U.number().nullable().optional()}).passthrough(),Il=U.object({tier:U.string(),capacity:wl,nodes:U.array(Cl),kms_nodes:U.array(_l),node_kms_relations:U.array(kl),gateway_nodes:U.array(Sl),instance_types:U.array(Kb),gpu_availability:Ob}).passthrough(),Hb=Il.extend({kms_nodes:U.array(jb),node_kms_relations:U.array(Fb),gateway_nodes:U.array(Vb)});function El(e){return e==="2026-01-21"?Il:Hb}async function zb(e,t){let n=await e.get("/teepods/cvm-create-resources");return t?.schema===!1?n:(t?.schema||El(e.config.version)).parse(n)}async function qb(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||El(e.config.version)).parse(n)}}catch(n){return{success:!1,error:n}}}var Al=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(),Gb=we.object({name:we.string(),items:we.array(Al),total:we.number()}).strict(),Bb=we.object({result:we.array(Gb)}).strict(),Wb=we.object({items:we.array(Al),total:we.number(),family:we.string()}).strict(),Jb=we.object({family:we.string()}).strict(),{action:ys,safeAction:Yb}=L(Bb,async e=>await e.get("/instance-types")),{action:bs,safeAction:Xb}=L(Wb,async(e,t)=>{let n=Jb.parse(t);return await e.get(`/instance-types/${n.family}`)}),Rl=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(),Zb=Ae.object({has_more:Ae.boolean(),next_cursor:Ae.string().nullable(),total:Ae.number().nullable()}).passthrough(),Qb=Ae.object({data:Ae.array(Rl),pagination:Zb}).passthrough(),{action:ev,safeAction:tv}=L(Qb,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:nv,safeAction:rv}=L(Rl,async(e,t)=>await e.get(`/workspaces/${t}`));function Wn(e){return typeof e!="string"||e.length<5||e.length>63?!1:/^[a-zA-Z](?!.*--)([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(e)}function xl(e){if(typeof e!="string")return So();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)||!Wn(t)?So():t}function So(){let e=Date.now().toString(36),t=Math.random().toString(36).substring(2,6);return`dstack-app-${e}-${t}`}var Fe=Dn.object({id:Dn.string().optional(),uuid:Dn.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:Dn.string().optional(),instance_id:Dn.string().optional(),name:Dn.string().refine(Wn,{message:"Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens"}).optional()}),We=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"}),ov=We(Fe),F=ov.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}}),av=F;function sv(e){return e==="2025-10-28"?fl:e==="2026-01-21"?Tb:Mb}async function Pl(e,t){let{cvmId:n}=av.parse(t),r=await e.get(`/cvms/${n}`);return sv(e.config.version).parse(r)}async function W(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 iv=Un.object({page:Un.number().int().min(1).optional(),page_size:Un.number().int().min(1).optional(),family:Un.enum(["all","cpu","gpu"]).optional(),instance_types:Un.array(Un.string()).optional()}).strict();function cv(e){return e==="2025-10-28"?Cb:e==="2026-01-21"?yl:Db}async function $l(e,t){let n=iv.parse(t??{}),r=await e.get("/cvms/paginated",{params:n});return cv(e.config.version).parse(r)}async function Nr(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 Lr=200*1024;function Tl(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>Lr){let i=Lr/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 Ml=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)=>{Tl(e.docker_compose_file,e.pre_launch_script,t)}),lv=P.object({app_id:P.string().nullable().optional(),app_env_encrypt_pubkey:P.string().nullable().optional(),compose_hash:P.string(),kms_info:pt.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}),as="Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens",mv=P.object({node_id:P.number().optional(),teepod_id:P.number().optional(),region:P.string().optional(),name:P.string().min(5,as).max(63,as).refine(e=>Wn(e),as),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)=>{Tl(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 pv(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:dv,safeAction:vs}=L(lv,async(e,t)=>{let n=mv.parse(t),r=pv(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)}),Dl=V.object({name:V.string(),status:V.string(),teepod_id:V.number(),teepod:V.object({id:V.number(),name:V.string()}).nullable(),app_id:V.string().nullable(),vm_uuid:V.string().nullable(),instance_id:V.string().nullable(),app_url:V.string().nullable().default(null),base_image:V.string().nullable(),vcpu:V.number(),memory:V.number(),disk_size:V.number(),manifest_version:V.number().nullable().default(2),version:V.string().nullable().default("1.0.0"),runner:V.string().nullable().default("docker-compose"),docker_compose_file:V.string().nullable(),features:V.array(V.string()).nullable().default(["kms","tproxy-net"]),created_at:V.string(),encrypted_env_pubkey:V.string().nullable().optional(),app_auth_contract_address:V.string().nullable().optional(),deployer_address:V.string().nullable().optional()}).passthrough(),Ul=Dl.extend({id:V.number(),user_id:V.number().nullable()}),Ll=Dl.extend({id:V.string(),user_id:V.string().nullable()}),Zx=V.union([Ul,Ll]);var Qx=V.object({encrypted_env:V.string().optional().nullable(),app_id:V.string(),compose_hash:V.string(),kms_id:V.string().optional(),kms_contract_id:V.union([V.string(),V.number()]).optional(),contract_address:V.string().optional(),deployer_address:V.string().optional(),env_keys:V.array(V.string()).optional().nullable()}).passthrough();function uv(e){return e==="2026-01-21"?Ul:Ll}async function Nl(e,t){let n=await e.post("/cvms",t);return uv(e.config.version).parse(n)}async function xo(e,t){try{return{success:!0,data:await Nl(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 ms(e){return e==null?e:Array.isArray(e)?e.map(ms):e&&typeof e=="object"&&e.constructor===Object?Object.keys(e).sort().reduce((t,n)=>{let r=e[n];return t[n]=ms(r),t},{}):e}function Ol(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 jl(e){let t=ms(e),n=JSON.stringify(t,null,4);return n=n.replace(/": /g,'":'),n}function gv(e){let t=Ol(e),n=jl(t);return fv.createHash("sha256").update(n,"utf8").digest("hex")}function hv(e){let t=e;return{...e,getHash:()=>gv(t),toString:()=>jl(Ol(t))}}var yv=Ml.transform(e=>hv(e)),bv=F,{action:vv,safeAction:Cv}=L(yv,async(e,t)=>{let{cvmId:n}=bv.parse(t);return await e.get(`/cvms/${n}/compose_file`)}),wv=mt.object({id:mt.string().optional(),uuid:mt.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i).optional(),app_id:mt.string().refine(e=>!e.startsWith("app_")&&e.length===40,"app_id should be 40 characters without prefix").transform(e=>e.startsWith("app_")?e:`app_${e}`).optional(),instance_id:mt.string().refine(e=>!e.startsWith("instance_")&&e.length===40,"instance_id should be 40 characters without prefix").transform(e=>e.startsWith("instance_")?e:`instance_${e}`).optional(),app_compose:Ml,update_env_vars:mt.boolean().optional().nullable()}).refine(e=>!!(e.id||e.uuid||e.app_id||e.instance_id),"One of id, uuid, app_id, or instance_id must be provided").transform(e=>({cvmId:e.id||e.uuid||e.app_id||e.instance_id,request:{...e.app_compose,update_env_vars:e.update_env_vars},_raw:e})),_v=mt.object({app_id:mt.string().nullable(),device_id:mt.string().nullable(),compose_hash:mt.string(),kms_info:pt.nullable().optional(),compose_hash_registered:mt.boolean().optional().default(!1),compose_unchanged:mt.boolean().optional().default(!1)}).passthrough(),{action:kv,safeAction:Sv}=L(_v,async(e,t)=>{let n=wv.parse(t);return await e.post(`/cvms/${n.cvmId}/compose_file/provision`,n.request)}),Iv=gt.object({id:gt.string().optional(),uuid:gt.string().regex(/^[0-9a-f]{8}[-]?[0-9a-f]{4}[-]?4[0-9a-f]{3}[-]?[89ab][0-9a-f]{3}[-]?[0-9a-f]{12}$/i).optional(),app_id:gt.string().refine(e=>!e.startsWith("app_")&&e.length===40,"app_id should be 40 characters without prefix").transform(e=>e.startsWith("app_")?e:`app_${e}`).optional(),instance_id:gt.string().refine(e=>!e.startsWith("instance_")&&e.length===40,"instance_id should be 40 characters without prefix").transform(e=>e.startsWith("instance_")?e:`instance_${e}`).optional(),compose_hash:gt.string().min(1,"Compose hash is required"),encrypted_env:gt.string().optional(),env_keys:gt.array(gt.string()).optional(),update_env_vars:gt.boolean().optional().nullable()}).refine(e=>!!(e.id||e.uuid||e.app_id||e.instance_id),"One of id, uuid, app_id, or instance_id must be provided").transform(e=>({cvmId:e.id||e.uuid||e.app_id||e.instance_id,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})),Ev=gt.any().transform(()=>{}),{action:Av,safeAction:Rv}=L(Ev,async(e,t)=>{let n=Iv.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})}),xv=We(Fe.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}=F.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}}),Pv=Le.object({status:Le.literal("in_progress"),message:Le.string(),correlation_id:Le.string(),allowed_envs_changed:Le.boolean()}),$v=Le.object({status:Le.literal("precondition_required"),message:Le.string(),compose_hash:Le.string(),app_id:Le.string(),device_id:Le.string(),kms_info:pt}),Tv=Le.union([Pv,$v]),{action:Mv,safeAction:Po}=L(Tv,async(e,t)=>{let n=xv.parse(t);try{return await e.patch(`/cvms/${n.cvmId}/envs`,n.request)}catch(r){if(r instanceof et&&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(u=>[u.field,u.value])),c=i.get("compose_hash"),l=i.get("app_id"),m=i.get("device_id"),d=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:d}}}}throw r}}),Dv=We(Fe.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}=F.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}}),Uv=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:pt}),Nv=Ne.object({status:Ne.literal("no_change"),message:Ne.string()}),Ov=Ne.union([Uv,Lv,Nv]),{action:jv,safeAction:Fv}=L(Ov,async(e,t)=>{let n=Dv.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 et&&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"),d=c.get("device_id"),u=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:d||"",kms_info:u}}}}throw o}}),Vv=We(Fe.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}=F.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}}),Kv=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:pt}),zv=Oe.object({status:Oe.literal("no_change"),message:Oe.string()}),qv=Oe.union([Kv,Hv,zv]),{action:Gv,safeAction:Bv}=L(qv,async(e,t)=>{let n=Vv.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 et&&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"),d=c.get("device_id"),u=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:d||"",kms_info:u}}}}throw o}}),Jv=F,{action:Yv,safeAction:Xv}=L(Wv.string(),async(e,t)=>{let{cvmId:n}=Jv.parse(t);return await e.get(`/cvms/${n}/pre-launch-script`)}),Zv=F,Qv=Ln.object({current_hash:Ln.string().nullable(),latest_official_hash:Ln.string(),is_official:Ln.boolean(),is_latest:Ln.boolean(),can_upgrade:Ln.boolean()}),{action:eC,safeAction:tC}=L(Qv,async(e,t)=>{let{cvmId:n}=Zv.parse(t);return await e.get(`/cvms/${n}/pre-launch-script/upgrade-status`)}),nC=We(Fe.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}=F.parse(e);return{cvmId:t,request:{compose_hash:e.compose_hash,transaction_hash:e.transaction_hash},_raw:e}}),rC=at.object({status:at.literal("in_progress"),message:at.string(),correlation_id:at.string()}),oC=at.object({status:at.literal("precondition_required"),message:at.string(),compose_hash:at.string(),app_id:at.string(),device_id:at.string(),kms_info:pt}),aC=at.union([rC,oC]),{action:sC,safeAction:iC}=L(aC,async(e,t)=>{let n=nC.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 et&&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"),d=c.get("device_id"),u=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:d||"",kms_info:u}}}}throw o}}),cC=Nc.object({kms_id:Nc.string().min(1,"KMS ID is required")}),{action:lC,safeAction:mC}=L(pt,async(e,t)=>{let n=cC.parse(t);return await e.get(`/kms/${n.kms_id}`,{headers:{"X-Phala-Version":"2026-05-22"}})}),pC=kt.object({page:kt.number().int().min(1).optional(),page_size:kt.number().int().min(1).optional(),is_onchain:kt.boolean().optional()}).strict(),dC=kt.object({items:kt.array(pt),total:kt.number(),page:kt.number(),page_size:kt.number(),pages:kt.number()}).strict(),{action:uC,safeAction:fC}=L(dC,async(e,t)=>{let n=pC.parse(t??{});return await e.get("/kms",{params:n,headers:{"X-Phala-Version":"2026-05-22"}})}),Fl=Be.object({id:Be.string(),slug:Be.string().nullable(),label:Be.string().nullable(),contract_address:Be.string(),chain_id:Be.number(),k256_pubkey:Be.string().nullable(),ca_pubkey:Be.string().nullable(),node_count:Be.number()}).passthrough(),gC=Be.object({id:Be.string(),slug:Be.string().nullable(),url:Be.string(),version:Be.string(),kms_type:Be.string()}).passthrough(),hC="2026-06-23",yC=St.object({page:St.number().int().min(1).optional(),page_size:St.number().int().min(1).optional(),is_onchain:St.boolean().optional()}).strict(),bC=St.object({items:St.array(Fl),total:St.number(),page:St.number(),page_size:St.number(),pages:St.number()}).strict(),{action:vC,safeAction:Cs}=L(bC,async(e,t)=>{let n=yC.parse(t??{});return await e.get("/kms",{params:n,headers:{"X-Phala-Version":hC}})}),CC="2026-06-23",wC=Oc.object({slug:Oc.string().min(1,"KMS contract slug is required")}).strict(),{action:_C,safeAction:ws}=L(Fl,async(e,t)=>{let{slug:n}=wC.parse(t);return await e.get(`/kms/${n}`,{headers:{"X-Phala-Version":CC}})}),kC="2026-06-23",SC=Mr.object({slug:Mr.string().min(1,"KMS contract slug is required")}).strict(),IC=Mr.object({items:Mr.array(gC),total:Mr.number()}).strict(),{action:EC,safeAction:_s}=L(IC,async(e,t)=>{let{slug:n}=SC.parse(t);return await e.get(`/kms/${n}/nodes`,{headers:{"X-Phala-Version":kC}})}),AC=Hn.object({kms:Hn.string().min(1,"KMS ID or slug is required"),app_id:Hn.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(),RC=Hn.object({public_key:Hn.string(),signature:Hn.string()}).strict(),{action:xC,safeAction:Or}=L(RC,async(e,t)=>{let n=AC.parse(t);return await e.get(`/kms/${n.kms}/pubkey/${n.app_id}`)}),PC=gn.object({counts:gn.number().int().min(1).max(20).optional().default(1)}).strict(),$C=gn.object({app_ids:gn.array(gn.object({app_id:gn.string(),nonce:gn.number().int().min(0)}))}).strict(),{action:TC,safeAction:MC}=L($C,async(e,t)=>{let n=PC.parse(t??{}),r=new URLSearchParams;return r.append("counts",n.counts.toString()),await e.get(`/kms/phala/next_app_id?${r.toString()}`)}),Vl=ce.object({name:ce.string(),status:ce.string(),teepod_id:ce.number(),teepod:ce.object({id:ce.number(),name:ce.string(),region_identifier:ce.string().nullable().optional()}).optional().nullable(),app_id:ce.string(),vm_uuid:ce.string().nullable(),instance_id:ce.string().nullable(),app_url:ce.string().optional().nullable(),base_image:ce.string().optional().nullable(),vcpu:ce.number(),memory:ce.number(),disk_size:ce.number(),manifest_version:ce.number().optional().nullable(),version:ce.string().optional().nullable(),runner:ce.string().optional().nullable(),docker_compose_file:ce.string().optional().nullable(),features:ce.array(ce.string()).optional().nullable(),created_at:ce.string(),encrypted_env_pubkey:ce.string().nullable()}),Kl=Vl.extend({id:ce.number(),user_id:ce.number().optional().nullable()}),ks=Vl.extend({id:ce.string(),user_id:ce.string().optional().nullable()}),bP=ce.union([Kl,ks]),DC=ks;function $o(e){return e==="2026-01-21"?Kl:ks}var UC=F;async function Hl(e,t){let{cvmId:n}=UC.parse(t),r=await e.post(`/cvms/${n}/start`);return $o(e.config.version).parse(r)}async function Ss(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 LC=F;async function zl(e,t){let{cvmId:n}=LC.parse(t),r=await e.post(`/cvms/${n}/stop`);return $o(e.config.version).parse(r)}async function Is(e,t){try{return{success:!0,data:await zl(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 NC=F;async function ql(e,t){let{cvmId:n}=NC.parse(t),r=await e.post(`/cvms/${n}/shutdown`);return $o(e.config.version).parse(r)}async function OC(e,t){try{return{success:!0,data:await ql(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 FC=We(Fe.extend({force:jC.boolean().optional()}));async function Gl(e,t){let n=FC.parse(t),{cvmId:r}=F.parse(n),{force:o=!1}=n,a=await e.post(`/cvms/${r}/restart`,{force:o});return $o(e.config.version).parse(a)}async function Es(e,t){try{return{success:!0,data:await Gl(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 KC=F,{action:HC,safeAction:jr}=L(VC.void(),async(e,t)=>{let{cvmId:n}=KC.parse(t);await e.delete(`/cvms/${n}`)}),zC=ae.object({name:ae.string(),mount_point:ae.string(),total_size:ae.number(),free_size:ae.number()}),qC=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(zC)}),GC=ae.object({is_online:ae.boolean(),is_public:ae.boolean().default(!1),error:ae.string().nullable(),sysinfo:qC.nullable(),status:ae.string().nullable(),in_progress:ae.boolean().default(!1),boot_progress:ae.string().nullable(),boot_error:ae.string().nullable()}),BC=F,{action:WC,safeAction:JC}=L(GC,async(e,t)=>{let{cvmId:n}=BC.parse(t);return await e.get(`/cvms/${n}/stats`)}),YC=wt.object({app:wt.string(),instance:wt.string()}),XC=wt.object({is_online:wt.boolean(),is_public:wt.boolean().default(!0),error:wt.string().nullable(),internal_ip:wt.string().nullable(),latest_handshake:wt.string().nullable(),public_urls:wt.array(YC).nullable()}),ZC=F,{action:QC,safeAction:ew}=L(XC,async(e,t)=>{let{cvmId:n}=ZC.parse(t);return await e.get(`/cvms/${n}/network`)}),nw=F,{action:rw,safeAction:ow}=L(tw.string(),async(e,t)=>{let{cvmId:n}=nw.parse(t);return await e.get(`/cvms/${n}/docker-compose.yml`)}),aw=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()}),sw=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(aw).nullable()}),iw=F,{action:cw,safeAction:As}=L(sw,async(e,t)=>{let{cvmId:n}=iw.parse(t);return await e.get(`/cvms/${n}/composition`)}),lw=O.object({common_name:O.string().nullable(),organization:O.string().nullable(),country:O.string().nullable(),state:O.string().nullable(),locality:O.string().nullable()}),mw=O.object({common_name:O.string().nullable(),organization:O.string().nullable(),country:O.string().nullable()}),Bl=O.object({subject:lw,issuer:mw,serial_number:O.string(),not_before:O.string(),not_after:O.string(),version:O.string(),fingerprint:O.string(),signature_algorithm:O.string(),sans:O.array(O.string()).nullable(),is_ca:O.boolean(),position_in_chain:O.number().nullable(),quote:O.string().nullable(),app_id:O.string().nullable().optional(),cert_usage:O.string().nullable().optional()}),pw=O.object({imr:O.number(),event_type:O.number(),digest:O.string(),event:O.string(),event_payload:O.string()}),Wl=O.object({mrtd:O.string(),rootfs_hash:O.string().nullable().optional(),rtmr0:O.string(),rtmr1:O.string(),rtmr2:O.string(),rtmr3:O.string(),event_log:O.array(pw),app_compose:O.string()}),dw=O.object({name:O.string().nullable(),is_online:O.boolean(),is_public:O.boolean().default(!0),error:O.string().nullable(),app_certificates:O.array(Bl).nullable(),tcb_info:Wl.nullable(),compose_file:O.string().nullable()}),uw=F,{action:fw,safeAction:gw}=L(dw,async(e,t)=>{let{cvmId:n}=uw.parse(t);return await e.get(`/cvms/${n}/attestation`)}),hw=We(Fe.extend({vcpu:Nt.number().optional(),memory:Nt.number().optional(),disk_size:Nt.number().optional(),instance_type:Nt.string().optional(),allow_restart:Nt.boolean().optional()})),yw=Nt.object({message:Nt.string(),correlation_id:Nt.string(),status:Nt.string()}),{action:bw,safeAction:vw}=L(yw,async(e,t)=>{let n=hw.parse(t),{cvmId:r}=F.parse(n),{...o}=n;return await e.patch(`/cvms/${r}`,o)}),Cw=We(Fe.extend({public_sysinfo:ss.boolean(),public_logs:ss.boolean(),public_tcbinfo:ss.boolean().optional()})),{action:ww,safeAction:_w}=L(fl,async(e,t)=>{let n=Cw.parse(t),{cvmId:r}=F.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})}),jc=Re.object({name:Re.string(),slug:Re.string(),os_image_hash:Re.string().nullable(),requires_gpu:Re.boolean(),is_current:Re.boolean(),enabled:Re.boolean()}),kw=Re.object({version:Re.union([Re.tuple([Re.number(),Re.number(),Re.number(),Re.number()]),Re.tuple([Re.number(),Re.number(),Re.number()])]),prod:jc.nullable(),dev:jc.nullable()}),Sw=Re.array(kw),Iw=F,{action:Ew,safeAction:Aw}=L(Sw,async(e,t)=>{let{cvmId:n}=Iw.parse(t);return await e.get(`/cvms/${n}/available-os-images`)}),Rw=We(Fe.extend({os_image_name:Jl.string().min(1,"OS image name is required")})),{action:xw,safeAction:Pw}=L(Jl.void(),async(e,t)=>{let n=Rw.parse(t),{cvmId:r}=F.parse(n),{os_image_name:o}=n;await e.patch(`/cvms/${r}/os-image`,{os_image_name:o})}),$w=vt.object({id:vt.string().optional(),instance_id:vt.string().optional(),name:vt.string(),status:vt.string(),uptime:vt.string().optional(),exited_at:vt.string().optional(),boot_progress:vt.string().optional(),boot_error:vt.string().optional(),shutdown_progress:vt.string().optional()}),Tw=F,{action:Mw,safeAction:Dw}=L($w,async(e,t)=>{let{cvmId:n}=Tw.parse(t);return await e.get(`/cvms/${n}/state`)}),Yl=Qe.object({id:Qe.string(),user_id:Qe.string(),name:Qe.string(),public_key:Qe.string(),fingerprint:Qe.string(),key_type:Qe.string(),source:Qe.string(),key_metadata:Qe.record(Qe.unknown()).nullable().optional(),last_synced_at:Qe.string().nullable().optional(),created_at:Qe.string(),updated_at:Qe.string()}),Uw=Qe.array(Yl);async function Xl(e){let t=await e.get("/user/ssh-keys");return Uw.parse(t)}async function Fr(e){try{return{success:!0,data:await Xl(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=Zt.object({github_username:Zt.string().min(1)}),Nw=Zt.object({github_username:Zt.string(),keys_added:Zt.number().int(),keys_skipped:Zt.number().int(),errors:Zt.array(Zt.string()).default([])}),{action:Ow,safeAction:Rs}=L(Nw,async(e,t)=>{let{github_username:n}=Lw.parse(t);return await e.post("/user/ssh-keys/github-profile",{github_username:n})}),jw=is.object({name:is.string().min(1),public_key:is.string().min(1)}),{action:Fw,safeAction:xs}=L(Yl,async(e,t)=>{let{name:n,public_key:r}=jw.parse(t);return await e.post("/user/ssh-keys",{name:n,public_key:r})}),Vw=ps.object({keyId:ps.string().min(1)}),{action:Kw,safeAction:Ps}=L(ps.void(),async(e,t)=>{let{keyId:n}=Vw.parse(t);await e.delete(`/user/ssh-keys/${n}`)}),Hw=fn.object({synced_count:fn.number().int(),keys_added:fn.number().int(),keys_updated:fn.number().int(),keys_removed:fn.number().int(),errors:fn.array(fn.string()).default([])}),{action:zw,safeAction:qw}=hs(Hw,async e=>await e.post("/user/ssh-keys/github-sync",{})),Gw=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(),Bw=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(Gw),total:Ue.number(),page:Ue.number(),page_size:Ue.number(),pages:Ue.number()}).passthrough(),{action:Jw,safeAction:$s}=L(Ww,async(e,t)=>{let n=Bw.parse(t??{});return await e.get("/os-images",{params:n})}),Yw=de.object({device_id:de.string(),node_name:de.string().nullable().optional(),on_chain_allowed:de.boolean().nullable()}).passthrough(),Xw=de.object({name:de.string(),version:de.string(),os_image_hash:de.string().nullable(),on_chain_allowed:de.boolean().nullable()}).passthrough(),Zw=de.object({contract_address:de.string(),chain_id:de.number(),chain_name:de.string(),k256_pubkey:de.string().nullable().optional(),ca_pubkey:de.string().nullable().optional(),gateway_contract_address:de.string().nullable().optional(),devices:de.array(Yw),os_images:de.array(Xw)}).passthrough(),Qw=de.object({chain_name:de.string(),chain_id:de.number(),contracts:de.array(Zw)}).passthrough(),e_=de.object({chain:de.string()}).strict(),{action:t_,safeAction:Ts}=L(Qw,async(e,t)=>{let{chain:n}=e_.parse(t);return await e.get(`/kms/on-chain/${n}`)});function jt(e={}){let t=mb(e),n={getCurrentUser:ml,safeGetCurrentUser:He,getAvailableNodes:Nb,safeGetAvailableNodes:Ot,getCvmCreateResources:zb,safeGetCvmCreateResources:qb,listAllInstanceTypeFamilies:ys,safeListAllInstanceTypeFamilies:Yb,listFamilyInstanceTypes:bs,safeListFamilyInstanceTypes:Xb,listWorkspaces:ev,safeListWorkspaces:tv,getWorkspace:nv,safeGetWorkspace:rv,getCvmInfo:Pl,safeGetCvmInfo:W,getCvmList:$l,safeGetCvmList:Nr,provisionCvm:dv,safeProvisionCvm:vs,commitCvmProvision:Nl,safeCommitCvmProvision:xo,getCvmComposeFile:vv,safeGetCvmComposeFile:Cv,provisionCvmComposeFileUpdate:kv,safeProvisionCvmComposeFileUpdate:Sv,commitCvmComposeFileUpdate:Av,safeCommitCvmComposeFileUpdate:Rv,updateCvmEnvs:Mv,safeUpdateCvmEnvs:Po,updateDockerCompose:jv,safeUpdateDockerCompose:Fv,updatePreLaunchScript:Gv,safeUpdatePreLaunchScript:Bv,getCvmPreLaunchScript:Yv,safeGetCvmPreLaunchScript:Xv,getPreLaunchScriptUpgradeStatus:eC,safeGetPreLaunchScriptUpgradeStatus:tC,upgradePreLaunchScript:sC,safeUpgradePreLaunchScript:iC,startCvm:Hl,safeStartCvm:Ss,stopCvm:zl,safeStopCvm:Is,shutdownCvm:ql,safeShutdownCvm:OC,restartCvm:Gl,safeRestartCvm:Es,deleteCvm:HC,safeDeleteCvm:jr,getCvmStats:WC,safeGetCvmStats:JC,getCvmNetwork:QC,safeGetCvmNetwork:ew,getCvmDockerCompose:rw,safeGetCvmDockerCompose:ow,getCvmContainersStats:cw,safeGetCvmContainersStats:As,getCvmAttestation:fw,safeGetCvmAttestation:gw,updateCvmResources:bw,safeUpdateCvmResources:vw,updateCvmVisibility:ww,safeUpdateCvmVisibility:_w,getAvailableOsImages:Ew,safeGetAvailableOsImages:Aw,updateOsImage:xw,safeUpdateOsImage:Pw,getKmsInfo:lC,safeGetKmsInfo:mC,getKmsList:uC,safeGetKmsList:fC,listKmsContracts:vC,safeListKmsContracts:Cs,getKmsContract:_C,safeGetKmsContract:ws,listKmsContractNodes:EC,safeListKmsContractNodes:_s,getAppEnvEncryptPubKey:xC,safeGetAppEnvEncryptPubKey:Or,nextAppIds:TC,safeNextAppIds:MC,getCvmState:Mw,safeGetCvmState:Dw,listSshKeys:Xl,safeListSshKeys:Fr,importGithubProfileSshKeys:Ow,safeImportGithubProfileSshKeys:Rs,createSshKey:Fw,safeCreateSshKey:xs,deleteSshKey:Kw,safeDeleteSshKey:Ps,syncGithubSshKeys:zw,safeSyncGithubSshKeys:qw,getOsImages:Jw,safeGetOsImages:$s,getKmsOnChainDetail:t_,safeGetKmsOnChainDetail:Ts};return t.extend(n)}var Fc=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:ds.nullable().optional(),updated_at:H.string().nullable().optional()}),n_=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()}),r_=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:n_.nullable().optional(),current_cvm:Fc.nullable().optional(),cvms:H.array(Fc).default([]),cvm_count:H.number().int().default(0)}),Zl=r_,o_=H.object({dstack_apps:H.array(Zl),page:H.number().int(),page_size:H.number().int(),total:H.number().int(),total_pages:H.number().int()}),Ql=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:qn.nullable().optional(),cvms:ge.array(qn).default([]),cvm_count:ge.number().int().default(0)}),a_=Ql.extend({current_cvm:Ur.nullable().optional(),cvms:ge.array(Ur).default([])}),em=Ql,tm=a_,nm=ge.object({dstack_apps:ge.array(em),page:ge.number().int(),page_size:ge.number().int(),total:ge.number().int(),total_pages:ge.number().int()}),s_=nm.extend({dstack_apps:ge.array(tm)}),rm=Z.object({object_type:Z.literal("cvm"),id:Z.string().nullable().optional(),name:Z.string().nullable().optional(),app_id:Z.string().nullable().optional(),vm_uuid:Z.string().nullable().optional()}),i_=Z.object({revision_id:Z.string(),app_id:Z.string(),vm_uuid:Z.string(),compose_hash:Z.string(),created_at:Z.string(),trace_id:Z.string().nullable().optional(),operation_type:Z.string(),triggered_by:fs.nullable().optional(),cvm:rm.nullable().optional(),workspace:gs.nullable().optional()}),VP=Z.object({revision_id:Z.string(),app_id:Z.string(),vm_uuid:Z.string(),compose_hash:Z.string(),compose_file:Z.union([Z.record(Z.any()),Z.string()]).nullable().optional(),encrypted_env:Z.string(),user_config:Z.string(),created_at:Z.string(),trace_id:Z.string().nullable().optional(),operation_type:Z.string(),triggered_by:fs.nullable().optional(),cvm:rm.nullable().optional(),workspace:gs.nullable().optional()}),KP=Z.object({revisions:Z.array(i_),total:Z.number().int(),page:Z.number().int(),page_size:Z.number().int(),total_pages:Z.number().int()}),g_=48;var h_="dstack-mr-config-v3:",zc=5;function Nn(e,t){let n=e.replace(/^0x/i,"").toLowerCase();if(!/^[0-9a-f]*$/.test(n))throw new Error(`${t} is not hex: ${e}`);if(n.length%2!==0)throw new Error(`${t} has an odd hex length: ${e}`);return n}function Rr(e,t,n){if(e.length!==t*2)throw new Error(`${n} must be ${t} bytes, got ${e.length/2}`);return e}function om(e){let t={version:3,compose_hash:Rr(Nn(e.compose_hash,"compose_hash"),32,"compose_hash"),key_provider:e.key_provider},n=e.app_id?Nn(e.app_id,"app_id"):"";n&&(t.app_id=Rr(n,20,"app_id"));let r=e.gpu_policy_hash?Nn(e.gpu_policy_hash,"gpu_policy_hash"):"";r&&(t.gpu_policy_hash=Rr(r,32,"gpu_policy_hash"));let o=e.key_provider_id?Nn(e.key_provider_id,"key_provider_id"):"";o&&(t.key_provider_id=o);let a=e.instance_id?Nn(e.instance_id,"instance_id"):"";if(a&&(t.instance_id=Rr(a,20,"instance_id")),e.init_script_hashes!==void 0){if(e.init_script_hashes.length>zc)throw new Error(`init_script_hashes supports at most ${zc} hashes`);t.init_script_hashes=e.init_script_hashes.map((s,i)=>Rr(Nn(s,`init_script_hashes[${i}]`),32,`init_script_hashes[${i}]`))}return t}function Ms(e){let t=[];for(let n of Object.keys(e).sort()){let r=e[n];r!==void 0&&(typeof r=="number"?t.push(`${JSON.stringify(n)}:${r}`):Array.isArray(r)?t.push(`${JSON.stringify(n)}:[${r.map(o=>JSON.stringify(o)).join(",")}]`):t.push(`${JSON.stringify(n)}:${JSON.stringify(r)}`))}return`{${t.join(",")}}`}function y_(e){let t=p_([Hc(h_),new Uint8Array([0]),Hc(Ms(e))]);return u_(d_(t))}function am(e){let t=new Uint8Array(g_);return t[0]=3,t.set(y_(e),1),f_(t)}function yt(e){if(typeof e=="string"){if(e.startsWith("0x")&&qc(e))return e;if(qc(`0x${e}`))return`0x${e}`}throw new Error(`Invalid hex value: ${e}`)}var sm=class extends Error{constructor(e,t,n){super(e),this.code=t,this.details=n,this.name="NetworkError"}};var _t=class extends Error{constructor(e,t,n){super(e),this.hash=t,this.details=n,this.name="TransactionError"}};async function b_(e,t){try{let n=await e.walletClient.getChainId();return{isCorrectNetwork:n===t,currentChainId:n}}catch(n){throw new sm(`Failed to check network status: ${n instanceof Error?n.message:"Unknown error"}`,"NETWORK_CHECK_FAILED",n)}}async function v_(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 sm(`Failed to check balance: ${r instanceof Error?r.message:"Unknown error"}`,"BALANCE_CHECK_FAILED",r)}}async function C_(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 _t(`Transaction confirmation timeout after ${r}ms`,t));return}setTimeout(l,o);return}i(m)}else{if(Date.now()-s>=r){c(new _t(`Transaction receipt timeout after ${r}ms`,t));return}setTimeout(l,o)}}catch(m){if(Date.now()-s>=r){c(new _t(`Transaction receipt timeout after ${r}ms`,t,m));return}setTimeout(l,o)}};l()})}async function Vr(e,t){let{targetChainId:n,minBalance:r,requiredAddress:o}=t,a=await b_(e,n),s=await v_(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 Jn(){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:d=6e4,confirmations:u=1,onSubmitted:f,onConfirmed:h,onError:g,signal:y}=m;try{if(o(),n=new AbortController,y){if(y.aborted)throw new _t("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 _t("Transaction aborted");let k=await i(c,...l);if(n.signal.aborted)throw new _t("Transaction aborted after submission",k);r({state:"pending",hash:k,submitTime:Date.now()}),f?.(k),d>0&&(t=setTimeout(()=>{e.state==="pending"&&!n?.signal.aborted&&r({state:"timeout",error:`Transaction timeout after ${d}ms`})},d));let v=await Promise.race([C_(c.publicClient,k,{timeout:d,confirmations:u}),new Promise((S,C)=>{n?.signal.addEventListener("abort",()=>{C(new _t("Transaction aborted while waiting for receipt",k))})})]);t&&(clearTimeout(t),t=void 0);let I=v.status==="success";if(r({state:I?"success":"error",receipt:v,confirmTime:Date.now(),error:I?void 0:"Transaction failed on-chain"}),I)h?.(v);else{let S=new _t("Transaction failed on-chain",k,v);throw g?.(S,k),S}return{hash:k,receipt:v,success:I}}catch(k){let v=k instanceof _t?k:new _t(`Transaction execution failed: ${k instanceof Error?k.message:"Unknown error"}`,e.hash,k);throw r({state:"error",error:v.message}),g?.(v,e.hash),v}}}}async function Kr(e,t,n,r={},o={}){let{maxRetries:a=3,initialDelay:s=1e3,maxDelay:i=1e4,backoffFactor:c=2,retryCondition:l=()=>!0}=o,m,d=s;for(let u=0;u<=a;u++)try{return await Jn().execute(e,t,n,r)}catch(f){if(m=f instanceof Error?f:new Error(String(f)),u===a||!l(m))break;await new Promise(h=>setTimeout(h,d)),d=Math.min(d*c,i)}throw m}var im=[{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}],w_=Se.object({chain:Se.unknown().optional(),rpcUrl:Se.string().optional(),kmsContractAddress:Se.string(),privateKey:Se.string().optional(),walletClient:Se.unknown().optional(),publicClient:Se.unknown().optional(),allowAnyDevice:Se.boolean().optional().default(!1),deviceId:Se.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),composeHash:Se.string().optional().default("0000000000000000000000000000000000000000000000000000000000000000"),disableUpgrades:Se.boolean().optional().default(!1),skipPrerequisiteChecks:Se.boolean().optional().default(!1),minBalance:Se.string().optional()}).passthrough(),__=w_.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"]}),k_=Se.object({appId:Se.string(),appAuthAddress:Se.string(),deployer:Se.string(),transactionHash:Se.string(),blockNumber:Se.bigint().optional(),gasUsed:Se.bigint().optional()}).passthrough();function S_(e,t,n){try{let r=l_({abi:im,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 I_(e,t){let n=__.parse(e),{chain:r,rpcUrl:o,kmsContractAddress:a,privateKey:s,walletClient:i,publicClient:c,allowAnyDevice:l=!1,deviceId:m="0000000000000000000000000000000000000000000000000000000000000000",composeHash:d="0000000000000000000000000000000000000000000000000000000000000000",disableUpgrades:u=!1,skipPrerequisiteChecks:f=!1,minBalance:h,timeout:g=12e4,retryOptions:y,signal:k,onTransactionStateChange:v,onTransactionSubmitted:I,onTransactionConfirmed:S}=n,C="0000000000000000000000000000000000000000000000000000000000000000",x=m!==C&&m!=="0x"+C?!1:l,N,T,X,me;if(s){let ke=m_(s);if(c){if(typeof c!="object"||!c)throw new Error("publicClient is invalid");N=c}else{if(!r)throw new Error("Chain required for publicClient");N=Vc({chain:r,transport:cs(o)})}if(!r)throw new Error("Chain required for walletClient");T=c_({account:ke,chain:r,transport:cs(o)}),X=ke.address,me=r.id}else if(i){if(typeof i!="object"||!i)throw new Error("walletClient is invalid");if(T=i,c){if(typeof c!="object"||!c)throw new Error("publicClient is invalid");N=c}else{if(!r)throw new Error("Chain required for publicClient");N=Vc({chain:r,transport:cs(o)})}if(!T.account?.address)throw new Error("WalletClient needs an account");X=T.account.address,r?me=r.id:me=await T.getChainId()}else throw new Error("Need privateKey or walletClient");let Q={publicClient:N,walletClient:T,address:X,chainId:me},te=Jn();if(v&&typeof v=="function"){let ke=()=>{v(te.status),te.isComplete||setTimeout(ke,100)};setTimeout(ke,10)}if(!f){let ke={targetChainId:me,minBalance:h?Kc(h):Kc("0.001")},oe=await Vr(Q,ke);if(!oe.networkValid)throw new Error(`Wrong network. Need chain ${ke.targetChainId}, got ${oe.details.currentChainId}`);if(!oe.balanceValid){let _e=Number(ke.minBalance)/1e18,yo=Number(oe.details.balance)/1e18;throw new Error(`Not enough ETH. Need ${_e}, have ${yo.toFixed(6)}`)}}let M=yt(m),J=yt(d),Me=`0x${M.slice(2).padEnd(64,"0")}`,Ut=`0x${J.slice(2).padEnd(64,"0")}`,Yt=async ke=>{try{let _e=await ke.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:im,functionName:"deployAndRegisterApp",args:[ke.address,u,x,Me,Ut],account:ke.walletClient.account||ke.address,chain:r||null};return await ke.walletClient.writeContract(oe)},Ba=y?await Kr(Yt,Q,[],{timeout:g,confirmations:1,onSubmitted:I,onConfirmed:S,signal:k},y):await te.execute(Yt,Q,[],{timeout:g,confirmations:1,onSubmitted:I,onConfirmed:S,signal:k}),go=S_(Ba.receipt,X,a);return t?.schema===!1?go:(t?.schema||k_).parse(go)}async function cm(e,t){try{return{success:!0,data:await I_(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 lm=[{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}],x_=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"]}),P_=he.object({composeHash:he.string(),appId:he.string(),transactionHash:he.string(),blockNumber:he.bigint().optional(),gasUsed:he.bigint().optional()}).passthrough();function $_(e,t,n,r){console.log(e.logs);try{let o=A_({abi:lm,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 T_(e,t){let n=x_.parse(e),{chain:r,rpcUrl:o,appId:a,composeHash:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:d,signal:u,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,v,I,S,C,A=a.startsWith("0x")?a:`0x${a}`;if(i){let M=R_(i);if(l)v=l;else{if(!r)throw new Error("Chain required when creating publicClient");v=Gc({chain:r,transport:ls(o)})}if(!r)throw new Error("Chain required when creating walletClient");I=E_({account:M,chain:r,transport:ls(o)}),S=M.address,C=r.id}else if(c){if(I=c,l)v=l;else{if(!r)throw new Error("Chain required when creating publicClient");v=Gc({chain:r,transport:ls(o)})}if(!I.account?.address)throw new Error("WalletClient must have an account with address");S=I.account.address,C=r?r.id:await I.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let x={publicClient:v,walletClient:I,address:S,chainId:C},N=Jn();if(f&&typeof f=="function"){let M=()=>{f(N.status),N.isComplete||setTimeout(M,100)};setTimeout(M,10)}if(!y){let M={targetChainId:C,minBalance:k?Bc(k):Bc("0.001")},J=await Vr(x,M);if(!J.networkValid)throw new Error(`Network mismatch: Expected chain ${M.targetChainId}, but wallet is on chain ${J.details.currentChainId}`);if(!J.balanceValid){let Me=Number(M.minBalance)/1e18,Ut=Number(J.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Me} ETH, but account has ${Ut.toFixed(6)} ETH`)}}let T=await v.readContract({address:A,abi:[{inputs:[],name:"owner",outputs:[{type:"address"}],stateMutability:"view",type:"function"}],functionName:"owner"});if(T.toLowerCase()!==S.toLowerCase())throw new Error(`Sender ${S} is not the owner of contract ${A}. Contract owner is ${T}.`);let X=async M=>await M.walletClient.writeContract({address:A,abi:lm,functionName:"addComposeHash",args:[yt(s)],account:M.walletClient.account||M.address,chain:r||null}),me=d?await Kr(X,x,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u},d):await N.execute(X,x,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u}),Q=$_(me.receipt,yt(s),A,a);return t?.schema===!1?Q:(t?.schema||P_).parse(Q)}async function Qt(e,t){try{return{success:!0,data:await T_(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 It=[{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"}],U_=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"]}),L_=ye.object({appAddress:ye.string(),deviceId:ye.string(),transactionHash:ye.string(),blockNumber:ye.bigint().optional(),gasUsed:ye.bigint().optional()}).passthrough();async function N_(e,t){let n=U_.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:d,signal:u,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,v=a.startsWith("0x")?a:`0x${a}`,I=yt(s),S,C,A,x;if(i){let J=D_(i),Me=Jc(o,{timeout:m});S=l||Wc({chain:r,transport:Me}),C=M_({account:J,chain:r,transport:Me}),A=J.address,x=r.id}else if(c){if(C=c,S=l||Wc({chain:r,transport:Jc(o,{timeout:m})}),!C.account?.address)throw new Error("WalletClient must have an account with address");A=C.account.address,x=r?r.id:await C.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let N={publicClient:S,walletClient:C,address:A,chainId:x},T=Jn();if(f&&typeof f=="function"){let J=()=>{f(T.status),T.isComplete||setTimeout(J,100)};setTimeout(J,10)}if(!y){let J={targetChainId:x,minBalance:k?Yc(k):Yc("0.001")},Me=await Vr(N,J);if(!Me.networkValid)throw new Error(`Network mismatch: Expected chain ${J.targetChainId}, but wallet is on chain ${Me.details.currentChainId}`);if(!Me.balanceValid){let Ut=Number(J.minBalance)/1e18,Yt=Number(Me.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Ut} ETH, but account has ${Yt.toFixed(6)} ETH`)}}let X=await S.readContract({address:v,abi:It,functionName:"owner"});if(X.toLowerCase()!==A.toLowerCase())throw new Error(`Sender ${A} is not the owner of contract ${v}. Contract owner is ${X}.`);let me=async J=>J.walletClient.writeContract({address:v,abi:It,functionName:"addDevice",args:[I],account:J.walletClient.account||J.address,chain:r||null}),Q=d?await Kr(me,N,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u},d):await T.execute(me,N,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u}),te={appAddress:v,deviceId:I,transactionHash:Q.receipt.transactionHash,blockNumber:Q.receipt.blockNumber,gasUsed:Q.receipt.gasUsed};return t?.schema===!1?te:(t?.schema||L_).parse(te)}async function en(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 F_=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"]}),V_=be.object({appAddress:be.string(),deviceId:be.string(),transactionHash:be.string(),blockNumber:be.bigint().optional(),gasUsed:be.bigint().optional()}).passthrough();async function K_(e,t){let n=F_.parse(e),{chain:r,rpcUrl:o,appAddress:a,deviceId:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:d,signal:u,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,v=a.startsWith("0x")?a:`0x${a}`,I=yt(s),S,C,A,x;if(i){let M=j_(i),J=Zc(o,{timeout:m});S=l||Xc({chain:r,transport:J}),C=O_({account:M,chain:r,transport:J}),A=M.address,x=r.id}else if(c){if(C=c,S=l||Xc({chain:r,transport:Zc(o,{timeout:m})}),!C.account?.address)throw new Error("WalletClient must have an account with address");A=C.account.address,x=r?r.id:await C.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let N={publicClient:S,walletClient:C,address:A,chainId:x},T=Jn();if(f&&typeof f=="function"){let M=()=>{f(T.status),T.isComplete||setTimeout(M,100)};setTimeout(M,10)}if(!y){let M={targetChainId:x,minBalance:k?Qc(k):Qc("0.001")},J=await Vr(N,M);if(!J.networkValid)throw new Error(`Network mismatch: Expected chain ${M.targetChainId}, but wallet is on chain ${J.details.currentChainId}`);if(!J.balanceValid){let Me=Number(M.minBalance)/1e18,Ut=Number(J.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${Me} ETH, but account has ${Ut.toFixed(6)} ETH`)}}let X=async M=>M.walletClient.writeContract({address:v,abi:It,functionName:"removeDevice",args:[I],account:M.walletClient.account||M.address,chain:r||null}),me=d?await Kr(X,N,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u},d):await T.execute(X,N,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u}),Q={appAddress:v,deviceId:I,transactionHash:me.receipt.transactionHash,blockNumber:me.receipt.blockNumber,gasUsed:me.receipt.gasUsed};return t?.schema===!1?Q:(t?.schema||V_).parse(Q)}async function mm(e,t){try{return{success:!0,data:await K_(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 q_=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"]}),G_=ve.object({appAddress:ve.string(),allow:ve.boolean(),transactionHash:ve.string(),blockNumber:ve.bigint().optional(),gasUsed:ve.bigint().optional()}).passthrough();async function B_(e,t){let n=q_.parse(e),{chain:r,rpcUrl:o,appAddress:a,allow:s,privateKey:i,walletClient:c,publicClient:l,timeout:m=12e4,retryOptions:d,signal:u,onTransactionStateChange:f,onTransactionSubmitted:h,onTransactionConfirmed:g,skipPrerequisiteChecks:y=!1,minBalance:k}=n,v=a.startsWith("0x")?a:`0x${a}`,I,S,C,A;if(i){let te=z_(i),M=tl(o,{timeout:m});I=l||el({chain:r,transport:M}),S=H_({account:te,chain:r,transport:M}),C=te.address,A=r.id}else if(c){if(S=c,I=l||el({chain:r,transport:tl(o,{timeout:m})}),!S.account?.address)throw new Error("WalletClient must have an account with address");C=S.account.address,A=r?r.id:await S.getChainId()}else throw new Error("Either privateKey or walletClient must be provided");let x={publicClient:I,walletClient:S,address:C,chainId:A},N=Jn();if(f&&typeof f=="function"){let te=()=>{f(N.status),N.isComplete||setTimeout(te,100)};setTimeout(te,10)}if(!y){let te={targetChainId:A,minBalance:k?nl(k):nl("0.001")},M=await Vr(x,te);if(!M.networkValid)throw new Error(`Network mismatch: Expected chain ${te.targetChainId}, but wallet is on chain ${M.details.currentChainId}`);if(!M.balanceValid){let J=Number(te.minBalance)/1e18,Me=Number(M.details.balance)/1e18;throw new Error(`Insufficient balance: Required ${J} ETH, but account has ${Me.toFixed(6)} ETH`)}}let T=async te=>te.walletClient.writeContract({address:v,abi:It,functionName:"setAllowAnyDevice",args:[s],account:te.walletClient.account||te.address,chain:r||null}),X=d?await Kr(T,x,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u},d):await N.execute(T,x,[],{timeout:m,confirmations:1,onSubmitted:h,onConfirmed:g,signal:u}),me={appAddress:v,allow:s,transactionHash:X.receipt.transactionHash,blockNumber:X.receipt.blockNumber,gasUsed:X.receipt.gasUsed};return t?.schema===!1?me:(t?.schema||G_).parse(me)}async function pm(e,t){try{return{success:!0,data:await B_(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 b$=On.object({appAddress:On.string(),owner:On.string(),allowAnyDevice:On.boolean(),devices:On.array(On.string())});async function To(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 W_({chain:t,transport:J_(n)})})(),[c,l]=await Promise.all([i.readContract({address:s,abi:It,functionName:"allowAnyDevice"}),i.readContract({address:s,abi:It,functionName:"owner"})]);if(c)return{appAddress:s,owner:l,allowAnyDevice:!0,devices:o.map(d=>yt(d))};let m;if(o.length===0)m=[];else{let d=o.map(f=>({address:s,abi:It,functionName:"allowedDeviceIds",args:[yt(f)]})),u=await i.multicall({contracts:d});m=o.map((f,h)=>({deviceId:yt(f),allowed:u[h]?.status==="success"&&u[h]?.result===!0})).filter(f=>f.allowed).map(f=>f.deviceId)}return{appAddress:s,owner:l,allowAnyDevice:!1,devices:m}}async function Z_(e){let{chain:t,rpcUrl:n,appAddress:r,deviceId:o,composeHash:a,publicClient:s}=e,i=r.startsWith("0x")?r:`0x${r}`,c=yt(o),l=yt(a),m=s||(()=>{if(!t)throw new Error("Chain is required when publicClient is not provided");return Y_({chain:t,transport:X_(n)})})(),d=[{address:i,abi:It,functionName:"allowAnyDevice"},{address:i,abi:It,functionName:"allowedDeviceIds",args:[c]},{address:i,abi:It,functionName:"allowedComposeHashes",args:[l]}],u=await m.multicall({contracts:d}),f=u[0]?.status==="success"&&u[0]?.result===!0,h=u[1]?.status==="success"&&u[1]?.result===!0,g=u[2]?.status==="success"&&u[2]?.result===!0;return{allowAnyDevice:f,deviceAllowed:f||h,composeHashAllowed:g}}async function yn(e){try{return{success:!0,data:await Z_(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 Q_=hl;var ek=jn.object({items:jn.array(Q_),total:jn.number(),page:jn.number(),page_size:jn.number(),pages:jn.number()}).passthrough(),{action:A$,safeAction:dm}=L(ek,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)}),Kn=ht.object({limit:ht.number(),remaining:ht.number()}).passthrough(),tk=ht.object({vm_slots:Kn,vcpu:Kn,memory_mb:Kn,disk_gb:Kn}).passthrough(),nk=ht.object({gpus:Kn,in_use:ht.number(),misconfigured:ht.number()}).passthrough(),rk=ht.object({team_slug:ht.string(),tier:ht.string(),quotas:tk,reserved_nodes:Kn,reserved_gpu:nk,as_of:ht.string()}).passthrough(),{action:x$,safeAction:P$}=L(rk,async(e,t)=>await e.get(`/workspaces/${t.teamSlug}/quotas`)),T$=We(Fe.extend({node_id:rl.number().optional(),os_image:rl.string().min(1).optional()}));var D$=Fn.object({target:Fn.string().describe("Target status to wait for (e.g., 'running', 'stopped')"),interval:Fn.number().min(5).max(30).default(5).describe("Polling interval in seconds"),timeout:Fn.number().min(10).max(600).default(300).describe("Timeout per attempt in seconds"),maxRetries:Fn.number().min(0).default(Number.POSITIVE_INFINITY).describe("Maximum number of retry attempts (Infinity for unlimited)"),retryDelay:Fn.number().min(0).default(5e3).describe("Delay between retries in milliseconds")});var ok=We(Fe.extend({docker_compose_file:Y.string().optional(),pre_launch_script:Y.string().optional(),allowed_envs:Y.array(Y.string()).optional(),public_logs:Y.boolean().optional(),public_sysinfo:Y.boolean().optional(),public_tcbinfo:Y.boolean().optional(),encrypted_env:Y.string().optional(),user_config:Y.string().optional(),gpus:Y.object({count:Y.number(),product_name:Y.string().optional()}).optional(),vcpu:Y.number().optional(),memory:Y.number().optional(),disk_size:Y.number().optional(),image:Y.string().optional(),shutdown_timeout:Y.number().optional(),allow_force_stop:Y.boolean().optional(),prepareOnly:Y.boolean().optional()})),ak=Y.object({requiresOnChainHash:Y.literal(!1),correlationId:Y.string()}),sk=Y.object({requiresOnChainHash:Y.literal(!0),composeHash:Y.string(),appId:Y.string(),deviceId:Y.string(),kmsInfo:pt,commitToken:Y.string().optional(),commitUrl:Y.string().optional(),apiCommitUrl:Y.string().optional(),onchainStatus:Y.object({compose_hash_allowed:Y.boolean(),device_id_allowed:Y.boolean(),is_allowed:Y.boolean()}).optional()}),ik=Y.discriminatedUnion("requiresOnChainHash",[ak,sk]);function ck(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:L$,safeAction:um}=L(ik,async(e,t)=>{let n=ok.parse(t),{cvmId:r}=F.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(d){if(d instanceof et&&d.status===465){let u=ck(d.detail);return{requiresOnChainHash:!0,composeHash:u.compose_hash,appId:String(u.app_id),deviceId:u.device_id,kmsInfo:u.kms_info,commitToken:u.commit_token,commitUrl:u.commit_url,apiCommitUrl:u.api_commit_url,onchainStatus:u.onchain_status}}throw d}}),lk=We(Fe.extend({composeHash:Ao.string().describe("Compose hash from patchCvm Phase 1 response"),transactionHash:Ao.string().describe("Transaction hash proving on-chain registration")})),mk=Ao.object({correlationId:Ao.string()}),{action:O$,safeAction:fm}=L(mk,async(e,t)=>{let n=lk.parse(t),{cvmId:r}=F.parse(n);return{correlationId:(await e.patch(`/cvms/${r}`,{},{headers:{"X-Compose-Hash":n.composeHash,"X-Transaction-Hash":n.transactionHash}})).correlation_id}}),pk=We(Fe.extend({token:zn.string().describe("One-time commit token from prepare-only flow"),composeHash:zn.string().describe("Compose hash from Phase 1 response"),transactionHash:zn.string().describe("Transaction hash proving on-chain registration")})),dk=zn.object({correlationId:zn.string(),status:zn.string()}),{action:F$,safeAction:gm}=L(dk,async(e,t)=>{let n=pk.parse(t),{cvmId:r}=F.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}}),hm=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()}),Ds=hm.extend({cvm_id:ot.number().nullable()}),Us=hm.extend({cvm_id:ot.string().nullable()}),K$=ot.union([Ds,Us]);var H$=We(Fe.extend({overwrite:ot.boolean().optional(),dry_run:ot.boolean().optional()}));var q$=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(),Ls=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()}),G$=Ls.extend({items:Ie.array(Ds)}),B$=Ls.extend({items:Ie.array(Us)}),W$=Ls.extend({items:Ie.array(Ie.union([Ds,Us]))});var uk=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()}),fk=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:uk.nullable().optional()}),gk=se.record(se.string(),fk),hk=se.object({vmUuids:se.array(se.string())}),{action:Y$,safeAction:Mo}=L(gk,async(e,t)=>{let{vmUuids:n}=hk.parse(t);return await e.post("/status/batch",{vm_uuids:n})}),yk=xr.object({hostname:xr.string().nullable().optional(),ssh_authorized_keys:xr.array(xr.string()).default([]),default_gateway_domain:xr.string().nullable().optional()}),bk=F,{action:Z$,safeAction:ym}=L(yk,async(e,t)=>{let{cvmId:n}=bk.parse(t);return await e.get(`/cvms/${n}/user_config`)}),vk=lt.object({id:lt.string(),owner_user_id:lt.string(),owner_username:lt.string(),added_by_user_id:lt.string(),name:lt.string(),public_key:lt.string(),fingerprint:lt.string(),key_type:lt.string()}),bm=lt.object({keys:lt.array(vk),restart_required:lt.boolean()}),Ck=F,{action:eT,safeAction:Yn}=L(bm,async(e,t)=>{let{cvmId:n}=Ck.parse(t);return await e.get(`/cvms/${n}/ssh-keys`)}),wk=We(Fe.extend({ssh_key_ids:Pr.array(Pr.string()),usernames:Pr.array(Pr.string()).optional(),apply_now:Pr.boolean().optional()})),{action:nT,safeAction:Do}=L(bm,async(e,t)=>{let n=wk.parse(t),{cvmId:r}=F.parse(n);return await e.put(`/cvms/${r}/ssh-keys`,{ssh_key_ids:n.ssh_key_ids,...n.usernames!==void 0?{usernames:n.usernames}:{},apply_now:n.apply_now??!1})}),{action:oT,safeAction:vm}=hs(_k.void(),async e=>{await e.delete("/tokens/self")}),Cm=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()}),wm=Cm.extend({cvm_id:De.number().optional()}),Ns=Cm.extend({cvm_id:De.string().optional()}),sT=De.union([wm,Ns]),kk=Ns,iT=De.object({cvmId:De.string().min(1),compose_hash:De.string().optional(),node_id:De.number().optional(),device_id:De.string().optional()});var Sk=Vn.object({appId:Vn.string().min(1),compose_hash:Vn.string(),node_id:Vn.number().optional(),device_id:Vn.string().optional(),chain_id:Vn.number().optional()}),{action:lT,safeAction:mT}=L(kk,async(e,t)=>{let{appId:n,...r}=Sk.parse(t);return await e.post(`/apps/${n}/is-allowed`,r)}),_m=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)}),Ik=_m.extend({results:je.array(wm.extend({cvm_id:je.number()})).default([]),skipped_cvm_ids:je.array(je.number()).default([])}),Ek=_m.extend({results:je.array(Ns.extend({cvm_id:je.string()})).default([]),skipped_cvm_ids:je.array(je.string()).default([])}),dT=je.union([Ik,Ek]);var uT=je.object({appId:je.string().min(1)});var Ak=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 Rk(e){return e==="2025-10-28"?o_:e==="2026-01-21"?nm:s_}async function xk(e,t){let n=Ak.parse(t??{}),r=await e.get("/apps",{params:n});return Rk(e.config.version).parse(r)}async function km(e,t){try{return{success:!0,data:await xk(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 Pk=ol.object({appId:ol.string().min(1)}).strict();function $k(e){return e==="2025-10-28"?Zl:e==="2026-01-21"?em:tm}async function Tk(e,t){let{appId:n}=Pk.parse(t),r=await e.get(`/apps/${n}`);return $k(e.config.version).parse(r)}async function Sm(e,t){try{return{success:!0,data:await Tk(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 Mk=Dr.object({appId:Dr.string().min(1)}).strict();function Dk(e){return e==="2025-10-28"?Dr.array(ul):e==="2026-01-21"?Dr.array(qn):Dr.array(Ur)}async function Uk(e,t){let{appId:n}=Mk.parse(t),r=await e.get(`/apps/${n}/cvms`);return Dk(e.config.version).parse(r)}async function Xn(e,t){try{return{success:!0,data:await Uk(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 Lk=Ct.object({appId:Ct.string().min(1),name:Ct.string().optional(),node_id:Ct.number().optional(),docker_compose_file:Ct.string().optional(),pre_launch_script:Ct.string().optional(),encrypted_env:Ct.string().optional(),compose_hash:Ct.string().optional(),token:Ct.string().optional(),transaction_hash:Ct.string().optional()}).strict(),{action:bT,safeAction:vT}=L(DC,async(e,t)=>{let n=Lk.parse(t),{appId:r,...o}=n;return await e.post(`/apps/${r}/instances`,o)}),Im=Ee.object({device_id:Ee.string(),node_name:Ee.string().nullable(),allowed_onchain:Ee.boolean(),status:Ee.string()}),Em=Im.extend({cvm_ids:Ee.array(Ee.number())}),Am=Im.extend({cvm_ids:Ee.array(Ee.string())}),Rm=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()}),xm=Rm.extend({devices:Ee.array(Em).optional().default([])}),Pm=Rm.extend({devices:Ee.array(Am).optional().default([])}),wT=Ee.union([Em,Am]),_T=Ee.union([xm,Pm]);function Nk(e){return e==="2026-01-21"?xm:Pm}var Ok=Ee.object({appId:Ee.string().min(1)}).strict();async function jk(e,t){let{appId:n}=Ok.parse(t),r=await e.get(`/apps/${n}/device-allowlist`);return Nk(e.config.version).parse(r)}async function Uo(e,t){try{return{success:!0,data:await jk(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 ST=Io.object({appId:Io.string().min(1),page:Io.number().int().min(1).optional(),page_size:Io.number().int().min(1).max(1e3).optional()}).strict();var ET=Eo.object({appId:Eo.string().min(1),revisionId:Eo.string().min(1),rawComposeFile:Eo.boolean().optional()}).strict();var RT=Ge.object({statuses:Ge.array(Ge.string()),image_versions:Ge.array(Ge.string()),instance_types:Ge.array(Ge.string()),kms_slugs:Ge.array(Ge.string()),kms_types:Ge.array(Ge.string()),regions:Ge.array(Ge.string()),nodes:Ge.array(Ge.string())});var Fk=B.object({contract_address:B.string(),chain_id:B.number().nullable(),version:B.string(),url:B.string(),gateway_app_id:B.string().nullable(),gateway_app_url:B.string(),kms_type:B.string()}),al=B.object({app_id:B.string().optional(),instance_id:B.string().optional(),app_name:B.string().optional(),device_id:B.string().optional()}).passthrough().nullable(),Vk=B.object({vm_uuid:B.string().nullable().optional(),name:B.string().optional(),instance_id:B.string().nullable().optional(),status:B.string().optional(),image_version:B.string().nullable().optional(),quote:B.string().nullable().optional(),ppid:B.string().optional(),ppid_sha256:B.string().nullable().optional(),device_id:B.string().optional(),fmspc:B.string().nullable().optional(),tee_tcb_svn:B.string().nullable().optional(),mr_config_id:B.string().nullable().optional(),cpusvn:B.string().nullable().optional(),pcesvn:B.number().nullable().optional(),tcb_info:Wl.nullable().optional(),app_certificates:B.array(Bl).nullable().optional(),compose_file:B.string().nullable().optional(),error:B.string().nullable().optional()}),Kk=B.object({app_id:B.string(),contract_address:B.string(),kms_info:Fk,instances:B.array(Vk),kms_guest_agent_info:al,gateway_guest_agent_info:al,qemu_version:B.string().nullable()}),Hk=B.object({appId:B.string().min(1)}).strict(),{action:PT,safeAction:$T}=L(Kk,async(e,t)=>{let{appId:n}=Hk.parse(t);return await e.get(`/apps/${n}/attestations`)}),zk=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function qk(e){let t={},n=e.toString();n=n.replace(/\r\n?/gm,`
|
|
23
|
+
`);let r;for(;(r=zk.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 Zn(e){let t=qk(e),n=[];for(let[r,o]of Object.entries(t))n.push({key:r,value:o});return n}var $m;function Tm(e){return hn.includes(e)}function Mm(e){$m=e}function Os(){return $m}import oS from"path";import Lo from"fs-extra";import jm from"@iarna/toml";import{z as st}from"zod";import Je from"chalk";import Gk from"ora";var js=!1;function Hr(e){js=e}function q(){return js}function Fs(){return!js}function bn(e){return e!==null&&typeof e=="object"}function Bk(e){return bn(e)&&"cause"in e}function le(e){return typeof e!="string"?void 0:e.trim().length>0?e:void 0}function Wk(e){if(!Array.isArray(e))return;let t=e.filter(n=>typeof n=="string");return t.length>0?t:void 0}function Jk(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 Yk(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 Xk(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 Zk(e,t){let n=Yk(e);if(!n)return;let r=Xk(e,t);return r?{method:r,url:n}:{url:n}}function Dm(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:Wk(e.suggestions),links:Jk(e.links)}}function Qk(e){if(typeof e=="string")return le(e);if(bn(e))return le(e.message)??le(e.error)}function eS(e){let t=le(e);if(t&&!/^\d+$/.test(t))return t}function Um(e,t){let n=Dm(e.data),r=Dm(e.detail),o=e instanceof Et?{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??Qk(e.detail)??le(e.message)??t??"Unknown error",s=o?.errorCode??n.errorCode??r.errorCode??eS(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,d=o?.suggestions??n.suggestions??r.suggestions,u=o?.links??n.links??r.links,f=e.data!==void 0?e.data:void 0,h=Zk(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}:{},...d?{suggestions:d}:{},...u?{links:u}:{},...f!==void 0?{response:f}:{},...e.stack?{stack:e.stack}:{}}}function Vs(e){if(Bk(e)&&e.cause!==void 0){let n=Vs(e.cause),r=le(e.message);return n.message&&n.message!=="Unknown error"?n:r?{...n,message:r}:n}if(e instanceof Et||e instanceof Tr||e instanceof et)return Um(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 tS(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 Nm(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=tS(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
25
|
`)}
|
|
104
|
-
`}function
|
|
105
|
-
`)){if(r.length<=t){n.push(r);continue}if(r.indexOf(" ")===-1){n.push(...
|
|
106
|
-
`))},warn:(e,...t)=>{
|
|
107
|
-
`))},info:(e,...t)=>{
|
|
108
|
-
`))},success:(e,...t)=>{
|
|
109
|
-
`))},debug:(e,...t)=>{
|
|
110
|
-
`))},table:(e,t)=>{if(!
|
|
111
|
-
`)},startSpinner:e=>{if(
|
|
26
|
+
`}function Om(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 nS(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 rS(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 Lm(e,t){let n=[];for(let r of e.split(`
|
|
27
|
+
`)){if(r.length<=t){n.push(r);continue}if(r.indexOf(" ")===-1){n.push(...rS(r,t));continue}let o=nS(r,t);n.push(...o)}if(n.length===0){let r=e.trim();n.push(r)}return n}var p={error:(e,...t)=>{q()||(process.stderr.write(`${Je.red("\u2717")} ${Je.red(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
|
|
28
|
+
`))},warn:(e,...t)=>{q()||(process.stderr.write(`${Je.yellow("\u26A0")} ${Je.yellow(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
|
|
29
|
+
`))},info:(e,...t)=>{q()||(process.stderr.write(`${Je.blue("\u2139")} ${Je.blue(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
|
|
30
|
+
`))},success:(e,...t)=>{q()||(process.stderr.write(`${Je.green("\u2713")} ${Je.green(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
|
|
31
|
+
`))},debug:(e,...t)=>{q()||process.env.DEBUG&&(process.stderr.write(`${Je.gray("\u{1F50D}")} ${Je.gray(e)}`),t.length>0&&process.stderr.write(` ${t.map(String).join(" ")}`),process.stderr.write(`
|
|
32
|
+
`))},table:(e,t)=>{if(!q()){if(e.length===0){console.log(Je.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(Je.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(Je.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(q())return;let{borderStyle:n="single",keyColor:r=Je.blue,valueColor:o=Je.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,d=1,u=a-m-d;if(c+l>u){let h=c/(c+l);c=Math.floor(u*h),l=u-c}let f=c+l+m+d;n!=="none"&&console.log(i.topLeft+i.horizontal.repeat(f-2)+i.topRight);for(let[h,g]of Object.entries(e)){let y=h,k=String(g??""),v=Lm(y,c),I=Lm(k,l),S=Math.max(v.length,I.length);for(;v.length<S;)v.push("");for(;I.length<S;)I.push("");for(let C=0;C<S;C++){let A=v[C].padEnd(c),x=I[C].padEnd(l);console.log(n!=="none"?`${i.vertical} ${r(A)} ${i.vertical} ${o(x)} ${i.vertical}`:`${r(A)} : ${o(x)}`)}}n!=="none"&&console.log(i.bottomLeft+i.horizontal.repeat(f-2)+i.bottomRight)},break:()=>{q()||process.stderr.write(`
|
|
33
|
+
`)},startSpinner:e=>{if(q())return{stop:()=>{}};let t=Gk(e).start();return{stop:(n=!0,r)=>{r&&(t.text=r),n?t.succeed():t.fail()}}},logDetailedError(e,t){if(q())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
34
|
`);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
35
|
`)}
|
|
114
36
|
`);return}e instanceof Error?process.stderr.write(`${n}${e.message}
|
|
115
37
|
`):process.stderr.write(`${n}${String(e)}
|
|
116
|
-
`)}};var
|
|
117
|
-
Run 'phala init' to create one.`);try{let t=
|
|
38
|
+
`)}};var Fm=Fe.extend({profile:st.string().optional(),api_version:st.enum(hn).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()}),zr="phala.toml";function Ks(){return oS.join(process.cwd(),zr)}function qr(){return Lo.existsSync(Ks())}function aS(){let e=Ks();if(!Lo.existsSync(e))throw new Error(`Project configuration file not found: ${zr}
|
|
39
|
+
Run 'phala init' to create one.`);try{let t=Lo.readFileSync(e,"utf8"),n=jm.parse(t),r=Fm.parse(n);if(r.id||r.uuid||r.app_id||r.instance_id||r.name){let{cvmId:o}=F.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
40
|
`);throw new Error(`Invalid project configuration:
|
|
119
|
-
${n}`)}throw new Error(`Failed to parse ${
|
|
41
|
+
${n}`)}throw new Error(`Failed to parse ${zr}: ${t instanceof Error?t.message:String(t)}`)}}function Hs(e){let t=Ks();try{let n=Fm.parse(e),r=jm.stringify(n);Lo.writeFileSync(t,r,"utf8"),p.success(`Project configuration saved to ${zr}`)}catch(n){if(n instanceof st.ZodError){let r=n.issues.map(o=>` - ${o.path.join(".")}: ${o.message}`).join(`
|
|
120
42
|
`);throw new Error(`Invalid configuration:
|
|
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
|
|
123
|
-
`)}return n}async function
|
|
43
|
+
${r}`)}throw new Error(`Failed to save ${zr}: ${n instanceof Error?n.message:String(n)}`)}}function Qn(){return qr()?aS():{}}function Vm(e){if(!e)return;let{cvmId:t}=F.parse({id:e});return t}import tr from"fs";import sS from"os";import zs from"path";var Rt="https://cloud-api.phala.com/api/v1";function qs(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:zs.join(sS.homedir(),".phala-cloud")}function Gr(){return zs.join(qs(),"credentials.json")}function Gs(){return zs.join(qs(),"api-key")}function iS(){let e=qs();tr.existsSync(e)||tr.mkdirSync(e,{recursive:!0})}function er(e){return typeof e=="string"&&e.trim().length>0}function nr(e){let t=e.trim();return t.length===0?"default":t}function xe(){try{let e=Gr();if(!tr.existsSync(e))return null;let t=tr.readFileSync(e,"utf8"),n=JSON.parse(t);if(!n||typeof n!="object")return null;let r=n;return r.schema_version!==1||!er(r.current_profile)||!r.profiles||typeof r.profiles!="object"?null:r}catch(e){return p.error("Failed to read credentials file:",e),null}}function No(e){iS(),tr.writeFileSync(Gr(),JSON.stringify(e,null,2),{mode:384,encoding:"utf8"})}function Km(e){let t=xe(),n=nr(e.profile||e.projectProfile||t?.current_profile||"default"),r=n;if(t&&!t.profiles[r]){let m=Object.entries(t.profiles).find(([,d])=>d?.workspace?.slug===n);if(m)r=m[0];else{let d=Object.entries(t.profiles).find(([,u])=>u?.workspace?.name===n);d&&(r=d[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",c=er(e.env.PHALA_CLOUD_WORKSPACE)?e.env.PHALA_CLOUD_WORKSPACE.trim():null;if(er(e.apiToken))return{apiKey:e.apiToken,bearerToken:null,workspace:c,baseURL:s,profileName:r,tokenSource:"flag",apiPrefixSource:i};if(er(e.env.PHALA_CLOUD_API_KEY))return{apiKey:e.env.PHALA_CLOUD_API_KEY,bearerToken:null,workspace:c,baseURL:s,profileName:r,tokenSource:"env",apiPrefixSource:i};let l=t?.profiles?.[r]?.token;return er(l)?{apiKey:l,bearerToken:null,workspace:c,baseURL:s,profileName:r,tokenSource:"file",apiPrefixSource:i}:er(e.env.PHALA_OIDC_TOKEN)?{apiKey:null,bearerToken:e.env.PHALA_OIDC_TOKEN,workspace:c,baseURL:s,profileName:r,tokenSource:"oidc_env",apiPrefixSource:i}:{apiKey:null,bearerToken:null,workspace:c,baseURL:s,profileName:r,tokenSource:"none",apiPrefixSource:i}}function rr(e){let t=nr(e.profileName),n=(e.apiPrefix||Rt).trim(),r=xe(),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()}}};No(i)}function Oo(e){let t=xe();if(!t)return;let n=nr(e||t.current_profile),r={...t.profiles};delete r[n];let o=Object.keys(r);if(o.length===0){try{tr.unlinkSync(Gr())}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};No(s)}function Hm(e,t){let n=nr(e),r=nr(t),o=xe();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;No({...o,current_profile:s,profiles:a})}function xt(){let e=xe();return e?Object.keys(e.profiles):[]}function or(e){let t=nr(e),n=xe();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&&No({...n,current_profile:t})}function Ve(){let e=xe();if(!e)return null;let t=e.current_profile,n=e.profiles[t];return n?{name:t,info:n}:null}import{readFileSync as cS}from"fs";import{dirname as lS,join as zm}from"path";import{fileURLToPath as mS}from"url";function pS(){let e=lS(mS(import.meta.url)),t=[zm(e,"../../package.json"),zm(e,"../package.json")];for(let n of t)try{let r=JSON.parse(cS(n,"utf-8"));if(r.version)return r.version}catch{}return"unknown"}var dS=pS(),Ft=`phala-cli/${dS}`;var qm="2026-06-23",uS=60;function Br(e){return e?.globalOptions?.timeout??uS}function fS(){return{env:process.env,projectConfig:Qn()}}function Pt(e,t){let n=e??fS();return Km({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=Pt(e,t),r=Os()??qm,o=Br(e);return jt({apiKey:n.apiKey??void 0,bearerToken:n.bearerToken??void 0,workspace:n.workspace??void 0,baseURL:n.baseURL,version:r,timeout:o*1e3,headers:{"User-Agent":Ft}})}async function jo(e,t){let n=Pt(e,t);return{client:await E(e,t),auth:n}}async function Wr(e,t){let n=Os()??qm;return jt({apiKey:e,baseURL:t?.baseURL,version:n,headers:{"User-Agent":Ft}})}async function ar(e){try{let t=await Wr(e.apiKey,{baseURL:e.baseURL}),n=await vm(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 w}from"zod";var gS=w.object({password:w.string(),registry:w.string().nullable(),username:w.string()}),kM=w.object({docker_compose_file:w.string(),docker_config:gS.optional().nullable(),features:w.array(w.string()),kms_enabled:w.boolean(),manifest_version:w.number(),name:w.string(),public_logs:w.boolean(),public_sysinfo:w.boolean(),runner:w.string().optional(),salt:w.string().nullable().optional(),tproxy_enabled:w.boolean(),version:w.string().optional()}).passthrough(),SM=w.object({key:w.string(),value:w.string()}),hS=w.object({is_online:w.boolean(),is_public:w.boolean(),error:w.string().nullable(),internal_ip:w.string(),latest_handshake:w.string(),public_urls:w.array(w.object({app:w.string(),instance:w.string()}))}),yS=w.object({id:w.string(),name:w.string(),status:w.string(),teepod_id:w.number(),teepod:w.object({id:w.number(),name:w.string()}),user_id:w.string().nullable().optional(),app_id:w.string(),vm_uuid:w.string().nullable().optional(),instance_id:w.string().nullable().optional(),app_url:w.string().nullable().optional(),base_image:w.string().nullable().optional(),vcpu:w.number(),memory:w.number(),disk_size:w.number(),manifest_version:w.number().nullable().optional(),version:w.string().nullable().optional(),runner:w.string().nullable().optional(),docker_compose_file:w.string().nullable().optional(),features:w.array(w.string()).nullable().optional(),created_at:w.string(),encrypted_env_pubkey:w.string().nullable().optional()}),Gm=w.object({is_online:w.boolean(),is_public:w.boolean(),error:w.string().nullable(),app_certificates:w.array(w.object({subject:w.object({common_name:w.string().nullable(),organization:w.string().nullable(),country:w.string().nullable(),state:w.string().nullable().optional(),locality:w.string().nullable().optional()}),issuer:w.object({common_name:w.string().nullable(),organization:w.string().nullable(),country:w.string().nullable()}),serial_number:w.string(),not_before:w.string(),not_after:w.string(),version:w.string(),fingerprint:w.string(),signature_algorithm:w.string(),sans:w.string().nullable(),is_ca:w.boolean(),position_in_chain:w.number(),quote:w.string().nullable()})).nullable(),tcb_info:w.object({mrtd:w.string(),rootfs_hash:w.string(),rtmr0:w.string(),rtmr1:w.string(),rtmr2:w.string(),rtmr3:w.string(),event_log:w.array(w.object({imr:w.number(),event_type:w.number(),digest:w.string(),event:w.string(),event_payload:w.string()}))}).nullable(),compose_file:w.string().nullable()}),bS=w.object({name:w.string(),description:w.string().optional(),version:w.array(w.number()).optional(),is_dev:w.boolean().optional(),os_image_hash:w.string().nullable().optional(),rootfs_hash:w.string().optional(),shared_ro:w.boolean().optional(),cmdline:w.string().optional(),kernel:w.string().optional(),initrd:w.string().optional(),hda:w.string().nullable().optional(),rootfs:w.string().optional(),bios:w.string().optional()}),IM=w.object({teepod_id:w.number().nullable(),id:w.number().optional(),name:w.string(),listed:w.boolean().optional(),resource_score:w.number().optional(),remaining_vcpu:w.number().optional(),remaining_memory:w.number().optional(),remaining_cvm_slots:w.number().optional(),images:w.array(bS).optional(),region_identifier:w.string().optional(),dedicated_for_team_id:w.number().nullable().optional(),support_onchain_kms:w.boolean().optional(),fmspc:w.string().nullable().optional(),device_id:w.string().nullable().optional()});import vS from"inquirer";async function Bm(){let e=p.startSpinner("Fetching available CVMs"),t=await E(),n=await Nr(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 vS.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:o}]);return a}async function Wm(e){let t=await E(),n=e.replace(/^app_/,""),r=await t.get(`cvms/app_${n}/attestation`);try{return Gm.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 Bs(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 Jm(e,t){let n=await E(),r=e.replace(/^app_/,"");return await n.put(`cvms/app_${r}/compose`,t)}function tn(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 CS(e){return!e||/\s/.test(e)||e.length%4!==0?!1:/^[A-Za-z0-9+/]+={0,2}$/.test(e)}function wS(e){if(!CS(e))return e;try{return Buffer.from(e,"base64").toString("utf-8")}catch{return e}}function Fo(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:wS(n.message)}}catch{return null}}function _S(e){let t=e.split(/\r?\n/),n=[];for(let r of t){if(!r.trim())continue;let o=Fo(r);if(o){n.push(o);continue}n.push({channel:"stdout",message:`${r}
|
|
44
|
+
`})}return n}function kS(e){let t=e.split(/\r?\n/),n="";for(let r of t){let o=Fo(r);if(o){n+=o.message;continue}r.trim()&&(n+=`${r}
|
|
45
|
+
`)}return n}async function SS(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=Fo(i);if(c){t(c.message);return}i.trim()&&t(`${i}
|
|
124
46
|
`)};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
|
|
126
|
-
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function
|
|
47
|
+
`);for(;m>=0;){let d=o.slice(0,m);o=o.slice(m+1),s(d),m=o.indexOf(`
|
|
48
|
+
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t(o)}async function IS(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=Fo(i);if(c){t(c);return}i.trim()&&t({channel:"stdout",message:`${i}
|
|
127
49
|
`})};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
|
|
129
|
-
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function
|
|
50
|
+
`);for(;m>=0;){let d=o.slice(0,m);o=o.slice(m+1),s(d),m=o.indexOf(`
|
|
51
|
+
`)}}a==="structured"&&o.trim()?s(o):a==="raw"&&o&&t({channel:"stdout",message:o})}async function Ws(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 Xm(e){return Ws(e,"serial")}async function Vo(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 Zm(e,t={}){let n=await Xm(e),r=tn(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 Vo(e,t.container,t.matchContainerIdPrefix??!0),r=t.text??!0,o=t.bare??!0,a=tn(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("{")?kS(i):i}async function ep(e,t={}){let n=await Vo(e,t.container,t.matchContainerIdPrefix??!0),r=tn(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("{")?_S(a):[{channel:"stdout",message:a}]}async function tp(e,t,n={},r){let o=await Vo(e,n.container,n.matchContainerIdPrefix??!0),a=tn(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 IS(s,t)}async function np(e,t,n={},r){let o=await Xm(e),a=tn(o,{...n,follow:!0}),s=await fetch(a,{signal:r});if(!s.ok)throw new Error(`Failed to stream serial logs: ${s.status} ${s.statusText}`);await Ym(s,t)}async function rp(e,t,n={},r){let o=await Vo(e,n.container,n.matchContainerIdPrefix??!0),a=n.text??!0,s=n.bare??!0,i=tn(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 SS(c,t)}async function op(e,t,n={}){let r=await Ws(e,t),o=tn(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 ap(e,t,n,r={},o){let a=await Ws(e,t),s=tn(a,{...r,follow:!0}),i=await fetch(s,{signal:o});if(!i.ok)throw new Error(`Failed to stream CVM ${t} logs: ${i.status} ${i.statusText}`);await Ym(i,n)}async function sp(e){let t=await E(),n=e.replace(/^app_/,""),r=await W(t,{app_id:n});if(!r.success)throw new Error(r.error.message);return r.data.status}import cr from"chalk";import{ZodError as WS}from"zod";var nn=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\n\nAll environment variables recognized by the Phala CLI. Command-line flags always take precedence over environment variables when both are set.\n\n## Authentication\n\n- `PHALA_CLOUD_API_KEY` \u2014 API token. Overrides the token stored by `phala login`.\n- `PHALA_OIDC_TOKEN` \u2014 GitHub Actions OIDC JWT. Sent as `Authorization: Bearer`. Used for keyless CI deploy when no API key is set. Prefer API key when both are present.\n- `PHALA_CLOUD_WORKSPACE` \u2014 Workspace slug sent as `X-Phala-Workspace` (needed when a GitHub repo is trusted in multiple workspaces).\n- `PHALA_CLOUD_API_PREFIX` \u2014 API base URL. Default: `https://cloud-api.phala.com/api/v1`.\n\nThe `@phala/cloud` JS SDK also reads both directly when `createClient()` is\ncalled without explicit config.\n\n## On-chain KMS\n\nThese variables apply to `deploy`, `allow-devices`, `cvms replicate`, and\n`envs update` when the CVM uses Ethereum or Base KMS:\n\n- `PRIVATE_KEY` \u2014 Private key for signing on-chain transactions.\n Precedence: `--private-key` > `PRIVATE_KEY`.\n- `ETH_RPC_URL` \u2014 RPC endpoint. Follows the foundry/cast convention, so an\n existing `ETH_RPC_URL` from those tools works automatically.\n Precedence: `--rpc-url` > `ETH_RPC_URL` > chain default.\n\nExample:\n\n export ETH_RPC_URL=https://mainnet.base.org\n export PRIVATE_KEY=0x...\n phala deploy --kms base\n\n## Debug logging\n\n`DEBUG` has two independent consumers that behave differently:\n\n- **CLI debug output** \u2014 any non-empty value enables the CLI\'s own debug\n messages on stderr (gray prefix).\n- **API request logging** \u2014 the `@phala/cloud` JS SDK uses the `debug` npm\n package with namespace `phala::api-client`. Set `DEBUG=phala::api-client`\n to print every HTTP request in cURL-like format (method, URL, headers,\n body).\n\nExamples:\n\n # CLI debug only\n DEBUG=1 phala deploy\n\n # API request cURL logging (also triggers CLI debug, since "phala::api-client" is truthy)\n DEBUG=phala::api-client phala deploy\n\n # Everything\n DEBUG=* phala deploy\n\n## Self-update\n\n- `PHALA_UPDATE_CHANNEL` \u2014 Release channel for `phala self update` (e.g. `latest`, `beta`).\n- `PHALA_DISABLE_UPDATE_CHECK` \u2014 Any truthy value disables the background update notice.\n- `CI` \u2014 Standard CI flag. Any truthy value disables the update notice.\n\n## Miscellaneous\n\n- `CLOUD_URL` \u2014 Override the Phala Cloud portal URL used in printed links.\n Default: `https://cloud.phala.com`.\n\n## Internal (undocumented)\n\n- `PHALA_CLOUD_DIR` \u2014 Override the credentials directory. Default: `~/.phala-cloud`.\n Testing only.\n\n## See also\n\n- `phala api --help` for API-specific flags and env vars\n- `phala login --help` for authentication flow\n- `phala deploy --help` for on-chain KMS flags\n'})});var ES={name:"help",shorthand:"h",description:"Show help information for the current command",type:"boolean",target:"help"},AS={name:"version",shorthand:"v",description:"Show CLI version",type:"boolean",target:"version"},D={name:"interactive",shorthand:"i",description:"Enable interactive mode",type:"boolean",target:"interactive",group:"basic"},RS={name:"interactive",description:"Enable interactive mode for commands that support it",type:"boolean",target:"interactive",group:"basic"},ip={name:"api-token",description:"API token for authenticating with Phala Cloud",type:"string",target:"apiToken",aliases:["api-key"],argumentName:"token",group:"basic"},ee={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json",group:"basic"},xS={name:"profile",description:"Temporarily use a different auth profile for this command",type:"string",target:"profile",argumentName:"profile",group:"basic"},PS={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"},$S={name:"timeout",description:"Request timeout in seconds (default 60)",type:"number",target:"timeout",argumentName:"seconds",group:"advanced"},rn=[ip],G={name:"cvm_id",description:"CVM identifier (UUID, app_id, instance_id, or name)",required:!1,target:"cvmId"},vn={name:"cvm-id",description:"CVM identifier (UUID, app_id, instance_id, or name)",type:"string",target:"cvmId"},cp={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"},Ye={name:"rpc-url",description:"RPC URL for on-chain KMS transactions (or set ETH_RPC_URL env var)",type:"string",target:"rpcUrl",group:"advanced"},sr={name:"transaction-hash",description:"Transaction hash proving on-chain compose hash registration. Pass `already-registered` to skip the proof and rely on state-only verification.",type:"string",target:"transactionHash",group:"advanced"},Cn=[ES,AS,ip,ee,RS,vn,xS,PS,$S];function Ko(e){return e==="unstable"?" [UNSTABLE]":e==="deprecated"?" [DEPRECATED]":""}function TS(e,t){let n=Object.values(nn);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 zo(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,d)=>(m.name??"").localeCompare(d.name??""));if(l.length!==0){r.push(a(c));for(let m of l){let d=m.command?.meta??m.group?.meta,u=(d?.description??"").split(`
|
|
52
|
+
`)[0],f=d?.stability,h=f?Ko(f):"",g=m.name??"",y=d?.aliases,k=y?.length?`${g} (${y.join(", ")})`:g;r.push(` ${k.padEnd(18)}${u}${h}`.trimEnd())}r.push("")}}TS(r,n),r.push("Global options:");for(let c of Cn){let l=Ho(c),m=Math.max(24,l.length+2);r.push(` ${l.padEnd(m)}${c.description??""}`.trimEnd())}return r.join(`
|
|
53
|
+
`)}function lp(e){let{registry:t,executableName:n,groupPath:r}=e,o=t.getNode(r);if(!o?.group)return zo({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,d=(m?.description??"").split(`
|
|
54
|
+
`)[0],u=m?.stability,f=u?Ko(u):"",h=l.name??"",g=m?.aliases,y=g?.length?`${h} (${g.join(", ")})`:h;a.push(` ${y.padEnd(18)}${d}${f}`.trimEnd())}a.push("")}a.push("Global options:");for(let l of Cn){let m=Ho(l),d=Math.max(24,m.length+2);a.push(` ${m.padEnd(d)}${l.description??""}`.trimEnd())}return a.join(`
|
|
55
|
+
`)}function Js(e){let{executableName:t,definition:n,registry:r}=e,o=MS({executableName:t,definition:n}),a=Ko(n.meta.stability),s=[o,"",`${n.meta.description}${a}`],i=n.meta.arguments??[];if(i.length>0){s.push(""),s.push("Arguments:");for(let y of i){let k=US(y);s.push(` ${k.padEnd(18)}${y.description??""}`.trimEnd())}}let c=[...n.meta.options??[]],l=new Set;(n.path.length===1&&(n.path[0]==="login"||n.path[0]==="api")||n.path.length===2&&n.path[0]==="auth"&&n.path[1]==="login")&&l.add("profile");let m=c.filter(y=>!y.hidden),d=new Map(m.map(y=>[y.name,y])),u=Cn.filter(y=>!y.hidden).filter(y=>!l.has(y.name)).map(y=>d.get(y.name)??y),f=new Set(u.map(y=>y.name)),h=m.filter(y=>!f.has(y.name));if(u.length>0){let y=new Set(h.map(k=>k.shorthand).filter(k=>typeof k=="string"&&k.length>0));s.push(""),s.push("Global options:");for(let k of u){let v=!k.shorthand||!y.has(k.shorthand),I=Ho(k,{includeShorthand:v}),S=Math.max(24,I.length+2);s.push(` ${I.padEnd(S)}${k.description??""}`.trimEnd())}}if(h.length>0){let y=S=>S.group==="deprecated"||S.deprecated?!0:(S.description??"").includes("[DEPRECATED]"),k=S=>S.group?S.group:y(S)?"deprecated":"basic",v={basic:[],advanced:[],deprecated:[]};for(let S of h)v[k(S)].push(S);let I=(S,C)=>{if(C.length!==0){s.push(""),s.push(S);for(let A of C){let x=Ho(A),N=Math.max(24,x.length+2);s.push(` ${x.padEnd(N)}${A.description??""}`.trimEnd())}}};I("Basic options:",v.basic),I("Advanced options:",v.advanced),I("Deprecated options:",v.deprecated)}if(n.meta.passThrough&&(s.push(""),s.push("Pass-through (after --):"),s.push(` ${n.meta.passThrough.description}`),n.meta.passThrough.examples&&n.meta.passThrough.examples.length>0)){s.push(""),s.push(" Examples:");for(let y of n.meta.passThrough.examples)s.push(` ${y}`)}if(n.meta.examples&&n.meta.examples.length>0){s.push(""),s.push("Examples:");for(let y of n.meta.examples)s.push(` # ${y.name}`),s.push(` ${y.value}`)}let g=r.getChildren(n.path);if(g.length>0){s.push(""),s.push("Subcommands:");for(let y of g){let k=y.command?.meta??y.group?.meta,v=(k?.description??"").split(`
|
|
56
|
+
`)[0],I=k?.stability,S=I?Ko(I):"",C=y.name??"",A=k?.aliases,x=A?.length?`${C} (${A.join(", ")})`:C;s.push(` ${x.padEnd(18)}${v}${S}`.trimEnd())}}return s.join(`
|
|
57
|
+
`)}function MS({executableName:e,definition:t}){let n=[e,...t.path],o=(t.meta.arguments??[]).map(l=>DS(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 DS(e){let t=`<${e.name}>`;return e.variadic?`${t}...`:e.required===!1?`[${t}]`:t}function US(e){return e.variadic?`<${e.name}...>`:e.required===!1?`<${e.name}>?`:`<${e.name}>`}function Ho(e,{includeShorthand:t=!0}={}){let n=[];t&&e.shorthand&&n.push(`-${e.shorthand}`);let r=`--${e.name}`;if(e.argumentName?r+=` ${e.argumentName.toUpperCase()}`:e.type!=="boolean"&&(r+=" <value>"),n.push(r),e.aliases&&e.aliases.length>0)for(let o of e.aliases){let a=`--${o}`;e.argumentName?a+=` ${e.argumentName.toUpperCase()}`:e.type!=="boolean"&&(a+=" <value>"),n.push(a)}return e.type==="boolean"&&e.negatedName&&n.push(`--${e.negatedName}`),n.join(", ")}function qo(e){return e.split(/[\s-]+/).filter(Boolean).map((t,n)=>n===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function mp(e){return e===void 0?[]:Array.isArray(e)?[...e]:[e]}function pp(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??qo(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 NS from"arg";import dp from"arg";function up(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??qo(o.name),i=LS(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 mp(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]=dp.flag(()=>!0),r.set(c,{option:o,canonicalKey:a,target:s,negatedKey:c})}}return{spec:t,descriptors:n,negatedLookup:r}}function LS(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 dp.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 OS(e){let t=e.indexOf("--");return t===-1?[[...e],[]]:[e.slice(0,t),e.slice(t+1)]}function Jr(e,t,n={}){let r=[...Cn,...t?[...t]:[]],o=up(r),{permissive:a=!1,stopAtPositional:s=!1}=n,[i,c]=OS(e),l=NS(o.spec,{argv:i,permissive:a,stopAtPositional:s}),{_:m,...d}=l;return{positionals:m??[],flags:d,flagConfig:o,passThrough:c}}import on from"chalk";import _n from"semver";import Yr from"fs";import jS from"os";import fp from"path";var Ys={};function gp(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:fp.join(jS.homedir(),".phala-cloud")}function Go(){return fp.join(gp(),"state.json")}function FS(){let e=gp();Yr.existsSync(e)||Yr.mkdirSync(e,{recursive:!0})}function Xr(){try{let e=Go();if(!Yr.existsSync(e))return Ys;let t=Yr.readFileSync(e,"utf8"),n=JSON.parse(t);return!n||typeof n!="object"?Ys:n}catch{return Ys}}function wn(e){FS();let t={...Xr(),...e};Yr.writeFileSync(Go(),JSON.stringify(t,null,2),{mode:384,encoding:"utf8"})}function ir(e){return Xr()[e]}function hp(e,t){wn({[e]:t})}function yp(){return Xr()}function Bo(){return typeof process.versions.bun=="string"?"bun":"node"}function VS(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=VS(r);if(o)return o}return"npm"}function Qr(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 bp(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 KS=200,HS=1440*60*1e3,zS="Phala-Network/phala-cloud",vp="cli-v";function _p(e,t){return`https://github.com/${zS}/compare/${vp}${e}...${vp}${t}`}function Wo(e){return e?e==="1"||e.toLowerCase()==="true":!1}function Cp(e){return typeof e=="string"&&e.trim().length>0}function qS(e){return e.startsWith("@")?e.replace("/","%2F"):e}function GS(e){let n=_n.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function kp(e,t,n){if(Cp(t.PHALA_UPDATE_CHANNEL))return t.PHALA_UPDATE_CHANNEL;let r=n.get("updateCheckChannel");return Cp(r)?r:GS(e)??"latest"}function BS(e){return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function Xs(e,t){return`${e}_${BS(t)}`}function wp(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 Sp(){return{get(e){return ir(e)},save(e){wn(e)}}}function Jo(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:c=Sp()}=e;try{if(!i||s||Wo(a.CI)||Wo(a.PHALA_DISABLE_UPDATE_CHECK)||c.get("disableUpdateNotice")===!0)return null;let l=_n.valid(r);if(!l)return null;let m=kp(r,a,c),d=Xs("updateCheckLatest",m),u=c.get(d)??(m==="latest"?c.get("updateCheckLatest"):void 0),f=typeof u=="string"?_n.valid(u):null;if(!f||!_n.gt(f,l))return null;let h=Zr(a,o),g=h==="bun"?`${n}@${f}`:m==="latest"?`${n}@latest`:`${n}@${m}`,y=Qr(h,g),k=_p(l,f);return{message:`${[on.yellow(`Update available: v${l} -> v${f}${m==="latest"?"":` (${m})`}.`),on.gray(k),on.gray(`Update with: "${t} self update" (or "${y}").`),on.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
|
|
130
58
|
`)}
|
|
131
|
-
`,currentVersion:l,latestVersion:f,packageName:n}}catch{return null}}async function
|
|
59
|
+
`,currentVersion:l,latestVersion:f,packageName:n}}catch{return null}}async function Yo(e){let{executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,now:c=Date.now(),timeoutMs:l=KS,ttlMs:m=HS,fetchImpl:d=fetch,configStore:u=Sp()}=e;try{if(!i||s||Wo(a.CI)||Wo(a.PHALA_DISABLE_UPDATE_CHECK)||u.get("disableUpdateNotice")===!0)return null;let f=kp(r,a,u),h=Xs("updateCheckLastAt",f),g=wp(u,h)??(f==="latest"?wp(u,"updateCheckLastAt"):void 0);if(g&&c-g<m)return Jo({executableName:t,packageName:n,currentVersion:r,runtime:o,env:a,isJson:s,stderrIsTTY:i,configStore:u});let k=`https://registry.npmjs.org/${qS(n)}`,v=new AbortController,I=setTimeout(()=>v.abort(),l);I.unref?.();let S,C=null;try{if(S=await d(k,{signal:v.signal,headers:{accept:"application/json"}}),!S.ok)return null;let A=await S.json();if(!A||typeof A!="object")return null;let x=A["dist-tags"];if(!x||typeof x!="object")return null;let N=x[f]??x.latest;if(typeof N!="string")return null;C=_n.valid(N);let T=_n.valid(r);if(!C||!T||!_n.gt(C,T))return null;let X=Zr(a,o),me=X==="bun"?`${n}@${C}`:f==="latest"?`${n}@latest`:`${n}@${f}`,Q=Qr(X,me),te=_p(T,C);return{message:`${[on.yellow(`Update available: v${T} -> v${C}${f==="latest"?"":` (${f})`}.`),on.gray(te),on.gray(`Update with: "${t} self update" (or "${Q}").`),on.gray(`Disable with: PHALA_DISABLE_UPDATE_CHECK=1 or "${t} config set disableUpdateNotice true".`)].join(`
|
|
132
60
|
`)}
|
|
133
|
-
`,currentVersion:
|
|
134
|
-
`),1
|
|
135
|
-
`),1;
|
|
136
|
-
`),
|
|
137
|
-
`),0;
|
|
138
|
-
`)
|
|
139
|
-
`)
|
|
140
|
-
`)}
|
|
141
|
-
`)
|
|
61
|
+
`,currentVersion:T,latestVersion:C,packageName:n}}finally{clearTimeout(I);let A=Xs("updateCheckLatest",f);u.save({[h]:c,...C?{[A]:C}:{},...f==="latest"?{updateCheckLastAt:c,...C?{updateCheckLatest:C}:{}}:{}})}}catch{return null}}async function Ep(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,stdout:c,stderr:l,stdin:m,env:d,cwd:u}=e,f=YS(n);if((f.length>0?t.getNode(f):null)?.group){let C=n.slice(f.length),A=Jr(C,void 0);if(A.flags["--help"]||A.positionals.length===0)return Ip({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:c,stderr:l,groupPath:f})}let g=t.resolveCommand(f);if(!g)return f.length>1&&t.getNode([f[0]])?.group?Ip({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:c,stderr:l,groupPath:[f[0]]}):JS({registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:d,stdout:c,stderr:l});let{definition:y,consumed:k,remaining:v}=g;if(v.length>0&&(!y.meta.arguments||y.meta.arguments.length===0)){let C=k.join(" "),A=v.join(" "),x=v[0];return(C==="ssh-keys list"||C==="ssh-keys ls")&&x&&!x.startsWith("-")?(l.write(`phala ssh-keys list shows your account keys, not a CVM. To see which keys ${x} authorizes, run: ${r} ssh-keys show ${x}
|
|
62
|
+
`),1):(l.write(`Unknown subcommand "${A}" for "${C}". Run \`${r} ${C} --help\` for usage.
|
|
63
|
+
`),1)}let I=n.slice(k.length),S=Qn();try{let C=Jr(I,y.meta.options);Hr(C.flags["--json"]===!0);let A=C.flags["--api-version"];if(typeof A=="string"){if(!Tm(A))return l.write(`Invalid API version "${A}". Supported versions: ${hn.join(", ")}
|
|
64
|
+
`),1;Mm(A)}if(C.flags["--version"])return c.write(`${o}
|
|
65
|
+
`),0;if(C.flags["--help"])return c.write(`${Js({executableName:r,definition:y,registry:t})}
|
|
66
|
+
`),0;let N=!(y.path[0]==="self"&&y.path[1]==="update")?Yo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:d,isJson:C.flags["--json"]===!0,stderrIsTTY:l.isTTY===!0}):Promise.resolve(null);y.meta.stability==="deprecated"&&l.write(cr.yellow(`Warning: This command is deprecated and may be removed in a future version.
|
|
67
|
+
`));let T=pp(y.meta,C),X=T.options.timeout,me;if(typeof X=="number"){if(!Number.isFinite(X)||X<=0)return l.write(`Invalid --timeout value "${X}". Must be a positive number of seconds.
|
|
68
|
+
`),1;me=X}let Q={apiToken:typeof T.options.apiToken=="string"?T.options.apiToken:void 0,json:T.options.json===!0,interactive:T.options.json===!0?!1:T.options.interactive===!0,profile:typeof T.options.profile=="string"?T.options.profile:void 0,apiVersion:typeof A=="string"?A:void 0,timeout:me},te={...T.options,...T.positionals,options:T.options,positionals:T.positionals,raw:T.raw},M,J="cvmId"in te?te.cvmId:void 0,Me=Q.interactive;C.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] 'cvmId' in mergedInput:","cvmId"in te),console.log("[DISPATCHER DEBUG] rawCvmId:",J),console.log("[DISPATCHER DEBUG] mergedInput keys:",Object.keys(te)));let Ut=[...y.meta.arguments??[],...y.meta.options??[]].some(oe=>oe.target==="cvmId"||oe.name==="cvm-id"||oe.name==="cvm_id");if(Me&&Ut){let oe=await Bm();oe&&(M={app_id:oe})}if(!M&&J&&typeof J=="string"&&(M={id:J}),!M){let oe=S.cvm_id;oe&&(M={id:oe})}C.flags["--debug"]&&(console.log("[DISPATCHER DEBUG] final cvmId:",JSON.stringify(M)),console.log("[DISPATCHER DEBUG] cvmId type:",typeof M),console.log("[DISPATCHER DEBUG] cvmId is undefined:",M===void 0));let Yt={argv:I,rawFlags:C.flags,rawPositionals:C.positionals,cwd:u,env:d,stdout:c,stderr:l,stdin:m,projectConfig:S,globalOptions:Q,cvmId:M,cli:{executableName:r,packageName:a,packageVersion:s,runtime:i},success(oe){if(q()){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)}
|
|
69
|
+
`)}else typeof oe=="string"?c.write(`${cr.green("\u2713")} ${cr.green(oe)}
|
|
70
|
+
`):(c.write(`${cr.green("\u2713")} Success
|
|
142
71
|
`),c.write(`${JSON.stringify(oe,null,2)}
|
|
143
|
-
`))},fail(oe,_e){
|
|
144
|
-
`):(l.write(`${
|
|
72
|
+
`))},fail(oe,_e){q()?c.write(`${JSON.stringify({success:!1,error:oe,..._e&&{details:_e}},null,2)}
|
|
73
|
+
`):(l.write(`${cr.red("\u2717")} ${cr.red(oe)}
|
|
145
74
|
`),_e&&l.write(`${JSON.stringify(_e,null,2)}
|
|
146
|
-
`))},failWithError(oe,_e){let
|
|
147
|
-
`);return}l.write(
|
|
148
|
-
`),0):(l.write(
|
|
149
|
-
`),1;throw
|
|
150
|
-
`),0;if(
|
|
151
|
-
`),0;if(
|
|
152
|
-
`);let f=
|
|
153
|
-
`),1}catch(
|
|
154
|
-
`),1;throw
|
|
155
|
-
`),0;if(f.flags["--help"]||f.positionals.length===0){if(l.write(`${
|
|
156
|
-
`),!f.flags["--help"]){let y=
|
|
157
|
-
`),1}catch(
|
|
158
|
-
`),1;throw
|
|
75
|
+
`))},failWithError(oe,_e){let yo=Vs(oe);if(q()){let Yh=Om(yo,{operation:_e?.operation,debug:_e?.debug});c.write(`${JSON.stringify(Yh,null,2)}
|
|
76
|
+
`);return}l.write(Nm(yo,{operation:_e?.operation,debug:_e?.debug,guidance:_e?.guidance}))}};C.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId after creation:",JSON.stringify(Yt.cvmId));let Ba=y.schema.parse(te),go=Object.freeze({...Ba,json:Q.json,interactive:Q.interactive,...Q.apiToken!==void 0?{apiToken:Q.apiToken}:{},...Q.profile!==void 0?{profile:Q.profile}:{}});C.flags["--debug"]&&console.log("[DISPATCHER DEBUG] context.cvmId before handler:",JSON.stringify(Yt.cvmId));let ho=await y.run(go,Yt),ke=await N;return typeof ho=="number"?(ho===0&&ke&&!q()&&l.write(ke.message),ho):(ke&&!q()&&l.write(ke.message),0)}catch(C){if(C instanceof WS){let A=C.issues.some(N=>N.code==="invalid_type"&&N.received==="undefined"&&N.message==="Required"),x=I.some(N=>!N.startsWith("-"));return A&&!x?(c.write(`${Js({executableName:r,definition:y,registry:t})}
|
|
77
|
+
`),0):(l.write(XS(C)),1)}if(Zs(C))return l.write(`${C.message}
|
|
78
|
+
`),1;throw C}}function JS(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 d=Jr(n,void 0);if(d.flags["--version"])return l.write(`${o}
|
|
79
|
+
`),0;if(d.flags["--help"])return l.write(`${zo({registry:t,executableName:r})}
|
|
80
|
+
`),0;if(d.positionals.length===0){l.write(`${zo({registry:t,executableName:r})}
|
|
81
|
+
`);let f=Jo({executableName:r,packageName:a,currentVersion:s,runtime:i,env:c,isJson:!1,stderrIsTTY:m.isTTY===!0});return f&&m.write(f.message),0}let u=d.positionals.join(" ");return m.write(`Unknown command "${u}". Run \`${r} --help\` for a list of commands.
|
|
82
|
+
`),1}catch(d){if(Zs(d))return m.write(`${d.message}
|
|
83
|
+
`),1;throw d}}function Ip(e){let{registry:t,argv:n,executableName:r,version:o,packageName:a,packageVersion:s,runtime:i,env:c,stdout:l,stderr:m,groupPath:d}=e;try{let u=n.slice(d.length),f=Jr(u,void 0);if(f.flags["--version"])return l.write(`${o}
|
|
84
|
+
`),0;if(f.flags["--help"]||f.positionals.length===0){if(l.write(`${lp({registry:t,executableName:r,groupPath:d})}
|
|
85
|
+
`),!f.flags["--help"]){let y=Jo({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=d.join(" ");return m.write(`Unknown subcommand "${h}" for "${g}". Run \`${r} ${g} --help\` for a list of subcommands.
|
|
86
|
+
`),1}catch(u){if(Zs(u))return m.write(`${u.message}
|
|
87
|
+
`),1;throw u}}function YS(e){let t=[];for(let n of e){if(n.startsWith("-"))break;t.push(n)}return t}function XS(e){let t=e.issues[0];return t?`Invalid value for "${t.path.length>0?t.path.join("."):"input"}": ${t.message}
|
|
159
88
|
`:`${e.message}
|
|
160
|
-
`}function
|
|
161
|
-
`);return}let a=e.env.PHALA_CLOUD_API_PREFIX||
|
|
162
|
-
`);return}let c=i.data,l=c.workspace_name||"default",m=c.workspace_slug,
|
|
89
|
+
`}function Zs(e){return e instanceof Error&&Object.prototype.hasOwnProperty.call(e,"code")&&typeof e.code=="string"}import Rp from"crypto";import kn from"fs";import lr from"os";import xp from"path";function ZS(){let e=process.env.PHALA_CLOUD_DIR;return typeof e=="string"&&e.trim().length>0?e:xp.join(lr.homedir(),".phala-cloud")}function QS(){return xp.join(ZS(),"config.json")}function Ap(e){return/^[0-9a-fA-F]+$/.test(e)}function e0(e){let n=e.trim().split(":");if(n.length!==2)return!1;let[r,o]=n;return r.length===32&&Ap(r)&&o.length>0&&Ap(o)}function t0(){let e=[lr.hostname(),lr.platform(),lr.arch(),lr.cpus()[0]?.model||"",lr.userInfo().username],t=Rp.createHash("sha256");return t.update(e.join("|")),t.digest()}function n0(e){let t=t0(),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=Rp.createDecipheriv("aes-256-cbc",t.slice(0,32),r),s=a.update(o,"hex","utf8");return s+=a.final("utf8"),s}function eo(e){try{kn.unlinkSync(e)}catch{}}function r0(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 o0(){return async({token:e,baseURL:t})=>{let n=jt({apiKey:e,baseURL:t,headers:{"User-Agent":Ft}}),r=await He(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 Pp(e){await a0(e),await s0(e)}async function a0(e){let t=Gr();if(kn.existsSync(t)){let i=Gs();kn.existsSync(i)&&eo(i);return}let n=Gs();if(!kn.existsSync(n))return;let r=kn.readFileSync(n,"utf8").trim();if(!r)return;let o;try{o=e0(r)?n0(r):r}catch{e.stderr.write(`Legacy credentials could not be migrated (possibly due to machine change). Please run 'phala login' again.
|
|
90
|
+
`);return}let a=e.env.PHALA_CLOUD_API_PREFIX||Rt,s=e.fetchCurrentUser??o0();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.
|
|
91
|
+
`);return}let c=i.data,l=c.workspace_name||"default",m=c.workspace_slug,d=m||"default";rr({profileName:d,token:o,apiPrefix:a,workspaceName:l,workspaceSlug:m,user:{username:c.username||"unknown",email:c.email},setCurrent:!0}),eo(n),e.stderr.write(`Migrated legacy credentials into ${t} (profile: ${d}).
|
|
163
92
|
`)}catch{e.stderr.write(`Legacy credentials could not be migrated. Please run 'phala login' again.
|
|
164
|
-
`)}}async function
|
|
165
|
-
`)}
|
|
93
|
+
`)}}async function s0(e){let t=Go(),n=QS();if(kn.existsSync(n))try{let r=kn.readFileSync(n,"utf8"),o=JSON.parse(r);if(!o||typeof o!="object"){eo(n);return}let a=r0(o);if(Object.keys(a).length>0){let s=Xr();wn({...s,...a}),e.stderr.write(`Migrated legacy config into ${t}.
|
|
94
|
+
`)}eo(n)}catch{eo(n)}}function $p(e){return{name:e,children:new Map,aliasMap:new Map}}var Xo=class{constructor(){this.root=$p(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=$p(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 Lp}from"fs";function b(e){return{path:e.path,meta:e.meta,schema:e.schema,run:e.handler}}import i0 from"@michaelhomer/jqjs";function Tp(e,t){let r=[...i0.compile(t)(e)];return r.length===1?r[0]:r}function Mp(e,t=2){return e==null?String(e):typeof e=="string"?e:JSON.stringify(e,null,t)}import{z as ze}from"zod";var Qs=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],Dp={name:"api",category:"advanced",description:`Make an authenticated HTTP request to Phala Cloud API.
|
|
166
95
|
|
|
167
96
|
The endpoint should be an API path like "/cvms" or "/users/me".
|
|
168
97
|
|
|
@@ -185,46 +114,46 @@ Use -q to filter JSON output with jq syntax (built-in, no jq installation needed
|
|
|
185
114
|
ENVIRONMENT VARIABLES
|
|
186
115
|
|
|
187
116
|
PHALA_CLOUD_API_KEY Override the API key (useful for CI/CD)
|
|
188
|
-
PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...
|
|
189
|
-
`)}function
|
|
190
|
-
`),1;let r=
|
|
191
|
-
`),1;let o=
|
|
192
|
-
`),1;let
|
|
193
|
-
`),
|
|
117
|
+
PHALA_CLOUD_API_PREFIX Override the API base URL`,stability:"unstable",arguments:[{name:"endpoint",description:"API endpoint path",required:!0}],options:[...rn,{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"}]},Up=ze.object({endpoint:ze.string(),method:ze.enum(Qs).default("GET").transform(e=>e.toUpperCase()),query:ze.array(ze.string()).optional(),field:ze.array(ze.string()).optional(),header:ze.array(ze.string()).optional(),data:ze.array(ze.string()).optional(),input:ze.string().optional(),include:ze.boolean().default(!1),jq:ze.string().optional(),silent:ze.boolean().default(!1),apiToken:ze.string().optional()});function Zo(e){return e==="-"?Lp(0,"utf-8"):Lp(e,"utf-8")}function c0(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 l0(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("@")?Zo(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 m0(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=Zo(i);try{t[a]=JSON.parse(c)}catch{throw new Error(`Failed to parse JSON from file "${i}" for field "${a}"`)}}else t[a]=c0(s);continue}let o=n.indexOf("=");if(o>0){let a=n.slice(0,o),s=n.slice(o+1);s.startsWith("@")?t[a]=Zo(s.slice(1)):t[a]=s}}return t}function p0(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 d0(e,t){let n=t.toLowerCase();return Object.keys(e).some(r=>r.toLowerCase()===n)}function u0(e){return!["GET","HEAD","OPTIONS"].includes(e)}function Np(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=Zo(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=m0(e.field);return Object.keys(n).length===0?{body:void 0}:{body:n}}return{body:void 0}}var f0=new Set(Qs);function g0(e){return f0.has(e.toUpperCase())}function h0(e,t="phala"){let[n,r]=e;if(!n||!r||!g0(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(`
|
|
118
|
+
`)}function y0(e,t){let{body:n}=Np(e),r=l0(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 b0(e,t){let n=h0(t.rawPositionals,t.cli?.executableName);if(n)return t.stderr.write(`${n}
|
|
119
|
+
`),1;let r=Pt(t,{apiToken:e.apiToken});if(!r.apiKey)return t.stderr.write(`Error: Not authenticated. Run "phala login" first.
|
|
120
|
+
`),1;let o=jt({apiKey:r.apiKey,baseURL:r.baseURL,headers:{"User-Agent":Ft}}),a=p0(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}=Np(e);l&&!d0(a,"content-type")&&(a["Content-Type"]=l);let m=y0(e,c);if(m.body!==void 0&&!u0(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.
|
|
121
|
+
`),1;let d=await o.requestFull(m.endpoint,{method:m.method,body:m.body,headers:a,responseType:"arrayBuffer"});if(e.include&&(t.stdout.write(`HTTP/1.1 ${d.status} ${d.statusText}
|
|
122
|
+
`),d.headers.forEach((u,f)=>{t.stdout.write(`${f}: ${u}
|
|
194
123
|
`)}),t.stdout.write(`
|
|
195
|
-
`)),!e.silent&&
|
|
196
|
-
`),1):(t.stdout.write(h),
|
|
197
|
-
`),1}let
|
|
198
|
-
`)}return
|
|
199
|
-
`),1}}var
|
|
124
|
+
`)),!e.silent&&d.data!==void 0){let u=(d.headers.get("content-type")||"").toLowerCase(),f=(d.headers.get("content-disposition")||"").toLowerCase(),h=Buffer.from(d.data),g=u.includes("application/json")||u.includes("+json")||u.includes("text/json"),y=u.startsWith("text/")||u.includes("application/xml")||u.includes("application/javascript");if((f.includes("attachment")||u.includes("application/octet-stream")||u.includes("application/zip")||u.includes("application/pdf")||u.includes("application/vnd.")||u.includes("spreadsheet")||u.includes("application/x-"))&&!g)return e.jq?(t.stderr.write(`Error: jq filter (-q) cannot be applied to binary responses.
|
|
125
|
+
`),1):(t.stdout.write(h),d.ok?0:1);let v=h.toString("utf8"),I=v;if(g||!y&&v.length>0)try{I=JSON.parse(v)}catch{I=v}if(e.jq)try{I=Tp(I,e.jq)}catch(C){return t.stderr.write(`Error: jq filter failed: ${C.message}
|
|
126
|
+
`),1}let S=Mp(I);t.stdout.write(`${S}
|
|
127
|
+
`)}return d.ok?0:1}catch(l){let m=l;return t.stderr.write(`Error: ${m.message}
|
|
128
|
+
`),1}}var Op=b({path:["api"],meta:Dp,schema:Up,handler:b0});var jp={path:["auth"],meta:{name:"auth",category:"deprecated",description:"Authenticate with Phala Cloud",stability:"deprecated"}};import{z as Qo}from"zod";var Fp={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"}]},Vp=Qo.object({apiKey:Qo.string().min(1,"API key cannot be empty").optional(),manual:Qo.boolean().optional(),noOpen:Qo.boolean().optional()});var Kp=b({path:["auth","login"],meta:Fp,schema:Vp,handler:async()=>(p.error('The "phala auth login" command has been removed. Use "phala login" instead.'),1)});import{z as v0}from"zod";var Hp={name:"logout",description:"Removed. Use 'phala logout' instead.",stability:"deprecated"},zp=v0.object({});var qp=b({path:["auth","logout"],meta:Hp,schema:zp,handler:async()=>(p.error('The "phala auth logout" command has been removed. Use "phala logout" instead.'),1)});import{z as ea}from"zod";var ue={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},ei={name:"debug",shorthand:"d",description:"Enable debug output",type:"boolean",target:"debug"},Gp={name:"status",category:"profile",description:"Check authentication status",stability:"stable",options:[...rn,ue,ei],examples:[{name:"Show login status",value:"phala status"},{name:"Get status as JSON",value:"phala status --json"}]},ta=ea.object({json:ea.boolean().default(!1),debug:ea.boolean().default(!1),apiToken:ea.string().optional()});var Bp={name:"status",description:"Removed. Use 'phala status' instead.",stability:"deprecated",options:[...rn,ue,ei]},Wp=ta;var Jp=b({path:["auth","status"],meta:Bp,schema:Wp,handler:async()=>(p.error('The "phala auth status" command has been removed. Use "phala status" instead.'),1)});var ti={group:jp,commands:[Kp,qp,Jp]};var Yp={path:["config"],meta:{name:"config",category:"deprecated",description:"Manage local CLI state",stability:"deprecated"}};import{z as Xp}from"zod";var Zp={name:"get",description:"Get a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0}]},Qp=Xp.object({key:Xp.string()});async function C0(e,t){p.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=ir(e.key);return n===void 0?(t.stderr.write(`Configuration key '${e.key}' not found
|
|
200
129
|
`),1):(t.stdout.write(`${e.key}: ${JSON.stringify(n)}
|
|
201
130
|
`),0)}catch(n){return t.stderr.write(`Failed to get configuration value
|
|
202
|
-
`),p.logDetailedError(n),1}}var
|
|
131
|
+
`),p.logDetailedError(n),1}}var ed=b({path:["config","get"],meta:Zp,schema:Qp,handler:C0});import{z as td}from"zod";var nd={name:"list",aliases:["ls"],description:"List config values",stability:"stable",options:[{name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json"}]},rd=td.object({json:td.boolean().default(!1)});async function w0(e,t){p.warn('The "phala config" commands are deprecated and will be removed in a future version.');try{let n=yp();if(e.json)return t.success(n),0;t.stdout.write(`Configuration values:
|
|
203
132
|
`);for(let[r,o]of Object.entries(n))t.stdout.write(`${r}: ${JSON.stringify(o)}
|
|
204
|
-
`);return 0}catch(n){return p.logDetailedError(n),t.fail("Failed to list configuration values"),1}}var
|
|
133
|
+
`);return 0}catch(n){return p.logDetailedError(n),t.fail("Failed to list configuration values"),1}}var od=b({path:["config","list"],meta:nd,schema:rd,handler:w0});import{z as ni}from"zod";var ad={name:"set",description:"Set a configuration value",stability:"stable",arguments:[{name:"key",description:"Configuration key",required:!0},{name:"value",description:"Configuration value",required:!0}]},sd=ni.object({key:ni.string(),value:ni.string()});async function _0(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.'),hp(e.key,n),t.stdout.write(`Configuration value for '${e.key}' set successfully
|
|
205
134
|
`),0}catch(n){return t.stderr.write(`Failed to set configuration value
|
|
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
|
|
135
|
+
`),p.logDetailedError(n),1}}var id=b({path:["config","set"],meta:ad,schema:sd,handler:_0});var ri={group:Yp,commands:[ed,od,id]};var cd={path:["cvms"],meta:{name:"cvms",category:"manage",description:"Manage CVMs",stability:"unstable"}};import ra from"chalk";import{z as na}from"zod";var ld={name:"attestation",description:"Get CVM attestation",stability:"unstable",arguments:[G],options:[ue,D],examples:[{name:"Show attestation summary",value:"phala cvms attestation"},{name:"Output full attestation JSON",value:"phala cvms attestation --json"}]},md=na.object({cvmId:na.string().optional(),interactive:na.boolean().default(!1),json:na.boolean().default(!1)});async function k0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await W(n,t.cvmId);if(!r.success)return t.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 Wm(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?ra.green("Online"):ra.red("Offline"),"Public Access":i.is_public?ra.green("Enabled"):ra.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 pd=b({path:["cvms","attestation"],meta:ld,schema:md,handler:k0});import S0 from"inquirer";import{z as to}from"zod";var dd={name:"delete",description:"Delete a CVM",stability:"unstable",arguments:[G],options:[D,{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"}]},ud=to.object({cvmId:to.string().optional(),interactive:to.boolean().default(!1),force:to.boolean().default(!1),yes:to.boolean().default(!1)});async function I0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=await W(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 S0.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 jr(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 fd=b({path:["cvms","delete"],meta:dd,schema:ud,handler:I0});import aa from"chalk";var E0=/\x1b\[[0-9;]*m/g,gd=e=>e.replace(E0,"").length,A0=(e,t)=>e+" ".repeat(Math.max(0,t-gd(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],gd(a[o]??""))}let r=o=>e.map(a=>A0(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 oa}from"zod";var hd={name:"device-allowlist",description:"Show device allowlist status for a CVM's app",stability:"unstable",arguments:[G],options:[ue,D],examples:[{name:"Check device allowlist",value:"phala cvms device-allowlist app_abc123"}]},yd=oa.object({cvmId:oa.string().optional(),json:oa.boolean().default(!1),interactive:oa.boolean().default(!1)});async function R0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await W(n,t.cvmId);if(!r.success)return t.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 Uo(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?aa.green("yes"):aa.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"?aa.green(m.status):aa.red(m.status)}));return ie(c,l),0}catch(n){return t.failWithError(n,{operation:"Manage device allowlist",debug:!!e.debug}),1}}var bd=b({path:["cvms","device-allowlist"],meta:hd,schema:yd,handler:R0});import ai from"chalk";var fe=process.env.CLOUD_URL||"https://cloud.phala.com";var oi=40;import{z as sa}from"zod";var vd={name:"get",description:"Get details of a CVM",stability:"unstable",arguments:[G],options:[ue,D],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"}]},Cd=sa.object({cvmId:sa.string().optional(),json:sa.boolean().default(!1),interactive:sa.boolean().default(!1)});async function x0(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 W(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"?ai.green(a.status):a.status==="stopped"?ai.red(a.status):ai.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 wd=b({path:["cvms","get"],meta:vd,schema:Cd,handler:x0});import ca from"chalk";function P0(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 ia(e,t){let n=await km(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 P0(s,100)){let m=await Mo(e,{vmUuids:l});if(!m.success)return{success:!1,error:{message:m.error.message,cause:m.error}};for(let[d,u]of Object.entries(m.data))i[d]={status:u.status,uptime:u.uptime,in_progress:u.in_progress}}let c=[];for(let l of a){let m=l.current_cvm;if(!m?.vm_uuid)continue;let d=i[m.vm_uuid],u=d?d.status:typeof m.status=="string"?m.status:"unknown";c.push({appId:l.app_id,cvmName:m.name,status:u,uptime:d?.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 _d={name:"list",aliases:["ls"],description:"List CVMs",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},{name:"search",description:"Search by name, app_id, vm_uuid, or instance_id",type:"string",target:"search",group:"basic"},{name:"status",description:"Filter by CVM status (can be specified multiple times)",type:"string[]",target:"status",group:"basic"},{name:"listed",description:"Filter by listed status",type:"boolean",target:"listed",negatedName:"no-listed",group:"basic"},{name:"base-image",description:"Filter by base image name",type:"string",target:"baseImage",group:"basic"},{name:"instance-type",description:"Filter by instance type",type:"string",target:"instanceType",group:"basic"},{name:"kms-type",description:"Filter by KMS type",type:"string",target:"kmsType",group:"basic"},{name:"node",description:"Filter by node name",type:"string",target:"node",group:"basic"},{name:"region",description:"Filter by region identifier",type:"string",target:"region",group:"basic"},ee],examples:[{name:"List CVMs",value:"phala cvms ls"},{name:"Second page",value:"phala cvms ls --page 2"},{name:"Search by name",value:"phala cvms ls --search my-cvm"},{name:"Filter by status",value:"phala cvms ls --status running"},{name:"Output as JSON",value:"phala cvms ls --json"}]},kd=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 $0(e){return e!==null&&typeof e=="object"&&"code"in e&&e.code==="TIMEOUT"}function T0(e){return`Request timed out after ${e}s.
|
|
136
|
+
Retry with --timeout <seconds> to allow more time.`}function M0(e){return e.toLowerCase().endsWith("ing")?ca.yellow(e):e==="running"?ca.green(e):e==="stopped"?ca.red(e):ca.yellow(e)}async function D0(e,t){try{let n=await E(t),r=await ia(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 $0(i)?(t.fail(T0(Br(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:M0(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(p.info("No CVMs found"),0):(ie(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 Sd=b({path:["cvms","list"],meta:_d,schema:kd,handler:D0});import{z as U0}from"zod";var Id={name:"list-nodes",description:"List worker nodes",stability:"unstable"},Ed=U0.object({});async function L0(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
137
|
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
138
|
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
|
|
211
|
-
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function
|
|
139
|
+
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 Ad=b({path:["cvms","list-nodes"],meta:Id,schema:Ed,handler:L0});async function no(e,t){try{let n=await E(t),r=await W(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 la(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}=F.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,d=()=>{m=!0,l.abort()};process.on("SIGINT",d),process.on("SIGTERM",d);try{await e.streamLogs(a,u=>process.stdout.write(u),s,l.signal)}catch(u){if(u.name!=="AbortError")throw u}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d)}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 no(a,o)||p.info("No logs available"),0)}catch(c){return o.failWithError(c,{operation:`Fetch ${i} logs`,debug:!!r.debug}),await no(a,o),1}}}import{z as an}from"zod";var Rd={name:"logs",description:"Fetch container logs from a CVM",stability:"deprecated",arguments:[G],options:[{name:"tail",shorthand:"n",description:"Lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream logs in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},{name:"container",shorthand:"c",description:"Container name or ID (defaults to first)",type:"string",target:"container"},ue,D],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"}]},xd=an.object({cvmId:an.string().optional(),tail:an.number().optional(),follow:an.boolean().default(!1),timestamps:an.boolean().default(!1),container:an.string().optional(),json:an.boolean().default(!1),interactive:an.boolean().default(!1)});var N0=la({logType:"container",fetchLogs:Qm,streamLogs:rp},e=>({tail:e.tail,timestamps:e.timestamps,container:e.container})),Pd=b({path:["cvms","logs"],meta:Rd,schema:xd,handler:N0});import Od from"fs";import O0 from"path";function Md(e){return e.startsWith("0x")?e.slice(2):e}function $d(e){return Md(e).toLowerCase()}function Td(e,t){let n=Md(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 si(e,t,n){if(!n)throw new Error("KMS k256_pubkey is required to verify encryption public key");let r=os(Td(e.public_key,"encryption public key"),Td(e.signature,"encryption public key signature"),t);if(!r)throw new Error("Invalid encryption public key signature");if($d(r)!==$d(n))throw new Error("Encryption public key signature does not match KMS");return e.public_key}async function $t(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 Or(e,{app_id:t.app_id,kms:o});if(!a.success)throw a.error;return si(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 dt}from"zod";var Dd={name:"replicate",description:"Create a replica of an existing CVM",stability:"unstable",arguments:[G],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,Ye,{name:"prepare-only",description:"Prepare the replica and generate a commit token. Skips all on-chain operations.",type:"boolean",target:"prepareOnly",group:"advanced"},{name:"commit",description:"Commit a previously prepared replica using a commit token. Requires --token, --compose-hash, and --transaction-hash.",type:"boolean",target:"commit",group:"advanced"},{name:"token",description:"Commit token from a prepare-only replica request.",type:"string",target:"token",group:"advanced"},sr,D],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>"}]},Ud=dt.object({cvmId:dt.string().optional(),nodeId:dt.string().optional(),composeHash:dt.string().optional(),envFile:dt.string().optional(),privateKey:dt.string().optional(),rpcUrl:dt.string().optional(),prepareOnly:dt.boolean().default(!1),commit:dt.boolean().default(!1),token:dt.string().optional(),transactionHash:dt.string().optional(),interactive:dt.boolean().default(!1)});function j0(e){return Od.readFileSync(e,"utf-8").split(`
|
|
140
|
+
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function F0(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function V0(e){if(e.status!==465)return null;let n=F0(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 K0(e,t,n){if(!n)return;let r=O0.resolve(process.cwd(),n);if(!Od.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=j0(r),a=await $t(e,t);return qe(o,a)}async function H0(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Ot(e);if(!r.success){let a="error"in r?r.error:void 0;throw new Error(a?.message||`Failed to resolve node name "${n}"`)}let o=r.data.nodes.filter(a=>a.name.toLowerCase()===n.toLowerCase());if(o.length===0)throw new Error(`Node "${n}" not found.`);if(o.length>1)throw new Error(`Node name "${n}" is ambiguous (${o.length} matches). Use an explicit node ID.`);return o[0].teepod_id}function ii(e,t,n){if(q()){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||"-",d=[`Source CVM ID: ${t.cvmId?.id||e.source_cvm_id||"-"}`,`Team: ${s}`,`CVM UUID: ${r||"-"}`,`App ID: ${e.app_id}`,`Name: ${e.name}`,`Status: ${e.status}`,`KMS: ${m}`,`Node: ${l} (ID: ${e.teepod_id})`,`vCPUs: ${e.vcpu}`,`Memory: ${e.memory} MB`,`Disk Size: ${e.disk_size} GB`,`App URL: ${c}`];t.stdout.write(`${d.join(`
|
|
212
141
|
`)}
|
|
213
|
-
`)}function
|
|
142
|
+
`)}function Ld(e,t){if(q()){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(`
|
|
214
143
|
`)}
|
|
215
|
-
`)}async function
|
|
216
|
-
${fe}/dashboard/cvms/app_${a}`)}else await
|
|
217
|
-
${fe}/dashboard/cvms/app_${l.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Restart CVM",debug:!!e.debug}),1}}var
|
|
218
|
-
${fe}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Start CVM",debug:!!e.debug}),1}}var
|
|
219
|
-
${fe}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Stop CVM",debug:!!e.debug}),1}}var
|
|
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,
|
|
221
|
-
`))):l=l.trim(),c&&(n[c]=l)}}return Object.entries(n).map(([r,o])=>({key:r,value:o}))};import{execSync as
|
|
144
|
+
`)}async function Nd(e,t,n){return e.post(`/cvms/${t}/commit-replica`,{token:n.token,compose_hash:n.composeHash,transaction_hash:n.transactionHash})}async function z0(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let r=await E(t),o,a=await W(r,t.cvmId);if(a.success)o=a.data;else if(a.error&&typeof a.error=="object"&&"errorCode"in a.error&&a.error.errorCode==="ERR-03-010"){let m=(t.cvmId?.id??"").replace(/^app_/,"").replace(/^0x/,"").toLowerCase(),d=await Xn(r,{appId:m});if(!d.success||d.data.length===0)throw a.error;let u=d.data[0];if(!u.vm_uuid)throw a.error;let f=await W(r,{id:u.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 Nd(r,o.vm_uuid,{token:n.token,composeHash:n.composeHash,transactionHash:n.transactionHash||"already-registered"});return ii(l,t,o),0}let s=await K0(r,o,n.envFile),i=await H0(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 ii(l,t,o),0}catch(l){if(!(l instanceof Et))throw l;let m=V0(l);if(!m)throw l;if(n.prepareOnly)return Ld(m,t),0;if(!m.commitToken)throw new Error("Replica prepare response did not include a commit token");let d=o.kms_info?.chain_id,u=d!=null?At[d]:void 0;if(!u)throw new Error(d!=null?`Source CVM chain id ${d} 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 yn({chain:u,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:m.deviceId,composeHash:m.composeHash});if(!f.success){let v="error"in f?f.error:void 0;throw new Error(v?.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 v=[];y&&v.push("compose hash"),g&&v.push("device");let I=n.privateKey||process.env.PRIVATE_KEY;if(!I)throw Ld(m,t),new Error(`On-chain registration required: ${v.join(", ")} not registered. Pass --private-key or set PRIVATE_KEY to register automatically, or use --prepare-only to handle registration separately.`);let S=I;if(g){let C=await en({chain:u,rpcUrl:n.rpcUrl,appAddress:o.app_id,deviceId:m.deviceId,privateKey:S});if(!C.success){let A="error"in C?C.error:void 0;throw new Error(A?.message||"Failed to register device on-chain")}}if(y){let C=await Qt({chain:u,rpcUrl:n.rpcUrl,appId:o.app_id,composeHash:m.composeHash,privateKey:S});if(!C.success){let A="error"in C?C.error:void 0;throw new Error(A?.message||"Failed to register compose hash on-chain")}h=String(C.data.transactionHash||"already-registered")}}let k=await Nd(r,o.vm_uuid,{token:m.commitToken,composeHash:m.composeHash,transactionHash:h});return ii(k,t,o),0}}catch(r){return t.failWithError(r,{operation:"Replicate CVM",debug:!!n.debug}),1}}var jd=b({path:["cvms","replicate"],meta:Dd,schema:Ud,handler:z0});import sn from"chalk";import mi from"inquirer";async function Vt(e,t={}){let{maxRetries:n=100,retryDelayMs:r=3e3,spinner:o,logRetries:a=!0}=t,s;for(let 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(u=>setTimeout(u,r));else throw l}let i=s;throw new Error(`Failed after ${n} retries due to conflicts: ${i?.message||String(s)}`)}import{z as Kt}from"zod";var Fd={name:"resize",description:"Resize resources for a CVM",stability:"unstable",arguments:[G],options:[D,{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"}]},Vd=Kt.object({cvmId:Kt.string().optional(),interactive:Kt.boolean().default(!1),vcpu:Kt.string().optional(),memory:Kt.string().optional(),diskSize:Kt.string().optional(),allowRestart:Kt.string().optional(),yes:Kt.boolean().default(!1),json:Kt.boolean().default(!1)});function ci(e,t){if(e===void 0)return;let n=Number.parseInt(e,10);if(Number.isNaN(n)||n<0)throw new Error(`Please provide a valid non-negative number for ${t}`);return n}function q0(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(["true","1","yes","y"].includes(t))return!0;if(["false","0","no","n"].includes(t))return!1;throw new Error(`Invalid value for --allow-restart: ${e}`)}async function li(e,t){return(await mi.prompt([{type:"input",name:"value",message:e,default:t,validate:r=>{let o=Number.parseInt(r,10);return Number.isNaN(o)||o<0?"Please enter a valid non-negative number":!0},filter:r=>Number.parseInt(r,10)}])).value}async function G0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=await W(n,t.cvmId);if(!r.success)return t.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=ci(e.vcpu,"--vcpu"),i=ci(e.memory,"--memory"),c=ci(e.diskSize,"--disk-size"),l=q0(e.allowRestart)}catch(m){return p.error(m instanceof Error?m.message:String(m)),1}if(Fs()?(s===void 0&&(s=await li("Enter number of vCPUs:",o.resource.vcpu??void 0)),i===void 0&&(i=await li("Enter memory in MB:",o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0)),c===void 0&&(c=await li("Enter disk size in GB:",o.resource.disk_in_gb??void 0)),l===void 0&&(l=(await mi.prompt([{type:"confirm",name:"allowRestart",message:"Allow restart of the CVM if needed for resizing?",default:!1}])).allowRestart)):(s===void 0&&(s=o.resource.vcpu??void 0),i===void 0&&(i=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0),c===void 0&&(c=o.resource.disk_in_gb??void 0),l===void 0&&(l=!0)),Fs()){let m=o.resource.vcpu,d=o.resource.memory_in_gb?o.resource.memory_in_gb*1024:void 0,u=o.resource.disk_in_gb;if(p.keyValueTable({vCPUs:m!==s?`${sn.red(m)} -> ${sn.green(s)}`:m,Memory:d!==i?`${sn.red(d)} MB -> ${sn.green(i)} MB`:d,"Disk Size":u!==c?`${sn.red(u)} GB -> ${sn.green(c)} GB`:u,"Allow Restart":l?sn.green("Yes"):sn.red("No")}),!e.yes){let{confirm:h}=await mi.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to resize CVM app_${a}?`,default:!1}]);if(!h)return p.info("Resize operation cancelled"),0}let f=p.startSpinner(`Resizing CVM with App ID app_${a}`);await Vt(()=>Bs(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:
|
|
145
|
+
${fe}/dashboard/cvms/app_${a}`)}else await Vt(()=>Bs(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 Kd=b({path:["cvms","resize"],meta:Fd,schema:Vd,handler:G0});async function ma(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 W(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 d=Math.floor((Date.now()-o)/1e3);p.success(`CVM is ready (took ${d}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 pi}from"zod";var Hd={name:"restart",description:"Restart a CVM",stability:"stable",arguments:[G],options:[D],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"}]},zd=pi.object({cvmId:pi.string().optional(),interactive:pi.boolean().default(!1)});async function B0(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;try{let n=await E(t),r=t.globalOptions?.json===!0,o=await W(n,t.cvmId);if(!o.success)return t.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 ma(a.vm_uuid,3e5,t));let s=p.startSpinner("Restarting CVM"),i=t.cvmId,c=await Vt(()=>Es(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:
|
|
146
|
+
${fe}/dashboard/cvms/app_${l.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Restart CVM",debug:!!e.debug}),1}}var qd=b({path:["cvms","restart"],meta:Hd,schema:zd,handler:B0});import{z as Sn}from"zod";var Gd={name:"serial-logs",description:"Fetch VM serial console logs from a CVM",stability:"deprecated",arguments:[G],options:[{name:"tail",shorthand:"n",description:"Lines from end",type:"number",target:"tail"},{name:"follow",shorthand:"f",description:"Stream logs in real-time",type:"boolean",target:"follow"},{name:"timestamps",shorthand:"t",description:"Show timestamps",type:"boolean",target:"timestamps"},ue,D],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"}]},Bd=Sn.object({cvmId:Sn.string().optional(),tail:Sn.number().optional(),follow:Sn.boolean().default(!1),timestamps:Sn.boolean().default(!1),json:Sn.boolean().default(!1),interactive:Sn.boolean().default(!1)});var W0=la({logType:"serial",fetchLogs:Zm,streamLogs:np},e=>({tail:e.tail,timestamps:e.timestamps})),Wd=b({path:["cvms","serial-logs"],meta:Gd,schema:Bd,handler:W0});import{z as di}from"zod";var Jd={name:"start",description:"Start a stopped CVM",stability:"stable",arguments:[G],options:[D],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"}]},Yd=di.object({cvmId:di.string().optional(),interactive:di.boolean().default(!1)});async function J0(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 Vt(()=>Ss(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:
|
|
147
|
+
${fe}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Start CVM",debug:!!e.debug}),1}}var Xd=b({path:["cvms","start"],meta:Jd,schema:Yd,handler:J0});import{z as ui}from"zod";var Zd={name:"stop",description:"Stop a running CVM",stability:"stable",arguments:[G],options:[D],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"}]},Qd=ui.object({cvmId:ui.string().optional(),interactive:ui.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 Vt(()=>Is(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:
|
|
148
|
+
${fe}/dashboard/cvms/app_${i.app_id}`),0)}catch(n){return t.failWithError(n,{operation:"Stop CVM",debug:!!e.debug}),1}}var eu=b({path:["cvms","stop"],meta:Zd,schema:Qd,handler:Y0});import nI from"fs";import tu from"fs";import nu from"path";import X0 from"inquirer";async function pa(e,t,n="file",r=process.cwd()){return(await X0.prompt([{type:"input",name:n,message:e,default:t,validate:a=>{let s=nu.resolve(r,a);return tu.existsSync(s)?!0:`File not found at ${s}`}}]))[n]}function da(e,t){for(let n of e){let r=nu.join(process.cwd(),n);if(tu.existsSync(r))return t?p.info(t.replace("{path}",r)):p.info(`File detected: ${r}`),n}}import*as ru from"fs";var ou=(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=ru.readFileSync(t,"utf8");for(let o of r.split(`
|
|
149
|
+
`)){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,d="",u=-1;for(let g=0;g<l.length;g++)if((l[g]==='"'||l[g]==="'"||l[g]==="`")&&(g===0||l[g-1]!=="\\"))m&&l[g]===d?(m=!1,d=""):m||(m=!0,d=l[g]);else if(l[g]==="#"&&!m&&g>0&&l[g-1]===" "){u=g-1;break}else if(l[g]==="#"&&!m&&g===0){u=g;break}u!==-1&&(l=l.substring(0,u)),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,`
|
|
150
|
+
`))):l=l.trim(),c&&(n[c]=l)}}return Object.entries(n).map(([r,o])=>({key:r,value:o}))};import{execSync as Ht,spawn as Z0}from"child_process";import*as re from"fs";import*as fi from"net";import*as Tt from"os";import*as ut from"path";var Ke={version:"0.5.3",baseUrl:"https://github.com/Dstack-TEE/dstack/releases/download/v0.5.3",installDir:ut.join(Tt.homedir(),".phala-cloud","simulator"),defaultLogPath:ut.join(Tt.homedir(),".phala-cloud","logs","dstack-simulator.log"),platforms:{darwin:{filename:"dstack-simulator-0.5.3-aarch64-apple-darwin.tgz",extractedFolder:"0.5.3",socketPath:ut.join(Tt.homedir(),".phala-cloud","simulator","0.5.3","dstack.sock")},linux:{filename:"dstack-simulator-0.5.3-x86_64-linux-musl.tgz",extractedFolder:"0.5.3",socketPath:ut.join(Tt.homedir(),".phala-cloud","simulator","0.5.3","dstack.sock")},win32:{filename:"dstack-simulator-0.5.3-x86_64-pc-windows-msvc.tgz",extractedFolder:"dstack-simulator-0.5.3-x86_64-pc-windows-msvc",socketPath:"127.0.0.1:8090"}}};function au(){try{if(!re.existsSync(Ke.installDir))return!1;let e=Tt.platform();if(!Ke.platforms[e])throw new Error(`Unsupported platform: ${e}`);let t=ut.join(Ke.installDir,Ke.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 ro(){let e=Tt.platform();if(!Ke.platforms[e])throw new Error(`Unsupported platform: ${e}. Only darwin, linux, and win32 are supported.`);return e}async function su(e){let t=n=>{p.info(n),e&&e(n)};try{let n=ro(),r=Ke.platforms[n];if(n==="win32"){try{Ht("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(Ke.installDir)||(p.info(`Creating installation directory at ${Ke.installDir}`),re.mkdirSync(Ke.installDir,{recursive:!0})),process.chdir(Ke.installDir);let o=`${Ke.baseUrl}/${r.filename}`;p.info(`Downloading simulator from ${o}`),Ht(`wget ${o}`,{stdio:"inherit"});let a=ut.join(Ke.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{Ht(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 gi=()=>ut.join(Tt.tmpdir(),"dstack-simulator.pid");function Q0(e){return Buffer.byteLength(e,"utf8")>104}function ua(){try{let e=gi();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 eI(e,t){try{let n=gi();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 iu(e={}){try{let t=ro(),n=Ke.platforms[t],r=ut.join(Ke.installDir,n.extractedFolder),o=ua();if(o)throw new Error(`Simulator is already running with PID: ${o}`);if(t!=="win32"&&Q0(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??Ke.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=Z0(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=`
|
|
222
151
|
=== Simulator started at ${new Date().toISOString()} ===
|
|
223
152
|
Command: ${a}
|
|
224
153
|
|
|
225
|
-
`;re.appendFileSync(s.logFilePath,m)}return c.pid&&
|
|
226
|
-
`),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let n=await E(t),r=await
|
|
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(`
|
|
154
|
+
`;re.appendFileSync(s.logFilePath,m)}return c.pid&&eI(c.pid,e.verbose),s.background&&(c.unref(),e.verbose&&p.success("Simulator is running in the background")),await tI(),c}catch(t){throw p.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function oo(){try{let e=ro(),t=Ke.platforms[e];if(e==="darwin"||e==="linux"){let n=t.socketPath;return re.existsSync(n)?new Promise(r=>{let o=fi.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=fi.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 cu(){try{let e=ua();if(!await oo()&&!e)return p.info("Simulator is not running"),!0;let n=ro(),r=!1;if(n==="win32")try{e?(p.info(`Stopping simulator process (PID: ${e})...`),process.kill(e,"SIGTERM")):Ht("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")):Ht("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=gi();if(re.existsSync(o))try{re.unlinkSync(o)}catch(a){p.warn("Failed to remove PID file:",a)}return await yi(),r&&p.success("Simulator stopped successfully"),r}catch(e){return p.error("Error stopping simulator:",e),!1}}function hi(){let e=ro(),t=Ke.platforms[e];return e==="win32"?"http://127.0.0.1:8090":`${t.socketPath||"/tmp/dstack.sock"}`}async function tI(e){try{let t=hi(),n=e||t;await Ht(`export DSTACK_SIMULATOR_ENDPOINT=${n}`);let r=n.replace(/dstack\.sock$/,"tappd.sock");return await Ht(`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 yi(){try{return await Ht("unset DSTACK_SIMULATOR_ENDPOINT"),await Ht("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 mr}from"zod";var lu={name:"upgrade",description:'Upgrade a CVM to a new version (use "phala deploy" instead)',stability:"deprecated",arguments:[G],options:[D,{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"}]},mu=mr.object({cvmId:mr.string().optional(),interactive:mr.boolean().default(!1),compose:mr.string().optional(),envFile:mr.string().optional(),debug:mr.boolean().default(!1)});async function rI(e){if(e.compose)return e.compose;let n=da(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");return pa("Enter the path to your Docker Compose file:",n,"file")}async function oI(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.
|
|
155
|
+
`),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let n=await E(t),r=await W(n,t.cvmId);if(!r.success)return t.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 rI(e),c="";if(i)try{c=nI.readFileSync(i,"utf8")}catch(h){return p.error(`Failed to read Docker Compose file: ${h instanceof Error?h.message:String(h)}`),1}await yi(),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=ou([],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 d={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},u=p.startSpinner(`Upgrading CVM app_${a}`),f=await Jm(a,d);return f?(u.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:
|
|
156
|
+
${fe}/dashboard/cvms/app_${a}`),0):(u.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 pu=b({path:["cvms","upgrade"],meta:lu,schema:mu,handler:oI});var fa={group:cd,commands:[pd,fd,bd,wd,Sd,Ad,Pd,jd,Kd,qd,Wd,Xd,eu,pu],subgroups:[]};import{z as j}from"zod";var du={name:"deploy",category:"deploy",description:"Deploy new CVM or update existing one",stability:"stable",arguments:[],options:[vn,cp,D,{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: ${oi}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. Reports the MrConfigV3 measurement after provision \u2014 its instance_id is minted on first boot, so before then only the document inputs are known.",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,Ye,{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:"[DEPRECATED] Inject a local public key via DSTACK_AUTHORIZED_KEYS. Prefer `phala ssh-keys add` and `phala ssh-keys grant`.",type:"string",target:"sshPubkey",deprecated:!0,group:"deprecated"},{name:"dev-os",description:"Use dev OS image (requires SSH key)",type:"boolean",target:"devOs",negatedName:"no-dev-os",group:"basic"},{name:"prepare-only",description:"Prepare the update and generate a commit token. Skips all on-chain operations. Intended for multisig workflows.",type:"boolean",target:"prepareOnly",group:"advanced"},{name:"commit",description:"Commit a previously prepared update using a commit token. Requires --token; --compose-hash and --transaction-hash are read from the token when omitted.",type:"boolean",target:"commit",group:"advanced"},{name:"token",description:"Commit token from a prepare-only update.",type:"string",target:"token",group:"advanced"},{name:"compose-hash",description:"Compose hash from a prepare-only update. Optional in --commit mode when the token can provide it.",type:"string",target:"composeHash",group:"advanced"},sr,{name:"public-logs",description:"Make CVM logs publicly accessible (default: true)",type:"boolean",target:"publicLogs",negatedName:"no-public-logs"},{name:"public-sysinfo",description:"Make CVM system info publicly accessible (default: true)",type:"boolean",target:"publicSysinfo",negatedName:"no-public-sysinfo"},{name:"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..."}]},uu=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 yu from"os";import zt from"path";function aI(e){let t=e.indexOf("=");if(t===-1)return!1;let n=e.substring(0,t);return n.includes("/")||n.includes("\\")?!1:/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)}function ga(e){let t={files:[],keyValues:[]};for(let n of e)if(aI(n)){let r=n.indexOf("="),o=n.substring(0,r),a=n.substring(r+1);t.keyValues.push({key:o,value:a})}else t.files.push(n);return t}function ha(e){let t=new Map;for(let n of e)t.set(n.key,n.value);return Array.from(t.entries()).map(([n,r])=>({key:n,value:r}))}function fu(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 gu(e){let t=fu(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 hu(e){let t=fu(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 bi from"dedent";import ft from"fs-extra";import ya from"inquirer";function sI(e,t){t&&(e.allow_force_stop=!0)}async function iI({context:e,apiToken:t,interactive:n}){let r=Pt(e,{apiToken:t});if(r.apiKey||r.bearerToken)return E(e,{apiToken:t});if(n){let{apiToken:o}=await ya.prompt([{type:"password",name:"apiToken",message:"Enter your API token:",validate:a=>a.trim()?!0:"API token is required"}]);return Wr(o,{baseURL:r.baseURL})}throw new Error("Authentication required. Run 'phala login', set PHALA_CLOUD_API_KEY, or set PHALA_OIDC_TOKEN for GitHub Actions OIDC deploy.")}async function cI({dockerComposePath:e,interactive:t}){if(!e)if(t){let r=da(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e=await pa("Enter the path to your Docker Compose file:",r,"file")}else throw new Error(bi(`
|
|
228
157
|
Docker Compose file is required.
|
|
229
158
|
|
|
230
159
|
Usage examples:
|
|
@@ -240,7 +169,7 @@ ${fe}/dashboard/cvms/app_${a}`),0):(d.stop(!1),p.error("Failed to upgrade CVM"),
|
|
|
240
169
|
--rpc-url <url> RPC URL for the blockchain
|
|
241
170
|
|
|
242
171
|
Run with --interactive for guided setup
|
|
243
|
-
`));if(!
|
|
172
|
+
`));if(!ft.existsSync(e))throw new Error(`Docker compose file not found: ${e}`);return ft.readFileSync(e,"utf8")}var lI=async(e,t)=>{let n=e.privateKey||process.env.PRIVATE_KEY;if(t&&!e.privateKey)if(e.interactive)n=(await ya.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 bu(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 mI=async e=>{let t=e.name;if(e.name){if(!Wn(e.name))throw new Error(`Invalid CVM name: "${e.name}". Name must be 5-63 characters, start with letter, and contain only letters/numbers/hyphens.`);return e.name}let n=zt.basename(process.cwd()),r=xl(n);return e.interactive?t=(await ya.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:r,validate:a=>a.trim()?Wn(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},pI=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=ft.readFileSync(e.envFile,{encoding:"utf8"});t.push(...Zn(n))}catch(n){throw new Error(`Error reading environment file ${e.envFile}: ${n instanceof Error?n.message:String(n)}`)}}if(e.env&&e.env.length>0){let n=ga(e.env);for(let r of n.files){let o=zt.resolve(process.cwd(),r);if(!ft.existsSync(o))throw new Error(`Environment file not found: ${r}`);try{let a=ft.readFileSync(o,{encoding:"utf8"});t.push(...Zn(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 ya.prompt([{type:"input",name:"envPath",message:"Enter the path to your environment file (leave empty to skip):",default:"",validate:r=>{if(!r||r.trim()==="")return!0;let o=zt.resolve(process.cwd(),r);return ft.existsSync(o)?!0:`File not found at ${o}`}}]);if(n.trim()){let r=zt.resolve(process.cwd(),n.trim()),o=ft.readFileSync(r,{encoding:"utf8"});t.push(...Zn(o))}}if(t.length!==0)return ha(t)},dI=async e=>{let t=e.sshPubkey;if(e.sshPubkey&&p.warn("--ssh-pubkey is deprecated. Register the key with `phala ssh-keys add` and manage per-CVM access with `phala ssh-keys grant`. Provision already authorizes all of your account keys by default, so this flag is usually unnecessary."),e.devOs!==!1){if(t){if(t.startsWith("~")&&(t=zt.join(yu.homedir(),t.slice(1))),!ft.existsSync(t))throw new Error(`SSH public key file not found: ${t}`)}else{let n=yu.homedir(),r=[zt.join(n,".ssh","id_rsa.pub"),zt.join(n,".ssh","id_ed25519.pub"),zt.join(n,".ssh","id_ecdsa.pub"),zt.join(n,".ssh","id_dsa.pub")];for(let o of r)if(ft.existsSync(o)){t=o;break}if(!t){if(e.devOs)throw new Error(bi(`
|
|
244
173
|
SSH public key is required for dev images but not found.
|
|
245
174
|
|
|
246
175
|
Searched for:
|
|
@@ -252,67 +181,67 @@ ${fe}/dashboard/cvms/app_${a}`),0):(d.stop(!1),p.error("Failed to upgrade CVM"),
|
|
|
252
181
|
Please either:
|
|
253
182
|
1. Create an SSH key pair: ssh-keygen -t rsa
|
|
254
183
|
2. Specify a different key file: --ssh-pubkey <path>
|
|
255
|
-
`));return}}try{let n=
|
|
256
|
-
`);let h=await
|
|
257
|
-
`);else{let
|
|
184
|
+
`));return}}try{let n=ft.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 uI=(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}),fI=(e,t,n,r,o,a,s)=>{let i={name:"",docker_compose_file:n,allowed_envs:r?.map(u=>u.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??bu(e);e.instanceType&&(c.instance_type=e.instanceType),e.vcpu&&(c.vcpu=Number(e.vcpu)),e.memory&&(c.memory=gu(e.memory)),e.diskSize&&(c.disk_size=hu(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 d=l==="ETHEREUM"||l==="BASE";if(e.devOs===!0?c.prefer_dev=!0:(e.devOs===!1||d)&&(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 u=Number(e.nonce);if(Number.isNaN(u))throw new Error(`Invalid nonce value: "${e.nonce}". Nonce must be a valid number.`);c.nonce=u}if(e.nonce&&!e.customAppId)throw new Error("--nonce requires --custom-app-id to be specified.");return c},gI=(e,t)=>{if(e.compose_hash){if(e.instance_id){let n=om(e);p.info(`mr_config_id (v3): ${am(n)}`),p.info(`mr_config document: ${Ms(n)}`);return}p.info("mr_config_id (v3): finalized on first boot (instance_id)"),p.info(` compose_hash: ${e.compose_hash}`),p.info(` app_id: ${e.app_id||"(not assigned)"}`),p.info(` key_provider: ${e.key_provider}`),p.info(` key_provider_id: ${e.key_provider_id||"(none)"}`),t&&p.info(" gpu_policy_hash: bound at boot when the node attaches GPUs")}},hI=async(e,t,n,r,o,a,s,i)=>{let c=bu(e),l=await mI(e),m=await dI(e),d=[...n||[]];m&&d.push({key:"DSTACK_AUTHORIZED_KEYS",value:m});let u=uI(e,s),f=fI(e,l,t,d,u,c,i);o.write(`Provisioning CVM ${l}...
|
|
185
|
+
`);let h=await vs(r,f);if(!h.success)throw h.error;let g=h.data,y,k=g.kms_info;if(!g.app_id&&!!k?.chain_id&&!!k?.kms_contract_address){if(!k?.chain_id||!k?.chain)throw new Error("KMS chain info is missing from provision response. Please retry or contact support.");if(!k?.kms_contract_address)throw new Error("KMS contract address is missing from provision response. Please retry or contact support.");let S=await lI(e,k.chain_id),C=await cm({chain:k.chain,rpcUrl:e.rpcUrl,kmsContractAddress:k.kms_contract_address,privateKey:S,deviceId:g.device_id,composeHash:g.compose_hash});if(!C.success)throw C.error??new Error("Deployment contract failed");let A=C.data,x=k.slug||k.id;if(!x)throw new Error("KMS reference (slug or id) is missing from provision response");let N=await Or(r,{app_id:A.appId,kms:x});if(!N.success)throw N.error;let T=si(N.data,A.appId,k.k256_pubkey),X=await qe(d,T);y=await xo(r,{app_id:A.appId,encrypted_env:X,compose_hash:g.compose_hash,kms_id:x,contract_address:A.appAuthAddress,deployer_address:A.deployer})}else{let S=d&&d.length>0?await qe(d,g.app_env_encrypt_pubkey):void 0;y=await xo(r,{app_id:g.app_id,encrypted_env:S,compose_hash:g.compose_hash,kms_id:c.deprecatedKmsId})}if(!y.success)throw y.error;let I=y.data;if(e.experimentalKeyProviderType&&gI({app_id:I.app_id||g.app_id||"",compose_hash:g.compose_hash||"",key_provider:e.experimentalKeyProviderType,key_provider_id:k?.k256_pubkey||"",instance_id:I.instance_id||""},!!e.instanceType),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)}
|
|
186
|
+
`);else{let S=bi`
|
|
258
187
|
CVM created successfully!
|
|
259
188
|
|
|
260
189
|
CVM ID: ${I.vm_uuid}
|
|
261
190
|
Name: ${I.name}
|
|
262
191
|
App ID: ${I.app_id}
|
|
263
192
|
Dashboard URL: ${fe}/dashboard/cvms/${I.vm_uuid}
|
|
264
|
-
`;o.write(`${
|
|
265
|
-
`)}},
|
|
266
|
-
`):p.warn(f);return}if(
|
|
267
|
-
`);else{let
|
|
193
|
+
`;o.write(`${S}
|
|
194
|
+
`)}},yI=async(e,t,n,r,o,a,s)=>{let i=await W(r,{id:e.uuid});if(!i.success)throw i.error;let c=i.data,l;if(n&&n.length>0){let f=await $t(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),sI(m,e.forceStop),e.prepareOnly&&(m.prepareOnly=!0),p.info(`Updating CVM ${e.uuid}...`);let d=await um(r,m);if(!d.success)throw d.error;let u=d.data;if(e.prepareOnly&&!u.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)}
|
|
195
|
+
`):p.warn(f);return}if(u.requiresOnChainHash){if(e.prepareOnly){let S=u.kmsInfo?.chain_id,C=u.kmsInfo?.chain,A=c.app_id,x=C?.blockExplorers?.default?.url,N=x&&A?`${x}/address/${A.startsWith("0x")?A:`0x${A}`}`:void 0,T=u.composeHash.startsWith("0x")?u.composeHash:`0x${u.composeHash}`,X=u.onchainStatus,me={success:!0,prepare_only:!0,compose_hash:T,app_id:c.app_id,device_id:u.deviceId,kms_info:u.kmsInfo,chain_id:S,contract_explorer_url:N,onchain_status:X,commit_token:u.commitToken,commit_url:u.commitUrl,api_commit_url:u.apiCommitUrl};if(e.json!==!1)o.write(`${JSON.stringify(me,null,2)}
|
|
196
|
+
`);else{let Q=["CVM update prepared successfully (pending on-chain approval).","",`Compose Hash: ${T}`,`App ID: ${c.app_id}`,`Device ID: ${u.deviceId}`];if(S&&Q.push(`Chain: ${C?.name||"Unknown"} (ID: ${S})`),N&&Q.push(`Contract: ${N}`),Q.push(`Commit Token: ${u.commitToken||"N/A"}`,`Commit URL: ${u.commitUrl||"N/A"}`,`API Commit URL: ${u.apiCommitUrl||"N/A"} (POST)`),X){let te=X.compose_hash_allowed?"registered":"NOT registered",M=X.device_id_allowed?"registered":"NOT registered";Q.push("","On-chain Status:",` Compose Hash: ${te}`,` Device ID: ${M}`),X.is_allowed&&Q.push(" All prerequisites met. You can commit with --transaction-hash already-registered.")}Q.push("","To complete the update after on-chain approval:",` phala deploy --cvm-id ${e.uuid} \\`," --commit \\",` --token ${u.commitToken||"<token>"} \\`,` --compose-hash ${T} \\`," --transaction-hash <tx-hash>"),o.write(`${Q.join(`
|
|
268
197
|
`)}
|
|
269
|
-
`)}return}if(!e.privateKey)throw new Error("Private key is required for contract DstackApp");e.debug&&(console.log("[DEBUG] patchCvm.composeHash:",
|
|
198
|
+
`)}return}if(!e.privateKey)throw new Error("Private key is required for contract DstackApp");e.debug&&(console.log("[DEBUG] patchCvm.composeHash:",u.composeHash),console.log("[DEBUG] cvm.app_id:",c.app_id),console.log("[DEBUG] patchCvm.deviceId:",u.deviceId));let f=c.kms_info?.chain_id,h=f!=null?At[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 yn({chain:h,rpcUrl:e.rpcUrl,appAddress:c.app_id,deviceId:u.deviceId,composeHash:u.composeHash});if(!g.success){let S=g.error;throw new Error(`Failed to check on-chain prerequisites (contract: ${c.app_id}): ${S.message}`)}if(e.debug&&console.log("[DEBUG] prereqs:",g.data),!g.data.deviceAllowed){p.info("Device not registered on-chain, adding...");let S=await en({chain:h,rpcUrl:e.rpcUrl,appAddress:c.app_id,deviceId:u.deviceId,privateKey:e.privateKey});if(!S.success){let C=S.error;throw new Error(`Failed to register device on-chain (device: ${u.deviceId.slice(0,10)}...): ${C.message}`)}}let y=await Qt({chain:h,rpcUrl:e.rpcUrl,appId:c.app_id,composeHash:u.composeHash,privateKey:e.privateKey});if(!y.success){let S=y.error;throw new Error(`Failed to register compose hash on-chain (hash: ${u.composeHash.slice(0,10)}...): ${S.message}`)}let v=y.data.transactionHash;e.debug&&console.log("[DEBUG] transactionHash:",v);let I=await fm(r,{id:e.uuid,composeHash:u.composeHash,transactionHash:v});if(!I.success){let S=I.error.message,C="status"in I.error?I.error.status:void 0;throw C===466?new Error("Compose hash expired. Please retry the update from the beginning."):C===467?new Error(`Transaction verification failed on backend. Hash: ${v}`):C===468?new Error(`Compose hash not found on-chain. Contract: ${c.app_id}`):new Error(`Failed to confirm CVM update after on-chain registration: ${S}`)}}if(e.wait){p.info("Waiting for update to complete...");try{await ma(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)}
|
|
270
199
|
`):o.write(`CVM updated successfully!
|
|
271
|
-
`)},
|
|
200
|
+
`)},bI=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 gm(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)}
|
|
272
201
|
`):n.write(`CVM update committed successfully! Correlation ID: ${r.data.correlationId}
|
|
273
|
-
`)};async function
|
|
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
|
|
275
|
-
`):"";if(s.result?.isError)throw new Error(c||"Docs tool call failed");return c}function
|
|
202
|
+
`)};async function vu(e,t){try{if(e.commit){let f=await E(t,{apiToken:e.apiToken}),h=t.cvmId?F.parse(t.cvmId).cvmId:void 0;await bI({...e,uuid:h},f,t.stdout);return}let n=e.compose||t.projectConfig.compose_file,r=await iI({context:t,apiToken:e.apiToken,interactive:e.interactive}),o=await cI({dockerComposePath:n,interactive:e.interactive}),a;if(e.preLaunchScript){if(!ft.existsSync(e.preLaunchScript))throw new Error(`Pre-launch script file not found: ${e.preLaunchScript}`);a=ft.readFileSync(e.preLaunchScript,"utf8")}let s=Buffer.byteLength(o,"utf8"),i=a?Buffer.byteLength(a,"utf8"):0,c=s+i;if(c>Lr){let f=Lr/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 pI(l);e.debug&&(console.log("[DEBUG] context.cvmId:",JSON.stringify(t.cvmId)),console.log("[DEBUG] input.cvmId:",e.cvmId));let d=t.cvmId?F.parse(t.cvmId).cvmId:void 0;return e.debug&&(console.log("[DEBUG] resolved uuid:",d),console.log("[DEBUG] isUpdate:",!!d)),!!d?await yI({...e,uuid:d},o,m,r,t.stdout,t,a):await hI(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.":"Include the Request ID when contacting support."}),1}}async function vI(e,t){return vu(e,t)}var Cu=b({path:["deploy"],meta:du,schema:uu,handler:vI});var wu={path:["docs"],meta:{name:"docs",category:"advanced",description:"Search and read the live Phala documentation (docs.phala.com) from the terminal",stability:"unstable"}};var CI="https://docs.phala.com/mcp",wI=6e4;function _u(e=process.env){return e.PHALA_DOCS_MCP_URL||CI}function _I(e){let t=e.trim();if(t.startsWith("{"))return JSON.parse(t);let n;for(let r of t.split(`
|
|
203
|
+
`))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 ao(e,t,n={}){let r=n.url??_u(),o=n.timeoutMs??wI,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=_I(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(`
|
|
204
|
+
`):"";if(s.result?.isError)throw new Error(c||"Docs tool call failed");return c}function kI(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
205
|
`)){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
206
|
`),stderr:s.join(`
|
|
278
|
-
`)}}async function
|
|
279
|
-
`),0)}catch(o){return t.fail(o instanceof Error?o.message:String(o)),1}}var
|
|
207
|
+
`)}}async function pr(e,t={}){let n=await ao("query_docs_filesystem_phala",{command:e},t);return kI(n)}function In(e){return`'${e.replace(/'/g,"'\\''")}'`}function Mt(e){return{url:_u(e.env),timeoutMs:Br(e)*1e3}}function cn(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 so}from"zod";var ku={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:[ee],examples:[{name:"Report an outdated page",value:'phala docs feedback /phala-cloud/getting-started "The login example still shows the deprecated auth command"'}]},Su=so.object({page:so.string().min(1),message:so.array(so.string()).min(1),json:so.boolean().default(!1)});async function SI(e,t){let n=cn(e.page).replace(/\.mdx$/,""),r=e.message.join(" ");try{let o=await ao("submit_feedback",{path:n,feedback:r},Mt(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."}
|
|
208
|
+
`),0)}catch(o){return t.fail(o instanceof Error?o.message:String(o)),1}}var Iu=b({path:["docs","feedback"],meta:ku,schema:Su,handler:SI});import{z as io}from"zod";var Eu={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"},ee],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"}]},Au=io.object({pattern:io.string().min(1),path:io.string().optional(),files:io.boolean().default(!1),json:io.boolean().default(!1)});async function II(e,t){let n=e.path?cn(e.path):"/",r=e.files?"-Sl":"-Sn";try{let o=await pr(`rg ${r} -e ${In(e.pattern)} ${In(n)}`,Mt(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
209
|
`)?a:`${a}
|
|
281
210
|
`),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
|
|
211
|
+
`),0)}catch(o){return t.fail(o instanceof Error?o.message:String(o)),1}}var Ru=b({path:["docs","grep"],meta:Eu,schema:Au,handler:II});import{z as ba}from"zod";var xu={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:[ee],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"}]},Pu=ba.object({pages:ba.array(ba.string()).min(1),json:ba.boolean().default(!1)});function EI(e){return/\.[a-z0-9]+$/i.test(e)?[e]:[`${e}.mdx`,e,`${e}/index.mdx`]}async function AI(e,t){let n=cn(e),r=EI(n),o=null;for(let s of r){let i=await pr(`cat ${In(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 RI(e,t){let n=Mt(t);try{let r=[];for(let a of e.pages)r.push(await AI(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
212
|
`),a.content!==null?t.stdout.write(a.content.endsWith(`
|
|
284
213
|
`)?a.content:`${a.content}
|
|
285
214
|
`):t.stderr.write(`${a.error}
|
|
286
215
|
`),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
|
|
216
|
+
`);return o.length>0?1:0}catch(r){return t.fail(r instanceof Error?r.message:String(r)),1}}var $u=b({path:["docs","read"],meta:xu,schema:Pu,handler:RI});import{z as va}from"zod";var Tu={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:[ee],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'}]},Mu=va.object({query:va.array(va.string()).min(1),json:va.boolean().default(!1)});async function xI(e,t){let n=e.query.join(" ");try{let r=await ao("search_phala",{query:n},Mt(t));return e.json?(t.success({query:n,results:r}),0):r.trim()?(t.stdout.write(r.endsWith(`
|
|
288
217
|
`)?r:`${r}
|
|
289
218
|
`),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
|
|
219
|
+
`),0)}catch(r){return t.fail(r instanceof Error?r.message:String(r)),1}}var Du=b({path:["docs","search"],meta:Tu,schema:Mu,handler:xI});import{z as Ca}from"zod";var Uu={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"},ee],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"}]},Lu=Ca.object({path:Ca.string().optional(),depth:Ca.coerce.number().int().min(1).max(10).default(2),json:Ca.boolean().default(!1)});async function PI(e,t){let n=e.path?cn(e.path):"/";try{let r=await pr(`tree ${In(n)} -L ${e.depth}`,Mt(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
220
|
`)?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
|
|
293
|
-
`),0}catch(n){return t.fail(n instanceof Error?n.message:String(n)),1}}var
|
|
221
|
+
`),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 Nu=b({path:["docs","tree"],meta:Uu,schema:Lu,handler:PI});var vi={group:wu,commands:[Du,$u,Nu,Ru,Iu]};var Ou={path:["envs"],meta:{name:"envs",category:"manage",description:"Encrypt and update CVM sealed environment variables",stability:"stable"}};import ju from"fs";import $I from"path";function wa(e){let t=ga(e),n=[];for(let r of t.files){let o=$I.resolve(r);if(!ju.existsSync(o))throw new Error(`Environment file not found: ${r}`);let a=ju.readFileSync(o,"utf8"),s=Zn(a);n.push(...s)}return n.push(...t.keyValues),ha(n)}import{z as dr}from"zod";var Fu={name:"encrypt",description:"Encrypt environment variables for a CVM (sealed, only readable inside TEE)",stability:"stable",arguments:[G],options:[D,{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"}]},Vu=dr.object({cvmId:dr.string().optional(),env:dr.array(dr.string()).min(1,"At least one -e argument is required"),noNewline:dr.boolean().default(!1),interactive:dr.boolean().default(!1)});async function TI(e,t){if(!t.cvmId)return t.fail("No CVM ID provided. Pass a CVM identifier or set it in phala.toml."),1;try{let n=wa(e.env);if(n.length===0)return t.fail("No environment variables found in the provided inputs."),1;let r=await E(t),o=await W(r,t.cvmId);if(!o.success)return t.failWithError(o.error.cause??o.error,{operation:"Encrypt envs",debug:!!e.debug}),1;let a=o.data,s=await $t(r,a),i=await qe(n,s);return process.stdout.write(e.noNewline?i:`${i}
|
|
222
|
+
`),0}catch(n){return t.fail(n instanceof Error?n.message:String(n)),1}}var Ku=b({path:["envs","encrypt"],meta:Fu,schema:Vu,handler:TI});import{z as ln}from"zod";var Hu={name:"update",description:"Encrypt and push sealed environment variables to a CVM (only readable inside TEE)",stability:"stable",arguments:[G],options:[D,{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,Ye],examples:[{name:"Update with inline variables",value:"phala envs update app_abc123 -e SECRET=newvalue -e API_KEY=xxx"},{name:"Update from env file",value:"phala envs update app_abc123 -e .env.production"},{name:"Update with CVM from phala.toml",value:"phala envs update -e .env"},{name:"Update with pre-encrypted hex (from 'phala envs encrypt')",value:"phala envs update app_abc123 --encrypted-env $(phala envs encrypt app_abc123 -e .env)"},{name:"Update with on-chain KMS",value:"phala envs update app_abc123 -e .env --private-key <key>"}]},zu=ln.object({cvmId:ln.string().optional(),env:ln.array(ln.string()).optional(),encryptedEnv:ln.string().optional(),privateKey:ln.string().optional(),rpcUrl:ln.string().optional(),interactive:ln.boolean().default(!1)});async function MI(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};if(!t.cvmId)return t.fail("No CVM ID provided. Pass a CVM identifier or set it in phala.toml."),1;let r=n.env&&n.env.length>0,o=!!n.encryptedEnv;if(!r&&!o)return t.fail("Provide either -e (environment variables) or --encrypted-env (pre-encrypted hex)."),1;if(r&&o)return t.fail("Cannot use both -e and --encrypted-env at the same time."),1;try{let a=await E(t),s=await W(a,t.cvmId);if(!s.success)return t.failWithError(s.error.cause??s.error,{operation:"Update envs",debug:!!n.debug}),1;let i=s.data,c,l;if(r&&n.env){let u=wa(n.env);if(u.length===0)return t.fail("No environment variables found in the provided inputs."),1;l=u.map(h=>h.key);let f=await $t(a,i);c=await qe(u,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 Po(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 d=m.data;if(d.status==="in_progress")return p.success(`Environment update initiated (correlation_id: ${d.correlation_id})`),0;if(d.status==="precondition_required"){let u=n.privateKey||process.env.PRIVATE_KEY;if(!u)return t.fail("On-chain KMS requires a private key. Use --private-key or set PRIVATE_KEY env var."),1;p.info("Environment key list changed \u2014 registering compose hash on-chain...");let f=d.kms_info.chain;if(!f)return t.fail(`Unsupported chain_id ${d.kms_info.chain_id} \u2014 update @phala/cloud to add support.`),1;let h=await Qt({chain:f,rpcUrl:n.rpcUrl,appId:d.app_id,composeHash:d.compose_hash,privateKey:u});if(!h.success){let k=h;return t.failWithError(k.error??h,{operation:"Update envs",debug:!!n.debug}),1}let g=h.data;p.info("Completing environment update...");let y=await Po(a,{id:i.id,encrypted_env:c,env_keys:l,compose_hash:d.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: ${d.status}`),1}catch(a){return t.fail(a instanceof Error?a.message:String(a)),1}}var qu=b({path:["envs","update"],meta:Hu,schema:zu,handler:MI});var Ci={group:Ou,commands:[Ku,qu]};import{z as Gu}from"zod";function DI(){let e=[{name:"List available help topics",value:"phala help"}];for(let t of Object.values(nn))e.push({name:`Show "${t.name}" topic`,value:`phala help ${t.name}`});return e}var Bu={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:DI()},Wu=Gu.object({topic:Gu.string().optional()});function UI(){let e=Object.values(nn);if(e.length===0)return`This build contains no help topics.
|
|
294
223
|
`;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(`
|
|
295
224
|
`)}
|
|
296
|
-
`}async function
|
|
225
|
+
`}async function LI(e,t){if(!e.topic)return t.stdout.write(UI()),0;let n=e.topic.trim().toLowerCase(),r=nn[n];if(!r){let a=Object.keys(nn).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(`
|
|
297
226
|
`)?r.content:`${r.content}
|
|
298
|
-
`;return t.stdout.write(o),0}var
|
|
299
|
-
`)}async function
|
|
300
|
-
`),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,i=e.profile||s||"default";return
|
|
301
|
-
`)),0}catch(n){return t.failWithError(n,{operation:"Login",debug:!!e.debug}),1}}var
|
|
302
|
-
`),await
|
|
303
|
-
`),await
|
|
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(`
|
|
227
|
+
`;return t.stdout.write(o),0}var Ju=b({path:["help"],meta:Bu,schema:Wu,handler:LI});import ka from"path";import nf from"fs-extra";import bt from"chalk";import Si from"inquirer";import co from"chalk";import NI from"open";import OI from"ora";import jI from"prompts";import{z as En}from"zod";var Yu={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"}]},Xu=En.object({apiKey:En.string().min(1,"API key cannot be empty").optional(),manual:En.boolean().optional(),noOpen:En.boolean().optional(),profile:En.string().min(1).optional(),printToken:En.boolean().optional(),url:En.string().url().optional()});function Zu(e){let{detail:t}=e;if(t&&typeof t=="object"&&!Array.isArray(t)){let n=t;if(n.error&&typeof n.error=="string"&&!n.error_code)return{error:n.error,error_description:typeof n.error_description=="string"?n.error_description:void 0}}return null}function mn(e,t=""){e.write(`${t}
|
|
228
|
+
`)}async function ur(e){let t=await Wr(e.apiKey,{baseURL:e.baseURL}),n=await He(t);if(!n.success||!n.data?.user.username)throw new Error("Invalid API key");return n.data}async function wi(e){let t,n=await jI({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 ur({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 ur({apiKey:n.apiKey,baseURL:e.baseURL})),{apiKey:n.apiKey,user:t}}async function _i(e,t){let n=jt({useCookieAuth:!0,baseURL:t.baseURL,headers:{"User-Agent":Ft}}),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,d=t.printToken?e.stderr:e.stdout;if(mn(d),mn(d,co.bold("To authenticate, visit:")),mn(d,co.cyan(l)),mn(d),mn(d,`${co.bold("And enter code:")} ${co.yellow(a)}`),mn(d),!t.noOpen)try{await NI(l),mn(d,"Opening browser automatically...")}catch{mn(d,"Could not open browser automatically. Please visit the URL above.")}let u=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 u.succeed("Authorization successful!"),h.access_token}catch(h){if(h instanceof Et)throw u.stop(),new Error(cl(h));if(h instanceof Ro){let g=Zu(h);if(g)switch(g.error){case"authorization_pending":continue;case"slow_down":m+=5;continue;case"expired_token":throw u.fail("Authorization expired"),new Error(g.error_description||"Device authorization expired. Please try again.");case"access_denied":throw u.fail("Authorization denied"),new Error(g.error_description||"You denied the authorization request.");default:throw u.fail("Authorization failed"),new Error(`Authorization failed: ${g.error_description||g.error}`)}}throw u.fail("Request failed"),h}}throw u.fail("Authorization timed out"),new Error("Authorization timed out. Please try again.")}async function _a(e,t){try{if(e.printToken&&e.manual)throw new Error("--print-token is not compatible with --manual");let n=e.url||t.env.PHALA_CLOUD_API_PREFIX||Rt,r,o;if(e.apiKey)r=e.apiKey,o=await ur({apiKey:r,baseURL:n});else if(e.manual){let c=await wi({baseURL:n});r=c.apiKey,o=c.user}else r=await _i(t,{noOpen:e.noOpen,printToken:e.printToken,baseURL:n}),o=await ur({apiKey:r,baseURL:n});if(!o)throw new Error("Failed to validate API key");if(e.printToken)return t.stdout.write(`${r}
|
|
229
|
+
`),0;let a=o.workspace.name||"default",s=o.workspace.slug||void 0,i=e.profile||s||"default";return rr({profileName:i,token:r,apiPrefix:n,workspaceName:a,workspaceSlug:s,user:{username:o.user.username,email:o.user.email},setCurrent:!0}),t.stdout.write(co.green(`Welcome ${o.user.username}! Credentials saved successfully (profile: ${i})
|
|
230
|
+
`)),0}catch(n){return t.failWithError(n,{operation:"Login",debug:!!e.debug}),1}}var Qu=b({path:["login"],meta:Yu,schema:Xu,handler:_a});import{z as ki}from"zod";var FI={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},ef={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:[FI],examples:[{name:"Link by name or ID",value:"phala link my-cvm-name"},{name:"Link interactively",value:"phala link"}]},tf=ki.object({cvmId:ki.string().optional(),json:ki.boolean().default(!1)});function VI(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function rf(){let e=["docker-compose.yml","docker-compose.yaml"];for(let t of e)if(nf.existsSync(ka.join(process.cwd(),t)))return t}function of(){let e=".env.production";if(nf.existsSync(ka.join(process.cwd(),e)))return e}var KI=/^(0x)?[0-9a-f]{40}$/i;function HI(e){return KI.test(e)}function zI(e){return e.replace(/^0x/i,"").toLowerCase()}async function Ii(e){let t=Pt(e);if(!t.apiKey){if(p.info(`Not authenticated. Starting login flow...
|
|
231
|
+
`),await _a({manual:!1,noOpen:!1},e)!==0||(t=Pt(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 He(r);if(!o.success){if(p.info(`API key expired or invalid. Starting login flow...
|
|
232
|
+
`),await _a({manual:!1,noOpen:!1},e)!==0||(t=Pt(e),!t.apiKey))return null;let s=await E(e),i=await He(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 af(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),Hs(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(),p.success("Project linked successfully!"),p.info('Run "phala deploy" to update your CVM.')}async function qI(e,t){try{if(e.cvmId)return await BI(e.cvmId,t);if(qr()){let n=Qn();if(n.cvm_id&&!n.app_id)return await GI(n,t)}return await WI(t)}catch(n){if(VI(n))return console.log(),p.info("Link cancelled."),0;throw n}}async function GI(e,t){if(!await Ii(t))return t.fail("Authentication failed."),1;let r=await E(t),o=await W(r,{id:e.cvm_id});if(!o.success)return t.fail(`Failed to fetch CVM info for ${e.cvm_id}: ${o.error?.message||"Unknown error"}`),1;let a=o.data;if(!a.app_id)return 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 Hs(c),p.success(`Updated phala.toml with app_id = "${a.app_id}"`),0}async function BI(e,t){let n=await Ii(t);if(!n)return t.fail("Authentication failed."),1;let r=n.profileName,o=await E(t),a,s;if(HI(e)){let l=zI(e),m=await Sm(o,{appId:l});if(!m.success)return t.fail(`App not found: ${l}`),1;let d=m.data;s=d.app_id,a=d.current_cvm?.name||d.name||ka.basename(process.cwd()),p.success(`Found app: ${s}`)}else{let l=await W(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(qr()){let{overwrite:l}=await Si.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!l)return p.info("Link cancelled."),0}let i=rf(),c=of();return(i||c)&&(console.log(),p.info("Detected local files:"),i&&console.log(bt.green(` \u2713 ${i}`)),c&&console.log(bt.green(` \u2713 ${c}`))),af({cvmName:a,appId:s,composeFile:i,envFile:c,profile:r}),0}async function WI(e){let t=await Ii(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 Nr(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=ka.basename(process.cwd()),l=i.map(g=>{let y=g.hosted?.app_id||g.hosted?.id||"",k=g.name||g.hosted?.name||"Unnamed",v=g.status||g.hosted?.status||"Unknown",I=g.hosted?.app_id||void 0;return{name:`${k} (${y}) - Status: ${v}`,value:k,cvmName:k,appId:I}}),m=l.findIndex(g=>g.cvmName.toLowerCase()===c.toLowerCase());console.log(bt.bold(`Found ${i.length} CVM(s):
|
|
233
|
+
`));let{selectedCvm:d}=await Si.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(qr()){let{overwrite:g}=await Si.prompt([{type:"confirm",name:"overwrite",message:"phala.toml already exists. Overwrite?",default:!1}]);if(!g)return p.info("Link cancelled."),0}let u=rf(),f=of();console.log(),(u||f)&&(p.info("Detected local files:"),u&&console.log(bt.green(` \u2713 ${u}`)),f&&console.log(bt.green(` \u2713 ${f}`)),console.log());let h=l.find(g=>g.value===d);return af({cvmName:d,appId:h?.appId,composeFile:u,envFile:f,profile:n}),0}var sf=b({path:["link"],meta:ef,schema:tf,handler:qI});import{z as JI}from"zod";var cf={name:"logout",category:"profile",description:"Remove stored API key",stability:"stable"},lf=JI.object({});async function YI(e,t){let n=t.globalOptions?.json===!0;try{let r=xe(),o=r?.current_profile,a=o?r?.profiles[o]:void 0,s=!1;if(a?.token){let c=await ar({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}`)}Oo();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 mf=b({path:["logout"],meta:cf,schema:lf,handler:YI});var pf={path:["kms"],meta:{name:"kms",category:"deploy",description:"Manage on-chain KMS contracts",stability:"unstable"}};import{z as df}from"zod";var uf={name:"list",aliases:["ls"],description:"List KMS contracts",stability:"unstable",options:[ee],examples:[{name:"List KMS contracts",value:"phala kms list"},{name:"Output as JSON",value:"phala kms list --json"}]},Ei=df.object({json:df.boolean().default(!1)});var XI={0:"phala",1:"ethereum",8453:"base",31337:"anvil"};function ZI(e){return XI[e]??`chain-${e}`}async function ff(e,t){try{let n=await E(t),r=await Cs(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:ZI(i.chain_id),CONTRACT_ADDRESS:i.contract_address,NODES:String(i.node_count)}));return ie(a,s),0}catch(n){return t.failWithError(n,{operation:"List KMS",debug:!!e.debug}),1}}var QI={name:"kms",description:"List and manage KMS contracts",stability:"unstable"},gf=b({path:["kms","list"],meta:uf,schema:Ei,handler:ff}),hf=b({path:["kms"],meta:QI,schema:Ei,handler:ff});import{z as Ai}from"zod";var eE={name:"slug",description:"KMS contract slug (e.g. phala, base, ethereum)",required:!0,target:"slug"},yf={name:"nodes",description:"List the KMS nodes (with RPC url) under a contract",stability:"unstable",arguments:[eE],options:[ee],examples:[{name:"List nodes of the phala KMS contract",value:"phala kms nodes phala"},{name:"Output as JSON",value:"phala kms nodes phala --json"}]},bf=Ai.object({slug:Ai.string(),json:Ai.boolean().default(!1)});async function tE(e,t){try{let n=await E(t),r=await _s(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 ie(a,s),0}catch(n){return t.failWithError(n,{operation:"List KMS nodes",debug:!!e.debug}),1}}var vf=b({path:["kms","nodes"],meta:yf,schema:bf,handler:tE});import{z as Cf}from"zod";var Ri=e=>({name:e,description:`Show on-chain KMS details for ${e}`,stability:"unstable",options:[ee],examples:[{name:`Show ${e} KMS details`,value:`phala kms ${e}`},{name:"Output as JSON",value:`phala kms ${e} --json`}]}),Sa=Cf.object({json:Cf.boolean().default(!1)});var nE={1:"https://etherscan.io",8453:"https://basescan.org"};function wf(e,t){let n=nE[e];return n?`${n}/address/${t}`:null}function _f(e){return e===!0?"yes":e===!1?"no":"-"}function fr(e){return e?e.startsWith("0x")?e:`0x${e}`:"-"}var rE=13;function qt(e,t){console.log(`${e.padEnd(rE)}${t}`)}function oE(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 kf(e){return async function(n,r){try{let o=await E(r),a=await Ts(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=wf(i.chain_id,i.contract_address);if(l&&qt("",l),i.gateway_contract_address){qt("Gateway",i.gateway_contract_address);let m=wf(i.chain_id,i.gateway_contract_address);m&&qt("",m)}if(qt("K256 pubkey",fr(i.k256_pubkey)),qt("CA pubkey",fr(i.ca_pubkey)),console.log(""),console.log("Devices (nodes currently hosting this KMS)"),i.devices.length>0){let m=["DEVICE_ID","NODE","ON_CHAIN"],d=i.devices.map(u=>({DEVICE_ID:fr(u.device_id),NODE:typeof u.node_name=="string"&&u.node_name.length>0?u.node_name:"-",ON_CHAIN:_f(u.on_chain_allowed)}));ie(m,d)}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"],d=[...i.os_images].sort((u,f)=>oE(u.version,f.version)).map(u=>({NAME:u.name,VERSION:u.version,OS_IMAGE_HASH:fr(u.os_image_hash),ON_CHAIN:_f(u.on_chain_allowed)}));ie(m,d)}else console.log(" none")}),0)}catch(o){return r.failWithError(o,{operation:"List KMS chains",debug:!!n.debug}),1}}}var Sf=b({path:["kms","ethereum"],meta:Ri("ethereum"),schema:Sa,handler:kf("ethereum")}),If=b({path:["kms","base"],meta:Ri("base"),schema:Sa,handler:kf("base")});async function aE(e,t){try{let n=await E(t),r=await ws(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",fr(o.k256_pubkey)),qt("CA pubkey",fr(o.ca_pubkey)),0)}catch(n){return t.failWithError(n,{operation:"List KMS chains",debug:!!e.debug}),1}}var Ef=b({path:["kms","phala"],meta:{name:"phala",description:"Show the off-chain Phala KMS root keys",stability:"unstable",options:[ee],examples:[{name:"Show Phala KMS keys",value:"phala kms phala"},{name:"Output as JSON",value:"phala kms phala --json"}]},schema:Sa,handler:aE});var xi={group:pf,commands:[hf,gf,vf,Sf,If,Ef]};var Af={path:["nodes"],meta:{name:"nodes",category:"deploy",description:"Manage TEE nodes",stability:"unstable"}};import{z as Ia}from"zod";var Rf={name:"list",aliases:["ls"],description:"List workspace nodes",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},ee],examples:[{name:"List nodes (page 1)",value:"phala nodes list"},{name:"List nodes (page 2)",value:"phala nodes list --page 2"},{name:"Output as JSON",value:"phala nodes list --json"}]},Pi=Ia.object({page:Ia.coerce.number().int().min(1).default(1),pageSize:Ia.coerce.number().int().min(1).max(100).default(30),json:Ia.boolean().default(!1)});async function xf(e,t){try{let n=await E(t),r=await He(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 dm(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):(ie(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 sE={name:"nodes",description:"List and manage TEE nodes",stability:"unstable"},Pf=b({path:["nodes","list"],meta:Rf,schema:Pi,handler:xf}),$f=b({path:["nodes"],meta:sE,schema:Pi,handler:xf});var $i={group:Af,commands:[$f,Pf]};import{z as An}from"zod";var Tf={name:"os-images",category:"deploy",description:"List available OS images",stability:"unstable",options:[{name:"dev",description:"Show only dev images",type:"boolean",target:"dev",group:"basic"},{name:"prod",description:"Show only prod images",type:"boolean",target:"prod",group:"basic"},{name:"page",description:"Page number (1-indexed)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Items per page (max 100)",type:"number",target:"pageSize",group:"basic"},{name:"all",description:"Fetch all pages",type:"boolean",target:"all",group:"basic"},ee],examples:[{name:"List all OS images",value:"phala os-images"},{name:"List prod images only",value:"phala os-images --prod"},{name:"List page 2 with page size 20",value:"phala os-images --page 2 --page-size 20"},{name:"Fetch all pages",value:"phala os-images --all"},{name:"Output as JSON",value:"phala os-images --json"}]},Mf=An.object({dev:An.boolean().default(!1),prod:An.boolean().default(!1),page:An.number().int().min(1).default(1),pageSize:An.number().int().min(1).max(100).default(100),all:An.boolean().default(!1),json:An.boolean().default(!1)});async function iE(e,t){try{let n=await E(t),r=e.dev?!0:e.prod?!1:void 0,o=async l=>await $s(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 d=await o(m);if(!d.success)return t.failWithError(d.error.cause??d.error,{operation:"List OS images",debug:!!e.debug}),1;l.push(...d.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):(ie(i,c),p.info(`Total: ${s.total}`),0)}catch(n){return t.failWithError(n,{operation:"List OS images",debug:!!e.debug}),1}}var Df=b({path:["os-images"],meta:Tf,schema:Mf,handler:iE});import{z as pE}from"zod";var Uf={path:["simulator"],meta:{name:"simulator",category:"manage",description:"TEE simulator commands",stability:"unstable"}};import{z as Ti}from"zod";var Lf={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"}]},Nf=Ti.object({port:Ti.string().default("8090"),verbose:Ti.boolean().default(!1)});async function cE(e,t){try{return au()||await su(),await oo()?(p.success("TEE simulator is already running"),0):(await iu({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 Of=b({path:["simulator","start"],meta:Lf,schema:Nf,handler:cE});import{z as lE}from"zod";var jf={name:"stop",description:"Stop the TEE simulator",stability:"unstable"},Ff=lE.object({});async function mE(e,t){try{return await cu()?(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 Vf=b({path:["simulator","stop"],meta:jf,schema:Ff,handler:mE});var dE={name:"simulator",description:"TEE simulator commands",stability:"unstable"},uE=pE.object({});async function fE(e,t){try{let n=await oo(),r=ua();if(n&&r){let a=hi(),s=a.replace(/dstack\.sock$/,"tappd.sock");t.stdout.write(`\u2713 TEE simulator is running (PID: ${r})\\n`),t.stdout.write(`
|
|
305
234
|
Set these environment variables to use the simulator:
|
|
306
235
|
`),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
|
|
307
236
|
`),t.stdout.write(`To start the simulator, run:
|
|
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
|
|
237
|
+
`),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 gE=b({path:["simulator"],meta:dE,schema:uE,handler:fE}),Mi={group:Uf,commands:[gE,Of,Vf]};async function hE(e,t){let n=e.debug||t.env.DEBUG?.toLowerCase()==="true",{client:r,auth:o}=await jo(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 He(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
238
|
`),t.stdout.write(`API Version: ${c}
|
|
310
239
|
`),t.stdout.write(`Logged in as: ${s.user.username}
|
|
311
240
|
`),t.stdout.write(`Current Workspace: ${s.workspace.name}
|
|
312
241
|
`),t.stdout.write(`Current Profile: ${o.profileName}
|
|
313
|
-
`),t.cli){let l=await
|
|
242
|
+
`),t.cli){let l=await Yo({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
243
|
${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?`
|
|
244
|
+
`)}return 0}catch(a){return t.failWithError(a,{operation:"Status",debug:n,guidance:'Please set a new API key with "phala login".'}),1}}var Kf=b({path:["status"],meta:Gp,schema:ta,handler:hE});import{z as yE}from"zod";var Hf={name:"profiles",category:"profile",description:"List auth profiles",stability:"stable",arguments:[],options:[],aliases:["list"]},zf=yE.object({});import bE from"chalk";import vE from"inquirer";import{z as Di}from"zod";var qf={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"}]},Gf=Di.object({profileName:Di.string().min(1).optional(),interactive:Di.boolean().default(!1)});function CE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function wE(e,t){try{return e.interactive?await _E(t):e.profileName?kE(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(CE(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=xt();if(o.length>0){p.info("Available profiles:");for(let a of o)console.log(bE.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 _E(e){let t=xt(),n=Ve();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=xe(),o=t.map(i=>{let l=r?.profiles[i]?.workspace?.name||"unknown",d=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${l})${d}`,value:i}}),{selectedProfile:a}=await vE.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);or(a);let s=Ve();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 kE(e,t){let n=Ve();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);or(e);let r=Ve();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 Ui=b({path:["profiles","use"],meta:qf,schema:Gf,handler:wE});import{z as Li}from"zod";var Bf={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"]},Wf=Li.object({oldName:Li.string().min(1),newName:Li.string().min(1)});async function SE(e,t){try{let n=Ve()?.name===e.oldName;return Hm(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 Ni=b({path:["profiles","rename"],meta:Bf,schema:Wf,handler:SE});import{z as Oi}from"zod";var Jf={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"}]},Yf=Oi.object({profileNames:Oi.array(Oi.string().min(1)).min(1)});async function IE(e,t){let n=t.globalOptions?.json===!0;try{let r=xe(),o=xt(),a=e.profileNames.filter(d=>!o.includes(d));if(a.length>0){let d=a.length===1?`Profile "${a[0]}" not found`:`Profiles not found: ${a.map(u=>`"${u}"`).join(", ")}`;return n?(t.fail(d),1):(p.error(d),1)}let s=Ve()?.name,i=s!==void 0&&e.profileNames.includes(s),c=[],l=[];for(let d of e.profileNames){let u=r?.profiles[d];if(u?.token){let f=await ar({apiKey:u.token,baseURL:u.api_prefix});f.outcome==="revoked"?c.push(d):(l.push(d),!n&&f.outcome==="failed"&&p.warn(`Could not revoke token for profile "${d}" on the server: ${f.message}`))}Oo(d),n||p.success(`Deleted profile "${d}"`)}let m=Ve();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 ji=b({path:["profiles","delete"],meta:Jf,schema:Yf,handler:IE});import{z as Ea}from"zod";var Xf={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"}]},Zf=Ea.object({profileName:Ea.string().min(1).optional(),manual:Ea.boolean().optional(),noOpen:Ea.boolean().optional()});async function EE(e,t){let n=t.globalOptions?.json===!0;try{let r=xe(),o=e.profileName??r?.current_profile??void 0;if(!o){let d="No profile specified and no current profile. Please login first.";return n?(t.fail(d),1):(p.error(d),1)}let a=r?.profiles[o];if(!a){let d=`Profile "${o}" not found`;return n?(t.fail(d),1):(p.error(d),1)}let s=t.env.PHALA_CLOUD_API_PREFIX||a.api_prefix||Rt;if(a.token){let d=await ar({apiKey:a.token,baseURL:s});!n&&d.outcome==="revoked"&&p.info("Previous API token revoked on the server"),!n&&d.outcome==="failed"&&p.warn(`Could not revoke the previous token on the server: ${d.message}`)}let i,c;if(e.manual){let d=await wi({baseURL:s});i=d.apiKey,c=d.user}else i=await _i(t,{noOpen:e.noOpen,baseURL:s,workspaceSlug:a.workspace.slug}),c=await ur({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 rr({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 Fi=b({path:["profiles","refresh"],meta:Xf,schema:Zf,handler:EE});async function AE(e,t){let n=xt(),r=Ve();if(n.length===0)return t.globalOptions?.json?(t.success({profiles:[]}),0):(p.warn("No profiles found. Please login first."),0);let o=xe(),a=["PROFILE","SLUG","WORKSPACE","USER","API ENDPOINT",""],s=n.map(i=>{let c=r?.name===i,l=o?.profiles[i];return{PROFILE:i,SLUG:l?.workspace?.slug||"",WORKSPACE:l?.workspace?.name||"",USER:l?.user?.username||"","API ENDPOINT":l?.api_prefix||"","":c?"*":""}});return t.globalOptions?.json?(t.success({profiles:n.map(i=>({name:i,slug:o?.profiles[i]?.workspace?.slug||null,workspace:o?.profiles[i]?.workspace?.name||null,user:o?.profiles[i]?.user?.username||null,apiEndpoint:o?.profiles[i]?.api_prefix||null,current:r?.name===i}))}),0):(ie(a,s),0)}var Qf=b({path:["profiles"],meta:Hf,schema:zf,handler:AE});import RE from"chalk";import xE from"inquirer";import{z as Vi}from"zod";var eg={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"}]},tg=Vi.object({profileName:Vi.string().min(1).optional(),interactive:Vi.boolean().default(!1)});function PE(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}async function $E(e,t){try{return e.interactive?await TE(t):e.profileName?ME(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(PE(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=xt();if(o.length>0){p.info("Available profiles:");for(let a of o)console.log(RE.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 TE(e){let t=xt(),n=Ve();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=xe(),o=t.map(i=>{let l=r?.profiles[i]?.workspace?.name||"unknown",d=n?.name===i?" (current)":"";return{name:`${i} (workspace: ${l})${d}`,value:i}}),{selectedProfile:a}=await xE.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);or(a);let s=Ve();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 ME(e,t){let n=Ve();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);or(e);let r=Ve();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 ng=b({path:["switch"],meta:eg,schema:tg,handler:$E});import{z as gr}from"zod";import{readFileSync as NE}from"fs";import{dirname as OE,join as jE}from"path";import{fileURLToPath as FE}from"url";function rg(e,t,n){switch(t){case"bash":return DE(e,n);case"zsh":return UE(e,n);case"fish":return LE(e,n)}}function DE(e,t){let n=t?`
|
|
316
245
|
# Version check (once per day)
|
|
317
246
|
local completion_version="${t}"
|
|
318
247
|
local check_file=~/."${e}"/completion-check
|
|
@@ -349,7 +278,7 @@ ${n}
|
|
|
349
278
|
}
|
|
350
279
|
|
|
351
280
|
complete -F _${e}_completions ${e}
|
|
352
|
-
`.trim()}function
|
|
281
|
+
`.trim()}function UE(e,t){let n=t?`
|
|
353
282
|
# Version check (once per day)
|
|
354
283
|
local completion_version="${t}"
|
|
355
284
|
local check_file=~/."${e}"/completion-check
|
|
@@ -394,7 +323,7 @@ ${n}
|
|
|
394
323
|
}
|
|
395
324
|
|
|
396
325
|
_${e}
|
|
397
|
-
`.trim()}function
|
|
326
|
+
`.trim()}function LE(e,t){let n=t?`
|
|
398
327
|
# Version check (once per day)
|
|
399
328
|
set -l completion_version "${t}"
|
|
400
329
|
set -l check_file ~/."${e}"/completion-check
|
|
@@ -427,10 +356,10 @@ ${n}
|
|
|
427
356
|
end
|
|
428
357
|
|
|
429
358
|
complete -c ${e} -f -a "(__${e}_complete)"
|
|
430
|
-
`.trim()}function
|
|
431
|
-
`),0}var
|
|
432
|
-
`),0;let n=e.shell||
|
|
433
|
-
`),1;let r=
|
|
359
|
+
`.trim()}function VE(){try{let e=FE(import.meta.url),t=OE(e),n=jE(t,"../package.json");return JSON.parse(NE(n,"utf-8")).version}catch{return"unknown"}}var KE={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}]},HE=gr.object({line:gr.string(),fragment:gr.string()});async function zE(e,t){return t.stdout.write(`
|
|
360
|
+
`),0}var lH=b({path:["__complete"],meta:KE,schema:HE,handler:zE}),qE={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"}]},GE=gr.object({shell:gr.enum(["bash","zsh","fish"]).optional(),fig:gr.boolean().optional()});async function BE(e,t){if(e.fig)return t.stdout.write(`Fig spec generation requires registry access. See fig-spec.ts for implementation.
|
|
361
|
+
`),0;let n=e.shell||WE();if(!n)return t.stderr.write(`Could not detect shell. Please specify with --shell (bash, zsh, or fish)
|
|
362
|
+
`),1;let r=VE(),o=rg("phala",n,r);switch(t.stdout.write(`# Add this to your shell configuration file:
|
|
434
363
|
|
|
435
364
|
`),t.stdout.write(`${o}
|
|
436
365
|
|
|
@@ -443,41 +372,41 @@ complete -c ${e} -f -a "(__${e}_complete)"
|
|
|
443
372
|
`),t.stdout.write(`# source ~/.zshrc
|
|
444
373
|
`);break;case"fish":t.stdout.write(`# For fish, run:
|
|
445
374
|
`),t.stdout.write(`# phala completion --shell fish > ~/.config/fish/completions/phala.fish
|
|
446
|
-
`);break}return 0}function
|
|
447
|
-
`),0}let
|
|
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
|
|
450
|
-
`)),t.stderr.write(
|
|
451
|
-
`))):i&&(t.stderr.write(
|
|
452
|
-
`)),t.stderr.write(
|
|
453
|
-
`)),m?t.stderr.write(
|
|
454
|
-
`)):(t.stderr.write(
|
|
455
|
-
`)),
|
|
456
|
-
`)))));let f=o==="bun"&&i?`${n}@${i}`:s==="latest"?`${n}@latest`:`${n}@${s}`,h=
|
|
457
|
-
`)),0;let
|
|
458
|
-
`;return e.json?(t.success({command:h,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:
|
|
459
|
-
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function
|
|
375
|
+
`);break}return 0}function WE(){let e=process.env.SHELL||"";return e.includes("bash")?"bash":e.includes("zsh")?"zsh":e.includes("fish")?"fish":null}var og=b({path:["completion"],meta:qE,schema:GE,handler:BE});import{spawn as aA}from"child_process";import{execSync as JE}from"child_process";import{createHash as YE}from"crypto";import{existsSync as ag,readFileSync as XE}from"fs";import{homedir as lo,platform as ZE}from"os";import{basename as QE,join as mo}from"path";import sg from"chalk";function ig(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:${YE("sha256").update(r).digest("base64").replace(/=+$/,"")}`}var Gt=class extends Error{constructor(n,r){super(`CVM is not running (current status: ${sg.yellow(n)})`);this.status=n;this.cvmId=r;this.name="CvmNotRunningError"}},Rn=class extends Error{constructor(n){super("CVM is not registered on any gateway.");this.cvmId=n;this.name="NoGatewayError"}};function Aa(e){let t=e.lastIndexOf(":");if(t>0){let n=e.substring(t+1);if(/^\d+$/.test(n))return{host:e.substring(0,t),port:n}}return{host:e}}function Ki(){let e=[mo(lo(),".ssh","id_rsa"),mo(lo(),".ssh","id_ed25519"),mo(lo(),".ssh","id_ecdsa"),mo(lo(),".ssh","id_dsa")];for(let t of e)if(ag(t))return t}function cg(e){if(e){let t=e.startsWith("~")?mo(lo(),e.slice(1)):e;if(!ag(t))throw new Error(`SSH key file not found: ${t}`);return t}return Ki()}function po(e){return e?e.toLowerCase().includes("dev"):!1}function eA(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 tA(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"?po(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 nA(e,t){if(e&&typeof e=="object"&&"app_id"in e){let n=e.app_id;if(typeof n=="string"&&n.length>0)return n.startsWith("app_")?n.slice(4):n}if(t.startsWith("app_"))return t.slice(4);if(/^[0-9a-f]{40}$/i.test(t))return t}async function Ra(e,t){let n=await e.getCvmInfo({id:t}),r=eA(n);if(!r)throw new Rn(t);if(n.status!=="running")throw new Gt(n.status,t);let{baseImage:o,isDev:a}=tA(n),s=nA(n,t);if(!s)throw new Error("CVM does not have an app_id usable for gateway SSH/SCP.");return{appId:s,gatewayDomain:r,status:n.status,baseImage:o,isDevImage:a}}function xa(e,t){return`${e}-22.${t}`}function Pa(e,t){return e!=="443"?e:t||"443"}function $a(e){return/^[a-zA-Z0-9_./:@=-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function rA(){try{return JE("openssl version",{encoding:"utf-8"}).toLowerCase().includes("libressl")}catch{return!1}}function oA(e){if(QE(e).toLowerCase().includes("ed25519"))return!0;try{let n=XE(e,"utf-8");return n.includes("ssh-ed25519")||n.includes("ED25519")}catch{return!1}}function Ta(e){ZE()==="darwin"&&rA()&&oA(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${sg.cyan("brew\xB7install\xB7openssl")}`),p.info("Then ensure Homebrew's OpenSSL is in your PATH before /usr/bin"))}function Ma(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 sA from"chalk";import{z as Bt}from"zod";var lg={name:"ssh",category:"cvm-ops",description:"Connect to a CVM via SSH",stability:"unstable",arguments:[G],options:[D,{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"}]},mg=Bt.object({cvmId:Bt.string().optional(),port:Bt.string().default("443"),gatewayDomain:Bt.string().optional(),timeout:Bt.string().default("30"),verbose:Bt.boolean().default(!1),dryRun:Bt.boolean().default(!1),"--":Bt.array(Bt.string()).optional()});function iA(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 cA(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}=F.parse(t.cvmId),r=e["--"]??[],o=iA(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 v=await E(t),I=await Ra(v,n);i=I.appId,c=I.gatewayDomain,(I.isDevImage??po(I.baseImage))===!1&&p.warn("This CVM is not using a dev image. SSH access may not be available.")}catch(v){return v instanceof Rn||v instanceof Gt?t.failWithError(v,{operation:"SSH connect",debug:!!e.debug,guidance:v instanceof Gt?"Please start the CVM first using: phala cvms start":void 0}):t.failWithError(v,{operation:"SSH connect",debug:!!e.debug}),1}let l=Aa(c),m=Pa(s,l.port),d=xa(i,l.host),u=Ki();u&&Ta(u),e.verbose&&p.info(`Connecting to ${sA.cyan(d)}:${m}...`);let f=Ma(e.verbose,e.timeout),{options:h,command:g}=lA(r),y=[];if(e.verbose&&y.push("-v"),y.push(...f,"-p",m,...h,`root@${d}`,...g),e.dryRun){let v=y.map(I=>$a(I));return t.stdout.write(`ssh ${v.join(" ")}
|
|
376
|
+
`),0}let k=aA("ssh",y,{stdio:"inherit"});return k.on("error",v=>{p.break(),p.error(`SSH connection failed: ${v.message}`)}),new Promise(v=>{k.on("close",I=>{if(p.break(),I===0)p.success("Connection closed"),v(0);else{if(p.error(`Connection failed with code ${I}`),I===255){let S=t.cvmId?.id??t.cvmId?.app_id??t.cvmId?.uuid??t.cvmId?.instance_id??t.cvmId?.name??"<cvm-id>";p.info(`If this was an authentication failure, check authorized keys with: phala ssh-keys show ${S}`)}v(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 lA(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 pg=b({path:["ssh"],meta:lg,schema:mg,handler:cA});import{spawn as mA}from"child_process";import Hi from"chalk";import{z as Wt}from"zod";var dg={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"}]},ug=Wt.object({source:Wt.string(),destination:Wt.string(),identity:Wt.string().optional(),port:Wt.string().default("443"),gatewayDomain:Wt.string().optional(),recursive:Wt.boolean().default(!1),verbose:Wt.boolean().default(!1),dryRun:Wt.boolean().default(!1)});function fg(e){let t=e.match(/^([^:]+):(.+)$/);return t?{isRemote:!0,cvmId:t[1],path:t[2]}:{isRemote:!1,path:e}}async function pA(e,t){try{let n=fg(e.source),r=fg(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=Vm(o.cvmId):t.cvmId&&(a=F.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),x=await Ra(A,a);c=x.appId,l=x.gatewayDomain,(x.isDevImage??po(x.baseImage))===!1&&p.warn("This CVM is not using a dev image. SCP access may not be available.")}catch(A){return A instanceof Rn||A instanceof Gt?t.failWithError(A,{operation:"Copy file",debug:!!e.debug,guidance:A instanceof Gt?"Please start the CVM first using: phala cvms start":void 0}):t.failWithError(A,{operation:"Copy file",debug:!!e.debug}),1}let m=Aa(l),d=Pa(i,m.port),u=xa(c,m.host),f=cg(e.identity);f?Ta(f):p.warn("No default SSH key found. SCP will use ssh-agent or prompt for password."),e.verbose&&p.info(`Connecting to ${Hi.cyan(u)}:${d}...`);let g=[...Ma(e.verbose,"30"),"-P",d];e.verbose&&g.unshift("-v"),f&&g.push("-i",f),e.recursive&&g.push("-r");let y=n.isRemote?`root@${u}:${n.path}`:n.path,k=r.isRemote?`root@${u}:${r.path}`:r.path;if(g.push(y,k),e.dryRun){let A=g.map(x=>$a(x));return t.stdout.write(`scp ${A.join(" ")}
|
|
377
|
+
`),0}let v=n.isRemote?"download":"upload",I=n.isRemote?r.path:n.path,S=n.isRemote?n.path:r.path;p.info(`${v==="upload"?"Uploading":"Downloading"} ${Hi.cyan(I)} ${v==="upload"?"to":"from"} ${Hi.cyan(S)}...`);let C=mA("scp",g,{stdio:"inherit"});return C.on("error",A=>{p.break(),p.error(`SCP failed: ${A.message}`)}),new Promise(A=>{C.on("close",x=>{p.break(),x===0?(p.success(`${v==="upload"?"Upload":"Download"} completed`),A(0)):(p.error(`Transfer failed with code ${x}`),A(x??1))})})}catch(n){return p.error("Failed to copy file via SCP"),n instanceof Error&&p.error(n.message),1}}var gg=b({path:["cp"],meta:dg,schema:ug,handler:pA});import{z as Da}from"zod";var hg={name:"ps",category:"cvm-ops",description:"List containers of a CVM",stability:"stable",arguments:[G],options:[vn,ee,D],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"}]},yg=Da.object({cvmId:Da.string().optional(),json:Da.boolean().default(!1),interactive:Da.boolean().default(!1)});function dA(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 uA(e){let t=e[0]??"";return t.startsWith("/")?t.slice(1):t}async function fA(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 As(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:uA(m.names),IMAGE:m.image,CREATED:dA(m.created),STATUS:m.status,STATE:m.state})),c={};for(let m of s){c[m]=m.length;for(let d of i)c[m]=Math.max(c[m],d[m].length)}let l=m=>s.map(d=>m[d].padEnd(c[d])).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 bg=b({path:["ps"],meta:hg,schema:yg,handler:fA});import{z as nt}from"zod";var vg={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"},vn,ue,D],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"}]},Cg=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 wg(e,t,n){if(e.channel==="stdout"){t.includeStdout&&n.stdout.write(e.message);return}t.includeStderr&&n.stderr.write(e.message)}function gA(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 hA(e,t){if(Hr(e.json),!t.cvmId)return t.fail("No CVM ID provided. Use --interactive to select interactively."),1;let{cvmId:n}=F.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=gA(e);if(!a)try{let s=await sp(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"?yA(n,a.channel,e,t):bA(n,a.containerName,e,t)}async function yA(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 ap(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 op(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 bA(e,t,n,r){let o={includeStdout:!0,includeStderr:n.stderr},a={container:t,since:n.since,until:n.until,tail:n.tail,timestamps:n.timestamps,matchContainerIdPrefix:!1};try{if(n.follow){if(n.json)return r.fail("Cannot use --json with --follow"),1;let m=new AbortController,d=()=>m.abort();process.on("SIGINT",d),process.on("SIGTERM",d);try{await tp(e,u=>wg(u,o,r),a,m.signal)}catch(u){if(u.name!=="AbortError")throw u}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",d)}return 0}let i=(await ep(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)wg(m,o,r);return 0}return await no(e)||p.info("No logs available"),0}catch(s){return r.failWithError(s,{operation:"Fetch container logs",debug:!!n.debug}),await no(e),1}}var _g=b({path:["logs"],meta:vg,schema:Cg,handler:hA});var kg={path:["self"],meta:{name:"self",category:"advanced",description:"CLI self-management",stability:"unstable"}};import SA from"prompts";import{execa as IA}from"execa";import Ua from"semver";import Jt from"chalk";import{z as hr}from"zod";var vA={name:"json",shorthand:"j",description:"Output in JSON format",type:"boolean",target:"json",negatedName:"no-json"},CA={name:"yes",shorthand:"y",description:"Skip confirmation prompt",type:"boolean",target:"yes"},wA={name:"dry-run",description:"Print update command without executing",type:"boolean",target:"dryRun"},_A={name:"package-manager",description:"Override package manager (npm|pnpm|yarn|bun)",type:"string",target:"packageManager",aliases:["pm"],argumentName:"name"},kA={name:"channel",description:"Release channel/dist-tag (e.g. latest, beta, next)",type:"string",target:"channel",argumentName:"tag"},Sg={name:"update",description:"Update the Phala CLI",stability:"unstable",options:[vA,CA,wA,_A,kA],examples:[{name:"Update CLI",value:"phala self update"},{name:"Dry run",value:"phala self update --dry-run"},{name:"Beta channel",value:"phala self update --channel beta"}]},Ig=hr.object({json:hr.boolean().default(!1),yes:hr.boolean().default(!1),dryRun:hr.boolean().default(!1),packageManager:hr.enum(["npm","pnpm","yarn","bun"]).optional(),channel:hr.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/).optional()});var Eg="Phala-Network/phala-cloud",zi="cli-v";function EA(e,t){return`https://github.com/${Eg}/compare/${zi}${e}...${zi}${t}`}function AA(e){return`https://github.com/${Eg}/releases/tag/${zi}${e}`}function uo(e){return typeof e=="string"&&e.trim().length>0}function RA(e){return e.startsWith("@")?e.replace("/","%2F"):e}async function xA(e,t){let r=`https://registry.npmjs.org/${RA(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:Ua.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 PA(e){if(typeof e!="object"||e===null||!("code"in e))return;let t=e.code;return typeof t=="string"?t:void 0}function $A(e){let n=Ua.parse(e)?.prerelease?.[0];return typeof n=="string"&&n.length>0?n:void 0}function TA(e,t,n,r){let o=[],a=r instanceof Error&&typeof r.message=="string"?r.message:String(r),s=PA(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"&&uo(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"&&uo(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 MA(e,t,n){if(uo(e))return e.trim();if(uo(n.PHALA_UPDATE_CHANNEL))return n.PHALA_UPDATE_CHANNEL;let r=ir("updateCheckChannel");return uo(r)?r:$A(t)??"latest"}async function DA(e,t){let n=t.cli?.packageName??"phala",r=t.cli?.runtime??Bo(),o=e.packageManager??Zr(t.env,r),a=t.cli?.packageVersion??"0.0.0",s=MA(e.channel,a,t.env);e.json||t.stderr.write(Jt.gray(`Checking for updates...
|
|
378
|
+
`));let{latestVersion:i,error:c}=await xA(n,s);if(i){let S=Date.now(),C=s.replace(/[^a-zA-Z0-9_-]/g,"_");wn({[`updateCheckLastAt_${C}`]:S,[`updateCheckLatest_${C}`]:i,...s==="latest"?{updateCheckLastAt:S,updateCheckLatest:i}:{}})}let l=Ua.valid(a),m=i&&l&&!Ua.gt(i,l),d=!m&&i&&l?EA(l,i):void 0,u=i?AA(i):void 0;e.json||(c?(t.stderr.write(Jt.yellow(`Warning: Could not fetch latest version: ${c}
|
|
379
|
+
`)),t.stderr.write(Jt.gray(`Current version: v${a}
|
|
380
|
+
`))):i&&(t.stderr.write(Jt.gray(`Current version: v${a}
|
|
381
|
+
`)),t.stderr.write(Jt.gray(`Latest version: v${i}${s!=="latest"?` (${s})`:""}
|
|
382
|
+
`)),m?t.stderr.write(Jt.green(`You are already on the latest version.
|
|
383
|
+
`)):(t.stderr.write(Jt.yellow(`Update available: v${a} \u2192 v${i}
|
|
384
|
+
`)),d&&t.stderr.write(Jt.gray(`${d}
|
|
385
|
+
`)))));let f=o==="bun"&&i?`${n}@${i}`:s==="latest"?`${n}@latest`:`${n}@${s}`,h=Qr(o,f),{command:g,args:y}=bp(o,f);if(e.json&&e.dryRun)return t.success({command:h,dryRun:!0,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:u,changelogUrl:d}),0;if(e.dryRun)return t.stderr.write(Jt.gray(`Command: ${h}
|
|
386
|
+
`)),0;let k=t.stderr.isTTY===!0&&e.json!==!0;if(!e.yes&&!k){let S=`Non-interactive session detected. Re-run with --yes to apply the update, or use --dry-run to print the command.
|
|
387
|
+
`;return e.json?(t.success({command:h,ran:!1,reason:"nonInteractive",currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:u,changelogUrl:d}),0):(t.stderr.write(S),1)}let v=m?`Already up to date. Reinstall anyway with "${h}"?`:`Run "${h}"?`;if(!(e.yes||await SA({type:"confirm",name:"ok",message:v,initial:!m}).then(S=>S.ok===!0)))return e.json&&t.success({command:h,ran:!1,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:u,changelogUrl:d}),0;try{return await IA(g,y,{stdio:"inherit"}),e.json?(t.success({command:h,ran:!0,currentVersion:a,latestVersion:i,isUpToDate:m,releaseUrl:u,changelogUrl:d}),0):(p.success("Update completed"),0)}catch(S){let C=TA(t.env,o,h,S);if(p.logDetailedError(S),t.fail("Self update failed",{command:h,hints:C.length>0?C:void 0}),!e.json&&C.length>0)for(let A of C)p.info(A);return 1}}var Ag=b({path:["self","update"],meta:Sg,schema:Ig,handler:DA});var qi={group:kg,commands:[Ag]};import La from"chalk";import{z as ct}from"zod";var Rg={name:"apps",category:"manage",description:"List dstack apps",stability:"unstable",options:[{name:"page",description:"Page number (1-based)",type:"number",target:"page",group:"basic"},{name:"page-size",description:"Number of items per page",type:"number",target:"pageSize",group:"basic"},{name:"search",description:"Search by name, app_id, vm_uuid, or instance_id",type:"string",target:"search",group:"basic"},{name:"status",description:"Filter by CVM status (can be specified multiple times)",type:"string[]",target:"status",group:"basic"},{name:"listed",description:"Filter by listed status",type:"boolean",target:"listed",negatedName:"no-listed",group:"basic"},{name:"base-image",description:"Filter by base image name",type:"string",target:"baseImage",group:"basic"},{name:"instance-type",description:"Filter by instance type",type:"string",target:"instanceType",group:"basic"},{name:"kms-type",description:"Filter by KMS type",type:"string",target:"kmsType",group:"basic"},{name:"node",description:"Filter by node name",type:"string",target:"node",group:"basic"},{name:"region",description:"Filter by region identifier",type:"string",target:"region",group:"basic"},ee],examples:[{name:"List apps",value:"phala apps"},{name:"Second page",value:"phala apps --page 2"},{name:"Search by name",value:"phala apps --search my-app"},{name:"Filter by status",value:"phala apps --status running"},{name:"Output as JSON",value:"phala apps --json"}]},xg=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 UA(e){return e.toLowerCase().endsWith("ing")?La.yellow(e):e==="running"?La.green(e):e==="stopped"?La.red(e):La.yellow(e)}async function LA(e,t){try{let n=await E(t),r=await ia(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:UA(i.status),UPTIME:i.uptime??"-"}));return s.length===0?(p.info("No CVMs found"),0):(ie(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 Pg=b({path:["apps"],meta:Rg,schema:xg,handler:LA});var $g={path:["instances"],meta:{name:"instances",description:"Manage app instances",stability:"unstable",category:"manage"}};import Na from"chalk";import{z as Gi}from"zod";var Tg={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"},ee],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"}]},Mg=Gi.object({appId:Gi.string().optional(),json:Gi.boolean().default(!1)});function NA(e){return e.toLowerCase().endsWith("ing")?Na.yellow(e):e==="running"?Na.green(e):e==="stopped"?Na.red(e):Na.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 jA(e,t){try{let n=OA(e,t),r=await E(t),o=await Xn(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 Mo(r,{vmUuids:s});if(m.success)for(let[d,u]of Object.entries(m.data))i[d]={status:u.status,uptime:u.uptime}}if(e.json){let m=a.map(d=>({...d,status:d.vm_uuid?i[d.vm_uuid]?.status??d.status:d.status,uptime:d.vm_uuid?i[d.vm_uuid]?.uptime??null:null}));return t.success(m),0}if(a.length===0)return p.info("No instances found"),0;let c=["UUID","NODE","REGION","STATUS","NAME","UPTIME"],l=a.map(m=>{let d=m.node_info&&typeof m.node_info=="object"?m.node_info.name??"-":"-",u=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:d,REGION:u,STATUS:NA(f?.status??m.status),NAME:m.name,UPTIME:f?.uptime??"-"}});return ie(c,l),0}catch(n){return t.failWithError(n,{operation:"List instances",debug:!!e.debug}),1}}var Dg=b({path:["instances","ls"],meta:Tg,schema:Mg,handler:jA});import yr from"fs";import Wi from"path";import{z as Xe}from"zod";var Ug={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,Ye,{name:"prepare-only",description:"Prepare the instance and generate a commit token. Skips all on-chain operations.",type:"boolean",target:"prepareOnly",group:"advanced"},{name:"commit",description:"Commit a previously prepared instance using a commit token. Requires --token, --compose-hash, and --transaction-hash.",type:"boolean",target:"commit",group:"advanced"},{name:"token",description:"Commit token from a prepare-only request.",type:"string",target:"token",group:"advanced"},{name:"compose-hash",description:"Compose hash to use (existing revision).",type:"string",target:"composeHash"},sr,D],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>"}]},Lg=Xe.object({appId:Xe.string().optional(),name:Xe.string().optional(),nodeId:Xe.string().optional(),composeFile:Xe.string().optional(),preLaunchScript:Xe.string().optional(),envFile:Xe.string().optional(),privateKey:Xe.string().optional(),rpcUrl:Xe.string().optional(),prepareOnly:Xe.boolean().default(!1),commit:Xe.boolean().default(!1),token:Xe.string().optional(),composeHash:Xe.string().optional(),transactionHash:Xe.string().optional(),interactive:Xe.boolean().default(!1)});function FA(e){return yr.readFileSync(e,"utf-8").split(`
|
|
388
|
+
`).filter(n=>n.trim()!==""&&!n.trim().startsWith("#")).map(n=>{let[r,...o]=n.split("=");return{key:r.trim(),value:o.join("=").trim()}})}function VA(e){let t={},n=e.structuredDetails??[];for(let r of n)r.field&&(t[r.field]=r.value);return t}function KA(e){if(e.status!==465)return null;let n=VA(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 HA(e,t,n){if(!n)return;let r=Wi.resolve(process.cwd(),n);if(!yr.existsSync(r))throw new Error(`Environment file not found: ${r}`);let o=FA(r),a=await $t(e,t);return qe(o,a)}async function zA(e,t){if(!t)return;let n=t.trim();if(/^\d+$/.test(n))return Number.parseInt(n,10);let r=await Ot(e);if(!r.success){let a="error"in r?r.error:void 0;throw new Error(a?.message||`Failed to resolve node name "${n}"`)}let o=r.data.nodes.filter(a=>a.name.toLowerCase()===n.toLowerCase());if(o.length===0)throw new Error(`Node "${n}" not found.`);if(o.length>1)throw new Error(`Node name "${n}" is ambiguous (${o.length} matches). Use an explicit node ID.`);return o[0].teepod_id}function Bi(e,t){if(q()){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(`
|
|
460
389
|
`)}
|
|
461
|
-
`)}function
|
|
390
|
+
`)}function Ng(e,t){if(q()){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(`
|
|
462
391
|
`)}
|
|
463
|
-
`)}function
|
|
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
|
|
466
|
-
`);return
|
|
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(`
|
|
392
|
+
`)}function qA(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 GA(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL};try{let r=qA(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 Bi(c,t),0}let a;if(n.envFile){let c=await Xn(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 W(o,{id:l.vm_uuid});if(!m.success)throw new Error(`Failed to fetch CVM info: ${m.error?.message||"Unknown error"}`);a=await HA(o,m.data,n.envFile)}let s=await zA(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=Wi.resolve(process.cwd(),n.composeFile);if(!yr.existsSync(c))throw new Error(`Docker Compose file not found: ${c}`);i.docker_compose_file=yr.readFileSync(c,"utf-8")}if(n.preLaunchScript){let c=Wi.resolve(process.cwd(),n.preLaunchScript);if(!yr.existsSync(c))throw new Error(`Pre-launch script not found: ${c}`);i.pre_launch_script=yr.readFileSync(c,"utf-8")}try{let c=await o.post(`/apps/${r}/instances`,i,{headers:n.prepareOnly?{"X-Prepare-Only":"true"}:void 0});return Bi(c,t),0}catch(c){if(!(c instanceof Et))throw c;let l=KA(c);if(!l)throw c;if(n.prepareOnly)return Ng(l,t),0;if(!l.commitToken)throw new Error("Prepare response did not include a commit token");let m=l.kmsInfo?.chain_id,d=m!=null?At[m]:void 0;if(!d)throw new Error(m!=null?`Chain id ${m} is not supported by this CLI build`:"App KMS info is missing chain_id");let u=await yn({chain:d,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,composeHash:l.composeHash});if(!u.success){let v="error"in u?u.error:void 0;throw new Error(v?.message||"Failed to check on-chain prerequisites")}let f=n.transactionHash||"already-registered",h=!u.data.deviceAllowed,g=!u.data.composeHashAllowed;if(h||g){let v=[];g&&v.push("compose hash"),h&&v.push("device");let I=n.privateKey||process.env.PRIVATE_KEY;if(!I)return Ng(l,t),0;let S=I;if(h){let C=await en({chain:d,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,privateKey:S});if(!C.success){let A="error"in C?C.error:void 0;throw new Error(A?.message||"Failed to register device on-chain")}}if(g){let C=await Qt({chain:d,rpcUrl:n.rpcUrl,appId:`0x${r}`,composeHash:l.composeHash,privateKey:S});if(!C.success){let A="error"in C?C.error:void 0;throw new Error(A?.message||"Failed to register compose hash on-chain")}f=String(C.data.transactionHash||"already-registered")}}let y=10;for(let v=0;v<y;v++){let I=await yn({chain:d,rpcUrl:n.rpcUrl,appAddress:`0x${r}`,deviceId:l.deviceId,composeHash:l.composeHash});if(I.success&&I.data.composeHashAllowed&&I.data.deviceAllowed)break;if(v===y-1)throw new Error("On-chain prerequisites not met after waiting. Transactions may still be confirming. Retry with --commit using the token and transaction hash.");await new Promise(S=>setTimeout(S,3e3))}let k=await o.post(`/apps/${r}/instances`,{token:l.commitToken,compose_hash:l.composeHash,transaction_hash:f});return Bi(k,t),0}}catch(r){return t.failWithError(r,{operation:"Add instance",debug:!!n.debug}),1}}var Og=b({path:["instances","add"],meta:Ug,schema:Lg,handler:GA});import BA from"inquirer";import{z as fo}from"zod";var jg={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"}]},Fg=fo.object({vmUuids:fo.array(fo.string()).min(1),force:fo.boolean().default(!1),yes:fo.boolean().default(!1)});async function WA(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 BA.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 jr(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 Vg=b({path:["instances","rm"],meta:jg,schema:Fg,handler:WA});import{z as Ji}from"zod";var Kg={name:"instance-types",category:"deploy",description:"List available instance types",stability:"unstable",arguments:[{name:"family",description:"Instance type family (cpu, gpu)",required:!1,target:"family"}],options:[ee],examples:[{name:"List all instance type families",value:"phala instance-types"},{name:"List CPU instance types",value:"phala instance-types cpu"},{name:"List GPU instance types",value:"phala instance-types gpu"},{name:"Output as JSON",value:"phala instance-types --json"}]},Hg=Ji.object({family:Ji.string().optional(),json:Ji.boolean().default(!1)});function zg(e){return(e/1024).toFixed(0)}function qg(e){return`$${e}`}async function JA(e,t){try{let n=await E(t);if(e.family){let a=await bs(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)":zg(c.memory_mb),"Hourly Rate":qg(c.hourly_rate),GPU:c.requires_gpu?"Yes":"No"}));return i.length===0?(p.info(`No instance types found for family '${e.family}'`),0):(ie(s,i),p.info(`Total: ${a.total} instance types`),0)}let r=await ys(n);if(e.json)return t.success(r),0;if(r.result.length===0)return p.info("No instance types found"),0;let o=["ID","NAME","vCPU","Memory(GB)","Hourly Rate"];for(let a of r.result){p.info(`
|
|
393
|
+
Family: ${a.name} (${a.total} types)`);let s=a.items.map(i=>({ID:i.id,NAME:i.name,vCPU:i.vcpu.toString(),"Memory(GB)":zg(i.memory_mb),"Hourly Rate":qg(i.hourly_rate)}));ie(o,s)}return 0}catch(n){return t.failWithError(n,{operation:"List instance types",debug:!!e.debug}),1}}var Gg=b({path:["instance-types"],meta:Kg,schema:Hg,handler:JA});import{z as Bg}from"zod";var Wg={name:"runtime-config",description:"Show the runtime configuration of a CVM",stability:"stable",category:"cvm-ops",arguments:[G],options:[D],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"}]},Jg=Bg.object({cvmId:Bg.string().optional()});async function YA(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 ym(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(q())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(` ${ig(a)??"SHA256:<unrecognized>"}`)}return 0}catch(n){return t.failWithError(n,{operation:"Get runtime config",debug:!!e.debug}),1}}var Yg=b({path:["runtime-config"],meta:Wg,schema:Jg,handler:YA});import{existsSync as Qg,readFileSync as QA}from"fs";import{basename as eR,join as Oa}from"path";import{homedir as ja,hostname as tR}from"os";import{z as Yi}from"zod";var XA={name:"name",description:"Name for the SSH key (default: key file name)",type:"string",target:"name"},ZA={name:"key-file",description:"Path to SSH public key file (default: ~/.ssh/id_ed25519.pub or ~/.ssh/id_rsa.pub)",type:"string",target:"keyFile"},Xg={name:"add",description:"Add a local SSH public key to your account",stability:"stable",options:[XA,ZA],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"}]},Zg=Yi.object({name:Yi.string().optional(),keyFile:Yi.string().optional()});function nR(){let e=[Oa(ja(),".ssh","id_ed25519.pub"),Oa(ja(),".ssh","id_rsa.pub"),Oa(ja(),".ssh","id_ecdsa.pub")];for(let t of e)if(Qg(t))return t}async function rR(e,t){try{let n=e.keyFile;if(n?.startsWith("~/")&&(n=Oa(ja(),n.slice(2))),!n&&(n=nR(),!n))return t.fail("No SSH public key found. Specify one with --key-file or generate one with ssh-keygen."),1;if(!Qg(n))return t.fail(`SSH public key file not found: ${n}`),1;let r=QA(n,"utf-8").trim(),o=e.name??`${tR()}-${eR(n,".pub")}`,a=await E(t),s=await xs(a,{name:o,public_key:r});return s.success?q()?(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 eh=b({path:["ssh-keys","add"],meta:Xg,schema:Zg,handler:rR});var th={path:["ssh-keys"],meta:{name:"ssh-keys",category:"manage",description:"Manage account SSH keys and per-CVM authorization",stability:"stable"}};function pn(e){return e.map(t=>t.id)}function Fa(e,t){if(e.length!==t.length)return!1;let n=new Set(t);return e.every(r=>n.has(r))}function nh(e,t,n){return e.filter(r=>!!(n&&r.id===n||t&&r.owner_username===t))}function br(e,t){if(t){p.info("The CVM is being restarted.");return}e.restart_required&&p.info("The stored set has not been applied to the running VM yet. Pass --apply-now or run `phala cvms restart`.")}function rh(e){if(e.keys.length===0){p.info("This CVM authorizes no SSH keys."),br(e,!1);return}let t=["ID","OWNER","NAME","TYPE","FINGERPRINT"],n=e.keys.map(r=>({ID:r.id,OWNER:r.owner_username,NAME:r.name,TYPE:r.key_type,FINGERPRINT:r.fingerprint}));ie(t,n),br(e,!1)}import{z as vr}from"zod";var oR={name:"user_nickname",description:"Workspace member username whose keys to grant",required:!1,target:"userNickname"},aR={name:"id",description:"SSH key hashid to grant in addition to the nickname",type:"string",target:"sshKeyId"},sR={name:"apply-now",description:"Restart the CVM so the change takes effect immediately",type:"boolean",target:"applyNow"},oh={name:"grant",description:"Authorize a workspace member's SSH keys on a CVM",stability:"stable",arguments:[G,oR],options:[D,aR,sR],examples:[{name:"Grant every key a teammate holds",value:"phala ssh-keys grant app_123 alice"},{name:"Grant one key by id",value:"phala ssh-keys grant app_123 --id sshkey_abc"},{name:"Grant and restart now",value:"phala ssh-keys grant app_123 alice --apply-now"}]},ah=vr.object({cvmId:vr.string().optional(),userNickname:vr.string().optional(),sshKeyId:vr.string().optional(),applyNow:vr.boolean().default(!1),interactive:vr.boolean().default(!1)});async function iR(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;if(!e.userNickname&&!e.sshKeyId)return t.fail("Provide a user nickname or --id."),1;try{let n=await E(t),r=await Yn(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"Grant CVM SSH keys",debug:!!e.debug}),1;let o=[...pn(r.data.keys)];e.sshKeyId&&!o.includes(e.sshKeyId)&&o.push(e.sshKeyId);let a=await Do(n,{...t.cvmId,ssh_key_ids:o,usernames:e.userNickname?[e.userNickname]:void 0,apply_now:e.applyNow});return a.success?q()?(t.success(a.data),0):(Fa(pn(r.data.keys),pn(a.data.keys))?p.info("already authorized"):p.success("Granted SSH keys."),br(a.data,e.applyNow),0):(t.failWithError(a.error.cause??a.error,{operation:"Grant CVM SSH keys",debug:!!e.debug}),1)}catch(n){return t.failWithError(n,{operation:"Grant CVM SSH keys",debug:!!e.debug}),1}}var sh=b({path:["ssh-keys","grant"],meta:oh,schema:ah,handler:iR});import{z as ih}from"zod";var cR={name:"github_username",description:"GitHub username to import SSH keys from",required:!0,target:"githubUsername"},ch={name:"import-github",description:"Import SSH keys from a GitHub user's public profile",stability:"stable",arguments:[cR],examples:[{name:"Import SSH keys from a GitHub profile",value:"phala ssh-keys import-github octocat"}]},lh=ih.object({githubUsername:ih.string()});async function lR(e,t){try{let n=await E(t),r=p.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.failWithError(o.error.cause??o.error,{operation:"Import GitHub SSH keys",debug:!!e.debug}),1;if(q())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 mh=b({path:["ssh-keys","import-github"],meta:ch,schema:lh,handler:lR});import{z as mR}from"zod";var ph={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"}]},dh=mR.object({});async function pR(e,t){try{let n=await E(t),r=await Fr(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(q())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 ie(a,s),0}catch(n){return t.failWithError(n,{operation:"List SSH keys",debug:!!e.debug}),1}}var uh=b({path:["ssh-keys","list"],meta:ph,schema:dh,handler:pR});import uR from"inquirer";import{z as Xi}from"zod";var dR={name:"key_id",description:"SSH key ID to remove (from `phala ssh-keys list`)",required:!1,target:"keyId"},fh={name:"remove",aliases:["rm"],description:"Remove an SSH key from your account",stability:"stable",arguments:[dR],options:[D],examples:[{name:"Remove an SSH key by ID",value:"phala ssh-keys remove sshkey_xxx"},{name:"Interactive selection",value:"phala ssh-keys rm -i"}]},gh=Xi.object({keyId:Xi.string().optional(),interactive:Xi.boolean().default(!1)});async function fR(e){let t=p.startSpinner("Fetching SSH keys"),n=await E(e),r=await Fr(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 uR.prompt([{type:"list",name:"selectedKey",message:"Select an SSH key to remove:",choices:a}]);return s}async function gR(e,t){try{let n=e.keyId;if(!n&&e.interactive&&(n=await fR(t),!n))return 0;if(!n)return t.fail("Missing key_id. Use `phala ssh-keys rm <key_id>` or `phala ssh-keys rm -i` for interactive selection."),1;let r=await E(t),o=await Ps(r,{keyId:n});return o.success?q()?(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 hh=b({path:["ssh-keys","remove"],meta:fh,schema:gh,handler:gR});import{z as Cr}from"zod";var hR={name:"user_nickname",description:"Workspace member username whose keys to withdraw",required:!1,target:"userNickname"},yR={name:"id",description:"SSH key hashid to withdraw in addition to the nickname",type:"string",target:"sshKeyId"},bR={name:"apply-now",description:"Restart the CVM so the change takes effect immediately",type:"boolean",target:"applyNow"},yh={name:"revoke",description:"Withdraw SSH keys from a CVM without deleting the account keys",stability:"stable",arguments:[G,hR],options:[D,yR,bR],examples:[{name:"Revoke every key a teammate holds on this CVM",value:"phala ssh-keys revoke app_123 alice"},{name:"Revoke one key by id",value:"phala ssh-keys revoke app_123 --id sshkey_abc"},{name:"Revoke and restart now",value:"phala ssh-keys revoke app_123 alice --apply-now"}]},bh=Cr.object({cvmId:Cr.string().optional(),userNickname:Cr.string().optional(),sshKeyId:Cr.string().optional(),applyNow:Cr.boolean().default(!1),interactive:Cr.boolean().default(!1)});function vR(e){if(!e||typeof e!="object")return;let t=e;return t.user?.username??t.username}async function CR(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;if(!e.userNickname&&!e.sshKeyId)return t.fail("Provide a user nickname or --id."),1;try{let n=await E(t),r=await Yn(n,t.cvmId);if(!r.success)return t.failWithError(r.error.cause??r.error,{operation:"Revoke CVM SSH keys",debug:!!e.debug}),1;let o=nh(r.data.keys,e.userNickname,e.sshKeyId),a=r.data.keys.filter(d=>!o.some(u=>u.id===d.id));if(o.length===0)return q()?(t.success(r.data),0):(p.info("not authorized"),0);let s=await Do(n,{...t.cvmId,ssh_key_ids:pn(a),apply_now:e.applyNow});if(!s.success)return t.failWithError(s.error.cause??s.error,{operation:"Revoke CVM SSH keys",debug:!!e.debug}),1;if(q())return t.success(s.data),0;Fa(pn(r.data.keys),pn(s.data.keys))?p.info("not authorized"):p.success("Revoked SSH keys.");let i=await He(n),c=i.success?vR(i.data):void 0,l=c?r.data.keys.some(d=>d.owner_username===c):!1,m=c?s.data.keys.some(d=>d.owner_username===c):!0;return l&&!m&&p.info("Your account key is still registered. Re-grant it with `phala ssh-keys grant` if you want SSH access again."),br(s.data,e.applyNow),0}catch(n){return t.failWithError(n,{operation:"Revoke CVM SSH keys",debug:!!e.debug}),1}}var vh=b({path:["ssh-keys","revoke"],meta:yh,schema:bh,handler:CR});import{z as Zi}from"zod";var Ch={name:"show",description:"Show the SSH keys a CVM is configured to authorize",stability:"stable",arguments:[G],options:[D],examples:[{name:"Show keys for a CVM",value:"phala ssh-keys show app_123"},{name:"Show keys from phala.toml",value:"phala ssh-keys show"}]},wh=Zi.object({cvmId:Zi.string().optional(),interactive:Zi.boolean().default(!1)});async function wR(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 Yn(n,t.cvmId);return r.success?q()?(t.success(r.data),0):(rh(r.data),0):(t.failWithError(r.error.cause??r.error,{operation:"Show CVM SSH keys",debug:!!e.debug}),1)}catch(n){return t.failWithError(n,{operation:"Show CVM SSH keys",debug:!!e.debug}),1}}var _h=b({path:["ssh-keys","show"],meta:Ch,schema:wh,handler:wR});var Qi={group:th,commands:[uh,eh,hh,mh,_h,sh,vh]};import{z as ec}from"zod";var kh={name:"whoami",category:"profile",description:"Print the current user",stability:"stable",options:[...rn,ue],examples:[{name:"Show current user",value:"phala whoami"},{name:"JSON output",value:"phala whoami --json"}]},Sh=ec.object({json:ec.boolean().default(!1),apiToken:ec.string().optional()});async function _R(e,t){let{client:n,auth:r}=await jo(t,{apiToken:e.apiToken});if(!r.apiKey)return t.fail('Not authenticated. Run "phala login" first.'),1;let o=await He(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})
|
|
394
|
+
`),0)}var Ih=b({path:["whoami"],meta:kh,schema:Sh,handler:_R});import Vh from"inquirer";import{z as K}from"zod";var wr={name:"cvm",description:"CVM or app identifier (UUID, app_id, instance_id, or name)",required:!0,target:"cvm"},Eh={path:["allow-devices"],meta:{name:"allow-devices",description:"Manage on-chain device allowlist for an app contract",stability:"unstable"}},Ah={name:"list",aliases:["ls"],description:"List allowed devices from the on-chain contract",stability:"unstable",arguments:[wr],options:[Ye,ue],examples:[{name:"List devices on-chain",value:"phala allow-devices list app_abc123"}]},Rh=K.object({cvm:K.string(),rpcUrl:K.string().optional(),json:K.boolean().default(!1)}),xh={name:"add",description:"Add devices to the on-chain allowlist",stability:"unstable",arguments:[wr,{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,Ye,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ue,D],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..."}]},Ph=K.object({cvm:K.string(),deviceId:K.string().optional(),privateKey:K.string().optional(),rpcUrl:K.string().optional(),wait:K.boolean().default(!1),json:K.boolean().default(!1),interactive:K.boolean().default(!1)}),$h={name:"remove",aliases:["rm"],description:"Remove devices from the on-chain allowlist",stability:"unstable",arguments:[wr,{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,Ye,{name:"wait",description:"Wait for on-chain state to reflect the change via RPC polling",type:"boolean",target:"wait"},ue,D],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..."}]},Th=K.object({cvm:K.string(),deviceId:K.string().optional(),privateKey:K.string().optional(),rpcUrl:K.string().optional(),wait:K.boolean().default(!1),json:K.boolean().default(!1),interactive:K.boolean().default(!1)}),Mh={name:"allow-any",description:"Set the allow-any-device flag on the contract. Requires --enable or --disable.",stability:"unstable",arguments:[wr],options:[{name:"enable",description:"Enable allow-any-device",type:"boolean",target:"enable"},{name:"disable",description:"Disable allow-any-device",type:"boolean",target:"disable"},tt,Ye,{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..."}]},Dh=K.object({cvm:K.string(),enable:K.boolean().optional(),disable:K.boolean().optional(),privateKey:K.string().optional(),rpcUrl:K.string().optional(),wait:K.boolean().default(!1),json:K.boolean().default(!1)}),Uh={name:"disallow-any",description:"Disable allow-any-device on the contract. Equivalent to `allow-any --disable`.",stability:"unstable",arguments:[wr],options:[tt,Ye,{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..."}]},Lh=K.object({cvm:K.string(),privateKey:K.string().optional(),rpcUrl:K.string().optional(),wait:K.boolean().default(!1),json:K.boolean().default(!1)}),Nh={name:"toggle-allow-any",description:"Toggle allow-any-device on the contract (or force via --enable/--disable)",stability:"unstable",arguments:[wr],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,Ye,{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..."}]},Oh=K.object({cvm:K.string(),enable:K.boolean().optional(),disable:K.boolean().optional(),privateKey:K.string().optional(),rpcUrl:K.string().optional(),wait:K.boolean().default(!1),json:K.boolean().default(!1)});var kR=/^(0x)?[0-9a-fA-F]{64}$/,Kh=/^[0-9a-fA-F]{40}$/;function xn(e){return(e.startsWith("0x")?e:`0x${e}`).toLowerCase()}function Va(e){return kR.test(e)}function SR(e){return e.startsWith("app_")||Kh.test(e)}function jh(e){let t=e.startsWith("app_")?e.slice(4):e;return Kh.test(t)?t.toLowerCase():t}function Ha(e,t){if(!t)return null;let n=e.blockExplorers?.default?.url;return n?`${n}/tx/${t}`:null}var za=3e4,IR=15e3,Ka=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}},ER=[/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 Ka)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(`
|
|
395
|
+
`);return ER.some(a=>a.test(o))}async function _r(e,t,n=za){let r;try{return await Promise.race([e,new Promise((o,a)=>{r=setTimeout(()=>{a(new Ka(t,n))},n)})])}finally{r&&clearTimeout(r)}}function dn(e,t){return t||e.rpcUrls.default.http[0]||"the default RPC"}function AR(e){switch(e){case 1:return"https://ethereum-rpc.publicnode.com";case 8453:return"https://base-rpc.publicnode.com";default:return null}}function RR(e){return`https://chainlist.org/chain/${e}`}var Fh=new Set(["--private-key","--privateKey"]);function xR(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(Fh.has(r)&&n+1<e.length){t.push(r,"$PRIVATE_KEY"),n+=1;continue}let o=r.indexOf("=");if(o>0&&Fh.has(r.slice(0,o))){t.push(`${r.slice(0,o)}=$PRIVATE_KEY`);continue}t.push(r)}return t}function PR(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 $R(e){return/^[a-zA-Z0-9_\-./:=@,+%]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function TR(e){let t=process.argv.slice(2),n=xR(t);return["phala",...PR(n,e)].map($R).join(" ")}function Te(e=""){process.stderr.write(`${e}
|
|
396
|
+
`)}function MR(e,t){Te(`The ${e.name} RPC endpoint (${t}) appears unreachable or rate-limited.`);let n=AR(e.id);n?(Te("Retry with:"),Te(` ${TR(n)}`)):Te("Retry by appending --rpc-url <URL> to your command with a different endpoint."),Te(),Te(`More public ${e.name} RPC endpoints: ${RR(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 Dt(e,t,n,r=!1){r||!t||!n||Hh(e)&&MR(t,n)}function tc(e){if(e.json)return;let{chain:t,description:n,txHash:r}=e;Te(`${n} submitted: ${r}`);let o=Ha(t,r);o&&Te(`Explorer: ${o}`),Te("Waiting for 1 confirmation...")}function DR(e){return e.enable&&e.disable||!e.enable&&!e.disable?null:!!e.enable}function UR(e){return e.enable&&e.disable?null:e.enable===!0?!0:e.disable===!0?!1:!(e.currentValue??!1)}function LR(e){return new Set(e.map(t=>xn(t.device_id)))}async function nc(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=dn(t,n),d=e.json??!1,u;for(;Date.now()<l;){try{let f=await _r(To({chain:t,rpcUrl:n,appAddress:r,deviceIds:o}),m,IR);if(a(f))return!0;u=void 0}catch(f){if(!Hh(f))throw f;u=f}await new Promise(f=>{setTimeout(f,c)})}return d||Te(`Warning: timeout waiting for on-chain state: ${s}`),u&&Dt(u,t,m,d),!1}function zh(e){return e!==null&&typeof e=="object"&&"name"in e&&e.name==="ExitPromptError"}function rc(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 qh(e,t){if(Va(e))return xn(e);if(e.startsWith("0x"))throw new Error(`Invalid device ID format: ${e}. Expected 32-byte hex (0x + 64 hex chars).`);let n=await E(t),r=await Ot(n);if(!r.success)throw new Error(`Failed to resolve node name "${e}": ${r.error.message}`);let o=r.data.nodes.filter(s=>s.name.toLowerCase()===e.toLowerCase());if(o.length===0)throw new Error(`Node "${e}" not found. Provide a valid node name or device ID.`);if(o.length>1)throw new Error(`Node name "${e}" is ambiguous (${o.length} matches). Use an explicit device ID.`);let a=o[0].device_id;if(!a||!Va(a))throw new Error(`Node "${o[0].name}" has no valid device_id. Use an explicit device ID.`);return xn(a)}async function kr(e,t){let n=await E(t),r;if(SR(e))r=jh(e);else{let i=await W(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 Uo(n,{appId:jh(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=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 NR(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 kr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c}=s;a=i,o=dn(i,n.rpcUrl);let l=await E(t),m=await Ot(l),d=new Map;if(m.success)for(let y of m.data.nodes)y.device_id&&Va(y.device_id)&&d.set(xn(y.device_id),y.name);else r("Warning: could not fetch platform nodes \u2014 node names will not be shown.");let u=Array.from(d.keys()),f=await _r(To({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceIds:u}),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:d.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:d.get(y.toLowerCase())??"-"}));return ie(h,g),0}catch(s){return Dt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1}}async function OR(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 kr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c,allowlist:l}=s;a=i,o=dn(i,n.rpcUrl);let m=rc(n),d;if(n.interactive&&!n.deviceId){let f=await E(t),h=await Ot(f);if(!h.success)return t.failWithError(h.error.cause??h.error,{operation:"Manage devices"}),1;let g=LR(l.devices),y=h.data.nodes.filter(v=>v.device_id&&Va(v.device_id)&&!g.has(xn(v.device_id)));if(y.length===0)return r("All available devices are already in the allowlist."),0;let{selected:k}=await Vh.prompt([{type:"checkbox",name:"selected",message:"Select devices to add:",choices:y.map(v=>({name:`${v.name} ${v.device_id}`,value:v.device_id}))}]);if(k.length===0)return r("No devices selected."),0;d=k.map(v=>xn(v))}else if(n.deviceId)d=[await qh(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let u=[];for(let f of d){r(`Submitting add-device transaction for ${f}...`),r(`RPC URL: ${o}`);let h=await _r(en({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceId:f,privateKey:m,skipPrerequisiteChecks:!0,timeout:za,onTransactionSubmitted:y=>{tc({chain:i,description:`Add-device transaction for ${f}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Dt(new Error(y.error.message),i,o,n.json),t.failWithError(y.error,{operation:`Add device ${f}`}),1}let g=h.data;u.push({deviceId:f,txHash:g.transactionHash,explorer:Ha(i,g.transactionHash)})}if(n.json)return t.success(u),0;for(let f of u)r(`Added ${f.deviceId}`),r(`Transaction: ${f.txHash}`),f.explorer&&r(`Explorer: ${f.explorer}`);if(n.wait){if(!await nc({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceIds:d,description:"devices to be allowed",json:n.json,condition:h=>h.allowAnyDevice?!0:d.every(g=>h.devices.some(y=>y.toLowerCase()===g.toLowerCase()))}))return t.fail("Devices not observed on-chain within timeout."),1;r("On-chain allowlist updated.")}else r("Backend allowlist API may lag behind chain. Use --wait to verify via RPC.");return 0}catch(s){return zh(s)?(r("Cancelled."),0):(Dt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1)}}async function jR(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 kr(n.cvm,t);if(!s)return 1;let{chain:i,appContractAddress:c,allowlist:l}=s;a=i,o=dn(i,n.rpcUrl);let m=rc(n),d;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 Vh.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;d=h.map(g=>xn(g))}else if(n.deviceId)d=[await qh(n.deviceId,t)];else return t.fail("Device ID is required. Use -i to select interactively."),1;let u=[];for(let f of d){r(`Submitting remove-device transaction for ${f}...`),r(`RPC URL: ${o}`);let h=await _r(mm({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceId:f,privateKey:m,skipPrerequisiteChecks:!0,timeout:za,onTransactionSubmitted:y=>{tc({chain:i,description:`Remove-device transaction for ${f}`,txHash:y,json:n.json})}}),o);if(!h.success){let y=h;return Dt(new Error(y.error.message),i,o,n.json),t.failWithError(y.error,{operation:`Remove device ${f}`}),1}let g=h.data;u.push({deviceId:f,txHash:g.transactionHash,explorer:Ha(i,g.transactionHash)})}if(n.json)return t.success(u),0;for(let f of u)r(`Removed ${f.deviceId}`),r(`Transaction: ${f.txHash}`),f.explorer&&r(`Explorer: ${f.explorer}`);if(n.wait)if((await _r(To({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 nc({chain:i,rpcUrl:n.rpcUrl,appAddress:c,deviceIds:d,description:"devices to be removed",json:n.json,condition:g=>d.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 zh(s)?(r("Cancelled."),0):(Dt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1)}}async function FR(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r=DR(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 kr(n.cvm,t);return s?(a=s.chain,o=dn(s.chain,n.rpcUrl),await oc(n,t,{chain:s.chain,appContractAddress:s.appContractAddress,allow:r})):1}catch(s){return Dt(s,a,o,n.json),t.failWithError(s,{operation:"Manage devices"}),1}}async function VR(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await kr(n.cvm,t);return a?(o=a.chain,r=dn(a.chain,n.rpcUrl),await oc(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:!1})):1}catch(a){return Dt(a,o,r,n.json),t.failWithError(a,{operation:"Manage devices"}),1}}async function KR(e,t){let n={...e,rpcUrl:e.rpcUrl||process.env.ETH_RPC_URL},r,o;try{let a=await kr(n.cvm,t);if(!a)return 1;o=a.chain,r=dn(a.chain,n.rpcUrl);let s=UR({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 oc(n,t,{chain:a.chain,appContractAddress:a.appContractAddress,allow:s})}catch(a){return Dt(a,o,r,n.json),t.failWithError(a,{operation:"Manage devices"}),1}}async function oc(e,t,n){let r=e.json??!1,o=(f="")=>{r||Te(f)},{chain:a,appContractAddress:s,allow:i}=n,c=rc(e),l=dn(a,e.rpcUrl);o(`Submitting allow-any-device transaction (${i?"enable":"disable"})...`),o(`RPC URL: ${l}`);let m=await _r(pm({chain:a,rpcUrl:e.rpcUrl,appAddress:s,allow:i,privateKey:c,timeout:za,onTransactionSubmitted:f=>{tc({chain:a,description:"Allow-any-device transaction",txHash:f,json:r})}}),l);if(!m.success){let f=m;return Dt(new Error(f.error.message),a,l,r),t.fail(f.error.message),1}let d=m.data,u=Ha(a,d.transactionHash);if(r)return t.success({...d,explorer:u??void 0}),0;if(o(`Allow-any-device ${i?"enabled":"disabled"} successfully!`),o(`Transaction: ${d.transactionHash}`),u&&o(`Explorer: ${u}`),e.wait){if(!await nc({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 HR=b({path:["allow-devices","list"],meta:Ah,schema:Rh,handler:NR}),zR=b({path:["allow-devices","add"],meta:xh,schema:Ph,handler:OR}),qR=b({path:["allow-devices","remove"],meta:$h,schema:Th,handler:jR}),GR=b({path:["allow-devices","allow-any"],meta:Mh,schema:Dh,handler:FR}),BR=b({path:["allow-devices","disallow-any"],meta:Uh,schema:Lh,handler:VR}),WR=b({path:["allow-devices","toggle-allow-any"],meta:Nh,schema:Oh,handler:KR}),ac={group:Eh,commands:[HR,zR,qR,GR,BR,WR]};import{readFileSync as JR}from"fs";import{keccak256 as Wh,hexToBytes as YR}from"viem";import{z as Sr}from"zod";var Gh={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"}]},Bh=Sr.object({hexValues:Sr.array(Sr.string()),check:Sr.boolean().default(!1),quiet:Sr.boolean().default(!1),status:Sr.boolean().default(!1)});function XR(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 ZR(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 sc(e){let t=e.map(o=>YR(XR(o))),n=ZR(t);return Wh(n).slice(2)}function QR(e){return Wh(e).slice(2)}async function ex(e){let t=[];for await(let n of e)t.push(Buffer.from(n));return Buffer.concat(t).toString("utf-8").trim()}function tx(e,t,n){let r;try{r=JR(e,"utf-8")}catch{return n.fail(`${e}: No such file`),1}let o=r.split(`
|
|
468
397
|
`),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
|
|
469
|
-
`),a++;continue}let[,m,
|
|
470
|
-
`);continue}let f=
|
|
471
|
-
`):(a++,t.status||n.stdout.write(`${
|
|
472
|
-
`))}catch{a++,t.status||n.stdout.write(`${
|
|
398
|
+
`),a++;continue}let[,m,d]=l,u=d;if(d==="-"){t.status||n.stderr.write(`keccak256sum: -: cannot verify stdin from checksum file
|
|
399
|
+
`);continue}let f=d.split(/\s+/).filter(Boolean);try{let h=sc(f);s++,h===m.toLowerCase()?!t.quiet&&!t.status&&n.stdout.write(`${u}: OK
|
|
400
|
+
`):(a++,t.status||n.stdout.write(`${u}: FAILED
|
|
401
|
+
`))}catch{a++,t.status||n.stdout.write(`${u}: FAILED
|
|
473
402
|
`)}}return a>0&&!t.status&&n.stderr.write(`keccak256sum: WARNING: ${a} computed checksum(s) did NOT match
|
|
474
|
-
`),a>0?1:0}async function
|
|
403
|
+
`),a>0?1:0}async function nx(e,t){if(e.check)return e.hexValues.length===0?(t.fail("No checksum file specified"),1):tx(e.hexValues[0],{quiet:e.quiet,status:e.status},t);if(e.hexValues.length>0)try{let n=sc(e.hexValues),r=e.hexValues.join(" ");return t.stdout.write(`${n} ${r}
|
|
475
404
|
`),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 ...]
|
|
476
405
|
|
|
477
406
|
Compute or verify keccak256 checksums of hex inputs.
|
|
478
407
|
Read from stdin when no arguments are given.
|
|
479
|
-
`),1;try{let r=(await
|
|
480
|
-
`),0}catch(n){return t.fail(n instanceof Error?n.message:"Failed to compute keccak256"),1}}var
|
|
408
|
+
`),1;try{let r=(await ex(t.stdin)).split(/\s+/).filter(Boolean),o;return r.length===0?o=QR(new Uint8Array(0)):o=sc(r),t.stdout.write(`${o} -
|
|
409
|
+
`),0}catch(n){return t.fail(n instanceof Error?n.message:"Failed to compute keccak256"),1}}var Jh=b({path:["keccak256sum"],meta:Gh,schema:Bh,handler:nx});var cx=ix(import.meta.url),lx=ax(cx),mx=sx(lx,"../package.json"),qa=JSON.parse(ox(mx,"utf-8")),px="+4ff72a6",dx=`v${qa.version}${px}`,ux=Bo(),$=new Xo;$.registerCommand(Cu);$.registerCommand(Pg);$.registerGroup($g);$.registerCommand(Dg);$.registerCommand(Og);$.registerCommand(Vg);$.registerCommand(Gg);$.registerCommand(sf);$.registerCommand(pg);$.registerCommand(gg);$.registerCommand(bg);$.registerCommand(_g);$.registerCommand(Yg);$.registerCommand(Qu);$.registerCommand(mf);$.registerCommand(Qf);$.registerCommand(Ui);$.registerCommand(Ni);$.registerCommand(ji);$.registerCommand(Fi);$.registerCommand(ng);$.registerCommand(Op);$.registerCommand(Kf);$.registerCommand(Ih);$.registerCommand(og);$.registerCommand(Df);$.registerCommand(Jh);$.registerCommand(Ju);$.registerGroup(qi.group);for(let e of qi.commands)$.registerCommand(e);$.registerGroup(ti.group);for(let e of ti.commands)$.registerCommand(e);$.registerGroup(ri.group);for(let e of ri.commands)$.registerCommand(e);$.registerGroup(vi.group);for(let e of vi.commands)$.registerCommand(e);$.registerGroup(fa.group);for(let e of fa.commands)$.registerCommand(e);for(let e of fa.subgroups??[]){$.registerGroup(e.group);for(let t of e.commands)$.registerCommand(t)}$.registerGroup(Ci.group);for(let e of Ci.commands)$.registerCommand(e);$.registerGroup(Qi.group);for(let e of Qi.commands)$.registerCommand(e);$.registerGroup(xi.group);for(let e of xi.commands)$.registerCommand(e);$.registerGroup($i.group);for(let e of $i.commands)$.registerCommand(e);$.registerGroup(Mi.group);for(let e of Mi.commands)$.registerCommand(e);$.registerGroup(ac.group);for(let e of ac.commands)$.registerCommand(e);process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ga(e){e.destroyed||e.writableLength===0||await Promise.race([rx(e,"drain"),new Promise(t=>setTimeout(t,5e3))])}async function fx(){await Pp({env:process.env,stderr:process.stderr});let e=await Ep({registry:$,argv:process.argv.slice(2),executableName:qa.name??"phala",version:dx,packageName:qa.name??"phala",packageVersion:qa.version,runtime:ux,cwd:process.cwd(),env:process.env,stdout:process.stdout,stderr:process.stderr,stdin:process.stdin});await Promise.all([Ga(process.stdout),Ga(process.stderr)]),process.exit(e)}fx().catch(async e=>{console.error("An error occurred:",e),await Promise.all([Ga(process.stdout),Ga(process.stderr)]),process.exit(1)});
|
|
481
410
|
/*! Bundled license information:
|
|
482
411
|
|
|
483
412
|
@noble/hashes/esm/utils.js:
|