@ellipsis-dev/sdk 0.21.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;
@@ -742,6 +768,33 @@ interface paths {
742
768
  patch?: never;
743
769
  trace?: never;
744
770
  };
771
+ '/v1/models': {
772
+ parameters: {
773
+ query?: never;
774
+ header?: never;
775
+ path?: never;
776
+ cookie?: never;
777
+ };
778
+ /**
779
+ * List Supported Models
780
+ * @description List selectable agent models.
781
+ *
782
+ * Most expensive first, with the platform default flagged.
783
+ *
784
+ * Reads the same registry as the dashboard's rate table, so a
785
+ * client's model picker can never drift from what's offered.
786
+ * Behind auth but not account-scoped — the selectable set is
787
+ * global.
788
+ */
789
+ get: operations['list_supported_models'];
790
+ put?: never;
791
+ post?: never;
792
+ delete?: never;
793
+ options?: never;
794
+ head?: never;
795
+ patch?: never;
796
+ trace?: never;
797
+ };
745
798
  '/v1/reviews': {
746
799
  parameters: {
747
800
  query?: never;
@@ -753,7 +806,9 @@ interface paths {
753
806
  * List Reviews
754
807
  * @description List code reviews, newest first.
755
808
  *
756
- * `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.
757
812
  *
758
813
  * Webhook-created reviews appear here too, so this answers "show
759
814
  * me every review on this PR".
@@ -764,9 +819,10 @@ interface paths {
764
819
  * Create Review
765
820
  * @description Run a code review on demand.
766
821
  *
767
- * Reviews an existing PR or a pushed branch (for a branch, the
768
- * platform finds or creates a draft PR for it, since a code
769
- * 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.
770
826
  *
771
827
  * A review is one pipeline run over one commit range, with one
772
828
  * agent session per stage: `review.id` is the run id, and
@@ -885,7 +941,7 @@ interface paths {
885
941
  * @description Start a cloud agent session.
886
942
  *
887
943
  * The daily driver: a prompt, optionally where to run it
888
- * (`environment`) and the run's own settings, in the AgentConfig
944
+ * (`environment`) and the run's own settings, in the AutomationConfig
889
945
  * vocabulary. Anything omitted comes from the organization's
890
946
  * settings — default model, default environment, budget — so
891
947
  * `{"prompt": "..."}` alone is a complete request. `prompt` is the
@@ -928,6 +984,32 @@ interface paths {
928
984
  patch?: never;
929
985
  trace?: never;
930
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
+ };
931
1013
  '/v1/sessions/{session_id}/export': {
932
1014
  parameters: {
933
1015
  query?: never;
@@ -1159,625 +1241,30 @@ interface paths {
1159
1241
  head?: never;
1160
1242
  patch?: never;
1161
1243
  trace?: never;
1162
- };
1163
- '/v1/usage': {
1164
- parameters: {
1165
- query?: never;
1166
- header?: never;
1167
- path?: never;
1168
- cookie?: never;
1169
- };
1170
- /**
1171
- * Get Usage
1172
- * @description Return the caller's usage dashboard data.
1173
- */
1174
- get: operations['get_usage_endpoint'];
1175
- put?: never;
1176
- post?: never;
1177
- delete?: never;
1178
- options?: never;
1179
- head?: never;
1180
- patch?: never;
1181
- trace?: never;
1182
- };
1183
- }
1184
- interface components {
1185
- schemas: {
1186
- /** AgentConfig */
1187
- AgentConfig: {
1188
- /** @default {} */
1189
- budget: components['schemas']['AgentConfigBudget'];
1190
- /**
1191
- * @default {
1192
- * "system": ""
1193
- * }
1194
- */
1195
- claude: components['schemas']['AgentConfigClaude'];
1196
- codex?: components['schemas']['AgentConfigCodex'] | null;
1197
- /**
1198
- * @default {
1199
- * "enabled": true,
1200
- * "metadata": {
1201
- * "annotations": {},
1202
- * "labels": []
1203
- * },
1204
- * "version": "v1"
1205
- * }
1206
- */
1207
- ellipsis: components['schemas']['AgentConfigEllipsis'];
1208
- /**
1209
- * Environment
1210
- * @default {
1211
- * "compute": {},
1212
- * "hooks": {},
1213
- * "image": {},
1214
- * "mcp_servers": [],
1215
- * "repositories": [],
1216
- * "variables": []
1217
- * }
1218
- */
1219
- environment: string | components['schemas']['AgentConfigEnvironment'];
1220
- input?: components['schemas']['AgentConfigInput'] | null;
1221
- output?: components['schemas']['AgentConfigOutput'] | null;
1222
- /**
1223
- * @default {
1224
- * "ellipsis": true,
1225
- * "github": {}
1226
- * }
1227
- */
1228
- permissions: components['schemas']['AgentConfigPermissions'];
1229
- /**
1230
- * Skills
1231
- * @default []
1232
- */
1233
- skills: components['schemas']['AgentConfigSkill'][];
1234
- /** Trigger */
1235
- trigger?: (components['schemas']['AgentConfigCronTrigger'] | components['schemas']['AgentConfigReactTrigger'] | components['schemas']['AgentConfigMentionTrigger']) | null;
1236
- };
1237
- /** AgentConfigBudget */
1238
- AgentConfigBudget: {
1239
- /** Day */
1240
- day?: number | null;
1241
- /** Month */
1242
- month?: number | null;
1243
- /** Session */
1244
- session?: number | null;
1245
- /** Week */
1246
- week?: number | null;
1247
- };
1248
- /** AgentConfigClaude */
1249
- AgentConfigClaude: {
1250
- effort?: components['schemas']['EffortLevel'] | null;
1251
- /** Fallback Model */
1252
- fallback_model?: string | null;
1253
- /** Max Turns */
1254
- max_turns?: number | null;
1255
- /** Model */
1256
- model?: string | null;
1257
- settings?: components['schemas']['AgentConfigSettingsRef'] | null;
1258
- /**
1259
- * System
1260
- * @default
1261
- */
1262
- system: string | components['schemas']['AgentConfigSystemFileRef'] | (string | components['schemas']['AgentConfigSystemFileRef'])[];
1263
- };
1264
- /**
1265
- * AgentConfigCodex
1266
- * @description The `codex:` block — run this agent on OpenAI's Codex CLI instead of
1267
- * Claude Code. Declaring the block at all is what selects the harness
1268
- * (`AgentConfig.harness`).
1269
- *
1270
- * Deliberately a small subset of `AgentConfigClaude`: the fields omitted here
1271
- * are ones Codex has no equivalent for (`effort`, `fallback_model`,
1272
- * `settings`) or that the platform does not yet wire through for this harness
1273
- * (`max_turns`, `skills`, MCP servers). They are omitted rather than
1274
- * accepted-and-ignored, because `StrictConfigModel` forbids extra keys — so a
1275
- * config that sets one fails loudly at parse time instead of silently not doing
1276
- * it. The budget still bounds a run regardless.
1277
- */
1278
- AgentConfigCodex: {
1279
- /**
1280
- * Model
1281
- * @default gpt-5.6-terra
1282
- */
1283
- model: string;
1284
- /**
1285
- * System
1286
- * @default
1287
- */
1288
- system: string | components['schemas']['AgentConfigSystemFileRef'] | (string | components['schemas']['AgentConfigSystemFileRef'])[];
1289
- };
1290
- /**
1291
- * AgentConfigCompute
1292
- * @description Sandbox compute sizing. Every field is optional; None inherits the
1293
- * platform default (1 vCPU / 4096 MiB / 3600s — see DEFAULT_MODAL_* in
1294
- * models/ellipsis/sandboxes/sandbox.py). A resolved value outside the platform
1295
- * bounds fails validation loudly (a sync error on the config) rather than
1296
- * being clamped silently.
1297
- *
1298
- * `memory` and `timeout` each accept a shorthand string ("8GB", "30m") or an
1299
- * explicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /
1300
- * `timeout_seconds` properties resolve either form to the canonical integer
1301
- * the sandbox driver consumes.
1302
- *
1303
- * `timeout` is the max wall-clock the agent may run before the sandbox is
1304
- * killed, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS — equal to the default, so
1305
- * today the knob only shortens a session; the cap matches the 1-hour validity
1306
- * of the sandbox's GitHub token). The worker's lease/visibility heartbeat
1307
- * ceiling is derived from that cap, so a run at the max stays owned by its
1308
- * worker for its whole life.
1309
- *
1310
- * Compute is billed on the requested allocation over the sandbox's
1311
- * wall-clock lifetime, so a bigger/longer box costs proportionally more.
1312
- */
1313
- AgentConfigCompute: {
1314
- /** Cpu */
1315
- cpu?: number | null;
1316
- /** Memory */
1317
- memory?: string | components['schemas']['AgentConfigMemorySize'] | null;
1318
- /** Timeout */
1319
- timeout?: string | components['schemas']['AgentConfigDuration'] | null;
1320
- };
1321
- /** AgentConfigCronTrigger */
1322
- AgentConfigCronTrigger: {
1323
- /** Schedule */
1324
- schedule: string;
1325
- /**
1326
- * @description discriminator enum property added by openapi-typescript
1327
- * @enum {string}
1328
- */
1329
- type: 'cron';
1330
- };
1331
- /**
1332
- * AgentConfigDuration
1333
- * @description A duration as explicit units, summed. Set any of `hours`/`minutes`/
1334
- * `seconds` (at least one). The alternative to the `30m`-style shorthand
1335
- * string wherever a duration is accepted.
1336
- */
1337
- AgentConfigDuration: {
1338
- /** Hours */
1339
- hours?: number | null;
1340
- /** Minutes */
1341
- minutes?: number | null;
1342
- /** Seconds */
1343
- seconds?: number | null;
1344
- };
1345
- /**
1346
- * AgentConfigEllipsis
1347
- * @description The Ellipsis product namespace for a config file: which schema this is
1348
- * (`version`), the human-facing identity (`name`/`description`), freeform
1349
- * organizational `metadata`, and whether the agent is `enabled`. The
1350
- * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
1351
- * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
1352
- * config directory) — see `yaml_is_ellipsis_config`.
1353
- *
1354
- * `enabled` is agent behavior, not freeform metadata, so it stays inside
1355
- * the config `sha` (only `metadata` is sha-excluded). Whether a session
1356
- * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
1357
- * not a config one.
1358
- */
1359
- AgentConfigEllipsis: {
1360
- /** Description */
1361
- description?: string | null;
1362
- /**
1363
- * Enabled
1364
- * @default true
1365
- */
1366
- enabled: boolean;
1367
- /**
1368
- * @default {
1369
- * "annotations": {},
1370
- * "labels": []
1371
- * }
1372
- */
1373
- metadata: components['schemas']['AgentConfigMetadata'];
1374
- /** Name */
1375
- name?: string | null;
1376
- /**
1377
- * Version
1378
- * @default v1
1379
- */
1380
- version: string;
1381
- };
1382
- /**
1383
- * AgentConfigEllipsisPermissions
1384
- * @description `permissions.ellipsis` as a map: resource → level | grant | list of
1385
- * grants. Levels are hierarchical (read < write < delete), so `write`
1386
- * includes `read`. An unlisted resource is denied. The whole block is
1387
- * intersected with the platform's sandbox ceiling at token mint — it can
1388
- * narrow what a sandbox token may do, never exceed it.
1389
- */
1390
- AgentConfigEllipsisPermissions: {
1391
- [key: string]: components['schemas']['Level'] | components['schemas']['EllipsisGrant'] | (components['schemas']['Level'] | components['schemas']['EllipsisGrant'])[];
1392
- };
1393
- /**
1394
- * AgentConfigEnvironment
1395
- * @description Everything about the environment (the sandbox) the agent runs in: which
1396
- * `repositories` are cloned into it, which environment `variables` it gets,
1397
- * its `compute` sizing, how its `image` is customized, and lifecycle `hooks`.
1398
- * What the agent may *do* from that environment is the top-level
1399
- * `permissions:` block, not this one.
1400
- *
1401
- * Each `variables` entry names a variable to inject; with an inline `value` it
1402
- * is hardcoded, without one it is resolved from the account's sandbox-secrets
1403
- * store. Only the named variables reach this agent; the rest of the account's
1404
- * stored variables never do. This is how a config brings in the config and
1405
- * credentials a custom CLI needs.
1406
- */
1407
- AgentConfigEnvironment: {
1408
- /** @default {} */
1409
- compute: components['schemas']['AgentConfigCompute'];
1410
- /** @default {} */
1411
- hooks: components['schemas']['AgentConfigEnvironmentHooks'];
1412
- /** @default {} */
1413
- image: components['schemas']['AgentConfigEnvironmentImage'];
1414
- /**
1415
- * Mcp Servers
1416
- * @default []
1417
- */
1418
- mcp_servers: (string | components['schemas']['AgentConfigMcpServer'] | components['schemas']['AgentConfigMcpStdioServer'] | components['schemas']['AgentConfigMcpRemoteServer'])[];
1419
- /**
1420
- * Repositories
1421
- * @default []
1422
- */
1423
- repositories: components['schemas']['AgentConfigRepository'][];
1424
- /**
1425
- * Variables
1426
- * @default []
1427
- */
1428
- variables: components['schemas']['AgentConfigEnvironmentVariable'][];
1429
- };
1430
- /**
1431
- * AgentConfigEnvironmentHooks
1432
- * @description Shell scripts run at points in the sandbox lifecycle, each as the sandbox
1433
- * user with the sandbox's environment variables available. A non-zero exit
1434
- * fails the run (exit_status = LIFECYCLE_HOOK_FAILED) and is not retried.
1435
- *
1436
- * `post_start` runs after the container starts, before any repo is cloned —
1437
- * repo-independent setup (authenticate a CLI, e.g. `doppler setup`). On Modal
1438
- * the repo is baked into the image so it is incidentally present, but
1439
- * `post_start` must not depend on repo contents (that's `post_clone`).
1440
- *
1441
- * `post_clone` runs after all repos are cloned/checked out, before the agent —
1442
- * repo-dependent setup (`pip install -r requirements.txt`, codegen).
1443
- *
1444
- * Hooks run on every run and their output is never cached. A dependency
1445
- * install whose result should be reused across runs belongs in `image.setup`
1446
- * (baked into the cached image) instead; keep hooks for per-run work — e.g.
1447
- * anything that touches run-scoped credentials.
1448
- */
1449
- AgentConfigEnvironmentHooks: {
1450
- /** Post Clone */
1451
- post_clone?: string | null;
1452
- /** Post Start */
1453
- post_start?: string | null;
1454
- };
1455
- /**
1456
- * AgentConfigEnvironmentImage
1457
- * @description How to customize the container image the agent runs in. You
1458
- * contribute appended layers (`dockerfile_append`) and a build-time script
1459
- * (`setup`) only — Ellipsis owns FROM / base tooling / entrypoint / user.
1460
- * Today only inline bodies are supported; a file reference (resolved at the
1461
- * run's SHA) will come later.
1462
- *
1463
- * The split: `dockerfile_append` runs when the image is assembled, before any
1464
- * repo exists — toolchain installs (a package manager binary, apt packages).
1465
- * `setup` runs at image-build time *after* the configured repositories are
1466
- * checked out, and its output is captured by the filesystem snapshot that
1467
- * becomes the cached image — dependency installs (`poetry install`,
1468
- * `npm install`), so later runs start with deps already on disk. Neither runs
1469
- * per run; that's `hooks.post_start` / `hooks.post_clone`.
1470
- */
1471
- AgentConfigEnvironmentImage: {
1472
- /** Dockerfile Append */
1473
- dockerfile_append?: string | null;
1474
- /** Setup */
1475
- setup?: string | null;
1476
- };
1477
- /**
1478
- * AgentConfigEnvironmentVariable
1479
- * @description One environment variable injected into the agent's sandbox.
1480
- *
1481
- * `value`, when set, is a literal injected as-is — use it for non-secret
1482
- * config (LOG_LEVEL, an API base URL). When `value` is omitted the value is
1483
- * resolved at run time from the account's sandbox-secrets store (dashboard
1484
- * / `PUT /v1/secrets`) by `name`, so a secret can be injected without
1485
- * ever putting it in the config file. Either way the variable only reaches
1486
- * agents that name it.
1487
- */
1488
- AgentConfigEnvironmentVariable: {
1489
- /** Name */
1490
- name: string;
1491
- /** Value */
1492
- value?: string | null;
1493
- };
1494
- /**
1495
- * AgentConfigGithubPermissions
1496
- * @description The agent's GitHub access: the scope of the installation token minted for
1497
- * its sandbox — the credential `git`, `gh`, and the GitHub MCP server
1498
- * authenticate with.
1499
- *
1500
- * By default the token carries the installation's full permissions on all of
1501
- * the installation's repositories. `permissions` narrows what it may do:
1502
- * the string `read_only` grants read access to contents, issues, metadata and
1503
- * pull requests; a map requests explicit levels per GitHub App permission
1504
- * scope (e.g. `{contents: read, pull_requests: write}`) and may never exceed
1505
- * what the installation granted. `repositories` scopes the token to exactly
1506
- * the listed repos, by name (they must belong to the installation).
1507
- *
1508
- * Restriction is enforced by GitHub, not by Ellipsis: the token itself is
1509
- * minted with the reduced scope, so nothing running in the sandbox can
1510
- * exceed it.
1511
- */
1512
- AgentConfigGithubPermissions: {
1513
- /** Permissions */
1514
- permissions?: 'read_only' | {
1515
- [key: string]: string;
1516
- } | null;
1517
- /** Repositories */
1518
- repositories?: string[] | null;
1519
- };
1520
- /**
1521
- * AgentConfigInput
1522
- * @description The typed input contract: what goes INTO a session (the trigger is
1523
- * when it happens; this is what goes in).
1524
- *
1525
- * `json_schema` types the payload a caller-started session takes
1526
- * (`POST /v1/sessions` `input`, validated at the door; required when
1527
- * declared). It is illegal on a react-triggered agent — react payloads are
1528
- * platform-shaped (the published surface field sets), not caller-shaped.
1529
- *
1530
- * `message` is the initial-message template: exact `{{path}}` substitution
1531
- * over the caller payload (or, on a react agent, over the surface's
1532
- * published fields), no conditionals/loops/filters. Refs are validated at
1533
- * deploy time against the governing field set (see AgentConfig's
1534
- * `_check_input`).
1535
- */
1536
- AgentConfigInput: {
1537
- /** Json Schema */
1538
- json_schema?: {
1539
- [key: string]: unknown;
1540
- } | null;
1541
- /** Message */
1542
- message?: string | null;
1543
- };
1544
- /**
1545
- * AgentConfigMcpRemoteServer
1546
- * @description A bring-your-own remote MCP server: the harness talks HTTP to `url`.
1547
- * Nothing runs in the sandbox image. `headers` carry static auth (e.g.
1548
- * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
1549
- * references, resolved at run time from the account's secrets store.
1550
- */
1551
- AgentConfigMcpRemoteServer: {
1552
- /**
1553
- * Headers
1554
- * @default {}
1555
- */
1556
- headers: {
1557
- [key: string]: string;
1558
- };
1559
- /** Name */
1560
- name: string;
1561
- /** Url */
1562
- url: string;
1563
- };
1564
- /**
1565
- * AgentConfigMcpServer
1566
- * @description One built-in MCP server this agent opts into by name (`linear`/`slack`).
1567
- * A name reference over the connected built-in set — the platform manages the
1568
- * server's transport and credentials. It only matters when the named
1569
- * integration is set to `opt_in` inclusion; an integration in the default
1570
- * `all_sessions` mode is added regardless. For a server the platform does not
1571
- * provide, define it instead (`AgentConfigMcpStdioServer` /
1572
- * `AgentConfigMcpRemoteServer`).
1573
- */
1574
- AgentConfigMcpServer: {
1575
- /** Name */
1576
- name: string;
1577
- };
1578
- /**
1579
- * AgentConfigMcpStdioServer
1580
- * @description A bring-your-own stdio MCP server: the harness spawns `command` inside
1581
- * the sandbox and speaks JSON-RPC over its stdin/stdout. The command must be
1582
- * runnable in the sandbox image — install its runtime via `image.setup` /
1583
- * `image.dockerfile_append` if the base image lacks it.
1584
- *
1585
- * `env` values may embed `${NAME}` references, resolved at run time from the
1586
- * account's secrets store (see `mcp_secret_refs`); everything else is passed
1587
- * literally.
1588
- */
1589
- AgentConfigMcpStdioServer: {
1590
- /**
1591
- * Args
1592
- * @default []
1593
- */
1594
- args: string[];
1595
- /** Command */
1596
- command: string;
1597
- /**
1598
- * Env
1599
- * @default {}
1600
- */
1601
- env: {
1602
- [key: string]: string;
1603
- };
1604
- /** Name */
1605
- name: string;
1606
- };
1607
- /**
1608
- * AgentConfigMemorySize
1609
- * @description A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
1610
- * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
1611
- * shorthand string.
1612
- */
1613
- AgentConfigMemorySize: {
1614
- /** Gb */
1615
- gb?: number | null;
1616
- /** Mb */
1617
- mb?: number | null;
1618
- };
1619
- /**
1620
- * AgentConfigMentionPlatform
1621
- * @description The surface an @ellipsis mention can come from.
1622
- *
1623
- * No SLACK member: Slack routing is not a trigger on an agent config, it is the
1624
- * `slack.yaml` routing file (`SlackConfig`), which answers the questions a
1625
- * platform list cannot — which channel, and whose DM. A mention trigger listing
1626
- * `slack` is therefore a config error, not a silently-never-fires config.
1627
- * @enum {string}
1628
- */
1629
- AgentConfigMentionPlatform: 'github' | 'linear';
1630
- /** AgentConfigMentionTrigger */
1631
- AgentConfigMentionTrigger: {
1632
- /**
1633
- * Platforms
1634
- * @default []
1635
- */
1636
- platforms: components['schemas']['AgentConfigMentionPlatform'][];
1637
- /**
1638
- * @description discriminator enum property added by openapi-typescript
1639
- * @enum {string}
1640
- */
1641
- type: 'mention';
1642
- };
1643
- /** AgentConfigMetadata */
1644
- AgentConfigMetadata: {
1645
- /**
1646
- * Annotations
1647
- * @default {}
1648
- */
1649
- annotations: {
1650
- [key: string]: string;
1651
- };
1652
- /**
1653
- * Labels
1654
- * @default []
1655
- */
1656
- labels: string[];
1657
- };
1658
- /**
1659
- * AgentConfigOutput
1660
- * @description The typed output contract: the JSON Schema the agent must exit through
1661
- * (the StructuredOutput exit tool). Read back via
1662
- * GET /v1/sessions/{id}/output.
1663
- */
1664
- AgentConfigOutput: {
1665
- /** Json Schema */
1666
- json_schema: {
1667
- [key: string]: unknown;
1668
- };
1669
- };
1670
- /**
1671
- * AgentConfigPermissions
1672
- * @description What the agent is allowed to touch, per credential the platform mints
1673
- * into its sandbox. Distinct from `environment:`, which is where the agent
1674
- * runs; this is what it may do from there.
1675
- *
1676
- * `ellipsis` scopes the sandbox's Ellipsis API token
1677
- * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
1678
- * with). `true` / the string `all` (the default) grant the full sandbox
1679
- * ceiling — everything a sandbox token can ever do. A map narrows it per
1680
- * resource (see `AgentConfigEllipsisPermissions`); the minted token carries
1681
- * the intersection, so a config can only ever reduce access. `false` fails
1682
- * validation — an agent with no API token cannot report its own progress.
1683
- *
1684
- * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
1685
- * see `AgentConfigGithubPermissions`. GitHub enforces it at mint time.
1686
- */
1687
- AgentConfigPermissions: {
1688
- /**
1689
- * Ellipsis
1690
- * @default true
1691
- */
1692
- ellipsis: (true | 'all') | components['schemas']['AgentConfigEllipsisPermissions'];
1693
- /** @default {} */
1694
- github: components['schemas']['AgentConfigGithubPermissions'];
1695
- };
1696
- /** AgentConfigReactTrigger */
1697
- AgentConfigReactTrigger: {
1698
- issue?: components['schemas']['ReactIssue'] | null;
1699
- linear_issue?: components['schemas']['ReactLinearIssue'] | null;
1700
- pull_request?: components['schemas']['ReactPullRequest'] | null;
1701
- push?: components['schemas']['ReactPush'] | null;
1702
- sentry?: components['schemas']['ReactSentry'] | null;
1703
- slack_channel?: components['schemas']['ReactSlackChannel'] | null;
1704
- /**
1705
- * @description discriminator enum property added by openapi-typescript
1706
- * @enum {string}
1707
- */
1708
- type: 'react';
1709
- };
1710
- /** AgentConfigRepository */
1711
- AgentConfigRepository: {
1712
- /** Name */
1713
- name: string;
1714
- /** Owner */
1715
- owner?: string | null;
1716
- /** Ref */
1717
- ref?: string | null;
1718
- };
1719
- /**
1720
- * AgentConfigSettingsRef
1721
- * @description A config-declared Claude Code settings.json, resolved at run start and
1722
- * passed to `claude --settings <path>`. That is the CLI settings tier — BELOW
1723
- * Ellipsis's managed-settings.json floor — so it customizes behavior (model
1724
- * permissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a
1725
- * security setting. Lets a team point the cloud agent at the same settings file
1726
- * they already use with Claude Code locally instead of re-encoding it as YAML.
1727
- */
1728
- AgentConfigSettingsRef: {
1729
- /** Path */
1730
- path: string;
1731
- repository?: components['schemas']['AgentConfigRepository'] | null;
1732
- };
1733
- /**
1734
- * AgentConfigSkill
1735
- * @description One config-declared Claude Code skill: a repository directory containing
1736
- * a SKILL.md, resolved at run start and installed at the sandbox's personal
1737
- * skill level (`~/.claude/skills/<basename(path)>/`). This is how a config
1738
- * brings in skills its cloned repositories don't provide — cross-repo refs
1739
- * (an org-wide skills repo), public third-party repos, and repo-less runs.
1740
- * Skills under a cloned repo's own `.claude/skills/` load by themselves and
1741
- * don't need an entry here.
1742
- */
1743
- AgentConfigSkill: {
1744
- /** Path */
1745
- path: string;
1746
- repository?: components['schemas']['AgentConfigRepository'] | null;
1747
- };
1748
- /**
1749
- * AgentConfigSource
1750
- * @description Where a session's config came from. Total: every session has exactly one
1751
- * source, including the ones that never touch defaults resolution.
1752
- *
1753
- * Not derivable from the row — `agent_config_id` says WHICH saved config, not
1754
- * how it was chosen, and is null for inline, platform-default, and built-in
1755
- * configs alike — so it is persisted for audit and the published wire.
1756
- * @enum {string}
1757
- */
1758
- AgentConfigSource: 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
1759
- /**
1760
- * AgentConfigSourceGithub
1761
- * @description Identifies the file a GitHub-sourced agent config is synced from.
1762
- *
1763
- * Keyed on the repository ID (not owner/name) so repository and org renames
1764
- * don't orphan the config; resolve display names from gh_repositories at
1765
- * read time.
1766
- */
1767
- AgentConfigSourceGithub: {
1768
- /** Branch */
1769
- branch: string;
1770
- /** Path */
1771
- path: string;
1772
- /** Repo Id */
1773
- repo_id: number;
1774
- };
1775
- /** AgentConfigSystemFileRef */
1776
- AgentConfigSystemFileRef: {
1777
- /** File */
1778
- file: string;
1779
- repository?: components['schemas']['AgentConfigRepository'] | null;
1244
+ };
1245
+ '/v1/usage': {
1246
+ parameters: {
1247
+ query?: never;
1248
+ header?: never;
1249
+ path?: never;
1250
+ cookie?: never;
1780
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: {
1781
1268
  /**
1782
1269
  * AgentTemplate
1783
1270
  * @description A built-in agent template: a ready-to-use agent config plus the
@@ -2177,10 +1664,8 @@ interface components {
2177
1664
  * when invoked, plus where it syncs from and the state of that sync.
2178
1665
  */
2179
1666
  Automation: {
2180
- /** @description The agent definition itself, in the same schema as a YAML file under agents/. */
2181
- agent_config: components['schemas']['AgentConfig'];
2182
- /** @description The repository, path, and branch the automation syncs from. Null only transiently, before the creating pull request's file lands on the branch. */
2183
- 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'];
2184
1669
  /**
2185
1670
  * Created At
2186
1671
  * Format: date-time
@@ -2236,6 +1721,8 @@ interface components {
2236
1721
  * @description The definition's content identity: the version fingerprint frozen onto each session that runs it.
2237
1722
  */
2238
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;
2239
1726
  /**
2240
1727
  * Updated At
2241
1728
  * Format: date-time
@@ -2243,6 +1730,104 @@ interface components {
2243
1730
  */
2244
1731
  updated_at: string;
2245
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
+ };
2246
1831
  /**
2247
1832
  * AutomationResponse
2248
1833
  * @description One automation.
@@ -2251,6 +1836,54 @@ interface components {
2251
1836
  /** @description The automation. */
2252
1837
  automation: components['schemas']['Automation'];
2253
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
+ };
2254
1887
  /**
2255
1888
  * AutomationsListResponse
2256
1889
  * @description The caller's automations.
@@ -2273,6 +1906,17 @@ interface components {
2273
1906
  */
2274
1907
  session?: number | null;
2275
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
+ };
2276
1920
  /**
2277
1921
  * BudgetSource
2278
1922
  * @description Which layer actually determined the enforced budget.
@@ -2337,6 +1981,22 @@ interface components {
2337
1981
  */
2338
1982
  start: string | null;
2339
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
+ };
2340
2000
  /**
2341
2001
  * ClaudeSessionRecord
2342
2002
  * @description A native transcript record of a Claude session (source=claude_code).
@@ -2479,6 +2139,32 @@ interface components {
2479
2139
  } & {
2480
2140
  [key: string]: unknown;
2481
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
+ };
2482
2168
  /** CodexErrorEvent */
2483
2169
  CodexErrorEvent: {
2484
2170
  /** Message */
@@ -2825,6 +2511,37 @@ interface components {
2825
2511
  } & {
2826
2512
  [key: string]: unknown;
2827
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
+ };
2828
2545
  /**
2829
2546
  * ConfigManagedBy
2830
2547
  * @description Which writer owns an agent: the repository file it is defined in, or
@@ -2833,6 +2550,21 @@ interface components {
2833
2550
  * @enum {string}
2834
2551
  */
2835
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[];
2567
+ };
2836
2568
  /**
2837
2569
  * ContributorUsage
2838
2570
  * @description An author who merged a pull request in the window. The pull-request and
@@ -2882,7 +2614,7 @@ interface components {
2882
2614
  */
2883
2615
  CreateAutomationRequest: {
2884
2616
  /** @description The automation's definition, in the same schema as a YAML file under agents/. */
2885
- automation: components['schemas']['AgentConfig'];
2617
+ automation: components['schemas']['AutomationConfig'];
2886
2618
  };
2887
2619
  /**
2888
2620
  * CreateEnvironmentRequest
@@ -2890,7 +2622,7 @@ interface components {
2890
2622
  */
2891
2623
  CreateEnvironmentRequest: {
2892
2624
  /** @description The environment's definition. */
2893
- environment: components['schemas']['EnvironmentConfig'];
2625
+ environment: components['schemas']['EnvironmentDocument'];
2894
2626
  };
2895
2627
  /**
2896
2628
  * CreateFileRequest
@@ -2986,6 +2718,30 @@ interface components {
2986
2718
  */
2987
2719
  scope: components['schemas']['ReviewScope'];
2988
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
+ };
2989
2745
  /**
2990
2746
  * DurationPercentiles
2991
2747
  * @description Percentiles of a duration distribution, in hours. p0 = fastest,
@@ -3056,6 +2812,17 @@ interface components {
3056
2812
  /** Match */
3057
2813
  match?: string[] | null;
3058
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
+ };
3059
2826
  /**
3060
2827
  * Environment
3061
2828
  * @description A saved environment: the machine agents run in (repositories,
@@ -3072,7 +2839,7 @@ interface components {
3072
2839
  /** @description The GitHub account that last edited the environment, when known. */
3073
2840
  edited_by?: components['schemas']['GithubAccountSnippet'] | null;
3074
2841
  /** @description The environment definition itself, as parsed from its YAML. */
3075
- environment: components['schemas']['EnvironmentConfig'];
2842
+ environment: components['schemas']['EnvironmentDocument'];
3076
2843
  /**
3077
2844
  * Id
3078
2845
  * @description Unique identifier of the environment.
@@ -3094,23 +2861,60 @@ interface components {
3094
2861
  * Name
3095
2862
  * @description The environment's customer-unique addressable name; usable anywhere an environment is referenced, interchangeably with the id.
3096
2863
  */
3097
- name: string;
2864
+ name: string;
2865
+ /**
2866
+ * Sha
2867
+ * @description The environment's content identity fingerprint.
2868
+ */
2869
+ sha: string;
2870
+ /** @description The repository, path, and branch the environment syncs from. Null for environments managed through the API. */
2871
+ source_details?: components['schemas']['GithubSourceDetails'] | null;
2872
+ /**
2873
+ * Updated At
2874
+ * Format: date-time
2875
+ * @description When the environment was last updated.
2876
+ */
2877
+ updated_at: string;
2878
+ };
2879
+ /**
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'])[];
3098
2905
  /**
3099
- * Sha
3100
- * @description The environment's content identity fingerprint.
2906
+ * Repositories
2907
+ * @default []
3101
2908
  */
3102
- sha: string;
3103
- /** @description The repository, path, and branch the environment syncs from. Null for environments managed through the API. */
3104
- source_details?: components['schemas']['AgentConfigSourceGithub'] | null;
2909
+ repositories: components['schemas']['RepositoryRef'][];
3105
2910
  /**
3106
- * Updated At
3107
- * Format: date-time
3108
- * @description When the environment was last updated.
2911
+ * Variables
2912
+ * @default []
3109
2913
  */
3110
- updated_at: string;
2914
+ variables: components['schemas']['EnvironmentVariable'][];
3111
2915
  };
3112
2916
  /**
3113
- * EnvironmentConfig
2917
+ * EnvironmentDocument
3114
2918
  * @description A parsed environment document: identity plus the environment body.
3115
2919
  *
3116
2920
  * The body fields are flattened to the top level of the file (not nested
@@ -3118,38 +2922,63 @@ interface components {
3118
2922
  * would be ceremony. `to_environment()` projects the body for substitution
3119
2923
  * into an agent config.
3120
2924
  */
3121
- EnvironmentConfig: {
2925
+ EnvironmentDocument: {
3122
2926
  /** @default {} */
3123
- compute: components['schemas']['AgentConfigCompute'];
3124
- ellipsis: components['schemas']['EnvironmentConfigEllipsis'];
2927
+ compute: components['schemas']['ComputeConfig'];
2928
+ ellipsis: components['schemas']['EnvironmentIdentity'];
3125
2929
  /** @default {} */
3126
- hooks: components['schemas']['AgentConfigEnvironmentHooks'];
2930
+ hooks: components['schemas']['EnvironmentHooks'];
3127
2931
  /** @default {} */
3128
- image: components['schemas']['AgentConfigEnvironmentImage'];
2932
+ image: components['schemas']['EnvironmentImage'];
3129
2933
  /**
3130
2934
  * Mcp Servers
3131
2935
  * @default []
3132
2936
  */
3133
- 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'])[];
3134
2938
  /**
3135
2939
  * Repositories
3136
2940
  * @default []
3137
2941
  */
3138
- repositories: components['schemas']['AgentConfigRepository'][];
2942
+ repositories: components['schemas']['RepositoryRef'][];
3139
2943
  /**
3140
2944
  * Variables
3141
2945
  * @default []
3142
2946
  */
3143
- 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;
3144
2973
  };
3145
2974
  /**
3146
- * EnvironmentConfigEllipsis
2975
+ * EnvironmentIdentity
3147
2976
  * @description The Ellipsis namespace of an environment file. `kind: environment` is
3148
2977
  * what routes a synced YAML here instead of to the agent-config parser —
3149
2978
  * an agent config carries no `kind` (or `kind: agent`, tolerated nowhere:
3150
2979
  * absence is the agent marker).
3151
2980
  */
3152
- EnvironmentConfigEllipsis: {
2981
+ EnvironmentIdentity: {
3153
2982
  /** Description */
3154
2983
  description?: string | null;
3155
2984
  /**
@@ -3163,10 +2992,32 @@ interface components {
3163
2992
  * "labels": []
3164
2993
  * }
3165
2994
  */
3166
- metadata: components['schemas']['AgentConfigMetadata'];
2995
+ metadata: components['schemas']['ConfigMetadata'];
3167
2996
  /** Name */
3168
2997
  name?: string | null;
3169
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
+ };
3170
3021
  /**
3171
3022
  * EnvironmentResponse
3172
3023
  * @description One saved environment.
@@ -3186,6 +3037,23 @@ interface components {
3186
3037
  * @enum {string}
3187
3038
  */
3188
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
+ };
3189
3057
  /**
3190
3058
  * EnvironmentsListResponse
3191
3059
  * @description The caller's saved environments.
@@ -3636,6 +3504,32 @@ interface components {
3636
3504
  */
3637
3505
  members: components['schemas']['GithubMember'][];
3638
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
+ };
3639
3533
  /**
3640
3534
  * GithubRepositoriesListResponse
3641
3535
  * @description The repositories connected to the account's GitHub installation.
@@ -3685,6 +3579,22 @@ interface components {
3685
3579
  */
3686
3580
  private: boolean;
3687
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
+ };
3688
3598
  /**
3689
3599
  * GithubUser
3690
3600
  * @description This is a full user account. It's the most amount of info we need to represent a GitHub user.
@@ -3806,6 +3716,30 @@ interface components {
3806
3716
  */
3807
3717
  offset: number;
3808
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
+ };
3809
3743
  /**
3810
3744
  * IssueAction
3811
3745
  * @enum {string}
@@ -4043,6 +3977,69 @@ interface components {
4043
3977
  */
4044
3978
  slack_user_id: string;
4045
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
+ };
4046
4043
  /**
4047
4044
  * MemoriesListResponse
4048
4045
  * @description The organization's memories: the rendered index a reader scans, plus the
@@ -4133,6 +4130,18 @@ interface components {
4133
4130
  /** @description The memory. */
4134
4131
  memory: components['schemas']['Memory'];
4135
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
+ };
4136
4145
  /**
4137
4146
  * MemorySummary
4138
4147
  * @description One entry in the index: a memory with every field except `content`.
@@ -4179,6 +4188,50 @@ interface components {
4179
4188
  /** @description The credential that last wrote the memory. */
4180
4189
  updated_by: components['schemas']['MemoryActor'];
4181
4190
  };
4191
+ /** Model */
4192
+ Model: {
4193
+ /** Display Name */
4194
+ display_name: string;
4195
+ /** Id */
4196
+ id: string;
4197
+ /** Is Default Agent Model */
4198
+ is_default_agent_model: boolean;
4199
+ manufacturer: components['schemas']['ModelManufacturer'];
4200
+ rate_card: components['schemas']['ModelRateCardApi'];
4201
+ };
4202
+ /**
4203
+ * ModelManufacturer
4204
+ * @description Who BUILT a model. Never who serves it.
4205
+ *
4206
+ * Serving path is irrelevant here. Anthropic built every Claude model, so all of
4207
+ * them are ANTHROPIC even though OpenRouter is what actually serves them.
4208
+ * Likewise the `gpt-5.6-*` rows are OPENAI (OpenAI's models, resold to us by
4209
+ * OpenRouter), and GLM is ZAI (Z.ai's model, served by DeepInfra via
4210
+ * OpenRouter).
4211
+ *
4212
+ * So this is deliberately NOT derived from `EgressRoute.provider`: routing is an
4213
+ * infrastructure fact that changes when we move a model between providers, while
4214
+ * the manufacturer is a property of the model itself and never changes.
4215
+ *
4216
+ * The frontend renders a vendor logo per model, which is why it needs the maker.
4217
+ * Keying that UI off the egress provider would put an AWS logo on a GPT model and
4218
+ * an OpenAI logo on GLM.
4219
+ * @enum {string}
4220
+ */
4221
+ ModelManufacturer: 'anthropic' | 'openai' | 'zai' | 'minimax' | 'moonshot';
4222
+ /** ModelRateCardApi */
4223
+ ModelRateCardApi: {
4224
+ /** Cache Read Millicents Per 1M Tokens */
4225
+ cache_read_millicents_per_1m_tokens: number;
4226
+ /** Cache Write 1H Millicents Per 1M Tokens */
4227
+ cache_write_1h_millicents_per_1m_tokens: number;
4228
+ /** Cache Write 5M Millicents Per 1M Tokens */
4229
+ cache_write_5m_millicents_per_1m_tokens: number;
4230
+ /** Input Millicents Per 1M Tokens */
4231
+ input_millicents_per_1m_tokens: number;
4232
+ /** Output Millicents Per 1M Tokens */
4233
+ output_millicents_per_1m_tokens: number;
4234
+ };
4182
4235
  /**
4183
4236
  * ModelUsageBreakdown
4184
4237
  * @description Usage and cost for one model over the whole period, split into the four
@@ -4216,6 +4269,11 @@ interface components {
4216
4269
  */
4217
4270
  tokens: number;
4218
4271
  };
4272
+ /** ModelsListResponse */
4273
+ ModelsListResponse: {
4274
+ /** Models */
4275
+ models: components['schemas']['Model'][];
4276
+ };
4219
4277
  /**
4220
4278
  * OrganizationRole
4221
4279
  * @enum {string}
@@ -4240,6 +4298,18 @@ interface components {
4240
4298
  */
4241
4299
  default_model?: string | null;
4242
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
+ };
4243
4313
  /**
4244
4314
  * ParentKind
4245
4315
  * @description How a session relates to its predecessor (parent_agent_session_id) —
@@ -4253,6 +4323,32 @@ interface components {
4253
4323
  * @enum {string}
4254
4324
  */
4255
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
+ };
4256
4352
  /**
4257
4353
  * PollCliAuthResponse
4258
4354
  * @description The state of a device-code flow. Poll until `status` leaves `pending`.
@@ -4571,6 +4667,20 @@ interface components {
4571
4667
  };
4572
4668
  /** ReactSlackChannel */
4573
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
+ };
4574
4684
  /**
4575
4685
  * RecentPullRequest
4576
4686
  * @description One pull request in the recent-activity table.
@@ -4695,6 +4805,15 @@ interface components {
4695
4805
  */
4696
4806
  include: string[];
4697
4807
  } | string[];
4808
+ /** RepositoryRef */
4809
+ RepositoryRef: {
4810
+ /** Name */
4811
+ name: string;
4812
+ /** Owner */
4813
+ owner?: string | null;
4814
+ /** Ref */
4815
+ ref?: string | null;
4816
+ };
4698
4817
  /**
4699
4818
  * RepositorySelection
4700
4819
  * @enum {string}
@@ -5226,17 +5345,60 @@ interface components {
5226
5345
  * @description The pull request a review ran on.
5227
5346
  */
5228
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;
5229
5360
  /**
5230
5361
  * Number
5231
5362
  * @description The pull request number.
5232
5363
  */
5233
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;
5234
5370
  /**
5235
5371
  * Url
5236
5372
  * @description The pull request's URL on GitHub.
5237
5373
  */
5238
5374
  url: string;
5239
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
+ };
5240
5402
  /**
5241
5403
  * ReviewRepoFacet
5242
5404
  * @description A repository filter option for the reviews view.
@@ -5925,12 +6087,14 @@ interface components {
5925
6087
  * disagree about what a session looks like.
5926
6088
  */
5927
6089
  Session: {
5928
- /** @description The agent that ran: the config the session executed, where that config came from, and any override merged into it. */
5929
- agent: components['schemas']['SessionAgent'];
5930
6090
  /** @description The principal this session is attributed to. */
5931
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;
5932
6094
  /** @description The spend budget enforced for this session. */
5933
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'];
5934
6098
  /**
5935
6099
  * Context Repository
5936
6100
  * @description The "owner/name" repository context the session was started in, if any.
@@ -5944,7 +6108,7 @@ interface components {
5944
6108
  * @description When the session was created.
5945
6109
  */
5946
6110
  created_at: string;
5947
- /** @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`. */
5948
6112
  environment?: components['schemas']['SessionEnvironment'];
5949
6113
  /** @description How the session ended; null until it is terminal. */
5950
6114
  exit_status?: components['schemas']['SessionExitStatus'] | null;
@@ -6010,35 +6174,6 @@ interface components {
6010
6174
  */
6011
6175
  updated_at: string;
6012
6176
  };
6013
- /**
6014
- * SessionAgent
6015
- * @description The agent this session ran: the definition it actually executed, where
6016
- * that definition came from, and the diff that was merged in — the same
6017
- * effective-value-plus-provenance shape `SessionBudget` uses.
6018
- *
6019
- * `config` is the snapshot frozen when the session was created;
6020
- * `automation_id` points at the automation as it exists NOW. They diverge
6021
- * legitimately: a YAML edit after the session started, or any `override`,
6022
- * leaves the pointer describing something the session never ran.
6023
- */
6024
- SessionAgent: {
6025
- /**
6026
- * Automation Id
6027
- * @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.
6028
- */
6029
- automation_id?: string | null;
6030
- /** @description The agent definition the session actually ran, frozen when the session was created. */
6031
- config: components['schemas']['AgentConfig'];
6032
- /**
6033
- * Override
6034
- * @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.
6035
- */
6036
- override?: {
6037
- [key: string]: unknown;
6038
- } | null;
6039
- /** @description How this session's config was chosen. */
6040
- source: components['schemas']['AgentConfigSource'];
6041
- };
6042
6177
  /**
6043
6178
  * SessionAttribution
6044
6179
  * @description The principal a session is attributed to: what kind, its id, and — when
@@ -6055,6 +6190,22 @@ interface components {
6055
6190
  /** @description The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user. */
6056
6191
  user?: components['schemas']['GithubAccountSnippet'] | null;
6057
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
+ };
6058
6209
  /**
6059
6210
  * SessionBudget
6060
6211
  * @description The spend budget actually enforced for this session, and which layer of
@@ -6073,6 +6224,56 @@ interface components {
6073
6224
  */
6074
6225
  source: components['schemas']['BudgetSource'];
6075
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
+ };
6076
6277
  /**
6077
6278
  * SessionCost
6078
6279
  * @description What a session (or one turn of it) cost, in millicents.
@@ -6113,11 +6314,27 @@ interface components {
6113
6314
  */
6114
6315
  total: number;
6115
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
+ };
6116
6333
  /**
6117
6334
  * SessionEnvironment
6118
6335
  * @description The environment this session resolved: which saved environment (as it
6119
6336
  * exists now) and how it was chosen. The environment's frozen BODY rides
6120
- * inside `agent.config.environment` — substitution happens before the config
6337
+ * inside `config.environment` — substitution happens before the config
6121
6338
  * snapshot freezes — so this object is provenance, not payload.
6122
6339
  */
6123
6340
  SessionEnvironment: {
@@ -6187,6 +6404,28 @@ interface components {
6187
6404
  /** Status */
6188
6405
  status: string;
6189
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
+ };
6190
6429
  /**
6191
6430
  * SessionGitPr
6192
6431
  * @description A pull request the session opened in this repo, written the moment the
@@ -6572,6 +6811,35 @@ interface components {
6572
6811
  */
6573
6812
  sessions: components['schemas']['Session'][];
6574
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
+ };
6575
6843
  /**
6576
6844
  * SlackChannel
6577
6845
  * @description One channel in the connected Slack workspace.
@@ -6699,7 +6967,7 @@ interface components {
6699
6967
  /**
6700
6968
  * StartAgentSessionRequest
6701
6969
  * @description Parameters for starting a raw session: where it runs, its first
6702
- * 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
6703
6971
  * — a `claude:` or `permissions:` block copied from an agents/ YAML file
6704
6972
  * pastes in verbatim. There is no automation behind a raw session; to run a
6705
6973
  * saved automation, invoke it with POST /v1/automations/{automation_id}/sessions.
@@ -6715,14 +6983,14 @@ interface components {
6715
6983
  */
6716
6984
  budget?: number | null;
6717
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. */
6718
- claude?: components['schemas']['AgentConfigClaude'] | null;
6986
+ claude?: components['schemas']['ClaudeConfig'] | null;
6719
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`. */
6720
- codex?: components['schemas']['AgentConfigCodex'] | null;
6988
+ codex?: components['schemas']['CodexConfig'] | null;
6721
6989
  /**
6722
6990
  * Environment
6723
- * @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.
6724
6992
  */
6725
- environment?: string | components['schemas']['AgentConfigEnvironment'] | null;
6993
+ environment?: string | components['schemas']['EnvironmentConfig'] | null;
6726
6994
  /**
6727
6995
  * Force Rebuild
6728
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`.
@@ -6744,19 +7012,24 @@ interface components {
6744
7012
  [key: string]: string;
6745
7013
  };
6746
7014
  /** @description The structured-output exit contract for this session. */
6747
- output?: components['schemas']['AgentConfigOutput'] | null;
7015
+ output?: components['schemas']['OutputConfig'] | null;
6748
7016
  /** @description What the session may touch, per minted credential. */
6749
- permissions?: components['schemas']['AgentConfigPermissions'] | null;
7017
+ permissions?: components['schemas']['PermissionsConfig'] | null;
6750
7018
  /**
6751
7019
  * Prompt
6752
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.
6753
7021
  */
6754
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;
6755
7028
  /**
6756
7029
  * Skills
6757
7030
  * @description Skills installed for this session.
6758
7031
  */
6759
- skills?: components['schemas']['AgentConfigSkill'][] | null;
7032
+ skills?: components['schemas']['SkillRef'][] | null;
6760
7033
  };
6761
7034
  /**
6762
7035
  * StartAutomationSessionRequest
@@ -6825,6 +7098,12 @@ interface components {
6825
7098
  */
6826
7099
  verification_uri_complete: string;
6827
7100
  };
7101
+ /** SystemFileRef */
7102
+ SystemFileRef: {
7103
+ /** File */
7104
+ file: string;
7105
+ repository?: components['schemas']['RepositoryRef'] | null;
7106
+ };
6828
7107
  /**
6829
7108
  * TokensInfo
6830
7109
  * @description Token/cost usage, per record (one API call's counts, aggregate fields at
@@ -6887,7 +7166,7 @@ interface components {
6887
7166
  */
6888
7167
  UpdateAutomationRequest: {
6889
7168
  /** @description The automation's new definition. Replaces the previous one wholesale — this is not a partial update. */
6890
- automation: components['schemas']['AgentConfig'];
7169
+ automation: components['schemas']['AutomationConfig'];
6891
7170
  };
6892
7171
  /**
6893
7172
  * UpdateEnvironmentRequest
@@ -6895,7 +7174,7 @@ interface components {
6895
7174
  */
6896
7175
  UpdateEnvironmentRequest: {
6897
7176
  /** @description The environment's new definition. Replaces the previous one wholesale — this is not a partial update. */
6898
- environment: components['schemas']['EnvironmentConfig'];
7177
+ environment: components['schemas']['EnvironmentDocument'];
6899
7178
  };
6900
7179
  /**
6901
7180
  * UsageDailyPoint
@@ -7915,6 +8194,66 @@ interface operations {
7915
8194
  };
7916
8195
  };
7917
8196
  };
8197
+ get_automation_metrics: {
8198
+ parameters: {
8199
+ query?: never;
8200
+ header?: {
8201
+ 'user-agent'?: string | null;
8202
+ };
8203
+ path: {
8204
+ automation_id: string;
8205
+ };
8206
+ cookie?: never;
8207
+ };
8208
+ requestBody?: never;
8209
+ responses: {
8210
+ /** @description Successful Response */
8211
+ 200: {
8212
+ headers: {
8213
+ [name: string]: unknown;
8214
+ };
8215
+ content: {
8216
+ 'application/json': components['schemas']['AutomationMetricsResponse'];
8217
+ };
8218
+ };
8219
+ /** @description The bearer token is missing, invalid, or revoked. */
8220
+ 401: {
8221
+ headers: {
8222
+ [name: string]: unknown;
8223
+ };
8224
+ content: {
8225
+ 'application/json': components['schemas']['ErrorResponse'];
8226
+ };
8227
+ };
8228
+ /** @description The credential may not perform this action, or the account is blocked. */
8229
+ 403: {
8230
+ headers: {
8231
+ [name: string]: unknown;
8232
+ };
8233
+ content: {
8234
+ 'application/json': components['schemas']['ErrorResponse'];
8235
+ };
8236
+ };
8237
+ /** @description No such automation in your account. */
8238
+ 404: {
8239
+ headers: {
8240
+ [name: string]: unknown;
8241
+ };
8242
+ content: {
8243
+ 'application/json': components['schemas']['ErrorResponse'];
8244
+ };
8245
+ };
8246
+ /** @description Validation Error */
8247
+ 422: {
8248
+ headers: {
8249
+ [name: string]: unknown;
8250
+ };
8251
+ content: {
8252
+ 'application/json': components['schemas']['HTTPValidationError'];
8253
+ };
8254
+ };
8255
+ };
8256
+ };
7918
8257
  start_automation_session: {
7919
8258
  parameters: {
7920
8259
  query?: never;
@@ -9338,33 +9677,100 @@ interface operations {
9338
9677
  [name: string]: unknown;
9339
9678
  };
9340
9679
  content: {
9341
- 'application/json': components['schemas']['ErrorResponse'];
9680
+ 'application/json': components['schemas']['ErrorResponse'];
9681
+ };
9682
+ };
9683
+ };
9684
+ };
9685
+ delete_memory: {
9686
+ parameters: {
9687
+ query?: {
9688
+ /** @description Only delete if the memory's current content_sha256 matches. */
9689
+ if_sha256?: string | null;
9690
+ };
9691
+ header?: {
9692
+ 'user-agent'?: string | null;
9693
+ };
9694
+ path: {
9695
+ memory_id: string;
9696
+ };
9697
+ cookie?: never;
9698
+ };
9699
+ requestBody?: never;
9700
+ responses: {
9701
+ /** @description Successful Response */
9702
+ 204: {
9703
+ headers: {
9704
+ [name: string]: unknown;
9705
+ };
9706
+ content?: never;
9707
+ };
9708
+ /** @description The bearer token is missing, invalid, or revoked. */
9709
+ 401: {
9710
+ headers: {
9711
+ [name: string]: unknown;
9712
+ };
9713
+ content: {
9714
+ 'application/json': components['schemas']['ErrorResponse'];
9715
+ };
9716
+ };
9717
+ /** @description The credential may not perform this action, or the account is blocked. */
9718
+ 403: {
9719
+ headers: {
9720
+ [name: string]: unknown;
9721
+ };
9722
+ content: {
9723
+ 'application/json': components['schemas']['ErrorResponse'];
9724
+ };
9725
+ };
9726
+ /** @description No such memory in your account. */
9727
+ 404: {
9728
+ headers: {
9729
+ [name: string]: unknown;
9730
+ };
9731
+ content: {
9732
+ 'application/json': components['schemas']['ErrorResponse'];
9733
+ };
9734
+ };
9735
+ /** @description if_sha256 does not match the memory's current content. */
9736
+ 409: {
9737
+ headers: {
9738
+ [name: string]: unknown;
9739
+ };
9740
+ content: {
9741
+ 'application/json': components['schemas']['ErrorResponse'];
9742
+ };
9743
+ };
9744
+ /** @description Validation Error */
9745
+ 422: {
9746
+ headers: {
9747
+ [name: string]: unknown;
9748
+ };
9749
+ content: {
9750
+ 'application/json': components['schemas']['HTTPValidationError'];
9342
9751
  };
9343
9752
  };
9344
9753
  };
9345
9754
  };
9346
- delete_memory: {
9755
+ list_supported_models: {
9347
9756
  parameters: {
9348
- query?: {
9349
- /** @description Only delete if the memory's current content_sha256 matches. */
9350
- if_sha256?: string | null;
9351
- };
9757
+ query?: never;
9352
9758
  header?: {
9353
9759
  'user-agent'?: string | null;
9354
9760
  };
9355
- path: {
9356
- memory_id: string;
9357
- };
9761
+ path?: never;
9358
9762
  cookie?: never;
9359
9763
  };
9360
9764
  requestBody?: never;
9361
9765
  responses: {
9362
9766
  /** @description Successful Response */
9363
- 204: {
9767
+ 200: {
9364
9768
  headers: {
9365
9769
  [name: string]: unknown;
9366
9770
  };
9367
- content?: never;
9771
+ content: {
9772
+ 'application/json': components['schemas']['ModelsListResponse'];
9773
+ };
9368
9774
  };
9369
9775
  /** @description The bearer token is missing, invalid, or revoked. */
9370
9776
  401: {
@@ -9384,24 +9790,6 @@ interface operations {
9384
9790
  'application/json': components['schemas']['ErrorResponse'];
9385
9791
  };
9386
9792
  };
9387
- /** @description No such memory in your account. */
9388
- 404: {
9389
- headers: {
9390
- [name: string]: unknown;
9391
- };
9392
- content: {
9393
- 'application/json': components['schemas']['ErrorResponse'];
9394
- };
9395
- };
9396
- /** @description if_sha256 does not match the memory's current content. */
9397
- 409: {
9398
- headers: {
9399
- [name: string]: unknown;
9400
- };
9401
- content: {
9402
- 'application/json': components['schemas']['ErrorResponse'];
9403
- };
9404
- };
9405
9793
  /** @description Validation Error */
9406
9794
  422: {
9407
9795
  headers: {
@@ -9416,10 +9804,12 @@ interface operations {
9416
9804
  list_reviews: {
9417
9805
  parameters: {
9418
9806
  query?: {
9419
- owner?: string | null;
9420
- repo?: string | null;
9421
- pull_request_number?: number | null;
9422
- 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'][];
9423
9813
  limit?: number;
9424
9814
  cursor?: string | null;
9425
9815
  };
@@ -9440,7 +9830,7 @@ interface operations {
9440
9830
  'application/json': components['schemas']['ReviewsListResponse'];
9441
9831
  };
9442
9832
  };
9443
- /** @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. */
9444
9834
  400: {
9445
9835
  headers: {
9446
9836
  [name: string]: unknown;
@@ -9467,7 +9857,7 @@ interface operations {
9467
9857
  'application/json': components['schemas']['ErrorResponse'];
9468
9858
  };
9469
9859
  };
9470
- /** @description The repository was not found in your account. */
9860
+ /** @description A `repository` was not found in your account. */
9471
9861
  404: {
9472
9862
  headers: {
9473
9863
  [name: string]: unknown;
@@ -9982,6 +10372,66 @@ interface operations {
9982
10372
  };
9983
10373
  };
9984
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
+ };
9985
10435
  export_agent_session: {
9986
10436
  parameters: {
9987
10437
  query?: never;
@@ -10678,6 +11128,7 @@ type AttributionType = 'github_user' | 'linear_user' | 'slack_user' | 'api_key';
10678
11128
  * Delivery status of the message.
10679
11129
  */
10680
11130
  type SessionMessageStatus = 'pending' | 'delivered';
11131
+ type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10681
11132
  type EffortLevel = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
10682
11133
  /**
10683
11134
  * What may be done to a resource. Strictly ordered: a grant at one level
@@ -10697,20 +11148,6 @@ type RepositoryFilter = {
10697
11148
  type LinearIssueAction = 'opened';
10698
11149
  type PullRequestAction = 'opened' | 'pushed' | 'merged' | 'closed' | 'review_submitted' | 'commented';
10699
11150
  type SentryAction = 'issue_alert' | 'metric_alert';
10700
- /**
10701
- * The surface an @ellipsis mention can come from.
10702
- *
10703
- * No SLACK member: Slack routing is not a trigger on an agent config, it is the
10704
- * `slack.yaml` routing file (`SlackConfig`), which answers the questions a
10705
- * platform list cannot — which channel, and whose DM. A mention trigger listing
10706
- * `slack` is therefore a config error, not a silently-never-fires config.
10707
- */
10708
- type AgentConfigMentionPlatform = 'github' | 'linear';
10709
- /**
10710
- * How this session's config was chosen.
10711
- */
10712
- type AgentConfigSource = 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
10713
- type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10714
11151
  /**
10715
11152
  * Where the resolved budget came from.
10716
11153
  */
@@ -10847,9 +11284,13 @@ interface SessionMessage {
10847
11284
  * The session's current state.
10848
11285
  */
10849
11286
  interface Session {
10850
- agent: SessionAgent;
10851
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;
10852
11292
  budget: SessionBudget;
11293
+ config: SessionConfig1;
10853
11294
  /**
10854
11295
  * The "owner/name" repository context the session was started in, if any.
10855
11296
  */
@@ -10916,50 +11357,139 @@ interface Session {
10916
11357
  updated_at: string;
10917
11358
  }
10918
11359
  /**
10919
- * 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.
10920
11361
  */
10921
- 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;
10922
11371
  /**
10923
- * 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.
10924
11373
  */
10925
- automation_id: string | null;
10926
- 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;
10927
11397
  /**
10928
- * 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.
10929
11399
  */
10930
- 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: {
10931
11454
  [k: string]: unknown;
10932
11455
  } | null;
10933
- source: AgentConfigSource;
11456
+ message: string | null;
10934
11457
  }
10935
11458
  /**
10936
- * 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.
10937
11470
  */
10938
- interface AgentConfig {
10939
- budget: AgentConfigBudget;
10940
- claude: AgentConfigClaude;
10941
- codex: AgentConfigCodex | null;
10942
- ellipsis: AgentConfigEllipsis;
10943
- environment: string | AgentConfigEnvironment;
10944
- input: AgentConfigInput | null;
10945
- output: AgentConfigOutput | null;
10946
- permissions: AgentConfigPermissions;
10947
- skills: AgentConfigSkill[];
10948
- 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[];
10949
11479
  }
10950
- interface AgentConfigBudget {
11480
+ interface BudgetConfig {
10951
11481
  day: number | null;
10952
11482
  month: number | null;
10953
11483
  session: number | null;
10954
11484
  week: number | null;
10955
11485
  }
10956
- interface AgentConfigClaude {
11486
+ interface ClaudeConfig {
10957
11487
  effort: EffortLevel | null;
10958
11488
  fallback_model: string | null;
10959
11489
  max_turns: number | null;
10960
11490
  model: string | null;
10961
- settings: AgentConfigSettingsRef | null;
10962
- system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
11491
+ settings: SettingsRef | null;
11492
+ system: string | SystemFileRef | (string | SystemFileRef)[];
10963
11493
  }
10964
11494
  /**
10965
11495
  * A config-declared Claude Code settings.json, resolved at run start and
@@ -10969,25 +11499,25 @@ interface AgentConfigClaude {
10969
11499
  * security setting. Lets a team point the cloud agent at the same settings file
10970
11500
  * they already use with Claude Code locally instead of re-encoding it as YAML.
10971
11501
  */
10972
- interface AgentConfigSettingsRef {
11502
+ interface SettingsRef {
10973
11503
  path: string;
10974
- repository: AgentConfigRepository | null;
11504
+ repository: RepositoryRef | null;
10975
11505
  }
10976
- interface AgentConfigRepository {
11506
+ interface RepositoryRef {
10977
11507
  name: string;
10978
11508
  owner: string | null;
10979
11509
  ref: string | null;
10980
11510
  }
10981
- interface AgentConfigSystemFileRef {
11511
+ interface SystemFileRef {
10982
11512
  file: string;
10983
- repository: AgentConfigRepository | null;
11513
+ repository: RepositoryRef | null;
10984
11514
  }
10985
11515
  /**
10986
11516
  * The `codex:` block — run this agent on OpenAI's Codex CLI instead of
10987
11517
  * Claude Code. Declaring the block at all is what selects the harness
10988
- * (`AgentConfig.harness`).
11518
+ * (`AutomationConfig.harness`).
10989
11519
  *
10990
- * Deliberately a small subset of `AgentConfigClaude`: the fields omitted here
11520
+ * Deliberately a small subset of `ClaudeConfig`: the fields omitted here
10991
11521
  * are ones Codex has no equivalent for (`effort`, `fallback_model`,
10992
11522
  * `settings`) or that the platform does not yet wire through for this harness
10993
11523
  * (`max_turns`, `skills`, MCP servers). They are omitted rather than
@@ -10995,35 +11525,9 @@ interface AgentConfigSystemFileRef {
10995
11525
  * config that sets one fails loudly at parse time instead of silently not doing
10996
11526
  * it. The budget still bounds a run regardless.
10997
11527
  */
10998
- interface AgentConfigCodex {
11528
+ interface CodexConfig {
10999
11529
  model: string;
11000
- system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
11001
- }
11002
- /**
11003
- * The Ellipsis product namespace for a config file: which schema this is
11004
- * (`version`), the human-facing identity (`name`/`description`), freeform
11005
- * organizational `metadata`, and whether the agent is `enabled`. The
11006
- * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
11007
- * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
11008
- * config directory) — see `yaml_is_ellipsis_config`.
11009
- *
11010
- * `enabled` is agent behavior, not freeform metadata, so it stays inside
11011
- * the config `sha` (only `metadata` is sha-excluded). Whether a session
11012
- * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
11013
- * not a config one.
11014
- */
11015
- interface AgentConfigEllipsis {
11016
- description: string | null;
11017
- enabled: boolean;
11018
- metadata: AgentConfigMetadata;
11019
- name: string | null;
11020
- version: string;
11021
- }
11022
- interface AgentConfigMetadata {
11023
- annotations: {
11024
- [k: string]: string;
11025
- };
11026
- labels: string[];
11530
+ system: string | SystemFileRef | (string | SystemFileRef)[];
11027
11531
  }
11028
11532
  /**
11029
11533
  * Everything about the environment (the sandbox) the agent runs in: which
@@ -11038,13 +11542,13 @@ interface AgentConfigMetadata {
11038
11542
  * stored variables never do. This is how a config brings in the config and
11039
11543
  * credentials a custom CLI needs.
11040
11544
  */
11041
- interface AgentConfigEnvironment {
11042
- compute: AgentConfigCompute;
11043
- hooks: AgentConfigEnvironmentHooks;
11044
- image: AgentConfigEnvironmentImage;
11045
- mcp_servers: (string | AgentConfigMcpServer | AgentConfigMcpStdioServer | AgentConfigMcpRemoteServer)[];
11046
- repositories: AgentConfigRepository[];
11047
- 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[];
11048
11552
  }
11049
11553
  /**
11050
11554
  * Sandbox compute sizing. Every field is optional; None inherits the
@@ -11068,17 +11572,17 @@ interface AgentConfigEnvironment {
11068
11572
  * Compute is billed on the requested allocation over the sandbox's
11069
11573
  * wall-clock lifetime, so a bigger/longer box costs proportionally more.
11070
11574
  */
11071
- interface AgentConfigCompute {
11575
+ interface ComputeConfig {
11072
11576
  cpu: number | null;
11073
- memory: string | AgentConfigMemorySize | null;
11074
- timeout: string | AgentConfigDuration | null;
11577
+ memory: string | MemorySize | null;
11578
+ timeout: string | Duration | null;
11075
11579
  }
11076
11580
  /**
11077
11581
  * A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
11078
11582
  * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
11079
11583
  * shorthand string.
11080
11584
  */
11081
- interface AgentConfigMemorySize {
11585
+ interface MemorySize {
11082
11586
  gb: number | null;
11083
11587
  mb: number | null;
11084
11588
  }
@@ -11087,7 +11591,7 @@ interface AgentConfigMemorySize {
11087
11591
  * `seconds` (at least one). The alternative to the `30m`-style shorthand
11088
11592
  * string wherever a duration is accepted.
11089
11593
  */
11090
- interface AgentConfigDuration {
11594
+ interface Duration {
11091
11595
  hours: number | null;
11092
11596
  minutes: number | null;
11093
11597
  seconds: number | null;
@@ -11110,7 +11614,7 @@ interface AgentConfigDuration {
11110
11614
  * (baked into the cached image) instead; keep hooks for per-run work — e.g.
11111
11615
  * anything that touches run-scoped credentials.
11112
11616
  */
11113
- interface AgentConfigEnvironmentHooks {
11617
+ interface EnvironmentHooks {
11114
11618
  post_clone: string | null;
11115
11619
  post_start: string | null;
11116
11620
  }
@@ -11129,7 +11633,7 @@ interface AgentConfigEnvironmentHooks {
11129
11633
  * `npm install`), so later runs start with deps already on disk. Neither runs
11130
11634
  * per run; that's `hooks.post_start` / `hooks.post_clone`.
11131
11635
  */
11132
- interface AgentConfigEnvironmentImage {
11636
+ interface EnvironmentImage {
11133
11637
  dockerfile_append: string | null;
11134
11638
  setup: string | null;
11135
11639
  }
@@ -11139,10 +11643,10 @@ interface AgentConfigEnvironmentImage {
11139
11643
  * server's transport and credentials. It only matters when the named
11140
11644
  * integration is set to `opt_in` inclusion; an integration in the default
11141
11645
  * `all_sessions` mode is added regardless. For a server the platform does not
11142
- * provide, define it instead (`AgentConfigMcpStdioServer` /
11143
- * `AgentConfigMcpRemoteServer`).
11646
+ * provide, define it instead (`McpStdioServer` /
11647
+ * `McpRemoteServer`).
11144
11648
  */
11145
- interface AgentConfigMcpServer {
11649
+ interface McpServerRef {
11146
11650
  name: string;
11147
11651
  }
11148
11652
  /**
@@ -11155,7 +11659,7 @@ interface AgentConfigMcpServer {
11155
11659
  * account's secrets store (see `mcp_secret_refs`); everything else is passed
11156
11660
  * literally.
11157
11661
  */
11158
- interface AgentConfigMcpStdioServer {
11662
+ interface McpStdioServer {
11159
11663
  args: string[];
11160
11664
  command: string;
11161
11665
  env: {
@@ -11169,7 +11673,7 @@ interface AgentConfigMcpStdioServer {
11169
11673
  * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
11170
11674
  * references, resolved at run time from the account's secrets store.
11171
11675
  */
11172
- interface AgentConfigMcpRemoteServer {
11676
+ interface McpRemoteServer {
11173
11677
  headers: {
11174
11678
  [k: string]: string;
11175
11679
  };
@@ -11186,37 +11690,16 @@ interface AgentConfigMcpRemoteServer {
11186
11690
  * ever putting it in the config file. Either way the variable only reaches
11187
11691
  * agents that name it.
11188
11692
  */
11189
- interface AgentConfigEnvironmentVariable {
11693
+ interface EnvironmentVariable {
11190
11694
  name: string;
11191
11695
  value: string | null;
11192
11696
  }
11193
- /**
11194
- * The typed input contract: what goes INTO a session (the trigger is
11195
- * when it happens; this is what goes in).
11196
- *
11197
- * `json_schema` types the payload a caller-started session takes
11198
- * (`POST /v1/sessions` `input`, validated at the door; required when
11199
- * declared). It is illegal on a react-triggered agent — react payloads are
11200
- * platform-shaped (the published surface field sets), not caller-shaped.
11201
- *
11202
- * `message` is the initial-message template: exact `{{path}}` substitution
11203
- * over the caller payload (or, on a react agent, over the surface's
11204
- * published fields), no conditionals/loops/filters. Refs are validated at
11205
- * deploy time against the governing field set (see AgentConfig's
11206
- * `_check_input`).
11207
- */
11208
- interface AgentConfigInput {
11209
- json_schema: {
11210
- [k: string]: unknown;
11211
- } | null;
11212
- message: string | null;
11213
- }
11214
11697
  /**
11215
11698
  * The typed output contract: the JSON Schema the agent must exit through
11216
11699
  * (the StructuredOutput exit tool). Read back via
11217
11700
  * GET /v1/sessions/{id}/output.
11218
11701
  */
11219
- interface AgentConfigOutput {
11702
+ interface OutputConfig {
11220
11703
  json_schema: {
11221
11704
  [k: string]: unknown;
11222
11705
  };
@@ -11230,16 +11713,16 @@ interface AgentConfigOutput {
11230
11713
  * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
11231
11714
  * with). `true` / the string `all` (the default) grant the full sandbox
11232
11715
  * ceiling — everything a sandbox token can ever do. A map narrows it per
11233
- * resource (see `AgentConfigEllipsisPermissions`); the minted token carries
11716
+ * resource (see `EllipsisPermissions`); the minted token carries
11234
11717
  * the intersection, so a config can only ever reduce access. `false` fails
11235
11718
  * validation — an agent with no API token cannot report its own progress.
11236
11719
  *
11237
11720
  * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
11238
- * see `AgentConfigGithubPermissions`. GitHub enforces it at mint time.
11721
+ * see `GithubPermissions`. GitHub enforces it at mint time.
11239
11722
  */
11240
- interface AgentConfigPermissions {
11241
- ellipsis: (true | 'all') | AgentConfigEllipsisPermissions;
11242
- github: AgentConfigGithubPermissions;
11723
+ interface PermissionsConfig {
11724
+ ellipsis: (true | 'all') | EllipsisPermissions;
11725
+ github: GithubPermissions;
11243
11726
  }
11244
11727
  /**
11245
11728
  * `permissions.ellipsis` as a map: resource → level | grant | list of
@@ -11248,7 +11731,7 @@ interface AgentConfigPermissions {
11248
11731
  * intersected with the platform's sandbox ceiling at token mint — it can
11249
11732
  * narrow what a sandbox token may do, never exceed it.
11250
11733
  */
11251
- interface AgentConfigEllipsisPermissions {
11734
+ interface EllipsisPermissions {
11252
11735
  [k: string]: Level | EllipsisGrant | (Level | EllipsisGrant)[];
11253
11736
  }
11254
11737
  /**
@@ -11277,7 +11760,7 @@ interface EllipsisGrant {
11277
11760
  * minted with the reduced scope, so nothing running in the sandbox can
11278
11761
  * exceed it.
11279
11762
  */
11280
- interface AgentConfigGithubPermissions {
11763
+ interface GithubPermissions {
11281
11764
  permissions: 'read_only' | {
11282
11765
  [k: string]: string;
11283
11766
  } | null;
@@ -11292,15 +11775,15 @@ interface AgentConfigGithubPermissions {
11292
11775
  * Skills under a cloned repo's own `.claude/skills/` load by themselves and
11293
11776
  * don't need an entry here.
11294
11777
  */
11295
- interface AgentConfigSkill {
11778
+ interface SkillRef {
11296
11779
  path: string;
11297
- repository: AgentConfigRepository | null;
11780
+ repository: RepositoryRef | null;
11298
11781
  }
11299
- interface AgentConfigCronTrigger {
11782
+ interface CronTrigger {
11300
11783
  schedule: string;
11301
11784
  type: 'cron';
11302
11785
  }
11303
- interface AgentConfigReactTrigger {
11786
+ interface ReactTrigger {
11304
11787
  issue: ReactIssue | null;
11305
11788
  linear_issue: ReactLinearIssue | null;
11306
11789
  pull_request: ReactPullRequest | null;
@@ -11352,40 +11835,6 @@ interface ReactSentry {
11352
11835
  }
11353
11836
  interface ReactSlackChannel {
11354
11837
  }
11355
- interface AgentConfigMentionTrigger {
11356
- platforms: AgentConfigMentionPlatform[];
11357
- type: 'mention';
11358
- }
11359
- /**
11360
- * The principal this session is attributed to.
11361
- */
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;
11371
- /**
11372
- * The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user.
11373
- */
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
11838
  /**
11390
11839
  * The spend budget enforced for this session.
11391
11840
  */
@@ -11396,6 +11845,18 @@ interface SessionBudget {
11396
11845
  cents: number;
11397
11846
  source: BudgetSource;
11398
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
+ }
11399
11860
  /**
11400
11861
  * What the session cost, in millicents, broken down by leg and carrying its own total.
11401
11862
  */
@@ -11422,7 +11883,7 @@ interface SessionCost {
11422
11883
  total: number;
11423
11884
  }
11424
11885
  /**
11425
- * 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`.
11426
11887
  */
11427
11888
  interface SessionEnvironment {
11428
11889
  /**
@@ -12083,9 +12544,13 @@ interface SessionFrame {
12083
12544
  * The session's current state.
12084
12545
  */
12085
12546
  interface Session1 {
12086
- agent: SessionAgent;
12087
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;
12088
12552
  budget: SessionBudget;
12553
+ config: SessionConfig1;
12089
12554
  /**
12090
12555
  * The "owner/name" repository context the session was started in, if any.
12091
12556
  */
@@ -12250,4 +12715,4 @@ type ReviewRequester = components['schemas']['ReviewRequester'];
12250
12715
  type ReviewFinding = components['schemas']['ReviewFinding'];
12251
12716
  type Finding = ReviewFinding;
12252
12717
 
12253
- 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 };