@ellipsis-dev/sdk 0.12.0 → 0.13.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.
@@ -1,5 +1,1247 @@
1
1
  {
2
2
  "$defs": {
3
+ "AgentConfig": {
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "budget": {
7
+ "$ref": "#/$defs/AgentConfigBudget",
8
+ "default": {
9
+ "day": null,
10
+ "month": null,
11
+ "session": null,
12
+ "week": null
13
+ }
14
+ },
15
+ "claude": {
16
+ "$ref": "#/$defs/AgentConfigClaude",
17
+ "default": {
18
+ "effort": null,
19
+ "fallback_model": null,
20
+ "max_turns": null,
21
+ "model": "claude-opus-5",
22
+ "settings": null,
23
+ "system": ""
24
+ }
25
+ },
26
+ "codex": {
27
+ "anyOf": [
28
+ {
29
+ "$ref": "#/$defs/AgentConfigCodex"
30
+ },
31
+ {
32
+ "type": "null"
33
+ }
34
+ ],
35
+ "default": null
36
+ },
37
+ "ellipsis": {
38
+ "$ref": "#/$defs/AgentConfigEllipsis",
39
+ "default": {
40
+ "description": null,
41
+ "enabled": true,
42
+ "interactive": true,
43
+ "metadata": {
44
+ "annotations": {},
45
+ "labels": []
46
+ },
47
+ "name": null,
48
+ "version": "v1"
49
+ }
50
+ },
51
+ "environment": {
52
+ "$ref": "#/$defs/AgentConfigEnvironment",
53
+ "default": {
54
+ "compute": {
55
+ "cpu": null,
56
+ "memory": null,
57
+ "timeout": null
58
+ },
59
+ "hooks": {
60
+ "post_clone": null,
61
+ "post_start": null
62
+ },
63
+ "image": {
64
+ "dockerfile_append": null,
65
+ "setup": null
66
+ },
67
+ "repositories": [],
68
+ "variables": []
69
+ }
70
+ },
71
+ "input": {
72
+ "anyOf": [
73
+ {
74
+ "$ref": "#/$defs/AgentConfigInput"
75
+ },
76
+ {
77
+ "type": "null"
78
+ }
79
+ ],
80
+ "default": null
81
+ },
82
+ "llm": {
83
+ "$ref": "#/$defs/AgentConfigLlm",
84
+ "default": {
85
+ "proxy": null
86
+ }
87
+ },
88
+ "mcp_servers": {
89
+ "default": [],
90
+ "items": {
91
+ "anyOf": [
92
+ {
93
+ "type": "string"
94
+ },
95
+ {
96
+ "$ref": "#/$defs/AgentConfigMcpServer"
97
+ }
98
+ ]
99
+ },
100
+ "title": "Mcp Servers",
101
+ "type": "array"
102
+ },
103
+ "output": {
104
+ "anyOf": [
105
+ {
106
+ "$ref": "#/$defs/AgentConfigOutput"
107
+ },
108
+ {
109
+ "type": "null"
110
+ }
111
+ ],
112
+ "default": null
113
+ },
114
+ "permissions": {
115
+ "$ref": "#/$defs/AgentConfigPermissions",
116
+ "default": {
117
+ "ellipsis": true,
118
+ "github": {
119
+ "permissions": null,
120
+ "repositories": null
121
+ }
122
+ }
123
+ },
124
+ "skills": {
125
+ "default": [],
126
+ "items": {
127
+ "$ref": "#/$defs/AgentConfigSkill"
128
+ },
129
+ "title": "Skills",
130
+ "type": "array"
131
+ },
132
+ "trigger": {
133
+ "anyOf": [
134
+ {
135
+ "discriminator": {
136
+ "mapping": {
137
+ "cron": "#/$defs/AgentConfigCronTrigger",
138
+ "mention": "#/$defs/AgentConfigMentionTrigger",
139
+ "react": "#/$defs/AgentConfigReactTrigger"
140
+ },
141
+ "propertyName": "type"
142
+ },
143
+ "oneOf": [
144
+ {
145
+ "$ref": "#/$defs/AgentConfigCronTrigger"
146
+ },
147
+ {
148
+ "$ref": "#/$defs/AgentConfigReactTrigger"
149
+ },
150
+ {
151
+ "$ref": "#/$defs/AgentConfigMentionTrigger"
152
+ }
153
+ ]
154
+ },
155
+ {
156
+ "type": "null"
157
+ }
158
+ ],
159
+ "default": null,
160
+ "title": "Trigger"
161
+ }
162
+ },
163
+ "required": [
164
+ "budget",
165
+ "claude",
166
+ "codex",
167
+ "ellipsis",
168
+ "environment",
169
+ "input",
170
+ "llm",
171
+ "mcp_servers",
172
+ "output",
173
+ "permissions",
174
+ "skills",
175
+ "trigger"
176
+ ],
177
+ "title": "AgentConfig",
178
+ "type": "object"
179
+ },
180
+ "AgentConfigBudget": {
181
+ "additionalProperties": false,
182
+ "properties": {
183
+ "day": {
184
+ "anyOf": [
185
+ {
186
+ "type": "number"
187
+ },
188
+ {
189
+ "type": "null"
190
+ }
191
+ ],
192
+ "default": null,
193
+ "title": "Day"
194
+ },
195
+ "month": {
196
+ "anyOf": [
197
+ {
198
+ "type": "number"
199
+ },
200
+ {
201
+ "type": "null"
202
+ }
203
+ ],
204
+ "default": null,
205
+ "title": "Month"
206
+ },
207
+ "session": {
208
+ "anyOf": [
209
+ {
210
+ "type": "number"
211
+ },
212
+ {
213
+ "type": "null"
214
+ }
215
+ ],
216
+ "default": null,
217
+ "title": "Session"
218
+ },
219
+ "week": {
220
+ "anyOf": [
221
+ {
222
+ "type": "number"
223
+ },
224
+ {
225
+ "type": "null"
226
+ }
227
+ ],
228
+ "default": null,
229
+ "title": "Week"
230
+ }
231
+ },
232
+ "required": [
233
+ "day",
234
+ "month",
235
+ "session",
236
+ "week"
237
+ ],
238
+ "title": "AgentConfigBudget",
239
+ "type": "object"
240
+ },
241
+ "AgentConfigClaude": {
242
+ "additionalProperties": false,
243
+ "properties": {
244
+ "effort": {
245
+ "anyOf": [
246
+ {
247
+ "$ref": "#/$defs/EffortLevel"
248
+ },
249
+ {
250
+ "type": "null"
251
+ }
252
+ ],
253
+ "default": null
254
+ },
255
+ "fallback_model": {
256
+ "anyOf": [
257
+ {
258
+ "type": "string"
259
+ },
260
+ {
261
+ "type": "null"
262
+ }
263
+ ],
264
+ "default": null,
265
+ "title": "Fallback Model"
266
+ },
267
+ "max_turns": {
268
+ "anyOf": [
269
+ {
270
+ "exclusiveMinimum": 0,
271
+ "type": "integer"
272
+ },
273
+ {
274
+ "type": "null"
275
+ }
276
+ ],
277
+ "default": null,
278
+ "title": "Max Turns"
279
+ },
280
+ "model": {
281
+ "default": "claude-opus-5",
282
+ "title": "Model",
283
+ "type": "string"
284
+ },
285
+ "settings": {
286
+ "anyOf": [
287
+ {
288
+ "$ref": "#/$defs/AgentConfigSettingsRef"
289
+ },
290
+ {
291
+ "type": "null"
292
+ }
293
+ ],
294
+ "default": null
295
+ },
296
+ "system": {
297
+ "anyOf": [
298
+ {
299
+ "type": "string"
300
+ },
301
+ {
302
+ "$ref": "#/$defs/AgentConfigSystemFileRef"
303
+ },
304
+ {
305
+ "items": {
306
+ "anyOf": [
307
+ {
308
+ "type": "string"
309
+ },
310
+ {
311
+ "$ref": "#/$defs/AgentConfigSystemFileRef"
312
+ }
313
+ ]
314
+ },
315
+ "type": "array"
316
+ }
317
+ ],
318
+ "default": "",
319
+ "title": "System"
320
+ }
321
+ },
322
+ "required": [
323
+ "effort",
324
+ "fallback_model",
325
+ "max_turns",
326
+ "model",
327
+ "settings",
328
+ "system"
329
+ ],
330
+ "title": "AgentConfigClaude",
331
+ "type": "object"
332
+ },
333
+ "AgentConfigCodex": {
334
+ "additionalProperties": false,
335
+ "description": "The `codex:` block \u2014 run this agent on OpenAI's Codex CLI instead of\nClaude Code. Declaring the block at all is what selects the harness\n(`AgentConfig.harness`).\n\nDeliberately a small subset of `AgentConfigClaude`: the fields omitted here\nare ones Codex has no equivalent for (`effort`, `fallback_model`,\n`settings`) or that the platform does not yet wire through for this harness\n(`max_turns`, `skills`, MCP servers). They are omitted rather than\naccepted-and-ignored, because `StrictConfigModel` forbids extra keys \u2014 so a\nconfig that sets one fails loudly at parse time instead of silently not doing\nit. The budget still bounds a run regardless.",
336
+ "properties": {
337
+ "model": {
338
+ "default": "gpt-5.6-terra",
339
+ "title": "Model",
340
+ "type": "string"
341
+ },
342
+ "system": {
343
+ "anyOf": [
344
+ {
345
+ "type": "string"
346
+ },
347
+ {
348
+ "$ref": "#/$defs/AgentConfigSystemFileRef"
349
+ },
350
+ {
351
+ "items": {
352
+ "anyOf": [
353
+ {
354
+ "type": "string"
355
+ },
356
+ {
357
+ "$ref": "#/$defs/AgentConfigSystemFileRef"
358
+ }
359
+ ]
360
+ },
361
+ "type": "array"
362
+ }
363
+ ],
364
+ "default": "",
365
+ "title": "System"
366
+ }
367
+ },
368
+ "required": [
369
+ "model",
370
+ "system"
371
+ ],
372
+ "title": "AgentConfigCodex",
373
+ "type": "object"
374
+ },
375
+ "AgentConfigCompute": {
376
+ "additionalProperties": false,
377
+ "description": "Sandbox compute sizing. Every field is optional; None inherits the\nplatform default (1 vCPU / 4096 MiB / 3600s \u2014 see DEFAULT_MODAL_* in\nmodels/ellipsis/sandboxes/sandbox.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 the sandbox is\nkilled, 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 is billed on the requested allocation over the sandbox's\nwall-clock lifetime, so a bigger/longer box costs proportionally more.",
378
+ "properties": {
379
+ "cpu": {
380
+ "anyOf": [
381
+ {
382
+ "maximum": 16,
383
+ "minimum": 0.125,
384
+ "type": "number"
385
+ },
386
+ {
387
+ "type": "null"
388
+ }
389
+ ],
390
+ "default": null,
391
+ "title": "Cpu"
392
+ },
393
+ "memory": {
394
+ "anyOf": [
395
+ {
396
+ "type": "string"
397
+ },
398
+ {
399
+ "$ref": "#/$defs/AgentConfigMemorySize"
400
+ },
401
+ {
402
+ "type": "null"
403
+ }
404
+ ],
405
+ "default": null,
406
+ "title": "Memory"
407
+ },
408
+ "timeout": {
409
+ "anyOf": [
410
+ {
411
+ "type": "string"
412
+ },
413
+ {
414
+ "$ref": "#/$defs/AgentConfigDuration"
415
+ },
416
+ {
417
+ "type": "null"
418
+ }
419
+ ],
420
+ "default": null,
421
+ "title": "Timeout"
422
+ }
423
+ },
424
+ "required": [
425
+ "cpu",
426
+ "memory",
427
+ "timeout"
428
+ ],
429
+ "title": "AgentConfigCompute",
430
+ "type": "object"
431
+ },
432
+ "AgentConfigCronTrigger": {
433
+ "additionalProperties": false,
434
+ "properties": {
435
+ "schedule": {
436
+ "title": "Schedule",
437
+ "type": "string"
438
+ },
439
+ "type": {
440
+ "const": "cron",
441
+ "default": "cron",
442
+ "title": "Type",
443
+ "type": "string"
444
+ }
445
+ },
446
+ "required": [
447
+ "schedule",
448
+ "type"
449
+ ],
450
+ "title": "AgentConfigCronTrigger",
451
+ "type": "object"
452
+ },
453
+ "AgentConfigDuration": {
454
+ "additionalProperties": false,
455
+ "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.",
456
+ "properties": {
457
+ "hours": {
458
+ "anyOf": [
459
+ {
460
+ "minimum": 0,
461
+ "type": "integer"
462
+ },
463
+ {
464
+ "type": "null"
465
+ }
466
+ ],
467
+ "default": null,
468
+ "title": "Hours"
469
+ },
470
+ "minutes": {
471
+ "anyOf": [
472
+ {
473
+ "minimum": 0,
474
+ "type": "integer"
475
+ },
476
+ {
477
+ "type": "null"
478
+ }
479
+ ],
480
+ "default": null,
481
+ "title": "Minutes"
482
+ },
483
+ "seconds": {
484
+ "anyOf": [
485
+ {
486
+ "minimum": 0,
487
+ "type": "integer"
488
+ },
489
+ {
490
+ "type": "null"
491
+ }
492
+ ],
493
+ "default": null,
494
+ "title": "Seconds"
495
+ }
496
+ },
497
+ "required": [
498
+ "hours",
499
+ "minutes",
500
+ "seconds"
501
+ ],
502
+ "title": "AgentConfigDuration",
503
+ "type": "object"
504
+ },
505
+ "AgentConfigEllipsis": {
506
+ "additionalProperties": false,
507
+ "description": "The Ellipsis product namespace for a config file: which schema this is\n(`version`), the human-facing identity (`name`/`description`), freeform\norganizational `metadata`, whether the agent is `enabled`, and the\nhuman-access flag `interactive`. The presence of a top-level `ellipsis:`\nmapping is what marks a YAML file as an Ellipsis agent config (vs arbitrary\nYAML that merely lives under a config directory) \u2014 see\n`yaml_is_ellipsis_config`.\n\n`enabled`/`interactive` are agent behavior, not freeform metadata, so they\nstay inside the config `sha` (only `metadata` is sha-excluded).\n`interactive` lets a human `agent session connect` to a live session (CLI\nrelay). It does not decide whether a session is ephemeral or durable \u2014 that\nis the trigger's job.",
508
+ "properties": {
509
+ "description": {
510
+ "anyOf": [
511
+ {
512
+ "type": "string"
513
+ },
514
+ {
515
+ "type": "null"
516
+ }
517
+ ],
518
+ "default": null,
519
+ "title": "Description"
520
+ },
521
+ "enabled": {
522
+ "default": true,
523
+ "title": "Enabled",
524
+ "type": "boolean"
525
+ },
526
+ "interactive": {
527
+ "default": true,
528
+ "title": "Interactive",
529
+ "type": "boolean"
530
+ },
531
+ "metadata": {
532
+ "$ref": "#/$defs/AgentConfigMetadata",
533
+ "default": {
534
+ "annotations": {},
535
+ "labels": []
536
+ }
537
+ },
538
+ "name": {
539
+ "anyOf": [
540
+ {
541
+ "type": "string"
542
+ },
543
+ {
544
+ "type": "null"
545
+ }
546
+ ],
547
+ "default": null,
548
+ "title": "Name"
549
+ },
550
+ "version": {
551
+ "default": "v1",
552
+ "title": "Version",
553
+ "type": "string"
554
+ }
555
+ },
556
+ "required": [
557
+ "description",
558
+ "enabled",
559
+ "interactive",
560
+ "metadata",
561
+ "name",
562
+ "version"
563
+ ],
564
+ "title": "AgentConfigEllipsis",
565
+ "type": "object"
566
+ },
567
+ "AgentConfigEllipsisPermissions": {
568
+ "additionalProperties": {
569
+ "anyOf": [
570
+ {
571
+ "$ref": "#/$defs/Level"
572
+ },
573
+ {
574
+ "$ref": "#/$defs/EllipsisGrant"
575
+ },
576
+ {
577
+ "items": {
578
+ "anyOf": [
579
+ {
580
+ "$ref": "#/$defs/Level"
581
+ },
582
+ {
583
+ "$ref": "#/$defs/EllipsisGrant"
584
+ }
585
+ ]
586
+ },
587
+ "type": "array"
588
+ }
589
+ ]
590
+ },
591
+ "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.",
592
+ "propertyNames": {
593
+ "$ref": "#/$defs/Resource"
594
+ },
595
+ "title": "AgentConfigEllipsisPermissions",
596
+ "type": "object"
597
+ },
598
+ "AgentConfigEnvironment": {
599
+ "additionalProperties": false,
600
+ "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, how its `image` is customized, 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.",
601
+ "properties": {
602
+ "compute": {
603
+ "$ref": "#/$defs/AgentConfigCompute",
604
+ "default": {
605
+ "cpu": null,
606
+ "memory": null,
607
+ "timeout": null
608
+ }
609
+ },
610
+ "hooks": {
611
+ "$ref": "#/$defs/AgentConfigEnvironmentHooks",
612
+ "default": {
613
+ "post_clone": null,
614
+ "post_start": null
615
+ }
616
+ },
617
+ "image": {
618
+ "$ref": "#/$defs/AgentConfigEnvironmentImage",
619
+ "default": {
620
+ "dockerfile_append": null,
621
+ "setup": null
622
+ }
623
+ },
624
+ "repositories": {
625
+ "default": [],
626
+ "items": {
627
+ "$ref": "#/$defs/AgentConfigRepository"
628
+ },
629
+ "title": "Repositories",
630
+ "type": "array"
631
+ },
632
+ "variables": {
633
+ "default": [],
634
+ "items": {
635
+ "$ref": "#/$defs/AgentConfigEnvironmentVariable"
636
+ },
637
+ "title": "Variables",
638
+ "type": "array"
639
+ }
640
+ },
641
+ "required": [
642
+ "compute",
643
+ "hooks",
644
+ "image",
645
+ "repositories",
646
+ "variables"
647
+ ],
648
+ "title": "AgentConfigEnvironment",
649
+ "type": "object"
650
+ },
651
+ "AgentConfigEnvironmentHooks": {
652
+ "additionalProperties": false,
653
+ "description": "Shell scripts run at points in the sandbox lifecycle, each as the sandbox\nuser with the sandbox's environment variables available. A non-zero exit\nfails the run (exit_status = LIFECYCLE_HOOK_FAILED) and is not retried.\n\n`post_start` runs after the container starts, before any repo is cloned \u2014\nrepo-independent setup (authenticate a CLI, e.g. `doppler setup`). On Modal\nthe repo is baked into the image so it is incidentally present, but\n`post_start` must not depend on repo contents (that's `post_clone`).\n\n`post_clone` runs after all repos are cloned/checked out, before the agent \u2014\nrepo-dependent setup (`pip install -r requirements.txt`, codegen).\n\nHooks run on every run and their output is never cached. A dependency\ninstall whose result should be reused across runs belongs in `image.setup`\n(baked into the cached image) instead; keep hooks for per-run work \u2014 e.g.\nanything that touches run-scoped credentials.",
654
+ "properties": {
655
+ "post_clone": {
656
+ "anyOf": [
657
+ {
658
+ "type": "string"
659
+ },
660
+ {
661
+ "type": "null"
662
+ }
663
+ ],
664
+ "default": null,
665
+ "title": "Post Clone"
666
+ },
667
+ "post_start": {
668
+ "anyOf": [
669
+ {
670
+ "type": "string"
671
+ },
672
+ {
673
+ "type": "null"
674
+ }
675
+ ],
676
+ "default": null,
677
+ "title": "Post Start"
678
+ }
679
+ },
680
+ "required": [
681
+ "post_clone",
682
+ "post_start"
683
+ ],
684
+ "title": "AgentConfigEnvironmentHooks",
685
+ "type": "object"
686
+ },
687
+ "AgentConfigEnvironmentImage": {
688
+ "additionalProperties": false,
689
+ "description": "How to customize the container image the agent runs in. You\ncontribute appended layers (`dockerfile_append`) and a build-time script\n(`setup`) only \u2014 Ellipsis owns FROM / base tooling / entrypoint / user.\nToday only inline bodies are supported; a file reference (resolved at the\nrun's SHA) will come later.\n\nThe split: `dockerfile_append` runs when the image is assembled, before any\nrepo exists \u2014 toolchain installs (a package manager binary, apt packages).\n`setup` runs at image-build time *after* the configured repositories are\nchecked out, and its output is captured by the filesystem snapshot that\nbecomes the cached image \u2014 dependency installs (`poetry install`,\n`npm install`), so later runs start with deps already on disk. Neither runs\nper run; that's `hooks.post_start` / `hooks.post_clone`.",
690
+ "properties": {
691
+ "dockerfile_append": {
692
+ "anyOf": [
693
+ {
694
+ "type": "string"
695
+ },
696
+ {
697
+ "type": "null"
698
+ }
699
+ ],
700
+ "default": null,
701
+ "title": "Dockerfile Append"
702
+ },
703
+ "setup": {
704
+ "anyOf": [
705
+ {
706
+ "type": "string"
707
+ },
708
+ {
709
+ "type": "null"
710
+ }
711
+ ],
712
+ "default": null,
713
+ "title": "Setup"
714
+ }
715
+ },
716
+ "required": [
717
+ "dockerfile_append",
718
+ "setup"
719
+ ],
720
+ "title": "AgentConfigEnvironmentImage",
721
+ "type": "object"
722
+ },
723
+ "AgentConfigEnvironmentVariable": {
724
+ "additionalProperties": false,
725
+ "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.",
726
+ "properties": {
727
+ "name": {
728
+ "title": "Name",
729
+ "type": "string"
730
+ },
731
+ "value": {
732
+ "anyOf": [
733
+ {
734
+ "type": "string"
735
+ },
736
+ {
737
+ "type": "null"
738
+ }
739
+ ],
740
+ "default": null,
741
+ "title": "Value"
742
+ }
743
+ },
744
+ "required": [
745
+ "name",
746
+ "value"
747
+ ],
748
+ "title": "AgentConfigEnvironmentVariable",
749
+ "type": "object"
750
+ },
751
+ "AgentConfigGithubPermissions": {
752
+ "additionalProperties": false,
753
+ "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.",
754
+ "properties": {
755
+ "permissions": {
756
+ "anyOf": [
757
+ {
758
+ "const": "read_only",
759
+ "type": "string"
760
+ },
761
+ {
762
+ "additionalProperties": {
763
+ "type": "string"
764
+ },
765
+ "type": "object"
766
+ },
767
+ {
768
+ "type": "null"
769
+ }
770
+ ],
771
+ "default": null,
772
+ "title": "Permissions"
773
+ },
774
+ "repositories": {
775
+ "anyOf": [
776
+ {
777
+ "items": {
778
+ "type": "string"
779
+ },
780
+ "type": "array"
781
+ },
782
+ {
783
+ "type": "null"
784
+ }
785
+ ],
786
+ "default": null,
787
+ "title": "Repositories"
788
+ }
789
+ },
790
+ "required": [
791
+ "permissions",
792
+ "repositories"
793
+ ],
794
+ "title": "AgentConfigGithubPermissions",
795
+ "type": "object"
796
+ },
797
+ "AgentConfigInput": {
798
+ "additionalProperties": false,
799
+ "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` types the payload a caller-started session takes\n(`POST /v1/sessions` `input`, validated at the door; required when\ndeclared). It is illegal on a react-triggered agent \u2014 react payloads are\nplatform-shaped (the published surface field sets), not caller-shaped.\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`).",
800
+ "properties": {
801
+ "json_schema": {
802
+ "anyOf": [
803
+ {
804
+ "additionalProperties": true,
805
+ "type": "object"
806
+ },
807
+ {
808
+ "type": "null"
809
+ }
810
+ ],
811
+ "default": null,
812
+ "title": "Json Schema"
813
+ },
814
+ "message": {
815
+ "anyOf": [
816
+ {
817
+ "type": "string"
818
+ },
819
+ {
820
+ "type": "null"
821
+ }
822
+ ],
823
+ "default": null,
824
+ "title": "Message"
825
+ }
826
+ },
827
+ "required": [
828
+ "json_schema",
829
+ "message"
830
+ ],
831
+ "title": "AgentConfigInput",
832
+ "type": "object"
833
+ },
834
+ "AgentConfigLlm": {
835
+ "additionalProperties": false,
836
+ "description": "Where this agent's completions go.\n\nDefaults to Ellipsis's own LLM proxy (our Anthropic/Bedrock account, or the\naccount-wide BYO provider if one is enabled). Setting `proxy` to the id of a\nproxy registered on the models settings page routes THIS agent's\ncompletions through that gateway instead.\n\nOpt-in per agent by design: registering a proxy does not silently move any\nexisting agent's traffic. The id is account-scoped, so naming another\naccount's id is a terminal config error, not a route.",
837
+ "properties": {
838
+ "proxy": {
839
+ "anyOf": [
840
+ {
841
+ "type": "string"
842
+ },
843
+ {
844
+ "type": "null"
845
+ }
846
+ ],
847
+ "default": null,
848
+ "title": "Proxy"
849
+ }
850
+ },
851
+ "required": [
852
+ "proxy"
853
+ ],
854
+ "title": "AgentConfigLlm",
855
+ "type": "object"
856
+ },
857
+ "AgentConfigMcpServer": {
858
+ "additionalProperties": false,
859
+ "description": "One built-in MCP server this agent opts into by name (`linear`/`slack`).\nThis is a name reference over the connected built-in set, NOT a custom-server\ndefinition \u2014 there is no command/url/headers shape (that was the old,\nremoved field, and Ellipsis does not support bring-your-own MCP servers).\nIt only matters when the named integration is set to `opt_in` inclusion; an\nintegration in the default `all_sessions` mode is added regardless.",
860
+ "properties": {
861
+ "name": {
862
+ "title": "Name",
863
+ "type": "string"
864
+ }
865
+ },
866
+ "required": [
867
+ "name"
868
+ ],
869
+ "title": "AgentConfigMcpServer",
870
+ "type": "object"
871
+ },
872
+ "AgentConfigMemorySize": {
873
+ "additionalProperties": false,
874
+ "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.",
875
+ "properties": {
876
+ "gb": {
877
+ "anyOf": [
878
+ {
879
+ "minimum": 0,
880
+ "type": "integer"
881
+ },
882
+ {
883
+ "type": "null"
884
+ }
885
+ ],
886
+ "default": null,
887
+ "title": "Gb"
888
+ },
889
+ "mb": {
890
+ "anyOf": [
891
+ {
892
+ "minimum": 0,
893
+ "type": "integer"
894
+ },
895
+ {
896
+ "type": "null"
897
+ }
898
+ ],
899
+ "default": null,
900
+ "title": "Mb"
901
+ }
902
+ },
903
+ "required": [
904
+ "gb",
905
+ "mb"
906
+ ],
907
+ "title": "AgentConfigMemorySize",
908
+ "type": "object"
909
+ },
910
+ "AgentConfigMentionPlatform": {
911
+ "description": "The surface an @ellipsis mention can come from.",
912
+ "enum": [
913
+ "github",
914
+ "slack",
915
+ "linear"
916
+ ],
917
+ "title": "AgentConfigMentionPlatform",
918
+ "type": "string"
919
+ },
920
+ "AgentConfigMentionTrigger": {
921
+ "additionalProperties": false,
922
+ "properties": {
923
+ "platforms": {
924
+ "default": [],
925
+ "items": {
926
+ "$ref": "#/$defs/AgentConfigMentionPlatform"
927
+ },
928
+ "title": "Platforms",
929
+ "type": "array"
930
+ },
931
+ "type": {
932
+ "const": "mention",
933
+ "default": "mention",
934
+ "title": "Type",
935
+ "type": "string"
936
+ }
937
+ },
938
+ "required": [
939
+ "platforms",
940
+ "type"
941
+ ],
942
+ "title": "AgentConfigMentionTrigger",
943
+ "type": "object"
944
+ },
945
+ "AgentConfigMetadata": {
946
+ "additionalProperties": false,
947
+ "properties": {
948
+ "annotations": {
949
+ "additionalProperties": {
950
+ "type": "string"
951
+ },
952
+ "default": {},
953
+ "title": "Annotations",
954
+ "type": "object"
955
+ },
956
+ "labels": {
957
+ "default": [],
958
+ "items": {
959
+ "type": "string"
960
+ },
961
+ "title": "Labels",
962
+ "type": "array"
963
+ }
964
+ },
965
+ "required": [
966
+ "annotations",
967
+ "labels"
968
+ ],
969
+ "title": "AgentConfigMetadata",
970
+ "type": "object"
971
+ },
972
+ "AgentConfigOutput": {
973
+ "additionalProperties": false,
974
+ "description": "The typed output contract: the JSON Schema the agent must exit through\n(the StructuredOutput exit tool). Read back via\nGET /v1/sessions/{id}/output.",
975
+ "properties": {
976
+ "json_schema": {
977
+ "additionalProperties": true,
978
+ "title": "Json Schema",
979
+ "type": "object"
980
+ }
981
+ },
982
+ "required": [
983
+ "json_schema"
984
+ ],
985
+ "title": "AgentConfigOutput",
986
+ "type": "object"
987
+ },
988
+ "AgentConfigPermissions": {
989
+ "additionalProperties": false,
990
+ "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 `AgentConfigEllipsisPermissions`); 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 `AgentConfigGithubPermissions`. GitHub enforces it at mint time.",
991
+ "properties": {
992
+ "ellipsis": {
993
+ "anyOf": [
994
+ {
995
+ "enum": [
996
+ true,
997
+ "all"
998
+ ]
999
+ },
1000
+ {
1001
+ "$ref": "#/$defs/AgentConfigEllipsisPermissions"
1002
+ }
1003
+ ],
1004
+ "default": true,
1005
+ "title": "Ellipsis"
1006
+ },
1007
+ "github": {
1008
+ "$ref": "#/$defs/AgentConfigGithubPermissions",
1009
+ "default": {
1010
+ "permissions": null,
1011
+ "repositories": null
1012
+ }
1013
+ }
1014
+ },
1015
+ "required": [
1016
+ "ellipsis",
1017
+ "github"
1018
+ ],
1019
+ "title": "AgentConfigPermissions",
1020
+ "type": "object"
1021
+ },
1022
+ "AgentConfigReactTrigger": {
1023
+ "additionalProperties": false,
1024
+ "properties": {
1025
+ "issue": {
1026
+ "anyOf": [
1027
+ {
1028
+ "$ref": "#/$defs/ReactIssue"
1029
+ },
1030
+ {
1031
+ "type": "null"
1032
+ }
1033
+ ],
1034
+ "default": null
1035
+ },
1036
+ "linear_issue": {
1037
+ "anyOf": [
1038
+ {
1039
+ "$ref": "#/$defs/ReactLinearIssue"
1040
+ },
1041
+ {
1042
+ "type": "null"
1043
+ }
1044
+ ],
1045
+ "default": null
1046
+ },
1047
+ "pull_request": {
1048
+ "anyOf": [
1049
+ {
1050
+ "$ref": "#/$defs/ReactPullRequest"
1051
+ },
1052
+ {
1053
+ "type": "null"
1054
+ }
1055
+ ],
1056
+ "default": null
1057
+ },
1058
+ "push": {
1059
+ "anyOf": [
1060
+ {
1061
+ "$ref": "#/$defs/ReactPush"
1062
+ },
1063
+ {
1064
+ "type": "null"
1065
+ }
1066
+ ],
1067
+ "default": null
1068
+ },
1069
+ "sentry": {
1070
+ "anyOf": [
1071
+ {
1072
+ "$ref": "#/$defs/ReactSentry"
1073
+ },
1074
+ {
1075
+ "type": "null"
1076
+ }
1077
+ ],
1078
+ "default": null
1079
+ },
1080
+ "slack_channel": {
1081
+ "anyOf": [
1082
+ {
1083
+ "$ref": "#/$defs/ReactSlackChannel"
1084
+ },
1085
+ {
1086
+ "type": "null"
1087
+ }
1088
+ ],
1089
+ "default": null
1090
+ },
1091
+ "type": {
1092
+ "const": "react",
1093
+ "default": "react",
1094
+ "title": "Type",
1095
+ "type": "string"
1096
+ }
1097
+ },
1098
+ "required": [
1099
+ "issue",
1100
+ "linear_issue",
1101
+ "pull_request",
1102
+ "push",
1103
+ "sentry",
1104
+ "slack_channel",
1105
+ "type"
1106
+ ],
1107
+ "title": "AgentConfigReactTrigger",
1108
+ "type": "object"
1109
+ },
1110
+ "AgentConfigRepository": {
1111
+ "additionalProperties": false,
1112
+ "properties": {
1113
+ "name": {
1114
+ "title": "Name",
1115
+ "type": "string"
1116
+ },
1117
+ "owner": {
1118
+ "anyOf": [
1119
+ {
1120
+ "type": "string"
1121
+ },
1122
+ {
1123
+ "type": "null"
1124
+ }
1125
+ ],
1126
+ "default": null,
1127
+ "title": "Owner"
1128
+ },
1129
+ "ref": {
1130
+ "anyOf": [
1131
+ {
1132
+ "type": "string"
1133
+ },
1134
+ {
1135
+ "type": "null"
1136
+ }
1137
+ ],
1138
+ "default": null,
1139
+ "title": "Ref"
1140
+ }
1141
+ },
1142
+ "required": [
1143
+ "name",
1144
+ "owner",
1145
+ "ref"
1146
+ ],
1147
+ "title": "AgentConfigRepository",
1148
+ "type": "object"
1149
+ },
1150
+ "AgentConfigSettingsRef": {
1151
+ "additionalProperties": false,
1152
+ "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.",
1153
+ "properties": {
1154
+ "path": {
1155
+ "title": "Path",
1156
+ "type": "string"
1157
+ },
1158
+ "repository": {
1159
+ "anyOf": [
1160
+ {
1161
+ "$ref": "#/$defs/AgentConfigRepository"
1162
+ },
1163
+ {
1164
+ "type": "null"
1165
+ }
1166
+ ],
1167
+ "default": null
1168
+ }
1169
+ },
1170
+ "required": [
1171
+ "path",
1172
+ "repository"
1173
+ ],
1174
+ "title": "AgentConfigSettingsRef",
1175
+ "type": "object"
1176
+ },
1177
+ "AgentConfigSkill": {
1178
+ "additionalProperties": false,
1179
+ "description": "One config-declared Claude Code skill: a repository directory containing\na SKILL.md, resolved at run start and installed at the sandbox's personal\nskill level (`~/.claude/skills/<basename(path)>/`). This is how a config\nbrings in skills its cloned repositories don't provide \u2014 cross-repo refs\n(an org-wide skills repo), public third-party repos, and repo-less runs.\nSkills under a cloned repo's own `.claude/skills/` load by themselves and\ndon't need an entry here.",
1180
+ "properties": {
1181
+ "path": {
1182
+ "title": "Path",
1183
+ "type": "string"
1184
+ },
1185
+ "repository": {
1186
+ "anyOf": [
1187
+ {
1188
+ "$ref": "#/$defs/AgentConfigRepository"
1189
+ },
1190
+ {
1191
+ "type": "null"
1192
+ }
1193
+ ],
1194
+ "default": null
1195
+ }
1196
+ },
1197
+ "required": [
1198
+ "path",
1199
+ "repository"
1200
+ ],
1201
+ "title": "AgentConfigSkill",
1202
+ "type": "object"
1203
+ },
1204
+ "AgentConfigSource": {
1205
+ "description": "Where a session's config came from. Total: every session has exactly one\nsource, including the ones that never touch defaults resolution.\n\nNot derivable from the row \u2014 `agent_config_id` says WHICH saved config, not\nhow it was chosen, and is null for inline, platform-default, and built-in\nconfigs alike \u2014 so it is persisted for audit and the published wire.",
1206
+ "enum": [
1207
+ "explicit",
1208
+ "inline",
1209
+ "template",
1210
+ "repo_default",
1211
+ "account_default",
1212
+ "platform_default",
1213
+ "trigger",
1214
+ "builtin"
1215
+ ],
1216
+ "title": "AgentConfigSource",
1217
+ "type": "string"
1218
+ },
1219
+ "AgentConfigSystemFileRef": {
1220
+ "additionalProperties": false,
1221
+ "properties": {
1222
+ "file": {
1223
+ "title": "File",
1224
+ "type": "string"
1225
+ },
1226
+ "repository": {
1227
+ "anyOf": [
1228
+ {
1229
+ "$ref": "#/$defs/AgentConfigRepository"
1230
+ },
1231
+ {
1232
+ "type": "null"
1233
+ }
1234
+ ],
1235
+ "default": null
1236
+ }
1237
+ },
1238
+ "required": [
1239
+ "file",
1240
+ "repository"
1241
+ ],
1242
+ "title": "AgentConfigSystemFileRef",
1243
+ "type": "object"
1244
+ },
3
1245
  "AttributionType": {
4
1246
  "enum": [
5
1247
  "github_user",
@@ -21,16 +1263,6 @@
21
1263
  "title": "BudgetSource",
22
1264
  "type": "string"
23
1265
  },
24
- "DefaultResolution": {
25
- "description": "How a session that arrived with no explicit config source resolved its\nconfig (documents/eng/DEFAULT_CONFIGS.md \u00a74). Persisted on the session so\naudit and clients can say \"ran under X (repo default)\". A session started\nwith an explicit config/config_id/template_id never enters resolution and\nstores None.",
26
- "enum": [
27
- "repo_default",
28
- "account_default",
29
- "none"
30
- ],
31
- "title": "DefaultResolution",
32
- "type": "string"
33
- },
34
1266
  "DeltaFrame": {
35
1267
  "description": "Fire-and-forget partial assistant output for the current response.\nCarries no sequence number and is never resumable; superseded by the\ncommitted record.",
36
1268
  "properties": {
@@ -110,6 +1342,47 @@
110
1342
  "title": "DoneFrame",
111
1343
  "type": "object"
112
1344
  },
1345
+ "EffortLevel": {
1346
+ "enum": [
1347
+ "low",
1348
+ "medium",
1349
+ "high",
1350
+ "xhigh",
1351
+ "max"
1352
+ ],
1353
+ "title": "EffortLevel",
1354
+ "type": "string"
1355
+ },
1356
+ "EllipsisGrant": {
1357
+ "additionalProperties": false,
1358
+ "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.",
1359
+ "properties": {
1360
+ "level": {
1361
+ "$ref": "#/$defs/Level"
1362
+ },
1363
+ "match": {
1364
+ "anyOf": [
1365
+ {
1366
+ "items": {
1367
+ "type": "string"
1368
+ },
1369
+ "type": "array"
1370
+ },
1371
+ {
1372
+ "type": "null"
1373
+ }
1374
+ ],
1375
+ "default": null,
1376
+ "title": "Match"
1377
+ }
1378
+ },
1379
+ "required": [
1380
+ "level",
1381
+ "match"
1382
+ ],
1383
+ "title": "EllipsisGrant",
1384
+ "type": "object"
1385
+ },
113
1386
  "ErrorFrame": {
114
1387
  "description": "Terminal error marker, sent before the server closes with code 1011.",
115
1388
  "properties": {
@@ -129,7 +1402,69 @@
129
1402
  "message",
130
1403
  "type"
131
1404
  ],
132
- "title": "ErrorFrame",
1405
+ "title": "ErrorFrame",
1406
+ "type": "object"
1407
+ },
1408
+ "GithubAccountFilter": {
1409
+ "anyOf": [
1410
+ {
1411
+ "additionalProperties": false,
1412
+ "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.",
1413
+ "properties": {
1414
+ "exclude": {
1415
+ "default": [],
1416
+ "items": {
1417
+ "type": "string"
1418
+ },
1419
+ "title": "Exclude",
1420
+ "type": "array"
1421
+ },
1422
+ "include": {
1423
+ "anyOf": [
1424
+ {
1425
+ "items": {
1426
+ "type": "string"
1427
+ },
1428
+ "type": "array"
1429
+ },
1430
+ {
1431
+ "type": "boolean"
1432
+ }
1433
+ ],
1434
+ "default": true,
1435
+ "title": "Include"
1436
+ }
1437
+ },
1438
+ "title": "GithubAccountFilter",
1439
+ "type": "object"
1440
+ },
1441
+ {
1442
+ "type": "boolean"
1443
+ },
1444
+ {
1445
+ "items": {
1446
+ "type": "string"
1447
+ },
1448
+ "type": "array"
1449
+ }
1450
+ ]
1451
+ },
1452
+ "GithubAccountSelector": {
1453
+ "additionalProperties": false,
1454
+ "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).",
1455
+ "properties": {
1456
+ "bots": {
1457
+ "$ref": "#/$defs/GithubAccountFilter"
1458
+ },
1459
+ "users": {
1460
+ "$ref": "#/$defs/GithubAccountFilter"
1461
+ }
1462
+ },
1463
+ "required": [
1464
+ "bots",
1465
+ "users"
1466
+ ],
1467
+ "title": "GithubAccountSelector",
133
1468
  "type": "object"
134
1469
  },
135
1470
  "GithubAccountSnippet": {
@@ -201,11 +1536,36 @@
201
1536
  "title": "HeartbeatFrame",
202
1537
  "type": "object"
203
1538
  },
1539
+ "IssueAction": {
1540
+ "enum": [
1541
+ "opened",
1542
+ "closed",
1543
+ "commented"
1544
+ ],
1545
+ "title": "IssueAction",
1546
+ "type": "string"
1547
+ },
1548
+ "Level": {
1549
+ "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).",
1550
+ "enum": [
1551
+ "read",
1552
+ "write",
1553
+ "delete"
1554
+ ],
1555
+ "title": "Level",
1556
+ "type": "string"
1557
+ },
1558
+ "LinearIssueAction": {
1559
+ "enum": [
1560
+ "opened"
1561
+ ],
1562
+ "title": "LinearIssueAction",
1563
+ "type": "string"
1564
+ },
204
1565
  "ParentKind": {
205
- "description": "How a session relates to its predecessor (parent_agent_session_id) \u2014\nthe ONE \"preceded-by\" chain for every predecessor relationship. Routing\nreads this when the distinction matters.\n\nCONTINUATION \u2014 a follow-up in the same conversation surface (e.g. a Slack\nthread reply spawning a fresh session on the same thread).\nHANDOFF \u2014 a session started to take over work from another surface (e.g.\nlaptop \u2192 cloud handoff; later phase).\nRESUME \u2014 a conversation re-hosted on a new box after its sandbox was torn\ndown (interactive platform; later phase).",
1566
+ "description": "How a session relates to its predecessor (parent_agent_session_id) \u2014\nthe ONE \"preceded-by\" chain for every predecessor relationship. Routing\nreads this when the distinction matters.\n\nCONTINUATION \u2014 a follow-up in the same conversation surface (e.g. a Slack\nthread reply spawning a fresh session on the same thread).\nRESUME \u2014 a conversation re-hosted on a new box after its sandbox was torn\ndown (interactive platform; later phase).",
206
1567
  "enum": [
207
1568
  "continuation",
208
- "handoff",
209
1569
  "resume"
210
1570
  ],
211
1571
  "title": "ParentKind",
@@ -218,12 +1578,222 @@
218
1578
  "ephemeral_trigger",
219
1579
  "non_interactive",
220
1580
  "harness_single_turn",
221
- "closed",
222
- "laptop"
1581
+ "closed"
223
1582
  ],
224
1583
  "title": "PromptBlockedReason",
225
1584
  "type": "string"
226
1585
  },
1586
+ "PullRequestAction": {
1587
+ "enum": [
1588
+ "opened",
1589
+ "pushed",
1590
+ "merged",
1591
+ "closed",
1592
+ "review_submitted",
1593
+ "commented"
1594
+ ],
1595
+ "title": "PullRequestAction",
1596
+ "type": "string"
1597
+ },
1598
+ "ReactIssue": {
1599
+ "additionalProperties": false,
1600
+ "properties": {
1601
+ "for": {
1602
+ "$ref": "#/$defs/GithubAccountSelector"
1603
+ },
1604
+ "labels": {
1605
+ "default": [],
1606
+ "items": {
1607
+ "type": "string"
1608
+ },
1609
+ "title": "Labels",
1610
+ "type": "array"
1611
+ },
1612
+ "on": {
1613
+ "items": {
1614
+ "$ref": "#/$defs/IssueAction"
1615
+ },
1616
+ "title": "On",
1617
+ "type": "array"
1618
+ },
1619
+ "repositories": {
1620
+ "$ref": "#/$defs/RepositoryFilter"
1621
+ }
1622
+ },
1623
+ "required": [
1624
+ "for",
1625
+ "labels",
1626
+ "on",
1627
+ "repositories"
1628
+ ],
1629
+ "title": "ReactIssue",
1630
+ "type": "object"
1631
+ },
1632
+ "ReactLinearIssue": {
1633
+ "additionalProperties": false,
1634
+ "properties": {
1635
+ "for": {
1636
+ "$ref": "#/$defs/GithubAccountSelector"
1637
+ },
1638
+ "on": {
1639
+ "default": [
1640
+ "opened"
1641
+ ],
1642
+ "items": {
1643
+ "$ref": "#/$defs/LinearIssueAction"
1644
+ },
1645
+ "title": "On",
1646
+ "type": "array"
1647
+ }
1648
+ },
1649
+ "required": [
1650
+ "for",
1651
+ "on"
1652
+ ],
1653
+ "title": "ReactLinearIssue",
1654
+ "type": "object"
1655
+ },
1656
+ "ReactPullRequest": {
1657
+ "additionalProperties": false,
1658
+ "properties": {
1659
+ "base": {
1660
+ "default": [],
1661
+ "items": {
1662
+ "type": "string"
1663
+ },
1664
+ "title": "Base",
1665
+ "type": "array"
1666
+ },
1667
+ "draft": {
1668
+ "anyOf": [
1669
+ {
1670
+ "type": "boolean"
1671
+ },
1672
+ {
1673
+ "type": "null"
1674
+ }
1675
+ ],
1676
+ "default": null,
1677
+ "title": "Draft"
1678
+ },
1679
+ "for": {
1680
+ "$ref": "#/$defs/GithubAccountSelector"
1681
+ },
1682
+ "head": {
1683
+ "default": [],
1684
+ "items": {
1685
+ "type": "string"
1686
+ },
1687
+ "title": "Head",
1688
+ "type": "array"
1689
+ },
1690
+ "labels": {
1691
+ "default": [],
1692
+ "items": {
1693
+ "type": "string"
1694
+ },
1695
+ "title": "Labels",
1696
+ "type": "array"
1697
+ },
1698
+ "on": {
1699
+ "items": {
1700
+ "$ref": "#/$defs/PullRequestAction"
1701
+ },
1702
+ "title": "On",
1703
+ "type": "array"
1704
+ },
1705
+ "paths": {
1706
+ "default": [],
1707
+ "items": {
1708
+ "type": "string"
1709
+ },
1710
+ "title": "Paths",
1711
+ "type": "array"
1712
+ },
1713
+ "repositories": {
1714
+ "$ref": "#/$defs/RepositoryFilter"
1715
+ }
1716
+ },
1717
+ "required": [
1718
+ "base",
1719
+ "draft",
1720
+ "for",
1721
+ "head",
1722
+ "labels",
1723
+ "on",
1724
+ "paths",
1725
+ "repositories"
1726
+ ],
1727
+ "title": "ReactPullRequest",
1728
+ "type": "object"
1729
+ },
1730
+ "ReactPush": {
1731
+ "additionalProperties": false,
1732
+ "properties": {
1733
+ "branch": {
1734
+ "default": [],
1735
+ "items": {
1736
+ "type": "string"
1737
+ },
1738
+ "title": "Branch",
1739
+ "type": "array"
1740
+ },
1741
+ "for": {
1742
+ "$ref": "#/$defs/GithubAccountSelector"
1743
+ },
1744
+ "paths": {
1745
+ "default": [],
1746
+ "items": {
1747
+ "type": "string"
1748
+ },
1749
+ "title": "Paths",
1750
+ "type": "array"
1751
+ },
1752
+ "repositories": {
1753
+ "$ref": "#/$defs/RepositoryFilter"
1754
+ }
1755
+ },
1756
+ "required": [
1757
+ "branch",
1758
+ "for",
1759
+ "paths",
1760
+ "repositories"
1761
+ ],
1762
+ "title": "ReactPush",
1763
+ "type": "object"
1764
+ },
1765
+ "ReactSentry": {
1766
+ "additionalProperties": false,
1767
+ "properties": {
1768
+ "on": {
1769
+ "items": {
1770
+ "$ref": "#/$defs/SentryAction"
1771
+ },
1772
+ "title": "On",
1773
+ "type": "array"
1774
+ },
1775
+ "projects": {
1776
+ "default": [],
1777
+ "items": {
1778
+ "type": "string"
1779
+ },
1780
+ "title": "Projects",
1781
+ "type": "array"
1782
+ }
1783
+ },
1784
+ "required": [
1785
+ "on",
1786
+ "projects"
1787
+ ],
1788
+ "title": "ReactSentry",
1789
+ "type": "object"
1790
+ },
1791
+ "ReactSlackChannel": {
1792
+ "additionalProperties": false,
1793
+ "properties": {},
1794
+ "title": "ReactSlackChannel",
1795
+ "type": "object"
1796
+ },
227
1797
  "RecordsAppendFrame": {
228
1798
  "description": "Cursored append-only delivery of session records, ordered by feed_seq,\nfrom all sources. Every record in the frame advances the resume cursor \u2014\nincluding ones a client renders as nothing.",
229
1799
  "properties": {
@@ -249,6 +1819,59 @@
249
1819
  "title": "RecordsAppendFrame",
250
1820
  "type": "object"
251
1821
  },
1822
+ "RepositoryFilter": {
1823
+ "anyOf": [
1824
+ {
1825
+ "additionalProperties": false,
1826
+ "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`.",
1827
+ "properties": {
1828
+ "exclude": {
1829
+ "default": [],
1830
+ "items": {
1831
+ "type": "string"
1832
+ },
1833
+ "title": "Exclude",
1834
+ "type": "array"
1835
+ },
1836
+ "include": {
1837
+ "default": [],
1838
+ "items": {
1839
+ "type": "string"
1840
+ },
1841
+ "title": "Include",
1842
+ "type": "array"
1843
+ }
1844
+ },
1845
+ "title": "RepositoryFilter",
1846
+ "type": "object"
1847
+ },
1848
+ {
1849
+ "items": {
1850
+ "type": "string"
1851
+ },
1852
+ "type": "array"
1853
+ }
1854
+ ]
1855
+ },
1856
+ "Resource": {
1857
+ "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.",
1858
+ "enum": [
1859
+ "account",
1860
+ "alerts",
1861
+ "sessions",
1862
+ "files",
1863
+ "memories",
1864
+ "reviews",
1865
+ "configs",
1866
+ "defaults",
1867
+ "secrets",
1868
+ "templates",
1869
+ "integrations",
1870
+ "tokens"
1871
+ ],
1872
+ "title": "Resource",
1873
+ "type": "string"
1874
+ },
252
1875
  "RunStatus": {
253
1876
  "description": "What the current (or most recent) execution is doing (backs `run`).",
254
1877
  "enum": [
@@ -265,9 +1888,21 @@
265
1888
  "title": "RunStatus",
266
1889
  "type": "string"
267
1890
  },
1891
+ "SentryAction": {
1892
+ "enum": [
1893
+ "issue_alert",
1894
+ "metric_alert"
1895
+ ],
1896
+ "title": "SentryAction",
1897
+ "type": "string"
1898
+ },
268
1899
  "Session": {
269
1900
  "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.",
270
1901
  "properties": {
1902
+ "agent": {
1903
+ "$ref": "#/$defs/SessionAgent",
1904
+ "description": "The agent that ran: the config the session executed, where that config came from, and any override merged into it."
1905
+ },
271
1906
  "attribution": {
272
1907
  "$ref": "#/$defs/SessionAttribution",
273
1908
  "description": "The principal this session is attributed to."
@@ -276,19 +1911,6 @@
276
1911
  "$ref": "#/$defs/SessionBudget",
277
1912
  "description": "The spend budget enforced for this session."
278
1913
  },
279
- "config_id": {
280
- "anyOf": [
281
- {
282
- "type": "string"
283
- },
284
- {
285
- "type": "null"
286
- }
287
- ],
288
- "default": null,
289
- "description": "Identifier of the saved agent config the session ran on, if any.",
290
- "title": "Config Id"
291
- },
292
1914
  "context_repository": {
293
1915
  "anyOf": [
294
1916
  {
@@ -312,18 +1934,6 @@
312
1934
  "title": "Created At",
313
1935
  "type": "string"
314
1936
  },
315
- "default_resolution": {
316
- "anyOf": [
317
- {
318
- "$ref": "#/$defs/DefaultResolution"
319
- },
320
- {
321
- "type": "null"
322
- }
323
- ],
324
- "default": null,
325
- "description": "How the session's config was resolved from the account's defaults, when no explicit config was given."
326
- },
327
1937
  "exit_status": {
328
1938
  "anyOf": [
329
1939
  {
@@ -373,19 +1983,6 @@
373
1983
  "description": "When the session last received a message.",
374
1984
  "title": "Last Message At"
375
1985
  },
376
- "live_summary": {
377
- "anyOf": [
378
- {
379
- "type": "string"
380
- },
381
- {
382
- "type": "null"
383
- }
384
- ],
385
- "default": null,
386
- "description": "A live summary of the session's progress while it runs.",
387
- "title": "Live Summary"
388
- },
389
1986
  "metadata": {
390
1987
  "additionalProperties": {
391
1988
  "type": "string"
@@ -446,7 +2043,7 @@
446
2043
  },
447
2044
  "source": {
448
2045
  "$ref": "#/$defs/SessionSource",
449
- "description": "Where the session came from (e.g. react, manual, api, cli, mention, cron, laptop)."
2046
+ "description": "Where the session came from (e.g. react, manual, api, cli, mention, cron)."
450
2047
  },
451
2048
  "status": {
452
2049
  "$ref": "#/$defs/SessionStatus",
@@ -469,6 +2066,18 @@
469
2066
  "$ref": "#/$defs/SessionStopped",
470
2067
  "description": "The stop request, if the session was stopped."
471
2068
  },
2069
+ "summary": {
2070
+ "anyOf": [
2071
+ {
2072
+ "$ref": "#/$defs/SessionSummary"
2073
+ },
2074
+ {
2075
+ "type": "null"
2076
+ }
2077
+ ],
2078
+ "default": null,
2079
+ "description": "The latest live summary of the session's progress while it runs, and when it was generated."
2080
+ },
472
2081
  "surface": {
473
2082
  "anyOf": [
474
2083
  {
@@ -479,7 +2088,7 @@
479
2088
  }
480
2089
  ],
481
2090
  "default": null,
482
- "description": "The public status projection; null for laptop-synced sessions."
2091
+ "description": "The public status projection; null on list/search responses, which do not derive it."
483
2092
  },
484
2093
  "tokens": {
485
2094
  "$ref": "#/$defs/SessionTokens",
@@ -493,19 +2102,17 @@
493
2102
  }
494
2103
  },
495
2104
  "required": [
2105
+ "agent",
496
2106
  "attribution",
497
2107
  "budget",
498
- "config_id",
499
2108
  "context_repository",
500
2109
  "cost",
501
2110
  "created_at",
502
- "default_resolution",
503
2111
  "exit_status",
504
2112
  "harness",
505
2113
  "id",
506
2114
  "last_activity_at",
507
2115
  "last_message_at",
508
- "live_summary",
509
2116
  "metadata",
510
2117
  "output_prs",
511
2118
  "parent",
@@ -516,6 +2123,7 @@
516
2123
  "status",
517
2124
  "status_reason",
518
2125
  "stopped",
2126
+ "summary",
519
2127
  "surface",
520
2128
  "tokens",
521
2129
  "updated_at"
@@ -523,6 +2131,54 @@
523
2131
  "title": "Session",
524
2132
  "type": "object"
525
2133
  },
2134
+ "SessionAgent": {
2135
+ "description": "The agent this session ran: the config it actually executed, where that\nconfig came from, and the diff that was merged in \u2014 the same\neffective-value-plus-provenance shape `SessionBudget` uses.\n\n`config` is the snapshot frozen when the session was created; `config_id`\npoints at the saved config as it exists NOW. They diverge legitimately: a\nYAML edit after the session started, or any `override`, leaves the pointer\ndescribing something the session never ran.",
2136
+ "properties": {
2137
+ "config": {
2138
+ "$ref": "#/$defs/AgentConfig",
2139
+ "description": "The agent config the session actually ran, frozen when the session was created."
2140
+ },
2141
+ "config_id": {
2142
+ "anyOf": [
2143
+ {
2144
+ "type": "string"
2145
+ },
2146
+ {
2147
+ "type": "null"
2148
+ }
2149
+ ],
2150
+ "default": null,
2151
+ "description": "Identifier of the saved config this session's snapshot was taken from. Null for inline, platform-default, and built-in configs. Points at the config as it exists now, which may have changed since.",
2152
+ "title": "Config Id"
2153
+ },
2154
+ "override": {
2155
+ "anyOf": [
2156
+ {
2157
+ "additionalProperties": true,
2158
+ "type": "object"
2159
+ },
2160
+ {
2161
+ "type": "null"
2162
+ }
2163
+ ],
2164
+ "default": null,
2165
+ "description": "The partial-config override merged into `config` for this session, or null when the config ran unmodified. `config` is the merged result; this is the diff.",
2166
+ "title": "Override"
2167
+ },
2168
+ "source": {
2169
+ "$ref": "#/$defs/AgentConfigSource",
2170
+ "description": "How this session's config was chosen."
2171
+ }
2172
+ },
2173
+ "required": [
2174
+ "config",
2175
+ "config_id",
2176
+ "override",
2177
+ "source"
2178
+ ],
2179
+ "title": "SessionAgent",
2180
+ "type": "object"
2181
+ },
526
2182
  "SessionAttribution": {
527
2183
  "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.",
528
2184
  "properties": {
@@ -649,6 +2305,8 @@
649
2305
  "missing_repo_access",
650
2306
  "missing_token_permissions",
651
2307
  "missing_sandbox_variables",
2308
+ "blocked",
2309
+ "contact_email_required",
652
2310
  "cancelled",
653
2311
  "interrupted",
654
2312
  "error",
@@ -1142,8 +2800,7 @@
1142
2800
  "api",
1143
2801
  "cli",
1144
2802
  "mention",
1145
- "cron",
1146
- "laptop"
2803
+ "cron"
1147
2804
  ],
1148
2805
  "title": "SessionSource",
1149
2806
  "type": "string"
@@ -1223,8 +2880,38 @@
1223
2880
  "title": "SessionStopped",
1224
2881
  "type": "object"
1225
2882
  },
2883
+ "SessionSummary": {
2884
+ "description": "A live one-line summary of what the session is working on, refreshed\nevery few steps while it runs.",
2885
+ "properties": {
2886
+ "created_at": {
2887
+ "anyOf": [
2888
+ {
2889
+ "format": "date-time",
2890
+ "type": "string"
2891
+ },
2892
+ {
2893
+ "type": "null"
2894
+ }
2895
+ ],
2896
+ "default": null,
2897
+ "description": "When this summary line was generated. Null on summaries written before generation time was tracked.",
2898
+ "title": "Created At"
2899
+ },
2900
+ "description": {
2901
+ "description": "One-line description of what the session is working on.",
2902
+ "title": "Description",
2903
+ "type": "string"
2904
+ }
2905
+ },
2906
+ "required": [
2907
+ "created_at",
2908
+ "description"
2909
+ ],
2910
+ "title": "SessionSummary",
2911
+ "type": "object"
2912
+ },
1226
2913
  "SessionSurface": {
1227
- "description": "The three fields we expose. All `None` for an un-keyed (laptop) session.\n\n`use_enum_values=True` (from CustomBaseModel) stores the members as their\nstring values, so this serializes to `{\"session\": \"alive\", \"run\": \"waiting\",\n\"status\": \"waiting\"}` \u2014 a plain object, not enum names.",
2914
+ "description": "The three fields we expose.\n\n`use_enum_values=True` (from CustomBaseModel) stores the members as their\nstring values, so this serializes to `{\"session\": \"alive\", \"run\": \"waiting\",\n\"status\": \"waiting\"}` \u2014 a plain object, not enum names.",
1228
2915
  "properties": {
1229
2916
  "run": {
1230
2917
  "anyOf": [