@asteroidai/cli 1.9.30 → 1.9.36

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 +1342 -44
  2. package/dist/core.js +1341 -43
  3. package/package.json +1 -1
package/dist/core.js CHANGED
@@ -161,6 +161,363 @@ var COMMANDS = [
161
161
  readOnly: true,
162
162
  destructive: false
163
163
  },
164
+ {
165
+ command: "custom-environment create",
166
+ tool: "custom_environments_create",
167
+ title: "Create custom environment",
168
+ description: "Create a custom environment: a saved machine a workflow boots on. Set a unique `name` and a `base`: a browser, or a Linux or Windows OS environment. Optionally whitelist `profiles`, override boot `settings`, and keep copies ready with `warmPool` or fresh logins with `warmCache` (not both). Bind it to a workflow with the version's `settings.custom_environment_id`.",
169
+ method: "POST",
170
+ path: "/agents/v2/custom-environments",
171
+ args: [],
172
+ query: [],
173
+ binary: false,
174
+ readOnly: false,
175
+ destructive: false,
176
+ body: {
177
+ required: true,
178
+ contentType: "application/json",
179
+ fields: [
180
+ {
181
+ name: "name",
182
+ flag: "name",
183
+ type: "string",
184
+ required: true,
185
+ description: "Name, unique within the organisation"
186
+ },
187
+ {
188
+ name: "base",
189
+ flag: "base",
190
+ type: "json",
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.",
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
+ ]
209
+ },
210
+ {
211
+ name: "profiles",
212
+ flag: "profiles",
213
+ type: "json",
214
+ required: true,
215
+ description: "Ordered whitelist of the profile sources an execution bound to this environment may run as. Each row gets its own warm copies. With one row, a trigger that names neither a profile nor a pool defaults to that row; with several rows, the trigger must name an allowed profile, a member of an allowed pool, or an allowed pool. Empty means any profile or pool may be named, or none."
216
+ },
217
+ {
218
+ name: "settings",
219
+ flag: "settings",
220
+ type: "json",
221
+ required: false,
222
+ description: "Settings the environment boots with. Must match the base type. Absent inherits from the agent profile. A change applies to environments booted afterwards; warm members already booted keep the settings they booted with."
223
+ },
224
+ {
225
+ name: "warmPool",
226
+ flag: "warm-pool",
227
+ type: "json",
228
+ required: false,
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
+ ]
329
+ },
330
+ {
331
+ name: "warmCache",
332
+ flag: "warm-cache",
333
+ type: "json",
334
+ required: false,
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
+ ]
405
+ },
406
+ {
407
+ name: "dedicated",
408
+ flag: "dedicated",
409
+ type: "json",
410
+ required: false,
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
+ ]
495
+ }
496
+ ],
497
+ files: [],
498
+ credentialOrganization: true
499
+ }
500
+ },
501
+ {
502
+ command: "custom-environment delete",
503
+ tool: "custom_environment_delete",
504
+ title: "Delete custom environment",
505
+ description: "Delete a custom environment. Workflows bound to it through `settings.custom_environment_id` can no longer boot. Refused while warm members exist: set `warmPool.targetSize` to 0 first and wait for them to retire.",
506
+ method: "DELETE",
507
+ path: "/agents/v2/custom-environments/{customEnvironmentId}",
508
+ args: [
509
+ {
510
+ name: "customEnvironmentId",
511
+ flag: "custom-environment-id",
512
+ type: "string",
513
+ required: true
514
+ }
515
+ ],
516
+ query: [],
517
+ binary: false,
518
+ readOnly: false,
519
+ destructive: true
520
+ },
164
521
  {
165
522
  command: "custom-environment get",
166
523
  tool: "custom_environment_get",
@@ -185,7 +542,7 @@ var COMMANDS = [
185
542
  command: "custom-environment list",
186
543
  tool: "custom_environments_list",
187
544
  title: "List custom environments",
188
- description: "List an organization's custom environments: the saved machines a workflow boots on, each with its environment type, snapshot, networking, allowed profiles and warm pool. Use an environment's `id` as a workflow version's `settings.custom_environment_id`. Users create and edit custom environments on the platform's Environments page; no tool changes them.",
545
+ description: "List an organization's custom environments: the saved machines a workflow boots on, each with its environment type, snapshot, networking, allowed profiles and warm pool. Use an environment's `id` as a workflow version's `settings.custom_environment_id`.",
189
546
  method: "GET",
190
547
  path: "/agents/v2/custom-environments",
191
548
  args: [],
@@ -194,6 +551,370 @@ var COMMANDS = [
194
551
  readOnly: true,
195
552
  destructive: false
196
553
  },
554
+ {
555
+ command: "custom-environment member list",
556
+ tool: "custom_environment_members_list",
557
+ title: "List custom environment members",
558
+ description: "List a custom environment's warm pool members: each pre-warmed environment's ID, state (warming, available, retiring), profile, attached executions and keep-alive health. Empty when the environment is not kept warm.",
559
+ method: "GET",
560
+ path: "/agents/v2/custom-environments/{customEnvironmentId}/members",
561
+ args: [
562
+ {
563
+ name: "customEnvironmentId",
564
+ flag: "custom-environment-id",
565
+ type: "string",
566
+ required: true
567
+ }
568
+ ],
569
+ query: [],
570
+ binary: false,
571
+ readOnly: true,
572
+ destructive: false
573
+ },
574
+ {
575
+ command: "custom-environment update",
576
+ tool: "custom_environment_update",
577
+ title: "Update custom environment",
578
+ description: "Replace a custom environment's configuration. Send the full config, as `custom_environment_get` returns it: a field left out is cleared, except proxy passwords and a managed proxy's provider, which keep their stored values. Changes apply to environments booted afterwards. Turning keep-warm off is refused while members exist: set `warmPool.targetSize` to 0 first and wait for them to retire.",
579
+ method: "PATCH",
580
+ path: "/agents/v2/custom-environments/{customEnvironmentId}",
581
+ args: [
582
+ {
583
+ name: "customEnvironmentId",
584
+ flag: "custom-environment-id",
585
+ type: "string",
586
+ required: true
587
+ }
588
+ ],
589
+ query: [],
590
+ binary: false,
591
+ readOnly: false,
592
+ destructive: false,
593
+ body: {
594
+ required: true,
595
+ contentType: "application/json",
596
+ fields: [
597
+ {
598
+ name: "name",
599
+ flag: "name",
600
+ type: "string",
601
+ required: true,
602
+ description: "Name, unique within the organisation"
603
+ },
604
+ {
605
+ name: "base",
606
+ flag: "base",
607
+ type: "json",
608
+ required: true,
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
+ ]
626
+ },
627
+ {
628
+ name: "profiles",
629
+ flag: "profiles",
630
+ type: "json",
631
+ required: true,
632
+ description: "Ordered whitelist of the profile sources an execution bound to this environment may run as. Each row gets its own warm copies. With one row, a trigger that names neither a profile nor a pool defaults to that row; with several rows, the trigger must name an allowed profile, a member of an allowed pool, or an allowed pool. Empty means any profile or pool may be named, or none."
633
+ },
634
+ {
635
+ name: "settings",
636
+ flag: "settings",
637
+ type: "json",
638
+ required: false,
639
+ description: "Settings the environment boots with. Must match the base type. Absent inherits from the agent profile. A change applies to environments booted afterwards; warm members already booted keep the settings they booted with."
640
+ },
641
+ {
642
+ name: "warmPool",
643
+ flag: "warm-pool",
644
+ type: "json",
645
+ required: false,
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
+ ]
746
+ },
747
+ {
748
+ name: "warmCache",
749
+ flag: "warm-cache",
750
+ type: "json",
751
+ required: false,
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
+ ]
822
+ },
823
+ {
824
+ name: "dedicated",
825
+ flag: "dedicated",
826
+ type: "json",
827
+ required: false,
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
+ ]
912
+ }
913
+ ],
914
+ files: [],
915
+ credentialOrganization: false
916
+ }
917
+ },
197
918
  {
198
919
  command: "docs search",
199
920
  tool: "search_docs",
@@ -1040,7 +1761,8 @@ var COMMANDS = [
1040
1761
  flag: "inputs",
1041
1762
  type: "json",
1042
1763
  required: false,
1043
- 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"
1044
1766
  },
1045
1767
  {
1046
1768
  name: "profileId",
@@ -1903,21 +2625,69 @@ var COMMANDS = [
1903
2625
  name: "inputs",
1904
2626
  flag: "inputs",
1905
2627
  type: "json",
1906
- required: false
2628
+ required: false,
2629
+ record: "json"
1907
2630
  },
1908
2631
  {
1909
2632
  name: "batchSource",
1910
2633
  flag: "batch-source",
1911
2634
  type: "json",
1912
2635
  required: false,
1913
- 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
+ ]
1914
2668
  },
1915
2669
  {
1916
2670
  name: "executionOptions",
1917
2671
  flag: "execution-options",
1918
2672
  type: "json",
1919
2673
  required: false,
1920
- 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
+ ]
1921
2691
  }
1922
2692
  ],
1923
2693
  files: [],
@@ -2098,14 +2868,46 @@ var COMMANDS = [
2098
2868
  name: "inputs",
2099
2869
  flag: "inputs",
2100
2870
  type: "json",
2101
- required: false
2871
+ required: false,
2872
+ record: "json"
2102
2873
  },
2103
2874
  {
2104
2875
  name: "batchSource",
2105
2876
  flag: "batch-source",
2106
2877
  type: "json",
2107
2878
  required: false,
2108
- 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
+ ]
2109
2911
  },
2110
2912
  {
2111
2913
  name: "clearBatchSource",
@@ -2126,7 +2928,23 @@ var COMMANDS = [
2126
2928
  flag: "execution-options",
2127
2929
  type: "json",
2128
2930
  required: false,
2129
- 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
+ ]
2130
2948
  }
2131
2949
  ],
2132
2950
  files: [],
@@ -2195,14 +3013,16 @@ var COMMANDS = [
2195
3013
  name: "inputs",
2196
3014
  flag: "inputs",
2197
3015
  type: "json",
2198
- required: false
3016
+ required: false,
3017
+ record: "json"
2199
3018
  },
2200
3019
  {
2201
3020
  name: "metadata",
2202
3021
  flag: "metadata",
2203
3022
  type: "json",
2204
3023
  required: false,
2205
- description: "String key/value pairs to label and filter executions."
3024
+ description: "String key/value pairs to label and filter executions.",
3025
+ record: "string"
2206
3026
  },
2207
3027
  {
2208
3028
  name: "executeAt",
@@ -2216,7 +3036,23 @@ var COMMANDS = [
2216
3036
  flag: "execution-options",
2217
3037
  type: "json",
2218
3038
  required: false,
2219
- 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
+ ]
2220
3056
  }
2221
3057
  ],
2222
3058
  files: [],
@@ -2347,7 +3183,8 @@ var COMMANDS = [
2347
3183
  name: "schema",
2348
3184
  flag: "schema",
2349
3185
  type: "json",
2350
- required: true
3186
+ required: true,
3187
+ record: "json"
2351
3188
  }
2352
3189
  ],
2353
3190
  files: [],
@@ -2465,7 +3302,51 @@ var COMMANDS = [
2465
3302
  flag: "field",
2466
3303
  type: "json",
2467
3304
  required: true,
2468
- 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
+ ]
2469
3350
  },
2470
3351
  {
2471
3352
  name: "value",
@@ -3313,7 +4194,115 @@ var COMMANDS = [
3313
4194
  flag: "version",
3314
4195
  type: "json",
3315
4196
  required: false,
3316
- description: "The first version of the workflow. Omit it to start from a blank workflow with a single start node."
4197
+ description: "The first version of the workflow. Omit it to start from a blank workflow with a single start node.",
4198
+ fields: [
4199
+ {
4200
+ name: "parentId",
4201
+ flag: "parent-id",
4202
+ type: "string",
4203
+ required: false,
4204
+ description: "Optional parent workflow ID to derive from"
4205
+ },
4206
+ {
4207
+ name: "rules",
4208
+ flag: "rules",
4209
+ type: "string",
4210
+ required: false
4211
+ },
4212
+ {
4213
+ name: "graph",
4214
+ flag: "graph",
4215
+ type: "json",
4216
+ required: false,
4217
+ fields: [
4218
+ {
4219
+ name: "nodes",
4220
+ flag: "nodes",
4221
+ type: "json",
4222
+ required: false
4223
+ },
4224
+ {
4225
+ name: "transitions",
4226
+ flag: "transitions",
4227
+ type: "json",
4228
+ required: false
4229
+ },
4230
+ {
4231
+ name: "sticky_notes",
4232
+ flag: "sticky_notes",
4233
+ type: "json",
4234
+ required: false
4235
+ }
4236
+ ]
4237
+ },
4238
+ {
4239
+ name: "inputs",
4240
+ flag: "inputs",
4241
+ type: "json",
4242
+ required: false,
4243
+ description: "Typed input definitions for this workflow. Names referenced in prompts but omitted here default to optional strings."
4244
+ },
4245
+ {
4246
+ name: "settings",
4247
+ flag: "settings",
4248
+ type: "json",
4249
+ required: false,
4250
+ description: "Configuration settings for workflow execution",
4251
+ fields: [
4252
+ {
4253
+ name: "viewport_width",
4254
+ flag: "viewport_width",
4255
+ type: "integer",
4256
+ required: false,
4257
+ description: "Browser viewport width in pixels"
4258
+ },
4259
+ {
4260
+ name: "viewport_height",
4261
+ flag: "viewport_height",
4262
+ type: "integer",
4263
+ required: false,
4264
+ description: "Browser viewport height in pixels"
4265
+ },
4266
+ {
4267
+ name: "max_timeout_mins",
4268
+ flag: "max_timeout_mins",
4269
+ type: "integer",
4270
+ required: false,
4271
+ description: "Maximum timeout in minutes"
4272
+ },
4273
+ {
4274
+ name: "custom_environment_id",
4275
+ flag: "custom_environment_id",
4276
+ type: "string",
4277
+ required: false,
4278
+ 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."
4279
+ }
4280
+ ]
4281
+ },
4282
+ {
4283
+ name: "environmentTemplate",
4284
+ flag: "environment-template",
4285
+ type: "json",
4286
+ required: false,
4287
+ 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.",
4288
+ fields: [
4289
+ {
4290
+ name: "type",
4291
+ flag: "type",
4292
+ type: "string",
4293
+ required: false,
4294
+ description: "Type of execution environment",
4295
+ enum: ["browser", "os"]
4296
+ },
4297
+ {
4298
+ name: "config",
4299
+ flag: "config",
4300
+ type: "json",
4301
+ required: false
4302
+ }
4303
+ ]
4304
+ }
4305
+ ]
3317
4306
  }
3318
4307
  ],
3319
4308
  files: [],
@@ -3417,7 +4406,8 @@ var COMMANDS = [
3417
4406
  flag: "inputs",
3418
4407
  type: "json",
3419
4408
  required: false,
3420
- description: "Inputs to be merged into the placeholders defined in prompts"
4409
+ description: "Inputs to be merged into the placeholders defined in prompts",
4410
+ record: "json"
3421
4411
  },
3422
4412
  {
3423
4413
  name: "tempFiles",
@@ -3431,7 +4421,8 @@ var COMMANDS = [
3431
4421
  flag: "metadata",
3432
4422
  type: "json",
3433
4423
  required: false,
3434
- description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions"
4424
+ description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions",
4425
+ record: "string"
3435
4426
  },
3436
4427
  {
3437
4428
  name: "version",
@@ -3452,7 +4443,23 @@ var COMMANDS = [
3452
4443
  flag: "execution-options",
3453
4444
  type: "json",
3454
4445
  required: false,
3455
- description: "Per-execution runtime options that override or extend the workflow's default settings."
4446
+ description: "Per-execution runtime options that override or extend the workflow's default settings.",
4447
+ fields: [
4448
+ {
4449
+ name: "variantKey",
4450
+ flag: "variant-key",
4451
+ type: "string",
4452
+ required: false,
4453
+ 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."
4454
+ },
4455
+ {
4456
+ name: "softTimeoutMins",
4457
+ flag: "soft-timeout-mins",
4458
+ type: "integer",
4459
+ required: false,
4460
+ 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)."
4461
+ }
4462
+ ]
3456
4463
  },
3457
4464
  {
3458
4465
  name: "onCapacityLimit",
@@ -3510,7 +4517,8 @@ var COMMANDS = [
3510
4517
  flag: "inputs",
3511
4518
  type: "json",
3512
4519
  required: false,
3513
- description: "Inputs to be merged into the placeholders defined in prompts"
4520
+ description: "Inputs to be merged into the placeholders defined in prompts",
4521
+ record: "json"
3514
4522
  },
3515
4523
  {
3516
4524
  name: "tempFiles",
@@ -3524,7 +4532,8 @@ var COMMANDS = [
3524
4532
  flag: "metadata",
3525
4533
  type: "json",
3526
4534
  required: false,
3527
- description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions"
4535
+ description: "Optional metadata key-value pairs (string keys and string values) for organizing and filtering executions",
4536
+ record: "string"
3528
4537
  },
3529
4538
  {
3530
4539
  name: "version",
@@ -3545,7 +4554,23 @@ var COMMANDS = [
3545
4554
  flag: "execution-options",
3546
4555
  type: "json",
3547
4556
  required: false,
3548
- description: "Per-execution runtime options that override or extend the workflow's default settings."
4557
+ description: "Per-execution runtime options that override or extend the workflow's default settings.",
4558
+ fields: [
4559
+ {
4560
+ name: "variantKey",
4561
+ flag: "variant-key",
4562
+ type: "string",
4563
+ required: false,
4564
+ 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."
4565
+ },
4566
+ {
4567
+ name: "softTimeoutMins",
4568
+ flag: "soft-timeout-mins",
4569
+ type: "integer",
4570
+ required: false,
4571
+ 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)."
4572
+ }
4573
+ ]
3549
4574
  },
3550
4575
  {
3551
4576
  name: "onCapacityLimit",
@@ -4047,7 +5072,27 @@ var COMMANDS = [
4047
5072
  name: "graph",
4048
5073
  flag: "graph",
4049
5074
  type: "json",
4050
- required: true
5075
+ required: true,
5076
+ fields: [
5077
+ {
5078
+ name: "nodes",
5079
+ flag: "nodes",
5080
+ type: "json",
5081
+ required: false
5082
+ },
5083
+ {
5084
+ name: "transitions",
5085
+ flag: "transitions",
5086
+ type: "json",
5087
+ required: false
5088
+ },
5089
+ {
5090
+ name: "sticky_notes",
5091
+ flag: "sticky_notes",
5092
+ type: "json",
5093
+ required: false
5094
+ }
5095
+ ]
4051
5096
  },
4052
5097
  {
4053
5098
  name: "inputs",
@@ -4061,14 +5106,60 @@ var COMMANDS = [
4061
5106
  flag: "settings",
4062
5107
  type: "json",
4063
5108
  required: true,
4064
- description: "Configuration settings for workflow execution"
5109
+ description: "Configuration settings for workflow execution",
5110
+ fields: [
5111
+ {
5112
+ name: "viewport_width",
5113
+ flag: "viewport_width",
5114
+ type: "integer",
5115
+ required: false,
5116
+ description: "Browser viewport width in pixels"
5117
+ },
5118
+ {
5119
+ name: "viewport_height",
5120
+ flag: "viewport_height",
5121
+ type: "integer",
5122
+ required: false,
5123
+ description: "Browser viewport height in pixels"
5124
+ },
5125
+ {
5126
+ name: "max_timeout_mins",
5127
+ flag: "max_timeout_mins",
5128
+ type: "integer",
5129
+ required: false,
5130
+ description: "Maximum timeout in minutes"
5131
+ },
5132
+ {
5133
+ name: "custom_environment_id",
5134
+ flag: "custom_environment_id",
5135
+ type: "string",
5136
+ required: false,
5137
+ 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."
5138
+ }
5139
+ ]
4065
5140
  },
4066
5141
  {
4067
5142
  name: "environmentTemplate",
4068
5143
  flag: "environment-template",
4069
5144
  type: "json",
4070
5145
  required: false,
4071
- 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."
5146
+ 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.",
5147
+ fields: [
5148
+ {
5149
+ name: "type",
5150
+ flag: "type",
5151
+ type: "string",
5152
+ required: false,
5153
+ description: "Type of execution environment",
5154
+ enum: ["browser", "os"]
5155
+ },
5156
+ {
5157
+ name: "config",
5158
+ flag: "config",
5159
+ type: "json",
5160
+ required: false
5161
+ }
5162
+ ]
4072
5163
  }
4073
5164
  ],
4074
5165
  files: [],
@@ -4115,7 +5206,27 @@ var COMMANDS = [
4115
5206
  name: "graph",
4116
5207
  flag: "graph",
4117
5208
  type: "json",
4118
- required: true
5209
+ required: true,
5210
+ fields: [
5211
+ {
5212
+ name: "nodes",
5213
+ flag: "nodes",
5214
+ type: "json",
5215
+ required: false
5216
+ },
5217
+ {
5218
+ name: "transitions",
5219
+ flag: "transitions",
5220
+ type: "json",
5221
+ required: false
5222
+ },
5223
+ {
5224
+ name: "sticky_notes",
5225
+ flag: "sticky_notes",
5226
+ type: "json",
5227
+ required: false
5228
+ }
5229
+ ]
4119
5230
  },
4120
5231
  {
4121
5232
  name: "inputs",
@@ -4129,14 +5240,60 @@ var COMMANDS = [
4129
5240
  flag: "settings",
4130
5241
  type: "json",
4131
5242
  required: true,
4132
- description: "Configuration settings for workflow execution"
5243
+ description: "Configuration settings for workflow execution",
5244
+ fields: [
5245
+ {
5246
+ name: "viewport_width",
5247
+ flag: "viewport_width",
5248
+ type: "integer",
5249
+ required: false,
5250
+ description: "Browser viewport width in pixels"
5251
+ },
5252
+ {
5253
+ name: "viewport_height",
5254
+ flag: "viewport_height",
5255
+ type: "integer",
5256
+ required: false,
5257
+ description: "Browser viewport height in pixels"
5258
+ },
5259
+ {
5260
+ name: "max_timeout_mins",
5261
+ flag: "max_timeout_mins",
5262
+ type: "integer",
5263
+ required: false,
5264
+ description: "Maximum timeout in minutes"
5265
+ },
5266
+ {
5267
+ name: "custom_environment_id",
5268
+ flag: "custom_environment_id",
5269
+ type: "string",
5270
+ required: false,
5271
+ 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."
5272
+ }
5273
+ ]
4133
5274
  },
4134
5275
  {
4135
5276
  name: "environmentTemplate",
4136
5277
  flag: "environment-template",
4137
5278
  type: "json",
4138
5279
  required: false,
4139
- 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."
5280
+ 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.",
5281
+ fields: [
5282
+ {
5283
+ name: "type",
5284
+ flag: "type",
5285
+ type: "string",
5286
+ required: false,
5287
+ description: "Type of execution environment",
5288
+ enum: ["browser", "os"]
5289
+ },
5290
+ {
5291
+ name: "config",
5292
+ flag: "config",
5293
+ type: "json",
5294
+ required: false
5295
+ }
5296
+ ]
4140
5297
  }
4141
5298
  ],
4142
5299
  files: [],
@@ -4203,14 +5360,16 @@ var COMMANDS = [
4203
5360
  flag: "inputs",
4204
5361
  type: "json",
4205
5362
  required: false,
4206
- description: "Inputs to be merged into the placeholders defined in prompts. Do not set together with inputVariables."
5363
+ description: "Inputs to be merged into the placeholders defined in prompts. Do not set together with inputVariables.",
5364
+ record: "json"
4207
5365
  },
4208
5366
  {
4209
5367
  name: "metadata",
4210
5368
  flag: "metadata",
4211
5369
  type: "json",
4212
5370
  required: false,
4213
- description: "Optional metadata key-value pairs for organizing and filtering executions"
5371
+ description: "Optional metadata key-value pairs for organizing and filtering executions",
5372
+ record: "string"
4214
5373
  },
4215
5374
  {
4216
5375
  name: "profileId",
@@ -4238,7 +5397,23 @@ var COMMANDS = [
4238
5397
  flag: "execution-options",
4239
5398
  type: "json",
4240
5399
  required: false,
4241
- description: "Per-execution runtime options that override or extend the workflow's default settings."
5400
+ description: "Per-execution runtime options that override or extend the workflow's default settings.",
5401
+ fields: [
5402
+ {
5403
+ name: "variantKey",
5404
+ flag: "variant-key",
5405
+ type: "string",
5406
+ required: false,
5407
+ 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."
5408
+ },
5409
+ {
5410
+ name: "softTimeoutMins",
5411
+ flag: "soft-timeout-mins",
5412
+ type: "integer",
5413
+ required: false,
5414
+ 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)."
5415
+ }
5416
+ ]
4242
5417
  },
4243
5418
  {
4244
5419
  name: "parentExecutionId",
@@ -4514,7 +5689,27 @@ var COMMANDS = [
4514
5689
  name: "graph",
4515
5690
  flag: "graph",
4516
5691
  type: "json",
4517
- required: true
5692
+ required: true,
5693
+ fields: [
5694
+ {
5695
+ name: "nodes",
5696
+ flag: "nodes",
5697
+ type: "json",
5698
+ required: false
5699
+ },
5700
+ {
5701
+ name: "transitions",
5702
+ flag: "transitions",
5703
+ type: "json",
5704
+ required: false
5705
+ },
5706
+ {
5707
+ name: "sticky_notes",
5708
+ flag: "sticky_notes",
5709
+ type: "json",
5710
+ required: false
5711
+ }
5712
+ ]
4518
5713
  },
4519
5714
  {
4520
5715
  name: "inputs",
@@ -4528,14 +5723,60 @@ var COMMANDS = [
4528
5723
  flag: "settings",
4529
5724
  type: "json",
4530
5725
  required: true,
4531
- description: "Configuration settings for workflow execution"
5726
+ description: "Configuration settings for workflow execution",
5727
+ fields: [
5728
+ {
5729
+ name: "viewport_width",
5730
+ flag: "viewport_width",
5731
+ type: "integer",
5732
+ required: false,
5733
+ description: "Browser viewport width in pixels"
5734
+ },
5735
+ {
5736
+ name: "viewport_height",
5737
+ flag: "viewport_height",
5738
+ type: "integer",
5739
+ required: false,
5740
+ description: "Browser viewport height in pixels"
5741
+ },
5742
+ {
5743
+ name: "max_timeout_mins",
5744
+ flag: "max_timeout_mins",
5745
+ type: "integer",
5746
+ required: false,
5747
+ description: "Maximum timeout in minutes"
5748
+ },
5749
+ {
5750
+ name: "custom_environment_id",
5751
+ flag: "custom_environment_id",
5752
+ type: "string",
5753
+ required: false,
5754
+ 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."
5755
+ }
5756
+ ]
4532
5757
  },
4533
5758
  {
4534
5759
  name: "environmentTemplate",
4535
5760
  flag: "environment-template",
4536
5761
  type: "json",
4537
5762
  required: false,
4538
- 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."
5763
+ 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.",
5764
+ fields: [
5765
+ {
5766
+ name: "type",
5767
+ flag: "type",
5768
+ type: "string",
5769
+ required: false,
5770
+ description: "Type of execution environment",
5771
+ enum: ["browser", "os"]
5772
+ },
5773
+ {
5774
+ name: "config",
5775
+ flag: "config",
5776
+ type: "json",
5777
+ required: false
5778
+ }
5779
+ ]
4539
5780
  }
4540
5781
  ],
4541
5782
  files: [],
@@ -4748,6 +5989,23 @@ var GLOBAL_FLAGS = [
4748
5989
  ["--output <file>", "Write a downloaded file here, not to stdout."],
4749
5990
  ["-h, --help", "Show help."]
4750
5991
  ];
5992
+ function childFlags(option2, prefix = option2.flag) {
5993
+ if (option2.record) {
5994
+ return [
5995
+ {
5996
+ name: option2.name,
5997
+ flag: `${prefix}.<key>`,
5998
+ type: option2.record,
5999
+ required: false,
6000
+ description: "One entry. The key is sent as written."
6001
+ }
6002
+ ];
6003
+ }
6004
+ return (option2.fields ?? []).flatMap((child) => {
6005
+ const flag2 = `${prefix}.${child.flag}`;
6006
+ return [{ ...child, flag: flag2 }, ...childFlags(child, flag2)];
6007
+ });
6008
+ }
4751
6009
 
4752
6010
  // src/program.ts
4753
6011
  var DOTTED = /^--([a-z0-9-]+\.[a-z0-9.-]+)(?:=(.*))?$/;
@@ -4764,7 +6022,7 @@ function optionText(option2) {
4764
6022
  }
4765
6023
  function splitDotted(argv) {
4766
6024
  const rest = [];
4767
- const dotted = /* @__PURE__ */ new Map();
6025
+ const dotted2 = /* @__PURE__ */ new Map();
4768
6026
  for (let i = 0; i < argv.length; i++) {
4769
6027
  const match = DOTTED.exec(argv[i]);
4770
6028
  if (!match) {
@@ -4774,9 +6032,9 @@ function splitDotted(argv) {
4774
6032
  const value2 = match[2] ?? argv[++i];
4775
6033
  if (value2 === void 0)
4776
6034
  throw new UsageError(`--${match[1]} needs a value`);
4777
- dotted.set(match[1], [...dotted.get(match[1]) ?? [], value2]);
6035
+ dotted2.set(match[1], [...dotted2.get(match[1]) ?? [], value2]);
4778
6036
  }
4779
- return { argv: rest, dotted };
6037
+ return { argv: rest, dotted: dotted2 };
4780
6038
  }
4781
6039
  function group(parent, name, groups, path) {
4782
6040
  const existing = groups.get(path);
@@ -4800,6 +6058,10 @@ function leafOptions(leaf, command) {
4800
6058
  );
4801
6059
  if (option2.negatable)
4802
6060
  leaf.option(`--no-${option2.flag}`, `Skip ${option2.flag}.`);
6061
+ for (const child of childFlags(option2)) {
6062
+ const placeholder2 = child.enum ? child.enum.join("|") : child.type.replace("[]", "");
6063
+ leaf.option(`--${child.flag} <${placeholder2}>`, optionText(child));
6064
+ }
4803
6065
  }
4804
6066
  for (const file of command.body?.files ?? []) {
4805
6067
  leaf.option(`--${file} <path>`, "File to upload. Repeatable.", collect);
@@ -4815,10 +6077,10 @@ function leafOptions(leaf, command) {
4815
6077
  "The pulled head folder to push. Defaults to the current folder."
4816
6078
  );
4817
6079
  }
4818
- function toParsed(leaf, positionals, dotted) {
6080
+ function toParsed(leaf, positionals, dotted2) {
4819
6081
  const globals = leaf.optsWithGlobals();
4820
6082
  const own = leaf.opts();
4821
- const flags = new Map(dotted);
6083
+ const flags = new Map(dotted2);
4822
6084
  for (const option2 of leaf.options) {
4823
6085
  const flag2 = option2.long?.replace(/^--(no-)?/, "");
4824
6086
  const value2 = own[option2.attributeName()];
@@ -4834,7 +6096,7 @@ function toParsed(leaf, positionals, dotted) {
4834
6096
  output: globals.output
4835
6097
  };
4836
6098
  }
4837
- function defineCommands(root, options, dotted = /* @__PURE__ */ new Map(), onInvocation = () => void 0) {
6099
+ function defineCommands(root, options, dotted2 = /* @__PURE__ */ new Map(), onInvocation = () => void 0) {
4838
6100
  if (options.description) root.description(options.description);
4839
6101
  if (options.version)
4840
6102
  root.addHelpText(
@@ -4903,7 +6165,7 @@ ${notes.join("\n")}`);
4903
6165
  `expected ${expected}, got ${cmd.args.length} argument(s)`
4904
6166
  );
4905
6167
  }
4906
- const unknownDotted = [...dotted.keys()].filter(
6168
+ const unknownDotted = [...dotted2.keys()].filter(
4907
6169
  (flag2) => !(command.body?.fields ?? []).some(
4908
6170
  (f) => flag2.startsWith(`${f.flag}.`)
4909
6171
  )
@@ -4916,7 +6178,7 @@ ${notes.join("\n")}`);
4916
6178
  onInvocation({
4917
6179
  kind: "command",
4918
6180
  command,
4919
- parsed: toParsed(cmd, positionals, dotted)
6181
+ parsed: toParsed(cmd, positionals, dotted2)
4920
6182
  });
4921
6183
  });
4922
6184
  }
@@ -4935,12 +6197,12 @@ async function parseInvocation(argv, options) {
4935
6197
  stderr: ""
4936
6198
  };
4937
6199
  }
4938
- const { argv: rest, dotted } = splitDotted(argv);
6200
+ const { argv: rest, dotted: dotted2 } = splitDotted(argv);
4939
6201
  const root = new Command("asteroid").exitOverride().helpCommand(false).configureOutput({
4940
6202
  writeOut: (text2) => stdout += text2,
4941
6203
  writeErr: (text2) => stderr += text2
4942
6204
  });
4943
- defineCommands(root, options, dotted, (invocation) => {
6205
+ defineCommands(root, options, dotted2, (invocation) => {
4944
6206
  result = invocation;
4945
6207
  });
4946
6208
  try {
@@ -5045,6 +6307,41 @@ function setPath(target, path, value2) {
5045
6307
  }
5046
6308
  node[path.at(-1)] = value2;
5047
6309
  }
6310
+ async function dotted(field, segments, flag2, raws, io) {
6311
+ const path = [];
6312
+ let option2 = field;
6313
+ for (const [i, segment] of segments.entries()) {
6314
+ if (option2?.record) {
6315
+ const key = segments.slice(i).join(".");
6316
+ const entry = { ...option2, flag: flag2, type: option2.record };
6317
+ delete entry.enum;
6318
+ return [
6319
+ [...path, key],
6320
+ entry.type === "json" ? loose(raws.at(-1)) : value(entry, raws)
6321
+ ];
6322
+ }
6323
+ if (option2?.fields) {
6324
+ const child = option2.fields.find(
6325
+ (f) => f.flag === segment
6326
+ );
6327
+ if (!child) throw new UsageError(`unknown flag: --${flag2}`);
6328
+ path.push(child.name);
6329
+ option2 = child;
6330
+ continue;
6331
+ }
6332
+ if (option2 && option2.type !== "json") {
6333
+ throw new UsageError(`unknown flag: --${flag2}`);
6334
+ }
6335
+ path.push(camel(segment));
6336
+ option2 = void 0;
6337
+ }
6338
+ if (!option2) return [path, loose(raws.at(-1))];
6339
+ if (option2.fields || option2.record) {
6340
+ throw new UsageError(`--${flag2} needs a field, as --${flag2}.<name>`);
6341
+ }
6342
+ const inputs = option2.type === "json" ? await Promise.all(raws.map((raw) => readInput(raw, io))) : raws;
6343
+ return [path, value({ ...option2, flag: flag2 }, inputs)];
6344
+ }
5048
6345
  async function buildRequest(command, input, context = {}) {
5049
6346
  const io = context.io ?? nodeReader;
5050
6347
  const parsed = await resolveInputs(command, input, io);
@@ -5131,7 +6428,8 @@ async function buildRequest(command, input, context = {}) {
5131
6428
  flags.delete(flag2);
5132
6429
  const current = json[field.name];
5133
6430
  json[field.name] = typeof current === "object" && current !== null ? current : {};
5134
- setPath(json, [field.name, ...rest.map(camel)], loose(raws.at(-1)));
6431
+ const [path2, value2] = await dotted(field, rest, flag2, raws, io);
6432
+ setPath(json, [field.name, ...path2], value2);
5135
6433
  }
5136
6434
  rejectUnknown(flags);
5137
6435
  delete json.organizationId;