phala 1.0.24 → 1.0.26
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
CHANGED
@@ -2321,35 +2321,20 @@ declare const getUserInfoResponseSchema: z.ZodObject<{
|
|
2321
2321
|
email: z.ZodString;
|
2322
2322
|
credits: ZodDecimal;
|
2323
2323
|
granted_credits: ZodDecimal;
|
2324
|
-
role: z.ZodString;
|
2325
2324
|
avatar: z.ZodString;
|
2326
|
-
|
2327
|
-
|
2328
|
-
|
2329
|
-
|
2330
|
-
|
2331
|
-
|
2332
|
-
|
2333
|
-
|
2334
|
-
|
2335
|
-
|
2336
|
-
|
2337
|
-
|
2338
|
-
|
2339
|
-
team_tier?: string;
|
2340
|
-
trial_ended_at?: string;
|
2341
|
-
}, {
|
2342
|
-
username?: string;
|
2343
|
-
email?: string;
|
2344
|
-
credits?: any;
|
2345
|
-
granted_credits?: any;
|
2346
|
-
role?: string;
|
2347
|
-
avatar?: string;
|
2348
|
-
flag_reset_password?: boolean;
|
2349
|
-
team_name?: string;
|
2350
|
-
team_tier?: string;
|
2351
|
-
trial_ended_at?: string;
|
2352
|
-
}>;
|
2325
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
2326
|
+
username: z.ZodString;
|
2327
|
+
email: z.ZodString;
|
2328
|
+
credits: ZodDecimal;
|
2329
|
+
granted_credits: ZodDecimal;
|
2330
|
+
avatar: z.ZodString;
|
2331
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
2332
|
+
username: z.ZodString;
|
2333
|
+
email: z.ZodString;
|
2334
|
+
credits: ZodDecimal;
|
2335
|
+
granted_credits: ZodDecimal;
|
2336
|
+
avatar: z.ZodString;
|
2337
|
+
}, z.ZodTypeAny, "passthrough">>;
|
2353
2338
|
declare const getCvmsByUserIdResponseSchema: z.ZodArray<z.ZodObject<{
|
2354
2339
|
hosted: z.ZodObject<{
|
2355
2340
|
id: z.ZodString;
|
package/dist/api/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import{$ as N,A as g,B as h,C as i,D as j,E as k,F as l,G as n,H as q,I as s,J as u,K as v,L as w,M as y,N as z,O as A,P as B,Q as C,R as D,S as E,T as F,U as G,V as H,W as I,X as J,Y as K,Z as L,_ as M,aa as O,ba as P,ca as Q,o,p as r,q as e,r as f,s as m,t as p,u as t,v as x,w as a,x as b,y as c,z as d}from"../chunk-
|
1
|
+
import{$ as N,A as g,B as h,C as i,D as j,E as k,F as l,G as n,H as q,I as s,J as u,K as v,L as w,M as y,N as z,O as A,P as B,Q as C,R as D,S as E,T as F,U as G,V as H,W as I,X as J,Y as K,Z as L,_ as M,aa as O,ba as P,ca as Q,o,p as r,q as e,r as f,s as m,t as p,u as t,v as x,w as a,x as b,y as c,z as d}from"../chunk-UU6UDBBR.js";export{k as capacitySchema,z as checkCvmExists,r as composeFileSchema,e as configurationSchema,D as createCvm,v as cvmAttestationResponseSchema,s as cvmComposeConfigSchema,t as cvmInstanceSchema,I as deleteCvm,o as dockerConfigSchema,h as encryptedEnvItemSchema,L as getCvmAttestation,A as getCvmByAppId,b as getCvmByAppIdResponseSchema,M as getCvmComposeConfig,C as getCvmNetwork,q as getCvmNetworkResponseSchema,y as getCvms,d as getCvmsByUserIdResponseSchema,B as getPubkeyFromCvm,a as getPubkeyFromCvmResponseSchema,Q as getTeepodImages,P as getTeepods,w as getUserInfo,c as getUserInfoResponseSchema,f as hostedSchema,i as imageSchema,l as kmsListItemSchema,m as managedUserSchema,p as nodeSchema,x as postCvmResponseSchema,N as replicateCvm,u as replicateCvmResponseSchema,O as resizeCvm,G as restartCvm,K as selectCvm,E as startCvm,F as stopCvm,n as teepodResponseSchema,j as teepodSchema,J as updateCvm,H as upgradeCvm,g as upgradeCvmResponseSchema};
|
2
2
|
//# sourceMappingURL=index.js.map
|
@@ -1,4 +1,4 @@
|
|
1
|
-
var ke=Object.defineProperty;var xe=(r,t,o)=>t in r?ke(r,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[t]=o;var ee=(r,t,o)=>(xe(r,typeof t!="symbol"?t+"":t,o),o);import _ from"chalk";function Se(r){let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return r.replace(new RegExp(t,"g"),"")}function V(r){return Se(r).length}function z(r,t){if(!r)return[""];if(V(r)<=t)return[r];let o=[],n="",s=0,a=r.split(/(\s+)/).filter(l=>l.trim().length>0);for(let l of a){let b=V(l);if(b>t){n&&(o.push(n),n="",s=0),o.push(l);continue}s+b+(s>0?1:0)>t?(o.push(n),n=l,s=b):n?(n=`${n} ${l}`,s+=b+1):(n=l,s=b)}return n&&o.push(n),o}var y={error:(r,...t)=>{console.error(_.red("\u2717"),_.red(r),...t)},warn:(r,...t)=>{console.log(_.yellow("\u26A0"),_.yellow(r),...t)},info:(r,...t)=>{console.log(_.blue("\u2139"),_.blue(r),...t)},success:(r,...t)=>{console.log(_.green("\u2713"),_.green(r),...t)},debug:(r,...t)=>{process.env.DEBUG&&console.log(_.gray("\u{1F50D}"),_.gray(r),...t)},table:(r,t)=>{if(r.length===0){console.log(_.yellow("No data to display"));return}if(t)if(typeof t[0]=="string"){let o=t.map(n=>({key:n,header:n.charAt(0).toUpperCase()+n.slice(1)}));H(r,{columns:o,borderStyle:"rounded",headerStyle:n=>_.cyan.bold(n)})}else H(r,{columns:t,borderStyle:"rounded",headerStyle:o=>_.cyan.bold(o)});else H(r,{borderStyle:"rounded",headerStyle:o=>_.cyan.bold(o)})},keyValueTable:(r,t)=>{let n={...{borderStyle:"rounded",enableTextWrapping:!0,maxDepth:2,formatKeys:!0,keyFormatter:h=>{let k=["URL","ID","API","UI","URI","CPU","GPU","RAM","JSON","XML","HTML","HTTP","HTTPS","SSH","FTP","IP","TCP","UDP","DNS","SSL","TLS","SQL","VCPU","CVM","TEE","IO"],S={teepod:"TEEPod",dstack:"Dstack"},R;h.includes("_")?R=h.split("_").map(w=>w.charAt(0).toUpperCase()+w.slice(1).toLowerCase()).join(" "):h.includes("-")?R=h.split("-").map(w=>w.charAt(0).toUpperCase()+w.slice(1).toLowerCase()).join(" "):R=h.charAt(0).toUpperCase()+h.slice(1).replace(/([a-z])([A-Z])/g,"$1 $2");for(let w of k){let $=new RegExp(`\\b${w.toLowerCase()}\\b`,"gi");R=R.replace($,w)}for(let[w,$]of Object.entries(S)){let B=new RegExp(`\\b${w}\\b`,"gi");R=R.replace(B,$)}return R},valueFormatter:h=>String(h??"")},...t},{include:s,exclude:a,keyFormatter:l,valueFormatter:b,formatKeys:E,keyWidth:x,valueWidth:P,borderStyle:M,enableTextWrapping:p,maxDepth:m}=n,c=Object.keys(r);if(s&&(c=c.filter(h=>s.includes(h))),a&&(c=c.filter(h=>!a.includes(h))),c.length===0){console.log(_.yellow("No properties to display"));return}let g=c.map(h=>{let k=r[h],S;return k==null?S="":typeof k=="object"&&!Array.isArray(k)?S=te(k,0,m):Array.isArray(k)?k.length===0?S="[]":typeof k[0]=="object"?S=`[${k.length} items]`:S=`[${k.join(", ")}]`:S=String(k),b&&(S=b(k,h)),{key:E&&l?_.cyan.bold(l(h)):_.cyan.bold(h),value:S}}),f=re(),i=x,u=P;if(i||(i=Math.max(...g.map(h=>V(h.key)),10),i=Math.min(i,Math.floor(f/3))),!u){u=Math.max(...g.map(S=>V(S.value)),10),u+=3;let h=7,k=f-i-h;u=Math.min(u,k)}let d=Te(M),D=`${d.topLeft}${d.horizontal.repeat(i+2)}${d.topT}${d.horizontal.repeat(u+2)}${d.topRight}`,I=`${d.leftT}${d.horizontal.repeat(i+2)}${d.cross}${d.horizontal.repeat(u+2)}${d.rightT}`;console.log(D),console.log(I),g.forEach((h,k)=>{let S=p?z(h.key,i):[h.key],R=p?z(h.value,u):[h.value],w=Math.max(S.length,R.length);for(let $=0;$<w;$++){let B=S[$]||"",Q=R[$]||"",ve=B+" ".repeat(Math.max(0,i-V(B))),Ce=Q+" ".repeat(Math.max(0,u-V(Q)));console.log(`${d.vertical} ${ve} ${d.vertical} ${Ce} ${d.vertical}`)}k<g.length-1&&console.log(`${d.leftT}${d.horizontal.repeat(i+2)}${d.cross}${d.horizontal.repeat(u+2)}${d.rightT}`)});let Z=`${d.bottomLeft}${d.horizontal.repeat(i+2)}${d.bottomT}${d.horizontal.repeat(u+2)}${d.bottomRight}`;console.log(Z)},startSpinner:r=>(process.stdout.write(`${_.blue("\u27F3")} ${r}... `),{stop:(t=!0,o)=>{let n=t?_.green("\u2713"):_.red("\u2717"),s=o?`: ${o}`:"";console.log(`${n}${s}`)}}),break(){console.log("")}};function te(r,t,o){if(t>=o)return"[Nested Object]";if(r==null)return"";if(Array.isArray(r))return r.length===0?"[]":`[${r.length} items]`;let n=[];for(let[s,a]of Object.entries(r))a==null?n.push(`${s}: `):typeof a=="object"?n.push(`${s}: ${te(a,t+1,o)}`):n.push(`${s}: ${a}`);return n.join(", ")}function Te(r="single"){return{single:{topLeft:"\u250C",topRight:"\u2510",bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"},double:{topLeft:"\u2554",topRight:"\u2557",bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",vertical:"\u2551",leftT:"\u2560",rightT:"\u2563",topT:"\u2566",bottomT:"\u2569",cross:"\u256C"},rounded:{topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"}}[r]}function re(){return process.stdout.columns||80}function we(r,t,o={}){let n=re(),s=o.borderChars??3,l=(o.additionalBorderWidth??1)+t.length*s,b=n-l,E={},x=0,P=0;for(let m of t){let c=m.key;if(m.fixedWidth!==void 0){E[c]=m.fixedWidth,x+=m.fixedWidth;continue}let g=m.minWidth??m.header.length,f;m.getWidth?f=Math.max(g,m.header.length,...r.map(i=>m.getWidth(i))):m.getValue?f=Math.max(g,m.header.length,...r.map(i=>String(m.getValue(i)||"").length)):f=Math.max(g,m.header.length,...r.map(i=>String(i[m.key]||"").length)),E[c]=f,x+=f,P+=m.weight??1}let M=Math.max(0,b-x);if(M>0&&P>0)for(let m of t){let c=m.key;if(m.fixedWidth===void 0&&m.weight){let g=Math.floor(M*(m.weight/P));E[c]+=g}}let p=Object.values(E).reduce((m,c)=>m+c,0)+l;if(p>n){let m=b/(p-l),c={};for(let g of t){let f=g.key,i=g.minWidth??g.header.length;c[f]=Math.max(i,Math.floor(E[f]*m))}return c}return E}function H(r,t={}){if(t.keyValueMode&&r.length===1){let p=r[0],m=[];t.columns||(t.columns=Object.keys(p).map(c=>({key:c,header:c.charAt(0).toUpperCase()+c.slice(1).replace(/([A-Z])/g," $1")})));for(let c of t.columns){let g=String(c.key),f;if(c.accessor)f=c.accessor(p);else if(typeof c.key=="string"&&c.key.includes(".")){let i=c.key.split("."),u=p;for(let d of i){if(u==null){f="";break}u=u[d]}f=u}else f=p[c.key];c.formatter&&(f=c.formatter(f)),m.push({key:c.header||g,value:f})}r=m,t.columns=[{key:"key",minWidth:15},{key:"value",minWidth:20}]}if(r.length===0){console.log(_.yellow("No data to display"));return}let n={...{includeHeaders:!0,border:!0,borderStyle:"single",headerStyle:p=>_.bold(p),cellStyle:p=>p,enableTextWrapping:!0},...t},s=n.columns;if(s)s=s.map(p=>({...p,enableTextWrapping:p.enableTextWrapping!==void 0?p.enableTextWrapping:n.enableTextWrapping}));else{let p=r[0];s=Object.keys(p).map(m=>({key:m,header:m.charAt(0).toUpperCase()+m.slice(1),enableTextWrapping:n.enableTextWrapping}))}let l={single:{topLeft:"\u250C",topRight:"\u2510",bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"},double:{topLeft:"\u2554",topRight:"\u2557",bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",vertical:"\u2551",leftT:"\u2560",rightT:"\u2563",topT:"\u2566",bottomT:"\u2569",cross:"\u256C"},rounded:{topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"}}[n.borderStyle],b=s.map(p=>({key:p.key,header:p.header||String(p.key),minWidth:p.minWidth||3,weight:p.weight,enableTextWrapping:p.enableTextWrapping,getValue:p.accessor?m=>p.accessor(m):m=>{if(typeof p.key=="string"&&p.key.includes(".")){let c=p.key.split("."),g=m;for(let f of c){if(g==null)return"";g=g[f]}return g??""}return m[p.key]??""}})),E=we(r,b),x=s.map((p,m)=>({...p,width:E[b[m].key]})),P=x.map(p=>p.header||String(p.key)),M=(p,m)=>{let c=x.map(i=>{let u;if(i.accessor)u=i.accessor(p);else if(typeof i.key=="string"&&i.key.includes(".")){let D=i.key.split("."),I=p;for(let Z of D){if(I==null){u="";break}I=I[Z]}u=I??""}else u=p[i.key]??"";let d=i.formatter?i.formatter(u):String(u||"");return i.enableTextWrapping?{lines:z(d,i.width),key:String(i.key)}:{lines:[d.length>i.width?d.substring(0,i.width-1)+"\u2026":d],key:String(i.key)}}),g=Math.max(...c.map(i=>i.lines.length)),f=[];for(let i=0;i<g;i++){let u=c.map((d,D)=>{let I=d.lines[i]||"";return n.cellStyle(I.padEnd(x[D].width),m,d.key)});f.push(u)}return f};if(n.border){let p=l.topLeft+x.map(c=>l.horizontal.repeat(c.width+2)).join(l.topT)+l.topRight;if(console.log(p),n.includeHeaders){let c=x.map((i,u)=>({lines:i.enableTextWrapping?z(P[u],i.width):[P[u]],width:i.width})),g=Math.max(...c.map(i=>i.lines.length));for(let i=0;i<g;i++){let u=l.vertical+c.map(d=>{let D=d.lines[i]||"";return" "+n.headerStyle(D.padEnd(d.width))+" "}).join(l.vertical)+l.vertical;console.log(u)}let f=l.leftT+x.map(i=>l.horizontal.repeat(i.width+2)).join(l.cross)+l.rightT;console.log(f)}r.forEach((c,g)=>{let f=M(c,g);if(f.forEach(i=>{console.log(l.vertical+i.map(u=>` ${u} `).join(l.vertical)+l.vertical)}),g<r.length-1&&f.length>1){let i=l.leftT+x.map(u=>l.horizontal.repeat(u.width+2)).join(l.cross)+l.rightT;console.log(i)}});let m=l.bottomLeft+x.map(c=>l.horizontal.repeat(c.width+2)).join(l.bottomT)+l.bottomRight;console.log(m)}else{if(n.includeHeaders){let p=x.map((g,f)=>({lines:g.enableTextWrapping?z(P[f],g.width):[P[f]],width:g.width})),m=Math.max(...p.map(g=>g.lines.length));for(let g=0;g<m;g++){let f=p.map(i=>{let u=i.lines[g]||"";return n.headerStyle(u.padEnd(i.width))}).join(" ");console.log(f)}let c=x.map(g=>"\u2500".repeat(g.width)).join(" ");console.log(c)}r.forEach((p,m)=>{let c=M(p,m);c.forEach(g=>{console.log(g.join(" "))}),m<r.length-1&&c.length>1&&console.log("")})}console.log(`Total: ${r.length} rows`)}import{z as e}from"zod";import{INVALID as Re,ParseStatus as Ee,ZodIssueCode as L,ZodParsedType as ne,ZodType as Pe,addIssueToContext as O,z as oe}from"zod";var Ae="ZodDecimal",Ie=/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/,j=class extends Pe{_parse(t){if(t.data!==null&&typeof t.data=="object"&&"toNumber"in t.data&&(t.data=t.data.toNumber()),this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==ne.number){let a=this._getOrReturnCtx(t);return O(a,{code:L.invalid_type,expected:ne.number,received:a.parsedType}),Re}let n,s=new Ee;for(let a of this._def.checks)if(a.kind==="precision"){let l=t.data.toString().match(Ie);Math.max((l[1]?l[1].length:0)-(l[2]?parseInt(l[2],10):0),0)>a.value&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.custom,message:a.message,params:{precision:a.value}}),s.dirty())}else a.kind==="wholeNumber"?t.data.toString().split(".")[0].length>a.value&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.custom,message:a.message,params:{wholeNumber:a.value}}),s.dirty()):a.kind==="min"?(a.inclusive?t.data<a.value:t.data<=a.value)&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="max"?(a.inclusive?t.data>a.value:t.data>=a.value)&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="finite"&&(Number.isFinite(t.data)||(n=this._getOrReturnCtx(t,n),O(n,{code:L.not_finite,message:a.message}),s.dirty()));return{status:s.value,value:t.data}}setLimit(t,o,n,s){return new j({...this._def,checks:[...this._def.checks,{kind:t,value:o,inclusive:n,message:s}]})}_addCheck(t){return new j({...this._def,checks:[...this._def.checks,t]})}lte(t,o){return this.setLimit("max",t,!0,o)}lt(t,o){return this.setLimit("max",t,!1,o)}max=this.lte;gt(t,o){return this.setLimit("min",t,!1,o)}gte(t,o){return this.setLimit("min",t,!0,o)}min=this.gte;precision(t,o){return this._addCheck({kind:"precision",value:t,message:o})}wholeNumber(t,o){return this._addCheck({kind:"wholeNumber",value:t,message:o})}get minValue(){let t=null;for(let o of this._def.checks)o.kind==="min"&&(t===null||o.value>t)&&(t=o.value);return t}get maxValue(){let t=null;for(let o of this._def.checks)o.kind==="max"&&(t===null||o.value<t)&&(t=o.value);return t}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:t})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:t})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:t})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:t})}finite(t){return this._addCheck({kind:"finite",message:t})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:t})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:t})}get isFinite(){let t=null,o=null;for(let n of this._def.checks){if(n.kind==="finite")return!0;n.kind==="min"?(o===null||n.value>o)&&(o=n.value):n.kind==="max"&&(t===null||n.value<t)&&(t=n.value)}return Number.isFinite(o)&&Number.isFinite(t)}},N=j;ee(N,"create",t=>new j({checks:[],typeName:Ae,coerce:t?.coerce??!1}));var rt=oe.object({template:oe.string().min(1,"Template cannot be empty")});var $e=e.object({password:e.string(),registry:e.string().nullable(),username:e.string()}),Me=e.object({docker_compose_file:e.string(),docker_config:$e.optional().nullable(),features:e.array(e.string()),kms_enabled:e.boolean(),manifest_version:e.number(),name:e.string(),public_logs:e.boolean(),public_sysinfo:e.boolean(),runner:e.string().optional(),salt:e.string().nullable().optional(),tproxy_enabled:e.boolean(),version:e.string().optional()}).passthrough(),De=e.object({name:e.string(),image:e.string(),compose_file:Me.nullable().optional(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),ports:e.array(e.any())}).passthrough(),Ve=e.object({id:e.string(),name:e.string(),status:e.string(),uptime:e.string(),app_url:e.string().nullable(),app_id:e.string(),instance_id:e.string().nullable(),configuration:De.nullable().optional(),exited_at:e.string().nullable(),boot_progress:e.string().nullable(),boot_error:e.string().nullable(),shutdown_progress:e.string().nullable(),image_version:e.string().nullable()}).passthrough(),Le=e.object({id:e.number(),username:e.string()}),Oe=e.object({id:e.number(),name:e.string(),region_identifier:e.string().optional()}),Y=e.object({hosted:Ve,name:e.string(),managed_user:Le,node:Oe,listed:e.boolean(),status:e.string(),in_progress:e.boolean(),dapp_dashboard_url:e.string().nullable(),syslog_endpoint:e.string(),allow_upgrade:e.boolean()}),W=e.object({id:e.number(),name:e.string(),status:e.string(),teepod_id:e.number().nullable(),teepod:e.object({id:e.number(),name:e.string()}).nullable(),user_id:e.number(),app_id:e.string(),vm_uuid:e.string().nullable(),instance_id:e.string().nullable(),app_url:e.string().nullable(),base_image:e.string(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),manifest_version:e.number(),version:e.string(),runner:e.string(),docker_compose_file:e.string(),features:e.array(e.string()).nullable(),created_at:e.string(),encrypted_env_pubkey:e.string()}),se=e.object({app_env_encrypt_pubkey:e.string(),app_id_salt:e.string()}),ie=e.object({id:e.number(),teepod_id:e.number().nullable(),teepod:e.object({id:e.number(),name:e.string()}).nullable(),name:e.string(),status:e.string(),in_progress:e.boolean(),app_id:e.string(),vm_uuid:e.string(),instance_id:e.string().nullable(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),base_image:e.string(),encrypted_env_pubkey:e.string(),listed:e.boolean(),project_id:e.string(),project_type:e.string().nullable()}),ae=e.object({username:e.string(),email:e.string(),credits:N.create({coerce:!0}),granted_credits:N.create({coerce:!0}),role:e.string(),avatar:e.string(),flag_reset_password:e.boolean(),team_name:e.string(),team_tier:e.string(),trial_ended_at:e.string().nullable()}),at=e.array(Y),le=e.object({detail:e.string()}),lt=e.object({key:e.string(),value:e.string()}),J=e.object({name:e.string(),description:e.string().optional(),version:e.array(e.number()).optional(),is_dev:e.boolean().optional(),os_image_hash:e.string().nullable().optional(),rootfs_hash:e.string().optional(),shared_ro:e.boolean().optional(),cmdline:e.string().optional(),kernel:e.string().optional(),initrd:e.string().optional(),hda:e.string().nullable().optional(),rootfs:e.string().optional(),bios:e.string().optional()}),Ne=e.object({teepod_id:e.number().nullable(),id:e.number().optional(),name:e.string(),listed:e.boolean().optional(),resource_score:e.number().optional(),remaining_vcpu:e.number().optional(),remaining_memory:e.number().optional(),remaining_cvm_slots:e.number().optional(),images:e.array(J).optional(),region_identifier:e.string().optional(),dedicated_for_team_id:e.number().nullable().optional(),support_onchain_kms:e.boolean().optional(),fmspc:e.string().nullable().optional(),device_id:e.string().nullable().optional()}),Fe=e.object({max_instances:e.number().nullable(),max_vcpu:e.number().nullable(),max_memory:e.number().nullable(),max_disk:e.number().nullable()}),ze=e.object({id:e.string(),slug:e.string(),url:e.string(),version:e.string(),chain_id:e.number(),kms_contract_address:e.string(),gateway_app_id:e.string().nullable().optional()}),ce=e.object({tier:e.string(),capacity:Fe,nodes:e.array(Ne),kms_list:e.array(ze).optional()}),pe=e.object({is_online:e.boolean(),is_public:e.boolean(),error:e.string().nullable(),internal_ip:e.string(),latest_handshake:e.string(),public_urls:e.array(e.object({app:e.string(),instance:e.string()}))}),me=e.object({compose_file:e.object({bash_script:e.string().nullable(),docker_compose_file:e.string(),docker_config:e.object({password:e.string(),registry:e.string().nullable(),username:e.string()}),features:e.array(e.string()),kms_enabled:e.boolean(),manifest_version:e.number(),name:e.string(),pre_launch_script:e.string(),public_logs:e.boolean(),public_sysinfo:e.boolean(),runner:e.string(),salt:e.string(),tproxy_enabled:e.boolean(),version:e.string()}),env_pubkey:e.string(),salt:e.string()}),ge=e.object({id:e.number(),name:e.string(),status:e.string(),teepod_id:e.number(),teepod:e.object({id:e.number(),name:e.string()}),user_id:e.number(),app_id:e.string(),vm_uuid:e.string(),instance_id:e.string().nullable(),app_url:e.string().nullable(),base_image:e.string(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),manifest_version:e.number(),version:e.string().nullable(),runner:e.string(),docker_compose_file:e.string(),features:e.array(e.string()).nullable(),created_at:e.string(),encrypted_env_pubkey:e.string()}),ue=e.object({is_online:e.boolean(),is_public:e.boolean(),error:e.string().nullable(),app_certificates:e.array(e.object({subject:e.object({common_name:e.string().nullable(),organization:e.string().nullable(),country:e.string().nullable(),state:e.string().nullable().optional(),locality:e.string().nullable().optional()}),issuer:e.object({common_name:e.string().nullable(),organization:e.string().nullable(),country:e.string().nullable()}),serial_number:e.string(),not_before:e.string(),not_after:e.string(),version:e.string(),fingerprint:e.string(),signature_algorithm:e.string(),sans:e.string().nullable(),is_ca:e.boolean(),position_in_chain:e.number(),quote:e.string().nullable()})).nullable(),tcb_info:e.object({mrtd:e.string(),rootfs_hash:e.string(),rtmr0:e.string(),rtmr1:e.string(),rtmr2:e.string(),rtmr3:e.string(),event_log:e.array(e.object({imr:e.number(),event_type:e.number(),digest:e.string(),event:e.string(),event_payload:e.string()}))}).nullable(),compose_file:e.string().nullable()});import{createClient as je}from"@phala/cloud";var pt=process.env.CLOUD_URL||"https://cloud.phala.network";var mt=1,gt=2048,ut=40,dt="dstack-0.3.6",v={USER_INFO:"auth/me",TEEPODS:"teepods/available",TEEPOD_IMAGES:r=>`teepods/${r}/images`,CVMS:r=>`cvms?user_id=${r}`,CVM_BY_APP_ID:r=>`cvms/app_${r}`,CVM_NETWORK:r=>`cvms/app_${r}/network`,CVM_START:r=>`cvms/app_${r}/start`,CVM_STOP:r=>`cvms/app_${r}/stop`,CVM_RESTART:r=>`cvms/app_${r}/restart`,CVM_LOGS:r=>`cvms/app_${r}/logs`,CVM_FROM_CONFIGURATION:"cvms/from_cvm_configuration",CVM_PUBKEY:"cvms/pubkey/from_cvm_configuration",CVM_UPGRADE:r=>`cvms/app_${r}/compose`,CVM_ATTESTATION:r=>`cvms/app_${r}/attestation`,CVM_RESIZE:r=>`cvms/app_${r}/resources`,CVM_COMPOSE:r=>`cvms/${r}/compose`,REPLICATE_CVM:r=>`cvms/${r}/replicas`},ft=`version: '3.8'
|
1
|
+
var ke=Object.defineProperty;var xe=(r,t,o)=>t in r?ke(r,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[t]=o;var ee=(r,t,o)=>(xe(r,typeof t!="symbol"?t+"":t,o),o);import v from"chalk";function Se(r){let t=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return r.replace(new RegExp(t,"g"),"")}function V(r){return Se(r).length}function z(r,t){if(!r)return[""];if(V(r)<=t)return[r];let o=[],n="",s=0,a=r.split(/(\s+)/).filter(l=>l.trim().length>0);for(let l of a){let b=V(l);if(b>t){n&&(o.push(n),n="",s=0),o.push(l);continue}s+b+(s>0?1:0)>t?(o.push(n),n=l,s=b):n?(n=`${n} ${l}`,s+=b+1):(n=l,s=b)}return n&&o.push(n),o}var y={error:(r,...t)=>{console.error(v.red("\u2717"),v.red(r),...t)},warn:(r,...t)=>{console.log(v.yellow("\u26A0"),v.yellow(r),...t)},info:(r,...t)=>{console.log(v.blue("\u2139"),v.blue(r),...t)},success:(r,...t)=>{console.log(v.green("\u2713"),v.green(r),...t)},debug:(r,...t)=>{process.env.DEBUG&&console.log(v.gray("\u{1F50D}"),v.gray(r),...t)},table:(r,t)=>{if(r.length===0){console.log(v.yellow("No data to display"));return}if(t)if(typeof t[0]=="string"){let o=t.map(n=>({key:n,header:n.charAt(0).toUpperCase()+n.slice(1)}));H(r,{columns:o,borderStyle:"rounded",headerStyle:n=>v.cyan.bold(n)})}else H(r,{columns:t,borderStyle:"rounded",headerStyle:o=>v.cyan.bold(o)});else H(r,{borderStyle:"rounded",headerStyle:o=>v.cyan.bold(o)})},keyValueTable:(r,t)=>{let n={...{borderStyle:"rounded",enableTextWrapping:!0,maxDepth:2,formatKeys:!0,keyFormatter:h=>{let k=["URL","ID","API","UI","URI","CPU","GPU","RAM","JSON","XML","HTML","HTTP","HTTPS","SSH","FTP","IP","TCP","UDP","DNS","SSL","TLS","SQL","VCPU","CVM","TEE","IO"],S={teepod:"TEEPod",dstack:"Dstack"},R;h.includes("_")?R=h.split("_").map(w=>w.charAt(0).toUpperCase()+w.slice(1).toLowerCase()).join(" "):h.includes("-")?R=h.split("-").map(w=>w.charAt(0).toUpperCase()+w.slice(1).toLowerCase()).join(" "):R=h.charAt(0).toUpperCase()+h.slice(1).replace(/([a-z])([A-Z])/g,"$1 $2");for(let w of k){let $=new RegExp(`\\b${w.toLowerCase()}\\b`,"gi");R=R.replace($,w)}for(let[w,$]of Object.entries(S)){let B=new RegExp(`\\b${w}\\b`,"gi");R=R.replace(B,$)}return R},valueFormatter:h=>String(h??"")},...t},{include:s,exclude:a,keyFormatter:l,valueFormatter:b,formatKeys:E,keyWidth:x,valueWidth:P,borderStyle:M,enableTextWrapping:p,maxDepth:m}=n,c=Object.keys(r);if(s&&(c=c.filter(h=>s.includes(h))),a&&(c=c.filter(h=>!a.includes(h))),c.length===0){console.log(v.yellow("No properties to display"));return}let g=c.map(h=>{let k=r[h],S;return k==null?S="":typeof k=="object"&&!Array.isArray(k)?S=te(k,0,m):Array.isArray(k)?k.length===0?S="[]":typeof k[0]=="object"?S=`[${k.length} items]`:S=`[${k.join(", ")}]`:S=String(k),b&&(S=b(k,h)),{key:E&&l?v.cyan.bold(l(h)):v.cyan.bold(h),value:S}}),f=re(),i=x,u=P;if(i||(i=Math.max(...g.map(h=>V(h.key)),10),i=Math.min(i,Math.floor(f/3))),!u){u=Math.max(...g.map(S=>V(S.value)),10),u+=3;let h=7,k=f-i-h;u=Math.min(u,k)}let d=Te(M),D=`${d.topLeft}${d.horizontal.repeat(i+2)}${d.topT}${d.horizontal.repeat(u+2)}${d.topRight}`,I=`${d.leftT}${d.horizontal.repeat(i+2)}${d.cross}${d.horizontal.repeat(u+2)}${d.rightT}`;console.log(D),console.log(I),g.forEach((h,k)=>{let S=p?z(h.key,i):[h.key],R=p?z(h.value,u):[h.value],w=Math.max(S.length,R.length);for(let $=0;$<w;$++){let B=S[$]||"",Q=R[$]||"",_e=B+" ".repeat(Math.max(0,i-V(B))),Ce=Q+" ".repeat(Math.max(0,u-V(Q)));console.log(`${d.vertical} ${_e} ${d.vertical} ${Ce} ${d.vertical}`)}k<g.length-1&&console.log(`${d.leftT}${d.horizontal.repeat(i+2)}${d.cross}${d.horizontal.repeat(u+2)}${d.rightT}`)});let Z=`${d.bottomLeft}${d.horizontal.repeat(i+2)}${d.bottomT}${d.horizontal.repeat(u+2)}${d.bottomRight}`;console.log(Z)},startSpinner:r=>(process.stdout.write(`${v.blue("\u27F3")} ${r}... `),{stop:(t=!0,o)=>{let n=t?v.green("\u2713"):v.red("\u2717"),s=o?`: ${o}`:"";console.log(`${n}${s}`)}}),break(){console.log("")}};function te(r,t,o){if(t>=o)return"[Nested Object]";if(r==null)return"";if(Array.isArray(r))return r.length===0?"[]":`[${r.length} items]`;let n=[];for(let[s,a]of Object.entries(r))a==null?n.push(`${s}: `):typeof a=="object"?n.push(`${s}: ${te(a,t+1,o)}`):n.push(`${s}: ${a}`);return n.join(", ")}function Te(r="single"){return{single:{topLeft:"\u250C",topRight:"\u2510",bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"},double:{topLeft:"\u2554",topRight:"\u2557",bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",vertical:"\u2551",leftT:"\u2560",rightT:"\u2563",topT:"\u2566",bottomT:"\u2569",cross:"\u256C"},rounded:{topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"}}[r]}function re(){return process.stdout.columns||80}function we(r,t,o={}){let n=re(),s=o.borderChars??3,l=(o.additionalBorderWidth??1)+t.length*s,b=n-l,E={},x=0,P=0;for(let m of t){let c=m.key;if(m.fixedWidth!==void 0){E[c]=m.fixedWidth,x+=m.fixedWidth;continue}let g=m.minWidth??m.header.length,f;m.getWidth?f=Math.max(g,m.header.length,...r.map(i=>m.getWidth(i))):m.getValue?f=Math.max(g,m.header.length,...r.map(i=>String(m.getValue(i)||"").length)):f=Math.max(g,m.header.length,...r.map(i=>String(i[m.key]||"").length)),E[c]=f,x+=f,P+=m.weight??1}let M=Math.max(0,b-x);if(M>0&&P>0)for(let m of t){let c=m.key;if(m.fixedWidth===void 0&&m.weight){let g=Math.floor(M*(m.weight/P));E[c]+=g}}let p=Object.values(E).reduce((m,c)=>m+c,0)+l;if(p>n){let m=b/(p-l),c={};for(let g of t){let f=g.key,i=g.minWidth??g.header.length;c[f]=Math.max(i,Math.floor(E[f]*m))}return c}return E}function H(r,t={}){if(t.keyValueMode&&r.length===1){let p=r[0],m=[];t.columns||(t.columns=Object.keys(p).map(c=>({key:c,header:c.charAt(0).toUpperCase()+c.slice(1).replace(/([A-Z])/g," $1")})));for(let c of t.columns){let g=String(c.key),f;if(c.accessor)f=c.accessor(p);else if(typeof c.key=="string"&&c.key.includes(".")){let i=c.key.split("."),u=p;for(let d of i){if(u==null){f="";break}u=u[d]}f=u}else f=p[c.key];c.formatter&&(f=c.formatter(f)),m.push({key:c.header||g,value:f})}r=m,t.columns=[{key:"key",minWidth:15},{key:"value",minWidth:20}]}if(r.length===0){console.log(v.yellow("No data to display"));return}let n={...{includeHeaders:!0,border:!0,borderStyle:"single",headerStyle:p=>v.bold(p),cellStyle:p=>p,enableTextWrapping:!0},...t},s=n.columns;if(s)s=s.map(p=>({...p,enableTextWrapping:p.enableTextWrapping!==void 0?p.enableTextWrapping:n.enableTextWrapping}));else{let p=r[0];s=Object.keys(p).map(m=>({key:m,header:m.charAt(0).toUpperCase()+m.slice(1),enableTextWrapping:n.enableTextWrapping}))}let l={single:{topLeft:"\u250C",topRight:"\u2510",bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"},double:{topLeft:"\u2554",topRight:"\u2557",bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",vertical:"\u2551",leftT:"\u2560",rightT:"\u2563",topT:"\u2566",bottomT:"\u2569",cross:"\u256C"},rounded:{topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",vertical:"\u2502",leftT:"\u251C",rightT:"\u2524",topT:"\u252C",bottomT:"\u2534",cross:"\u253C"}}[n.borderStyle],b=s.map(p=>({key:p.key,header:p.header||String(p.key),minWidth:p.minWidth||3,weight:p.weight,enableTextWrapping:p.enableTextWrapping,getValue:p.accessor?m=>p.accessor(m):m=>{if(typeof p.key=="string"&&p.key.includes(".")){let c=p.key.split("."),g=m;for(let f of c){if(g==null)return"";g=g[f]}return g??""}return m[p.key]??""}})),E=we(r,b),x=s.map((p,m)=>({...p,width:E[b[m].key]})),P=x.map(p=>p.header||String(p.key)),M=(p,m)=>{let c=x.map(i=>{let u;if(i.accessor)u=i.accessor(p);else if(typeof i.key=="string"&&i.key.includes(".")){let D=i.key.split("."),I=p;for(let Z of D){if(I==null){u="";break}I=I[Z]}u=I??""}else u=p[i.key]??"";let d=i.formatter?i.formatter(u):String(u||"");return i.enableTextWrapping?{lines:z(d,i.width),key:String(i.key)}:{lines:[d.length>i.width?d.substring(0,i.width-1)+"\u2026":d],key:String(i.key)}}),g=Math.max(...c.map(i=>i.lines.length)),f=[];for(let i=0;i<g;i++){let u=c.map((d,D)=>{let I=d.lines[i]||"";return n.cellStyle(I.padEnd(x[D].width),m,d.key)});f.push(u)}return f};if(n.border){let p=l.topLeft+x.map(c=>l.horizontal.repeat(c.width+2)).join(l.topT)+l.topRight;if(console.log(p),n.includeHeaders){let c=x.map((i,u)=>({lines:i.enableTextWrapping?z(P[u],i.width):[P[u]],width:i.width})),g=Math.max(...c.map(i=>i.lines.length));for(let i=0;i<g;i++){let u=l.vertical+c.map(d=>{let D=d.lines[i]||"";return" "+n.headerStyle(D.padEnd(d.width))+" "}).join(l.vertical)+l.vertical;console.log(u)}let f=l.leftT+x.map(i=>l.horizontal.repeat(i.width+2)).join(l.cross)+l.rightT;console.log(f)}r.forEach((c,g)=>{let f=M(c,g);if(f.forEach(i=>{console.log(l.vertical+i.map(u=>` ${u} `).join(l.vertical)+l.vertical)}),g<r.length-1&&f.length>1){let i=l.leftT+x.map(u=>l.horizontal.repeat(u.width+2)).join(l.cross)+l.rightT;console.log(i)}});let m=l.bottomLeft+x.map(c=>l.horizontal.repeat(c.width+2)).join(l.bottomT)+l.bottomRight;console.log(m)}else{if(n.includeHeaders){let p=x.map((g,f)=>({lines:g.enableTextWrapping?z(P[f],g.width):[P[f]],width:g.width})),m=Math.max(...p.map(g=>g.lines.length));for(let g=0;g<m;g++){let f=p.map(i=>{let u=i.lines[g]||"";return n.headerStyle(u.padEnd(i.width))}).join(" ");console.log(f)}let c=x.map(g=>"\u2500".repeat(g.width)).join(" ");console.log(c)}r.forEach((p,m)=>{let c=M(p,m);c.forEach(g=>{console.log(g.join(" "))}),m<r.length-1&&c.length>1&&console.log("")})}console.log(`Total: ${r.length} rows`)}import{z as e}from"zod";import{INVALID as Re,ParseStatus as Ee,ZodIssueCode as L,ZodParsedType as ne,ZodType as Pe,addIssueToContext as O,z as oe}from"zod";var Ae="ZodDecimal",Ie=/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/,j=class extends Pe{_parse(t){if(t.data!==null&&typeof t.data=="object"&&"toNumber"in t.data&&(t.data=t.data.toNumber()),this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==ne.number){let a=this._getOrReturnCtx(t);return O(a,{code:L.invalid_type,expected:ne.number,received:a.parsedType}),Re}let n,s=new Ee;for(let a of this._def.checks)if(a.kind==="precision"){let l=t.data.toString().match(Ie);Math.max((l[1]?l[1].length:0)-(l[2]?parseInt(l[2],10):0),0)>a.value&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.custom,message:a.message,params:{precision:a.value}}),s.dirty())}else a.kind==="wholeNumber"?t.data.toString().split(".")[0].length>a.value&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.custom,message:a.message,params:{wholeNumber:a.value}}),s.dirty()):a.kind==="min"?(a.inclusive?t.data<a.value:t.data<=a.value)&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="max"?(a.inclusive?t.data>a.value:t.data>=a.value)&&(n=this._getOrReturnCtx(t,n),O(n,{code:L.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="finite"&&(Number.isFinite(t.data)||(n=this._getOrReturnCtx(t,n),O(n,{code:L.not_finite,message:a.message}),s.dirty()));return{status:s.value,value:t.data}}setLimit(t,o,n,s){return new j({...this._def,checks:[...this._def.checks,{kind:t,value:o,inclusive:n,message:s}]})}_addCheck(t){return new j({...this._def,checks:[...this._def.checks,t]})}lte(t,o){return this.setLimit("max",t,!0,o)}lt(t,o){return this.setLimit("max",t,!1,o)}max=this.lte;gt(t,o){return this.setLimit("min",t,!1,o)}gte(t,o){return this.setLimit("min",t,!0,o)}min=this.gte;precision(t,o){return this._addCheck({kind:"precision",value:t,message:o})}wholeNumber(t,o){return this._addCheck({kind:"wholeNumber",value:t,message:o})}get minValue(){let t=null;for(let o of this._def.checks)o.kind==="min"&&(t===null||o.value>t)&&(t=o.value);return t}get maxValue(){let t=null;for(let o of this._def.checks)o.kind==="max"&&(t===null||o.value<t)&&(t=o.value);return t}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:t})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:t})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:t})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:t})}finite(t){return this._addCheck({kind:"finite",message:t})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:t})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:t})}get isFinite(){let t=null,o=null;for(let n of this._def.checks){if(n.kind==="finite")return!0;n.kind==="min"?(o===null||n.value>o)&&(o=n.value):n.kind==="max"&&(t===null||n.value<t)&&(t=n.value)}return Number.isFinite(o)&&Number.isFinite(t)}},N=j;ee(N,"create",t=>new j({checks:[],typeName:Ae,coerce:t?.coerce??!1}));var rt=oe.object({template:oe.string().min(1,"Template cannot be empty")});var $e=e.object({password:e.string(),registry:e.string().nullable(),username:e.string()}),Me=e.object({docker_compose_file:e.string(),docker_config:$e.optional().nullable(),features:e.array(e.string()),kms_enabled:e.boolean(),manifest_version:e.number(),name:e.string(),public_logs:e.boolean(),public_sysinfo:e.boolean(),runner:e.string().optional(),salt:e.string().nullable().optional(),tproxy_enabled:e.boolean(),version:e.string().optional()}).passthrough(),De=e.object({name:e.string(),image:e.string(),compose_file:Me.nullable().optional(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),ports:e.array(e.any())}).passthrough(),Ve=e.object({id:e.string(),name:e.string(),status:e.string(),uptime:e.string(),app_url:e.string().nullable(),app_id:e.string(),instance_id:e.string().nullable(),configuration:De.nullable().optional(),exited_at:e.string().nullable(),boot_progress:e.string().nullable(),boot_error:e.string().nullable(),shutdown_progress:e.string().nullable(),image_version:e.string().nullable()}).passthrough(),Le=e.object({id:e.number(),username:e.string()}),Oe=e.object({id:e.number(),name:e.string(),region_identifier:e.string().optional()}),Y=e.object({hosted:Ve,name:e.string(),managed_user:Le,node:Oe,listed:e.boolean(),status:e.string(),in_progress:e.boolean(),dapp_dashboard_url:e.string().nullable(),syslog_endpoint:e.string(),allow_upgrade:e.boolean()}),W=e.object({id:e.number(),name:e.string(),status:e.string(),teepod_id:e.number().nullable(),teepod:e.object({id:e.number(),name:e.string()}).nullable(),user_id:e.number(),app_id:e.string(),vm_uuid:e.string().nullable(),instance_id:e.string().nullable(),app_url:e.string().nullable(),base_image:e.string(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),manifest_version:e.number(),version:e.string(),runner:e.string(),docker_compose_file:e.string(),features:e.array(e.string()).nullable(),created_at:e.string(),encrypted_env_pubkey:e.string()}),se=e.object({app_env_encrypt_pubkey:e.string(),app_id_salt:e.string()}),ie=e.object({id:e.number(),teepod_id:e.number().nullable(),teepod:e.object({id:e.number(),name:e.string()}).nullable(),name:e.string(),status:e.string(),in_progress:e.boolean(),app_id:e.string(),vm_uuid:e.string(),instance_id:e.string().nullable(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),base_image:e.string(),encrypted_env_pubkey:e.string(),listed:e.boolean(),project_id:e.string(),project_type:e.string().nullable()}),ae=e.object({username:e.string(),email:e.string(),credits:N.create({coerce:!0}),granted_credits:N.create({coerce:!0}),avatar:e.string()}).passthrough(),at=e.array(Y),le=e.object({detail:e.string()}),lt=e.object({key:e.string(),value:e.string()}),J=e.object({name:e.string(),description:e.string().optional(),version:e.array(e.number()).optional(),is_dev:e.boolean().optional(),os_image_hash:e.string().nullable().optional(),rootfs_hash:e.string().optional(),shared_ro:e.boolean().optional(),cmdline:e.string().optional(),kernel:e.string().optional(),initrd:e.string().optional(),hda:e.string().nullable().optional(),rootfs:e.string().optional(),bios:e.string().optional()}),Ne=e.object({teepod_id:e.number().nullable(),id:e.number().optional(),name:e.string(),listed:e.boolean().optional(),resource_score:e.number().optional(),remaining_vcpu:e.number().optional(),remaining_memory:e.number().optional(),remaining_cvm_slots:e.number().optional(),images:e.array(J).optional(),region_identifier:e.string().optional(),dedicated_for_team_id:e.number().nullable().optional(),support_onchain_kms:e.boolean().optional(),fmspc:e.string().nullable().optional(),device_id:e.string().nullable().optional()}),Fe=e.object({max_instances:e.number().nullable(),max_vcpu:e.number().nullable(),max_memory:e.number().nullable(),max_disk:e.number().nullable()}),ze=e.object({id:e.string(),slug:e.string(),url:e.string(),version:e.string(),chain_id:e.number(),kms_contract_address:e.string(),gateway_app_id:e.string().nullable().optional()}),ce=e.object({tier:e.string(),capacity:Fe,nodes:e.array(Ne),kms_list:e.array(ze).optional()}),pe=e.object({is_online:e.boolean(),is_public:e.boolean(),error:e.string().nullable(),internal_ip:e.string(),latest_handshake:e.string(),public_urls:e.array(e.object({app:e.string(),instance:e.string()}))}),me=e.object({compose_file:e.object({bash_script:e.string().nullable(),docker_compose_file:e.string(),docker_config:e.object({password:e.string(),registry:e.string().nullable(),username:e.string()}),features:e.array(e.string()),kms_enabled:e.boolean(),manifest_version:e.number(),name:e.string(),pre_launch_script:e.string(),public_logs:e.boolean(),public_sysinfo:e.boolean(),runner:e.string(),salt:e.string(),tproxy_enabled:e.boolean(),version:e.string()}),env_pubkey:e.string(),salt:e.string()}),ge=e.object({id:e.number(),name:e.string(),status:e.string(),teepod_id:e.number(),teepod:e.object({id:e.number(),name:e.string()}),user_id:e.number(),app_id:e.string(),vm_uuid:e.string(),instance_id:e.string().nullable(),app_url:e.string().nullable(),base_image:e.string(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),manifest_version:e.number(),version:e.string().nullable(),runner:e.string(),docker_compose_file:e.string(),features:e.array(e.string()).nullable(),created_at:e.string(),encrypted_env_pubkey:e.string()}),ue=e.object({is_online:e.boolean(),is_public:e.boolean(),error:e.string().nullable(),app_certificates:e.array(e.object({subject:e.object({common_name:e.string().nullable(),organization:e.string().nullable(),country:e.string().nullable(),state:e.string().nullable().optional(),locality:e.string().nullable().optional()}),issuer:e.object({common_name:e.string().nullable(),organization:e.string().nullable(),country:e.string().nullable()}),serial_number:e.string(),not_before:e.string(),not_after:e.string(),version:e.string(),fingerprint:e.string(),signature_algorithm:e.string(),sans:e.string().nullable(),is_ca:e.boolean(),position_in_chain:e.number(),quote:e.string().nullable()})).nullable(),tcb_info:e.object({mrtd:e.string(),rootfs_hash:e.string(),rtmr0:e.string(),rtmr1:e.string(),rtmr2:e.string(),rtmr3:e.string(),event_log:e.array(e.object({imr:e.number(),event_type:e.number(),digest:e.string(),event:e.string(),event_payload:e.string()}))}).nullable(),compose_file:e.string().nullable()});import{createClient as je}from"@phala/cloud";var pt=process.env.CLOUD_URL||"https://cloud.phala.network";var mt=1,gt=2048,ut=40,dt="dstack-0.3.6",_={USER_INFO:"auth/me",TEEPODS:"teepods/available",TEEPOD_IMAGES:r=>`teepods/${r}/images`,CVMS:r=>`cvms?user_id=${r}`,CVM_BY_APP_ID:r=>`cvms/app_${r}`,CVM_NETWORK:r=>`cvms/app_${r}/network`,CVM_START:r=>`cvms/app_${r}/start`,CVM_STOP:r=>`cvms/app_${r}/stop`,CVM_RESTART:r=>`cvms/app_${r}/restart`,CVM_LOGS:r=>`cvms/app_${r}/logs`,CVM_FROM_CONFIGURATION:"cvms/from_cvm_configuration",CVM_PUBKEY:"cvms/pubkey/from_cvm_configuration",CVM_UPGRADE:r=>`cvms/app_${r}/compose`,CVM_ATTESTATION:r=>`cvms/app_${r}/attestation`,CVM_RESIZE:r=>`cvms/app_${r}/resources`,CVM_COMPOSE:r=>`cvms/${r}/compose`,REPLICATE_CVM:r=>`cvms/${r}/replicas`},ft=`version: '3.8'
|
2
2
|
services:
|
3
3
|
postgres:
|
4
4
|
image: ankane/pgvector:latest
|
@@ -54,5 +54,5 @@ services:
|
|
54
54
|
{{#each envVars}} - {{{this}}}
|
55
55
|
{{/each}}
|
56
56
|
restart: always
|
57
|
-
`;function de(r){try{return JSON.stringify(r)}catch(t){return t instanceof Error&&t.message.includes("cyclic")?"[Cyclic Object]":String(r)}}async function xt(r){try{y.debug(`Fetching user info from ${
|
58
|
-
//# sourceMappingURL=chunk-
|
57
|
+
`;function de(r){try{return JSON.stringify(r)}catch(t){return t instanceof Error&&t.message.includes("cyclic")?"[Cyclic Object]":String(r)}}async function xt(r){try{y.debug(`Fetching user info from ${_.USER_INFO}`);let o=await je({apiKey:r}).get(_.USER_INFO);y.debug(`Received response: ${de(o)}`);try{return ae.parse(o)}catch(n){throw y.error(`Failed to parse user info response: ${n}`),y.debug(`Response structure: ${de(o)}`),n}}catch(t){throw y.error(`Failed to get user info: ${t instanceof Error?t.message:String(t)}`),new Error(`Failed to get user info: ${t instanceof Error?t.message:String(t)}`)}}import{createClient as T}from"@phala/cloud";import Ue from"inquirer";import{z as ye}from"zod";import A from"node:fs";import X from"node:path";import F from"node:os";import G from"node:crypto";var K=X.join(F.homedir(),".phala-cloud"),U=X.join(K,"api-key"),q=X.join(K,"docker-credentials.json");function fe(){if(!A.existsSync(K))try{A.mkdirSync(K,{recursive:!0})}catch(r){throw y.error(`Failed to create directory ${K}:`,r),r}}function he(){let r=[F.hostname(),F.platform(),F.arch(),F.cpus()[0]?.model||"",F.userInfo().username],t=G.createHash("sha256");return t.update(r.join("|")),t.digest()}function We(r){try{let t=he(),o=G.randomBytes(16),n=G.createCipheriv("aes-256-cbc",t.slice(0,32),o),s=n.update(r,"utf8","hex");return s+=n.final("hex"),o.toString("hex")+":"+s}catch(t){throw y.error("Encryption failed:",t),new Error("Failed to encrypt data")}}function Ke(r){try{let t=he(),o=r.split(":");if(o.length!==2)throw new Error("Invalid encrypted format");let n=Buffer.from(o[0],"hex"),s=o[1],a=G.createDecipheriv("aes-256-cbc",t.slice(0,32),n),l=a.update(s,"hex","utf8");return l+=a.final("utf8"),l}catch(t){throw y.error("Decryption failed:",t),new Error("Failed to decrypt data")}}async function At(r){fe();try{let t=We(r);A.writeFileSync(U,t,{mode:384})}catch(t){throw y.error("Failed to save API key:",t),t}}function C(){try{if(A.existsSync(U)){let r=A.readFileSync(U,"utf8").trim();return Ke(r)}return null}catch(r){return y.error("Failed to read API key:",r),null}}async function It(){try{A.existsSync(U)?(A.unlinkSync(U),y.success("API key removed successfully.")):y.warn("No API key found to remove.")}catch(r){throw y.error("Failed to remove API key:",r),r}}async function $t(r){fe();try{A.writeFileSync(q,JSON.stringify(r,null,2),{mode:384}),y.success("Docker information saved successfully.")}catch(t){throw y.error("Failed to save Docker information:",t),t}}async function Mt(){try{if(A.existsSync(q)){let r=A.readFileSync(q,"utf8");return JSON.parse(r)}return null}catch(r){return y.error("Failed to read Docker credentials:",r),null}}async function be(){try{let r=C(),o=await T({apiKey:r}).get(_.CVMS(0));return ye.array(Y).parse(o)}catch(r){throw new Error(`Failed to get CVMs: ${r instanceof Error?r.message:String(r)}`)}}async function Ut(r){let o=(await be()).find(n=>n.hosted?.app_id===r||`app_${n.hosted?.app_id}`===r);if(!o)y.error(`CVM with App ID app_${r} not detected`),process.exit(1);else return y.success(`CVM with App ID app_${r} detected`),o.hosted?.app_id||""}async function Bt(r){try{let t=C(),n=await T({apiKey:t}).get(_.CVM_BY_APP_ID(r));return ie.parse(n)}catch(t){throw new Error(`Failed to get CVM by App ID: ${t instanceof Error?t.message:String(t)}`)}}async function Gt(r){try{let t=C(),n=await T({apiKey:t}).post(_.CVM_PUBKEY,r);return se.parse(n)}catch(t){throw new Error(`Failed to get pubkey from CVM: ${t instanceof Error?t.message:String(t)}`)}}async function Zt(r){try{let t=C(),n=await T({apiKey:t}).get(_.CVM_NETWORK(r));return pe.parse(n)}catch(t){throw new Error(`Failed to get network information for CVM: ${t instanceof Error?t.message:String(t)}`)}}async function Ht(r){try{let t=C(),n=await T({apiKey:t}).post(_.CVM_FROM_CONFIGURATION,r);return W.parse(n)}catch(t){throw t instanceof ye.ZodError?(y.error("Schema validation error:",JSON.stringify(t.errors,null,2)),y.error("API response:",JSON.stringify(t.format(),null,2)),new Error(`Response validation failed: ${JSON.stringify(t.errors)}`)):new Error(`Failed to create CVM: ${t instanceof Error?t.message:String(t)}`)}}async function Yt(r){try{let t=C(),n=await T({apiKey:t}).post(_.CVM_START(r));return W.parse(n)}catch(t){throw new Error(`Failed to start CVM: ${t instanceof Error?t.message:String(t)}`)}}async function Jt(r){try{let t=C(),n=await T({apiKey:t}).post(_.CVM_STOP(r));return W.parse(n)}catch(t){throw new Error(`Failed to stop CVM: ${t instanceof Error?t.message:String(t)}`)}}async function qt(r){try{let t=C(),n=await T({apiKey:t}).post(_.CVM_RESTART(r));return W.parse(n)}catch(t){throw new Error(`Failed to restart CVM: ${t instanceof Error?t.message:String(t)}`)}}async function Xt(r,t){try{let o=C(),s=await T({apiKey:o}).put(_.CVM_UPGRADE(r),t);return le.parse(s)}catch(o){throw new Error(`Failed to upgrade CVM: ${o instanceof Error?o.message:String(o)}`)}}async function Qt(r){try{let t=C();return await T({apiKey:t}).delete(_.CVM_BY_APP_ID(r)),!0}catch(t){throw new Error(`Failed to delete CVM: ${t instanceof Error?t.message:String(t)}`)}}async function er(r){try{let t=C();return await T({apiKey:t}).put(_.CVM_BY_APP_ID(r.app_id),r)}catch(t){throw new Error(`Failed to update CVM: ${t instanceof Error?t.message:String(t)}`)}}async function tr(){let r=y.startSpinner("Fetching available CVMs"),t=await be();if(r.stop(!0),!t||t.length===0){y.info("No CVMs found for your account");return}let o=t.map(s=>{let a=s.hosted?.app_id||s.hosted?.id,l=s.name||s.hosted?.name,b=s.status||s.hosted?.status;return{name:`${l||"Unnamed"} (${a}) - Status: ${b||"Unknown"}`,value:a}}),{selectedCvm:n}=await Ue.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:o}]);return n}async function rr(r){try{let t=C(),n=await T({apiKey:t}).get(_.CVM_ATTESTATION(r));try{return ue.parse(n)}catch(s){return y.debug(`Validation error: ${s instanceof Error?s.message:String(s)}`),{is_online:!!n?.is_online,is_public:!!n?.is_public,error:typeof n?.error=="string"?n.error:null,app_certificates:Array.isArray(n?.app_certificates)?n.app_certificates:null,tcb_info:n?.tcb_info||null,compose_file:typeof n?.compose_file=="string"?n.compose_file:null}}}catch(t){throw new Error(`Failed to get attestation information: ${t instanceof Error?t.message:String(t)}`)}}async function nr(r){try{let t=C(),n=await T({apiKey:t}).get(_.CVM_COMPOSE(r));return me.parse(n)}catch(t){throw new Error(`Failed to get CVM compose config: ${t instanceof Error?t.message:String(t)}`)}}async function or(r,t){try{let o=C(),s=await T({apiKey:o}).post(_.REPLICATE_CVM(r),t);return ge.parse(s)}catch(o){throw new Error(`Failed to replicate CVM: ${o instanceof Error?o.message:String(o)}`)}}async function sr(r,t,o,n,s){try{let a=C(),l=T({apiKey:a}),b={};if(t!==void 0&&(b.vcpu=t),o!==void 0&&(b.memory=o),n!==void 0&&(b.disk_size=n),s!==void 0&&(b.allow_restart=s),Object.keys(b).length===0)throw new Error("At least one resource parameter must be provided");return await l.patch(_.CVM_RESIZE(r),b),!0}catch(a){throw new Error(`Failed to resize CVM: ${a instanceof Error?a.message:String(a)}`)}}import{createClient as ve}from"@phala/cloud";import{z as Be}from"zod";async function Ge(){try{let r=C(),o=await(await ve({apiKey:r})).get(_.TEEPODS);return ce.parse(o)}catch(r){throw new Error(`Failed to get TEEPods: ${r instanceof Error?r.message:String(r)}`)}}async function hr(r){try{let t=C(),o=ve({apiKey:t}),s=(await Ge()).nodes.find(l=>l.teepod_id===Number(r));if(s&&s.images&&s.images.length>0)return s.images;let a=await(await o).get(_.TEEPOD_IMAGES(r));return Be.array(J).parse(a)}catch(t){throw new Error(`Failed to get TEEPod images: ${t instanceof Error?t.message:String(t)}`)}}export{y as a,At as b,C as c,It as d,$t as e,Mt as f,pt as g,mt as h,gt as i,ut as j,dt as k,ft as l,ht as m,rt as n,$e as o,Me as p,De as q,Ve as r,Le as s,Oe as t,Y as u,W as v,se as w,ie as x,ae as y,at as z,le as A,lt as B,J as C,Ne as D,Fe as E,ze as F,ce as G,pe as H,me as I,ge as J,ue as K,xt as L,be as M,Ut as N,Bt as O,Gt as P,Zt as Q,Ht as R,Yt as S,Jt as T,qt as U,Xt as V,Qt as W,er as X,tr as Y,rr as Z,nr as _,or as $,sr as aa,Ge as ba,hr as ca};
|
58
|
+
//# sourceMappingURL=chunk-UU6UDBBR.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/api/types.ts","../src/utils/types.ts","../src/api/auth.ts","../src/utils/constants.ts","../src/api/cvms.ts","../src/utils/credentials.ts","../src/api/teepods.ts"],"sourcesContent":["import chalk from \"chalk\"\n\n/**\n * Strips ANSI color escape sequences from a string to get its visible length\n * @param str String that may contain ANSI color codes\n * @returns String with all ANSI color codes removed\n */\nfunction stripAnsi(str: string): string {\n // ANSI escape sequence regex pattern\n const pattern = [\n '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n '(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n ].join('|');\n return str.replace(new RegExp(pattern, 'g'), '');\n}\n\n/**\n * Gets the visible length of a string, ignoring ANSI color codes\n * @param str String that may contain ANSI color codes\n * @returns Visible length of the string\n */\nfunction getVisibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\n/**\n * Wraps text to fit within a specified width\n * @param text Text to wrap\n * @param maxWidth Maximum width for the text\n * @returns Array of lines of text\n */\nfunction wrapText(text: string, maxWidth: number): string[] {\n if (!text) return [''];\n \n // Handle case where a single word is longer than maxWidth\n if (getVisibleLength(text) <= maxWidth) return [text];\n \n const lines: string[] = [];\n let currentLine = '';\n let currentLineVisibleLength = 0;\n \n // Split by any whitespace and preserve URLs\n const words = text.split(/(\\s+)/).filter(word => word.trim().length > 0);\n \n for (const word of words) {\n const wordVisibleLength = getVisibleLength(word);\n \n // If the word itself is longer than maxWidth, split it\n if (wordVisibleLength > maxWidth) {\n if (currentLine) {\n lines.push(currentLine);\n currentLine = '';\n currentLineVisibleLength = 0;\n }\n \n // This is a simplification as it's complex to split words with color codes\n // For long colored words, we'll just add them as-is\n lines.push(word);\n continue;\n }\n \n // If adding the word would exceed maxWidth\n if (currentLineVisibleLength + wordVisibleLength + (currentLineVisibleLength > 0 ? 1 : 0) > maxWidth) {\n lines.push(currentLine);\n currentLine = word;\n currentLineVisibleLength = wordVisibleLength;\n } else {\n // Add word to current line\n if (currentLine) {\n currentLine = `${currentLine} ${word}`;\n currentLineVisibleLength += wordVisibleLength + 1; // +1 for space\n } else {\n currentLine = word;\n currentLineVisibleLength = wordVisibleLength;\n }\n }\n }\n \n if (currentLine) {\n lines.push(currentLine);\n }\n \n return lines;\n}\n\nexport const logger = {\n error: (message: string, ...args: any[]) => {\n console.error(chalk.red('✗'), chalk.red(message), ...args)\n },\n warn: (message: string, ...args: any[]) => {\n console.log(chalk.yellow('⚠'), chalk.yellow(message), ...args)\n },\n info: (message: string, ...args: any[]) => {\n console.log(chalk.blue('ℹ'), chalk.blue(message), ...args)\n },\n success: (message: string, ...args: any[]) => {\n console.log(chalk.green('✓'), chalk.green(message), ...args)\n },\n debug: (message: string, ...args: any[]) => {\n if (process.env.DEBUG) {\n console.log(chalk.gray('🔍'), chalk.gray(message), ...args)\n }\n },\n table: <T>(\n data: T[], \n columns?: Array<string> | Array<{ key: keyof T | string, header?: string }> | Array<any>\n ) => {\n if (data.length === 0) {\n console.log(chalk.yellow('No data to display'));\n return;\n }\n \n // Support for old API with just column names\n if (columns) {\n if (typeof columns[0] === 'string') {\n // Convert simple string array to column config\n const columnConfig = (columns as string[]).map(col => ({\n key: col,\n header: col.charAt(0).toUpperCase() + col.slice(1) // Capitalize\n }));\n \n // Filter data to only include specified columns\n formatTable(data, { \n columns: columnConfig,\n borderStyle: 'rounded',\n headerStyle: (text) => chalk.cyan.bold(text)\n });\n } else {\n // Using the new column config format\n formatTable(data, { \n columns: columns as Array<{ key: keyof T | string, header?: string }>,\n borderStyle: 'rounded',\n headerStyle: (text) => chalk.cyan.bold(text)\n });\n }\n } else {\n // No columns specified, show all\n formatTable(data, {\n borderStyle: 'rounded',\n headerStyle: (text) => chalk.cyan.bold(text)\n });\n }\n },\n /**\n * Displays an object's properties in a key-value table format (vertical table)\n * @param data Object to display\n * @param options Table display options\n */\n keyValueTable: <T extends object>(\n data: T,\n options?: {\n include?: string[]; // Optional list of keys to include\n exclude?: string[]; // Optional list of keys to exclude\n keyFormatter?: (key: string) => string; // Optional formatter for keys\n valueFormatter?: (value: any, key: string) => string; // Optional formatter for values\n formatKeys?: boolean; // Whether to format keys (default: true)\n keyHeader?: string; // Optional header for the key column\n valueHeader?: string; // Optional header for the value column\n keyWidth?: number; // Optional fixed width for the key column\n valueWidth?: number; // Optional fixed width for the value column\n borderStyle?: 'single' | 'double' | 'rounded'; // Border style\n enableTextWrapping?: boolean; // Whether to wrap text\n maxDepth?: number; // Maximum depth for nested objects (default: 2)\n }\n ) => {\n // Default options\n const defaultOptions = {\n borderStyle: 'rounded' as const,\n enableTextWrapping: true,\n maxDepth: 2,\n formatKeys: true,\n // Improved key formatter with different formatting options\n keyFormatter: (key: string) => {\n // Common acronyms that should remain uppercase\n const commonAcronyms = [\n 'URL', 'ID', 'API', 'UI', 'URI', 'CPU', 'GPU', 'RAM', 'JSON', 'XML', 'HTML', \n 'HTTP', 'HTTPS', 'SSH', 'FTP', 'IP', 'TCP', 'UDP', 'DNS', 'SSL', 'TLS', 'SQL', \n 'VCPU', 'CVM', 'TEE', 'IO'\n ];\n \n // Phala-specific terms with custom capitalization\n const customTerms = {\n 'teepod': 'TEEPod',\n 'dstack': 'Dstack'\n };\n \n // Handle different cases\n let formatted;\n \n if (key.includes('_')) {\n // Handle snake_case: convert app_url to App Url\n formatted = key.split('_')\n .map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join(' ');\n } else if (key.includes('-')) {\n // Handle kebab-case: convert app-url to App Url\n formatted = key.split('-')\n .map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join(' ');\n } else {\n // Handle camelCase: convert appUrl to App Url\n formatted = key.charAt(0).toUpperCase() + \n key.slice(1).replace(/([a-z])([A-Z])/g, '$1 $2');\n }\n \n // Replace common acronyms in the formatted text, preserving case\n for (const acronym of commonAcronyms) {\n // Only uppercase the whole acronym if it appears as a whole word\n const regex = new RegExp(`\\\\b${acronym.toLowerCase()}\\\\b`, 'gi');\n formatted = formatted.replace(regex, acronym);\n }\n \n // Apply custom term formatting\n for (const [term, replacement] of Object.entries(customTerms)) {\n const regex = new RegExp(`\\\\b${term}\\\\b`, 'gi');\n formatted = formatted.replace(regex, replacement);\n }\n \n return formatted;\n },\n valueFormatter: (value: any) => String(value ?? '')\n };\n\n const mergedOptions = { ...defaultOptions, ...options };\n const { include, exclude, keyFormatter, valueFormatter, formatKeys, keyWidth, valueWidth, borderStyle, enableTextWrapping, maxDepth } = mergedOptions;\n\n // Extract keys based on include/exclude\n let keys = Object.keys(data);\n if (include) {\n keys = keys.filter(key => include.includes(key));\n }\n if (exclude) {\n keys = keys.filter(key => !exclude.includes(key));\n }\n\n // If no keys to display, show message and return\n if (keys.length === 0) {\n console.log(chalk.yellow('No properties to display'));\n return;\n }\n\n // Prepare the data array for the table formatter\n const tableData = keys.map(key => {\n const value = data[key as keyof T];\n \n // Format the value based on its type\n let formattedValue: string;\n if (value === null || value === undefined) {\n formattedValue = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n // Handle nested objects (but limit depth)\n formattedValue = formatNestedObject(value, 0, maxDepth);\n } else if (Array.isArray(value)) {\n // Handle arrays\n if (value.length === 0) {\n formattedValue = '[]';\n } else if (typeof value[0] === 'object') {\n // Array of objects\n formattedValue = `[${value.length} items]`;\n } else {\n // Array of primitives\n formattedValue = `[${value.join(', ')}]`;\n }\n } else {\n // Handle primitives\n formattedValue = String(value);\n }\n \n // Apply custom value formatter if provided\n if (valueFormatter) {\n formattedValue = valueFormatter(value, key);\n }\n \n return {\n key: formatKeys && keyFormatter ? chalk.cyan.bold(keyFormatter(key)) : chalk.cyan.bold(key),\n value: formattedValue\n };\n });\n\n // Calculate column widths based on content\n const terminalWidth = getTerminalWidth();\n let finalKeyWidth = keyWidth;\n let finalValueWidth = valueWidth;\n \n // Calculate key column width based on content if not specified\n if (!finalKeyWidth) {\n finalKeyWidth = Math.max(\n ...tableData.map(item => getVisibleLength(item.key)),\n 10 // Minimum key width\n );\n // Limit to 1/3 of terminal width\n finalKeyWidth = Math.min(finalKeyWidth, Math.floor(terminalWidth / 3));\n }\n \n // Calculate value column width based on content if not specified\n if (!finalValueWidth) {\n // Calculate based on actual content lengths\n finalValueWidth = Math.max(\n ...tableData.map(item => getVisibleLength(item.value)),\n 10 // Minimum value width\n );\n \n // Add some padding for readability (3 chars)\n finalValueWidth += 3;\n \n // Ensure we don't exceed terminal width\n const borderChars = 7; // Typical border chars count\n const maxValueWidth = terminalWidth - finalKeyWidth - borderChars;\n finalValueWidth = Math.min(finalValueWidth, maxValueWidth);\n }\n\n // Configure border characters based on style\n const border = getBorderChars(borderStyle);\n\n // Header row\n const topBorder = `${border.topLeft}${border.horizontal.repeat(finalKeyWidth + 2)}${border.topT}${border.horizontal.repeat(finalValueWidth + 2)}${border.topRight}`;\n const headerSeparator = `${border.leftT}${border.horizontal.repeat(finalKeyWidth + 2)}${border.cross}${border.horizontal.repeat(finalValueWidth + 2)}${border.rightT}`;\n \n console.log(topBorder);\n console.log(headerSeparator);\n \n // Data rows\n tableData.forEach((row, index) => {\n const keyLines = enableTextWrapping ? wrapText(row.key, finalKeyWidth) : [row.key];\n const valueLines = enableTextWrapping ? wrapText(row.value, finalValueWidth) : [row.value];\n \n const maxLines = Math.max(keyLines.length, valueLines.length);\n \n for (let i = 0; i < maxLines; i++) {\n const keyLine = keyLines[i] || '';\n const valueLine = valueLines[i] || '';\n \n // Pad with spaces to align columns, accounting for invisible ANSI characters\n const keyContent = keyLine + ' '.repeat(Math.max(0, finalKeyWidth - getVisibleLength(keyLine)));\n const valueContent = valueLine + ' '.repeat(Math.max(0, finalValueWidth - getVisibleLength(valueLine)));\n \n console.log(`${border.vertical} ${keyContent} ${border.vertical} ${valueContent} ${border.vertical}`);\n }\n \n // Add a separator between rows, but not after the last row\n if (index < tableData.length - 1) {\n console.log(`${border.leftT}${border.horizontal.repeat(finalKeyWidth + 2)}${border.cross}${border.horizontal.repeat(finalValueWidth + 2)}${border.rightT}`);\n }\n });\n \n // Bottom border\n const bottomBorder = `${border.bottomLeft}${border.horizontal.repeat(finalKeyWidth + 2)}${border.bottomT}${border.horizontal.repeat(finalValueWidth + 2)}${border.bottomRight}`;\n console.log(bottomBorder);\n },\n startSpinner: (message: string) => {\n process.stdout.write(`${chalk.blue('⟳')} ${message}... `)\n return {\n stop: (success = true, result?: string) => {\n const icon = success ? chalk.green('✓') : chalk.red('✗')\n const resultText = result ? `: ${result}` : ''\n console.log(`${icon}${resultText}`)\n }\n }\n },\n break() {\n console.log(\"\")\n },\n}\n\n/**\n * Formats a nested object for display in the keyValueTable\n */\nfunction formatNestedObject(obj: any, currentDepth: number, maxDepth: number): string {\n if (currentDepth >= maxDepth) {\n return '[Nested Object]';\n }\n \n if (obj === null || obj === undefined) {\n return '';\n }\n \n if (Array.isArray(obj)) {\n if (obj.length === 0) return '[]';\n return `[${obj.length} items]`;\n }\n \n const lines: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined) {\n lines.push(`${key}: `);\n } else if (typeof value === 'object') {\n lines.push(`${key}: ${formatNestedObject(value, currentDepth + 1, maxDepth)}`);\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n \n return lines.join(', ');\n}\n\n/**\n * Get border characters based on style\n */\nfunction getBorderChars(style: 'single' | 'double' | 'rounded' = 'single') {\n return {\n single: {\n topLeft: '┌', topRight: '┐', bottomLeft: '└', bottomRight: '┘',\n horizontal: '─', vertical: '│', \n leftT: '├', rightT: '┤', topT: '┬', bottomT: '┴', cross: '┼'\n },\n double: {\n topLeft: '╔', topRight: '╗', bottomLeft: '╚', bottomRight: '╝',\n horizontal: '═', vertical: '║',\n leftT: '╠', rightT: '╣', topT: '╦', bottomT: '╩', cross: '╬'\n },\n rounded: {\n topLeft: '╭', topRight: '╮', bottomLeft: '╰', bottomRight: '╯',\n horizontal: '─', vertical: '│',\n leftT: '├', rightT: '┤', topT: '┬', bottomT: '┴', cross: '┼'\n }\n }[style];\n}\n\nfunction getTerminalWidth(): number {\n return process.stdout.columns || 80; // Default to 80 if width cannot be determined\n}\n\n/**\n * Calculate column widths for tabular data display\n * @param data Array of objects to display in table\n * @param columns Configuration for each column to display\n * @param options Additional display options\n * @returns Object with calculated widths for each column\n */\nexport function calculateColumnWidths<T>(\n data: T[],\n columns: {\n key: keyof T;\n header: string;\n minWidth?: number;\n weight?: number; // Relative weight for distributing remaining space (default: 1)\n fixedWidth?: number; // If set, this column will have exactly this width\n getValue?: (item: T) => string; // Custom accessor for nested properties\n getWidth?: (item: T) => number; // Custom width calculator\n }[],\n options: {\n borderChars?: number; // Characters used for borders per column\n additionalBorderWidth?: number; // Additional border width (outer borders, etc.)\n } = {}\n): { [key: string]: number } {\n const terminalWidth = getTerminalWidth();\n \n // Calculate total border width\n const borderCharsPerColumn = options.borderChars ?? 3; // Default \"| \" + \" \" per column\n const additionalBorderWidth = options.additionalBorderWidth ?? 1; // Default \"|\" at the end\n const totalBorderWidth = additionalBorderWidth + columns.length * borderCharsPerColumn;\n \n const availableContentWidth = terminalWidth - totalBorderWidth;\n \n // Calculate initial widths based on content and minimum requirements\n const initialWidths: { [key: string]: number } = {};\n let totalFixedWidth = 0;\n let totalWeight = 0;\n \n // First pass: Calculate initial widths and total weight\n for (const column of columns) {\n const key = column.key as string;\n \n if (column.fixedWidth !== undefined) {\n initialWidths[key] = column.fixedWidth;\n totalFixedWidth += column.fixedWidth;\n continue;\n }\n \n const minWidth = column.minWidth ?? column.header.length;\n \n let contentWidth: number;\n if (column.getWidth) {\n // Use custom width calculator if provided\n contentWidth = Math.max(\n minWidth,\n column.header.length,\n ...data.map(item => column.getWidth!(item))\n );\n } else if (column.getValue) {\n // Use custom accessor if provided\n contentWidth = Math.max(\n minWidth,\n column.header.length,\n ...data.map(item => String(column.getValue!(item) || '').length)\n );\n } else {\n // Default behavior\n contentWidth = Math.max(\n minWidth,\n column.header.length,\n ...data.map(item => String(item[column.key] || '').length)\n );\n }\n \n initialWidths[key] = contentWidth;\n totalFixedWidth += contentWidth;\n totalWeight += column.weight ?? 1;\n }\n \n // Calculate remaining width to distribute\n const remainingWidth = Math.max(0, availableContentWidth - totalFixedWidth);\n \n // If we have remaining width and weights, distribute according to weights\n if (remainingWidth > 0 && totalWeight > 0) {\n for (const column of columns) {\n const key = column.key as string;\n if (column.fixedWidth === undefined && column.weight) {\n const extraWidth = Math.floor(remainingWidth * (column.weight / totalWeight));\n initialWidths[key] += extraWidth;\n }\n }\n }\n \n // If total width would exceed terminal, scale everything down proportionally\n const calculatedTotalWidth = Object.values(initialWidths).reduce((sum, width) => sum + width, 0) + totalBorderWidth;\n \n if (calculatedTotalWidth > terminalWidth) {\n const scale = availableContentWidth / (calculatedTotalWidth - totalBorderWidth);\n \n const finalWidths: { [key: string]: number } = {};\n for (const column of columns) {\n const key = column.key as string;\n const minWidth = column.minWidth ?? column.header.length;\n finalWidths[key] = Math.max(minWidth, Math.floor(initialWidths[key] * scale));\n }\n \n return finalWidths;\n }\n \n return initialWidths;\n}\n\n/**\n * Example of how to use calculateColumnWidths with nested objects\n * @param data Array of objects with nested properties\n * @returns Object with calculated column widths\n */\nexport function calculateNestedTableWidths<T>(\n data: T[],\n columns: Array<{\n key: string; // Output key in the result object\n header: string;\n minWidth: number;\n weight?: number;\n accessor: (item: T) => string; // Function to access the nested property\n }>\n): { [key: string]: number } {\n // Convert to the format expected by calculateColumnWidths\n const columnConfig = columns.map((col, index) => ({\n key: `col_${index}` as keyof T, // Use a unique key for each column\n header: col.header,\n minWidth: col.minWidth,\n weight: col.weight,\n getValue: col.accessor\n }));\n\n // Get the raw widths\n const widths = calculateColumnWidths(data, columnConfig, { borderChars: 3, additionalBorderWidth: 1 });\n \n // Remap to expected keys\n const result: { [key: string]: number } = {};\n columns.forEach((col, index) => {\n result[col.key] = widths[`col_${index}` as string];\n });\n \n return result;\n}\n\n/**\n * Format and display data as a table in the terminal with customizable styling\n * @param data Array of objects to display in table\n * @param options Table display options\n */\nexport function formatTable<T>(\n data: T[],\n options: {\n columns?: Array<{\n key: keyof T | string;\n header?: string;\n minWidth?: number;\n weight?: number;\n accessor?: (item: T) => any;\n formatter?: (value: any) => string;\n enableTextWrapping?: boolean; // Changed from wrapText to enableTextWrapping\n }>;\n includeHeaders?: boolean;\n border?: boolean;\n borderStyle?: 'single' | 'double' | 'rounded';\n headerStyle?: (text: string) => string;\n cellStyle?: (text: string, rowIndex: number, colKey: string) => string;\n enableTextWrapping?: boolean; // Global option to control text wrapping\n keyValueMode?: boolean; // Option to display a single object in key-value rows\n } = {}\n): void {\n // If in key-value mode, transform the data\n if (options.keyValueMode && data.length === 1) {\n const obj = data[0];\n const keyValueData: Array<{key: string, value: any}> = [];\n \n // Generate columns if not provided\n if (!options.columns) {\n options.columns = Object.keys(obj).map(key => ({\n key,\n header: key.charAt(0).toUpperCase() + key.slice(1).replace(/([A-Z])/g, ' $1') // Capitalize and add spaces\n }));\n }\n \n // Transform object to key-value rows\n for (const col of options.columns) {\n const key = String(col.key);\n let value;\n \n if (col.accessor) {\n value = col.accessor(obj);\n } else if (typeof col.key === 'string' && col.key.includes('.')) {\n // Handle dot notation for nested objects\n const parts = col.key.split('.');\n let current: any = obj;\n for (const part of parts) {\n if (current === null || current === undefined) {\n value = '';\n break;\n }\n current = current[part as keyof typeof current];\n }\n value = current;\n } else {\n value = obj[col.key as keyof T];\n }\n \n // Apply formatter if provided\n if (col.formatter) {\n value = col.formatter(value);\n }\n \n keyValueData.push({\n key: col.header || key,\n value: value\n });\n }\n \n // Replace data and columns\n data = keyValueData as unknown as T[];\n options.columns = [\n { key: 'key' as keyof T, minWidth: 15 },\n { key: 'value' as keyof T, minWidth: 20 }\n ];\n }\n\n if (data.length === 0) {\n console.log(chalk.yellow('No data to display'));\n return;\n }\n\n // Default options\n const defaultOptions = {\n includeHeaders: true,\n border: true,\n borderStyle: 'single' as const,\n headerStyle: (text: string) => chalk.bold(text),\n cellStyle: (text: string) => text,\n enableTextWrapping: true // Enable text wrapping by default\n };\n\n const mergedOptions = { ...defaultOptions, ...options };\n\n // Auto-generate columns if not provided\n let columns = mergedOptions.columns;\n if (!columns) {\n const sample = data[0];\n columns = Object.keys(sample).map(key => ({\n key,\n header: key.charAt(0).toUpperCase() + key.slice(1), // Capitalize header\n enableTextWrapping: mergedOptions.enableTextWrapping\n }));\n } else {\n // Ensure all columns have enableTextWrapping property set if not explicitly defined\n columns = columns.map(col => ({\n ...col,\n enableTextWrapping: col.enableTextWrapping !== undefined ? col.enableTextWrapping : mergedOptions.enableTextWrapping\n }));\n }\n\n // Configure border characters based on style\n const borderChars = {\n single: {\n topLeft: '┌', topRight: '┐', bottomLeft: '└', bottomRight: '┘',\n horizontal: '─', vertical: '│', \n leftT: '├', rightT: '┤', topT: '┬', bottomT: '┴', cross: '┼'\n },\n double: {\n topLeft: '╔', topRight: '╗', bottomLeft: '╚', bottomRight: '╝',\n horizontal: '═', vertical: '║',\n leftT: '╠', rightT: '╣', topT: '╦', bottomT: '╩', cross: '╬'\n },\n rounded: {\n topLeft: '╭', topRight: '╮', bottomLeft: '╰', bottomRight: '╯',\n horizontal: '─', vertical: '│',\n leftT: '├', rightT: '┤', topT: '┬', bottomT: '┴', cross: '┼'\n }\n };\n\n const border = borderChars[mergedOptions.borderStyle];\n\n // Configure column config for width calculation\n const columnConfig = columns.map(col => ({\n key: col.key as keyof T,\n header: col.header || String(col.key),\n minWidth: col.minWidth || 3,\n weight: col.weight,\n enableTextWrapping: col.enableTextWrapping,\n getValue: col.accessor ? \n (item: T) => col.accessor!(item) : \n (item: T) => {\n // Handle dot notation for nested objects\n if (typeof col.key === 'string' && col.key.includes('.')) {\n const parts = col.key.split('.');\n let value: any = item;\n for (const part of parts) {\n if (value === null || value === undefined) return '';\n value = value[part as keyof typeof value];\n }\n return value ?? '';\n }\n return item[col.key as keyof T] ?? '';\n }\n }));\n\n // Calculate column widths\n const widths = calculateColumnWidths(data, columnConfig);\n\n // Prepare column and header arrays with proper keys\n const formattedColumns = columns.map((col, index) => ({\n ...col,\n width: widths[columnConfig[index].key as string]\n }));\n\n // Format headers and rows\n const headers = formattedColumns.map(col => col.header || String(col.key));\n \n // Helper to format a row with text wrapping support\n const formatRow = (row: T, rowIndex: number) => {\n // For each column, get the value and wrap it if needed\n const rowData = formattedColumns.map(col => {\n let value;\n if (col.accessor) {\n value = col.accessor(row);\n } else if (typeof col.key === 'string' && col.key.includes('.')) {\n // Handle dot notation for nested objects\n const parts = col.key.split('.');\n let current: any = row;\n for (const part of parts) {\n if (current === null || current === undefined) {\n value = '';\n break;\n }\n current = current[part as keyof typeof current];\n }\n value = current ?? '';\n } else {\n value = row[col.key as keyof T] ?? '';\n }\n \n // Format the value\n let displayValue = col.formatter ? col.formatter(value) : String(value || '');\n \n // Wrap text if enabled for this column\n if (col.enableTextWrapping) {\n return {\n lines: wrapText(displayValue, col.width),\n key: String(col.key)\n };\n }\n // Truncate if not wrapping\n return {\n lines: [displayValue.length > col.width ? \n displayValue.substring(0, col.width - 1) + '…' : \n displayValue],\n key: String(col.key)\n };\n });\n \n // Calculate the maximum number of lines in any column for this row\n const maxLines = Math.max(...rowData.map(col => col.lines.length));\n \n // Format each line of the row\n const formattedLines = [];\n for (let lineIndex = 0; lineIndex < maxLines; lineIndex++) {\n const lineContent = rowData.map((col, colIndex) => {\n const content = col.lines[lineIndex] || '';\n return mergedOptions.cellStyle(\n content.padEnd(formattedColumns[colIndex].width), \n rowIndex, \n col.key\n );\n });\n formattedLines.push(lineContent);\n }\n \n return formattedLines;\n };\n\n // Generate table parts\n if (mergedOptions.border) {\n // Top border\n const topBorder = border.topLeft + \n formattedColumns.map(col => border.horizontal.repeat(col.width + 2)).join(border.topT) +\n border.topRight;\n console.log(topBorder);\n \n // Headers with possible wrapping\n if (mergedOptions.includeHeaders) {\n // Wrap header text if needed\n const wrappedHeaders = formattedColumns.map((col, i) => ({\n lines: col.enableTextWrapping ? wrapText(headers[i], col.width) : [headers[i]],\n width: col.width\n }));\n \n // Find the maximum number of lines in any header\n const maxHeaderLines = Math.max(...wrappedHeaders.map(h => h.lines.length));\n \n // Display each line of the header\n for (let lineIndex = 0; lineIndex < maxHeaderLines; lineIndex++) {\n const headerLine = border.vertical + \n wrappedHeaders.map((header) => {\n const content = header.lines[lineIndex] || '';\n return ' ' + mergedOptions.headerStyle(content.padEnd(header.width)) + ' ';\n }).join(border.vertical) + \n border.vertical;\n console.log(headerLine);\n }\n \n // Header-data separator\n const headerSeparator = border.leftT +\n formattedColumns.map(col => border.horizontal.repeat(col.width + 2)).join(border.cross) +\n border.rightT;\n console.log(headerSeparator);\n }\n \n // Data rows with text wrapping\n data.forEach((row, rowIndex) => {\n const formattedRows = formatRow(row, rowIndex);\n \n formattedRows.forEach(rowLine => {\n console.log(\n border.vertical + \n rowLine.map(cell => ` ${cell} `).join(border.vertical) + \n border.vertical\n );\n });\n \n // Optional: Add a separator between rows for better readability\n if (rowIndex < data.length - 1 && formattedRows.length > 1) {\n const rowSeparator = border.leftT +\n formattedColumns.map(col => border.horizontal.repeat(col.width + 2)).join(border.cross) +\n border.rightT;\n console.log(rowSeparator);\n }\n });\n \n // Bottom border\n const bottomBorder = border.bottomLeft + \n formattedColumns.map(col => border.horizontal.repeat(col.width + 2)).join(border.bottomT) +\n border.bottomRight;\n console.log(bottomBorder);\n } else {\n // No borders, simpler display\n if (mergedOptions.includeHeaders) {\n // Wrap header text if needed\n const wrappedHeaders = formattedColumns.map((col, i) => ({\n lines: col.enableTextWrapping ? wrapText(headers[i], col.width) : [headers[i]],\n width: col.width\n }));\n \n // Find the maximum number of lines in any header\n const maxHeaderLines = Math.max(...wrappedHeaders.map(h => h.lines.length));\n \n // Display each line of the header\n for (let lineIndex = 0; lineIndex < maxHeaderLines; lineIndex++) {\n const headerLine = wrappedHeaders.map((header) => {\n const content = header.lines[lineIndex] || '';\n return mergedOptions.headerStyle(content.padEnd(header.width));\n }).join(' ');\n console.log(headerLine);\n }\n \n // Simple underline for headers\n const headerSeparator = formattedColumns.map(col => \n '─'.repeat(col.width)\n ).join(' ');\n console.log(headerSeparator);\n }\n \n // Data rows with text wrapping\n data.forEach((row, rowIndex) => {\n const formattedRows = formatRow(row, rowIndex);\n \n formattedRows.forEach(rowLine => {\n console.log(rowLine.join(' '));\n });\n \n // Add a blank line between multi-line rows for better readability\n if (rowIndex < data.length - 1 && formattedRows.length > 1) {\n console.log('');\n }\n });\n }\n \n console.log(`Total: ${data.length} rows`);\n}\n\n","import { z } from 'zod';\nimport { ZodDecimal as zodDecimal } from '../utils/types';\n// Docker Config Schema\nexport const dockerConfigSchema = z.object({\n password: z.string(),\n registry: z.string().nullable(),\n username: z.string()\n});\n\n// Compose File Schema\nexport const composeFileSchema = z.object({\n docker_compose_file: z.string(),\n docker_config: dockerConfigSchema.optional().nullable(),\n features: z.array(z.string()),\n kms_enabled: z.boolean(),\n manifest_version: z.number(),\n name: z.string(),\n public_logs: z.boolean(),\n public_sysinfo: z.boolean(),\n runner: z.string().optional(),\n salt: z.string().nullable().optional(),\n tproxy_enabled: z.boolean(),\n version: z.string().optional()\n}).passthrough();\n\n// Configuration Schema\nexport const configurationSchema = z.object({\n name: z.string(),\n image: z.string(),\n compose_file: composeFileSchema.nullable().optional(),\n vcpu: z.number(),\n memory: z.number(),\n disk_size: z.number(),\n ports: z.array(z.any())\n}).passthrough();\n\n// Hosted Schema\nexport const hostedSchema = z.object({\n id: z.string(),\n name: z.string(),\n status: z.string(),\n uptime: z.string(),\n app_url: z.string().nullable(),\n app_id: z.string(),\n instance_id: z.string().nullable(),\n configuration: configurationSchema.nullable().optional(),\n exited_at: z.string().nullable(),\n boot_progress: z.string().nullable(),\n boot_error: z.string().nullable(),\n shutdown_progress: z.string().nullable(),\n image_version: z.string().nullable(),\n}).passthrough();\n\n// Managed User Schema\nexport const managedUserSchema = z.object({\n id: z.number(),\n username: z.string()\n});\n\n// Node Schema\nexport const nodeSchema = z.object({\n id: z.number(),\n name: z.string(),\n region_identifier: z.string().optional(),\n});\n\n// CVM Instance Schema\nexport const cvmInstanceSchema = z.object({\n hosted: hostedSchema,\n name: z.string(),\n managed_user: managedUserSchema,\n node: nodeSchema,\n listed: z.boolean(),\n status: z.string(),\n in_progress: z.boolean(),\n dapp_dashboard_url: z.string().nullable(),\n syslog_endpoint: z.string(),\n allow_upgrade: z.boolean()\n});\n\n// POST request CVM Response Schema\nexport const postCvmResponseSchema = z.object({\n id: z.number(),\n name: z.string(),\n status: z.string(),\n teepod_id: z.number().nullable(),\n teepod: z.object({\n id: z.number(),\n name: z.string()\n }).nullable(),\n user_id: z.number(),\n app_id: z.string(),\n vm_uuid: z.string().nullable(),\n instance_id: z.string().nullable(),\n app_url: z.string().nullable(),\n base_image: z.string(),\n vcpu: z.number(),\n memory: z.number(),\n disk_size: z.number(),\n manifest_version: z.number(),\n version: z.string(),\n runner: z.string(),\n docker_compose_file: z.string(),\n features: z.array(z.string()).nullable(),\n created_at: z.string(),\n encrypted_env_pubkey: z.string()\n});\n\n// Get Pubkey From CVM Response Schema\nexport const getPubkeyFromCvmResponseSchema = z.object({\n app_env_encrypt_pubkey: z.string(),\n app_id_salt: z.string()\n});\n\n// Get CVM By App ID Response Schema\nexport const getCvmByAppIdResponseSchema = z.object({\n id: z.number(),\n teepod_id: z.number().nullable(),\n teepod: z.object({\n id: z.number(),\n name: z.string()\n }).nullable(),\n name: z.string(),\n status: z.string(),\n in_progress: z.boolean(),\n app_id: z.string(),\n vm_uuid: z.string(),\n instance_id: z.string().nullable(),\n vcpu: z.number(),\n memory: z.number(),\n disk_size: z.number(),\n base_image: z.string(),\n encrypted_env_pubkey: z.string(),\n listed: z.boolean(),\n project_id: z.string(),\n project_type: z.string().nullable()\n});\n\n// Get User Info Response Schema\nexport const getUserInfoResponseSchema = z.object({\n username: z.string(),\n email: z.string(),\n credits: zodDecimal.create({ coerce: true }),\n granted_credits: zodDecimal.create({ coerce: true }),\n avatar: z.string(),\n}).passthrough();\n\n// Get CVMs By User ID Response Schema\nexport const getCvmsByUserIdResponseSchema = z.array(cvmInstanceSchema);\n\n// Upgrade CVM Response Schema\nexport const upgradeCvmResponseSchema = z.object({\n detail: z.string()\n});\n\n// Encrypted Env Item Schema\nexport const encryptedEnvItemSchema = z.object({\n key: z.string(),\n value: z.string()\n});\n\n// Image Schema\nexport const imageSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n version: z.array(z.number()).optional(),\n is_dev: z.boolean().optional(),\n os_image_hash: z.string().nullable().optional(),\n rootfs_hash: z.string().optional(),\n shared_ro: z.boolean().optional(),\n cmdline: z.string().optional(),\n kernel: z.string().optional(),\n initrd: z.string().optional(),\n hda: z.string().nullable().optional(),\n rootfs: z.string().optional(),\n bios: z.string().optional()\n});\n\n// TEEPod Schema with extended properties\nexport const teepodSchema = z.object({\n teepod_id: z.number().nullable(),\n id: z.number().optional(),\n name: z.string(),\n listed: z.boolean().optional(),\n resource_score: z.number().optional(),\n remaining_vcpu: z.number().optional(),\n remaining_memory: z.number().optional(),\n remaining_cvm_slots: z.number().optional(),\n images: z.array(imageSchema).optional(),\n region_identifier: z.string().optional(),\n dedicated_for_team_id: z.number().nullable().optional(),\n support_onchain_kms: z.boolean().optional(),\n fmspc: z.string().nullable().optional(),\n device_id: z.string().nullable().optional(),\n});\n\n// Capacity Schema\nexport const capacitySchema = z.object({\n max_instances: z.number().nullable(),\n max_vcpu: z.number().nullable(),\n max_memory: z.number().nullable(),\n max_disk: z.number().nullable()\n});\n\n// KMS List Item Schema\nexport const kmsListItemSchema = z.object({\n id: z.string(),\n slug: z.string(),\n url: z.string(),\n version: z.string(),\n chain_id: z.number(),\n kms_contract_address: z.string(),\n gateway_app_id: z.string().nullable().optional(),\n});\n\n// TeepodResponse Schema\nexport const teepodResponseSchema = z.object({\n tier: z.string(),\n capacity: capacitySchema,\n nodes: z.array(teepodSchema),\n kms_list: z.array(kmsListItemSchema).optional(),\n});\n\n// Get CVM Network Response Schema\nexport const getCvmNetworkResponseSchema = z.object({\n is_online: z.boolean(),\n is_public: z.boolean(),\n error: z.string().nullable(),\n internal_ip: z.string(),\n latest_handshake: z.string(),\n public_urls: z.array(z.object({\n app: z.string(),\n instance: z.string()\n })),\n});\n\n// Type exports\nexport type KmsListItem = z.infer<typeof kmsListItemSchema>;\nexport type DockerConfig = z.infer<typeof dockerConfigSchema>;\nexport type ComposeFile = z.infer<typeof composeFileSchema>;\nexport type Configuration = z.infer<typeof configurationSchema>;\nexport type Hosted = z.infer<typeof hostedSchema>;\nexport type ManagedUser = z.infer<typeof managedUserSchema>;\nexport type Node = z.infer<typeof nodeSchema>;\nexport type CvmInstance = z.infer<typeof cvmInstanceSchema>;\nexport type PostCvmResponse = z.infer<typeof postCvmResponseSchema>;\nexport type GetPubkeyFromCvmResponse = z.infer<typeof getPubkeyFromCvmResponseSchema>;\nexport type GetCvmByAppIdResponse = z.infer<typeof getCvmByAppIdResponseSchema>;\nexport type GetUserInfoResponse = z.infer<typeof getUserInfoResponseSchema>;\nexport type GetCvmsByUserIdResponse = z.infer<typeof getCvmsByUserIdResponseSchema>;\nexport type UpgradeCvmResponse = z.infer<typeof upgradeCvmResponseSchema>;\nexport type EncryptedEnvItem = z.infer<typeof encryptedEnvItemSchema>;\nexport type TEEPod = z.infer<typeof teepodSchema>;\nexport type Image = z.infer<typeof imageSchema>;\nexport type Capacity = z.infer<typeof capacitySchema>;\nexport type TeepodResponse = z.infer<typeof teepodResponseSchema>;\nexport type CvmAttestationResponse = z.infer<typeof cvmAttestationResponseSchema>;\nexport type GetCvmNetworkResponse = z.infer<typeof getCvmNetworkResponseSchema>;\n/**\n * Certificate naming information\n */\nexport interface CertificateNameInfo {\n common_name: string | null;\n organization: string | null;\n country: string | null;\n state?: string | null;\n locality?: string | null;\n}\n\n/**\n * Certificate data structure\n */\nexport interface CertificateInfo {\n subject: CertificateNameInfo;\n issuer: CertificateNameInfo;\n serial_number: string;\n not_before: string;\n not_after: string;\n version: string;\n fingerprint: string;\n signature_algorithm: string;\n sans: string | null;\n is_ca: boolean;\n position_in_chain: number;\n quote: string | null;\n}\n\n/**\n * Event log entry\n */\nexport interface TCBEventLogEntry {\n imr: number;\n event_type: number;\n digest: string;\n event: string;\n event_payload: string;\n}\n\n/**\n * Trusted Computing Base (TCB) information\n */\nexport interface TCBInfo {\n mrtd: string;\n rootfs_hash: string;\n rtmr0: string;\n rtmr1: string;\n rtmr2: string;\n rtmr3: string;\n event_log: TCBEventLogEntry[];\n}\n\n// CVM Compose Configuration Schema\nexport const cvmComposeConfigSchema = z.object({\n compose_file: z.object({\n bash_script: z.string().nullable(),\n docker_compose_file: z.string(),\n docker_config: z.object({\n password: z.string(),\n registry: z.string().nullable(),\n username: z.string(),\n }),\n features: z.array(z.string()),\n kms_enabled: z.boolean(),\n manifest_version: z.number(),\n name: z.string(),\n pre_launch_script: z.string(),\n public_logs: z.boolean(),\n public_sysinfo: z.boolean(),\n runner: z.string(),\n salt: z.string(),\n tproxy_enabled: z.boolean(),\n version: z.string(),\n }),\n env_pubkey: z.string(),\n salt: z.string(),\n});\n\nexport type CvmComposeConfig = z.infer<typeof cvmComposeConfigSchema>;\n\n// Replicate CVM Response Schema\nexport const replicateCvmResponseSchema = z.object({\n id: z.number(),\n name: z.string(),\n status: z.string(),\n teepod_id: z.number(),\n teepod: z.object({\n id: z.number(),\n name: z.string()\n }),\n user_id: z.number(),\n app_id: z.string(),\n vm_uuid: z.string(),\n instance_id: z.string().nullable(),\n app_url: z.string().nullable(),\n base_image: z.string(),\n vcpu: z.number(),\n memory: z.number(),\n disk_size: z.number(),\n manifest_version: z.number(),\n version: z.string().nullable(),\n runner: z.string(),\n docker_compose_file: z.string(),\n features: z.array(z.string()).nullable(),\n created_at: z.string(),\n encrypted_env_pubkey: z.string()\n});\n\nexport type ReplicateCvmResponse = z.infer<typeof replicateCvmResponseSchema>;\n\nexport const cvmAttestationResponseSchema = z.object({\n is_online: z.boolean(),\n is_public: z.boolean(),\n error: z.string().nullable(),\n app_certificates: z.array(z.object({\n subject: z.object({\n common_name: z.string().nullable(),\n organization: z.string().nullable(),\n country: z.string().nullable(),\n state: z.string().nullable().optional(),\n locality: z.string().nullable().optional()\n }),\n issuer: z.object({\n common_name: z.string().nullable(),\n organization: z.string().nullable(),\n country: z.string().nullable()\n }),\n serial_number: z.string(),\n not_before: z.string(),\n not_after: z.string(),\n version: z.string(),\n fingerprint: z.string(),\n signature_algorithm: z.string(),\n sans: z.string().nullable(),\n is_ca: z.boolean(),\n position_in_chain: z.number(),\n quote: z.string().nullable()\n })).nullable(),\n tcb_info: z.object({\n mrtd: z.string(),\n rootfs_hash: z.string(),\n rtmr0: z.string(),\n rtmr1: z.string(),\n rtmr2: z.string(),\n rtmr3: z.string(),\n event_log: z.array(z.object({\n imr: z.number(),\n event_type: z.number(),\n digest: z.string(),\n event: z.string(),\n event_payload: z.string()\n }))\n }).nullable(),\n compose_file: z.string().nullable()\n});","import {\n INVALID,\n ParseContext,\n ParseInput,\n ParseReturnType,\n ParseStatus,\n RawCreateParams,\n ZodIssueCode,\n ZodParsedType,\n ZodType,\n ZodTypeDef,\n addIssueToContext,\n z,\n} from 'zod';\n\nexport type ZodDecimalCheck =\n | { kind: 'precision'; value: number; message?: string }\n | { kind: 'wholeNumber'; value: number; message?: string }\n | { kind: 'min'; value: number; inclusive: boolean; message?: string }\n | { kind: 'max'; value: number; inclusive: boolean; message?: string }\n | { kind: 'finite'; message?: string };\n\nconst zodDecimalKind = 'ZodDecimal';\n\nexport interface ZodDecimalDef extends ZodTypeDef {\n checks: ZodDecimalCheck[];\n typeName: typeof zodDecimalKind;\n coerce: boolean;\n}\n\nconst precisionRegex = /(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class ZodDecimal extends ZodType<number, ZodDecimalDef, any> {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n _parse(input: ParseInput): ParseReturnType<number> {\n // detect decimal js object\n if (input.data !== null && typeof input.data === 'object' && 'toNumber' in input.data) {\n input.data = input.data.toNumber();\n }\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n\n let ctx: undefined | ParseContext = undefined;\n const status = new ParseStatus();\n\n for (const check of this._def.checks) {\n if (check.kind === 'precision') {\n const parts = input.data.toString().match(precisionRegex);\n const decimals = Math.max(\n (parts[1] ? parts[1].length : 0) - (parts[2] ? parseInt(parts[2], 10) : 0),\n 0\n );\n if (decimals > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.custom,\n message: check.message,\n params: {\n precision: check.value,\n },\n });\n status.dirty();\n }\n } else if (check.kind === 'wholeNumber') {\n const wholeNumber = input.data.toString().split('.')[0];\n const tooLong = wholeNumber.length > check.value;\n\n if (tooLong) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.custom,\n message: check.message,\n params: {\n wholeNumber: check.value,\n },\n });\n status.dirty();\n }\n } else if (check.kind === 'min') {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: 'number',\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n } else if (check.kind === 'max') {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: 'number',\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n } else if (check.kind === 'finite') {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n }\n\n return { status: status.value, value: input.data };\n }\n\n static create = (params?: RawCreateParams & { coerce?: true }): ZodDecimal => {\n return new ZodDecimal({\n checks: [],\n typeName: zodDecimalKind,\n coerce: params?.coerce ?? false,\n });\n };\n\n protected setLimit(\n kind: 'min' | 'max',\n value: number,\n inclusive: boolean,\n message?: string\n ): ZodDecimal {\n return new ZodDecimal({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message,\n },\n ],\n });\n }\n\n _addCheck(check: ZodDecimalCheck): ZodDecimal {\n return new ZodDecimal({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n\n lte(value: number, message?: string): ZodDecimal {\n return this.setLimit('max', value, true, message);\n }\n\n lt(value: number, message?: string): ZodDecimal {\n return this.setLimit('max', value, false, message);\n }\n max = this.lte;\n\n gt(value: number, message?: string): ZodDecimal {\n return this.setLimit('min', value, false, message);\n }\n gte(value: number, message?: string): ZodDecimal {\n return this.setLimit('min', value, true, message);\n }\n\n min = this.gte;\n\n precision(value: number, message?: string): ZodDecimal {\n return this._addCheck({\n kind: 'precision',\n value,\n message,\n });\n }\n wholeNumber(value: number, message?: string): ZodDecimal {\n return this._addCheck({\n kind: 'wholeNumber',\n value,\n message,\n });\n }\n\n get minValue() {\n let min: number | null = null;\n for (const ch of this._def.checks) {\n if (ch.kind === 'min') {\n if (min === null || ch.value > min) min = ch.value;\n }\n }\n return min;\n }\n\n get maxValue() {\n let max: number | null = null;\n for (const ch of this._def.checks) {\n if (ch.kind === 'max') {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return max;\n }\n\n positive(message?: string) {\n return this._addCheck({\n kind: 'min',\n value: 0,\n inclusive: false,\n message,\n });\n }\n\n negative(message?: string) {\n return this._addCheck({\n kind: 'max',\n value: 0,\n inclusive: false,\n message,\n });\n }\n\n nonpositive(message?: string) {\n return this._addCheck({\n kind: 'max',\n value: 0,\n inclusive: true,\n message,\n });\n }\n\n nonnegative(message?: string) {\n return this._addCheck({\n kind: 'min',\n value: 0,\n inclusive: true,\n message,\n });\n }\n\n finite(message?: string) {\n return this._addCheck({\n kind: 'finite',\n message,\n });\n }\n\n safe(message?: string) {\n return this._addCheck({\n kind: 'min',\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message,\n })._addCheck({\n kind: 'max',\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message,\n });\n }\n\n get isFinite() {\n let max: number | null = null;\n let min: number | null = null;\n for (const ch of this._def.checks) {\n if (ch.kind === 'finite') {\n return true;\n } else if (ch.kind === 'min') {\n if (min === null || ch.value > min) min = ch.value;\n } else if (ch.kind === 'max') {\n if (max === null || ch.value < max) max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\n\n// Docker Compose Template Schema\nexport const ComposeTemplateSchema = z.object({\n template: z.string().min(1, \"Template cannot be empty\")\n});\n\nexport type ComposeTemplate = z.infer<typeof ComposeTemplateSchema>;","import { createClient } from '@phala/cloud';\nimport { API_ENDPOINTS } from '../utils/constants';\nimport { GetUserInfoResponse, getUserInfoResponseSchema } from './types';\nimport { logger } from '../utils/logger';\n\n// Helper function to safely stringify objects that might contain cyclic references\nfunction safeStringify(obj: any): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n if (error instanceof Error && error.message.includes('cyclic')) {\n return '[Cyclic Object]';\n }\n return String(obj);\n }\n}\n\n/**\n * Get user information\n * @returns User information\n */\nexport async function getUserInfo(apiKey?: string): Promise<GetUserInfoResponse> {\n try {\n logger.debug(`Fetching user info from ${API_ENDPOINTS.USER_INFO}`);\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.get<any>(API_ENDPOINTS.USER_INFO);\n logger.debug(`Received response: ${safeStringify(response)}`);\n \n // Try to parse the response with the schema\n try {\n return getUserInfoResponseSchema.parse(response);\n } catch (parseError) {\n logger.error(`Failed to parse user info response: ${parseError}`);\n logger.debug(`Response structure: ${safeStringify(response)}`);\n throw parseError;\n }\n } catch (error) {\n logger.error(`Failed to get user info: ${error instanceof Error ? error.message : String(error)}`);\n throw new Error(`Failed to get user info: ${error instanceof Error ? error.message : String(error)}`);\n }\n}","// API URLs, CLOUD_API_URL now deprecated, use sdk instead\nexport const CLOUD_URL = process.env.CLOUD_URL || 'https://cloud.phala.network';\n\n// CLI Version\nexport const CLI_VERSION = '0.0.1';\n\n// Docker Hub API\nexport const DOCKER_HUB_API_URL = 'https://hub.docker.com/v2';\n\n// TEE Simulator\nexport const TEE_SIMULATOR = 'phalanetwork/tappd-simulator:latest';\n\n// Default resource configurations\nexport const DEFAULT_VCPU = 1;\nexport const DEFAULT_MEMORY = 2048; // MB\nexport const DEFAULT_DISK_SIZE = 40; // GB\n\n// Default TEEPod Image\nexport const DEFAULT_IMAGE = 'dstack-0.3.6';\n\n// API Endpoints\nexport const API_ENDPOINTS = {\n // Auth\n USER_INFO: 'auth/me',\n\n // TEEPods\n TEEPODS: 'teepods/available',\n TEEPOD_IMAGES: (teepodId: string) => `teepods/${teepodId}/images`,\n \n // CVMs\n CVMS: (userId: number) => `cvms?user_id=${userId}`,\n CVM_BY_APP_ID: (appId: string) => `cvms/app_${appId}`,\n CVM_NETWORK: (appId: string) => `cvms/app_${appId}/network`,\n CVM_START: (appId: string) => `cvms/app_${appId}/start`,\n CVM_STOP: (appId: string) => `cvms/app_${appId}/stop`,\n CVM_RESTART: (appId: string) => `cvms/app_${appId}/restart`,\n CVM_LOGS: (appId: string) => `cvms/app_${appId}/logs`,\n CVM_FROM_CONFIGURATION: 'cvms/from_cvm_configuration',\n CVM_PUBKEY: 'cvms/pubkey/from_cvm_configuration',\n CVM_UPGRADE: (appId: string) => `cvms/app_${appId}/compose`,\n CVM_ATTESTATION: (appId: string) => `cvms/app_${appId}/attestation`,\n CVM_RESIZE: (appId: string) => `cvms/app_${appId}/resources`,\n CVM_COMPOSE: (cvmId: string) => `cvms/${cvmId}/compose`,\n REPLICATE_CVM: (appId: string) => `cvms/${appId}/replicas`,\n};\n\nexport const DOCKER_COMPOSE_ELIZA_V2_TEMPLATE = `version: '3.8'\nservices:\n postgres:\n image: ankane/pgvector:latest\n environment:\n - POSTGRES_PASSWORD=postgres\n - POSTGRES_USER=postgres\n - POSTGRES_DB=eliza\n - PGDATA=/var/lib/postgresql/data/pgdata\n volumes:\n - postgres-data:/var/lib/postgresql/data:rw\n ports:\n - '127.0.0.1:5432:5432'\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U \\$\\${POSTGRES_USER} -d \\$\\${POSTGRES_DB}']\n interval: 5s\n timeout: 5s\n retries: 5\n restart: always\n networks:\n - eliza-network\n eliza:\n image: {{imageName}}\n command: bun run start\n volumes:\n - /var/run/tappd.sock:/var/run/tappd.sock\n environment:\n{{#each envVars}} - {{{this}}}\n{{/each}}\n ports:\n - '3000:3000'\n - '50000-50100:50000-50100/udp'\n depends_on:\n postgres:\n condition: service_healthy\n restart: always\n networks:\n - eliza-network\n\n\nnetworks:\n eliza-network:\n driver: bridge\n\nvolumes:\n postgres-data:`;\n\nexport const DOCKER_COMPOSE_BASIC_TEMPLATE = `version: '3.8'\nservices:\n app:\n image: {{imageName}}\n container_name: app\n volumes:\n - /var/run/tappd.sock:/var/run/tappd.sock\n environment:\n{{#each envVars}} - {{{this}}}\n{{/each}}\n restart: always\n`","import { createClient } from '@phala/cloud';\nimport { API_ENDPOINTS } from '@/src/utils/constants';\nimport { logger } from '@/src/utils/logger';\nimport {\n cvmInstanceSchema,\n getCvmByAppIdResponseSchema,\n getPubkeyFromCvmResponseSchema,\n postCvmResponseSchema,\n upgradeCvmResponseSchema,\n cvmAttestationResponseSchema,\n getCvmNetworkResponseSchema,\n replicateCvmResponseSchema,\n ReplicateCvmResponse,\n CvmComposeConfig,\n cvmComposeConfigSchema,\n} from './types';\nimport type {\n CvmInstance,\n GetCvmByAppIdResponse,\n GetPubkeyFromCvmResponse,\n PostCvmResponse,\n UpgradeCvmResponse,\n CvmAttestationResponse,\n GetCvmNetworkResponse,\n} from './types';\nimport inquirer from 'inquirer';\nimport { z } from 'zod';\nimport { getApiKey } from '@/src/utils/credentials';\n\n/**\n * Get all CVMs for the current user\n * @returns List of CVMs\n */\nexport async function getCvms(): Promise<CvmInstance[]> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.get<CvmInstance[]>(API_ENDPOINTS.CVMS(0));\n return z.array(cvmInstanceSchema).parse(response);\n } catch (error) {\n throw new Error(`Failed to get CVMs: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * VM configuration type\n */\nexport interface VMConfig {\n // Add specific properties as needed\n [key: string]: unknown;\n}\n\n/**\n * Update payload type\n */\nexport interface UpdateCvmPayload {\n app_id: string;\n [key: string]: unknown;\n}\n\n/**\n * Check CVM exists for the current user and appId\n * @param appId App ID\n * @returns CVM appId string or null if it doesn't exist\n */\nexport async function checkCvmExists(appId: string): Promise<string> {\n const cvms = await getCvms();\n const cvm = cvms.find(cvm => (cvm.hosted?.app_id === appId || `app_${cvm.hosted?.app_id}` === appId));\n if (!cvm) {\n logger.error(`CVM with App ID app_${appId} not detected`);\n process.exit(1);\n } else {\n logger.success(`CVM with App ID app_${appId} detected`);\n return cvm.hosted?.app_id || '';\n }\n}\n\n/**\n * Get a CVM by App ID\n * @param appId App ID\n * @returns CVM details\n */\nexport async function getCvmByAppId(appId: string): Promise<GetCvmByAppIdResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.get<GetCvmByAppIdResponse>(API_ENDPOINTS.CVM_BY_APP_ID(appId));\n return getCvmByAppIdResponseSchema.parse(response);\n } catch (error) {\n throw new Error(`Failed to get CVM by App ID: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get public key from CVM\n * @param vmConfig VM configuration\n * @returns Public key\n */\nexport async function getPubkeyFromCvm(vmConfig: VMConfig): Promise<GetPubkeyFromCvmResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.post<GetPubkeyFromCvmResponse>(API_ENDPOINTS.CVM_PUBKEY, vmConfig);\n return getPubkeyFromCvmResponseSchema.parse(response);\n } catch (error) {\n throw new Error(`Failed to get pubkey from CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get network information for a CVM\n * @param appId App ID\n * @returns Network information\n */\nexport async function getCvmNetwork(appId: string): Promise<GetCvmNetworkResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.get<GetCvmNetworkResponse>(API_ENDPOINTS.CVM_NETWORK(appId));\n return getCvmNetworkResponseSchema.parse(response);\n } catch (error) {\n throw new Error(`Failed to get network information for CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Create a new CVM\n * @param vmConfig VM configuration\n * @returns Created CVM details\n */\nexport async function createCvm(vmConfig: VMConfig): Promise<PostCvmResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.post<PostCvmResponse>(API_ENDPOINTS.CVM_FROM_CONFIGURATION, vmConfig);\n return postCvmResponseSchema.parse(response);\n } catch (error) {\n if (error instanceof z.ZodError) {\n logger.error('Schema validation error:', JSON.stringify(error.errors, null, 2));\n logger.error('API response:', JSON.stringify(error.format(), null, 2));\n throw new Error(`Response validation failed: ${JSON.stringify(error.errors)}`);\n }\n throw new Error(`Failed to create CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Start a CVM\n * @param appId App ID\n * @returns Success status\n */\nexport async function startCvm(appId: string): Promise<PostCvmResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.post<PostCvmResponse>(API_ENDPOINTS.CVM_START(appId));\n return postCvmResponseSchema.parse(response);\n } catch (error) {\n throw new Error(`Failed to start CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Stop a CVM\n * @param appId App ID\n * @returns Success status\n */\nexport async function stopCvm(appId: string): Promise<PostCvmResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.post<PostCvmResponse>(API_ENDPOINTS.CVM_STOP(appId));\n return postCvmResponseSchema.parse(response);\n } catch (error) {\n throw new Error(`Failed to stop CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Restart a CVM\n * @param appId App ID\n * @returns Success status\n */\nexport async function restartCvm(appId: string): Promise<PostCvmResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.post<PostCvmResponse>(API_ENDPOINTS.CVM_RESTART(appId));\n return postCvmResponseSchema.parse(response);\n } catch (error) {\n throw new Error(`Failed to restart CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Upgrade a CVM\n * @param appId App ID\n * @param vmConfig VM configuration\n * @returns Upgrade response\n */\nexport async function upgradeCvm(appId: string, vmConfig: VMConfig): Promise<UpgradeCvmResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.put<UpgradeCvmResponse>(API_ENDPOINTS.CVM_UPGRADE(appId), vmConfig);\n return upgradeCvmResponseSchema.parse(response);\n } catch (error) {\n throw new Error(`Failed to upgrade CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Delete a CVM\n * @param appId App ID\n * @returns Success status\n */\nexport async function deleteCvm(appId: string): Promise<boolean> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n await apiClient.delete(API_ENDPOINTS.CVM_BY_APP_ID(appId));\n return true;\n } catch (error) {\n throw new Error(`Failed to delete CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Update a CVM\n * @param updatePayload Update payload\n * @returns Updated CVM details\n */\nexport async function updateCvm(updatePayload: UpdateCvmPayload): Promise<unknown> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.put(API_ENDPOINTS.CVM_BY_APP_ID(updatePayload.app_id), updatePayload);\n return response;\n } catch (error) {\n throw new Error(`Failed to update CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Presents a list of CVMs to the user and allows them to select one\n * @returns The selected CVM app ID or undefined if no CVMs exist\n */\nexport async function selectCvm(): Promise<string | undefined> {\n const listSpinner = logger.startSpinner('Fetching available CVMs');\n const cvms = await getCvms();\n listSpinner.stop(true);\n \n if (!cvms || cvms.length === 0) {\n logger.info('No CVMs found for your account');\n return undefined;\n }\n \n // Prepare choices for the inquirer prompt\n const choices = cvms.map(cvm => {\n // Handle different API response formats\n const id = cvm.hosted?.app_id || cvm.hosted?.id;\n const name = cvm.name || cvm.hosted?.name;\n const status = cvm.status || cvm.hosted?.status;\n \n return {\n name: `${name || 'Unnamed'} (${id}) - Status: ${status || 'Unknown'}`,\n value: id\n };\n });\n \n const { selectedCvm } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedCvm',\n message: 'Select a CVM:',\n choices\n }\n ]);\n \n return selectedCvm;\n}\n\n/**\n * Get attestation information for a CVM\n * @param appId App ID\n * @returns Attestation information\n */\nexport async function getCvmAttestation(appId: string): Promise<CvmAttestationResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.get<CvmAttestationResponse>(API_ENDPOINTS.CVM_ATTESTATION(appId));\n \n // Attempt to validate and return the response\n try {\n return cvmAttestationResponseSchema.parse(response);\n } catch (validationError) {\n logger.debug(`Validation error: ${validationError instanceof Error ? validationError.message : String(validationError)}`);\n \n // If validation fails, create a normalized response object\n const normalizedResponse: CvmAttestationResponse = {\n is_online: Boolean(response?.is_online),\n is_public: Boolean(response?.is_public),\n error: typeof response?.error === 'string' ? response.error : null,\n app_certificates: Array.isArray(response?.app_certificates) ? response.app_certificates : null,\n tcb_info: response?.tcb_info || null,\n compose_file: typeof response?.compose_file === 'string' ? response.compose_file : null\n };\n \n return normalizedResponse;\n }\n } catch (error) {\n throw new Error(`Failed to get attestation information: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Resize payload type\n */\nexport interface ResizeCvmPayload {\n vcpu?: number;\n memory?: number;\n disk_size?: number;\n allow_restart?: number;\n}\n\n/**\n * Resize a CVM's resources\n * @param appId App ID\n * @param vcpu Number of virtual CPUs (optional)\n * @param memory Memory size in MB (optional)\n * @param diskSize Disk size in GB (optional)\n * @param allowRestart Whether to allow restart (1) or not (0) for the resize operation (optional)\n * @returns Success status\n */\n/**\n * Create a replica of an existing CVM\n * @param appId App ID of the CVM to replicate\n * @param payload Replication payload\n * @returns New CVM details\n */\n/**\n * Get CVM compose configuration\n */\nexport async function getCvmComposeConfig(cvmId: string): Promise<CvmComposeConfig> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.get<CvmComposeConfig>(\n API_ENDPOINTS.CVM_COMPOSE(cvmId)\n );\n return cvmComposeConfigSchema.parse(response);\n } catch (error) {\n throw new Error(\n `Failed to get CVM compose config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Replicate a CVM\n */\nexport async function replicateCvm(\n appId: string,\n payload: {\n teepod_id?: number;\n encrypted_env?: string;\n }\n): Promise<ReplicateCvmResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await apiClient.post<ReplicateCvmResponse>(\n API_ENDPOINTS.REPLICATE_CVM(appId),\n payload\n );\n return replicateCvmResponseSchema.parse(response);\n } catch (error) {\n throw new Error(\n `Failed to replicate CVM: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport async function resizeCvm(\n appId: string, \n vcpu?: number, \n memory?: number, \n diskSize?: number, \n allowRestart?: number\n): Promise<boolean> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n // Only include defined parameters in the payload\n const resizePayload: Record<string, unknown> = {};\n \n if (vcpu !== undefined) resizePayload.vcpu = vcpu;\n if (memory !== undefined) resizePayload.memory = memory;\n if (diskSize !== undefined) resizePayload.disk_size = diskSize;\n if (allowRestart !== undefined) resizePayload.allow_restart = allowRestart;\n \n // Check if any parameters were provided\n if (Object.keys(resizePayload).length === 0) {\n throw new Error('At least one resource parameter must be provided');\n }\n \n await apiClient.patch(API_ENDPOINTS.CVM_RESIZE(appId), resizePayload);\n return true;\n } catch (error) {\n throw new Error(`Failed to resize CVM: ${error instanceof Error ? error.message : String(error)}`);\n }\n} ","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport crypto from 'node:crypto';\nimport { logger } from './logger';\n\n// Define the directory and file for storing credentials\nconst PHALA_CLOUD_DIR = path.join(os.homedir(), '.phala-cloud');\nconst API_KEY_FILE = path.join(PHALA_CLOUD_DIR, 'api-key');\nconst DOCKER_CREDENTIALS_FILE = path.join(PHALA_CLOUD_DIR, 'docker-credentials.json');\n\n// Ensure the .phala-cloud directory exists\nfunction ensureDirectoryExists(): void {\n if (!fs.existsSync(PHALA_CLOUD_DIR)) {\n try {\n fs.mkdirSync(PHALA_CLOUD_DIR, { recursive: true });\n } catch (error) {\n logger.error(`Failed to create directory ${PHALA_CLOUD_DIR}:`, error);\n throw error;\n }\n }\n}\n\n// Generate a machine-specific encryption key\nfunction getMachineKey(): Buffer {\n // Create a deterministic but machine-specific key\n const machineParts = [\n os.hostname(),\n os.platform(),\n os.arch(),\n os.cpus()[0]?.model || '',\n os.userInfo().username\n ];\n \n // Create a hash of the machine parts\n const hash = crypto.createHash('sha256');\n hash.update(machineParts.join('|'));\n return hash.digest();\n}\n\n// Encrypt data\nfunction encrypt(text: string): string {\n try {\n const key = getMachineKey();\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv('aes-256-cbc', key.slice(0, 32), iv);\n \n let encrypted = cipher.update(text, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n \n // Return IV + encrypted data\n return iv.toString('hex') + ':' + encrypted;\n } catch (error) {\n logger.error('Encryption failed:', error);\n throw new Error('Failed to encrypt data');\n }\n}\n\n// Decrypt data\nfunction decrypt(encryptedText: string): string {\n try {\n const key = getMachineKey();\n const parts = encryptedText.split(':');\n \n if (parts.length !== 2) {\n throw new Error('Invalid encrypted format');\n }\n \n const iv = Buffer.from(parts[0], 'hex');\n const encrypted = parts[1];\n \n const decipher = crypto.createDecipheriv('aes-256-cbc', key.slice(0, 32), iv);\n \n let decrypted = decipher.update(encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n \n return decrypted;\n } catch (error) {\n logger.error('Decryption failed:', error);\n throw new Error('Failed to decrypt data');\n }\n}\n\n// API Key Management\nexport async function saveApiKey(apiKey: string): Promise<void> {\n ensureDirectoryExists();\n try {\n // Encrypt the API key before saving\n const encryptedApiKey = encrypt(apiKey);\n fs.writeFileSync(API_KEY_FILE, encryptedApiKey, { mode: 0o600 }); // Restrict permissions to user only\n } catch (error) {\n logger.error('Failed to save API key:', error);\n throw error;\n }\n}\n\nexport function getApiKey(): string | null {\n try {\n if (fs.existsSync(API_KEY_FILE)) {\n const encryptedApiKey = fs.readFileSync(API_KEY_FILE, 'utf8').trim();\n // Decrypt the API key\n return decrypt(encryptedApiKey);\n }\n return null;\n } catch (error) {\n logger.error('Failed to read API key:', error);\n return null;\n }\n}\n\nexport async function removeApiKey(): Promise<void> {\n try {\n if (fs.existsSync(API_KEY_FILE)) {\n fs.unlinkSync(API_KEY_FILE);\n logger.success('API key removed successfully.');\n } else {\n logger.warn('No API key found to remove.');\n }\n } catch (error) {\n logger.error('Failed to remove API key:', error);\n throw error;\n }\n}\n\n// Docker Credentials Management\ninterface DockerCredentials {\n username: string;\n registry?: string;\n}\n\nexport async function saveDockerCredentials(credentials: DockerCredentials): Promise<void> {\n ensureDirectoryExists();\n try {\n \n fs.writeFileSync(\n DOCKER_CREDENTIALS_FILE, \n JSON.stringify(credentials, null, 2), \n { mode: 0o600 } // Restrict permissions to user only\n );\n logger.success('Docker information saved successfully.');\n } catch (error) {\n logger.error('Failed to save Docker information:', error);\n throw error;\n }\n}\n\nexport async function getDockerCredentials(): Promise<DockerCredentials | null> {\n try {\n if (fs.existsSync(DOCKER_CREDENTIALS_FILE)) {\n const data = fs.readFileSync(DOCKER_CREDENTIALS_FILE, 'utf8');\n const credentials = JSON.parse(data) as DockerCredentials;\n \n return credentials;\n }\n return null;\n } catch (error) {\n logger.error('Failed to read Docker credentials:', error);\n return null;\n }\n}\n\nexport async function removeDockerCredentials(): Promise<void> {\n try {\n if (fs.existsSync(DOCKER_CREDENTIALS_FILE)) {\n fs.unlinkSync(DOCKER_CREDENTIALS_FILE);\n logger.success('Docker credentials removed successfully.');\n } else {\n logger.warn('No Docker credentials found to remove.');\n }\n } catch (error) {\n logger.error('Failed to remove Docker credentials:', error);\n throw error;\n }\n} ","import { createClient } from '@phala/cloud';\nimport { API_ENDPOINTS } from '../utils/constants';\nimport { TEEPod, Image, teepodSchema, imageSchema, TeepodResponse, teepodResponseSchema } from './types';\nimport { z } from 'zod';\nimport { getApiKey } from '@/src/utils/credentials';\n\n/**\n * Get all TEEPods with their images\n * @returns List of TEEPods with embedded images\n */\nexport async function getTeepods(): Promise<TeepodResponse> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n const response = await (await apiClient).get<TeepodResponse>(API_ENDPOINTS.TEEPODS);\n const parsedResponse = teepodResponseSchema.parse(response);\n return parsedResponse;\n } catch (error) {\n throw new Error(`Failed to get TEEPods: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get images for a TEEPod\n * This function is maintained for backwards compatibility.\n * Images are now included directly in the TEEPod response.\n * \n * @param teepodId TEEPod ID\n * @returns List of images for the TEEPod\n */\nexport async function getTeepodImages(teepodId: string): Promise<Image[]> {\n try {\n const apiKey = getApiKey();\n const apiClient = createClient({ apiKey: apiKey });\n // First try to get TEEPod with embedded images\n const teepodsResponse = await getTeepods();\n const teepod = teepodsResponse.nodes.find(pod => pod.teepod_id === Number(teepodId));\n \n // If we found the TEEPod and it has images, return them\n if (teepod && teepod.images && teepod.images.length > 0) {\n return teepod.images;\n }\n \n // Fallback to the original implementation\n const response = await (await apiClient).get<Image[]>(API_ENDPOINTS.TEEPOD_IMAGES(teepodId));\n return z.array(imageSchema).parse(response);\n } catch (error) {\n throw new Error(`Failed to get TEEPod images: ${error instanceof Error ? error.message : String(error)}`);\n }\n}"],"mappings":"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","names":["chalk","stripAnsi","str","pattern","getVisibleLength","wrapText","text","maxWidth","lines","currentLine","currentLineVisibleLength","words","word","wordVisibleLength","logger","message","args","data","columns","columnConfig","col","formatTable","options","mergedOptions","key","commonAcronyms","customTerms","formatted","part","acronym","regex","term","replacement","value","include","exclude","keyFormatter","valueFormatter","formatKeys","keyWidth","valueWidth","borderStyle","enableTextWrapping","maxDepth","keys","tableData","formattedValue","formatNestedObject","terminalWidth","getTerminalWidth","finalKeyWidth","finalValueWidth","item","borderChars","maxValueWidth","border","getBorderChars","topBorder","headerSeparator","row","index","keyLines","valueLines","maxLines","i","keyLine","valueLine","keyContent","valueContent","bottomBorder","success","result","icon","resultText","obj","currentDepth","style","calculateColumnWidths","borderCharsPerColumn","totalBorderWidth","availableContentWidth","initialWidths","totalFixedWidth","totalWeight","column","minWidth","contentWidth","remainingWidth","extraWidth","calculatedTotalWidth","sum","width","scale","finalWidths","formatTable","data","options","obj","keyValueData","key","col","value","parts","current","part","chalk","mergedOptions","text","columns","sample","border","columnConfig","item","widths","calculateColumnWidths","formattedColumns","index","headers","formatRow","row","rowIndex","rowData","displayValue","wrapText","maxLines","formattedLines","lineIndex","lineContent","colIndex","content","topBorder","wrappedHeaders","i","maxHeaderLines","h","headerLine","header","headerSeparator","formattedRows","rowLine","cell","rowSeparator","bottomBorder","z","INVALID","ParseStatus","ZodIssueCode","ZodParsedType","ZodType","addIssueToContext","z","zodDecimalKind","precisionRegex","_ZodDecimal","ZodType","input","ZodParsedType","ctx","addIssueToContext","ZodIssueCode","INVALID","status","ParseStatus","check","parts","kind","value","inclusive","message","min","ch","max","ZodDecimal","__publicField","params","ComposeTemplateSchema","z","dockerConfigSchema","z","composeFileSchema","configurationSchema","hostedSchema","managedUserSchema","nodeSchema","cvmInstanceSchema","postCvmResponseSchema","getPubkeyFromCvmResponseSchema","getCvmByAppIdResponseSchema","getUserInfoResponseSchema","ZodDecimal","getCvmsByUserIdResponseSchema","upgradeCvmResponseSchema","encryptedEnvItemSchema","imageSchema","teepodSchema","capacitySchema","kmsListItemSchema","teepodResponseSchema","getCvmNetworkResponseSchema","cvmComposeConfigSchema","replicateCvmResponseSchema","cvmAttestationResponseSchema","createClient","CLOUD_URL","DEFAULT_VCPU","DEFAULT_MEMORY","DEFAULT_DISK_SIZE","DEFAULT_IMAGE","API_ENDPOINTS","teepodId","userId","appId","cvmId","DOCKER_COMPOSE_ELIZA_V2_TEMPLATE","DOCKER_COMPOSE_BASIC_TEMPLATE","safeStringify","obj","error","getUserInfo","apiKey","logger","API_ENDPOINTS","response","createClient","getUserInfoResponseSchema","parseError","createClient","inquirer","z","fs","path","os","crypto","PHALA_CLOUD_DIR","path","os","API_KEY_FILE","DOCKER_CREDENTIALS_FILE","ensureDirectoryExists","fs","error","logger","getMachineKey","machineParts","hash","crypto","encrypt","text","key","iv","cipher","encrypted","decrypt","encryptedText","parts","decipher","decrypted","saveApiKey","apiKey","encryptedApiKey","getApiKey","removeApiKey","saveDockerCredentials","credentials","getDockerCredentials","data","getCvms","apiKey","getApiKey","response","createClient","API_ENDPOINTS","z","cvmInstanceSchema","error","checkCvmExists","appId","cvm","logger","getCvmByAppId","getCvmByAppIdResponseSchema","getPubkeyFromCvm","vmConfig","getPubkeyFromCvmResponseSchema","getCvmNetwork","getCvmNetworkResponseSchema","createCvm","postCvmResponseSchema","startCvm","stopCvm","restartCvm","upgradeCvm","upgradeCvmResponseSchema","deleteCvm","updateCvm","updatePayload","selectCvm","listSpinner","cvms","choices","id","name","status","selectedCvm","inquirer","getCvmAttestation","cvmAttestationResponseSchema","validationError","getCvmComposeConfig","cvmId","cvmComposeConfigSchema","replicateCvm","payload","replicateCvmResponseSchema","resizeCvm","vcpu","memory","diskSize","allowRestart","apiClient","resizePayload","createClient","z","getTeepods","apiKey","getApiKey","response","createClient","API_ENDPOINTS","teepodResponseSchema","error","getTeepodImages","teepodId","apiClient","teepod","pod","z","imageSchema"]}
|