@ellipsis-dev/sdk 0.22.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -280,6 +280,32 @@ interface paths {
280
280
  patch?: never;
281
281
  trace?: never;
282
282
  };
283
+ '/v1/automations/{automation_id}/metrics': {
284
+ parameters: {
285
+ query?: never;
286
+ header?: never;
287
+ path?: never;
288
+ cookie?: never;
289
+ };
290
+ /**
291
+ * Get Automation Metrics
292
+ * @description Return an automation's session distribution and trailing spend,
293
+ * by id or by name.
294
+ *
295
+ * `samples` carries one entry per finished session (duration, cost,
296
+ * tokens) for distributions; `spend_windows` carries what the
297
+ * automation's sessions cost over the last 1, 7, and 28 days against
298
+ * its budget for each window.
299
+ */
300
+ get: operations['get_automation_metrics'];
301
+ put?: never;
302
+ post?: never;
303
+ delete?: never;
304
+ options?: never;
305
+ head?: never;
306
+ patch?: never;
307
+ trace?: never;
308
+ };
283
309
  '/v1/automations/{automation_id}/sessions': {
284
310
  parameters: {
285
311
  query?: never;
@@ -780,7 +806,10 @@ interface paths {
780
806
  * List Reviews
781
807
  * @description List code reviews, newest first.
782
808
  *
783
- * `findings` is omitted (counters only).
809
+ * `findings` and `configuration` are omitted (counters only). Each
810
+ * filter is a set: repeat `repository`, `pull_request_number`, or
811
+ * `status` to match any of several values. `start` and `end` bound
812
+ * the review's creation time.
784
813
  *
785
814
  * Webhook-created reviews appear here too, so this answers "show
786
815
  * me every review on this PR".
@@ -791,9 +820,10 @@ interface paths {
791
820
  * Create Review
792
821
  * @description Run a code review on demand.
793
822
  *
794
- * Reviews an existing PR or a pushed branch (for a branch, the
795
- * platform finds or creates a draft PR for it, since a code
796
- * review is structurally about a PR).
823
+ * Reviews an open pull request. Which pipeline runs is not a
824
+ * parameter: it resolves from the repository's files exactly as
825
+ * it does for a push, so an on-demand review never disagrees with
826
+ * the automatic one.
797
827
  *
798
828
  * A review is one pipeline run over one commit range, with one
799
829
  * agent session per stage: `review.id` is the run id, and
@@ -912,9 +942,10 @@ interface paths {
912
942
  * @description Start a cloud agent session.
913
943
  *
914
944
  * The daily driver: a prompt, optionally where to run it
915
- * (`environment`) and the run's own settings, in the AgentConfig
916
- * vocabulary. Anything omitted comes from the organization's
917
- * settings — default model, default environment, budget — so
945
+ * (`environment`) and the run's own settings, in the AutomationConfig
946
+ * vocabulary. What you send is what runs: omit `environment` and the
947
+ * session runs in the built-in basic sandbox. A missing model or
948
+ * budget comes from the organization's settings, so
918
949
  * `{"prompt": "..."}` alone is a complete request. `prompt` is the
919
950
  * first message; omit it and the session starts idle, waiting for
920
951
  * one. 400 when `interactive` is false and there is no prompt, or
@@ -955,6 +986,32 @@ interface paths {
955
986
  patch?: never;
956
987
  trace?: never;
957
988
  };
989
+ '/v1/sessions/{session_id}/diff': {
990
+ parameters: {
991
+ query?: never;
992
+ header?: never;
993
+ path?: never;
994
+ cookie?: never;
995
+ };
996
+ /**
997
+ * Get Agent Session Diff
998
+ * @description Return the session's uncommitted changes as a patch.
999
+ *
1000
+ * One unified-diff section per changed file, captured from the
1001
+ * sandbox's working tree when the session ended. The per-file
1002
+ * counts ride on the session itself (`git.repos[].files`); this
1003
+ * is the text behind them. Empty when the tree was clean. A
1004
+ * sandbox token may read only its own session's diff.
1005
+ */
1006
+ get: operations['get_agent_session_diff'];
1007
+ put?: never;
1008
+ post?: never;
1009
+ delete?: never;
1010
+ options?: never;
1011
+ head?: never;
1012
+ patch?: never;
1013
+ trace?: never;
1014
+ };
958
1015
  '/v1/sessions/{session_id}/export': {
959
1016
  parameters: {
960
1017
  query?: never;
@@ -1120,19 +1177,18 @@ interface paths {
1120
1177
  * Get Organization Settings
1121
1178
  * @description Get the organization settings.
1122
1179
  *
1123
- * The default model and default environment every session falls
1124
- * back to when neither its request nor its automation names one,
1125
- * and the per-session budget ceiling no session may exceed.
1180
+ * The default model every session falls back to when neither its
1181
+ * request nor its automation names one, and the per-session budget
1182
+ * ceiling no session may exceed.
1126
1183
  */
1127
1184
  get: operations['get_organization_settings'];
1128
1185
  /**
1129
1186
  * Set Organization Settings
1130
1187
  * @description Set the organization settings.
1131
1188
  *
1132
- * Replaces all three: `default_model` accepts an alias or canonical
1133
- * id and is stored canonical; `default_environment` accepts a name
1134
- * or `env_` id and is stored as the id; `budget_ceiling.session` is
1135
- * in US dollars, at most the platform ceiling. Null clears each.
1189
+ * Replaces both: `default_model` accepts an alias or canonical id
1190
+ * and is stored canonical; `budget_ceiling.session` is in US
1191
+ * dollars, at most the platform ceiling. Null clears each.
1136
1192
  * Refused for sandbox tokens (potentially prompt-injected code must
1137
1193
  * not repoint the organization's defaults).
1138
1194
  */
@@ -1145,666 +1201,71 @@ interface paths {
1145
1201
  trace?: never;
1146
1202
  };
1147
1203
  '/v1/templates': {
1148
- parameters: {
1149
- query?: never;
1150
- header?: never;
1151
- path?: never;
1152
- cookie?: never;
1153
- };
1154
- /**
1155
- * List Agent Templates
1156
- * @description List the built-in starter agent templates.
1157
- *
1158
- * Behind auth but not account-scoped — the data is static
1159
- * product content shared by the dashboard, landing site, and CLI.
1160
- */
1161
- get: operations['list_agent_templates'];
1162
- put?: never;
1163
- post?: never;
1164
- delete?: never;
1165
- options?: never;
1166
- head?: never;
1167
- patch?: never;
1168
- trace?: never;
1169
- };
1170
- '/v1/templates/{template_id}': {
1171
- parameters: {
1172
- query?: never;
1173
- header?: never;
1174
- path?: never;
1175
- cookie?: never;
1176
- };
1177
- /**
1178
- * Get Agent Template
1179
- * @description Return one built-in agent template by slug.
1180
- */
1181
- get: operations['get_agent_template'];
1182
- put?: never;
1183
- post?: never;
1184
- delete?: never;
1185
- options?: never;
1186
- head?: never;
1187
- patch?: never;
1188
- trace?: never;
1189
- };
1190
- '/v1/usage': {
1191
- parameters: {
1192
- query?: never;
1193
- header?: never;
1194
- path?: never;
1195
- cookie?: never;
1196
- };
1197
- /**
1198
- * Get Usage
1199
- * @description Return the caller's usage dashboard data.
1200
- */
1201
- get: operations['get_usage_endpoint'];
1202
- put?: never;
1203
- post?: never;
1204
- delete?: never;
1205
- options?: never;
1206
- head?: never;
1207
- patch?: never;
1208
- trace?: never;
1209
- };
1210
- }
1211
- interface components {
1212
- schemas: {
1213
- /** AgentConfig */
1214
- AgentConfig: {
1215
- /** @default {} */
1216
- budget: components['schemas']['AgentConfigBudget'];
1217
- /**
1218
- * @default {
1219
- * "system": ""
1220
- * }
1221
- */
1222
- claude: components['schemas']['AgentConfigClaude'];
1223
- codex?: components['schemas']['AgentConfigCodex'] | null;
1224
- /**
1225
- * @default {
1226
- * "enabled": true,
1227
- * "metadata": {
1228
- * "annotations": {},
1229
- * "labels": []
1230
- * },
1231
- * "version": "v1"
1232
- * }
1233
- */
1234
- ellipsis: components['schemas']['AgentConfigEllipsis'];
1235
- /**
1236
- * Environment
1237
- * @default {
1238
- * "compute": {},
1239
- * "hooks": {},
1240
- * "image": {},
1241
- * "mcp_servers": [],
1242
- * "repositories": [],
1243
- * "variables": []
1244
- * }
1245
- */
1246
- environment: string | components['schemas']['AgentConfigEnvironment'];
1247
- input?: components['schemas']['AgentConfigInput'] | null;
1248
- output?: components['schemas']['AgentConfigOutput'] | null;
1249
- /**
1250
- * @default {
1251
- * "ellipsis": true,
1252
- * "github": {}
1253
- * }
1254
- */
1255
- permissions: components['schemas']['AgentConfigPermissions'];
1256
- /**
1257
- * Skills
1258
- * @default []
1259
- */
1260
- skills: components['schemas']['AgentConfigSkill'][];
1261
- /** Trigger */
1262
- trigger?: (components['schemas']['AgentConfigCronTrigger'] | components['schemas']['AgentConfigReactTrigger'] | components['schemas']['AgentConfigMentionTrigger']) | null;
1263
- };
1264
- /** AgentConfigBudget */
1265
- AgentConfigBudget: {
1266
- /** Day */
1267
- day?: number | null;
1268
- /** Month */
1269
- month?: number | null;
1270
- /** Session */
1271
- session?: number | null;
1272
- /** Week */
1273
- week?: number | null;
1274
- };
1275
- /** AgentConfigClaude */
1276
- AgentConfigClaude: {
1277
- effort?: components['schemas']['EffortLevel'] | null;
1278
- /** Fallback Model */
1279
- fallback_model?: string | null;
1280
- /** Max Turns */
1281
- max_turns?: number | null;
1282
- /** Model */
1283
- model?: string | null;
1284
- settings?: components['schemas']['AgentConfigSettingsRef'] | null;
1285
- /**
1286
- * System
1287
- * @default
1288
- */
1289
- system: string | components['schemas']['AgentConfigSystemFileRef'] | (string | components['schemas']['AgentConfigSystemFileRef'])[];
1290
- };
1291
- /**
1292
- * AgentConfigCodex
1293
- * @description The `codex:` block — run this agent on OpenAI's Codex CLI instead of
1294
- * Claude Code. Declaring the block at all is what selects the harness
1295
- * (`AgentConfig.harness`).
1296
- *
1297
- * Deliberately a small subset of `AgentConfigClaude`: the fields omitted here
1298
- * are ones Codex has no equivalent for (`effort`, `fallback_model`,
1299
- * `settings`) or that the platform does not yet wire through for this harness
1300
- * (`max_turns`, `skills`, MCP servers). They are omitted rather than
1301
- * accepted-and-ignored, because `StrictConfigModel` forbids extra keys — so a
1302
- * config that sets one fails loudly at parse time instead of silently not doing
1303
- * it. The budget still bounds a run regardless.
1304
- */
1305
- AgentConfigCodex: {
1306
- /**
1307
- * Model
1308
- * @default gpt-5.6-terra
1309
- */
1310
- model: string;
1311
- /**
1312
- * System
1313
- * @default
1314
- */
1315
- system: string | components['schemas']['AgentConfigSystemFileRef'] | (string | components['schemas']['AgentConfigSystemFileRef'])[];
1316
- };
1317
- /**
1318
- * AgentConfigCompute
1319
- * @description Sandbox compute sizing. Every field is optional; None inherits the
1320
- * platform default (1 vCPU / 4096 MiB / 3600s — see DEFAULT_MODAL_* in
1321
- * models/ellipsis/sandboxes/sandbox.py). A resolved value outside the platform
1322
- * bounds fails validation loudly (a sync error on the config) rather than
1323
- * being clamped silently.
1324
- *
1325
- * `memory` and `timeout` each accept a shorthand string ("8GB", "30m") or an
1326
- * explicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /
1327
- * `timeout_seconds` properties resolve either form to the canonical integer
1328
- * the sandbox driver consumes.
1329
- *
1330
- * `timeout` is the max wall-clock the agent may run before the sandbox is
1331
- * killed, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS — equal to the default, so
1332
- * today the knob only shortens a session; the cap matches the 1-hour validity
1333
- * of the sandbox's GitHub token). The worker's lease/visibility heartbeat
1334
- * ceiling is derived from that cap, so a run at the max stays owned by its
1335
- * worker for its whole life.
1336
- *
1337
- * Compute is billed on the requested allocation over the sandbox's
1338
- * wall-clock lifetime, so a bigger/longer box costs proportionally more.
1339
- */
1340
- AgentConfigCompute: {
1341
- /** Cpu */
1342
- cpu?: number | null;
1343
- /** Memory */
1344
- memory?: string | components['schemas']['AgentConfigMemorySize'] | null;
1345
- /** Timeout */
1346
- timeout?: string | components['schemas']['AgentConfigDuration'] | null;
1347
- };
1348
- /** AgentConfigCronTrigger */
1349
- AgentConfigCronTrigger: {
1350
- /** Schedule */
1351
- schedule: string;
1352
- /**
1353
- * @description discriminator enum property added by openapi-typescript
1354
- * @enum {string}
1355
- */
1356
- type: 'cron';
1357
- };
1358
- /**
1359
- * AgentConfigDuration
1360
- * @description A duration as explicit units, summed. Set any of `hours`/`minutes`/
1361
- * `seconds` (at least one). The alternative to the `30m`-style shorthand
1362
- * string wherever a duration is accepted.
1363
- */
1364
- AgentConfigDuration: {
1365
- /** Hours */
1366
- hours?: number | null;
1367
- /** Minutes */
1368
- minutes?: number | null;
1369
- /** Seconds */
1370
- seconds?: number | null;
1371
- };
1372
- /**
1373
- * AgentConfigEllipsis
1374
- * @description The Ellipsis product namespace for a config file: which schema this is
1375
- * (`version`), the human-facing identity (`name`/`description`), freeform
1376
- * organizational `metadata`, and whether the agent is `enabled`. The
1377
- * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
1378
- * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
1379
- * config directory) — see `yaml_is_ellipsis_config`.
1380
- *
1381
- * `enabled` is agent behavior, not freeform metadata, so it stays inside
1382
- * the config `sha` (only `metadata` is sha-excluded). Whether a session
1383
- * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
1384
- * not a config one.
1385
- */
1386
- AgentConfigEllipsis: {
1387
- /** Description */
1388
- description?: string | null;
1389
- /**
1390
- * Enabled
1391
- * @default true
1392
- */
1393
- enabled: boolean;
1394
- /**
1395
- * @default {
1396
- * "annotations": {},
1397
- * "labels": []
1398
- * }
1399
- */
1400
- metadata: components['schemas']['AgentConfigMetadata'];
1401
- /** Name */
1402
- name?: string | null;
1403
- /**
1404
- * Version
1405
- * @default v1
1406
- */
1407
- version: string;
1408
- };
1409
- /**
1410
- * AgentConfigEllipsisPermissions
1411
- * @description `permissions.ellipsis` as a map: resource → level | grant | list of
1412
- * grants. Levels are hierarchical (read < write < delete), so `write`
1413
- * includes `read`. An unlisted resource is denied. The whole block is
1414
- * intersected with the platform's sandbox ceiling at token mint — it can
1415
- * narrow what a sandbox token may do, never exceed it.
1416
- */
1417
- AgentConfigEllipsisPermissions: {
1418
- [key: string]: components['schemas']['Level'] | components['schemas']['EllipsisGrant'] | (components['schemas']['Level'] | components['schemas']['EllipsisGrant'])[];
1419
- };
1420
- /**
1421
- * AgentConfigEnvironment
1422
- * @description Everything about the environment (the sandbox) the agent runs in: which
1423
- * `repositories` are cloned into it, which environment `variables` it gets,
1424
- * its `compute` sizing, how its `image` is customized, and lifecycle `hooks`.
1425
- * What the agent may *do* from that environment is the top-level
1426
- * `permissions:` block, not this one.
1427
- *
1428
- * Each `variables` entry names a variable to inject; with an inline `value` it
1429
- * is hardcoded, without one it is resolved from the account's sandbox-secrets
1430
- * store. Only the named variables reach this agent; the rest of the account's
1431
- * stored variables never do. This is how a config brings in the config and
1432
- * credentials a custom CLI needs.
1433
- */
1434
- AgentConfigEnvironment: {
1435
- /** @default {} */
1436
- compute: components['schemas']['AgentConfigCompute'];
1437
- /** @default {} */
1438
- hooks: components['schemas']['AgentConfigEnvironmentHooks'];
1439
- /** @default {} */
1440
- image: components['schemas']['AgentConfigEnvironmentImage'];
1441
- /**
1442
- * Mcp Servers
1443
- * @default []
1444
- */
1445
- mcp_servers: (string | components['schemas']['AgentConfigMcpServer'] | components['schemas']['AgentConfigMcpStdioServer'] | components['schemas']['AgentConfigMcpRemoteServer'])[];
1446
- /**
1447
- * Repositories
1448
- * @default []
1449
- */
1450
- repositories: components['schemas']['AgentConfigRepository'][];
1451
- /**
1452
- * Variables
1453
- * @default []
1454
- */
1455
- variables: components['schemas']['AgentConfigEnvironmentVariable'][];
1456
- };
1457
- /**
1458
- * AgentConfigEnvironmentHooks
1459
- * @description Shell scripts run at points in the sandbox lifecycle, each as the sandbox
1460
- * user with the sandbox's environment variables available. A non-zero exit
1461
- * fails the run (exit_status = LIFECYCLE_HOOK_FAILED) and is not retried.
1462
- *
1463
- * `post_start` runs after the container starts, before any repo is cloned —
1464
- * repo-independent setup (authenticate a CLI, e.g. `doppler setup`). On Modal
1465
- * the repo is baked into the image so it is incidentally present, but
1466
- * `post_start` must not depend on repo contents (that's `post_clone`).
1467
- *
1468
- * `post_clone` runs after all repos are cloned/checked out, before the agent —
1469
- * repo-dependent setup (`pip install -r requirements.txt`, codegen).
1470
- *
1471
- * Hooks run on every run and their output is never cached. A dependency
1472
- * install whose result should be reused across runs belongs in `image.setup`
1473
- * (baked into the cached image) instead; keep hooks for per-run work — e.g.
1474
- * anything that touches run-scoped credentials.
1475
- */
1476
- AgentConfigEnvironmentHooks: {
1477
- /** Post Clone */
1478
- post_clone?: string | null;
1479
- /** Post Start */
1480
- post_start?: string | null;
1481
- };
1482
- /**
1483
- * AgentConfigEnvironmentImage
1484
- * @description How to customize the container image the agent runs in. You
1485
- * contribute appended layers (`dockerfile_append`) and a build-time script
1486
- * (`setup`) only — Ellipsis owns FROM / base tooling / entrypoint / user.
1487
- * Today only inline bodies are supported; a file reference (resolved at the
1488
- * run's SHA) will come later.
1489
- *
1490
- * The split: `dockerfile_append` runs when the image is assembled, before any
1491
- * repo exists — toolchain installs (a package manager binary, apt packages).
1492
- * `setup` runs at image-build time *after* the configured repositories are
1493
- * checked out, and its output is captured by the filesystem snapshot that
1494
- * becomes the cached image — dependency installs (`poetry install`,
1495
- * `npm install`), so later runs start with deps already on disk. Neither runs
1496
- * per run; that's `hooks.post_start` / `hooks.post_clone`.
1497
- */
1498
- AgentConfigEnvironmentImage: {
1499
- /** Dockerfile Append */
1500
- dockerfile_append?: string | null;
1501
- /** Setup */
1502
- setup?: string | null;
1503
- };
1504
- /**
1505
- * AgentConfigEnvironmentVariable
1506
- * @description One environment variable injected into the agent's sandbox.
1507
- *
1508
- * `value`, when set, is a literal injected as-is — use it for non-secret
1509
- * config (LOG_LEVEL, an API base URL). When `value` is omitted the value is
1510
- * resolved at run time from the account's sandbox-secrets store (dashboard
1511
- * / `PUT /v1/secrets`) by `name`, so a secret can be injected without
1512
- * ever putting it in the config file. Either way the variable only reaches
1513
- * agents that name it.
1514
- */
1515
- AgentConfigEnvironmentVariable: {
1516
- /** Name */
1517
- name: string;
1518
- /** Value */
1519
- value?: string | null;
1520
- };
1521
- /**
1522
- * AgentConfigGithubPermissions
1523
- * @description The agent's GitHub access: the scope of the installation token minted for
1524
- * its sandbox — the credential `git`, `gh`, and the GitHub MCP server
1525
- * authenticate with.
1526
- *
1527
- * By default the token carries the installation's full permissions on all of
1528
- * the installation's repositories. `permissions` narrows what it may do:
1529
- * the string `read_only` grants read access to contents, issues, metadata and
1530
- * pull requests; a map requests explicit levels per GitHub App permission
1531
- * scope (e.g. `{contents: read, pull_requests: write}`) and may never exceed
1532
- * what the installation granted. `repositories` scopes the token to exactly
1533
- * the listed repos, by name (they must belong to the installation).
1534
- *
1535
- * Restriction is enforced by GitHub, not by Ellipsis: the token itself is
1536
- * minted with the reduced scope, so nothing running in the sandbox can
1537
- * exceed it.
1538
- */
1539
- AgentConfigGithubPermissions: {
1540
- /** Permissions */
1541
- permissions?: 'read_only' | {
1542
- [key: string]: string;
1543
- } | null;
1544
- /** Repositories */
1545
- repositories?: string[] | null;
1546
- };
1547
- /**
1548
- * AgentConfigInput
1549
- * @description The typed input contract: what goes INTO a session (the trigger is
1550
- * when it happens; this is what goes in).
1551
- *
1552
- * `json_schema` types the payload a caller-started session takes
1553
- * (`POST /v1/sessions` `input`, validated at the door; required when
1554
- * declared). It is illegal on a react-triggered agent — react payloads are
1555
- * platform-shaped (the published surface field sets), not caller-shaped.
1556
- *
1557
- * `message` is the initial-message template: exact `{{path}}` substitution
1558
- * over the caller payload (or, on a react agent, over the surface's
1559
- * published fields), no conditionals/loops/filters. Refs are validated at
1560
- * deploy time against the governing field set (see AgentConfig's
1561
- * `_check_input`).
1562
- */
1563
- AgentConfigInput: {
1564
- /** Json Schema */
1565
- json_schema?: {
1566
- [key: string]: unknown;
1567
- } | null;
1568
- /** Message */
1569
- message?: string | null;
1570
- };
1571
- /**
1572
- * AgentConfigMcpRemoteServer
1573
- * @description A bring-your-own remote MCP server: the harness talks HTTP to `url`.
1574
- * Nothing runs in the sandbox image. `headers` carry static auth (e.g.
1575
- * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
1576
- * references, resolved at run time from the account's secrets store.
1577
- */
1578
- AgentConfigMcpRemoteServer: {
1579
- /**
1580
- * Headers
1581
- * @default {}
1582
- */
1583
- headers: {
1584
- [key: string]: string;
1585
- };
1586
- /** Name */
1587
- name: string;
1588
- /** Url */
1589
- url: string;
1590
- };
1591
- /**
1592
- * AgentConfigMcpServer
1593
- * @description One built-in MCP server this agent opts into by name (`linear`/`slack`).
1594
- * A name reference over the connected built-in set — the platform manages the
1595
- * server's transport and credentials. It only matters when the named
1596
- * integration is set to `opt_in` inclusion; an integration in the default
1597
- * `all_sessions` mode is added regardless. For a server the platform does not
1598
- * provide, define it instead (`AgentConfigMcpStdioServer` /
1599
- * `AgentConfigMcpRemoteServer`).
1600
- */
1601
- AgentConfigMcpServer: {
1602
- /** Name */
1603
- name: string;
1604
- };
1605
- /**
1606
- * AgentConfigMcpStdioServer
1607
- * @description A bring-your-own stdio MCP server: the harness spawns `command` inside
1608
- * the sandbox and speaks JSON-RPC over its stdin/stdout. The command must be
1609
- * runnable in the sandbox image — install its runtime via `image.setup` /
1610
- * `image.dockerfile_append` if the base image lacks it.
1611
- *
1612
- * `env` values may embed `${NAME}` references, resolved at run time from the
1613
- * account's secrets store (see `mcp_secret_refs`); everything else is passed
1614
- * literally.
1615
- */
1616
- AgentConfigMcpStdioServer: {
1617
- /**
1618
- * Args
1619
- * @default []
1620
- */
1621
- args: string[];
1622
- /** Command */
1623
- command: string;
1624
- /**
1625
- * Env
1626
- * @default {}
1627
- */
1628
- env: {
1629
- [key: string]: string;
1630
- };
1631
- /** Name */
1632
- name: string;
1633
- };
1634
- /**
1635
- * AgentConfigMemorySize
1636
- * @description A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
1637
- * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
1638
- * shorthand string.
1639
- */
1640
- AgentConfigMemorySize: {
1641
- /** Gb */
1642
- gb?: number | null;
1643
- /** Mb */
1644
- mb?: number | null;
1645
- };
1646
- /**
1647
- * AgentConfigMentionPlatform
1648
- * @description The surface an @ellipsis mention can come from.
1649
- *
1650
- * No SLACK member: Slack routing is not a trigger on an agent config, it is the
1651
- * `slack.yaml` routing file (`SlackConfig`), which answers the questions a
1652
- * platform list cannot — which channel, and whose DM. A mention trigger listing
1653
- * `slack` is therefore a config error, not a silently-never-fires config.
1654
- * @enum {string}
1655
- */
1656
- AgentConfigMentionPlatform: 'github' | 'linear';
1657
- /** AgentConfigMentionTrigger */
1658
- AgentConfigMentionTrigger: {
1659
- /**
1660
- * Platforms
1661
- * @default []
1662
- */
1663
- platforms: components['schemas']['AgentConfigMentionPlatform'][];
1664
- /**
1665
- * @description discriminator enum property added by openapi-typescript
1666
- * @enum {string}
1667
- */
1668
- type: 'mention';
1669
- };
1670
- /** AgentConfigMetadata */
1671
- AgentConfigMetadata: {
1672
- /**
1673
- * Annotations
1674
- * @default {}
1675
- */
1676
- annotations: {
1677
- [key: string]: string;
1678
- };
1679
- /**
1680
- * Labels
1681
- * @default []
1682
- */
1683
- labels: string[];
1684
- };
1685
- /**
1686
- * AgentConfigOutput
1687
- * @description The typed output contract: the JSON Schema the agent must exit through
1688
- * (the StructuredOutput exit tool). Read back via
1689
- * GET /v1/sessions/{id}/output.
1690
- */
1691
- AgentConfigOutput: {
1692
- /** Json Schema */
1693
- json_schema: {
1694
- [key: string]: unknown;
1695
- };
1696
- };
1697
- /**
1698
- * AgentConfigPermissions
1699
- * @description What the agent is allowed to touch, per credential the platform mints
1700
- * into its sandbox. Distinct from `environment:`, which is where the agent
1701
- * runs; this is what it may do from there.
1702
- *
1703
- * `ellipsis` scopes the sandbox's Ellipsis API token
1704
- * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
1705
- * with). `true` / the string `all` (the default) grant the full sandbox
1706
- * ceiling — everything a sandbox token can ever do. A map narrows it per
1707
- * resource (see `AgentConfigEllipsisPermissions`); the minted token carries
1708
- * the intersection, so a config can only ever reduce access. `false` fails
1709
- * validation — an agent with no API token cannot report its own progress.
1710
- *
1711
- * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
1712
- * see `AgentConfigGithubPermissions`. GitHub enforces it at mint time.
1713
- */
1714
- AgentConfigPermissions: {
1715
- /**
1716
- * Ellipsis
1717
- * @default true
1718
- */
1719
- ellipsis: (true | 'all') | components['schemas']['AgentConfigEllipsisPermissions'];
1720
- /** @default {} */
1721
- github: components['schemas']['AgentConfigGithubPermissions'];
1722
- };
1723
- /** AgentConfigReactTrigger */
1724
- AgentConfigReactTrigger: {
1725
- issue?: components['schemas']['ReactIssue'] | null;
1726
- linear_issue?: components['schemas']['ReactLinearIssue'] | null;
1727
- pull_request?: components['schemas']['ReactPullRequest'] | null;
1728
- push?: components['schemas']['ReactPush'] | null;
1729
- sentry?: components['schemas']['ReactSentry'] | null;
1730
- slack_channel?: components['schemas']['ReactSlackChannel'] | null;
1731
- /**
1732
- * @description discriminator enum property added by openapi-typescript
1733
- * @enum {string}
1734
- */
1735
- type: 'react';
1736
- };
1737
- /** AgentConfigRepository */
1738
- AgentConfigRepository: {
1739
- /** Name */
1740
- name: string;
1741
- /** Owner */
1742
- owner?: string | null;
1743
- /** Ref */
1744
- ref?: string | null;
1745
- };
1746
- /**
1747
- * AgentConfigSettingsRef
1748
- * @description A config-declared Claude Code settings.json, resolved at run start and
1749
- * passed to `claude --settings <path>`. That is the CLI settings tier — BELOW
1750
- * Ellipsis's managed-settings.json floor — so it customizes behavior (model
1751
- * permissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a
1752
- * security setting. Lets a team point the cloud agent at the same settings file
1753
- * they already use with Claude Code locally instead of re-encoding it as YAML.
1754
- */
1755
- AgentConfigSettingsRef: {
1756
- /** Path */
1757
- path: string;
1758
- repository?: components['schemas']['AgentConfigRepository'] | null;
1204
+ parameters: {
1205
+ query?: never;
1206
+ header?: never;
1207
+ path?: never;
1208
+ cookie?: never;
1759
1209
  };
1760
1210
  /**
1761
- * AgentConfigSkill
1762
- * @description One config-declared Claude Code skill: a repository directory containing
1763
- * a SKILL.md, resolved at run start and installed at the sandbox's personal
1764
- * skill level (`~/.claude/skills/<basename(path)>/`). This is how a config
1765
- * brings in skills its cloned repositories don't provide — cross-repo refs
1766
- * (an org-wide skills repo), public third-party repos, and repo-less runs.
1767
- * Skills under a cloned repo's own `.claude/skills/` load by themselves and
1768
- * don't need an entry here.
1211
+ * List Agent Templates
1212
+ * @description List the built-in starter agent templates.
1213
+ *
1214
+ * Behind auth but not account-scoped — the data is static
1215
+ * product content shared by the dashboard, landing site, and CLI.
1769
1216
  */
1770
- AgentConfigSkill: {
1771
- /** Path */
1772
- path: string;
1773
- repository?: components['schemas']['AgentConfigRepository'] | null;
1217
+ get: operations['list_agent_templates'];
1218
+ put?: never;
1219
+ post?: never;
1220
+ delete?: never;
1221
+ options?: never;
1222
+ head?: never;
1223
+ patch?: never;
1224
+ trace?: never;
1225
+ };
1226
+ '/v1/templates/{template_id}': {
1227
+ parameters: {
1228
+ query?: never;
1229
+ header?: never;
1230
+ path?: never;
1231
+ cookie?: never;
1774
1232
  };
1775
1233
  /**
1776
- * AgentConfigSource
1777
- * @description Where a session's config came from. Total: every session has exactly one
1778
- * source, including the ones that never touch defaults resolution.
1779
- *
1780
- * Not derivable from the row — `agent_config_id` says WHICH saved config, not
1781
- * how it was chosen, and is null for inline, platform-default, and built-in
1782
- * configs alike — so it is persisted for audit and the published wire.
1783
- * @enum {string}
1234
+ * Get Agent Template
1235
+ * @description Return one built-in agent template by slug.
1784
1236
  */
1785
- AgentConfigSource: 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
1237
+ get: operations['get_agent_template'];
1238
+ put?: never;
1239
+ post?: never;
1240
+ delete?: never;
1241
+ options?: never;
1242
+ head?: never;
1243
+ patch?: never;
1244
+ trace?: never;
1245
+ };
1246
+ '/v1/usage': {
1247
+ parameters: {
1248
+ query?: never;
1249
+ header?: never;
1250
+ path?: never;
1251
+ cookie?: never;
1252
+ };
1786
1253
  /**
1787
- * AgentConfigSourceGithub
1788
- * @description Identifies the file a GitHub-sourced agent config is synced from.
1789
- *
1790
- * Keyed on the repository ID (not owner/name) so repository and org renames
1791
- * don't orphan the config; resolve display names from gh_repositories at
1792
- * read time.
1254
+ * Get Usage
1255
+ * @description Return the caller's usage dashboard data.
1793
1256
  */
1794
- AgentConfigSourceGithub: {
1795
- /** Branch */
1796
- branch: string;
1797
- /** Path */
1798
- path: string;
1799
- /** Repo Id */
1800
- repo_id: number;
1801
- };
1802
- /** AgentConfigSystemFileRef */
1803
- AgentConfigSystemFileRef: {
1804
- /** File */
1805
- file: string;
1806
- repository?: components['schemas']['AgentConfigRepository'] | null;
1807
- };
1257
+ get: operations['get_usage_endpoint'];
1258
+ put?: never;
1259
+ post?: never;
1260
+ delete?: never;
1261
+ options?: never;
1262
+ head?: never;
1263
+ patch?: never;
1264
+ trace?: never;
1265
+ };
1266
+ }
1267
+ interface components {
1268
+ schemas: {
1808
1269
  /**
1809
1270
  * AgentTemplate
1810
1271
  * @description A built-in agent template: a ready-to-use agent config plus the
@@ -2204,10 +1665,8 @@ interface components {
2204
1665
  * when invoked, plus where it syncs from and the state of that sync.
2205
1666
  */
2206
1667
  Automation: {
2207
- /** @description The agent definition itself, in the same schema as a YAML file under agents/. */
2208
- agent_config: components['schemas']['AgentConfig'];
2209
- /** @description The repository, path, and branch the automation syncs from. Null only transiently, before the creating pull request's file lands on the branch. */
2210
- agent_config_source_details?: components['schemas']['AgentConfigSourceGithub'] | null;
1668
+ /** @description The automation definition itself, in the same schema as its YAML file: identity, trigger, input contract, and the session block. */
1669
+ config: components['schemas']['AutomationConfig'];
2211
1670
  /**
2212
1671
  * Created At
2213
1672
  * Format: date-time
@@ -2263,6 +1722,8 @@ interface components {
2263
1722
  * @description The definition's content identity: the version fingerprint frozen onto each session that runs it.
2264
1723
  */
2265
1724
  sha: string;
1725
+ /** @description The repository, path, and branch the automation syncs from. Null only transiently, before the creating pull request's file lands on the branch. */
1726
+ source_details?: components['schemas']['GithubSourceDetails'] | null;
2266
1727
  /**
2267
1728
  * Updated At
2268
1729
  * Format: date-time
@@ -2270,6 +1731,104 @@ interface components {
2270
1731
  */
2271
1732
  updated_at: string;
2272
1733
  };
1734
+ /**
1735
+ * AutomationConfig
1736
+ * @description A saved automation, as written in its YAML file: identity
1737
+ * (`ellipsis`), when it runs (`trigger`), what goes in (`input`), and the
1738
+ * `session:` block every session it starts is frozen from. Field order is
1739
+ * the canonical key order for files and `to_yaml` exports.
1740
+ */
1741
+ AutomationConfig: {
1742
+ /**
1743
+ * @default {
1744
+ * "enabled": true,
1745
+ * "metadata": {
1746
+ * "annotations": {},
1747
+ * "labels": []
1748
+ * },
1749
+ * "version": "v1"
1750
+ * }
1751
+ */
1752
+ ellipsis: components['schemas']['AutomationIdentity'];
1753
+ input?: components['schemas']['InputContract'] | null;
1754
+ /**
1755
+ * @default {
1756
+ * "budget": {},
1757
+ * "claude": {
1758
+ * "system": ""
1759
+ * },
1760
+ * "environment": {
1761
+ * "compute": {},
1762
+ * "hooks": {},
1763
+ * "image": {},
1764
+ * "mcp_servers": [],
1765
+ * "repositories": [],
1766
+ * "variables": []
1767
+ * },
1768
+ * "permissions": {
1769
+ * "ellipsis": true,
1770
+ * "github": {}
1771
+ * },
1772
+ * "skills": []
1773
+ * }
1774
+ */
1775
+ session: components['schemas']['SessionConfig'];
1776
+ /** Trigger */
1777
+ trigger?: (components['schemas']['CronTrigger'] | components['schemas']['ReactTrigger']) | null;
1778
+ };
1779
+ /**
1780
+ * AutomationIdentity
1781
+ * @description The Ellipsis product namespace for a config file: which schema this is
1782
+ * (`version`), the human-facing identity (`name`/`description`), freeform
1783
+ * organizational `metadata`, and whether the agent is `enabled`. The
1784
+ * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
1785
+ * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
1786
+ * config directory) — see `yaml_is_ellipsis_config`.
1787
+ *
1788
+ * `enabled` is agent behavior, not freeform metadata, so it stays inside
1789
+ * the config `sha` (only `metadata` is sha-excluded). Whether a session
1790
+ * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
1791
+ * not a config one.
1792
+ */
1793
+ AutomationIdentity: {
1794
+ /** Description */
1795
+ description?: string | null;
1796
+ /**
1797
+ * Enabled
1798
+ * @default true
1799
+ */
1800
+ enabled: boolean;
1801
+ /**
1802
+ * @default {
1803
+ * "annotations": {},
1804
+ * "labels": []
1805
+ * }
1806
+ */
1807
+ metadata: components['schemas']['ConfigMetadata'];
1808
+ /** Name */
1809
+ name?: string | null;
1810
+ /**
1811
+ * Version
1812
+ * @default v1
1813
+ */
1814
+ version: string;
1815
+ };
1816
+ /**
1817
+ * AutomationMetricsResponse
1818
+ * @description An automation's session distribution and trailing spend.
1819
+ */
1820
+ AutomationMetricsResponse: {
1821
+ /**
1822
+ * Samples
1823
+ * @description One entry per finished session, unordered.
1824
+ */
1825
+ samples: components['schemas']['AutomationSessionSample'][];
1826
+ /**
1827
+ * Spend Windows
1828
+ * @description Trailing spend versus the budget, one entry per window (1, 7, and 28 days).
1829
+ */
1830
+ spend_windows: components['schemas']['AutomationSpendWindow'][];
1831
+ };
2273
1832
  /**
2274
1833
  * AutomationResponse
2275
1834
  * @description One automation.
@@ -2278,6 +1837,54 @@ interface components {
2278
1837
  /** @description The automation. */
2279
1838
  automation: components['schemas']['Automation'];
2280
1839
  };
1840
+ /**
1841
+ * AutomationSessionSample
1842
+ * @description One finished session of the automation, reduced to the three figures
1843
+ * the distributions are drawn from.
1844
+ */
1845
+ AutomationSessionSample: {
1846
+ /**
1847
+ * Cost
1848
+ * @description What the session cost, in millicents.
1849
+ */
1850
+ cost: number;
1851
+ /**
1852
+ * Duration Seconds
1853
+ * @description Wall-clock seconds from the session's creation to its last update.
1854
+ */
1855
+ duration_seconds: number;
1856
+ /**
1857
+ * Tokens Total
1858
+ * @description Tokens the session consumed across every lane, including prompt-cache reads and writes.
1859
+ */
1860
+ tokens_total: number;
1861
+ };
1862
+ /**
1863
+ * AutomationSpendWindow
1864
+ * @description The automation's trailing spend against its budget over one window.
1865
+ */
1866
+ AutomationSpendWindow: {
1867
+ /**
1868
+ * Limit Usd
1869
+ * @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.
1870
+ */
1871
+ limit_usd: number;
1872
+ /**
1873
+ * Platform Max Usd
1874
+ * @description The platform ceiling for the window, in US dollars; a budget above it is clamped to it.
1875
+ */
1876
+ platform_max_usd: number;
1877
+ /**
1878
+ * Spent Usd
1879
+ * @description What the automation's sessions cost over the window, in US dollars.
1880
+ */
1881
+ spent_usd: number;
1882
+ /**
1883
+ * Window Days
1884
+ * @description The trailing window, in days: 1, 7, or 28.
1885
+ */
1886
+ window_days: number;
1887
+ };
2281
1888
  /**
2282
1889
  * AutomationsListResponse
2283
1890
  * @description The caller's automations.
@@ -2300,6 +1907,17 @@ interface components {
2300
1907
  */
2301
1908
  session?: number | null;
2302
1909
  };
1910
+ /** BudgetConfig */
1911
+ BudgetConfig: {
1912
+ /** Day */
1913
+ day?: number | null;
1914
+ /** Month */
1915
+ month?: number | null;
1916
+ /** Session */
1917
+ session?: number | null;
1918
+ /** Week */
1919
+ week?: number | null;
1920
+ };
2303
1921
  /**
2304
1922
  * BudgetSource
2305
1923
  * @description Which layer actually determined the enforced budget.
@@ -2364,6 +1982,22 @@ interface components {
2364
1982
  */
2365
1983
  start: string | null;
2366
1984
  };
1985
+ /** ClaudeConfig */
1986
+ ClaudeConfig: {
1987
+ effort?: components['schemas']['EffortLevel'] | null;
1988
+ /** Fallback Model */
1989
+ fallback_model?: string | null;
1990
+ /** Max Turns */
1991
+ max_turns?: number | null;
1992
+ /** Model */
1993
+ model?: string | null;
1994
+ settings?: components['schemas']['SettingsRef'] | null;
1995
+ /**
1996
+ * System
1997
+ * @default
1998
+ */
1999
+ system: string | components['schemas']['SystemFileRef'] | (string | components['schemas']['SystemFileRef'])[];
2000
+ };
2367
2001
  /**
2368
2002
  * ClaudeSessionRecord
2369
2003
  * @description A native transcript record of a Claude session (source=claude_code).
@@ -2506,6 +2140,32 @@ interface components {
2506
2140
  } & {
2507
2141
  [key: string]: unknown;
2508
2142
  };
2143
+ /**
2144
+ * CodexConfig
2145
+ * @description The `codex:` block — run this agent on OpenAI's Codex CLI instead of
2146
+ * Claude Code. Declaring the block at all is what selects the harness
2147
+ * (`AutomationConfig.harness`).
2148
+ *
2149
+ * Deliberately a small subset of `ClaudeConfig`: the fields omitted here
2150
+ * are ones Codex has no equivalent for (`effort`, `fallback_model`,
2151
+ * `settings`) or that the platform does not yet wire through for this harness
2152
+ * (`max_turns`, `skills`, MCP servers). They are omitted rather than
2153
+ * accepted-and-ignored, because `StrictConfigModel` forbids extra keys — so a
2154
+ * config that sets one fails loudly at parse time instead of silently not doing
2155
+ * it. The budget still bounds a run regardless.
2156
+ */
2157
+ CodexConfig: {
2158
+ /**
2159
+ * Model
2160
+ * @default gpt-5.6-terra
2161
+ */
2162
+ model: string;
2163
+ /**
2164
+ * System
2165
+ * @default
2166
+ */
2167
+ system: string | components['schemas']['SystemFileRef'] | (string | components['schemas']['SystemFileRef'])[];
2168
+ };
2509
2169
  /** CodexErrorEvent */
2510
2170
  CodexErrorEvent: {
2511
2171
  /** Message */
@@ -2852,6 +2512,37 @@ interface components {
2852
2512
  } & {
2853
2513
  [key: string]: unknown;
2854
2514
  };
2515
+ /**
2516
+ * ComputeConfig
2517
+ * @description Sandbox compute sizing. Every field is optional; None inherits the
2518
+ * platform default (1 vCPU / 4096 MiB / 3600s — see DEFAULT_MODAL_* in
2519
+ * models/ellipsis/sandboxes/sandbox.py). A resolved value outside the platform
2520
+ * bounds fails validation loudly (a sync error on the config) rather than
2521
+ * being clamped silently.
2522
+ *
2523
+ * `memory` and `timeout` each accept a shorthand string ("8GB", "30m") or an
2524
+ * explicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /
2525
+ * `timeout_seconds` properties resolve either form to the canonical integer
2526
+ * the sandbox driver consumes.
2527
+ *
2528
+ * `timeout` is the max wall-clock the agent may run before the sandbox is
2529
+ * killed, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS — equal to the default, so
2530
+ * today the knob only shortens a session; the cap matches the 1-hour validity
2531
+ * of the sandbox's GitHub token). The worker's lease/visibility heartbeat
2532
+ * ceiling is derived from that cap, so a run at the max stays owned by its
2533
+ * worker for its whole life.
2534
+ *
2535
+ * Compute is billed on the requested allocation over the sandbox's
2536
+ * wall-clock lifetime, so a bigger/longer box costs proportionally more.
2537
+ */
2538
+ ComputeConfig: {
2539
+ /** Cpu */
2540
+ cpu?: number | null;
2541
+ /** Memory */
2542
+ memory?: string | components['schemas']['MemorySize'] | null;
2543
+ /** Timeout */
2544
+ timeout?: string | components['schemas']['Duration'] | null;
2545
+ };
2855
2546
  /**
2856
2547
  * ConfigManagedBy
2857
2548
  * @description Which writer owns an agent: the repository file it is defined in, or
@@ -2860,6 +2551,21 @@ interface components {
2860
2551
  * @enum {string}
2861
2552
  */
2862
2553
  ConfigManagedBy: 'github' | 'api';
2554
+ /** ConfigMetadata */
2555
+ ConfigMetadata: {
2556
+ /**
2557
+ * Annotations
2558
+ * @default {}
2559
+ */
2560
+ annotations: {
2561
+ [key: string]: string;
2562
+ };
2563
+ /**
2564
+ * Labels
2565
+ * @default []
2566
+ */
2567
+ labels: string[];
2568
+ };
2863
2569
  /**
2864
2570
  * ContributorUsage
2865
2571
  * @description An author who merged a pull request in the window. The pull-request and
@@ -2908,8 +2614,8 @@ interface components {
2908
2614
  * @description Parameters for creating an automation.
2909
2615
  */
2910
2616
  CreateAutomationRequest: {
2911
- /** @description The automation's definition, in the same schema as a YAML file under agents/. */
2912
- automation: components['schemas']['AgentConfig'];
2617
+ /** @description The automation's definition, in the same schema as a YAML file under .ellipsis/. */
2618
+ automation: components['schemas']['AutomationConfig'];
2913
2619
  };
2914
2620
  /**
2915
2621
  * CreateEnvironmentRequest
@@ -2917,7 +2623,7 @@ interface components {
2917
2623
  */
2918
2624
  CreateEnvironmentRequest: {
2919
2625
  /** @description The environment's definition. */
2920
- environment: components['schemas']['EnvironmentConfig'];
2626
+ environment: components['schemas']['EnvironmentDocument'];
2921
2627
  };
2922
2628
  /**
2923
2629
  * CreateFileRequest
@@ -3011,7 +2717,31 @@ interface components {
3011
2717
  * "kind": "incremental"
3012
2718
  * }
3013
2719
  */
3014
- scope: components['schemas']['ReviewScope'];
2720
+ scope: components['schemas']['ReviewScope'];
2721
+ };
2722
+ /** CronTrigger */
2723
+ CronTrigger: {
2724
+ /** Schedule */
2725
+ schedule: string;
2726
+ /**
2727
+ * @description discriminator enum property added by openapi-typescript
2728
+ * @enum {string}
2729
+ */
2730
+ type: 'cron';
2731
+ };
2732
+ /**
2733
+ * Duration
2734
+ * @description A duration as explicit units, summed. Set any of `hours`/`minutes`/
2735
+ * `seconds` (at least one). The alternative to the `30m`-style shorthand
2736
+ * string wherever a duration is accepted.
2737
+ */
2738
+ Duration: {
2739
+ /** Hours */
2740
+ hours?: number | null;
2741
+ /** Minutes */
2742
+ minutes?: number | null;
2743
+ /** Seconds */
2744
+ seconds?: number | null;
3015
2745
  };
3016
2746
  /**
3017
2747
  * DurationPercentiles
@@ -3083,6 +2813,17 @@ interface components {
3083
2813
  /** Match */
3084
2814
  match?: string[] | null;
3085
2815
  };
2816
+ /**
2817
+ * EllipsisPermissions
2818
+ * @description `permissions.ellipsis` as a map: resource → level | grant | list of
2819
+ * grants. Levels are hierarchical (read < write < delete), so `write`
2820
+ * includes `read`. An unlisted resource is denied. The whole block is
2821
+ * intersected with the platform's sandbox ceiling at token mint — it can
2822
+ * narrow what a sandbox token may do, never exceed it.
2823
+ */
2824
+ EllipsisPermissions: {
2825
+ [key: string]: components['schemas']['Level'] | components['schemas']['EllipsisGrant'] | (components['schemas']['Level'] | components['schemas']['EllipsisGrant'])[];
2826
+ };
3086
2827
  /**
3087
2828
  * Environment
3088
2829
  * @description A saved environment: the machine agents run in (repositories,
@@ -3099,7 +2840,7 @@ interface components {
3099
2840
  /** @description The GitHub account that last edited the environment, when known. */
3100
2841
  edited_by?: components['schemas']['GithubAccountSnippet'] | null;
3101
2842
  /** @description The environment definition itself, as parsed from its YAML. */
3102
- environment: components['schemas']['EnvironmentConfig'];
2843
+ environment: components['schemas']['EnvironmentDocument'];
3103
2844
  /**
3104
2845
  * Id
3105
2846
  * @description Unique identifier of the environment.
@@ -3128,7 +2869,7 @@ interface components {
3128
2869
  */
3129
2870
  sha: string;
3130
2871
  /** @description The repository, path, and branch the environment syncs from. Null for environments managed through the API. */
3131
- source_details?: components['schemas']['AgentConfigSourceGithub'] | null;
2872
+ source_details?: components['schemas']['GithubSourceDetails'] | null;
3132
2873
  /**
3133
2874
  * Updated At
3134
2875
  * Format: date-time
@@ -3138,6 +2879,43 @@ interface components {
3138
2879
  };
3139
2880
  /**
3140
2881
  * EnvironmentConfig
2882
+ * @description Everything about the environment (the sandbox) the agent runs in: which
2883
+ * `repositories` are cloned into it, which environment `variables` it gets,
2884
+ * its `compute` sizing, how its `image` is customized, and lifecycle `hooks`.
2885
+ * What the agent may *do* from that environment is the top-level
2886
+ * `permissions:` block, not this one.
2887
+ *
2888
+ * Each `variables` entry names a variable to inject; with an inline `value` it
2889
+ * is hardcoded, without one it is resolved from the account's sandbox-secrets
2890
+ * store. Only the named variables reach this agent; the rest of the account's
2891
+ * stored variables never do. This is how a config brings in the config and
2892
+ * credentials a custom CLI needs.
2893
+ */
2894
+ EnvironmentConfig: {
2895
+ /** @default {} */
2896
+ compute: components['schemas']['ComputeConfig'];
2897
+ /** @default {} */
2898
+ hooks: components['schemas']['EnvironmentHooks'];
2899
+ /** @default {} */
2900
+ image: components['schemas']['EnvironmentImage'];
2901
+ /**
2902
+ * Mcp Servers
2903
+ * @default []
2904
+ */
2905
+ mcp_servers: (string | components['schemas']['McpServerRef'] | components['schemas']['McpStdioServer'] | components['schemas']['McpRemoteServer'])[];
2906
+ /**
2907
+ * Repositories
2908
+ * @default []
2909
+ */
2910
+ repositories: components['schemas']['RepositoryRef'][];
2911
+ /**
2912
+ * Variables
2913
+ * @default []
2914
+ */
2915
+ variables: components['schemas']['EnvironmentVariable'][];
2916
+ };
2917
+ /**
2918
+ * EnvironmentDocument
3141
2919
  * @description A parsed environment document: identity plus the environment body.
3142
2920
  *
3143
2921
  * The body fields are flattened to the top level of the file (not nested
@@ -3145,38 +2923,63 @@ interface components {
3145
2923
  * would be ceremony. `to_environment()` projects the body for substitution
3146
2924
  * into an agent config.
3147
2925
  */
3148
- EnvironmentConfig: {
2926
+ EnvironmentDocument: {
3149
2927
  /** @default {} */
3150
- compute: components['schemas']['AgentConfigCompute'];
3151
- ellipsis: components['schemas']['EnvironmentConfigEllipsis'];
2928
+ compute: components['schemas']['ComputeConfig'];
2929
+ ellipsis: components['schemas']['EnvironmentIdentity'];
3152
2930
  /** @default {} */
3153
- hooks: components['schemas']['AgentConfigEnvironmentHooks'];
2931
+ hooks: components['schemas']['EnvironmentHooks'];
3154
2932
  /** @default {} */
3155
- image: components['schemas']['AgentConfigEnvironmentImage'];
2933
+ image: components['schemas']['EnvironmentImage'];
3156
2934
  /**
3157
2935
  * Mcp Servers
3158
2936
  * @default []
3159
2937
  */
3160
- mcp_servers: (string | components['schemas']['AgentConfigMcpServer'] | components['schemas']['AgentConfigMcpStdioServer'] | components['schemas']['AgentConfigMcpRemoteServer'])[];
2938
+ mcp_servers: (string | components['schemas']['McpServerRef'] | components['schemas']['McpStdioServer'] | components['schemas']['McpRemoteServer'])[];
3161
2939
  /**
3162
2940
  * Repositories
3163
2941
  * @default []
3164
2942
  */
3165
- repositories: components['schemas']['AgentConfigRepository'][];
2943
+ repositories: components['schemas']['RepositoryRef'][];
3166
2944
  /**
3167
2945
  * Variables
3168
2946
  * @default []
3169
2947
  */
3170
- variables: components['schemas']['AgentConfigEnvironmentVariable'][];
2948
+ variables: components['schemas']['EnvironmentVariable'][];
2949
+ };
2950
+ /**
2951
+ * EnvironmentHooks
2952
+ * @description Shell scripts run at points in the sandbox lifecycle, each as the sandbox
2953
+ * user with the sandbox's environment variables available. A non-zero exit
2954
+ * fails the run (exit_status = LIFECYCLE_HOOK_FAILED) and is not retried.
2955
+ *
2956
+ * `post_start` runs after the container starts, before any repo is cloned —
2957
+ * repo-independent setup (authenticate a CLI, e.g. `doppler setup`). On Modal
2958
+ * the repo is baked into the image so it is incidentally present, but
2959
+ * `post_start` must not depend on repo contents (that's `post_clone`).
2960
+ *
2961
+ * `post_clone` runs after all repos are cloned/checked out, before the agent —
2962
+ * repo-dependent setup (`pip install -r requirements.txt`, codegen).
2963
+ *
2964
+ * Hooks run on every run and their output is never cached. A dependency
2965
+ * install whose result should be reused across runs belongs in `image.setup`
2966
+ * (baked into the cached image) instead; keep hooks for per-run work — e.g.
2967
+ * anything that touches run-scoped credentials.
2968
+ */
2969
+ EnvironmentHooks: {
2970
+ /** Post Clone */
2971
+ post_clone?: string | null;
2972
+ /** Post Start */
2973
+ post_start?: string | null;
3171
2974
  };
3172
2975
  /**
3173
- * EnvironmentConfigEllipsis
2976
+ * EnvironmentIdentity
3174
2977
  * @description The Ellipsis namespace of an environment file. `kind: environment` is
3175
2978
  * what routes a synced YAML here instead of to the agent-config parser —
3176
2979
  * an agent config carries no `kind` (or `kind: agent`, tolerated nowhere:
3177
2980
  * absence is the agent marker).
3178
2981
  */
3179
- EnvironmentConfigEllipsis: {
2982
+ EnvironmentIdentity: {
3180
2983
  /** Description */
3181
2984
  description?: string | null;
3182
2985
  /**
@@ -3190,10 +2993,32 @@ interface components {
3190
2993
  * "labels": []
3191
2994
  * }
3192
2995
  */
3193
- metadata: components['schemas']['AgentConfigMetadata'];
2996
+ metadata: components['schemas']['ConfigMetadata'];
3194
2997
  /** Name */
3195
2998
  name?: string | null;
3196
2999
  };
3000
+ /**
3001
+ * EnvironmentImage
3002
+ * @description How to customize the container image the agent runs in. You
3003
+ * contribute appended layers (`dockerfile_append`) and a build-time script
3004
+ * (`setup`) only — Ellipsis owns FROM / base tooling / entrypoint / user.
3005
+ * Today only inline bodies are supported; a file reference (resolved at the
3006
+ * run's SHA) will come later.
3007
+ *
3008
+ * The split: `dockerfile_append` runs when the image is assembled, before any
3009
+ * repo exists — toolchain installs (a package manager binary, apt packages).
3010
+ * `setup` runs at image-build time *after* the configured repositories are
3011
+ * checked out, and its output is captured by the filesystem snapshot that
3012
+ * becomes the cached image — dependency installs (`poetry install`,
3013
+ * `npm install`), so later runs start with deps already on disk. Neither runs
3014
+ * per run; that's `hooks.post_start` / `hooks.post_clone`.
3015
+ */
3016
+ EnvironmentImage: {
3017
+ /** Dockerfile Append */
3018
+ dockerfile_append?: string | null;
3019
+ /** Setup */
3020
+ setup?: string | null;
3021
+ };
3197
3022
  /**
3198
3023
  * EnvironmentResponse
3199
3024
  * @description One saved environment.
@@ -3213,6 +3038,23 @@ interface components {
3213
3038
  * @enum {string}
3214
3039
  */
3215
3040
  EnvironmentSource: 'request' | 'agent_config' | 'repo_default' | 'account_default' | 'platform_default';
3041
+ /**
3042
+ * EnvironmentVariable
3043
+ * @description One environment variable injected into the agent's sandbox.
3044
+ *
3045
+ * `value`, when set, is a literal injected as-is — use it for non-secret
3046
+ * config (LOG_LEVEL, an API base URL). When `value` is omitted the value is
3047
+ * resolved at run time from the account's sandbox-secrets store (dashboard
3048
+ * / `PUT /v1/secrets`) by `name`, so a secret can be injected without
3049
+ * ever putting it in the config file. Either way the variable only reaches
3050
+ * agents that name it.
3051
+ */
3052
+ EnvironmentVariable: {
3053
+ /** Name */
3054
+ name: string;
3055
+ /** Value */
3056
+ value?: string | null;
3057
+ };
3216
3058
  /**
3217
3059
  * EnvironmentsListResponse
3218
3060
  * @description The caller's saved environments.
@@ -3663,6 +3505,32 @@ interface components {
3663
3505
  */
3664
3506
  members: components['schemas']['GithubMember'][];
3665
3507
  };
3508
+ /**
3509
+ * GithubPermissions
3510
+ * @description The agent's GitHub access: the scope of the installation token minted for
3511
+ * its sandbox — the credential `git`, `gh`, and the GitHub MCP server
3512
+ * authenticate with.
3513
+ *
3514
+ * By default the token carries the installation's full permissions on all of
3515
+ * the installation's repositories. `permissions` narrows what it may do:
3516
+ * the string `read_only` grants read access to contents, issues, metadata and
3517
+ * pull requests; a map requests explicit levels per GitHub App permission
3518
+ * scope (e.g. `{contents: read, pull_requests: write}`) and may never exceed
3519
+ * what the installation granted. `repositories` scopes the token to exactly
3520
+ * the listed repos, by name (they must belong to the installation).
3521
+ *
3522
+ * Restriction is enforced by GitHub, not by Ellipsis: the token itself is
3523
+ * minted with the reduced scope, so nothing running in the sandbox can
3524
+ * exceed it.
3525
+ */
3526
+ GithubPermissions: {
3527
+ /** Permissions */
3528
+ permissions?: 'read_only' | {
3529
+ [key: string]: string;
3530
+ } | null;
3531
+ /** Repositories */
3532
+ repositories?: string[] | null;
3533
+ };
3666
3534
  /**
3667
3535
  * GithubRepositoriesListResponse
3668
3536
  * @description The repositories connected to the account's GitHub installation.
@@ -3712,6 +3580,22 @@ interface components {
3712
3580
  */
3713
3581
  private: boolean;
3714
3582
  };
3583
+ /**
3584
+ * GithubSourceDetails
3585
+ * @description Identifies the file a GitHub-sourced agent config is synced from.
3586
+ *
3587
+ * Keyed on the repository ID (not owner/name) so repository and org renames
3588
+ * don't orphan the config; resolve display names from gh_repositories at
3589
+ * read time.
3590
+ */
3591
+ GithubSourceDetails: {
3592
+ /** Branch */
3593
+ branch: string;
3594
+ /** Path */
3595
+ path: string;
3596
+ /** Repo Id */
3597
+ repo_id: number;
3598
+ };
3715
3599
  /**
3716
3600
  * GithubUser
3717
3601
  * @description This is a full user account. It's the most amount of info we need to represent a GitHub user.
@@ -3815,6 +3699,24 @@ interface components {
3815
3699
  * @enum {string}
3816
3700
  */
3817
3701
  Harness: 'claude_code' | 'codex';
3702
+ /**
3703
+ * ImageAttachment
3704
+ * @description One image on a request body, base64 inline (the Claude Code paste
3705
+ * shape). Shared by `POST /v1/sessions` and `POST /v1/sessions/{id}/messages`.
3706
+ */
3707
+ ImageAttachment: {
3708
+ /**
3709
+ * Data
3710
+ * @description The raw image bytes, base64-encoded. 5 MiB cap.
3711
+ */
3712
+ data: string;
3713
+ /**
3714
+ * Media Type
3715
+ * @description The image's MIME type: image/png, image/jpeg, image/gif, or image/webp. The bytes must match.
3716
+ * @enum {string}
3717
+ */
3718
+ media_type: 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp';
3719
+ };
3818
3720
  /**
3819
3721
  * IngestTranscriptRequest
3820
3722
  * @description A batch of raw transcript lines pushed from inside a session's
@@ -3833,6 +3735,30 @@ interface components {
3833
3735
  */
3834
3736
  offset: number;
3835
3737
  };
3738
+ /**
3739
+ * InputContract
3740
+ * @description The typed input contract: what goes INTO a session (the trigger is
3741
+ * when it happens; this is what goes in).
3742
+ *
3743
+ * `json_schema` types the payload a caller-started session takes
3744
+ * (`POST /v1/sessions` `input`, validated at the door; required when
3745
+ * declared). It is illegal on a react-triggered agent — react payloads are
3746
+ * platform-shaped (the published surface field sets), not caller-shaped.
3747
+ *
3748
+ * `message` is the initial-message template: exact `{{path}}` substitution
3749
+ * over the caller payload (or, on a react agent, over the surface's
3750
+ * published fields), no conditionals/loops/filters. Refs are validated at
3751
+ * deploy time against the governing field set (see AutomationConfig's
3752
+ * `_check_input`).
3753
+ */
3754
+ InputContract: {
3755
+ /** Json Schema */
3756
+ json_schema?: {
3757
+ [key: string]: unknown;
3758
+ } | null;
3759
+ /** Message */
3760
+ message?: string | null;
3761
+ };
3836
3762
  /**
3837
3763
  * IssueAction
3838
3764
  * @enum {string}
@@ -4011,7 +3937,7 @@ interface components {
4011
3937
  LinkAutomationRequest: {
4012
3938
  /**
4013
3939
  * Path
4014
- * @description File path within the repo. Omit for the default agents/<slug>.yaml; if set it must be a location the sync scans (a .yaml/.yml file under agents/, .agents/, ellipsis/, or .ellipsis/ at any depth).
3940
+ * @description File path within the repo. Omit for the default .ellipsis/automations/<slug>.yaml; if set it must be a location the sync scans (a .yaml/.yml file under .ellipsis/ at any depth; in the repository named .ellipsis the repo root is that directory).
4015
3941
  */
4016
3942
  path?: string | null;
4017
3943
  /**
@@ -4070,6 +3996,69 @@ interface components {
4070
3996
  */
4071
3997
  slack_user_id: string;
4072
3998
  };
3999
+ /**
4000
+ * McpRemoteServer
4001
+ * @description A bring-your-own remote MCP server: the harness talks HTTP to `url`.
4002
+ * Nothing runs in the sandbox image. `headers` carry static auth (e.g.
4003
+ * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
4004
+ * references, resolved at run time from the account's secrets store.
4005
+ */
4006
+ McpRemoteServer: {
4007
+ /**
4008
+ * Headers
4009
+ * @default {}
4010
+ */
4011
+ headers: {
4012
+ [key: string]: string;
4013
+ };
4014
+ /** Name */
4015
+ name: string;
4016
+ /** Url */
4017
+ url: string;
4018
+ };
4019
+ /**
4020
+ * McpServerRef
4021
+ * @description One built-in MCP server this agent opts into by name (`linear`/`slack`).
4022
+ * A name reference over the connected built-in set — the platform manages the
4023
+ * server's transport and credentials. It only matters when the named
4024
+ * integration is set to `opt_in` inclusion; an integration in the default
4025
+ * `all_sessions` mode is added regardless. For a server the platform does not
4026
+ * provide, define it instead (`McpStdioServer` /
4027
+ * `McpRemoteServer`).
4028
+ */
4029
+ McpServerRef: {
4030
+ /** Name */
4031
+ name: string;
4032
+ };
4033
+ /**
4034
+ * McpStdioServer
4035
+ * @description A bring-your-own stdio MCP server: the harness spawns `command` inside
4036
+ * the sandbox and speaks JSON-RPC over its stdin/stdout. The command must be
4037
+ * runnable in the sandbox image — install its runtime via `image.setup` /
4038
+ * `image.dockerfile_append` if the base image lacks it.
4039
+ *
4040
+ * `env` values may embed `${NAME}` references, resolved at run time from the
4041
+ * account's secrets store (see `mcp_secret_refs`); everything else is passed
4042
+ * literally.
4043
+ */
4044
+ McpStdioServer: {
4045
+ /**
4046
+ * Args
4047
+ * @default []
4048
+ */
4049
+ args: string[];
4050
+ /** Command */
4051
+ command: string;
4052
+ /**
4053
+ * Env
4054
+ * @default {}
4055
+ */
4056
+ env: {
4057
+ [key: string]: string;
4058
+ };
4059
+ /** Name */
4060
+ name: string;
4061
+ };
4073
4062
  /**
4074
4063
  * MemoriesListResponse
4075
4064
  * @description The organization's memories: the rendered index a reader scans, plus the
@@ -4160,6 +4149,18 @@ interface components {
4160
4149
  /** @description The memory. */
4161
4150
  memory: components['schemas']['Memory'];
4162
4151
  };
4152
+ /**
4153
+ * MemorySize
4154
+ * @description A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
4155
+ * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
4156
+ * shorthand string.
4157
+ */
4158
+ MemorySize: {
4159
+ /** Gb */
4160
+ gb?: number | null;
4161
+ /** Mb */
4162
+ mb?: number | null;
4163
+ };
4163
4164
  /**
4164
4165
  * MemorySummary
4165
4166
  * @description One entry in the index: a memory with every field except `content`.
@@ -4305,17 +4306,24 @@ interface components {
4305
4306
  OrganizationSettings: {
4306
4307
  /** @description The organization's spend ceilings. */
4307
4308
  budget_ceiling?: components['schemas']['BudgetCeiling'];
4308
- /**
4309
- * Default Environment
4310
- * @description The saved environment sessions run in when neither their request nor their automation names one: an `env_...` id or the environment's name on write, always the id on read. Null means the built-in basic sandbox.
4311
- */
4312
- default_environment?: string | null;
4313
4309
  /**
4314
4310
  * Default Model
4315
4311
  * @description Canonical model id every session falls back to when neither its request nor its automation names one, or null when unset (sessions then run the platform default).
4316
4312
  */
4317
4313
  default_model?: string | null;
4318
4314
  };
4315
+ /**
4316
+ * OutputConfig
4317
+ * @description The typed output contract: the JSON Schema the agent must exit through
4318
+ * (the StructuredOutput exit tool). Read back via
4319
+ * GET /v1/sessions/{id}/output.
4320
+ */
4321
+ OutputConfig: {
4322
+ /** Json Schema */
4323
+ json_schema: {
4324
+ [key: string]: unknown;
4325
+ };
4326
+ };
4319
4327
  /**
4320
4328
  * ParentKind
4321
4329
  * @description How a session relates to its predecessor (parent_agent_session_id) —
@@ -4329,6 +4337,32 @@ interface components {
4329
4337
  * @enum {string}
4330
4338
  */
4331
4339
  ParentKind: 'continuation' | 'resume';
4340
+ /**
4341
+ * PermissionsConfig
4342
+ * @description What the agent is allowed to touch, per credential the platform mints
4343
+ * into its sandbox. Distinct from `environment:`, which is where the agent
4344
+ * runs; this is what it may do from there.
4345
+ *
4346
+ * `ellipsis` scopes the sandbox's Ellipsis API token
4347
+ * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
4348
+ * with). `true` / the string `all` (the default) grant the full sandbox
4349
+ * ceiling — everything a sandbox token can ever do. A map narrows it per
4350
+ * resource (see `EllipsisPermissions`); the minted token carries
4351
+ * the intersection, so a config can only ever reduce access. `false` fails
4352
+ * validation — an agent with no API token cannot report its own progress.
4353
+ *
4354
+ * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
4355
+ * see `GithubPermissions`. GitHub enforces it at mint time.
4356
+ */
4357
+ PermissionsConfig: {
4358
+ /**
4359
+ * Ellipsis
4360
+ * @default true
4361
+ */
4362
+ ellipsis: (true | 'all') | components['schemas']['EllipsisPermissions'];
4363
+ /** @default {} */
4364
+ github: components['schemas']['GithubPermissions'];
4365
+ };
4332
4366
  /**
4333
4367
  * PollCliAuthResponse
4334
4368
  * @description The state of a device-code flow. Poll until `status` leaves `pending`.
@@ -4647,6 +4681,20 @@ interface components {
4647
4681
  };
4648
4682
  /** ReactSlackChannel */
4649
4683
  ReactSlackChannel: Record<string, never>;
4684
+ /** ReactTrigger */
4685
+ ReactTrigger: {
4686
+ issue?: components['schemas']['ReactIssue'] | null;
4687
+ linear_issue?: components['schemas']['ReactLinearIssue'] | null;
4688
+ pull_request?: components['schemas']['ReactPullRequest'] | null;
4689
+ push?: components['schemas']['ReactPush'] | null;
4690
+ sentry?: components['schemas']['ReactSentry'] | null;
4691
+ slack_channel?: components['schemas']['ReactSlackChannel'] | null;
4692
+ /**
4693
+ * @description discriminator enum property added by openapi-typescript
4694
+ * @enum {string}
4695
+ */
4696
+ type: 'react';
4697
+ };
4650
4698
  /**
4651
4699
  * RecentPullRequest
4652
4700
  * @description One pull request in the recent-activity table.
@@ -4771,6 +4819,15 @@ interface components {
4771
4819
  */
4772
4820
  include: string[];
4773
4821
  } | string[];
4822
+ /** RepositoryRef */
4823
+ RepositoryRef: {
4824
+ /** Name */
4825
+ name: string;
4826
+ /** Owner */
4827
+ owner?: string | null;
4828
+ /** Ref */
4829
+ ref?: string | null;
4830
+ };
4774
4831
  /**
4775
4832
  * RepositorySelection
4776
4833
  * @enum {string}
@@ -5302,17 +5359,60 @@ interface components {
5302
5359
  * @description The pull request a review ran on.
5303
5360
  */
5304
5361
  ReviewPullRequest: {
5362
+ /** @description Who opened the pull request, or null when Ellipsis has not ingested the pull request yet. */
5363
+ author?: components['schemas']['ReviewPullRequestAuthor'] | null;
5364
+ /**
5365
+ * Base Sha
5366
+ * @description The pull request's base commit when the review was created.
5367
+ */
5368
+ base_sha: string;
5369
+ /**
5370
+ * Head Sha
5371
+ * @description The pull request's head commit the review ran against (the same as `scope.head`).
5372
+ */
5373
+ head_sha: string;
5305
5374
  /**
5306
5375
  * Number
5307
5376
  * @description The pull request number.
5308
5377
  */
5309
5378
  number: number;
5379
+ /**
5380
+ * Title
5381
+ * @description The pull request's title, or null when Ellipsis has not ingested the pull request yet.
5382
+ */
5383
+ title?: string | null;
5310
5384
  /**
5311
5385
  * Url
5312
5386
  * @description The pull request's URL on GitHub.
5313
5387
  */
5314
5388
  url: string;
5315
5389
  };
5390
+ /**
5391
+ * ReviewPullRequestAuthor
5392
+ * @description The GitHub account that opened the pull request.
5393
+ */
5394
+ ReviewPullRequestAuthor: {
5395
+ /**
5396
+ * Avatar Url
5397
+ * @description The account's avatar URL.
5398
+ */
5399
+ avatar_url: string;
5400
+ /**
5401
+ * Id
5402
+ * @description The account's GitHub id.
5403
+ */
5404
+ id: number;
5405
+ /**
5406
+ * Login
5407
+ * @description The account's GitHub login.
5408
+ */
5409
+ login: string;
5410
+ /**
5411
+ * Type
5412
+ * @description The account type: "User", "Organization", or "Bot".
5413
+ */
5414
+ type: string;
5415
+ };
5316
5416
  /**
5317
5417
  * ReviewRepoFacet
5318
5418
  * @description A repository filter option for the reviews view.
@@ -5955,9 +6055,14 @@ interface components {
5955
6055
  * @description Optional retry-safety key, unique per (session, key): a retry with the same key returns the original message — no duplicate message, no double turn, no double spend. The SDK auto-generates one per send.
5956
6056
  */
5957
6057
  idempotency_key?: string | null;
6058
+ /**
6059
+ * Images
6060
+ * @description Images attached to the message, base64 inline — what a paste into Claude Code sends. Each becomes an `[Image #N]` placeholder in the stored body and an image block the model sees on the turn this message opens. Up to 10, 5 MiB each; PNG, JPEG, GIF, or WebP. Claude harness only.
6061
+ */
6062
+ images?: components['schemas']['ImageAttachment'][];
5958
6063
  /**
5959
6064
  * Message
5960
- * @description The message text.
6065
+ * @description The message text. May be empty when `images` is not.
5961
6066
  */
5962
6067
  message: string;
5963
6068
  };
@@ -6001,12 +6106,14 @@ interface components {
6001
6106
  * disagree about what a session looks like.
6002
6107
  */
6003
6108
  Session: {
6004
- /** @description The agent that ran: the config the session executed, where that config came from, and any override merged into it. */
6005
- agent: components['schemas']['SessionAgent'];
6006
6109
  /** @description The principal this session is attributed to. */
6007
6110
  attribution?: components['schemas']['SessionAttribution'];
6111
+ /** @description The automation the session was started from, or null for a raw session started with POST /v1/sessions. */
6112
+ automation?: components['schemas']['SessionAutomation'] | null;
6008
6113
  /** @description The spend budget enforced for this session. */
6009
6114
  budget?: components['schemas']['SessionBudget'];
6115
+ /** @description What the session ran on, frozen when it was created: the harness block, the resolved environment, permissions, skills, output contract, and budget. */
6116
+ config: components['schemas']['SessionConfig'];
6010
6117
  /**
6011
6118
  * Context Repository
6012
6119
  * @description The "owner/name" repository context the session was started in, if any.
@@ -6020,7 +6127,7 @@ interface components {
6020
6127
  * @description When the session was created.
6021
6128
  */
6022
6129
  created_at: string;
6023
- /** @description The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is inside agent.config.environment. */
6130
+ /** @description The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is `config.environment`. */
6024
6131
  environment?: components['schemas']['SessionEnvironment'];
6025
6132
  /** @description How the session ended; null until it is terminal. */
6026
6133
  exit_status?: components['schemas']['SessionExitStatus'] | null;
@@ -6062,7 +6169,7 @@ interface components {
6062
6169
  prompting: components['schemas']['SessionPrompting'];
6063
6170
  /** @description Lifecycle state of the durable conversation, or null for sessions without one. */
6064
6171
  session_state?: components['schemas']['SessionState'] | null;
6065
- /** @description Where the session came from (e.g. react, manual, api, cli, mention, cron). */
6172
+ /** @description Where the session came from (e.g. react, web, api, cli, mention, cron). */
6066
6173
  source: components['schemas']['SessionSource'];
6067
6174
  /** @description Execution status of the session. */
6068
6175
  status: components['schemas']['SessionStatus'];
@@ -6086,35 +6193,6 @@ interface components {
6086
6193
  */
6087
6194
  updated_at: string;
6088
6195
  };
6089
- /**
6090
- * SessionAgent
6091
- * @description The agent this session ran: the definition it actually executed, where
6092
- * that definition came from, and the diff that was merged in — the same
6093
- * effective-value-plus-provenance shape `SessionBudget` uses.
6094
- *
6095
- * `config` is the snapshot frozen when the session was created;
6096
- * `automation_id` points at the automation as it exists NOW. They diverge
6097
- * legitimately: a YAML edit after the session started, or any `override`,
6098
- * leaves the pointer describing something the session never ran.
6099
- */
6100
- SessionAgent: {
6101
- /**
6102
- * Automation Id
6103
- * @description Identifier of the automation this session's snapshot was taken from. Null for raw sessions (nothing saved behind them), templates, and built-in agents. Points at the automation as it exists now, which may have changed since.
6104
- */
6105
- automation_id?: string | null;
6106
- /** @description The agent definition the session actually ran, frozen when the session was created. */
6107
- config: components['schemas']['AgentConfig'];
6108
- /**
6109
- * Override
6110
- * @description The partial-config override merged into `config` for this session, or null when the config ran unmodified. `config` is the merged result; this is the diff.
6111
- */
6112
- override?: {
6113
- [key: string]: unknown;
6114
- } | null;
6115
- /** @description How this session's config was chosen. */
6116
- source: components['schemas']['AgentConfigSource'];
6117
- };
6118
6196
  /**
6119
6197
  * SessionAttribution
6120
6198
  * @description The principal a session is attributed to: what kind, its id, and — when
@@ -6131,6 +6209,22 @@ interface components {
6131
6209
  /** @description The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user. */
6132
6210
  user?: components['schemas']['GithubAccountSnippet'] | null;
6133
6211
  };
6212
+ /**
6213
+ * SessionAutomation
6214
+ * @description The automation this session was started from: the definition frozen
6215
+ * when the session was created, and the saved automation it came from as it
6216
+ * exists NOW. They diverge legitimately — a YAML edit after the session
6217
+ * started leaves the pointer describing something the session never ran.
6218
+ */
6219
+ SessionAutomation: {
6220
+ /** @description The automation definition the session was started from, frozen when the session was created. */
6221
+ config: components['schemas']['AutomationConfig'];
6222
+ /**
6223
+ * Id
6224
+ * @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.
6225
+ */
6226
+ id?: string | null;
6227
+ };
6134
6228
  /**
6135
6229
  * SessionBudget
6136
6230
  * @description The spend budget actually enforced for this session, and which layer of
@@ -6149,6 +6243,56 @@ interface components {
6149
6243
  */
6150
6244
  source: components['schemas']['BudgetSource'];
6151
6245
  };
6246
+ /**
6247
+ * SessionConfig
6248
+ * @description What one session runs on: the harness block(s), where it runs, what it
6249
+ * may touch, its skills, its exit contract, and its spend cap. Every session
6250
+ * freezes one of these (`agent_sessions.session_config`); an automation
6251
+ * carries one under `session:` (`AutomationConfig.session`); and
6252
+ * `POST /v1/sessions` is this shape flattened onto the request body, plus the
6253
+ * run settings. Nothing in here is an automation's identity or trigger —
6254
+ * those belong to `AutomationConfig`.
6255
+ *
6256
+ * Field order is the canonical key order for `session:` blocks and YAML
6257
+ * exports: what runs (`claude`/`codex`), where (`environment`), what it may
6258
+ * touch (`permissions`), then the rest.
6259
+ */
6260
+ SessionConfig: {
6261
+ /** @default {} */
6262
+ budget: components['schemas']['BudgetConfig'];
6263
+ /**
6264
+ * @default {
6265
+ * "system": ""
6266
+ * }
6267
+ */
6268
+ claude: components['schemas']['ClaudeConfig'];
6269
+ codex?: components['schemas']['CodexConfig'] | null;
6270
+ /**
6271
+ * Environment
6272
+ * @default {
6273
+ * "compute": {},
6274
+ * "hooks": {},
6275
+ * "image": {},
6276
+ * "mcp_servers": [],
6277
+ * "repositories": [],
6278
+ * "variables": []
6279
+ * }
6280
+ */
6281
+ environment: string | components['schemas']['EnvironmentConfig'];
6282
+ output?: components['schemas']['OutputConfig'] | null;
6283
+ /**
6284
+ * @default {
6285
+ * "ellipsis": true,
6286
+ * "github": {}
6287
+ * }
6288
+ */
6289
+ permissions: components['schemas']['PermissionsConfig'];
6290
+ /**
6291
+ * Skills
6292
+ * @default []
6293
+ */
6294
+ skills: components['schemas']['SkillRef'][];
6295
+ };
6152
6296
  /**
6153
6297
  * SessionCost
6154
6298
  * @description What a session (or one turn of it) cost, in millicents.
@@ -6189,11 +6333,27 @@ interface components {
6189
6333
  */
6190
6334
  total: number;
6191
6335
  };
6336
+ /**
6337
+ * SessionDiffResponse
6338
+ * @description A session's uncommitted working-tree changes, one patch per file.
6339
+ */
6340
+ SessionDiffResponse: {
6341
+ /**
6342
+ * Files
6343
+ * @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.
6344
+ */
6345
+ files: components['schemas']['SessionGitPatchFile'][];
6346
+ /**
6347
+ * Omitted Paths
6348
+ * @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.
6349
+ */
6350
+ omitted_paths: string[];
6351
+ };
6192
6352
  /**
6193
6353
  * SessionEnvironment
6194
6354
  * @description The environment this session resolved: which saved environment (as it
6195
6355
  * exists now) and how it was chosen. The environment's frozen BODY rides
6196
- * inside `agent.config.environment` — substitution happens before the config
6356
+ * inside `config.environment` — substitution happens before the config
6197
6357
  * snapshot freezes — so this object is provenance, not payload.
6198
6358
  */
6199
6359
  SessionEnvironment: {
@@ -6202,7 +6362,7 @@ interface components {
6202
6362
  * @description Identifier of the saved environment the session's config resolved. Null for an inline environment block or the built-in basic sandbox.
6203
6363
  */
6204
6364
  environment_id?: string | null;
6205
- /** @description How the environment was chosen (request, agent_config, repo_default, account_default, platform_default). Null when the config carried its own inline environment. */
6365
+ /** @description How the environment was chosen (request, agent_config, platform_default; repo_default and account_default on sessions from before those ladders were removed). Null when the config carried its own inline environment. */
6206
6366
  source?: components['schemas']['EnvironmentSource'] | null;
6207
6367
  };
6208
6368
  /**
@@ -6263,6 +6423,28 @@ interface components {
6263
6423
  /** Status */
6264
6424
  status: string;
6265
6425
  };
6426
+ /**
6427
+ * SessionGitPatchFile
6428
+ * @description One file's patch, split out of `git diff HEAD` at capture time.
6429
+ *
6430
+ * Stored per file rather than as one blob because that is how a viewer reads
6431
+ * it: a row per changed file, opened one at a time. Counts and status are NOT
6432
+ * repeated here — they live on the matching SessionGitFile in
6433
+ * `agent_sessions.output_git`, which rides on every session read, so a surface
6434
+ * lists the changed files (and their +/−) before it fetches a single hunk. The
6435
+ * join key is (full_name, path).
6436
+ *
6437
+ * `patch` is the unified-diff section for this file, `diff --git` header
6438
+ * included, exactly as git emitted it.
6439
+ */
6440
+ SessionGitPatchFile: {
6441
+ /** Full Name */
6442
+ full_name: string;
6443
+ /** Patch */
6444
+ patch: string;
6445
+ /** Path */
6446
+ path: string;
6447
+ };
6266
6448
  /**
6267
6449
  * SessionGitPr
6268
6450
  * @description A pull request the session opened in this repo, written the moment the
@@ -6373,7 +6555,7 @@ interface components {
6373
6555
  author?: string | null;
6374
6556
  /**
6375
6557
  * Body
6376
- * @description The message text.
6558
+ * @description The message text, with one `[Image #N]` placeholder per attached image.
6377
6559
  */
6378
6560
  body: string;
6379
6561
  /**
@@ -6402,6 +6584,11 @@ interface components {
6402
6584
  * @description Unique identifier of the message.
6403
6585
  */
6404
6586
  id: string;
6587
+ /**
6588
+ * Images
6589
+ * @description Images attached to the message, metadata only: index, media type, size. The bytes go to the model, never over the stream.
6590
+ */
6591
+ images?: components['schemas']['SessionMessageImage'][];
6405
6592
  /**
6406
6593
  * Sender Attribution Id
6407
6594
  * @description Identifier of the principal that sent the message, if attributed.
@@ -6417,6 +6604,28 @@ interface components {
6417
6604
  /** @description Delivery status of the message. */
6418
6605
  status: components['schemas']['SessionMessageStatus'];
6419
6606
  };
6607
+ /**
6608
+ * SessionMessageImage
6609
+ * @description One image on a message, metadata only. `index` is the N in the
6610
+ * `[Image #N]` placeholder in the message body.
6611
+ */
6612
+ SessionMessageImage: {
6613
+ /**
6614
+ * Index
6615
+ * @description 1-based position: the N in `[Image #N]`.
6616
+ */
6617
+ index: number;
6618
+ /**
6619
+ * Media Type
6620
+ * @description The image's MIME type.
6621
+ */
6622
+ media_type: string;
6623
+ /**
6624
+ * Size Bytes
6625
+ * @description Size of the decoded image, in bytes.
6626
+ */
6627
+ size_bytes: number;
6628
+ };
6420
6629
  /**
6421
6630
  * SessionMessageResponse
6422
6631
  * @description One inbox message.
@@ -6510,9 +6719,12 @@ interface components {
6510
6719
  };
6511
6720
  /**
6512
6721
  * SessionSource
6722
+ * @description Where a session came from: the credential that started it (web app,
6723
+ * API key, CLI) or the trigger that fired (react, mention, cron). Never
6724
+ * taken from a request body.
6513
6725
  * @enum {string}
6514
6726
  */
6515
- SessionSource: 'react' | 'manual' | 'api' | 'cli' | 'mention' | 'cron';
6727
+ SessionSource: 'react' | 'web' | 'api' | 'cli' | 'mention' | 'cron';
6516
6728
  /**
6517
6729
  * SessionState
6518
6730
  * @description Lifecycle of a keyed (multi-turn) session — the durable conversation.
@@ -6648,6 +6860,35 @@ interface components {
6648
6860
  */
6649
6861
  sessions: components['schemas']['Session'][];
6650
6862
  };
6863
+ /**
6864
+ * SettingsRef
6865
+ * @description A config-declared Claude Code settings.json, resolved at run start and
6866
+ * passed to `claude --settings <path>`. That is the CLI settings tier — BELOW
6867
+ * Ellipsis's managed-settings.json floor — so it customizes behavior (model
6868
+ * permissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a
6869
+ * security setting. Lets a team point the cloud agent at the same settings file
6870
+ * they already use with Claude Code locally instead of re-encoding it as YAML.
6871
+ */
6872
+ SettingsRef: {
6873
+ /** Path */
6874
+ path: string;
6875
+ repository?: components['schemas']['RepositoryRef'] | null;
6876
+ };
6877
+ /**
6878
+ * SkillRef
6879
+ * @description One config-declared Claude Code skill: a repository directory containing
6880
+ * a SKILL.md, resolved at run start and installed at the sandbox's personal
6881
+ * skill level (`~/.claude/skills/<basename(path)>/`). This is how a config
6882
+ * brings in skills its cloned repositories don't provide — cross-repo refs
6883
+ * (an org-wide skills repo), public third-party repos, and repo-less runs.
6884
+ * Skills under a cloned repo's own `.claude/skills/` load by themselves and
6885
+ * don't need an entry here.
6886
+ */
6887
+ SkillRef: {
6888
+ /** Path */
6889
+ path: string;
6890
+ repository?: components['schemas']['RepositoryRef'] | null;
6891
+ };
6651
6892
  /**
6652
6893
  * SlackChannel
6653
6894
  * @description One channel in the connected Slack workspace.
@@ -6775,7 +7016,7 @@ interface components {
6775
7016
  /**
6776
7017
  * StartAgentSessionRequest
6777
7018
  * @description Parameters for starting a raw session: where it runs, its first
6778
- * message, and the run's own settings. Flat, in the AgentConfig vocabulary
7019
+ * message, and the run's own settings. Flat, in the AutomationConfig vocabulary
6779
7020
  * — a `claude:` or `permissions:` block copied from an agents/ YAML file
6780
7021
  * pastes in verbatim. There is no automation behind a raw session; to run a
6781
7022
  * saved automation, invoke it with POST /v1/automations/{automation_id}/sessions.
@@ -6791,20 +7032,25 @@ interface components {
6791
7032
  */
6792
7033
  budget?: number | null;
6793
7034
  /** @description The Claude-harness block: `{"model": ...}` to pick this session's model, plus system/effort/fallback_model/max_turns/settings. Omit the model to run the organization's default. */
6794
- claude?: components['schemas']['AgentConfigClaude'] | null;
7035
+ claude?: components['schemas']['ClaudeConfig'] | null;
6795
7036
  /** @description The Codex-harness block. Its presence selects the Codex harness, exactly as in a saved automation; a request may not carry both `claude` and `codex`. */
6796
- codex?: components['schemas']['AgentConfigCodex'] | null;
7037
+ codex?: components['schemas']['CodexConfig'] | null;
6797
7038
  /**
6798
7039
  * Environment
6799
- * @description Where the session runs. A STRING is a saved environment's name or `env_...` id. An OBJECT is an inline environment for this session only. Omitted, the session runs in the organization's default environment, else the built-in basic sandbox.
7040
+ * @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. Omitted, the session runs in the built-in basic sandbox — nothing outside the request picks the environment.
6800
7041
  */
6801
- environment?: string | components['schemas']['AgentConfigEnvironment'] | null;
7042
+ environment?: string | components['schemas']['EnvironmentConfig'] | null;
6802
7043
  /**
6803
7044
  * Force Rebuild
6804
7045
  * @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`.
6805
7046
  * @default false
6806
7047
  */
6807
7048
  force_rebuild: boolean;
7049
+ /**
7050
+ * Images
7051
+ * @description Images attached to the first message, base64 inline — what a paste into Claude Code sends. Each becomes an `[Image #N]` placeholder in the prompt and an image block the model sees on turn 0. Up to 10, 5 MiB each; PNG, JPEG, GIF, or WebP. Claude harness only.
7052
+ */
7053
+ images?: components['schemas']['ImageAttachment'][];
6808
7054
  /**
6809
7055
  * Interactive
6810
7056
  * @description Whether the session stays open for messages after its first turn. Set false for a one-shot run that does its job and closes without holding a warm sandbox; a one-shot run must carry a prompt, since nothing can ever be sent to it later. Sessions on the Codex harness are one-shot regardless.
@@ -6820,19 +7066,24 @@ interface components {
6820
7066
  [key: string]: string;
6821
7067
  };
6822
7068
  /** @description The structured-output exit contract for this session. */
6823
- output?: components['schemas']['AgentConfigOutput'] | null;
7069
+ output?: components['schemas']['OutputConfig'] | null;
6824
7070
  /** @description What the session may touch, per minted credential. */
6825
- permissions?: components['schemas']['AgentConfigPermissions'] | null;
7071
+ permissions?: components['schemas']['PermissionsConfig'] | null;
6826
7072
  /**
6827
7073
  * Prompt
6828
7074
  * @description The session's first message. Omit it and the session starts idle: the sandbox spins up, the agent waits at the prompt, and the first message you send opens turn 0.
6829
7075
  */
6830
7076
  prompt?: string | null;
7077
+ /**
7078
+ * Repositories
7079
+ * @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.
7080
+ */
7081
+ repositories?: string[] | null;
6831
7082
  /**
6832
7083
  * Skills
6833
7084
  * @description Skills installed for this session.
6834
7085
  */
6835
- skills?: components['schemas']['AgentConfigSkill'][] | null;
7086
+ skills?: components['schemas']['SkillRef'][] | null;
6836
7087
  };
6837
7088
  /**
6838
7089
  * StartAutomationSessionRequest
@@ -6901,6 +7152,12 @@ interface components {
6901
7152
  */
6902
7153
  verification_uri_complete: string;
6903
7154
  };
7155
+ /** SystemFileRef */
7156
+ SystemFileRef: {
7157
+ /** File */
7158
+ file: string;
7159
+ repository?: components['schemas']['RepositoryRef'] | null;
7160
+ };
6904
7161
  /**
6905
7162
  * TokensInfo
6906
7163
  * @description Token/cost usage, per record (one API call's counts, aggregate fields at
@@ -6963,7 +7220,7 @@ interface components {
6963
7220
  */
6964
7221
  UpdateAutomationRequest: {
6965
7222
  /** @description The automation's new definition. Replaces the previous one wholesale — this is not a partial update. */
6966
- automation: components['schemas']['AgentConfig'];
7223
+ automation: components['schemas']['AutomationConfig'];
6967
7224
  };
6968
7225
  /**
6969
7226
  * UpdateEnvironmentRequest
@@ -6971,7 +7228,7 @@ interface components {
6971
7228
  */
6972
7229
  UpdateEnvironmentRequest: {
6973
7230
  /** @description The environment's new definition. Replaces the previous one wholesale — this is not a partial update. */
6974
- environment: components['schemas']['EnvironmentConfig'];
7231
+ environment: components['schemas']['EnvironmentDocument'];
6975
7232
  };
6976
7233
  /**
6977
7234
  * UsageDailyPoint
@@ -7962,7 +8219,76 @@ interface operations {
7962
8219
  'application/json': components['schemas']['ErrorResponse'];
7963
8220
  };
7964
8221
  };
7965
- /** @description The automation or repository was not found in your account. */
8222
+ /** @description The automation or repository was not found in your account. */
8223
+ 404: {
8224
+ headers: {
8225
+ [name: string]: unknown;
8226
+ };
8227
+ content: {
8228
+ 'application/json': components['schemas']['ErrorResponse'];
8229
+ };
8230
+ };
8231
+ /** @description The automation is already defined by a file, a link is already open for it, a file already exists at that path, or another automation syncs from it. */
8232
+ 409: {
8233
+ headers: {
8234
+ [name: string]: unknown;
8235
+ };
8236
+ content: {
8237
+ 'application/json': components['schemas']['ErrorResponse'];
8238
+ };
8239
+ };
8240
+ /** @description GitHub rejected the pull request. */
8241
+ 422: {
8242
+ headers: {
8243
+ [name: string]: unknown;
8244
+ };
8245
+ content: {
8246
+ 'application/json': components['schemas']['ErrorResponse'];
8247
+ };
8248
+ };
8249
+ };
8250
+ };
8251
+ get_automation_metrics: {
8252
+ parameters: {
8253
+ query?: never;
8254
+ header?: {
8255
+ 'user-agent'?: string | null;
8256
+ };
8257
+ path: {
8258
+ automation_id: string;
8259
+ };
8260
+ cookie?: never;
8261
+ };
8262
+ requestBody?: never;
8263
+ responses: {
8264
+ /** @description Successful Response */
8265
+ 200: {
8266
+ headers: {
8267
+ [name: string]: unknown;
8268
+ };
8269
+ content: {
8270
+ 'application/json': components['schemas']['AutomationMetricsResponse'];
8271
+ };
8272
+ };
8273
+ /** @description The bearer token is missing, invalid, or revoked. */
8274
+ 401: {
8275
+ headers: {
8276
+ [name: string]: unknown;
8277
+ };
8278
+ content: {
8279
+ 'application/json': components['schemas']['ErrorResponse'];
8280
+ };
8281
+ };
8282
+ /** @description The credential may not perform this action, or the account is blocked. */
8283
+ 403: {
8284
+ headers: {
8285
+ [name: string]: unknown;
8286
+ };
8287
+ content: {
8288
+ 'application/json': components['schemas']['ErrorResponse'];
8289
+ };
8290
+ };
8291
+ /** @description No such automation in your account. */
7966
8292
  404: {
7967
8293
  headers: {
7968
8294
  [name: string]: unknown;
@@ -7971,22 +8297,13 @@ interface operations {
7971
8297
  'application/json': components['schemas']['ErrorResponse'];
7972
8298
  };
7973
8299
  };
7974
- /** @description The automation is already defined by a file, a link is already open for it, a file already exists at that path, or another automation syncs from it. */
7975
- 409: {
7976
- headers: {
7977
- [name: string]: unknown;
7978
- };
7979
- content: {
7980
- 'application/json': components['schemas']['ErrorResponse'];
7981
- };
7982
- };
7983
- /** @description GitHub rejected the pull request. */
8300
+ /** @description Validation Error */
7984
8301
  422: {
7985
8302
  headers: {
7986
8303
  [name: string]: unknown;
7987
8304
  };
7988
8305
  content: {
7989
- 'application/json': components['schemas']['ErrorResponse'];
8306
+ 'application/json': components['schemas']['HTTPValidationError'];
7990
8307
  };
7991
8308
  };
7992
8309
  };
@@ -9541,10 +9858,16 @@ interface operations {
9541
9858
  list_reviews: {
9542
9859
  parameters: {
9543
9860
  query?: {
9544
- owner?: string | null;
9545
- repo?: string | null;
9546
- pull_request_number?: number | null;
9547
- status?: components['schemas']['CodeReviewRunStatus'] | null;
9861
+ /** @description Only reviews on these repositories, each as owner/name. Repeat the parameter for several. */
9862
+ repository?: string[];
9863
+ /** @description Only reviews on these pull request numbers. Repeat the parameter for several. */
9864
+ pull_request_number?: number[];
9865
+ /** @description Only reviews in these statuses. Repeat the parameter for several. */
9866
+ status?: components['schemas']['CodeReviewRunStatus'][];
9867
+ /** @description Only reviews created at or after this time. */
9868
+ start?: string | null;
9869
+ /** @description Only reviews created at or before this time. */
9870
+ end?: string | null;
9548
9871
  limit?: number;
9549
9872
  cursor?: string | null;
9550
9873
  };
@@ -9565,7 +9888,7 @@ interface operations {
9565
9888
  'application/json': components['schemas']['ReviewsListResponse'];
9566
9889
  };
9567
9890
  };
9568
- /** @description Filtering by repository requires both owner and repo (and pull_request_number requires them too). */
9891
+ /** @description A `repository` value is not of the form owner/name. */
9569
9892
  400: {
9570
9893
  headers: {
9571
9894
  [name: string]: unknown;
@@ -9592,7 +9915,7 @@ interface operations {
9592
9915
  'application/json': components['schemas']['ErrorResponse'];
9593
9916
  };
9594
9917
  };
9595
- /** @description The repository was not found in your account. */
9918
+ /** @description A `repository` was not found in your account. */
9596
9919
  404: {
9597
9920
  headers: {
9598
9921
  [name: string]: unknown;
@@ -10000,7 +10323,7 @@ interface operations {
10000
10323
  'application/json': components['schemas']['SessionResponse'];
10001
10324
  };
10002
10325
  };
10003
- /** @description The request is incompatible with itself (a one-shot run with no prompt, or both `claude` and `codex`), its keys produce an invalid config, or `budget` exceeds the organization's per-session ceiling. */
10326
+ /** @description The request is incompatible with itself (a one-shot run with no prompt, both `claude` and `codex`, or images on the Codex harness), an image is invalid or over the limit, its keys produce an invalid config, or `budget` exceeds the organization's per-session ceiling. */
10004
10327
  400: {
10005
10328
  headers: {
10006
10329
  [name: string]: unknown;
@@ -10107,6 +10430,66 @@ interface operations {
10107
10430
  };
10108
10431
  };
10109
10432
  };
10433
+ get_agent_session_diff: {
10434
+ parameters: {
10435
+ query?: never;
10436
+ header?: {
10437
+ 'user-agent'?: string | null;
10438
+ };
10439
+ path: {
10440
+ session_id: string;
10441
+ };
10442
+ cookie?: never;
10443
+ };
10444
+ requestBody?: never;
10445
+ responses: {
10446
+ /** @description Successful Response */
10447
+ 200: {
10448
+ headers: {
10449
+ [name: string]: unknown;
10450
+ };
10451
+ content: {
10452
+ 'application/json': components['schemas']['SessionDiffResponse'];
10453
+ };
10454
+ };
10455
+ /** @description The bearer token is missing, invalid, or revoked. */
10456
+ 401: {
10457
+ headers: {
10458
+ [name: string]: unknown;
10459
+ };
10460
+ content: {
10461
+ 'application/json': components['schemas']['ErrorResponse'];
10462
+ };
10463
+ };
10464
+ /** @description The credential may not perform this action, or the account is blocked. */
10465
+ 403: {
10466
+ headers: {
10467
+ [name: string]: unknown;
10468
+ };
10469
+ content: {
10470
+ 'application/json': components['schemas']['ErrorResponse'];
10471
+ };
10472
+ };
10473
+ /** @description No such session in your account. */
10474
+ 404: {
10475
+ headers: {
10476
+ [name: string]: unknown;
10477
+ };
10478
+ content: {
10479
+ 'application/json': components['schemas']['ErrorResponse'];
10480
+ };
10481
+ };
10482
+ /** @description Validation Error */
10483
+ 422: {
10484
+ headers: {
10485
+ [name: string]: unknown;
10486
+ };
10487
+ content: {
10488
+ 'application/json': components['schemas']['HTTPValidationError'];
10489
+ };
10490
+ };
10491
+ };
10492
+ };
10110
10493
  export_agent_session: {
10111
10494
  parameters: {
10112
10495
  query?: never;
@@ -10193,7 +10576,7 @@ interface operations {
10193
10576
  'application/json': components['schemas']['SessionMessageResponse'];
10194
10577
  };
10195
10578
  };
10196
- /** @description The message is empty. */
10579
+ /** @description The message is empty (no text and no images), an image is invalid or over the limit, or the session runs on the Codex harness (images are Claude-only). */
10197
10580
  400: {
10198
10581
  headers: {
10199
10582
  [name: string]: unknown;
@@ -10614,15 +10997,6 @@ interface operations {
10614
10997
  'application/json': components['schemas']['ErrorResponse'];
10615
10998
  };
10616
10999
  };
10617
- /** @description The default environment does not exist in your account. */
10618
- 404: {
10619
- headers: {
10620
- [name: string]: unknown;
10621
- };
10622
- content: {
10623
- 'application/json': components['schemas']['ErrorResponse'];
10624
- };
10625
- };
10626
11000
  /** @description Validation Error */
10627
11001
  422: {
10628
11002
  headers: {
@@ -10803,6 +11177,7 @@ type AttributionType = 'github_user' | 'linear_user' | 'slack_user' | 'api_key';
10803
11177
  * Delivery status of the message.
10804
11178
  */
10805
11179
  type SessionMessageStatus = 'pending' | 'delivered';
11180
+ type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10806
11181
  type EffortLevel = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
10807
11182
  /**
10808
11183
  * What may be done to a resource. Strictly ordered: a grant at one level
@@ -10822,20 +11197,6 @@ type RepositoryFilter = {
10822
11197
  type LinearIssueAction = 'opened';
10823
11198
  type PullRequestAction = 'opened' | 'pushed' | 'merged' | 'closed' | 'review_submitted' | 'commented';
10824
11199
  type SentryAction = 'issue_alert' | 'metric_alert';
10825
- /**
10826
- * The surface an @ellipsis mention can come from.
10827
- *
10828
- * No SLACK member: Slack routing is not a trigger on an agent config, it is the
10829
- * `slack.yaml` routing file (`SlackConfig`), which answers the questions a
10830
- * platform list cannot — which channel, and whose DM. A mention trigger listing
10831
- * `slack` is therefore a config error, not a silently-never-fires config.
10832
- */
10833
- type AgentConfigMentionPlatform = 'github' | 'linear';
10834
- /**
10835
- * How this session's config was chosen.
10836
- */
10837
- type AgentConfigSource = 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
10838
- type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10839
11200
  /**
10840
11201
  * Where the resolved budget came from.
10841
11202
  */
@@ -10886,9 +11247,9 @@ type PromptBlockedReason = 'mention_surface' | 'ephemeral_trigger' | 'non_intera
10886
11247
  */
10887
11248
  type SessionState = 'idle' | 'running' | 'closed';
10888
11249
  /**
10889
- * Where the session came from (e.g. react, manual, api, cli, mention, cron).
11250
+ * Where the session came from (e.g. react, web, api, cli, mention, cron).
10890
11251
  */
10891
- type SessionSource = 'react' | 'manual' | 'api' | 'cli' | 'mention' | 'cron';
11252
+ type SessionSource = 'react' | 'web' | 'api' | 'cli' | 'mention' | 'cron';
10892
11253
  /**
10893
11254
  * Execution status of the session.
10894
11255
  */
@@ -10931,7 +11292,7 @@ interface SessionMessage {
10931
11292
  */
10932
11293
  author: string | null;
10933
11294
  /**
10934
- * The message text.
11295
+ * The message text, with one `[Image #N]` placeholder per attached image.
10935
11296
  */
10936
11297
  body: string;
10937
11298
  /**
@@ -10954,6 +11315,10 @@ interface SessionMessage {
10954
11315
  * Unique identifier of the message.
10955
11316
  */
10956
11317
  id: string;
11318
+ /**
11319
+ * Images attached to the message, metadata only: index, media type, size. The bytes go to the model, never over the stream.
11320
+ */
11321
+ images: SessionMessageImage[];
10957
11322
  /**
10958
11323
  * Identifier of the principal that sent the message, if attributed.
10959
11324
  */
@@ -10968,13 +11333,35 @@ interface SessionMessage {
10968
11333
  session_id: string;
10969
11334
  status: SessionMessageStatus;
10970
11335
  }
11336
+ /**
11337
+ * One image on a message, metadata only. `index` is the N in the
11338
+ * `[Image #N]` placeholder in the message body.
11339
+ */
11340
+ interface SessionMessageImage {
11341
+ /**
11342
+ * 1-based position: the N in `[Image #N]`.
11343
+ */
11344
+ index: number;
11345
+ /**
11346
+ * The image's MIME type.
11347
+ */
11348
+ media_type: string;
11349
+ /**
11350
+ * Size of the decoded image, in bytes.
11351
+ */
11352
+ size_bytes: number;
11353
+ }
10971
11354
  /**
10972
11355
  * The session's current state.
10973
11356
  */
10974
11357
  interface Session {
10975
- agent: SessionAgent;
10976
11358
  attribution: SessionAttribution;
11359
+ /**
11360
+ * The automation the session was started from, or null for a raw session started with POST /v1/sessions.
11361
+ */
11362
+ automation: SessionAutomation | null;
10977
11363
  budget: SessionBudget;
11364
+ config: SessionConfig1;
10978
11365
  /**
10979
11366
  * The "owner/name" repository context the session was started in, if any.
10980
11367
  */
@@ -11041,50 +11428,139 @@ interface Session {
11041
11428
  updated_at: string;
11042
11429
  }
11043
11430
  /**
11044
- * The agent that ran: the config the session executed, where that config came from, and any override merged into it.
11431
+ * The principal this session is attributed to.
11045
11432
  */
11046
- interface SessionAgent {
11433
+ interface SessionAttribution {
11434
+ /**
11435
+ * Identifier of the principal the session is attributed to.
11436
+ */
11437
+ id: string | null;
11438
+ /**
11439
+ * Kind of principal the session is attributed to (e.g. a GitHub user or an API key).
11440
+ */
11441
+ type: AttributionType | null;
11047
11442
  /**
11048
- * Identifier of the automation this session's snapshot was taken from. Null for raw sessions (nothing saved behind them), templates, and built-in agents. Points at the automation as it exists now, which may have changed since.
11443
+ * The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user.
11049
11444
  */
11050
- automation_id: string | null;
11051
- config: AgentConfig;
11445
+ user: GithubAccountSnippet | null;
11446
+ }
11447
+ /**
11448
+ * Sometimes the GitHub API returns a user of github (can include bots)
11449
+ * using this snippet instead of the full GithubAccount model. One example,
11450
+ * is when the API returns a pull request.
11451
+ *
11452
+ * This is the least amount of info we need to represent a GitHub account.
11453
+ */
11454
+ interface GithubAccountSnippet {
11455
+ avatar_url: string;
11456
+ id: number;
11457
+ login: string;
11458
+ type: GithubAccountType;
11459
+ }
11460
+ /**
11461
+ * The automation this session was started from: the definition frozen
11462
+ * when the session was created, and the saved automation it came from as it
11463
+ * exists NOW. They diverge legitimately — a YAML edit after the session
11464
+ * started leaves the pointer describing something the session never ran.
11465
+ */
11466
+ interface SessionAutomation {
11467
+ config: AutomationConfig;
11052
11468
  /**
11053
- * The partial-config override merged into `config` for this session, or null when the config ran unmodified. `config` is the merged result; this is the diff.
11469
+ * Identifier of the saved automation this session's snapshot was taken from. Null for a routing-file agent, a code-review stage agent, or the built-in mention agent, which have no saved automation behind them. Points at the automation as it exists now, which may have changed since.
11054
11470
  */
11055
- override: {
11471
+ id: string | null;
11472
+ }
11473
+ /**
11474
+ * The automation definition the session was started from, frozen when the session was created.
11475
+ */
11476
+ interface AutomationConfig {
11477
+ ellipsis: AutomationIdentity;
11478
+ input: InputContract | null;
11479
+ session: SessionConfig;
11480
+ trigger: (CronTrigger | ReactTrigger) | null;
11481
+ }
11482
+ /**
11483
+ * The Ellipsis product namespace for a config file: which schema this is
11484
+ * (`version`), the human-facing identity (`name`/`description`), freeform
11485
+ * organizational `metadata`, and whether the agent is `enabled`. The
11486
+ * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
11487
+ * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
11488
+ * config directory) — see `yaml_is_ellipsis_config`.
11489
+ *
11490
+ * `enabled` is agent behavior, not freeform metadata, so it stays inside
11491
+ * the config `sha` (only `metadata` is sha-excluded). Whether a session
11492
+ * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
11493
+ * not a config one.
11494
+ */
11495
+ interface AutomationIdentity {
11496
+ description: string | null;
11497
+ enabled: boolean;
11498
+ metadata: ConfigMetadata;
11499
+ name: string | null;
11500
+ version: string;
11501
+ }
11502
+ interface ConfigMetadata {
11503
+ annotations: {
11504
+ [k: string]: string;
11505
+ };
11506
+ labels: string[];
11507
+ }
11508
+ /**
11509
+ * The typed input contract: what goes INTO a session (the trigger is
11510
+ * when it happens; this is what goes in).
11511
+ *
11512
+ * `json_schema` types the payload a caller-started session takes
11513
+ * (`POST /v1/sessions` `input`, validated at the door; required when
11514
+ * declared). It is illegal on a react-triggered agent — react payloads are
11515
+ * platform-shaped (the published surface field sets), not caller-shaped.
11516
+ *
11517
+ * `message` is the initial-message template: exact `{{path}}` substitution
11518
+ * over the caller payload (or, on a react agent, over the surface's
11519
+ * published fields), no conditionals/loops/filters. Refs are validated at
11520
+ * deploy time against the governing field set (see AutomationConfig's
11521
+ * `_check_input`).
11522
+ */
11523
+ interface InputContract {
11524
+ json_schema: {
11056
11525
  [k: string]: unknown;
11057
11526
  } | null;
11058
- source: AgentConfigSource;
11527
+ message: string | null;
11059
11528
  }
11060
11529
  /**
11061
- * The agent definition the session actually ran, frozen when the session was created.
11530
+ * What one session runs on: the harness block(s), where it runs, what it
11531
+ * may touch, its skills, its exit contract, and its spend cap. Every session
11532
+ * freezes one of these (`agent_sessions.session_config`); an automation
11533
+ * carries one under `session:` (`AutomationConfig.session`); and
11534
+ * `POST /v1/sessions` is this shape flattened onto the request body, plus the
11535
+ * run settings. Nothing in here is an automation's identity or trigger —
11536
+ * those belong to `AutomationConfig`.
11537
+ *
11538
+ * Field order is the canonical key order for `session:` blocks and YAML
11539
+ * exports: what runs (`claude`/`codex`), where (`environment`), what it may
11540
+ * touch (`permissions`), then the rest.
11062
11541
  */
11063
- interface AgentConfig {
11064
- budget: AgentConfigBudget;
11065
- claude: AgentConfigClaude;
11066
- codex: AgentConfigCodex | null;
11067
- ellipsis: AgentConfigEllipsis;
11068
- environment: string | AgentConfigEnvironment;
11069
- input: AgentConfigInput | null;
11070
- output: AgentConfigOutput | null;
11071
- permissions: AgentConfigPermissions;
11072
- skills: AgentConfigSkill[];
11073
- trigger: (AgentConfigCronTrigger | AgentConfigReactTrigger | AgentConfigMentionTrigger) | null;
11542
+ interface SessionConfig {
11543
+ budget: BudgetConfig;
11544
+ claude: ClaudeConfig;
11545
+ codex: CodexConfig | null;
11546
+ environment: string | EnvironmentConfig;
11547
+ output: OutputConfig | null;
11548
+ permissions: PermissionsConfig;
11549
+ skills: SkillRef[];
11074
11550
  }
11075
- interface AgentConfigBudget {
11551
+ interface BudgetConfig {
11076
11552
  day: number | null;
11077
11553
  month: number | null;
11078
11554
  session: number | null;
11079
11555
  week: number | null;
11080
11556
  }
11081
- interface AgentConfigClaude {
11557
+ interface ClaudeConfig {
11082
11558
  effort: EffortLevel | null;
11083
11559
  fallback_model: string | null;
11084
11560
  max_turns: number | null;
11085
11561
  model: string | null;
11086
- settings: AgentConfigSettingsRef | null;
11087
- system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
11562
+ settings: SettingsRef | null;
11563
+ system: string | SystemFileRef | (string | SystemFileRef)[];
11088
11564
  }
11089
11565
  /**
11090
11566
  * A config-declared Claude Code settings.json, resolved at run start and
@@ -11094,25 +11570,25 @@ interface AgentConfigClaude {
11094
11570
  * security setting. Lets a team point the cloud agent at the same settings file
11095
11571
  * they already use with Claude Code locally instead of re-encoding it as YAML.
11096
11572
  */
11097
- interface AgentConfigSettingsRef {
11573
+ interface SettingsRef {
11098
11574
  path: string;
11099
- repository: AgentConfigRepository | null;
11575
+ repository: RepositoryRef | null;
11100
11576
  }
11101
- interface AgentConfigRepository {
11577
+ interface RepositoryRef {
11102
11578
  name: string;
11103
11579
  owner: string | null;
11104
11580
  ref: string | null;
11105
11581
  }
11106
- interface AgentConfigSystemFileRef {
11582
+ interface SystemFileRef {
11107
11583
  file: string;
11108
- repository: AgentConfigRepository | null;
11584
+ repository: RepositoryRef | null;
11109
11585
  }
11110
11586
  /**
11111
11587
  * The `codex:` block — run this agent on OpenAI's Codex CLI instead of
11112
11588
  * Claude Code. Declaring the block at all is what selects the harness
11113
- * (`AgentConfig.harness`).
11589
+ * (`AutomationConfig.harness`).
11114
11590
  *
11115
- * Deliberately a small subset of `AgentConfigClaude`: the fields omitted here
11591
+ * Deliberately a small subset of `ClaudeConfig`: the fields omitted here
11116
11592
  * are ones Codex has no equivalent for (`effort`, `fallback_model`,
11117
11593
  * `settings`) or that the platform does not yet wire through for this harness
11118
11594
  * (`max_turns`, `skills`, MCP servers). They are omitted rather than
@@ -11120,35 +11596,9 @@ interface AgentConfigSystemFileRef {
11120
11596
  * config that sets one fails loudly at parse time instead of silently not doing
11121
11597
  * it. The budget still bounds a run regardless.
11122
11598
  */
11123
- interface AgentConfigCodex {
11599
+ interface CodexConfig {
11124
11600
  model: string;
11125
- system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
11126
- }
11127
- /**
11128
- * The Ellipsis product namespace for a config file: which schema this is
11129
- * (`version`), the human-facing identity (`name`/`description`), freeform
11130
- * organizational `metadata`, and whether the agent is `enabled`. The
11131
- * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
11132
- * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
11133
- * config directory) — see `yaml_is_ellipsis_config`.
11134
- *
11135
- * `enabled` is agent behavior, not freeform metadata, so it stays inside
11136
- * the config `sha` (only `metadata` is sha-excluded). Whether a session
11137
- * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
11138
- * not a config one.
11139
- */
11140
- interface AgentConfigEllipsis {
11141
- description: string | null;
11142
- enabled: boolean;
11143
- metadata: AgentConfigMetadata;
11144
- name: string | null;
11145
- version: string;
11146
- }
11147
- interface AgentConfigMetadata {
11148
- annotations: {
11149
- [k: string]: string;
11150
- };
11151
- labels: string[];
11601
+ system: string | SystemFileRef | (string | SystemFileRef)[];
11152
11602
  }
11153
11603
  /**
11154
11604
  * Everything about the environment (the sandbox) the agent runs in: which
@@ -11163,13 +11613,13 @@ interface AgentConfigMetadata {
11163
11613
  * stored variables never do. This is how a config brings in the config and
11164
11614
  * credentials a custom CLI needs.
11165
11615
  */
11166
- interface AgentConfigEnvironment {
11167
- compute: AgentConfigCompute;
11168
- hooks: AgentConfigEnvironmentHooks;
11169
- image: AgentConfigEnvironmentImage;
11170
- mcp_servers: (string | AgentConfigMcpServer | AgentConfigMcpStdioServer | AgentConfigMcpRemoteServer)[];
11171
- repositories: AgentConfigRepository[];
11172
- variables: AgentConfigEnvironmentVariable[];
11616
+ interface EnvironmentConfig {
11617
+ compute: ComputeConfig;
11618
+ hooks: EnvironmentHooks;
11619
+ image: EnvironmentImage;
11620
+ mcp_servers: (string | McpServerRef | McpStdioServer | McpRemoteServer)[];
11621
+ repositories: RepositoryRef[];
11622
+ variables: EnvironmentVariable[];
11173
11623
  }
11174
11624
  /**
11175
11625
  * Sandbox compute sizing. Every field is optional; None inherits the
@@ -11193,17 +11643,17 @@ interface AgentConfigEnvironment {
11193
11643
  * Compute is billed on the requested allocation over the sandbox's
11194
11644
  * wall-clock lifetime, so a bigger/longer box costs proportionally more.
11195
11645
  */
11196
- interface AgentConfigCompute {
11646
+ interface ComputeConfig {
11197
11647
  cpu: number | null;
11198
- memory: string | AgentConfigMemorySize | null;
11199
- timeout: string | AgentConfigDuration | null;
11648
+ memory: string | MemorySize | null;
11649
+ timeout: string | Duration | null;
11200
11650
  }
11201
11651
  /**
11202
11652
  * A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
11203
11653
  * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
11204
11654
  * shorthand string.
11205
11655
  */
11206
- interface AgentConfigMemorySize {
11656
+ interface MemorySize {
11207
11657
  gb: number | null;
11208
11658
  mb: number | null;
11209
11659
  }
@@ -11212,7 +11662,7 @@ interface AgentConfigMemorySize {
11212
11662
  * `seconds` (at least one). The alternative to the `30m`-style shorthand
11213
11663
  * string wherever a duration is accepted.
11214
11664
  */
11215
- interface AgentConfigDuration {
11665
+ interface Duration {
11216
11666
  hours: number | null;
11217
11667
  minutes: number | null;
11218
11668
  seconds: number | null;
@@ -11235,7 +11685,7 @@ interface AgentConfigDuration {
11235
11685
  * (baked into the cached image) instead; keep hooks for per-run work — e.g.
11236
11686
  * anything that touches run-scoped credentials.
11237
11687
  */
11238
- interface AgentConfigEnvironmentHooks {
11688
+ interface EnvironmentHooks {
11239
11689
  post_clone: string | null;
11240
11690
  post_start: string | null;
11241
11691
  }
@@ -11254,7 +11704,7 @@ interface AgentConfigEnvironmentHooks {
11254
11704
  * `npm install`), so later runs start with deps already on disk. Neither runs
11255
11705
  * per run; that's `hooks.post_start` / `hooks.post_clone`.
11256
11706
  */
11257
- interface AgentConfigEnvironmentImage {
11707
+ interface EnvironmentImage {
11258
11708
  dockerfile_append: string | null;
11259
11709
  setup: string | null;
11260
11710
  }
@@ -11264,10 +11714,10 @@ interface AgentConfigEnvironmentImage {
11264
11714
  * server's transport and credentials. It only matters when the named
11265
11715
  * integration is set to `opt_in` inclusion; an integration in the default
11266
11716
  * `all_sessions` mode is added regardless. For a server the platform does not
11267
- * provide, define it instead (`AgentConfigMcpStdioServer` /
11268
- * `AgentConfigMcpRemoteServer`).
11717
+ * provide, define it instead (`McpStdioServer` /
11718
+ * `McpRemoteServer`).
11269
11719
  */
11270
- interface AgentConfigMcpServer {
11720
+ interface McpServerRef {
11271
11721
  name: string;
11272
11722
  }
11273
11723
  /**
@@ -11280,7 +11730,7 @@ interface AgentConfigMcpServer {
11280
11730
  * account's secrets store (see `mcp_secret_refs`); everything else is passed
11281
11731
  * literally.
11282
11732
  */
11283
- interface AgentConfigMcpStdioServer {
11733
+ interface McpStdioServer {
11284
11734
  args: string[];
11285
11735
  command: string;
11286
11736
  env: {
@@ -11294,7 +11744,7 @@ interface AgentConfigMcpStdioServer {
11294
11744
  * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
11295
11745
  * references, resolved at run time from the account's secrets store.
11296
11746
  */
11297
- interface AgentConfigMcpRemoteServer {
11747
+ interface McpRemoteServer {
11298
11748
  headers: {
11299
11749
  [k: string]: string;
11300
11750
  };
@@ -11311,37 +11761,16 @@ interface AgentConfigMcpRemoteServer {
11311
11761
  * ever putting it in the config file. Either way the variable only reaches
11312
11762
  * agents that name it.
11313
11763
  */
11314
- interface AgentConfigEnvironmentVariable {
11764
+ interface EnvironmentVariable {
11315
11765
  name: string;
11316
11766
  value: string | null;
11317
11767
  }
11318
- /**
11319
- * The typed input contract: what goes INTO a session (the trigger is
11320
- * when it happens; this is what goes in).
11321
- *
11322
- * `json_schema` types the payload a caller-started session takes
11323
- * (`POST /v1/sessions` `input`, validated at the door; required when
11324
- * declared). It is illegal on a react-triggered agent — react payloads are
11325
- * platform-shaped (the published surface field sets), not caller-shaped.
11326
- *
11327
- * `message` is the initial-message template: exact `{{path}}` substitution
11328
- * over the caller payload (or, on a react agent, over the surface's
11329
- * published fields), no conditionals/loops/filters. Refs are validated at
11330
- * deploy time against the governing field set (see AgentConfig's
11331
- * `_check_input`).
11332
- */
11333
- interface AgentConfigInput {
11334
- json_schema: {
11335
- [k: string]: unknown;
11336
- } | null;
11337
- message: string | null;
11338
- }
11339
11768
  /**
11340
11769
  * The typed output contract: the JSON Schema the agent must exit through
11341
11770
  * (the StructuredOutput exit tool). Read back via
11342
11771
  * GET /v1/sessions/{id}/output.
11343
11772
  */
11344
- interface AgentConfigOutput {
11773
+ interface OutputConfig {
11345
11774
  json_schema: {
11346
11775
  [k: string]: unknown;
11347
11776
  };
@@ -11355,16 +11784,16 @@ interface AgentConfigOutput {
11355
11784
  * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
11356
11785
  * with). `true` / the string `all` (the default) grant the full sandbox
11357
11786
  * ceiling — everything a sandbox token can ever do. A map narrows it per
11358
- * resource (see `AgentConfigEllipsisPermissions`); the minted token carries
11787
+ * resource (see `EllipsisPermissions`); the minted token carries
11359
11788
  * the intersection, so a config can only ever reduce access. `false` fails
11360
11789
  * validation — an agent with no API token cannot report its own progress.
11361
11790
  *
11362
11791
  * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
11363
- * see `AgentConfigGithubPermissions`. GitHub enforces it at mint time.
11792
+ * see `GithubPermissions`. GitHub enforces it at mint time.
11364
11793
  */
11365
- interface AgentConfigPermissions {
11366
- ellipsis: (true | 'all') | AgentConfigEllipsisPermissions;
11367
- github: AgentConfigGithubPermissions;
11794
+ interface PermissionsConfig {
11795
+ ellipsis: (true | 'all') | EllipsisPermissions;
11796
+ github: GithubPermissions;
11368
11797
  }
11369
11798
  /**
11370
11799
  * `permissions.ellipsis` as a map: resource → level | grant | list of
@@ -11373,7 +11802,7 @@ interface AgentConfigPermissions {
11373
11802
  * intersected with the platform's sandbox ceiling at token mint — it can
11374
11803
  * narrow what a sandbox token may do, never exceed it.
11375
11804
  */
11376
- interface AgentConfigEllipsisPermissions {
11805
+ interface EllipsisPermissions {
11377
11806
  [k: string]: Level | EllipsisGrant | (Level | EllipsisGrant)[];
11378
11807
  }
11379
11808
  /**
@@ -11402,7 +11831,7 @@ interface EllipsisGrant {
11402
11831
  * minted with the reduced scope, so nothing running in the sandbox can
11403
11832
  * exceed it.
11404
11833
  */
11405
- interface AgentConfigGithubPermissions {
11834
+ interface GithubPermissions {
11406
11835
  permissions: 'read_only' | {
11407
11836
  [k: string]: string;
11408
11837
  } | null;
@@ -11417,15 +11846,15 @@ interface AgentConfigGithubPermissions {
11417
11846
  * Skills under a cloned repo's own `.claude/skills/` load by themselves and
11418
11847
  * don't need an entry here.
11419
11848
  */
11420
- interface AgentConfigSkill {
11849
+ interface SkillRef {
11421
11850
  path: string;
11422
- repository: AgentConfigRepository | null;
11851
+ repository: RepositoryRef | null;
11423
11852
  }
11424
- interface AgentConfigCronTrigger {
11853
+ interface CronTrigger {
11425
11854
  schedule: string;
11426
11855
  type: 'cron';
11427
11856
  }
11428
- interface AgentConfigReactTrigger {
11857
+ interface ReactTrigger {
11429
11858
  issue: ReactIssue | null;
11430
11859
  linear_issue: ReactLinearIssue | null;
11431
11860
  pull_request: ReactPullRequest | null;
@@ -11477,40 +11906,6 @@ interface ReactSentry {
11477
11906
  }
11478
11907
  interface ReactSlackChannel {
11479
11908
  }
11480
- interface AgentConfigMentionTrigger {
11481
- platforms: AgentConfigMentionPlatform[];
11482
- type: 'mention';
11483
- }
11484
- /**
11485
- * The principal this session is attributed to.
11486
- */
11487
- interface SessionAttribution {
11488
- /**
11489
- * Identifier of the principal the session is attributed to.
11490
- */
11491
- id: string | null;
11492
- /**
11493
- * Kind of principal the session is attributed to (e.g. a GitHub user or an API key).
11494
- */
11495
- type: AttributionType | null;
11496
- /**
11497
- * The GitHub user the session is attributed to, resolved at read time. Null when the attribution is not a GitHub user.
11498
- */
11499
- user: GithubAccountSnippet | null;
11500
- }
11501
- /**
11502
- * Sometimes the GitHub API returns a user of github (can include bots)
11503
- * using this snippet instead of the full GithubAccount model. One example,
11504
- * is when the API returns a pull request.
11505
- *
11506
- * This is the least amount of info we need to represent a GitHub account.
11507
- */
11508
- interface GithubAccountSnippet {
11509
- avatar_url: string;
11510
- id: number;
11511
- login: string;
11512
- type: GithubAccountType;
11513
- }
11514
11909
  /**
11515
11910
  * The spend budget enforced for this session.
11516
11911
  */
@@ -11521,6 +11916,18 @@ interface SessionBudget {
11521
11916
  cents: number;
11522
11917
  source: BudgetSource;
11523
11918
  }
11919
+ /**
11920
+ * What the session ran on, frozen when it was created: the harness block, the resolved environment, permissions, skills, output contract, and budget.
11921
+ */
11922
+ interface SessionConfig1 {
11923
+ budget: BudgetConfig;
11924
+ claude: ClaudeConfig;
11925
+ codex: CodexConfig | null;
11926
+ environment: string | EnvironmentConfig;
11927
+ output: OutputConfig | null;
11928
+ permissions: PermissionsConfig;
11929
+ skills: SkillRef[];
11930
+ }
11524
11931
  /**
11525
11932
  * What the session cost, in millicents, broken down by leg and carrying its own total.
11526
11933
  */
@@ -11547,7 +11954,7 @@ interface SessionCost {
11547
11954
  total: number;
11548
11955
  }
11549
11956
  /**
11550
- * The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is inside agent.config.environment.
11957
+ * The environment the session resolved: the saved environment's id and how it was chosen. The environment's frozen body is `config.environment`.
11551
11958
  */
11552
11959
  interface SessionEnvironment {
11553
11960
  /**
@@ -11555,7 +11962,7 @@ interface SessionEnvironment {
11555
11962
  */
11556
11963
  environment_id: string | null;
11557
11964
  /**
11558
- * How the environment was chosen (request, agent_config, repo_default, account_default, platform_default). Null when the config carried its own inline environment.
11965
+ * How the environment was chosen (request, agent_config, platform_default; repo_default and account_default on sessions from before those ladders were removed). Null when the config carried its own inline environment.
11559
11966
  */
11560
11967
  source: EnvironmentSource | null;
11561
11968
  }
@@ -12208,9 +12615,13 @@ interface SessionFrame {
12208
12615
  * The session's current state.
12209
12616
  */
12210
12617
  interface Session1 {
12211
- agent: SessionAgent;
12212
12618
  attribution: SessionAttribution;
12619
+ /**
12620
+ * The automation the session was started from, or null for a raw session started with POST /v1/sessions.
12621
+ */
12622
+ automation: SessionAutomation | null;
12213
12623
  budget: SessionBudget;
12624
+ config: SessionConfig1;
12214
12625
  /**
12215
12626
  * The "owner/name" repository context the session was started in, if any.
12216
12627
  */
@@ -12375,4 +12786,4 @@ type ReviewRequester = components['schemas']['ReviewRequester'];
12375
12786
  type ReviewFinding = components['schemas']['ReviewFinding'];
12376
12787
  type Finding = ReviewFinding;
12377
12788
 
12378
- export type { SessionState as $, AgentConfigSource as A, BudgetSource as B, ClaudeSessionRecord as C, DeltaFrame as D, ErrorFrame as E, Finding as F, GithubAccountSnippet as G, Harness as H, SdkUserRecord as I, SendSessionMessageRequest as J, Session as K, LifecycleSessionRecord as L, SessionExitStatus as M, SessionFrame as N, SessionGit as O, ParentKind as P, SessionLiveness as Q, RecordsAppendFrame as R, SdkAssistantRecord as S, SessionMessage as T, SessionMessageResponse as U, SessionMessageStatus as V, SessionPrompting as W, SessionRecord as X, SessionRecordsListResponse as Y, SessionResponse as Z, SessionSource as _, AttributionType as a, SessionStatus as a0, SessionStreamFrame as a1, SessionSurface as a2, SessionsListResponse as a3, SnapshotFrame as a4, StreamFrame as a5, TokensInfo as a6, paths as a7, CodexFileChangeItem as a8, CodexMcpToolCallItem as a9, CodexEvent as b, components as c, CodexItem as d, CodexSessionRecord as e, CreateReviewRequest as f, DoneFrame as g, GithubAccountType as h, HeartbeatFrame as i, PromptBlockedReason as j, ResolvedReviewScope as k, Review as l, ReviewConfiguration as m, ReviewCounters as n, ReviewFinding as o, ReviewRequester as p, ReviewScope as q, ReviewScopeKind as r, ReviewStage as s, ReviewedCommit as t, ReviewsListResponse as u, SdkContentBlock as v, SdkRateLimitRecord as w, SdkRecord as x, SdkResultRecord as y, SdkSystemRecord as z };
12789
+ 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 };