@asteroidai/cli 1.9.33 → 1.9.67

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 (3) hide show
  1. package/dist/asteroid.js +1182 -51
  2. package/dist/core.js +1181 -50
  3. package/package.json +1 -1
package/dist/core.js CHANGED
@@ -189,7 +189,23 @@ var COMMANDS = [
189
189
  flag: "base",
190
190
  type: "json",
191
191
  required: true,
192
- description: "The base machine: a browser, or a Linux / Windows OS environment. For non-admins, an OS base's `snapshotName` must be one of the organisation's snapshots or a public one; admins may name any snapshot. Omit it for the default image."
192
+ description: "The base machine: a browser, or a Linux / Windows OS environment. For non-admins, an OS base's `snapshotName` must be one of the organisation's snapshots or a public one; admins may name any snapshot. Omit it for the default image.",
193
+ fields: [
194
+ {
195
+ name: "type",
196
+ flag: "type",
197
+ type: "string",
198
+ required: false,
199
+ description: "Type of execution environment",
200
+ enum: ["browser", "os"]
201
+ },
202
+ {
203
+ name: "config",
204
+ flag: "config",
205
+ type: "json",
206
+ required: false
207
+ }
208
+ ]
193
209
  },
194
210
  {
195
211
  name: "profiles",
@@ -210,21 +226,272 @@ var COMMANDS = [
210
226
  flag: "warm-pool",
211
227
  type: "json",
212
228
  required: false,
213
- description: "Warm pool configuration. Absent means the environment is not kept warm. Exclusive with warmCache and dedicated."
229
+ description: "Warm pool configuration. Absent means the environment is not kept warm. Exclusive with warmCache and dedicated.",
230
+ fields: [
231
+ {
232
+ name: "targetSize",
233
+ flag: "target-size",
234
+ type: "integer",
235
+ required: false,
236
+ description: "Baseline number of warm environments to keep ready per profile row outside any scheduled window. An environment with no rows keeps this many in total. 0 drains the pool while no window is open; with no schedule, 0 drains it fully so keep-warm can be turned off or the environment deleted"
237
+ },
238
+ {
239
+ name: "schedule",
240
+ flag: "schedule",
241
+ type: "json",
242
+ required: false,
243
+ description: "Hour windows that override the baseline target size. Absent means the baseline applies around the clock.",
244
+ fields: [
245
+ {
246
+ name: "timezone",
247
+ flag: "timezone",
248
+ type: "string",
249
+ required: false,
250
+ description: "IANA time zone the windows are evaluated in, such as Europe/London"
251
+ },
252
+ {
253
+ name: "windows",
254
+ flag: "windows",
255
+ type: "json",
256
+ required: false
257
+ }
258
+ ]
259
+ },
260
+ {
261
+ name: "maxAgeMins",
262
+ flag: "max-age-mins",
263
+ type: "integer",
264
+ required: false,
265
+ description: "Member max age in minutes, not a hard retirement time. The replacement boots ahead of it, by the pool's recent warmup time; the member stays claimable past it until the replacement is ready, for a grace of at most half the max age or 15 minutes."
266
+ },
267
+ {
268
+ name: "reuse",
269
+ flag: "reuse",
270
+ type: "json",
271
+ required: false,
272
+ description: "How long a pooled environment lives: retired on its first claim, or reused until maxAgeMins and its replacement is ready."
273
+ },
274
+ {
275
+ name: "initialization",
276
+ flag: "initialization",
277
+ type: "json",
278
+ required: false,
279
+ description: "Agent that initialises each member. Absent means a member is available as soon as it has booted.",
280
+ fields: [
281
+ {
282
+ name: "workflowId",
283
+ flag: "workflow-id",
284
+ type: "string",
285
+ required: false,
286
+ description: "The initialising workflow"
287
+ },
288
+ {
289
+ name: "inputs",
290
+ flag: "inputs",
291
+ type: "json",
292
+ required: false,
293
+ description: "Fixed inputs for the initialising run",
294
+ record: "json"
295
+ },
296
+ {
297
+ name: "successOutcomes",
298
+ flag: "success-outcomes",
299
+ type: "string[]",
300
+ required: false,
301
+ description: "Outcomes of the initialising run that count as a success. A run that completes with any other outcome is treated as a failed run: a warm pool tears the member down, a warm cache records a failed login. Each must be an outcome of the agent's published version. Absent or empty means any completed run counts."
302
+ }
303
+ ]
304
+ },
305
+ {
306
+ name: "keepAlive",
307
+ flag: "keep-alive",
308
+ type: "json",
309
+ required: false,
310
+ description: "Periodic probe that keeps an idle member's session alive and retires a member whose session is dead. Needs an Anchor browser base or a Daytona desktop base. Absent means members are never touched between warmup and retirement.",
311
+ fields: [
312
+ {
313
+ name: "intervalMins",
314
+ flag: "interval-mins",
315
+ type: "integer",
316
+ required: false,
317
+ description: "Minutes between probes of the same member, whether the last one passed or failed. The sweep runs once a minute, so 1 is the shortest effective interval. Must be below the pool's maxAgeMins."
318
+ },
319
+ {
320
+ name: "script",
321
+ flag: "script",
322
+ type: "string",
323
+ required: false,
324
+ description: "On a browser base: a JavaScript expression evaluated in the member's open page. `await` is allowed. It must evaluate, or resolve, to true while the session is live and to false once it is not. Example: `fetch('/api/session', {credentials: 'include'}).then(r => r.ok)`. It runs with no attached execution, so it must not navigate. On a Linux base: a bash script. On a Windows base: a PowerShell script. Exit code 0 means the session is live; any other exit code means it is dead."
325
+ }
326
+ ]
327
+ }
328
+ ]
214
329
  },
215
330
  {
216
331
  name: "warmCache",
217
332
  flag: "warm-cache",
218
333
  type: "json",
219
334
  required: false,
220
- description: "Warm cache configuration. Absent means no login agent keeps the profiles' cookies fresh. Exclusive with warmPool and dedicated."
335
+ description: "Warm cache configuration. Absent means no login agent keeps the profiles' cookies fresh. Exclusive with warmPool and dedicated.",
336
+ fields: [
337
+ {
338
+ name: "intervalMins",
339
+ flag: "interval-mins",
340
+ type: "integer",
341
+ required: false,
342
+ description: "Minutes between logins of the same profile"
343
+ },
344
+ {
345
+ name: "activeHours",
346
+ flag: "active-hours",
347
+ type: "json",
348
+ required: false,
349
+ description: "Hours during which logins run. Absent means around the clock.",
350
+ fields: [
351
+ {
352
+ name: "timezone",
353
+ flag: "timezone",
354
+ type: "string",
355
+ required: false,
356
+ description: "IANA time zone the windows are evaluated in, such as Europe/London"
357
+ },
358
+ {
359
+ name: "windows",
360
+ flag: "windows",
361
+ type: "json",
362
+ required: false
363
+ }
364
+ ]
365
+ },
366
+ {
367
+ name: "initialization",
368
+ flag: "initialization",
369
+ type: "json",
370
+ required: false,
371
+ description: "The login agent, run on each profile's own environment",
372
+ fields: [
373
+ {
374
+ name: "workflowId",
375
+ flag: "workflow-id",
376
+ type: "string",
377
+ required: false,
378
+ description: "The initialising workflow"
379
+ },
380
+ {
381
+ name: "inputs",
382
+ flag: "inputs",
383
+ type: "json",
384
+ required: false,
385
+ description: "Fixed inputs for the initialising run",
386
+ record: "json"
387
+ },
388
+ {
389
+ name: "successOutcomes",
390
+ flag: "success-outcomes",
391
+ type: "string[]",
392
+ required: false,
393
+ description: "Outcomes of the initialising run that count as a success. A run that completes with any other outcome is treated as a failed run: a warm pool tears the member down, a warm cache records a failed login. Each must be an outcome of the agent's published version. Absent or empty means any completed run counts."
394
+ }
395
+ ]
396
+ },
397
+ {
398
+ name: "executionsWriteBack",
399
+ flag: "executions-write-back",
400
+ type: "boolean",
401
+ required: false,
402
+ description: "Whether executions on the environment save the browser profile when they stop. Off by default: only the login agent saves it, so a run that ends logged out cannot overwrite the session for later runs. Must be on with an Anchor sticky IP, which saves every session."
403
+ }
404
+ ]
221
405
  },
222
406
  {
223
407
  name: "dedicated",
224
408
  flag: "dedicated",
225
409
  type: "json",
226
410
  required: false,
227
- description: "Admin only, and returned to admins only. Dedicated worker configuration. Absent means no workers are kept. Exclusive with warmPool and warmCache."
411
+ description: "Admin only, and returned to admins only. Dedicated worker configuration. Absent means no workers are kept. Exclusive with warmPool and warmCache.",
412
+ fields: [
413
+ {
414
+ name: "workflowId",
415
+ flag: "workflow-id",
416
+ type: "string",
417
+ required: false,
418
+ description: "The workflow the workers keep loaded"
419
+ },
420
+ {
421
+ name: "targetSize",
422
+ flag: "target-size",
423
+ type: "integer",
424
+ required: false,
425
+ description: "Baseline number of workers to keep ready outside any scheduled window. 0 drains the environment."
426
+ },
427
+ {
428
+ name: "schedule",
429
+ flag: "schedule",
430
+ type: "json",
431
+ required: false,
432
+ description: "Hour windows that override the baseline target size. Absent means the baseline applies around the clock.",
433
+ fields: [
434
+ {
435
+ name: "timezone",
436
+ flag: "timezone",
437
+ type: "string",
438
+ required: false,
439
+ description: "IANA time zone the windows are evaluated in, such as Europe/London"
440
+ },
441
+ {
442
+ name: "windows",
443
+ flag: "windows",
444
+ type: "json",
445
+ required: false
446
+ }
447
+ ]
448
+ },
449
+ {
450
+ name: "maxAgeMins",
451
+ flag: "max-age-mins",
452
+ type: "integer",
453
+ required: false,
454
+ description: "Member max age in minutes. As for a warm pool, the replacement boots ahead of it."
455
+ },
456
+ {
457
+ name: "executionsPerWorker",
458
+ flag: "executions-per-worker",
459
+ type: "integer",
460
+ required: false,
461
+ description: "Executions one worker runs at once, each on its own page of the member's browser"
462
+ },
463
+ {
464
+ name: "initialization",
465
+ flag: "initialization",
466
+ type: "json",
467
+ required: false,
468
+ description: "Workflow that initialises each member before its worker loads, such as a sign-in. Absent means the worker loads as soon as the browser has booted.",
469
+ fields: [
470
+ {
471
+ name: "workflowId",
472
+ flag: "workflow-id",
473
+ type: "string",
474
+ required: false,
475
+ description: "The initialising workflow"
476
+ },
477
+ {
478
+ name: "inputs",
479
+ flag: "inputs",
480
+ type: "json",
481
+ required: false,
482
+ description: "Fixed inputs for the initialising run",
483
+ record: "json"
484
+ },
485
+ {
486
+ name: "successOutcomes",
487
+ flag: "success-outcomes",
488
+ type: "string[]",
489
+ required: false,
490
+ description: "Outcomes of the initialising run that count as a success. A run that completes with any other outcome is treated as a failed run: a warm pool tears the member down, a warm cache records a failed login. Each must be an outcome of the agent's published version. Absent or empty means any completed run counts."
491
+ }
492
+ ]
493
+ }
494
+ ]
228
495
  }
229
496
  ],
230
497
  files: [],
@@ -339,7 +606,23 @@ var COMMANDS = [
339
606
  flag: "base",
340
607
  type: "json",
341
608
  required: true,
342
- description: "The base machine: a browser, or a Linux / Windows OS environment. For non-admins, an OS base's `snapshotName` must be one of the organisation's snapshots or a public one; admins may name any snapshot. Omit it for the default image."
609
+ description: "The base machine: a browser, or a Linux / Windows OS environment. For non-admins, an OS base's `snapshotName` must be one of the organisation's snapshots or a public one; admins may name any snapshot. Omit it for the default image.",
610
+ fields: [
611
+ {
612
+ name: "type",
613
+ flag: "type",
614
+ type: "string",
615
+ required: false,
616
+ description: "Type of execution environment",
617
+ enum: ["browser", "os"]
618
+ },
619
+ {
620
+ name: "config",
621
+ flag: "config",
622
+ type: "json",
623
+ required: false
624
+ }
625
+ ]
343
626
  },
344
627
  {
345
628
  name: "profiles",
@@ -360,21 +643,272 @@ var COMMANDS = [
360
643
  flag: "warm-pool",
361
644
  type: "json",
362
645
  required: false,
363
- description: "Warm pool configuration. Absent means the environment is not kept warm. Exclusive with warmCache and dedicated."
646
+ description: "Warm pool configuration. Absent means the environment is not kept warm. Exclusive with warmCache and dedicated.",
647
+ fields: [
648
+ {
649
+ name: "targetSize",
650
+ flag: "target-size",
651
+ type: "integer",
652
+ required: false,
653
+ description: "Baseline number of warm environments to keep ready per profile row outside any scheduled window. An environment with no rows keeps this many in total. 0 drains the pool while no window is open; with no schedule, 0 drains it fully so keep-warm can be turned off or the environment deleted"
654
+ },
655
+ {
656
+ name: "schedule",
657
+ flag: "schedule",
658
+ type: "json",
659
+ required: false,
660
+ description: "Hour windows that override the baseline target size. Absent means the baseline applies around the clock.",
661
+ fields: [
662
+ {
663
+ name: "timezone",
664
+ flag: "timezone",
665
+ type: "string",
666
+ required: false,
667
+ description: "IANA time zone the windows are evaluated in, such as Europe/London"
668
+ },
669
+ {
670
+ name: "windows",
671
+ flag: "windows",
672
+ type: "json",
673
+ required: false
674
+ }
675
+ ]
676
+ },
677
+ {
678
+ name: "maxAgeMins",
679
+ flag: "max-age-mins",
680
+ type: "integer",
681
+ required: false,
682
+ description: "Member max age in minutes, not a hard retirement time. The replacement boots ahead of it, by the pool's recent warmup time; the member stays claimable past it until the replacement is ready, for a grace of at most half the max age or 15 minutes."
683
+ },
684
+ {
685
+ name: "reuse",
686
+ flag: "reuse",
687
+ type: "json",
688
+ required: false,
689
+ description: "How long a pooled environment lives: retired on its first claim, or reused until maxAgeMins and its replacement is ready."
690
+ },
691
+ {
692
+ name: "initialization",
693
+ flag: "initialization",
694
+ type: "json",
695
+ required: false,
696
+ description: "Agent that initialises each member. Absent means a member is available as soon as it has booted.",
697
+ fields: [
698
+ {
699
+ name: "workflowId",
700
+ flag: "workflow-id",
701
+ type: "string",
702
+ required: false,
703
+ description: "The initialising workflow"
704
+ },
705
+ {
706
+ name: "inputs",
707
+ flag: "inputs",
708
+ type: "json",
709
+ required: false,
710
+ description: "Fixed inputs for the initialising run",
711
+ record: "json"
712
+ },
713
+ {
714
+ name: "successOutcomes",
715
+ flag: "success-outcomes",
716
+ type: "string[]",
717
+ required: false,
718
+ description: "Outcomes of the initialising run that count as a success. A run that completes with any other outcome is treated as a failed run: a warm pool tears the member down, a warm cache records a failed login. Each must be an outcome of the agent's published version. Absent or empty means any completed run counts."
719
+ }
720
+ ]
721
+ },
722
+ {
723
+ name: "keepAlive",
724
+ flag: "keep-alive",
725
+ type: "json",
726
+ required: false,
727
+ description: "Periodic probe that keeps an idle member's session alive and retires a member whose session is dead. Needs an Anchor browser base or a Daytona desktop base. Absent means members are never touched between warmup and retirement.",
728
+ fields: [
729
+ {
730
+ name: "intervalMins",
731
+ flag: "interval-mins",
732
+ type: "integer",
733
+ required: false,
734
+ description: "Minutes between probes of the same member, whether the last one passed or failed. The sweep runs once a minute, so 1 is the shortest effective interval. Must be below the pool's maxAgeMins."
735
+ },
736
+ {
737
+ name: "script",
738
+ flag: "script",
739
+ type: "string",
740
+ required: false,
741
+ description: "On a browser base: a JavaScript expression evaluated in the member's open page. `await` is allowed. It must evaluate, or resolve, to true while the session is live and to false once it is not. Example: `fetch('/api/session', {credentials: 'include'}).then(r => r.ok)`. It runs with no attached execution, so it must not navigate. On a Linux base: a bash script. On a Windows base: a PowerShell script. Exit code 0 means the session is live; any other exit code means it is dead."
742
+ }
743
+ ]
744
+ }
745
+ ]
364
746
  },
365
747
  {
366
748
  name: "warmCache",
367
749
  flag: "warm-cache",
368
750
  type: "json",
369
751
  required: false,
370
- description: "Warm cache configuration. Absent means no login agent keeps the profiles' cookies fresh. Exclusive with warmPool and dedicated."
752
+ description: "Warm cache configuration. Absent means no login agent keeps the profiles' cookies fresh. Exclusive with warmPool and dedicated.",
753
+ fields: [
754
+ {
755
+ name: "intervalMins",
756
+ flag: "interval-mins",
757
+ type: "integer",
758
+ required: false,
759
+ description: "Minutes between logins of the same profile"
760
+ },
761
+ {
762
+ name: "activeHours",
763
+ flag: "active-hours",
764
+ type: "json",
765
+ required: false,
766
+ description: "Hours during which logins run. Absent means around the clock.",
767
+ fields: [
768
+ {
769
+ name: "timezone",
770
+ flag: "timezone",
771
+ type: "string",
772
+ required: false,
773
+ description: "IANA time zone the windows are evaluated in, such as Europe/London"
774
+ },
775
+ {
776
+ name: "windows",
777
+ flag: "windows",
778
+ type: "json",
779
+ required: false
780
+ }
781
+ ]
782
+ },
783
+ {
784
+ name: "initialization",
785
+ flag: "initialization",
786
+ type: "json",
787
+ required: false,
788
+ description: "The login agent, run on each profile's own environment",
789
+ fields: [
790
+ {
791
+ name: "workflowId",
792
+ flag: "workflow-id",
793
+ type: "string",
794
+ required: false,
795
+ description: "The initialising workflow"
796
+ },
797
+ {
798
+ name: "inputs",
799
+ flag: "inputs",
800
+ type: "json",
801
+ required: false,
802
+ description: "Fixed inputs for the initialising run",
803
+ record: "json"
804
+ },
805
+ {
806
+ name: "successOutcomes",
807
+ flag: "success-outcomes",
808
+ type: "string[]",
809
+ required: false,
810
+ description: "Outcomes of the initialising run that count as a success. A run that completes with any other outcome is treated as a failed run: a warm pool tears the member down, a warm cache records a failed login. Each must be an outcome of the agent's published version. Absent or empty means any completed run counts."
811
+ }
812
+ ]
813
+ },
814
+ {
815
+ name: "executionsWriteBack",
816
+ flag: "executions-write-back",
817
+ type: "boolean",
818
+ required: false,
819
+ description: "Whether executions on the environment save the browser profile when they stop. Off by default: only the login agent saves it, so a run that ends logged out cannot overwrite the session for later runs. Must be on with an Anchor sticky IP, which saves every session."
820
+ }
821
+ ]
371
822
  },
372
823
  {
373
824
  name: "dedicated",
374
825
  flag: "dedicated",
375
826
  type: "json",
376
827
  required: false,
377
- description: "Admin only, and returned to admins only. Dedicated worker configuration. Absent means no workers are kept. Exclusive with warmPool and warmCache."
828
+ description: "Admin only, and returned to admins only. Dedicated worker configuration. Absent means no workers are kept. Exclusive with warmPool and warmCache.",
829
+ fields: [
830
+ {
831
+ name: "workflowId",
832
+ flag: "workflow-id",
833
+ type: "string",
834
+ required: false,
835
+ description: "The workflow the workers keep loaded"
836
+ },
837
+ {
838
+ name: "targetSize",
839
+ flag: "target-size",
840
+ type: "integer",
841
+ required: false,
842
+ description: "Baseline number of workers to keep ready outside any scheduled window. 0 drains the environment."
843
+ },
844
+ {
845
+ name: "schedule",
846
+ flag: "schedule",
847
+ type: "json",
848
+ required: false,
849
+ description: "Hour windows that override the baseline target size. Absent means the baseline applies around the clock.",
850
+ fields: [
851
+ {
852
+ name: "timezone",
853
+ flag: "timezone",
854
+ type: "string",
855
+ required: false,
856
+ description: "IANA time zone the windows are evaluated in, such as Europe/London"
857
+ },
858
+ {
859
+ name: "windows",
860
+ flag: "windows",
861
+ type: "json",
862
+ required: false
863
+ }
864
+ ]
865
+ },
866
+ {
867
+ name: "maxAgeMins",
868
+ flag: "max-age-mins",
869
+ type: "integer",
870
+ required: false,
871
+ description: "Member max age in minutes. As for a warm pool, the replacement boots ahead of it."
872
+ },
873
+ {
874
+ name: "executionsPerWorker",
875
+ flag: "executions-per-worker",
876
+ type: "integer",
877
+ required: false,
878
+ description: "Executions one worker runs at once, each on its own page of the member's browser"
879
+ },
880
+ {
881
+ name: "initialization",
882
+ flag: "initialization",
883
+ type: "json",
884
+ required: false,
885
+ description: "Workflow that initialises each member before its worker loads, such as a sign-in. Absent means the worker loads as soon as the browser has booted.",
886
+ fields: [
887
+ {
888
+ name: "workflowId",
889
+ flag: "workflow-id",
890
+ type: "string",
891
+ required: false,
892
+ description: "The initialising workflow"
893
+ },
894
+ {
895
+ name: "inputs",
896
+ flag: "inputs",
897
+ type: "json",
898
+ required: false,
899
+ description: "Fixed inputs for the initialising run",
900
+ record: "json"
901
+ },
902
+ {
903
+ name: "successOutcomes",
904
+ flag: "success-outcomes",
905
+ type: "string[]",
906
+ required: false,
907
+ description: "Outcomes of the initialising run that count as a success. A run that completes with any other outcome is treated as a failed run: a warm pool tears the member down, a warm cache records a failed login. Each must be an outcome of the agent's published version. Absent or empty means any completed run counts."
908
+ }
909
+ ]
910
+ }
911
+ ]
378
912
  }
379
913
  ],
380
914
  files: [],
@@ -1227,7 +1761,8 @@ var COMMANDS = [
1227
1761
  flag: "inputs",
1228
1762
  type: "json",
1229
1763
  required: false,
1230
- description: "Input variables for the new execution. Replaces the original inputs when set."
1764
+ description: "Input variables for the new execution. Replaces the original inputs when set.",
1765
+ record: "json"
1231
1766
  },
1232
1767
  {
1233
1768
  name: "profileId",
@@ -2090,21 +2625,69 @@ var COMMANDS = [
2090
2625
  name: "inputs",
2091
2626
  flag: "inputs",
2092
2627
  type: "json",
2093
- required: false
2628
+ required: false,
2629
+ record: "json"
2094
2630
  },
2095
2631
  {
2096
2632
  name: "batchSource",
2097
2633
  flag: "batch-source",
2098
2634
  type: "json",
2099
2635
  required: false,
2100
- description: "Set to make each tick create a batch from a spreadsheet instead of one execution"
2636
+ description: "Set to make each tick create a batch from a spreadsheet instead of one execution",
2637
+ fields: [
2638
+ {
2639
+ name: "sheetUrl",
2640
+ flag: "sheet-url",
2641
+ type: "string",
2642
+ required: false,
2643
+ description: "Google Sheets URL. The gid selects the tab; without one the first tab is used."
2644
+ },
2645
+ {
2646
+ name: "columnMappings",
2647
+ flag: "column-mappings",
2648
+ type: "json",
2649
+ required: false,
2650
+ description: "Maps a sheet column header to the workflow input it fills. Unmapped columns are ignored.",
2651
+ record: "string"
2652
+ },
2653
+ {
2654
+ name: "requiredInputs",
2655
+ flag: "required-inputs",
2656
+ type: "string[]",
2657
+ required: false,
2658
+ description: "Inputs a row must supply non-empty to count as valid. Rows missing any of them\nare skipped for that tick rather than failing the whole run."
2659
+ },
2660
+ {
2661
+ name: "config",
2662
+ flag: "config",
2663
+ type: "json",
2664
+ required: false,
2665
+ description: "How the resulting batch paces its executions"
2666
+ }
2667
+ ]
2101
2668
  },
2102
2669
  {
2103
2670
  name: "executionOptions",
2104
2671
  flag: "execution-options",
2105
2672
  type: "json",
2106
2673
  required: false,
2107
- description: "Per-execution runtime options applied to every run this schedule triggers."
2674
+ description: "Per-execution runtime options applied to every run this schedule triggers.",
2675
+ fields: [
2676
+ {
2677
+ name: "variantKey",
2678
+ flag: "variant-key",
2679
+ type: "string",
2680
+ required: false,
2681
+ description: "Identifies which variant this execution is for, scoping its shared files and scripts to a per-variant subdirectory under each node's shared folder. It does not change which workflow or version runs. Normalised to a filesystem-safe slug by the server. Requires the workflow to have `variant_mode` enabled, and a variant-mode workflow requires it on every execution."
2682
+ },
2683
+ {
2684
+ name: "softTimeoutMins",
2685
+ flag: "soft-timeout-mins",
2686
+ type: "integer",
2687
+ required: false,
2688
+ description: "Soft timeout in minutes. When the execution has been running longer than this value, a message is injected on every subsequent step urging the agent to wrap up and produce output. Must be greater than 0 and less than the agent's hard timeout (max_timeout_mins)."
2689
+ }
2690
+ ]
2108
2691
  }
2109
2692
  ],
2110
2693
  files: [],
@@ -2285,14 +2868,46 @@ var COMMANDS = [
2285
2868
  name: "inputs",
2286
2869
  flag: "inputs",
2287
2870
  type: "json",
2288
- required: false
2871
+ required: false,
2872
+ record: "json"
2289
2873
  },
2290
2874
  {
2291
2875
  name: "batchSource",
2292
2876
  flag: "batch-source",
2293
2877
  type: "json",
2294
2878
  required: false,
2295
- description: "Replaces the batch source. Omit to leave it unchanged; use clearBatchSource to remove it."
2879
+ description: "Replaces the batch source. Omit to leave it unchanged; use clearBatchSource to remove it.",
2880
+ fields: [
2881
+ {
2882
+ name: "sheetUrl",
2883
+ flag: "sheet-url",
2884
+ type: "string",
2885
+ required: false,
2886
+ description: "Google Sheets URL. The gid selects the tab; without one the first tab is used."
2887
+ },
2888
+ {
2889
+ name: "columnMappings",
2890
+ flag: "column-mappings",
2891
+ type: "json",
2892
+ required: false,
2893
+ description: "Maps a sheet column header to the workflow input it fills. Unmapped columns are ignored.",
2894
+ record: "string"
2895
+ },
2896
+ {
2897
+ name: "requiredInputs",
2898
+ flag: "required-inputs",
2899
+ type: "string[]",
2900
+ required: false,
2901
+ description: "Inputs a row must supply non-empty to count as valid. Rows missing any of them\nare skipped for that tick rather than failing the whole run."
2902
+ },
2903
+ {
2904
+ name: "config",
2905
+ flag: "config",
2906
+ type: "json",
2907
+ required: false,
2908
+ description: "How the resulting batch paces its executions"
2909
+ }
2910
+ ]
2296
2911
  },
2297
2912
  {
2298
2913
  name: "clearBatchSource",
@@ -2313,7 +2928,23 @@ var COMMANDS = [
2313
2928
  flag: "execution-options",
2314
2929
  type: "json",
2315
2930
  required: false,
2316
- description: "Per-execution runtime options applied to every run this schedule triggers. Replaces the stored options in full, so send every field you want to keep."
2931
+ description: "Per-execution runtime options applied to every run this schedule triggers. Replaces the stored options in full, so send every field you want to keep.",
2932
+ fields: [
2933
+ {
2934
+ name: "variantKey",
2935
+ flag: "variant-key",
2936
+ type: "string",
2937
+ required: false,
2938
+ description: "Identifies which variant this execution is for, scoping its shared files and scripts to a per-variant subdirectory under each node's shared folder. It does not change which workflow or version runs. Normalised to a filesystem-safe slug by the server. Requires the workflow to have `variant_mode` enabled, and a variant-mode workflow requires it on every execution."
2939
+ },
2940
+ {
2941
+ name: "softTimeoutMins",
2942
+ flag: "soft-timeout-mins",
2943
+ type: "integer",
2944
+ required: false,
2945
+ description: "Soft timeout in minutes. When the execution has been running longer than this value, a message is injected on every subsequent step urging the agent to wrap up and produce output. Must be greater than 0 and less than the agent's hard timeout (max_timeout_mins)."
2946
+ }
2947
+ ]
2317
2948
  }
2318
2949
  ],
2319
2950
  files: [],
@@ -2382,14 +3013,16 @@ var COMMANDS = [
2382
3013
  name: "inputs",
2383
3014
  flag: "inputs",
2384
3015
  type: "json",
2385
- required: false
3016
+ required: false,
3017
+ record: "json"
2386
3018
  },
2387
3019
  {
2388
3020
  name: "metadata",
2389
3021
  flag: "metadata",
2390
3022
  type: "json",
2391
3023
  required: false,
2392
- description: "String key/value pairs to label and filter executions."
3024
+ description: "String key/value pairs to label and filter executions.",
3025
+ record: "string"
2393
3026
  },
2394
3027
  {
2395
3028
  name: "executeAt",
@@ -2403,7 +3036,23 @@ var COMMANDS = [
2403
3036
  flag: "execution-options",
2404
3037
  type: "json",
2405
3038
  required: false,
2406
- description: "Per-execution runtime options applied when this execution is triggered."
3039
+ description: "Per-execution runtime options applied when this execution is triggered.",
3040
+ fields: [
3041
+ {
3042
+ name: "variantKey",
3043
+ flag: "variant-key",
3044
+ type: "string",
3045
+ required: false,
3046
+ description: "Identifies which variant this execution is for, scoping its shared files and scripts to a per-variant subdirectory under each node's shared folder. It does not change which workflow or version runs. Normalised to a filesystem-safe slug by the server. Requires the workflow to have `variant_mode` enabled, and a variant-mode workflow requires it on every execution."
3047
+ },
3048
+ {
3049
+ name: "softTimeoutMins",
3050
+ flag: "soft-timeout-mins",
3051
+ type: "integer",
3052
+ required: false,
3053
+ description: "Soft timeout in minutes. When the execution has been running longer than this value, a message is injected on every subsequent step urging the agent to wrap up and produce output. Must be greater than 0 and less than the agent's hard timeout (max_timeout_mins)."
3054
+ }
3055
+ ]
2407
3056
  }
2408
3057
  ],
2409
3058
  files: [],
@@ -2534,7 +3183,8 @@ var COMMANDS = [
2534
3183
  name: "schema",
2535
3184
  flag: "schema",
2536
3185
  type: "json",
2537
- required: true
3186
+ required: true,
3187
+ record: "json"
2538
3188
  }
2539
3189
  ],
2540
3190
  files: [],
@@ -2652,7 +3302,51 @@ var COMMANDS = [
2652
3302
  flag: "field",
2653
3303
  type: "json",
2654
3304
  required: true,
2655
- description: "Write shape for a field. The server derives key from label."
3305
+ description: "Write shape for a field. The server derives key from label.",
3306
+ fields: [
3307
+ {
3308
+ name: "type",
3309
+ flag: "type",
3310
+ type: "string",
3311
+ required: false,
3312
+ description: "Type of a vault field. Sensitivity is derived from the type: username, email, url, phone, text, card_expiry, and cardholder_name are readable; password, hidden, totp_seed, api_key, card_number, and card_cvv are write-only. There is no separate hidden flag.",
3313
+ enum: [
3314
+ "username",
3315
+ "email",
3316
+ "url",
3317
+ "phone",
3318
+ "text",
3319
+ "password",
3320
+ "hidden",
3321
+ "totp_seed",
3322
+ "api_key",
3323
+ "card_number",
3324
+ "card_expiry",
3325
+ "card_cvv",
3326
+ "cardholder_name"
3327
+ ]
3328
+ },
3329
+ {
3330
+ name: "label",
3331
+ flag: "label",
3332
+ type: "string",
3333
+ required: false,
3334
+ description: "Human label shown in forms. The field key is UPPER_SNAKE of this label."
3335
+ },
3336
+ {
3337
+ name: "required",
3338
+ flag: "required",
3339
+ type: "boolean",
3340
+ required: false
3341
+ },
3342
+ {
3343
+ name: "hint",
3344
+ flag: "hint",
3345
+ type: "string",
3346
+ required: false,
3347
+ description: "Optional guidance shown next to the field, copied from catalog credentials when generating masters."
3348
+ }
3349
+ ]
2656
3350
  },
2657
3351
  {
2658
3352
  name: "value",
@@ -2919,6 +3613,26 @@ var COMMANDS = [
2919
3613
  credentialOrganization: true
2920
3614
  }
2921
3615
  },
3616
+ {
3617
+ command: "secret-request delete",
3618
+ tool: "secret_request_delete",
3619
+ title: "Delete request",
3620
+ description: "Delete a secret request in any state. A pending request stops working at once. The secret a completed request created is kept.",
3621
+ method: "DELETE",
3622
+ path: "/agents/v2/secret-requests/{requestId}",
3623
+ args: [
3624
+ {
3625
+ name: "requestId",
3626
+ flag: "request-id",
3627
+ type: "string",
3628
+ required: true
3629
+ }
3630
+ ],
3631
+ query: [],
3632
+ binary: false,
3633
+ readOnly: false,
3634
+ destructive: true
3635
+ },
2922
3636
  {
2923
3637
  command: "secret-request list",
2924
3638
  tool: "secret_requests_list",
@@ -3500,7 +4214,115 @@ var COMMANDS = [
3500
4214
  flag: "version",
3501
4215
  type: "json",
3502
4216
  required: false,
3503
- description: "The first version of the workflow. Omit it to start from a blank workflow with a single start node."
4217
+ description: "The first version of the workflow. Omit it to start from a blank workflow with a single start node.",
4218
+ fields: [
4219
+ {
4220
+ name: "parentId",
4221
+ flag: "parent-id",
4222
+ type: "string",
4223
+ required: false,
4224
+ description: "Optional parent workflow ID to derive from"
4225
+ },
4226
+ {
4227
+ name: "rules",
4228
+ flag: "rules",
4229
+ type: "string",
4230
+ required: false
4231
+ },
4232
+ {
4233
+ name: "graph",
4234
+ flag: "graph",
4235
+ type: "json",
4236
+ required: false,
4237
+ fields: [
4238
+ {
4239
+ name: "nodes",
4240
+ flag: "nodes",
4241
+ type: "json",
4242
+ required: false
4243
+ },
4244
+ {
4245
+ name: "transitions",
4246
+ flag: "transitions",
4247
+ type: "json",
4248
+ required: false
4249
+ },
4250
+ {
4251
+ name: "sticky_notes",
4252
+ flag: "sticky_notes",
4253
+ type: "json",
4254
+ required: false
4255
+ }
4256
+ ]
4257
+ },
4258
+ {
4259
+ name: "inputs",
4260
+ flag: "inputs",
4261
+ type: "json",
4262
+ required: false,
4263
+ description: "Typed input definitions for this workflow. Names referenced in prompts but omitted here default to optional strings."
4264
+ },
4265
+ {
4266
+ name: "settings",
4267
+ flag: "settings",
4268
+ type: "json",
4269
+ required: false,
4270
+ description: "Configuration settings for workflow execution",
4271
+ fields: [
4272
+ {
4273
+ name: "viewport_width",
4274
+ flag: "viewport_width",
4275
+ type: "integer",
4276
+ required: false,
4277
+ description: "Browser viewport width in pixels"
4278
+ },
4279
+ {
4280
+ name: "viewport_height",
4281
+ flag: "viewport_height",
4282
+ type: "integer",
4283
+ required: false,
4284
+ description: "Browser viewport height in pixels"
4285
+ },
4286
+ {
4287
+ name: "max_timeout_mins",
4288
+ flag: "max_timeout_mins",
4289
+ type: "integer",
4290
+ required: false,
4291
+ description: "Maximum timeout in minutes"
4292
+ },
4293
+ {
4294
+ name: "custom_environment_id",
4295
+ flag: "custom_environment_id",
4296
+ type: "string",
4297
+ required: false,
4298
+ description: "Custom environment executions of this workflow boot on: its environment type and snapshot replace the workflow's own environment, its profile rows restrict which profile an execution may use, and a kept-warm environment hands out a pre-warmed copy. On a new version, omit it to keep the environment of the workflow's latest version (its editable head, which can be newer than the published one), or send null to boot the workflow's own environment. On a new workflow, there is nothing to keep: omit it or send null for no custom environment."
4299
+ }
4300
+ ]
4301
+ },
4302
+ {
4303
+ name: "environmentTemplate",
4304
+ flag: "environment-template",
4305
+ type: "json",
4306
+ required: false,
4307
+ description: "Optional environment template. On a new version, omit it to keep the template of the workflow's latest version (its editable head); on a new workflow, omitting it means a browser. Omits admin-only OS fields.",
4308
+ fields: [
4309
+ {
4310
+ name: "type",
4311
+ flag: "type",
4312
+ type: "string",
4313
+ required: false,
4314
+ description: "Type of execution environment",
4315
+ enum: ["browser", "os"]
4316
+ },
4317
+ {
4318
+ name: "config",
4319
+ flag: "config",
4320
+ type: "json",
4321
+ required: false
4322
+ }
4323
+ ]
4324
+ }
4325
+ ]
3504
4326
  }
3505
4327
  ],
3506
4328
  files: [],
@@ -3604,7 +4426,8 @@ var COMMANDS = [
3604
4426
  flag: "inputs",
3605
4427
  type: "json",
3606
4428
  required: false,
3607
- description: "Inputs to be merged into the placeholders defined in prompts"
4429
+ description: "Inputs to be merged into the placeholders defined in prompts",
4430
+ record: "json"
3608
4431
  },
3609
4432
  {
3610
4433
  name: "tempFiles",
@@ -3618,7 +4441,8 @@ var COMMANDS = [
3618
4441
  flag: "metadata",
3619
4442
  type: "json",
3620
4443
  required: false,
3621
- description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions"
4444
+ description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions",
4445
+ record: "string"
3622
4446
  },
3623
4447
  {
3624
4448
  name: "version",
@@ -3639,7 +4463,23 @@ var COMMANDS = [
3639
4463
  flag: "execution-options",
3640
4464
  type: "json",
3641
4465
  required: false,
3642
- description: "Per-execution runtime options that override or extend the workflow's default settings."
4466
+ description: "Per-execution runtime options that override or extend the workflow's default settings.",
4467
+ fields: [
4468
+ {
4469
+ name: "variantKey",
4470
+ flag: "variant-key",
4471
+ type: "string",
4472
+ required: false,
4473
+ description: "Identifies which variant this execution is for, scoping its shared files and scripts to a per-variant subdirectory under each node's shared folder. It does not change which workflow or version runs. Normalised to a filesystem-safe slug by the server. Requires the workflow to have `variant_mode` enabled, and a variant-mode workflow requires it on every execution."
4474
+ },
4475
+ {
4476
+ name: "softTimeoutMins",
4477
+ flag: "soft-timeout-mins",
4478
+ type: "integer",
4479
+ required: false,
4480
+ description: "Soft timeout in minutes. When the execution has been running longer than this value, a message is injected on every subsequent step urging the agent to wrap up and produce output. Must be greater than 0 and less than the agent's hard timeout (max_timeout_mins)."
4481
+ }
4482
+ ]
3643
4483
  },
3644
4484
  {
3645
4485
  name: "onCapacityLimit",
@@ -3697,7 +4537,8 @@ var COMMANDS = [
3697
4537
  flag: "inputs",
3698
4538
  type: "json",
3699
4539
  required: false,
3700
- description: "Inputs to be merged into the placeholders defined in prompts"
4540
+ description: "Inputs to be merged into the placeholders defined in prompts",
4541
+ record: "json"
3701
4542
  },
3702
4543
  {
3703
4544
  name: "tempFiles",
@@ -3711,7 +4552,8 @@ var COMMANDS = [
3711
4552
  flag: "metadata",
3712
4553
  type: "json",
3713
4554
  required: false,
3714
- description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions"
4555
+ description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions",
4556
+ record: "string"
3715
4557
  },
3716
4558
  {
3717
4559
  name: "version",
@@ -3732,7 +4574,23 @@ var COMMANDS = [
3732
4574
  flag: "execution-options",
3733
4575
  type: "json",
3734
4576
  required: false,
3735
- description: "Per-execution runtime options that override or extend the workflow's default settings."
4577
+ description: "Per-execution runtime options that override or extend the workflow's default settings.",
4578
+ fields: [
4579
+ {
4580
+ name: "variantKey",
4581
+ flag: "variant-key",
4582
+ type: "string",
4583
+ required: false,
4584
+ description: "Identifies which variant this execution is for, scoping its shared files and scripts to a per-variant subdirectory under each node's shared folder. It does not change which workflow or version runs. Normalised to a filesystem-safe slug by the server. Requires the workflow to have `variant_mode` enabled, and a variant-mode workflow requires it on every execution."
4585
+ },
4586
+ {
4587
+ name: "softTimeoutMins",
4588
+ flag: "soft-timeout-mins",
4589
+ type: "integer",
4590
+ required: false,
4591
+ description: "Soft timeout in minutes. When the execution has been running longer than this value, a message is injected on every subsequent step urging the agent to wrap up and produce output. Must be greater than 0 and less than the agent's hard timeout (max_timeout_mins)."
4592
+ }
4593
+ ]
3736
4594
  },
3737
4595
  {
3738
4596
  name: "onCapacityLimit",
@@ -4234,7 +5092,27 @@ var COMMANDS = [
4234
5092
  name: "graph",
4235
5093
  flag: "graph",
4236
5094
  type: "json",
4237
- required: true
5095
+ required: true,
5096
+ fields: [
5097
+ {
5098
+ name: "nodes",
5099
+ flag: "nodes",
5100
+ type: "json",
5101
+ required: false
5102
+ },
5103
+ {
5104
+ name: "transitions",
5105
+ flag: "transitions",
5106
+ type: "json",
5107
+ required: false
5108
+ },
5109
+ {
5110
+ name: "sticky_notes",
5111
+ flag: "sticky_notes",
5112
+ type: "json",
5113
+ required: false
5114
+ }
5115
+ ]
4238
5116
  },
4239
5117
  {
4240
5118
  name: "inputs",
@@ -4248,14 +5126,60 @@ var COMMANDS = [
4248
5126
  flag: "settings",
4249
5127
  type: "json",
4250
5128
  required: true,
4251
- description: "Configuration settings for workflow execution"
5129
+ description: "Configuration settings for workflow execution",
5130
+ fields: [
5131
+ {
5132
+ name: "viewport_width",
5133
+ flag: "viewport_width",
5134
+ type: "integer",
5135
+ required: false,
5136
+ description: "Browser viewport width in pixels"
5137
+ },
5138
+ {
5139
+ name: "viewport_height",
5140
+ flag: "viewport_height",
5141
+ type: "integer",
5142
+ required: false,
5143
+ description: "Browser viewport height in pixels"
5144
+ },
5145
+ {
5146
+ name: "max_timeout_mins",
5147
+ flag: "max_timeout_mins",
5148
+ type: "integer",
5149
+ required: false,
5150
+ description: "Maximum timeout in minutes"
5151
+ },
5152
+ {
5153
+ name: "custom_environment_id",
5154
+ flag: "custom_environment_id",
5155
+ type: "string",
5156
+ required: false,
5157
+ description: "Custom environment executions of this workflow boot on: its environment type and snapshot replace the workflow's own environment, its profile rows restrict which profile an execution may use, and a kept-warm environment hands out a pre-warmed copy. On a new version, omit it to keep the environment of the workflow's latest version (its editable head, which can be newer than the published one), or send null to boot the workflow's own environment. On a new workflow, there is nothing to keep: omit it or send null for no custom environment."
5158
+ }
5159
+ ]
4252
5160
  },
4253
5161
  {
4254
5162
  name: "environmentTemplate",
4255
5163
  flag: "environment-template",
4256
5164
  type: "json",
4257
5165
  required: false,
4258
- description: "Optional environment template. On a new version, omit it to keep the template of the workflow's latest version (its editable head); on a new workflow, omitting it means a browser. Omits admin-only OS fields."
5166
+ description: "Optional environment template. On a new version, omit it to keep the template of the workflow's latest version (its editable head); on a new workflow, omitting it means a browser. Omits admin-only OS fields.",
5167
+ fields: [
5168
+ {
5169
+ name: "type",
5170
+ flag: "type",
5171
+ type: "string",
5172
+ required: false,
5173
+ description: "Type of execution environment",
5174
+ enum: ["browser", "os"]
5175
+ },
5176
+ {
5177
+ name: "config",
5178
+ flag: "config",
5179
+ type: "json",
5180
+ required: false
5181
+ }
5182
+ ]
4259
5183
  }
4260
5184
  ],
4261
5185
  files: [],
@@ -4302,7 +5226,27 @@ var COMMANDS = [
4302
5226
  name: "graph",
4303
5227
  flag: "graph",
4304
5228
  type: "json",
4305
- required: true
5229
+ required: true,
5230
+ fields: [
5231
+ {
5232
+ name: "nodes",
5233
+ flag: "nodes",
5234
+ type: "json",
5235
+ required: false
5236
+ },
5237
+ {
5238
+ name: "transitions",
5239
+ flag: "transitions",
5240
+ type: "json",
5241
+ required: false
5242
+ },
5243
+ {
5244
+ name: "sticky_notes",
5245
+ flag: "sticky_notes",
5246
+ type: "json",
5247
+ required: false
5248
+ }
5249
+ ]
4306
5250
  },
4307
5251
  {
4308
5252
  name: "inputs",
@@ -4316,14 +5260,60 @@ var COMMANDS = [
4316
5260
  flag: "settings",
4317
5261
  type: "json",
4318
5262
  required: true,
4319
- description: "Configuration settings for workflow execution"
5263
+ description: "Configuration settings for workflow execution",
5264
+ fields: [
5265
+ {
5266
+ name: "viewport_width",
5267
+ flag: "viewport_width",
5268
+ type: "integer",
5269
+ required: false,
5270
+ description: "Browser viewport width in pixels"
5271
+ },
5272
+ {
5273
+ name: "viewport_height",
5274
+ flag: "viewport_height",
5275
+ type: "integer",
5276
+ required: false,
5277
+ description: "Browser viewport height in pixels"
5278
+ },
5279
+ {
5280
+ name: "max_timeout_mins",
5281
+ flag: "max_timeout_mins",
5282
+ type: "integer",
5283
+ required: false,
5284
+ description: "Maximum timeout in minutes"
5285
+ },
5286
+ {
5287
+ name: "custom_environment_id",
5288
+ flag: "custom_environment_id",
5289
+ type: "string",
5290
+ required: false,
5291
+ description: "Custom environment executions of this workflow boot on: its environment type and snapshot replace the workflow's own environment, its profile rows restrict which profile an execution may use, and a kept-warm environment hands out a pre-warmed copy. On a new version, omit it to keep the environment of the workflow's latest version (its editable head, which can be newer than the published one), or send null to boot the workflow's own environment. On a new workflow, there is nothing to keep: omit it or send null for no custom environment."
5292
+ }
5293
+ ]
4320
5294
  },
4321
5295
  {
4322
5296
  name: "environmentTemplate",
4323
5297
  flag: "environment-template",
4324
5298
  type: "json",
4325
5299
  required: false,
4326
- description: "Optional environment template. On a new version, omit it to keep the template of the workflow's latest version (its editable head); on a new workflow, omitting it means a browser. Omits admin-only OS fields."
5300
+ description: "Optional environment template. On a new version, omit it to keep the template of the workflow's latest version (its editable head); on a new workflow, omitting it means a browser. Omits admin-only OS fields.",
5301
+ fields: [
5302
+ {
5303
+ name: "type",
5304
+ flag: "type",
5305
+ type: "string",
5306
+ required: false,
5307
+ description: "Type of execution environment",
5308
+ enum: ["browser", "os"]
5309
+ },
5310
+ {
5311
+ name: "config",
5312
+ flag: "config",
5313
+ type: "json",
5314
+ required: false
5315
+ }
5316
+ ]
4327
5317
  }
4328
5318
  ],
4329
5319
  files: [],
@@ -4390,14 +5380,16 @@ var COMMANDS = [
4390
5380
  flag: "inputs",
4391
5381
  type: "json",
4392
5382
  required: false,
4393
- description: "Inputs to be merged into the placeholders defined in prompts. Do not set together with inputVariables."
5383
+ description: "Inputs to be merged into the placeholders defined in prompts. Do not set together with inputVariables.",
5384
+ record: "json"
4394
5385
  },
4395
5386
  {
4396
5387
  name: "metadata",
4397
5388
  flag: "metadata",
4398
5389
  type: "json",
4399
5390
  required: false,
4400
- description: "Optional metadata key-value pairs for organizing and filtering executions"
5391
+ description: "Optional metadata key-value pairs for organizing and filtering executions",
5392
+ record: "string"
4401
5393
  },
4402
5394
  {
4403
5395
  name: "profileId",
@@ -4425,7 +5417,23 @@ var COMMANDS = [
4425
5417
  flag: "execution-options",
4426
5418
  type: "json",
4427
5419
  required: false,
4428
- description: "Per-execution runtime options that override or extend the workflow's default settings."
5420
+ description: "Per-execution runtime options that override or extend the workflow's default settings.",
5421
+ fields: [
5422
+ {
5423
+ name: "variantKey",
5424
+ flag: "variant-key",
5425
+ type: "string",
5426
+ required: false,
5427
+ description: "Identifies which variant this execution is for, scoping its shared files and scripts to a per-variant subdirectory under each node's shared folder. It does not change which workflow or version runs. Normalised to a filesystem-safe slug by the server. Requires the workflow to have `variant_mode` enabled, and a variant-mode workflow requires it on every execution."
5428
+ },
5429
+ {
5430
+ name: "softTimeoutMins",
5431
+ flag: "soft-timeout-mins",
5432
+ type: "integer",
5433
+ required: false,
5434
+ description: "Soft timeout in minutes. When the execution has been running longer than this value, a message is injected on every subsequent step urging the agent to wrap up and produce output. Must be greater than 0 and less than the agent's hard timeout (max_timeout_mins)."
5435
+ }
5436
+ ]
4429
5437
  },
4430
5438
  {
4431
5439
  name: "parentExecutionId",
@@ -4701,7 +5709,27 @@ var COMMANDS = [
4701
5709
  name: "graph",
4702
5710
  flag: "graph",
4703
5711
  type: "json",
4704
- required: true
5712
+ required: true,
5713
+ fields: [
5714
+ {
5715
+ name: "nodes",
5716
+ flag: "nodes",
5717
+ type: "json",
5718
+ required: false
5719
+ },
5720
+ {
5721
+ name: "transitions",
5722
+ flag: "transitions",
5723
+ type: "json",
5724
+ required: false
5725
+ },
5726
+ {
5727
+ name: "sticky_notes",
5728
+ flag: "sticky_notes",
5729
+ type: "json",
5730
+ required: false
5731
+ }
5732
+ ]
4705
5733
  },
4706
5734
  {
4707
5735
  name: "inputs",
@@ -4715,14 +5743,60 @@ var COMMANDS = [
4715
5743
  flag: "settings",
4716
5744
  type: "json",
4717
5745
  required: true,
4718
- description: "Configuration settings for workflow execution"
5746
+ description: "Configuration settings for workflow execution",
5747
+ fields: [
5748
+ {
5749
+ name: "viewport_width",
5750
+ flag: "viewport_width",
5751
+ type: "integer",
5752
+ required: false,
5753
+ description: "Browser viewport width in pixels"
5754
+ },
5755
+ {
5756
+ name: "viewport_height",
5757
+ flag: "viewport_height",
5758
+ type: "integer",
5759
+ required: false,
5760
+ description: "Browser viewport height in pixels"
5761
+ },
5762
+ {
5763
+ name: "max_timeout_mins",
5764
+ flag: "max_timeout_mins",
5765
+ type: "integer",
5766
+ required: false,
5767
+ description: "Maximum timeout in minutes"
5768
+ },
5769
+ {
5770
+ name: "custom_environment_id",
5771
+ flag: "custom_environment_id",
5772
+ type: "string",
5773
+ required: false,
5774
+ description: "Custom environment executions of this workflow boot on: its environment type and snapshot replace the workflow's own environment, its profile rows restrict which profile an execution may use, and a kept-warm environment hands out a pre-warmed copy. On a new version, omit it to keep the environment of the workflow's latest version (its editable head, which can be newer than the published one), or send null to boot the workflow's own environment. On a new workflow, there is nothing to keep: omit it or send null for no custom environment."
5775
+ }
5776
+ ]
4719
5777
  },
4720
5778
  {
4721
5779
  name: "environmentTemplate",
4722
5780
  flag: "environment-template",
4723
5781
  type: "json",
4724
5782
  required: false,
4725
- description: "Optional environment template. On a new version, omit it to keep the template of the workflow's latest version (its editable head); on a new workflow, omitting it means a browser. Omits admin-only OS fields."
5783
+ description: "Optional environment template. On a new version, omit it to keep the template of the workflow's latest version (its editable head); on a new workflow, omitting it means a browser. Omits admin-only OS fields.",
5784
+ fields: [
5785
+ {
5786
+ name: "type",
5787
+ flag: "type",
5788
+ type: "string",
5789
+ required: false,
5790
+ description: "Type of execution environment",
5791
+ enum: ["browser", "os"]
5792
+ },
5793
+ {
5794
+ name: "config",
5795
+ flag: "config",
5796
+ type: "json",
5797
+ required: false
5798
+ }
5799
+ ]
4726
5800
  }
4727
5801
  ],
4728
5802
  files: [],
@@ -4935,6 +6009,23 @@ var GLOBAL_FLAGS = [
4935
6009
  ["--output <file>", "Write a downloaded file here, not to stdout."],
4936
6010
  ["-h, --help", "Show help."]
4937
6011
  ];
6012
+ function childFlags(option2, prefix = option2.flag) {
6013
+ if (option2.record) {
6014
+ return [
6015
+ {
6016
+ name: option2.name,
6017
+ flag: `${prefix}.<key>`,
6018
+ type: option2.record,
6019
+ required: false,
6020
+ description: "One entry. The key is sent as written."
6021
+ }
6022
+ ];
6023
+ }
6024
+ return (option2.fields ?? []).flatMap((child) => {
6025
+ const flag2 = `${prefix}.${child.flag}`;
6026
+ return [{ ...child, flag: flag2 }, ...childFlags(child, flag2)];
6027
+ });
6028
+ }
4938
6029
 
4939
6030
  // src/program.ts
4940
6031
  var DOTTED = /^--([a-z0-9-]+\.[a-z0-9.-]+)(?:=(.*))?$/;
@@ -4951,7 +6042,7 @@ function optionText(option2) {
4951
6042
  }
4952
6043
  function splitDotted(argv) {
4953
6044
  const rest = [];
4954
- const dotted = /* @__PURE__ */ new Map();
6045
+ const dotted2 = /* @__PURE__ */ new Map();
4955
6046
  for (let i = 0; i < argv.length; i++) {
4956
6047
  const match = DOTTED.exec(argv[i]);
4957
6048
  if (!match) {
@@ -4961,9 +6052,9 @@ function splitDotted(argv) {
4961
6052
  const value2 = match[2] ?? argv[++i];
4962
6053
  if (value2 === void 0)
4963
6054
  throw new UsageError(`--${match[1]} needs a value`);
4964
- dotted.set(match[1], [...dotted.get(match[1]) ?? [], value2]);
6055
+ dotted2.set(match[1], [...dotted2.get(match[1]) ?? [], value2]);
4965
6056
  }
4966
- return { argv: rest, dotted };
6057
+ return { argv: rest, dotted: dotted2 };
4967
6058
  }
4968
6059
  function group(parent, name, groups, path) {
4969
6060
  const existing = groups.get(path);
@@ -4987,6 +6078,10 @@ function leafOptions(leaf, command) {
4987
6078
  );
4988
6079
  if (option2.negatable)
4989
6080
  leaf.option(`--no-${option2.flag}`, `Skip ${option2.flag}.`);
6081
+ for (const child of childFlags(option2)) {
6082
+ const placeholder2 = child.enum ? child.enum.join("|") : child.type.replace("[]", "");
6083
+ leaf.option(`--${child.flag} <${placeholder2}>`, optionText(child));
6084
+ }
4990
6085
  }
4991
6086
  for (const file of command.body?.files ?? []) {
4992
6087
  leaf.option(`--${file} <path>`, "File to upload. Repeatable.", collect);
@@ -5002,10 +6097,10 @@ function leafOptions(leaf, command) {
5002
6097
  "The pulled head folder to push. Defaults to the current folder."
5003
6098
  );
5004
6099
  }
5005
- function toParsed(leaf, positionals, dotted) {
6100
+ function toParsed(leaf, positionals, dotted2) {
5006
6101
  const globals = leaf.optsWithGlobals();
5007
6102
  const own = leaf.opts();
5008
- const flags = new Map(dotted);
6103
+ const flags = new Map(dotted2);
5009
6104
  for (const option2 of leaf.options) {
5010
6105
  const flag2 = option2.long?.replace(/^--(no-)?/, "");
5011
6106
  const value2 = own[option2.attributeName()];
@@ -5021,7 +6116,7 @@ function toParsed(leaf, positionals, dotted) {
5021
6116
  output: globals.output
5022
6117
  };
5023
6118
  }
5024
- function defineCommands(root, options, dotted = /* @__PURE__ */ new Map(), onInvocation = () => void 0) {
6119
+ function defineCommands(root, options, dotted2 = /* @__PURE__ */ new Map(), onInvocation = () => void 0) {
5025
6120
  if (options.description) root.description(options.description);
5026
6121
  if (options.version)
5027
6122
  root.addHelpText(
@@ -5090,7 +6185,7 @@ ${notes.join("\n")}`);
5090
6185
  `expected ${expected}, got ${cmd.args.length} argument(s)`
5091
6186
  );
5092
6187
  }
5093
- const unknownDotted = [...dotted.keys()].filter(
6188
+ const unknownDotted = [...dotted2.keys()].filter(
5094
6189
  (flag2) => !(command.body?.fields ?? []).some(
5095
6190
  (f) => flag2.startsWith(`${f.flag}.`)
5096
6191
  )
@@ -5103,7 +6198,7 @@ ${notes.join("\n")}`);
5103
6198
  onInvocation({
5104
6199
  kind: "command",
5105
6200
  command,
5106
- parsed: toParsed(cmd, positionals, dotted)
6201
+ parsed: toParsed(cmd, positionals, dotted2)
5107
6202
  });
5108
6203
  });
5109
6204
  }
@@ -5122,12 +6217,12 @@ async function parseInvocation(argv, options) {
5122
6217
  stderr: ""
5123
6218
  };
5124
6219
  }
5125
- const { argv: rest, dotted } = splitDotted(argv);
6220
+ const { argv: rest, dotted: dotted2 } = splitDotted(argv);
5126
6221
  const root = new Command("asteroid").exitOverride().helpCommand(false).configureOutput({
5127
6222
  writeOut: (text2) => stdout += text2,
5128
6223
  writeErr: (text2) => stderr += text2
5129
6224
  });
5130
- defineCommands(root, options, dotted, (invocation) => {
6225
+ defineCommands(root, options, dotted2, (invocation) => {
5131
6226
  result = invocation;
5132
6227
  });
5133
6228
  try {
@@ -5232,6 +6327,41 @@ function setPath(target, path, value2) {
5232
6327
  }
5233
6328
  node[path.at(-1)] = value2;
5234
6329
  }
6330
+ async function dotted(field, segments, flag2, raws, io) {
6331
+ const path = [];
6332
+ let option2 = field;
6333
+ for (const [i, segment] of segments.entries()) {
6334
+ if (option2?.record) {
6335
+ const key = segments.slice(i).join(".");
6336
+ const entry = { ...option2, flag: flag2, type: option2.record };
6337
+ delete entry.enum;
6338
+ return [
6339
+ [...path, key],
6340
+ entry.type === "json" ? loose(raws.at(-1)) : value(entry, raws)
6341
+ ];
6342
+ }
6343
+ if (option2?.fields) {
6344
+ const child = option2.fields.find(
6345
+ (f) => f.flag === segment
6346
+ );
6347
+ if (!child) throw new UsageError(`unknown flag: --${flag2}`);
6348
+ path.push(child.name);
6349
+ option2 = child;
6350
+ continue;
6351
+ }
6352
+ if (option2 && option2.type !== "json") {
6353
+ throw new UsageError(`unknown flag: --${flag2}`);
6354
+ }
6355
+ path.push(camel(segment));
6356
+ option2 = void 0;
6357
+ }
6358
+ if (!option2) return [path, loose(raws.at(-1))];
6359
+ if (option2.fields || option2.record) {
6360
+ throw new UsageError(`--${flag2} needs a field, as --${flag2}.<name>`);
6361
+ }
6362
+ const inputs = option2.type === "json" ? await Promise.all(raws.map((raw) => readInput(raw, io))) : raws;
6363
+ return [path, value({ ...option2, flag: flag2 }, inputs)];
6364
+ }
5235
6365
  async function buildRequest(command, input, context = {}) {
5236
6366
  const io = context.io ?? nodeReader;
5237
6367
  const parsed = await resolveInputs(command, input, io);
@@ -5318,7 +6448,8 @@ async function buildRequest(command, input, context = {}) {
5318
6448
  flags.delete(flag2);
5319
6449
  const current = json[field.name];
5320
6450
  json[field.name] = typeof current === "object" && current !== null ? current : {};
5321
- setPath(json, [field.name, ...rest.map(camel)], loose(raws.at(-1)));
6451
+ const [path2, value2] = await dotted(field, rest, flag2, raws, io);
6452
+ setPath(json, [field.name, ...path2], value2);
5322
6453
  }
5323
6454
  rejectUnknown(flags);
5324
6455
  delete json.organizationId;