@ellipsis-dev/sdk 0.16.0 → 0.17.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.
@@ -14,16 +14,11 @@ interface paths {
14
14
  put?: never;
15
15
  /**
16
16
  * Create Agent Config
17
- * @description Create an agent config.
17
+ * @description Create an agent config, managed through the API: no file, live
18
+ * immediately. To put its definition in a repository instead, create
19
+ * it here and then POST /v1/agents/configs/{config_id}/link.
18
20
  *
19
- * Name a repository and Ellipsis opens a pull request adding the
20
- * config file to agents/ there; the agent goes live when it
21
- * merges. Omit it and the agent is created here, with no file,
22
- * live immediately — and every file reference in it must name the
23
- * repository it lives in.
24
- *
25
- * Accepts an inline config or a gallery template slug. 409 when
26
- * another live agent already holds the name.
21
+ * 409 when another live agent already holds the name.
27
22
  */
28
23
  post: operations['create_agent_config'];
29
24
  delete?: never;
@@ -418,6 +413,111 @@ interface paths {
418
413
  patch?: never;
419
414
  trace?: never;
420
415
  };
416
+ '/v1/environments': {
417
+ parameters: {
418
+ query?: never;
419
+ header?: never;
420
+ path?: never;
421
+ cookie?: never;
422
+ };
423
+ /**
424
+ * List Environments
425
+ * @description List saved environments.
426
+ */
427
+ get: operations['list_environments'];
428
+ put?: never;
429
+ /**
430
+ * Create Environment
431
+ * @description Create an environment, managed through the API: no file, live
432
+ * immediately. To define it in a repository instead, commit a
433
+ * `kind: environment` YAML under an agents directory.
434
+ *
435
+ * 409 when another live environment already holds the name.
436
+ */
437
+ post: operations['create_environment'];
438
+ delete?: never;
439
+ options?: never;
440
+ head?: never;
441
+ patch?: never;
442
+ trace?: never;
443
+ };
444
+ '/v1/environments/defaults': {
445
+ parameters: {
446
+ query?: never;
447
+ header?: never;
448
+ path?: never;
449
+ cookie?: never;
450
+ };
451
+ /**
452
+ * List Environment Defaults
453
+ * @description Get the default environments.
454
+ *
455
+ * The account-wide default and the per-repository defaults, as
456
+ * environment ids. Repo rungs are keyed "owner/name".
457
+ */
458
+ get: operations['list_environment_defaults'];
459
+ /**
460
+ * Put Environment Default
461
+ * @description Set a default environment.
462
+ *
463
+ * Addressed by rung: the account rung (repository omitted) or a
464
+ * repository rung ("owner/name"); the environment by id or name.
465
+ * Returns the full resulting ladder. Refused for sandbox tokens.
466
+ */
467
+ put: operations['put_environment_default'];
468
+ post?: never;
469
+ /**
470
+ * Delete Environment Default
471
+ * @description Clear a default environment.
472
+ *
473
+ * Addressed by rung: the account rung (repository omitted) or a
474
+ * repository rung. Refused for sandbox tokens.
475
+ */
476
+ delete: operations['delete_environment_default'];
477
+ options?: never;
478
+ head?: never;
479
+ patch?: never;
480
+ trace?: never;
481
+ };
482
+ '/v1/environments/{environment_id}': {
483
+ parameters: {
484
+ query?: never;
485
+ header?: never;
486
+ path?: never;
487
+ cookie?: never;
488
+ };
489
+ /**
490
+ * Get Environment
491
+ * @description Return one saved environment, by id or by name.
492
+ */
493
+ get: operations['get_environment'];
494
+ /**
495
+ * Update Environment
496
+ * @description Replace an environment's definition, by id or by name.
497
+ *
498
+ * The whole definition is replaced, live at once — future sessions
499
+ * resolve the new body; running sessions keep the one frozen at
500
+ * their start. Only for environments managed through this API: one
501
+ * defined by a repository file is a 409.
502
+ */
503
+ put: operations['update_environment'];
504
+ post?: never;
505
+ /**
506
+ * Delete Environment
507
+ * @description Delete an environment, by id or by name.
508
+ *
509
+ * Always succeeds, even while agents still reference it — their next
510
+ * session start fails with a clear error naming the missing
511
+ * environment. Past sessions remain readable. Only for environments
512
+ * managed through this API — delete the file to remove one defined
513
+ * by a repository.
514
+ */
515
+ delete: operations['delete_environment'];
516
+ options?: never;
517
+ head?: never;
518
+ patch?: never;
519
+ trace?: never;
520
+ };
421
521
  '/v1/files': {
422
522
  parameters: {
423
523
  query?: never;
@@ -911,12 +1011,13 @@ interface paths {
911
1011
  * Start Agent Session
912
1012
  * @description Start a cloud agent session.
913
1013
  *
914
- * Provide at most one of config_id (an id or an agent name),
915
- * config, or
916
- * template_id; with none, the account's default-config ladder
917
- * resolves the config. 400 when idle_start is combined with
918
- * prompt or input. 422 when the agent declares an
919
- * input schema and the request's input is absent or invalid.
1014
+ * Provide at most one of config_id (an id or an agent name) or
1015
+ * config; with neither, the account's default-config ladder
1016
+ * resolves the config. `prompt` is the first message; omit it and
1017
+ * the session starts idle, waiting for one. 400 when
1018
+ * interactive=false and there is no prompt or input. 422 when the
1019
+ * agent declares an input schema and the request's input is absent
1020
+ * or invalid.
920
1021
  */
921
1022
  post: operations['start_agent_session'];
922
1023
  delete?: never;
@@ -1225,7 +1326,6 @@ interface components {
1225
1326
  /**
1226
1327
  * @default {
1227
1328
  * "enabled": true,
1228
- * "interactive": true,
1229
1329
  * "metadata": {
1230
1330
  * "annotations": {},
1231
1331
  * "labels": []
@@ -1235,21 +1335,18 @@ interface components {
1235
1335
  */
1236
1336
  ellipsis: components['schemas']['AgentConfigEllipsis'];
1237
1337
  /**
1338
+ * Environment
1238
1339
  * @default {
1239
1340
  * "compute": {},
1240
1341
  * "hooks": {},
1241
1342
  * "image": {},
1343
+ * "mcp_servers": [],
1242
1344
  * "repositories": [],
1243
1345
  * "variables": []
1244
1346
  * }
1245
1347
  */
1246
- environment: components['schemas']['AgentConfigEnvironment'];
1348
+ environment: string | components['schemas']['AgentConfigEnvironment'];
1247
1349
  input?: components['schemas']['AgentConfigInput'] | null;
1248
- /**
1249
- * Mcp Servers
1250
- * @default []
1251
- */
1252
- mcp_servers: (string | components['schemas']['AgentConfigMcpServer'])[];
1253
1350
  output?: components['schemas']['AgentConfigOutput'] | null;
1254
1351
  /**
1255
1352
  * @default {
@@ -1381,17 +1478,15 @@ interface components {
1381
1478
  * AgentConfigEllipsis
1382
1479
  * @description The Ellipsis product namespace for a config file: which schema this is
1383
1480
  * (`version`), the human-facing identity (`name`/`description`), freeform
1384
- * organizational `metadata`, whether the agent is `enabled`, and the
1385
- * human-access flag `interactive`. The presence of a top-level `ellipsis:`
1386
- * mapping is what marks a YAML file as an Ellipsis agent config (vs arbitrary
1387
- * YAML that merely lives under a config directory) — see
1388
- * `yaml_is_ellipsis_config`.
1481
+ * organizational `metadata`, and whether the agent is `enabled`. The
1482
+ * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
1483
+ * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
1484
+ * config directory) — see `yaml_is_ellipsis_config`.
1389
1485
  *
1390
- * `enabled`/`interactive` are agent behavior, not freeform metadata, so they
1391
- * stay inside the config `sha` (only `metadata` is sha-excluded).
1392
- * `interactive` lets a human `agent session connect` to a live session (CLI
1393
- * relay). It does not decide whether a session is ephemeral or durable — that
1394
- * is the trigger's job.
1486
+ * `enabled` is agent behavior, not freeform metadata, so it stays inside
1487
+ * the config `sha` (only `metadata` is sha-excluded). Whether a session
1488
+ * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
1489
+ * not a config one.
1395
1490
  */
1396
1491
  AgentConfigEllipsis: {
1397
1492
  /** Description */
@@ -1401,11 +1496,6 @@ interface components {
1401
1496
  * @default true
1402
1497
  */
1403
1498
  enabled: boolean;
1404
- /**
1405
- * Interactive
1406
- * @default true
1407
- */
1408
- interactive: boolean;
1409
1499
  /**
1410
1500
  * @default {
1411
1501
  * "annotations": {},
@@ -1453,6 +1543,11 @@ interface components {
1453
1543
  hooks: components['schemas']['AgentConfigEnvironmentHooks'];
1454
1544
  /** @default {} */
1455
1545
  image: components['schemas']['AgentConfigEnvironmentImage'];
1546
+ /**
1547
+ * Mcp Servers
1548
+ * @default []
1549
+ */
1550
+ mcp_servers: (string | components['schemas']['AgentConfigMcpServer'] | components['schemas']['AgentConfigMcpStdioServer'] | components['schemas']['AgentConfigMcpRemoteServer'])[];
1456
1551
  /**
1457
1552
  * Repositories
1458
1553
  * @default []
@@ -1578,19 +1673,69 @@ interface components {
1578
1673
  /** Message */
1579
1674
  message?: string | null;
1580
1675
  };
1676
+ /**
1677
+ * AgentConfigMcpRemoteServer
1678
+ * @description A bring-your-own remote MCP server: the harness talks HTTP to `url`.
1679
+ * Nothing runs in the sandbox image. `headers` carry static auth (e.g.
1680
+ * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
1681
+ * references, resolved at run time from the account's secrets store.
1682
+ */
1683
+ AgentConfigMcpRemoteServer: {
1684
+ /**
1685
+ * Headers
1686
+ * @default {}
1687
+ */
1688
+ headers: {
1689
+ [key: string]: string;
1690
+ };
1691
+ /** Name */
1692
+ name: string;
1693
+ /** Url */
1694
+ url: string;
1695
+ };
1581
1696
  /**
1582
1697
  * AgentConfigMcpServer
1583
1698
  * @description One built-in MCP server this agent opts into by name (`linear`/`slack`).
1584
- * This is a name reference over the connected built-in set, NOT a custom-server
1585
- * definition there is no command/url/headers shape (that was the old,
1586
- * removed field, and Ellipsis does not support bring-your-own MCP servers).
1587
- * It only matters when the named integration is set to `opt_in` inclusion; an
1588
- * integration in the default `all_sessions` mode is added regardless.
1699
+ * A name reference over the connected built-in set the platform manages the
1700
+ * server's transport and credentials. It only matters when the named
1701
+ * integration is set to `opt_in` inclusion; an integration in the default
1702
+ * `all_sessions` mode is added regardless. For a server the platform does not
1703
+ * provide, define it instead (`AgentConfigMcpStdioServer` /
1704
+ * `AgentConfigMcpRemoteServer`).
1589
1705
  */
1590
1706
  AgentConfigMcpServer: {
1591
1707
  /** Name */
1592
1708
  name: string;
1593
1709
  };
1710
+ /**
1711
+ * AgentConfigMcpStdioServer
1712
+ * @description A bring-your-own stdio MCP server: the harness spawns `command` inside
1713
+ * the sandbox and speaks JSON-RPC over its stdin/stdout. The command must be
1714
+ * runnable in the sandbox image — install its runtime via `image.setup` /
1715
+ * `image.dockerfile_append` if the base image lacks it.
1716
+ *
1717
+ * `env` values may embed `${NAME}` references, resolved at run time from the
1718
+ * account's secrets store (see `mcp_secret_refs`); everything else is passed
1719
+ * literally.
1720
+ */
1721
+ AgentConfigMcpStdioServer: {
1722
+ /**
1723
+ * Args
1724
+ * @default []
1725
+ */
1726
+ args: string[];
1727
+ /** Command */
1728
+ command: string;
1729
+ /**
1730
+ * Env
1731
+ * @default {}
1732
+ */
1733
+ env: {
1734
+ [key: string]: string;
1735
+ };
1736
+ /** Name */
1737
+ name: string;
1738
+ };
1594
1739
  /**
1595
1740
  * AgentConfigMemorySize
1596
1741
  * @description A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
@@ -2874,46 +3019,19 @@ interface components {
2874
3019
  };
2875
3020
  /**
2876
3021
  * CreateAgentConfigRequest
2877
- * @description Parameters for creating an agent config. Exactly one of config or
2878
- * template_id must be set.
3022
+ * @description Parameters for creating an agent config.
2879
3023
  */
2880
3024
  CreateAgentConfigRequest: {
2881
- /** @description An inline agent config. */
2882
- config?: components['schemas']['AgentConfig'] | null;
2883
- /**
2884
- * Path
2885
- * @description File path within the repo, when a repository is named. Omit for the default agents/<slug>.yaml; if set it must be a location the config sync scans (a .yaml/.yml file under agents/, .agents/, ellipsis/, or .ellipsis/ at any depth).
2886
- */
2887
- path?: string | null;
2888
- /**
2889
- * Repository
2890
- * @description Define the agent as a file in this repository: Ellipsis opens a pull request adding it, and the agent goes live when that merges. Repository name within the caller's account; the owner is always the account, so pass a bare name (e.g. "my-service"), not "owner/my-service". Omit to create the agent through the API alone, with no file and live immediately.
2891
- */
2892
- repository?: string | null;
2893
- /**
2894
- * Template Id
2895
- * @description A gallery template slug (see GET /v1/agents/templates).
2896
- */
2897
- template_id?: string | null;
3025
+ /** @description The agent's definition. */
3026
+ config: components['schemas']['AgentConfig'];
2898
3027
  };
2899
3028
  /**
2900
- * CreateAgentConfigResponse
2901
- * @description The created agent config, plus the pull request that adds its file when
2902
- * one was opened.
3029
+ * CreateEnvironmentRequest
3030
+ * @description Parameters for creating an environment.
2903
3031
  */
2904
- CreateAgentConfigResponse: {
2905
- /** @description The created agent config. */
2906
- config: components['schemas']['Config'];
2907
- /**
2908
- * Path
2909
- * @description The file path the config was written to, or null when the agent has no file.
2910
- */
2911
- path?: string | null;
2912
- /**
2913
- * Pull Request Url
2914
- * @description The pull request that adds the config file. The agent becomes live once it merges and syncs. Null when no repository was named: the agent is already live.
2915
- */
2916
- pull_request_url?: string | null;
3032
+ CreateEnvironmentRequest: {
3033
+ /** @description The environment's definition. */
3034
+ environment: components['schemas']['EnvironmentConfig'];
2917
3035
  };
2918
3036
  /**
2919
3037
  * CreateFileRequest
@@ -3079,6 +3197,168 @@ interface components {
3079
3197
  /** Match */
3080
3198
  match?: string[] | null;
3081
3199
  };
3200
+ /**
3201
+ * Environment
3202
+ * @description A saved environment: the machine agents run in (repositories,
3203
+ * variables, MCP servers, image, compute, hooks), defined once and
3204
+ * referenced by name or id from agent configs and session starts.
3205
+ */
3206
+ Environment: {
3207
+ /**
3208
+ * Created At
3209
+ * Format: date-time
3210
+ * @description When the environment was created.
3211
+ */
3212
+ created_at: string;
3213
+ /** @description The GitHub account that last edited the environment, when known. */
3214
+ edited_by?: components['schemas']['GithubAccountSnippet'] | null;
3215
+ /** @description The environment definition itself, as parsed from its YAML. */
3216
+ environment: components['schemas']['EnvironmentConfig'];
3217
+ /**
3218
+ * Id
3219
+ * @description Unique identifier of the environment.
3220
+ */
3221
+ id: string;
3222
+ /**
3223
+ * Last Sync Error
3224
+ * @description The parse or validation error from the most recent sync attempt, or null when it succeeded. A non-null value means sessions run the last good definition, not the YAML currently on the branch.
3225
+ */
3226
+ last_sync_error?: string | null;
3227
+ /**
3228
+ * Last Synced Commit Sha
3229
+ * @description The last commit the environment was synced from.
3230
+ */
3231
+ last_synced_commit_sha?: string | null;
3232
+ /** @description "github" environments are defined by a file in a repository and are changed by editing that file; "api" environments have no file and are changed through this API. */
3233
+ managed_by: components['schemas']['ConfigManagedBy'];
3234
+ /**
3235
+ * Name
3236
+ * @description The environment's customer-unique addressable name; usable anywhere an environment is referenced, interchangeably with the id.
3237
+ */
3238
+ name: string;
3239
+ /**
3240
+ * Sha
3241
+ * @description The environment's content identity fingerprint.
3242
+ */
3243
+ sha: string;
3244
+ /** @description The repository, path, and branch the environment syncs from. Null for environments managed through the API. */
3245
+ source_details?: components['schemas']['AgentConfigSourceGithub'] | null;
3246
+ /**
3247
+ * Updated At
3248
+ * Format: date-time
3249
+ * @description When the environment was last updated.
3250
+ */
3251
+ updated_at: string;
3252
+ };
3253
+ /**
3254
+ * EnvironmentConfig
3255
+ * @description A parsed environment document: identity plus the environment body.
3256
+ *
3257
+ * The body fields are flattened to the top level of the file (not nested
3258
+ * under an `environment:` key) — the file *is* the environment, so nesting
3259
+ * would be ceremony. `to_environment()` projects the body for substitution
3260
+ * into an agent config.
3261
+ */
3262
+ EnvironmentConfig: {
3263
+ /** @default {} */
3264
+ compute: components['schemas']['AgentConfigCompute'];
3265
+ ellipsis: components['schemas']['EnvironmentConfigEllipsis'];
3266
+ /** @default {} */
3267
+ hooks: components['schemas']['AgentConfigEnvironmentHooks'];
3268
+ /** @default {} */
3269
+ image: components['schemas']['AgentConfigEnvironmentImage'];
3270
+ /**
3271
+ * Mcp Servers
3272
+ * @default []
3273
+ */
3274
+ mcp_servers: (string | components['schemas']['AgentConfigMcpServer'] | components['schemas']['AgentConfigMcpStdioServer'] | components['schemas']['AgentConfigMcpRemoteServer'])[];
3275
+ /**
3276
+ * Repositories
3277
+ * @default []
3278
+ */
3279
+ repositories: components['schemas']['AgentConfigRepository'][];
3280
+ /**
3281
+ * Variables
3282
+ * @default []
3283
+ */
3284
+ variables: components['schemas']['AgentConfigEnvironmentVariable'][];
3285
+ };
3286
+ /**
3287
+ * EnvironmentConfigEllipsis
3288
+ * @description The Ellipsis namespace of an environment file. `kind: environment` is
3289
+ * what routes a synced YAML here instead of to the agent-config parser —
3290
+ * an agent config carries no `kind` (or `kind: agent`, tolerated nowhere:
3291
+ * absence is the agent marker).
3292
+ */
3293
+ EnvironmentConfigEllipsis: {
3294
+ /** Description */
3295
+ description?: string | null;
3296
+ /**
3297
+ * Kind
3298
+ * @constant
3299
+ */
3300
+ kind: 'environment';
3301
+ /**
3302
+ * @default {
3303
+ * "annotations": {},
3304
+ * "labels": []
3305
+ * }
3306
+ */
3307
+ metadata: components['schemas']['AgentConfigMetadata'];
3308
+ /** Name */
3309
+ name?: string | null;
3310
+ };
3311
+ /**
3312
+ * EnvironmentDefaults
3313
+ * @description Which environment serves sessions whose config carries no environment
3314
+ * of its own: one account-wide rung, plus a rung per repository. Values are
3315
+ * environment ids — stable across renames, unlike names.
3316
+ */
3317
+ EnvironmentDefaults: {
3318
+ /**
3319
+ * Account
3320
+ * @description Environment id serving sessions with no repository context, or null when no account default is set.
3321
+ */
3322
+ account?: string | null;
3323
+ /**
3324
+ * Repositories
3325
+ * @description Environment id per repository, keyed "owner/name". A repository with no default set is absent.
3326
+ * @default {}
3327
+ */
3328
+ repositories: {
3329
+ [key: string]: string;
3330
+ };
3331
+ };
3332
+ /**
3333
+ * EnvironmentResponse
3334
+ * @description One saved environment.
3335
+ */
3336
+ EnvironmentResponse: {
3337
+ /** @description The saved environment. */
3338
+ environment: components['schemas']['Environment'];
3339
+ };
3340
+ /**
3341
+ * EnvironmentSource
3342
+ * @description How a session's environment was chosen. None (the field is nullable)
3343
+ * when the config carried an inline environment block and no resolution ran —
3344
+ * an inline environment is not a reference, so there is nothing to record.
3345
+ *
3346
+ * Not derivable from the row: `environment_id` says WHICH environment, not
3347
+ * how it was chosen, and is null for the built-in basic sandbox.
3348
+ * @enum {string}
3349
+ */
3350
+ EnvironmentSource: 'request' | 'agent_config' | 'repo_default' | 'account_default' | 'platform_default';
3351
+ /**
3352
+ * EnvironmentsListResponse
3353
+ * @description The caller's saved environments.
3354
+ */
3355
+ EnvironmentsListResponse: {
3356
+ /**
3357
+ * Environments
3358
+ * @description Saved environments.
3359
+ */
3360
+ environments: components['schemas']['Environment'][];
3361
+ };
3082
3362
  /** ErrorInfo */
3083
3363
  ErrorInfo: {
3084
3364
  /**
@@ -4417,6 +4697,23 @@ interface components {
4417
4697
  */
4418
4698
  repository?: string | null;
4419
4699
  };
4700
+ /**
4701
+ * PutEnvironmentDefaultRequest
4702
+ * @description Parameters for setting a default environment, at either the account or
4703
+ * the repository level.
4704
+ */
4705
+ PutEnvironmentDefaultRequest: {
4706
+ /**
4707
+ * Environment
4708
+ * @description The environment to make the default: an environment id, or its customer-unique name.
4709
+ */
4710
+ environment: string;
4711
+ /**
4712
+ * Repository
4713
+ * @description The rung to set: "owner/name" for a repo default; omit to set the account default. An unknown or foreign repo is a 404.
4714
+ */
4715
+ repository?: string | null;
4716
+ };
4420
4717
  /**
4421
4718
  * PutSecretsRequest
4422
4719
  * @description Store secrets for the account's sandboxes. Each secret is upserted by
@@ -4677,17 +4974,12 @@ interface components {
4677
4974
  */
4678
4975
  config_id?: string | null;
4679
4976
  /**
4680
- * Config Override
4681
- * @description Optional partial-config override merged onto the chosen config and re-validated — e.g. {"claude": {"model": "claude-opus-4-8"}} to replay the run on a different model, or {"budget": {"session": 5.0}} to raise its budget. Mutually exclusive with config_override_yaml.
4977
+ * Override
4978
+ * @description Optional partial patch on the replayed config, applied last — e.g. {"claude": {"model": "claude-opus-4-8"}} to replay the run on a different model, or {"budget": {"session": 5.0}} to raise its budget.
4682
4979
  */
4683
- config_override?: {
4980
+ override?: {
4684
4981
  [key: string]: unknown;
4685
4982
  } | null;
4686
- /**
4687
- * Config Override Yaml
4688
- * @description The same partial-config override as a YAML/JSON string (e.g. read from a file). Mutually exclusive with config_override.
4689
- */
4690
- config_override_yaml?: string | null;
4691
4983
  /**
4692
4984
  * Prompt
4693
4985
  * @description Per-run instructions. Omit to inherit the original run's prompt (a bare replay re-runs the same instructions); pass "" to clear it.
@@ -4749,7 +5041,7 @@ interface components {
4749
5041
  * routes; nothing maps to it yet.
4750
5042
  * @enum {string}
4751
5043
  */
4752
- Resource: 'account' | 'alerts' | 'sessions' | 'files' | 'memories' | 'reviews' | 'configs' | 'defaults' | 'secrets' | 'templates' | 'integrations' | 'tokens';
5044
+ Resource: 'account' | 'alerts' | 'sessions' | 'files' | 'memories' | 'reviews' | 'configs' | 'defaults' | 'environments' | 'secrets' | 'templates' | 'integrations' | 'tokens';
4753
5045
  /**
4754
5046
  * Review
4755
5047
  * @description One code review: one pipeline iteration over one commit range of a pull
@@ -5972,6 +6264,8 @@ interface components {
5972
6264
  * @description When the session was created.
5973
6265
  */
5974
6266
  created_at: string;
6267
+ /** @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. */
6268
+ environment?: components['schemas']['SessionEnvironment'];
5975
6269
  /** @description How the session ended; null until it is terminal. */
5976
6270
  exit_status?: components['schemas']['SessionExitStatus'] | null;
5977
6271
  /** @description What the session did to git, one entry per repository in its workspace: the commit and branch it sits on, per-file line counts for its uncommitted changes, and the pull requests it opened. Null if nothing was ever captured. */
@@ -6139,6 +6433,22 @@ interface components {
6139
6433
  */
6140
6434
  total: number;
6141
6435
  };
6436
+ /**
6437
+ * SessionEnvironment
6438
+ * @description The environment this session resolved: which saved environment (as it
6439
+ * exists now) and how it was chosen. The environment's frozen BODY rides
6440
+ * inside `agent.config.environment` — substitution happens before the config
6441
+ * snapshot freezes — so this object is provenance, not payload.
6442
+ */
6443
+ SessionEnvironment: {
6444
+ /**
6445
+ * Environment Id
6446
+ * @description Identifier of the saved environment the session's config resolved. Null for an inline environment block or the built-in basic sandbox.
6447
+ */
6448
+ environment_id?: string | null;
6449
+ /** @description How the environment was chosen (request, agent_config, repo_default, account_default, platform_default). Null when the config carried its own inline environment. */
6450
+ source?: components['schemas']['EnvironmentSource'] | null;
6451
+ };
6142
6452
  /**
6143
6453
  * SessionExecution
6144
6454
  * @description One runtime attempt of a session — the initial start, a cold wake of a
@@ -6812,7 +7122,7 @@ interface components {
6812
7122
  * @description Parameters for starting a new agent session.
6813
7123
  */
6814
7124
  StartAgentSessionRequest: {
6815
- /** @description An inline agent config to run under. */
7125
+ /** @description An inline agent config to run under. At most one of config_id or config may be set; if neither is, the run resolves the account's default-config ladder (repo default, then account default, then the platform default config). */
6816
7126
  config?: components['schemas']['AgentConfig'] | null;
6817
7127
  /**
6818
7128
  * Config Id
@@ -6820,29 +7130,16 @@ interface components {
6820
7130
  */
6821
7131
  config_id?: string | null;
6822
7132
  /**
6823
- * Config Override
6824
- * @description Optional partial-config override merged onto the chosen config and re-validated (e.g. {"budget": {"session": 5.0}} to raise just this session's budget). Merged onto config_id/template_id or the platform default; with an inline config, set fields directly instead. Mutually exclusive with config_override_yaml.
6825
- */
6826
- config_override?: {
6827
- [key: string]: unknown;
6828
- } | null;
6829
- /**
6830
- * Config Override Yaml
6831
- * @description The same partial-config override as a YAML/JSON string (e.g. read from a file). Mutually exclusive with config_override.
7133
+ * Environment
7134
+ * @description The environment to run in: a saved environment's id (`env_...`) or its customer-unique name. Only for sessions with no explicit config (the agent config decides its own environment; 400 when combined with config/config_id). Omitted, the default-environment ladder resolves: repo default, then account default, then the built-in basic sandbox.
6832
7135
  */
6833
- config_override_yaml?: string | null;
7136
+ environment?: string | null;
6834
7137
  /**
6835
7138
  * Force Rebuild
6836
7139
  * @description Skip the image cache for this session's initial provision: a fresh full build whose snapshot then refreshes the cache for later runs. A wake of a durable session provisions through the cache as usual. The CLI's `--rebuild`.
6837
7140
  * @default false
6838
7141
  */
6839
7142
  force_rebuild: boolean;
6840
- /**
6841
- * Idle Start
6842
- * @description Start the session with no initial message: the sandbox spins up, the agent starts idle at the prompt, and the first message sent to the session opens turn 0. Mutually exclusive with prompt. Ignored when the resolved config is not interactive (an ephemeral run keeps its kickoff — it can never receive a message).
6843
- * @default false
6844
- */
6845
- idle_start: boolean;
6846
7143
  /**
6847
7144
  * Input
6848
7145
  * @description The typed payload for an agent that declares input.json_schema: validated against the effective config's schema (422 on mismatch), rendered into the session's initial message (the agent's input.message template, or a JSON block). Required when the agent declares a schema; rejected when it does not.
@@ -6850,6 +7147,12 @@ interface components {
6850
7147
  input?: {
6851
7148
  [key: string]: unknown;
6852
7149
  } | null;
7150
+ /**
7151
+ * Interactive
7152
+ * @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 (or input), since nothing can ever be sent to it later. Agents on the Codex harness are one-shot regardless.
7153
+ * @default true
7154
+ */
7155
+ interactive: boolean;
6853
7156
  /**
6854
7157
  * Metadata
6855
7158
  * @description Arbitrary string key/value metadata stored on the session.
@@ -6859,8 +7162,15 @@ interface components {
6859
7162
  [key: string]: string;
6860
7163
  };
6861
7164
  /**
6862
- * Prompt
6863
- * @description Per-run instructions appended to the initial query after the config's shared system prompt. Applies regardless of which config source is used.
7165
+ * Override
7166
+ * @description Optional partial patch on the RESOLVED session config, applied last — after the config and environment are chosen and the environment is substituted in. Nested objects merge key by key; scalars and arrays replace. E.g. {"environment": {"compute": {"memory": "16GB"}}} for just this session, or {"claude": {"model": "claude-opus-4-8"}}. It cannot swap in a different saved environment (it patches the resolved document; it never re-runs resolution).
7167
+ */
7168
+ override?: {
7169
+ [key: string]: unknown;
7170
+ } | null;
7171
+ /**
7172
+ * Prompt
7173
+ * @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.
6864
7174
  */
6865
7175
  prompt?: string | null;
6866
7176
  /**
@@ -6868,11 +7178,6 @@ interface components {
6868
7178
  * @description The "owner/name" repository the client is standing in (the CLI's detected git remote). Selects the repo rung of the defaults ladder, and is merged into the sandbox repository set (cloned at its default branch) regardless of which config source is used. An unknown or foreign repo is ignored.
6869
7179
  */
6870
7180
  repository?: string | null;
6871
- /**
6872
- * Template Id
6873
- * @description A maintained run-on-demand template slug (e.g. "ellipsis-helper"), resolved server-side to its config. At most one of config_id, config, or template_id may be set; if none is, the run resolves the account's default-config ladder (repo default, then account default, then the platform default config).
6874
- */
6875
- template_id?: string | null;
6876
7181
  };
6877
7182
  /**
6878
7183
  * StartCliAuthResponse
@@ -6975,6 +7280,14 @@ interface components {
6975
7280
  /** @description The agent's new definition. Replaces the previous one wholesale — this is not a partial update. */
6976
7281
  config: components['schemas']['AgentConfig'];
6977
7282
  };
7283
+ /**
7284
+ * UpdateEnvironmentRequest
7285
+ * @description A replacement definition for an environment managed through the API.
7286
+ */
7287
+ UpdateEnvironmentRequest: {
7288
+ /** @description The environment's new definition. Replaces the previous one wholesale — this is not a partial update. */
7289
+ environment: components['schemas']['EnvironmentConfig'];
7290
+ };
6978
7291
  /**
6979
7292
  * UsageDailyPoint
6980
7293
  * @description One day's usage: tokens split by type, and cost split into the four
@@ -7162,15 +7475,15 @@ interface operations {
7162
7475
  };
7163
7476
  responses: {
7164
7477
  /** @description Successful Response */
7165
- 200: {
7478
+ 201: {
7166
7479
  headers: {
7167
7480
  [name: string]: unknown;
7168
7481
  };
7169
7482
  content: {
7170
- 'application/json': components['schemas']['CreateAgentConfigResponse'];
7483
+ 'application/json': components['schemas']['AgentConfigResponse'];
7171
7484
  };
7172
7485
  };
7173
- /** @description Provide exactly one of config or template_id; or the config, path, or target branch is invalid. */
7486
+ /** @description The config is invalid. */
7174
7487
  400: {
7175
7488
  headers: {
7176
7489
  [name: string]: unknown;
@@ -7197,16 +7510,7 @@ interface operations {
7197
7510
  'application/json': components['schemas']['ErrorResponse'];
7198
7511
  };
7199
7512
  };
7200
- /** @description The template or repository was not found in your account. */
7201
- 404: {
7202
- headers: {
7203
- [name: string]: unknown;
7204
- };
7205
- content: {
7206
- 'application/json': components['schemas']['ErrorResponse'];
7207
- };
7208
- };
7209
- /** @description An agent with that name already exists, another agent is already synced from that path, or a file already exists there. */
7513
+ /** @description An agent with that name already exists. */
7210
7514
  409: {
7211
7515
  headers: {
7212
7516
  [name: string]: unknown;
@@ -7896,7 +8200,485 @@ interface operations {
7896
8200
  [name: string]: unknown;
7897
8201
  };
7898
8202
  content: {
7899
- 'application/json': components['schemas']['AlertsListResponse'];
8203
+ 'application/json': components['schemas']['AlertsListResponse'];
8204
+ };
8205
+ };
8206
+ /** @description The bearer token is missing, invalid, or revoked. */
8207
+ 401: {
8208
+ headers: {
8209
+ [name: string]: unknown;
8210
+ };
8211
+ content: {
8212
+ 'application/json': components['schemas']['ErrorResponse'];
8213
+ };
8214
+ };
8215
+ /** @description The credential may not perform this action, or the account is blocked. */
8216
+ 403: {
8217
+ headers: {
8218
+ [name: string]: unknown;
8219
+ };
8220
+ content: {
8221
+ 'application/json': components['schemas']['ErrorResponse'];
8222
+ };
8223
+ };
8224
+ /** @description Validation Error */
8225
+ 422: {
8226
+ headers: {
8227
+ [name: string]: unknown;
8228
+ };
8229
+ content: {
8230
+ 'application/json': components['schemas']['HTTPValidationError'];
8231
+ };
8232
+ };
8233
+ };
8234
+ };
8235
+ get_alert: {
8236
+ parameters: {
8237
+ query?: never;
8238
+ header?: {
8239
+ 'user-agent'?: string | null;
8240
+ };
8241
+ path: {
8242
+ alert_id: string;
8243
+ };
8244
+ cookie?: never;
8245
+ };
8246
+ requestBody?: never;
8247
+ responses: {
8248
+ /** @description Successful Response */
8249
+ 200: {
8250
+ headers: {
8251
+ [name: string]: unknown;
8252
+ };
8253
+ content: {
8254
+ 'application/json': components['schemas']['AlertResponse'];
8255
+ };
8256
+ };
8257
+ /** @description The bearer token is missing, invalid, or revoked. */
8258
+ 401: {
8259
+ headers: {
8260
+ [name: string]: unknown;
8261
+ };
8262
+ content: {
8263
+ 'application/json': components['schemas']['ErrorResponse'];
8264
+ };
8265
+ };
8266
+ /** @description The credential may not perform this action, or the account is blocked. */
8267
+ 403: {
8268
+ headers: {
8269
+ [name: string]: unknown;
8270
+ };
8271
+ content: {
8272
+ 'application/json': components['schemas']['ErrorResponse'];
8273
+ };
8274
+ };
8275
+ /** @description No such alert in your account. */
8276
+ 404: {
8277
+ headers: {
8278
+ [name: string]: unknown;
8279
+ };
8280
+ content: {
8281
+ 'application/json': components['schemas']['ErrorResponse'];
8282
+ };
8283
+ };
8284
+ /** @description Validation Error */
8285
+ 422: {
8286
+ headers: {
8287
+ [name: string]: unknown;
8288
+ };
8289
+ content: {
8290
+ 'application/json': components['schemas']['HTTPValidationError'];
8291
+ };
8292
+ };
8293
+ };
8294
+ };
8295
+ dismiss_alert: {
8296
+ parameters: {
8297
+ query?: never;
8298
+ header?: {
8299
+ 'user-agent'?: string | null;
8300
+ };
8301
+ path: {
8302
+ alert_id: string;
8303
+ };
8304
+ cookie?: never;
8305
+ };
8306
+ requestBody?: never;
8307
+ responses: {
8308
+ /** @description Successful Response */
8309
+ 200: {
8310
+ headers: {
8311
+ [name: string]: unknown;
8312
+ };
8313
+ content: {
8314
+ 'application/json': components['schemas']['AlertResponse'];
8315
+ };
8316
+ };
8317
+ /** @description The bearer token is missing, invalid, or revoked. */
8318
+ 401: {
8319
+ headers: {
8320
+ [name: string]: unknown;
8321
+ };
8322
+ content: {
8323
+ 'application/json': components['schemas']['ErrorResponse'];
8324
+ };
8325
+ };
8326
+ /** @description The credential may not perform this action, or the account is blocked. */
8327
+ 403: {
8328
+ headers: {
8329
+ [name: string]: unknown;
8330
+ };
8331
+ content: {
8332
+ 'application/json': components['schemas']['ErrorResponse'];
8333
+ };
8334
+ };
8335
+ /** @description No such alert in your account. */
8336
+ 404: {
8337
+ headers: {
8338
+ [name: string]: unknown;
8339
+ };
8340
+ content: {
8341
+ 'application/json': components['schemas']['ErrorResponse'];
8342
+ };
8343
+ };
8344
+ /** @description The alert is not open. */
8345
+ 409: {
8346
+ headers: {
8347
+ [name: string]: unknown;
8348
+ };
8349
+ content: {
8350
+ 'application/json': components['schemas']['ErrorResponse'];
8351
+ };
8352
+ };
8353
+ /** @description Validation Error */
8354
+ 422: {
8355
+ headers: {
8356
+ [name: string]: unknown;
8357
+ };
8358
+ content: {
8359
+ 'application/json': components['schemas']['HTTPValidationError'];
8360
+ };
8361
+ };
8362
+ };
8363
+ };
8364
+ get_analytics_metrics: {
8365
+ parameters: {
8366
+ query?: {
8367
+ days?: number | null;
8368
+ start?: string | null;
8369
+ end?: string | null;
8370
+ /** @description Filter to repositories by "owner/name". */
8371
+ repo?: string[] | null;
8372
+ /** @description Filter by PR-author login(s). */
8373
+ author?: string[] | null;
8374
+ account_type?: string;
8375
+ /** @description Filter by parent-PR status (open|draft|merged|closed). */
8376
+ status?: string[] | null;
8377
+ };
8378
+ header?: {
8379
+ 'user-agent'?: string | null;
8380
+ };
8381
+ path?: never;
8382
+ cookie?: never;
8383
+ };
8384
+ requestBody?: never;
8385
+ responses: {
8386
+ /** @description Successful Response */
8387
+ 200: {
8388
+ headers: {
8389
+ [name: string]: unknown;
8390
+ };
8391
+ content: {
8392
+ 'application/json': components['schemas']['GetAnalyticsMetricsResponse'];
8393
+ };
8394
+ };
8395
+ /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8396
+ 400: {
8397
+ headers: {
8398
+ [name: string]: unknown;
8399
+ };
8400
+ content: {
8401
+ 'application/json': components['schemas']['ErrorResponse'];
8402
+ };
8403
+ };
8404
+ /** @description The bearer token is missing, invalid, or revoked. */
8405
+ 401: {
8406
+ headers: {
8407
+ [name: string]: unknown;
8408
+ };
8409
+ content: {
8410
+ 'application/json': components['schemas']['ErrorResponse'];
8411
+ };
8412
+ };
8413
+ /** @description The credential may not perform this action, or the account is blocked. */
8414
+ 403: {
8415
+ headers: {
8416
+ [name: string]: unknown;
8417
+ };
8418
+ content: {
8419
+ 'application/json': components['schemas']['ErrorResponse'];
8420
+ };
8421
+ };
8422
+ /** @description Validation Error */
8423
+ 422: {
8424
+ headers: {
8425
+ [name: string]: unknown;
8426
+ };
8427
+ content: {
8428
+ 'application/json': components['schemas']['HTTPValidationError'];
8429
+ };
8430
+ };
8431
+ };
8432
+ };
8433
+ get_analytics_pull_requests: {
8434
+ parameters: {
8435
+ query?: {
8436
+ days?: number | null;
8437
+ start?: string | null;
8438
+ end?: string | null;
8439
+ account_type?: string[] | null;
8440
+ repository_id?: number[] | null;
8441
+ author_id?: number[] | null;
8442
+ status?: string[] | null;
8443
+ };
8444
+ header?: {
8445
+ 'user-agent'?: string | null;
8446
+ };
8447
+ path?: never;
8448
+ cookie?: never;
8449
+ };
8450
+ requestBody?: never;
8451
+ responses: {
8452
+ /** @description Successful Response */
8453
+ 200: {
8454
+ headers: {
8455
+ [name: string]: unknown;
8456
+ };
8457
+ content: {
8458
+ 'application/json': components['schemas']['GetAnalyticsPullRequestsResponse'];
8459
+ };
8460
+ };
8461
+ /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8462
+ 400: {
8463
+ headers: {
8464
+ [name: string]: unknown;
8465
+ };
8466
+ content: {
8467
+ 'application/json': components['schemas']['ErrorResponse'];
8468
+ };
8469
+ };
8470
+ /** @description The bearer token is missing, invalid, or revoked. */
8471
+ 401: {
8472
+ headers: {
8473
+ [name: string]: unknown;
8474
+ };
8475
+ content: {
8476
+ 'application/json': components['schemas']['ErrorResponse'];
8477
+ };
8478
+ };
8479
+ /** @description The credential may not perform this action, or the account is blocked. */
8480
+ 403: {
8481
+ headers: {
8482
+ [name: string]: unknown;
8483
+ };
8484
+ content: {
8485
+ 'application/json': components['schemas']['ErrorResponse'];
8486
+ };
8487
+ };
8488
+ /** @description Validation Error */
8489
+ 422: {
8490
+ headers: {
8491
+ [name: string]: unknown;
8492
+ };
8493
+ content: {
8494
+ 'application/json': components['schemas']['HTTPValidationError'];
8495
+ };
8496
+ };
8497
+ };
8498
+ };
8499
+ get_analytics_reviews: {
8500
+ parameters: {
8501
+ query?: {
8502
+ days?: number | null;
8503
+ start?: string | null;
8504
+ end?: string | null;
8505
+ repo?: string[] | null;
8506
+ /** @description Filter by reviewer login(s). */
8507
+ author?: string[] | null;
8508
+ account_type?: string;
8509
+ review_state?: string[] | null;
8510
+ };
8511
+ header?: {
8512
+ 'user-agent'?: string | null;
8513
+ };
8514
+ path?: never;
8515
+ cookie?: never;
8516
+ };
8517
+ requestBody?: never;
8518
+ responses: {
8519
+ /** @description Successful Response */
8520
+ 200: {
8521
+ headers: {
8522
+ [name: string]: unknown;
8523
+ };
8524
+ content: {
8525
+ 'application/json': components['schemas']['GetAnalyticsReviewsResponse'];
8526
+ };
8527
+ };
8528
+ /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8529
+ 400: {
8530
+ headers: {
8531
+ [name: string]: unknown;
8532
+ };
8533
+ content: {
8534
+ 'application/json': components['schemas']['ErrorResponse'];
8535
+ };
8536
+ };
8537
+ /** @description The bearer token is missing, invalid, or revoked. */
8538
+ 401: {
8539
+ headers: {
8540
+ [name: string]: unknown;
8541
+ };
8542
+ content: {
8543
+ 'application/json': components['schemas']['ErrorResponse'];
8544
+ };
8545
+ };
8546
+ /** @description The credential may not perform this action, or the account is blocked. */
8547
+ 403: {
8548
+ headers: {
8549
+ [name: string]: unknown;
8550
+ };
8551
+ content: {
8552
+ 'application/json': components['schemas']['ErrorResponse'];
8553
+ };
8554
+ };
8555
+ /** @description Validation Error */
8556
+ 422: {
8557
+ headers: {
8558
+ [name: string]: unknown;
8559
+ };
8560
+ content: {
8561
+ 'application/json': components['schemas']['HTTPValidationError'];
8562
+ };
8563
+ };
8564
+ };
8565
+ };
8566
+ cli_auth_poll: {
8567
+ parameters: {
8568
+ query?: never;
8569
+ header?: never;
8570
+ path?: never;
8571
+ cookie?: never;
8572
+ };
8573
+ requestBody: {
8574
+ content: {
8575
+ 'application/json': components['schemas']['CliAuthPollRequest'];
8576
+ };
8577
+ };
8578
+ responses: {
8579
+ /** @description Successful Response */
8580
+ 200: {
8581
+ headers: {
8582
+ [name: string]: unknown;
8583
+ };
8584
+ content: {
8585
+ 'application/json': components['schemas']['PollCliAuthResponse'];
8586
+ };
8587
+ };
8588
+ /** @description The bearer token is missing, invalid, or revoked. */
8589
+ 401: {
8590
+ headers: {
8591
+ [name: string]: unknown;
8592
+ };
8593
+ content: {
8594
+ 'application/json': components['schemas']['ErrorResponse'];
8595
+ };
8596
+ };
8597
+ /** @description The credential may not perform this action, or the account is blocked. */
8598
+ 403: {
8599
+ headers: {
8600
+ [name: string]: unknown;
8601
+ };
8602
+ content: {
8603
+ 'application/json': components['schemas']['ErrorResponse'];
8604
+ };
8605
+ };
8606
+ /** @description Unknown device code. */
8607
+ 404: {
8608
+ headers: {
8609
+ [name: string]: unknown;
8610
+ };
8611
+ content: {
8612
+ 'application/json': components['schemas']['ErrorResponse'];
8613
+ };
8614
+ };
8615
+ /** @description Validation Error */
8616
+ 422: {
8617
+ headers: {
8618
+ [name: string]: unknown;
8619
+ };
8620
+ content: {
8621
+ 'application/json': components['schemas']['HTTPValidationError'];
8622
+ };
8623
+ };
8624
+ };
8625
+ };
8626
+ cli_auth_start: {
8627
+ parameters: {
8628
+ query?: never;
8629
+ header?: never;
8630
+ path?: never;
8631
+ cookie?: never;
8632
+ };
8633
+ requestBody?: never;
8634
+ responses: {
8635
+ /** @description Successful Response */
8636
+ 201: {
8637
+ headers: {
8638
+ [name: string]: unknown;
8639
+ };
8640
+ content: {
8641
+ 'application/json': components['schemas']['StartCliAuthResponse'];
8642
+ };
8643
+ };
8644
+ /** @description The bearer token is missing, invalid, or revoked. */
8645
+ 401: {
8646
+ headers: {
8647
+ [name: string]: unknown;
8648
+ };
8649
+ content: {
8650
+ 'application/json': components['schemas']['ErrorResponse'];
8651
+ };
8652
+ };
8653
+ /** @description The credential may not perform this action, or the account is blocked. */
8654
+ 403: {
8655
+ headers: {
8656
+ [name: string]: unknown;
8657
+ };
8658
+ content: {
8659
+ 'application/json': components['schemas']['ErrorResponse'];
8660
+ };
8661
+ };
8662
+ };
8663
+ };
8664
+ get_budget: {
8665
+ parameters: {
8666
+ query?: never;
8667
+ header?: {
8668
+ 'user-agent'?: string | null;
8669
+ };
8670
+ path?: never;
8671
+ cookie?: never;
8672
+ };
8673
+ requestBody?: never;
8674
+ responses: {
8675
+ /** @description Successful Response */
8676
+ 200: {
8677
+ headers: {
8678
+ [name: string]: unknown;
8679
+ };
8680
+ content: {
8681
+ 'application/json': components['schemas']['BudgetSummary'];
7900
8682
  };
7901
8683
  };
7902
8684
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -7928,15 +8710,13 @@ interface operations {
7928
8710
  };
7929
8711
  };
7930
8712
  };
7931
- get_alert: {
8713
+ list_environments: {
7932
8714
  parameters: {
7933
8715
  query?: never;
7934
8716
  header?: {
7935
8717
  'user-agent'?: string | null;
7936
8718
  };
7937
- path: {
7938
- alert_id: string;
7939
- };
8719
+ path?: never;
7940
8720
  cookie?: never;
7941
8721
  };
7942
8722
  requestBody?: never;
@@ -7947,7 +8727,7 @@ interface operations {
7947
8727
  [name: string]: unknown;
7948
8728
  };
7949
8729
  content: {
7950
- 'application/json': components['schemas']['AlertResponse'];
8730
+ 'application/json': components['schemas']['EnvironmentsListResponse'];
7951
8731
  };
7952
8732
  };
7953
8733
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -7968,15 +8748,6 @@ interface operations {
7968
8748
  'application/json': components['schemas']['ErrorResponse'];
7969
8749
  };
7970
8750
  };
7971
- /** @description No such alert in your account. */
7972
- 404: {
7973
- headers: {
7974
- [name: string]: unknown;
7975
- };
7976
- content: {
7977
- 'application/json': components['schemas']['ErrorResponse'];
7978
- };
7979
- };
7980
8751
  /** @description Validation Error */
7981
8752
  422: {
7982
8753
  headers: {
@@ -7988,30 +8759,32 @@ interface operations {
7988
8759
  };
7989
8760
  };
7990
8761
  };
7991
- dismiss_alert: {
8762
+ create_environment: {
7992
8763
  parameters: {
7993
8764
  query?: never;
7994
8765
  header?: {
7995
8766
  'user-agent'?: string | null;
7996
8767
  };
7997
- path: {
7998
- alert_id: string;
7999
- };
8768
+ path?: never;
8000
8769
  cookie?: never;
8001
8770
  };
8002
- requestBody?: never;
8771
+ requestBody: {
8772
+ content: {
8773
+ 'application/json': components['schemas']['CreateEnvironmentRequest'];
8774
+ };
8775
+ };
8003
8776
  responses: {
8004
8777
  /** @description Successful Response */
8005
- 200: {
8778
+ 201: {
8006
8779
  headers: {
8007
8780
  [name: string]: unknown;
8008
8781
  };
8009
8782
  content: {
8010
- 'application/json': components['schemas']['AlertResponse'];
8783
+ 'application/json': components['schemas']['EnvironmentResponse'];
8011
8784
  };
8012
8785
  };
8013
- /** @description The bearer token is missing, invalid, or revoked. */
8014
- 401: {
8786
+ /** @description The environment is invalid. */
8787
+ 400: {
8015
8788
  headers: {
8016
8789
  [name: string]: unknown;
8017
8790
  };
@@ -8019,8 +8792,8 @@ interface operations {
8019
8792
  'application/json': components['schemas']['ErrorResponse'];
8020
8793
  };
8021
8794
  };
8022
- /** @description The credential may not perform this action, or the account is blocked. */
8023
- 403: {
8795
+ /** @description The bearer token is missing, invalid, or revoked. */
8796
+ 401: {
8024
8797
  headers: {
8025
8798
  [name: string]: unknown;
8026
8799
  };
@@ -8028,8 +8801,8 @@ interface operations {
8028
8801
  'application/json': components['schemas']['ErrorResponse'];
8029
8802
  };
8030
8803
  };
8031
- /** @description No such alert in your account. */
8032
- 404: {
8804
+ /** @description The credential may not perform this action, or the account is blocked. */
8805
+ 403: {
8033
8806
  headers: {
8034
8807
  [name: string]: unknown;
8035
8808
  };
@@ -8037,7 +8810,7 @@ interface operations {
8037
8810
  'application/json': components['schemas']['ErrorResponse'];
8038
8811
  };
8039
8812
  };
8040
- /** @description The alert is not open. */
8813
+ /** @description An environment with that name already exists. */
8041
8814
  409: {
8042
8815
  headers: {
8043
8816
  [name: string]: unknown;
@@ -8046,31 +8819,20 @@ interface operations {
8046
8819
  'application/json': components['schemas']['ErrorResponse'];
8047
8820
  };
8048
8821
  };
8049
- /** @description Validation Error */
8822
+ /** @description The environment's name is missing or malformed. */
8050
8823
  422: {
8051
8824
  headers: {
8052
8825
  [name: string]: unknown;
8053
8826
  };
8054
8827
  content: {
8055
- 'application/json': components['schemas']['HTTPValidationError'];
8828
+ 'application/json': components['schemas']['ErrorResponse'];
8056
8829
  };
8057
8830
  };
8058
8831
  };
8059
8832
  };
8060
- get_analytics_metrics: {
8833
+ list_environment_defaults: {
8061
8834
  parameters: {
8062
- query?: {
8063
- days?: number | null;
8064
- start?: string | null;
8065
- end?: string | null;
8066
- /** @description Filter to repositories by "owner/name". */
8067
- repo?: string[] | null;
8068
- /** @description Filter by PR-author login(s). */
8069
- author?: string[] | null;
8070
- account_type?: string;
8071
- /** @description Filter by parent-PR status (open|draft|merged|closed). */
8072
- status?: string[] | null;
8073
- };
8835
+ query?: never;
8074
8836
  header?: {
8075
8837
  'user-agent'?: string | null;
8076
8838
  };
@@ -8085,16 +8847,7 @@ interface operations {
8085
8847
  [name: string]: unknown;
8086
8848
  };
8087
8849
  content: {
8088
- 'application/json': components['schemas']['GetAnalyticsMetricsResponse'];
8089
- };
8090
- };
8091
- /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8092
- 400: {
8093
- headers: {
8094
- [name: string]: unknown;
8095
- };
8096
- content: {
8097
- 'application/json': components['schemas']['ErrorResponse'];
8850
+ 'application/json': components['schemas']['EnvironmentDefaults'];
8098
8851
  };
8099
8852
  };
8100
8853
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -8126,24 +8879,20 @@ interface operations {
8126
8879
  };
8127
8880
  };
8128
8881
  };
8129
- get_analytics_pull_requests: {
8882
+ put_environment_default: {
8130
8883
  parameters: {
8131
- query?: {
8132
- days?: number | null;
8133
- start?: string | null;
8134
- end?: string | null;
8135
- account_type?: string[] | null;
8136
- repository_id?: number[] | null;
8137
- author_id?: number[] | null;
8138
- status?: string[] | null;
8139
- };
8884
+ query?: never;
8140
8885
  header?: {
8141
8886
  'user-agent'?: string | null;
8142
8887
  };
8143
8888
  path?: never;
8144
8889
  cookie?: never;
8145
8890
  };
8146
- requestBody?: never;
8891
+ requestBody: {
8892
+ content: {
8893
+ 'application/json': components['schemas']['PutEnvironmentDefaultRequest'];
8894
+ };
8895
+ };
8147
8896
  responses: {
8148
8897
  /** @description Successful Response */
8149
8898
  200: {
@@ -8151,11 +8900,11 @@ interface operations {
8151
8900
  [name: string]: unknown;
8152
8901
  };
8153
8902
  content: {
8154
- 'application/json': components['schemas']['GetAnalyticsPullRequestsResponse'];
8903
+ 'application/json': components['schemas']['EnvironmentDefaults'];
8155
8904
  };
8156
8905
  };
8157
- /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8158
- 400: {
8906
+ /** @description The bearer token is missing, invalid, or revoked. */
8907
+ 401: {
8159
8908
  headers: {
8160
8909
  [name: string]: unknown;
8161
8910
  };
@@ -8163,8 +8912,8 @@ interface operations {
8163
8912
  'application/json': components['schemas']['ErrorResponse'];
8164
8913
  };
8165
8914
  };
8166
- /** @description The bearer token is missing, invalid, or revoked. */
8167
- 401: {
8915
+ /** @description The credential may not perform this action, or the account is blocked. */
8916
+ 403: {
8168
8917
  headers: {
8169
8918
  [name: string]: unknown;
8170
8919
  };
@@ -8172,8 +8921,8 @@ interface operations {
8172
8921
  'application/json': components['schemas']['ErrorResponse'];
8173
8922
  };
8174
8923
  };
8175
- /** @description The credential may not perform this action, or the account is blocked. */
8176
- 403: {
8924
+ /** @description The environment or repository was not found in your account. */
8925
+ 404: {
8177
8926
  headers: {
8178
8927
  [name: string]: unknown;
8179
8928
  };
@@ -8192,17 +8941,11 @@ interface operations {
8192
8941
  };
8193
8942
  };
8194
8943
  };
8195
- get_analytics_reviews: {
8944
+ delete_environment_default: {
8196
8945
  parameters: {
8197
8946
  query?: {
8198
- days?: number | null;
8199
- start?: string | null;
8200
- end?: string | null;
8201
- repo?: string[] | null;
8202
- /** @description Filter by reviewer login(s). */
8203
- author?: string[] | null;
8204
- account_type?: string;
8205
- review_state?: string[] | null;
8947
+ /** @description Repo rung to clear ("owner/name"); omit to clear the account default. */
8948
+ repository?: string | null;
8206
8949
  };
8207
8950
  header?: {
8208
8951
  'user-agent'?: string | null;
@@ -8213,16 +8956,14 @@ interface operations {
8213
8956
  requestBody?: never;
8214
8957
  responses: {
8215
8958
  /** @description Successful Response */
8216
- 200: {
8959
+ 204: {
8217
8960
  headers: {
8218
8961
  [name: string]: unknown;
8219
8962
  };
8220
- content: {
8221
- 'application/json': components['schemas']['GetAnalyticsReviewsResponse'];
8222
- };
8963
+ content?: never;
8223
8964
  };
8224
- /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8225
- 400: {
8965
+ /** @description The bearer token is missing, invalid, or revoked. */
8966
+ 401: {
8226
8967
  headers: {
8227
8968
  [name: string]: unknown;
8228
8969
  };
@@ -8230,8 +8971,8 @@ interface operations {
8230
8971
  'application/json': components['schemas']['ErrorResponse'];
8231
8972
  };
8232
8973
  };
8233
- /** @description The bearer token is missing, invalid, or revoked. */
8234
- 401: {
8974
+ /** @description The credential may not perform this action, or the account is blocked. */
8975
+ 403: {
8235
8976
  headers: {
8236
8977
  [name: string]: unknown;
8237
8978
  };
@@ -8239,8 +8980,8 @@ interface operations {
8239
8980
  'application/json': components['schemas']['ErrorResponse'];
8240
8981
  };
8241
8982
  };
8242
- /** @description The credential may not perform this action, or the account is blocked. */
8243
- 403: {
8983
+ /** @description No default is set at that rung, or the repository was not found in your account. */
8984
+ 404: {
8244
8985
  headers: {
8245
8986
  [name: string]: unknown;
8246
8987
  };
@@ -8259,18 +9000,18 @@ interface operations {
8259
9000
  };
8260
9001
  };
8261
9002
  };
8262
- cli_auth_poll: {
9003
+ get_environment: {
8263
9004
  parameters: {
8264
9005
  query?: never;
8265
- header?: never;
8266
- path?: never;
8267
- cookie?: never;
8268
- };
8269
- requestBody: {
8270
- content: {
8271
- 'application/json': components['schemas']['CliAuthPollRequest'];
9006
+ header?: {
9007
+ 'user-agent'?: string | null;
9008
+ };
9009
+ path: {
9010
+ environment_id: string;
8272
9011
  };
9012
+ cookie?: never;
8273
9013
  };
9014
+ requestBody?: never;
8274
9015
  responses: {
8275
9016
  /** @description Successful Response */
8276
9017
  200: {
@@ -8278,7 +9019,7 @@ interface operations {
8278
9019
  [name: string]: unknown;
8279
9020
  };
8280
9021
  content: {
8281
- 'application/json': components['schemas']['PollCliAuthResponse'];
9022
+ 'application/json': components['schemas']['EnvironmentResponse'];
8282
9023
  };
8283
9024
  };
8284
9025
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -8299,7 +9040,7 @@ interface operations {
8299
9040
  'application/json': components['schemas']['ErrorResponse'];
8300
9041
  };
8301
9042
  };
8302
- /** @description Unknown device code. */
9043
+ /** @description No such environment in your account. */
8303
9044
  404: {
8304
9045
  headers: {
8305
9046
  [name: string]: unknown;
@@ -8319,22 +9060,39 @@ interface operations {
8319
9060
  };
8320
9061
  };
8321
9062
  };
8322
- cli_auth_start: {
9063
+ update_environment: {
8323
9064
  parameters: {
8324
9065
  query?: never;
8325
- header?: never;
8326
- path?: never;
9066
+ header?: {
9067
+ 'user-agent'?: string | null;
9068
+ };
9069
+ path: {
9070
+ environment_id: string;
9071
+ };
8327
9072
  cookie?: never;
8328
9073
  };
8329
- requestBody?: never;
9074
+ requestBody: {
9075
+ content: {
9076
+ 'application/json': components['schemas']['UpdateEnvironmentRequest'];
9077
+ };
9078
+ };
8330
9079
  responses: {
8331
9080
  /** @description Successful Response */
8332
- 201: {
9081
+ 200: {
8333
9082
  headers: {
8334
9083
  [name: string]: unknown;
8335
9084
  };
8336
9085
  content: {
8337
- 'application/json': components['schemas']['StartCliAuthResponse'];
9086
+ 'application/json': components['schemas']['EnvironmentResponse'];
9087
+ };
9088
+ };
9089
+ /** @description The environment is invalid. */
9090
+ 400: {
9091
+ headers: {
9092
+ [name: string]: unknown;
9093
+ };
9094
+ content: {
9095
+ 'application/json': components['schemas']['ErrorResponse'];
8338
9096
  };
8339
9097
  };
8340
9098
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -8355,27 +9113,54 @@ interface operations {
8355
9113
  'application/json': components['schemas']['ErrorResponse'];
8356
9114
  };
8357
9115
  };
9116
+ /** @description No such environment in your account. */
9117
+ 404: {
9118
+ headers: {
9119
+ [name: string]: unknown;
9120
+ };
9121
+ content: {
9122
+ 'application/json': components['schemas']['ErrorResponse'];
9123
+ };
9124
+ };
9125
+ /** @description The environment is defined by a file in a repository, or another live environment already holds the new name. */
9126
+ 409: {
9127
+ headers: {
9128
+ [name: string]: unknown;
9129
+ };
9130
+ content: {
9131
+ 'application/json': components['schemas']['ErrorResponse'];
9132
+ };
9133
+ };
9134
+ /** @description The environment's name is missing or malformed. */
9135
+ 422: {
9136
+ headers: {
9137
+ [name: string]: unknown;
9138
+ };
9139
+ content: {
9140
+ 'application/json': components['schemas']['ErrorResponse'];
9141
+ };
9142
+ };
8358
9143
  };
8359
9144
  };
8360
- get_budget: {
9145
+ delete_environment: {
8361
9146
  parameters: {
8362
9147
  query?: never;
8363
9148
  header?: {
8364
9149
  'user-agent'?: string | null;
8365
9150
  };
8366
- path?: never;
9151
+ path: {
9152
+ environment_id: string;
9153
+ };
8367
9154
  cookie?: never;
8368
9155
  };
8369
9156
  requestBody?: never;
8370
9157
  responses: {
8371
9158
  /** @description Successful Response */
8372
- 200: {
9159
+ 204: {
8373
9160
  headers: {
8374
9161
  [name: string]: unknown;
8375
9162
  };
8376
- content: {
8377
- 'application/json': components['schemas']['BudgetSummary'];
8378
- };
9163
+ content?: never;
8379
9164
  };
8380
9165
  /** @description The bearer token is missing, invalid, or revoked. */
8381
9166
  401: {
@@ -8395,6 +9180,24 @@ interface operations {
8395
9180
  'application/json': components['schemas']['ErrorResponse'];
8396
9181
  };
8397
9182
  };
9183
+ /** @description No such environment in your account. */
9184
+ 404: {
9185
+ headers: {
9186
+ [name: string]: unknown;
9187
+ };
9188
+ content: {
9189
+ 'application/json': components['schemas']['ErrorResponse'];
9190
+ };
9191
+ };
9192
+ /** @description The environment is defined by a file in a repository; delete that file instead. */
9193
+ 409: {
9194
+ headers: {
9195
+ [name: string]: unknown;
9196
+ };
9197
+ content: {
9198
+ 'application/json': components['schemas']['ErrorResponse'];
9199
+ };
9200
+ };
8398
9201
  /** @description Validation Error */
8399
9202
  422: {
8400
9203
  headers: {
@@ -9895,7 +10698,7 @@ interface operations {
9895
10698
  'application/json': components['schemas']['SessionResponse'];
9896
10699
  };
9897
10700
  };
9898
- /** @description The request combines incompatible fields (multiple config sources, idle_start with prompt/input, or both override forms), or the config override is invalid. */
10701
+ /** @description The request combines incompatible fields (both config sources, or a one-shot run with no prompt or input), or the config override is invalid. */
9899
10702
  400: {
9900
10703
  headers: {
9901
10704
  [name: string]: unknown;
@@ -9922,7 +10725,7 @@ interface operations {
9922
10725
  'application/json': components['schemas']['ErrorResponse'];
9923
10726
  };
9924
10727
  };
9925
- /** @description The named agent or template does not exist in your account. */
10728
+ /** @description The named agent does not exist in your account. */
9926
10729
  404: {
9927
10730
  headers: {
9928
10731
  [name: string]: unknown;
@@ -10716,6 +11519,15 @@ type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10716
11519
  * Where the resolved budget came from.
10717
11520
  */
10718
11521
  type BudgetSource = 'system' | 'account' | 'config' | 'run';
11522
+ /**
11523
+ * How a session's environment was chosen. None (the field is nullable)
11524
+ * when the config carried an inline environment block and no resolution ran —
11525
+ * an inline environment is not a reference, so there is nothing to record.
11526
+ *
11527
+ * Not derivable from the row: `environment_id` says WHICH environment, not
11528
+ * how it was chosen, and is null for the built-in basic sandbox.
11529
+ */
11530
+ type EnvironmentSource = 'request' | 'agent_config' | 'repo_default' | 'account_default' | 'platform_default';
10719
11531
  /**
10720
11532
  * Why a terminal agent session ended — a finer-grained reason than `status`.
10721
11533
  *
@@ -10851,6 +11663,7 @@ interface Session {
10851
11663
  * When the session was created.
10852
11664
  */
10853
11665
  created_at: string;
11666
+ environment: SessionEnvironment;
10854
11667
  /**
10855
11668
  * How the session ended; null until it is terminal.
10856
11669
  */
@@ -10934,9 +11747,8 @@ interface AgentConfig {
10934
11747
  claude: AgentConfigClaude;
10935
11748
  codex: AgentConfigCodex | null;
10936
11749
  ellipsis: AgentConfigEllipsis;
10937
- environment: AgentConfigEnvironment;
11750
+ environment: string | AgentConfigEnvironment;
10938
11751
  input: AgentConfigInput | null;
10939
- mcp_servers: (string | AgentConfigMcpServer)[];
10940
11752
  output: AgentConfigOutput | null;
10941
11753
  permissions: AgentConfigPermissions;
10942
11754
  skills: AgentConfigSkill[];
@@ -10997,22 +11809,19 @@ interface AgentConfigCodex {
10997
11809
  /**
10998
11810
  * The Ellipsis product namespace for a config file: which schema this is
10999
11811
  * (`version`), the human-facing identity (`name`/`description`), freeform
11000
- * organizational `metadata`, whether the agent is `enabled`, and the
11001
- * human-access flag `interactive`. The presence of a top-level `ellipsis:`
11002
- * mapping is what marks a YAML file as an Ellipsis agent config (vs arbitrary
11003
- * YAML that merely lives under a config directory) — see
11004
- * `yaml_is_ellipsis_config`.
11812
+ * organizational `metadata`, and whether the agent is `enabled`. The
11813
+ * presence of a top-level `ellipsis:` mapping is what marks a YAML file as
11814
+ * an Ellipsis agent config (vs arbitrary YAML that merely lives under a
11815
+ * config directory) — see `yaml_is_ellipsis_config`.
11005
11816
  *
11006
- * `enabled`/`interactive` are agent behavior, not freeform metadata, so they
11007
- * stay inside the config `sha` (only `metadata` is sha-excluded).
11008
- * `interactive` lets a human `agent session connect` to a live session (CLI
11009
- * relay). It does not decide whether a session is ephemeral or durable — that
11010
- * is the trigger's job.
11817
+ * `enabled` is agent behavior, not freeform metadata, so it stays inside
11818
+ * the config `sha` (only `metadata` is sha-excluded). Whether a session
11819
+ * accepts messages is a per-run choice (POST /v1/sessions `interactive`),
11820
+ * not a config one.
11011
11821
  */
11012
11822
  interface AgentConfigEllipsis {
11013
11823
  description: string | null;
11014
11824
  enabled: boolean;
11015
- interactive: boolean;
11016
11825
  metadata: AgentConfigMetadata;
11017
11826
  name: string | null;
11018
11827
  version: string;
@@ -11040,6 +11849,7 @@ interface AgentConfigEnvironment {
11040
11849
  compute: AgentConfigCompute;
11041
11850
  hooks: AgentConfigEnvironmentHooks;
11042
11851
  image: AgentConfigEnvironmentImage;
11852
+ mcp_servers: (string | AgentConfigMcpServer | AgentConfigMcpStdioServer | AgentConfigMcpRemoteServer)[];
11043
11853
  repositories: AgentConfigRepository[];
11044
11854
  variables: AgentConfigEnvironmentVariable[];
11045
11855
  }
@@ -11130,6 +11940,49 @@ interface AgentConfigEnvironmentImage {
11130
11940
  dockerfile_append: string | null;
11131
11941
  setup: string | null;
11132
11942
  }
11943
+ /**
11944
+ * One built-in MCP server this agent opts into by name (`linear`/`slack`).
11945
+ * A name reference over the connected built-in set — the platform manages the
11946
+ * server's transport and credentials. It only matters when the named
11947
+ * integration is set to `opt_in` inclusion; an integration in the default
11948
+ * `all_sessions` mode is added regardless. For a server the platform does not
11949
+ * provide, define it instead (`AgentConfigMcpStdioServer` /
11950
+ * `AgentConfigMcpRemoteServer`).
11951
+ */
11952
+ interface AgentConfigMcpServer {
11953
+ name: string;
11954
+ }
11955
+ /**
11956
+ * A bring-your-own stdio MCP server: the harness spawns `command` inside
11957
+ * the sandbox and speaks JSON-RPC over its stdin/stdout. The command must be
11958
+ * runnable in the sandbox image — install its runtime via `image.setup` /
11959
+ * `image.dockerfile_append` if the base image lacks it.
11960
+ *
11961
+ * `env` values may embed `${NAME}` references, resolved at run time from the
11962
+ * account's secrets store (see `mcp_secret_refs`); everything else is passed
11963
+ * literally.
11964
+ */
11965
+ interface AgentConfigMcpStdioServer {
11966
+ args: string[];
11967
+ command: string;
11968
+ env: {
11969
+ [k: string]: string;
11970
+ };
11971
+ name: string;
11972
+ }
11973
+ /**
11974
+ * A bring-your-own remote MCP server: the harness talks HTTP to `url`.
11975
+ * Nothing runs in the sandbox image. `headers` carry static auth (e.g.
11976
+ * `Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret
11977
+ * references, resolved at run time from the account's secrets store.
11978
+ */
11979
+ interface AgentConfigMcpRemoteServer {
11980
+ headers: {
11981
+ [k: string]: string;
11982
+ };
11983
+ name: string;
11984
+ url: string;
11985
+ }
11133
11986
  /**
11134
11987
  * One environment variable injected into the agent's sandbox.
11135
11988
  *
@@ -11165,17 +12018,6 @@ interface AgentConfigInput {
11165
12018
  } | null;
11166
12019
  message: string | null;
11167
12020
  }
11168
- /**
11169
- * One built-in MCP server this agent opts into by name (`linear`/`slack`).
11170
- * This is a name reference over the connected built-in set, NOT a custom-server
11171
- * definition — there is no command/url/headers shape (that was the old,
11172
- * removed field, and Ellipsis does not support bring-your-own MCP servers).
11173
- * It only matters when the named integration is set to `opt_in` inclusion; an
11174
- * integration in the default `all_sessions` mode is added regardless.
11175
- */
11176
- interface AgentConfigMcpServer {
11177
- name: string;
11178
- }
11179
12021
  /**
11180
12022
  * The typed output contract: the JSON Schema the agent must exit through
11181
12023
  * (the StructuredOutput exit tool). Read back via
@@ -11386,6 +12228,19 @@ interface SessionCost {
11386
12228
  */
11387
12229
  total: number;
11388
12230
  }
12231
+ /**
12232
+ * 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.
12233
+ */
12234
+ interface SessionEnvironment {
12235
+ /**
12236
+ * Identifier of the saved environment the session's config resolved. Null for an inline environment block or the built-in basic sandbox.
12237
+ */
12238
+ environment_id: string | null;
12239
+ /**
12240
+ * How the environment was chosen (request, agent_config, repo_default, account_default, platform_default). Null when the config carried its own inline environment.
12241
+ */
12242
+ source: EnvironmentSource | null;
12243
+ }
11389
12244
  /**
11390
12245
  * Every repo the session touched. Small enough to ride on `agent_sessions`
11391
12246
  * and be returned by every session read.
@@ -12036,6 +12891,7 @@ interface Session1 {
12036
12891
  * When the session was created.
12037
12892
  */
12038
12893
  created_at: string;
12894
+ environment: SessionEnvironment;
12039
12895
  /**
12040
12896
  * How the session ended; null until it is terminal.
12041
12897
  */