@ellipsis-dev/sdk 0.22.0 → 0.25.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.
@@ -280,6 +280,32 @@ interface paths {
280
280
  patch?: never;
281
281
  trace?: never;
282
282
  };
283
+ '/v1/automations/{automation_id}/metrics': {
284
+ parameters: {
285
+ query?: never;
286
+ header?: never;
287
+ path?: never;
288
+ cookie?: never;
289
+ };
290
+ /**
291
+ * Get Automation Metrics
292
+ * @description Return an automation's session distribution and trailing spend,
293
+ * by id or by name.
294
+ *
295
+ * `samples` carries one entry per finished session (duration, cost,
296
+ * tokens) for distributions; `spend_windows` carries what the
297
+ * automation's sessions cost over the last 1, 7, and 28 days against
298
+ * its budget for each window.
299
+ */
300
+ get: operations['get_automation_metrics'];
301
+ put?: never;
302
+ post?: never;
303
+ delete?: never;
304
+ options?: never;
305
+ head?: never;
306
+ patch?: never;
307
+ trace?: never;
308
+ };
283
309
  '/v1/automations/{automation_id}/sessions': {
284
310
  parameters: {
285
311
  query?: never;
@@ -780,7 +806,9 @@ interface paths {
780
806
  * List Reviews
781
807
  * @description List code reviews, newest first.
782
808
  *
783
- * `findings` is omitted (counters only).
809
+ * `findings` and `configuration` are omitted (counters only). Each
810
+ * filter is a set: repeat `repository`, `pull_request_number`, or
811
+ * `status` to match any of several values.
784
812
  *
785
813
  * Webhook-created reviews appear here too, so this answers "show
786
814
  * me every review on this PR".
@@ -791,9 +819,10 @@ interface paths {
791
819
  * Create Review
792
820
  * @description Run a code review on demand.
793
821
  *
794
- * Reviews an existing PR or a pushed branch (for a branch, the
795
- * platform finds or creates a draft PR for it, since a code
796
- * review is structurally about a PR).
822
+ * Reviews an open pull request. Which pipeline runs is not a
823
+ * parameter: it resolves from the repository's files exactly as
824
+ * it does for a push, so an on-demand review never disagrees with
825
+ * the automatic one.
797
826
  *
798
827
  * A review is one pipeline run over one commit range, with one
799
828
  * agent session per stage: `review.id` is the run id, and
@@ -912,7 +941,7 @@ interface paths {
912
941
  * @description Start a cloud agent session.
913
942
  *
914
943
  * The daily driver: a prompt, optionally where to run it
915
- * (`environment`) and the run's own settings, in the AgentConfig
944
+ * (`environment`) and the run's own settings, in the AutomationConfig
916
945
  * vocabulary. Anything omitted comes from the organization's
917
946
  * settings — default model, default environment, budget — so
918
947
  * `{"prompt": "..."}` alone is a complete request. `prompt` is the
@@ -955,6 +984,32 @@ interface paths {
955
984
  patch?: never;
956
985
  trace?: never;
957
986
  };
987
+ '/v1/sessions/{session_id}/diff': {
988
+ parameters: {
989
+ query?: never;
990
+ header?: never;
991
+ path?: never;
992
+ cookie?: never;
993
+ };
994
+ /**
995
+ * Get Agent Session Diff
996
+ * @description Return the session's uncommitted changes as a patch.
997
+ *
998
+ * One unified-diff section per changed file, captured from the
999
+ * sandbox's working tree when the session ended. The per-file
1000
+ * counts ride on the session itself (`git.repos[].files`); this
1001
+ * is the text behind them. Empty when the tree was clean. A
1002
+ * sandbox token may read only its own session's diff.
1003
+ */
1004
+ get: operations['get_agent_session_diff'];
1005
+ put?: never;
1006
+ post?: never;
1007
+ delete?: never;
1008
+ options?: never;
1009
+ head?: never;
1010
+ patch?: never;
1011
+ trace?: never;
1012
+ };
958
1013
  '/v1/sessions/{session_id}/export': {
959
1014
  parameters: {
960
1015
  query?: never;
@@ -1141,670 +1196,75 @@ interface paths {
1141
1196
  delete?: never;
1142
1197
  options?: never;
1143
1198
  head?: never;
1144
- patch?: never;
1145
- trace?: never;
1146
- };
1147
- '/v1/templates': {
1148
- parameters: {
1149
- query?: never;
1150
- header?: never;
1151
- path?: never;
1152
- cookie?: never;
1153
- };
1154
- /**
1155
- * List Agent Templates
1156
- * @description List the built-in starter agent templates.
1157
- *
1158
- * Behind auth but not account-scoped — the data is static
1159
- * product content shared by the dashboard, landing site, and CLI.
1160
- */
1161
- get: operations['list_agent_templates'];
1162
- put?: never;
1163
- post?: never;
1164
- delete?: never;
1165
- options?: never;
1166
- head?: never;
1167
- patch?: never;
1168
- trace?: never;
1169
- };
1170
- '/v1/templates/{template_id}': {
1171
- parameters: {
1172
- query?: never;
1173
- header?: never;
1174
- path?: never;
1175
- cookie?: never;
1176
- };
1177
- /**
1178
- * Get Agent Template
1179
- * @description Return one built-in agent template by slug.
1180
- */
1181
- get: operations['get_agent_template'];
1182
- put?: never;
1183
- post?: never;
1184
- delete?: never;
1185
- options?: never;
1186
- head?: never;
1187
- patch?: never;
1188
- trace?: never;
1189
- };
1190
- '/v1/usage': {
1191
- parameters: {
1192
- query?: never;
1193
- header?: never;
1194
- path?: never;
1195
- cookie?: never;
1196
- };
1197
- /**
1198
- * Get Usage
1199
- * @description Return the caller's usage dashboard data.
1200
- */
1201
- get: operations['get_usage_endpoint'];
1202
- put?: never;
1203
- post?: never;
1204
- delete?: never;
1205
- options?: never;
1206
- head?: never;
1207
- patch?: never;
1208
- trace?: never;
1209
- };
1210
- }
1211
- interface components {
1212
- schemas: {
1213
- /** AgentConfig */
1214
- AgentConfig: {
1215
- /** @default {} */
1216
- budget: components['schemas']['AgentConfigBudget'];
1217
- /**
1218
- * @default {
1219
- * "system": ""
1220
- * }
1221
- */
1222
- claude: components['schemas']['AgentConfigClaude'];
1223
- codex?: components['schemas']['AgentConfigCodex'] | null;
1224
- /**
1225
- * @default {
1226
- * "enabled": true,
1227
- * "metadata": {
1228
- * "annotations": {},
1229
- * "labels": []
1230
- * },
1231
- * "version": "v1"
1232
- * }
1233
- */
1234
- ellipsis: components['schemas']['AgentConfigEllipsis'];
1235
- /**
1236
- * Environment
1237
- * @default {
1238
- * "compute": {},
1239
- * "hooks": {},
1240
- * "image": {},
1241
- * "mcp_servers": [],
1242
- * "repositories": [],
1243
- * "variables": []
1244
- * }
1245
- */
1246
- environment: string | components['schemas']['AgentConfigEnvironment'];
1247
- input?: components['schemas']['AgentConfigInput'] | null;
1248
- output?: components['schemas']['AgentConfigOutput'] | null;
1249
- /**
1250
- * @default {
1251
- * "ellipsis": true,
1252
- * "github": {}
1253
- * }
1254
- */
1255
- permissions: components['schemas']['AgentConfigPermissions'];
1256
- /**
1257
- * Skills
1258
- * @default []
1259
- */
1260
- skills: components['schemas']['AgentConfigSkill'][];
1261
- /** Trigger */
1262
- trigger?: (components['schemas']['AgentConfigCronTrigger'] | components['schemas']['AgentConfigReactTrigger'] | components['schemas']['AgentConfigMentionTrigger']) | null;
1263
- };
1264
- /** AgentConfigBudget */
1265
- AgentConfigBudget: {
1266
- /** Day */
1267
- day?: number | null;
1268
- /** Month */
1269
- month?: number | null;
1270
- /** Session */
1271
- session?: number | null;
1272
- /** Week */
1273
- week?: number | null;
1274
- };
1275
- /** AgentConfigClaude */
1276
- AgentConfigClaude: {
1277
- effort?: components['schemas']['EffortLevel'] | null;
1278
- /** Fallback Model */
1279
- fallback_model?: string | null;
1280
- /** Max Turns */
1281
- max_turns?: number | null;
1282
- /** Model */
1283
- model?: string | null;
1284
- settings?: components['schemas']['AgentConfigSettingsRef'] | null;
1285
- /**
1286
- * System
1287
- * @default
1288
- */
1289
- system: string | components['schemas']['AgentConfigSystemFileRef'] | (string | components['schemas']['AgentConfigSystemFileRef'])[];
1290
- };
1291
- /**
1292
- * AgentConfigCodex
1293
- * @description The `codex:` block — run this agent on OpenAI's Codex CLI instead of
1294
- * Claude Code. Declaring the block at all is what selects the harness
1295
- * (`AgentConfig.harness`).
1296
- *
1297
- * Deliberately a small subset of `AgentConfigClaude`: the fields omitted here
1298
- * are ones Codex has no equivalent for (`effort`, `fallback_model`,
1299
- * `settings`) or that the platform does not yet wire through for this harness
1300
- * (`max_turns`, `skills`, MCP servers). They are omitted rather than
1301
- * accepted-and-ignored, because `StrictConfigModel` forbids extra keys — so a
1302
- * config that sets one fails loudly at parse time instead of silently not doing
1303
- * it. The budget still bounds a run regardless.
1304
- */
1305
- AgentConfigCodex: {
1306
- /**
1307
- * Model
1308
- * @default gpt-5.6-terra
1309
- */
1310
- model: string;
1311
- /**
1312
- * System
1313
- * @default
1314
- */
1315
- system: string | components['schemas']['AgentConfigSystemFileRef'] | (string | components['schemas']['AgentConfigSystemFileRef'])[];
1316
- };
1317
- /**
1318
- * AgentConfigCompute
1319
- * @description Sandbox compute sizing. Every field is optional; None inherits the
1320
- * platform default (1 vCPU / 4096 MiB / 3600s — see DEFAULT_MODAL_* in
1321
- * models/ellipsis/sandboxes/sandbox.py). A resolved value outside the platform
1322
- * bounds fails validation loudly (a sync error on the config) rather than
1323
- * being clamped silently.
1324
- *
1325
- * `memory` and `timeout` each accept a shorthand string ("8GB", "30m") or an
1326
- * explicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /
1327
- * `timeout_seconds` properties resolve either form to the canonical integer
1328
- * the sandbox driver consumes.
1329
- *
1330
- * `timeout` is the max wall-clock the agent may run before the sandbox is
1331
- * killed, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS — equal to the default, so
1332
- * today the knob only shortens a session; the cap matches the 1-hour validity
1333
- * of the sandbox's GitHub token). The worker's lease/visibility heartbeat
1334
- * ceiling is derived from that cap, so a run at the max stays owned by its
1335
- * worker for its whole life.
1336
- *
1337
- * Compute is billed on the requested allocation over the sandbox's
1338
- * wall-clock lifetime, so a bigger/longer box costs proportionally more.
1339
- */
1340
- AgentConfigCompute: {
1341
- /** Cpu */
1342
- cpu?: number | null;
1343
- /** Memory */
1344
- memory?: string | components['schemas']['AgentConfigMemorySize'] | null;
1345
- /** Timeout */
1346
- timeout?: string | components['schemas']['AgentConfigDuration'] | null;
1347
- };
1348
- /** AgentConfigCronTrigger */
1349
- AgentConfigCronTrigger: {
1350
- /** Schedule */
1351
- schedule: string;
1352
- /**
1353
- * @description discriminator enum property added by openapi-typescript
1354
- * @enum {string}
1355
- */
1356
- type: 'cron';
1357
- };
1358
- /**
1359
- * AgentConfigDuration
1360
- * @description A duration as explicit units, summed. Set any of `hours`/`minutes`/
1361
- * `seconds` (at least one). The alternative to the `30m`-style shorthand
1362
- * string wherever a duration is accepted.
1363
- */
1364
- AgentConfigDuration: {
1365
- /** Hours */
1366
- hours?: number | null;
1367
- /** Minutes */
1368
- minutes?: number | null;
1369
- /** Seconds */
1370
- seconds?: number | null;
1371
- };
1372
- /**
1373
- * AgentConfigEllipsis
1374
- * @description The Ellipsis product namespace for a config file: which schema this is
1375
- * (`version`), the human-facing identity (`name`/`description`), freeform
1376
- * organizational `metadata`, and whether the agent is `enabled`. The
1377
- * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
1378
- * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
1379
- * config directory) — see `yaml_is_ellipsis_config`.
1380
- *
1381
- * `enabled` is agent behavior, not freeform metadata, so it stays inside
1382
- * the config `sha` (only `metadata` is sha-excluded). Whether a session
1383
- * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
1384
- * not a config one.
1385
- */
1386
- AgentConfigEllipsis: {
1387
- /** Description */
1388
- description?: string | null;
1389
- /**
1390
- * Enabled
1391
- * @default true
1392
- */
1393
- enabled: boolean;
1394
- /**
1395
- * @default {
1396
- * "annotations": {},
1397
- * "labels": []
1398
- * }
1399
- */
1400
- metadata: components['schemas']['AgentConfigMetadata'];
1401
- /** Name */
1402
- name?: string | null;
1403
- /**
1404
- * Version
1405
- * @default v1
1406
- */
1407
- version: string;
1408
- };
1409
- /**
1410
- * AgentConfigEllipsisPermissions
1411
- * @description `permissions.ellipsis` as a map: resource → level | grant | list of
1412
- * grants. Levels are hierarchical (read < write < delete), so `write`
1413
- * includes `read`. An unlisted resource is denied. The whole block is
1414
- * intersected with the platform's sandbox ceiling at token mint — it can
1415
- * narrow what a sandbox token may do, never exceed it.
1416
- */
1417
- AgentConfigEllipsisPermissions: {
1418
- [key: string]: components['schemas']['Level'] | components['schemas']['EllipsisGrant'] | (components['schemas']['Level'] | components['schemas']['EllipsisGrant'])[];
1419
- };
1420
- /**
1421
- * AgentConfigEnvironment
1422
- * @description Everything about the environment (the sandbox) the agent runs in: which
1423
- * `repositories` are cloned into it, which environment `variables` it gets,
1424
- * its `compute` sizing, how its `image` is customized, and lifecycle `hooks`.
1425
- * What the agent may *do* from that environment is the top-level
1426
- * `permissions:` block, not this one.
1427
- *
1428
- * Each `variables` entry names a variable to inject; with an inline `value` it
1429
- * is hardcoded, without one it is resolved from the account's sandbox-secrets
1430
- * store. Only the named variables reach this agent; the rest of the account's
1431
- * stored variables never do. This is how a config brings in the config and
1432
- * credentials a custom CLI needs.
1433
- */
1434
- AgentConfigEnvironment: {
1435
- /** @default {} */
1436
- compute: components['schemas']['AgentConfigCompute'];
1437
- /** @default {} */
1438
- hooks: components['schemas']['AgentConfigEnvironmentHooks'];
1439
- /** @default {} */
1440
- image: components['schemas']['AgentConfigEnvironmentImage'];
1441
- /**
1442
- * Mcp Servers
1443
- * @default []
1444
- */
1445
- mcp_servers: (string | components['schemas']['AgentConfigMcpServer'] | components['schemas']['AgentConfigMcpStdioServer'] | components['schemas']['AgentConfigMcpRemoteServer'])[];
1446
- /**
1447
- * Repositories
1448
- * @default []
1449
- */
1450
- repositories: components['schemas']['AgentConfigRepository'][];
1451
- /**
1452
- * Variables
1453
- * @default []
1454
- */
1455
- variables: components['schemas']['AgentConfigEnvironmentVariable'][];
1456
- };
1457
- /**
1458
- * AgentConfigEnvironmentHooks
1459
- * @description Shell scripts run at points in the sandbox lifecycle, each as the sandbox
1460
- * user with the sandbox's environment variables available. A non-zero exit
1461
- * fails the run (exit_status = LIFECYCLE_HOOK_FAILED) and is not retried.
1462
- *
1463
- * `post_start` runs after the container starts, before any repo is cloned —
1464
- * repo-independent setup (authenticate a CLI, e.g. `doppler setup`). On Modal
1465
- * the repo is baked into the image so it is incidentally present, but
1466
- * `post_start` must not depend on repo contents (that's `post_clone`).
1467
- *
1468
- * `post_clone` runs after all repos are cloned/checked out, before the agent —
1469
- * repo-dependent setup (`pip install -r requirements.txt`, codegen).
1470
- *
1471
- * Hooks run on every run and their output is never cached. A dependency
1472
- * install whose result should be reused across runs belongs in `image.setup`
1473
- * (baked into the cached image) instead; keep hooks for per-run work — e.g.
1474
- * anything that touches run-scoped credentials.
1475
- */
1476
- AgentConfigEnvironmentHooks: {
1477
- /** Post Clone */
1478
- post_clone?: string | null;
1479
- /** Post Start */
1480
- post_start?: string | null;
1481
- };
1482
- /**
1483
- * AgentConfigEnvironmentImage
1484
- * @description How to customize the container image the agent runs in. You
1485
- * contribute appended layers (`dockerfile_append`) and a build-time script
1486
- * (`setup`) only — Ellipsis owns FROM / base tooling / entrypoint / user.
1487
- * Today only inline bodies are supported; a file reference (resolved at the
1488
- * run's SHA) will come later.
1489
- *
1490
- * The split: `dockerfile_append` runs when the image is assembled, before any
1491
- * repo exists — toolchain installs (a package manager binary, apt packages).
1492
- * `setup` runs at image-build time *after* the configured repositories are
1493
- * checked out, and its output is captured by the filesystem snapshot that
1494
- * becomes the cached image — dependency installs (`poetry install`,
1495
- * `npm install`), so later runs start with deps already on disk. Neither runs
1496
- * per run; that's `hooks.post_start` / `hooks.post_clone`.
1497
- */
1498
- AgentConfigEnvironmentImage: {
1499
- /** Dockerfile Append */
1500
- dockerfile_append?: string | null;
1501
- /** Setup */
1502
- setup?: string | null;
1503
- };
1504
- /**
1505
- * AgentConfigEnvironmentVariable
1506
- * @description One environment variable injected into the agent's sandbox.
1507
- *
1508
- * `value`, when set, is a literal injected as-is — use it for non-secret
1509
- * config (LOG_LEVEL, an API base URL). When `value` is omitted the value is
1510
- * resolved at run time from the account's sandbox-secrets store (dashboard
1511
- * / `PUT /v1/secrets`) by `name`, so a secret can be injected without
1512
- * ever putting it in the config file. Either way the variable only reaches
1513
- * agents that name it.
1514
- */
1515
- AgentConfigEnvironmentVariable: {
1516
- /** Name */
1517
- name: string;
1518
- /** Value */
1519
- value?: string | null;
1520
- };
1521
- /**
1522
- * AgentConfigGithubPermissions
1523
- * @description The agent's GitHub access: the scope of the installation token minted for
1524
- * its sandbox — the credential `git`, `gh`, and the GitHub MCP server
1525
- * authenticate with.
1526
- *
1527
- * By default the token carries the installation's full permissions on all of
1528
- * the installation's repositories. `permissions` narrows what it may do:
1529
- * the string `read_only` grants read access to contents, issues, metadata and
1530
- * pull requests; a map requests explicit levels per GitHub App permission
1531
- * scope (e.g. `{contents: read, pull_requests: write}`) and may never exceed
1532
- * what the installation granted. `repositories` scopes the token to exactly
1533
- * the listed repos, by name (they must belong to the installation).
1534
- *
1535
- * Restriction is enforced by GitHub, not by Ellipsis: the token itself is
1536
- * minted with the reduced scope, so nothing running in the sandbox can
1537
- * exceed it.
1538
- */
1539
- AgentConfigGithubPermissions: {
1540
- /** Permissions */
1541
- permissions?: 'read_only' | {
1542
- [key: string]: string;
1543
- } | null;
1544
- /** Repositories */
1545
- repositories?: string[] | null;
1546
- };
1547
- /**
1548
- * AgentConfigInput
1549
- * @description The typed input contract: what goes INTO a session (the trigger is
1550
- * when it happens; this is what goes in).
1551
- *
1552
- * `json_schema` types the payload a caller-started session takes
1553
- * (`POST /v1/sessions` `input`, validated at the door; required when
1554
- * declared). It is illegal on a react-triggered agent — react payloads are
1555
- * platform-shaped (the published surface field sets), not caller-shaped.
1556
- *
1557
- * `message` is the initial-message template: exact `{{path}}` substitution
1558
- * over the caller payload (or, on a react agent, over the surface's
1559
- * published fields), no conditionals/loops/filters. Refs are validated at
1560
- * deploy time against the governing field set (see AgentConfig's
1561
- * `_check_input`).
1562
- */
1563
- AgentConfigInput: {
1564
- /** Json Schema */
1565
- json_schema?: {
1566
- [key: string]: unknown;
1567
- } | null;
1568
- /** Message */
1569
- message?: string | null;
1570
- };
1571
- /**
1572
- * AgentConfigMcpRemoteServer
1573
- * @description A bring-your-own remote MCP server: the harness talks HTTP to `url`.
1574
- * Nothing runs in the sandbox image. `headers` carry static auth (e.g.
1575
- * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
1576
- * references, resolved at run time from the account's secrets store.
1577
- */
1578
- AgentConfigMcpRemoteServer: {
1579
- /**
1580
- * Headers
1581
- * @default {}
1582
- */
1583
- headers: {
1584
- [key: string]: string;
1585
- };
1586
- /** Name */
1587
- name: string;
1588
- /** Url */
1589
- url: string;
1590
- };
1591
- /**
1592
- * AgentConfigMcpServer
1593
- * @description One built-in MCP server this agent opts into by name (`linear`/`slack`).
1594
- * A name reference over the connected built-in set — the platform manages the
1595
- * server's transport and credentials. It only matters when the named
1596
- * integration is set to `opt_in` inclusion; an integration in the default
1597
- * `all_sessions` mode is added regardless. For a server the platform does not
1598
- * provide, define it instead (`AgentConfigMcpStdioServer` /
1599
- * `AgentConfigMcpRemoteServer`).
1600
- */
1601
- AgentConfigMcpServer: {
1602
- /** Name */
1603
- name: string;
1604
- };
1605
- /**
1606
- * AgentConfigMcpStdioServer
1607
- * @description A bring-your-own stdio MCP server: the harness spawns `command` inside
1608
- * the sandbox and speaks JSON-RPC over its stdin/stdout. The command must be
1609
- * runnable in the sandbox image — install its runtime via `image.setup` /
1610
- * `image.dockerfile_append` if the base image lacks it.
1611
- *
1612
- * `env` values may embed `${NAME}` references, resolved at run time from the
1613
- * account's secrets store (see `mcp_secret_refs`); everything else is passed
1614
- * literally.
1615
- */
1616
- AgentConfigMcpStdioServer: {
1617
- /**
1618
- * Args
1619
- * @default []
1620
- */
1621
- args: string[];
1622
- /** Command */
1623
- command: string;
1624
- /**
1625
- * Env
1626
- * @default {}
1627
- */
1628
- env: {
1629
- [key: string]: string;
1630
- };
1631
- /** Name */
1632
- name: string;
1633
- };
1634
- /**
1635
- * AgentConfigMemorySize
1636
- * @description A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
1637
- * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
1638
- * shorthand string.
1639
- */
1640
- AgentConfigMemorySize: {
1641
- /** Gb */
1642
- gb?: number | null;
1643
- /** Mb */
1644
- mb?: number | null;
1645
- };
1646
- /**
1647
- * AgentConfigMentionPlatform
1648
- * @description The surface an @ellipsis mention can come from.
1649
- *
1650
- * No SLACK member: Slack routing is not a trigger on an agent config, it is the
1651
- * `slack.yaml` routing file (`SlackConfig`), which answers the questions a
1652
- * platform list cannot — which channel, and whose DM. A mention trigger listing
1653
- * `slack` is therefore a config error, not a silently-never-fires config.
1654
- * @enum {string}
1655
- */
1656
- AgentConfigMentionPlatform: 'github' | 'linear';
1657
- /** AgentConfigMentionTrigger */
1658
- AgentConfigMentionTrigger: {
1659
- /**
1660
- * Platforms
1661
- * @default []
1662
- */
1663
- platforms: components['schemas']['AgentConfigMentionPlatform'][];
1664
- /**
1665
- * @description discriminator enum property added by openapi-typescript
1666
- * @enum {string}
1667
- */
1668
- type: 'mention';
1669
- };
1670
- /** AgentConfigMetadata */
1671
- AgentConfigMetadata: {
1672
- /**
1673
- * Annotations
1674
- * @default {}
1675
- */
1676
- annotations: {
1677
- [key: string]: string;
1678
- };
1679
- /**
1680
- * Labels
1681
- * @default []
1682
- */
1683
- labels: string[];
1684
- };
1685
- /**
1686
- * AgentConfigOutput
1687
- * @description The typed output contract: the JSON Schema the agent must exit through
1688
- * (the StructuredOutput exit tool). Read back via
1689
- * GET /v1/sessions/{id}/output.
1690
- */
1691
- AgentConfigOutput: {
1692
- /** Json Schema */
1693
- json_schema: {
1694
- [key: string]: unknown;
1695
- };
1696
- };
1697
- /**
1698
- * AgentConfigPermissions
1699
- * @description What the agent is allowed to touch, per credential the platform mints
1700
- * into its sandbox. Distinct from `environment:`, which is where the agent
1701
- * runs; this is what it may do from there.
1702
- *
1703
- * `ellipsis` scopes the sandbox's Ellipsis API token
1704
- * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
1705
- * with). `true` / the string `all` (the default) grant the full sandbox
1706
- * ceiling — everything a sandbox token can ever do. A map narrows it per
1707
- * resource (see `AgentConfigEllipsisPermissions`); the minted token carries
1708
- * the intersection, so a config can only ever reduce access. `false` fails
1709
- * validation — an agent with no API token cannot report its own progress.
1710
- *
1711
- * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
1712
- * see `AgentConfigGithubPermissions`. GitHub enforces it at mint time.
1713
- */
1714
- AgentConfigPermissions: {
1715
- /**
1716
- * Ellipsis
1717
- * @default true
1718
- */
1719
- ellipsis: (true | 'all') | components['schemas']['AgentConfigEllipsisPermissions'];
1720
- /** @default {} */
1721
- github: components['schemas']['AgentConfigGithubPermissions'];
1722
- };
1723
- /** AgentConfigReactTrigger */
1724
- AgentConfigReactTrigger: {
1725
- issue?: components['schemas']['ReactIssue'] | null;
1726
- linear_issue?: components['schemas']['ReactLinearIssue'] | null;
1727
- pull_request?: components['schemas']['ReactPullRequest'] | null;
1728
- push?: components['schemas']['ReactPush'] | null;
1729
- sentry?: components['schemas']['ReactSentry'] | null;
1730
- slack_channel?: components['schemas']['ReactSlackChannel'] | null;
1731
- /**
1732
- * @description discriminator enum property added by openapi-typescript
1733
- * @enum {string}
1734
- */
1735
- type: 'react';
1736
- };
1737
- /** AgentConfigRepository */
1738
- AgentConfigRepository: {
1739
- /** Name */
1740
- name: string;
1741
- /** Owner */
1742
- owner?: string | null;
1743
- /** Ref */
1744
- ref?: string | null;
1745
- };
1746
- /**
1747
- * AgentConfigSettingsRef
1748
- * @description A config-declared Claude Code settings.json, resolved at run start and
1749
- * passed to `claude --settings <path>`. That is the CLI settings tier — BELOW
1750
- * Ellipsis's managed-settings.json floor — so it customizes behavior (model
1751
- * permissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a
1752
- * security setting. Lets a team point the cloud agent at the same settings file
1753
- * they already use with Claude Code locally instead of re-encoding it as YAML.
1754
- */
1755
- AgentConfigSettingsRef: {
1756
- /** Path */
1757
- path: string;
1758
- repository?: components['schemas']['AgentConfigRepository'] | null;
1759
- };
1760
- /**
1761
- * AgentConfigSkill
1762
- * @description One config-declared Claude Code skill: a repository directory containing
1763
- * a SKILL.md, resolved at run start and installed at the sandbox's personal
1764
- * skill level (`~/.claude/skills/<basename(path)>/`). This is how a config
1765
- * brings in skills its cloned repositories don't provide — cross-repo refs
1766
- * (an org-wide skills repo), public third-party repos, and repo-less runs.
1767
- * Skills under a cloned repo's own `.claude/skills/` load by themselves and
1768
- * don't need an entry here.
1769
- */
1770
- AgentConfigSkill: {
1771
- /** Path */
1772
- path: string;
1773
- repository?: components['schemas']['AgentConfigRepository'] | null;
1199
+ patch?: never;
1200
+ trace?: never;
1201
+ };
1202
+ '/v1/templates': {
1203
+ parameters: {
1204
+ query?: never;
1205
+ header?: never;
1206
+ path?: never;
1207
+ cookie?: never;
1774
1208
  };
1775
1209
  /**
1776
- * AgentConfigSource
1777
- * @description Where a session's config came from. Total: every session has exactly one
1778
- * source, including the ones that never touch defaults resolution.
1210
+ * List Agent Templates
1211
+ * @description List the built-in starter agent templates.
1779
1212
  *
1780
- * Not derivable from the row — `agent_config_id` says WHICH saved config, not
1781
- * how it was chosen, and is null for inline, platform-default, and built-in
1782
- * configs alike — so it is persisted for audit and the published wire.
1783
- * @enum {string}
1213
+ * Behind auth but not account-scoped — the data is static
1214
+ * product content shared by the dashboard, landing site, and CLI.
1784
1215
  */
1785
- AgentConfigSource: 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
1216
+ get: operations['list_agent_templates'];
1217
+ put?: never;
1218
+ post?: never;
1219
+ delete?: never;
1220
+ options?: never;
1221
+ head?: never;
1222
+ patch?: never;
1223
+ trace?: never;
1224
+ };
1225
+ '/v1/templates/{template_id}': {
1226
+ parameters: {
1227
+ query?: never;
1228
+ header?: never;
1229
+ path?: never;
1230
+ cookie?: never;
1231
+ };
1786
1232
  /**
1787
- * AgentConfigSourceGithub
1788
- * @description Identifies the file a GitHub-sourced agent config is synced from.
1789
- *
1790
- * Keyed on the repository ID (not owner/name) so repository and org renames
1791
- * don't orphan the config; resolve display names from gh_repositories at
1792
- * read time.
1233
+ * Get Agent Template
1234
+ * @description Return one built-in agent template by slug.
1793
1235
  */
1794
- AgentConfigSourceGithub: {
1795
- /** Branch */
1796
- branch: string;
1797
- /** Path */
1798
- path: string;
1799
- /** Repo Id */
1800
- repo_id: number;
1801
- };
1802
- /** AgentConfigSystemFileRef */
1803
- AgentConfigSystemFileRef: {
1804
- /** File */
1805
- file: string;
1806
- repository?: components['schemas']['AgentConfigRepository'] | null;
1236
+ get: operations['get_agent_template'];
1237
+ put?: never;
1238
+ post?: never;
1239
+ delete?: never;
1240
+ options?: never;
1241
+ head?: never;
1242
+ patch?: never;
1243
+ trace?: never;
1244
+ };
1245
+ '/v1/usage': {
1246
+ parameters: {
1247
+ query?: never;
1248
+ header?: never;
1249
+ path?: never;
1250
+ cookie?: never;
1807
1251
  };
1252
+ /**
1253
+ * Get Usage
1254
+ * @description Return the caller's usage dashboard data.
1255
+ */
1256
+ get: operations['get_usage_endpoint'];
1257
+ put?: never;
1258
+ post?: never;
1259
+ delete?: never;
1260
+ options?: never;
1261
+ head?: never;
1262
+ patch?: never;
1263
+ trace?: never;
1264
+ };
1265
+ }
1266
+ interface components {
1267
+ schemas: {
1808
1268
  /**
1809
1269
  * AgentTemplate
1810
1270
  * @description A built-in agent template: a ready-to-use agent config plus the
@@ -2204,10 +1664,8 @@ interface components {
2204
1664
  * when invoked, plus where it syncs from and the state of that sync.
2205
1665
  */
2206
1666
  Automation: {
2207
- /** @description The agent definition itself, in the same schema as a YAML file under agents/. */
2208
- agent_config: components['schemas']['AgentConfig'];
2209
- /** @description The repository, path, and branch the automation syncs from. Null only transiently, before the creating pull request's file lands on the branch. */
2210
- agent_config_source_details?: components['schemas']['AgentConfigSourceGithub'] | null;
1667
+ /** @description The automation definition itself, in the same schema as its YAML file: identity, trigger, input contract, and the session block. */
1668
+ config: components['schemas']['AutomationConfig'];
2211
1669
  /**
2212
1670
  * Created At
2213
1671
  * Format: date-time
@@ -2263,6 +1721,8 @@ interface components {
2263
1721
  * @description The definition's content identity: the version fingerprint frozen onto each session that runs it.
2264
1722
  */
2265
1723
  sha: string;
1724
+ /** @description The repository, path, and branch the automation syncs from. Null only transiently, before the creating pull request's file lands on the branch. */
1725
+ source_details?: components['schemas']['GithubSourceDetails'] | null;
2266
1726
  /**
2267
1727
  * Updated At
2268
1728
  * Format: date-time
@@ -2270,6 +1730,104 @@ interface components {
2270
1730
  */
2271
1731
  updated_at: string;
2272
1732
  };
1733
+ /**
1734
+ * AutomationConfig
1735
+ * @description A saved automation, as written in its YAML file: identity
1736
+ * (`ellipsis`), when it runs (`trigger`), what goes in (`input`), and the
1737
+ * `session:` block every session it starts is frozen from. Field order is
1738
+ * the canonical key order for files and `to_yaml` exports.
1739
+ */
1740
+ AutomationConfig: {
1741
+ /**
1742
+ * @default {
1743
+ * "enabled": true,
1744
+ * "metadata": {
1745
+ * "annotations": {},
1746
+ * "labels": []
1747
+ * },
1748
+ * "version": "v1"
1749
+ * }
1750
+ */
1751
+ ellipsis: components['schemas']['AutomationIdentity'];
1752
+ input?: components['schemas']['InputContract'] | null;
1753
+ /**
1754
+ * @default {
1755
+ * "budget": {},
1756
+ * "claude": {
1757
+ * "system": ""
1758
+ * },
1759
+ * "environment": {
1760
+ * "compute": {},
1761
+ * "hooks": {},
1762
+ * "image": {},
1763
+ * "mcp_servers": [],
1764
+ * "repositories": [],
1765
+ * "variables": []
1766
+ * },
1767
+ * "permissions": {
1768
+ * "ellipsis": true,
1769
+ * "github": {}
1770
+ * },
1771
+ * "skills": []
1772
+ * }
1773
+ */
1774
+ session: components['schemas']['SessionConfig'];
1775
+ /** Trigger */
1776
+ trigger?: (components['schemas']['CronTrigger'] | components['schemas']['ReactTrigger']) | null;
1777
+ };
1778
+ /**
1779
+ * AutomationIdentity
1780
+ * @description The Ellipsis product namespace for a config file: which schema this is
1781
+ * (`version`), the human-facing identity (`name`/`description`), freeform
1782
+ * organizational `metadata`, and whether the agent is `enabled`. The
1783
+ * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
1784
+ * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
1785
+ * config directory) — see `yaml_is_ellipsis_config`.
1786
+ *
1787
+ * `enabled` is agent behavior, not freeform metadata, so it stays inside
1788
+ * the config `sha` (only `metadata` is sha-excluded). Whether a session
1789
+ * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
1790
+ * not a config one.
1791
+ */
1792
+ AutomationIdentity: {
1793
+ /** Description */
1794
+ description?: string | null;
1795
+ /**
1796
+ * Enabled
1797
+ * @default true
1798
+ */
1799
+ enabled: boolean;
1800
+ /**
1801
+ * @default {
1802
+ * "annotations": {},
1803
+ * "labels": []
1804
+ * }
1805
+ */
1806
+ metadata: components['schemas']['ConfigMetadata'];
1807
+ /** Name */
1808
+ name?: string | null;
1809
+ /**
1810
+ * Version
1811
+ * @default v1
1812
+ */
1813
+ version: string;
1814
+ };
1815
+ /**
1816
+ * AutomationMetricsResponse
1817
+ * @description An automation's session distribution and trailing spend.
1818
+ */
1819
+ AutomationMetricsResponse: {
1820
+ /**
1821
+ * Samples
1822
+ * @description One entry per finished session, unordered.
1823
+ */
1824
+ samples: components['schemas']['AutomationSessionSample'][];
1825
+ /**
1826
+ * Spend Windows
1827
+ * @description Trailing spend versus the budget, one entry per window (1, 7, and 28 days).
1828
+ */
1829
+ spend_windows: components['schemas']['AutomationSpendWindow'][];
1830
+ };
2273
1831
  /**
2274
1832
  * AutomationResponse
2275
1833
  * @description One automation.
@@ -2278,6 +1836,54 @@ interface components {
2278
1836
  /** @description The automation. */
2279
1837
  automation: components['schemas']['Automation'];
2280
1838
  };
1839
+ /**
1840
+ * AutomationSessionSample
1841
+ * @description One finished session of the automation, reduced to the three figures
1842
+ * the distributions are drawn from.
1843
+ */
1844
+ AutomationSessionSample: {
1845
+ /**
1846
+ * Cost
1847
+ * @description What the session cost, in millicents.
1848
+ */
1849
+ cost: number;
1850
+ /**
1851
+ * Duration Seconds
1852
+ * @description Wall-clock seconds from the session's creation to its last update.
1853
+ */
1854
+ duration_seconds: number;
1855
+ /**
1856
+ * Tokens Total
1857
+ * @description Tokens the session consumed across every lane, including prompt-cache reads and writes.
1858
+ */
1859
+ tokens_total: number;
1860
+ };
1861
+ /**
1862
+ * AutomationSpendWindow
1863
+ * @description The automation's trailing spend against its budget over one window.
1864
+ */
1865
+ AutomationSpendWindow: {
1866
+ /**
1867
+ * Limit Usd
1868
+ * @description The enforced cap for the window, in US dollars: the automation's own budget clamped to the platform maximum, or the maximum itself when the budget is unset.
1869
+ */
1870
+ limit_usd: number;
1871
+ /**
1872
+ * Platform Max Usd
1873
+ * @description The platform ceiling for the window, in US dollars; a budget above it is clamped to it.
1874
+ */
1875
+ platform_max_usd: number;
1876
+ /**
1877
+ * Spent Usd
1878
+ * @description What the automation's sessions cost over the window, in US dollars.
1879
+ */
1880
+ spent_usd: number;
1881
+ /**
1882
+ * Window Days
1883
+ * @description The trailing window, in days: 1, 7, or 28.
1884
+ */
1885
+ window_days: number;
1886
+ };
2281
1887
  /**
2282
1888
  * AutomationsListResponse
2283
1889
  * @description The caller's automations.
@@ -2300,6 +1906,17 @@ interface components {
2300
1906
  */
2301
1907
  session?: number | null;
2302
1908
  };
1909
+ /** BudgetConfig */
1910
+ BudgetConfig: {
1911
+ /** Day */
1912
+ day?: number | null;
1913
+ /** Month */
1914
+ month?: number | null;
1915
+ /** Session */
1916
+ session?: number | null;
1917
+ /** Week */
1918
+ week?: number | null;
1919
+ };
2303
1920
  /**
2304
1921
  * BudgetSource
2305
1922
  * @description Which layer actually determined the enforced budget.
@@ -2364,6 +1981,22 @@ interface components {
2364
1981
  */
2365
1982
  start: string | null;
2366
1983
  };
1984
+ /** ClaudeConfig */
1985
+ ClaudeConfig: {
1986
+ effort?: components['schemas']['EffortLevel'] | null;
1987
+ /** Fallback Model */
1988
+ fallback_model?: string | null;
1989
+ /** Max Turns */
1990
+ max_turns?: number | null;
1991
+ /** Model */
1992
+ model?: string | null;
1993
+ settings?: components['schemas']['SettingsRef'] | null;
1994
+ /**
1995
+ * System
1996
+ * @default
1997
+ */
1998
+ system: string | components['schemas']['SystemFileRef'] | (string | components['schemas']['SystemFileRef'])[];
1999
+ };
2367
2000
  /**
2368
2001
  * ClaudeSessionRecord
2369
2002
  * @description A native transcript record of a Claude session (source=claude_code).
@@ -2506,6 +2139,32 @@ interface components {
2506
2139
  } & {
2507
2140
  [key: string]: unknown;
2508
2141
  };
2142
+ /**
2143
+ * CodexConfig
2144
+ * @description The `codex:` block — run this agent on OpenAI's Codex CLI instead of
2145
+ * Claude Code. Declaring the block at all is what selects the harness
2146
+ * (`AutomationConfig.harness`).
2147
+ *
2148
+ * Deliberately a small subset of `ClaudeConfig`: the fields omitted here
2149
+ * are ones Codex has no equivalent for (`effort`, `fallback_model`,
2150
+ * `settings`) or that the platform does not yet wire through for this harness
2151
+ * (`max_turns`, `skills`, MCP servers). They are omitted rather than
2152
+ * accepted-and-ignored, because `StrictConfigModel` forbids extra keys — so a
2153
+ * config that sets one fails loudly at parse time instead of silently not doing
2154
+ * it. The budget still bounds a run regardless.
2155
+ */
2156
+ CodexConfig: {
2157
+ /**
2158
+ * Model
2159
+ * @default gpt-5.6-terra
2160
+ */
2161
+ model: string;
2162
+ /**
2163
+ * System
2164
+ * @default
2165
+ */
2166
+ system: string | components['schemas']['SystemFileRef'] | (string | components['schemas']['SystemFileRef'])[];
2167
+ };
2509
2168
  /** CodexErrorEvent */
2510
2169
  CodexErrorEvent: {
2511
2170
  /** Message */
@@ -2848,18 +2507,64 @@ interface components {
2848
2507
  * @default web_search
2849
2508
  * @constant
2850
2509
  */
2851
- type: 'web_search';
2852
- } & {
2853
- [key: string]: unknown;
2510
+ type: 'web_search';
2511
+ } & {
2512
+ [key: string]: unknown;
2513
+ };
2514
+ /**
2515
+ * ComputeConfig
2516
+ * @description Sandbox compute sizing. Every field is optional; None inherits the
2517
+ * platform default (1 vCPU / 4096 MiB / 3600s — see DEFAULT_MODAL_* in
2518
+ * models/ellipsis/sandboxes/sandbox.py). A resolved value outside the platform
2519
+ * bounds fails validation loudly (a sync error on the config) rather than
2520
+ * being clamped silently.
2521
+ *
2522
+ * `memory` and `timeout` each accept a shorthand string ("8GB", "30m") or an
2523
+ * explicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /
2524
+ * `timeout_seconds` properties resolve either form to the canonical integer
2525
+ * the sandbox driver consumes.
2526
+ *
2527
+ * `timeout` is the max wall-clock the agent may run before the sandbox is
2528
+ * killed, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS — equal to the default, so
2529
+ * today the knob only shortens a session; the cap matches the 1-hour validity
2530
+ * of the sandbox's GitHub token). The worker's lease/visibility heartbeat
2531
+ * ceiling is derived from that cap, so a run at the max stays owned by its
2532
+ * worker for its whole life.
2533
+ *
2534
+ * Compute is billed on the requested allocation over the sandbox's
2535
+ * wall-clock lifetime, so a bigger/longer box costs proportionally more.
2536
+ */
2537
+ ComputeConfig: {
2538
+ /** Cpu */
2539
+ cpu?: number | null;
2540
+ /** Memory */
2541
+ memory?: string | components['schemas']['MemorySize'] | null;
2542
+ /** Timeout */
2543
+ timeout?: string | components['schemas']['Duration'] | null;
2544
+ };
2545
+ /**
2546
+ * ConfigManagedBy
2547
+ * @description Which writer owns an agent: the repository file it is defined in, or
2548
+ * this API. Every agent has exactly one owner, fixed when it is created and
2549
+ * changed only by linking or unlinking it.
2550
+ * @enum {string}
2551
+ */
2552
+ ConfigManagedBy: 'github' | 'api';
2553
+ /** ConfigMetadata */
2554
+ ConfigMetadata: {
2555
+ /**
2556
+ * Annotations
2557
+ * @default {}
2558
+ */
2559
+ annotations: {
2560
+ [key: string]: string;
2561
+ };
2562
+ /**
2563
+ * Labels
2564
+ * @default []
2565
+ */
2566
+ labels: string[];
2854
2567
  };
2855
- /**
2856
- * ConfigManagedBy
2857
- * @description Which writer owns an agent: the repository file it is defined in, or
2858
- * this API. Every agent has exactly one owner, fixed when it is created and
2859
- * changed only by linking or unlinking it.
2860
- * @enum {string}
2861
- */
2862
- ConfigManagedBy: 'github' | 'api';
2863
2568
  /**
2864
2569
  * ContributorUsage
2865
2570
  * @description An author who merged a pull request in the window. The pull-request and
@@ -2909,7 +2614,7 @@ interface components {
2909
2614
  */
2910
2615
  CreateAutomationRequest: {
2911
2616
  /** @description The automation's definition, in the same schema as a YAML file under agents/. */
2912
- automation: components['schemas']['AgentConfig'];
2617
+ automation: components['schemas']['AutomationConfig'];
2913
2618
  };
2914
2619
  /**
2915
2620
  * CreateEnvironmentRequest
@@ -2917,7 +2622,7 @@ interface components {
2917
2622
  */
2918
2623
  CreateEnvironmentRequest: {
2919
2624
  /** @description The environment's definition. */
2920
- environment: components['schemas']['EnvironmentConfig'];
2625
+ environment: components['schemas']['EnvironmentDocument'];
2921
2626
  };
2922
2627
  /**
2923
2628
  * CreateFileRequest
@@ -3013,6 +2718,30 @@ interface components {
3013
2718
  */
3014
2719
  scope: components['schemas']['ReviewScope'];
3015
2720
  };
2721
+ /** CronTrigger */
2722
+ CronTrigger: {
2723
+ /** Schedule */
2724
+ schedule: string;
2725
+ /**
2726
+ * @description discriminator enum property added by openapi-typescript
2727
+ * @enum {string}
2728
+ */
2729
+ type: 'cron';
2730
+ };
2731
+ /**
2732
+ * Duration
2733
+ * @description A duration as explicit units, summed. Set any of `hours`/`minutes`/
2734
+ * `seconds` (at least one). The alternative to the `30m`-style shorthand
2735
+ * string wherever a duration is accepted.
2736
+ */
2737
+ Duration: {
2738
+ /** Hours */
2739
+ hours?: number | null;
2740
+ /** Minutes */
2741
+ minutes?: number | null;
2742
+ /** Seconds */
2743
+ seconds?: number | null;
2744
+ };
3016
2745
  /**
3017
2746
  * DurationPercentiles
3018
2747
  * @description Percentiles of a duration distribution, in hours. p0 = fastest,
@@ -3083,6 +2812,17 @@ interface components {
3083
2812
  /** Match */
3084
2813
  match?: string[] | null;
3085
2814
  };
2815
+ /**
2816
+ * EllipsisPermissions
2817
+ * @description `permissions.ellipsis` as a map: resource → level | grant | list of
2818
+ * grants. Levels are hierarchical (read < write < delete), so `write`
2819
+ * includes `read`. An unlisted resource is denied. The whole block is
2820
+ * intersected with the platform's sandbox ceiling at token mint — it can
2821
+ * narrow what a sandbox token may do, never exceed it.
2822
+ */
2823
+ EllipsisPermissions: {
2824
+ [key: string]: components['schemas']['Level'] | components['schemas']['EllipsisGrant'] | (components['schemas']['Level'] | components['schemas']['EllipsisGrant'])[];
2825
+ };
3086
2826
  /**
3087
2827
  * Environment
3088
2828
  * @description A saved environment: the machine agents run in (repositories,
@@ -3099,7 +2839,7 @@ interface components {
3099
2839
  /** @description The GitHub account that last edited the environment, when known. */
3100
2840
  edited_by?: components['schemas']['GithubAccountSnippet'] | null;
3101
2841
  /** @description The environment definition itself, as parsed from its YAML. */
3102
- environment: components['schemas']['EnvironmentConfig'];
2842
+ environment: components['schemas']['EnvironmentDocument'];
3103
2843
  /**
3104
2844
  * Id
3105
2845
  * @description Unique identifier of the environment.
@@ -3128,7 +2868,7 @@ interface components {
3128
2868
  */
3129
2869
  sha: string;
3130
2870
  /** @description The repository, path, and branch the environment syncs from. Null for environments managed through the API. */
3131
- source_details?: components['schemas']['AgentConfigSourceGithub'] | null;
2871
+ source_details?: components['schemas']['GithubSourceDetails'] | null;
3132
2872
  /**
3133
2873
  * Updated At
3134
2874
  * Format: date-time
@@ -3138,6 +2878,43 @@ interface components {
3138
2878
  };
3139
2879
  /**
3140
2880
  * EnvironmentConfig
2881
+ * @description Everything about the environment (the sandbox) the agent runs in: which
2882
+ * `repositories` are cloned into it, which environment `variables` it gets,
2883
+ * its `compute` sizing, how its `image` is customized, and lifecycle `hooks`.
2884
+ * What the agent may *do* from that environment is the top-level
2885
+ * `permissions:` block, not this one.
2886
+ *
2887
+ * Each `variables` entry names a variable to inject; with an inline `value` it
2888
+ * is hardcoded, without one it is resolved from the account's sandbox-secrets
2889
+ * store. Only the named variables reach this agent; the rest of the account's
2890
+ * stored variables never do. This is how a config brings in the config and
2891
+ * credentials a custom CLI needs.
2892
+ */
2893
+ EnvironmentConfig: {
2894
+ /** @default {} */
2895
+ compute: components['schemas']['ComputeConfig'];
2896
+ /** @default {} */
2897
+ hooks: components['schemas']['EnvironmentHooks'];
2898
+ /** @default {} */
2899
+ image: components['schemas']['EnvironmentImage'];
2900
+ /**
2901
+ * Mcp Servers
2902
+ * @default []
2903
+ */
2904
+ mcp_servers: (string | components['schemas']['McpServerRef'] | components['schemas']['McpStdioServer'] | components['schemas']['McpRemoteServer'])[];
2905
+ /**
2906
+ * Repositories
2907
+ * @default []
2908
+ */
2909
+ repositories: components['schemas']['RepositoryRef'][];
2910
+ /**
2911
+ * Variables
2912
+ * @default []
2913
+ */
2914
+ variables: components['schemas']['EnvironmentVariable'][];
2915
+ };
2916
+ /**
2917
+ * EnvironmentDocument
3141
2918
  * @description A parsed environment document: identity plus the environment body.
3142
2919
  *
3143
2920
  * The body fields are flattened to the top level of the file (not nested
@@ -3145,38 +2922,63 @@ interface components {
3145
2922
  * would be ceremony. `to_environment()` projects the body for substitution
3146
2923
  * into an agent config.
3147
2924
  */
3148
- EnvironmentConfig: {
2925
+ EnvironmentDocument: {
3149
2926
  /** @default {} */
3150
- compute: components['schemas']['AgentConfigCompute'];
3151
- ellipsis: components['schemas']['EnvironmentConfigEllipsis'];
2927
+ compute: components['schemas']['ComputeConfig'];
2928
+ ellipsis: components['schemas']['EnvironmentIdentity'];
3152
2929
  /** @default {} */
3153
- hooks: components['schemas']['AgentConfigEnvironmentHooks'];
2930
+ hooks: components['schemas']['EnvironmentHooks'];
3154
2931
  /** @default {} */
3155
- image: components['schemas']['AgentConfigEnvironmentImage'];
2932
+ image: components['schemas']['EnvironmentImage'];
3156
2933
  /**
3157
2934
  * Mcp Servers
3158
2935
  * @default []
3159
2936
  */
3160
- mcp_servers: (string | components['schemas']['AgentConfigMcpServer'] | components['schemas']['AgentConfigMcpStdioServer'] | components['schemas']['AgentConfigMcpRemoteServer'])[];
2937
+ mcp_servers: (string | components['schemas']['McpServerRef'] | components['schemas']['McpStdioServer'] | components['schemas']['McpRemoteServer'])[];
3161
2938
  /**
3162
2939
  * Repositories
3163
2940
  * @default []
3164
2941
  */
3165
- repositories: components['schemas']['AgentConfigRepository'][];
2942
+ repositories: components['schemas']['RepositoryRef'][];
3166
2943
  /**
3167
2944
  * Variables
3168
2945
  * @default []
3169
2946
  */
3170
- variables: components['schemas']['AgentConfigEnvironmentVariable'][];
2947
+ variables: components['schemas']['EnvironmentVariable'][];
2948
+ };
2949
+ /**
2950
+ * EnvironmentHooks
2951
+ * @description Shell scripts run at points in the sandbox lifecycle, each as the sandbox
2952
+ * user with the sandbox's environment variables available. A non-zero exit
2953
+ * fails the run (exit_status = LIFECYCLE_HOOK_FAILED) and is not retried.
2954
+ *
2955
+ * `post_start` runs after the container starts, before any repo is cloned —
2956
+ * repo-independent setup (authenticate a CLI, e.g. `doppler setup`). On Modal
2957
+ * the repo is baked into the image so it is incidentally present, but
2958
+ * `post_start` must not depend on repo contents (that's `post_clone`).
2959
+ *
2960
+ * `post_clone` runs after all repos are cloned/checked out, before the agent —
2961
+ * repo-dependent setup (`pip install -r requirements.txt`, codegen).
2962
+ *
2963
+ * Hooks run on every run and their output is never cached. A dependency
2964
+ * install whose result should be reused across runs belongs in `image.setup`
2965
+ * (baked into the cached image) instead; keep hooks for per-run work — e.g.
2966
+ * anything that touches run-scoped credentials.
2967
+ */
2968
+ EnvironmentHooks: {
2969
+ /** Post Clone */
2970
+ post_clone?: string | null;
2971
+ /** Post Start */
2972
+ post_start?: string | null;
3171
2973
  };
3172
2974
  /**
3173
- * EnvironmentConfigEllipsis
2975
+ * EnvironmentIdentity
3174
2976
  * @description The Ellipsis namespace of an environment file. `kind: environment` is
3175
2977
  * what routes a synced YAML here instead of to the agent-config parser —
3176
2978
  * an agent config carries no `kind` (or `kind: agent`, tolerated nowhere:
3177
2979
  * absence is the agent marker).
3178
2980
  */
3179
- EnvironmentConfigEllipsis: {
2981
+ EnvironmentIdentity: {
3180
2982
  /** Description */
3181
2983
  description?: string | null;
3182
2984
  /**
@@ -3190,10 +2992,32 @@ interface components {
3190
2992
  * "labels": []
3191
2993
  * }
3192
2994
  */
3193
- metadata: components['schemas']['AgentConfigMetadata'];
2995
+ metadata: components['schemas']['ConfigMetadata'];
3194
2996
  /** Name */
3195
2997
  name?: string | null;
3196
2998
  };
2999
+ /**
3000
+ * EnvironmentImage
3001
+ * @description How to customize the container image the agent runs in. You
3002
+ * contribute appended layers (`dockerfile_append`) and a build-time script
3003
+ * (`setup`) only — Ellipsis owns FROM / base tooling / entrypoint / user.
3004
+ * Today only inline bodies are supported; a file reference (resolved at the
3005
+ * run's SHA) will come later.
3006
+ *
3007
+ * The split: `dockerfile_append` runs when the image is assembled, before any
3008
+ * repo exists — toolchain installs (a package manager binary, apt packages).
3009
+ * `setup` runs at image-build time *after* the configured repositories are
3010
+ * checked out, and its output is captured by the filesystem snapshot that
3011
+ * becomes the cached image — dependency installs (`poetry install`,
3012
+ * `npm install`), so later runs start with deps already on disk. Neither runs
3013
+ * per run; that's `hooks.post_start` / `hooks.post_clone`.
3014
+ */
3015
+ EnvironmentImage: {
3016
+ /** Dockerfile Append */
3017
+ dockerfile_append?: string | null;
3018
+ /** Setup */
3019
+ setup?: string | null;
3020
+ };
3197
3021
  /**
3198
3022
  * EnvironmentResponse
3199
3023
  * @description One saved environment.
@@ -3213,6 +3037,23 @@ interface components {
3213
3037
  * @enum {string}
3214
3038
  */
3215
3039
  EnvironmentSource: 'request' | 'agent_config' | 'repo_default' | 'account_default' | 'platform_default';
3040
+ /**
3041
+ * EnvironmentVariable
3042
+ * @description One environment variable injected into the agent's sandbox.
3043
+ *
3044
+ * `value`, when set, is a literal injected as-is — use it for non-secret
3045
+ * config (LOG_LEVEL, an API base URL). When `value` is omitted the value is
3046
+ * resolved at run time from the account's sandbox-secrets store (dashboard
3047
+ * / `PUT /v1/secrets`) by `name`, so a secret can be injected without
3048
+ * ever putting it in the config file. Either way the variable only reaches
3049
+ * agents that name it.
3050
+ */
3051
+ EnvironmentVariable: {
3052
+ /** Name */
3053
+ name: string;
3054
+ /** Value */
3055
+ value?: string | null;
3056
+ };
3216
3057
  /**
3217
3058
  * EnvironmentsListResponse
3218
3059
  * @description The caller's saved environments.
@@ -3663,6 +3504,32 @@ interface components {
3663
3504
  */
3664
3505
  members: components['schemas']['GithubMember'][];
3665
3506
  };
3507
+ /**
3508
+ * GithubPermissions
3509
+ * @description The agent's GitHub access: the scope of the installation token minted for
3510
+ * its sandbox — the credential `git`, `gh`, and the GitHub MCP server
3511
+ * authenticate with.
3512
+ *
3513
+ * By default the token carries the installation's full permissions on all of
3514
+ * the installation's repositories. `permissions` narrows what it may do:
3515
+ * the string `read_only` grants read access to contents, issues, metadata and
3516
+ * pull requests; a map requests explicit levels per GitHub App permission
3517
+ * scope (e.g. `{contents: read, pull_requests: write}`) and may never exceed
3518
+ * what the installation granted. `repositories` scopes the token to exactly
3519
+ * the listed repos, by name (they must belong to the installation).
3520
+ *
3521
+ * Restriction is enforced by GitHub, not by Ellipsis: the token itself is
3522
+ * minted with the reduced scope, so nothing running in the sandbox can
3523
+ * exceed it.
3524
+ */
3525
+ GithubPermissions: {
3526
+ /** Permissions */
3527
+ permissions?: 'read_only' | {
3528
+ [key: string]: string;
3529
+ } | null;
3530
+ /** Repositories */
3531
+ repositories?: string[] | null;
3532
+ };
3666
3533
  /**
3667
3534
  * GithubRepositoriesListResponse
3668
3535
  * @description The repositories connected to the account's GitHub installation.
@@ -3712,6 +3579,22 @@ interface components {
3712
3579
  */
3713
3580
  private: boolean;
3714
3581
  };
3582
+ /**
3583
+ * GithubSourceDetails
3584
+ * @description Identifies the file a GitHub-sourced agent config is synced from.
3585
+ *
3586
+ * Keyed on the repository ID (not owner/name) so repository and org renames
3587
+ * don't orphan the config; resolve display names from gh_repositories at
3588
+ * read time.
3589
+ */
3590
+ GithubSourceDetails: {
3591
+ /** Branch */
3592
+ branch: string;
3593
+ /** Path */
3594
+ path: string;
3595
+ /** Repo Id */
3596
+ repo_id: number;
3597
+ };
3715
3598
  /**
3716
3599
  * GithubUser
3717
3600
  * @description This is a full user account. It's the most amount of info we need to represent a GitHub user.
@@ -3833,6 +3716,30 @@ interface components {
3833
3716
  */
3834
3717
  offset: number;
3835
3718
  };
3719
+ /**
3720
+ * InputContract
3721
+ * @description The typed input contract: what goes INTO a session (the trigger is
3722
+ * when it happens; this is what goes in).
3723
+ *
3724
+ * `json_schema` types the payload a caller-started session takes
3725
+ * (`POST /v1/sessions` `input`, validated at the door; required when
3726
+ * declared). It is illegal on a react-triggered agent — react payloads are
3727
+ * platform-shaped (the published surface field sets), not caller-shaped.
3728
+ *
3729
+ * `message` is the initial-message template: exact `{{path}}` substitution
3730
+ * over the caller payload (or, on a react agent, over the surface's
3731
+ * published fields), no conditionals/loops/filters. Refs are validated at
3732
+ * deploy time against the governing field set (see AutomationConfig's
3733
+ * `_check_input`).
3734
+ */
3735
+ InputContract: {
3736
+ /** Json Schema */
3737
+ json_schema?: {
3738
+ [key: string]: unknown;
3739
+ } | null;
3740
+ /** Message */
3741
+ message?: string | null;
3742
+ };
3836
3743
  /**
3837
3744
  * IssueAction
3838
3745
  * @enum {string}
@@ -4070,6 +3977,69 @@ interface components {
4070
3977
  */
4071
3978
  slack_user_id: string;
4072
3979
  };
3980
+ /**
3981
+ * McpRemoteServer
3982
+ * @description A bring-your-own remote MCP server: the harness talks HTTP to `url`.
3983
+ * Nothing runs in the sandbox image. `headers` carry static auth (e.g.
3984
+ * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
3985
+ * references, resolved at run time from the account's secrets store.
3986
+ */
3987
+ McpRemoteServer: {
3988
+ /**
3989
+ * Headers
3990
+ * @default {}
3991
+ */
3992
+ headers: {
3993
+ [key: string]: string;
3994
+ };
3995
+ /** Name */
3996
+ name: string;
3997
+ /** Url */
3998
+ url: string;
3999
+ };
4000
+ /**
4001
+ * McpServerRef
4002
+ * @description One built-in MCP server this agent opts into by name (`linear`/`slack`).
4003
+ * A name reference over the connected built-in set — the platform manages the
4004
+ * server's transport and credentials. It only matters when the named
4005
+ * integration is set to `opt_in` inclusion; an integration in the default
4006
+ * `all_sessions` mode is added regardless. For a server the platform does not
4007
+ * provide, define it instead (`McpStdioServer` /
4008
+ * `McpRemoteServer`).
4009
+ */
4010
+ McpServerRef: {
4011
+ /** Name */
4012
+ name: string;
4013
+ };
4014
+ /**
4015
+ * McpStdioServer
4016
+ * @description A bring-your-own stdio MCP server: the harness spawns `command` inside
4017
+ * the sandbox and speaks JSON-RPC over its stdin/stdout. The command must be
4018
+ * runnable in the sandbox image — install its runtime via `image.setup` /
4019
+ * `image.dockerfile_append` if the base image lacks it.
4020
+ *
4021
+ * `env` values may embed `${NAME}` references, resolved at run time from the
4022
+ * account's secrets store (see `mcp_secret_refs`); everything else is passed
4023
+ * literally.
4024
+ */
4025
+ McpStdioServer: {
4026
+ /**
4027
+ * Args
4028
+ * @default []
4029
+ */
4030
+ args: string[];
4031
+ /** Command */
4032
+ command: string;
4033
+ /**
4034
+ * Env
4035
+ * @default {}
4036
+ */
4037
+ env: {
4038
+ [key: string]: string;
4039
+ };
4040
+ /** Name */
4041
+ name: string;
4042
+ };
4073
4043
  /**
4074
4044
  * MemoriesListResponse
4075
4045
  * @description The organization's memories: the rendered index a reader scans, plus the
@@ -4160,6 +4130,18 @@ interface components {
4160
4130
  /** @description The memory. */
4161
4131
  memory: components['schemas']['Memory'];
4162
4132
  };
4133
+ /**
4134
+ * MemorySize
4135
+ * @description A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
4136
+ * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
4137
+ * shorthand string.
4138
+ */
4139
+ MemorySize: {
4140
+ /** Gb */
4141
+ gb?: number | null;
4142
+ /** Mb */
4143
+ mb?: number | null;
4144
+ };
4163
4145
  /**
4164
4146
  * MemorySummary
4165
4147
  * @description One entry in the index: a memory with every field except `content`.
@@ -4316,6 +4298,18 @@ interface components {
4316
4298
  */
4317
4299
  default_model?: string | null;
4318
4300
  };
4301
+ /**
4302
+ * OutputConfig
4303
+ * @description The typed output contract: the JSON Schema the agent must exit through
4304
+ * (the StructuredOutput exit tool). Read back via
4305
+ * GET /v1/sessions/{id}/output.
4306
+ */
4307
+ OutputConfig: {
4308
+ /** Json Schema */
4309
+ json_schema: {
4310
+ [key: string]: unknown;
4311
+ };
4312
+ };
4319
4313
  /**
4320
4314
  * ParentKind
4321
4315
  * @description How a session relates to its predecessor (parent_agent_session_id) —
@@ -4329,6 +4323,32 @@ interface components {
4329
4323
  * @enum {string}
4330
4324
  */
4331
4325
  ParentKind: 'continuation' | 'resume';
4326
+ /**
4327
+ * PermissionsConfig
4328
+ * @description What the agent is allowed to touch, per credential the platform mints
4329
+ * into its sandbox. Distinct from `environment:`, which is where the agent
4330
+ * runs; this is what it may do from there.
4331
+ *
4332
+ * `ellipsis` scopes the sandbox's Ellipsis API token
4333
+ * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
4334
+ * with). `true` / the string `all` (the default) grant the full sandbox
4335
+ * ceiling — everything a sandbox token can ever do. A map narrows it per
4336
+ * resource (see `EllipsisPermissions`); the minted token carries
4337
+ * the intersection, so a config can only ever reduce access. `false` fails
4338
+ * validation — an agent with no API token cannot report its own progress.
4339
+ *
4340
+ * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
4341
+ * see `GithubPermissions`. GitHub enforces it at mint time.
4342
+ */
4343
+ PermissionsConfig: {
4344
+ /**
4345
+ * Ellipsis
4346
+ * @default true
4347
+ */
4348
+ ellipsis: (true | 'all') | components['schemas']['EllipsisPermissions'];
4349
+ /** @default {} */
4350
+ github: components['schemas']['GithubPermissions'];
4351
+ };
4332
4352
  /**
4333
4353
  * PollCliAuthResponse
4334
4354
  * @description The state of a device-code flow. Poll until `status` leaves `pending`.
@@ -4647,6 +4667,20 @@ interface components {
4647
4667
  };
4648
4668
  /** ReactSlackChannel */
4649
4669
  ReactSlackChannel: Record<string, never>;
4670
+ /** ReactTrigger */
4671
+ ReactTrigger: {
4672
+ issue?: components['schemas']['ReactIssue'] | null;
4673
+ linear_issue?: components['schemas']['ReactLinearIssue'] | null;
4674
+ pull_request?: components['schemas']['ReactPullRequest'] | null;
4675
+ push?: components['schemas']['ReactPush'] | null;
4676
+ sentry?: components['schemas']['ReactSentry'] | null;
4677
+ slack_channel?: components['schemas']['ReactSlackChannel'] | null;
4678
+ /**
4679
+ * @description discriminator enum property added by openapi-typescript
4680
+ * @enum {string}
4681
+ */
4682
+ type: 'react';
4683
+ };
4650
4684
  /**
4651
4685
  * RecentPullRequest
4652
4686
  * @description One pull request in the recent-activity table.
@@ -4771,6 +4805,15 @@ interface components {
4771
4805
  */
4772
4806
  include: string[];
4773
4807
  } | string[];
4808
+ /** RepositoryRef */
4809
+ RepositoryRef: {
4810
+ /** Name */
4811
+ name: string;
4812
+ /** Owner */
4813
+ owner?: string | null;
4814
+ /** Ref */
4815
+ ref?: string | null;
4816
+ };
4774
4817
  /**
4775
4818
  * RepositorySelection
4776
4819
  * @enum {string}
@@ -5302,17 +5345,60 @@ interface components {
5302
5345
  * @description The pull request a review ran on.
5303
5346
  */
5304
5347
  ReviewPullRequest: {
5348
+ /** @description Who opened the pull request, or null when Ellipsis has not ingested the pull request yet. */
5349
+ author?: components['schemas']['ReviewPullRequestAuthor'] | null;
5350
+ /**
5351
+ * Base Sha
5352
+ * @description The pull request's base commit when the review was created.
5353
+ */
5354
+ base_sha: string;
5355
+ /**
5356
+ * Head Sha
5357
+ * @description The pull request's head commit the review ran against (the same as `scope.head`).
5358
+ */
5359
+ head_sha: string;
5305
5360
  /**
5306
5361
  * Number
5307
5362
  * @description The pull request number.
5308
5363
  */
5309
5364
  number: number;
5365
+ /**
5366
+ * Title
5367
+ * @description The pull request's title, or null when Ellipsis has not ingested the pull request yet.
5368
+ */
5369
+ title?: string | null;
5310
5370
  /**
5311
5371
  * Url
5312
5372
  * @description The pull request's URL on GitHub.
5313
5373
  */
5314
5374
  url: string;
5315
5375
  };
5376
+ /**
5377
+ * ReviewPullRequestAuthor
5378
+ * @description The GitHub account that opened the pull request.
5379
+ */
5380
+ ReviewPullRequestAuthor: {
5381
+ /**
5382
+ * Avatar Url
5383
+ * @description The account's avatar URL.
5384
+ */
5385
+ avatar_url: string;
5386
+ /**
5387
+ * Id
5388
+ * @description The account's GitHub id.
5389
+ */
5390
+ id: number;
5391
+ /**
5392
+ * Login
5393
+ * @description The account's GitHub login.
5394
+ */
5395
+ login: string;
5396
+ /**
5397
+ * Type
5398
+ * @description The account type: "User", "Organization", or "Bot".
5399
+ */
5400
+ type: string;
5401
+ };
5316
5402
  /**
5317
5403
  * ReviewRepoFacet
5318
5404
  * @description A repository filter option for the reviews view.
@@ -6001,12 +6087,14 @@ interface components {
6001
6087
  * disagree about what a session looks like.
6002
6088
  */
6003
6089
  Session: {
6004
- /** @description The agent that ran: the config the session executed, where that config came from, and any override merged into it. */
6005
- agent: components['schemas']['SessionAgent'];
6006
6090
  /** @description The principal this session is attributed to. */
6007
6091
  attribution?: components['schemas']['SessionAttribution'];
6092
+ /** @description The automation the session was started from, or null for a raw session started with POST /v1/sessions. */
6093
+ automation?: components['schemas']['SessionAutomation'] | null;
6008
6094
  /** @description The spend budget enforced for this session. */
6009
6095
  budget?: components['schemas']['SessionBudget'];
6096
+ /** @description What the session ran on, frozen when it was created: the harness block, the resolved environment, permissions, skills, output contract, and budget. */
6097
+ config: components['schemas']['SessionConfig'];
6010
6098
  /**
6011
6099
  * Context Repository
6012
6100
  * @description The "owner/name" repository context the session was started in, if any.
@@ -6020,7 +6108,7 @@ interface components {
6020
6108
  * @description When the session was created.
6021
6109
  */
6022
6110
  created_at: string;
6023
- /** @description The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is inside agent.config.environment. */
6111
+ /** @description The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is `config.environment`. */
6024
6112
  environment?: components['schemas']['SessionEnvironment'];
6025
6113
  /** @description How the session ended; null until it is terminal. */
6026
6114
  exit_status?: components['schemas']['SessionExitStatus'] | null;
@@ -6086,35 +6174,6 @@ interface components {
6086
6174
  */
6087
6175
  updated_at: string;
6088
6176
  };
6089
- /**
6090
- * SessionAgent
6091
- * @description The agent this session ran: the definition it actually executed, where
6092
- * that definition came from, and the diff that was merged in — the same
6093
- * effective-value-plus-provenance shape `SessionBudget` uses.
6094
- *
6095
- * `config` is the snapshot frozen when the session was created;
6096
- * `automation_id` points at the automation as it exists NOW. They diverge
6097
- * legitimately: a YAML edit after the session started, or any `override`,
6098
- * leaves the pointer describing something the session never ran.
6099
- */
6100
- SessionAgent: {
6101
- /**
6102
- * Automation Id
6103
- * @description Identifier of the automation this session's snapshot was taken from. Null for raw sessions (nothing saved behind them), templates, and built-in agents. Points at the automation as it exists now, which may have changed since.
6104
- */
6105
- automation_id?: string | null;
6106
- /** @description The agent definition the session actually ran, frozen when the session was created. */
6107
- config: components['schemas']['AgentConfig'];
6108
- /**
6109
- * Override
6110
- * @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.
6111
- */
6112
- override?: {
6113
- [key: string]: unknown;
6114
- } | null;
6115
- /** @description How this session's config was chosen. */
6116
- source: components['schemas']['AgentConfigSource'];
6117
- };
6118
6177
  /**
6119
6178
  * SessionAttribution
6120
6179
  * @description The principal a session is attributed to: what kind, its id, and — when
@@ -6131,6 +6190,22 @@ interface components {
6131
6190
  /** @description The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user. */
6132
6191
  user?: components['schemas']['GithubAccountSnippet'] | null;
6133
6192
  };
6193
+ /**
6194
+ * SessionAutomation
6195
+ * @description The automation this session was started from: the definition frozen
6196
+ * when the session was created, and the saved automation it came from as it
6197
+ * exists NOW. They diverge legitimately — a YAML edit after the session
6198
+ * started leaves the pointer describing something the session never ran.
6199
+ */
6200
+ SessionAutomation: {
6201
+ /** @description The automation definition the session was started from, frozen when the session was created. */
6202
+ config: components['schemas']['AutomationConfig'];
6203
+ /**
6204
+ * Id
6205
+ * @description Identifier of the saved automation 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 automation behind them. Points at the automation as it exists now, which may have changed since.
6206
+ */
6207
+ id?: string | null;
6208
+ };
6134
6209
  /**
6135
6210
  * SessionBudget
6136
6211
  * @description The spend budget actually enforced for this session, and which layer of
@@ -6149,6 +6224,56 @@ interface components {
6149
6224
  */
6150
6225
  source: components['schemas']['BudgetSource'];
6151
6226
  };
6227
+ /**
6228
+ * SessionConfig
6229
+ * @description What one session runs on: the harness block(s), where it runs, what it
6230
+ * may touch, its skills, its exit contract, and its spend cap. Every session
6231
+ * freezes one of these (`agent_sessions.session_config`); an automation
6232
+ * carries one under `session:` (`AutomationConfig.session`); and
6233
+ * `POST /v1/sessions` is this shape flattened onto the request body, plus the
6234
+ * run settings. Nothing in here is an automation's identity or trigger —
6235
+ * those belong to `AutomationConfig`.
6236
+ *
6237
+ * Field order is the canonical key order for `session:` blocks and YAML
6238
+ * exports: what runs (`claude`/`codex`), where (`environment`), what it may
6239
+ * touch (`permissions`), then the rest.
6240
+ */
6241
+ SessionConfig: {
6242
+ /** @default {} */
6243
+ budget: components['schemas']['BudgetConfig'];
6244
+ /**
6245
+ * @default {
6246
+ * "system": ""
6247
+ * }
6248
+ */
6249
+ claude: components['schemas']['ClaudeConfig'];
6250
+ codex?: components['schemas']['CodexConfig'] | null;
6251
+ /**
6252
+ * Environment
6253
+ * @default {
6254
+ * "compute": {},
6255
+ * "hooks": {},
6256
+ * "image": {},
6257
+ * "mcp_servers": [],
6258
+ * "repositories": [],
6259
+ * "variables": []
6260
+ * }
6261
+ */
6262
+ environment: string | components['schemas']['EnvironmentConfig'];
6263
+ output?: components['schemas']['OutputConfig'] | null;
6264
+ /**
6265
+ * @default {
6266
+ * "ellipsis": true,
6267
+ * "github": {}
6268
+ * }
6269
+ */
6270
+ permissions: components['schemas']['PermissionsConfig'];
6271
+ /**
6272
+ * Skills
6273
+ * @default []
6274
+ */
6275
+ skills: components['schemas']['SkillRef'][];
6276
+ };
6152
6277
  /**
6153
6278
  * SessionCost
6154
6279
  * @description What a session (or one turn of it) cost, in millicents.
@@ -6189,11 +6314,27 @@ interface components {
6189
6314
  */
6190
6315
  total: number;
6191
6316
  };
6317
+ /**
6318
+ * SessionDiffResponse
6319
+ * @description A session's uncommitted working-tree changes, one patch per file.
6320
+ */
6321
+ SessionDiffResponse: {
6322
+ /**
6323
+ * Files
6324
+ * @description One unified-diff section per changed file, `diff --git` header included, exactly as git emitted it. Join to the per-file counts on `git.repos[].files` by (full_name, path). Empty when the tree was clean or no capture ran.
6325
+ */
6326
+ files: components['schemas']['SessionGitPatchFile'][];
6327
+ /**
6328
+ * Omitted Paths
6329
+ * @description Paths whose hunks were dropped to fit the storage cap, so a viewer can name what is missing instead of showing a silently partial diff.
6330
+ */
6331
+ omitted_paths: string[];
6332
+ };
6192
6333
  /**
6193
6334
  * SessionEnvironment
6194
6335
  * @description The environment this session resolved: which saved environment (as it
6195
6336
  * exists now) and how it was chosen. The environment's frozen BODY rides
6196
- * inside `agent.config.environment` — substitution happens before the config
6337
+ * inside `config.environment` — substitution happens before the config
6197
6338
  * snapshot freezes — so this object is provenance, not payload.
6198
6339
  */
6199
6340
  SessionEnvironment: {
@@ -6263,6 +6404,28 @@ interface components {
6263
6404
  /** Status */
6264
6405
  status: string;
6265
6406
  };
6407
+ /**
6408
+ * SessionGitPatchFile
6409
+ * @description One file's patch, split out of `git diff HEAD` at capture time.
6410
+ *
6411
+ * Stored per file rather than as one blob because that is how a viewer reads
6412
+ * it: a row per changed file, opened one at a time. Counts and status are NOT
6413
+ * repeated here — they live on the matching SessionGitFile in
6414
+ * `agent_sessions.output_git`, which rides on every session read, so a surface
6415
+ * lists the changed files (and their +/−) before it fetches a single hunk. The
6416
+ * join key is (full_name, path).
6417
+ *
6418
+ * `patch` is the unified-diff section for this file, `diff --git` header
6419
+ * included, exactly as git emitted it.
6420
+ */
6421
+ SessionGitPatchFile: {
6422
+ /** Full Name */
6423
+ full_name: string;
6424
+ /** Patch */
6425
+ patch: string;
6426
+ /** Path */
6427
+ path: string;
6428
+ };
6266
6429
  /**
6267
6430
  * SessionGitPr
6268
6431
  * @description A pull request the session opened in this repo, written the moment the
@@ -6648,6 +6811,35 @@ interface components {
6648
6811
  */
6649
6812
  sessions: components['schemas']['Session'][];
6650
6813
  };
6814
+ /**
6815
+ * SettingsRef
6816
+ * @description A config-declared Claude Code settings.json, resolved at run start and
6817
+ * passed to `claude --settings <path>`. That is the CLI settings tier — BELOW
6818
+ * Ellipsis's managed-settings.json floor — so it customizes behavior (model
6819
+ * permissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a
6820
+ * security setting. Lets a team point the cloud agent at the same settings file
6821
+ * they already use with Claude Code locally instead of re-encoding it as YAML.
6822
+ */
6823
+ SettingsRef: {
6824
+ /** Path */
6825
+ path: string;
6826
+ repository?: components['schemas']['RepositoryRef'] | null;
6827
+ };
6828
+ /**
6829
+ * SkillRef
6830
+ * @description One config-declared Claude Code skill: a repository directory containing
6831
+ * a SKILL.md, resolved at run start and installed at the sandbox's personal
6832
+ * skill level (`~/.claude/skills/<basename(path)>/`). This is how a config
6833
+ * brings in skills its cloned repositories don't provide — cross-repo refs
6834
+ * (an org-wide skills repo), public third-party repos, and repo-less runs.
6835
+ * Skills under a cloned repo's own `.claude/skills/` load by themselves and
6836
+ * don't need an entry here.
6837
+ */
6838
+ SkillRef: {
6839
+ /** Path */
6840
+ path: string;
6841
+ repository?: components['schemas']['RepositoryRef'] | null;
6842
+ };
6651
6843
  /**
6652
6844
  * SlackChannel
6653
6845
  * @description One channel in the connected Slack workspace.
@@ -6775,7 +6967,7 @@ interface components {
6775
6967
  /**
6776
6968
  * StartAgentSessionRequest
6777
6969
  * @description Parameters for starting a raw session: where it runs, its first
6778
- * message, and the run's own settings. Flat, in the AgentConfig vocabulary
6970
+ * message, and the run's own settings. Flat, in the AutomationConfig vocabulary
6779
6971
  * — a `claude:` or `permissions:` block copied from an agents/ YAML file
6780
6972
  * pastes in verbatim. There is no automation behind a raw session; to run a
6781
6973
  * saved automation, invoke it with POST /v1/automations/{automation_id}/sessions.
@@ -6791,14 +6983,14 @@ interface components {
6791
6983
  */
6792
6984
  budget?: number | null;
6793
6985
  /** @description The Claude-harness block: `{"model": ...}` to pick this session's model, plus system/effort/fallback_model/max_turns/settings. Omit the model to run the organization's default. */
6794
- claude?: components['schemas']['AgentConfigClaude'] | null;
6986
+ claude?: components['schemas']['ClaudeConfig'] | null;
6795
6987
  /** @description The Codex-harness block. Its presence selects the Codex harness, exactly as in a saved automation; a request may not carry both `claude` and `codex`. */
6796
- codex?: components['schemas']['AgentConfigCodex'] | null;
6988
+ codex?: components['schemas']['CodexConfig'] | null;
6797
6989
  /**
6798
6990
  * Environment
6799
- * @description Where the session runs. A STRING is a saved environment's name or `env_...` id. An OBJECT is an inline environment for this session only. Omitted, the session runs in the organization's default environment, else the built-in basic sandbox.
6991
+ * @description Where the session runs. A STRING is a saved environment's name or `env_...` id, substituted wholesale. An OBJECT is the whole environment for this session — `{}` is the bare sandbox; nothing from the organization's default merges in. Omitted, the session runs in the organization's default environment, else the built-in basic sandbox.
6800
6992
  */
6801
- environment?: string | components['schemas']['AgentConfigEnvironment'] | null;
6993
+ environment?: string | components['schemas']['EnvironmentConfig'] | null;
6802
6994
  /**
6803
6995
  * Force Rebuild
6804
6996
  * @description Skip the image cache for this session's initial provision: a fresh full build whose snapshot then refreshes the cache for later runs. The CLI's `--rebuild`.
@@ -6820,19 +7012,24 @@ interface components {
6820
7012
  [key: string]: string;
6821
7013
  };
6822
7014
  /** @description The structured-output exit contract for this session. */
6823
- output?: components['schemas']['AgentConfigOutput'] | null;
7015
+ output?: components['schemas']['OutputConfig'] | null;
6824
7016
  /** @description What the session may touch, per minted credential. */
6825
- permissions?: components['schemas']['AgentConfigPermissions'] | null;
7017
+ permissions?: components['schemas']['PermissionsConfig'] | null;
6826
7018
  /**
6827
7019
  * Prompt
6828
7020
  * @description The session's first message. Omit it and the session starts idle: the sandbox spins up, the agent waits at the prompt, and the first message you send opens turn 0.
6829
7021
  */
6830
7022
  prompt?: string | null;
7023
+ /**
7024
+ * Repositories
7025
+ * @description Repositories to check out in addition to the environment's own, as `owner/name` or a bare `name` (the account's). Each is added only when the resolved environment does not already have it — the CLI sends the repository it is standing in this way, whatever environment the session runs in.
7026
+ */
7027
+ repositories?: string[] | null;
6831
7028
  /**
6832
7029
  * Skills
6833
7030
  * @description Skills installed for this session.
6834
7031
  */
6835
- skills?: components['schemas']['AgentConfigSkill'][] | null;
7032
+ skills?: components['schemas']['SkillRef'][] | null;
6836
7033
  };
6837
7034
  /**
6838
7035
  * StartAutomationSessionRequest
@@ -6901,6 +7098,12 @@ interface components {
6901
7098
  */
6902
7099
  verification_uri_complete: string;
6903
7100
  };
7101
+ /** SystemFileRef */
7102
+ SystemFileRef: {
7103
+ /** File */
7104
+ file: string;
7105
+ repository?: components['schemas']['RepositoryRef'] | null;
7106
+ };
6904
7107
  /**
6905
7108
  * TokensInfo
6906
7109
  * @description Token/cost usage, per record (one API call's counts, aggregate fields at
@@ -6963,7 +7166,7 @@ interface components {
6963
7166
  */
6964
7167
  UpdateAutomationRequest: {
6965
7168
  /** @description The automation's new definition. Replaces the previous one wholesale — this is not a partial update. */
6966
- automation: components['schemas']['AgentConfig'];
7169
+ automation: components['schemas']['AutomationConfig'];
6967
7170
  };
6968
7171
  /**
6969
7172
  * UpdateEnvironmentRequest
@@ -6971,7 +7174,7 @@ interface components {
6971
7174
  */
6972
7175
  UpdateEnvironmentRequest: {
6973
7176
  /** @description The environment's new definition. Replaces the previous one wholesale — this is not a partial update. */
6974
- environment: components['schemas']['EnvironmentConfig'];
7177
+ environment: components['schemas']['EnvironmentDocument'];
6975
7178
  };
6976
7179
  /**
6977
7180
  * UsageDailyPoint
@@ -7898,18 +8101,100 @@ interface operations {
7898
8101
  'application/json': components['schemas']['ErrorResponse'];
7899
8102
  };
7900
8103
  };
7901
- /** @description Validation Error */
8104
+ /** @description Validation Error */
8105
+ 422: {
8106
+ headers: {
8107
+ [name: string]: unknown;
8108
+ };
8109
+ content: {
8110
+ 'application/json': components['schemas']['HTTPValidationError'];
8111
+ };
8112
+ };
8113
+ };
8114
+ };
8115
+ link_automation: {
8116
+ parameters: {
8117
+ query?: never;
8118
+ header?: {
8119
+ 'user-agent'?: string | null;
8120
+ };
8121
+ path: {
8122
+ automation_id: string;
8123
+ };
8124
+ cookie?: never;
8125
+ };
8126
+ requestBody: {
8127
+ content: {
8128
+ 'application/json': components['schemas']['LinkAutomationRequest'];
8129
+ };
8130
+ };
8131
+ responses: {
8132
+ /** @description Successful Response */
8133
+ 200: {
8134
+ headers: {
8135
+ [name: string]: unknown;
8136
+ };
8137
+ content: {
8138
+ 'application/json': components['schemas']['LinkAutomationResponse'];
8139
+ };
8140
+ };
8141
+ /** @description The path is not a synced location, or the repository has no commits. */
8142
+ 400: {
8143
+ headers: {
8144
+ [name: string]: unknown;
8145
+ };
8146
+ content: {
8147
+ 'application/json': components['schemas']['ErrorResponse'];
8148
+ };
8149
+ };
8150
+ /** @description The bearer token is missing, invalid, or revoked. */
8151
+ 401: {
8152
+ headers: {
8153
+ [name: string]: unknown;
8154
+ };
8155
+ content: {
8156
+ 'application/json': components['schemas']['ErrorResponse'];
8157
+ };
8158
+ };
8159
+ /** @description The credential may not perform this action, or the account is blocked. */
8160
+ 403: {
8161
+ headers: {
8162
+ [name: string]: unknown;
8163
+ };
8164
+ content: {
8165
+ 'application/json': components['schemas']['ErrorResponse'];
8166
+ };
8167
+ };
8168
+ /** @description The automation or repository was not found in your account. */
8169
+ 404: {
8170
+ headers: {
8171
+ [name: string]: unknown;
8172
+ };
8173
+ content: {
8174
+ 'application/json': components['schemas']['ErrorResponse'];
8175
+ };
8176
+ };
8177
+ /** @description The automation is already defined by a file, a link is already open for it, a file already exists at that path, or another automation syncs from it. */
8178
+ 409: {
8179
+ headers: {
8180
+ [name: string]: unknown;
8181
+ };
8182
+ content: {
8183
+ 'application/json': components['schemas']['ErrorResponse'];
8184
+ };
8185
+ };
8186
+ /** @description GitHub rejected the pull request. */
7902
8187
  422: {
7903
8188
  headers: {
7904
8189
  [name: string]: unknown;
7905
8190
  };
7906
8191
  content: {
7907
- 'application/json': components['schemas']['HTTPValidationError'];
8192
+ 'application/json': components['schemas']['ErrorResponse'];
7908
8193
  };
7909
8194
  };
7910
8195
  };
7911
8196
  };
7912
- link_automation: {
8197
+ get_automation_metrics: {
7913
8198
  parameters: {
7914
8199
  query?: never;
7915
8200
  header?: {
@@ -7920,11 +8205,7 @@ interface operations {
7920
8205
  };
7921
8206
  cookie?: never;
7922
8207
  };
7923
- requestBody: {
7924
- content: {
7925
- 'application/json': components['schemas']['LinkAutomationRequest'];
7926
- };
7927
- };
8208
+ requestBody?: never;
7928
8209
  responses: {
7929
8210
  /** @description Successful Response */
7930
8211
  200: {
@@ -7932,16 +8213,7 @@ interface operations {
7932
8213
  [name: string]: unknown;
7933
8214
  };
7934
8215
  content: {
7935
- 'application/json': components['schemas']['LinkAutomationResponse'];
7936
- };
7937
- };
7938
- /** @description The path is not a synced location, or the repository has no commits. */
7939
- 400: {
7940
- headers: {
7941
- [name: string]: unknown;
7942
- };
7943
- content: {
7944
- 'application/json': components['schemas']['ErrorResponse'];
8216
+ 'application/json': components['schemas']['AutomationMetricsResponse'];
7945
8217
  };
7946
8218
  };
7947
8219
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -7962,7 +8234,7 @@ interface operations {
7962
8234
  'application/json': components['schemas']['ErrorResponse'];
7963
8235
  };
7964
8236
  };
7965
- /** @description The automation or repository was not found in your account. */
8237
+ /** @description No such automation in your account. */
7966
8238
  404: {
7967
8239
  headers: {
7968
8240
  [name: string]: unknown;
@@ -7971,22 +8243,13 @@ interface operations {
7971
8243
  'application/json': components['schemas']['ErrorResponse'];
7972
8244
  };
7973
8245
  };
7974
- /** @description The automation is already defined by a file, a link is already open for it, a file already exists at that path, or another automation syncs from it. */
7975
- 409: {
7976
- headers: {
7977
- [name: string]: unknown;
7978
- };
7979
- content: {
7980
- 'application/json': components['schemas']['ErrorResponse'];
7981
- };
7982
- };
7983
- /** @description GitHub rejected the pull request. */
8246
+ /** @description Validation Error */
7984
8247
  422: {
7985
8248
  headers: {
7986
8249
  [name: string]: unknown;
7987
8250
  };
7988
8251
  content: {
7989
- 'application/json': components['schemas']['ErrorResponse'];
8252
+ 'application/json': components['schemas']['HTTPValidationError'];
7990
8253
  };
7991
8254
  };
7992
8255
  };
@@ -9541,10 +9804,12 @@ interface operations {
9541
9804
  list_reviews: {
9542
9805
  parameters: {
9543
9806
  query?: {
9544
- owner?: string | null;
9545
- repo?: string | null;
9546
- pull_request_number?: number | null;
9547
- status?: components['schemas']['CodeReviewRunStatus'] | null;
9807
+ /** @description Only reviews on these repositories, each as owner/name. Repeat the parameter for several. */
9808
+ repository?: string[];
9809
+ /** @description Only reviews on these pull request numbers. Repeat the parameter for several. */
9810
+ pull_request_number?: number[];
9811
+ /** @description Only reviews in these statuses. Repeat the parameter for several. */
9812
+ status?: components['schemas']['CodeReviewRunStatus'][];
9548
9813
  limit?: number;
9549
9814
  cursor?: string | null;
9550
9815
  };
@@ -9565,7 +9830,7 @@ interface operations {
9565
9830
  'application/json': components['schemas']['ReviewsListResponse'];
9566
9831
  };
9567
9832
  };
9568
- /** @description Filtering by repository requires both owner and repo (and pull_request_number requires them too). */
9833
+ /** @description A `repository` value is not of the form owner/name. */
9569
9834
  400: {
9570
9835
  headers: {
9571
9836
  [name: string]: unknown;
@@ -9592,7 +9857,7 @@ interface operations {
9592
9857
  'application/json': components['schemas']['ErrorResponse'];
9593
9858
  };
9594
9859
  };
9595
- /** @description The repository was not found in your account. */
9860
+ /** @description A `repository` was not found in your account. */
9596
9861
  404: {
9597
9862
  headers: {
9598
9863
  [name: string]: unknown;
@@ -10107,6 +10372,66 @@ interface operations {
10107
10372
  };
10108
10373
  };
10109
10374
  };
10375
+ get_agent_session_diff: {
10376
+ parameters: {
10377
+ query?: never;
10378
+ header?: {
10379
+ 'user-agent'?: string | null;
10380
+ };
10381
+ path: {
10382
+ session_id: string;
10383
+ };
10384
+ cookie?: never;
10385
+ };
10386
+ requestBody?: never;
10387
+ responses: {
10388
+ /** @description Successful Response */
10389
+ 200: {
10390
+ headers: {
10391
+ [name: string]: unknown;
10392
+ };
10393
+ content: {
10394
+ 'application/json': components['schemas']['SessionDiffResponse'];
10395
+ };
10396
+ };
10397
+ /** @description The bearer token is missing, invalid, or revoked. */
10398
+ 401: {
10399
+ headers: {
10400
+ [name: string]: unknown;
10401
+ };
10402
+ content: {
10403
+ 'application/json': components['schemas']['ErrorResponse'];
10404
+ };
10405
+ };
10406
+ /** @description The credential may not perform this action, or the account is blocked. */
10407
+ 403: {
10408
+ headers: {
10409
+ [name: string]: unknown;
10410
+ };
10411
+ content: {
10412
+ 'application/json': components['schemas']['ErrorResponse'];
10413
+ };
10414
+ };
10415
+ /** @description No such session in your account. */
10416
+ 404: {
10417
+ headers: {
10418
+ [name: string]: unknown;
10419
+ };
10420
+ content: {
10421
+ 'application/json': components['schemas']['ErrorResponse'];
10422
+ };
10423
+ };
10424
+ /** @description Validation Error */
10425
+ 422: {
10426
+ headers: {
10427
+ [name: string]: unknown;
10428
+ };
10429
+ content: {
10430
+ 'application/json': components['schemas']['HTTPValidationError'];
10431
+ };
10432
+ };
10433
+ };
10434
+ };
10110
10435
  export_agent_session: {
10111
10436
  parameters: {
10112
10437
  query?: never;
@@ -10803,6 +11128,7 @@ type AttributionType = 'github_user' | 'linear_user' | 'slack_user' | 'api_key';
10803
11128
  * Delivery status of the message.
10804
11129
  */
10805
11130
  type SessionMessageStatus = 'pending' | 'delivered';
11131
+ type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10806
11132
  type EffortLevel = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
10807
11133
  /**
10808
11134
  * What may be done to a resource. Strictly ordered: a grant at one level
@@ -10822,20 +11148,6 @@ type RepositoryFilter = {
10822
11148
  type LinearIssueAction = 'opened';
10823
11149
  type PullRequestAction = 'opened' | 'pushed' | 'merged' | 'closed' | 'review_submitted' | 'commented';
10824
11150
  type SentryAction = 'issue_alert' | 'metric_alert';
10825
- /**
10826
- * The surface an @ellipsis mention can come from.
10827
- *
10828
- * No SLACK member: Slack routing is not a trigger on an agent config, it is the
10829
- * `slack.yaml` routing file (`SlackConfig`), which answers the questions a
10830
- * platform list cannot — which channel, and whose DM. A mention trigger listing
10831
- * `slack` is therefore a config error, not a silently-never-fires config.
10832
- */
10833
- type AgentConfigMentionPlatform = 'github' | 'linear';
10834
- /**
10835
- * How this session's config was chosen.
10836
- */
10837
- type AgentConfigSource = 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
10838
- type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10839
11151
  /**
10840
11152
  * Where the resolved budget came from.
10841
11153
  */
@@ -10972,9 +11284,13 @@ interface SessionMessage {
10972
11284
  * The session's current state.
10973
11285
  */
10974
11286
  interface Session {
10975
- agent: SessionAgent;
10976
11287
  attribution: SessionAttribution;
11288
+ /**
11289
+ * The automation the session was started from, or null for a raw session started with POST /v1/sessions.
11290
+ */
11291
+ automation: SessionAutomation | null;
10977
11292
  budget: SessionBudget;
11293
+ config: SessionConfig1;
10978
11294
  /**
10979
11295
  * The "owner/name" repository context the session was started in, if any.
10980
11296
  */
@@ -11041,50 +11357,139 @@ interface Session {
11041
11357
  updated_at: string;
11042
11358
  }
11043
11359
  /**
11044
- * The agent that ran: the config the session executed, where that config came from, and any override merged into it.
11360
+ * The principal this session is attributed to.
11045
11361
  */
11046
- interface SessionAgent {
11362
+ interface SessionAttribution {
11363
+ /**
11364
+ * Identifier of the principal the session is attributed to.
11365
+ */
11366
+ id: string | null;
11367
+ /**
11368
+ * Kind of principal the session is attributed to (e.g. a GitHub user or an API key).
11369
+ */
11370
+ type: AttributionType | null;
11047
11371
  /**
11048
- * Identifier of the automation this session's snapshot was taken from. Null for raw sessions (nothing saved behind them), templates, and built-in agents. Points at the automation as it exists now, which may have changed since.
11372
+ * The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user.
11049
11373
  */
11050
- automation_id: string | null;
11051
- config: AgentConfig;
11374
+ user: GithubAccountSnippet | null;
11375
+ }
11376
+ /**
11377
+ * Sometimes the GitHub API returns a user of github (can include bots)
11378
+ * using this snippet instead of the full GithubAccount model. One example,
11379
+ * is when the API returns a pull request.
11380
+ *
11381
+ * This is the least amount of info we need to represent a GitHub account.
11382
+ */
11383
+ interface GithubAccountSnippet {
11384
+ avatar_url: string;
11385
+ id: number;
11386
+ login: string;
11387
+ type: GithubAccountType;
11388
+ }
11389
+ /**
11390
+ * The automation this session was started from: the definition frozen
11391
+ * when the session was created, and the saved automation it came from as it
11392
+ * exists NOW. They diverge legitimately — a YAML edit after the session
11393
+ * started leaves the pointer describing something the session never ran.
11394
+ */
11395
+ interface SessionAutomation {
11396
+ config: AutomationConfig;
11052
11397
  /**
11053
- * 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.
11398
+ * Identifier of the saved automation 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 automation behind them. Points at the automation as it exists now, which may have changed since.
11054
11399
  */
11055
- override: {
11400
+ id: string | null;
11401
+ }
11402
+ /**
11403
+ * The automation definition the session was started from, frozen when the session was created.
11404
+ */
11405
+ interface AutomationConfig {
11406
+ ellipsis: AutomationIdentity;
11407
+ input: InputContract | null;
11408
+ session: SessionConfig;
11409
+ trigger: (CronTrigger | ReactTrigger) | null;
11410
+ }
11411
+ /**
11412
+ * The Ellipsis product namespace for a config file: which schema this is
11413
+ * (`version`), the human-facing identity (`name`/`description`), freeform
11414
+ * organizational `metadata`, and whether the agent is `enabled`. The
11415
+ * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
11416
+ * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
11417
+ * config directory) — see `yaml_is_ellipsis_config`.
11418
+ *
11419
+ * `enabled` is agent behavior, not freeform metadata, so it stays inside
11420
+ * the config `sha` (only `metadata` is sha-excluded). Whether a session
11421
+ * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
11422
+ * not a config one.
11423
+ */
11424
+ interface AutomationIdentity {
11425
+ description: string | null;
11426
+ enabled: boolean;
11427
+ metadata: ConfigMetadata;
11428
+ name: string | null;
11429
+ version: string;
11430
+ }
11431
+ interface ConfigMetadata {
11432
+ annotations: {
11433
+ [k: string]: string;
11434
+ };
11435
+ labels: string[];
11436
+ }
11437
+ /**
11438
+ * The typed input contract: what goes INTO a session (the trigger is
11439
+ * when it happens; this is what goes in).
11440
+ *
11441
+ * `json_schema` types the payload a caller-started session takes
11442
+ * (`POST /v1/sessions` `input`, validated at the door; required when
11443
+ * declared). It is illegal on a react-triggered agent — react payloads are
11444
+ * platform-shaped (the published surface field sets), not caller-shaped.
11445
+ *
11446
+ * `message` is the initial-message template: exact `{{path}}` substitution
11447
+ * over the caller payload (or, on a react agent, over the surface's
11448
+ * published fields), no conditionals/loops/filters. Refs are validated at
11449
+ * deploy time against the governing field set (see AutomationConfig's
11450
+ * `_check_input`).
11451
+ */
11452
+ interface InputContract {
11453
+ json_schema: {
11056
11454
  [k: string]: unknown;
11057
11455
  } | null;
11058
- source: AgentConfigSource;
11456
+ message: string | null;
11059
11457
  }
11060
11458
  /**
11061
- * The agent definition the session actually ran, frozen when the session was created.
11459
+ * What one session runs on: the harness block(s), where it runs, what it
11460
+ * may touch, its skills, its exit contract, and its spend cap. Every session
11461
+ * freezes one of these (`agent_sessions.session_config`); an automation
11462
+ * carries one under `session:` (`AutomationConfig.session`); and
11463
+ * `POST /v1/sessions` is this shape flattened onto the request body, plus the
11464
+ * run settings. Nothing in here is an automation's identity or trigger —
11465
+ * those belong to `AutomationConfig`.
11466
+ *
11467
+ * Field order is the canonical key order for `session:` blocks and YAML
11468
+ * exports: what runs (`claude`/`codex`), where (`environment`), what it may
11469
+ * touch (`permissions`), then the rest.
11062
11470
  */
11063
- interface AgentConfig {
11064
- budget: AgentConfigBudget;
11065
- claude: AgentConfigClaude;
11066
- codex: AgentConfigCodex | null;
11067
- ellipsis: AgentConfigEllipsis;
11068
- environment: string | AgentConfigEnvironment;
11069
- input: AgentConfigInput | null;
11070
- output: AgentConfigOutput | null;
11071
- permissions: AgentConfigPermissions;
11072
- skills: AgentConfigSkill[];
11073
- trigger: (AgentConfigCronTrigger | AgentConfigReactTrigger | AgentConfigMentionTrigger) | null;
11471
+ interface SessionConfig {
11472
+ budget: BudgetConfig;
11473
+ claude: ClaudeConfig;
11474
+ codex: CodexConfig | null;
11475
+ environment: string | EnvironmentConfig;
11476
+ output: OutputConfig | null;
11477
+ permissions: PermissionsConfig;
11478
+ skills: SkillRef[];
11074
11479
  }
11075
- interface AgentConfigBudget {
11480
+ interface BudgetConfig {
11076
11481
  day: number | null;
11077
11482
  month: number | null;
11078
11483
  session: number | null;
11079
11484
  week: number | null;
11080
11485
  }
11081
- interface AgentConfigClaude {
11486
+ interface ClaudeConfig {
11082
11487
  effort: EffortLevel | null;
11083
11488
  fallback_model: string | null;
11084
11489
  max_turns: number | null;
11085
11490
  model: string | null;
11086
- settings: AgentConfigSettingsRef | null;
11087
- system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
11491
+ settings: SettingsRef | null;
11492
+ system: string | SystemFileRef | (string | SystemFileRef)[];
11088
11493
  }
11089
11494
  /**
11090
11495
  * A config-declared Claude Code settings.json, resolved at run start and
@@ -11094,25 +11499,25 @@ interface AgentConfigClaude {
11094
11499
  * security setting. Lets a team point the cloud agent at the same settings file
11095
11500
  * they already use with Claude Code locally instead of re-encoding it as YAML.
11096
11501
  */
11097
- interface AgentConfigSettingsRef {
11502
+ interface SettingsRef {
11098
11503
  path: string;
11099
- repository: AgentConfigRepository | null;
11504
+ repository: RepositoryRef | null;
11100
11505
  }
11101
- interface AgentConfigRepository {
11506
+ interface RepositoryRef {
11102
11507
  name: string;
11103
11508
  owner: string | null;
11104
11509
  ref: string | null;
11105
11510
  }
11106
- interface AgentConfigSystemFileRef {
11511
+ interface SystemFileRef {
11107
11512
  file: string;
11108
- repository: AgentConfigRepository | null;
11513
+ repository: RepositoryRef | null;
11109
11514
  }
11110
11515
  /**
11111
11516
  * The `codex:` block — run this agent on OpenAI's Codex CLI instead of
11112
11517
  * Claude Code. Declaring the block at all is what selects the harness
11113
- * (`AgentConfig.harness`).
11518
+ * (`AutomationConfig.harness`).
11114
11519
  *
11115
- * Deliberately a small subset of `AgentConfigClaude`: the fields omitted here
11520
+ * Deliberately a small subset of `ClaudeConfig`: the fields omitted here
11116
11521
  * are ones Codex has no equivalent for (`effort`, `fallback_model`,
11117
11522
  * `settings`) or that the platform does not yet wire through for this harness
11118
11523
  * (`max_turns`, `skills`, MCP servers). They are omitted rather than
@@ -11120,35 +11525,9 @@ interface AgentConfigSystemFileRef {
11120
11525
  * config that sets one fails loudly at parse time instead of silently not doing
11121
11526
  * it. The budget still bounds a run regardless.
11122
11527
  */
11123
- interface AgentConfigCodex {
11528
+ interface CodexConfig {
11124
11529
  model: string;
11125
- system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
11126
- }
11127
- /**
11128
- * The Ellipsis product namespace for a config file: which schema this is
11129
- * (`version`), the human-facing identity (`name`/`description`), freeform
11130
- * organizational `metadata`, and whether the agent is `enabled`. The
11131
- * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
11132
- * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
11133
- * config directory) — see `yaml_is_ellipsis_config`.
11134
- *
11135
- * `enabled` is agent behavior, not freeform metadata, so it stays inside
11136
- * the config `sha` (only `metadata` is sha-excluded). Whether a session
11137
- * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
11138
- * not a config one.
11139
- */
11140
- interface AgentConfigEllipsis {
11141
- description: string | null;
11142
- enabled: boolean;
11143
- metadata: AgentConfigMetadata;
11144
- name: string | null;
11145
- version: string;
11146
- }
11147
- interface AgentConfigMetadata {
11148
- annotations: {
11149
- [k: string]: string;
11150
- };
11151
- labels: string[];
11530
+ system: string | SystemFileRef | (string | SystemFileRef)[];
11152
11531
  }
11153
11532
  /**
11154
11533
  * Everything about the environment (the sandbox) the agent runs in: which
@@ -11163,13 +11542,13 @@ interface AgentConfigMetadata {
11163
11542
  * stored variables never do. This is how a config brings in the config and
11164
11543
  * credentials a custom CLI needs.
11165
11544
  */
11166
- interface AgentConfigEnvironment {
11167
- compute: AgentConfigCompute;
11168
- hooks: AgentConfigEnvironmentHooks;
11169
- image: AgentConfigEnvironmentImage;
11170
- mcp_servers: (string | AgentConfigMcpServer | AgentConfigMcpStdioServer | AgentConfigMcpRemoteServer)[];
11171
- repositories: AgentConfigRepository[];
11172
- variables: AgentConfigEnvironmentVariable[];
11545
+ interface EnvironmentConfig {
11546
+ compute: ComputeConfig;
11547
+ hooks: EnvironmentHooks;
11548
+ image: EnvironmentImage;
11549
+ mcp_servers: (string | McpServerRef | McpStdioServer | McpRemoteServer)[];
11550
+ repositories: RepositoryRef[];
11551
+ variables: EnvironmentVariable[];
11173
11552
  }
11174
11553
  /**
11175
11554
  * Sandbox compute sizing. Every field is optional; None inherits the
@@ -11193,17 +11572,17 @@ interface AgentConfigEnvironment {
11193
11572
  * Compute is billed on the requested allocation over the sandbox's
11194
11573
  * wall-clock lifetime, so a bigger/longer box costs proportionally more.
11195
11574
  */
11196
- interface AgentConfigCompute {
11575
+ interface ComputeConfig {
11197
11576
  cpu: number | null;
11198
- memory: string | AgentConfigMemorySize | null;
11199
- timeout: string | AgentConfigDuration | null;
11577
+ memory: string | MemorySize | null;
11578
+ timeout: string | Duration | null;
11200
11579
  }
11201
11580
  /**
11202
11581
  * A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
11203
11582
  * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
11204
11583
  * shorthand string.
11205
11584
  */
11206
- interface AgentConfigMemorySize {
11585
+ interface MemorySize {
11207
11586
  gb: number | null;
11208
11587
  mb: number | null;
11209
11588
  }
@@ -11212,7 +11591,7 @@ interface AgentConfigMemorySize {
11212
11591
  * `seconds` (at least one). The alternative to the `30m`-style shorthand
11213
11592
  * string wherever a duration is accepted.
11214
11593
  */
11215
- interface AgentConfigDuration {
11594
+ interface Duration {
11216
11595
  hours: number | null;
11217
11596
  minutes: number | null;
11218
11597
  seconds: number | null;
@@ -11235,7 +11614,7 @@ interface AgentConfigDuration {
11235
11614
  * (baked into the cached image) instead; keep hooks for per-run work — e.g.
11236
11615
  * anything that touches run-scoped credentials.
11237
11616
  */
11238
- interface AgentConfigEnvironmentHooks {
11617
+ interface EnvironmentHooks {
11239
11618
  post_clone: string | null;
11240
11619
  post_start: string | null;
11241
11620
  }
@@ -11254,7 +11633,7 @@ interface AgentConfigEnvironmentHooks {
11254
11633
  * `npm install`), so later runs start with deps already on disk. Neither runs
11255
11634
  * per run; that's `hooks.post_start` / `hooks.post_clone`.
11256
11635
  */
11257
- interface AgentConfigEnvironmentImage {
11636
+ interface EnvironmentImage {
11258
11637
  dockerfile_append: string | null;
11259
11638
  setup: string | null;
11260
11639
  }
@@ -11264,10 +11643,10 @@ interface AgentConfigEnvironmentImage {
11264
11643
  * server's transport and credentials. It only matters when the named
11265
11644
  * integration is set to `opt_in` inclusion; an integration in the default
11266
11645
  * `all_sessions` mode is added regardless. For a server the platform does not
11267
- * provide, define it instead (`AgentConfigMcpStdioServer` /
11268
- * `AgentConfigMcpRemoteServer`).
11646
+ * provide, define it instead (`McpStdioServer` /
11647
+ * `McpRemoteServer`).
11269
11648
  */
11270
- interface AgentConfigMcpServer {
11649
+ interface McpServerRef {
11271
11650
  name: string;
11272
11651
  }
11273
11652
  /**
@@ -11280,7 +11659,7 @@ interface AgentConfigMcpServer {
11280
11659
  * account's secrets store (see `mcp_secret_refs`); everything else is passed
11281
11660
  * literally.
11282
11661
  */
11283
- interface AgentConfigMcpStdioServer {
11662
+ interface McpStdioServer {
11284
11663
  args: string[];
11285
11664
  command: string;
11286
11665
  env: {
@@ -11294,7 +11673,7 @@ interface AgentConfigMcpStdioServer {
11294
11673
  * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
11295
11674
  * references, resolved at run time from the account's secrets store.
11296
11675
  */
11297
- interface AgentConfigMcpRemoteServer {
11676
+ interface McpRemoteServer {
11298
11677
  headers: {
11299
11678
  [k: string]: string;
11300
11679
  };
@@ -11311,37 +11690,16 @@ interface AgentConfigMcpRemoteServer {
11311
11690
  * ever putting it in the config file. Either way the variable only reaches
11312
11691
  * agents that name it.
11313
11692
  */
11314
- interface AgentConfigEnvironmentVariable {
11693
+ interface EnvironmentVariable {
11315
11694
  name: string;
11316
11695
  value: string | null;
11317
11696
  }
11318
- /**
11319
- * The typed input contract: what goes INTO a session (the trigger is
11320
- * when it happens; this is what goes in).
11321
- *
11322
- * `json_schema` types the payload a caller-started session takes
11323
- * (`POST /v1/sessions` `input`, validated at the door; required when
11324
- * declared). It is illegal on a react-triggered agent — react payloads are
11325
- * platform-shaped (the published surface field sets), not caller-shaped.
11326
- *
11327
- * `message` is the initial-message template: exact `{{path}}` substitution
11328
- * over the caller payload (or, on a react agent, over the surface's
11329
- * published fields), no conditionals/loops/filters. Refs are validated at
11330
- * deploy time against the governing field set (see AgentConfig's
11331
- * `_check_input`).
11332
- */
11333
- interface AgentConfigInput {
11334
- json_schema: {
11335
- [k: string]: unknown;
11336
- } | null;
11337
- message: string | null;
11338
- }
11339
11697
  /**
11340
11698
  * The typed output contract: the JSON Schema the agent must exit through
11341
11699
  * (the StructuredOutput exit tool). Read back via
11342
11700
  * GET /v1/sessions/{id}/output.
11343
11701
  */
11344
- interface AgentConfigOutput {
11702
+ interface OutputConfig {
11345
11703
  json_schema: {
11346
11704
  [k: string]: unknown;
11347
11705
  };
@@ -11355,16 +11713,16 @@ interface AgentConfigOutput {
11355
11713
  * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
11356
11714
  * with). `true` / the string `all` (the default) grant the full sandbox
11357
11715
  * ceiling — everything a sandbox token can ever do. A map narrows it per
11358
- * resource (see `AgentConfigEllipsisPermissions`); the minted token carries
11716
+ * resource (see `EllipsisPermissions`); the minted token carries
11359
11717
  * the intersection, so a config can only ever reduce access. `false` fails
11360
11718
  * validation — an agent with no API token cannot report its own progress.
11361
11719
  *
11362
11720
  * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
11363
- * see `AgentConfigGithubPermissions`. GitHub enforces it at mint time.
11721
+ * see `GithubPermissions`. GitHub enforces it at mint time.
11364
11722
  */
11365
- interface AgentConfigPermissions {
11366
- ellipsis: (true | 'all') | AgentConfigEllipsisPermissions;
11367
- github: AgentConfigGithubPermissions;
11723
+ interface PermissionsConfig {
11724
+ ellipsis: (true | 'all') | EllipsisPermissions;
11725
+ github: GithubPermissions;
11368
11726
  }
11369
11727
  /**
11370
11728
  * `permissions.ellipsis` as a map: resource → level | grant | list of
@@ -11373,7 +11731,7 @@ interface AgentConfigPermissions {
11373
11731
  * intersected with the platform's sandbox ceiling at token mint — it can
11374
11732
  * narrow what a sandbox token may do, never exceed it.
11375
11733
  */
11376
- interface AgentConfigEllipsisPermissions {
11734
+ interface EllipsisPermissions {
11377
11735
  [k: string]: Level | EllipsisGrant | (Level | EllipsisGrant)[];
11378
11736
  }
11379
11737
  /**
@@ -11402,7 +11760,7 @@ interface EllipsisGrant {
11402
11760
  * minted with the reduced scope, so nothing running in the sandbox can
11403
11761
  * exceed it.
11404
11762
  */
11405
- interface AgentConfigGithubPermissions {
11763
+ interface GithubPermissions {
11406
11764
  permissions: 'read_only' | {
11407
11765
  [k: string]: string;
11408
11766
  } | null;
@@ -11417,15 +11775,15 @@ interface AgentConfigGithubPermissions {
11417
11775
  * Skills under a cloned repo's own `.claude/skills/` load by themselves and
11418
11776
  * don't need an entry here.
11419
11777
  */
11420
- interface AgentConfigSkill {
11778
+ interface SkillRef {
11421
11779
  path: string;
11422
- repository: AgentConfigRepository | null;
11780
+ repository: RepositoryRef | null;
11423
11781
  }
11424
- interface AgentConfigCronTrigger {
11782
+ interface CronTrigger {
11425
11783
  schedule: string;
11426
11784
  type: 'cron';
11427
11785
  }
11428
- interface AgentConfigReactTrigger {
11786
+ interface ReactTrigger {
11429
11787
  issue: ReactIssue | null;
11430
11788
  linear_issue: ReactLinearIssue | null;
11431
11789
  pull_request: ReactPullRequest | null;
@@ -11477,40 +11835,6 @@ interface ReactSentry {
11477
11835
  }
11478
11836
  interface ReactSlackChannel {
11479
11837
  }
11480
- interface AgentConfigMentionTrigger {
11481
- platforms: AgentConfigMentionPlatform[];
11482
- type: 'mention';
11483
- }
11484
- /**
11485
- * The principal this session is attributed to.
11486
- */
11487
- interface SessionAttribution {
11488
- /**
11489
- * Identifier of the principal the session is attributed to.
11490
- */
11491
- id: string | null;
11492
- /**
11493
- * Kind of principal the session is attributed to (e.g. a GitHub user or an API key).
11494
- */
11495
- type: AttributionType | null;
11496
- /**
11497
- * The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user.
11498
- */
11499
- user: GithubAccountSnippet | null;
11500
- }
11501
- /**
11502
- * Sometimes the GitHub API returns a user of github (can include bots)
11503
- * using this snippet instead of the full GithubAccount model. One example,
11504
- * is when the API returns a pull request.
11505
- *
11506
- * This is the least amount of info we need to represent a GitHub account.
11507
- */
11508
- interface GithubAccountSnippet {
11509
- avatar_url: string;
11510
- id: number;
11511
- login: string;
11512
- type: GithubAccountType;
11513
- }
11514
11838
  /**
11515
11839
  * The spend budget enforced for this session.
11516
11840
  */
@@ -11521,6 +11845,18 @@ interface SessionBudget {
11521
11845
  cents: number;
11522
11846
  source: BudgetSource;
11523
11847
  }
11848
+ /**
11849
+ * What the session ran on, frozen when it was created: the harness block, the resolved environment, permissions, skills, output contract, and budget.
11850
+ */
11851
+ interface SessionConfig1 {
11852
+ budget: BudgetConfig;
11853
+ claude: ClaudeConfig;
11854
+ codex: CodexConfig | null;
11855
+ environment: string | EnvironmentConfig;
11856
+ output: OutputConfig | null;
11857
+ permissions: PermissionsConfig;
11858
+ skills: SkillRef[];
11859
+ }
11524
11860
  /**
11525
11861
  * What the session cost, in millicents, broken down by leg and carrying its own total.
11526
11862
  */
@@ -11547,7 +11883,7 @@ interface SessionCost {
11547
11883
  total: number;
11548
11884
  }
11549
11885
  /**
11550
- * The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is inside agent.config.environment.
11886
+ * The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is `config.environment`.
11551
11887
  */
11552
11888
  interface SessionEnvironment {
11553
11889
  /**
@@ -12208,9 +12544,13 @@ interface SessionFrame {
12208
12544
  * The session's current state.
12209
12545
  */
12210
12546
  interface Session1 {
12211
- agent: SessionAgent;
12212
12547
  attribution: SessionAttribution;
12548
+ /**
12549
+ * The automation the session was started from, or null for a raw session started with POST /v1/sessions.
12550
+ */
12551
+ automation: SessionAutomation | null;
12213
12552
  budget: SessionBudget;
12553
+ config: SessionConfig1;
12214
12554
  /**
12215
12555
  * The "owner/name" repository context the session was started in, if any.
12216
12556
  */
@@ -12375,4 +12715,4 @@ type ReviewRequester = components['schemas']['ReviewRequester'];
12375
12715
  type ReviewFinding = components['schemas']['ReviewFinding'];
12376
12716
  type Finding = ReviewFinding;
12377
12717
 
12378
- export type { SessionState as $, AgentConfigSource as A, BudgetSource as B, ClaudeSessionRecord as C, DeltaFrame as D, ErrorFrame as E, Finding as F, GithubAccountSnippet as G, Harness as H, SdkUserRecord as I, SendSessionMessageRequest as J, Session as K, LifecycleSessionRecord as L, SessionExitStatus as M, SessionFrame as N, SessionGit as O, ParentKind as P, SessionLiveness as Q, RecordsAppendFrame as R, SdkAssistantRecord as S, SessionMessage as T, SessionMessageResponse as U, SessionMessageStatus as V, SessionPrompting as W, SessionRecord as X, SessionRecordsListResponse as Y, SessionResponse as Z, SessionSource as _, AttributionType as a, SessionStatus as a0, SessionStreamFrame as a1, SessionSurface as a2, SessionsListResponse as a3, SnapshotFrame as a4, StreamFrame as a5, TokensInfo as a6, paths as a7, CodexFileChangeItem as a8, CodexMcpToolCallItem as a9, CodexEvent as b, components as c, CodexItem as d, CodexSessionRecord as e, CreateReviewRequest as f, DoneFrame as g, GithubAccountType as h, HeartbeatFrame as i, PromptBlockedReason as j, ResolvedReviewScope as k, Review as l, ReviewConfiguration as m, ReviewCounters as n, ReviewFinding as o, ReviewRequester as p, ReviewScope as q, ReviewScopeKind as r, ReviewStage as s, ReviewedCommit as t, ReviewsListResponse as u, SdkContentBlock as v, SdkRateLimitRecord as w, SdkRecord as x, SdkResultRecord as y, SdkSystemRecord as z };
12718
+ export type { SessionStatus as $, AttributionType as A, BudgetSource as B, ClaudeSessionRecord as C, DeltaFrame as D, ErrorFrame as E, Finding as F, GithubAccountSnippet as G, Harness as H, SendSessionMessageRequest as I, Session as J, SessionExitStatus as K, LifecycleSessionRecord as L, SessionFrame as M, SessionGit as N, SessionLiveness as O, ParentKind as P, SessionMessage as Q, RecordsAppendFrame as R, SdkAssistantRecord as S, SessionMessageResponse as T, SessionMessageStatus as U, SessionPrompting as V, SessionRecord as W, SessionRecordsListResponse as X, SessionResponse as Y, SessionSource as Z, SessionState as _, CodexEvent as a, SessionStreamFrame as a0, SessionSurface as a1, SessionsListResponse as a2, SnapshotFrame as a3, StreamFrame as a4, TokensInfo as a5, paths as a6, CodexFileChangeItem as a7, CodexMcpToolCallItem as a8, CodexItem as b, components as c, CodexSessionRecord as d, CreateReviewRequest as e, DoneFrame as f, GithubAccountType as g, HeartbeatFrame as h, PromptBlockedReason as i, ResolvedReviewScope as j, Review as k, ReviewConfiguration as l, ReviewCounters as m, ReviewFinding as n, ReviewRequester as o, ReviewScope as p, ReviewScopeKind as q, ReviewStage as r, ReviewedCommit as s, ReviewsListResponse as t, SdkContentBlock as u, SdkRateLimitRecord as v, SdkRecord as w, SdkResultRecord as x, SdkSystemRecord as y, SdkUserRecord as z };