@ellipsis-dev/sdk 0.30.0 → 0.31.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.
@@ -446,7 +446,7 @@
446
446
  }
447
447
  ],
448
448
  "default": null,
449
- "description": "The initial user message, passed verbatim. Omit to start an interactive session idle.",
449
+ "description": "The initial user message, passed verbatim. Omit to start an interactive session with no turn, waiting for a message.",
450
450
  "title": "Prompt"
451
451
  },
452
452
  "settings": {
@@ -489,7 +489,7 @@
489
489
  "description": "Reasoning effort for every turn. Omit to use the model default."
490
490
  },
491
491
  "model": {
492
- "default": "gpt-5.6-terra",
492
+ "default": "gpt-6-sol",
493
493
  "title": "Model",
494
494
  "type": "string"
495
495
  },
@@ -503,7 +503,7 @@
503
503
  }
504
504
  ],
505
505
  "default": null,
506
- "description": "The initial user message, passed verbatim. Omit to start an interactive session idle.",
506
+ "description": "The initial user message, passed verbatim. Omit to start an interactive session with no turn, waiting for a message.",
507
507
  "title": "Prompt"
508
508
  }
509
509
  },
@@ -544,7 +544,7 @@
544
544
  },
545
545
  "ComputeConfig": {
546
546
  "additionalProperties": false,
547
- "description": "Sandbox compute sizing. Every field is optional; None inherits the\nplatform default (2 vCPU / 4096 MiB / 3600s \u2014 see DEFAULT_SANDBOX_* in\nmodels/ellipsis/vms/vm_execution.py). A resolved value outside the platform\nbounds fails validation loudly (a sync error on the config) rather than\nbeing clamped silently.\n\n`memory` and `timeout` each accept a shorthand string (\"8GB\", \"30m\") or an\nexplicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /\n`timeout_seconds` properties resolve either form to the canonical integer\nthe sandbox driver consumes.\n\n`timeout` is the max wall-clock the agent may run before its execution is\nstopped, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS \u2014 equal to the default, so\ntoday the knob only shortens a session; the cap matches the 1-hour validity\nof the sandbox's GitHub token). The worker's lease/visibility heartbeat\nceiling is derived from that cap, so a run at the max stays owned by its\nworker for its whole life.\n\nCompute currently uses a temporary flat one-cent amount per allocated\nexecution, subject to the account's existing free-compute exemptions.",
547
+ "description": "Environment compute sizing. Every field is optional; an omitted field\ninherits the platform default (2 vCPU / 4096 MiB / 3600s). A resolved value\noutside the platform bounds fails validation loudly (a sync error on the\nconfig) rather than being clamped silently.\n\n`memory` and `timeout` each accept a shorthand string (\"8GB\", \"30m\") or an\nexplicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /\n`timeout_seconds` properties resolve either form to the canonical integer\nthe environment is sized with.\n\n`timeout` is the max wall-clock the agent may run in one environment before\nit is stopped, capped at 1h (equal to the default, so today the knob only\nshortens a session; the cap matches the 1-hour validity of the session's\nGitHub token).\n\nCompute currently uses a temporary flat one-cent amount each time an\nenvironment is started for a session, subject to the account's existing\nfree-compute exemptions.",
548
548
  "properties": {
549
549
  "cpu": {
550
550
  "anyOf": [
@@ -635,14 +635,6 @@
635
635
  "title": "ConfigMetadata",
636
636
  "type": "object"
637
637
  },
638
- "ConversationState": {
639
- "enum": [
640
- "open",
641
- "closed"
642
- ],
643
- "title": "ConversationState",
644
- "type": "string"
645
- },
646
638
  "CronTrigger": {
647
639
  "additionalProperties": false,
648
640
  "properties": {
@@ -781,7 +773,7 @@
781
773
  }
782
774
  ]
783
775
  },
784
- "description": "`permissions.ellipsis` as a map: resource \u2192 level | grant | list of\ngrants. Levels are hierarchical (read < write < delete), so `write`\nincludes `read`. An unlisted resource is denied. The whole block is\nintersected with the platform's sandbox ceiling at token mint \u2014 it can\nnarrow what a sandbox token may do, never exceed it.",
776
+ "description": "`permissions.ellipsis` as a map: resource \u2192 level | grant | list of\ngrants. Levels are hierarchical (read < write < delete), so `write`\nincludes `read`. An unlisted resource is denied. The whole block is\nintersected with the platform's session token ceiling at token mint \u2014 it can\nnarrow what a session token may do, never exceed it.",
785
777
  "propertyNames": {
786
778
  "$ref": "#/$defs/Resource"
787
779
  },
@@ -805,11 +797,11 @@
805
797
  }
806
798
  ],
807
799
  "default": null,
808
- "description": "Exact files relative to /sandbox, including the repository name. Only these files are available during build_base and their contents and modes determine reuse. Omit to use all repositories and invalidate on any source change; [] means no repository files.",
800
+ "description": "Exact files relative to the workspace directory `/sandbox`, including the repository name. Only these files are available during build_base and their contents and modes determine reuse. Omit to use all repositories and invalidate on any source change; [] means no repository files.",
809
801
  "title": "Inputs"
810
802
  },
811
803
  "run": {
812
- "description": "Shell script to run in /sandbox.",
804
+ "description": "Shell script to run in the workspace directory `/sandbox`.",
813
805
  "minLength": 1,
814
806
  "title": "Run",
815
807
  "type": "string"
@@ -824,7 +816,7 @@
824
816
  },
825
817
  "EnvironmentConfig": {
826
818
  "additionalProperties": false,
827
- "description": "Everything about the environment (the sandbox) the agent runs in: which\n`repositories` are cloned into it, which environment `variables` it gets,\nits `compute` sizing, and lifecycle `hooks`.\nWhat the agent may *do* from that environment is the top-level\n`permissions:` block, not this one.\n\nEach `variables` entry names a variable to inject; with an inline `value` it\nis hardcoded, without one it is resolved from the account's sandbox-secrets\nstore. Only the named variables reach this agent; the rest of the account's\nstored variables never do. This is how a config brings in the config and\ncredentials a custom CLI needs.",
819
+ "description": "Everything about the environment the agent runs in: which\n`repositories` are cloned into it, which environment `variables` it gets,\nits `compute` sizing, and lifecycle `hooks`.\nWhat the agent may *do* from that environment is the top-level\n`permissions:` block, not this one.\n\nEach `variables` entry names a variable to inject; with an inline `value` it\nis hardcoded, without one it is resolved from the account's secrets\nstore. Only the named variables reach this agent; the rest of the account's\nstored variables never do. This is how a config brings in the config and\ncredentials a custom CLI needs.",
828
820
  "properties": {
829
821
  "compute": {
830
822
  "$ref": "#/$defs/ComputeConfig",
@@ -894,7 +886,7 @@
894
886
  },
895
887
  "EnvironmentHooks": {
896
888
  "additionalProperties": false,
897
- "description": "Environment lifecycle scripts, in order: build_base, after_checkout,\nbefore_start. The first two produce reusable snapshots; before_start runs\nbefore an agent starts or resumes its session. Scripts run as the sandbox\nuser in /sandbox. A nonzero exit fails the session.\n\nLegacy post_start/post_clone scripts remain supported for existing configs;\nboth run after workspace preparation, before the agent starts or resumes.\nThey cannot be combined with the new lifecycle fields.",
889
+ "description": "Environment lifecycle scripts, in order: build_base, after_checkout,\nbefore_start. The first two produce reusable snapshots; before_start runs\nbefore an agent starts or resumes its session. Scripts run as the environment's\nuser in the workspace directory `/sandbox`. A nonzero exit fails the session.\n\nLegacy post_start/post_clone scripts remain supported for existing configs;\nboth run after workspace preparation, before the agent starts or resumes.\nThey cannot be combined with the new lifecycle fields.",
898
890
  "properties": {
899
891
  "after_checkout": {
900
892
  "anyOf": [
@@ -909,7 +901,7 @@
909
901
  }
910
902
  ],
911
903
  "default": null,
912
- "description": "Prepare the requested source revision after Ellipsis checks out all repositories, before saving the prepared sandbox. Skipped when that prepared sandbox is reused.",
904
+ "description": "Prepare the requested source revision after Ellipsis checks out all repositories, before saving the prepared environment. Skipped when that prepared environment is reused.",
913
905
  "title": "After Checkout"
914
906
  },
915
907
  "before_start": {
@@ -925,7 +917,7 @@
925
917
  }
926
918
  ],
927
919
  "default": null,
928
- "description": "Run before the agent starts or resumes a session, after the sandbox is ready. This hook is not cached and adds to session startup time.",
920
+ "description": "Run before the agent starts or resumes a session, after the environment is ready. This hook is not cached and adds to session startup time.",
929
921
  "title": "Before Start"
930
922
  },
931
923
  "build_base": {
@@ -983,10 +975,10 @@
983
975
  },
984
976
  "EnvironmentScript": {
985
977
  "additionalProperties": false,
986
- "description": "An inline shell script run as the sandbox user, with /sandbox as cwd.",
978
+ "description": "An inline shell script run as the environment's user, with the workspace\ndirectory `/sandbox` as cwd.",
987
979
  "properties": {
988
980
  "run": {
989
- "description": "Shell script to run in /sandbox.",
981
+ "description": "Shell script to run in the workspace directory `/sandbox`.",
990
982
  "minLength": 1,
991
983
  "title": "Run",
992
984
  "type": "string"
@@ -999,7 +991,7 @@
999
991
  "type": "object"
1000
992
  },
1001
993
  "EnvironmentSource": {
1002
- "description": "How a session's environment was chosen. None (the field is nullable)\nwhen the config carried an inline environment block and no resolution ran \u2014\nan inline environment is not a reference, so there is nothing to record.\n\nNot derivable from the row: `environment_id` says WHICH environment, not\nhow it was chosen, and is null for the built-in basic sandbox.",
994
+ "description": "How a session's environment was chosen. None (the field is nullable)\nwhen the config carried an inline environment block and no resolution ran \u2014\nan inline environment is not a reference, so there is nothing to record.\n\nNot derivable from the row: `environment_id` says WHICH environment, not\nhow it was chosen, and is null for the built-in basic environment.",
1003
995
  "enum": [
1004
996
  "request",
1005
997
  "agent",
@@ -1012,7 +1004,7 @@
1012
1004
  },
1013
1005
  "EnvironmentVariable": {
1014
1006
  "additionalProperties": false,
1015
- "description": "One environment variable injected into the agent's sandbox.\n\n`value`, when set, is a literal injected as-is \u2014 use it for non-secret\nconfig (LOG_LEVEL, an API base URL). When `value` is omitted the value is\nresolved at run time from the account's sandbox-secrets store (dashboard\n/ `PUT /v1/secrets`) by `name`, so a secret can be injected without\never putting it in the config file. Either way the variable only reaches\nagents that name it.",
1007
+ "description": "One environment variable injected into the session's environment.\n\n`value`, when set, is a literal injected as-is \u2014 use it for non-secret\nconfig (LOG_LEVEL, an API base URL). When `value` is omitted the value is\nresolved at run time from the account's secrets store (dashboard\n/ `PUT /v1/secrets`) by `name`, so a secret can be injected without\never putting it in the config file. Either way the variable only reaches\nagents that name it.",
1016
1008
  "properties": {
1017
1009
  "name": {
1018
1010
  "title": "Name",
@@ -1195,7 +1187,7 @@
1195
1187
  },
1196
1188
  "GithubPermissions": {
1197
1189
  "additionalProperties": false,
1198
- "description": "The agent's GitHub access: the scope of the installation token minted for\nits sandbox \u2014 the credential `git`, `gh`, and the GitHub MCP server\nauthenticate with.\n\nBy default the token carries the installation's full permissions on all of\nthe installation's repositories. `permissions` narrows what it may do:\nthe string `read_only` grants read access to contents, issues, metadata and\npull requests; a map requests explicit levels per GitHub App permission\nscope (e.g. `{contents: read, pull_requests: write}`) and may never exceed\nwhat the installation granted. `repositories` scopes the token to exactly\nthe listed repos, by name (they must belong to the installation).\n\nRestriction is enforced by GitHub, not by Ellipsis: the token itself is\nminted with the reduced scope, so nothing running in the sandbox can\nexceed it.",
1190
+ "description": "The agent's GitHub access: the scope of the installation token minted for\nits session's environment \u2014 the credential `git`, `gh`, and the GitHub MCP\nserver authenticate with.\n\nBy default the token carries the installation's full permissions on all of\nthe installation's repositories. `permissions` narrows what it may do:\nthe string `read_only` grants read access to contents, issues, metadata and\npull requests; a map requests explicit levels per GitHub App permission\nscope (e.g. `{contents: read, pull_requests: write}`) and may never exceed\nwhat the installation granted. `repositories` scopes the token to exactly\nthe listed repos, by name (they must belong to the installation).\n\nRestriction is enforced by GitHub, not by Ellipsis: the token itself is\nminted with the reduced scope, so nothing running in the environment can\nexceed it.",
1199
1191
  "properties": {
1200
1192
  "permissions": {
1201
1193
  "anyOf": [
@@ -1357,7 +1349,7 @@
1357
1349
  "type": "object"
1358
1350
  },
1359
1351
  "GithubSourceDetails": {
1360
- "description": "Identifies the file a GitHub-sourced agent is synced from.\n\nKeyed on the repository ID (not owner/name) so repository and org renames\ndon't orphan the config; resolve display names from gh_repositories at\nread time.",
1352
+ "description": "Identifies the file a GitHub-sourced agent is synced from.\n\nIdentified by the repository ID (not owner/name) so repository and org renames\ndon't orphan the config; resolve display names from gh_repositories at\nread time.",
1361
1353
  "properties": {
1362
1354
  "branch": {
1363
1355
  "title": "Branch",
@@ -1524,7 +1516,7 @@
1524
1516
  },
1525
1517
  "McpRemoteServer": {
1526
1518
  "additionalProperties": false,
1527
- "description": "A bring-your-own remote MCP server: the harness talks HTTP to `url`.\nNothing runs in the sandbox image. `headers` carry static auth (e.g.\n`Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret\nreferences, resolved at run time from the account's secrets store.",
1519
+ "description": "A bring-your-own remote MCP server: the harness talks HTTP to `url`.\nNothing runs in the environment image. `headers` carry static auth (e.g.\n`Authorization: Bearer ${TOKEN}`); values may embed `${NAME}` secret\nreferences, resolved at run time from the account's secrets store.",
1528
1520
  "properties": {
1529
1521
  "headers": {
1530
1522
  "additionalProperties": {
@@ -1568,7 +1560,7 @@
1568
1560
  },
1569
1561
  "McpStdioServer": {
1570
1562
  "additionalProperties": false,
1571
- "description": "A bring-your-own stdio MCP server: the harness spawns `command` inside\nthe sandbox and speaks JSON-RPC over its stdin/stdout. The command must be\nrunnable in the sandbox image \u2014 install its runtime via `hooks.build_base` /\n`hooks.after_checkout` if the managed environment lacks it.\n\n`env` values may embed `${NAME}` references, resolved at run time from the\naccount's secrets store (see `mcp_secret_refs`); everything else is passed\nliterally.",
1563
+ "description": "A bring-your-own stdio MCP server: the harness spawns `command` inside\nthe environment and speaks JSON-RPC over its stdin/stdout. The command must\nbe runnable in the environment image \u2014 install its runtime via `hooks.build_base` /\n`hooks.after_checkout` if the managed environment lacks it.\n\n`env` values may embed `${NAME}` references, resolved at run time from the\naccount's secrets store (see `mcp_secret_refs`); everything else is passed\nliterally.",
1572
1564
  "properties": {
1573
1565
  "args": {
1574
1566
  "default": [],
@@ -1660,7 +1652,7 @@
1660
1652
  },
1661
1653
  "PermissionsConfig": {
1662
1654
  "additionalProperties": false,
1663
- "description": "What the agent is allowed to touch, per credential the platform mints\ninto its sandbox. Distinct from `environment:`, which is where the agent\nruns; this is what it may do from there.\n\n`ellipsis` scopes the sandbox's Ellipsis API token\n(`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates\nwith). `true` / the string `all` (the default) grant the full sandbox\nceiling \u2014 everything a sandbox token can ever do. A map narrows it per\nresource (see `EllipsisPermissions`); the minted token carries\nthe intersection, so a config can only ever reduce access. `false` fails\nvalidation \u2014 an agent with no API token cannot report its own progress.\n\n`github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) \u2014\nsee `GithubPermissions`. GitHub enforces it at mint time.",
1655
+ "description": "What the agent is allowed to touch, per credential the platform mints\ninto its session's environment. Distinct from `environment:`, which is\nwhere the agent runs; this is what it may do from there.\n\n`ellipsis` scopes the session's Ellipsis API token (`ELLIPSIS_API_TOKEN`,\nwhat the `agent` CLI running inside the session authenticates with).\n`true` / the string `all` (the default) grant the full session token\nceiling \u2014 everything a session token can ever do. A map narrows it per\nresource (see `EllipsisPermissions`); the minted token carries\nthe intersection, so a config can only ever reduce access. `false` fails\nvalidation \u2014 an agent with no API token cannot report its own progress.\n\n`github` scopes the session's GitHub installation token (`GH_TOKEN`) \u2014\nsee `GithubPermissions`. GitHub enforces it at mint time.",
1664
1656
  "properties": {
1665
1657
  "ellipsis": {
1666
1658
  "anyOf": [
@@ -1699,6 +1691,7 @@
1699
1691
  "ephemeral_trigger",
1700
1692
  "non_interactive",
1701
1693
  "harness_single_turn",
1694
+ "budget_exhausted",
1702
1695
  "closed"
1703
1696
  ],
1704
1697
  "title": "PromptBlockedReason",
@@ -2087,7 +2080,6 @@
2087
2080
  "account",
2088
2081
  "alerts",
2089
2082
  "sessions",
2090
- "files",
2091
2083
  "memories",
2092
2084
  "reviews",
2093
2085
  "configs",
@@ -2418,7 +2410,7 @@
2418
2410
  ]
2419
2411
  }
2420
2412
  ],
2421
- "description": "An agent session: one conversation with an agent, from trigger to\nterminal state. Returned by `GET /v1/sessions/{id}` and carried by the\nsession stream's `session`/`snapshot` frames \u2014 REST and stream never\ndisagree about what a session looks like.",
2413
+ "description": "An agent session: one conversation with an agent. Returned by\n`GET /v1/sessions/{id}` and carried by the session stream's\n`session`/`snapshot` frames; REST and stream never disagree about what a\nsession looks like.",
2422
2414
  "properties": {
2423
2415
  "agent": {
2424
2416
  "anyOf": [
@@ -2432,6 +2424,18 @@
2432
2424
  "default": null,
2433
2425
  "description": "The agent the session was started from, or null for a raw session started with POST /v1/sessions."
2434
2426
  },
2427
+ "archived": {
2428
+ "anyOf": [
2429
+ {
2430
+ "$ref": "#/$defs/SessionArchived"
2431
+ },
2432
+ {
2433
+ "type": "null"
2434
+ }
2435
+ ],
2436
+ "default": null,
2437
+ "description": "When and by whom the session was archived; null when unarchived. Archiving does not stop or close a session."
2438
+ },
2435
2439
  "attribution": {
2436
2440
  "$ref": "#/$defs/SessionAttribution",
2437
2441
  "description": "The principal this session is attributed to."
@@ -2466,9 +2470,19 @@
2466
2470
  "default": null,
2467
2471
  "description": "Codex input and native options. Set exactly one of claude_code or codex."
2468
2472
  },
2473
+ "conversation": {
2474
+ "$ref": "#/$defs/SessionConversation",
2475
+ "description": "Whether the session can take more messages, and whether an agent is warm to answer one."
2476
+ },
2469
2477
  "cost": {
2470
2478
  "$ref": "#/$defs/SessionCost",
2471
- "description": "What the session cost, in millicents, broken down by leg and carrying its own total."
2479
+ "description": "What the session has cost so far, in millicents, broken down by leg and carrying its own total."
2480
+ },
2481
+ "created_at": {
2482
+ "description": "When the session was created.",
2483
+ "format": "date-time",
2484
+ "title": "Created At",
2485
+ "type": "string"
2472
2486
  },
2473
2487
  "environment": {
2474
2488
  "$ref": "#/$defs/SessionEnvironment",
@@ -2550,10 +2564,6 @@
2550
2564
  "title": "Id",
2551
2565
  "type": "string"
2552
2566
  },
2553
- "lifecycle": {
2554
- "$ref": "#/$defs/SessionLifecycle",
2555
- "description": "The session's activity, conversation state, messaging policy, outcomes, and timestamps."
2556
- },
2557
2567
  "metadata": {
2558
2568
  "additionalProperties": {
2559
2569
  "type": "string"
@@ -2618,21 +2628,41 @@
2618
2628
  "tokens": {
2619
2629
  "$ref": "#/$defs/SessionTokens",
2620
2630
  "description": "The tokens the session spent and the model they went to. `total` includes the prompt-cache lanes."
2631
+ },
2632
+ "turn": {
2633
+ "anyOf": [
2634
+ {
2635
+ "$ref": "#/$defs/SessionTurn"
2636
+ },
2637
+ {
2638
+ "type": "null"
2639
+ }
2640
+ ],
2641
+ "default": null,
2642
+ "description": "The turn in progress, or the latest one when none is running. Null until the session has a message. Wait on it: the message you sent is answered when the turn with your message's `turn_id` reaches a final status."
2643
+ },
2644
+ "updated_at": {
2645
+ "description": "When the session was last updated.",
2646
+ "format": "date-time",
2647
+ "title": "Updated At",
2648
+ "type": "string"
2621
2649
  }
2622
2650
  },
2623
2651
  "required": [
2624
2652
  "agent",
2653
+ "archived",
2625
2654
  "attribution",
2626
2655
  "budget",
2627
2656
  "claude_code",
2628
2657
  "codex",
2658
+ "conversation",
2629
2659
  "cost",
2660
+ "created_at",
2630
2661
  "environment",
2631
2662
  "event",
2632
2663
  "git",
2633
2664
  "handler",
2634
2665
  "id",
2635
- "lifecycle",
2636
2666
  "metadata",
2637
2667
  "output",
2638
2668
  "parent",
@@ -2640,7 +2670,9 @@
2640
2670
  "skills",
2641
2671
  "source",
2642
2672
  "summary",
2643
- "tokens"
2673
+ "tokens",
2674
+ "turn",
2675
+ "updated_at"
2644
2676
  ],
2645
2677
  "title": "Session",
2646
2678
  "type": "object"
@@ -2894,12 +2926,43 @@
2894
2926
  "title": "SessionConfig",
2895
2927
  "type": "object"
2896
2928
  },
2929
+ "SessionConversation": {
2930
+ "description": "Whether the session can take more messages, and how quickly it would\nanswer one.",
2931
+ "properties": {
2932
+ "interactive": {
2933
+ "description": "Whether the session stays open after its first turn.",
2934
+ "title": "Interactive",
2935
+ "type": "boolean"
2936
+ },
2937
+ "prompting": {
2938
+ "$ref": "#/$defs/SessionPrompting",
2939
+ "description": "The session's policy for direct messages. Caller authorization and message validation are checked separately."
2940
+ },
2941
+ "state": {
2942
+ "$ref": "#/$defs/SessionState",
2943
+ "description": "`open` while the session can take messages; `closed` is permanent."
2944
+ },
2945
+ "warm": {
2946
+ "description": "Whether an agent is ready to answer the next message right away. When false, the next message first prepares an environment, which takes longer. A hint only; clients need no logic on it.",
2947
+ "title": "Warm",
2948
+ "type": "boolean"
2949
+ }
2950
+ },
2951
+ "required": [
2952
+ "interactive",
2953
+ "prompting",
2954
+ "state",
2955
+ "warm"
2956
+ ],
2957
+ "title": "SessionConversation",
2958
+ "type": "object"
2959
+ },
2897
2960
  "SessionCost": {
2898
2961
  "description": "What a session (or one turn of it) cost, in millicents.\n\n`llm` is deliberately NOT called `tokens`: it would sit beside the `tokens`\nobject and read as \"the token count's cost\" rather than \"the cost of the\nLLM leg\".",
2899
2962
  "properties": {
2900
2963
  "cpu": {
2901
2964
  "default": 0,
2902
- "description": "Sandbox CPU spend in millicents.",
2965
+ "description": "CPU spend in millicents.",
2903
2966
  "title": "Cpu",
2904
2967
  "type": "integer"
2905
2968
  },
@@ -2917,7 +2980,7 @@
2917
2980
  },
2918
2981
  "memory": {
2919
2982
  "default": 0,
2920
- "description": "Sandbox memory spend in millicents.",
2983
+ "description": "Memory spend in millicents.",
2921
2984
  "title": "Memory",
2922
2985
  "type": "integer"
2923
2986
  },
@@ -2970,7 +3033,7 @@
2970
3033
  }
2971
3034
  ],
2972
3035
  "default": null,
2973
- "description": "Identifier of the saved environment the session's config resolved. Null for an inline environment block or the built-in basic sandbox.",
3036
+ "description": "Identifier of the saved environment the session's config resolved. Null for an inline environment block or the built-in basic environment.",
2974
3037
  "title": "Id"
2975
3038
  },
2976
3039
  "mcp_servers": {
@@ -3075,55 +3138,6 @@
3075
3138
  "title": "SessionEventActor",
3076
3139
  "type": "object"
3077
3140
  },
3078
- "SessionExecutionResult": {
3079
- "description": "Outcome of the last finished execution, retained across subsequent resumes.\n\nAn execution spans a start or resume through parking or termination, and may\ncontain several turns. Admission failures also produce a result, even when\nprovisioning never starts.",
3080
- "properties": {
3081
- "completion_reason": {
3082
- "$ref": "#/$defs/SessionExitStatus",
3083
- "description": "Why the last execution ended; completed also includes parking an open conversation."
3084
- },
3085
- "detail": {
3086
- "anyOf": [
3087
- {
3088
- "type": "string"
3089
- },
3090
- {
3091
- "type": "null"
3092
- }
3093
- ],
3094
- "default": null,
3095
- "description": "Human-readable explanation of that outcome.",
3096
- "title": "Detail"
3097
- }
3098
- },
3099
- "required": [
3100
- "completion_reason",
3101
- "detail"
3102
- ],
3103
- "title": "SessionExecutionResult",
3104
- "type": "object"
3105
- },
3106
- "SessionExitStatus": {
3107
- "description": "Why a terminal agent session ended \u2014 a finer-grained reason than `status`.\n\n`status` (SessionStatus) is the lifecycle state: COMPLETED / ERROR /\nCANCELLED. `exit_status` explains *why* a run reached that terminal state, so\nthe UI and metrics can tell a budget cutoff apart from a crashed tool call or\na deliberate cancellation. It is None until the run reaches a terminal state.",
3108
- "enum": [
3109
- "completed",
3110
- "budget_hit",
3111
- "payment_required",
3112
- "tool_call_failed",
3113
- "lifecycle_hook_failed",
3114
- "missing_repo_access",
3115
- "missing_token_permissions",
3116
- "missing_sandbox_variables",
3117
- "blocked",
3118
- "contact_email_required",
3119
- "cancelled",
3120
- "interrupted",
3121
- "error",
3122
- "stopped"
3123
- ],
3124
- "title": "SessionExitStatus",
3125
- "type": "string"
3126
- },
3127
3141
  "SessionGit": {
3128
3142
  "description": "Every repo the session touched. Small enough to ride on `sessions`\nand be returned by every session read.",
3129
3143
  "properties": {
@@ -3143,7 +3157,7 @@
3143
3157
  "type": "object"
3144
3158
  },
3145
3159
  "SessionGitCommit": {
3146
- "description": "One commit the session created in this repo (everything past the\nprovisioning checkout's sha), captured from the sandbox rather than the\ntranscript so it stays correct through amends, rebases, and commits made by\nscripts. The repo is the parent object, so it is not repeated here.",
3160
+ "description": "One commit the session created in this repo (everything past the\nprovisioning checkout's sha), captured from the environment rather than the\ntranscript so it stays correct through amends, rebases, and commits made by\nscripts. The repo is the parent object, so it is not repeated here.",
3147
3161
  "properties": {
3148
3162
  "committed_at": {
3149
3163
  "format": "date-time",
@@ -3247,7 +3261,7 @@
3247
3261
  "type": "object"
3248
3262
  },
3249
3263
  "SessionGitRepo": {
3250
- "description": "One checkout in the session's sandbox and everything the session did to\nit, split by whether it survived the sandbox.",
3264
+ "description": "One checkout in the session's environment and everything the session did\nto it, split by whether it survived the environment.",
3251
3265
  "properties": {
3252
3266
  "commits": {
3253
3267
  "default": [],
@@ -3367,109 +3381,6 @@
3367
3381
  "title": "SessionHandler",
3368
3382
  "type": "object"
3369
3383
  },
3370
- "SessionLifecycle": {
3371
- "description": "Current activity, conversation state, messaging policy, and lifecycle history.",
3372
- "properties": {
3373
- "archived": {
3374
- "anyOf": [
3375
- {
3376
- "$ref": "#/$defs/SessionArchived"
3377
- },
3378
- {
3379
- "type": "null"
3380
- }
3381
- ],
3382
- "default": null,
3383
- "description": "When and by whom the session was archived; null when unarchived. Archiving does not stop or close a session."
3384
- },
3385
- "conversation": {
3386
- "$ref": "#/$defs/ConversationState",
3387
- "description": "Whether the conversation is open or permanently closed. Open does not imply direct messages are permitted."
3388
- },
3389
- "detail": {
3390
- "anyOf": [
3391
- {
3392
- "type": "string"
3393
- },
3394
- {
3395
- "type": "null"
3396
- }
3397
- ],
3398
- "default": null,
3399
- "description": "Explanation of the current status, when applicable.",
3400
- "title": "Detail"
3401
- },
3402
- "interactive": {
3403
- "description": "Whether the session stays open after its first turn.",
3404
- "title": "Interactive",
3405
- "type": "boolean"
3406
- },
3407
- "last_execution_result": {
3408
- "anyOf": [
3409
- {
3410
- "$ref": "#/$defs/SessionExecutionResult"
3411
- },
3412
- {
3413
- "type": "null"
3414
- }
3415
- ],
3416
- "default": null,
3417
- "description": "The last finished execution's outcome, retained across resumes; null until an outcome has been recorded."
3418
- },
3419
- "prompting": {
3420
- "$ref": "#/$defs/SessionPrompting",
3421
- "description": "The session's policy for direct messages. Caller authorization and message validation are checked separately."
3422
- },
3423
- "status": {
3424
- "$ref": "#/$defs/SessionLifecycleStatus",
3425
- "description": "Canonical current activity. working means a turn is in progress; waiting means the worker is warm and awaiting input; idle means parked. A failed, stopped, or cancelled execution may leave an open conversation."
3426
- },
3427
- "stopped": {
3428
- "anyOf": [
3429
- {
3430
- "$ref": "#/$defs/SessionStopped"
3431
- },
3432
- {
3433
- "type": "null"
3434
- }
3435
- ],
3436
- "default": null,
3437
- "description": "When and by whom a stop was requested; null when no stop is pending for this execution."
3438
- },
3439
- "timestamps": {
3440
- "$ref": "#/$defs/SessionTimestamps"
3441
- }
3442
- },
3443
- "required": [
3444
- "archived",
3445
- "conversation",
3446
- "detail",
3447
- "interactive",
3448
- "last_execution_result",
3449
- "prompting",
3450
- "status",
3451
- "stopped",
3452
- "timestamps"
3453
- ],
3454
- "title": "SessionLifecycle",
3455
- "type": "object"
3456
- },
3457
- "SessionLifecycleStatus": {
3458
- "enum": [
3459
- "scheduled",
3460
- "starting",
3461
- "working",
3462
- "waiting",
3463
- "retrying",
3464
- "idle",
3465
- "closed",
3466
- "failed",
3467
- "stopped",
3468
- "cancelled"
3469
- ],
3470
- "title": "SessionLifecycleStatus",
3471
- "type": "string"
3472
- },
3473
3384
  "SessionListStreamMessage": {
3474
3385
  "properties": {
3475
3386
  "session": {
@@ -3577,6 +3488,15 @@
3577
3488
  "title": "SessionSource",
3578
3489
  "type": "string"
3579
3490
  },
3491
+ "SessionState": {
3492
+ "description": "Whether the conversation can still take messages. `closed` is permanent:\na session with interactive false closes when its turn ends, and a conversation closes\nafter its closing message's turn.",
3493
+ "enum": [
3494
+ "open",
3495
+ "closed"
3496
+ ],
3497
+ "title": "SessionState",
3498
+ "type": "string"
3499
+ },
3580
3500
  "SessionStopped": {
3581
3501
  "description": "When a stop was requested and the GitHub user who requested it.",
3582
3502
  "properties": {
@@ -3607,7 +3527,7 @@
3607
3527
  "type": "object"
3608
3528
  },
3609
3529
  "SessionSummary": {
3610
- "description": "A live one-line summary of what the session is working on, refreshed\nevery few steps while it runs.",
3530
+ "description": "A live one-line summary of what the session is doing, refreshed\nevery few steps while it runs.",
3611
3531
  "properties": {
3612
3532
  "created_at": {
3613
3533
  "anyOf": [
@@ -3624,7 +3544,7 @@
3624
3544
  "title": "Created At"
3625
3545
  },
3626
3546
  "description": {
3627
- "description": "One-line description of what the session is working on.",
3547
+ "description": "One-line description of what the session is doing.",
3628
3548
  "title": "Description",
3629
3549
  "type": "string"
3630
3550
  }
@@ -3636,58 +3556,6 @@
3636
3556
  "title": "SessionSummary",
3637
3557
  "type": "object"
3638
3558
  },
3639
- "SessionTimestamps": {
3640
- "properties": {
3641
- "created_at": {
3642
- "description": "When the session was created.",
3643
- "format": "date-time",
3644
- "title": "Created At",
3645
- "type": "string"
3646
- },
3647
- "last_activity_at": {
3648
- "anyOf": [
3649
- {
3650
- "format": "date-time",
3651
- "type": "string"
3652
- },
3653
- {
3654
- "type": "null"
3655
- }
3656
- ],
3657
- "default": null,
3658
- "description": "When the session last showed agent activity.",
3659
- "title": "Last Activity At"
3660
- },
3661
- "last_message_at": {
3662
- "anyOf": [
3663
- {
3664
- "format": "date-time",
3665
- "type": "string"
3666
- },
3667
- {
3668
- "type": "null"
3669
- }
3670
- ],
3671
- "default": null,
3672
- "description": "When the session last received a message.",
3673
- "title": "Last Message At"
3674
- },
3675
- "updated_at": {
3676
- "description": "When the session was last updated.",
3677
- "format": "date-time",
3678
- "title": "Updated At",
3679
- "type": "string"
3680
- }
3681
- },
3682
- "required": [
3683
- "created_at",
3684
- "last_activity_at",
3685
- "last_message_at",
3686
- "updated_at"
3687
- ],
3688
- "title": "SessionTimestamps",
3689
- "type": "object"
3690
- },
3691
3559
  "SessionTokens": {
3692
3560
  "description": "The token counts a session (or turn) spent, and the model they went to.\n\n`total` INCLUDES the cache lanes, unlike the old flat `tokens_total` which\ncounted input+output+thinking only and left callers to add cache reads and\nwrites back themselves (the deleted `tokensTotalAll` helper). Cache tokens\ndominate an agent run's token bill, so a \"total\" that omits them is the\nwrong default and produced two competing totals in the dashboard.",
3693
3561
  "properties": {
@@ -3739,6 +3607,119 @@
3739
3607
  "title": "SessionTokens",
3740
3608
  "type": "object"
3741
3609
  },
3610
+ "SessionTurn": {
3611
+ "description": "One message and the agent's answer to it. A turn is `pending` from the\nmoment its message is received until the agent starts on it, `running`\nwhile the agent works, then `completed`, `failed`, `stopped`, or\n`cancelled`.",
3612
+ "properties": {
3613
+ "cost": {
3614
+ "$ref": "#/$defs/SessionCost",
3615
+ "description": "What the turn cost so far, in millicents, broken down by leg."
3616
+ },
3617
+ "created_at": {
3618
+ "description": "When the turn's message was received.",
3619
+ "format": "date-time",
3620
+ "title": "Created At",
3621
+ "type": "string"
3622
+ },
3623
+ "detail": {
3624
+ "anyOf": [
3625
+ {
3626
+ "type": "string"
3627
+ },
3628
+ {
3629
+ "type": "null"
3630
+ }
3631
+ ],
3632
+ "default": null,
3633
+ "description": "A human-readable explanation of a failed, stopped, or cancelled turn.",
3634
+ "title": "Detail"
3635
+ },
3636
+ "ended_at": {
3637
+ "anyOf": [
3638
+ {
3639
+ "format": "date-time",
3640
+ "type": "string"
3641
+ },
3642
+ {
3643
+ "type": "null"
3644
+ }
3645
+ ],
3646
+ "default": null,
3647
+ "description": "When the turn reached its final status.",
3648
+ "title": "Ended At"
3649
+ },
3650
+ "id": {
3651
+ "description": "Unique identifier of the turn.",
3652
+ "title": "Id",
3653
+ "type": "string"
3654
+ },
3655
+ "index": {
3656
+ "description": "Position in the session, starting at 0.",
3657
+ "title": "Index",
3658
+ "type": "integer"
3659
+ },
3660
+ "reason": {
3661
+ "anyOf": [
3662
+ {
3663
+ "$ref": "#/$defs/TurnReason"
3664
+ },
3665
+ {
3666
+ "type": "null"
3667
+ }
3668
+ ],
3669
+ "default": null,
3670
+ "description": "Why the turn failed or was cancelled; null on every other status."
3671
+ },
3672
+ "started_at": {
3673
+ "anyOf": [
3674
+ {
3675
+ "format": "date-time",
3676
+ "type": "string"
3677
+ },
3678
+ {
3679
+ "type": "null"
3680
+ }
3681
+ ],
3682
+ "default": null,
3683
+ "description": "When the agent started on the message.",
3684
+ "title": "Started At"
3685
+ },
3686
+ "status": {
3687
+ "$ref": "#/$defs/TurnStatus",
3688
+ "description": "Where the turn is."
3689
+ },
3690
+ "stopped": {
3691
+ "anyOf": [
3692
+ {
3693
+ "$ref": "#/$defs/SessionStopped"
3694
+ },
3695
+ {
3696
+ "type": "null"
3697
+ }
3698
+ ],
3699
+ "default": null,
3700
+ "description": "When and by whom a stop was requested; null when none was."
3701
+ },
3702
+ "tokens": {
3703
+ "$ref": "#/$defs/SessionTokens",
3704
+ "description": "The tokens the turn spent and the model they went to."
3705
+ }
3706
+ },
3707
+ "required": [
3708
+ "cost",
3709
+ "created_at",
3710
+ "detail",
3711
+ "ended_at",
3712
+ "id",
3713
+ "index",
3714
+ "reason",
3715
+ "started_at",
3716
+ "status",
3717
+ "stopped",
3718
+ "tokens"
3719
+ ],
3720
+ "title": "SessionTurn",
3721
+ "type": "object"
3722
+ },
3742
3723
  "SettingsRef": {
3743
3724
  "additionalProperties": false,
3744
3725
  "description": "A config-declared Claude Code settings.json, resolved at run start and\npassed to `claude --settings <path>`. That is the CLI settings tier \u2014 BELOW\nEllipsis's managed-settings.json floor \u2014 so it customizes behavior (model\npermissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a\nsecurity setting. Lets a team point the cloud agent at the same settings file\nthey already use with Claude Code locally instead of re-encoding it as YAML.",
@@ -3920,6 +3901,42 @@
3920
3901
  "title": "SlackMessageEvent",
3921
3902
  "type": "object"
3922
3903
  },
3904
+ "TurnReason": {
3905
+ "description": "Why a turn failed or was cancelled. Null on every other outcome.",
3906
+ "enum": [
3907
+ "error",
3908
+ "tool_call_failed",
3909
+ "budget_hit",
3910
+ "payment_required",
3911
+ "blocked",
3912
+ "contact_email_required",
3913
+ "lifecycle_hook_failed",
3914
+ "missing_repo_access",
3915
+ "missing_token_permissions",
3916
+ "missing_environment_variables",
3917
+ "missing_github_integration",
3918
+ "agent_unavailable",
3919
+ "upstream_unavailable",
3920
+ "unsupported_configuration",
3921
+ "execution_disabled",
3922
+ "interrupted"
3923
+ ],
3924
+ "title": "TurnReason",
3925
+ "type": "string"
3926
+ },
3927
+ "TurnStatus": {
3928
+ "description": "Where one turn is: queued for an agent, being answered, or over.\n\n`pending` covers everything before the agent starts on the message: queued\nbehind another turn, waiting to start, or preparing the environment.\n`stopped` and `cancelled` are their own outcomes; `reason` explains a\n`failed` or `cancelled` turn.",
3929
+ "enum": [
3930
+ "pending",
3931
+ "running",
3932
+ "completed",
3933
+ "failed",
3934
+ "stopped",
3935
+ "cancelled"
3936
+ ],
3937
+ "title": "TurnStatus",
3938
+ "type": "string"
3939
+ },
3923
3940
  "VMExecutionResponse": {
3924
3941
  "properties": {
3925
3942
  "cache_tier": {