@managoat/fountain-sdk 1.27.0 → 1.29.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.
@@ -1306,6 +1306,8 @@ export interface paths {
1306
1306
  * @description Answers a `session/request_permission` the agent is blocked on (#940). The request and its options arrive as a `permission_request` block on the conversation's event stream; `option_id` must be one of the `optionId` values that block carried. Never send an option the agent did not offer.
1307
1307
  *
1308
1308
  * First answer wins: another attached client, the timeout, or the turn ending may already have resolved it, and all of those return 409. The resolution appears on the stream as a `request` stage event with state `done`.
1309
+ *
1310
+ * A request that outlived its turn (#1635) is answered here too. The agent ended that turn with stop reason `waiting`, so the conversation is idle and the sandbox may be suspended; GET /api/conversations/{id} lists such requests as `pending_requests`. Answering one resolves it and opens a new turn carrying the request id and the option, which wakes the sandbox.
1309
1311
  */
1310
1312
  post: operations["FountainWeb.ConversationController.answer_request"];
1311
1313
  delete?: never;
@@ -1538,6 +1540,55 @@ export interface paths {
1538
1540
  patch?: never;
1539
1541
  trace?: never;
1540
1542
  };
1543
+ "/api/oauth/clients": {
1544
+ parameters: {
1545
+ query?: never;
1546
+ header?: never;
1547
+ path?: never;
1548
+ cookie?: never;
1549
+ };
1550
+ /**
1551
+ * List OAuth clients
1552
+ * @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.
1553
+ */
1554
+ get: operations["FountainWeb.OAuthClientController.index"];
1555
+ put?: never;
1556
+ /**
1557
+ * Register an OAuth client
1558
+ * @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.
1559
+ */
1560
+ post: operations["FountainWeb.OAuthClientController.create"];
1561
+ delete?: never;
1562
+ options?: never;
1563
+ head?: never;
1564
+ patch?: never;
1565
+ trace?: never;
1566
+ };
1567
+ "/api/oauth/clients/{id}": {
1568
+ parameters: {
1569
+ query?: never;
1570
+ header?: never;
1571
+ path?: never;
1572
+ cookie?: never;
1573
+ };
1574
+ /** Get an OAuth client */
1575
+ get: operations["FountainWeb.OAuthClientController.show"];
1576
+ put?: never;
1577
+ post?: never;
1578
+ /**
1579
+ * Unregister an OAuth client
1580
+ * @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.
1581
+ */
1582
+ delete: operations["FountainWeb.OAuthClientController.delete"];
1583
+ options?: never;
1584
+ head?: never;
1585
+ /**
1586
+ * Change an OAuth client
1587
+ * @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.
1588
+ */
1589
+ patch: operations["FountainWeb.OAuthClientController.update"];
1590
+ trace?: never;
1591
+ };
1541
1592
  "/api/oauth/revoke": {
1542
1593
  parameters: {
1543
1594
  query?: never;
@@ -1638,6 +1689,50 @@ export interface paths {
1638
1689
  patch?: never;
1639
1690
  trace?: never;
1640
1691
  };
1692
+ "/api/sandbox-queue": {
1693
+ parameters: {
1694
+ query?: never;
1695
+ header?: never;
1696
+ path?: never;
1697
+ cookie?: never;
1698
+ };
1699
+ /**
1700
+ * List queued sandbox requests
1701
+ * @description The caller's waiting requests, oldest first, each with its one-based position. Only requests that are still waiting appear here. One the drainer has already claimed is not listed, and neither is one that finished; read either by id instead.
1702
+ */
1703
+ get: operations["FountainWeb.SandboxQueueController.index"];
1704
+ put?: never;
1705
+ post?: never;
1706
+ delete?: never;
1707
+ options?: never;
1708
+ head?: never;
1709
+ patch?: never;
1710
+ trace?: never;
1711
+ };
1712
+ "/api/sandbox-queue/{id}": {
1713
+ parameters: {
1714
+ query?: never;
1715
+ header?: never;
1716
+ path?: never;
1717
+ cookie?: never;
1718
+ };
1719
+ /**
1720
+ * Get a sandbox request
1721
+ * @description The request's current status. `conversation_id` is set once it started; `error` says why if it failed. A request nobody else owns reads as 404.
1722
+ */
1723
+ get: operations["FountainWeb.SandboxQueueController.show"];
1724
+ put?: never;
1725
+ post?: never;
1726
+ /**
1727
+ * Cancel a queued sandbox request
1728
+ * @description Gives up a request that is still waiting. A request the drainer has already claimed reads as 404 rather than being cancelled out from under a start in flight.
1729
+ */
1730
+ delete: operations["FountainWeb.SandboxQueueController.delete"];
1731
+ options?: never;
1732
+ head?: never;
1733
+ patch?: never;
1734
+ trace?: never;
1735
+ };
1641
1736
  "/api/sandboxes": {
1642
1737
  parameters: {
1643
1738
  query?: never;
@@ -1708,7 +1803,7 @@ export interface paths {
1708
1803
  };
1709
1804
  /**
1710
1805
  * Read a file on a sandbox
1711
- * @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.
1806
+ * @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.
1712
1807
  */
1713
1808
  get: operations["FountainWeb.SandboxFilesController.show"];
1714
1809
  put?: never;
@@ -1739,6 +1834,26 @@ export interface paths {
1739
1834
  patch?: never;
1740
1835
  trace?: never;
1741
1836
  };
1837
+ "/api/sandboxes/{sandbox_id}/git-status": {
1838
+ parameters: {
1839
+ query?: never;
1840
+ header?: never;
1841
+ path?: never;
1842
+ cookie?: never;
1843
+ };
1844
+ /**
1845
+ * git status on a sandbox
1846
+ * @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.
1847
+ */
1848
+ get: operations["FountainWeb.SandboxFilesController.git_status"];
1849
+ put?: never;
1850
+ post?: never;
1851
+ delete?: never;
1852
+ options?: never;
1853
+ head?: never;
1854
+ patch?: never;
1855
+ trace?: never;
1856
+ };
1742
1857
  "/api/search": {
1743
1858
  parameters: {
1744
1859
  query?: never;
@@ -2615,9 +2730,12 @@ export interface components {
2615
2730
  model: string | null;
2616
2731
  name: string;
2617
2732
  /** @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. */
2618
- permission_policy?: {
2619
- [key: string]: "auto_allow" | "ask" | "auto_deny";
2620
- } | null;
2733
+ permission_policy?: ({
2734
+ /** @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. */
2735
+ ask_timeout?: number;
2736
+ } & {
2737
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
2738
+ }) | null;
2621
2739
  /** @enum {string} */
2622
2740
  runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2623
2741
  /** @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. */
@@ -2670,9 +2788,12 @@ export interface components {
2670
2788
  model?: string | null;
2671
2789
  name: string;
2672
2790
  /** @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. */
2673
- permission_policy?: {
2674
- [key: string]: "auto_allow" | "ask" | "auto_deny";
2675
- } | null;
2791
+ permission_policy?: ({
2792
+ /** @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. */
2793
+ ask_timeout?: number;
2794
+ } & {
2795
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
2796
+ }) | null;
2676
2797
  /** @enum {string} */
2677
2798
  runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2678
2799
  /** @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. */
@@ -2722,9 +2843,12 @@ export interface components {
2722
2843
  model?: string | null;
2723
2844
  name?: string;
2724
2845
  /** @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. */
2725
- permission_policy?: {
2726
- [key: string]: "auto_allow" | "ask" | "auto_deny";
2727
- } | null;
2846
+ permission_policy?: ({
2847
+ /** @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. */
2848
+ ask_timeout?: number;
2849
+ } & {
2850
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
2851
+ }) | null;
2728
2852
  /** @enum {string} */
2729
2853
  runtime?: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2730
2854
  /** @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. */
@@ -3540,10 +3664,15 @@ export interface components {
3540
3664
  last_read_at?: string | null;
3541
3665
  /** Format: uuid */
3542
3666
  parent_conversation_id?: string | null;
3667
+ /** @description Permission requests that outlived a turn and are still waiting for an answer (#1635). Served on GET /api/conversations/{id} only; absent from the list and from the create response. */
3668
+ pending_requests?: components["schemas"]["PendingPermissionRequest"][];
3543
3669
  /** @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. */
3544
- permission_policy?: {
3545
- [key: string]: "auto_allow" | "ask" | "auto_deny";
3546
- } | null;
3670
+ permission_policy?: ({
3671
+ /** @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. */
3672
+ ask_timeout?: number;
3673
+ } & {
3674
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
3675
+ }) | null;
3547
3676
  /** @enum {string} */
3548
3677
  runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
3549
3678
  runtime_session_id?: string | null;
@@ -3583,18 +3712,23 @@ export interface components {
3583
3712
  environment_id?: string | null;
3584
3713
  /** @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. */
3585
3714
  fresh?: boolean | null;
3586
- /** @description Optional images to attach to the initial prompt. */
3715
+ /** @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. */
3587
3716
  images?: components["schemas"]["ImageInput"][] | null;
3588
3717
  /** @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. */
3589
3718
  labels?: {
3590
3719
  [key: string]: string;
3591
3720
  } | null;
3592
3721
  /** @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. */
3593
- permission_policy?: {
3594
- [key: string]: "auto_allow" | "ask" | "auto_deny";
3595
- } | null;
3596
- /** @description Optional first turn prompt. */
3722
+ permission_policy?: ({
3723
+ /** @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. */
3724
+ ask_timeout?: number;
3725
+ } & {
3726
+ [key: string]: ("auto_allow" | "ask" | "auto_deny") | number;
3727
+ }) | null;
3728
+ /** @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. */
3597
3729
  prompt?: string;
3730
+ /** @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. */
3731
+ queue?: boolean | null;
3598
3732
  /**
3599
3733
  * @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.
3600
3734
  * @enum {string}
@@ -3997,6 +4131,56 @@ export interface components {
3997
4131
  detail: string;
3998
4132
  };
3999
4133
  };
4134
+ /**
4135
+ * OAuthClient
4136
+ * @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.
4137
+ */
4138
+ OAuthClient: {
4139
+ /** @description The client_id sent to /oauth/authorize. */
4140
+ client_id: string;
4141
+ /** Format: date-time */
4142
+ created_at: string;
4143
+ /** Format: uuid */
4144
+ id: string;
4145
+ /** @description Shown on the consent page. */
4146
+ name: string;
4147
+ /** @description Origins derived from redirect_uris and admitted by CORS. A loopback origin is admitted on any port, not only the port shown here. */
4148
+ origins: string[];
4149
+ /** @description False means development mode with owner-only sign-in. */
4150
+ published: boolean;
4151
+ /** @description Exact match, except that an unpublished loopback URI matches on any port. */
4152
+ redirect_uris: string[];
4153
+ /** Format: date-time */
4154
+ updated_at: string;
4155
+ };
4156
+ /** OAuthClientListResponse */
4157
+ OAuthClientListResponse: {
4158
+ data: components["schemas"]["OAuthClient"][];
4159
+ };
4160
+ /**
4161
+ * OAuthClientRequest
4162
+ * @example {
4163
+ * "name": "Notes",
4164
+ * "redirect_uris": [
4165
+ * "https://abc123.sprites.app/callback",
4166
+ * "http://localhost:5173/callback"
4167
+ * ]
4168
+ * }
4169
+ */
4170
+ OAuthClientRequest: {
4171
+ name: string;
4172
+ redirect_uris: string[];
4173
+ };
4174
+ /**
4175
+ * OAuthClientUpdateRequest
4176
+ * @example {
4177
+ * "name": "Notes for Fountain"
4178
+ * }
4179
+ */
4180
+ OAuthClientUpdateRequest: {
4181
+ name?: string;
4182
+ redirect_uris?: string[];
4183
+ };
4000
4184
  /** OAuthTokenRequest */
4001
4185
  OAuthTokenRequest: {
4002
4186
  client_id: string;
@@ -4056,6 +4240,28 @@ export interface components {
4056
4240
  /** @description From the reset email. */
4057
4241
  token: string;
4058
4242
  };
4243
+ /**
4244
+ * PendingPermissionRequest
4245
+ * @description A permission request that outlived its turn (#1635). The agent ended the turn with stop reason `waiting` while this request was open, so the conversation is idle, the sandbox may be suspended, and the request is still waiting for an answer. Answer it at POST /api/conversations/{id}/requests/{request_id}, which resolves it and opens a new turn carrying the outcome to the agent.
4246
+ */
4247
+ PendingPermissionRequest: {
4248
+ /** Format: date-time */
4249
+ asked_at?: string | null;
4250
+ /**
4251
+ * Format: date-time
4252
+ * @description When the request is denied for want of an answer. Set from the request's own `_meta.fountain.timeout`, else the policy's `ask_timeout`, else the global ask timeout.
4253
+ */
4254
+ deadline?: string | null;
4255
+ /** @description The options the agent offered, verbatim. `option_id` must be one of these `optionId` values; an id from another runtime is refused. */
4256
+ options: {
4257
+ [key: string]: unknown;
4258
+ }[];
4259
+ request_id: string;
4260
+ /** @description The tool the agent asked about, as the transcript labels it. */
4261
+ tool?: string | null;
4262
+ /** Format: uuid */
4263
+ turn_id?: string;
4264
+ };
4059
4265
  /** PermissionAnswerRequest */
4060
4266
  PermissionAnswerRequest: {
4061
4267
  /** @description One of the `optionId` values from the request's own `options` list, as carried on the `permission_request` block. An id the agent did not offer is refused (422 unknown_option) rather than forwarded. */
@@ -4211,6 +4417,26 @@ export interface components {
4211
4417
  /** Format: uuid */
4212
4418
  vault_id?: string | null;
4213
4419
  };
4420
+ /**
4421
+ * SandboxChange
4422
+ * @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.
4423
+ */
4424
+ SandboxChange: {
4425
+ /**
4426
+ * @description The staged side: what a commit would record.
4427
+ * @enum {string}
4428
+ */
4429
+ index: "added" | "copied" | "deleted" | "ignored" | "modified" | "renamed" | "type_changed" | "unchanged" | "unmerged" | "untracked";
4430
+ /** @description Relative to `repo_root`. */
4431
+ path: string;
4432
+ /** @description The old path, when that side is a rename or a copy; null otherwise. */
4433
+ renamed_from?: string | null;
4434
+ /**
4435
+ * @description The unstaged side: what the disk holds beyond the index.
4436
+ * @enum {string}
4437
+ */
4438
+ worktree: "added" | "copied" | "deleted" | "ignored" | "modified" | "renamed" | "type_changed" | "unchanged" | "unmerged" | "untracked";
4439
+ };
4214
4440
  /**
4215
4441
  * SandboxConversation
4216
4442
  * @description A conversation on a sandbox, as the sandbox lists it.
@@ -4292,13 +4518,13 @@ export interface components {
4292
4518
  diff: string;
4293
4519
  /** @description The directory the diff was asked for, absolute. */
4294
4520
  path: string;
4295
- /** @description The revision diffed against, or null for HEAD. */
4521
+ /** @description The revision diffed against, or null when the caller named none. */
4296
4522
  ref?: string | null;
4297
4523
  /** @description The repository's top-level directory. */
4298
4524
  repo_root: string;
4299
4525
  /** @description True when the index was diffed (`--cached`). */
4300
4526
  staged: boolean;
4301
- /** @description True when `diff` stopped at `max_bytes` before the end. */
4527
+ /** @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. */
4302
4528
  truncated: boolean;
4303
4529
  };
4304
4530
  /** SandboxDiffResponse */
@@ -4331,7 +4557,7 @@ export interface components {
4331
4557
  path: string;
4332
4558
  /** @description The whole file, in bytes. */
4333
4559
  size: number;
4334
- /** @description True when `content` stopped at `max_bytes` before the end of the file. */
4560
+ /** @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. */
4335
4561
  truncated: boolean;
4336
4562
  };
4337
4563
  /** SandboxFileResponse */
@@ -4357,10 +4583,67 @@ export interface components {
4357
4583
  SandboxListingResponse: {
4358
4584
  data: components["schemas"]["SandboxListing"];
4359
4585
  };
4586
+ /**
4587
+ * SandboxRequest
4588
+ * @description Work waiting for sandbox capacity (ADR 0042).
4589
+ */
4590
+ SandboxRequest: {
4591
+ /** Format: uuid */
4592
+ agent_id: string;
4593
+ /**
4594
+ * Format: uuid
4595
+ * @description The conversation the request became, once it started.
4596
+ */
4597
+ conversation_id?: string | null;
4598
+ error?: string | null;
4599
+ /** Format: uuid */
4600
+ id: string;
4601
+ /** Format: date-time */
4602
+ inserted_at?: string;
4603
+ /** @enum {string} */
4604
+ kind: "start" | "schedule_run";
4605
+ /** @description One-based place in the tenant's queue; null once it stops waiting. */
4606
+ position?: number | null;
4607
+ source?: string | null;
4608
+ /** @enum {string} */
4609
+ status: "queued" | "starting" | "started" | "cancelled" | "expired" | "failed";
4610
+ };
4611
+ /** SandboxRequestListResponse */
4612
+ SandboxRequestListResponse: {
4613
+ data: components["schemas"]["SandboxRequest"][];
4614
+ };
4615
+ /** SandboxRequestResponse */
4616
+ SandboxRequestResponse: {
4617
+ data: components["schemas"]["SandboxRequest"];
4618
+ };
4360
4619
  /** SandboxResponse */
4361
4620
  SandboxResponse: {
4362
4621
  data: components["schemas"]["SandboxDetail"];
4363
4622
  };
4623
+ /**
4624
+ * SandboxStatus
4625
+ * @description `git status` of a repository on a sandbox, one entry per changed path.
4626
+ */
4627
+ SandboxStatus: {
4628
+ /** @description The checked-out branch, or null on a detached HEAD. */
4629
+ branch?: string | null;
4630
+ entries: components["schemas"]["SandboxChange"][];
4631
+ /** @description The directory the status was asked for, absolute. */
4632
+ path: string;
4633
+ /** @description The repository's top-level directory. */
4634
+ repo_root: string;
4635
+ /** @description True when the repository holds more changes than were returned. */
4636
+ truncated: boolean;
4637
+ /**
4638
+ * @description What was asked about untracked paths.
4639
+ * @enum {string}
4640
+ */
4641
+ untracked: "normal" | "all" | "no";
4642
+ };
4643
+ /** SandboxStatusResponse */
4644
+ SandboxStatusResponse: {
4645
+ data: components["schemas"]["SandboxStatus"];
4646
+ };
4364
4647
  /**
4365
4648
  * SearchHit
4366
4649
  * @description One search hit: what matched, and where to jump.
@@ -4806,6 +5089,8 @@ export interface components {
4806
5089
  turn_number: number;
4807
5090
  /** @description The end-of-turn token figure; null while the turn runs, when the runtime reported none, or on turns that predate the field. */
4808
5091
  usage?: components["schemas"]["TurnUsage"] | null;
5092
+ /** @description The turn ended with a permission request still open (#1635): the agent answered with stop reason `waiting`, the turn is `completed` and the request is on the conversation as a `pending_requests` entry. */
5093
+ waiting?: boolean;
4809
5094
  };
4810
5095
  /** TurnListResponse */
4811
5096
  TurnListResponse: {
@@ -10248,6 +10533,15 @@ export interface operations {
10248
10533
  "application/json": components["schemas"]["ConversationResponse"];
10249
10534
  };
10250
10535
  };
10536
+ /** @description Queued for sandbox capacity */
10537
+ 202: {
10538
+ headers: {
10539
+ [name: string]: unknown;
10540
+ };
10541
+ content: {
10542
+ "application/json": components["schemas"]["SandboxRequestResponse"];
10543
+ };
10544
+ };
10251
10545
  /** @description Invalid request */
10252
10546
  400: {
10253
10547
  headers: {
@@ -10323,7 +10617,7 @@ export interface operations {
10323
10617
  "application/json": components["schemas"]["UnprocessableEntityError"];
10324
10618
  };
10325
10619
  };
10326
- /** @description Too Many Requests */
10620
+ /** @description Tenant concurrency cap reached */
10327
10621
  429: {
10328
10622
  headers: {
10329
10623
  [name: string]: unknown;
@@ -10881,6 +11175,15 @@ export interface operations {
10881
11175
  "application/json": components["schemas"]["PermissionAnswerResponse"];
10882
11176
  };
10883
11177
  };
11178
+ /** @description Busy */
11179
+ 400: {
11180
+ headers: {
11181
+ [name: string]: unknown;
11182
+ };
11183
+ content: {
11184
+ "application/json": components["schemas"]["Error"];
11185
+ };
11186
+ };
10884
11187
  /** @description Unauthorized */
10885
11188
  401: {
10886
11189
  headers: {
@@ -10890,7 +11193,16 @@ export interface operations {
10890
11193
  "application/json": components["schemas"]["Error"];
10891
11194
  };
10892
11195
  };
10893
- /** @description Forbidden */
11196
+ /** @description Insufficient credits */
11197
+ 402: {
11198
+ headers: {
11199
+ [name: string]: unknown;
11200
+ };
11201
+ content: {
11202
+ "application/json": components["schemas"]["Error"];
11203
+ };
11204
+ };
11205
+ /** @description The sandbox may not answer */
10894
11206
  403: {
10895
11207
  headers: {
10896
11208
  [name: string]: unknown;
@@ -10917,7 +11229,7 @@ export interface operations {
10917
11229
  "application/json": components["schemas"]["NegotiationError"];
10918
11230
  };
10919
11231
  };
10920
- /** @description Already resolved */
11232
+ /** @description Already resolved, or resolved but not delivered */
10921
11233
  409: {
10922
11234
  headers: {
10923
11235
  [name: string]: unknown;
@@ -12122,7 +12434,7 @@ export interface operations {
12122
12434
  };
12123
12435
  };
12124
12436
  };
12125
- "FountainWeb.OAuthTokenController.revoke": {
12437
+ "FountainWeb.OAuthClientController.index": {
12126
12438
  parameters: {
12127
12439
  query?: never;
12128
12440
  header?: never;
@@ -12131,14 +12443,16 @@ export interface operations {
12131
12443
  };
12132
12444
  requestBody?: never;
12133
12445
  responses: {
12134
- /** @description Revoked */
12135
- 204: {
12446
+ /** @description Clients */
12447
+ 200: {
12136
12448
  headers: {
12137
12449
  [name: string]: unknown;
12138
12450
  };
12139
- content?: never;
12451
+ content: {
12452
+ "application/json": components["schemas"]["OAuthClientListResponse"];
12453
+ };
12140
12454
  };
12141
- /** @description Unauthorized */
12455
+ /** @description Missing or invalid key */
12142
12456
  401: {
12143
12457
  headers: {
12144
12458
  [name: string]: unknown;
@@ -12147,7 +12461,7 @@ export interface operations {
12147
12461
  "application/json": components["schemas"]["Error"];
12148
12462
  };
12149
12463
  };
12150
- /** @description Forbidden */
12464
+ /** @description Insufficient scope */
12151
12465
  403: {
12152
12466
  headers: {
12153
12467
  [name: string]: unknown;
@@ -12176,31 +12490,40 @@ export interface operations {
12176
12490
  };
12177
12491
  };
12178
12492
  };
12179
- "FountainWeb.OAuthTokenController.token": {
12493
+ "FountainWeb.OAuthClientController.create": {
12180
12494
  parameters: {
12181
12495
  query?: never;
12182
12496
  header?: never;
12183
12497
  path?: never;
12184
12498
  cookie?: never;
12185
12499
  };
12186
- /** @description Token request */
12187
- requestBody?: {
12500
+ /** @description Client */
12501
+ requestBody: {
12188
12502
  content: {
12189
- "application/json": components["schemas"]["OAuthTokenRequest"];
12503
+ "application/json": components["schemas"]["OAuthClientRequest"];
12190
12504
  };
12191
12505
  };
12192
12506
  responses: {
12193
- /** @description Token */
12194
- 200: {
12507
+ /** @description Client */
12508
+ 201: {
12195
12509
  headers: {
12196
12510
  [name: string]: unknown;
12197
12511
  };
12198
12512
  content: {
12199
- "application/json": components["schemas"]["OAuthTokenResponse"];
12513
+ "application/json": components["schemas"]["OAuthClient"];
12200
12514
  };
12201
12515
  };
12202
- /** @description invalid_grant / unsupported_grant_type */
12203
- 400: {
12516
+ /** @description Missing or invalid key */
12517
+ 401: {
12518
+ headers: {
12519
+ [name: string]: unknown;
12520
+ };
12521
+ content: {
12522
+ "application/json": components["schemas"]["Error"];
12523
+ };
12524
+ };
12525
+ /** @description Insufficient scope */
12526
+ 403: {
12204
12527
  headers: {
12205
12528
  [name: string]: unknown;
12206
12529
  };
@@ -12217,24 +12540,45 @@ export interface operations {
12217
12540
  "application/json": components["schemas"]["NegotiationError"];
12218
12541
  };
12219
12542
  };
12543
+ /** @description Validation error */
12544
+ 422: {
12545
+ headers: {
12546
+ [name: string]: unknown;
12547
+ };
12548
+ content: {
12549
+ "application/json": components["schemas"]["Error"];
12550
+ };
12551
+ };
12552
+ /** @description Too Many Requests */
12553
+ 429: {
12554
+ headers: {
12555
+ [name: string]: unknown;
12556
+ };
12557
+ content: {
12558
+ "application/json": components["schemas"]["Error"];
12559
+ };
12560
+ };
12220
12561
  };
12221
12562
  };
12222
- "FountainWeb.RunnerController.index": {
12563
+ "FountainWeb.OAuthClientController.show": {
12223
12564
  parameters: {
12224
12565
  query?: never;
12225
12566
  header?: never;
12226
- path?: never;
12567
+ path: {
12568
+ /** @description Client record id */
12569
+ id: string;
12570
+ };
12227
12571
  cookie?: never;
12228
12572
  };
12229
12573
  requestBody?: never;
12230
12574
  responses: {
12231
- /** @description Runners */
12575
+ /** @description Client */
12232
12576
  200: {
12233
12577
  headers: {
12234
12578
  [name: string]: unknown;
12235
12579
  };
12236
12580
  content: {
12237
- "application/json": components["schemas"]["RunnerListResponse"];
12581
+ "application/json": components["schemas"]["OAuthClient"];
12238
12582
  };
12239
12583
  };
12240
12584
  /** @description Missing or invalid key */
@@ -12246,7 +12590,7 @@ export interface operations {
12246
12590
  "application/json": components["schemas"]["Error"];
12247
12591
  };
12248
12592
  };
12249
- /** @description Forbidden */
12593
+ /** @description Insufficient scope */
12250
12594
  403: {
12251
12595
  headers: {
12252
12596
  [name: string]: unknown;
@@ -12255,13 +12599,414 @@ export interface operations {
12255
12599
  "application/json": components["schemas"]["Error"];
12256
12600
  };
12257
12601
  };
12258
- /** @description No acceptable representation */
12259
- 406: {
12602
+ /** @description No such client */
12603
+ 404: {
12260
12604
  headers: {
12261
12605
  [name: string]: unknown;
12262
12606
  };
12263
12607
  content: {
12264
- "application/json": components["schemas"]["NegotiationError"];
12608
+ "application/json": components["schemas"]["Error"];
12609
+ };
12610
+ };
12611
+ /** @description No acceptable representation */
12612
+ 406: {
12613
+ headers: {
12614
+ [name: string]: unknown;
12615
+ };
12616
+ content: {
12617
+ "application/json": components["schemas"]["NegotiationError"];
12618
+ };
12619
+ };
12620
+ /** @description Too Many Requests */
12621
+ 429: {
12622
+ headers: {
12623
+ [name: string]: unknown;
12624
+ };
12625
+ content: {
12626
+ "application/json": components["schemas"]["Error"];
12627
+ };
12628
+ };
12629
+ };
12630
+ };
12631
+ "FountainWeb.OAuthClientController.delete": {
12632
+ parameters: {
12633
+ query?: never;
12634
+ header?: never;
12635
+ path: {
12636
+ /** @description Client record id */
12637
+ id: string;
12638
+ };
12639
+ cookie?: never;
12640
+ };
12641
+ requestBody?: never;
12642
+ responses: {
12643
+ /** @description Deleted */
12644
+ 204: {
12645
+ headers: {
12646
+ [name: string]: unknown;
12647
+ };
12648
+ content?: never;
12649
+ };
12650
+ /** @description Missing or invalid key */
12651
+ 401: {
12652
+ headers: {
12653
+ [name: string]: unknown;
12654
+ };
12655
+ content: {
12656
+ "application/json": components["schemas"]["Error"];
12657
+ };
12658
+ };
12659
+ /** @description Insufficient scope */
12660
+ 403: {
12661
+ headers: {
12662
+ [name: string]: unknown;
12663
+ };
12664
+ content: {
12665
+ "application/json": components["schemas"]["Error"];
12666
+ };
12667
+ };
12668
+ /** @description No such client */
12669
+ 404: {
12670
+ headers: {
12671
+ [name: string]: unknown;
12672
+ };
12673
+ content: {
12674
+ "application/json": components["schemas"]["Error"];
12675
+ };
12676
+ };
12677
+ /** @description No acceptable representation */
12678
+ 406: {
12679
+ headers: {
12680
+ [name: string]: unknown;
12681
+ };
12682
+ content: {
12683
+ "application/json": components["schemas"]["NegotiationError"];
12684
+ };
12685
+ };
12686
+ /** @description Refused */
12687
+ 422: {
12688
+ headers: {
12689
+ [name: string]: unknown;
12690
+ };
12691
+ content: {
12692
+ "application/json": components["schemas"]["Error"];
12693
+ };
12694
+ };
12695
+ /** @description Too Many Requests */
12696
+ 429: {
12697
+ headers: {
12698
+ [name: string]: unknown;
12699
+ };
12700
+ content: {
12701
+ "application/json": components["schemas"]["Error"];
12702
+ };
12703
+ };
12704
+ };
12705
+ };
12706
+ "FountainWeb.OAuthClientController.update": {
12707
+ parameters: {
12708
+ query?: never;
12709
+ header?: never;
12710
+ path: {
12711
+ /** @description Client record id */
12712
+ id: string;
12713
+ };
12714
+ cookie?: never;
12715
+ };
12716
+ /** @description Client changes */
12717
+ requestBody: {
12718
+ content: {
12719
+ "application/json": components["schemas"]["OAuthClientUpdateRequest"];
12720
+ };
12721
+ };
12722
+ responses: {
12723
+ /** @description Client */
12724
+ 200: {
12725
+ headers: {
12726
+ [name: string]: unknown;
12727
+ };
12728
+ content: {
12729
+ "application/json": components["schemas"]["OAuthClient"];
12730
+ };
12731
+ };
12732
+ /** @description Missing or invalid key */
12733
+ 401: {
12734
+ headers: {
12735
+ [name: string]: unknown;
12736
+ };
12737
+ content: {
12738
+ "application/json": components["schemas"]["Error"];
12739
+ };
12740
+ };
12741
+ /** @description Insufficient scope */
12742
+ 403: {
12743
+ headers: {
12744
+ [name: string]: unknown;
12745
+ };
12746
+ content: {
12747
+ "application/json": components["schemas"]["Error"];
12748
+ };
12749
+ };
12750
+ /** @description No such client */
12751
+ 404: {
12752
+ headers: {
12753
+ [name: string]: unknown;
12754
+ };
12755
+ content: {
12756
+ "application/json": components["schemas"]["Error"];
12757
+ };
12758
+ };
12759
+ /** @description No acceptable representation */
12760
+ 406: {
12761
+ headers: {
12762
+ [name: string]: unknown;
12763
+ };
12764
+ content: {
12765
+ "application/json": components["schemas"]["NegotiationError"];
12766
+ };
12767
+ };
12768
+ /** @description Validation error */
12769
+ 422: {
12770
+ headers: {
12771
+ [name: string]: unknown;
12772
+ };
12773
+ content: {
12774
+ "application/json": components["schemas"]["Error"];
12775
+ };
12776
+ };
12777
+ /** @description Too Many Requests */
12778
+ 429: {
12779
+ headers: {
12780
+ [name: string]: unknown;
12781
+ };
12782
+ content: {
12783
+ "application/json": components["schemas"]["Error"];
12784
+ };
12785
+ };
12786
+ };
12787
+ };
12788
+ "FountainWeb.OAuthTokenController.revoke": {
12789
+ parameters: {
12790
+ query?: never;
12791
+ header?: never;
12792
+ path?: never;
12793
+ cookie?: never;
12794
+ };
12795
+ requestBody?: never;
12796
+ responses: {
12797
+ /** @description Revoked */
12798
+ 204: {
12799
+ headers: {
12800
+ [name: string]: unknown;
12801
+ };
12802
+ content?: never;
12803
+ };
12804
+ /** @description Unauthorized */
12805
+ 401: {
12806
+ headers: {
12807
+ [name: string]: unknown;
12808
+ };
12809
+ content: {
12810
+ "application/json": components["schemas"]["Error"];
12811
+ };
12812
+ };
12813
+ /** @description Forbidden */
12814
+ 403: {
12815
+ headers: {
12816
+ [name: string]: unknown;
12817
+ };
12818
+ content: {
12819
+ "application/json": components["schemas"]["Error"];
12820
+ };
12821
+ };
12822
+ /** @description No acceptable representation */
12823
+ 406: {
12824
+ headers: {
12825
+ [name: string]: unknown;
12826
+ };
12827
+ content: {
12828
+ "application/json": components["schemas"]["NegotiationError"];
12829
+ };
12830
+ };
12831
+ /** @description Too Many Requests */
12832
+ 429: {
12833
+ headers: {
12834
+ [name: string]: unknown;
12835
+ };
12836
+ content: {
12837
+ "application/json": components["schemas"]["Error"];
12838
+ };
12839
+ };
12840
+ };
12841
+ };
12842
+ "FountainWeb.OAuthTokenController.token": {
12843
+ parameters: {
12844
+ query?: never;
12845
+ header?: never;
12846
+ path?: never;
12847
+ cookie?: never;
12848
+ };
12849
+ /** @description Token request */
12850
+ requestBody?: {
12851
+ content: {
12852
+ "application/json": components["schemas"]["OAuthTokenRequest"];
12853
+ };
12854
+ };
12855
+ responses: {
12856
+ /** @description Token */
12857
+ 200: {
12858
+ headers: {
12859
+ [name: string]: unknown;
12860
+ };
12861
+ content: {
12862
+ "application/json": components["schemas"]["OAuthTokenResponse"];
12863
+ };
12864
+ };
12865
+ /** @description invalid_grant / unsupported_grant_type */
12866
+ 400: {
12867
+ headers: {
12868
+ [name: string]: unknown;
12869
+ };
12870
+ content: {
12871
+ "application/json": components["schemas"]["Error"];
12872
+ };
12873
+ };
12874
+ /** @description No acceptable representation */
12875
+ 406: {
12876
+ headers: {
12877
+ [name: string]: unknown;
12878
+ };
12879
+ content: {
12880
+ "application/json": components["schemas"]["NegotiationError"];
12881
+ };
12882
+ };
12883
+ };
12884
+ };
12885
+ "FountainWeb.RunnerController.index": {
12886
+ parameters: {
12887
+ query?: never;
12888
+ header?: never;
12889
+ path?: never;
12890
+ cookie?: never;
12891
+ };
12892
+ requestBody?: never;
12893
+ responses: {
12894
+ /** @description Runners */
12895
+ 200: {
12896
+ headers: {
12897
+ [name: string]: unknown;
12898
+ };
12899
+ content: {
12900
+ "application/json": components["schemas"]["RunnerListResponse"];
12901
+ };
12902
+ };
12903
+ /** @description Missing or invalid key */
12904
+ 401: {
12905
+ headers: {
12906
+ [name: string]: unknown;
12907
+ };
12908
+ content: {
12909
+ "application/json": components["schemas"]["Error"];
12910
+ };
12911
+ };
12912
+ /** @description Forbidden */
12913
+ 403: {
12914
+ headers: {
12915
+ [name: string]: unknown;
12916
+ };
12917
+ content: {
12918
+ "application/json": components["schemas"]["Error"];
12919
+ };
12920
+ };
12921
+ /** @description No acceptable representation */
12922
+ 406: {
12923
+ headers: {
12924
+ [name: string]: unknown;
12925
+ };
12926
+ content: {
12927
+ "application/json": components["schemas"]["NegotiationError"];
12928
+ };
12929
+ };
12930
+ /** @description Too Many Requests */
12931
+ 429: {
12932
+ headers: {
12933
+ [name: string]: unknown;
12934
+ };
12935
+ content: {
12936
+ "application/json": components["schemas"]["Error"];
12937
+ };
12938
+ };
12939
+ };
12940
+ };
12941
+ "FountainWeb.RunnerController.connect": {
12942
+ parameters: {
12943
+ query: {
12944
+ /** @description The runner's name (lowercase, unique per account). */
12945
+ name: string;
12946
+ hostname?: string;
12947
+ os?: string;
12948
+ arch?: string;
12949
+ /** @description Daemon version. */
12950
+ version?: string;
12951
+ /** @description Sandbox root on the host. */
12952
+ root?: string;
12953
+ };
12954
+ header?: never;
12955
+ path?: never;
12956
+ cookie?: never;
12957
+ };
12958
+ requestBody?: never;
12959
+ responses: {
12960
+ /** @description Upgraded */
12961
+ 101: {
12962
+ headers: {
12963
+ [name: string]: unknown;
12964
+ };
12965
+ content?: never;
12966
+ };
12967
+ /** @description Not a WebSocket upgrade, or a bad name */
12968
+ 400: {
12969
+ headers: {
12970
+ [name: string]: unknown;
12971
+ };
12972
+ content: {
12973
+ "application/json": components["schemas"]["Error"];
12974
+ };
12975
+ };
12976
+ /** @description Missing or invalid key */
12977
+ 401: {
12978
+ headers: {
12979
+ [name: string]: unknown;
12980
+ };
12981
+ content: {
12982
+ "application/json": components["schemas"]["Error"];
12983
+ };
12984
+ };
12985
+ /** @description The presented key lacks full scope */
12986
+ 403: {
12987
+ headers: {
12988
+ [name: string]: unknown;
12989
+ };
12990
+ content: {
12991
+ "application/json": components["schemas"]["Error"];
12992
+ };
12993
+ };
12994
+ /** @description Runners are disabled on this instance */
12995
+ 404: {
12996
+ headers: {
12997
+ [name: string]: unknown;
12998
+ };
12999
+ content: {
13000
+ "application/json": components["schemas"]["Error"];
13001
+ };
13002
+ };
13003
+ /** @description A runner with this name is already connected */
13004
+ 409: {
13005
+ headers: {
13006
+ [name: string]: unknown;
13007
+ };
13008
+ content: {
13009
+ "application/json": components["schemas"]["Error"];
12265
13010
  };
12266
13011
  };
12267
13012
  /** @description Too Many Requests */
@@ -12275,34 +13020,92 @@ export interface operations {
12275
13020
  };
12276
13021
  };
12277
13022
  };
12278
- "FountainWeb.RunnerController.connect": {
13023
+ "FountainWeb.RunnerController.delete": {
12279
13024
  parameters: {
12280
- query: {
12281
- /** @description The runner's name (lowercase, unique per account). */
12282
- name: string;
12283
- hostname?: string;
12284
- os?: string;
12285
- arch?: string;
12286
- /** @description Daemon version. */
12287
- version?: string;
12288
- /** @description Sandbox root on the host. */
12289
- root?: string;
13025
+ query?: never;
13026
+ header?: never;
13027
+ path: {
13028
+ /** @description Runner id. */
13029
+ id: string;
13030
+ };
13031
+ cookie?: never;
13032
+ };
13033
+ requestBody?: never;
13034
+ responses: {
13035
+ /** @description Forgotten */
13036
+ 204: {
13037
+ headers: {
13038
+ [name: string]: unknown;
13039
+ };
13040
+ content?: never;
13041
+ };
13042
+ /** @description Missing or invalid key */
13043
+ 401: {
13044
+ headers: {
13045
+ [name: string]: unknown;
13046
+ };
13047
+ content: {
13048
+ "application/json": components["schemas"]["Error"];
13049
+ };
13050
+ };
13051
+ /** @description Forbidden */
13052
+ 403: {
13053
+ headers: {
13054
+ [name: string]: unknown;
13055
+ };
13056
+ content: {
13057
+ "application/json": components["schemas"]["Error"];
13058
+ };
13059
+ };
13060
+ /** @description No such runner */
13061
+ 404: {
13062
+ headers: {
13063
+ [name: string]: unknown;
13064
+ };
13065
+ content: {
13066
+ "application/json": components["schemas"]["Error"];
13067
+ };
13068
+ };
13069
+ /** @description No acceptable representation */
13070
+ 406: {
13071
+ headers: {
13072
+ [name: string]: unknown;
13073
+ };
13074
+ content: {
13075
+ "application/json": components["schemas"]["NegotiationError"];
13076
+ };
13077
+ };
13078
+ /** @description Too Many Requests */
13079
+ 429: {
13080
+ headers: {
13081
+ [name: string]: unknown;
13082
+ };
13083
+ content: {
13084
+ "application/json": components["schemas"]["Error"];
13085
+ };
12290
13086
  };
13087
+ };
13088
+ };
13089
+ "FountainWeb.SandboxQueueController.index": {
13090
+ parameters: {
13091
+ query?: never;
12291
13092
  header?: never;
12292
13093
  path?: never;
12293
13094
  cookie?: never;
12294
13095
  };
12295
13096
  requestBody?: never;
12296
13097
  responses: {
12297
- /** @description Upgraded */
12298
- 101: {
13098
+ /** @description Sandbox requests */
13099
+ 200: {
12299
13100
  headers: {
12300
13101
  [name: string]: unknown;
12301
13102
  };
12302
- content?: never;
13103
+ content: {
13104
+ "application/json": components["schemas"]["SandboxRequestListResponse"];
13105
+ };
12303
13106
  };
12304
- /** @description Not a WebSocket upgrade, or a bad name */
12305
- 400: {
13107
+ /** @description Unauthorized */
13108
+ 401: {
12306
13109
  headers: {
12307
13110
  [name: string]: unknown;
12308
13111
  };
@@ -12310,7 +13113,56 @@ export interface operations {
12310
13113
  "application/json": components["schemas"]["Error"];
12311
13114
  };
12312
13115
  };
12313
- /** @description Missing or invalid key */
13116
+ /** @description Forbidden */
13117
+ 403: {
13118
+ headers: {
13119
+ [name: string]: unknown;
13120
+ };
13121
+ content: {
13122
+ "application/json": components["schemas"]["Error"];
13123
+ };
13124
+ };
13125
+ /** @description No acceptable representation */
13126
+ 406: {
13127
+ headers: {
13128
+ [name: string]: unknown;
13129
+ };
13130
+ content: {
13131
+ "application/json": components["schemas"]["NegotiationError"];
13132
+ };
13133
+ };
13134
+ /** @description Too Many Requests */
13135
+ 429: {
13136
+ headers: {
13137
+ [name: string]: unknown;
13138
+ };
13139
+ content: {
13140
+ "application/json": components["schemas"]["Error"];
13141
+ };
13142
+ };
13143
+ };
13144
+ };
13145
+ "FountainWeb.SandboxQueueController.show": {
13146
+ parameters: {
13147
+ query?: never;
13148
+ header?: never;
13149
+ path: {
13150
+ id: string;
13151
+ };
13152
+ cookie?: never;
13153
+ };
13154
+ requestBody?: never;
13155
+ responses: {
13156
+ /** @description Sandbox request */
13157
+ 200: {
13158
+ headers: {
13159
+ [name: string]: unknown;
13160
+ };
13161
+ content: {
13162
+ "application/json": components["schemas"]["SandboxRequestResponse"];
13163
+ };
13164
+ };
13165
+ /** @description Unauthorized */
12314
13166
  401: {
12315
13167
  headers: {
12316
13168
  [name: string]: unknown;
@@ -12319,7 +13171,7 @@ export interface operations {
12319
13171
  "application/json": components["schemas"]["Error"];
12320
13172
  };
12321
13173
  };
12322
- /** @description The presented key lacks full scope */
13174
+ /** @description Forbidden */
12323
13175
  403: {
12324
13176
  headers: {
12325
13177
  [name: string]: unknown;
@@ -12328,7 +13180,7 @@ export interface operations {
12328
13180
  "application/json": components["schemas"]["Error"];
12329
13181
  };
12330
13182
  };
12331
- /** @description Runners are disabled on this instance */
13183
+ /** @description Not found */
12332
13184
  404: {
12333
13185
  headers: {
12334
13186
  [name: string]: unknown;
@@ -12337,13 +13189,13 @@ export interface operations {
12337
13189
  "application/json": components["schemas"]["Error"];
12338
13190
  };
12339
13191
  };
12340
- /** @description A runner with this name is already connected */
12341
- 409: {
13192
+ /** @description No acceptable representation */
13193
+ 406: {
12342
13194
  headers: {
12343
13195
  [name: string]: unknown;
12344
13196
  };
12345
13197
  content: {
12346
- "application/json": components["schemas"]["Error"];
13198
+ "application/json": components["schemas"]["NegotiationError"];
12347
13199
  };
12348
13200
  };
12349
13201
  /** @description Too Many Requests */
@@ -12357,26 +13209,25 @@ export interface operations {
12357
13209
  };
12358
13210
  };
12359
13211
  };
12360
- "FountainWeb.RunnerController.delete": {
13212
+ "FountainWeb.SandboxQueueController.delete": {
12361
13213
  parameters: {
12362
13214
  query?: never;
12363
13215
  header?: never;
12364
13216
  path: {
12365
- /** @description Runner id. */
12366
13217
  id: string;
12367
13218
  };
12368
13219
  cookie?: never;
12369
13220
  };
12370
13221
  requestBody?: never;
12371
13222
  responses: {
12372
- /** @description Forgotten */
13223
+ /** @description Cancelled */
12373
13224
  204: {
12374
13225
  headers: {
12375
13226
  [name: string]: unknown;
12376
13227
  };
12377
13228
  content?: never;
12378
13229
  };
12379
- /** @description Missing or invalid key */
13230
+ /** @description Unauthorized */
12380
13231
  401: {
12381
13232
  headers: {
12382
13233
  [name: string]: unknown;
@@ -12394,7 +13245,7 @@ export interface operations {
12394
13245
  "application/json": components["schemas"]["Error"];
12395
13246
  };
12396
13247
  };
12397
- /** @description No such runner */
13248
+ /** @description Not found or no longer queued */
12398
13249
  404: {
12399
13250
  headers: {
12400
13251
  [name: string]: unknown;
@@ -12648,7 +13499,7 @@ export interface operations {
12648
13499
  path?: string;
12649
13500
  /** @description Diff the index (`--cached`). */
12650
13501
  staged?: boolean;
12651
- /** @description A commit, branch or tag to diff against instead of HEAD. */
13502
+ /** @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. */
12652
13503
  ref?: string;
12653
13504
  /** @description How many bytes to return, at most 4194304 (default 262144). `truncated` says whether the content stopped short. */
12654
13505
  max_bytes?: number;
@@ -12940,6 +13791,105 @@ export interface operations {
12940
13791
  };
12941
13792
  };
12942
13793
  };
13794
+ "FountainWeb.SandboxFilesController.git_status": {
13795
+ parameters: {
13796
+ query?: {
13797
+ /** @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`. */
13798
+ path?: string;
13799
+ /** @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`). */
13800
+ untracked?: "normal" | "all" | "no";
13801
+ };
13802
+ header?: never;
13803
+ path: {
13804
+ sandbox_id: string;
13805
+ };
13806
+ cookie?: never;
13807
+ };
13808
+ requestBody?: never;
13809
+ responses: {
13810
+ /** @description Status */
13811
+ 200: {
13812
+ headers: {
13813
+ [name: string]: unknown;
13814
+ };
13815
+ content: {
13816
+ "application/json": components["schemas"]["SandboxStatusResponse"];
13817
+ };
13818
+ };
13819
+ /** @description Unauthorized */
13820
+ 401: {
13821
+ headers: {
13822
+ [name: string]: unknown;
13823
+ };
13824
+ content: {
13825
+ "application/json": components["schemas"]["Error"];
13826
+ };
13827
+ };
13828
+ /** @description Insufficient scope */
13829
+ 403: {
13830
+ headers: {
13831
+ [name: string]: unknown;
13832
+ };
13833
+ content: {
13834
+ "application/json": components["schemas"]["Error"];
13835
+ };
13836
+ };
13837
+ /** @description No such sandbox or path */
13838
+ 404: {
13839
+ headers: {
13840
+ [name: string]: unknown;
13841
+ };
13842
+ content: {
13843
+ "application/json": components["schemas"]["Error"];
13844
+ };
13845
+ };
13846
+ /** @description No acceptable representation */
13847
+ 406: {
13848
+ headers: {
13849
+ [name: string]: unknown;
13850
+ };
13851
+ content: {
13852
+ "application/json": components["schemas"]["NegotiationError"];
13853
+ };
13854
+ };
13855
+ /** @description Sandbox is not ready */
13856
+ 409: {
13857
+ headers: {
13858
+ [name: string]: unknown;
13859
+ };
13860
+ content: {
13861
+ "application/json": components["schemas"]["Error"];
13862
+ };
13863
+ };
13864
+ /** @description Not a repository, or outside the sandbox */
13865
+ 422: {
13866
+ headers: {
13867
+ [name: string]: unknown;
13868
+ };
13869
+ content: {
13870
+ "application/json": components["schemas"]["Error"];
13871
+ };
13872
+ };
13873
+ /** @description Too Many Requests */
13874
+ 429: {
13875
+ headers: {
13876
+ [name: string]: unknown;
13877
+ };
13878
+ content: {
13879
+ "application/json": components["schemas"]["Error"];
13880
+ };
13881
+ };
13882
+ /** @description Sandbox provider unreachable */
13883
+ 503: {
13884
+ headers: {
13885
+ [name: string]: unknown;
13886
+ };
13887
+ content: {
13888
+ "application/json": components["schemas"]["Error"];
13889
+ };
13890
+ };
13891
+ };
13892
+ };
12943
13893
  "FountainWeb.SearchController.index": {
12944
13894
  parameters: {
12945
13895
  query: {