@ellipsis-dev/sdk 0.12.0 → 0.13.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.
@@ -128,12 +128,11 @@ interface paths {
128
128
  };
129
129
  /**
130
130
  * List Agent Defaults
131
- * @description List default agent configs.
131
+ * @description Get the default agent configs.
132
132
  *
133
- * The account default and any per-repository defaults.
134
- *
135
- * Defaults are addressed by rung: the account rung is repository
136
- * omitted, a repo rung is "owner/name" — never by row id.
133
+ * The account-wide default and the per-repository defaults, as config
134
+ * ids. Repo rungs are keyed "owner/name"; a repository this
135
+ * installation can no longer see is omitted.
137
136
  */
138
137
  get: operations['list_agent_defaults'];
139
138
  /**
@@ -142,7 +141,7 @@ interface paths {
142
141
  *
143
142
  * Addressed by rung: the account rung (repository omitted) or a
144
143
  * repository rung ("owner/name"); the config by id or by the
145
- * agent's name.
144
+ * agent's name. Returns the full resulting ladder.
146
145
  *
147
146
  * Refused for sandbox tokens (potentially prompt-injected code
148
147
  * must not repoint the account's ambient default); an unknown or
@@ -916,8 +915,7 @@ interface paths {
916
915
  * config, or
917
916
  * template_id; with none, the account's default-config ladder
918
917
  * resolves the config. 400 when idle_start is combined with
919
- * prompt, input, or handoff, or when a handoff is combined with
920
- * any config source or override. 422 when the agent declares an
918
+ * prompt or input. 422 when the agent declares an
921
919
  * input schema and the request's input is absent or invalid.
922
920
  */
923
921
  post: operations['start_agent_session'];
@@ -955,30 +953,6 @@ interface paths {
955
953
  patch?: never;
956
954
  trace?: never;
957
955
  };
958
- '/v1/sessions/sync': {
959
- parameters: {
960
- query?: never;
961
- header?: never;
962
- path?: never;
963
- cookie?: never;
964
- };
965
- get?: never;
966
- put?: never;
967
- /**
968
- * Sync Agent Session
969
- * @description Sync a local Claude Code session to Ellipsis.
970
- *
971
- * Requires a user token (device-flow `agent login`): the user is
972
- * part of the sync's idempotency key, so API keys and sandbox
973
- * tokens are rejected with a 403 rather than silently attributed.
974
- */
975
- post: operations['sync_agent_session'];
976
- delete?: never;
977
- options?: never;
978
- head?: never;
979
- patch?: never;
980
- trace?: never;
981
- };
982
956
  '/v1/sessions/{session_id}': {
983
957
  parameters: {
984
958
  query?: never;
@@ -1129,8 +1103,7 @@ interface paths {
1129
1103
  * full retained transcript. Available to sandbox tokens too: an
1130
1104
  * agent answering "did X look into Y?" needs to read the session
1131
1105
  * it found via /sessions/search, and any org member sees the same
1132
- * transcript in the dashboard (laptop transcripts are redacted
1133
- * client-side before they are ever uploaded).
1106
+ * transcript in the dashboard.
1134
1107
  */
1135
1108
  get: operations['get_agent_session_records'];
1136
1109
  put?: never;
@@ -1781,6 +1754,17 @@ interface components {
1781
1754
  path: string;
1782
1755
  repository?: components['schemas']['AgentConfigRepository'] | null;
1783
1756
  };
1757
+ /**
1758
+ * AgentConfigSource
1759
+ * @description Where a session's config came from. Total: every session has exactly one
1760
+ * source, including the ones that never touch defaults resolution.
1761
+ *
1762
+ * Not derivable from the row — `agent_config_id` says WHICH saved config, not
1763
+ * how it was chosen, and is null for inline, platform-default, and built-in
1764
+ * configs alike — so it is persisted for audit and the published wire.
1765
+ * @enum {string}
1766
+ */
1767
+ AgentConfigSource: 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
1784
1768
  /**
1785
1769
  * AgentConfigSourceGithub
1786
1770
  * @description Identifies the file a GitHub-sourced agent config is synced from.
@@ -1815,61 +1799,29 @@ interface components {
1815
1799
  configs: components['schemas']['Config'][];
1816
1800
  };
1817
1801
  /**
1818
- * AgentDefault
1819
- * @description A default-agent setting: which agent config serves sessions started
1820
- * without an explicit config, for the whole account or for one repository.
1802
+ * AgentDefaults
1803
+ * @description Which agent config serves sessions started without an explicit config:
1804
+ * one account-wide rung, plus a rung per repository.
1805
+ *
1806
+ * Values are config ids — stable across renames, unlike the agent's name.
1807
+ * A repo rung whose repository this installation can no longer see is absent
1808
+ * from `repositories`; its row is left in place, so re-installing the repo
1809
+ * brings the rung back.
1821
1810
  */
1822
- AgentDefault: {
1811
+ AgentDefaults: {
1823
1812
  /**
1824
- * Broken
1825
- * @description Why this default cannot serve sessions, or null when it is healthy.
1813
+ * Account
1814
+ * @description Config id serving sessions with no repository context, or null when no account default is set.
1826
1815
  */
1827
- broken?: ('config_deleted' | 'config_disabled' | 'config_pending_pr' | 'repo_inaccessible') | null;
1828
- /**
1829
- * Config Id
1830
- * @description The agent config this default points at.
1831
- */
1832
- config_id: string;
1833
- /**
1834
- * Config Name
1835
- * @description The pointed-at config's name; null when the config no longer exists.
1836
- */
1837
- config_name?: string | null;
1838
- /**
1839
- * Id
1840
- * @description The default's unique identifier.
1841
- */
1842
- id: string;
1843
- /**
1844
- * Repository
1845
- * @description The repository this default applies to, as "owner/name", or null for the account-wide default.
1846
- */
1847
- repository?: string | null;
1848
- /**
1849
- * Updated At
1850
- * Format: date-time
1851
- * @description When the default was last changed.
1852
- */
1853
- updated_at: string;
1854
- };
1855
- /**
1856
- * AgentDefaultResponse
1857
- * @description One default-agent setting.
1858
- */
1859
- AgentDefaultResponse: {
1860
- /** @description The default-agent setting. */
1861
- default: components['schemas']['AgentDefault'];
1862
- };
1863
- /**
1864
- * AgentDefaultsListResponse
1865
- * @description The account's default-agent settings.
1866
- */
1867
- AgentDefaultsListResponse: {
1816
+ account?: string | null;
1868
1817
  /**
1869
- * Defaults
1870
- * @description The configured defaults.
1818
+ * Repositories
1819
+ * @description Config id per repository, keyed "owner/name". A repository with no default set is absent.
1820
+ * @default {}
1871
1821
  */
1872
- defaults: components['schemas']['AgentDefault'][];
1822
+ repositories: {
1823
+ [key: string]: string;
1824
+ };
1873
1825
  };
1874
1826
  /**
1875
1827
  * AgentTemplate
@@ -2604,16 +2556,6 @@ interface components {
2604
2556
  */
2605
2557
  scope: components['schemas']['ReviewScope'];
2606
2558
  };
2607
- /**
2608
- * DefaultResolution
2609
- * @description How a session that arrived with no explicit config source resolved its
2610
- * config (documents/eng/DEFAULT_CONFIGS.md §4). Persisted on the session so
2611
- * audit and clients can say "ran under X (repo default)". A session started
2612
- * with an explicit config/config_id/template_id never enters resolution and
2613
- * stores None.
2614
- * @enum {string}
2615
- */
2616
- DefaultResolution: 'repo_default' | 'account_default' | 'none';
2617
2559
  /**
2618
2560
  * DurationPercentiles
2619
2561
  * @description Percentiles of a duration distribution, in hours. p0 = fastest,
@@ -2688,7 +2630,7 @@ interface components {
2688
2630
  ErrorInfo: {
2689
2631
  /**
2690
2632
  * Code
2691
- * @description Stable machine-readable error code. Open vocabulary — handle unknown codes by HTTP status. Known values: account_blocked, conflict, default_config_broken, failed_dependency, file_quota_exceeded, forbidden, internal_error, invalid_request, not_found, rate_limited, review_in_flight, session_closed, session_ephemeral_trigger, session_finished, session_harness_single_turn, session_laptop, session_mention_surface, session_non_interactive, unauthorized, unavailable.
2633
+ * @description Stable machine-readable error code. Open vocabulary — handle unknown codes by HTTP status. Known values: account_blocked, conflict, contact_email_required, failed_dependency, file_quota_exceeded, forbidden, internal_error, invalid_request, not_found, rate_limited, review_in_flight, session_closed, session_ephemeral_trigger, session_finished, session_harness_single_turn, session_mention_surface, session_non_interactive, unauthorized, unavailable.
2692
2634
  */
2693
2635
  code: string;
2694
2636
  /**
@@ -3278,35 +3220,6 @@ interface components {
3278
3220
  /** Detail */
3279
3221
  detail?: components['schemas']['ValidationError'][];
3280
3222
  };
3281
- /**
3282
- * HandoffAgentSessionParams
3283
- * @description Laptop-to-cloud handoff parameters (`agent session handoff`): start a
3284
- * fresh session on the built-in handoff config, chained to the handed-off
3285
- * session. Mutually exclusive with config_id / config / template_id — the
3286
- * handoff config is platform-owned.
3287
- */
3288
- HandoffAgentSessionParams: {
3289
- /**
3290
- * Parent Session Id
3291
- * @description The session being handed off (usually a laptop-synced session).
3292
- */
3293
- parent_session_id: string;
3294
- /**
3295
- * Ref
3296
- * @description Where the WIP commit was pushed (refs/ellipsis/handoff/<short>); recorded as a metadata breadcrumb.
3297
- */
3298
- ref?: string | null;
3299
- /**
3300
- * Repo
3301
- * @description "owner/name" (or a bare name under the caller's account).
3302
- */
3303
- repo: string;
3304
- /**
3305
- * Sha
3306
- * @description The work-in-progress commit the CLI pushed (a commit of the dirty working tree) — becomes the sandbox checkout target.
3307
- */
3308
- sha: string;
3309
- };
3310
3223
  /**
3311
3224
  * Harness
3312
3225
  * @enum {string}
@@ -3639,7 +3552,7 @@ interface components {
3639
3552
  * or through Bedrock -- a choice made per request by the llm_providers chain, so
3640
3553
  * it is not even a fixed property of the model. Likewise the `gpt-5.6-*` rows
3641
3554
  * are OPENAI (OpenAI's models, served by AWS via bedrock-mantle), and GLM is ZAI
3642
- * (Z.ai's model, served by Concentrate).
3555
+ * (Z.ai's model, served by DeepInfra via OpenRouter).
3643
3556
  *
3644
3557
  * So this is deliberately NOT derived from `EgressRoute.provider`: routing is an
3645
3558
  * infrastructure fact that changes when we move a model between providers, while
@@ -3719,13 +3632,11 @@ interface components {
3719
3632
  *
3720
3633
  * CONTINUATION — a follow-up in the same conversation surface (e.g. a Slack
3721
3634
  * thread reply spawning a fresh session on the same thread).
3722
- * HANDOFF — a session started to take over work from another surface (e.g.
3723
- * laptop → cloud handoff; later phase).
3724
3635
  * RESUME — a conversation re-hosted on a new box after its sandbox was torn
3725
3636
  * down (interactive platform; later phase).
3726
3637
  * @enum {string}
3727
3638
  */
3728
- ParentKind: 'continuation' | 'handoff' | 'resume';
3639
+ ParentKind: 'continuation' | 'resume';
3729
3640
  /**
3730
3641
  * PollCliAuthResponse
3731
3642
  * @description The state of a device-code flow. Poll until `status` leaves `pending`.
@@ -3747,7 +3658,7 @@ interface components {
3747
3658
  * @description Why direct prompting is refused. Absent when prompting is allowed.
3748
3659
  * @enum {string}
3749
3660
  */
3750
- PromptBlockedReason: 'mention_surface' | 'ephemeral_trigger' | 'non_interactive' | 'harness_single_turn' | 'closed' | 'laptop';
3661
+ PromptBlockedReason: 'mention_surface' | 'ephemeral_trigger' | 'non_interactive' | 'harness_single_turn' | 'closed';
3751
3662
  /**
3752
3663
  * PullRequestAction
3753
3664
  * @enum {string}
@@ -4234,7 +4145,7 @@ interface components {
4234
4145
  config_id?: string | null;
4235
4146
  /**
4236
4147
  * Config Override
4237
- * @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 {"limits": {"run": 5.0}} to raise its budget. Mutually exclusive with config_override_yaml.
4148
+ * @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.
4238
4149
  */
4239
4150
  config_override?: {
4240
4151
  [key: string]: unknown;
@@ -5263,15 +5174,12 @@ interface components {
5263
5174
  * disagree about what a session looks like.
5264
5175
  */
5265
5176
  Session: {
5177
+ /** @description The agent that ran: the config the session executed, where that config came from, and any override merged into it. */
5178
+ agent: components['schemas']['SessionAgent'];
5266
5179
  /** @description The principal this session is attributed to. */
5267
5180
  attribution?: components['schemas']['SessionAttribution'];
5268
5181
  /** @description The spend budget enforced for this session. */
5269
5182
  budget?: components['schemas']['SessionBudget'];
5270
- /**
5271
- * Config Id
5272
- * @description Identifier of the saved agent config the session ran on, if any.
5273
- */
5274
- config_id?: string | null;
5275
5183
  /**
5276
5184
  * Context Repository
5277
5185
  * @description The "owner/name" repository context the session was started in, if any.
@@ -5285,8 +5193,6 @@ interface components {
5285
5193
  * @description When the session was created.
5286
5194
  */
5287
5195
  created_at: string;
5288
- /** @description How the session's config was resolved from the account's defaults, when no explicit config was given. */
5289
- default_resolution?: components['schemas']['DefaultResolution'] | null;
5290
5196
  /** @description How the session ended; null until it is terminal. */
5291
5197
  exit_status?: components['schemas']['SessionExitStatus'] | null;
5292
5198
  /** @description The coding-agent harness the session runs on. */
@@ -5306,11 +5212,6 @@ interface components {
5306
5212
  * @description When the session last received a message.
5307
5213
  */
5308
5214
  last_message_at?: string | null;
5309
- /**
5310
- * Live Summary
5311
- * @description A live summary of the session's progress while it runs.
5312
- */
5313
- live_summary?: string | null;
5314
5215
  /**
5315
5216
  * Metadata
5316
5217
  * @description Caller-supplied metadata key-value pairs.
@@ -5335,7 +5236,7 @@ interface components {
5335
5236
  prompting: components['schemas']['SessionPrompting'];
5336
5237
  /** @description Lifecycle state of the durable conversation, or null for sessions without one. */
5337
5238
  session_state?: components['schemas']['SessionState'] | null;
5338
- /** @description Where the session came from (e.g. react, manual, api, cli, mention, cron, laptop). */
5239
+ /** @description Where the session came from (e.g. react, manual, api, cli, mention, cron). */
5339
5240
  source: components['schemas']['SessionSource'];
5340
5241
  /** @description Execution status of the session. */
5341
5242
  status: components['schemas']['SessionStatus'];
@@ -5346,7 +5247,9 @@ interface components {
5346
5247
  status_reason?: string | null;
5347
5248
  /** @description The stop request, if the session was stopped. */
5348
5249
  stopped?: components['schemas']['SessionStopped'];
5349
- /** @description The public status projection; null for laptop-synced sessions. */
5250
+ /** @description The latest live summary of the session's progress while it runs, and when it was generated. */
5251
+ summary?: components['schemas']['SessionSummary'] | null;
5252
+ /** @description The public status projection; null on list/search responses, which do not derive it. */
5350
5253
  surface?: components['schemas']['SessionSurface'] | null;
5351
5254
  /** @description The tokens the session spent and the model they went to. `total` includes the prompt-cache lanes. */
5352
5255
  tokens?: components['schemas']['SessionTokens'];
@@ -5357,6 +5260,35 @@ interface components {
5357
5260
  */
5358
5261
  updated_at: string;
5359
5262
  };
5263
+ /**
5264
+ * SessionAgent
5265
+ * @description The agent this session ran: the config it actually executed, where that
5266
+ * config came from, and the diff that was merged in — the same
5267
+ * effective-value-plus-provenance shape `SessionBudget` uses.
5268
+ *
5269
+ * `config` is the snapshot frozen when the session was created; `config_id`
5270
+ * points at the saved config as it exists NOW. They diverge legitimately: a
5271
+ * YAML edit after the session started, or any `override`, leaves the pointer
5272
+ * describing something the session never ran.
5273
+ */
5274
+ SessionAgent: {
5275
+ /** @description The agent config the session actually ran, frozen when the session was created. */
5276
+ config: components['schemas']['AgentConfig'];
5277
+ /**
5278
+ * Config Id
5279
+ * @description Identifier of the saved config this session's snapshot was taken from. Null for inline, platform-default, and built-in configs. Points at the config as it exists now, which may have changed since.
5280
+ */
5281
+ config_id?: string | null;
5282
+ /**
5283
+ * Override
5284
+ * @description The partial-config override merged into `config` for this session, or null when the config ran unmodified. `config` is the merged result; this is the diff.
5285
+ */
5286
+ override?: {
5287
+ [key: string]: unknown;
5288
+ } | null;
5289
+ /** @description How this session's config was chosen. */
5290
+ source: components['schemas']['AgentConfigSource'];
5291
+ };
5360
5292
  /**
5361
5293
  * SessionAttribution
5362
5294
  * @description The principal a session is attributed to: what kind, its id, and — when
@@ -5518,7 +5450,7 @@ interface components {
5518
5450
  * a deliberate cancellation. It is None until the run reaches a terminal state.
5519
5451
  * @enum {string}
5520
5452
  */
5521
- SessionExitStatus: 'completed' | 'budget_hit' | 'payment_required' | 'tool_call_failed' | 'lifecycle_hook_failed' | 'missing_repo_access' | 'missing_token_permissions' | 'missing_sandbox_variables' | 'cancelled' | 'interrupted' | 'error' | 'stopped';
5453
+ 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';
5522
5454
  /**
5523
5455
  * SessionLiveness
5524
5456
  * @description The durable conversation axis (backs the surfaced `session` field).
@@ -5874,7 +5806,7 @@ interface components {
5874
5806
  * SessionSource
5875
5807
  * @enum {string}
5876
5808
  */
5877
- SessionSource: 'react' | 'manual' | 'api' | 'cli' | 'mention' | 'cron' | 'laptop';
5809
+ SessionSource: 'react' | 'manual' | 'api' | 'cli' | 'mention' | 'cron';
5878
5810
  /**
5879
5811
  * SessionState
5880
5812
  * @description Lifecycle of a keyed (multi-turn) session — the durable conversation.
@@ -5909,9 +5841,26 @@ interface components {
5909
5841
  /** @description The GitHub user who stopped the session, resolved at read time. */
5910
5842
  by_user?: components['schemas']['GithubAccountSnippet'] | null;
5911
5843
  };
5844
+ /**
5845
+ * SessionSummary
5846
+ * @description A live one-line summary of what the session is working on, refreshed
5847
+ * every few steps while it runs.
5848
+ */
5849
+ SessionSummary: {
5850
+ /**
5851
+ * Created At
5852
+ * @description When this summary line was generated. Null on summaries written before generation time was tracked.
5853
+ */
5854
+ created_at?: string | null;
5855
+ /**
5856
+ * Description
5857
+ * @description One-line description of what the session is working on.
5858
+ */
5859
+ description: string;
5860
+ };
5912
5861
  /**
5913
5862
  * SessionSurface
5914
- * @description The three fields we expose. All `None` for an un-keyed (laptop) session.
5863
+ * @description The three fields we expose.
5915
5864
  *
5916
5865
  * `use_enum_values=True` (from CustomBaseModel) stores the members as their
5917
5866
  * string values, so this serializes to `{"session": "alive", "run": "waiting",
@@ -6131,7 +6080,7 @@ interface components {
6131
6080
  config_id?: string | null;
6132
6081
  /**
6133
6082
  * Config Override
6134
- * @description Optional partial-config override merged onto the chosen config and re-validated (e.g. {"limits": {"run": 5.0}} to raise just this run'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.
6083
+ * @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.
6135
6084
  */
6136
6085
  config_override?: {
6137
6086
  [key: string]: unknown;
@@ -6147,11 +6096,9 @@ interface components {
6147
6096
  * @default false
6148
6097
  */
6149
6098
  force_rebuild: boolean;
6150
- /** @description Laptop-to-cloud handoff parameters. When set, the built-in handoff config is used and config_id/config/template_id must be omitted. */
6151
- handoff?: components['schemas']['HandoffAgentSessionParams'] | null;
6152
6099
  /**
6153
6100
  * Idle Start
6154
- * @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 and handoff. Ignored when the resolved config is not interactive (an ephemeral run keeps its kickoff — it can never receive a message).
6101
+ * @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).
6155
6102
  * @default false
6156
6103
  */
6157
6104
  idle_start: boolean;
@@ -6172,7 +6119,7 @@ interface components {
6172
6119
  };
6173
6120
  /**
6174
6121
  * Prompt
6175
- * @description Per-run instructions appended to the initial query after the config's shared system prompt. Applies regardless of which config source is used. For a handoff, this is the developer's handoff note.
6122
+ * @description Per-run instructions appended to the initial query after the config's shared system prompt. Applies regardless of which config source is used.
6176
6123
  */
6177
6124
  prompt?: string | null;
6178
6125
  /**
@@ -6186,22 +6133,6 @@ interface components {
6186
6133
  */
6187
6134
  template_id?: string | null;
6188
6135
  };
6189
- /**
6190
- * StartAgentSessionResponse
6191
- * @description The started session, plus explicit fields describing how its config
6192
- * was resolved.
6193
- */
6194
- StartAgentSessionResponse: {
6195
- /** @description Which rung of the defaults ladder chose the config (repo_default | account_default | none). Null when an explicit config/config_id/template_id (or a handoff) bypassed resolution. */
6196
- resolution_source?: components['schemas']['DefaultResolution'] | null;
6197
- /**
6198
- * Resolved Config Name
6199
- * @description The name of the config the session runs under.
6200
- */
6201
- resolved_config_name?: string | null;
6202
- /** @description The started session. */
6203
- session: components['schemas']['Session'];
6204
- };
6205
6136
  /**
6206
6137
  * StartCliAuthResponse
6207
6138
  * @description A freshly minted device-code flow: show the user code (or open the
@@ -6239,72 +6170,6 @@ interface components {
6239
6170
  */
6240
6171
  verification_uri_complete: string;
6241
6172
  };
6242
- /**
6243
- * SyncAgentSessionRequest
6244
- * @description One hook-driven transcript sync from a developer laptop. The CLI reads
6245
- * the live on-disk Claude Code transcript, redacts it client-side, gzips
6246
- * it, and POSTs it here — once per turn and at termination.
6247
- */
6248
- SyncAgentSessionRequest: {
6249
- /**
6250
- * Cc Session Id
6251
- * @description The Claude Code session uuid (from the hook payload's session_id).
6252
- */
6253
- cc_session_id: string;
6254
- /**
6255
- * Cwd
6256
- * @description The laptop working directory.
6257
- */
6258
- cwd?: string | null;
6259
- /**
6260
- * Git Branch
6261
- * @description The checked-out git branch.
6262
- */
6263
- git_branch?: string | null;
6264
- /**
6265
- * Reason
6266
- * @description Which hook fired the sync: "stop" (mid-session, once per turn) or "session_end" (the Claude Code process terminated).
6267
- * @default stop
6268
- * @enum {string}
6269
- */
6270
- reason: 'stop' | 'session_end';
6271
- /**
6272
- * Repo
6273
- * @description The enrolled repository ("owner/name", from the working directory's git remote).
6274
- */
6275
- repo?: string | null;
6276
- /**
6277
- * Transcript Gzip B64
6278
- * @description The redacted transcript JSONL, gzipped then base64-encoded.
6279
- */
6280
- transcript_gzip_b64: string;
6281
- };
6282
- /**
6283
- * SyncAgentSessionResponse
6284
- * @description The outcome of a laptop transcript sync.
6285
- */
6286
- SyncAgentSessionResponse: {
6287
- /**
6288
- * Accepted
6289
- * @description False when the stored snapshot was already at least as long (longest snapshot wins) — acknowledged, nothing written.
6290
- */
6291
- accepted: boolean;
6292
- /**
6293
- * Event Count
6294
- * @description The number of transcript events in the stored snapshot.
6295
- */
6296
- event_count: number;
6297
- /**
6298
- * Process Id
6299
- * @description The synced Claude Code process id.
6300
- */
6301
- process_id: string;
6302
- /**
6303
- * Session Id
6304
- * @description The platform session the sync mapped to.
6305
- */
6306
- session_id: string;
6307
- };
6308
6173
  /**
6309
6174
  * TokensInfo
6310
6175
  * @description Token/cost usage, per record (one API call's counts, aggregate fields at
@@ -6997,7 +6862,7 @@ interface operations {
6997
6862
  [name: string]: unknown;
6998
6863
  };
6999
6864
  content: {
7000
- 'application/json': components['schemas']['AgentDefaultsListResponse'];
6865
+ 'application/json': components['schemas']['AgentDefaults'];
7001
6866
  };
7002
6867
  };
7003
6868
  /** @description The bearer token is missing, invalid, or revoked. */
@@ -7050,7 +6915,7 @@ interface operations {
7050
6915
  [name: string]: unknown;
7051
6916
  };
7052
6917
  content: {
7053
- 'application/json': components['schemas']['AgentDefaultResponse'];
6918
+ 'application/json': components['schemas']['AgentDefaults'];
7054
6919
  };
7055
6920
  };
7056
6921
  /** @description The config is not eligible as a default: its pull request has not merged, or it is disabled. */
@@ -9214,7 +9079,7 @@ interface operations {
9214
9079
  cursor?: string | null;
9215
9080
  /** @description A GitHub account id (see GET /v1/integrations/github/members); scopes the list to sessions attributed to that developer. */
9216
9081
  author_id?: number | null;
9217
- /** @description "owner/name" (exact) or a bare repo name, matched the same way as on GET /v1/sessions/search. Sessions whose repository is named only inside their agent config — dashboard starts, cron, handoffs — do not match. */
9082
+ /** @description "owner/name" (exact) or a bare repo name, matched the same way as on GET /v1/sessions/search. Sessions whose repository is named only inside their agent config — dashboard starts, cron — do not match. */
9218
9083
  repo?: string | null;
9219
9084
  /** @description Keep only sessions whose conversation is still going — live or sleeping — dropping the ones that completed, errored, or were stopped or cancelled. A session parked between turns counts as unfinished. */
9220
9085
  unfinished?: boolean;
@@ -9286,10 +9151,10 @@ interface operations {
9286
9151
  [name: string]: unknown;
9287
9152
  };
9288
9153
  content: {
9289
- 'application/json': components['schemas']['StartAgentSessionResponse'];
9154
+ 'application/json': components['schemas']['SessionResponse'];
9290
9155
  };
9291
9156
  };
9292
- /** @description The request combines incompatible fields (multiple config sources, idle_start with prompt/input/handoff, a handoff with a config source, or both override forms), or the config override / handoff repo/sha is invalid. */
9157
+ /** @description The request combines incompatible fields (multiple config sources, idle_start with prompt/input, or both override forms), or the config override is invalid. */
9293
9158
  400: {
9294
9159
  headers: {
9295
9160
  [name: string]: unknown;
@@ -9316,7 +9181,7 @@ interface operations {
9316
9181
  'application/json': components['schemas']['ErrorResponse'];
9317
9182
  };
9318
9183
  };
9319
- /** @description The named agent, template, or handoff parent session does not exist in your account. */
9184
+ /** @description The named agent or template does not exist in your account. */
9320
9185
  404: {
9321
9186
  headers: {
9322
9187
  [name: string]: unknown;
@@ -9418,77 +9283,6 @@ interface operations {
9418
9283
  };
9419
9284
  };
9420
9285
  };
9421
- sync_agent_session: {
9422
- parameters: {
9423
- query?: never;
9424
- header?: {
9425
- 'user-agent'?: string | null;
9426
- };
9427
- path?: never;
9428
- cookie?: never;
9429
- };
9430
- requestBody: {
9431
- content: {
9432
- 'application/json': components['schemas']['SyncAgentSessionRequest'];
9433
- };
9434
- };
9435
- responses: {
9436
- /** @description Successful Response */
9437
- 200: {
9438
- headers: {
9439
- [name: string]: unknown;
9440
- };
9441
- content: {
9442
- 'application/json': components['schemas']['SyncAgentSessionResponse'];
9443
- };
9444
- };
9445
- /** @description The transcript payload is empty, or is not valid base64/gzip. */
9446
- 400: {
9447
- headers: {
9448
- [name: string]: unknown;
9449
- };
9450
- content: {
9451
- 'application/json': components['schemas']['ErrorResponse'];
9452
- };
9453
- };
9454
- /** @description The bearer token is missing, invalid, or revoked. */
9455
- 401: {
9456
- headers: {
9457
- [name: string]: unknown;
9458
- };
9459
- content: {
9460
- 'application/json': components['schemas']['ErrorResponse'];
9461
- };
9462
- };
9463
- /** @description The credential may not perform this action, or the account is blocked. */
9464
- 403: {
9465
- headers: {
9466
- [name: string]: unknown;
9467
- };
9468
- content: {
9469
- 'application/json': components['schemas']['ErrorResponse'];
9470
- };
9471
- };
9472
- /** @description The transcript exceeds the size limit (compressed or decompressed). */
9473
- 413: {
9474
- headers: {
9475
- [name: string]: unknown;
9476
- };
9477
- content: {
9478
- 'application/json': components['schemas']['ErrorResponse'];
9479
- };
9480
- };
9481
- /** @description Validation Error */
9482
- 422: {
9483
- headers: {
9484
- [name: string]: unknown;
9485
- };
9486
- content: {
9487
- 'application/json': components['schemas']['HTTPValidationError'];
9488
- };
9489
- };
9490
- };
9491
- };
9492
9286
  get_agent_session: {
9493
9287
  parameters: {
9494
9288
  query?: never;
@@ -9731,7 +9525,7 @@ interface operations {
9731
9525
  'application/json': components['schemas']['ErrorResponse'];
9732
9526
  };
9733
9527
  };
9734
- /** @description The session cannot be messaged: it is closed, non-interactive, laptop-synced, or steered from its triggering surface (mention/react/cron). */
9528
+ /** @description The session cannot be messaged: it is closed, non-interactive, or steered from its triggering surface (mention/react/cron). */
9735
9529
  409: {
9736
9530
  headers: {
9737
9531
  [name: string]: unknown;
@@ -9900,7 +9694,7 @@ interface operations {
9900
9694
  'application/json': components['schemas']['SessionResponse'];
9901
9695
  };
9902
9696
  };
9903
- /** @description The session is a laptop session (not replayable), the named config does not exist, or the config override is invalid. */
9697
+ /** @description The named config does not exist, or the config override is invalid. */
9904
9698
  400: {
9905
9699
  headers: {
9906
9700
  [name: string]: unknown;
@@ -9969,15 +9763,6 @@ interface operations {
9969
9763
  'application/json': components['schemas']['SessionResponse'];
9970
9764
  };
9971
9765
  };
9972
- /** @description The session runs on a developer laptop and cannot be stopped from the cloud. */
9973
- 400: {
9974
- headers: {
9975
- [name: string]: unknown;
9976
- };
9977
- content: {
9978
- 'application/json': components['schemas']['ErrorResponse'];
9979
- };
9980
- };
9981
9766
  /** @description The bearer token is missing, invalid, or revoked. */
9982
9767
  401: {
9983
9768
  headers: {
@@ -10158,19 +9943,38 @@ type AttributionType = 'github_user' | 'linear_user' | 'slack_user' | 'api_key';
10158
9943
  * Delivery status of the message.
10159
9944
  */
10160
9945
  type SessionMessageStatus = 'pending' | 'delivered';
9946
+ type EffortLevel = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
9947
+ /**
9948
+ * What may be done to a resource. Strictly ordered: a grant at one level
9949
+ * includes every level below it (write-only would be a phantom capability —
9950
+ * no real client can create what it cannot read back).
9951
+ */
9952
+ type Level = 'read' | 'write' | 'delete';
9953
+ type GithubAccountFilter = {
9954
+ exclude?: string[];
9955
+ include?: string[] | boolean;
9956
+ } | boolean | string[];
9957
+ type IssueAction = 'opened' | 'closed' | 'commented';
9958
+ type RepositoryFilter = {
9959
+ exclude?: string[];
9960
+ include?: string[];
9961
+ } | string[];
9962
+ type LinearIssueAction = 'opened';
9963
+ type PullRequestAction = 'opened' | 'pushed' | 'merged' | 'closed' | 'review_submitted' | 'commented';
9964
+ type SentryAction = 'issue_alert' | 'metric_alert';
9965
+ /**
9966
+ * The surface an @ellipsis mention can come from.
9967
+ */
9968
+ type AgentConfigMentionPlatform = 'github' | 'slack' | 'linear';
9969
+ /**
9970
+ * How this session's config was chosen.
9971
+ */
9972
+ type AgentConfigSource = 'explicit' | 'inline' | 'template' | 'repo_default' | 'account_default' | 'platform_default' | 'trigger' | 'builtin';
10161
9973
  type GithubAccountType = 'User' | 'Organization' | 'Bot' | 'Mannequin';
10162
9974
  /**
10163
9975
  * Where the resolved budget came from.
10164
9976
  */
10165
9977
  type BudgetSource = 'system' | 'account' | 'config' | 'run';
10166
- /**
10167
- * How a session that arrived with no explicit config source resolved its
10168
- * config (documents/eng/DEFAULT_CONFIGS.md §4). Persisted on the session so
10169
- * audit and clients can say "ran under X (repo default)". A session started
10170
- * with an explicit config/config_id/template_id never enters resolution and
10171
- * stores None.
10172
- */
10173
- type DefaultResolution = 'repo_default' | 'account_default' | 'none';
10174
9978
  /**
10175
9979
  * Why a terminal agent session ended — a finer-grained reason than `status`.
10176
9980
  *
@@ -10179,7 +9983,7 @@ type DefaultResolution = 'repo_default' | 'account_default' | 'none';
10179
9983
  * the UI and metrics can tell a budget cutoff apart from a crashed tool call or
10180
9984
  * a deliberate cancellation. It is None until the run reaches a terminal state.
10181
9985
  */
10182
- type SessionExitStatus = 'completed' | 'budget_hit' | 'payment_required' | 'tool_call_failed' | 'lifecycle_hook_failed' | 'missing_repo_access' | 'missing_token_permissions' | 'missing_sandbox_variables' | 'cancelled' | 'interrupted' | 'error' | 'stopped';
9986
+ type 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';
10183
9987
  /**
10184
9988
  * The coding-agent harness the session runs on.
10185
9989
  */
@@ -10191,16 +9995,14 @@ type Harness = 'claude_code' | 'codex';
10191
9995
  *
10192
9996
  * CONTINUATION — a follow-up in the same conversation surface (e.g. a Slack
10193
9997
  * thread reply spawning a fresh session on the same thread).
10194
- * HANDOFF — a session started to take over work from another surface (e.g.
10195
- * laptop → cloud handoff; later phase).
10196
9998
  * RESUME — a conversation re-hosted on a new box after its sandbox was torn
10197
9999
  * down (interactive platform; later phase).
10198
10000
  */
10199
- type ParentKind = 'continuation' | 'handoff' | 'resume';
10001
+ type ParentKind = 'continuation' | 'resume';
10200
10002
  /**
10201
10003
  * Why direct prompting is refused. Absent when prompting is allowed.
10202
10004
  */
10203
- type PromptBlockedReason = 'mention_surface' | 'ephemeral_trigger' | 'non_interactive' | 'harness_single_turn' | 'closed' | 'laptop';
10005
+ type PromptBlockedReason = 'mention_surface' | 'ephemeral_trigger' | 'non_interactive' | 'harness_single_turn' | 'closed';
10204
10006
  /**
10205
10007
  * Lifecycle of a keyed (multi-turn) session — the durable conversation.
10206
10008
  * Distinct from SessionStatus, which is per-execution (one turn's run) and
@@ -10210,9 +10012,9 @@ type PromptBlockedReason = 'mention_surface' | 'ephemeral_trigger' | 'non_intera
10210
10012
  */
10211
10013
  type SessionState = 'idle' | 'running' | 'closed';
10212
10014
  /**
10213
- * Where the session came from (e.g. react, manual, api, cli, mention, cron, laptop).
10015
+ * Where the session came from (e.g. react, manual, api, cli, mention, cron).
10214
10016
  */
10215
- type SessionSource = 'react' | 'manual' | 'api' | 'cli' | 'mention' | 'cron' | 'laptop';
10017
+ type SessionSource = 'react' | 'manual' | 'api' | 'cli' | 'mention' | 'cron';
10216
10018
  /**
10217
10019
  * Execution status of the session.
10218
10020
  */
@@ -10296,12 +10098,9 @@ interface SessionMessage {
10296
10098
  * The session's current state.
10297
10099
  */
10298
10100
  interface Session {
10101
+ agent: SessionAgent;
10299
10102
  attribution: SessionAttribution;
10300
10103
  budget: SessionBudget;
10301
- /**
10302
- * Identifier of the saved agent config the session ran on, if any.
10303
- */
10304
- config_id: string | null;
10305
10104
  /**
10306
10105
  * The "owner/name" repository context the session was started in, if any.
10307
10106
  */
@@ -10311,10 +10110,6 @@ interface Session {
10311
10110
  * When the session was created.
10312
10111
  */
10313
10112
  created_at: string;
10314
- /**
10315
- * How the session's config was resolved from the account's defaults, when no explicit config was given.
10316
- */
10317
- default_resolution: DefaultResolution | null;
10318
10113
  /**
10319
10114
  * How the session ended; null until it is terminal.
10320
10115
  */
@@ -10332,10 +10127,6 @@ interface Session {
10332
10127
  * When the session last received a message.
10333
10128
  */
10334
10129
  last_message_at: string | null;
10335
- /**
10336
- * A live summary of the session's progress while it runs.
10337
- */
10338
- live_summary: string | null;
10339
10130
  /**
10340
10131
  * Caller-supplied metadata key-value pairs.
10341
10132
  */
@@ -10364,7 +10155,11 @@ interface Session {
10364
10155
  status_reason: string | null;
10365
10156
  stopped: SessionStopped;
10366
10157
  /**
10367
- * The public status projection; null for laptop-synced sessions.
10158
+ * The latest live summary of the session's progress while it runs, and when it was generated.
10159
+ */
10160
+ summary: SessionSummary | null;
10161
+ /**
10162
+ * The public status projection; null on list/search responses, which do not derive it.
10368
10163
  */
10369
10164
  surface: SessionSurface | null;
10370
10165
  tokens: SessionTokens;
@@ -10373,6 +10168,434 @@ interface Session {
10373
10168
  */
10374
10169
  updated_at: string;
10375
10170
  }
10171
+ /**
10172
+ * The agent that ran: the config the session executed, where that config came from, and any override merged into it.
10173
+ */
10174
+ interface SessionAgent {
10175
+ config: AgentConfig;
10176
+ /**
10177
+ * Identifier of the saved config this session's snapshot was taken from. Null for inline, platform-default, and built-in configs. Points at the config as it exists now, which may have changed since.
10178
+ */
10179
+ config_id: string | null;
10180
+ /**
10181
+ * The partial-config override merged into `config` for this session, or null when the config ran unmodified. `config` is the merged result; this is the diff.
10182
+ */
10183
+ override: {
10184
+ [k: string]: unknown;
10185
+ } | null;
10186
+ source: AgentConfigSource;
10187
+ }
10188
+ /**
10189
+ * The agent config the session actually ran, frozen when the session was created.
10190
+ */
10191
+ interface AgentConfig {
10192
+ budget: AgentConfigBudget;
10193
+ claude: AgentConfigClaude;
10194
+ codex: AgentConfigCodex | null;
10195
+ ellipsis: AgentConfigEllipsis;
10196
+ environment: AgentConfigEnvironment;
10197
+ input: AgentConfigInput | null;
10198
+ llm: AgentConfigLlm;
10199
+ mcp_servers: (string | AgentConfigMcpServer)[];
10200
+ output: AgentConfigOutput | null;
10201
+ permissions: AgentConfigPermissions;
10202
+ skills: AgentConfigSkill[];
10203
+ trigger: (AgentConfigCronTrigger | AgentConfigReactTrigger | AgentConfigMentionTrigger) | null;
10204
+ }
10205
+ interface AgentConfigBudget {
10206
+ day: number | null;
10207
+ month: number | null;
10208
+ session: number | null;
10209
+ week: number | null;
10210
+ }
10211
+ interface AgentConfigClaude {
10212
+ effort: EffortLevel | null;
10213
+ fallback_model: string | null;
10214
+ max_turns: number | null;
10215
+ model: string;
10216
+ settings: AgentConfigSettingsRef | null;
10217
+ system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
10218
+ }
10219
+ /**
10220
+ * A config-declared Claude Code settings.json, resolved at run start and
10221
+ * passed to `claude --settings <path>`. That is the CLI settings tier — BELOW
10222
+ * Ellipsis's managed-settings.json floor — so it customizes behavior (model
10223
+ * permissions, includeCoAuthoredBy, statusLine, ...) but can never weaken a
10224
+ * security setting. Lets a team point the cloud agent at the same settings file
10225
+ * they already use with Claude Code locally instead of re-encoding it as YAML.
10226
+ */
10227
+ interface AgentConfigSettingsRef {
10228
+ path: string;
10229
+ repository: AgentConfigRepository | null;
10230
+ }
10231
+ interface AgentConfigRepository {
10232
+ name: string;
10233
+ owner: string | null;
10234
+ ref: string | null;
10235
+ }
10236
+ interface AgentConfigSystemFileRef {
10237
+ file: string;
10238
+ repository: AgentConfigRepository | null;
10239
+ }
10240
+ /**
10241
+ * The `codex:` block — run this agent on OpenAI's Codex CLI instead of
10242
+ * Claude Code. Declaring the block at all is what selects the harness
10243
+ * (`AgentConfig.harness`).
10244
+ *
10245
+ * Deliberately a small subset of `AgentConfigClaude`: the fields omitted here
10246
+ * are ones Codex has no equivalent for (`effort`, `fallback_model`,
10247
+ * `settings`) or that the platform does not yet wire through for this harness
10248
+ * (`max_turns`, `skills`, MCP servers). They are omitted rather than
10249
+ * accepted-and-ignored, because `StrictConfigModel` forbids extra keys — so a
10250
+ * config that sets one fails loudly at parse time instead of silently not doing
10251
+ * it. The budget still bounds a run regardless.
10252
+ */
10253
+ interface AgentConfigCodex {
10254
+ model: string;
10255
+ system: string | AgentConfigSystemFileRef | (string | AgentConfigSystemFileRef)[];
10256
+ }
10257
+ /**
10258
+ * The Ellipsis product namespace for a config file: which schema this is
10259
+ * (`version`), the human-facing identity (`name`/`description`), freeform
10260
+ * organizational `metadata`, whether the agent is `enabled`, and the
10261
+ * human-access flag `interactive`. The presence of a top-level `ellipsis:`
10262
+ * mapping is what marks a YAML file as an Ellipsis agent config (vs arbitrary
10263
+ * YAML that merely lives under a config directory) — see
10264
+ * `yaml_is_ellipsis_config`.
10265
+ *
10266
+ * `enabled`/`interactive` are agent behavior, not freeform metadata, so they
10267
+ * stay inside the config `sha` (only `metadata` is sha-excluded).
10268
+ * `interactive` lets a human `agent session connect` to a live session (CLI
10269
+ * relay). It does not decide whether a session is ephemeral or durable — that
10270
+ * is the trigger's job.
10271
+ */
10272
+ interface AgentConfigEllipsis {
10273
+ description: string | null;
10274
+ enabled: boolean;
10275
+ interactive: boolean;
10276
+ metadata: AgentConfigMetadata;
10277
+ name: string | null;
10278
+ version: string;
10279
+ }
10280
+ interface AgentConfigMetadata {
10281
+ annotations: {
10282
+ [k: string]: string;
10283
+ };
10284
+ labels: string[];
10285
+ }
10286
+ /**
10287
+ * Everything about the environment (the sandbox) the agent runs in: which
10288
+ * `repositories` are cloned into it, which environment `variables` it gets,
10289
+ * its `compute` sizing, how its `image` is customized, and lifecycle `hooks`.
10290
+ * What the agent may *do* from that environment is the top-level
10291
+ * `permissions:` block, not this one.
10292
+ *
10293
+ * Each `variables` entry names a variable to inject; with an inline `value` it
10294
+ * is hardcoded, without one it is resolved from the account's sandbox-secrets
10295
+ * store. Only the named variables reach this agent; the rest of the account's
10296
+ * stored variables never do. This is how a config brings in the config and
10297
+ * credentials a custom CLI needs.
10298
+ */
10299
+ interface AgentConfigEnvironment {
10300
+ compute: AgentConfigCompute;
10301
+ hooks: AgentConfigEnvironmentHooks;
10302
+ image: AgentConfigEnvironmentImage;
10303
+ repositories: AgentConfigRepository[];
10304
+ variables: AgentConfigEnvironmentVariable[];
10305
+ }
10306
+ /**
10307
+ * Sandbox compute sizing. Every field is optional; None inherits the
10308
+ * platform default (1 vCPU / 4096 MiB / 3600s — see DEFAULT_MODAL_* in
10309
+ * models/ellipsis/sandboxes/sandbox.py). A resolved value outside the platform
10310
+ * bounds fails validation loudly (a sync error on the config) rather than
10311
+ * being clamped silently.
10312
+ *
10313
+ * `memory` and `timeout` each accept a shorthand string ("8GB", "30m") or an
10314
+ * explicit units object ({gb: 8}, {minutes: 30}); the `memory_mib` /
10315
+ * `timeout_seconds` properties resolve either form to the canonical integer
10316
+ * the sandbox driver consumes.
10317
+ *
10318
+ * `timeout` is the max wall-clock the agent may run before the sandbox is
10319
+ * killed, capped at 1h (MAX_SANDBOX_TIMEOUT_SECONDS — equal to the default, so
10320
+ * today the knob only shortens a session; the cap matches the 1-hour validity
10321
+ * of the sandbox's GitHub token). The worker's lease/visibility heartbeat
10322
+ * ceiling is derived from that cap, so a run at the max stays owned by its
10323
+ * worker for its whole life.
10324
+ *
10325
+ * Compute is billed on the requested allocation over the sandbox's
10326
+ * wall-clock lifetime, so a bigger/longer box costs proportionally more.
10327
+ */
10328
+ interface AgentConfigCompute {
10329
+ cpu: number | null;
10330
+ memory: string | AgentConfigMemorySize | null;
10331
+ timeout: string | AgentConfigDuration | null;
10332
+ }
10333
+ /**
10334
+ * A memory size as explicit units, summed (binary: 1GB = 1024MB = 1024MiB).
10335
+ * Set any of `gb`/`mb` (at least one). The alternative to the `8GB`-style
10336
+ * shorthand string.
10337
+ */
10338
+ interface AgentConfigMemorySize {
10339
+ gb: number | null;
10340
+ mb: number | null;
10341
+ }
10342
+ /**
10343
+ * A duration as explicit units, summed. Set any of `hours`/`minutes`/
10344
+ * `seconds` (at least one). The alternative to the `30m`-style shorthand
10345
+ * string wherever a duration is accepted.
10346
+ */
10347
+ interface AgentConfigDuration {
10348
+ hours: number | null;
10349
+ minutes: number | null;
10350
+ seconds: number | null;
10351
+ }
10352
+ /**
10353
+ * Shell scripts run at points in the sandbox lifecycle, each as the sandbox
10354
+ * user with the sandbox's environment variables available. A non-zero exit
10355
+ * fails the run (exit_status = LIFECYCLE_HOOK_FAILED) and is not retried.
10356
+ *
10357
+ * `post_start` runs after the container starts, before any repo is cloned —
10358
+ * repo-independent setup (authenticate a CLI, e.g. `doppler setup`). On Modal
10359
+ * the repo is baked into the image so it is incidentally present, but
10360
+ * `post_start` must not depend on repo contents (that's `post_clone`).
10361
+ *
10362
+ * `post_clone` runs after all repos are cloned/checked out, before the agent —
10363
+ * repo-dependent setup (`pip install -r requirements.txt`, codegen).
10364
+ *
10365
+ * Hooks run on every run and their output is never cached. A dependency
10366
+ * install whose result should be reused across runs belongs in `image.setup`
10367
+ * (baked into the cached image) instead; keep hooks for per-run work — e.g.
10368
+ * anything that touches run-scoped credentials.
10369
+ */
10370
+ interface AgentConfigEnvironmentHooks {
10371
+ post_clone: string | null;
10372
+ post_start: string | null;
10373
+ }
10374
+ /**
10375
+ * How to customize the container image the agent runs in. You
10376
+ * contribute appended layers (`dockerfile_append`) and a build-time script
10377
+ * (`setup`) only — Ellipsis owns FROM / base tooling / entrypoint / user.
10378
+ * Today only inline bodies are supported; a file reference (resolved at the
10379
+ * run's SHA) will come later.
10380
+ *
10381
+ * The split: `dockerfile_append` runs when the image is assembled, before any
10382
+ * repo exists — toolchain installs (a package manager binary, apt packages).
10383
+ * `setup` runs at image-build time *after* the configured repositories are
10384
+ * checked out, and its output is captured by the filesystem snapshot that
10385
+ * becomes the cached image — dependency installs (`poetry install`,
10386
+ * `npm install`), so later runs start with deps already on disk. Neither runs
10387
+ * per run; that's `hooks.post_start` / `hooks.post_clone`.
10388
+ */
10389
+ interface AgentConfigEnvironmentImage {
10390
+ dockerfile_append: string | null;
10391
+ setup: string | null;
10392
+ }
10393
+ /**
10394
+ * One environment variable injected into the agent's sandbox.
10395
+ *
10396
+ * `value`, when set, is a literal injected as-is — use it for non-secret
10397
+ * config (LOG_LEVEL, an API base URL). When `value` is omitted the value is
10398
+ * resolved at run time from the account's sandbox-secrets store (dashboard
10399
+ * / `PUT /v1/secrets`) by `name`, so a secret can be injected without
10400
+ * ever putting it in the config file. Either way the variable only reaches
10401
+ * agents that name it.
10402
+ */
10403
+ interface AgentConfigEnvironmentVariable {
10404
+ name: string;
10405
+ value: string | null;
10406
+ }
10407
+ /**
10408
+ * The typed input contract: what goes INTO a session (the trigger is
10409
+ * when it happens; this is what goes in).
10410
+ *
10411
+ * `json_schema` types the payload a caller-started session takes
10412
+ * (`POST /v1/sessions` `input`, validated at the door; required when
10413
+ * declared). It is illegal on a react-triggered agent — react payloads are
10414
+ * platform-shaped (the published surface field sets), not caller-shaped.
10415
+ *
10416
+ * `message` is the initial-message template: exact `{{path}}` substitution
10417
+ * over the caller payload (or, on a react agent, over the surface's
10418
+ * published fields), no conditionals/loops/filters. Refs are validated at
10419
+ * deploy time against the governing field set (see AgentConfig's
10420
+ * `_check_input`).
10421
+ */
10422
+ interface AgentConfigInput {
10423
+ json_schema: {
10424
+ [k: string]: unknown;
10425
+ } | null;
10426
+ message: string | null;
10427
+ }
10428
+ /**
10429
+ * Where this agent's completions go.
10430
+ *
10431
+ * Defaults to Ellipsis's own LLM proxy (our Anthropic/Bedrock account, or the
10432
+ * account-wide BYO provider if one is enabled). Setting `proxy` to the id of a
10433
+ * proxy registered on the models settings page routes THIS agent's
10434
+ * completions through that gateway instead.
10435
+ *
10436
+ * Opt-in per agent by design: registering a proxy does not silently move any
10437
+ * existing agent's traffic. The id is account-scoped, so naming another
10438
+ * account's id is a terminal config error, not a route.
10439
+ */
10440
+ interface AgentConfigLlm {
10441
+ proxy: string | null;
10442
+ }
10443
+ /**
10444
+ * One built-in MCP server this agent opts into by name (`linear`/`slack`).
10445
+ * This is a name reference over the connected built-in set, NOT a custom-server
10446
+ * definition — there is no command/url/headers shape (that was the old,
10447
+ * removed field, and Ellipsis does not support bring-your-own MCP servers).
10448
+ * It only matters when the named integration is set to `opt_in` inclusion; an
10449
+ * integration in the default `all_sessions` mode is added regardless.
10450
+ */
10451
+ interface AgentConfigMcpServer {
10452
+ name: string;
10453
+ }
10454
+ /**
10455
+ * The typed output contract: the JSON Schema the agent must exit through
10456
+ * (the StructuredOutput exit tool). Read back via
10457
+ * GET /v1/sessions/{id}/output.
10458
+ */
10459
+ interface AgentConfigOutput {
10460
+ json_schema: {
10461
+ [k: string]: unknown;
10462
+ };
10463
+ }
10464
+ /**
10465
+ * What the agent is allowed to touch, per credential the platform mints
10466
+ * into its sandbox. Distinct from `environment:`, which is where the agent
10467
+ * runs; this is what it may do from there.
10468
+ *
10469
+ * `ellipsis` scopes the sandbox's Ellipsis API token
10470
+ * (`ELLIPSIS_API_TOKEN`, what the in-sandbox `agent` CLI authenticates
10471
+ * with). `true` / the string `all` (the default) grant the full sandbox
10472
+ * ceiling — everything a sandbox token can ever do. A map narrows it per
10473
+ * resource (see `AgentConfigEllipsisPermissions`); the minted token carries
10474
+ * the intersection, so a config can only ever reduce access. `false` fails
10475
+ * validation — an agent with no API token cannot report its own progress.
10476
+ *
10477
+ * `github` scopes the sandbox's GitHub installation token (`GH_TOKEN`) —
10478
+ * see `AgentConfigGithubPermissions`. GitHub enforces it at mint time.
10479
+ */
10480
+ interface AgentConfigPermissions {
10481
+ ellipsis: (true | 'all') | AgentConfigEllipsisPermissions;
10482
+ github: AgentConfigGithubPermissions;
10483
+ }
10484
+ /**
10485
+ * `permissions.ellipsis` as a map: resource → level | grant | list of
10486
+ * grants. Levels are hierarchical (read < write < delete), so `write`
10487
+ * includes `read`. An unlisted resource is denied. The whole block is
10488
+ * intersected with the platform's sandbox ceiling at token mint — it can
10489
+ * narrow what a sandbox token may do, never exceed it.
10490
+ */
10491
+ interface AgentConfigEllipsisPermissions {
10492
+ [k: string]: Level | EllipsisGrant | (Level | EllipsisGrant)[];
10493
+ }
10494
+ /**
10495
+ * One grant entry: a level, optionally narrowed to instances whose
10496
+ * natural key (a file's name, a memory's path, a secret's name, a config's
10497
+ * name, a session's id) matches any of the `match` globs.
10498
+ */
10499
+ interface EllipsisGrant {
10500
+ level: Level;
10501
+ match: string[] | null;
10502
+ }
10503
+ /**
10504
+ * The agent's GitHub access: the scope of the installation token minted for
10505
+ * its sandbox — the credential `git`, `gh`, and the GitHub MCP server
10506
+ * authenticate with.
10507
+ *
10508
+ * By default the token carries the installation's full permissions on all of
10509
+ * the installation's repositories. `permissions` narrows what it may do:
10510
+ * the string `read_only` grants read access to contents, issues, metadata and
10511
+ * pull requests; a map requests explicit levels per GitHub App permission
10512
+ * scope (e.g. `{contents: read, pull_requests: write}`) and may never exceed
10513
+ * what the installation granted. `repositories` scopes the token to exactly
10514
+ * the listed repos, by name (they must belong to the installation).
10515
+ *
10516
+ * Restriction is enforced by GitHub, not by Ellipsis: the token itself is
10517
+ * minted with the reduced scope, so nothing running in the sandbox can
10518
+ * exceed it.
10519
+ */
10520
+ interface AgentConfigGithubPermissions {
10521
+ permissions: 'read_only' | {
10522
+ [k: string]: string;
10523
+ } | null;
10524
+ repositories: string[] | null;
10525
+ }
10526
+ /**
10527
+ * One config-declared Claude Code skill: a repository directory containing
10528
+ * a SKILL.md, resolved at run start and installed at the sandbox's personal
10529
+ * skill level (`~/.claude/skills/<basename(path)>/`). This is how a config
10530
+ * brings in skills its cloned repositories don't provide — cross-repo refs
10531
+ * (an org-wide skills repo), public third-party repos, and repo-less runs.
10532
+ * Skills under a cloned repo's own `.claude/skills/` load by themselves and
10533
+ * don't need an entry here.
10534
+ */
10535
+ interface AgentConfigSkill {
10536
+ path: string;
10537
+ repository: AgentConfigRepository | null;
10538
+ }
10539
+ interface AgentConfigCronTrigger {
10540
+ schedule: string;
10541
+ type: 'cron';
10542
+ }
10543
+ interface AgentConfigReactTrigger {
10544
+ issue: ReactIssue | null;
10545
+ linear_issue: ReactLinearIssue | null;
10546
+ pull_request: ReactPullRequest | null;
10547
+ push: ReactPush | null;
10548
+ sentry: ReactSentry | null;
10549
+ slack_channel: ReactSlackChannel | null;
10550
+ type: 'react';
10551
+ }
10552
+ interface ReactIssue {
10553
+ for: GithubAccountSelector;
10554
+ labels: string[];
10555
+ on: IssueAction[];
10556
+ repositories: RepositoryFilter;
10557
+ }
10558
+ /**
10559
+ * A selector of GitHub accounts — the `for:` audience gate on react
10560
+ * surfaces and code review pipelines, classified on the stable entity author
10561
+ * (the pusher for `push`, the PR author for a review). `users` selects human
10562
+ * accounts, `bots` selects bot accounts; each is a `GithubAccountFilter`
10563
+ * (include minus exclude, with bare bool/list shorthand).
10564
+ */
10565
+ interface GithubAccountSelector {
10566
+ bots: GithubAccountFilter;
10567
+ users: GithubAccountFilter;
10568
+ }
10569
+ interface ReactLinearIssue {
10570
+ for: GithubAccountSelector;
10571
+ on: LinearIssueAction[];
10572
+ }
10573
+ interface ReactPullRequest {
10574
+ base: string[];
10575
+ draft: boolean | null;
10576
+ for: GithubAccountSelector;
10577
+ head: string[];
10578
+ labels: string[];
10579
+ on: PullRequestAction[];
10580
+ paths: string[];
10581
+ repositories: RepositoryFilter;
10582
+ }
10583
+ interface ReactPush {
10584
+ branch: string[];
10585
+ for: GithubAccountSelector;
10586
+ paths: string[];
10587
+ repositories: RepositoryFilter;
10588
+ }
10589
+ interface ReactSentry {
10590
+ on: SentryAction[];
10591
+ projects: string[];
10592
+ }
10593
+ interface ReactSlackChannel {
10594
+ }
10595
+ interface AgentConfigMentionTrigger {
10596
+ platforms: AgentConfigMentionPlatform[];
10597
+ type: 'mention';
10598
+ }
10376
10599
  /**
10377
10600
  * The principal this session is attributed to.
10378
10601
  */
@@ -10494,7 +10717,21 @@ interface SessionStopped {
10494
10717
  by_user: GithubAccountSnippet | null;
10495
10718
  }
10496
10719
  /**
10497
- * The three fields we expose. All `None` for an un-keyed (laptop) session.
10720
+ * A live one-line summary of what the session is working on, refreshed
10721
+ * every few steps while it runs.
10722
+ */
10723
+ interface SessionSummary {
10724
+ /**
10725
+ * When this summary line was generated. Null on summaries written before generation time was tracked.
10726
+ */
10727
+ created_at: string | null;
10728
+ /**
10729
+ * One-line description of what the session is working on.
10730
+ */
10731
+ description: string;
10732
+ }
10733
+ /**
10734
+ * The three fields we expose.
10498
10735
  *
10499
10736
  * `use_enum_values=True` (from CustomBaseModel) stores the members as their
10500
10737
  * string values, so this serializes to `{"session": "alive", "run": "waiting",
@@ -10651,12 +10888,9 @@ interface SessionFrame {
10651
10888
  * The session's current state.
10652
10889
  */
10653
10890
  interface Session1 {
10891
+ agent: SessionAgent;
10654
10892
  attribution: SessionAttribution;
10655
10893
  budget: SessionBudget;
10656
- /**
10657
- * Identifier of the saved agent config the session ran on, if any.
10658
- */
10659
- config_id: string | null;
10660
10894
  /**
10661
10895
  * The "owner/name" repository context the session was started in, if any.
10662
10896
  */
@@ -10666,10 +10900,6 @@ interface Session1 {
10666
10900
  * When the session was created.
10667
10901
  */
10668
10902
  created_at: string;
10669
- /**
10670
- * How the session's config was resolved from the account's defaults, when no explicit config was given.
10671
- */
10672
- default_resolution: DefaultResolution | null;
10673
10903
  /**
10674
10904
  * How the session ended; null until it is terminal.
10675
10905
  */
@@ -10687,10 +10917,6 @@ interface Session1 {
10687
10917
  * When the session last received a message.
10688
10918
  */
10689
10919
  last_message_at: string | null;
10690
- /**
10691
- * A live summary of the session's progress while it runs.
10692
- */
10693
- live_summary: string | null;
10694
10920
  /**
10695
10921
  * Caller-supplied metadata key-value pairs.
10696
10922
  */
@@ -10719,7 +10945,11 @@ interface Session1 {
10719
10945
  status_reason: string | null;
10720
10946
  stopped: SessionStopped;
10721
10947
  /**
10722
- * The public status projection; null for laptop-synced sessions.
10948
+ * The latest live summary of the session's progress while it runs, and when it was generated.
10949
+ */
10950
+ summary: SessionSummary | null;
10951
+ /**
10952
+ * The public status projection; null on list/search responses, which do not derive it.
10723
10953
  */
10724
10954
  surface: SessionSurface | null;
10725
10955
  tokens: SessionTokens;
@@ -10807,4 +11037,4 @@ type ReviewRequester = components['schemas']['ReviewRequester'];
10807
11037
  type ReviewFinding = components['schemas']['ReviewFinding'];
10808
11038
  type Finding = ReviewFinding;
10809
11039
 
10810
- export type { AttributionType as A, BudgetSource as B, CreateReviewRequest as C, DefaultResolution as D, ErrorFrame as E, Finding as F, GithubAccountSnippet as G, Harness as H, SessionPr as I, SessionPrompting as J, SessionRecord as K, SessionRecordsListResponse as L, SessionResponse as M, SessionSource as N, SessionState as O, ParentKind as P, SessionStatus as Q, RecordsAppendFrame as R, SendSessionMessageRequest as S, SessionStreamFrame as T, SessionSurface as U, SessionsListResponse as V, SnapshotFrame as W, StreamFrame as X, TokensInfo as Y, paths as Z, DeltaFrame as a, DoneFrame as b, components as c, GithubAccountType as d, HeartbeatFrame as e, PromptBlockedReason as f, ResolvedReviewScope as g, Review as h, ReviewConfiguration as i, ReviewCounters as j, ReviewFinding as k, ReviewRequester as l, ReviewScope as m, ReviewScopeKind as n, ReviewStage as o, ReviewedCommit as p, ReviewsListResponse as q, Session as r, SessionExecution as s, SessionExecutionsListResponse as t, SessionExitStatus as u, SessionFrame as v, SessionLiveness as w, SessionMessage as x, SessionMessageResponse as y, SessionMessageStatus as z };
11040
+ export type { AgentConfigSource as A, BudgetSource as B, CreateReviewRequest as C, DeltaFrame as D, ErrorFrame as E, Finding as F, GithubAccountSnippet as G, Harness as H, SessionPr as I, SessionPrompting as J, SessionRecord as K, SessionRecordsListResponse as L, SessionResponse as M, SessionSource as N, SessionState as O, ParentKind as P, SessionStatus as Q, RecordsAppendFrame as R, SendSessionMessageRequest as S, SessionStreamFrame as T, SessionSurface as U, SessionsListResponse as V, SnapshotFrame as W, StreamFrame as X, TokensInfo as Y, paths as Z, AttributionType as a, DoneFrame as b, components as c, GithubAccountType as d, HeartbeatFrame as e, PromptBlockedReason as f, ResolvedReviewScope as g, Review as h, ReviewConfiguration as i, ReviewCounters as j, ReviewFinding as k, ReviewRequester as l, ReviewScope as m, ReviewScopeKind as n, ReviewStage as o, ReviewedCommit as p, ReviewsListResponse as q, Session as r, SessionExecution as s, SessionExecutionsListResponse as t, SessionExitStatus as u, SessionFrame as v, SessionLiveness as w, SessionMessage as x, SessionMessageResponse as y, SessionMessageStatus as z };