@ellipsis-dev/sdk 0.15.1 → 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
@@ -4625,16 +4922,13 @@ interface components {
4625
4922
  * @description The session execution that produced the record, or null for session-scoped lifecycle records.
4626
4923
  */
4627
4924
  execution_id?: string | null;
4925
+ /** @description What the session did to git, per repository, so a result row can show what it shipped without fetching the session. */
4926
+ git?: components['schemas']['SessionGit'] | null;
4628
4927
  /**
4629
4928
  * Id
4630
4929
  * @description The matching record's unique identifier.
4631
4930
  */
4632
4931
  id: string;
4633
- /**
4634
- * Output Prs
4635
- * @description Pull requests the session created, so a result row can show what it shipped without fetching the session.
4636
- */
4637
- output_prs?: components['schemas']['SessionPr'][] | null;
4638
4932
  /**
4639
4933
  * Record Type
4640
4934
  * @description The record's event type.
@@ -4680,17 +4974,12 @@ interface components {
4680
4974
  */
4681
4975
  config_id?: string | null;
4682
4976
  /**
4683
- * Config Override
4684
- * @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.
4685
4979
  */
4686
- config_override?: {
4980
+ override?: {
4687
4981
  [key: string]: unknown;
4688
4982
  } | null;
4689
- /**
4690
- * Config Override Yaml
4691
- * @description The same partial-config override as a YAML/JSON string (e.g. read from a file). Mutually exclusive with config_override.
4692
- */
4693
- config_override_yaml?: string | null;
4694
4983
  /**
4695
4984
  * Prompt
4696
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.
@@ -4752,7 +5041,7 @@ interface components {
4752
5041
  * routes; nothing maps to it yet.
4753
5042
  * @enum {string}
4754
5043
  */
4755
- 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';
4756
5045
  /**
4757
5046
  * Review
4758
5047
  * @description One code review: one pipeline iteration over one commit range of a pull
@@ -5975,8 +6264,12 @@ interface components {
5975
6264
  * @description When the session was created.
5976
6265
  */
5977
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'];
5978
6269
  /** @description How the session ended; null until it is terminal. */
5979
6270
  exit_status?: components['schemas']['SessionExitStatus'] | null;
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. */
6272
+ git?: components['schemas']['SessionGit'] | null;
5980
6273
  /** @description The coding-agent harness the session runs on. */
5981
6274
  harness: components['schemas']['Harness'];
5982
6275
  /**
@@ -6002,13 +6295,6 @@ interface components {
6002
6295
  metadata: {
6003
6296
  [key: string]: string;
6004
6297
  };
6005
- /** @description Per-file line counts for the uncommitted changes in the session's workspace. Work the session committed is not included here — see output_prs. Null if no diff was ever captured. */
6006
- output_diff?: components['schemas']['SessionDiff'] | null;
6007
- /**
6008
- * Output Prs
6009
- * @description Pull requests the session created or updated.
6010
- */
6011
- output_prs?: components['schemas']['SessionPr'][] | null;
6012
6298
  /** @description What preceded this session, if anything. */
6013
6299
  parent?: components['schemas']['SessionParent'];
6014
6300
  /**
@@ -6148,35 +6434,20 @@ interface components {
6148
6434
  total: number;
6149
6435
  };
6150
6436
  /**
6151
- * SessionDiff
6152
- * @description The counts half of a session's working-tree diff, small enough to ride on
6153
- * agent_sessions and be returned by every session read. The patch text lives
6154
- * in `agent_session_diffs` and is fetched on demand.
6155
- *
6156
- * Scope is UNCOMMITTED work only (`git diff HEAD`), so this answers "is there
6157
- * unlanded work in this sandbox?" — a session that committed and pushed shows
6158
- * no files here and its created PR instead.
6159
- */
6160
- SessionDiff: {
6161
- /** Files */
6162
- files: components['schemas']['SessionDiffFile'][];
6163
- };
6164
- /**
6165
- * SessionDiffFile
6166
- * @description One file's uncommitted change in a session's sandbox, as `git diff HEAD`
6167
- * --numstat reports it (with intent-to-add so new files count).
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.
6168
6442
  */
6169
- SessionDiffFile: {
6170
- /** Additions */
6171
- additions: number;
6172
- /** Deletions */
6173
- deletions: number;
6174
- /** Path */
6175
- path: string;
6176
- /** Repo */
6177
- repo: string;
6178
- /** Status */
6179
- status: string;
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;
6180
6451
  };
6181
6452
  /**
6182
6453
  * SessionExecution
@@ -6266,6 +6537,75 @@ interface components {
6266
6537
  * @enum {string}
6267
6538
  */
6268
6539
  SessionExitStatus: 'completed' | 'budget_hit' | 'payment_required' | 'tool_call_failed' | 'lifecycle_hook_failed' | 'missing_repo_access' | 'missing_token_permissions' | 'missing_sandbox_variables' | 'blocked' | 'contact_email_required' | 'cancelled' | 'interrupted' | 'error' | 'stopped';
6540
+ /**
6541
+ * SessionGit
6542
+ * @description Every repo the session touched. Small enough to ride on `agent_sessions`
6543
+ * and be returned by every session read.
6544
+ */
6545
+ SessionGit: {
6546
+ /**
6547
+ * Repos
6548
+ * @default []
6549
+ */
6550
+ repos: components['schemas']['SessionGitRepo'][];
6551
+ };
6552
+ /**
6553
+ * SessionGitFile
6554
+ * @description One file's uncommitted change, as `git diff HEAD --numstat` reports it
6555
+ * (with intent-to-add, so a brand-new file still counts).
6556
+ */
6557
+ SessionGitFile: {
6558
+ /** Additions */
6559
+ additions: number;
6560
+ /** Deletions */
6561
+ deletions: number;
6562
+ /** Path */
6563
+ path: string;
6564
+ /** Status */
6565
+ status: string;
6566
+ };
6567
+ /**
6568
+ * SessionGitPr
6569
+ * @description A pull request the session opened in this repo, denormalized at capture
6570
+ * time so a surface renders a labeled link without joining gh_prs. Live PR
6571
+ * state (open/merged/closed) is not stored — read gh_prs where a view needs
6572
+ * it. The repo is the parent object, so it is not repeated here.
6573
+ */
6574
+ SessionGitPr: {
6575
+ /** Gh Pr Id */
6576
+ gh_pr_id?: number | null;
6577
+ /** Number */
6578
+ number: number;
6579
+ /** Title */
6580
+ title?: string | null;
6581
+ /** Url */
6582
+ url: string;
6583
+ };
6584
+ /**
6585
+ * SessionGitRepo
6586
+ * @description One checkout in the session's sandbox and everything the session did to
6587
+ * it, split by whether it survived the sandbox.
6588
+ */
6589
+ SessionGitRepo: {
6590
+ /** Full Name */
6591
+ full_name: string;
6592
+ /** Local Commit */
6593
+ local_commit?: string | null;
6594
+ /**
6595
+ * Local Uncommitted Files
6596
+ * @default []
6597
+ */
6598
+ local_uncommitted_files: components['schemas']['SessionGitFile'][];
6599
+ /**
6600
+ * Prs
6601
+ * @default []
6602
+ */
6603
+ prs: components['schemas']['SessionGitPr'][];
6604
+ /** Remote Branch */
6605
+ remote_branch?: string | null;
6606
+ /** Remote Commit */
6607
+ remote_commit?: string | null;
6608
+ };
6269
6609
  /**
6270
6610
  * SessionLiveness
6271
6611
  * @description The durable conversation axis (backs the surfaced `session` field).
@@ -6400,25 +6740,6 @@ interface components {
6400
6740
  */
6401
6741
  session_id?: string | null;
6402
6742
  };
6403
- /**
6404
- * SessionPr
6405
- * @description A pull request this session created, denormalized at capture time so
6406
- * session surfaces render a labeled link without joining gh_prs. Live PR
6407
- * state (open/merged/closed) is not stored here — read it from gh_prs where
6408
- * a view needs it.
6409
- */
6410
- SessionPr: {
6411
- /** Gh Pr Id */
6412
- gh_pr_id?: number | null;
6413
- /** Number */
6414
- number: number;
6415
- /** Repo Full Name */
6416
- repo_full_name: string;
6417
- /** Title */
6418
- title?: string | null;
6419
- /** Url */
6420
- url: string;
6421
- };
6422
6743
  /**
6423
6744
  * SessionPrompting
6424
6745
  * @description The prompt-affordance projection. `enabled` answers "would a send work",
@@ -6801,7 +7122,7 @@ interface components {
6801
7122
  * @description Parameters for starting a new agent session.
6802
7123
  */
6803
7124
  StartAgentSessionRequest: {
6804
- /** @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). */
6805
7126
  config?: components['schemas']['AgentConfig'] | null;
6806
7127
  /**
6807
7128
  * Config Id
@@ -6809,29 +7130,16 @@ interface components {
6809
7130
  */
6810
7131
  config_id?: string | null;
6811
7132
  /**
6812
- * Config Override
6813
- * @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.
6814
- */
6815
- config_override?: {
6816
- [key: string]: unknown;
6817
- } | null;
6818
- /**
6819
- * Config Override Yaml
6820
- * @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.
6821
7135
  */
6822
- config_override_yaml?: string | null;
7136
+ environment?: string | null;
6823
7137
  /**
6824
7138
  * Force Rebuild
6825
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`.
6826
7140
  * @default false
6827
7141
  */
6828
7142
  force_rebuild: boolean;
6829
- /**
6830
- * Idle Start
6831
- * @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).
6832
- * @default false
6833
- */
6834
- idle_start: boolean;
6835
7143
  /**
6836
7144
  * Input
6837
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.
@@ -6839,6 +7147,12 @@ interface components {
6839
7147
  input?: {
6840
7148
  [key: string]: unknown;
6841
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;
6842
7156
  /**
6843
7157
  * Metadata
6844
7158
  * @description Arbitrary string key/value metadata stored on the session.
@@ -6847,9 +7161,16 @@ interface components {
6847
7161
  metadata: {
6848
7162
  [key: string]: string;
6849
7163
  };
7164
+ /**
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;
6850
7171
  /**
6851
7172
  * Prompt
6852
- * @description Per-run instructions appended to the initial query after the config's shared system prompt. Applies regardless of which config source is used.
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.
6853
7174
  */
6854
7175
  prompt?: string | null;
6855
7176
  /**
@@ -6857,11 +7178,6 @@ interface components {
6857
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.
6858
7179
  */
6859
7180
  repository?: string | null;
6860
- /**
6861
- * Template Id
6862
- * @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).
6863
- */
6864
- template_id?: string | null;
6865
7181
  };
6866
7182
  /**
6867
7183
  * StartCliAuthResponse
@@ -6964,6 +7280,14 @@ interface components {
6964
7280
  /** @description The agent's new definition. Replaces the previous one wholesale — this is not a partial update. */
6965
7281
  config: components['schemas']['AgentConfig'];
6966
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
+ };
6967
7291
  /**
6968
7292
  * UsageDailyPoint
6969
7293
  * @description One day's usage: tokens split by type, and cost split into the four
@@ -7151,15 +7475,15 @@ interface operations {
7151
7475
  };
7152
7476
  responses: {
7153
7477
  /** @description Successful Response */
7154
- 200: {
7478
+ 201: {
7155
7479
  headers: {
7156
7480
  [name: string]: unknown;
7157
7481
  };
7158
7482
  content: {
7159
- 'application/json': components['schemas']['CreateAgentConfigResponse'];
7483
+ 'application/json': components['schemas']['AgentConfigResponse'];
7160
7484
  };
7161
7485
  };
7162
- /** @description Provide exactly one of config or template_id; or the config, path, or target branch is invalid. */
7486
+ /** @description The config is invalid. */
7163
7487
  400: {
7164
7488
  headers: {
7165
7489
  [name: string]: unknown;
@@ -7186,16 +7510,7 @@ interface operations {
7186
7510
  'application/json': components['schemas']['ErrorResponse'];
7187
7511
  };
7188
7512
  };
7189
- /** @description The template or repository was not found in your account. */
7190
- 404: {
7191
- headers: {
7192
- [name: string]: unknown;
7193
- };
7194
- content: {
7195
- 'application/json': components['schemas']['ErrorResponse'];
7196
- };
7197
- };
7198
- /** @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. */
7199
7514
  409: {
7200
7515
  headers: {
7201
7516
  [name: string]: unknown;
@@ -7957,8 +8272,475 @@ interface operations {
7957
8272
  'application/json': components['schemas']['ErrorResponse'];
7958
8273
  };
7959
8274
  };
7960
- /** @description No such alert in your account. */
7961
- 404: {
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'];
8682
+ };
8683
+ };
8684
+ /** @description The bearer token is missing, invalid, or revoked. */
8685
+ 401: {
8686
+ headers: {
8687
+ [name: string]: unknown;
8688
+ };
8689
+ content: {
8690
+ 'application/json': components['schemas']['ErrorResponse'];
8691
+ };
8692
+ };
8693
+ /** @description The credential may not perform this action, or the account is blocked. */
8694
+ 403: {
8695
+ headers: {
8696
+ [name: string]: unknown;
8697
+ };
8698
+ content: {
8699
+ 'application/json': components['schemas']['ErrorResponse'];
8700
+ };
8701
+ };
8702
+ /** @description Validation Error */
8703
+ 422: {
8704
+ headers: {
8705
+ [name: string]: unknown;
8706
+ };
8707
+ content: {
8708
+ 'application/json': components['schemas']['HTTPValidationError'];
8709
+ };
8710
+ };
8711
+ };
8712
+ };
8713
+ list_environments: {
8714
+ parameters: {
8715
+ query?: never;
8716
+ header?: {
8717
+ 'user-agent'?: string | null;
8718
+ };
8719
+ path?: never;
8720
+ cookie?: never;
8721
+ };
8722
+ requestBody?: never;
8723
+ responses: {
8724
+ /** @description Successful Response */
8725
+ 200: {
8726
+ headers: {
8727
+ [name: string]: unknown;
8728
+ };
8729
+ content: {
8730
+ 'application/json': components['schemas']['EnvironmentsListResponse'];
8731
+ };
8732
+ };
8733
+ /** @description The bearer token is missing, invalid, or revoked. */
8734
+ 401: {
8735
+ headers: {
8736
+ [name: string]: unknown;
8737
+ };
8738
+ content: {
8739
+ 'application/json': components['schemas']['ErrorResponse'];
8740
+ };
8741
+ };
8742
+ /** @description The credential may not perform this action, or the account is blocked. */
8743
+ 403: {
7962
8744
  headers: {
7963
8745
  [name: string]: unknown;
7964
8746
  };
@@ -7977,30 +8759,32 @@ interface operations {
7977
8759
  };
7978
8760
  };
7979
8761
  };
7980
- dismiss_alert: {
8762
+ create_environment: {
7981
8763
  parameters: {
7982
8764
  query?: never;
7983
8765
  header?: {
7984
8766
  'user-agent'?: string | null;
7985
8767
  };
7986
- path: {
7987
- alert_id: string;
7988
- };
8768
+ path?: never;
7989
8769
  cookie?: never;
7990
8770
  };
7991
- requestBody?: never;
8771
+ requestBody: {
8772
+ content: {
8773
+ 'application/json': components['schemas']['CreateEnvironmentRequest'];
8774
+ };
8775
+ };
7992
8776
  responses: {
7993
8777
  /** @description Successful Response */
7994
- 200: {
8778
+ 201: {
7995
8779
  headers: {
7996
8780
  [name: string]: unknown;
7997
8781
  };
7998
8782
  content: {
7999
- 'application/json': components['schemas']['AlertResponse'];
8783
+ 'application/json': components['schemas']['EnvironmentResponse'];
8000
8784
  };
8001
8785
  };
8002
- /** @description The bearer token is missing, invalid, or revoked. */
8003
- 401: {
8786
+ /** @description The environment is invalid. */
8787
+ 400: {
8004
8788
  headers: {
8005
8789
  [name: string]: unknown;
8006
8790
  };
@@ -8008,8 +8792,8 @@ interface operations {
8008
8792
  'application/json': components['schemas']['ErrorResponse'];
8009
8793
  };
8010
8794
  };
8011
- /** @description The credential may not perform this action, or the account is blocked. */
8012
- 403: {
8795
+ /** @description The bearer token is missing, invalid, or revoked. */
8796
+ 401: {
8013
8797
  headers: {
8014
8798
  [name: string]: unknown;
8015
8799
  };
@@ -8017,8 +8801,8 @@ interface operations {
8017
8801
  'application/json': components['schemas']['ErrorResponse'];
8018
8802
  };
8019
8803
  };
8020
- /** @description No such alert in your account. */
8021
- 404: {
8804
+ /** @description The credential may not perform this action, or the account is blocked. */
8805
+ 403: {
8022
8806
  headers: {
8023
8807
  [name: string]: unknown;
8024
8808
  };
@@ -8026,7 +8810,7 @@ interface operations {
8026
8810
  'application/json': components['schemas']['ErrorResponse'];
8027
8811
  };
8028
8812
  };
8029
- /** @description The alert is not open. */
8813
+ /** @description An environment with that name already exists. */
8030
8814
  409: {
8031
8815
  headers: {
8032
8816
  [name: string]: unknown;
@@ -8035,31 +8819,20 @@ interface operations {
8035
8819
  'application/json': components['schemas']['ErrorResponse'];
8036
8820
  };
8037
8821
  };
8038
- /** @description Validation Error */
8822
+ /** @description The environment's name is missing or malformed. */
8039
8823
  422: {
8040
8824
  headers: {
8041
8825
  [name: string]: unknown;
8042
8826
  };
8043
8827
  content: {
8044
- 'application/json': components['schemas']['HTTPValidationError'];
8828
+ 'application/json': components['schemas']['ErrorResponse'];
8045
8829
  };
8046
8830
  };
8047
8831
  };
8048
8832
  };
8049
- get_analytics_metrics: {
8833
+ list_environment_defaults: {
8050
8834
  parameters: {
8051
- query?: {
8052
- days?: number | null;
8053
- start?: string | null;
8054
- end?: string | null;
8055
- /** @description Filter to repositories by "owner/name". */
8056
- repo?: string[] | null;
8057
- /** @description Filter by PR-author login(s). */
8058
- author?: string[] | null;
8059
- account_type?: string;
8060
- /** @description Filter by parent-PR status (open|draft|merged|closed). */
8061
- status?: string[] | null;
8062
- };
8835
+ query?: never;
8063
8836
  header?: {
8064
8837
  'user-agent'?: string | null;
8065
8838
  };
@@ -8074,16 +8847,7 @@ interface operations {
8074
8847
  [name: string]: unknown;
8075
8848
  };
8076
8849
  content: {
8077
- 'application/json': components['schemas']['GetAnalyticsMetricsResponse'];
8078
- };
8079
- };
8080
- /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8081
- 400: {
8082
- headers: {
8083
- [name: string]: unknown;
8084
- };
8085
- content: {
8086
- 'application/json': components['schemas']['ErrorResponse'];
8850
+ 'application/json': components['schemas']['EnvironmentDefaults'];
8087
8851
  };
8088
8852
  };
8089
8853
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -8115,24 +8879,20 @@ interface operations {
8115
8879
  };
8116
8880
  };
8117
8881
  };
8118
- get_analytics_pull_requests: {
8882
+ put_environment_default: {
8119
8883
  parameters: {
8120
- query?: {
8121
- days?: number | null;
8122
- start?: string | null;
8123
- end?: string | null;
8124
- account_type?: string[] | null;
8125
- repository_id?: number[] | null;
8126
- author_id?: number[] | null;
8127
- status?: string[] | null;
8128
- };
8884
+ query?: never;
8129
8885
  header?: {
8130
8886
  'user-agent'?: string | null;
8131
8887
  };
8132
8888
  path?: never;
8133
8889
  cookie?: never;
8134
8890
  };
8135
- requestBody?: never;
8891
+ requestBody: {
8892
+ content: {
8893
+ 'application/json': components['schemas']['PutEnvironmentDefaultRequest'];
8894
+ };
8895
+ };
8136
8896
  responses: {
8137
8897
  /** @description Successful Response */
8138
8898
  200: {
@@ -8140,11 +8900,11 @@ interface operations {
8140
8900
  [name: string]: unknown;
8141
8901
  };
8142
8902
  content: {
8143
- 'application/json': components['schemas']['GetAnalyticsPullRequestsResponse'];
8903
+ 'application/json': components['schemas']['EnvironmentDefaults'];
8144
8904
  };
8145
8905
  };
8146
- /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8147
- 400: {
8906
+ /** @description The bearer token is missing, invalid, or revoked. */
8907
+ 401: {
8148
8908
  headers: {
8149
8909
  [name: string]: unknown;
8150
8910
  };
@@ -8152,8 +8912,8 @@ interface operations {
8152
8912
  'application/json': components['schemas']['ErrorResponse'];
8153
8913
  };
8154
8914
  };
8155
- /** @description The bearer token is missing, invalid, or revoked. */
8156
- 401: {
8915
+ /** @description The credential may not perform this action, or the account is blocked. */
8916
+ 403: {
8157
8917
  headers: {
8158
8918
  [name: string]: unknown;
8159
8919
  };
@@ -8161,8 +8921,8 @@ interface operations {
8161
8921
  'application/json': components['schemas']['ErrorResponse'];
8162
8922
  };
8163
8923
  };
8164
- /** @description The credential may not perform this action, or the account is blocked. */
8165
- 403: {
8924
+ /** @description The environment or repository was not found in your account. */
8925
+ 404: {
8166
8926
  headers: {
8167
8927
  [name: string]: unknown;
8168
8928
  };
@@ -8181,17 +8941,11 @@ interface operations {
8181
8941
  };
8182
8942
  };
8183
8943
  };
8184
- get_analytics_reviews: {
8944
+ delete_environment_default: {
8185
8945
  parameters: {
8186
8946
  query?: {
8187
- days?: number | null;
8188
- start?: string | null;
8189
- end?: string | null;
8190
- repo?: string[] | null;
8191
- /** @description Filter by reviewer login(s). */
8192
- author?: string[] | null;
8193
- account_type?: string;
8194
- review_state?: string[] | null;
8947
+ /** @description Repo rung to clear ("owner/name"); omit to clear the account default. */
8948
+ repository?: string | null;
8195
8949
  };
8196
8950
  header?: {
8197
8951
  'user-agent'?: string | null;
@@ -8202,16 +8956,14 @@ interface operations {
8202
8956
  requestBody?: never;
8203
8957
  responses: {
8204
8958
  /** @description Successful Response */
8205
- 200: {
8959
+ 204: {
8206
8960
  headers: {
8207
8961
  [name: string]: unknown;
8208
8962
  };
8209
- content: {
8210
- 'application/json': components['schemas']['GetAnalyticsReviewsResponse'];
8211
- };
8963
+ content?: never;
8212
8964
  };
8213
- /** @description The time window is invalid: days combined with start, a non-positive days, or end not after start. */
8214
- 400: {
8965
+ /** @description The bearer token is missing, invalid, or revoked. */
8966
+ 401: {
8215
8967
  headers: {
8216
8968
  [name: string]: unknown;
8217
8969
  };
@@ -8219,8 +8971,8 @@ interface operations {
8219
8971
  'application/json': components['schemas']['ErrorResponse'];
8220
8972
  };
8221
8973
  };
8222
- /** @description The bearer token is missing, invalid, or revoked. */
8223
- 401: {
8974
+ /** @description The credential may not perform this action, or the account is blocked. */
8975
+ 403: {
8224
8976
  headers: {
8225
8977
  [name: string]: unknown;
8226
8978
  };
@@ -8228,8 +8980,8 @@ interface operations {
8228
8980
  'application/json': components['schemas']['ErrorResponse'];
8229
8981
  };
8230
8982
  };
8231
- /** @description The credential may not perform this action, or the account is blocked. */
8232
- 403: {
8983
+ /** @description No default is set at that rung, or the repository was not found in your account. */
8984
+ 404: {
8233
8985
  headers: {
8234
8986
  [name: string]: unknown;
8235
8987
  };
@@ -8248,18 +9000,18 @@ interface operations {
8248
9000
  };
8249
9001
  };
8250
9002
  };
8251
- cli_auth_poll: {
9003
+ get_environment: {
8252
9004
  parameters: {
8253
9005
  query?: never;
8254
- header?: never;
8255
- path?: never;
8256
- cookie?: never;
8257
- };
8258
- requestBody: {
8259
- content: {
8260
- 'application/json': components['schemas']['CliAuthPollRequest'];
9006
+ header?: {
9007
+ 'user-agent'?: string | null;
9008
+ };
9009
+ path: {
9010
+ environment_id: string;
8261
9011
  };
9012
+ cookie?: never;
8262
9013
  };
9014
+ requestBody?: never;
8263
9015
  responses: {
8264
9016
  /** @description Successful Response */
8265
9017
  200: {
@@ -8267,7 +9019,7 @@ interface operations {
8267
9019
  [name: string]: unknown;
8268
9020
  };
8269
9021
  content: {
8270
- 'application/json': components['schemas']['PollCliAuthResponse'];
9022
+ 'application/json': components['schemas']['EnvironmentResponse'];
8271
9023
  };
8272
9024
  };
8273
9025
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -8288,7 +9040,7 @@ interface operations {
8288
9040
  'application/json': components['schemas']['ErrorResponse'];
8289
9041
  };
8290
9042
  };
8291
- /** @description Unknown device code. */
9043
+ /** @description No such environment in your account. */
8292
9044
  404: {
8293
9045
  headers: {
8294
9046
  [name: string]: unknown;
@@ -8308,22 +9060,39 @@ interface operations {
8308
9060
  };
8309
9061
  };
8310
9062
  };
8311
- cli_auth_start: {
9063
+ update_environment: {
8312
9064
  parameters: {
8313
9065
  query?: never;
8314
- header?: never;
8315
- path?: never;
9066
+ header?: {
9067
+ 'user-agent'?: string | null;
9068
+ };
9069
+ path: {
9070
+ environment_id: string;
9071
+ };
8316
9072
  cookie?: never;
8317
9073
  };
8318
- requestBody?: never;
9074
+ requestBody: {
9075
+ content: {
9076
+ 'application/json': components['schemas']['UpdateEnvironmentRequest'];
9077
+ };
9078
+ };
8319
9079
  responses: {
8320
9080
  /** @description Successful Response */
8321
- 201: {
9081
+ 200: {
8322
9082
  headers: {
8323
9083
  [name: string]: unknown;
8324
9084
  };
8325
9085
  content: {
8326
- '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'];
8327
9096
  };
8328
9097
  };
8329
9098
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -8344,27 +9113,54 @@ interface operations {
8344
9113
  'application/json': components['schemas']['ErrorResponse'];
8345
9114
  };
8346
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
+ };
8347
9143
  };
8348
9144
  };
8349
- get_budget: {
9145
+ delete_environment: {
8350
9146
  parameters: {
8351
9147
  query?: never;
8352
9148
  header?: {
8353
9149
  'user-agent'?: string | null;
8354
9150
  };
8355
- path?: never;
9151
+ path: {
9152
+ environment_id: string;
9153
+ };
8356
9154
  cookie?: never;
8357
9155
  };
8358
9156
  requestBody?: never;
8359
9157
  responses: {
8360
9158
  /** @description Successful Response */
8361
- 200: {
9159
+ 204: {
8362
9160
  headers: {
8363
9161
  [name: string]: unknown;
8364
9162
  };
8365
- content: {
8366
- 'application/json': components['schemas']['BudgetSummary'];
8367
- };
9163
+ content?: never;
8368
9164
  };
8369
9165
  /** @description The bearer token is missing, invalid, or revoked. */
8370
9166
  401: {
@@ -8384,6 +9180,24 @@ interface operations {
8384
9180
  'application/json': components['schemas']['ErrorResponse'];
8385
9181
  };
8386
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
+ };
8387
9201
  /** @description Validation Error */
8388
9202
  422: {
8389
9203
  headers: {
@@ -9884,7 +10698,7 @@ interface operations {
9884
10698
  'application/json': components['schemas']['SessionResponse'];
9885
10699
  };
9886
10700
  };
9887
- /** @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. */
9888
10702
  400: {
9889
10703
  headers: {
9890
10704
  [name: string]: unknown;
@@ -9911,7 +10725,7 @@ interface operations {
9911
10725
  'application/json': components['schemas']['ErrorResponse'];
9912
10726
  };
9913
10727
  };
9914
- /** @description The named agent or template does not exist in your account. */
10728
+ /** @description The named agent does not exist in your account. */
9915
10729
  404: {
9916
10730
  headers: {
9917
10731
  [name: string]: unknown;
@@ -10705,6 +11519,15 @@ type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10705
11519
  * Where the resolved budget came from.
10706
11520
  */
10707
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';
10708
11531
  /**
10709
11532
  * Why a terminal agent session ended — a finer-grained reason than `status`.
10710
11533
  *
@@ -10840,10 +11663,15 @@ interface Session {
10840
11663
  * When the session was created.
10841
11664
  */
10842
11665
  created_at: string;
11666
+ environment: SessionEnvironment;
10843
11667
  /**
10844
11668
  * How the session ended; null until it is terminal.
10845
11669
  */
10846
11670
  exit_status: SessionExitStatus | null;
11671
+ /**
11672
+ * 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.
11673
+ */
11674
+ git: SessionGit | null;
10847
11675
  harness: Harness;
10848
11676
  /**
10849
11677
  * Unique identifier of the session.
@@ -10863,14 +11691,6 @@ interface Session {
10863
11691
  metadata: {
10864
11692
  [k: string]: string;
10865
11693
  };
10866
- /**
10867
- * Per-file line counts for the uncommitted changes in the session's workspace. Work the session committed is not included here — see output_prs. Null if no diff was ever captured.
10868
- */
10869
- output_diff: SessionDiff | null;
10870
- /**
10871
- * Pull requests the session created or updated.
10872
- */
10873
- output_prs: SessionPr[] | null;
10874
11694
  parent: SessionParent;
10875
11695
  /**
10876
11696
  * The per-session prompt the session was started with.
@@ -10927,9 +11747,8 @@ interface AgentConfig {
10927
11747
  claude: AgentConfigClaude;
10928
11748
  codex: AgentConfigCodex | null;
10929
11749
  ellipsis: AgentConfigEllipsis;
10930
- environment: AgentConfigEnvironment;
11750
+ environment: string | AgentConfigEnvironment;
10931
11751
  input: AgentConfigInput | null;
10932
- mcp_servers: (string | AgentConfigMcpServer)[];
10933
11752
  output: AgentConfigOutput | null;
10934
11753
  permissions: AgentConfigPermissions;
10935
11754
  skills: AgentConfigSkill[];
@@ -10990,22 +11809,19 @@ interface AgentConfigCodex {
10990
11809
  /**
10991
11810
  * The Ellipsis product namespace for a config file: which schema this is
10992
11811
  * (`version`), the human-facing identity (`name`/`description`), freeform
10993
- * organizational `metadata`, whether the agent is `enabled`, and the
10994
- * human-access flag `interactive`. The presence of a top-level `ellipsis:`
10995
- * mapping is what marks a YAML file as an Ellipsis agent config (vs arbitrary
10996
- * YAML that merely lives under a config directory) — see
10997
- * `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`.
10998
11816
  *
10999
- * `enabled`/`interactive` are agent behavior, not freeform metadata, so they
11000
- * stay inside the config `sha` (only `metadata` is sha-excluded).
11001
- * `interactive` lets a human `agent session connect` to a live session (CLI
11002
- * relay). It does not decide whether a session is ephemeral or durable — that
11003
- * 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.
11004
11821
  */
11005
11822
  interface AgentConfigEllipsis {
11006
11823
  description: string | null;
11007
11824
  enabled: boolean;
11008
- interactive: boolean;
11009
11825
  metadata: AgentConfigMetadata;
11010
11826
  name: string | null;
11011
11827
  version: string;
@@ -11033,6 +11849,7 @@ interface AgentConfigEnvironment {
11033
11849
  compute: AgentConfigCompute;
11034
11850
  hooks: AgentConfigEnvironmentHooks;
11035
11851
  image: AgentConfigEnvironmentImage;
11852
+ mcp_servers: (string | AgentConfigMcpServer | AgentConfigMcpStdioServer | AgentConfigMcpRemoteServer)[];
11036
11853
  repositories: AgentConfigRepository[];
11037
11854
  variables: AgentConfigEnvironmentVariable[];
11038
11855
  }
@@ -11123,6 +11940,49 @@ interface AgentConfigEnvironmentImage {
11123
11940
  dockerfile_append: string | null;
11124
11941
  setup: string | null;
11125
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
+ }
11126
11986
  /**
11127
11987
  * One environment variable injected into the agent's sandbox.
11128
11988
  *
@@ -11158,17 +12018,6 @@ interface AgentConfigInput {
11158
12018
  } | null;
11159
12019
  message: string | null;
11160
12020
  }
11161
- /**
11162
- * One built-in MCP server this agent opts into by name (`linear`/`slack`).
11163
- * This is a name reference over the connected built-in set, NOT a custom-server
11164
- * definition — there is no command/url/headers shape (that was the old,
11165
- * removed field, and Ellipsis does not support bring-your-own MCP servers).
11166
- * It only matters when the named integration is set to `opt_in` inclusion; an
11167
- * integration in the default `all_sessions` mode is added regardless.
11168
- */
11169
- interface AgentConfigMcpServer {
11170
- name: string;
11171
- }
11172
12021
  /**
11173
12022
  * The typed output contract: the JSON Schema the agent must exit through
11174
12023
  * (the StructuredOutput exit tool). Read back via
@@ -11380,38 +12229,56 @@ interface SessionCost {
11380
12229
  total: number;
11381
12230
  }
11382
12231
  /**
11383
- * The counts half of a session's working-tree diff, small enough to ride on
11384
- * agent_sessions and be returned by every session read. The patch text lives
11385
- * in `agent_session_diffs` and is fetched on demand.
11386
- *
11387
- * Scope is UNCOMMITTED work only (`git diff HEAD`), so this answers "is there
11388
- * unlanded work in this sandbox?" — a session that committed and pushed shows
11389
- * no files here and its created PR instead.
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.
11390
12233
  */
11391
- interface SessionDiff {
11392
- files: SessionDiffFile[];
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
+ }
12244
+ /**
12245
+ * Every repo the session touched. Small enough to ride on `agent_sessions`
12246
+ * and be returned by every session read.
12247
+ */
12248
+ interface SessionGit {
12249
+ repos: SessionGitRepo[];
12250
+ }
12251
+ /**
12252
+ * One checkout in the session's sandbox and everything the session did to
12253
+ * it, split by whether it survived the sandbox.
12254
+ */
12255
+ interface SessionGitRepo {
12256
+ full_name: string;
12257
+ local_commit: string | null;
12258
+ local_uncommitted_files: SessionGitFile[];
12259
+ prs: SessionGitPr[];
12260
+ remote_branch: string | null;
12261
+ remote_commit: string | null;
11393
12262
  }
11394
12263
  /**
11395
- * One file's uncommitted change in a session's sandbox, as `git diff HEAD`
11396
- * --numstat reports it (with intent-to-add so new files count).
12264
+ * One file's uncommitted change, as `git diff HEAD --numstat` reports it
12265
+ * (with intent-to-add, so a brand-new file still counts).
11397
12266
  */
11398
- interface SessionDiffFile {
12267
+ interface SessionGitFile {
11399
12268
  additions: number;
11400
12269
  deletions: number;
11401
12270
  path: string;
11402
- repo: string;
11403
12271
  status: string;
11404
12272
  }
11405
12273
  /**
11406
- * A pull request this session created, denormalized at capture time so
11407
- * session surfaces render a labeled link without joining gh_prs. Live PR
11408
- * state (open/merged/closed) is not stored here — read it from gh_prs where
11409
- * a view needs it.
12274
+ * A pull request the session opened in this repo, denormalized at capture
12275
+ * time so a surface renders a labeled link without joining gh_prs. Live PR
12276
+ * state (open/merged/closed) is not stored — read gh_prs where a view needs
12277
+ * it. The repo is the parent object, so it is not repeated here.
11410
12278
  */
11411
- interface SessionPr {
12279
+ interface SessionGitPr {
11412
12280
  gh_pr_id: number | null;
11413
12281
  number: number;
11414
- repo_full_name: string;
11415
12282
  url: string;
11416
12283
  }
11417
12284
  /**
@@ -12024,10 +12891,15 @@ interface Session1 {
12024
12891
  * When the session was created.
12025
12892
  */
12026
12893
  created_at: string;
12894
+ environment: SessionEnvironment;
12027
12895
  /**
12028
12896
  * How the session ended; null until it is terminal.
12029
12897
  */
12030
12898
  exit_status: SessionExitStatus | null;
12899
+ /**
12900
+ * 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.
12901
+ */
12902
+ git: SessionGit | null;
12031
12903
  harness: Harness;
12032
12904
  /**
12033
12905
  * Unique identifier of the session.
@@ -12047,14 +12919,6 @@ interface Session1 {
12047
12919
  metadata: {
12048
12920
  [k: string]: string;
12049
12921
  };
12050
- /**
12051
- * Per-file line counts for the uncommitted changes in the session's workspace. Work the session committed is not included here — see output_prs. Null if no diff was ever captured.
12052
- */
12053
- output_diff: SessionDiff | null;
12054
- /**
12055
- * Pull requests the session created or updated.
12056
- */
12057
- output_prs: SessionPr[] | null;
12058
12922
  parent: SessionParent;
12059
12923
  /**
12060
12924
  * The per-session prompt the session was started with.
@@ -12187,4 +13051,4 @@ type ReviewRequester = components['schemas']['ReviewRequester'];
12187
13051
  type ReviewFinding = components['schemas']['ReviewFinding'];
12188
13052
  type Finding = ReviewFinding;
12189
13053
 
12190
- export type { SessionResponse 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, SessionExecution as M, SessionExecutionsListResponse as N, SessionExitStatus as O, ParentKind as P, SessionFrame as Q, RecordsAppendFrame as R, SdkAssistantRecord as S, SessionLiveness as T, SessionMessage as U, SessionMessageResponse as V, SessionMessageStatus as W, SessionPr as X, SessionPrompting as Y, SessionRecord as Z, SessionRecordsListResponse as _, AttributionType as a, SessionSource as a0, SessionState as a1, SessionStatus as a2, SessionStreamFrame as a3, SessionSurface as a4, SessionsListResponse as a5, SnapshotFrame as a6, StreamFrame as a7, TokensInfo as a8, paths as a9, CodexFileChangeItem as aa, CodexMcpToolCallItem as ab, 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 };
13054
+ export type { SessionResponse 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, SessionExecution as M, SessionExecutionsListResponse as N, SessionExitStatus as O, ParentKind as P, SessionFrame as Q, RecordsAppendFrame as R, SdkAssistantRecord as S, SessionGit as T, SessionLiveness as U, SessionMessage as V, SessionMessageResponse as W, SessionMessageStatus as X, SessionPrompting as Y, SessionRecord as Z, SessionRecordsListResponse as _, AttributionType as a, SessionSource as a0, SessionState as a1, SessionStatus as a2, SessionStreamFrame as a3, SessionSurface as a4, SessionsListResponse as a5, SnapshotFrame as a6, StreamFrame as a7, TokensInfo as a8, paths as a9, CodexFileChangeItem as aa, CodexMcpToolCallItem as ab, 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 };