@ellipsis-dev/sdk 0.27.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4158 @@
1
+ {
2
+ "$defs": {
3
+ "Agent": {
4
+ "description": "An agent: a saved agent definition that runs on its trigger or\nwhen invoked, plus where it syncs from and the state of that sync.",
5
+ "properties": {
6
+ "config": {
7
+ "$ref": "#/$defs/AgentConfig",
8
+ "description": "The agent definition itself, in the same schema as its YAML file: identity, trigger, input contract, and the session block."
9
+ },
10
+ "created_at": {
11
+ "description": "When the agent was created.",
12
+ "format": "date-time",
13
+ "title": "Created At",
14
+ "type": "string"
15
+ },
16
+ "display_name": {
17
+ "anyOf": [
18
+ {
19
+ "type": "string"
20
+ },
21
+ {
22
+ "type": "null"
23
+ }
24
+ ],
25
+ "default": null,
26
+ "description": "The raw ellipsis.name display text from the config file.",
27
+ "title": "Display Name"
28
+ },
29
+ "edited_by": {
30
+ "anyOf": [
31
+ {
32
+ "$ref": "#/$defs/GithubAccountSnippet"
33
+ },
34
+ {
35
+ "type": "null"
36
+ }
37
+ ],
38
+ "default": null,
39
+ "description": "The GitHub account that last edited the agent, when the edit came from a known user."
40
+ },
41
+ "id": {
42
+ "description": "Unique identifier of the agent.",
43
+ "title": "Id",
44
+ "type": "string"
45
+ },
46
+ "last_session_created_at": {
47
+ "anyOf": [
48
+ {
49
+ "format": "date-time",
50
+ "type": "string"
51
+ },
52
+ {
53
+ "type": "null"
54
+ }
55
+ ],
56
+ "default": null,
57
+ "description": "When that most recent session was created.",
58
+ "title": "Last Session Created At"
59
+ },
60
+ "last_session_id": {
61
+ "anyOf": [
62
+ {
63
+ "type": "string"
64
+ },
65
+ {
66
+ "type": "null"
67
+ }
68
+ ],
69
+ "default": null,
70
+ "description": "The most recent session this agent started, or null if it has never run.",
71
+ "title": "Last Session Id"
72
+ },
73
+ "last_sync_error": {
74
+ "anyOf": [
75
+ {
76
+ "type": "string"
77
+ },
78
+ {
79
+ "type": "null"
80
+ }
81
+ ],
82
+ "default": null,
83
+ "description": "The parse or validation error from the most recent sync attempt, or null when it succeeded. A non-null value means the agent is not running the YAML currently on the branch.",
84
+ "title": "Last Sync Error"
85
+ },
86
+ "last_synced_commit_sha": {
87
+ "anyOf": [
88
+ {
89
+ "type": "string"
90
+ },
91
+ {
92
+ "type": "null"
93
+ }
94
+ ],
95
+ "default": null,
96
+ "description": "The last commit the agent was synced from.",
97
+ "title": "Last Synced Commit Sha"
98
+ },
99
+ "managed_by": {
100
+ "$ref": "#/$defs/ConfigManagedBy",
101
+ "description": "Which writer owns this agent. \"github\" agents are defined by a file in a repository and are changed by editing that file; \"api\" agents have no file and are changed through this API."
102
+ },
103
+ "name": {
104
+ "anyOf": [
105
+ {
106
+ "type": "string"
107
+ },
108
+ {
109
+ "type": "null"
110
+ }
111
+ ],
112
+ "default": null,
113
+ "description": "The agent's account-unique addressable name (a slug of its display name); usable anywhere an agent is referenced, interchangeably with the id.",
114
+ "title": "Name"
115
+ },
116
+ "pending_pull_request_url": {
117
+ "anyOf": [
118
+ {
119
+ "type": "string"
120
+ },
121
+ {
122
+ "type": "null"
123
+ }
124
+ ],
125
+ "default": null,
126
+ "description": "The open pull request that adds this agent's file. Non-null means the agent is not live yet: it starts running once the pull request merges and syncs.",
127
+ "title": "Pending Pull Request Url"
128
+ },
129
+ "sha": {
130
+ "description": "The definition's content identity: the version fingerprint frozen onto each session that runs it.",
131
+ "title": "Sha",
132
+ "type": "string"
133
+ },
134
+ "source_details": {
135
+ "anyOf": [
136
+ {
137
+ "$ref": "#/$defs/GithubSourceDetails"
138
+ },
139
+ {
140
+ "type": "null"
141
+ }
142
+ ],
143
+ "default": null,
144
+ "description": "The repository, path, and branch the agent syncs from. Null only transiently, before the creating pull request's file lands on the branch."
145
+ },
146
+ "updated_at": {
147
+ "description": "When the agent was last updated.",
148
+ "format": "date-time",
149
+ "title": "Updated At",
150
+ "type": "string"
151
+ }
152
+ },
153
+ "required": [
154
+ "config",
155
+ "created_at",
156
+ "display_name",
157
+ "edited_by",
158
+ "id",
159
+ "last_session_created_at",
160
+ "last_session_id",
161
+ "last_sync_error",
162
+ "last_synced_commit_sha",
163
+ "managed_by",
164
+ "name",
165
+ "pending_pull_request_url",
166
+ "sha",
167
+ "source_details",
168
+ "updated_at"
169
+ ],
170
+ "title": "Agent",
171
+ "type": "object"
172
+ },
173
+ "AgentConfig": {
174
+ "additionalProperties": false,
175
+ "description": "A saved agent, as written in its YAML file: identity\n(`ellipsis`), when it runs (`trigger`), what goes in (`input`), and the\n`session:` block every session it starts is frozen from. Field order is\nthe canonical key order for files and `to_yaml` exports.",
176
+ "properties": {
177
+ "ellipsis": {
178
+ "$ref": "#/$defs/AgentIdentity"
179
+ },
180
+ "input": {
181
+ "anyOf": [
182
+ {
183
+ "$ref": "#/$defs/InputContract"
184
+ },
185
+ {
186
+ "type": "null"
187
+ }
188
+ ],
189
+ "default": null
190
+ },
191
+ "session": {
192
+ "$ref": "#/$defs/SessionConfig"
193
+ },
194
+ "trigger": {
195
+ "anyOf": [
196
+ {
197
+ "discriminator": {
198
+ "mapping": {
199
+ "cron": "#/$defs/CronTrigger",
200
+ "react": "#/$defs/ReactTrigger"
201
+ },
202
+ "propertyName": "type"
203
+ },
204
+ "oneOf": [
205
+ {
206
+ "$ref": "#/$defs/CronTrigger"
207
+ },
208
+ {
209
+ "$ref": "#/$defs/ReactTrigger"
210
+ }
211
+ ]
212
+ },
213
+ {
214
+ "type": "null"
215
+ }
216
+ ],
217
+ "default": null,
218
+ "title": "Trigger"
219
+ }
220
+ },
221
+ "required": [
222
+ "ellipsis",
223
+ "input",
224
+ "session",
225
+ "trigger"
226
+ ],
227
+ "title": "AgentConfig",
228
+ "type": "object"
229
+ },
230
+ "AgentIdentity": {
231
+ "additionalProperties": false,
232
+ "description": "The Ellipsis product namespace for a config file: which schema this is\n(`version`), the human-facing identity (`name`/`description`), freeform\norganizational `metadata`, and whether the agent is `enabled`. The\npresence of a top-level `ellipsis:` mapping is what marks a YAML file as\nan Ellipsis agent (vs arbitrary YAML that merely lives under a\nconfig directory) \u2014 see `yaml_is_ellipsis_config`.\n\n`enabled` is agent behavior, not freeform metadata, so it stays inside\nthe config `sha` (only `metadata` is sha-excluded). Whether a session\naccepts messages is a per-run choice (POST /v1/sessions `interactive`),\nnot a config one.",
233
+ "properties": {
234
+ "description": {
235
+ "anyOf": [
236
+ {
237
+ "type": "string"
238
+ },
239
+ {
240
+ "type": "null"
241
+ }
242
+ ],
243
+ "default": null,
244
+ "title": "Description"
245
+ },
246
+ "enabled": {
247
+ "default": true,
248
+ "title": "Enabled",
249
+ "type": "boolean"
250
+ },
251
+ "kind": {
252
+ "const": "agent",
253
+ "title": "Kind",
254
+ "type": "string"
255
+ },
256
+ "metadata": {
257
+ "$ref": "#/$defs/ConfigMetadata",
258
+ "default": {
259
+ "annotations": {},
260
+ "labels": []
261
+ }
262
+ },
263
+ "name": {
264
+ "anyOf": [
265
+ {
266
+ "type": "string"
267
+ },
268
+ {
269
+ "type": "null"
270
+ }
271
+ ],
272
+ "default": null,
273
+ "title": "Name"
274
+ },
275
+ "version": {
276
+ "default": "v1",
277
+ "title": "Version",
278
+ "type": "string"
279
+ }
280
+ },
281
+ "required": [
282
+ "description",
283
+ "enabled",
284
+ "kind",
285
+ "metadata",
286
+ "name",
287
+ "version"
288
+ ],
289
+ "title": "AgentIdentity",
290
+ "type": "object"
291
+ },
292
+ "AgentListStreamMessage": {
293
+ "properties": {
294
+ "agents": {
295
+ "items": {
296
+ "$ref": "#/$defs/Agent"
297
+ },
298
+ "title": "Agents",
299
+ "type": "array"
300
+ },
301
+ "type": {
302
+ "const": "agents",
303
+ "default": "agents",
304
+ "title": "Type",
305
+ "type": "string"
306
+ }
307
+ },
308
+ "required": [
309
+ "agents",
310
+ "type"
311
+ ],
312
+ "title": "AgentListStreamMessage",
313
+ "type": "object"
314
+ },
315
+ "AttributionType": {
316
+ "enum": [
317
+ "github_user",
318
+ "linear_user",
319
+ "slack_user",
320
+ "api_key"
321
+ ],
322
+ "title": "AttributionType",
323
+ "type": "string"
324
+ },
325
+ "BudgetConfig": {
326
+ "additionalProperties": false,
327
+ "properties": {
328
+ "day": {
329
+ "anyOf": [
330
+ {
331
+ "type": "number"
332
+ },
333
+ {
334
+ "type": "null"
335
+ }
336
+ ],
337
+ "default": null,
338
+ "title": "Day"
339
+ },
340
+ "month": {
341
+ "anyOf": [
342
+ {
343
+ "type": "number"
344
+ },
345
+ {
346
+ "type": "null"
347
+ }
348
+ ],
349
+ "default": null,
350
+ "title": "Month"
351
+ },
352
+ "session": {
353
+ "anyOf": [
354
+ {
355
+ "exclusiveMinimum": 0,
356
+ "type": "number"
357
+ },
358
+ {
359
+ "type": "null"
360
+ }
361
+ ],
362
+ "default": null,
363
+ "title": "Session"
364
+ },
365
+ "week": {
366
+ "anyOf": [
367
+ {
368
+ "type": "number"
369
+ },
370
+ {
371
+ "type": "null"
372
+ }
373
+ ],
374
+ "default": null,
375
+ "title": "Week"
376
+ }
377
+ },
378
+ "required": [
379
+ "day",
380
+ "month",
381
+ "session",
382
+ "week"
383
+ ],
384
+ "title": "BudgetConfig",
385
+ "type": "object"
386
+ },
387
+ "ClaudeConfig": {
388
+ "additionalProperties": false,
389
+ "description": "Native Claude Code options for an explicitly selected harness.",
390
+ "properties": {
391
+ "effort": {
392
+ "anyOf": [
393
+ {
394
+ "$ref": "#/$defs/EffortLevel"
395
+ },
396
+ {
397
+ "type": "null"
398
+ }
399
+ ],
400
+ "default": null
401
+ },
402
+ "fallback_model": {
403
+ "anyOf": [
404
+ {
405
+ "type": "string"
406
+ },
407
+ {
408
+ "type": "null"
409
+ }
410
+ ],
411
+ "default": null,
412
+ "title": "Fallback Model"
413
+ },
414
+ "max_turns": {
415
+ "anyOf": [
416
+ {
417
+ "exclusiveMinimum": 0,
418
+ "type": "integer"
419
+ },
420
+ {
421
+ "type": "null"
422
+ }
423
+ ],
424
+ "default": null,
425
+ "title": "Max Turns"
426
+ },
427
+ "model": {
428
+ "anyOf": [
429
+ {
430
+ "type": "string"
431
+ },
432
+ {
433
+ "type": "null"
434
+ }
435
+ ],
436
+ "default": null,
437
+ "title": "Model"
438
+ },
439
+ "prompt": {
440
+ "anyOf": [
441
+ {
442
+ "type": "string"
443
+ },
444
+ {
445
+ "type": "null"
446
+ }
447
+ ],
448
+ "default": null,
449
+ "description": "The initial user message, passed verbatim. Omit to start an interactive session idle.",
450
+ "title": "Prompt"
451
+ },
452
+ "settings": {
453
+ "anyOf": [
454
+ {
455
+ "$ref": "#/$defs/SettingsRef"
456
+ },
457
+ {
458
+ "type": "null"
459
+ }
460
+ ],
461
+ "default": null
462
+ }
463
+ },
464
+ "required": [
465
+ "effort",
466
+ "fallback_model",
467
+ "max_turns",
468
+ "model",
469
+ "prompt",
470
+ "settings"
471
+ ],
472
+ "title": "ClaudeConfig",
473
+ "type": "object"
474
+ },
475
+ "CodexConfig": {
476
+ "additionalProperties": false,
477
+ "description": "Native options supported by the current Codex adapter.\n\nOptions and capabilities expand only when their runtime behavior is tested.\nUnknown options are rejected instead of silently ignored.",
478
+ "properties": {
479
+ "effort": {
480
+ "anyOf": [
481
+ {
482
+ "$ref": "#/$defs/CodexEffortLevel"
483
+ },
484
+ {
485
+ "type": "null"
486
+ }
487
+ ],
488
+ "default": null,
489
+ "description": "Reasoning effort for every turn. Omit to use the model default."
490
+ },
491
+ "model": {
492
+ "default": "gpt-5.6-terra",
493
+ "title": "Model",
494
+ "type": "string"
495
+ },
496
+ "prompt": {
497
+ "anyOf": [
498
+ {
499
+ "type": "string"
500
+ },
501
+ {
502
+ "type": "null"
503
+ }
504
+ ],
505
+ "default": null,
506
+ "description": "The initial user message, passed verbatim. Omit to start an interactive session idle.",
507
+ "title": "Prompt"
508
+ }
509
+ },
510
+ "required": [
511
+ "effort",
512
+ "model",
513
+ "prompt"
514
+ ],
515
+ "title": "CodexConfig",
516
+ "type": "object"
517
+ },
518
+ "CodexEffortLevel": {
519
+ "enum": [
520
+ "none",
521
+ "low",
522
+ "medium",
523
+ "high",
524
+ "xhigh",
525
+ "max"
526
+ ],
527
+ "title": "CodexEffortLevel",
528
+ "type": "string"
529
+ },
530
+ "CollectionStreamHeartbeat": {
531
+ "properties": {
532
+ "type": {
533
+ "const": "heartbeat",
534
+ "default": "heartbeat",
535
+ "title": "Type",
536
+ "type": "string"
537
+ }
538
+ },
539
+ "required": [
540
+ "type"
541
+ ],
542
+ "title": "CollectionStreamHeartbeat",
543
+ "type": "object"
544
+ },
545
+ "ComputeConfig": {
546
+ "additionalProperties": false,
547
+ "description": "Sandbox compute sizing. Every field is optional; None inherits the\nplatform default (2 vCPU / 4096 MiB / 3600s \u2014 see DEFAULT_SANDBOX_* in\nmodels/ellipsis/vms/vm_execution.py). A resolved value outside the platform\nbounds fails validation loudly (a sync error on the config) rather than\nbeing clamped silently.\n\n`memory` and `timeout` each accept a shorthand string (\"8GB\", \"30m\") or an\nexplicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /\n`timeout_seconds` properties resolve either form to the canonical integer\nthe sandbox driver consumes.\n\n`timeout` is the max wall-clock the agent may run before its execution is\nstopped, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS \u2014 equal to the default, so\ntoday the knob only shortens a session; the cap matches the 1-hour validity\nof the sandbox's GitHub token). The worker's lease/visibility heartbeat\nceiling is derived from that cap, so a run at the max stays owned by its\nworker for its whole life.\n\nCompute currently uses a temporary flat one-cent amount per allocated\nexecution, subject to the account's existing free-compute exemptions.",
548
+ "properties": {
549
+ "cpu": {
550
+ "anyOf": [
551
+ {
552
+ "maximum": 32,
553
+ "minimum": 2,
554
+ "type": "integer"
555
+ },
556
+ {
557
+ "type": "null"
558
+ }
559
+ ],
560
+ "default": null,
561
+ "title": "Cpu"
562
+ },
563
+ "memory": {
564
+ "anyOf": [
565
+ {
566
+ "type": "string"
567
+ },
568
+ {
569
+ "$ref": "#/$defs/MemorySize"
570
+ },
571
+ {
572
+ "type": "null"
573
+ }
574
+ ],
575
+ "default": null,
576
+ "title": "Memory"
577
+ },
578
+ "timeout": {
579
+ "anyOf": [
580
+ {
581
+ "type": "string"
582
+ },
583
+ {
584
+ "$ref": "#/$defs/Duration"
585
+ },
586
+ {
587
+ "type": "null"
588
+ }
589
+ ],
590
+ "default": null,
591
+ "title": "Timeout"
592
+ }
593
+ },
594
+ "required": [
595
+ "cpu",
596
+ "memory",
597
+ "timeout"
598
+ ],
599
+ "title": "ComputeConfig",
600
+ "type": "object"
601
+ },
602
+ "ConfigManagedBy": {
603
+ "description": "Which writer owns an agent: the repository file it is defined in, or\nthis API. Every agent has exactly one owner, fixed when it is created and\nchanged only by linking or unlinking it.",
604
+ "enum": [
605
+ "github",
606
+ "api"
607
+ ],
608
+ "title": "ConfigManagedBy",
609
+ "type": "string"
610
+ },
611
+ "ConfigMetadata": {
612
+ "additionalProperties": false,
613
+ "properties": {
614
+ "annotations": {
615
+ "additionalProperties": {
616
+ "type": "string"
617
+ },
618
+ "default": {},
619
+ "title": "Annotations",
620
+ "type": "object"
621
+ },
622
+ "labels": {
623
+ "default": [],
624
+ "items": {
625
+ "type": "string"
626
+ },
627
+ "title": "Labels",
628
+ "type": "array"
629
+ }
630
+ },
631
+ "required": [
632
+ "annotations",
633
+ "labels"
634
+ ],
635
+ "title": "ConfigMetadata",
636
+ "type": "object"
637
+ },
638
+ "ConversationState": {
639
+ "enum": [
640
+ "open",
641
+ "closed"
642
+ ],
643
+ "title": "ConversationState",
644
+ "type": "string"
645
+ },
646
+ "CronTrigger": {
647
+ "additionalProperties": false,
648
+ "properties": {
649
+ "schedule": {
650
+ "title": "Schedule",
651
+ "type": "string"
652
+ },
653
+ "type": {
654
+ "const": "cron",
655
+ "default": "cron",
656
+ "title": "Type",
657
+ "type": "string"
658
+ }
659
+ },
660
+ "required": [
661
+ "schedule",
662
+ "type"
663
+ ],
664
+ "title": "CronTrigger",
665
+ "type": "object"
666
+ },
667
+ "Duration": {
668
+ "additionalProperties": false,
669
+ "description": "A duration as explicit units, summed. Set any of `hours`/`minutes`/\n`seconds` (at least one). The alternative to the `30m`-style shorthand\nstring wherever a duration is accepted.",
670
+ "properties": {
671
+ "hours": {
672
+ "anyOf": [
673
+ {
674
+ "minimum": 0,
675
+ "type": "integer"
676
+ },
677
+ {
678
+ "type": "null"
679
+ }
680
+ ],
681
+ "default": null,
682
+ "title": "Hours"
683
+ },
684
+ "minutes": {
685
+ "anyOf": [
686
+ {
687
+ "minimum": 0,
688
+ "type": "integer"
689
+ },
690
+ {
691
+ "type": "null"
692
+ }
693
+ ],
694
+ "default": null,
695
+ "title": "Minutes"
696
+ },
697
+ "seconds": {
698
+ "anyOf": [
699
+ {
700
+ "minimum": 0,
701
+ "type": "integer"
702
+ },
703
+ {
704
+ "type": "null"
705
+ }
706
+ ],
707
+ "default": null,
708
+ "title": "Seconds"
709
+ }
710
+ },
711
+ "required": [
712
+ "hours",
713
+ "minutes",
714
+ "seconds"
715
+ ],
716
+ "title": "Duration",
717
+ "type": "object"
718
+ },
719
+ "EffortLevel": {
720
+ "enum": [
721
+ "low",
722
+ "medium",
723
+ "high",
724
+ "xhigh",
725
+ "max"
726
+ ],
727
+ "title": "EffortLevel",
728
+ "type": "string"
729
+ },
730
+ "EllipsisGrant": {
731
+ "additionalProperties": false,
732
+ "description": "One grant entry: a level, optionally narrowed to instances whose\nnatural key (a file's name, a memory's path, a secret's name, a config's\nname, a session's id) matches any of the `match` globs.",
733
+ "properties": {
734
+ "level": {
735
+ "$ref": "#/$defs/Level"
736
+ },
737
+ "match": {
738
+ "anyOf": [
739
+ {
740
+ "items": {
741
+ "type": "string"
742
+ },
743
+ "type": "array"
744
+ },
745
+ {
746
+ "type": "null"
747
+ }
748
+ ],
749
+ "default": null,
750
+ "title": "Match"
751
+ }
752
+ },
753
+ "required": [
754
+ "level",
755
+ "match"
756
+ ],
757
+ "title": "EllipsisGrant",
758
+ "type": "object"
759
+ },
760
+ "EllipsisPermissions": {
761
+ "additionalProperties": {
762
+ "anyOf": [
763
+ {
764
+ "$ref": "#/$defs/Level"
765
+ },
766
+ {
767
+ "$ref": "#/$defs/EllipsisGrant"
768
+ },
769
+ {
770
+ "items": {
771
+ "anyOf": [
772
+ {
773
+ "$ref": "#/$defs/Level"
774
+ },
775
+ {
776
+ "$ref": "#/$defs/EllipsisGrant"
777
+ }
778
+ ]
779
+ },
780
+ "type": "array"
781
+ }
782
+ ]
783
+ },
784
+ "description": "`permissions.ellipsis` as a map: resource \u2192 level | grant | list of\ngrants. Levels are hierarchical (read < write < delete), so `write`\nincludes `read`. An unlisted resource is denied. The whole block is\nintersected with the platform's sandbox ceiling at token mint \u2014 it can\nnarrow what a sandbox token may do, never exceed it.",
785
+ "propertyNames": {
786
+ "$ref": "#/$defs/Resource"
787
+ },
788
+ "title": "EllipsisPermissions",
789
+ "type": "object"
790
+ },
791
+ "EnvironmentBaseBuild": {
792
+ "additionalProperties": false,
793
+ "description": "Create a reusable base, optionally using only selected repository files.",
794
+ "properties": {
795
+ "inputs": {
796
+ "anyOf": [
797
+ {
798
+ "items": {
799
+ "type": "string"
800
+ },
801
+ "type": "array"
802
+ },
803
+ {
804
+ "type": "null"
805
+ }
806
+ ],
807
+ "default": null,
808
+ "description": "Exact files relative to /sandbox, including the repository name. Only these files are available during build_base and their contents and modes determine reuse. Omit to use all repositories and invalidate on any source change; [] means no repository files.",
809
+ "title": "Inputs"
810
+ },
811
+ "run": {
812
+ "description": "Shell script to run in /sandbox.",
813
+ "minLength": 1,
814
+ "title": "Run",
815
+ "type": "string"
816
+ }
817
+ },
818
+ "required": [
819
+ "inputs",
820
+ "run"
821
+ ],
822
+ "title": "EnvironmentBaseBuild",
823
+ "type": "object"
824
+ },
825
+ "EnvironmentConfig": {
826
+ "additionalProperties": false,
827
+ "description": "Everything about the environment (the sandbox) the agent runs in: which\n`repositories` are cloned into it, which environment `variables` it gets,\nits `compute` sizing, and lifecycle `hooks`.\nWhat the agent may *do* from that environment is the top-level\n`permissions:` block, not this one.\n\nEach `variables` entry names a variable to inject; with an inline `value` it\nis hardcoded, without one it is resolved from the account's sandbox-secrets\nstore. Only the named variables reach this agent; the rest of the account's\nstored variables never do. This is how a config brings in the config and\ncredentials a custom CLI needs.",
828
+ "properties": {
829
+ "compute": {
830
+ "$ref": "#/$defs/ComputeConfig",
831
+ "default": {
832
+ "cpu": null,
833
+ "memory": null,
834
+ "timeout": null
835
+ }
836
+ },
837
+ "hooks": {
838
+ "$ref": "#/$defs/EnvironmentHooks",
839
+ "default": {
840
+ "after_checkout": null,
841
+ "before_start": null,
842
+ "build_base": null,
843
+ "post_clone": null,
844
+ "post_start": null
845
+ }
846
+ },
847
+ "mcp_servers": {
848
+ "default": [],
849
+ "items": {
850
+ "anyOf": [
851
+ {
852
+ "type": "string"
853
+ },
854
+ {
855
+ "$ref": "#/$defs/McpServerRef"
856
+ },
857
+ {
858
+ "$ref": "#/$defs/McpStdioServer"
859
+ },
860
+ {
861
+ "$ref": "#/$defs/McpRemoteServer"
862
+ }
863
+ ]
864
+ },
865
+ "title": "Mcp Servers",
866
+ "type": "array"
867
+ },
868
+ "repositories": {
869
+ "default": [],
870
+ "items": {
871
+ "$ref": "#/$defs/RepositoryRef"
872
+ },
873
+ "title": "Repositories",
874
+ "type": "array"
875
+ },
876
+ "variables": {
877
+ "default": [],
878
+ "items": {
879
+ "$ref": "#/$defs/EnvironmentVariable"
880
+ },
881
+ "title": "Variables",
882
+ "type": "array"
883
+ }
884
+ },
885
+ "required": [
886
+ "compute",
887
+ "hooks",
888
+ "mcp_servers",
889
+ "repositories",
890
+ "variables"
891
+ ],
892
+ "title": "EnvironmentConfig",
893
+ "type": "object"
894
+ },
895
+ "EnvironmentHooks": {
896
+ "additionalProperties": false,
897
+ "description": "Environment lifecycle scripts, in order: build_base, after_checkout,\nbefore_start. The first two produce reusable snapshots; before_start runs\nbefore an agent starts or resumes its session. Scripts run as the sandbox\nuser in /sandbox. A nonzero exit fails the session.\n\nLegacy post_start/post_clone scripts remain supported for existing configs;\nboth run after workspace preparation, before the agent starts or resumes.\nThey cannot be combined with the new lifecycle fields.",
898
+ "properties": {
899
+ "after_checkout": {
900
+ "anyOf": [
901
+ {
902
+ "$ref": "#/$defs/EnvironmentScript"
903
+ },
904
+ {
905
+ "type": "string"
906
+ },
907
+ {
908
+ "type": "null"
909
+ }
910
+ ],
911
+ "default": null,
912
+ "description": "Prepare the requested source revision after Ellipsis checks out all repositories, before saving the prepared sandbox. Skipped when that prepared sandbox is reused.",
913
+ "title": "After Checkout"
914
+ },
915
+ "before_start": {
916
+ "anyOf": [
917
+ {
918
+ "$ref": "#/$defs/EnvironmentScript"
919
+ },
920
+ {
921
+ "type": "string"
922
+ },
923
+ {
924
+ "type": "null"
925
+ }
926
+ ],
927
+ "default": null,
928
+ "description": "Run before the agent starts or resumes a session, after the sandbox is ready. This hook is not cached and adds to session startup time.",
929
+ "title": "Before Start"
930
+ },
931
+ "build_base": {
932
+ "anyOf": [
933
+ {
934
+ "$ref": "#/$defs/EnvironmentBaseBuild"
935
+ },
936
+ {
937
+ "type": "string"
938
+ },
939
+ {
940
+ "type": "null"
941
+ }
942
+ ],
943
+ "default": null,
944
+ "description": "Build a reusable environment before full checkout. Cached by declared inputs, script, toolchain, resources, and build configuration. A string is shorthand for run with all repositories as inputs.",
945
+ "title": "Build Base"
946
+ },
947
+ "post_clone": {
948
+ "anyOf": [
949
+ {
950
+ "type": "string"
951
+ },
952
+ {
953
+ "type": "null"
954
+ }
955
+ ],
956
+ "default": null,
957
+ "description": "Legacy session startup script. Use before_start for session setup or after_checkout for cached source preparation.",
958
+ "title": "Post Clone"
959
+ },
960
+ "post_start": {
961
+ "anyOf": [
962
+ {
963
+ "type": "string"
964
+ },
965
+ {
966
+ "type": "null"
967
+ }
968
+ ],
969
+ "default": null,
970
+ "description": "Legacy session startup script. Use before_start in new configurations.",
971
+ "title": "Post Start"
972
+ }
973
+ },
974
+ "required": [
975
+ "after_checkout",
976
+ "before_start",
977
+ "build_base",
978
+ "post_clone",
979
+ "post_start"
980
+ ],
981
+ "title": "EnvironmentHooks",
982
+ "type": "object"
983
+ },
984
+ "EnvironmentScript": {
985
+ "additionalProperties": false,
986
+ "description": "An inline shell script run as the sandbox user, with /sandbox as cwd.",
987
+ "properties": {
988
+ "run": {
989
+ "description": "Shell script to run in /sandbox.",
990
+ "minLength": 1,
991
+ "title": "Run",
992
+ "type": "string"
993
+ }
994
+ },
995
+ "required": [
996
+ "run"
997
+ ],
998
+ "title": "EnvironmentScript",
999
+ "type": "object"
1000
+ },
1001
+ "EnvironmentSource": {
1002
+ "description": "How a session's environment was chosen. None (the field is nullable)\nwhen the config carried an inline environment block and no resolution ran \u2014\nan inline environment is not a reference, so there is nothing to record.\n\nNot derivable from the row: `environment_id` says WHICH environment, not\nhow it was chosen, and is null for the built-in basic sandbox.",
1003
+ "enum": [
1004
+ "request",
1005
+ "agent",
1006
+ "repo_default",
1007
+ "account_default",
1008
+ "platform_default"
1009
+ ],
1010
+ "title": "EnvironmentSource",
1011
+ "type": "string"
1012
+ },
1013
+ "EnvironmentVariable": {
1014
+ "additionalProperties": false,
1015
+ "description": "One environment variable injected into the agent's sandbox.\n\n`value`, when set, is a literal injected as-is \u2014 use it for non-secret\nconfig (LOG_LEVEL, an API base URL). When `value` is omitted the value is\nresolved at run time from the account's sandbox-secrets store (dashboard\n/ `PUT /v1/secrets`) by `name`, so a secret can be injected without\never putting it in the config file. Either way the variable only reaches\nagents that name it.",
1016
+ "properties": {
1017
+ "name": {
1018
+ "title": "Name",
1019
+ "type": "string"
1020
+ },
1021
+ "value": {
1022
+ "anyOf": [
1023
+ {
1024
+ "type": "string"
1025
+ },
1026
+ {
1027
+ "type": "null"
1028
+ }
1029
+ ],
1030
+ "default": null,
1031
+ "title": "Value"
1032
+ }
1033
+ },
1034
+ "required": [
1035
+ "name",
1036
+ "value"
1037
+ ],
1038
+ "title": "EnvironmentVariable",
1039
+ "type": "object"
1040
+ },
1041
+ "GithubAccountFilter": {
1042
+ "anyOf": [
1043
+ {
1044
+ "additionalProperties": false,
1045
+ "description": "One include-minus-exclude set of GitHub accounts: an account matches iff\nit is in `include` (`true` = all, a list = exactly those, `false`/`[]` =\nnone) AND not in `exclude`. A bare bool or list is shorthand for `include`,\nso `users: true` and `users: [priya-shah]` both parse.",
1046
+ "properties": {
1047
+ "exclude": {
1048
+ "default": [],
1049
+ "items": {
1050
+ "type": "string"
1051
+ },
1052
+ "title": "Exclude",
1053
+ "type": "array"
1054
+ },
1055
+ "include": {
1056
+ "anyOf": [
1057
+ {
1058
+ "items": {
1059
+ "type": "string"
1060
+ },
1061
+ "type": "array"
1062
+ },
1063
+ {
1064
+ "type": "boolean"
1065
+ }
1066
+ ],
1067
+ "default": true,
1068
+ "title": "Include"
1069
+ }
1070
+ },
1071
+ "required": [
1072
+ "exclude",
1073
+ "include"
1074
+ ],
1075
+ "title": "GithubAccountFilter",
1076
+ "type": "object"
1077
+ },
1078
+ {
1079
+ "type": "boolean"
1080
+ },
1081
+ {
1082
+ "items": {
1083
+ "type": "string"
1084
+ },
1085
+ "type": "array"
1086
+ }
1087
+ ]
1088
+ },
1089
+ "GithubAccountSelector": {
1090
+ "additionalProperties": false,
1091
+ "description": "A selector of GitHub accounts \u2014 the `for:` audience gate on react\nsurfaces and code review pipelines, classified on the stable entity author\n(the pusher for `push`, the PR author for a review). `users` selects human\naccounts, `bots` selects bot accounts; each is a `GithubAccountFilter`\n(include minus exclude, with bare bool/list shorthand).",
1092
+ "properties": {
1093
+ "bots": {
1094
+ "$ref": "#/$defs/GithubAccountFilter"
1095
+ },
1096
+ "users": {
1097
+ "$ref": "#/$defs/GithubAccountFilter"
1098
+ }
1099
+ },
1100
+ "required": [
1101
+ "bots",
1102
+ "users"
1103
+ ],
1104
+ "title": "GithubAccountSelector",
1105
+ "type": "object"
1106
+ },
1107
+ "GithubAccountSnippet": {
1108
+ "description": "Sometimes the GitHub API returns a user of github (can include bots)\nusing this snippet instead of the full GithubAccount model. One example,\nis when the API returns a pull request.\n\nThis is the least amount of info we need to represent a GitHub account.",
1109
+ "properties": {
1110
+ "avatar_url": {
1111
+ "title": "Avatar Url",
1112
+ "type": "string"
1113
+ },
1114
+ "id": {
1115
+ "title": "Id",
1116
+ "type": "integer"
1117
+ },
1118
+ "login": {
1119
+ "title": "Login",
1120
+ "type": "string"
1121
+ },
1122
+ "type": {
1123
+ "$ref": "#/$defs/GithubAccountType"
1124
+ }
1125
+ },
1126
+ "required": [
1127
+ "avatar_url",
1128
+ "id",
1129
+ "login",
1130
+ "type"
1131
+ ],
1132
+ "title": "GithubAccountSnippet",
1133
+ "type": "object"
1134
+ },
1135
+ "GithubAccountType": {
1136
+ "enum": [
1137
+ "User",
1138
+ "Organization",
1139
+ "Bot",
1140
+ "Mannequin"
1141
+ ],
1142
+ "title": "GithubAccountType",
1143
+ "type": "string"
1144
+ },
1145
+ "GithubIssueEvent": {
1146
+ "properties": {
1147
+ "action": {
1148
+ "$ref": "#/$defs/IssueAction"
1149
+ },
1150
+ "actor": {
1151
+ "anyOf": [
1152
+ {
1153
+ "$ref": "#/$defs/SessionEventActor"
1154
+ },
1155
+ {
1156
+ "type": "null"
1157
+ }
1158
+ ],
1159
+ "default": null
1160
+ },
1161
+ "number": {
1162
+ "title": "Number",
1163
+ "type": "integer"
1164
+ },
1165
+ "repository": {
1166
+ "title": "Repository",
1167
+ "type": "string"
1168
+ },
1169
+ "title": {
1170
+ "title": "Title",
1171
+ "type": "string"
1172
+ },
1173
+ "type": {
1174
+ "const": "github.issue",
1175
+ "default": "github.issue",
1176
+ "title": "Type",
1177
+ "type": "string"
1178
+ },
1179
+ "url": {
1180
+ "title": "Url",
1181
+ "type": "string"
1182
+ }
1183
+ },
1184
+ "required": [
1185
+ "action",
1186
+ "actor",
1187
+ "number",
1188
+ "repository",
1189
+ "title",
1190
+ "type",
1191
+ "url"
1192
+ ],
1193
+ "title": "GithubIssueEvent",
1194
+ "type": "object"
1195
+ },
1196
+ "GithubPermissions": {
1197
+ "additionalProperties": false,
1198
+ "description": "The agent's GitHub access: the scope of the installation token minted for\nits sandbox \u2014 the credential `git`, `gh`, and the GitHub MCP server\nauthenticate with.\n\nBy default the token carries the installation's full permissions on all of\nthe installation's repositories. `permissions` narrows what it may do:\nthe string `read_only` grants read access to contents, issues, metadata and\npull requests; a map requests explicit levels per GitHub App permission\nscope (e.g. `{contents: read, pull_requests: write}`) and may never exceed\nwhat the installation granted. `repositories` scopes the token to exactly\nthe listed repos, by name (they must belong to the installation).\n\nRestriction is enforced by GitHub, not by Ellipsis: the token itself is\nminted with the reduced scope, so nothing running in the sandbox can\nexceed it.",
1199
+ "properties": {
1200
+ "permissions": {
1201
+ "anyOf": [
1202
+ {
1203
+ "const": "read_only",
1204
+ "type": "string"
1205
+ },
1206
+ {
1207
+ "additionalProperties": {
1208
+ "type": "string"
1209
+ },
1210
+ "type": "object"
1211
+ },
1212
+ {
1213
+ "type": "null"
1214
+ }
1215
+ ],
1216
+ "default": null,
1217
+ "title": "Permissions"
1218
+ },
1219
+ "repositories": {
1220
+ "anyOf": [
1221
+ {
1222
+ "items": {
1223
+ "type": "string"
1224
+ },
1225
+ "type": "array"
1226
+ },
1227
+ {
1228
+ "type": "null"
1229
+ }
1230
+ ],
1231
+ "default": null,
1232
+ "title": "Repositories"
1233
+ }
1234
+ },
1235
+ "required": [
1236
+ "permissions",
1237
+ "repositories"
1238
+ ],
1239
+ "title": "GithubPermissions",
1240
+ "type": "object"
1241
+ },
1242
+ "GithubPullRequestEvent": {
1243
+ "properties": {
1244
+ "action": {
1245
+ "anyOf": [
1246
+ {
1247
+ "$ref": "#/$defs/PullRequestAction"
1248
+ },
1249
+ {
1250
+ "const": "review_commented",
1251
+ "type": "string"
1252
+ }
1253
+ ],
1254
+ "title": "Action"
1255
+ },
1256
+ "actor": {
1257
+ "anyOf": [
1258
+ {
1259
+ "$ref": "#/$defs/SessionEventActor"
1260
+ },
1261
+ {
1262
+ "type": "null"
1263
+ }
1264
+ ],
1265
+ "default": null
1266
+ },
1267
+ "branch": {
1268
+ "title": "Branch",
1269
+ "type": "string"
1270
+ },
1271
+ "number": {
1272
+ "title": "Number",
1273
+ "type": "integer"
1274
+ },
1275
+ "repository": {
1276
+ "title": "Repository",
1277
+ "type": "string"
1278
+ },
1279
+ "title": {
1280
+ "title": "Title",
1281
+ "type": "string"
1282
+ },
1283
+ "type": {
1284
+ "const": "github.pull_request",
1285
+ "default": "github.pull_request",
1286
+ "title": "Type",
1287
+ "type": "string"
1288
+ },
1289
+ "url": {
1290
+ "title": "Url",
1291
+ "type": "string"
1292
+ }
1293
+ },
1294
+ "required": [
1295
+ "action",
1296
+ "actor",
1297
+ "branch",
1298
+ "number",
1299
+ "repository",
1300
+ "title",
1301
+ "type",
1302
+ "url"
1303
+ ],
1304
+ "title": "GithubPullRequestEvent",
1305
+ "type": "object"
1306
+ },
1307
+ "GithubPushEvent": {
1308
+ "properties": {
1309
+ "actor": {
1310
+ "anyOf": [
1311
+ {
1312
+ "$ref": "#/$defs/SessionEventActor"
1313
+ },
1314
+ {
1315
+ "type": "null"
1316
+ }
1317
+ ],
1318
+ "default": null
1319
+ },
1320
+ "after": {
1321
+ "title": "After",
1322
+ "type": "string"
1323
+ },
1324
+ "before": {
1325
+ "title": "Before",
1326
+ "type": "string"
1327
+ },
1328
+ "branch": {
1329
+ "title": "Branch",
1330
+ "type": "string"
1331
+ },
1332
+ "repository": {
1333
+ "title": "Repository",
1334
+ "type": "string"
1335
+ },
1336
+ "type": {
1337
+ "const": "github.push",
1338
+ "default": "github.push",
1339
+ "title": "Type",
1340
+ "type": "string"
1341
+ },
1342
+ "url": {
1343
+ "title": "Url",
1344
+ "type": "string"
1345
+ }
1346
+ },
1347
+ "required": [
1348
+ "actor",
1349
+ "after",
1350
+ "before",
1351
+ "branch",
1352
+ "repository",
1353
+ "type",
1354
+ "url"
1355
+ ],
1356
+ "title": "GithubPushEvent",
1357
+ "type": "object"
1358
+ },
1359
+ "GithubSourceDetails": {
1360
+ "description": "Identifies the file a GitHub-sourced agent is synced from.\n\nKeyed on the repository ID (not owner/name) so repository and org renames\ndon't orphan the config; resolve display names from gh_repositories at\nread time.",
1361
+ "properties": {
1362
+ "branch": {
1363
+ "title": "Branch",
1364
+ "type": "string"
1365
+ },
1366
+ "path": {
1367
+ "title": "Path",
1368
+ "type": "string"
1369
+ },
1370
+ "repo_id": {
1371
+ "title": "Repo Id",
1372
+ "type": "integer"
1373
+ }
1374
+ },
1375
+ "required": [
1376
+ "branch",
1377
+ "path",
1378
+ "repo_id"
1379
+ ],
1380
+ "title": "GithubSourceDetails",
1381
+ "type": "object"
1382
+ },
1383
+ "HandlerService": {
1384
+ "description": "The service whose events a handler responds to.",
1385
+ "enum": [
1386
+ "slack",
1387
+ "github",
1388
+ "linear",
1389
+ "sentry"
1390
+ ],
1391
+ "title": "HandlerService",
1392
+ "type": "string"
1393
+ },
1394
+ "InputContract": {
1395
+ "additionalProperties": false,
1396
+ "description": "The typed input contract: what goes INTO a session (the trigger is\nwhen it happens; this is what goes in).\n\n`json_schema` validates customer data sent as `input` to\n`POST /v1/agents/{id}/sessions` and stored as `session.input`.\nInvocations require input when a schema is declared. React agents\ncannot declare schemas: the platform defines their event payloads.\n\n`message` is the initial-message template: exact `{{path}}` substitution\nover the caller payload (or, on a react agent, over the surface's\npublished fields), no conditionals/loops/filters. Refs are validated at\ndeploy time against the governing field set (see AgentConfig's\n`_check_input`).",
1397
+ "properties": {
1398
+ "json_schema": {
1399
+ "anyOf": [
1400
+ {
1401
+ "additionalProperties": true,
1402
+ "type": "object"
1403
+ },
1404
+ {
1405
+ "type": "null"
1406
+ }
1407
+ ],
1408
+ "default": null,
1409
+ "title": "Json Schema"
1410
+ },
1411
+ "message": {
1412
+ "anyOf": [
1413
+ {
1414
+ "type": "string"
1415
+ },
1416
+ {
1417
+ "type": "null"
1418
+ }
1419
+ ],
1420
+ "default": null,
1421
+ "title": "Message"
1422
+ }
1423
+ },
1424
+ "required": [
1425
+ "json_schema",
1426
+ "message"
1427
+ ],
1428
+ "title": "InputContract",
1429
+ "type": "object"
1430
+ },
1431
+ "IssueAction": {
1432
+ "enum": [
1433
+ "opened",
1434
+ "closed",
1435
+ "commented"
1436
+ ],
1437
+ "title": "IssueAction",
1438
+ "type": "string"
1439
+ },
1440
+ "Level": {
1441
+ "description": "What may be done to a resource. Strictly ordered: a grant at one level\nincludes every level below it (write-only would be a phantom capability \u2014\nno real client can create what it cannot read back).",
1442
+ "enum": [
1443
+ "read",
1444
+ "write",
1445
+ "delete"
1446
+ ],
1447
+ "title": "Level",
1448
+ "type": "string"
1449
+ },
1450
+ "LinearIssueAction": {
1451
+ "enum": [
1452
+ "opened"
1453
+ ],
1454
+ "title": "LinearIssueAction",
1455
+ "type": "string"
1456
+ },
1457
+ "LinearIssueEvent": {
1458
+ "properties": {
1459
+ "action": {
1460
+ "anyOf": [
1461
+ {
1462
+ "$ref": "#/$defs/LinearIssueAction"
1463
+ },
1464
+ {
1465
+ "const": "commented",
1466
+ "type": "string"
1467
+ }
1468
+ ],
1469
+ "title": "Action"
1470
+ },
1471
+ "actor": {
1472
+ "anyOf": [
1473
+ {
1474
+ "$ref": "#/$defs/SessionEventActor"
1475
+ },
1476
+ {
1477
+ "type": "null"
1478
+ }
1479
+ ],
1480
+ "default": null
1481
+ },
1482
+ "identifier": {
1483
+ "anyOf": [
1484
+ {
1485
+ "type": "string"
1486
+ },
1487
+ {
1488
+ "type": "null"
1489
+ }
1490
+ ],
1491
+ "default": null,
1492
+ "title": "Identifier"
1493
+ },
1494
+ "number": {
1495
+ "title": "Number",
1496
+ "type": "integer"
1497
+ },
1498
+ "title": {
1499
+ "title": "Title",
1500
+ "type": "string"
1501
+ },
1502
+ "type": {
1503
+ "const": "linear.issue",
1504
+ "default": "linear.issue",
1505
+ "title": "Type",
1506
+ "type": "string"
1507
+ },
1508
+ "url": {
1509
+ "title": "Url",
1510
+ "type": "string"
1511
+ }
1512
+ },
1513
+ "required": [
1514
+ "action",
1515
+ "actor",
1516
+ "identifier",
1517
+ "number",
1518
+ "title",
1519
+ "type",
1520
+ "url"
1521
+ ],
1522
+ "title": "LinearIssueEvent",
1523
+ "type": "object"
1524
+ },
1525
+ "McpRemoteServer": {
1526
+ "additionalProperties": false,
1527
+ "description": "A bring-your-own remote MCP server: the harness talks HTTP to `url`.\nNothing runs in the sandbox image. `headers` carry static auth (e.g.\n`Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret\nreferences, resolved at run time from the account's secrets store.",
1528
+ "properties": {
1529
+ "headers": {
1530
+ "additionalProperties": {
1531
+ "type": "string"
1532
+ },
1533
+ "default": {},
1534
+ "title": "Headers",
1535
+ "type": "object"
1536
+ },
1537
+ "name": {
1538
+ "title": "Name",
1539
+ "type": "string"
1540
+ },
1541
+ "url": {
1542
+ "title": "Url",
1543
+ "type": "string"
1544
+ }
1545
+ },
1546
+ "required": [
1547
+ "headers",
1548
+ "name",
1549
+ "url"
1550
+ ],
1551
+ "title": "McpRemoteServer",
1552
+ "type": "object"
1553
+ },
1554
+ "McpServerRef": {
1555
+ "additionalProperties": false,
1556
+ "description": "One built-in MCP server this agent opts into by name (`linear`/`slack`).\nA name reference over the connected built-in set \u2014 the platform manages the\nserver's transport and credentials. It only matters when the named\nintegration is set to `opt_in` inclusion; an integration in the default\n`all_sessions` mode is added regardless. For a server the platform does not\nprovide, define it instead (`McpStdioServer` /\n`McpRemoteServer`).",
1557
+ "properties": {
1558
+ "name": {
1559
+ "title": "Name",
1560
+ "type": "string"
1561
+ }
1562
+ },
1563
+ "required": [
1564
+ "name"
1565
+ ],
1566
+ "title": "McpServerRef",
1567
+ "type": "object"
1568
+ },
1569
+ "McpStdioServer": {
1570
+ "additionalProperties": false,
1571
+ "description": "A bring-your-own stdio MCP server: the harness spawns `command` inside\nthe sandbox and speaks JSON-RPC over its stdin/stdout. The command must be\nrunnable in the sandbox image \u2014 install its runtime via `hooks.build_base` /\n`hooks.after_checkout` if the managed environment lacks it.\n\n`env` values may embed `${NAME}` references, resolved at run time from the\naccount's secrets store (see `mcp_secret_refs`); everything else is passed\nliterally.",
1572
+ "properties": {
1573
+ "args": {
1574
+ "default": [],
1575
+ "items": {
1576
+ "type": "string"
1577
+ },
1578
+ "title": "Args",
1579
+ "type": "array"
1580
+ },
1581
+ "command": {
1582
+ "title": "Command",
1583
+ "type": "string"
1584
+ },
1585
+ "env": {
1586
+ "additionalProperties": {
1587
+ "type": "string"
1588
+ },
1589
+ "default": {},
1590
+ "title": "Env",
1591
+ "type": "object"
1592
+ },
1593
+ "name": {
1594
+ "title": "Name",
1595
+ "type": "string"
1596
+ }
1597
+ },
1598
+ "required": [
1599
+ "args",
1600
+ "command",
1601
+ "env",
1602
+ "name"
1603
+ ],
1604
+ "title": "McpStdioServer",
1605
+ "type": "object"
1606
+ },
1607
+ "MemorySize": {
1608
+ "additionalProperties": false,
1609
+ "description": "A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).\nSet any of `gb`/`mb` (at least one). The alternative to the `8GB`-style\nshorthand string.",
1610
+ "properties": {
1611
+ "gb": {
1612
+ "anyOf": [
1613
+ {
1614
+ "minimum": 0,
1615
+ "type": "integer"
1616
+ },
1617
+ {
1618
+ "type": "null"
1619
+ }
1620
+ ],
1621
+ "default": null,
1622
+ "title": "Gb"
1623
+ },
1624
+ "mb": {
1625
+ "anyOf": [
1626
+ {
1627
+ "minimum": 0,
1628
+ "type": "integer"
1629
+ },
1630
+ {
1631
+ "type": "null"
1632
+ }
1633
+ ],
1634
+ "default": null,
1635
+ "title": "Mb"
1636
+ }
1637
+ },
1638
+ "required": [
1639
+ "gb",
1640
+ "mb"
1641
+ ],
1642
+ "title": "MemorySize",
1643
+ "type": "object"
1644
+ },
1645
+ "OutputConfig": {
1646
+ "additionalProperties": false,
1647
+ "description": "JSON Schema for the harness's structured result, when certified.",
1648
+ "properties": {
1649
+ "json_schema": {
1650
+ "additionalProperties": true,
1651
+ "title": "Json Schema",
1652
+ "type": "object"
1653
+ }
1654
+ },
1655
+ "required": [
1656
+ "json_schema"
1657
+ ],
1658
+ "title": "OutputConfig",
1659
+ "type": "object"
1660
+ },
1661
+ "PermissionsConfig": {
1662
+ "additionalProperties": false,
1663
+ "description": "What the agent is allowed to touch, per credential the platform mints\ninto its sandbox. Distinct from `environment:`, which is where the agent\nruns; this is what it may do from there.\n\n`ellipsis` scopes the sandbox's Ellipsis API token\n(`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates\nwith). `true` / the string `all` (the default) grant the full sandbox\nceiling \u2014 everything a sandbox token can ever do. A map narrows it per\nresource (see `EllipsisPermissions`); the minted token carries\nthe intersection, so a config can only ever reduce access. `false` fails\nvalidation \u2014 an agent with no API token cannot report its own progress.\n\n`github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) \u2014\nsee `GithubPermissions`. GitHub enforces it at mint time.",
1664
+ "properties": {
1665
+ "ellipsis": {
1666
+ "anyOf": [
1667
+ {
1668
+ "enum": [
1669
+ true,
1670
+ "all"
1671
+ ]
1672
+ },
1673
+ {
1674
+ "$ref": "#/$defs/EllipsisPermissions"
1675
+ }
1676
+ ],
1677
+ "default": true,
1678
+ "title": "Ellipsis"
1679
+ },
1680
+ "github": {
1681
+ "$ref": "#/$defs/GithubPermissions",
1682
+ "default": {
1683
+ "permissions": null,
1684
+ "repositories": null
1685
+ }
1686
+ }
1687
+ },
1688
+ "required": [
1689
+ "ellipsis",
1690
+ "github"
1691
+ ],
1692
+ "title": "PermissionsConfig",
1693
+ "type": "object"
1694
+ },
1695
+ "PromptBlockedReason": {
1696
+ "description": "Why direct prompting is refused. Absent when prompting is allowed.",
1697
+ "enum": [
1698
+ "mention_surface",
1699
+ "ephemeral_trigger",
1700
+ "non_interactive",
1701
+ "harness_single_turn",
1702
+ "closed"
1703
+ ],
1704
+ "title": "PromptBlockedReason",
1705
+ "type": "string"
1706
+ },
1707
+ "PullRequestAction": {
1708
+ "enum": [
1709
+ "opened",
1710
+ "pushed",
1711
+ "merged",
1712
+ "closed",
1713
+ "review_submitted",
1714
+ "commented"
1715
+ ],
1716
+ "title": "PullRequestAction",
1717
+ "type": "string"
1718
+ },
1719
+ "ReactIssue": {
1720
+ "additionalProperties": false,
1721
+ "properties": {
1722
+ "for": {
1723
+ "$ref": "#/$defs/GithubAccountSelector"
1724
+ },
1725
+ "labels": {
1726
+ "default": [],
1727
+ "items": {
1728
+ "type": "string"
1729
+ },
1730
+ "title": "Labels",
1731
+ "type": "array"
1732
+ },
1733
+ "on": {
1734
+ "items": {
1735
+ "$ref": "#/$defs/IssueAction"
1736
+ },
1737
+ "title": "On",
1738
+ "type": "array"
1739
+ },
1740
+ "repositories": {
1741
+ "$ref": "#/$defs/RepositoryFilter"
1742
+ }
1743
+ },
1744
+ "required": [
1745
+ "for",
1746
+ "labels",
1747
+ "on",
1748
+ "repositories"
1749
+ ],
1750
+ "title": "ReactIssue",
1751
+ "type": "object"
1752
+ },
1753
+ "ReactLinearIssue": {
1754
+ "additionalProperties": false,
1755
+ "properties": {
1756
+ "for": {
1757
+ "$ref": "#/$defs/GithubAccountSelector"
1758
+ },
1759
+ "on": {
1760
+ "default": [
1761
+ "opened"
1762
+ ],
1763
+ "items": {
1764
+ "$ref": "#/$defs/LinearIssueAction"
1765
+ },
1766
+ "title": "On",
1767
+ "type": "array"
1768
+ }
1769
+ },
1770
+ "required": [
1771
+ "for",
1772
+ "on"
1773
+ ],
1774
+ "title": "ReactLinearIssue",
1775
+ "type": "object"
1776
+ },
1777
+ "ReactPullRequest": {
1778
+ "additionalProperties": false,
1779
+ "properties": {
1780
+ "base": {
1781
+ "default": [],
1782
+ "items": {
1783
+ "type": "string"
1784
+ },
1785
+ "title": "Base",
1786
+ "type": "array"
1787
+ },
1788
+ "draft": {
1789
+ "anyOf": [
1790
+ {
1791
+ "type": "boolean"
1792
+ },
1793
+ {
1794
+ "type": "null"
1795
+ }
1796
+ ],
1797
+ "default": null,
1798
+ "title": "Draft"
1799
+ },
1800
+ "for": {
1801
+ "$ref": "#/$defs/GithubAccountSelector"
1802
+ },
1803
+ "head": {
1804
+ "default": [],
1805
+ "items": {
1806
+ "type": "string"
1807
+ },
1808
+ "title": "Head",
1809
+ "type": "array"
1810
+ },
1811
+ "labels": {
1812
+ "default": [],
1813
+ "items": {
1814
+ "type": "string"
1815
+ },
1816
+ "title": "Labels",
1817
+ "type": "array"
1818
+ },
1819
+ "on": {
1820
+ "items": {
1821
+ "$ref": "#/$defs/PullRequestAction"
1822
+ },
1823
+ "title": "On",
1824
+ "type": "array"
1825
+ },
1826
+ "paths": {
1827
+ "default": [],
1828
+ "items": {
1829
+ "type": "string"
1830
+ },
1831
+ "title": "Paths",
1832
+ "type": "array"
1833
+ },
1834
+ "repositories": {
1835
+ "$ref": "#/$defs/RepositoryFilter"
1836
+ }
1837
+ },
1838
+ "required": [
1839
+ "base",
1840
+ "draft",
1841
+ "for",
1842
+ "head",
1843
+ "labels",
1844
+ "on",
1845
+ "paths",
1846
+ "repositories"
1847
+ ],
1848
+ "title": "ReactPullRequest",
1849
+ "type": "object"
1850
+ },
1851
+ "ReactPush": {
1852
+ "additionalProperties": false,
1853
+ "properties": {
1854
+ "branch": {
1855
+ "default": [],
1856
+ "items": {
1857
+ "type": "string"
1858
+ },
1859
+ "title": "Branch",
1860
+ "type": "array"
1861
+ },
1862
+ "for": {
1863
+ "$ref": "#/$defs/GithubAccountSelector"
1864
+ },
1865
+ "paths": {
1866
+ "default": [],
1867
+ "items": {
1868
+ "type": "string"
1869
+ },
1870
+ "title": "Paths",
1871
+ "type": "array"
1872
+ },
1873
+ "repositories": {
1874
+ "$ref": "#/$defs/RepositoryFilter"
1875
+ }
1876
+ },
1877
+ "required": [
1878
+ "branch",
1879
+ "for",
1880
+ "paths",
1881
+ "repositories"
1882
+ ],
1883
+ "title": "ReactPush",
1884
+ "type": "object"
1885
+ },
1886
+ "ReactSentry": {
1887
+ "additionalProperties": false,
1888
+ "properties": {
1889
+ "on": {
1890
+ "items": {
1891
+ "$ref": "#/$defs/SentryAction"
1892
+ },
1893
+ "title": "On",
1894
+ "type": "array"
1895
+ },
1896
+ "projects": {
1897
+ "default": [],
1898
+ "items": {
1899
+ "type": "string"
1900
+ },
1901
+ "title": "Projects",
1902
+ "type": "array"
1903
+ }
1904
+ },
1905
+ "required": [
1906
+ "on",
1907
+ "projects"
1908
+ ],
1909
+ "title": "ReactSentry",
1910
+ "type": "object"
1911
+ },
1912
+ "ReactSlackChannel": {
1913
+ "additionalProperties": false,
1914
+ "properties": {},
1915
+ "title": "ReactSlackChannel",
1916
+ "type": "object"
1917
+ },
1918
+ "ReactTrigger": {
1919
+ "additionalProperties": false,
1920
+ "properties": {
1921
+ "issue": {
1922
+ "anyOf": [
1923
+ {
1924
+ "$ref": "#/$defs/ReactIssue"
1925
+ },
1926
+ {
1927
+ "type": "null"
1928
+ }
1929
+ ],
1930
+ "default": null
1931
+ },
1932
+ "linear_issue": {
1933
+ "anyOf": [
1934
+ {
1935
+ "$ref": "#/$defs/ReactLinearIssue"
1936
+ },
1937
+ {
1938
+ "type": "null"
1939
+ }
1940
+ ],
1941
+ "default": null
1942
+ },
1943
+ "pull_request": {
1944
+ "anyOf": [
1945
+ {
1946
+ "$ref": "#/$defs/ReactPullRequest"
1947
+ },
1948
+ {
1949
+ "type": "null"
1950
+ }
1951
+ ],
1952
+ "default": null
1953
+ },
1954
+ "push": {
1955
+ "anyOf": [
1956
+ {
1957
+ "$ref": "#/$defs/ReactPush"
1958
+ },
1959
+ {
1960
+ "type": "null"
1961
+ }
1962
+ ],
1963
+ "default": null
1964
+ },
1965
+ "sentry": {
1966
+ "anyOf": [
1967
+ {
1968
+ "$ref": "#/$defs/ReactSentry"
1969
+ },
1970
+ {
1971
+ "type": "null"
1972
+ }
1973
+ ],
1974
+ "default": null
1975
+ },
1976
+ "slack_channel": {
1977
+ "anyOf": [
1978
+ {
1979
+ "$ref": "#/$defs/ReactSlackChannel"
1980
+ },
1981
+ {
1982
+ "type": "null"
1983
+ }
1984
+ ],
1985
+ "default": null
1986
+ },
1987
+ "type": {
1988
+ "const": "react",
1989
+ "default": "react",
1990
+ "title": "Type",
1991
+ "type": "string"
1992
+ }
1993
+ },
1994
+ "required": [
1995
+ "issue",
1996
+ "linear_issue",
1997
+ "pull_request",
1998
+ "push",
1999
+ "sentry",
2000
+ "slack_channel",
2001
+ "type"
2002
+ ],
2003
+ "title": "ReactTrigger",
2004
+ "type": "object"
2005
+ },
2006
+ "RepositoryFilter": {
2007
+ "anyOf": [
2008
+ {
2009
+ "additionalProperties": false,
2010
+ "description": "The watch scope of a trigger, by repository name (owner defaults to the\naccount). Include minus exclude: `include: []` (the default) covers every\nrepository of the installation, so `exclude`-only means \"all except these\"\nand keeps covering repositories added to the org later. A bare list is\nshorthand for `include`.",
2011
+ "properties": {
2012
+ "exclude": {
2013
+ "default": [],
2014
+ "items": {
2015
+ "type": "string"
2016
+ },
2017
+ "title": "Exclude",
2018
+ "type": "array"
2019
+ },
2020
+ "include": {
2021
+ "default": [],
2022
+ "items": {
2023
+ "type": "string"
2024
+ },
2025
+ "title": "Include",
2026
+ "type": "array"
2027
+ }
2028
+ },
2029
+ "required": [
2030
+ "exclude",
2031
+ "include"
2032
+ ],
2033
+ "title": "RepositoryFilter",
2034
+ "type": "object"
2035
+ },
2036
+ {
2037
+ "items": {
2038
+ "type": "string"
2039
+ },
2040
+ "type": "array"
2041
+ }
2042
+ ]
2043
+ },
2044
+ "RepositoryRef": {
2045
+ "additionalProperties": false,
2046
+ "properties": {
2047
+ "name": {
2048
+ "title": "Name",
2049
+ "type": "string"
2050
+ },
2051
+ "owner": {
2052
+ "anyOf": [
2053
+ {
2054
+ "type": "string"
2055
+ },
2056
+ {
2057
+ "type": "null"
2058
+ }
2059
+ ],
2060
+ "default": null,
2061
+ "title": "Owner"
2062
+ },
2063
+ "ref": {
2064
+ "anyOf": [
2065
+ {
2066
+ "type": "string"
2067
+ },
2068
+ {
2069
+ "type": "null"
2070
+ }
2071
+ ],
2072
+ "default": null,
2073
+ "title": "Ref"
2074
+ }
2075
+ },
2076
+ "required": [
2077
+ "name",
2078
+ "owner",
2079
+ "ref"
2080
+ ],
2081
+ "title": "RepositoryRef",
2082
+ "type": "object"
2083
+ },
2084
+ "Resource": {
2085
+ "description": "Everything a credential can be granted access to, one value per /v1\nresource family. `TOKENS` is reserved for the future token-management\nroutes; nothing maps to it yet.",
2086
+ "enum": [
2087
+ "account",
2088
+ "alerts",
2089
+ "sessions",
2090
+ "files",
2091
+ "memories",
2092
+ "reviews",
2093
+ "configs",
2094
+ "defaults",
2095
+ "environments",
2096
+ "secrets",
2097
+ "templates",
2098
+ "integrations",
2099
+ "tokens",
2100
+ "webhooks",
2101
+ "user"
2102
+ ],
2103
+ "title": "Resource",
2104
+ "type": "string"
2105
+ },
2106
+ "SandboxCacheTier": {
2107
+ "description": "Which image-cache tier a sandbox creation took \u2014 the customer-facing\nnames for `create_sandbox_from_default`'s exact / latest / default tiers.\nRides on `Sandbox.cache_tier` and the sandbox_ready lifecycle record.",
2108
+ "enum": [
2109
+ "exact",
2110
+ "incremental",
2111
+ "full"
2112
+ ],
2113
+ "title": "SandboxCacheTier",
2114
+ "type": "string"
2115
+ },
2116
+ "SandboxPort": {
2117
+ "properties": {
2118
+ "port": {
2119
+ "title": "Port",
2120
+ "type": "integer"
2121
+ },
2122
+ "tcp_host": {
2123
+ "anyOf": [
2124
+ {
2125
+ "type": "string"
2126
+ },
2127
+ {
2128
+ "type": "null"
2129
+ }
2130
+ ],
2131
+ "default": null,
2132
+ "title": "Tcp Host"
2133
+ },
2134
+ "tcp_port": {
2135
+ "anyOf": [
2136
+ {
2137
+ "type": "integer"
2138
+ },
2139
+ {
2140
+ "type": "null"
2141
+ }
2142
+ ],
2143
+ "default": null,
2144
+ "title": "Tcp Port"
2145
+ },
2146
+ "tls_host": {
2147
+ "title": "Tls Host",
2148
+ "type": "string"
2149
+ },
2150
+ "tls_port": {
2151
+ "title": "Tls Port",
2152
+ "type": "integer"
2153
+ },
2154
+ "tunnel_url": {
2155
+ "title": "Tunnel Url",
2156
+ "type": "string"
2157
+ },
2158
+ "unencrypted_host": {
2159
+ "anyOf": [
2160
+ {
2161
+ "type": "string"
2162
+ },
2163
+ {
2164
+ "type": "null"
2165
+ }
2166
+ ],
2167
+ "default": null,
2168
+ "title": "Unencrypted Host"
2169
+ },
2170
+ "unencrypted_port": {
2171
+ "anyOf": [
2172
+ {
2173
+ "type": "integer"
2174
+ },
2175
+ {
2176
+ "type": "null"
2177
+ }
2178
+ ],
2179
+ "default": null,
2180
+ "title": "Unencrypted Port"
2181
+ }
2182
+ },
2183
+ "required": [
2184
+ "port",
2185
+ "tcp_host",
2186
+ "tcp_port",
2187
+ "tls_host",
2188
+ "tls_port",
2189
+ "tunnel_url",
2190
+ "unencrypted_host",
2191
+ "unencrypted_port"
2192
+ ],
2193
+ "title": "SandboxPort",
2194
+ "type": "object"
2195
+ },
2196
+ "SandboxRepository": {
2197
+ "properties": {
2198
+ "id": {
2199
+ "title": "Id",
2200
+ "type": "integer"
2201
+ },
2202
+ "name": {
2203
+ "title": "Name",
2204
+ "type": "string"
2205
+ },
2206
+ "owner_id": {
2207
+ "title": "Owner Id",
2208
+ "type": "integer"
2209
+ },
2210
+ "owner_name": {
2211
+ "title": "Owner Name",
2212
+ "type": "string"
2213
+ },
2214
+ "sha": {
2215
+ "title": "Sha",
2216
+ "type": "string"
2217
+ }
2218
+ },
2219
+ "required": [
2220
+ "id",
2221
+ "name",
2222
+ "owner_id",
2223
+ "owner_name",
2224
+ "sha"
2225
+ ],
2226
+ "title": "SandboxRepository",
2227
+ "type": "object"
2228
+ },
2229
+ "SandboxSnapshotFrame": {
2230
+ "properties": {
2231
+ "sandbox": {
2232
+ "$ref": "#/$defs/VMExecutionResponse"
2233
+ },
2234
+ "type": {
2235
+ "const": "snapshot",
2236
+ "default": "snapshot",
2237
+ "title": "Type",
2238
+ "type": "string"
2239
+ }
2240
+ },
2241
+ "required": [
2242
+ "sandbox",
2243
+ "type"
2244
+ ],
2245
+ "title": "SandboxSnapshotFrame",
2246
+ "type": "object"
2247
+ },
2248
+ "SandboxSource": {
2249
+ "enum": [
2250
+ "cli",
2251
+ "web_ui",
2252
+ "ingest_pull_request_job_run",
2253
+ "session",
2254
+ "image_refresh",
2255
+ "test",
2256
+ "script"
2257
+ ],
2258
+ "title": "SandboxSource",
2259
+ "type": "string"
2260
+ },
2261
+ "SandboxStatus": {
2262
+ "enum": [
2263
+ "scheduled",
2264
+ "building",
2265
+ "running",
2266
+ "released",
2267
+ "terminating",
2268
+ "terminated",
2269
+ "failed"
2270
+ ],
2271
+ "title": "SandboxStatus",
2272
+ "type": "string"
2273
+ },
2274
+ "SandboxType": {
2275
+ "enum": [
2276
+ "claude_code"
2277
+ ],
2278
+ "title": "SandboxType",
2279
+ "type": "string"
2280
+ },
2281
+ "SandboxUpdateFrame": {
2282
+ "properties": {
2283
+ "sandbox": {
2284
+ "$ref": "#/$defs/VMExecutionResponse"
2285
+ },
2286
+ "type": {
2287
+ "const": "sandbox",
2288
+ "default": "sandbox",
2289
+ "title": "Type",
2290
+ "type": "string"
2291
+ }
2292
+ },
2293
+ "required": [
2294
+ "sandbox",
2295
+ "type"
2296
+ ],
2297
+ "title": "SandboxUpdateFrame",
2298
+ "type": "object"
2299
+ },
2300
+ "SentryAction": {
2301
+ "enum": [
2302
+ "issue_alert",
2303
+ "metric_alert"
2304
+ ],
2305
+ "title": "SentryAction",
2306
+ "type": "string"
2307
+ },
2308
+ "SentryAlertEvent": {
2309
+ "properties": {
2310
+ "action": {
2311
+ "$ref": "#/$defs/SentryAction"
2312
+ },
2313
+ "actor": {
2314
+ "anyOf": [
2315
+ {
2316
+ "$ref": "#/$defs/SessionEventActor"
2317
+ },
2318
+ {
2319
+ "type": "null"
2320
+ }
2321
+ ],
2322
+ "default": null
2323
+ },
2324
+ "organization_slug": {
2325
+ "title": "Organization Slug",
2326
+ "type": "string"
2327
+ },
2328
+ "project_slug": {
2329
+ "anyOf": [
2330
+ {
2331
+ "type": "string"
2332
+ },
2333
+ {
2334
+ "type": "null"
2335
+ }
2336
+ ],
2337
+ "default": null,
2338
+ "title": "Project Slug"
2339
+ },
2340
+ "title": {
2341
+ "anyOf": [
2342
+ {
2343
+ "type": "string"
2344
+ },
2345
+ {
2346
+ "type": "null"
2347
+ }
2348
+ ],
2349
+ "default": null,
2350
+ "title": "Title"
2351
+ },
2352
+ "type": {
2353
+ "const": "sentry.alert",
2354
+ "default": "sentry.alert",
2355
+ "title": "Type",
2356
+ "type": "string"
2357
+ },
2358
+ "url": {
2359
+ "anyOf": [
2360
+ {
2361
+ "type": "string"
2362
+ },
2363
+ {
2364
+ "type": "null"
2365
+ }
2366
+ ],
2367
+ "default": null,
2368
+ "title": "Url"
2369
+ }
2370
+ },
2371
+ "required": [
2372
+ "action",
2373
+ "actor",
2374
+ "organization_slug",
2375
+ "project_slug",
2376
+ "title",
2377
+ "type",
2378
+ "url"
2379
+ ],
2380
+ "title": "SentryAlertEvent",
2381
+ "type": "object"
2382
+ },
2383
+ "Session": {
2384
+ "additionalProperties": false,
2385
+ "allOf": [
2386
+ {
2387
+ "oneOf": [
2388
+ {
2389
+ "properties": {
2390
+ "claude_code": {
2391
+ "additionalProperties": true,
2392
+ "type": "object"
2393
+ },
2394
+ "codex": {
2395
+ "type": "null"
2396
+ }
2397
+ },
2398
+ "required": [
2399
+ "claude_code",
2400
+ "codex"
2401
+ ]
2402
+ },
2403
+ {
2404
+ "properties": {
2405
+ "claude_code": {
2406
+ "type": "null"
2407
+ },
2408
+ "codex": {
2409
+ "additionalProperties": true,
2410
+ "type": "object"
2411
+ }
2412
+ },
2413
+ "required": [
2414
+ "claude_code",
2415
+ "codex"
2416
+ ]
2417
+ }
2418
+ ]
2419
+ }
2420
+ ],
2421
+ "description": "An agent session: one conversation with an agent, from trigger to\nterminal state. Returned by `GET /v1/sessions/{id}` and carried by the\nsession stream's `session`/`snapshot` frames \u2014 REST and stream never\ndisagree about what a session looks like.",
2422
+ "properties": {
2423
+ "agent": {
2424
+ "anyOf": [
2425
+ {
2426
+ "$ref": "#/$defs/SessionAgent"
2427
+ },
2428
+ {
2429
+ "type": "null"
2430
+ }
2431
+ ],
2432
+ "default": null,
2433
+ "description": "The agent the session was started from, or null for a raw session started with POST /v1/sessions."
2434
+ },
2435
+ "attribution": {
2436
+ "$ref": "#/$defs/SessionAttribution",
2437
+ "description": "The principal this session is attributed to."
2438
+ },
2439
+ "budget": {
2440
+ "default": 0,
2441
+ "description": "The spend budget enforced for this session, in US dollars, after resolving defaults and ceilings.",
2442
+ "title": "Budget",
2443
+ "type": "number"
2444
+ },
2445
+ "claude_code": {
2446
+ "anyOf": [
2447
+ {
2448
+ "$ref": "#/$defs/ClaudeConfig"
2449
+ },
2450
+ {
2451
+ "type": "null"
2452
+ }
2453
+ ],
2454
+ "default": null,
2455
+ "description": "Claude Code input and native options. Set exactly one of claude_code or codex."
2456
+ },
2457
+ "codex": {
2458
+ "anyOf": [
2459
+ {
2460
+ "$ref": "#/$defs/CodexConfig"
2461
+ },
2462
+ {
2463
+ "type": "null"
2464
+ }
2465
+ ],
2466
+ "default": null,
2467
+ "description": "Codex input and native options. Set exactly one of claude_code or codex."
2468
+ },
2469
+ "cost": {
2470
+ "$ref": "#/$defs/SessionCost",
2471
+ "description": "What the session cost, in millicents, broken down by leg and carrying its own total."
2472
+ },
2473
+ "environment": {
2474
+ "$ref": "#/$defs/SessionEnvironment",
2475
+ "description": "The full environment configuration frozen when the session was created, with the saved environment's id and how it was chosen."
2476
+ },
2477
+ "event": {
2478
+ "anyOf": [
2479
+ {
2480
+ "discriminator": {
2481
+ "mapping": {
2482
+ "github.issue": "#/$defs/GithubIssueEvent",
2483
+ "github.pull_request": "#/$defs/GithubPullRequestEvent",
2484
+ "github.push": "#/$defs/GithubPushEvent",
2485
+ "linear.issue": "#/$defs/LinearIssueEvent",
2486
+ "sentry.alert": "#/$defs/SentryAlertEvent",
2487
+ "slack.channel_created": "#/$defs/SlackChannelCreatedEvent",
2488
+ "slack.message": "#/$defs/SlackMessageEvent"
2489
+ },
2490
+ "propertyName": "type"
2491
+ },
2492
+ "oneOf": [
2493
+ {
2494
+ "$ref": "#/$defs/GithubPullRequestEvent"
2495
+ },
2496
+ {
2497
+ "$ref": "#/$defs/GithubIssueEvent"
2498
+ },
2499
+ {
2500
+ "$ref": "#/$defs/GithubPushEvent"
2501
+ },
2502
+ {
2503
+ "$ref": "#/$defs/LinearIssueEvent"
2504
+ },
2505
+ {
2506
+ "$ref": "#/$defs/SlackMessageEvent"
2507
+ },
2508
+ {
2509
+ "$ref": "#/$defs/SlackChannelCreatedEvent"
2510
+ },
2511
+ {
2512
+ "$ref": "#/$defs/SentryAlertEvent"
2513
+ }
2514
+ ]
2515
+ },
2516
+ {
2517
+ "type": "null"
2518
+ }
2519
+ ],
2520
+ "default": null,
2521
+ "description": "The typed external event that started the session; null for direct and scheduled starts.",
2522
+ "title": "Event"
2523
+ },
2524
+ "git": {
2525
+ "anyOf": [
2526
+ {
2527
+ "$ref": "#/$defs/SessionGit"
2528
+ },
2529
+ {
2530
+ "type": "null"
2531
+ }
2532
+ ],
2533
+ "default": null,
2534
+ "description": "What the session did to git, one entry per repository in its workspace: the commit and branch it sits on, per-file line counts for its uncommitted changes, and the pull requests it opened. Null if nothing was ever captured."
2535
+ },
2536
+ "handler": {
2537
+ "anyOf": [
2538
+ {
2539
+ "$ref": "#/$defs/SessionHandler"
2540
+ },
2541
+ {
2542
+ "type": "null"
2543
+ }
2544
+ ],
2545
+ "default": null,
2546
+ "description": "The saved handler and its effective display name when this session started, frozen at creation. Null for built-in responders, legacy sessions, and sessions started without a handler."
2547
+ },
2548
+ "id": {
2549
+ "description": "Unique identifier of the session.",
2550
+ "title": "Id",
2551
+ "type": "string"
2552
+ },
2553
+ "lifecycle": {
2554
+ "$ref": "#/$defs/SessionLifecycle",
2555
+ "description": "The session's activity, conversation state, messaging policy, outcomes, and timestamps."
2556
+ },
2557
+ "metadata": {
2558
+ "additionalProperties": {
2559
+ "type": "string"
2560
+ },
2561
+ "default": {},
2562
+ "description": "Caller-supplied metadata key-value pairs.",
2563
+ "title": "Metadata",
2564
+ "type": "object"
2565
+ },
2566
+ "output": {
2567
+ "anyOf": [
2568
+ {
2569
+ "$ref": "#/$defs/OutputConfig"
2570
+ },
2571
+ {
2572
+ "type": "null"
2573
+ }
2574
+ ],
2575
+ "default": null,
2576
+ "description": "The structured-output exit contract for this session."
2577
+ },
2578
+ "parent": {
2579
+ "anyOf": [
2580
+ {
2581
+ "$ref": "#/$defs/SessionParent"
2582
+ },
2583
+ {
2584
+ "type": "null"
2585
+ }
2586
+ ],
2587
+ "default": null,
2588
+ "description": "The predecessor session this session continues; null when there is none."
2589
+ },
2590
+ "permissions": {
2591
+ "$ref": "#/$defs/PermissionsConfig",
2592
+ "description": "What the session may touch, per minted credential."
2593
+ },
2594
+ "skills": {
2595
+ "description": "Skills installed for this session.",
2596
+ "items": {
2597
+ "$ref": "#/$defs/SkillRef"
2598
+ },
2599
+ "title": "Skills",
2600
+ "type": "array"
2601
+ },
2602
+ "source": {
2603
+ "$ref": "#/$defs/SessionSource",
2604
+ "description": "Where the session came from (e.g. react, web, api, cli, mention, cron)."
2605
+ },
2606
+ "summary": {
2607
+ "anyOf": [
2608
+ {
2609
+ "$ref": "#/$defs/SessionSummary"
2610
+ },
2611
+ {
2612
+ "type": "null"
2613
+ }
2614
+ ],
2615
+ "default": null,
2616
+ "description": "The latest live summary of the session's progress while it runs, and when it was generated."
2617
+ },
2618
+ "tokens": {
2619
+ "$ref": "#/$defs/SessionTokens",
2620
+ "description": "The tokens the session spent and the model they went to. `total` includes the prompt-cache lanes."
2621
+ }
2622
+ },
2623
+ "required": [
2624
+ "agent",
2625
+ "attribution",
2626
+ "budget",
2627
+ "claude_code",
2628
+ "codex",
2629
+ "cost",
2630
+ "environment",
2631
+ "event",
2632
+ "git",
2633
+ "handler",
2634
+ "id",
2635
+ "lifecycle",
2636
+ "metadata",
2637
+ "output",
2638
+ "parent",
2639
+ "permissions",
2640
+ "skills",
2641
+ "source",
2642
+ "summary",
2643
+ "tokens"
2644
+ ],
2645
+ "title": "Session",
2646
+ "type": "object"
2647
+ },
2648
+ "SessionAgent": {
2649
+ "description": "The agent this session was started from: the definition frozen\nwhen the session was created, and the saved agent it came from as it\nexists NOW. They diverge legitimately \u2014 a YAML edit after the session\nstarted leaves the pointer describing something the session never ran.",
2650
+ "properties": {
2651
+ "config": {
2652
+ "$ref": "#/$defs/AgentConfig",
2653
+ "description": "The agent definition the session was started from, frozen when the session was created."
2654
+ },
2655
+ "id": {
2656
+ "anyOf": [
2657
+ {
2658
+ "type": "string"
2659
+ },
2660
+ {
2661
+ "type": "null"
2662
+ }
2663
+ ],
2664
+ "default": null,
2665
+ "description": "Identifier of the saved agent this session's snapshot was taken from. Null for a routing-file agent, a code-review stage agent, or the built-in mention agent, which have no saved agent behind them. Points at the agent as it exists now, which may have changed since.",
2666
+ "title": "Id"
2667
+ }
2668
+ },
2669
+ "required": [
2670
+ "config",
2671
+ "id"
2672
+ ],
2673
+ "title": "SessionAgent",
2674
+ "type": "object"
2675
+ },
2676
+ "SessionArchived": {
2677
+ "description": "When the session was archived and the GitHub user who archived it.",
2678
+ "properties": {
2679
+ "at": {
2680
+ "description": "When the session was archived.",
2681
+ "format": "date-time",
2682
+ "title": "At",
2683
+ "type": "string"
2684
+ },
2685
+ "by": {
2686
+ "anyOf": [
2687
+ {
2688
+ "$ref": "#/$defs/GithubAccountSnippet"
2689
+ },
2690
+ {
2691
+ "type": "null"
2692
+ }
2693
+ ],
2694
+ "default": null,
2695
+ "description": "The GitHub user who archived the session; null if unknown or unavailable."
2696
+ }
2697
+ },
2698
+ "required": [
2699
+ "at",
2700
+ "by"
2701
+ ],
2702
+ "title": "SessionArchived",
2703
+ "type": "object"
2704
+ },
2705
+ "SessionAttribution": {
2706
+ "description": "The principal a session is attributed to: what kind, its id, and \u2014 when\nthe kind is a GitHub user \u2014 the resolved display snippet.",
2707
+ "properties": {
2708
+ "id": {
2709
+ "anyOf": [
2710
+ {
2711
+ "type": "string"
2712
+ },
2713
+ {
2714
+ "type": "null"
2715
+ }
2716
+ ],
2717
+ "default": null,
2718
+ "description": "Identifier of the principal the session is attributed to.",
2719
+ "title": "Id"
2720
+ },
2721
+ "type": {
2722
+ "anyOf": [
2723
+ {
2724
+ "$ref": "#/$defs/AttributionType"
2725
+ },
2726
+ {
2727
+ "type": "null"
2728
+ }
2729
+ ],
2730
+ "default": null,
2731
+ "description": "Kind of principal the session is attributed to (e.g. a GitHub user or an API key)."
2732
+ },
2733
+ "user": {
2734
+ "anyOf": [
2735
+ {
2736
+ "$ref": "#/$defs/GithubAccountSnippet"
2737
+ },
2738
+ {
2739
+ "type": "null"
2740
+ }
2741
+ ],
2742
+ "default": null,
2743
+ "description": "The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user."
2744
+ }
2745
+ },
2746
+ "required": [
2747
+ "id",
2748
+ "type",
2749
+ "user"
2750
+ ],
2751
+ "title": "SessionAttribution",
2752
+ "type": "object"
2753
+ },
2754
+ "SessionConfig": {
2755
+ "additionalProperties": false,
2756
+ "allOf": [
2757
+ {
2758
+ "oneOf": [
2759
+ {
2760
+ "properties": {
2761
+ "claude_code": {
2762
+ "additionalProperties": true,
2763
+ "type": "object"
2764
+ },
2765
+ "codex": {
2766
+ "type": "null"
2767
+ }
2768
+ },
2769
+ "required": [
2770
+ "claude_code",
2771
+ "codex"
2772
+ ]
2773
+ },
2774
+ {
2775
+ "properties": {
2776
+ "claude_code": {
2777
+ "type": "null"
2778
+ },
2779
+ "codex": {
2780
+ "additionalProperties": true,
2781
+ "type": "object"
2782
+ }
2783
+ },
2784
+ "required": [
2785
+ "claude_code",
2786
+ "codex"
2787
+ ]
2788
+ }
2789
+ ]
2790
+ }
2791
+ ],
2792
+ "description": "What one session runs on: its selected harness, where it runs, what it\nmay touch, its skills, its exit contract, and its spend cap. Every session\nfreezes one of these (`sessions.session_config`); an agent\ncarries one under `session:` (`AgentConfig.session`); and\n`POST /v1/sessions` is this shape flattened onto the request body, plus the\nrun settings. Nothing in here is an agent's identity or trigger \u2014\nthose belong to `AgentConfig`.\n\nField order is the canonical key order for `session:` blocks and YAML\nexports: what runs (`claude_code` or `codex`), where (`environment`), what it may\ntouch (`permissions`), then the rest.",
2793
+ "properties": {
2794
+ "budget": {
2795
+ "$ref": "#/$defs/BudgetConfig",
2796
+ "default": {
2797
+ "day": null,
2798
+ "month": null,
2799
+ "session": null,
2800
+ "week": null
2801
+ }
2802
+ },
2803
+ "claude_code": {
2804
+ "anyOf": [
2805
+ {
2806
+ "$ref": "#/$defs/ClaudeConfig"
2807
+ },
2808
+ {
2809
+ "type": "null"
2810
+ }
2811
+ ],
2812
+ "default": null,
2813
+ "description": "Claude Code input and native options. Set exactly one of claude_code or codex."
2814
+ },
2815
+ "codex": {
2816
+ "anyOf": [
2817
+ {
2818
+ "$ref": "#/$defs/CodexConfig"
2819
+ },
2820
+ {
2821
+ "type": "null"
2822
+ }
2823
+ ],
2824
+ "default": null,
2825
+ "description": "Codex input and native options. Set exactly one of claude_code or codex."
2826
+ },
2827
+ "environment": {
2828
+ "anyOf": [
2829
+ {
2830
+ "type": "string"
2831
+ },
2832
+ {
2833
+ "$ref": "#/$defs/EnvironmentConfig"
2834
+ }
2835
+ ],
2836
+ "default": {
2837
+ "compute": {
2838
+ "cpu": null,
2839
+ "memory": null,
2840
+ "timeout": null
2841
+ },
2842
+ "hooks": {
2843
+ "after_checkout": null,
2844
+ "before_start": null,
2845
+ "build_base": null,
2846
+ "post_clone": null,
2847
+ "post_start": null
2848
+ },
2849
+ "mcp_servers": [],
2850
+ "repositories": [],
2851
+ "variables": []
2852
+ },
2853
+ "title": "Environment"
2854
+ },
2855
+ "output": {
2856
+ "anyOf": [
2857
+ {
2858
+ "$ref": "#/$defs/OutputConfig"
2859
+ },
2860
+ {
2861
+ "type": "null"
2862
+ }
2863
+ ],
2864
+ "default": null
2865
+ },
2866
+ "permissions": {
2867
+ "$ref": "#/$defs/PermissionsConfig",
2868
+ "default": {
2869
+ "ellipsis": true,
2870
+ "github": {
2871
+ "permissions": null,
2872
+ "repositories": null
2873
+ }
2874
+ }
2875
+ },
2876
+ "skills": {
2877
+ "default": [],
2878
+ "items": {
2879
+ "$ref": "#/$defs/SkillRef"
2880
+ },
2881
+ "title": "Skills",
2882
+ "type": "array"
2883
+ }
2884
+ },
2885
+ "required": [
2886
+ "budget",
2887
+ "claude_code",
2888
+ "codex",
2889
+ "environment",
2890
+ "output",
2891
+ "permissions",
2892
+ "skills"
2893
+ ],
2894
+ "title": "SessionConfig",
2895
+ "type": "object"
2896
+ },
2897
+ "SessionCost": {
2898
+ "description": "What a session (or one turn of it) cost, in millicents.\n\n`llm` is deliberately NOT called `tokens`: it would sit beside the `tokens`\nobject and read as \"the token count's cost\" rather than \"the cost of the\nLLM leg\".",
2899
+ "properties": {
2900
+ "cpu": {
2901
+ "default": 0,
2902
+ "description": "Sandbox CPU spend in millicents.",
2903
+ "title": "Cpu",
2904
+ "type": "integer"
2905
+ },
2906
+ "fee": {
2907
+ "default": 0,
2908
+ "description": "Platform fee in millicents.",
2909
+ "title": "Fee",
2910
+ "type": "integer"
2911
+ },
2912
+ "llm": {
2913
+ "default": 0,
2914
+ "description": "LLM spend in millicents.",
2915
+ "title": "Llm",
2916
+ "type": "integer"
2917
+ },
2918
+ "memory": {
2919
+ "default": 0,
2920
+ "description": "Sandbox memory spend in millicents.",
2921
+ "title": "Memory",
2922
+ "type": "integer"
2923
+ },
2924
+ "total": {
2925
+ "default": 0,
2926
+ "description": "The grand total in millicents: llm + cpu + memory + fee.",
2927
+ "title": "Total",
2928
+ "type": "integer"
2929
+ }
2930
+ },
2931
+ "required": [
2932
+ "cpu",
2933
+ "fee",
2934
+ "llm",
2935
+ "memory",
2936
+ "total"
2937
+ ],
2938
+ "title": "SessionCost",
2939
+ "type": "object"
2940
+ },
2941
+ "SessionEnvironment": {
2942
+ "additionalProperties": false,
2943
+ "description": "The environment configuration frozen at session creation, enriched with\nthe saved environment's identity and how it was chosen.",
2944
+ "properties": {
2945
+ "compute": {
2946
+ "$ref": "#/$defs/ComputeConfig",
2947
+ "default": {
2948
+ "cpu": null,
2949
+ "memory": null,
2950
+ "timeout": null
2951
+ }
2952
+ },
2953
+ "hooks": {
2954
+ "$ref": "#/$defs/EnvironmentHooks",
2955
+ "default": {
2956
+ "after_checkout": null,
2957
+ "before_start": null,
2958
+ "build_base": null,
2959
+ "post_clone": null,
2960
+ "post_start": null
2961
+ }
2962
+ },
2963
+ "id": {
2964
+ "anyOf": [
2965
+ {
2966
+ "type": "string"
2967
+ },
2968
+ {
2969
+ "type": "null"
2970
+ }
2971
+ ],
2972
+ "default": null,
2973
+ "description": "Identifier of the saved environment the session's config resolved. Null for an inline environment block or the built-in basic sandbox.",
2974
+ "title": "Id"
2975
+ },
2976
+ "mcp_servers": {
2977
+ "default": [],
2978
+ "items": {
2979
+ "anyOf": [
2980
+ {
2981
+ "type": "string"
2982
+ },
2983
+ {
2984
+ "$ref": "#/$defs/McpServerRef"
2985
+ },
2986
+ {
2987
+ "$ref": "#/$defs/McpStdioServer"
2988
+ },
2989
+ {
2990
+ "$ref": "#/$defs/McpRemoteServer"
2991
+ }
2992
+ ]
2993
+ },
2994
+ "title": "Mcp Servers",
2995
+ "type": "array"
2996
+ },
2997
+ "repositories": {
2998
+ "default": [],
2999
+ "items": {
3000
+ "$ref": "#/$defs/RepositoryRef"
3001
+ },
3002
+ "title": "Repositories",
3003
+ "type": "array"
3004
+ },
3005
+ "source": {
3006
+ "anyOf": [
3007
+ {
3008
+ "$ref": "#/$defs/EnvironmentSource"
3009
+ },
3010
+ {
3011
+ "type": "null"
3012
+ }
3013
+ ],
3014
+ "default": null,
3015
+ "description": "How the environment was chosen (request, agent, platform_default; repo_default and account_default on sessions from before those ladders were removed). An inline request uses request; an inline environment declared in session configuration has no source."
3016
+ },
3017
+ "variables": {
3018
+ "default": [],
3019
+ "items": {
3020
+ "$ref": "#/$defs/EnvironmentVariable"
3021
+ },
3022
+ "title": "Variables",
3023
+ "type": "array"
3024
+ }
3025
+ },
3026
+ "required": [
3027
+ "compute",
3028
+ "hooks",
3029
+ "id",
3030
+ "mcp_servers",
3031
+ "repositories",
3032
+ "source",
3033
+ "variables"
3034
+ ],
3035
+ "title": "SessionEnvironment",
3036
+ "type": "object"
3037
+ },
3038
+ "SessionEventActor": {
3039
+ "description": "The event's initiator, when known; never inferred from resource ownership.",
3040
+ "properties": {
3041
+ "avatar_url": {
3042
+ "anyOf": [
3043
+ {
3044
+ "type": "string"
3045
+ },
3046
+ {
3047
+ "type": "null"
3048
+ }
3049
+ ],
3050
+ "default": null,
3051
+ "title": "Avatar Url"
3052
+ },
3053
+ "is_bot": {
3054
+ "anyOf": [
3055
+ {
3056
+ "type": "boolean"
3057
+ },
3058
+ {
3059
+ "type": "null"
3060
+ }
3061
+ ],
3062
+ "default": null,
3063
+ "title": "Is Bot"
3064
+ },
3065
+ "name": {
3066
+ "title": "Name",
3067
+ "type": "string"
3068
+ }
3069
+ },
3070
+ "required": [
3071
+ "avatar_url",
3072
+ "is_bot",
3073
+ "name"
3074
+ ],
3075
+ "title": "SessionEventActor",
3076
+ "type": "object"
3077
+ },
3078
+ "SessionExecutionResult": {
3079
+ "description": "Outcome of the last finished execution, retained across subsequent resumes.\n\nAn execution spans a start or resume through parking or termination, and may\ncontain several turns. Admission failures also produce a result, even when\nprovisioning never starts.",
3080
+ "properties": {
3081
+ "completion_reason": {
3082
+ "$ref": "#/$defs/SessionExitStatus",
3083
+ "description": "Why the last execution ended; completed also includes parking an open conversation."
3084
+ },
3085
+ "detail": {
3086
+ "anyOf": [
3087
+ {
3088
+ "type": "string"
3089
+ },
3090
+ {
3091
+ "type": "null"
3092
+ }
3093
+ ],
3094
+ "default": null,
3095
+ "description": "Human-readable explanation of that outcome.",
3096
+ "title": "Detail"
3097
+ }
3098
+ },
3099
+ "required": [
3100
+ "completion_reason",
3101
+ "detail"
3102
+ ],
3103
+ "title": "SessionExecutionResult",
3104
+ "type": "object"
3105
+ },
3106
+ "SessionExitStatus": {
3107
+ "description": "Why a terminal agent session ended \u2014 a finer-grained reason than `status`.\n\n`status` (SessionStatus) is the lifecycle state: COMPLETED / ERROR /\nCANCELLED. `exit_status` explains *why* a run reached that terminal state, so\nthe UI and metrics can tell a budget cutoff apart from a crashed tool call or\na deliberate cancellation. It is None until the run reaches a terminal state.",
3108
+ "enum": [
3109
+ "completed",
3110
+ "budget_hit",
3111
+ "payment_required",
3112
+ "tool_call_failed",
3113
+ "lifecycle_hook_failed",
3114
+ "missing_repo_access",
3115
+ "missing_token_permissions",
3116
+ "missing_sandbox_variables",
3117
+ "blocked",
3118
+ "contact_email_required",
3119
+ "cancelled",
3120
+ "interrupted",
3121
+ "error",
3122
+ "stopped"
3123
+ ],
3124
+ "title": "SessionExitStatus",
3125
+ "type": "string"
3126
+ },
3127
+ "SessionGit": {
3128
+ "description": "Every repo the session touched. Small enough to ride on `sessions`\nand be returned by every session read.",
3129
+ "properties": {
3130
+ "repos": {
3131
+ "default": [],
3132
+ "items": {
3133
+ "$ref": "#/$defs/SessionGitRepo"
3134
+ },
3135
+ "title": "Repos",
3136
+ "type": "array"
3137
+ }
3138
+ },
3139
+ "required": [
3140
+ "repos"
3141
+ ],
3142
+ "title": "SessionGit",
3143
+ "type": "object"
3144
+ },
3145
+ "SessionGitCommit": {
3146
+ "description": "One commit the session created in this repo (everything past the\nprovisioning checkout's sha), captured from the sandbox rather than the\ntranscript so it stays correct through amends, rebases, and commits made by\nscripts. The repo is the parent object, so it is not repeated here.",
3147
+ "properties": {
3148
+ "committed_at": {
3149
+ "format": "date-time",
3150
+ "title": "Committed At",
3151
+ "type": "string"
3152
+ },
3153
+ "pushed": {
3154
+ "title": "Pushed",
3155
+ "type": "boolean"
3156
+ },
3157
+ "sha": {
3158
+ "title": "Sha",
3159
+ "type": "string"
3160
+ },
3161
+ "subject": {
3162
+ "title": "Subject",
3163
+ "type": "string"
3164
+ }
3165
+ },
3166
+ "required": [
3167
+ "committed_at",
3168
+ "pushed",
3169
+ "sha",
3170
+ "subject"
3171
+ ],
3172
+ "title": "SessionGitCommit",
3173
+ "type": "object"
3174
+ },
3175
+ "SessionGitFile": {
3176
+ "description": "One file's uncommitted change, as `git diff HEAD --numstat` reports it\n(with intent-to-add, so a brand-new file still counts).",
3177
+ "properties": {
3178
+ "additions": {
3179
+ "title": "Additions",
3180
+ "type": "integer"
3181
+ },
3182
+ "deletions": {
3183
+ "title": "Deletions",
3184
+ "type": "integer"
3185
+ },
3186
+ "path": {
3187
+ "title": "Path",
3188
+ "type": "string"
3189
+ },
3190
+ "status": {
3191
+ "title": "Status",
3192
+ "type": "string"
3193
+ }
3194
+ },
3195
+ "required": [
3196
+ "additions",
3197
+ "deletions",
3198
+ "path",
3199
+ "status"
3200
+ ],
3201
+ "title": "SessionGitFile",
3202
+ "type": "object"
3203
+ },
3204
+ "SessionGitPr": {
3205
+ "description": "A pull request the session opened in this repo, written the moment the\ncreating tool call's result lands (see extract_session_prs.PrCreateWatcher).\nLive PR state (open/merged/closed) is not stored \u2014 it lives on gh_prs,\njoined via `gh_pr_id` (GET /frontend/agents/sessions/{id}/git). The repo is\nthe parent object, so it is not repeated here.",
3206
+ "properties": {
3207
+ "gh_pr_id": {
3208
+ "anyOf": [
3209
+ {
3210
+ "type": "integer"
3211
+ },
3212
+ {
3213
+ "type": "null"
3214
+ }
3215
+ ],
3216
+ "default": null,
3217
+ "title": "Gh Pr Id"
3218
+ },
3219
+ "number": {
3220
+ "title": "Number",
3221
+ "type": "integer"
3222
+ },
3223
+ "title": {
3224
+ "anyOf": [
3225
+ {
3226
+ "type": "string"
3227
+ },
3228
+ {
3229
+ "type": "null"
3230
+ }
3231
+ ],
3232
+ "default": null,
3233
+ "title": "Title"
3234
+ },
3235
+ "url": {
3236
+ "title": "Url",
3237
+ "type": "string"
3238
+ }
3239
+ },
3240
+ "required": [
3241
+ "gh_pr_id",
3242
+ "number",
3243
+ "title",
3244
+ "url"
3245
+ ],
3246
+ "title": "SessionGitPr",
3247
+ "type": "object"
3248
+ },
3249
+ "SessionGitRepo": {
3250
+ "description": "One checkout in the session's sandbox and everything the session did to\nit, split by whether it survived the sandbox.",
3251
+ "properties": {
3252
+ "commits": {
3253
+ "default": [],
3254
+ "items": {
3255
+ "$ref": "#/$defs/SessionGitCommit"
3256
+ },
3257
+ "title": "Commits",
3258
+ "type": "array"
3259
+ },
3260
+ "commits_total": {
3261
+ "default": 0,
3262
+ "title": "Commits Total",
3263
+ "type": "integer"
3264
+ },
3265
+ "full_name": {
3266
+ "title": "Full Name",
3267
+ "type": "string"
3268
+ },
3269
+ "local_commit": {
3270
+ "anyOf": [
3271
+ {
3272
+ "type": "string"
3273
+ },
3274
+ {
3275
+ "type": "null"
3276
+ }
3277
+ ],
3278
+ "default": null,
3279
+ "title": "Local Commit"
3280
+ },
3281
+ "local_uncommitted_files": {
3282
+ "default": [],
3283
+ "items": {
3284
+ "$ref": "#/$defs/SessionGitFile"
3285
+ },
3286
+ "title": "Local Uncommitted Files",
3287
+ "type": "array"
3288
+ },
3289
+ "prs": {
3290
+ "default": [],
3291
+ "items": {
3292
+ "$ref": "#/$defs/SessionGitPr"
3293
+ },
3294
+ "title": "Prs",
3295
+ "type": "array"
3296
+ },
3297
+ "remote_branch": {
3298
+ "anyOf": [
3299
+ {
3300
+ "type": "string"
3301
+ },
3302
+ {
3303
+ "type": "null"
3304
+ }
3305
+ ],
3306
+ "default": null,
3307
+ "title": "Remote Branch"
3308
+ },
3309
+ "remote_commit": {
3310
+ "anyOf": [
3311
+ {
3312
+ "type": "string"
3313
+ },
3314
+ {
3315
+ "type": "null"
3316
+ }
3317
+ ],
3318
+ "default": null,
3319
+ "title": "Remote Commit"
3320
+ }
3321
+ },
3322
+ "required": [
3323
+ "commits",
3324
+ "commits_total",
3325
+ "full_name",
3326
+ "local_commit",
3327
+ "local_uncommitted_files",
3328
+ "prs",
3329
+ "remote_branch",
3330
+ "remote_commit"
3331
+ ],
3332
+ "title": "SessionGitRepo",
3333
+ "type": "object"
3334
+ },
3335
+ "SessionHandler": {
3336
+ "description": "The saved handler and its display name when the session started.",
3337
+ "properties": {
3338
+ "agent_name": {
3339
+ "description": "The handler's effective display name when the session started: ellipsis.name, or the service default (Slack, GitHub, Linear, or sentry).",
3340
+ "minLength": 1,
3341
+ "title": "Agent Name",
3342
+ "type": "string"
3343
+ },
3344
+ "id": {
3345
+ "description": "Identifier of the saved handler.",
3346
+ "minLength": 1,
3347
+ "title": "Id",
3348
+ "type": "string"
3349
+ },
3350
+ "service": {
3351
+ "$ref": "#/$defs/HandlerService",
3352
+ "description": "The service the handler responds to."
3353
+ },
3354
+ "sha": {
3355
+ "description": "Content fingerprint of the validated handler configuration used when the session started. This is not the Git commit SHA.",
3356
+ "minLength": 1,
3357
+ "title": "Sha",
3358
+ "type": "string"
3359
+ }
3360
+ },
3361
+ "required": [
3362
+ "agent_name",
3363
+ "id",
3364
+ "service",
3365
+ "sha"
3366
+ ],
3367
+ "title": "SessionHandler",
3368
+ "type": "object"
3369
+ },
3370
+ "SessionLifecycle": {
3371
+ "description": "Current activity, conversation state, messaging policy, and lifecycle history.",
3372
+ "properties": {
3373
+ "archived": {
3374
+ "anyOf": [
3375
+ {
3376
+ "$ref": "#/$defs/SessionArchived"
3377
+ },
3378
+ {
3379
+ "type": "null"
3380
+ }
3381
+ ],
3382
+ "default": null,
3383
+ "description": "When and by whom the session was archived; null when unarchived. Archiving does not stop or close a session."
3384
+ },
3385
+ "conversation": {
3386
+ "$ref": "#/$defs/ConversationState",
3387
+ "description": "Whether the conversation is open or permanently closed. Open does not imply direct messages are permitted."
3388
+ },
3389
+ "detail": {
3390
+ "anyOf": [
3391
+ {
3392
+ "type": "string"
3393
+ },
3394
+ {
3395
+ "type": "null"
3396
+ }
3397
+ ],
3398
+ "default": null,
3399
+ "description": "Explanation of the current status, when applicable.",
3400
+ "title": "Detail"
3401
+ },
3402
+ "interactive": {
3403
+ "description": "Whether the session stays open after its first turn.",
3404
+ "title": "Interactive",
3405
+ "type": "boolean"
3406
+ },
3407
+ "last_execution_result": {
3408
+ "anyOf": [
3409
+ {
3410
+ "$ref": "#/$defs/SessionExecutionResult"
3411
+ },
3412
+ {
3413
+ "type": "null"
3414
+ }
3415
+ ],
3416
+ "default": null,
3417
+ "description": "The last finished execution's outcome, retained across resumes; null until an outcome has been recorded."
3418
+ },
3419
+ "prompting": {
3420
+ "$ref": "#/$defs/SessionPrompting",
3421
+ "description": "The session's policy for direct messages. Caller authorization and message validation are checked separately."
3422
+ },
3423
+ "status": {
3424
+ "$ref": "#/$defs/SessionLifecycleStatus",
3425
+ "description": "Canonical current activity. working means a turn is in progress; waiting means the worker is warm and awaiting input; idle means parked. A failed, stopped, or cancelled execution may leave an open conversation."
3426
+ },
3427
+ "stopped": {
3428
+ "anyOf": [
3429
+ {
3430
+ "$ref": "#/$defs/SessionStopped"
3431
+ },
3432
+ {
3433
+ "type": "null"
3434
+ }
3435
+ ],
3436
+ "default": null,
3437
+ "description": "When and by whom a stop was requested; null when no stop is pending for this execution."
3438
+ },
3439
+ "timestamps": {
3440
+ "$ref": "#/$defs/SessionTimestamps"
3441
+ }
3442
+ },
3443
+ "required": [
3444
+ "archived",
3445
+ "conversation",
3446
+ "detail",
3447
+ "interactive",
3448
+ "last_execution_result",
3449
+ "prompting",
3450
+ "status",
3451
+ "stopped",
3452
+ "timestamps"
3453
+ ],
3454
+ "title": "SessionLifecycle",
3455
+ "type": "object"
3456
+ },
3457
+ "SessionLifecycleStatus": {
3458
+ "enum": [
3459
+ "scheduled",
3460
+ "starting",
3461
+ "working",
3462
+ "waiting",
3463
+ "retrying",
3464
+ "idle",
3465
+ "closed",
3466
+ "failed",
3467
+ "stopped",
3468
+ "cancelled"
3469
+ ],
3470
+ "title": "SessionLifecycleStatus",
3471
+ "type": "string"
3472
+ },
3473
+ "SessionListStreamMessage": {
3474
+ "properties": {
3475
+ "session": {
3476
+ "$ref": "#/$defs/Session"
3477
+ },
3478
+ "type": {
3479
+ "const": "session",
3480
+ "default": "session",
3481
+ "title": "Type",
3482
+ "type": "string"
3483
+ }
3484
+ },
3485
+ "required": [
3486
+ "session",
3487
+ "type"
3488
+ ],
3489
+ "title": "SessionListStreamMessage",
3490
+ "type": "object"
3491
+ },
3492
+ "SessionParent": {
3493
+ "description": "The predecessor session this session continues.",
3494
+ "properties": {
3495
+ "session_id": {
3496
+ "anyOf": [
3497
+ {
3498
+ "type": "string"
3499
+ },
3500
+ {
3501
+ "type": "null"
3502
+ }
3503
+ ],
3504
+ "default": null,
3505
+ "description": "Identifier of the predecessor session this session continues, if any.",
3506
+ "title": "Session Id"
3507
+ }
3508
+ },
3509
+ "required": [
3510
+ "session_id"
3511
+ ],
3512
+ "title": "SessionParent",
3513
+ "type": "object"
3514
+ },
3515
+ "SessionPrompting": {
3516
+ "description": "The prompt-affordance projection. `enabled` answers \"would a send work\",\nand when it wouldn't, `blocked_reason` + `detail` say why.\n\n`surface_name` is set only for MENTION_SURFACE, naming where to reply.",
3517
+ "properties": {
3518
+ "blocked_reason": {
3519
+ "anyOf": [
3520
+ {
3521
+ "$ref": "#/$defs/PromptBlockedReason"
3522
+ },
3523
+ {
3524
+ "type": "null"
3525
+ }
3526
+ ],
3527
+ "default": null
3528
+ },
3529
+ "detail": {
3530
+ "anyOf": [
3531
+ {
3532
+ "type": "string"
3533
+ },
3534
+ {
3535
+ "type": "null"
3536
+ }
3537
+ ],
3538
+ "default": null,
3539
+ "title": "Detail"
3540
+ },
3541
+ "enabled": {
3542
+ "title": "Enabled",
3543
+ "type": "boolean"
3544
+ },
3545
+ "surface_name": {
3546
+ "anyOf": [
3547
+ {
3548
+ "type": "string"
3549
+ },
3550
+ {
3551
+ "type": "null"
3552
+ }
3553
+ ],
3554
+ "default": null,
3555
+ "title": "Surface Name"
3556
+ }
3557
+ },
3558
+ "required": [
3559
+ "blocked_reason",
3560
+ "detail",
3561
+ "enabled",
3562
+ "surface_name"
3563
+ ],
3564
+ "title": "SessionPrompting",
3565
+ "type": "object"
3566
+ },
3567
+ "SessionSource": {
3568
+ "description": "Where a session came from: the credential that started it (web app,\nAPI key, CLI) or the trigger that fired (react, mention, cron). Never\ntaken from a request body.",
3569
+ "enum": [
3570
+ "react",
3571
+ "web",
3572
+ "api",
3573
+ "cli",
3574
+ "mention",
3575
+ "cron"
3576
+ ],
3577
+ "title": "SessionSource",
3578
+ "type": "string"
3579
+ },
3580
+ "SessionStopped": {
3581
+ "description": "When a stop was requested and the GitHub user who requested it.",
3582
+ "properties": {
3583
+ "at": {
3584
+ "description": "When a stop was requested.",
3585
+ "format": "date-time",
3586
+ "title": "At",
3587
+ "type": "string"
3588
+ },
3589
+ "by": {
3590
+ "anyOf": [
3591
+ {
3592
+ "$ref": "#/$defs/GithubAccountSnippet"
3593
+ },
3594
+ {
3595
+ "type": "null"
3596
+ }
3597
+ ],
3598
+ "default": null,
3599
+ "description": "The GitHub user who stopped the session, resolved at read time. Null if the user is unknown or unavailable."
3600
+ }
3601
+ },
3602
+ "required": [
3603
+ "at",
3604
+ "by"
3605
+ ],
3606
+ "title": "SessionStopped",
3607
+ "type": "object"
3608
+ },
3609
+ "SessionSummary": {
3610
+ "description": "A live one-line summary of what the session is working on, refreshed\nevery few steps while it runs.",
3611
+ "properties": {
3612
+ "created_at": {
3613
+ "anyOf": [
3614
+ {
3615
+ "format": "date-time",
3616
+ "type": "string"
3617
+ },
3618
+ {
3619
+ "type": "null"
3620
+ }
3621
+ ],
3622
+ "default": null,
3623
+ "description": "When this summary line was generated. Null on summaries written before generation time was tracked.",
3624
+ "title": "Created At"
3625
+ },
3626
+ "description": {
3627
+ "description": "One-line description of what the session is working on.",
3628
+ "title": "Description",
3629
+ "type": "string"
3630
+ }
3631
+ },
3632
+ "required": [
3633
+ "created_at",
3634
+ "description"
3635
+ ],
3636
+ "title": "SessionSummary",
3637
+ "type": "object"
3638
+ },
3639
+ "SessionTimestamps": {
3640
+ "properties": {
3641
+ "created_at": {
3642
+ "description": "When the session was created.",
3643
+ "format": "date-time",
3644
+ "title": "Created At",
3645
+ "type": "string"
3646
+ },
3647
+ "last_activity_at": {
3648
+ "anyOf": [
3649
+ {
3650
+ "format": "date-time",
3651
+ "type": "string"
3652
+ },
3653
+ {
3654
+ "type": "null"
3655
+ }
3656
+ ],
3657
+ "default": null,
3658
+ "description": "When the session last showed agent activity.",
3659
+ "title": "Last Activity At"
3660
+ },
3661
+ "last_message_at": {
3662
+ "anyOf": [
3663
+ {
3664
+ "format": "date-time",
3665
+ "type": "string"
3666
+ },
3667
+ {
3668
+ "type": "null"
3669
+ }
3670
+ ],
3671
+ "default": null,
3672
+ "description": "When the session last received a message.",
3673
+ "title": "Last Message At"
3674
+ },
3675
+ "updated_at": {
3676
+ "description": "When the session was last updated.",
3677
+ "format": "date-time",
3678
+ "title": "Updated At",
3679
+ "type": "string"
3680
+ }
3681
+ },
3682
+ "required": [
3683
+ "created_at",
3684
+ "last_activity_at",
3685
+ "last_message_at",
3686
+ "updated_at"
3687
+ ],
3688
+ "title": "SessionTimestamps",
3689
+ "type": "object"
3690
+ },
3691
+ "SessionTokens": {
3692
+ "description": "The token counts a session (or turn) spent, and the model they went to.\n\n`total` INCLUDES the cache lanes, unlike the old flat `tokens_total` which\ncounted input+output+thinking only and left callers to add cache reads and\nwrites back themselves (the deleted `tokensTotalAll` helper). Cache tokens\ndominate an agent run's token bill, so a \"total\" that omits them is the\nwrong default and produced two competing totals in the dashboard.",
3693
+ "properties": {
3694
+ "cache_creation": {
3695
+ "default": 0,
3696
+ "description": "Tokens written to the prompt cache.",
3697
+ "title": "Cache Creation",
3698
+ "type": "integer"
3699
+ },
3700
+ "cache_read": {
3701
+ "default": 0,
3702
+ "description": "Tokens read from the prompt cache.",
3703
+ "title": "Cache Read",
3704
+ "type": "integer"
3705
+ },
3706
+ "input": {
3707
+ "default": 0,
3708
+ "description": "Input tokens used.",
3709
+ "title": "Input",
3710
+ "type": "integer"
3711
+ },
3712
+ "model": {
3713
+ "default": "",
3714
+ "description": "The model the token counts are attributed to.",
3715
+ "title": "Model",
3716
+ "type": "string"
3717
+ },
3718
+ "output": {
3719
+ "default": 0,
3720
+ "description": "Output tokens used.",
3721
+ "title": "Output",
3722
+ "type": "integer"
3723
+ },
3724
+ "total": {
3725
+ "default": 0,
3726
+ "description": "Total tokens consumed, INCLUDING the prompt-cache reads and writes \u2014 the same basis the token cost is priced on.",
3727
+ "title": "Total",
3728
+ "type": "integer"
3729
+ }
3730
+ },
3731
+ "required": [
3732
+ "cache_creation",
3733
+ "cache_read",
3734
+ "input",
3735
+ "model",
3736
+ "output",
3737
+ "total"
3738
+ ],
3739
+ "title": "SessionTokens",
3740
+ "type": "object"
3741
+ },
3742
+ "SettingsRef": {
3743
+ "additionalProperties": false,
3744
+ "description": "A config-declared Claude Code settings.json, resolved at run start and\npassed to `claude --settings <path>`. That is the CLI settings tier \u2014 BELOW\nEllipsis's managed-settings.json floor \u2014 so it customizes behavior (model\npermissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a\nsecurity setting. Lets a team point the cloud agent at the same settings file\nthey already use with Claude Code locally instead of re-encoding it as YAML.",
3745
+ "properties": {
3746
+ "path": {
3747
+ "title": "Path",
3748
+ "type": "string"
3749
+ },
3750
+ "repository": {
3751
+ "anyOf": [
3752
+ {
3753
+ "$ref": "#/$defs/RepositoryRef"
3754
+ },
3755
+ {
3756
+ "type": "null"
3757
+ }
3758
+ ],
3759
+ "default": null
3760
+ }
3761
+ },
3762
+ "required": [
3763
+ "path",
3764
+ "repository"
3765
+ ],
3766
+ "title": "SettingsRef",
3767
+ "type": "object"
3768
+ },
3769
+ "SkillRef": {
3770
+ "additionalProperties": false,
3771
+ "description": "A repository directory containing SKILL.md and supporting UTF-8 files.\nResolved at run start and installed in the selected harness's skill directory.\nExplicit skill references require a model with the skills capability.",
3772
+ "properties": {
3773
+ "path": {
3774
+ "title": "Path",
3775
+ "type": "string"
3776
+ },
3777
+ "repository": {
3778
+ "anyOf": [
3779
+ {
3780
+ "$ref": "#/$defs/RepositoryRef"
3781
+ },
3782
+ {
3783
+ "type": "null"
3784
+ }
3785
+ ],
3786
+ "default": null
3787
+ }
3788
+ },
3789
+ "required": [
3790
+ "path",
3791
+ "repository"
3792
+ ],
3793
+ "title": "SkillRef",
3794
+ "type": "object"
3795
+ },
3796
+ "SlackChannelCreatedEvent": {
3797
+ "properties": {
3798
+ "actor": {
3799
+ "anyOf": [
3800
+ {
3801
+ "$ref": "#/$defs/SessionEventActor"
3802
+ },
3803
+ {
3804
+ "type": "null"
3805
+ }
3806
+ ],
3807
+ "default": null
3808
+ },
3809
+ "channel_id": {
3810
+ "title": "Channel Id",
3811
+ "type": "string"
3812
+ },
3813
+ "channel_name": {
3814
+ "anyOf": [
3815
+ {
3816
+ "type": "string"
3817
+ },
3818
+ {
3819
+ "type": "null"
3820
+ }
3821
+ ],
3822
+ "default": null,
3823
+ "title": "Channel Name"
3824
+ },
3825
+ "type": {
3826
+ "const": "slack.channel_created",
3827
+ "default": "slack.channel_created",
3828
+ "title": "Type",
3829
+ "type": "string"
3830
+ },
3831
+ "url": {
3832
+ "title": "Url",
3833
+ "type": "string"
3834
+ }
3835
+ },
3836
+ "required": [
3837
+ "actor",
3838
+ "channel_id",
3839
+ "channel_name",
3840
+ "type",
3841
+ "url"
3842
+ ],
3843
+ "title": "SlackChannelCreatedEvent",
3844
+ "type": "object"
3845
+ },
3846
+ "SlackMessageEvent": {
3847
+ "properties": {
3848
+ "action": {
3849
+ "enum": [
3850
+ "message",
3851
+ "app_mention"
3852
+ ],
3853
+ "title": "Action",
3854
+ "type": "string"
3855
+ },
3856
+ "actor": {
3857
+ "anyOf": [
3858
+ {
3859
+ "$ref": "#/$defs/SessionEventActor"
3860
+ },
3861
+ {
3862
+ "type": "null"
3863
+ }
3864
+ ],
3865
+ "default": null
3866
+ },
3867
+ "channel_id": {
3868
+ "title": "Channel Id",
3869
+ "type": "string"
3870
+ },
3871
+ "channel_name": {
3872
+ "anyOf": [
3873
+ {
3874
+ "type": "string"
3875
+ },
3876
+ {
3877
+ "type": "null"
3878
+ }
3879
+ ],
3880
+ "default": null,
3881
+ "title": "Channel Name"
3882
+ },
3883
+ "message_ts": {
3884
+ "title": "Message Ts",
3885
+ "type": "string"
3886
+ },
3887
+ "thread_ts": {
3888
+ "anyOf": [
3889
+ {
3890
+ "type": "string"
3891
+ },
3892
+ {
3893
+ "type": "null"
3894
+ }
3895
+ ],
3896
+ "default": null,
3897
+ "title": "Thread Ts"
3898
+ },
3899
+ "type": {
3900
+ "const": "slack.message",
3901
+ "default": "slack.message",
3902
+ "title": "Type",
3903
+ "type": "string"
3904
+ },
3905
+ "url": {
3906
+ "title": "Url",
3907
+ "type": "string"
3908
+ }
3909
+ },
3910
+ "required": [
3911
+ "action",
3912
+ "actor",
3913
+ "channel_id",
3914
+ "channel_name",
3915
+ "message_ts",
3916
+ "thread_ts",
3917
+ "type",
3918
+ "url"
3919
+ ],
3920
+ "title": "SlackMessageEvent",
3921
+ "type": "object"
3922
+ },
3923
+ "VMExecutionResponse": {
3924
+ "properties": {
3925
+ "cache_tier": {
3926
+ "anyOf": [
3927
+ {
3928
+ "$ref": "#/$defs/SandboxCacheTier"
3929
+ },
3930
+ {
3931
+ "type": "null"
3932
+ }
3933
+ ]
3934
+ },
3935
+ "cost_sandbox_cpu": {
3936
+ "title": "Cost Sandbox Cpu",
3937
+ "type": "integer"
3938
+ },
3939
+ "cost_sandbox_memory": {
3940
+ "title": "Cost Sandbox Memory",
3941
+ "type": "integer"
3942
+ },
3943
+ "cpu": {
3944
+ "title": "Cpu",
3945
+ "type": "number"
3946
+ },
3947
+ "encrypted_ports": {
3948
+ "items": {
3949
+ "type": "integer"
3950
+ },
3951
+ "title": "Encrypted Ports",
3952
+ "type": "array"
3953
+ },
3954
+ "environment_variable_keys": {
3955
+ "items": {
3956
+ "type": "string"
3957
+ },
3958
+ "title": "Environment Variable Keys",
3959
+ "type": "array"
3960
+ },
3961
+ "failed_at": {
3962
+ "anyOf": [
3963
+ {
3964
+ "format": "date-time",
3965
+ "type": "string"
3966
+ },
3967
+ {
3968
+ "type": "null"
3969
+ }
3970
+ ],
3971
+ "title": "Failed At"
3972
+ },
3973
+ "hooks": {
3974
+ "$ref": "#/$defs/EnvironmentHooks",
3975
+ "default": {
3976
+ "after_checkout": null,
3977
+ "before_start": null,
3978
+ "build_base": null,
3979
+ "post_clone": null,
3980
+ "post_start": null
3981
+ }
3982
+ },
3983
+ "id": {
3984
+ "title": "Id",
3985
+ "type": "string"
3986
+ },
3987
+ "memory_mib": {
3988
+ "title": "Memory Mib",
3989
+ "type": "integer"
3990
+ },
3991
+ "phase_timings": {
3992
+ "additionalProperties": {
3993
+ "type": "number"
3994
+ },
3995
+ "title": "Phase Timings",
3996
+ "type": "object"
3997
+ },
3998
+ "post_clone": {
3999
+ "anyOf": [
4000
+ {
4001
+ "type": "string"
4002
+ },
4003
+ {
4004
+ "type": "null"
4005
+ }
4006
+ ],
4007
+ "title": "Post Clone"
4008
+ },
4009
+ "post_start": {
4010
+ "anyOf": [
4011
+ {
4012
+ "type": "string"
4013
+ },
4014
+ {
4015
+ "type": "null"
4016
+ }
4017
+ ],
4018
+ "title": "Post Start"
4019
+ },
4020
+ "repositories": {
4021
+ "items": {
4022
+ "$ref": "#/$defs/SandboxRepository"
4023
+ },
4024
+ "title": "Repositories",
4025
+ "type": "array"
4026
+ },
4027
+ "running_at": {
4028
+ "anyOf": [
4029
+ {
4030
+ "format": "date-time",
4031
+ "type": "string"
4032
+ },
4033
+ {
4034
+ "type": "null"
4035
+ }
4036
+ ],
4037
+ "title": "Running At"
4038
+ },
4039
+ "scheduled_at": {
4040
+ "format": "date-time",
4041
+ "title": "Scheduled At",
4042
+ "type": "string"
4043
+ },
4044
+ "source": {
4045
+ "$ref": "#/$defs/SandboxSource"
4046
+ },
4047
+ "source_session_id": {
4048
+ "anyOf": [
4049
+ {
4050
+ "type": "string"
4051
+ },
4052
+ {
4053
+ "type": "null"
4054
+ }
4055
+ ],
4056
+ "title": "Source Session Id"
4057
+ },
4058
+ "status": {
4059
+ "$ref": "#/$defs/SandboxStatus"
4060
+ },
4061
+ "terminated_at": {
4062
+ "anyOf": [
4063
+ {
4064
+ "format": "date-time",
4065
+ "type": "string"
4066
+ },
4067
+ {
4068
+ "type": "null"
4069
+ }
4070
+ ],
4071
+ "title": "Terminated At"
4072
+ },
4073
+ "terminating_at": {
4074
+ "anyOf": [
4075
+ {
4076
+ "format": "date-time",
4077
+ "type": "string"
4078
+ },
4079
+ {
4080
+ "type": "null"
4081
+ }
4082
+ ],
4083
+ "title": "Terminating At"
4084
+ },
4085
+ "timeout_seconds": {
4086
+ "title": "Timeout Seconds",
4087
+ "type": "integer"
4088
+ },
4089
+ "tunnels": {
4090
+ "items": {
4091
+ "$ref": "#/$defs/SandboxPort"
4092
+ },
4093
+ "title": "Tunnels",
4094
+ "type": "array"
4095
+ },
4096
+ "type": {
4097
+ "$ref": "#/$defs/SandboxType"
4098
+ },
4099
+ "unencrypted_ports": {
4100
+ "items": {
4101
+ "type": "integer"
4102
+ },
4103
+ "title": "Unencrypted Ports",
4104
+ "type": "array"
4105
+ }
4106
+ },
4107
+ "required": [
4108
+ "cache_tier",
4109
+ "cost_sandbox_cpu",
4110
+ "cost_sandbox_memory",
4111
+ "cpu",
4112
+ "encrypted_ports",
4113
+ "environment_variable_keys",
4114
+ "failed_at",
4115
+ "hooks",
4116
+ "id",
4117
+ "memory_mib",
4118
+ "phase_timings",
4119
+ "post_clone",
4120
+ "post_start",
4121
+ "repositories",
4122
+ "running_at",
4123
+ "scheduled_at",
4124
+ "source",
4125
+ "source_session_id",
4126
+ "status",
4127
+ "terminated_at",
4128
+ "terminating_at",
4129
+ "timeout_seconds",
4130
+ "tunnels",
4131
+ "type",
4132
+ "unencrypted_ports"
4133
+ ],
4134
+ "title": "VMExecutionResponse",
4135
+ "type": "object"
4136
+ }
4137
+ },
4138
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4139
+ "description": "Frames on /v1/sessions/stream, /v1/agents/stream and /v1/vm-executions/{id}/stream. Ignore unknown frame types.",
4140
+ "oneOf": [
4141
+ {
4142
+ "$ref": "#/$defs/SessionListStreamMessage"
4143
+ },
4144
+ {
4145
+ "$ref": "#/$defs/AgentListStreamMessage"
4146
+ },
4147
+ {
4148
+ "$ref": "#/$defs/CollectionStreamHeartbeat"
4149
+ },
4150
+ {
4151
+ "$ref": "#/$defs/SandboxSnapshotFrame"
4152
+ },
4153
+ {
4154
+ "$ref": "#/$defs/SandboxUpdateFrame"
4155
+ }
4156
+ ],
4157
+ "title": "CollectionStreamFrame"
4158
+ }