@phala/cloud 0.2.0 → 0.2.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  AddComposeHashSchema: () => AddComposeHashSchema,
34
+ AllFamiliesResponseSchema: () => AllFamiliesResponseSchema,
34
35
  ApiErrorSchema: () => ApiErrorSchema,
35
36
  AuthError: () => AuthError,
36
37
  AvailableNodesSchema: () => AvailableNodesSchema,
@@ -55,6 +56,8 @@ __export(index_exports, {
55
56
  DeleteCvmRequestSchema: () => DeleteCvmRequestSchema,
56
57
  DeployAppAuthRequestSchema: () => DeployAppAuthRequestSchema,
57
58
  DeployAppAuthSchema: () => DeployAppAuthSchema,
59
+ FamilyGroupSchema: () => FamilyGroupSchema,
60
+ FamilyInstanceTypesResponseSchema: () => FamilyInstanceTypesResponseSchema,
58
61
  GetAppEnvEncryptPubKeyRequestSchema: () => GetAppEnvEncryptPubKeyRequestSchema,
59
62
  GetAppEnvEncryptPubKeySchema: () => GetAppEnvEncryptPubKeySchema,
60
63
  GetAvailableOSImagesRequestSchema: () => GetAvailableOSImagesRequestSchema,
@@ -74,7 +77,7 @@ __export(index_exports, {
74
77
  GetKmsListSchema: () => GetKmsListSchema,
75
78
  InstanceTypeSchema: () => InstanceTypeSchema,
76
79
  KmsInfoSchema: () => KmsInfoSchema,
77
- ListInstanceTypesRequestSchema: () => ListInstanceTypesRequestSchema,
80
+ ListFamilyInstanceTypesRequestSchema: () => ListFamilyInstanceTypesRequestSchema,
78
81
  ListWorkspacesSchema: () => ListWorkspacesSchema,
79
82
  ManagedUserSchema: () => ManagedUserSchema,
80
83
  MaxRetriesExceededError: () => MaxRetriesExceededError,
@@ -82,7 +85,6 @@ __export(index_exports, {
82
85
  NextAppIdsRequestSchema: () => NextAppIdsRequestSchema,
83
86
  NextAppIdsSchema: () => NextAppIdsSchema,
84
87
  OSImageVariantSchema: () => OSImageVariantSchema,
85
- PaginatedInstanceTypesSchema: () => PaginatedInstanceTypesSchema,
86
88
  PaginationMetadataSchema: () => PaginationMetadataSchema,
87
89
  PhalaCloudError: () => PhalaCloudError,
88
90
  ProvisionCvmComposeFileUpdateRequestSchema: () => ProvisionCvmComposeFileUpdateRequestSchema,
@@ -90,6 +92,7 @@ __export(index_exports, {
90
92
  ProvisionCvmRequestSchema: () => ProvisionCvmRequestSchema,
91
93
  ProvisionCvmSchema: () => ProvisionCvmSchema,
92
94
  RequestError: () => RequestError,
95
+ ResourceError: () => ResourceError,
93
96
  RestartCvmRequestSchema: () => RestartCvmRequestSchema,
94
97
  SUPPORTED_CHAINS: () => SUPPORTED_CHAINS,
95
98
  ServerError: () => ServerError,
@@ -134,6 +137,7 @@ __export(index_exports, {
134
137
  executeTransactionWithRetry: () => executeTransactionWithRetry,
135
138
  extractNetworkClients: () => extractNetworkClients,
136
139
  formatErrorMessage: () => formatErrorMessage,
140
+ formatStructuredError: () => formatStructuredError,
137
141
  formatValidationErrors: () => formatValidationErrors,
138
142
  getAppEnvEncryptPubKey: () => getAppEnvEncryptPubKey,
139
143
  getAvailableNodes: () => getAvailableNodes,
@@ -154,7 +158,8 @@ __export(index_exports, {
154
158
  getKmsList: () => getKmsList,
155
159
  getValidationFields: () => getValidationFields,
156
160
  getWorkspace: () => getWorkspace,
157
- listInstanceTypes: () => listInstanceTypes,
161
+ listAllInstanceTypeFamilies: () => listAllInstanceTypeFamilies,
162
+ listFamilyInstanceTypes: () => listFamilyInstanceTypes,
158
163
  listWorkspaces: () => listWorkspaces,
159
164
  nextAppIds: () => nextAppIds,
160
165
  parseApiError: () => parseApiError,
@@ -186,7 +191,8 @@ __export(index_exports, {
186
191
  safeGetKmsInfo: () => safeGetKmsInfo,
187
192
  safeGetKmsList: () => safeGetKmsList,
188
193
  safeGetWorkspace: () => safeGetWorkspace,
189
- safeListInstanceTypes: () => safeListInstanceTypes,
194
+ safeListAllInstanceTypeFamilies: () => safeListAllInstanceTypeFamilies,
195
+ safeListFamilyInstanceTypes: () => safeListFamilyInstanceTypes,
190
196
  safeListWorkspaces: () => safeListWorkspaces,
191
197
  safeNextAppIds: () => safeNextAppIds,
192
198
  safeProvisionCvm: () => safeProvisionCvm,
@@ -230,8 +236,11 @@ var ApiErrorSchema = import_zod.z.object({
230
236
  import_zod.z.object({
231
237
  msg: import_zod.z.string(),
232
238
  type: import_zod.z.string().optional(),
233
- ctx: import_zod.z.record(import_zod.z.unknown()).optional()
234
- })
239
+ ctx: import_zod.z.record(import_zod.z.unknown()).optional(),
240
+ loc: import_zod.z.array(import_zod.z.union([import_zod.z.string(), import_zod.z.number()])).optional(),
241
+ input: import_zod.z.unknown().optional()
242
+ }).passthrough()
243
+ // Allow additional fields
235
244
  ),
236
245
  import_zod.z.record(import_zod.z.unknown())
237
246
  ]).optional(),
@@ -334,6 +343,9 @@ var UnknownError = class extends PhalaCloudError {
334
343
  }
335
344
  };
336
345
  function extractFieldPath(loc) {
346
+ if (!loc || !Array.isArray(loc)) {
347
+ return "unknown";
348
+ }
337
349
  const filtered = loc.filter((part) => {
338
350
  if (typeof part === "string") {
339
351
  return !["body", "query", "path", "header"].includes(part);
@@ -349,12 +361,21 @@ function parseValidationErrors(detail) {
349
361
  message: typeof detail === "string" ? detail : "Validation error"
350
362
  };
351
363
  }
352
- const errors = detail.map((item) => ({
353
- field: extractFieldPath(item.loc),
354
- message: item.msg,
355
- type: item.type,
356
- context: item.ctx
357
- }));
364
+ const errors = detail.map(
365
+ (item, index) => {
366
+ const field = extractFieldPath(item.loc);
367
+ let displayField = field;
368
+ if (field === "unknown" && item.type) {
369
+ displayField = item.type === "missing" ? "required field" : item.type;
370
+ }
371
+ return {
372
+ field: displayField,
373
+ message: item.msg,
374
+ type: item.type,
375
+ context: item.ctx
376
+ };
377
+ }
378
+ );
358
379
  const count = errors.length;
359
380
  const message = count === 1 ? `Validation failed: ${errors[0].message}` : `Validation failed (${count} issue${count > 1 ? "s" : ""})`;
360
381
  return { errors, message };
@@ -397,13 +418,21 @@ function parseApiError(requestError) {
397
418
  const status = requestError.status ?? 0;
398
419
  const statusText = requestError.statusText ?? "Unknown Error";
399
420
  const detail = requestError.detail;
421
+ const structured = parseStructuredError(detail);
422
+ if (structured) {
423
+ return new ResourceError(structured.message, {
424
+ status,
425
+ statusText,
426
+ detail,
427
+ errorCode: structured.error_code,
428
+ structuredDetails: structured.details,
429
+ suggestions: structured.suggestions,
430
+ links: structured.links
431
+ });
432
+ }
400
433
  const errorType = categorizeErrorType(status);
401
434
  const message = extractPrimaryMessage(status, detail, requestError.message);
402
- const commonData = {
403
- status,
404
- statusText,
405
- detail
406
- };
435
+ const commonData = { status, statusText, detail };
407
436
  if (errorType === "validation" && Array.isArray(detail)) {
408
437
  const { errors } = parseValidationErrors(detail);
409
438
  return new ValidationError(message, {
@@ -465,6 +494,67 @@ function getErrorMessage(error) {
465
494
  }
466
495
  return "Unknown error occurred";
467
496
  }
497
+ var ResourceError = class extends BusinessError {
498
+ constructor(message, data) {
499
+ super(message, data);
500
+ this.isResourceError = true;
501
+ this.errorCode = data.errorCode;
502
+ this.structuredDetails = data.structuredDetails;
503
+ this.suggestions = data.suggestions;
504
+ this.links = data.links;
505
+ }
506
+ };
507
+ function parseStructuredError(detail) {
508
+ if (!detail || typeof detail !== "object") {
509
+ return null;
510
+ }
511
+ const obj = detail;
512
+ if (obj.error_code && typeof obj.error_code === "string" && obj.message && typeof obj.message === "string") {
513
+ return {
514
+ error_code: obj.error_code,
515
+ message: obj.message,
516
+ details: obj.details,
517
+ suggestions: obj.suggestions,
518
+ links: obj.links
519
+ };
520
+ }
521
+ return null;
522
+ }
523
+ function formatStructuredError(error, options) {
524
+ const { showErrorCode = true, showSuggestions = true, showLinks = true } = options ?? {};
525
+ const parts = [];
526
+ if (showErrorCode && error.errorCode) {
527
+ parts.push(`Error [${error.errorCode}]: ${error.message}`);
528
+ } else {
529
+ parts.push(error.message);
530
+ }
531
+ if (error.structuredDetails && error.structuredDetails.length > 0) {
532
+ parts.push("");
533
+ parts.push("Details:");
534
+ error.structuredDetails.forEach((d) => {
535
+ if (d.message) {
536
+ parts.push(` - ${d.message}`);
537
+ } else if (d.field && d.value !== void 0) {
538
+ parts.push(` - ${d.field}: ${d.value}`);
539
+ }
540
+ });
541
+ }
542
+ if (showSuggestions && error.suggestions && error.suggestions.length > 0) {
543
+ parts.push("");
544
+ parts.push("Suggestions:");
545
+ error.suggestions.forEach((s) => {
546
+ parts.push(` - ${s}`);
547
+ });
548
+ }
549
+ if (showLinks && error.links && error.links.length > 0) {
550
+ parts.push("");
551
+ parts.push("Learn more:");
552
+ error.links.forEach((link) => {
553
+ parts.push(` - ${link.label}: ${link.url}`);
554
+ });
555
+ }
556
+ return parts.join("\n");
557
+ }
468
558
 
469
559
  // src/client.ts
470
560
  var SUPPORTED_API_VERSIONS = ["2025-05-31", "2025-10-28"];
@@ -1022,10 +1112,6 @@ var { action: getAvailableNodes, safeAction: safeGetAvailableNodes } = defineSim
1022
1112
 
1023
1113
  // src/actions/list-instance-types.ts
1024
1114
  var import_zod5 = require("zod");
1025
- var ListInstanceTypesRequestSchema = import_zod5.z.object({
1026
- page: import_zod5.z.number().int().min(1).optional().default(1),
1027
- page_size: import_zod5.z.number().int().min(1).max(1e3).optional().default(100)
1028
- }).strict();
1029
1115
  var InstanceTypeSchema = import_zod5.z.object({
1030
1116
  id: import_zod5.z.string(),
1031
1117
  name: import_zod5.z.string(),
@@ -1034,22 +1120,34 @@ var InstanceTypeSchema = import_zod5.z.object({
1034
1120
  memory_mb: import_zod5.z.number(),
1035
1121
  hourly_rate: import_zod5.z.string(),
1036
1122
  requires_gpu: import_zod5.z.boolean(),
1037
- public: import_zod5.z.boolean(),
1038
- enabled: import_zod5.z.boolean()
1123
+ default_disk_size_gb: import_zod5.z.number().default(20),
1124
+ family: import_zod5.z.string().nullable()
1039
1125
  }).passthrough();
1040
- var PaginatedInstanceTypesSchema = import_zod5.z.object({
1126
+ var FamilyGroupSchema = import_zod5.z.object({
1127
+ name: import_zod5.z.string(),
1128
+ items: import_zod5.z.array(InstanceTypeSchema),
1129
+ total: import_zod5.z.number()
1130
+ }).strict();
1131
+ var AllFamiliesResponseSchema = import_zod5.z.object({
1132
+ result: import_zod5.z.array(FamilyGroupSchema)
1133
+ }).strict();
1134
+ var FamilyInstanceTypesResponseSchema = import_zod5.z.object({
1041
1135
  items: import_zod5.z.array(InstanceTypeSchema),
1042
1136
  total: import_zod5.z.number(),
1043
- page: import_zod5.z.number(),
1044
- page_size: import_zod5.z.number(),
1045
- pages: import_zod5.z.number()
1137
+ family: import_zod5.z.string()
1046
1138
  }).strict();
1047
- var { action: listInstanceTypes, safeAction: safeListInstanceTypes } = defineAction(PaginatedInstanceTypesSchema, async (client, request) => {
1048
- const validatedRequest = ListInstanceTypesRequestSchema.parse(request ?? {});
1049
- const queryParams = new URLSearchParams();
1050
- queryParams.append("page", validatedRequest.page.toString());
1051
- queryParams.append("page_size", validatedRequest.page_size.toString());
1052
- return await client.get(`/api/instance-types?${queryParams.toString()}`);
1139
+ var ListFamilyInstanceTypesRequestSchema = import_zod5.z.object({
1140
+ family: import_zod5.z.string()
1141
+ }).strict();
1142
+ var { action: listAllInstanceTypeFamilies, safeAction: safeListAllInstanceTypeFamilies } = defineAction(
1143
+ AllFamiliesResponseSchema,
1144
+ async (client) => {
1145
+ return await client.get("/instance-types");
1146
+ }
1147
+ );
1148
+ var { action: listFamilyInstanceTypes, safeAction: safeListFamilyInstanceTypes } = defineAction(FamilyInstanceTypesResponseSchema, async (client, request) => {
1149
+ const validated = ListFamilyInstanceTypesRequestSchema.parse(request);
1150
+ return await client.get(`/instance-types/${validated.family}`);
1053
1151
  });
1054
1152
 
1055
1153
  // src/actions/workspaces/list_workspaces.ts
@@ -1269,6 +1367,7 @@ var ProvisionCvmSchema = import_zod10.z.object({
1269
1367
  fmspc: import_zod10.z.string().nullable().optional(),
1270
1368
  device_id: import_zod10.z.string().nullable().optional(),
1271
1369
  os_image_hash: import_zod10.z.string().nullable().optional(),
1370
+ instance_type: import_zod10.z.string().nullable().optional(),
1272
1371
  teepod_id: import_zod10.z.number().nullable().optional(),
1273
1372
  // Will be transformed to node_id
1274
1373
  node_id: import_zod10.z.number().nullable().optional(),
@@ -1282,19 +1381,24 @@ var ProvisionCvmSchema = import_zod10.z.object({
1282
1381
  });
1283
1382
  var ProvisionCvmRequestSchema = import_zod10.z.object({
1284
1383
  node_id: import_zod10.z.number().optional(),
1285
- // recommended
1384
+ // recommended - optional, system auto-selects if not specified
1286
1385
  teepod_id: import_zod10.z.number().optional(),
1287
1386
  // deprecated, for compatibility
1387
+ region: import_zod10.z.string().optional(),
1388
+ // optional - region filter for auto-selection
1288
1389
  name: import_zod10.z.string(),
1289
- image: import_zod10.z.string(),
1290
- vcpu: import_zod10.z.number(),
1291
- memory: import_zod10.z.number(),
1292
- disk_size: import_zod10.z.number(),
1390
+ instance_type: import_zod10.z.string().default("tdx.small"),
1391
+ // defaults to "tdx.small"
1392
+ image: import_zod10.z.string().optional(),
1393
+ vcpu: import_zod10.z.number().optional(),
1394
+ memory: import_zod10.z.number().optional(),
1395
+ disk_size: import_zod10.z.number().optional(),
1293
1396
  compose_file: import_zod10.z.object({
1294
1397
  allowed_envs: import_zod10.z.array(import_zod10.z.string()).optional(),
1295
1398
  pre_launch_script: import_zod10.z.string().optional(),
1296
1399
  docker_compose_file: import_zod10.z.string().optional(),
1297
- name: import_zod10.z.string().optional(),
1400
+ name: import_zod10.z.string().optional().default(""),
1401
+ // optional with default empty string
1298
1402
  kms_enabled: import_zod10.z.boolean().optional(),
1299
1403
  public_logs: import_zod10.z.boolean().optional(),
1300
1404
  public_sysinfo: import_zod10.z.boolean().optional(),
@@ -1304,8 +1408,11 @@ var ProvisionCvmRequestSchema = import_zod10.z.object({
1304
1408
  // deprecated, for compatibility
1305
1409
  }),
1306
1410
  listed: import_zod10.z.boolean().optional(),
1307
- instance_type: import_zod10.z.string().nullable().optional(),
1308
1411
  kms_id: import_zod10.z.string().optional(),
1412
+ kms: import_zod10.z.enum(["PHALA", "ETHEREUM", "BASE"]).optional(),
1413
+ // KMS type selection (defaults to PHALA)
1414
+ kms_contract: import_zod10.z.string().optional(),
1415
+ // KMS contract address for on-chain KMS
1309
1416
  env_keys: import_zod10.z.array(import_zod10.z.string()).optional()
1310
1417
  }).passthrough();
1311
1418
  function handleGatewayCompatibility(appCompose) {
@@ -1330,7 +1437,8 @@ function handleGatewayCompatibility(appCompose) {
1330
1437
  };
1331
1438
  }
1332
1439
  var { action: provisionCvm, safeAction: safeProvisionCvm } = defineAction(ProvisionCvmSchema, async (client, appCompose) => {
1333
- const body = handleGatewayCompatibility(appCompose);
1440
+ const validated = ProvisionCvmRequestSchema.parse(appCompose);
1441
+ const body = handleGatewayCompatibility(validated);
1334
1442
  let requestBody = { ...body };
1335
1443
  if (typeof body.node_id === "number") {
1336
1444
  requestBody = { ...body, teepod_id: body.node_id };
@@ -1374,7 +1482,7 @@ var CommitCvmProvisionSchema = import_zod11.z.object({
1374
1482
  var CommitCvmProvisionRequestSchema = import_zod11.z.object({
1375
1483
  encrypted_env: import_zod11.z.string().optional().nullable(),
1376
1484
  app_id: import_zod11.z.string(),
1377
- compose_hash: import_zod11.z.string().optional(),
1485
+ compose_hash: import_zod11.z.string(),
1378
1486
  kms_id: import_zod11.z.string().optional(),
1379
1487
  contract_address: import_zod11.z.string().optional(),
1380
1488
  deployer_address: import_zod11.z.string().optional(),
@@ -1917,8 +2025,10 @@ function createClient2(config = {}) {
1917
2025
  safeGetCurrentUser,
1918
2026
  getAvailableNodes,
1919
2027
  safeGetAvailableNodes,
1920
- listInstanceTypes,
1921
- safeListInstanceTypes,
2028
+ listAllInstanceTypeFamilies,
2029
+ safeListAllInstanceTypeFamilies,
2030
+ listFamilyInstanceTypes,
2031
+ safeListFamilyInstanceTypes,
1922
2032
  listWorkspaces,
1923
2033
  safeListWorkspaces,
1924
2034
  getWorkspace,
@@ -3420,6 +3530,7 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3420
3530
  // Annotate the CommonJS export names for ESM import in node:
3421
3531
  0 && (module.exports = {
3422
3532
  AddComposeHashSchema,
3533
+ AllFamiliesResponseSchema,
3423
3534
  ApiErrorSchema,
3424
3535
  AuthError,
3425
3536
  AvailableNodesSchema,
@@ -3444,6 +3555,8 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3444
3555
  DeleteCvmRequestSchema,
3445
3556
  DeployAppAuthRequestSchema,
3446
3557
  DeployAppAuthSchema,
3558
+ FamilyGroupSchema,
3559
+ FamilyInstanceTypesResponseSchema,
3447
3560
  GetAppEnvEncryptPubKeyRequestSchema,
3448
3561
  GetAppEnvEncryptPubKeySchema,
3449
3562
  GetAvailableOSImagesRequestSchema,
@@ -3463,7 +3576,7 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3463
3576
  GetKmsListSchema,
3464
3577
  InstanceTypeSchema,
3465
3578
  KmsInfoSchema,
3466
- ListInstanceTypesRequestSchema,
3579
+ ListFamilyInstanceTypesRequestSchema,
3467
3580
  ListWorkspacesSchema,
3468
3581
  ManagedUserSchema,
3469
3582
  MaxRetriesExceededError,
@@ -3471,7 +3584,6 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3471
3584
  NextAppIdsRequestSchema,
3472
3585
  NextAppIdsSchema,
3473
3586
  OSImageVariantSchema,
3474
- PaginatedInstanceTypesSchema,
3475
3587
  PaginationMetadataSchema,
3476
3588
  PhalaCloudError,
3477
3589
  ProvisionCvmComposeFileUpdateRequestSchema,
@@ -3479,6 +3591,7 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3479
3591
  ProvisionCvmRequestSchema,
3480
3592
  ProvisionCvmSchema,
3481
3593
  RequestError,
3594
+ ResourceError,
3482
3595
  RestartCvmRequestSchema,
3483
3596
  SUPPORTED_CHAINS,
3484
3597
  ServerError,
@@ -3523,6 +3636,7 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3523
3636
  executeTransactionWithRetry,
3524
3637
  extractNetworkClients,
3525
3638
  formatErrorMessage,
3639
+ formatStructuredError,
3526
3640
  formatValidationErrors,
3527
3641
  getAppEnvEncryptPubKey,
3528
3642
  getAvailableNodes,
@@ -3543,7 +3657,8 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3543
3657
  getKmsList,
3544
3658
  getValidationFields,
3545
3659
  getWorkspace,
3546
- listInstanceTypes,
3660
+ listAllInstanceTypeFamilies,
3661
+ listFamilyInstanceTypes,
3547
3662
  listWorkspaces,
3548
3663
  nextAppIds,
3549
3664
  parseApiError,
@@ -3575,7 +3690,8 @@ var import_verify_env_encrypt_public_key = require("@phala/dstack-sdk/verify-env
3575
3690
  safeGetKmsInfo,
3576
3691
  safeGetKmsList,
3577
3692
  safeGetWorkspace,
3578
- safeListInstanceTypes,
3693
+ safeListAllInstanceTypeFamilies,
3694
+ safeListFamilyInstanceTypes,
3579
3695
  safeListWorkspaces,
3580
3696
  safeNextAppIds,
3581
3697
  safeProvisionCvm,