@managoat/fountain-sdk 1.26.0 → 1.28.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.
@@ -1157,7 +1157,7 @@ export interface paths {
1157
1157
  put?: never;
1158
1158
  /**
1159
1159
  * Start a conversation
1160
- * @description Creates a sandbox + conversation pair, starts the runtime in a fresh sprite, and (if `prompt` is supplied) sends it as turn 1. With `channel_id`, resumes the latest live conversation already bound to that channel for the same agent and vault (200, `meta.resumed: true`) instead of opening a new one (201). Pass `X-Fountain-Parent-Conversation-Id` header to record which conversation spawned this one. Legacy `X-AoD-Parent-Conversation-Id` is still accepted for sprites provisioned before the rename.
1160
+ * @description Creates a sandbox + conversation pair, starts the runtime in a fresh sprite, and (if `prompt` is supplied) sends it as turn 1. With `channel_id`, resumes the latest live conversation already bound to that channel for the same agent and vault (200, `meta.resumed: true`) instead of opening a new one (201). `labels` (#1637) are stamped on the new conversation; with `channel_id`, a resume merges them into the conversation it hands back, and a sandbox callback token resuming a conversation it was not minted for is refused with 403. Pass `X-Fountain-Parent-Conversation-Id` header to record which conversation spawned this one. Legacy `X-AoD-Parent-Conversation-Id` is still accepted for sprites provisioned before the rename.
1161
1161
  */
1162
1162
  post: operations["FountainWeb.ConversationController.create"];
1163
1163
  delete?: never;
@@ -1228,6 +1228,30 @@ export interface paths {
1228
1228
  patch?: never;
1229
1229
  trace?: never;
1230
1230
  };
1231
+ "/api/conversations/{conversation_id}/labels": {
1232
+ parameters: {
1233
+ query?: never;
1234
+ header?: never;
1235
+ path?: never;
1236
+ cookie?: never;
1237
+ };
1238
+ get?: never;
1239
+ put?: never;
1240
+ post?: never;
1241
+ delete?: never;
1242
+ options?: never;
1243
+ head?: never;
1244
+ /**
1245
+ * Set a conversation's labels
1246
+ * @description Merges `labels` into the conversation's own (#1637). A key the body does not name is left alone, and a key whose value is `null` is removed, so a run can stamp one outcome without reading the rest first.
1247
+ *
1248
+ * At most 32 labels survive the merge; a key is at most 64 bytes and a value at most 256 bytes. A 422 names the offending key.
1249
+ *
1250
+ * The account's own key may label any of its conversations. A sandbox callback token may label **only the conversation it was minted for**; another id is refused with 403 `sprite_may_not_label_another_conversation`. An agent inside a turn does not need this route at all: it sends the `_fountain/labels` ACP extension update instead.
1251
+ */
1252
+ patch: operations["FountainWeb.ConversationController.labels"];
1253
+ trace?: never;
1254
+ };
1231
1255
  "/api/conversations/{conversation_id}/prompts": {
1232
1256
  parameters: {
1233
1257
  query?: never;
@@ -1514,6 +1538,55 @@ export interface paths {
1514
1538
  patch?: never;
1515
1539
  trace?: never;
1516
1540
  };
1541
+ "/api/oauth/clients": {
1542
+ parameters: {
1543
+ query?: never;
1544
+ header?: never;
1545
+ path?: never;
1546
+ cookie?: never;
1547
+ };
1548
+ /**
1549
+ * List OAuth clients
1550
+ * @description The OAuth clients this account registered. Each one is in development mode until an operator publishes it, which means it signs in its owner and refuses every other account.
1551
+ */
1552
+ get: operations["FountainWeb.OAuthClientController.index"];
1553
+ put?: never;
1554
+ /**
1555
+ * Register an OAuth client
1556
+ * @description Register an app that can offer "Sign in with Fountain". The response carries the generated `client_id` to put in the app. Redirect URIs match exactly, must be https unless they are loopback, and a loopback URI matches on any port. The client starts in development mode, so it signs in nobody but you. A sandbox's public HTTPS URL is valid.
1557
+ */
1558
+ post: operations["FountainWeb.OAuthClientController.create"];
1559
+ delete?: never;
1560
+ options?: never;
1561
+ head?: never;
1562
+ patch?: never;
1563
+ trace?: never;
1564
+ };
1565
+ "/api/oauth/clients/{id}": {
1566
+ parameters: {
1567
+ query?: never;
1568
+ header?: never;
1569
+ path?: never;
1570
+ cookie?: never;
1571
+ };
1572
+ /** Get an OAuth client */
1573
+ get: operations["FountainWeb.OAuthClientController.show"];
1574
+ put?: never;
1575
+ post?: never;
1576
+ /**
1577
+ * Unregister an OAuth client
1578
+ * @description Deleting a client stops new sign-ins through it. Keys it already issued are ordinary API keys and outlive it — revoke those under the API keys endpoint. A published client can only be removed by an operator, because every account signs in through it.
1579
+ */
1580
+ delete: operations["FountainWeb.OAuthClientController.delete"];
1581
+ options?: never;
1582
+ head?: never;
1583
+ /**
1584
+ * Change an OAuth client
1585
+ * @description Rename the client or replace its redirect URIs. `client_id` never changes. Publishing is not a self-serve operation, and a published client can only be changed by an operator.
1586
+ */
1587
+ patch: operations["FountainWeb.OAuthClientController.update"];
1588
+ trace?: never;
1589
+ };
1517
1590
  "/api/oauth/revoke": {
1518
1591
  parameters: {
1519
1592
  query?: never;
@@ -1684,7 +1757,7 @@ export interface paths {
1684
1757
  };
1685
1758
  /**
1686
1759
  * Read a file on a sandbox
1687
- * @description The bytes of one file, redacted: every value of the sandbox's environment and vault is replaced with `[REDACTED]`, as in the transcript. `content` is the text when it is valid UTF-8 (`encoding: utf-8`) and base64 otherwise (`encoding: base64`). `size` is the whole file; `truncated` says whether `content` stopped at `max_bytes`. Full scope.
1760
+ * @description The bytes of one file, redacted: every value of the sandbox's environment and vault is replaced with `[REDACTED]`, as in the transcript. `content` is the text when it is valid UTF-8 (`encoding: utf-8`) and base64 otherwise (`encoding: base64`). `size` is the whole file; `truncated` says whether `content` is short of it, which happens when the file is longer than `max_bytes` and also when redaction grows what was read past that cap. Full scope.
1688
1761
  */
1689
1762
  get: operations["FountainWeb.SandboxFilesController.show"];
1690
1763
  put?: never;
@@ -1715,6 +1788,26 @@ export interface paths {
1715
1788
  patch?: never;
1716
1789
  trace?: never;
1717
1790
  };
1791
+ "/api/sandboxes/{sandbox_id}/git-status": {
1792
+ parameters: {
1793
+ query?: never;
1794
+ header?: never;
1795
+ path?: never;
1796
+ cookie?: never;
1797
+ };
1798
+ /**
1799
+ * git status on a sandbox
1800
+ * @description `git status` of the repository containing `path` (default: the agent's working directory), one entry per changed path. This is the view that shows a file the agent created and never staged: `/diff` compares tracked content, so an untracked file is invisible to it whatever flags it is given. Entries cover the whole repository whatever `path` names inside it, and each entry's `path` is relative to `repo_root`. `index` and `worktree` are git's two porcelain columns read separately, so a file staged and then edited again reports a state in both; an untracked file reads `untracked` in both. `renamed_from` is set only where that side is a rename or a copy. `branch` is null on a detached HEAD. A directory outside any repository is `422 not_a_repository`. Full scope.
1801
+ */
1802
+ get: operations["FountainWeb.SandboxFilesController.git_status"];
1803
+ put?: never;
1804
+ post?: never;
1805
+ delete?: never;
1806
+ options?: never;
1807
+ head?: never;
1808
+ patch?: never;
1809
+ trace?: never;
1810
+ };
1718
1811
  "/api/search": {
1719
1812
  parameters: {
1720
1813
  query?: never;
@@ -2008,6 +2101,8 @@ export interface paths {
2008
2101
  /**
2009
2102
  * Message a teammate
2010
2103
  * @description A turn on the teammate's conversation. A parked or reaped sandbox wakes; a conversation past resuming is replaced by a fresh one under the same binding, seeded with this message, so the response names the conversation the message went to. 400 `conversation_busy` while the previous turn is still running (the same shape as `POST /api/conversations/:id/prompts`), 503 while the computer is still starting.
2104
+ *
2105
+ * `labels` merges onto the conversation the message lands on (#1637), before the turn is queued, so a label the limits refuse leaves the message unsent.
2011
2106
  */
2012
2107
  post: operations["FountainWeb.TeamController.message"];
2013
2108
  delete?: never;
@@ -2589,9 +2684,12 @@ export interface components {
2589
2684
  model: string | null;
2590
2685
  name: string;
2591
2686
  /** @description Per-tool permission policy: a map of key to verdict, plus an optional "default" key. A key is matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); prefer a kind, because claude titles a tool call with the command it is about to run. Unset keys fall back to the default, and an unset default is auto_allow — today's behaviour. "ask" holds the tool until a human answers it on the conversation stream, and denies if nobody does before the timeout. A runtime that never asks (opencode) refuses anything stricter than auto_allow with 422 permission_policy_unenforceable. */
2592
- permission_policy?: {
2593
- [key: string]: "auto_allow" | "ask" | "auto_deny";
2594
- } | null;
2687
+ permission_policy?: ({
2688
+ /** @description Seconds a permission request that outlived its turn waits before it is denied (#1635). Names no tool, so it is the one key whose value is a number rather than a verdict, which is why the value schema below is a union. Absent leaves the global ask timeout. A request may shorten it with `_meta.fountain.timeout` on its own session/request_permission, and may not lengthen it. A launch may only shorten what the agent set, or the global ask timeout where the agent set nothing. Capped at a year, which is where the deadline stops fitting in a timestamp rather than a limit on how long a wait is useful. */
2689
+ ask_timeout?: number;
2690
+ } & {
2691
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
2692
+ }) | null;
2595
2693
  /** @enum {string} */
2596
2694
  runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2597
2695
  /** @description The command the acp runtime launches inside the sandbox, as a shell line resolved there (for example `chant acp`). Required when runtime is acp, and rejected on every other runtime, which resolves its own executable. A free string by design: it runs under the same isolation as an environment's setup script. */
@@ -2644,9 +2742,12 @@ export interface components {
2644
2742
  model?: string | null;
2645
2743
  name: string;
2646
2744
  /** @description Per-tool permission policy: a map of key to verdict, plus an optional "default" key. A key is matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); prefer a kind, because claude titles a tool call with the command it is about to run. Unset keys fall back to the default, and an unset default is auto_allow. "ask" holds the tool until a human answers it on the conversation stream, and denies if nobody does before the timeout. A conversation may narrow this at launch, never widen it. A runtime that never asks (opencode) refuses anything stricter than auto_allow with 422 permission_policy_unenforceable. */
2647
- permission_policy?: {
2648
- [key: string]: "auto_allow" | "ask" | "auto_deny";
2649
- } | null;
2745
+ permission_policy?: ({
2746
+ /** @description Seconds a permission request that outlived its turn waits before it is denied (#1635). Names no tool, so it is the one key whose value is a number rather than a verdict, which is why the value schema below is a union. Absent leaves the global ask timeout. A request may shorten it with `_meta.fountain.timeout` on its own session/request_permission, and may not lengthen it. A launch may only shorten what the agent set, or the global ask timeout where the agent set nothing. Capped at a year, which is where the deadline stops fitting in a timestamp rather than a limit on how long a wait is useful. */
2747
+ ask_timeout?: number;
2748
+ } & {
2749
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
2750
+ }) | null;
2650
2751
  /** @enum {string} */
2651
2752
  runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2652
2753
  /** @description The command the acp runtime launches inside the sandbox, as a shell line resolved there (for example `chant acp`). Required when runtime is acp, and rejected on every other runtime, which resolves its own executable. A free string by design: it runs under the same isolation as an environment's setup script. */
@@ -2696,9 +2797,12 @@ export interface components {
2696
2797
  model?: string | null;
2697
2798
  name?: string;
2698
2799
  /** @description Per-tool permission policy: a map of key to verdict, plus an optional "default" key. A key is matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); prefer a kind, because claude titles a tool call with the command it is about to run. Unset keys fall back to the default, and an unset default is auto_allow. "ask" holds the tool until a human answers it on the conversation stream, and denies if nobody does before the timeout. A conversation may narrow this at launch, never widen it. A runtime that never asks (opencode) refuses anything stricter than auto_allow with 422 permission_policy_unenforceable. */
2699
- permission_policy?: {
2700
- [key: string]: "auto_allow" | "ask" | "auto_deny";
2701
- } | null;
2800
+ permission_policy?: ({
2801
+ /** @description Seconds a permission request that outlived its turn waits before it is denied (#1635). Names no tool, so it is the one key whose value is a number rather than a verdict, which is why the value schema below is a union. Absent leaves the global ask timeout. A request may shorten it with `_meta.fountain.timeout` on its own session/request_permission, and may not lengthen it. A launch may only shorten what the agent set, or the global ask timeout where the agent set nothing. Capped at a year, which is where the deadline stops fitting in a timestamp rather than a limit on how long a wait is useful. */
2802
+ ask_timeout?: number;
2803
+ } & {
2804
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
2805
+ }) | null;
2702
2806
  /** @enum {string} */
2703
2807
  runtime?: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2704
2808
  /** @description The command the acp runtime launches inside the sandbox, as a shell line resolved there (for example `chant acp`). Required when runtime is acp, and rejected on every other runtime, which resolves its own executable. A free string by design: it runs under the same isolation as an environment's setup script. */
@@ -3498,6 +3602,10 @@ export interface components {
3498
3602
  id: string;
3499
3603
  /** Format: date-time */
3500
3604
  inserted_at?: string;
3605
+ /** @description Free-form key/value strings on the conversation. A program stamps its own run with them (`env=prod`, `drift=true`) and `GET /api/conversations?label=env:prod` filters on them. At most 32 entries; a key is at most 64 bytes and a value at most 256 bytes. Always an object, empty when nothing set one. */
3606
+ labels?: {
3607
+ [key: string]: string;
3608
+ };
3501
3609
  /**
3502
3610
  * Format: date-time
3503
3611
  * @description Most recent runtime output, falling back to creation time. Stage events (reconnects, sandbox lifecycle) do not count.
@@ -3511,9 +3619,12 @@ export interface components {
3511
3619
  /** Format: uuid */
3512
3620
  parent_conversation_id?: string | null;
3513
3621
  /** @description The per-launch permission override this conversation was started with, or null if it had none. The policy actually in force is this merged with the agent's, taking the stricter of the two per tool. */
3514
- permission_policy?: {
3515
- [key: string]: "auto_allow" | "ask" | "auto_deny";
3516
- } | null;
3622
+ permission_policy?: ({
3623
+ /** @description Seconds a permission request that outlived its turn waits before it is denied (#1635). Names no tool, so it is the one key whose value is a number rather than a verdict, which is why the value schema below is a union. Absent leaves the global ask timeout. A request may shorten it with `_meta.fountain.timeout` on its own session/request_permission, and may not lengthen it. A launch may only shorten what the agent set, or the global ask timeout where the agent set nothing. Capped at a year, which is where the deadline stops fitting in a timestamp rather than a limit on how long a wait is useful. */
3624
+ ask_timeout?: number;
3625
+ } & {
3626
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
3627
+ }) | null;
3517
3628
  /** @enum {string} */
3518
3629
  runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
3519
3630
  runtime_session_id?: string | null;
@@ -3553,14 +3664,23 @@ export interface components {
3553
3664
  environment_id?: string | null;
3554
3665
  /** @description With channel_id: skip the resume and open a new conversation (201), which then becomes the channel's binding. Sent by a chat harness relaying its owner's rotate command. Ignored without channel_id. */
3555
3666
  fresh?: boolean | null;
3556
- /** @description Optional images to attach to the initial prompt. */
3667
+ /** @description Optional images to attach to the initial prompt. They require that prompt: images with no opening text are refused with 422 invalid_prompt, and an image whose media_type is unsupported or whose decoded bytes are empty or over the 10MB ceiling is refused with 422 invalid_images. Both refusals happen before a sandbox is reserved. */
3557
3668
  images?: components["schemas"]["ImageInput"][] | null;
3558
- /** @description Per-launch permission override (#939). Keys are matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); "default" covers the rest. Prefer a kind: claude titles a tool call with the command it is about to run, so a title matches one invocation only. Merged with the agent's own policy, taking the stricter of the two. It may only narrow: a policy that would loosen any tool is refused with 422 permission_policy_widens rather than silently clamped, and one the runtime never consults is refused with 422 permission_policy_unenforceable. */
3559
- permission_policy?: {
3560
- [key: string]: "auto_allow" | "ask" | "auto_deny";
3669
+ /** @description Key/value strings to stamp on the conversation. At most 32 entries; a key is at most 64 bytes and a value at most 256 bytes, and a 422 names the offending key under `errors.labels`. With channel_id, a resume merges these into the conversation it hands back rather than dropping them. */
3670
+ labels?: {
3671
+ [key: string]: string;
3561
3672
  } | null;
3562
- /** @description Optional first turn prompt. */
3673
+ /** @description Per-launch permission override (#939). Keys are matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); "default" covers the rest. Prefer a kind: claude titles a tool call with the command it is about to run, so a title matches one invocation only. Merged with the agent's own policy, taking the stricter of the two. It may only narrow: a policy that would loosen any tool is refused with 422 permission_policy_widens rather than silently clamped, and one the runtime never consults is refused with 422 permission_policy_unenforceable. */
3674
+ permission_policy?: ({
3675
+ /** @description Seconds a permission request that outlived its turn waits before it is denied (#1635). Names no tool, so it is the one key whose value is a number rather than a verdict, which is why the value schema below is a union. Absent leaves the global ask timeout. A request may shorten it with `_meta.fountain.timeout` on its own session/request_permission, and may not lengthen it. A launch may only shorten what the agent set, or the global ask timeout where the agent set nothing. Capped at a year, which is where the deadline stops fitting in a timestamp rather than a limit on how long a wait is useful. */
3676
+ ask_timeout?: number;
3677
+ } & {
3678
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
3679
+ }) | null;
3680
+ /** @description Optional first turn prompt. A launch may open with no prompt at all, but a prompt that is present must carry words: blank and whitespace-only text is refused with 422 invalid_prompt, before the launch reserves a sandbox. */
3563
3681
  prompt?: string;
3682
+ /** @description When a fresh start reaches the tenant or the fleet concurrency ceiling, wait in the bounded sandbox queue and return 202 with a SandboxRequest instead of 429 or 503 (ADR 0042). Starts carrying images or an explicit sandbox_id are never queued, and a full queue keeps the immediate error. */
3683
+ queue?: boolean | null;
3564
3684
  /**
3565
3685
  * @description none omits the sandbox Fountain credential on provision and every wake. Requires a fresh ephemeral sandbox; unavailable on attach or policy-changing channel resume.
3566
3686
  * @enum {string}
@@ -3586,6 +3706,16 @@ export interface components {
3586
3706
  */
3587
3707
  vault_id?: string | null;
3588
3708
  };
3709
+ /**
3710
+ * ConversationLabelsRequest
3711
+ * @description Labels to merge into a conversation. A key not named is left alone; a key whose value is null is removed.
3712
+ */
3713
+ ConversationLabelsRequest: {
3714
+ /** @description The pairs to merge. null removes a key. At most 32 entries survive the merge; a key is at most 64 bytes and a value at most 256 bytes. A 422 names the offending key under `errors.labels`. */
3715
+ labels: {
3716
+ [key: string]: string | null;
3717
+ };
3718
+ };
3589
3719
  /** ConversationListResponse */
3590
3720
  ConversationListResponse: {
3591
3721
  data: components["schemas"]["Conversation"][];
@@ -3953,6 +4083,56 @@ export interface components {
3953
4083
  detail: string;
3954
4084
  };
3955
4085
  };
4086
+ /**
4087
+ * OAuthClient
4088
+ * @description A tenant-owned OAuth client. Unpublished clients are in development mode and can sign in only their owner. Their redirect origins are also admitted by CORS.
4089
+ */
4090
+ OAuthClient: {
4091
+ /** @description The client_id sent to /oauth/authorize. */
4092
+ client_id: string;
4093
+ /** Format: date-time */
4094
+ created_at: string;
4095
+ /** Format: uuid */
4096
+ id: string;
4097
+ /** @description Shown on the consent page. */
4098
+ name: string;
4099
+ /** @description Origins derived from redirect_uris and admitted by CORS. A loopback origin is admitted on any port, not only the port shown here. */
4100
+ origins: string[];
4101
+ /** @description False means development mode with owner-only sign-in. */
4102
+ published: boolean;
4103
+ /** @description Exact match, except that an unpublished loopback URI matches on any port. */
4104
+ redirect_uris: string[];
4105
+ /** Format: date-time */
4106
+ updated_at: string;
4107
+ };
4108
+ /** OAuthClientListResponse */
4109
+ OAuthClientListResponse: {
4110
+ data: components["schemas"]["OAuthClient"][];
4111
+ };
4112
+ /**
4113
+ * OAuthClientRequest
4114
+ * @example {
4115
+ * "name": "Notes",
4116
+ * "redirect_uris": [
4117
+ * "https://abc123.sprites.app/callback",
4118
+ * "http://localhost:5173/callback"
4119
+ * ]
4120
+ * }
4121
+ */
4122
+ OAuthClientRequest: {
4123
+ name: string;
4124
+ redirect_uris: string[];
4125
+ };
4126
+ /**
4127
+ * OAuthClientUpdateRequest
4128
+ * @example {
4129
+ * "name": "Notes for Fountain"
4130
+ * }
4131
+ */
4132
+ OAuthClientUpdateRequest: {
4133
+ name?: string;
4134
+ redirect_uris?: string[];
4135
+ };
3956
4136
  /** OAuthTokenRequest */
3957
4137
  OAuthTokenRequest: {
3958
4138
  client_id: string;
@@ -4167,6 +4347,26 @@ export interface components {
4167
4347
  /** Format: uuid */
4168
4348
  vault_id?: string | null;
4169
4349
  };
4350
+ /**
4351
+ * SandboxChange
4352
+ * @description One path `git status` reports, relative to `repo_root` (ADR 0039). An untracked file reads `untracked` on both sides, which is what git reports for it and the one state a diff cannot show.
4353
+ */
4354
+ SandboxChange: {
4355
+ /**
4356
+ * @description The staged side: what a commit would record.
4357
+ * @enum {string}
4358
+ */
4359
+ index: "added" | "copied" | "deleted" | "ignored" | "modified" | "renamed" | "type_changed" | "unchanged" | "unmerged" | "untracked";
4360
+ /** @description Relative to `repo_root`. */
4361
+ path: string;
4362
+ /** @description The old path, when that side is a rename or a copy; null otherwise. */
4363
+ renamed_from?: string | null;
4364
+ /**
4365
+ * @description The unstaged side: what the disk holds beyond the index.
4366
+ * @enum {string}
4367
+ */
4368
+ worktree: "added" | "copied" | "deleted" | "ignored" | "modified" | "renamed" | "type_changed" | "unchanged" | "unmerged" | "untracked";
4369
+ };
4170
4370
  /**
4171
4371
  * SandboxConversation
4172
4372
  * @description A conversation on a sandbox, as the sandbox lists it.
@@ -4248,13 +4448,13 @@ export interface components {
4248
4448
  diff: string;
4249
4449
  /** @description The directory the diff was asked for, absolute. */
4250
4450
  path: string;
4251
- /** @description The revision diffed against, or null for HEAD. */
4451
+ /** @description The revision diffed against, or null when the caller named none. */
4252
4452
  ref?: string | null;
4253
4453
  /** @description The repository's top-level directory. */
4254
4454
  repo_root: string;
4255
4455
  /** @description True when the index was diffed (`--cached`). */
4256
4456
  staged: boolean;
4257
- /** @description True when `diff` stopped at `max_bytes` before the end. */
4457
+ /** @description True when `diff` is not the whole diff: either it is longer than `max_bytes`, or redaction grew what was read past it. False means `diff` is everything. */
4258
4458
  truncated: boolean;
4259
4459
  };
4260
4460
  /** SandboxDiffResponse */
@@ -4287,7 +4487,7 @@ export interface components {
4287
4487
  path: string;
4288
4488
  /** @description The whole file, in bytes. */
4289
4489
  size: number;
4290
- /** @description True when `content` stopped at `max_bytes` before the end of the file. */
4490
+ /** @description True when `content` is not the whole file: either the file is longer than `max_bytes`, or redaction grew what was read past it. False means `content` is everything. */
4291
4491
  truncated: boolean;
4292
4492
  };
4293
4493
  /** SandboxFileResponse */
@@ -4313,10 +4513,63 @@ export interface components {
4313
4513
  SandboxListingResponse: {
4314
4514
  data: components["schemas"]["SandboxListing"];
4315
4515
  };
4516
+ /**
4517
+ * SandboxRequest
4518
+ * @description Work waiting for sandbox capacity (ADR 0042).
4519
+ */
4520
+ SandboxRequest: {
4521
+ /** Format: uuid */
4522
+ agent_id: string;
4523
+ /**
4524
+ * Format: uuid
4525
+ * @description The conversation the request became, once it started.
4526
+ */
4527
+ conversation_id?: string | null;
4528
+ error?: string | null;
4529
+ /** Format: uuid */
4530
+ id: string;
4531
+ /** Format: date-time */
4532
+ inserted_at?: string;
4533
+ /** @enum {string} */
4534
+ kind: "start" | "schedule_run";
4535
+ /** @description One-based place in the tenant's queue; null once it stops waiting. */
4536
+ position?: number | null;
4537
+ source?: string | null;
4538
+ /** @enum {string} */
4539
+ status: "queued" | "starting" | "started" | "cancelled" | "expired" | "failed";
4540
+ };
4541
+ /** SandboxRequestResponse */
4542
+ SandboxRequestResponse: {
4543
+ data: components["schemas"]["SandboxRequest"];
4544
+ };
4316
4545
  /** SandboxResponse */
4317
4546
  SandboxResponse: {
4318
4547
  data: components["schemas"]["SandboxDetail"];
4319
4548
  };
4549
+ /**
4550
+ * SandboxStatus
4551
+ * @description `git status` of a repository on a sandbox, one entry per changed path.
4552
+ */
4553
+ SandboxStatus: {
4554
+ /** @description The checked-out branch, or null on a detached HEAD. */
4555
+ branch?: string | null;
4556
+ entries: components["schemas"]["SandboxChange"][];
4557
+ /** @description The directory the status was asked for, absolute. */
4558
+ path: string;
4559
+ /** @description The repository's top-level directory. */
4560
+ repo_root: string;
4561
+ /** @description True when the repository holds more changes than were returned. */
4562
+ truncated: boolean;
4563
+ /**
4564
+ * @description What was asked about untracked paths.
4565
+ * @enum {string}
4566
+ */
4567
+ untracked: "normal" | "all" | "no";
4568
+ };
4569
+ /** SandboxStatusResponse */
4570
+ SandboxStatusResponse: {
4571
+ data: components["schemas"]["SandboxStatus"];
4572
+ };
4320
4573
  /**
4321
4574
  * SearchHit
4322
4575
  * @description One search hit: what matched, and where to jump.
@@ -4556,6 +4809,10 @@ export interface components {
4556
4809
  /** TeamMessageRequest */
4557
4810
  TeamMessageRequest: {
4558
4811
  images?: components["schemas"]["ImageInput"][] | null;
4812
+ /** @description Labels to merge into the conversation this message lands on, whether that is the teammate's current one or the fresh one a retired thread is replaced by. Same limits as everywhere else; null removes a key. */
4813
+ labels?: {
4814
+ [key: string]: string | null;
4815
+ } | null;
4559
4816
  prompt: string;
4560
4817
  };
4561
4818
  /** TeamMessageResponse */
@@ -10094,6 +10351,8 @@ export interface operations {
10094
10351
  status?: string;
10095
10352
  /** @description Return at most this many conversations, most recently updated first (1 to 500; 400 outside that range). Without it the whole list is returned, which on a busy account is hundreds of rows per call — a client that needs one conversation should filter (`agent_id`, `sandbox_id`, `channel_id`) and cap. */
10096
10353
  limit?: number;
10354
+ /** @description Only conversations carrying these `key:value` labels (#1637). Repeat the parameter to combine them with AND: `?label=env:prod&label=drift:true` keeps the conversations that carry both. `label[]=` is accepted as well. Each value splits on its first colon only, so `label=path:a:b` matches the label `path` with the value `a:b`. 400 `invalid_label_filter` on a value with no colon or an empty key. */
10355
+ label?: string[];
10097
10356
  };
10098
10357
  header?: never;
10099
10358
  path?: never;
@@ -10198,6 +10457,15 @@ export interface operations {
10198
10457
  "application/json": components["schemas"]["ConversationResponse"];
10199
10458
  };
10200
10459
  };
10460
+ /** @description Queued for sandbox capacity */
10461
+ 202: {
10462
+ headers: {
10463
+ [name: string]: unknown;
10464
+ };
10465
+ content: {
10466
+ "application/json": components["schemas"]["SandboxRequestResponse"];
10467
+ };
10468
+ };
10201
10469
  /** @description Invalid request */
10202
10470
  400: {
10203
10471
  headers: {
@@ -10228,7 +10496,7 @@ export interface operations {
10228
10496
  };
10229
10497
  };
10230
10498
  };
10231
- /** @description Forbidden */
10499
+ /** @description A sandbox token labelling the conversation a resume landed on */
10232
10500
  403: {
10233
10501
  headers: {
10234
10502
  [name: string]: unknown;
@@ -10273,7 +10541,7 @@ export interface operations {
10273
10541
  "application/json": components["schemas"]["UnprocessableEntityError"];
10274
10542
  };
10275
10543
  };
10276
- /** @description Too Many Requests */
10544
+ /** @description Tenant concurrency cap reached */
10277
10545
  429: {
10278
10546
  headers: {
10279
10547
  [name: string]: unknown;
@@ -10542,6 +10810,87 @@ export interface operations {
10542
10810
  };
10543
10811
  };
10544
10812
  };
10813
+ "FountainWeb.ConversationController.labels": {
10814
+ parameters: {
10815
+ query?: never;
10816
+ header?: never;
10817
+ path: {
10818
+ conversation_id: string;
10819
+ };
10820
+ cookie?: never;
10821
+ };
10822
+ /** @description Labels */
10823
+ requestBody?: {
10824
+ content: {
10825
+ "application/json": components["schemas"]["ConversationLabelsRequest"];
10826
+ };
10827
+ };
10828
+ responses: {
10829
+ /** @description Conversation */
10830
+ 200: {
10831
+ headers: {
10832
+ [name: string]: unknown;
10833
+ };
10834
+ content: {
10835
+ "application/json": components["schemas"]["ConversationResponse"];
10836
+ };
10837
+ };
10838
+ /** @description Unauthorized */
10839
+ 401: {
10840
+ headers: {
10841
+ [name: string]: unknown;
10842
+ };
10843
+ content: {
10844
+ "application/json": components["schemas"]["Error"];
10845
+ };
10846
+ };
10847
+ /** @description A sandbox token labelling another conversation */
10848
+ 403: {
10849
+ headers: {
10850
+ [name: string]: unknown;
10851
+ };
10852
+ content: {
10853
+ "application/json": components["schemas"]["Error"];
10854
+ };
10855
+ };
10856
+ /** @description Not found */
10857
+ 404: {
10858
+ headers: {
10859
+ [name: string]: unknown;
10860
+ };
10861
+ content: {
10862
+ "application/json": components["schemas"]["Error"];
10863
+ };
10864
+ };
10865
+ /** @description No acceptable representation */
10866
+ 406: {
10867
+ headers: {
10868
+ [name: string]: unknown;
10869
+ };
10870
+ content: {
10871
+ "application/json": components["schemas"]["NegotiationError"];
10872
+ };
10873
+ };
10874
+ /** @description Invalid labels */
10875
+ 422: {
10876
+ headers: {
10877
+ [name: string]: unknown;
10878
+ };
10879
+ content: {
10880
+ "application/json": components["schemas"]["UnprocessableEntityError"];
10881
+ };
10882
+ };
10883
+ /** @description Too Many Requests */
10884
+ 429: {
10885
+ headers: {
10886
+ [name: string]: unknown;
10887
+ };
10888
+ content: {
10889
+ "application/json": components["schemas"]["Error"];
10890
+ };
10891
+ };
10892
+ };
10893
+ };
10545
10894
  "FountainWeb.ConversationController.prompt": {
10546
10895
  parameters: {
10547
10896
  query?: never;
@@ -11991,7 +12340,7 @@ export interface operations {
11991
12340
  };
11992
12341
  };
11993
12342
  };
11994
- "FountainWeb.OAuthTokenController.revoke": {
12343
+ "FountainWeb.OAuthClientController.index": {
11995
12344
  parameters: {
11996
12345
  query?: never;
11997
12346
  header?: never;
@@ -12000,14 +12349,16 @@ export interface operations {
12000
12349
  };
12001
12350
  requestBody?: never;
12002
12351
  responses: {
12003
- /** @description Revoked */
12004
- 204: {
12352
+ /** @description Clients */
12353
+ 200: {
12005
12354
  headers: {
12006
12355
  [name: string]: unknown;
12007
12356
  };
12008
- content?: never;
12357
+ content: {
12358
+ "application/json": components["schemas"]["OAuthClientListResponse"];
12359
+ };
12009
12360
  };
12010
- /** @description Unauthorized */
12361
+ /** @description Missing or invalid key */
12011
12362
  401: {
12012
12363
  headers: {
12013
12364
  [name: string]: unknown;
@@ -12016,7 +12367,7 @@ export interface operations {
12016
12367
  "application/json": components["schemas"]["Error"];
12017
12368
  };
12018
12369
  };
12019
- /** @description Forbidden */
12370
+ /** @description Insufficient scope */
12020
12371
  403: {
12021
12372
  headers: {
12022
12373
  [name: string]: unknown;
@@ -12045,32 +12396,381 @@ export interface operations {
12045
12396
  };
12046
12397
  };
12047
12398
  };
12048
- "FountainWeb.OAuthTokenController.token": {
12399
+ "FountainWeb.OAuthClientController.create": {
12049
12400
  parameters: {
12050
12401
  query?: never;
12051
12402
  header?: never;
12052
12403
  path?: never;
12053
12404
  cookie?: never;
12054
12405
  };
12055
- /** @description Token request */
12056
- requestBody?: {
12406
+ /** @description Client */
12407
+ requestBody: {
12057
12408
  content: {
12058
- "application/json": components["schemas"]["OAuthTokenRequest"];
12409
+ "application/json": components["schemas"]["OAuthClientRequest"];
12059
12410
  };
12060
12411
  };
12061
12412
  responses: {
12062
- /** @description Token */
12063
- 200: {
12413
+ /** @description Client */
12414
+ 201: {
12064
12415
  headers: {
12065
12416
  [name: string]: unknown;
12066
12417
  };
12067
12418
  content: {
12068
- "application/json": components["schemas"]["OAuthTokenResponse"];
12419
+ "application/json": components["schemas"]["OAuthClient"];
12069
12420
  };
12070
12421
  };
12071
- /** @description invalid_grant / unsupported_grant_type */
12072
- 400: {
12073
- headers: {
12422
+ /** @description Missing or invalid key */
12423
+ 401: {
12424
+ headers: {
12425
+ [name: string]: unknown;
12426
+ };
12427
+ content: {
12428
+ "application/json": components["schemas"]["Error"];
12429
+ };
12430
+ };
12431
+ /** @description Insufficient scope */
12432
+ 403: {
12433
+ headers: {
12434
+ [name: string]: unknown;
12435
+ };
12436
+ content: {
12437
+ "application/json": components["schemas"]["Error"];
12438
+ };
12439
+ };
12440
+ /** @description No acceptable representation */
12441
+ 406: {
12442
+ headers: {
12443
+ [name: string]: unknown;
12444
+ };
12445
+ content: {
12446
+ "application/json": components["schemas"]["NegotiationError"];
12447
+ };
12448
+ };
12449
+ /** @description Validation error */
12450
+ 422: {
12451
+ headers: {
12452
+ [name: string]: unknown;
12453
+ };
12454
+ content: {
12455
+ "application/json": components["schemas"]["Error"];
12456
+ };
12457
+ };
12458
+ /** @description Too Many Requests */
12459
+ 429: {
12460
+ headers: {
12461
+ [name: string]: unknown;
12462
+ };
12463
+ content: {
12464
+ "application/json": components["schemas"]["Error"];
12465
+ };
12466
+ };
12467
+ };
12468
+ };
12469
+ "FountainWeb.OAuthClientController.show": {
12470
+ parameters: {
12471
+ query?: never;
12472
+ header?: never;
12473
+ path: {
12474
+ /** @description Client record id */
12475
+ id: string;
12476
+ };
12477
+ cookie?: never;
12478
+ };
12479
+ requestBody?: never;
12480
+ responses: {
12481
+ /** @description Client */
12482
+ 200: {
12483
+ headers: {
12484
+ [name: string]: unknown;
12485
+ };
12486
+ content: {
12487
+ "application/json": components["schemas"]["OAuthClient"];
12488
+ };
12489
+ };
12490
+ /** @description Missing or invalid key */
12491
+ 401: {
12492
+ headers: {
12493
+ [name: string]: unknown;
12494
+ };
12495
+ content: {
12496
+ "application/json": components["schemas"]["Error"];
12497
+ };
12498
+ };
12499
+ /** @description Insufficient scope */
12500
+ 403: {
12501
+ headers: {
12502
+ [name: string]: unknown;
12503
+ };
12504
+ content: {
12505
+ "application/json": components["schemas"]["Error"];
12506
+ };
12507
+ };
12508
+ /** @description No such client */
12509
+ 404: {
12510
+ headers: {
12511
+ [name: string]: unknown;
12512
+ };
12513
+ content: {
12514
+ "application/json": components["schemas"]["Error"];
12515
+ };
12516
+ };
12517
+ /** @description No acceptable representation */
12518
+ 406: {
12519
+ headers: {
12520
+ [name: string]: unknown;
12521
+ };
12522
+ content: {
12523
+ "application/json": components["schemas"]["NegotiationError"];
12524
+ };
12525
+ };
12526
+ /** @description Too Many Requests */
12527
+ 429: {
12528
+ headers: {
12529
+ [name: string]: unknown;
12530
+ };
12531
+ content: {
12532
+ "application/json": components["schemas"]["Error"];
12533
+ };
12534
+ };
12535
+ };
12536
+ };
12537
+ "FountainWeb.OAuthClientController.delete": {
12538
+ parameters: {
12539
+ query?: never;
12540
+ header?: never;
12541
+ path: {
12542
+ /** @description Client record id */
12543
+ id: string;
12544
+ };
12545
+ cookie?: never;
12546
+ };
12547
+ requestBody?: never;
12548
+ responses: {
12549
+ /** @description Deleted */
12550
+ 204: {
12551
+ headers: {
12552
+ [name: string]: unknown;
12553
+ };
12554
+ content?: never;
12555
+ };
12556
+ /** @description Missing or invalid key */
12557
+ 401: {
12558
+ headers: {
12559
+ [name: string]: unknown;
12560
+ };
12561
+ content: {
12562
+ "application/json": components["schemas"]["Error"];
12563
+ };
12564
+ };
12565
+ /** @description Insufficient scope */
12566
+ 403: {
12567
+ headers: {
12568
+ [name: string]: unknown;
12569
+ };
12570
+ content: {
12571
+ "application/json": components["schemas"]["Error"];
12572
+ };
12573
+ };
12574
+ /** @description No such client */
12575
+ 404: {
12576
+ headers: {
12577
+ [name: string]: unknown;
12578
+ };
12579
+ content: {
12580
+ "application/json": components["schemas"]["Error"];
12581
+ };
12582
+ };
12583
+ /** @description No acceptable representation */
12584
+ 406: {
12585
+ headers: {
12586
+ [name: string]: unknown;
12587
+ };
12588
+ content: {
12589
+ "application/json": components["schemas"]["NegotiationError"];
12590
+ };
12591
+ };
12592
+ /** @description Refused */
12593
+ 422: {
12594
+ headers: {
12595
+ [name: string]: unknown;
12596
+ };
12597
+ content: {
12598
+ "application/json": components["schemas"]["Error"];
12599
+ };
12600
+ };
12601
+ /** @description Too Many Requests */
12602
+ 429: {
12603
+ headers: {
12604
+ [name: string]: unknown;
12605
+ };
12606
+ content: {
12607
+ "application/json": components["schemas"]["Error"];
12608
+ };
12609
+ };
12610
+ };
12611
+ };
12612
+ "FountainWeb.OAuthClientController.update": {
12613
+ parameters: {
12614
+ query?: never;
12615
+ header?: never;
12616
+ path: {
12617
+ /** @description Client record id */
12618
+ id: string;
12619
+ };
12620
+ cookie?: never;
12621
+ };
12622
+ /** @description Client changes */
12623
+ requestBody: {
12624
+ content: {
12625
+ "application/json": components["schemas"]["OAuthClientUpdateRequest"];
12626
+ };
12627
+ };
12628
+ responses: {
12629
+ /** @description Client */
12630
+ 200: {
12631
+ headers: {
12632
+ [name: string]: unknown;
12633
+ };
12634
+ content: {
12635
+ "application/json": components["schemas"]["OAuthClient"];
12636
+ };
12637
+ };
12638
+ /** @description Missing or invalid key */
12639
+ 401: {
12640
+ headers: {
12641
+ [name: string]: unknown;
12642
+ };
12643
+ content: {
12644
+ "application/json": components["schemas"]["Error"];
12645
+ };
12646
+ };
12647
+ /** @description Insufficient scope */
12648
+ 403: {
12649
+ headers: {
12650
+ [name: string]: unknown;
12651
+ };
12652
+ content: {
12653
+ "application/json": components["schemas"]["Error"];
12654
+ };
12655
+ };
12656
+ /** @description No such client */
12657
+ 404: {
12658
+ headers: {
12659
+ [name: string]: unknown;
12660
+ };
12661
+ content: {
12662
+ "application/json": components["schemas"]["Error"];
12663
+ };
12664
+ };
12665
+ /** @description No acceptable representation */
12666
+ 406: {
12667
+ headers: {
12668
+ [name: string]: unknown;
12669
+ };
12670
+ content: {
12671
+ "application/json": components["schemas"]["NegotiationError"];
12672
+ };
12673
+ };
12674
+ /** @description Validation error */
12675
+ 422: {
12676
+ headers: {
12677
+ [name: string]: unknown;
12678
+ };
12679
+ content: {
12680
+ "application/json": components["schemas"]["Error"];
12681
+ };
12682
+ };
12683
+ /** @description Too Many Requests */
12684
+ 429: {
12685
+ headers: {
12686
+ [name: string]: unknown;
12687
+ };
12688
+ content: {
12689
+ "application/json": components["schemas"]["Error"];
12690
+ };
12691
+ };
12692
+ };
12693
+ };
12694
+ "FountainWeb.OAuthTokenController.revoke": {
12695
+ parameters: {
12696
+ query?: never;
12697
+ header?: never;
12698
+ path?: never;
12699
+ cookie?: never;
12700
+ };
12701
+ requestBody?: never;
12702
+ responses: {
12703
+ /** @description Revoked */
12704
+ 204: {
12705
+ headers: {
12706
+ [name: string]: unknown;
12707
+ };
12708
+ content?: never;
12709
+ };
12710
+ /** @description Unauthorized */
12711
+ 401: {
12712
+ headers: {
12713
+ [name: string]: unknown;
12714
+ };
12715
+ content: {
12716
+ "application/json": components["schemas"]["Error"];
12717
+ };
12718
+ };
12719
+ /** @description Forbidden */
12720
+ 403: {
12721
+ headers: {
12722
+ [name: string]: unknown;
12723
+ };
12724
+ content: {
12725
+ "application/json": components["schemas"]["Error"];
12726
+ };
12727
+ };
12728
+ /** @description No acceptable representation */
12729
+ 406: {
12730
+ headers: {
12731
+ [name: string]: unknown;
12732
+ };
12733
+ content: {
12734
+ "application/json": components["schemas"]["NegotiationError"];
12735
+ };
12736
+ };
12737
+ /** @description Too Many Requests */
12738
+ 429: {
12739
+ headers: {
12740
+ [name: string]: unknown;
12741
+ };
12742
+ content: {
12743
+ "application/json": components["schemas"]["Error"];
12744
+ };
12745
+ };
12746
+ };
12747
+ };
12748
+ "FountainWeb.OAuthTokenController.token": {
12749
+ parameters: {
12750
+ query?: never;
12751
+ header?: never;
12752
+ path?: never;
12753
+ cookie?: never;
12754
+ };
12755
+ /** @description Token request */
12756
+ requestBody?: {
12757
+ content: {
12758
+ "application/json": components["schemas"]["OAuthTokenRequest"];
12759
+ };
12760
+ };
12761
+ responses: {
12762
+ /** @description Token */
12763
+ 200: {
12764
+ headers: {
12765
+ [name: string]: unknown;
12766
+ };
12767
+ content: {
12768
+ "application/json": components["schemas"]["OAuthTokenResponse"];
12769
+ };
12770
+ };
12771
+ /** @description invalid_grant / unsupported_grant_type */
12772
+ 400: {
12773
+ headers: {
12074
12774
  [name: string]: unknown;
12075
12775
  };
12076
12776
  content: {
@@ -12517,7 +13217,7 @@ export interface operations {
12517
13217
  path?: string;
12518
13218
  /** @description Diff the index (`--cached`). */
12519
13219
  staged?: boolean;
12520
- /** @description A commit, branch or tag to diff against instead of HEAD. */
13220
+ /** @description A commit, branch or tag to diff against. Without it the comparison is the working tree against the index, or with `staged`, the index against HEAD. */
12521
13221
  ref?: string;
12522
13222
  /** @description How many bytes to return, at most 4194304 (default 262144). `truncated` says whether the content stopped short. */
12523
13223
  max_bytes?: number;
@@ -12809,6 +13509,105 @@ export interface operations {
12809
13509
  };
12810
13510
  };
12811
13511
  };
13512
+ "FountainWeb.SandboxFilesController.git_status": {
13513
+ parameters: {
13514
+ query?: {
13515
+ /** @description In-sandbox path, absolute or relative to the agent's working directory (`/home/sprite` for claude and codex, `/tmp/gemini-workspace` and `/tmp/opencode-workspace` for the others). Confined to those directories: anything else is `422 path_outside_sandbox`. */
13516
+ path?: string;
13517
+ /** @description What to do about untracked paths: collapse an untracked directory to one entry (`normal`), list every file under it (`all`), or leave them out (`no`). */
13518
+ untracked?: "normal" | "all" | "no";
13519
+ };
13520
+ header?: never;
13521
+ path: {
13522
+ sandbox_id: string;
13523
+ };
13524
+ cookie?: never;
13525
+ };
13526
+ requestBody?: never;
13527
+ responses: {
13528
+ /** @description Status */
13529
+ 200: {
13530
+ headers: {
13531
+ [name: string]: unknown;
13532
+ };
13533
+ content: {
13534
+ "application/json": components["schemas"]["SandboxStatusResponse"];
13535
+ };
13536
+ };
13537
+ /** @description Unauthorized */
13538
+ 401: {
13539
+ headers: {
13540
+ [name: string]: unknown;
13541
+ };
13542
+ content: {
13543
+ "application/json": components["schemas"]["Error"];
13544
+ };
13545
+ };
13546
+ /** @description Insufficient scope */
13547
+ 403: {
13548
+ headers: {
13549
+ [name: string]: unknown;
13550
+ };
13551
+ content: {
13552
+ "application/json": components["schemas"]["Error"];
13553
+ };
13554
+ };
13555
+ /** @description No such sandbox or path */
13556
+ 404: {
13557
+ headers: {
13558
+ [name: string]: unknown;
13559
+ };
13560
+ content: {
13561
+ "application/json": components["schemas"]["Error"];
13562
+ };
13563
+ };
13564
+ /** @description No acceptable representation */
13565
+ 406: {
13566
+ headers: {
13567
+ [name: string]: unknown;
13568
+ };
13569
+ content: {
13570
+ "application/json": components["schemas"]["NegotiationError"];
13571
+ };
13572
+ };
13573
+ /** @description Sandbox is not ready */
13574
+ 409: {
13575
+ headers: {
13576
+ [name: string]: unknown;
13577
+ };
13578
+ content: {
13579
+ "application/json": components["schemas"]["Error"];
13580
+ };
13581
+ };
13582
+ /** @description Not a repository, or outside the sandbox */
13583
+ 422: {
13584
+ headers: {
13585
+ [name: string]: unknown;
13586
+ };
13587
+ content: {
13588
+ "application/json": components["schemas"]["Error"];
13589
+ };
13590
+ };
13591
+ /** @description Too Many Requests */
13592
+ 429: {
13593
+ headers: {
13594
+ [name: string]: unknown;
13595
+ };
13596
+ content: {
13597
+ "application/json": components["schemas"]["Error"];
13598
+ };
13599
+ };
13600
+ /** @description Sandbox provider unreachable */
13601
+ 503: {
13602
+ headers: {
13603
+ [name: string]: unknown;
13604
+ };
13605
+ content: {
13606
+ "application/json": components["schemas"]["Error"];
13607
+ };
13608
+ };
13609
+ };
13610
+ };
12812
13611
  "FountainWeb.SearchController.index": {
12813
13612
  parameters: {
12814
13613
  query: {
@@ -14246,7 +15045,10 @@ export interface operations {
14246
15045
  };
14247
15046
  "FountainWeb.TeamController.conversations": {
14248
15047
  parameters: {
14249
- query?: never;
15048
+ query?: {
15049
+ /** @description Only conversations carrying these `key:value` labels (#1637). Repeatable and AND-combined, exactly as on `GET /api/conversations`. 400 `invalid_label_filter` on a value with no colon or an empty key. */
15050
+ label?: string[];
15051
+ };
14250
15052
  header?: never;
14251
15053
  path: {
14252
15054
  agent_id: string;
@@ -14264,6 +15066,15 @@ export interface operations {
14264
15066
  "application/json": components["schemas"]["TeammateConversationListResponse"];
14265
15067
  };
14266
15068
  };
15069
+ /** @description Invalid label filter */
15070
+ 400: {
15071
+ headers: {
15072
+ [name: string]: unknown;
15073
+ };
15074
+ content: {
15075
+ "application/json": components["schemas"]["Error"];
15076
+ };
15077
+ };
14267
15078
  /** @description Unauthorized */
14268
15079
  401: {
14269
15080
  headers: {
@@ -14439,7 +15250,7 @@ export interface operations {
14439
15250
  "application/json": components["schemas"]["Error"];
14440
15251
  };
14441
15252
  };
14442
- /** @description Forbidden */
15253
+ /** @description A sandbox token labelling another conversation */
14443
15254
  403: {
14444
15255
  headers: {
14445
15256
  [name: string]: unknown;
@@ -14466,6 +15277,15 @@ export interface operations {
14466
15277
  "application/json": components["schemas"]["NegotiationError"];
14467
15278
  };
14468
15279
  };
15280
+ /** @description Invalid labels */
15281
+ 422: {
15282
+ headers: {
15283
+ [name: string]: unknown;
15284
+ };
15285
+ content: {
15286
+ "application/json": components["schemas"]["ChangesetError"];
15287
+ };
15288
+ };
14469
15289
  /** @description Too Many Requests */
14470
15290
  429: {
14471
15291
  headers: {