@ellipsis-dev/sdk 0.30.0 → 0.32.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.
@@ -229,7 +229,7 @@
229
229
  },
230
230
  "AgentIdentity": {
231
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.",
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).",
233
233
  "properties": {
234
234
  "description": {
235
235
  "anyOf": [
@@ -324,6 +324,7 @@
324
324
  },
325
325
  "BudgetConfig": {
326
326
  "additionalProperties": false,
327
+ "description": "A saved agent's spend limits: the per-session cap plus its total spend\nover the trailing 1, 7, and 28 days.",
327
328
  "properties": {
328
329
  "day": {
329
330
  "anyOf": [
@@ -335,6 +336,7 @@
335
336
  }
336
337
  ],
337
338
  "default": null,
339
+ "description": "The most the agent may spend over the last day, in US dollars.",
338
340
  "title": "Day"
339
341
  },
340
342
  "month": {
@@ -347,6 +349,7 @@
347
349
  }
348
350
  ],
349
351
  "default": null,
352
+ "description": "The most the agent may spend over the last 28 days, in US dollars.",
350
353
  "title": "Month"
351
354
  },
352
355
  "session": {
@@ -360,6 +363,7 @@
360
363
  }
361
364
  ],
362
365
  "default": null,
366
+ "description": "The most one session may spend, in US dollars.",
363
367
  "title": "Session"
364
368
  },
365
369
  "week": {
@@ -372,6 +376,7 @@
372
376
  }
373
377
  ],
374
378
  "default": null,
379
+ "description": "The most the agent may spend over the last 7 days, in US dollars.",
375
380
  "title": "Week"
376
381
  }
377
382
  },
@@ -384,6 +389,14 @@
384
389
  "title": "BudgetConfig",
385
390
  "type": "object"
386
391
  },
392
+ "CheckRunAction": {
393
+ "description": "What a completed check run did. `failed` covers the conclusions that\nmean the check did not pass on its own merits (`failure`, `timed_out`); a\ncancelled, skipped, neutral or stale check is not a failure and never\nfires (see FAILED_CHECK_RUN_CONCLUSIONS).",
394
+ "enum": [
395
+ "failed"
396
+ ],
397
+ "title": "CheckRunAction",
398
+ "type": "string"
399
+ },
387
400
  "ClaudeConfig": {
388
401
  "additionalProperties": false,
389
402
  "description": "Native Claude Code options for an explicitly selected harness.",
@@ -425,16 +438,9 @@
425
438
  "title": "Max Turns"
426
439
  },
427
440
  "model": {
428
- "anyOf": [
429
- {
430
- "type": "string"
431
- },
432
- {
433
- "type": "null"
434
- }
435
- ],
436
- "default": null,
437
- "title": "Model"
441
+ "description": "The model the session runs on: an alias or canonical id from the models table. Required.",
442
+ "title": "Model",
443
+ "type": "string"
438
444
  },
439
445
  "prompt": {
440
446
  "anyOf": [
@@ -446,7 +452,7 @@
446
452
  }
447
453
  ],
448
454
  "default": null,
449
- "description": "The initial user message, passed verbatim. Omit to start an interactive session idle.",
455
+ "description": "The initial user message, passed verbatim. Omit to start an interactive session with no turn, waiting for a message.",
450
456
  "title": "Prompt"
451
457
  },
452
458
  "settings": {
@@ -474,7 +480,7 @@
474
480
  },
475
481
  "CodexConfig": {
476
482
  "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.",
483
+ "description": "Native options supported by the current Codex adapter.",
478
484
  "properties": {
479
485
  "effort": {
480
486
  "anyOf": [
@@ -489,7 +495,7 @@
489
495
  "description": "Reasoning effort for every turn. Omit to use the model default."
490
496
  },
491
497
  "model": {
492
- "default": "gpt-5.6-terra",
498
+ "description": "The model the session runs on: a Responses-capable id from the models table. Required.",
493
499
  "title": "Model",
494
500
  "type": "string"
495
501
  },
@@ -503,7 +509,7 @@
503
509
  }
504
510
  ],
505
511
  "default": null,
506
- "description": "The initial user message, passed verbatim. Omit to start an interactive session idle.",
512
+ "description": "The initial user message, passed verbatim. Omit to start an interactive session with no turn, waiting for a message.",
507
513
  "title": "Prompt"
508
514
  }
509
515
  },
@@ -544,7 +550,7 @@
544
550
  },
545
551
  "ComputeConfig": {
546
552
  "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.",
553
+ "description": "Environment compute sizing. Every field is optional; an omitted field\ninherits the platform default (2 vCPU / 4096 MiB / 3600s). A resolved value\noutside the platform bounds fails validation loudly (a sync error on the\nconfig) rather than being 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 environment is sized with.\n\n`timeout` is the max wall-clock the agent may run in one environment before\nit is stopped, capped at 1h (equal to the default, so today the knob only\nshortens a session; the cap matches the 1-hour validity of the session's\nGitHub token).\n\nCompute currently uses a temporary flat one-cent amount each time an\nenvironment is started for a session, subject to the account's existing\nfree-compute exemptions.",
548
554
  "properties": {
549
555
  "cpu": {
550
556
  "anyOf": [
@@ -635,17 +641,15 @@
635
641
  "title": "ConfigMetadata",
636
642
  "type": "object"
637
643
  },
638
- "ConversationState": {
639
- "enum": [
640
- "open",
641
- "closed"
642
- ],
643
- "title": "ConversationState",
644
- "type": "string"
645
- },
646
644
  "CronTrigger": {
647
645
  "additionalProperties": false,
646
+ "description": "A schedule: `schedule` is a five-field cron expression in UTC.\n\n`enabled: false` pauses the trigger and keeps its definition: the schedule\nstops firing while the agent stays live for on-demand starts and open\nsessions keep taking follow-ups (`ellipsis.enabled: false` pauses the\nwhole file instead). Re-enabling resumes at the next scheduled time; runs\nmissed while paused are not made up.",
648
647
  "properties": {
648
+ "enabled": {
649
+ "default": true,
650
+ "title": "Enabled",
651
+ "type": "boolean"
652
+ },
649
653
  "schedule": {
650
654
  "title": "Schedule",
651
655
  "type": "string"
@@ -658,6 +662,7 @@
658
662
  }
659
663
  },
660
664
  "required": [
665
+ "enabled",
661
666
  "schedule",
662
667
  "type"
663
668
  ],
@@ -729,7 +734,7 @@
729
734
  },
730
735
  "EllipsisGrant": {
731
736
  "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.",
737
+ "description": "One grant entry: a level, optionally narrowed to instances whose\nnatural key (a file's name, a secret's name, a config's name, a session's\nid) matches any of the `match` globs.",
733
738
  "properties": {
734
739
  "level": {
735
740
  "$ref": "#/$defs/Level"
@@ -781,7 +786,7 @@
781
786
  }
782
787
  ]
783
788
  },
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.",
789
+ "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 session token ceiling at token mint \u2014 it can\nnarrow what a session token may do, never exceed it.",
785
790
  "propertyNames": {
786
791
  "$ref": "#/$defs/Resource"
787
792
  },
@@ -805,11 +810,11 @@
805
810
  }
806
811
  ],
807
812
  "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.",
813
+ "description": "Exact files relative to the workspace directory `/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
814
  "title": "Inputs"
810
815
  },
811
816
  "run": {
812
- "description": "Shell script to run in /sandbox.",
817
+ "description": "Shell script to run in the workspace directory `/sandbox`.",
813
818
  "minLength": 1,
814
819
  "title": "Run",
815
820
  "type": "string"
@@ -824,7 +829,7 @@
824
829
  },
825
830
  "EnvironmentConfig": {
826
831
  "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.",
832
+ "description": "Everything about the environment 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 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
833
  "properties": {
829
834
  "compute": {
830
835
  "$ref": "#/$defs/ComputeConfig",
@@ -894,7 +899,7 @@
894
899
  },
895
900
  "EnvironmentHooks": {
896
901
  "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.",
902
+ "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 environment's\nuser in the workspace directory `/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
903
  "properties": {
899
904
  "after_checkout": {
900
905
  "anyOf": [
@@ -909,7 +914,7 @@
909
914
  }
910
915
  ],
911
916
  "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.",
917
+ "description": "Prepare the requested source revision after Ellipsis checks out all repositories, before saving the prepared environment. Skipped when that prepared environment is reused.",
913
918
  "title": "After Checkout"
914
919
  },
915
920
  "before_start": {
@@ -925,7 +930,7 @@
925
930
  }
926
931
  ],
927
932
  "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.",
933
+ "description": "Run before the agent starts or resumes a session, after the environment is ready. This hook is not cached and adds to session startup time.",
929
934
  "title": "Before Start"
930
935
  },
931
936
  "build_base": {
@@ -983,10 +988,10 @@
983
988
  },
984
989
  "EnvironmentScript": {
985
990
  "additionalProperties": false,
986
- "description": "An inline shell script run as the sandbox user, with /sandbox as cwd.",
991
+ "description": "An inline shell script run as the environment's user, with the workspace\ndirectory `/sandbox` as cwd.",
987
992
  "properties": {
988
993
  "run": {
989
- "description": "Shell script to run in /sandbox.",
994
+ "description": "Shell script to run in the workspace directory `/sandbox`.",
990
995
  "minLength": 1,
991
996
  "title": "Run",
992
997
  "type": "string"
@@ -999,7 +1004,7 @@
999
1004
  "type": "object"
1000
1005
  },
1001
1006
  "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.",
1007
+ "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 environment.",
1003
1008
  "enum": [
1004
1009
  "request",
1005
1010
  "agent",
@@ -1012,7 +1017,7 @@
1012
1017
  },
1013
1018
  "EnvironmentVariable": {
1014
1019
  "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.",
1020
+ "description": "One environment variable injected into the session's environment.\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 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
1021
  "properties": {
1017
1022
  "name": {
1018
1023
  "title": "Name",
@@ -1088,17 +1093,26 @@
1088
1093
  },
1089
1094
  "GithubAccountSelector": {
1090
1095
  "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).",
1096
+ "description": "A selector of GitHub accounts \u2014 the `for:` audience gate on react\nsurfaces, classified on the stable entity author (the pusher for `push`,\nthe PR author for a pull request). `users` selects human\naccounts, `bots` selects bot accounts; each is a `GithubAccountFilter`\n(include minus exclude, with bare bool/list shorthand).\n\n`teams` narrows further to members of any of the listed GitHub teams of\nthe installation's organization, by slug (`platform` for\n`@org/platform`). It applies on top of `users`: the author must pass the\nusers filter AND belong to a listed team. A bot is never a team member,\nso a selector with `teams` never admits one. Membership is resolved live\nat match time (see `TriggerEventContext.is_author_team_member`), and the\nconfig sync refuses a team that does not exist when the file is\naccepted.",
1092
1097
  "properties": {
1093
1098
  "bots": {
1094
1099
  "$ref": "#/$defs/GithubAccountFilter"
1095
1100
  },
1101
+ "teams": {
1102
+ "default": [],
1103
+ "items": {
1104
+ "type": "string"
1105
+ },
1106
+ "title": "Teams",
1107
+ "type": "array"
1108
+ },
1096
1109
  "users": {
1097
1110
  "$ref": "#/$defs/GithubAccountFilter"
1098
1111
  }
1099
1112
  },
1100
1113
  "required": [
1101
1114
  "bots",
1115
+ "teams",
1102
1116
  "users"
1103
1117
  ],
1104
1118
  "title": "GithubAccountSelector",
@@ -1119,6 +1133,18 @@
1119
1133
  "title": "Login",
1120
1134
  "type": "string"
1121
1135
  },
1136
+ "name": {
1137
+ "anyOf": [
1138
+ {
1139
+ "type": "string"
1140
+ },
1141
+ {
1142
+ "type": "null"
1143
+ }
1144
+ ],
1145
+ "default": null,
1146
+ "title": "Name"
1147
+ },
1122
1148
  "type": {
1123
1149
  "$ref": "#/$defs/GithubAccountType"
1124
1150
  }
@@ -1127,6 +1153,7 @@
1127
1153
  "avatar_url",
1128
1154
  "id",
1129
1155
  "login",
1156
+ "name",
1130
1157
  "type"
1131
1158
  ],
1132
1159
  "title": "GithubAccountSnippet",
@@ -1142,6 +1169,96 @@
1142
1169
  "title": "GithubAccountType",
1143
1170
  "type": "string"
1144
1171
  },
1172
+ "GithubCheckRunEvent": {
1173
+ "properties": {
1174
+ "action": {
1175
+ "$ref": "#/$defs/CheckRunAction"
1176
+ },
1177
+ "actor": {
1178
+ "anyOf": [
1179
+ {
1180
+ "$ref": "#/$defs/SessionEventActor"
1181
+ },
1182
+ {
1183
+ "type": "null"
1184
+ }
1185
+ ],
1186
+ "default": null
1187
+ },
1188
+ "branch": {
1189
+ "anyOf": [
1190
+ {
1191
+ "type": "string"
1192
+ },
1193
+ {
1194
+ "type": "null"
1195
+ }
1196
+ ],
1197
+ "default": null,
1198
+ "title": "Branch"
1199
+ },
1200
+ "conclusion": {
1201
+ "anyOf": [
1202
+ {
1203
+ "type": "string"
1204
+ },
1205
+ {
1206
+ "type": "null"
1207
+ }
1208
+ ],
1209
+ "default": null,
1210
+ "title": "Conclusion"
1211
+ },
1212
+ "head_sha": {
1213
+ "title": "Head Sha",
1214
+ "type": "string"
1215
+ },
1216
+ "name": {
1217
+ "title": "Name",
1218
+ "type": "string"
1219
+ },
1220
+ "pull_request_number": {
1221
+ "anyOf": [
1222
+ {
1223
+ "type": "integer"
1224
+ },
1225
+ {
1226
+ "type": "null"
1227
+ }
1228
+ ],
1229
+ "default": null,
1230
+ "title": "Pull Request Number"
1231
+ },
1232
+ "repository": {
1233
+ "title": "Repository",
1234
+ "type": "string"
1235
+ },
1236
+ "type": {
1237
+ "const": "github.check_run",
1238
+ "default": "github.check_run",
1239
+ "title": "Type",
1240
+ "type": "string"
1241
+ },
1242
+ "url": {
1243
+ "title": "Url",
1244
+ "type": "string"
1245
+ }
1246
+ },
1247
+ "required": [
1248
+ "action",
1249
+ "actor",
1250
+ "branch",
1251
+ "conclusion",
1252
+ "head_sha",
1253
+ "name",
1254
+ "pull_request_number",
1255
+ "repository",
1256
+ "type",
1257
+ "url"
1258
+ ],
1259
+ "title": "GithubCheckRunEvent",
1260
+ "type": "object"
1261
+ },
1145
1262
  "GithubIssueEvent": {
1146
1263
  "properties": {
1147
1264
  "action": {
@@ -1195,7 +1312,7 @@
1195
1312
  },
1196
1313
  "GithubPermissions": {
1197
1314
  "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.",
1315
+ "description": "The agent's GitHub access: the scope of the installation token minted for\nits session's environment \u2014 the credential `git` and `gh` authenticate\nwith.\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 environment can\nexceed it.",
1199
1316
  "properties": {
1200
1317
  "permissions": {
1201
1318
  "anyOf": [
@@ -1356,8 +1473,72 @@
1356
1473
  "title": "GithubPushEvent",
1357
1474
  "type": "object"
1358
1475
  },
1476
+ "GithubReleaseEvent": {
1477
+ "properties": {
1478
+ "action": {
1479
+ "$ref": "#/$defs/ReleaseAction"
1480
+ },
1481
+ "actor": {
1482
+ "anyOf": [
1483
+ {
1484
+ "$ref": "#/$defs/SessionEventActor"
1485
+ },
1486
+ {
1487
+ "type": "null"
1488
+ }
1489
+ ],
1490
+ "default": null
1491
+ },
1492
+ "name": {
1493
+ "anyOf": [
1494
+ {
1495
+ "type": "string"
1496
+ },
1497
+ {
1498
+ "type": "null"
1499
+ }
1500
+ ],
1501
+ "default": null,
1502
+ "title": "Name"
1503
+ },
1504
+ "prerelease": {
1505
+ "title": "Prerelease",
1506
+ "type": "boolean"
1507
+ },
1508
+ "repository": {
1509
+ "title": "Repository",
1510
+ "type": "string"
1511
+ },
1512
+ "tag": {
1513
+ "title": "Tag",
1514
+ "type": "string"
1515
+ },
1516
+ "type": {
1517
+ "const": "github.release",
1518
+ "default": "github.release",
1519
+ "title": "Type",
1520
+ "type": "string"
1521
+ },
1522
+ "url": {
1523
+ "title": "Url",
1524
+ "type": "string"
1525
+ }
1526
+ },
1527
+ "required": [
1528
+ "action",
1529
+ "actor",
1530
+ "name",
1531
+ "prerelease",
1532
+ "repository",
1533
+ "tag",
1534
+ "type",
1535
+ "url"
1536
+ ],
1537
+ "title": "GithubReleaseEvent",
1538
+ "type": "object"
1539
+ },
1359
1540
  "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.",
1541
+ "description": "Identifies the file a GitHub-sourced agent is synced from.\n\nIdentified by 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
1542
  "properties": {
1362
1543
  "branch": {
1363
1544
  "title": "Branch",
@@ -1393,7 +1574,7 @@
1393
1574
  },
1394
1575
  "InputContract": {
1395
1576
  "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`).",
1577
+ "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` (the dashboard and the CLI start\nthrough the same door) and stored as `session.input`. An on-demand\nstart requires input when a schema is declared. A trigger fires\nwithout it: a cron fire has no payload and a react fire carries the\nplatform-shaped event, so an agent may declare a schema alongside\neither trigger and the schema governs only its on-demand starts.\n\n`message` is the initial-message template: exact `{{path}}` substitution\nover the payload the session has (the caller payload on an on-demand\nstart, the surface's published fields on a react fire, the empty\nobject on a cron fire), no conditionals/loops/filters. Refs are\nvalidated at deploy time against every governing field set (see\nAgentConfig's `_check_input`): the caller schema's paths, the react\nsurface's published fields, and both when the agent has a react trigger\nand a schema, so one template renders fully on either door (declare the\nsurface's field names in the schema). Omit `message` to let each door\nrender its default. An unresolved ref renders as the empty string (a\ncron fire, an optional field the payload omitted).",
1397
1578
  "properties": {
1398
1579
  "json_schema": {
1399
1580
  "anyOf": [
@@ -1462,7 +1643,10 @@
1462
1643
  "$ref": "#/$defs/LinearIssueAction"
1463
1644
  },
1464
1645
  {
1465
- "const": "commented",
1646
+ "enum": [
1647
+ "commented",
1648
+ "delegated"
1649
+ ],
1466
1650
  "type": "string"
1467
1651
  }
1468
1652
  ],
@@ -1524,7 +1708,7 @@
1524
1708
  },
1525
1709
  "McpRemoteServer": {
1526
1710
  "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.",
1711
+ "description": "A bring-your-own remote MCP server: the harness talks HTTP to `url`.\nNothing runs in the environment 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
1712
  "properties": {
1529
1713
  "headers": {
1530
1714
  "additionalProperties": {
@@ -1553,7 +1737,7 @@
1553
1737
  },
1554
1738
  "McpServerRef": {
1555
1739
  "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`).",
1740
+ "description": "One built-in MCP server this agent attaches by name (`linear`/`slack`).\nA name reference over the connected built-in set \u2014 the platform manages the\nserver's transport and credentials. A session gets a built-in server only\nwhen its config names it here or the session started from that server's\nown surface. For a server the platform does not provide, define it instead\n(`McpStdioServer` / `McpRemoteServer`).",
1557
1741
  "properties": {
1558
1742
  "name": {
1559
1743
  "title": "Name",
@@ -1568,7 +1752,7 @@
1568
1752
  },
1569
1753
  "McpStdioServer": {
1570
1754
  "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.",
1755
+ "description": "A bring-your-own stdio MCP server: the harness spawns `command` inside\nthe environment and speaks JSON-RPC over its stdin/stdout. The command must\nbe runnable in the environment 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
1756
  "properties": {
1573
1757
  "args": {
1574
1758
  "default": [],
@@ -1660,7 +1844,7 @@
1660
1844
  },
1661
1845
  "PermissionsConfig": {
1662
1846
  "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.",
1847
+ "description": "What the agent is allowed to touch, per credential the platform mints\ninto its session's environment. Distinct from `environment:`, which is\nwhere the agent runs; this is what it may do from there.\n\n`ellipsis` scopes the session's Ellipsis API token (`ELLIPSIS_API_TOKEN`,\nwhat the `ellipsis` CLI running inside the session authenticates with).\n`true` / the string `all` (the default) grant the full session token\nceiling \u2014 everything a session 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 session's GitHub installation token (`GH_TOKEN`) \u2014\nsee `GithubPermissions`. GitHub enforces it at mint time.",
1664
1848
  "properties": {
1665
1849
  "ellipsis": {
1666
1850
  "anyOf": [
@@ -1696,9 +1880,9 @@
1696
1880
  "description": "Why direct prompting is refused. Absent when prompting is allowed.",
1697
1881
  "enum": [
1698
1882
  "mention_surface",
1699
- "ephemeral_trigger",
1700
1883
  "non_interactive",
1701
1884
  "harness_single_turn",
1885
+ "budget_exhausted",
1702
1886
  "closed"
1703
1887
  ],
1704
1888
  "title": "PromptBlockedReason",
@@ -1716,6 +1900,53 @@
1716
1900
  "title": "PullRequestAction",
1717
1901
  "type": "string"
1718
1902
  },
1903
+ "ReactCheckRun": {
1904
+ "additionalProperties": false,
1905
+ "description": "A CI/CD check completing on a commit \u2014 a `check_run` from GitHub\nActions or any other app that reports checks. `names` narrows to the check\nruns whose name matches (exact, or a prefix ending in `*`); `branch` is the\ncheck suite's head branch. The `for:` audience is the commit's author (the\npull request author when the check is attached to one), never the CI app\nthat completed the check \u2014 a check run's sender is always a bot.\n\nDelivery needs the Ellipsis GitHub App's `checks` permission on the\ninstallation; without it GitHub sends no check events and the webhook\nhandler refuses the ones it does see.",
1906
+ "properties": {
1907
+ "branch": {
1908
+ "default": [],
1909
+ "items": {
1910
+ "type": "string"
1911
+ },
1912
+ "title": "Branch",
1913
+ "type": "array"
1914
+ },
1915
+ "for": {
1916
+ "$ref": "#/$defs/GithubAccountSelector"
1917
+ },
1918
+ "names": {
1919
+ "default": [],
1920
+ "items": {
1921
+ "type": "string"
1922
+ },
1923
+ "title": "Names",
1924
+ "type": "array"
1925
+ },
1926
+ "on": {
1927
+ "default": [
1928
+ "failed"
1929
+ ],
1930
+ "items": {
1931
+ "$ref": "#/$defs/CheckRunAction"
1932
+ },
1933
+ "title": "On",
1934
+ "type": "array"
1935
+ },
1936
+ "repositories": {
1937
+ "$ref": "#/$defs/RepositoryFilter"
1938
+ }
1939
+ },
1940
+ "required": [
1941
+ "branch",
1942
+ "for",
1943
+ "names",
1944
+ "on",
1945
+ "repositories"
1946
+ ],
1947
+ "title": "ReactCheckRun",
1948
+ "type": "object"
1949
+ },
1719
1950
  "ReactIssue": {
1720
1951
  "additionalProperties": false,
1721
1952
  "properties": {
@@ -1883,6 +2114,57 @@
1883
2114
  "title": "ReactPush",
1884
2115
  "type": "object"
1885
2116
  },
2117
+ "ReactRelease": {
2118
+ "additionalProperties": false,
2119
+ "description": "A GitHub release being published \u2014 a release or prerelease published\ndirectly, or a draft published later. `tag` narrows to the release tags\nthat match (exact, or a prefix ending in `*`, so `v*`); `prerelease`\nselects prereleases or full releases, like `draft` on pull requests. The\n`for:` audience is the release's author, which for a release cut by CI is\na bot and needs `bots` to opt in.",
2120
+ "properties": {
2121
+ "for": {
2122
+ "$ref": "#/$defs/GithubAccountSelector"
2123
+ },
2124
+ "on": {
2125
+ "default": [
2126
+ "published"
2127
+ ],
2128
+ "items": {
2129
+ "$ref": "#/$defs/ReleaseAction"
2130
+ },
2131
+ "title": "On",
2132
+ "type": "array"
2133
+ },
2134
+ "prerelease": {
2135
+ "anyOf": [
2136
+ {
2137
+ "type": "boolean"
2138
+ },
2139
+ {
2140
+ "type": "null"
2141
+ }
2142
+ ],
2143
+ "default": null,
2144
+ "title": "Prerelease"
2145
+ },
2146
+ "repositories": {
2147
+ "$ref": "#/$defs/RepositoryFilter"
2148
+ },
2149
+ "tag": {
2150
+ "default": [],
2151
+ "items": {
2152
+ "type": "string"
2153
+ },
2154
+ "title": "Tag",
2155
+ "type": "array"
2156
+ }
2157
+ },
2158
+ "required": [
2159
+ "for",
2160
+ "on",
2161
+ "prerelease",
2162
+ "repositories",
2163
+ "tag"
2164
+ ],
2165
+ "title": "ReactRelease",
2166
+ "type": "object"
2167
+ },
1886
2168
  "ReactSentry": {
1887
2169
  "additionalProperties": false,
1888
2170
  "properties": {
@@ -1917,7 +2199,24 @@
1917
2199
  },
1918
2200
  "ReactTrigger": {
1919
2201
  "additionalProperties": false,
2202
+ "description": "An event trigger: exactly one surface block names the events to match.\n\n`enabled: false` pauses the trigger and keeps its definition: events stop\nmatching while the agent stays live for on-demand starts and open\nsessions keep taking follow-ups (`ellipsis.enabled: false` pauses the\nwhole file instead).",
1920
2203
  "properties": {
2204
+ "check_run": {
2205
+ "anyOf": [
2206
+ {
2207
+ "$ref": "#/$defs/ReactCheckRun"
2208
+ },
2209
+ {
2210
+ "type": "null"
2211
+ }
2212
+ ],
2213
+ "default": null
2214
+ },
2215
+ "enabled": {
2216
+ "default": true,
2217
+ "title": "Enabled",
2218
+ "type": "boolean"
2219
+ },
1921
2220
  "issue": {
1922
2221
  "anyOf": [
1923
2222
  {
@@ -1962,6 +2261,17 @@
1962
2261
  ],
1963
2262
  "default": null
1964
2263
  },
2264
+ "release": {
2265
+ "anyOf": [
2266
+ {
2267
+ "$ref": "#/$defs/ReactRelease"
2268
+ },
2269
+ {
2270
+ "type": "null"
2271
+ }
2272
+ ],
2273
+ "default": null
2274
+ },
1965
2275
  "sentry": {
1966
2276
  "anyOf": [
1967
2277
  {
@@ -1992,10 +2302,13 @@
1992
2302
  }
1993
2303
  },
1994
2304
  "required": [
2305
+ "check_run",
2306
+ "enabled",
1995
2307
  "issue",
1996
2308
  "linear_issue",
1997
2309
  "pull_request",
1998
2310
  "push",
2311
+ "release",
1999
2312
  "sentry",
2000
2313
  "slack_channel",
2001
2314
  "type"
@@ -2003,6 +2316,14 @@
2003
2316
  "title": "ReactTrigger",
2004
2317
  "type": "object"
2005
2318
  },
2319
+ "ReleaseAction": {
2320
+ "description": "What happened to a GitHub release. `published` is the one moment a\nrelease becomes visible: a release or prerelease published directly, or a\ndraft published later. Edits, deletions, and unpublishes never fire.",
2321
+ "enum": [
2322
+ "published"
2323
+ ],
2324
+ "title": "ReleaseAction",
2325
+ "type": "string"
2326
+ },
2006
2327
  "RepositoryFilter": {
2007
2328
  "anyOf": [
2008
2329
  {
@@ -2087,15 +2408,13 @@
2087
2408
  "account",
2088
2409
  "alerts",
2089
2410
  "sessions",
2090
- "files",
2091
- "memories",
2092
- "reviews",
2093
2411
  "configs",
2094
2412
  "defaults",
2095
2413
  "environments",
2096
2414
  "secrets",
2097
2415
  "templates",
2098
2416
  "integrations",
2417
+ "reviews",
2099
2418
  "tokens",
2100
2419
  "webhooks",
2101
2420
  "user"
@@ -2247,11 +2566,9 @@
2247
2566
  },
2248
2567
  "SandboxSource": {
2249
2568
  "enum": [
2250
- "cli",
2251
- "web_ui",
2252
- "ingest_pull_request_job_run",
2253
2569
  "session",
2254
2570
  "image_refresh",
2571
+ "environment_check",
2255
2572
  "test",
2256
2573
  "script"
2257
2574
  ],
@@ -2418,7 +2735,7 @@
2418
2735
  ]
2419
2736
  }
2420
2737
  ],
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.",
2738
+ "description": "An agent session: one conversation with an agent. Returned by\n`GET /v1/sessions/{id}` and carried by the session stream's\n`session`/`snapshot` frames; REST and stream never disagree about what a\nsession looks like.",
2422
2739
  "properties": {
2423
2740
  "agent": {
2424
2741
  "anyOf": [
@@ -2432,6 +2749,18 @@
2432
2749
  "default": null,
2433
2750
  "description": "The agent the session was started from, or null for a raw session started with POST /v1/sessions."
2434
2751
  },
2752
+ "archived": {
2753
+ "anyOf": [
2754
+ {
2755
+ "$ref": "#/$defs/SessionArchived"
2756
+ },
2757
+ {
2758
+ "type": "null"
2759
+ }
2760
+ ],
2761
+ "default": null,
2762
+ "description": "When and by whom the session was archived; null when unarchived. Archiving does not stop or close a session."
2763
+ },
2435
2764
  "attribution": {
2436
2765
  "$ref": "#/$defs/SessionAttribution",
2437
2766
  "description": "The principal this session is attributed to."
@@ -2466,9 +2795,19 @@
2466
2795
  "default": null,
2467
2796
  "description": "Codex input and native options. Set exactly one of claude_code or codex."
2468
2797
  },
2798
+ "conversation": {
2799
+ "$ref": "#/$defs/SessionConversation",
2800
+ "description": "Whether the session can take more messages, and whether an agent is warm to answer one."
2801
+ },
2469
2802
  "cost": {
2470
2803
  "$ref": "#/$defs/SessionCost",
2471
- "description": "What the session cost, in millicents, broken down by leg and carrying its own total."
2804
+ "description": "What the session has cost so far, in millicents, broken down by leg and carrying its own total."
2805
+ },
2806
+ "created_at": {
2807
+ "description": "When the session was created.",
2808
+ "format": "date-time",
2809
+ "title": "Created At",
2810
+ "type": "string"
2472
2811
  },
2473
2812
  "environment": {
2474
2813
  "$ref": "#/$defs/SessionEnvironment",
@@ -2479,9 +2818,11 @@
2479
2818
  {
2480
2819
  "discriminator": {
2481
2820
  "mapping": {
2821
+ "github.check_run": "#/$defs/GithubCheckRunEvent",
2482
2822
  "github.issue": "#/$defs/GithubIssueEvent",
2483
2823
  "github.pull_request": "#/$defs/GithubPullRequestEvent",
2484
2824
  "github.push": "#/$defs/GithubPushEvent",
2825
+ "github.release": "#/$defs/GithubReleaseEvent",
2485
2826
  "linear.issue": "#/$defs/LinearIssueEvent",
2486
2827
  "sentry.alert": "#/$defs/SentryAlertEvent",
2487
2828
  "slack.channel_created": "#/$defs/SlackChannelCreatedEvent",
@@ -2499,6 +2840,12 @@
2499
2840
  {
2500
2841
  "$ref": "#/$defs/GithubPushEvent"
2501
2842
  },
2843
+ {
2844
+ "$ref": "#/$defs/GithubCheckRunEvent"
2845
+ },
2846
+ {
2847
+ "$ref": "#/$defs/GithubReleaseEvent"
2848
+ },
2502
2849
  {
2503
2850
  "$ref": "#/$defs/LinearIssueEvent"
2504
2851
  },
@@ -2550,10 +2897,6 @@
2550
2897
  "title": "Id",
2551
2898
  "type": "string"
2552
2899
  },
2553
- "lifecycle": {
2554
- "$ref": "#/$defs/SessionLifecycle",
2555
- "description": "The session's activity, conversation state, messaging policy, outcomes, and timestamps."
2556
- },
2557
2900
  "metadata": {
2558
2901
  "additionalProperties": {
2559
2902
  "type": "string"
@@ -2566,14 +2909,14 @@
2566
2909
  "output": {
2567
2910
  "anyOf": [
2568
2911
  {
2569
- "$ref": "#/$defs/OutputConfig"
2912
+ "$ref": "#/$defs/SessionOutput"
2570
2913
  },
2571
2914
  {
2572
2915
  "type": "null"
2573
2916
  }
2574
2917
  ],
2575
2918
  "default": null,
2576
- "description": "The structured-output exit contract for this session."
2919
+ "description": "The session's structured output: the `json_schema` the agent must satisfy and, once a turn has submitted it, the `result`."
2577
2920
  },
2578
2921
  "parent": {
2579
2922
  "anyOf": [
@@ -2618,21 +2961,41 @@
2618
2961
  "tokens": {
2619
2962
  "$ref": "#/$defs/SessionTokens",
2620
2963
  "description": "The tokens the session spent and the model they went to. `total` includes the prompt-cache lanes."
2964
+ },
2965
+ "turn": {
2966
+ "anyOf": [
2967
+ {
2968
+ "$ref": "#/$defs/SessionTurn"
2969
+ },
2970
+ {
2971
+ "type": "null"
2972
+ }
2973
+ ],
2974
+ "default": null,
2975
+ "description": "The turn in progress, or the latest one when none is running. Null until the session has a message. Wait on it: the message you sent is answered when the turn with your message's `turn_id` reaches a final status."
2976
+ },
2977
+ "updated_at": {
2978
+ "description": "When the session was last updated.",
2979
+ "format": "date-time",
2980
+ "title": "Updated At",
2981
+ "type": "string"
2621
2982
  }
2622
2983
  },
2623
2984
  "required": [
2624
2985
  "agent",
2986
+ "archived",
2625
2987
  "attribution",
2626
2988
  "budget",
2627
2989
  "claude_code",
2628
2990
  "codex",
2991
+ "conversation",
2629
2992
  "cost",
2993
+ "created_at",
2630
2994
  "environment",
2631
2995
  "event",
2632
2996
  "git",
2633
2997
  "handler",
2634
2998
  "id",
2635
- "lifecycle",
2636
2999
  "metadata",
2637
3000
  "output",
2638
3001
  "parent",
@@ -2640,7 +3003,9 @@
2640
3003
  "skills",
2641
3004
  "source",
2642
3005
  "summary",
2643
- "tokens"
3006
+ "tokens",
3007
+ "turn",
3008
+ "updated_at"
2644
3009
  ],
2645
3010
  "title": "Session",
2646
3011
  "type": "object"
@@ -2662,7 +3027,7 @@
2662
3027
  }
2663
3028
  ],
2664
3029
  "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.",
3030
+ "description": "Identifier of the saved agent this session's snapshot was taken from. Null for a routing-file 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
3031
  "title": "Id"
2667
3032
  }
2668
3033
  },
@@ -2824,6 +3189,12 @@
2824
3189
  "default": null,
2825
3190
  "description": "Codex input and native options. Set exactly one of claude_code or codex."
2826
3191
  },
3192
+ "conversation": {
3193
+ "$ref": "#/$defs/SessionConversationConfig",
3194
+ "default": {
3195
+ "interactive": true
3196
+ }
3197
+ },
2827
3198
  "environment": {
2828
3199
  "anyOf": [
2829
3200
  {
@@ -2852,6 +3223,15 @@
2852
3223
  },
2853
3224
  "title": "Environment"
2854
3225
  },
3226
+ "metadata": {
3227
+ "additionalProperties": {
3228
+ "type": "string"
3229
+ },
3230
+ "default": {},
3231
+ "description": "Arbitrary string key/value metadata stored on every session.",
3232
+ "title": "Metadata",
3233
+ "type": "object"
3234
+ },
2855
3235
  "output": {
2856
3236
  "anyOf": [
2857
3237
  {
@@ -2886,7 +3266,9 @@
2886
3266
  "budget",
2887
3267
  "claude_code",
2888
3268
  "codex",
3269
+ "conversation",
2889
3270
  "environment",
3271
+ "metadata",
2890
3272
  "output",
2891
3273
  "permissions",
2892
3274
  "skills"
@@ -2894,12 +3276,60 @@
2894
3276
  "title": "SessionConfig",
2895
3277
  "type": "object"
2896
3278
  },
3279
+ "SessionConversation": {
3280
+ "description": "Whether the session can take more messages, and how quickly it would\nanswer one.",
3281
+ "properties": {
3282
+ "interactive": {
3283
+ "description": "Whether the session stays open after its first turn.",
3284
+ "title": "Interactive",
3285
+ "type": "boolean"
3286
+ },
3287
+ "prompting": {
3288
+ "$ref": "#/$defs/SessionPrompting",
3289
+ "description": "The session's policy for direct messages. Caller authorization and message validation are checked separately."
3290
+ },
3291
+ "state": {
3292
+ "$ref": "#/$defs/SessionState",
3293
+ "description": "`open` while the session can take messages; `closed` is permanent."
3294
+ },
3295
+ "warm": {
3296
+ "description": "Whether an agent is ready to answer the next message right away. When false, the next message first prepares an environment, which takes longer. A hint only; clients need no logic on it.",
3297
+ "title": "Warm",
3298
+ "type": "boolean"
3299
+ }
3300
+ },
3301
+ "required": [
3302
+ "interactive",
3303
+ "prompting",
3304
+ "state",
3305
+ "warm"
3306
+ ],
3307
+ "title": "SessionConversation",
3308
+ "type": "object"
3309
+ },
3310
+ "SessionConversationConfig": {
3311
+ "additionalProperties": false,
3312
+ "description": "Conversation settings for a session, set on a saved agent or sent when starting a session or running an agent.",
3313
+ "properties": {
3314
+ "interactive": {
3315
+ "default": true,
3316
+ "description": "Whether the session stays open after its first turn. Defaults to true; false runs once and requires a prompt. Requires the model's interactive capability when true. Direct message acceptance is reported separately in conversation.prompting.",
3317
+ "title": "Interactive",
3318
+ "type": "boolean"
3319
+ }
3320
+ },
3321
+ "required": [
3322
+ "interactive"
3323
+ ],
3324
+ "title": "SessionConversationConfig",
3325
+ "type": "object"
3326
+ },
2897
3327
  "SessionCost": {
2898
3328
  "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
3329
  "properties": {
2900
3330
  "cpu": {
2901
3331
  "default": 0,
2902
- "description": "Sandbox CPU spend in millicents.",
3332
+ "description": "CPU spend in millicents.",
2903
3333
  "title": "Cpu",
2904
3334
  "type": "integer"
2905
3335
  },
@@ -2917,7 +3347,7 @@
2917
3347
  },
2918
3348
  "memory": {
2919
3349
  "default": 0,
2920
- "description": "Sandbox memory spend in millicents.",
3350
+ "description": "Memory spend in millicents.",
2921
3351
  "title": "Memory",
2922
3352
  "type": "integer"
2923
3353
  },
@@ -2970,7 +3400,7 @@
2970
3400
  }
2971
3401
  ],
2972
3402
  "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.",
3403
+ "description": "Identifier of the saved environment the session's config resolved. Null for an inline environment block or the built-in basic environment.",
2974
3404
  "title": "Id"
2975
3405
  },
2976
3406
  "mcp_servers": {
@@ -3075,55 +3505,6 @@
3075
3505
  "title": "SessionEventActor",
3076
3506
  "type": "object"
3077
3507
  },
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
3508
  "SessionGit": {
3128
3509
  "description": "Every repo the session touched. Small enough to ride on `sessions`\nand be returned by every session read.",
3129
3510
  "properties": {
@@ -3143,7 +3524,7 @@
3143
3524
  "type": "object"
3144
3525
  },
3145
3526
  "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.",
3527
+ "description": "One commit the session created in this repo (everything past the\nprovisioning checkout's sha), captured from the environment 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
3528
  "properties": {
3148
3529
  "committed_at": {
3149
3530
  "format": "date-time",
@@ -3247,7 +3628,7 @@
3247
3628
  "type": "object"
3248
3629
  },
3249
3630
  "SessionGitRepo": {
3250
- "description": "One checkout in the session's sandbox and everything the session did to\nit, split by whether it survived the sandbox.",
3631
+ "description": "One checkout in the session's environment and everything the session did\nto it, split by whether it survived the environment.",
3251
3632
  "properties": {
3252
3633
  "commits": {
3253
3634
  "default": [],
@@ -3367,109 +3748,6 @@
3367
3748
  "title": "SessionHandler",
3368
3749
  "type": "object"
3369
3750
  },
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
3751
  "SessionListStreamMessage": {
3474
3752
  "properties": {
3475
3753
  "session": {
@@ -3489,6 +3767,37 @@
3489
3767
  "title": "SessionListStreamMessage",
3490
3768
  "type": "object"
3491
3769
  },
3770
+ "SessionOutput": {
3771
+ "description": "Structured output on the wire: the contract and, when a turn has\nsubmitted one, the payload. `result` is None while the session runs and\nwhen no turn submitted anything; it is the agent's own JSON, in the\nshape of `json_schema`.",
3772
+ "properties": {
3773
+ "json_schema": {
3774
+ "additionalProperties": true,
3775
+ "description": "JSON Schema the agent's result must satisfy.",
3776
+ "title": "Json Schema",
3777
+ "type": "object"
3778
+ },
3779
+ "result": {
3780
+ "anyOf": [
3781
+ {
3782
+ "additionalProperties": true,
3783
+ "type": "object"
3784
+ },
3785
+ {
3786
+ "type": "null"
3787
+ }
3788
+ ],
3789
+ "default": null,
3790
+ "description": "The payload the agent submitted, or null until a turn submits one.",
3791
+ "title": "Result"
3792
+ }
3793
+ },
3794
+ "required": [
3795
+ "json_schema",
3796
+ "result"
3797
+ ],
3798
+ "title": "SessionOutput",
3799
+ "type": "object"
3800
+ },
3492
3801
  "SessionParent": {
3493
3802
  "description": "The predecessor session this session continues.",
3494
3803
  "properties": {
@@ -3565,9 +3874,10 @@
3565
3874
  "type": "object"
3566
3875
  },
3567
3876
  "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.",
3877
+ "description": "Where a session came from: the credential that started it (web app,\nAPI key, CLI) or the trigger that fired (react, mention, cron, code\nreview). Never taken from a request body.",
3569
3878
  "enum": [
3570
3879
  "react",
3880
+ "code_review",
3571
3881
  "web",
3572
3882
  "api",
3573
3883
  "cli",
@@ -3577,6 +3887,15 @@
3577
3887
  "title": "SessionSource",
3578
3888
  "type": "string"
3579
3889
  },
3890
+ "SessionState": {
3891
+ "description": "Whether the conversation can still take messages. `closed` is permanent:\na session with interactive false closes when its turn ends, and a conversation closes\nafter its closing message's turn.",
3892
+ "enum": [
3893
+ "open",
3894
+ "closed"
3895
+ ],
3896
+ "title": "SessionState",
3897
+ "type": "string"
3898
+ },
3580
3899
  "SessionStopped": {
3581
3900
  "description": "When a stop was requested and the GitHub user who requested it.",
3582
3901
  "properties": {
@@ -3607,7 +3926,7 @@
3607
3926
  "type": "object"
3608
3927
  },
3609
3928
  "SessionSummary": {
3610
- "description": "A live one-line summary of what the session is working on, refreshed\nevery few steps while it runs.",
3929
+ "description": "A live one-line summary of what the session is doing, refreshed\nevery few steps while it runs.",
3611
3930
  "properties": {
3612
3931
  "created_at": {
3613
3932
  "anyOf": [
@@ -3624,7 +3943,7 @@
3624
3943
  "title": "Created At"
3625
3944
  },
3626
3945
  "description": {
3627
- "description": "One-line description of what the session is working on.",
3946
+ "description": "One-line description of what the session is doing.",
3628
3947
  "title": "Description",
3629
3948
  "type": "string"
3630
3949
  }
@@ -3636,58 +3955,6 @@
3636
3955
  "title": "SessionSummary",
3637
3956
  "type": "object"
3638
3957
  },
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
3958
  "SessionTokens": {
3692
3959
  "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
3960
  "properties": {
@@ -3739,9 +4006,122 @@
3739
4006
  "title": "SessionTokens",
3740
4007
  "type": "object"
3741
4008
  },
4009
+ "SessionTurn": {
4010
+ "description": "One message and the agent's answer to it. A turn is `pending` from the\nmoment its message is received until the agent starts on it, `running`\nwhile the agent works, then `completed`, `failed`, `stopped`, or\n`cancelled`.",
4011
+ "properties": {
4012
+ "cost": {
4013
+ "$ref": "#/$defs/SessionCost",
4014
+ "description": "What the turn cost so far, in millicents, broken down by leg."
4015
+ },
4016
+ "created_at": {
4017
+ "description": "When the turn's message was received.",
4018
+ "format": "date-time",
4019
+ "title": "Created At",
4020
+ "type": "string"
4021
+ },
4022
+ "detail": {
4023
+ "anyOf": [
4024
+ {
4025
+ "type": "string"
4026
+ },
4027
+ {
4028
+ "type": "null"
4029
+ }
4030
+ ],
4031
+ "default": null,
4032
+ "description": "A human-readable explanation of a failed, stopped, or cancelled turn.",
4033
+ "title": "Detail"
4034
+ },
4035
+ "ended_at": {
4036
+ "anyOf": [
4037
+ {
4038
+ "format": "date-time",
4039
+ "type": "string"
4040
+ },
4041
+ {
4042
+ "type": "null"
4043
+ }
4044
+ ],
4045
+ "default": null,
4046
+ "description": "When the turn reached its final status.",
4047
+ "title": "Ended At"
4048
+ },
4049
+ "id": {
4050
+ "description": "Unique identifier of the turn.",
4051
+ "title": "Id",
4052
+ "type": "string"
4053
+ },
4054
+ "index": {
4055
+ "description": "Position in the session, starting at 0.",
4056
+ "title": "Index",
4057
+ "type": "integer"
4058
+ },
4059
+ "reason": {
4060
+ "anyOf": [
4061
+ {
4062
+ "$ref": "#/$defs/TurnReason"
4063
+ },
4064
+ {
4065
+ "type": "null"
4066
+ }
4067
+ ],
4068
+ "default": null,
4069
+ "description": "Why the turn failed or was cancelled; null on every other status."
4070
+ },
4071
+ "started_at": {
4072
+ "anyOf": [
4073
+ {
4074
+ "format": "date-time",
4075
+ "type": "string"
4076
+ },
4077
+ {
4078
+ "type": "null"
4079
+ }
4080
+ ],
4081
+ "default": null,
4082
+ "description": "When the agent started on the message.",
4083
+ "title": "Started At"
4084
+ },
4085
+ "status": {
4086
+ "$ref": "#/$defs/TurnStatus",
4087
+ "description": "Where the turn is."
4088
+ },
4089
+ "stopped": {
4090
+ "anyOf": [
4091
+ {
4092
+ "$ref": "#/$defs/SessionStopped"
4093
+ },
4094
+ {
4095
+ "type": "null"
4096
+ }
4097
+ ],
4098
+ "default": null,
4099
+ "description": "When and by whom a stop was requested; null when none was."
4100
+ },
4101
+ "tokens": {
4102
+ "$ref": "#/$defs/SessionTokens",
4103
+ "description": "The tokens the turn spent and the model they went to."
4104
+ }
4105
+ },
4106
+ "required": [
4107
+ "cost",
4108
+ "created_at",
4109
+ "detail",
4110
+ "ended_at",
4111
+ "id",
4112
+ "index",
4113
+ "reason",
4114
+ "started_at",
4115
+ "status",
4116
+ "stopped",
4117
+ "tokens"
4118
+ ],
4119
+ "title": "SessionTurn",
4120
+ "type": "object"
4121
+ },
3742
4122
  "SettingsRef": {
3743
4123
  "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.",
4124
+ "description": "A Claude Code settings.json read from a repository and applied to the\nsession. It adds permission rules and other Claude Code settings; rules the\nplatform sets stay in force. Supported models list `settings` in\n`/v1/account/models`.",
3745
4125
  "properties": {
3746
4126
  "path": {
3747
4127
  "title": "Path",
@@ -3920,6 +4300,42 @@
3920
4300
  "title": "SlackMessageEvent",
3921
4301
  "type": "object"
3922
4302
  },
4303
+ "TurnReason": {
4304
+ "description": "Why a turn failed or was cancelled. Null on every other outcome.",
4305
+ "enum": [
4306
+ "error",
4307
+ "tool_call_failed",
4308
+ "budget_hit",
4309
+ "payment_required",
4310
+ "blocked",
4311
+ "contact_email_required",
4312
+ "lifecycle_hook_failed",
4313
+ "missing_repo_access",
4314
+ "missing_token_permissions",
4315
+ "missing_environment_variables",
4316
+ "missing_github_integration",
4317
+ "agent_unavailable",
4318
+ "upstream_unavailable",
4319
+ "unsupported_configuration",
4320
+ "execution_disabled",
4321
+ "interrupted"
4322
+ ],
4323
+ "title": "TurnReason",
4324
+ "type": "string"
4325
+ },
4326
+ "TurnStatus": {
4327
+ "description": "Where one turn is: queued for an agent, being answered, or over.\n\n`pending` covers everything before the agent starts on the message: queued\nbehind another turn, waiting to start, or preparing the environment.\n`stopped` and `cancelled` are their own outcomes; `reason` explains a\n`failed` or `cancelled` turn.",
4328
+ "enum": [
4329
+ "pending",
4330
+ "running",
4331
+ "completed",
4332
+ "failed",
4333
+ "stopped",
4334
+ "cancelled"
4335
+ ],
4336
+ "title": "TurnStatus",
4337
+ "type": "string"
4338
+ },
3923
4339
  "VMExecutionResponse": {
3924
4340
  "properties": {
3925
4341
  "cache_tier": {