@vm0/cli 4.29.0 → 4.30.0

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.
Files changed (2) hide show
  1. package/index.js +279 -157
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -2759,7 +2759,7 @@ var $ZodBase64 = /* @__PURE__ */ $constructor("$ZodBase64", (inst, def) => {
2759
2759
  function isValidBase64URL(data) {
2760
2760
  if (!base64url.test(data))
2761
2761
  return false;
2762
- const base643 = data.replace(/[-_]/g, (c11) => c11 === "-" ? "+" : "/");
2762
+ const base643 = data.replace(/[-_]/g, (c10) => c10 === "-" ? "+" : "/");
2763
2763
  const padded = base643.padEnd(Math.ceil(base643.length / 4) * 4, "=");
2764
2764
  return isValidBase64(padded);
2765
2765
  }
@@ -11671,9 +11671,9 @@ var ZodDate = /* @__PURE__ */ $constructor("ZodDate", (inst, def) => {
11671
11671
  ZodType.init(inst, def);
11672
11672
  inst.min = (value, params) => inst.check(_gte(value, params));
11673
11673
  inst.max = (value, params) => inst.check(_lte(value, params));
11674
- const c11 = inst._zod.bag;
11675
- inst.minDate = c11.minimum ? new Date(c11.minimum) : null;
11676
- inst.maxDate = c11.maximum ? new Date(c11.maximum) : null;
11674
+ const c10 = inst._zod.bag;
11675
+ inst.minDate = c10.minimum ? new Date(c10.minimum) : null;
11676
+ inst.maxDate = c10.maximum ? new Date(c10.maximum) : null;
11677
11677
  });
11678
11678
  function date3(params) {
11679
11679
  return _date(ZodDate, params);
@@ -12266,87 +12266,8 @@ var apiErrorSchema = external_exports.object({
12266
12266
  })
12267
12267
  });
12268
12268
 
12269
- // ../../packages/core/src/contracts/secrets.ts
12270
- var c = initContract();
12271
- var secretNameSchema = external_exports.string().min(1, "Secret name is required").max(255, "Secret name must be 255 characters or less").regex(
12272
- /^[a-zA-Z][a-zA-Z0-9_]*$/,
12273
- "Secret name must start with a letter and contain only letters, numbers, and underscores"
12274
- );
12275
- var secretValueSchema = external_exports.string().min(1, "Secret value is required").refine(
12276
- (value) => Buffer.byteLength(value, "utf8") <= 48 * 1024,
12277
- "Secret value must be 48 KB or less"
12278
- );
12279
- var secretInfoSchema = external_exports.object({
12280
- name: external_exports.string(),
12281
- createdAt: external_exports.string(),
12282
- updatedAt: external_exports.string()
12283
- });
12284
- var secretsContract = c.router({
12285
- /**
12286
- * GET /api/secrets
12287
- * List all secrets for the authenticated user (names only, not values)
12288
- */
12289
- list: {
12290
- method: "GET",
12291
- path: "/api/secrets",
12292
- responses: {
12293
- 200: external_exports.object({
12294
- secrets: external_exports.array(secretInfoSchema)
12295
- }),
12296
- 401: apiErrorSchema
12297
- },
12298
- summary: "List all secrets"
12299
- },
12300
- /**
12301
- * POST /api/secrets
12302
- * Create or update a secret
12303
- */
12304
- create: {
12305
- method: "POST",
12306
- path: "/api/secrets",
12307
- body: external_exports.object({
12308
- name: secretNameSchema,
12309
- value: secretValueSchema
12310
- }),
12311
- responses: {
12312
- 200: external_exports.object({
12313
- name: external_exports.string(),
12314
- action: external_exports.literal("updated")
12315
- }),
12316
- 201: external_exports.object({
12317
- name: external_exports.string(),
12318
- action: external_exports.literal("created")
12319
- }),
12320
- 400: apiErrorSchema,
12321
- 401: apiErrorSchema
12322
- },
12323
- summary: "Create or update a secret"
12324
- },
12325
- /**
12326
- * DELETE /api/secrets?name={name}
12327
- * Delete a secret by name
12328
- */
12329
- delete: {
12330
- method: "DELETE",
12331
- path: "/api/secrets",
12332
- query: external_exports.object({
12333
- name: external_exports.string().min(1, "Missing name query parameter")
12334
- }),
12335
- responses: {
12336
- 200: external_exports.object({
12337
- name: external_exports.string(),
12338
- deleted: external_exports.literal(true)
12339
- }),
12340
- 400: apiErrorSchema,
12341
- 401: apiErrorSchema,
12342
- 404: apiErrorSchema
12343
- },
12344
- summary: "Delete a secret"
12345
- }
12346
- });
12347
-
12348
12269
  // ../../packages/core/src/contracts/composes.ts
12349
- var c2 = initContract();
12270
+ var c = initContract();
12350
12271
  var agentNameSchema = external_exports.string().min(3, "Agent name must be at least 3 characters").max(64, "Agent name must be 64 characters or less").regex(
12351
12272
  /^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}[a-zA-Z0-9]$/,
12352
12273
  "Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens"
@@ -12402,7 +12323,7 @@ var createComposeResponseSchema = external_exports.object({
12402
12323
  action: external_exports.enum(["created", "existing"]),
12403
12324
  updatedAt: external_exports.string()
12404
12325
  });
12405
- var composesMainContract = c2.router({
12326
+ var composesMainContract = c.router({
12406
12327
  /**
12407
12328
  * GET /api/agent/composes?name={name}&scope={scope}
12408
12329
  * Get agent compose by name with HEAD version content
@@ -12444,7 +12365,7 @@ var composesMainContract = c2.router({
12444
12365
  summary: "Create or update agent compose version"
12445
12366
  }
12446
12367
  });
12447
- var composesByIdContract = c2.router({
12368
+ var composesByIdContract = c.router({
12448
12369
  /**
12449
12370
  * GET /api/agent/composes/:id
12450
12371
  * Get agent compose by ID with HEAD version content
@@ -12463,7 +12384,7 @@ var composesByIdContract = c2.router({
12463
12384
  summary: "Get agent compose by ID"
12464
12385
  }
12465
12386
  });
12466
- var composesVersionsContract = c2.router({
12387
+ var composesVersionsContract = c.router({
12467
12388
  /**
12468
12389
  * GET /api/agent/composes/versions?composeId={id}&version={hash|tag}
12469
12390
  * Resolve a version specifier to a full version ID
@@ -12489,7 +12410,7 @@ var composesVersionsContract = c2.router({
12489
12410
  });
12490
12411
 
12491
12412
  // ../../packages/core/src/contracts/runs.ts
12492
- var c3 = initContract();
12413
+ var c2 = initContract();
12493
12414
  var runStatusSchema = external_exports.enum([
12494
12415
  "pending",
12495
12416
  "running",
@@ -12564,7 +12485,7 @@ var eventsResponseSchema = external_exports.object({
12564
12485
  run: runStateSchema,
12565
12486
  provider: external_exports.string()
12566
12487
  });
12567
- var runsMainContract = c3.router({
12488
+ var runsMainContract = c2.router({
12568
12489
  /**
12569
12490
  * POST /api/agent/runs
12570
12491
  * Create and execute a new agent run
@@ -12582,7 +12503,7 @@ var runsMainContract = c3.router({
12582
12503
  summary: "Create and execute agent run"
12583
12504
  }
12584
12505
  });
12585
- var runsByIdContract = c3.router({
12506
+ var runsByIdContract = c2.router({
12586
12507
  /**
12587
12508
  * GET /api/agent/runs/:id
12588
12509
  * Get agent run status and results
@@ -12602,7 +12523,7 @@ var runsByIdContract = c3.router({
12602
12523
  summary: "Get agent run by ID"
12603
12524
  }
12604
12525
  });
12605
- var runEventsContract = c3.router({
12526
+ var runEventsContract = c2.router({
12606
12527
  /**
12607
12528
  * GET /api/agent/runs/:id/events
12608
12529
  * Poll for agent run events with pagination
@@ -12663,7 +12584,7 @@ var telemetryResponseSchema = external_exports.object({
12663
12584
  systemLog: external_exports.string(),
12664
12585
  metrics: external_exports.array(telemetryMetricSchema)
12665
12586
  });
12666
- var runTelemetryContract = c3.router({
12587
+ var runTelemetryContract = c2.router({
12667
12588
  /**
12668
12589
  * GET /api/agent/runs/:id/telemetry
12669
12590
  * Get aggregated telemetry data for a run (legacy combined format)
@@ -12682,7 +12603,7 @@ var runTelemetryContract = c3.router({
12682
12603
  summary: "Get run telemetry data"
12683
12604
  }
12684
12605
  });
12685
- var runSystemLogContract = c3.router({
12606
+ var runSystemLogContract = c2.router({
12686
12607
  /**
12687
12608
  * GET /api/agent/runs/:id/telemetry/system-log
12688
12609
  * Get system log with pagination
@@ -12695,7 +12616,8 @@ var runSystemLogContract = c3.router({
12695
12616
  }),
12696
12617
  query: external_exports.object({
12697
12618
  since: external_exports.coerce.number().optional(),
12698
- limit: external_exports.coerce.number().min(1).max(100).default(5)
12619
+ limit: external_exports.coerce.number().min(1).max(100).default(5),
12620
+ order: external_exports.enum(["asc", "desc"]).default("desc")
12699
12621
  }),
12700
12622
  responses: {
12701
12623
  200: systemLogResponseSchema,
@@ -12705,7 +12627,7 @@ var runSystemLogContract = c3.router({
12705
12627
  summary: "Get system log with pagination"
12706
12628
  }
12707
12629
  });
12708
- var runMetricsContract = c3.router({
12630
+ var runMetricsContract = c2.router({
12709
12631
  /**
12710
12632
  * GET /api/agent/runs/:id/telemetry/metrics
12711
12633
  * Get metrics with pagination
@@ -12718,7 +12640,8 @@ var runMetricsContract = c3.router({
12718
12640
  }),
12719
12641
  query: external_exports.object({
12720
12642
  since: external_exports.coerce.number().optional(),
12721
- limit: external_exports.coerce.number().min(1).max(100).default(5)
12643
+ limit: external_exports.coerce.number().min(1).max(100).default(5),
12644
+ order: external_exports.enum(["asc", "desc"]).default("desc")
12722
12645
  }),
12723
12646
  responses: {
12724
12647
  200: metricsResponseSchema,
@@ -12728,7 +12651,7 @@ var runMetricsContract = c3.router({
12728
12651
  summary: "Get metrics with pagination"
12729
12652
  }
12730
12653
  });
12731
- var runAgentEventsContract = c3.router({
12654
+ var runAgentEventsContract = c2.router({
12732
12655
  /**
12733
12656
  * GET /api/agent/runs/:id/telemetry/agent
12734
12657
  * Get agent events with pagination (for vm0 logs default)
@@ -12741,7 +12664,8 @@ var runAgentEventsContract = c3.router({
12741
12664
  }),
12742
12665
  query: external_exports.object({
12743
12666
  since: external_exports.coerce.number().optional(),
12744
- limit: external_exports.coerce.number().min(1).max(100).default(5)
12667
+ limit: external_exports.coerce.number().min(1).max(100).default(5),
12668
+ order: external_exports.enum(["asc", "desc"]).default("desc")
12745
12669
  }),
12746
12670
  responses: {
12747
12671
  200: agentEventsResponseSchema,
@@ -12751,7 +12675,7 @@ var runAgentEventsContract = c3.router({
12751
12675
  summary: "Get agent events with pagination"
12752
12676
  }
12753
12677
  });
12754
- var runNetworkLogsContract = c3.router({
12678
+ var runNetworkLogsContract = c2.router({
12755
12679
  /**
12756
12680
  * GET /api/agent/runs/:id/telemetry/network
12757
12681
  * Get network logs with pagination (for vm0 logs --network)
@@ -12764,7 +12688,8 @@ var runNetworkLogsContract = c3.router({
12764
12688
  }),
12765
12689
  query: external_exports.object({
12766
12690
  since: external_exports.coerce.number().optional(),
12767
- limit: external_exports.coerce.number().min(1).max(100).default(5)
12691
+ limit: external_exports.coerce.number().min(1).max(100).default(5),
12692
+ order: external_exports.enum(["asc", "desc"]).default("desc")
12768
12693
  }),
12769
12694
  responses: {
12770
12695
  200: networkLogsResponseSchema,
@@ -12776,7 +12701,7 @@ var runNetworkLogsContract = c3.router({
12776
12701
  });
12777
12702
 
12778
12703
  // ../../packages/core/src/contracts/storages.ts
12779
- var c4 = initContract();
12704
+ var c3 = initContract();
12780
12705
  var storageTypeSchema = external_exports.enum(["volume", "artifact"]);
12781
12706
  var uploadStorageResponseSchema = external_exports.object({
12782
12707
  name: external_exports.string(),
@@ -12786,7 +12711,7 @@ var uploadStorageResponseSchema = external_exports.object({
12786
12711
  type: storageTypeSchema,
12787
12712
  deduplicated: external_exports.boolean()
12788
12713
  });
12789
- var storagesContract = c4.router({
12714
+ var storagesContract = c3.router({
12790
12715
  /**
12791
12716
  * POST /api/storages
12792
12717
  * Upload a storage (tar.gz file)
@@ -12802,7 +12727,7 @@ var storagesContract = c4.router({
12802
12727
  method: "POST",
12803
12728
  path: "/api/storages",
12804
12729
  contentType: "multipart/form-data",
12805
- body: c4.type(),
12730
+ body: c3.type(),
12806
12731
  responses: {
12807
12732
  200: uploadStorageResponseSchema,
12808
12733
  400: apiErrorSchema,
@@ -12830,9 +12755,9 @@ var storagesContract = c4.router({
12830
12755
  }),
12831
12756
  responses: {
12832
12757
  // Binary response - actual handling done at route level
12833
- 200: c4.otherResponse({
12758
+ 200: c3.otherResponse({
12834
12759
  contentType: "application/gzip",
12835
- body: c4.type()
12760
+ body: c3.type()
12836
12761
  }),
12837
12762
  400: apiErrorSchema,
12838
12763
  401: apiErrorSchema,
@@ -12842,9 +12767,120 @@ var storagesContract = c4.router({
12842
12767
  summary: "Download storage archive"
12843
12768
  }
12844
12769
  });
12770
+ var fileEntryWithHashSchema = external_exports.object({
12771
+ path: external_exports.string().min(1, "File path is required"),
12772
+ hash: external_exports.string().length(64, "Hash must be SHA-256 (64 hex chars)"),
12773
+ size: external_exports.number().int().min(0, "Size must be non-negative")
12774
+ });
12775
+ var storageChangesSchema = external_exports.object({
12776
+ added: external_exports.array(external_exports.string()),
12777
+ modified: external_exports.array(external_exports.string()),
12778
+ deleted: external_exports.array(external_exports.string())
12779
+ });
12780
+ var presignedUploadSchema = external_exports.object({
12781
+ key: external_exports.string(),
12782
+ presignedUrl: external_exports.string().url()
12783
+ });
12784
+ var storagesPrepareContract = c3.router({
12785
+ prepare: {
12786
+ method: "POST",
12787
+ path: "/api/storages/prepare",
12788
+ body: external_exports.object({
12789
+ storageName: external_exports.string().min(1, "Storage name is required"),
12790
+ storageType: storageTypeSchema,
12791
+ files: external_exports.array(fileEntryWithHashSchema),
12792
+ force: external_exports.boolean().optional(),
12793
+ runId: external_exports.string().optional(),
12794
+ // For sandbox auth
12795
+ baseVersion: external_exports.string().optional(),
12796
+ // For incremental uploads
12797
+ changes: storageChangesSchema.optional()
12798
+ }),
12799
+ responses: {
12800
+ 200: external_exports.object({
12801
+ versionId: external_exports.string(),
12802
+ existing: external_exports.boolean(),
12803
+ uploads: external_exports.object({
12804
+ archive: presignedUploadSchema,
12805
+ manifest: presignedUploadSchema
12806
+ }).optional()
12807
+ }),
12808
+ 400: apiErrorSchema,
12809
+ 401: apiErrorSchema,
12810
+ 404: apiErrorSchema,
12811
+ 500: apiErrorSchema
12812
+ },
12813
+ summary: "Prepare for direct S3 upload"
12814
+ }
12815
+ });
12816
+ var storagesCommitContract = c3.router({
12817
+ commit: {
12818
+ method: "POST",
12819
+ path: "/api/storages/commit",
12820
+ body: external_exports.object({
12821
+ storageName: external_exports.string().min(1, "Storage name is required"),
12822
+ storageType: storageTypeSchema,
12823
+ versionId: external_exports.string().min(1, "Version ID is required"),
12824
+ files: external_exports.array(fileEntryWithHashSchema),
12825
+ runId: external_exports.string().optional(),
12826
+ message: external_exports.string().optional()
12827
+ }),
12828
+ responses: {
12829
+ 200: external_exports.object({
12830
+ success: external_exports.literal(true),
12831
+ versionId: external_exports.string(),
12832
+ storageName: external_exports.string(),
12833
+ size: external_exports.number(),
12834
+ fileCount: external_exports.number(),
12835
+ deduplicated: external_exports.boolean().optional()
12836
+ }),
12837
+ 400: apiErrorSchema,
12838
+ 401: apiErrorSchema,
12839
+ 404: apiErrorSchema,
12840
+ 409: apiErrorSchema,
12841
+ // S3 files missing
12842
+ 500: apiErrorSchema
12843
+ },
12844
+ summary: "Commit uploaded storage"
12845
+ }
12846
+ });
12847
+ var storagesDownloadContract = c3.router({
12848
+ download: {
12849
+ method: "GET",
12850
+ path: "/api/storages/download",
12851
+ query: external_exports.object({
12852
+ name: external_exports.string().min(1, "Storage name is required"),
12853
+ type: storageTypeSchema,
12854
+ version: external_exports.string().optional()
12855
+ }),
12856
+ responses: {
12857
+ // Normal response with presigned URL
12858
+ 200: external_exports.union([
12859
+ external_exports.object({
12860
+ url: external_exports.string().url(),
12861
+ versionId: external_exports.string(),
12862
+ fileCount: external_exports.number(),
12863
+ size: external_exports.number()
12864
+ }),
12865
+ // Empty artifact response
12866
+ external_exports.object({
12867
+ empty: external_exports.literal(true),
12868
+ versionId: external_exports.string(),
12869
+ fileCount: external_exports.literal(0),
12870
+ size: external_exports.literal(0)
12871
+ })
12872
+ ]),
12873
+ 400: apiErrorSchema,
12874
+ 401: apiErrorSchema,
12875
+ 404: apiErrorSchema,
12876
+ 500: apiErrorSchema
12877
+ },
12878
+ summary: "Get presigned download URL"
12879
+ }
12880
+ });
12845
12881
 
12846
12882
  // ../../packages/core/src/contracts/webhooks.ts
12847
- var c5 = initContract();
12883
+ var c4 = initContract();
12848
12884
  var agentEventSchema = external_exports.object({
12849
12885
  type: external_exports.string(),
12850
12886
  sequenceNumber: external_exports.number().int().positive()
@@ -12856,7 +12892,7 @@ var artifactSnapshotSchema = external_exports.object({
12856
12892
  var volumeVersionsSnapshotSchema = external_exports.object({
12857
12893
  versions: external_exports.record(external_exports.string(), external_exports.string())
12858
12894
  });
12859
- var webhookEventsContract = c5.router({
12895
+ var webhookEventsContract = c4.router({
12860
12896
  /**
12861
12897
  * POST /api/webhooks/agent/events
12862
12898
  * Receive agent events from E2B sandbox
@@ -12882,7 +12918,7 @@ var webhookEventsContract = c5.router({
12882
12918
  summary: "Receive agent events from sandbox"
12883
12919
  }
12884
12920
  });
12885
- var webhookCompleteContract = c5.router({
12921
+ var webhookCompleteContract = c4.router({
12886
12922
  /**
12887
12923
  * POST /api/webhooks/agent/complete
12888
12924
  * Handle agent run completion (success or failure)
@@ -12908,7 +12944,7 @@ var webhookCompleteContract = c5.router({
12908
12944
  summary: "Handle agent run completion"
12909
12945
  }
12910
12946
  });
12911
- var webhookCheckpointsContract = c5.router({
12947
+ var webhookCheckpointsContract = c4.router({
12912
12948
  /**
12913
12949
  * POST /api/webhooks/agent/checkpoints
12914
12950
  * Create checkpoint for completed agent run
@@ -12940,7 +12976,7 @@ var webhookCheckpointsContract = c5.router({
12940
12976
  summary: "Create checkpoint for agent run"
12941
12977
  }
12942
12978
  });
12943
- var webhookHeartbeatContract = c5.router({
12979
+ var webhookHeartbeatContract = c4.router({
12944
12980
  /**
12945
12981
  * POST /api/webhooks/agent/heartbeat
12946
12982
  * Receive heartbeat signals from E2B sandbox
@@ -12963,7 +12999,7 @@ var webhookHeartbeatContract = c5.router({
12963
12999
  summary: "Receive heartbeat from sandbox"
12964
13000
  }
12965
13001
  });
12966
- var webhookStoragesContract = c5.router({
13002
+ var webhookStoragesContract = c4.router({
12967
13003
  /**
12968
13004
  * POST /api/webhooks/agent/storages
12969
13005
  * Create a new version of a storage from sandbox
@@ -12978,7 +13014,7 @@ var webhookStoragesContract = c5.router({
12978
13014
  method: "POST",
12979
13015
  path: "/api/webhooks/agent/storages",
12980
13016
  contentType: "multipart/form-data",
12981
- body: c5.type(),
13017
+ body: c4.type(),
12982
13018
  responses: {
12983
13019
  200: external_exports.object({
12984
13020
  versionId: external_exports.string(),
@@ -12994,7 +13030,7 @@ var webhookStoragesContract = c5.router({
12994
13030
  summary: "Upload storage version from sandbox"
12995
13031
  }
12996
13032
  });
12997
- var webhookStoragesIncrementalContract = c5.router({
13033
+ var webhookStoragesIncrementalContract = c4.router({
12998
13034
  /**
12999
13035
  * POST /api/webhooks/agent/storages/incremental
13000
13036
  * Create a new version using incremental upload
@@ -13011,7 +13047,7 @@ var webhookStoragesIncrementalContract = c5.router({
13011
13047
  method: "POST",
13012
13048
  path: "/api/webhooks/agent/storages/incremental",
13013
13049
  contentType: "multipart/form-data",
13014
- body: c5.type(),
13050
+ body: c4.type(),
13015
13051
  responses: {
13016
13052
  200: external_exports.object({
13017
13053
  versionId: external_exports.string(),
@@ -13051,7 +13087,7 @@ var networkLogSchema = external_exports.object({
13051
13087
  request_size: external_exports.number(),
13052
13088
  response_size: external_exports.number()
13053
13089
  });
13054
- var webhookTelemetryContract = c5.router({
13090
+ var webhookTelemetryContract = c4.router({
13055
13091
  /**
13056
13092
  * POST /api/webhooks/agent/telemetry
13057
13093
  * Receive telemetry data (system log, metrics, and network logs) from sandbox
@@ -13078,14 +13114,77 @@ var webhookTelemetryContract = c5.router({
13078
13114
  summary: "Receive telemetry data from sandbox"
13079
13115
  }
13080
13116
  });
13117
+ var webhookStoragesPrepareContract = c4.router({
13118
+ prepare: {
13119
+ method: "POST",
13120
+ path: "/api/webhooks/agent/storages/prepare",
13121
+ body: external_exports.object({
13122
+ runId: external_exports.string().min(1, "runId is required"),
13123
+ // Required for webhook auth
13124
+ storageName: external_exports.string().min(1, "Storage name is required"),
13125
+ storageType: storageTypeSchema,
13126
+ files: external_exports.array(fileEntryWithHashSchema),
13127
+ force: external_exports.boolean().optional(),
13128
+ baseVersion: external_exports.string().optional(),
13129
+ changes: storageChangesSchema.optional()
13130
+ }),
13131
+ responses: {
13132
+ 200: external_exports.object({
13133
+ versionId: external_exports.string(),
13134
+ existing: external_exports.boolean(),
13135
+ uploads: external_exports.object({
13136
+ archive: presignedUploadSchema,
13137
+ manifest: presignedUploadSchema
13138
+ }).optional()
13139
+ }),
13140
+ 400: apiErrorSchema,
13141
+ 401: apiErrorSchema,
13142
+ 404: apiErrorSchema,
13143
+ 500: apiErrorSchema
13144
+ },
13145
+ summary: "Prepare for direct S3 upload from sandbox"
13146
+ }
13147
+ });
13148
+ var webhookStoragesCommitContract = c4.router({
13149
+ commit: {
13150
+ method: "POST",
13151
+ path: "/api/webhooks/agent/storages/commit",
13152
+ body: external_exports.object({
13153
+ runId: external_exports.string().min(1, "runId is required"),
13154
+ // Required for webhook auth
13155
+ storageName: external_exports.string().min(1, "Storage name is required"),
13156
+ storageType: storageTypeSchema,
13157
+ versionId: external_exports.string().min(1, "Version ID is required"),
13158
+ files: external_exports.array(fileEntryWithHashSchema),
13159
+ message: external_exports.string().optional()
13160
+ }),
13161
+ responses: {
13162
+ 200: external_exports.object({
13163
+ success: external_exports.literal(true),
13164
+ versionId: external_exports.string(),
13165
+ storageName: external_exports.string(),
13166
+ size: external_exports.number(),
13167
+ fileCount: external_exports.number(),
13168
+ deduplicated: external_exports.boolean().optional()
13169
+ }),
13170
+ 400: apiErrorSchema,
13171
+ 401: apiErrorSchema,
13172
+ 404: apiErrorSchema,
13173
+ 409: apiErrorSchema,
13174
+ // S3 files missing
13175
+ 500: apiErrorSchema
13176
+ },
13177
+ summary: "Commit uploaded storage from sandbox"
13178
+ }
13179
+ });
13081
13180
 
13082
13181
  // ../../packages/core/src/contracts/cli-auth.ts
13083
- var c6 = initContract();
13182
+ var c5 = initContract();
13084
13183
  var oauthErrorSchema = external_exports.object({
13085
13184
  error: external_exports.string(),
13086
13185
  error_description: external_exports.string()
13087
13186
  });
13088
- var cliAuthDeviceContract = c6.router({
13187
+ var cliAuthDeviceContract = c5.router({
13089
13188
  /**
13090
13189
  * POST /api/cli/auth/device
13091
13190
  * Initiate device authorization flow
@@ -13107,7 +13206,7 @@ var cliAuthDeviceContract = c6.router({
13107
13206
  summary: "Initiate device authorization flow"
13108
13207
  }
13109
13208
  });
13110
- var cliAuthTokenContract = c6.router({
13209
+ var cliAuthTokenContract = c5.router({
13111
13210
  /**
13112
13211
  * POST /api/cli/auth/token
13113
13212
  * Exchange device code for access token
@@ -13137,8 +13236,8 @@ var cliAuthTokenContract = c6.router({
13137
13236
  });
13138
13237
 
13139
13238
  // ../../packages/core/src/contracts/auth.ts
13140
- var c7 = initContract();
13141
- var authContract = c7.router({
13239
+ var c6 = initContract();
13240
+ var authContract = c6.router({
13142
13241
  /**
13143
13242
  * GET /api/auth/me
13144
13243
  * Get current user information
@@ -13160,7 +13259,7 @@ var authContract = c7.router({
13160
13259
  });
13161
13260
 
13162
13261
  // ../../packages/core/src/contracts/images.ts
13163
- var c8 = initContract();
13262
+ var c7 = initContract();
13164
13263
  var buildStatusSchema = external_exports.enum(["building", "ready", "error"]);
13165
13264
  var imageInfoSchema = external_exports.object({
13166
13265
  id: external_exports.string(),
@@ -13196,7 +13295,7 @@ var buildStatusResponseSchema = external_exports.object({
13196
13295
  logsOffset: external_exports.number(),
13197
13296
  error: external_exports.string().optional()
13198
13297
  });
13199
- var imagesMainContract = c8.router({
13298
+ var imagesMainContract = c7.router({
13200
13299
  /**
13201
13300
  * GET /api/images
13202
13301
  * List all images for authenticated user
@@ -13230,7 +13329,7 @@ var imagesMainContract = c8.router({
13230
13329
  summary: "Create image build"
13231
13330
  }
13232
13331
  });
13233
- var imagesByIdContract = c8.router({
13332
+ var imagesByIdContract = c7.router({
13234
13333
  /**
13235
13334
  * DELETE /api/images/:imageId
13236
13335
  * Delete an image by ID
@@ -13254,7 +13353,7 @@ var imagesByIdContract = c8.router({
13254
13353
  summary: "Delete image"
13255
13354
  }
13256
13355
  });
13257
- var imageBuildsContract = c8.router({
13356
+ var imageBuildsContract = c7.router({
13258
13357
  /**
13259
13358
  * GET /api/images/:imageId/builds/:buildId
13260
13359
  * Query build status with incremental logs
@@ -13281,7 +13380,7 @@ var imageBuildsContract = c8.router({
13281
13380
  });
13282
13381
 
13283
13382
  // ../../packages/core/src/contracts/cron.ts
13284
- var c9 = initContract();
13383
+ var c8 = initContract();
13285
13384
  var cleanupResultSchema = external_exports.object({
13286
13385
  runId: external_exports.string(),
13287
13386
  sandboxId: external_exports.string().nullable(),
@@ -13293,7 +13392,7 @@ var cleanupResponseSchema = external_exports.object({
13293
13392
  errors: external_exports.number(),
13294
13393
  results: external_exports.array(cleanupResultSchema)
13295
13394
  });
13296
- var cronCleanupSandboxesContract = c9.router({
13395
+ var cronCleanupSandboxesContract = c8.router({
13297
13396
  /**
13298
13397
  * GET /api/cron/cleanup-sandboxes
13299
13398
  * Cron job to cleanup sandboxes that have stopped sending heartbeats
@@ -13325,7 +13424,7 @@ var proxyErrorSchema = external_exports.object({
13325
13424
  });
13326
13425
 
13327
13426
  // ../../packages/core/src/contracts/scopes.ts
13328
- var c10 = initContract();
13427
+ var c9 = initContract();
13329
13428
  var scopeTypeSchema = external_exports.enum(["personal", "organization", "system"]);
13330
13429
  var scopeSlugSchema = external_exports.string().min(3, "Scope slug must be at least 3 characters").max(64, "Scope slug must be at most 64 characters").regex(
13331
13430
  /^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]{1,2}$/,
@@ -13350,7 +13449,7 @@ var updateScopeRequestSchema = external_exports.object({
13350
13449
  slug: scopeSlugSchema,
13351
13450
  force: external_exports.boolean().optional().default(false)
13352
13451
  });
13353
- var scopeContract = c10.router({
13452
+ var scopeContract = c9.router({
13354
13453
  /**
13355
13454
  * GET /api/scope
13356
13455
  * Get current user's scope
@@ -13654,6 +13753,9 @@ var ApiClient = class {
13654
13753
  if (options?.limit !== void 0) {
13655
13754
  params.set("limit", String(options.limit));
13656
13755
  }
13756
+ if (options?.order !== void 0) {
13757
+ params.set("order", options.order);
13758
+ }
13657
13759
  const queryString = params.toString();
13658
13760
  const url2 = `${baseUrl}/api/agent/runs/${runId}/telemetry/system-log${queryString ? `?${queryString}` : ""}`;
13659
13761
  const response = await fetch(url2, {
@@ -13676,6 +13778,9 @@ var ApiClient = class {
13676
13778
  if (options?.limit !== void 0) {
13677
13779
  params.set("limit", String(options.limit));
13678
13780
  }
13781
+ if (options?.order !== void 0) {
13782
+ params.set("order", options.order);
13783
+ }
13679
13784
  const queryString = params.toString();
13680
13785
  const url2 = `${baseUrl}/api/agent/runs/${runId}/telemetry/metrics${queryString ? `?${queryString}` : ""}`;
13681
13786
  const response = await fetch(url2, {
@@ -13698,6 +13803,9 @@ var ApiClient = class {
13698
13803
  if (options?.limit !== void 0) {
13699
13804
  params.set("limit", String(options.limit));
13700
13805
  }
13806
+ if (options?.order !== void 0) {
13807
+ params.set("order", options.order);
13808
+ }
13701
13809
  const queryString = params.toString();
13702
13810
  const url2 = `${baseUrl}/api/agent/runs/${runId}/telemetry/agent${queryString ? `?${queryString}` : ""}`;
13703
13811
  const response = await fetch(url2, {
@@ -13720,6 +13828,9 @@ var ApiClient = class {
13720
13828
  if (options?.limit !== void 0) {
13721
13829
  params.set("limit", String(options.limit));
13722
13830
  }
13831
+ if (options?.order !== void 0) {
13832
+ params.set("order", options.order);
13833
+ }
13723
13834
  const queryString = params.toString();
13724
13835
  const url2 = `${baseUrl}/api/agent/runs/${runId}/telemetry/network${queryString ? `?${queryString}` : ""}`;
13725
13836
  const response = await fetch(url2, {
@@ -14969,9 +15080,9 @@ var CodexEventParser = class {
14969
15080
  }
14970
15081
  }
14971
15082
  if (itemType === "file_change" && item.changes && item.changes.length > 0) {
14972
- const changes = item.changes.map((c11) => {
14973
- const action = c11.kind === "add" ? "Created" : c11.kind === "modify" ? "Modified" : "Deleted";
14974
- return `${action}: ${c11.path}`;
15083
+ const changes = item.changes.map((c10) => {
15084
+ const action = c10.kind === "add" ? "Created" : c10.kind === "modify" ? "Modified" : "Deleted";
15085
+ return `${action}: ${c10.path}`;
14975
15086
  }).join("\n");
14976
15087
  return {
14977
15088
  type: "text",
@@ -15312,9 +15423,9 @@ var CodexEventRenderer = class {
15312
15423
  return;
15313
15424
  }
15314
15425
  if (itemType === "file_change" && item.changes && item.changes.length > 0) {
15315
- const summary = item.changes.map((c11) => {
15316
- const icon = c11.kind === "add" ? "+" : c11.kind === "delete" ? "-" : "~";
15317
- return `${icon}${c11.path}`;
15426
+ const summary = item.changes.map((c10) => {
15427
+ const icon = c10.kind === "add" ? "+" : c10.kind === "delete" ? "-" : "~";
15428
+ return `${icon}${c10.path}`;
15318
15429
  }).join(", ");
15319
15430
  console.log(chalk4.green("[files]") + ` ${summary}`);
15320
15431
  return;
@@ -16814,7 +16925,7 @@ async function autoPullArtifact(runOutput, artifactDir) {
16814
16925
  }
16815
16926
  var cookCmd = new Command13().name("cook").description("One-click agent preparation and execution from vm0.yaml");
16816
16927
  cookCmd.argument("[prompt]", "Prompt for the agent").action(async (prompt) => {
16817
- const shouldExit = await checkAndUpgrade("4.29.0", prompt);
16928
+ const shouldExit = await checkAndUpgrade("4.30.0", prompt);
16818
16929
  if (shouldExit) {
16819
16930
  process.exit(0);
16820
16931
  }
@@ -16987,7 +17098,7 @@ cookCmd.argument("[prompt]", "Prompt for the agent").action(async (prompt) => {
16987
17098
  cookCmd.command("logs").description("View logs from the last cook run").option("-a, --agent", "Show agent events (default)").option("-s, --system", "Show system log").option("-m, --metrics", "Show metrics").option("-n, --network", "Show network logs (proxy traffic)").option(
16988
17099
  "--since <time>",
16989
17100
  "Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)"
16990
- ).option("--limit <n>", "Maximum number of entries to show (default: 5)").action(
17101
+ ).option("--tail <n>", "Show last N entries (default: 5, max: 100)").option("--head <n>", "Show first N entries (max: 100)").action(
16991
17102
  async (options) => {
16992
17103
  const state = await loadCookState();
16993
17104
  if (!state.lastRunId) {
@@ -17017,9 +17128,13 @@ cookCmd.command("logs").description("View logs from the last cook run").option("
17017
17128
  args.push("--since", options.since);
17018
17129
  displayArgs.push(`--since ${options.since}`);
17019
17130
  }
17020
- if (options.limit) {
17021
- args.push("--limit", options.limit);
17022
- displayArgs.push(`--limit ${options.limit}`);
17131
+ if (options.tail) {
17132
+ args.push("--tail", options.tail);
17133
+ displayArgs.push(`--tail ${options.tail}`);
17134
+ }
17135
+ if (options.head) {
17136
+ args.push("--head", options.head);
17137
+ displayArgs.push(`--head ${options.head}`);
17023
17138
  }
17024
17139
  printCommand(displayArgs.join(" "));
17025
17140
  await execVm0Command(args);
@@ -17609,34 +17724,38 @@ function getLogType(options) {
17609
17724
  var logsCommand = new Command19().name("logs").description("View logs for an agent run").argument("<runId>", "Run ID to fetch logs for").option("-a, --agent", "Show agent events (default)").option("-s, --system", "Show system log").option("-m, --metrics", "Show metrics").option("-n, --network", "Show network logs (proxy traffic)").option(
17610
17725
  "--since <time>",
17611
17726
  "Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z, 1705312200)"
17612
- ).option(
17613
- "--limit <n>",
17614
- "Maximum number of entries to show (default: 5, max: 100)",
17615
- "5"
17616
- ).action(
17727
+ ).option("--tail <n>", "Show last N entries (default: 5, max: 100)").option("--head <n>", "Show first N entries (max: 100)").action(
17617
17728
  async (runId, options) => {
17618
17729
  try {
17619
17730
  const logType = getLogType(options);
17731
+ if (options.tail !== void 0 && options.head !== void 0) {
17732
+ console.error(
17733
+ chalk21.red("Options --tail and --head are mutually exclusive")
17734
+ );
17735
+ process.exit(1);
17736
+ }
17620
17737
  let since;
17621
17738
  if (options.since) {
17622
17739
  since = parseTime(options.since);
17623
17740
  }
17741
+ const isHead = options.head !== void 0;
17624
17742
  const limit = Math.min(
17625
- Math.max(1, parseInt(options.limit || "5", 10)),
17743
+ Math.max(1, parseInt(options.head || options.tail || "5", 10)),
17626
17744
  100
17627
17745
  );
17746
+ const order = isHead ? "asc" : "desc";
17628
17747
  switch (logType) {
17629
17748
  case "agent":
17630
- await showAgentEvents(runId, { since, limit });
17749
+ await showAgentEvents(runId, { since, limit, order });
17631
17750
  break;
17632
17751
  case "system":
17633
- await showSystemLog(runId, { since, limit });
17752
+ await showSystemLog(runId, { since, limit, order });
17634
17753
  break;
17635
17754
  case "metrics":
17636
- await showMetrics(runId, { since, limit });
17755
+ await showMetrics(runId, { since, limit, order });
17637
17756
  break;
17638
17757
  case "network":
17639
- await showNetworkLogs(runId, { since, limit });
17758
+ await showNetworkLogs(runId, { since, limit, order });
17640
17759
  break;
17641
17760
  }
17642
17761
  } catch (error43) {
@@ -17651,14 +17770,15 @@ async function showAgentEvents(runId, options) {
17651
17770
  console.log(chalk21.yellow("No agent events found for this run."));
17652
17771
  return;
17653
17772
  }
17654
- for (const event of response.events) {
17773
+ const events = options.order === "desc" ? [...response.events].reverse() : response.events;
17774
+ for (const event of events) {
17655
17775
  renderAgentEvent(event, response.provider);
17656
17776
  }
17657
17777
  if (response.hasMore) {
17658
17778
  console.log();
17659
17779
  console.log(
17660
17780
  chalk21.dim(
17661
- `Showing ${response.events.length} events. Use --limit to see more.`
17781
+ `Showing ${response.events.length} events. Use --tail to see more.`
17662
17782
  )
17663
17783
  );
17664
17784
  }
@@ -17673,7 +17793,7 @@ async function showSystemLog(runId, options) {
17673
17793
  if (response.hasMore) {
17674
17794
  console.log();
17675
17795
  console.log(
17676
- chalk21.dim("More log entries available. Use --limit to see more.")
17796
+ chalk21.dim("More log entries available. Use --tail to see more.")
17677
17797
  );
17678
17798
  }
17679
17799
  }
@@ -17683,14 +17803,15 @@ async function showMetrics(runId, options) {
17683
17803
  console.log(chalk21.yellow("No metrics found for this run."));
17684
17804
  return;
17685
17805
  }
17686
- for (const metric of response.metrics) {
17806
+ const metrics = options.order === "desc" ? [...response.metrics].reverse() : response.metrics;
17807
+ for (const metric of metrics) {
17687
17808
  console.log(formatMetric(metric));
17688
17809
  }
17689
17810
  if (response.hasMore) {
17690
17811
  console.log();
17691
17812
  console.log(
17692
17813
  chalk21.dim(
17693
- `Showing ${response.metrics.length} metrics. Use --limit to see more.`
17814
+ `Showing ${response.metrics.length} metrics. Use --tail to see more.`
17694
17815
  )
17695
17816
  );
17696
17817
  }
@@ -17705,14 +17826,15 @@ async function showNetworkLogs(runId, options) {
17705
17826
  );
17706
17827
  return;
17707
17828
  }
17708
- for (const entry of response.networkLogs) {
17829
+ const networkLogs = options.order === "desc" ? [...response.networkLogs].reverse() : response.networkLogs;
17830
+ for (const entry of networkLogs) {
17709
17831
  console.log(formatNetworkLog(entry));
17710
17832
  }
17711
17833
  if (response.hasMore) {
17712
17834
  console.log();
17713
17835
  console.log(
17714
17836
  chalk21.dim(
17715
- `Showing ${response.networkLogs.length} network logs. Use --limit to see more.`
17837
+ `Showing ${response.networkLogs.length} network logs. Use --tail to see more.`
17716
17838
  )
17717
17839
  );
17718
17840
  }
@@ -18416,7 +18538,7 @@ var setupGithubCommand = new Command24().name("setup-github").description("Initi
18416
18538
 
18417
18539
  // src/index.ts
18418
18540
  var program = new Command25();
18419
- program.name("vm0").description("VM0 CLI - A modern build tool").version("4.29.0");
18541
+ program.name("vm0").description("VM0 CLI - A modern build tool").version("4.30.0");
18420
18542
  program.command("info").description("Display environment information").action(async () => {
18421
18543
  console.log(chalk26.bold("System Information:"));
18422
18544
  console.log(`Node Version: ${process.version}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vm0/cli",
3
- "version": "4.29.0",
3
+ "version": "4.30.0",
4
4
  "description": "CLI application",
5
5
  "repository": {
6
6
  "type": "git",