phala 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -6
- package/dist/api/index.d.ts +374 -20
- package/dist/api/index.js +1 -1
- package/dist/chunk-6GN3UXCF.js +58 -0
- package/dist/chunk-6GN3UXCF.js.map +1 -0
- package/dist/index.js +25 -21
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-4IVSVXD3.js +0 -58
- package/dist/chunk-4IVSVXD3.js.map +0 -1
@@ -0,0 +1,58 @@
|
|
1
|
+
var Te=Object.defineProperty;var we=(r,t,n)=>t in r?Te(r,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[t]=n;var re=(r,t,n)=>(we(r,typeof t!="symbol"?t+"":t,n),n);import b from"chalk";function Re(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 D(r){return Re(r).length}function z(r,t){if(!r)return[""];if(D(r)<=t)return[r];let n=[],o="",s=0,a=r.split(/(\s+)/).filter(c=>c.trim().length>0);for(let c of a){let C=D(c);if(C>t){o&&(n.push(o),o="",s=0),n.push(c);continue}s+C+(s>0?1:0)>t?(n.push(o),o=c,s=C):o?(o=`${o} ${c}`,s+=C+1):(o=c,s=C)}return o&&n.push(o),n}var p={error:(r,...t)=>{console.error(b.red("\u2717"),b.red(r),...t)},warn:(r,...t)=>{console.log(b.yellow("\u26A0"),b.yellow(r),...t)},info:(r,...t)=>{console.log(b.blue("\u2139"),b.blue(r),...t)},success:(r,...t)=>{console.log(b.green("\u2713"),b.green(r),...t)},debug:(r,...t)=>{process.env.DEBUG&&console.log(b.gray("\u{1F50D}"),b.gray(r),...t)},table:(r,t)=>{if(r.length===0){console.log(b.yellow("No data to display"));return}if(t)if(typeof t[0]=="string"){let n=t.map(o=>({key:o,header:o.charAt(0).toUpperCase()+o.slice(1)}));Z(r,{columns:n,borderStyle:"rounded",headerStyle:o=>b.cyan.bold(o)})}else Z(r,{columns:t,borderStyle:"rounded",headerStyle:n=>b.cyan.bold(n)});else Z(r,{borderStyle:"rounded",headerStyle:n=>b.cyan.bold(n)})},keyValueTable:(r,t)=>{let o={...{borderStyle:"rounded",enableTextWrapping:!0,maxDepth:2,formatKeys:!0,keyFormatter:y=>{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"},w;y.includes("_")?w=y.split("_").map(T=>T.charAt(0).toUpperCase()+T.slice(1).toLowerCase()).join(" "):y.includes("-")?w=y.split("-").map(T=>T.charAt(0).toUpperCase()+T.slice(1).toLowerCase()).join(" "):w=y.charAt(0).toUpperCase()+y.slice(1).replace(/([a-z])([A-Z])/g,"$1 $2");for(let T of k){let I=new RegExp(`\\b${T.toLowerCase()}\\b`,"gi");w=w.replace(I,T)}for(let[T,I]of Object.entries(S)){let B=new RegExp(`\\b${T}\\b`,"gi");w=w.replace(B,I)}return w},valueFormatter:y=>String(y??"")},...t},{include:s,exclude:a,keyFormatter:c,valueFormatter:C,formatKeys:R,keyWidth:x,valueWidth:E,borderStyle:$,enableTextWrapping:m,maxDepth:u}=o,l=Object.keys(r);if(s&&(l=l.filter(y=>s.includes(y))),a&&(l=l.filter(y=>!a.includes(y))),l.length===0){console.log(b.yellow("No properties to display"));return}let g=l.map(y=>{let k=r[y],S;return k==null?S="":typeof k=="object"&&!Array.isArray(k)?S=ne(k,0,u):Array.isArray(k)?k.length===0?S="[]":typeof k[0]=="object"?S=`[${k.length} items]`:S=`[${k.join(", ")}]`:S=String(k),C&&(S=C(k,y)),{key:R&&c?b.cyan.bold(c(y)):b.cyan.bold(y),value:S}}),h=oe(),i=x,d=E;if(i||(i=Math.max(...g.map(y=>D(y.key)),10),i=Math.min(i,Math.floor(h/3))),!d){d=Math.max(...g.map(S=>D(S.value)),10),d+=3;let y=7,k=h-i-y;d=Math.min(d,k)}let f=Ee($),M=`${f.topLeft}${f.horizontal.repeat(i+2)}${f.topT}${f.horizontal.repeat(d+2)}${f.topRight}`,A=`${f.leftT}${f.horizontal.repeat(i+2)}${f.cross}${f.horizontal.repeat(d+2)}${f.rightT}`;console.log(M),console.log(A),g.forEach((y,k)=>{let S=m?z(y.key,i):[y.key],w=m?z(y.value,d):[y.value],T=Math.max(S.length,w.length);for(let I=0;I<T;I++){let B=S[I]||"",te=w[I]||"",xe=B+" ".repeat(Math.max(0,i-D(B))),Se=te+" ".repeat(Math.max(0,d-D(te)));console.log(`${f.vertical} ${xe} ${f.vertical} ${Se} ${f.vertical}`)}k<g.length-1&&console.log(`${f.leftT}${f.horizontal.repeat(i+2)}${f.cross}${f.horizontal.repeat(d+2)}${f.rightT}`)});let K=`${f.bottomLeft}${f.horizontal.repeat(i+2)}${f.bottomT}${f.horizontal.repeat(d+2)}${f.bottomRight}`;console.log(K)},startSpinner:r=>(process.stdout.write(`${b.blue("\u27F3")} ${r}... `),{stop:(t=!0,n)=>{let o=t?b.green("\u2713"):b.red("\u2717"),s=n?`: ${n}`:"";console.log(`${o}${s}`)}}),break(){console.log("")}};function ne(r,t,n){if(t>=n)return"[Nested Object]";if(r==null)return"";if(Array.isArray(r))return r.length===0?"[]":`[${r.length} items]`;let o=[];for(let[s,a]of Object.entries(r))a==null?o.push(`${s}: `):typeof a=="object"?o.push(`${s}: ${ne(a,t+1,n)}`):o.push(`${s}: ${a}`);return o.join(", ")}function Ee(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 oe(){return process.stdout.columns||80}function Pe(r,t,n={}){let o=oe(),s=n.borderChars??3,c=(n.additionalBorderWidth??1)+t.length*s,C=o-c,R={},x=0,E=0;for(let u of t){let l=u.key;if(u.fixedWidth!==void 0){R[l]=u.fixedWidth,x+=u.fixedWidth;continue}let g=u.minWidth??u.header.length,h;u.getWidth?h=Math.max(g,u.header.length,...r.map(i=>u.getWidth(i))):u.getValue?h=Math.max(g,u.header.length,...r.map(i=>String(u.getValue(i)||"").length)):h=Math.max(g,u.header.length,...r.map(i=>String(i[u.key]||"").length)),R[l]=h,x+=h,E+=u.weight??1}let $=Math.max(0,C-x);if($>0&&E>0)for(let u of t){let l=u.key;if(u.fixedWidth===void 0&&u.weight){let g=Math.floor($*(u.weight/E));R[l]+=g}}let m=Object.values(R).reduce((u,l)=>u+l,0)+c;if(m>o){let u=C/(m-c),l={};for(let g of t){let h=g.key,i=g.minWidth??g.header.length;l[h]=Math.max(i,Math.floor(R[h]*u))}return l}return R}function Z(r,t={}){if(t.keyValueMode&&r.length===1){let m=r[0],u=[];t.columns||(t.columns=Object.keys(m).map(l=>({key:l,header:l.charAt(0).toUpperCase()+l.slice(1).replace(/([A-Z])/g," $1")})));for(let l of t.columns){let g=String(l.key),h;if(l.accessor)h=l.accessor(m);else if(typeof l.key=="string"&&l.key.includes(".")){let i=l.key.split("."),d=m;for(let f of i){if(d==null){h="";break}d=d[f]}h=d}else h=m[l.key];l.formatter&&(h=l.formatter(h)),u.push({key:l.header||g,value:h})}r=u,t.columns=[{key:"key",minWidth:15},{key:"value",minWidth:20}]}if(r.length===0){console.log(b.yellow("No data to display"));return}let o={...{includeHeaders:!0,border:!0,borderStyle:"single",headerStyle:m=>b.bold(m),cellStyle:m=>m,enableTextWrapping:!0},...t},s=o.columns;if(s)s=s.map(m=>({...m,enableTextWrapping:m.enableTextWrapping!==void 0?m.enableTextWrapping:o.enableTextWrapping}));else{let m=r[0];s=Object.keys(m).map(u=>({key:u,header:u.charAt(0).toUpperCase()+u.slice(1),enableTextWrapping:o.enableTextWrapping}))}let c={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"}}[o.borderStyle],C=s.map(m=>({key:m.key,header:m.header||String(m.key),minWidth:m.minWidth||3,weight:m.weight,enableTextWrapping:m.enableTextWrapping,getValue:m.accessor?u=>m.accessor(u):u=>{if(typeof m.key=="string"&&m.key.includes(".")){let l=m.key.split("."),g=u;for(let h of l){if(g==null)return"";g=g[h]}return g??""}return u[m.key]??""}})),R=Pe(r,C),x=s.map((m,u)=>({...m,width:R[C[u].key]})),E=x.map(m=>m.header||String(m.key)),$=(m,u)=>{let l=x.map(i=>{let d;if(i.accessor)d=i.accessor(m);else if(typeof i.key=="string"&&i.key.includes(".")){let M=i.key.split("."),A=m;for(let K of M){if(A==null){d="";break}A=A[K]}d=A??""}else d=m[i.key]??"";let f=i.formatter?i.formatter(d):String(d||"");return i.enableTextWrapping?{lines:z(f,i.width),key:String(i.key)}:{lines:[f.length>i.width?f.substring(0,i.width-1)+"\u2026":f],key:String(i.key)}}),g=Math.max(...l.map(i=>i.lines.length)),h=[];for(let i=0;i<g;i++){let d=l.map((f,M)=>{let A=f.lines[i]||"";return o.cellStyle(A.padEnd(x[M].width),u,f.key)});h.push(d)}return h};if(o.border){let m=c.topLeft+x.map(l=>c.horizontal.repeat(l.width+2)).join(c.topT)+c.topRight;if(console.log(m),o.includeHeaders){let l=x.map((i,d)=>({lines:i.enableTextWrapping?z(E[d],i.width):[E[d]],width:i.width})),g=Math.max(...l.map(i=>i.lines.length));for(let i=0;i<g;i++){let d=c.vertical+l.map(f=>{let M=f.lines[i]||"";return" "+o.headerStyle(M.padEnd(f.width))+" "}).join(c.vertical)+c.vertical;console.log(d)}let h=c.leftT+x.map(i=>c.horizontal.repeat(i.width+2)).join(c.cross)+c.rightT;console.log(h)}r.forEach((l,g)=>{let h=$(l,g);if(h.forEach(i=>{console.log(c.vertical+i.map(d=>` ${d} `).join(c.vertical)+c.vertical)}),g<r.length-1&&h.length>1){let i=c.leftT+x.map(d=>c.horizontal.repeat(d.width+2)).join(c.cross)+c.rightT;console.log(i)}});let u=c.bottomLeft+x.map(l=>c.horizontal.repeat(l.width+2)).join(c.bottomT)+c.bottomRight;console.log(u)}else{if(o.includeHeaders){let m=x.map((g,h)=>({lines:g.enableTextWrapping?z(E[h],g.width):[E[h]],width:g.width})),u=Math.max(...m.map(g=>g.lines.length));for(let g=0;g<u;g++){let h=m.map(i=>{let d=i.lines[g]||"";return o.headerStyle(d.padEnd(i.width))}).join(" ");console.log(h)}let l=x.map(g=>"\u2500".repeat(g.width)).join(" ");console.log(l)}r.forEach((m,u)=>{let l=$(m,u);l.forEach(g=>{console.log(g.join(" "))}),u<r.length-1&&l.length>1&&console.log("")})}console.log(`Total: ${r.length} rows`)}import $e from"axios";import P from"node:fs";import H from"node:path";import L from"node:os";import G from"node:crypto";var F=H.join(L.homedir(),".phala-cloud"),U=H.join(F,"api-key"),q=H.join(F,"docker-credentials.json");function se(){if(!P.existsSync(F))try{P.mkdirSync(F,{recursive:!0})}catch(r){throw p.error(`Failed to create directory ${F}:`,r),r}}function ie(){let r=[L.hostname(),L.platform(),L.arch(),L.cpus()[0]?.model||"",L.userInfo().username],t=G.createHash("sha256");return t.update(r.join("|")),t.digest()}function Ae(r){try{let t=ie(),n=G.randomBytes(16),o=G.createCipheriv("aes-256-cbc",t.slice(0,32),n),s=o.update(r,"utf8","hex");return s+=o.final("hex"),n.toString("hex")+":"+s}catch(t){throw p.error("Encryption failed:",t),new Error("Failed to encrypt data")}}function Ie(r){try{let t=ie(),n=r.split(":");if(n.length!==2)throw new Error("Invalid encrypted format");let o=Buffer.from(n[0],"hex"),s=n[1],a=G.createDecipheriv("aes-256-cbc",t.slice(0,32),o),c=a.update(s,"hex","utf8");return c+=a.final("utf8"),c}catch(t){throw p.error("Decryption failed:",t),new Error("Failed to decrypt data")}}async function ot(r){se();try{let t=Ae(r);P.writeFileSync(U,t,{mode:384})}catch(t){throw p.error("Failed to save API key:",t),t}}async function ae(){try{if(P.existsSync(U)){let r=P.readFileSync(U,"utf8").trim();return Ie(r)}return null}catch(r){return p.error("Failed to read API key:",r),null}}async function st(){try{P.existsSync(U)?(P.unlinkSync(U),p.success("API key removed successfully.")):p.warn("No API key found to remove.")}catch(r){throw p.error("Failed to remove API key:",r),r}}async function it(r){se();try{P.writeFileSync(q,JSON.stringify(r,null,2),{mode:384}),p.success("Docker information saved successfully.")}catch(t){throw p.error("Failed to save Docker information:",t),t}}async function at(){try{if(P.existsSync(q)){let r=P.readFileSync(q,"utf8");return JSON.parse(r)}return null}catch(r){return p.error("Failed to read Docker credentials:",r),null}}var Y=process.env.CLOUD_API_URL||"https://cloud-api.phala.network",lt=process.env.CLOUD_URL||"https://cloud.phala.network",ce="0.0.1";var pt="phalanetwork/tappd-simulator:latest",mt=2,ut=4096,gt=40,dt="dstack-0.3.6",v={USER_INFO:"/api/v1/auth/me",TEEPODS:"/api/v1/teepods/available",TEEPOD_IMAGES:r=>`/api/v1/teepods/${r}/images`,CVMS:r=>`/api/v1/cvms?user_id=${r}`,CVM_BY_APP_ID:r=>`/api/v1/cvms/app_${r}`,CVM_NETWORK:r=>`/api/v1/cvms/app_${r}/network`,CVM_START:r=>`/api/v1/cvms/app_${r}/start`,CVM_STOP:r=>`/api/v1/cvms/app_${r}/stop`,CVM_RESTART:r=>`/api/v1/cvms/app_${r}/restart`,CVM_LOGS:r=>`/api/v1/cvms/app_${r}/logs`,CVM_FROM_CONFIGURATION:"/api/v1/cvms/from_cvm_configuration",CVM_PUBKEY:"/api/v1/cvms/pubkey/from_cvm_configuration",CVM_UPGRADE:r=>`/api/v1/cvms/app_${r}/compose`,CVM_ATTESTATION:r=>`/api/v1/cvms/app_${r}/attestation`,CVM_RESIZE:r=>`/api/v1/cvms/app_${r}/resources`,CVM_COMPOSE:r=>`/api/v1/cvms/${r}/compose`,REPLICATE_CVM:r=>`/api/v1/cvms/${r}/replicas`},ft=`version: '3.8'
|
2
|
+
services:
|
3
|
+
postgres:
|
4
|
+
image: ankane/pgvector:latest
|
5
|
+
environment:
|
6
|
+
- POSTGRES_PASSWORD=postgres
|
7
|
+
- POSTGRES_USER=postgres
|
8
|
+
- POSTGRES_DB=eliza
|
9
|
+
- PGDATA=/var/lib/postgresql/data/pgdata
|
10
|
+
volumes:
|
11
|
+
- postgres-data:/var/lib/postgresql/data:rw
|
12
|
+
ports:
|
13
|
+
- '127.0.0.1:5432:5432'
|
14
|
+
healthcheck:
|
15
|
+
test: ['CMD-SHELL', 'pg_isready -U $\${POSTGRES_USER} -d $\${POSTGRES_DB}']
|
16
|
+
interval: 5s
|
17
|
+
timeout: 5s
|
18
|
+
retries: 5
|
19
|
+
restart: always
|
20
|
+
networks:
|
21
|
+
- eliza-network
|
22
|
+
eliza:
|
23
|
+
image: {{imageName}}
|
24
|
+
command: bun run start
|
25
|
+
volumes:
|
26
|
+
- /var/run/tappd.sock:/var/run/tappd.sock
|
27
|
+
environment:
|
28
|
+
{{#each envVars}} - {{{this}}}
|
29
|
+
{{/each}}
|
30
|
+
ports:
|
31
|
+
- '3000:3000'
|
32
|
+
- '50000-50100:50000-50100/udp'
|
33
|
+
depends_on:
|
34
|
+
postgres:
|
35
|
+
condition: service_healthy
|
36
|
+
restart: always
|
37
|
+
networks:
|
38
|
+
- eliza-network
|
39
|
+
|
40
|
+
|
41
|
+
networks:
|
42
|
+
eliza-network:
|
43
|
+
driver: bridge
|
44
|
+
|
45
|
+
volumes:
|
46
|
+
postgres-data:`,ht=`version: '3.8'
|
47
|
+
services:
|
48
|
+
app:
|
49
|
+
image: {{imageName}}
|
50
|
+
container_name: app
|
51
|
+
volumes:
|
52
|
+
- /var/run/tappd.sock:/var/run/tappd.sock
|
53
|
+
environment:
|
54
|
+
{{#each envVars}} - {{{this}}}
|
55
|
+
{{/each}}
|
56
|
+
restart: always
|
57
|
+
`;function J(r){try{return JSON.stringify(r)}catch(t){return t instanceof Error&&t.message.includes("cyclic")?"[Cyclic Object]":String(r)}}var X=class{client;apiKey=null;constructor(t){p.debug(`Creating API client with base URL: ${t}`),this.client=$e.create({baseURL:t,headers:{"Content-Type":"application/json","User-Agent":`tee-cloud-cli/${ce}`}}),this.client.interceptors.request.use(async n=>{if(!this.apiKey){if(this.apiKey=await ae(),!this.apiKey)throw new Error('API key not found. Please set an API key first with "phala auth login"');p.debug(`API key loaded: ${this.apiKey.substring(0,5)}...`)}return n.headers["X-API-Key"]=this.apiKey,p.debug(`Making request to: ${n.baseURL}${n.url}`),n}),this.client.interceptors.response.use(n=>(p.debug(`Received successful response from: ${n.config.url}`),n),n=>{if(n.response){let{status:o,data:s}=n.response;p.debug(`Received error response: ${o} - ${J(s)}`),o===401?p.error("Authentication failed. Please check your API key."):o===403?p.error("You do not have permission to perform this action."):o===404?p.error("Resource not found."):p.error(`API Error (${o}): ${s.message||J(s)}`)}else n.request?(p.error("No response received from the server. Please check your internet connection."),p.debug(`Request details: ${J(n.request).substring(0,200)}...`)):p.error(`Error: ${n.message}`);return Promise.reject(n)})}async get(t,n){try{return p.debug(`GET request to: ${t}`),(await this.client.get(t,n)).data}catch(o){throw p.debug(`GET request failed: ${o instanceof Error?o.message:String(o)}`),o}}async post(t,n,o){try{return p.debug(`POST request to: ${t}`),(await this.client.post(t,n,o)).data}catch(s){throw p.debug(`POST request failed: ${s instanceof Error?s.message:String(s)}`),s}}async put(t,n,o){try{return p.debug(`PUT request to: ${t}`),(await this.client.put(t,n,o)).data}catch(s){throw p.debug(`PUT request failed: ${s instanceof Error?s.message:String(s)}`),s}}async delete(t,n){try{return p.debug(`DELETE request to: ${t}`),(await this.client.delete(t,n)).data}catch(o){throw p.debug(`DELETE request failed: ${o instanceof Error?o.message:String(o)}`),o}}async patch(t,n,o){try{return p.debug(`PATCH request to: ${t}`),(await this.client.patch(t,n,o)).data}catch(s){throw p.debug(`PATCH request failed: ${s instanceof Error?s.message:String(s)}`),s}}};p.debug(`Initializing API client with URL: ${Y}`);var _=new X(Y);import{z as e}from"zod";import{INVALID as Me,ParseStatus as De,ZodIssueCode as O,ZodParsedType as le,ZodType as Le,addIssueToContext as V,z as pe}from"zod";var Oe="ZodDecimal",Ve=/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/,j=class extends Le{_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)!==le.number){let a=this._getOrReturnCtx(t);return V(a,{code:O.invalid_type,expected:le.number,received:a.parsedType}),Me}let o,s=new De;for(let a of this._def.checks)if(a.kind==="precision"){let c=t.data.toString().match(Ve);Math.max((c[1]?c[1].length:0)-(c[2]?parseInt(c[2],10):0),0)>a.value&&(o=this._getOrReturnCtx(t,o),V(o,{code:O.custom,message:a.message,params:{precision:a.value}}),s.dirty())}else a.kind==="wholeNumber"?t.data.toString().split(".")[0].length>a.value&&(o=this._getOrReturnCtx(t,o),V(o,{code:O.custom,message:a.message,params:{wholeNumber:a.value}}),s.dirty()):a.kind==="min"?(a.inclusive?t.data<a.value:t.data<=a.value)&&(o=this._getOrReturnCtx(t,o),V(o,{code:O.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)&&(o=this._getOrReturnCtx(t,o),V(o,{code:O.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="finite"&&(Number.isFinite(t.data)||(o=this._getOrReturnCtx(t,o),V(o,{code:O.not_finite,message:a.message}),s.dirty()));return{status:s.value,value:t.data}}setLimit(t,n,o,s){return new j({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:o,message:s}]})}_addCheck(t){return new j({...this._def,checks:[...this._def.checks,t]})}lte(t,n){return this.setLimit("max",t,!0,n)}lt(t,n){return this.setLimit("max",t,!1,n)}max=this.lte;gt(t,n){return this.setLimit("min",t,!1,n)}gte(t,n){return this.setLimit("min",t,!0,n)}min=this.gte;precision(t,n){return this._addCheck({kind:"precision",value:t,message:n})}wholeNumber(t,n){return this._addCheck({kind:"wholeNumber",value:t,message:n})}get minValue(){let t=null;for(let n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(let n of this._def.checks)n.kind==="max"&&(t===null||n.value<t)&&(t=n.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,n=null;for(let o of this._def.checks){if(o.kind==="finite")return!0;o.kind==="min"?(n===null||o.value>n)&&(n=o.value):o.kind==="max"&&(t===null||o.value<t)&&(t=o.value)}return Number.isFinite(n)&&Number.isFinite(t)}},N=j;re(N,"create",t=>new j({checks:[],typeName:Oe,coerce:t?.coerce??!1}));var It=pe.object({template:pe.string().min(1,"Template cannot be empty")});var Ne=e.object({password:e.string(),registry:e.string().nullable(),username:e.string()}),ze=e.object({docker_compose_file:e.string(),docker_config:Ne.optional(),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()}),Fe=e.object({name:e.string(),image:e.string(),compose_file:ze.nullable(),vcpu:e.number(),memory:e.number(),disk_size:e.number(),ports:e.array(e.any())}),Ue=e.object({id:e.string(),name:e.string(),status:e.string(),uptime:e.string(),app_url:e.string(),app_id:e.string(),instance_id:e.string(),configuration:Fe,exited_at:e.string(),boot_progress:e.string(),boot_error:e.string(),shutdown_progress:e.string(),image_version:e.string()}),je=e.object({id:e.number(),username:e.string()}),We=e.object({id:e.number(),name:e.string(),region_identifier:e.string().optional()}),Q=e.object({hosted:Ue,name:e.string(),managed_user:je,node:We,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()}),me=e.object({app_env_encrypt_pubkey:e.string(),app_id_salt:e.string()}),ue=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()}),ge=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()}),Ot=e.array(Q),de=e.object({detail:e.string()}),Vt=e.object({key:e.string(),value:e.string()}),ee=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()}),Be=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(ee).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()}),Ge=e.object({max_instances:e.number().nullable(),max_vcpu:e.number().nullable(),max_memory:e.number().nullable(),max_disk:e.number().nullable()}),Ke=e.object({id:e.string(),url:e.string(),version:e.string(),chain_id:e.number(),kms_contract_address:e.string(),gateway_app_id:e.string()}),fe=e.object({tier:e.string(),capacity:Ge,nodes:e.array(Be),kms_list:e.array(Ke).optional()}),he=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()}))}),ye=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()}),be=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()}),ve=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()});function _e(r){try{return JSON.stringify(r)}catch(t){return t instanceof Error&&t.message.includes("cyclic")?"[Cyclic Object]":String(r)}}async function Bt(){try{p.debug(`Fetching user info from ${v.USER_INFO}`);let r=await _.get(v.USER_INFO);p.debug(`Received response: ${_e(r)}`);try{return ge.parse(r)}catch(t){throw p.error(`Failed to parse user info response: ${t}`),p.debug(`Response structure: ${_e(r)}`),t}}catch(r){throw p.error(`Failed to get user info: ${r instanceof Error?r.message:String(r)}`),new Error(`Failed to get user info: ${r instanceof Error?r.message:String(r)}`)}}import Ze from"inquirer";import{z as Ce}from"zod";async function ke(){try{let r=await _.get(v.CVMS(0));return Ce.array(Q).parse(r)}catch(r){throw new Error(`Failed to get CVMs: ${r instanceof Error?r.message:String(r)}`)}}async function er(r){let n=(await ke()).find(o=>o.hosted?.app_id===r||`app_${o.hosted?.app_id}`===r);if(!n)p.error(`CVM with App ID app_${r} not detected`),process.exit(1);else return p.success(`CVM with App ID app_${r} detected`),n.hosted?.app_id||""}async function tr(r){try{let t=await _.get(v.CVM_BY_APP_ID(r));return ue.parse(t)}catch(t){throw new Error(`Failed to get CVM by App ID: ${t instanceof Error?t.message:String(t)}`)}}async function rr(r){try{let t=await _.post(v.CVM_PUBKEY,r);return me.parse(t)}catch(t){throw new Error(`Failed to get pubkey from CVM: ${t instanceof Error?t.message:String(t)}`)}}async function nr(r){try{let t=await _.get(v.CVM_NETWORK(r));return he.parse(t)}catch(t){throw new Error(`Failed to get network information for CVM: ${t instanceof Error?t.message:String(t)}`)}}async function or(r){try{let t=await _.post(v.CVM_FROM_CONFIGURATION,r);return W.parse(t)}catch(t){throw t instanceof Ce.ZodError?(p.error("Schema validation error:",JSON.stringify(t.errors,null,2)),p.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 sr(r){try{let t=await _.post(v.CVM_START(r));return W.parse(t)}catch(t){throw new Error(`Failed to start CVM: ${t instanceof Error?t.message:String(t)}`)}}async function ir(r){try{let t=await _.post(v.CVM_STOP(r));return W.parse(t)}catch(t){throw new Error(`Failed to stop CVM: ${t instanceof Error?t.message:String(t)}`)}}async function ar(r){try{let t=await _.post(v.CVM_RESTART(r));return W.parse(t)}catch(t){throw new Error(`Failed to restart CVM: ${t instanceof Error?t.message:String(t)}`)}}async function cr(r,t){try{let n=await _.put(v.CVM_UPGRADE(r),t);return de.parse(n)}catch(n){throw new Error(`Failed to upgrade CVM: ${n instanceof Error?n.message:String(n)}`)}}async function lr(r){try{return await _.delete(v.CVM_BY_APP_ID(r)),!0}catch(t){throw new Error(`Failed to delete CVM: ${t instanceof Error?t.message:String(t)}`)}}async function pr(r){try{return await _.put(v.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 mr(){let r=p.startSpinner("Fetching available CVMs"),t=await ke();if(r.stop(!0),!t||t.length===0){p.info("No CVMs found for your account");return}let n=t.map(s=>{let a=s.hosted?.app_id||s.hosted?.id,c=s.name||s.hosted?.name,C=s.status||s.hosted?.status;return{name:`${c||"Unnamed"} (${a}) - Status: ${C||"Unknown"}`,value:a}}),{selectedCvm:o}=await Ze.prompt([{type:"list",name:"selectedCvm",message:"Select a CVM:",choices:n}]);return o}async function ur(r){try{let t=await _.get(v.CVM_ATTESTATION(r));try{return ve.parse(t)}catch(n){return p.debug(`Validation error: ${n instanceof Error?n.message:String(n)}`),{is_online:!!t?.is_online,is_public:!!t?.is_public,error:typeof t?.error=="string"?t.error:null,app_certificates:Array.isArray(t?.app_certificates)?t.app_certificates:null,tcb_info:t?.tcb_info||null,compose_file:typeof t?.compose_file=="string"?t.compose_file:null}}}catch(t){throw new Error(`Failed to get attestation information: ${t instanceof Error?t.message:String(t)}`)}}async function gr(r){try{let t=await _.get(v.CVM_COMPOSE(r));return ye.parse(t)}catch(t){throw new Error(`Failed to get CVM compose config: ${t instanceof Error?t.message:String(t)}`)}}async function dr(r,t){try{let n=await _.post(v.REPLICATE_CVM(r),t);return be.parse(n)}catch(n){throw new Error(`Failed to replicate CVM: ${n instanceof Error?n.message:String(n)}`)}}async function fr(r,t,n,o,s){try{let a={};if(t!==void 0&&(a.vcpu=t),n!==void 0&&(a.memory=n),o!==void 0&&(a.disk_size=o),s!==void 0&&(a.allow_restart=s),Object.keys(a).length===0)throw new Error("At least one resource parameter must be provided");return await _.patch(v.CVM_RESIZE(r),a),!0}catch(a){throw new Error(`Failed to resize CVM: ${a instanceof Error?a.message:String(a)}`)}}import{z as qe}from"zod";async function He(){try{let r=await _.get(v.TEEPODS);return fe.parse(r)}catch(r){throw new Error(`Failed to get TEEPods: ${r instanceof Error?r.message:String(r)}`)}}async function Tr(r){try{let n=(await He()).nodes.find(s=>s.teepod_id===Number(r));if(n&&n.images&&n.images.length>0)return n.images;let o=await _.get(v.TEEPOD_IMAGES(r));return qe.array(ee).parse(o)}catch(t){throw new Error(`Failed to get TEEPod images: ${t instanceof Error?t.message:String(t)}`)}}export{p as a,ot as b,ae as c,st as d,it as e,at as f,lt as g,pt as h,mt as i,ut as j,gt as k,dt as l,ft as m,ht as n,X as o,_ as p,It as q,Ne as r,ze as s,Fe as t,Ue as u,je as v,We as w,Q as x,W as y,me as z,ue as A,ge as B,Ot as C,de as D,Vt as E,ee as F,Be as G,Ge as H,Ke as I,fe as J,he as K,ye as L,be as M,ve as N,Bt as O,ke as P,er as Q,tr as R,rr as S,nr as T,or as U,sr as V,ir as W,ar as X,cr as Y,lr as Z,pr as _,mr as $,ur as aa,gr as ba,dr as ca,fr as da,He as ea,Tr as fa};
|
58
|
+
//# sourceMappingURL=chunk-6GN3UXCF.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/api/client.ts","../src/utils/credentials.ts","../src/utils/constants.ts","../src/api/types.ts","../src/utils/types.ts","../src/api/auth.ts","../src/api/cvms.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 axios, { AxiosInstance, AxiosRequestConfig } from 'axios';\nimport { getApiKey } from '../utils/credentials';\nimport { logger } from '../utils/logger';\nimport { CLOUD_API_URL, CLI_VERSION } from '../utils/constants';\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\nexport class ApiClient {\n private client: AxiosInstance;\n private apiKey: string | null = null;\n\n constructor(baseURL: string) {\n logger.debug(`Creating API client with base URL: ${baseURL}`);\n \n this.client = axios.create({\n baseURL,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': `tee-cloud-cli/${CLI_VERSION}`,\n },\n });\n\n // Add request interceptor to include API key\n this.client.interceptors.request.use(async (config) => {\n if (!this.apiKey) {\n this.apiKey = await getApiKey();\n if (!this.apiKey) {\n throw new Error('API key not found. Please set an API key first with \"phala auth login\"');\n }\n logger.debug(`API key loaded: ${this.apiKey.substring(0, 5)}...`);\n }\n \n config.headers['X-API-Key'] = this.apiKey;\n logger.debug(`Making request to: ${config.baseURL}${config.url}`);\n return config;\n });\n\n // Add response interceptor for error handling\n this.client.interceptors.response.use(\n (response) => {\n logger.debug(`Received successful response from: ${response.config.url}`);\n return response;\n },\n (error) => {\n if (error.response) {\n const { status, data } = error.response;\n \n logger.debug(`Received error response: ${status} - ${safeStringify(data)}`);\n \n if (status === 401) {\n logger.error('Authentication failed. Please check your API key.');\n } else if (status === 403) {\n logger.error('You do not have permission to perform this action.');\n } else if (status === 404) {\n logger.error('Resource not found.');\n } else {\n logger.error(`API Error (${status}): ${data.message || safeStringify(data)}`);\n }\n } else if (error.request) {\n logger.error('No response received from the server. Please check your internet connection.');\n logger.debug(`Request details: ${safeStringify(error.request).substring(0, 200)}...`);\n } else {\n logger.error(`Error: ${error.message}`);\n }\n \n return Promise.reject(error);\n }\n );\n }\n\n async get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n logger.debug(`GET request to: ${url}`);\n const response = await this.client.get<T>(url, config);\n return response.data;\n } catch (error) {\n logger.debug(`GET request failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n async post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n try {\n logger.debug(`POST request to: ${url}`);\n const response = await this.client.post<T>(url, data, config);\n return response.data;\n } catch (error) {\n logger.debug(`POST request failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n async put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n try {\n logger.debug(`PUT request to: ${url}`);\n const response = await this.client.put<T>(url, data, config);\n return response.data;\n } catch (error) {\n logger.debug(`PUT request failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n async delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {\n try {\n logger.debug(`DELETE request to: ${url}`);\n const response = await this.client.delete<T>(url, config);\n return response.data;\n } catch (error) {\n logger.debug(`DELETE request failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n async patch<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n try {\n logger.debug(`PATCH request to: ${url}`);\n const response = await this.client.patch<T>(url, data, config);\n return response.data;\n } catch (error) {\n logger.debug(`PATCH request failed: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n}\n\n// Create and export a singleton instance\nlogger.debug(`Initializing API client with URL: ${CLOUD_API_URL}`);\nexport const apiClient = new ApiClient(CLOUD_API_URL); ","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 async function getApiKey(): Promise<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} ","// API URLs\nexport const CLOUD_API_URL = process.env.CLOUD_API_URL || 'https://cloud-api.phala.network';\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 = 2;\nexport const DEFAULT_MEMORY = 4096; // 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: '/api/v1/auth/me',\n\n // TEEPods\n TEEPODS: '/api/v1/teepods/available',\n TEEPOD_IMAGES: (teepodId: string) => `/api/v1/teepods/${teepodId}/images`,\n \n // CVMs\n CVMS: (userId: number) => `/api/v1/cvms?user_id=${userId}`,\n CVM_BY_APP_ID: (appId: string) => `/api/v1/cvms/app_${appId}`,\n CVM_NETWORK: (appId: string) => `/api/v1/cvms/app_${appId}/network`,\n CVM_START: (appId: string) => `/api/v1/cvms/app_${appId}/start`,\n CVM_STOP: (appId: string) => `/api/v1/cvms/app_${appId}/stop`,\n CVM_RESTART: (appId: string) => `/api/v1/cvms/app_${appId}/restart`,\n CVM_LOGS: (appId: string) => `/api/v1/cvms/app_${appId}/logs`,\n CVM_FROM_CONFIGURATION: '/api/v1/cvms/from_cvm_configuration',\n CVM_PUBKEY: '/api/v1/cvms/pubkey/from_cvm_configuration',\n CVM_UPGRADE: (appId: string) => `/api/v1/cvms/app_${appId}/compose`,\n CVM_ATTESTATION: (appId: string) => `/api/v1/cvms/app_${appId}/attestation`,\n CVM_RESIZE: (appId: string) => `/api/v1/cvms/app_${appId}/resources`,\n CVM_COMPOSE: (cvmId: string) => `/api/v1/cvms/${cvmId}/compose`,\n REPLICATE_CVM: (appId: string) => `/api/v1/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 { 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(),\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});\n\n// Configuration Schema\nexport const configurationSchema = z.object({\n name: z.string(),\n image: z.string(),\n compose_file: composeFileSchema.nullable(),\n vcpu: z.number(),\n memory: z.number(),\n disk_size: z.number(),\n ports: z.array(z.any())\n});\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(),\n app_id: z.string(),\n instance_id: z.string(),\n configuration: configurationSchema,\n exited_at: z.string(),\n boot_progress: z.string(),\n boot_error: z.string(),\n shutdown_progress: z.string(),\n image_version: z.string()\n});\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 role: z.string(),\n avatar: z.string(),\n flag_reset_password: z.boolean(),\n team_name: z.string(),\n team_tier: z.string(),\n trial_ended_at: z.string().nullable()\n});\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 url: z.string(),\n version: z.string(),\n chain_id: z.number(),\n kms_contract_address: z.string(),\n gateway_app_id: z.string(),\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 { apiClient } from './client';\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(): Promise<GetUserInfoResponse> {\n try {\n logger.debug(`Fetching user info from ${API_ENDPOINTS.USER_INFO}`);\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}","import { apiClient } from './client';\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';\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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 // Only include defined parameters in the payload\n const resizePayload: ResizeCvmPayload = {};\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 { apiClient } from './client';\nimport { API_ENDPOINTS } from '../utils/constants';\nimport { TEEPod, Image, teepodSchema, imageSchema, TeepodResponse, teepodResponseSchema } from './types';\nimport { z } from 'zod';\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 response = 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 // 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 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","axios","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","CLOUD_API_URL","CLOUD_URL","CLI_VERSION","TEE_SIMULATOR","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","ApiClient","baseURL","logger","axios","CLI_VERSION","config","getApiKey","response","status","data","url","CLOUD_API_URL","apiClient","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","safeStringify","obj","error","getUserInfo","logger","API_ENDPOINTS","response","apiClient","getUserInfoResponseSchema","parseError","inquirer","z","getCvms","response","apiClient","API_ENDPOINTS","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","getCvmAttestation","cvmAttestationResponseSchema","validationError","getCvmComposeConfig","cvmId","cvmComposeConfigSchema","replicateCvm","payload","replicateCvmResponseSchema","resizeCvm","vcpu","memory","diskSize","allowRestart","resizePayload","z","getTeepods","response","apiClient","API_ENDPOINTS","teepodResponseSchema","error","getTeepodImages","teepodId","teepod","pod","imageSchema"]}
|