@managoat/fountain-sdk 5.2.1 → 6.1.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.
@@ -592,30 +592,6 @@ export interface paths {
592
592
  patch?: never;
593
593
  trace?: never;
594
594
  };
595
- "/api/agui/{agent_id}": {
596
- parameters: {
597
- query?: never;
598
- header?: never;
599
- path?: never;
600
- cookie?: never;
601
- };
602
- get?: never;
603
- put?: never;
604
- /**
605
- * Run an agent over AG-UI (SSE)
606
- * @description Answers a `RunAgentInput` with the AG-UI event stream: `RUN_STARTED`, the turn's output as `TEXT_MESSAGE_*` and `THINKING_*` events, then `RUN_FINISHED` or `RUN_ERROR`. Each SSE message is `data: {"type": ...}`, as the reference encoder writes it.
607
- *
608
- * `threadId` binds to a conversation (`agui:<threadId>`): the first run opens one, later runs prompt it. Only the newest user message is sent — the agent's memory lives in its sandbox, not in the replayed transcript.
609
- *
610
- * Errors before the stream opens are ordinary JSON responses (404 for an unknown agent, 402 with no credit); once it is open, failure arrives as `RUN_ERROR`.
611
- */
612
- post: operations["FountainWeb.AguiController.run"];
613
- delete?: never;
614
- options?: never;
615
- head?: never;
616
- patch?: never;
617
- trace?: never;
618
- };
619
595
  "/api/apply": {
620
596
  parameters: {
621
597
  query?: never;
@@ -1858,7 +1834,7 @@ export interface paths {
1858
1834
  post?: never;
1859
1835
  /**
1860
1836
  * Reset a sandbox
1861
- * @description Destroy a persistent sandbox — the agent's home — so the next launch on the same agent, environment and vault builds a clean machine. The conversations on it are kept, idle; each one's next prompt lands on the fresh home. Only a `persistent` sandbox that is not `terminated` or `failed` resets (`422 sandbox_not_resettable`), and not while any conversation on it is mid-turn (`409 sandbox_mid_turn`).
1837
+ * @description Destroy a persistent sandbox — the agent's home — so the next launch on the same agent, environment and vault builds a clean machine. The conversations on it are kept, idle; each one's next prompt lands on the fresh home. Only a `persistent` sandbox that is not `terminated` or `failed` resets (`422 sandbox_not_resettable`), and not while any conversation on it is mid-turn (`409 sandbox_mid_turn`). A reset the provider does not confirm keeps its fence and the sandbox's capacity, and answers `409 sandbox_reset_pending`; retrying it is safe.
1862
1838
  */
1863
1839
  delete: operations["FountainWeb.SandboxController.delete"];
1864
1840
  options?: never;
@@ -2170,7 +2146,7 @@ export interface paths {
2170
2146
  put?: never;
2171
2147
  /**
2172
2148
  * Open a fresh conversation on the teammate's computer
2173
- * @description Retires the teammate's current conversation — it stays in its history, past resuming — and opens a new one on the **same sandbox**: the next message starts a fresh runtime session on the same disk, files and installed tools intact. Nothing is provisioned and nothing is interrupted: 400 `conversation_busy` while a turn is running (interrupt first), 503 `provisioning` while the computer is still starting. When the computer is gone (sandbox terminated or failed, or the conversation already past resuming) a new sandbox is provisioned instead, as `POST /api/team` does. 201 with the teammate and its new conversation; the stream sends `team`. Audited as `team.conversation.rotated`.
2149
+ * @description Retires the teammate's current conversation — it stays in its history, past resuming — and opens a new one on the **same sandbox**: the next message starts a fresh runtime session on the same disk, files and installed tools intact. Nothing is provisioned and nothing is interrupted: 400 `conversation_busy` while a turn is running (interrupt first), 503 `provisioning` while the computer is still starting. The computer's own door is asked before the current conversation is retired, so a refusal costs the teammate nothing and the same call can be repeated: 409 `sandbox_reset_pending` while the computer is being reset or deleted, 503 `sandbox_unavailable` while an operation holds it (retry after `Retry-After`), 422 `sandbox_identity_mismatch` or `sandbox_runtime_mismatch` when the agent's environment, vault or runtime no longer matches the computer it was built for — start a new conversation instead. When the computer is gone (sandbox terminated or failed, or the conversation already past resuming) a new sandbox is provisioned instead, as `POST /api/team` does. 201 with the teammate and its new conversation; the stream sends `team`. Audited as `team.conversation.rotated`.
2174
2150
  */
2175
2151
  post: operations["FountainWeb.TeamController.fresh_conversation"];
2176
2152
  delete?: never;
@@ -2519,73 +2495,6 @@ export interface paths {
2519
2495
  patch?: never;
2520
2496
  trace?: never;
2521
2497
  };
2522
- "/v1/chat/completions": {
2523
- parameters: {
2524
- query?: never;
2525
- header?: never;
2526
- path?: never;
2527
- cookie?: never;
2528
- };
2529
- get?: never;
2530
- put?: never;
2531
- /**
2532
- * Chat completions, where the model is an agent (alpha)
2533
- * @description **Alpha, behind the `openai_compat` flag** — 404 with code `openai_compat_not_enabled` when it is off for the account.
2534
- *
2535
- * OpenAI's `POST /v1/chat/completions`, answered by a Fountain agent. Point any gateway or base-URL chat client at `/v1` with an API key as the bearer token.
2536
- *
2537
- * The thread is the conversation: `X-Fountain-Thread` (else `user`, else `safety_identifier`) binds to channel `openai:<key>`. The first request on a key opens a conversation, later ones prompt it, and only the newest user message is sent — the agent's memory lives in its sandbox, not in the replayed transcript. A request with none is refused with 400.
2538
- *
2539
- * `stream: true` answers with SSE `chat.completion.chunk` events (`content` for the reply, `reasoning_content` for thinking, tool use and provisioning stages) and `data: [DONE]`; a turn that fails mid-stream sends an `error` event first. `stream: false` blocks until the turn ends.
2540
- *
2541
- * **Tools.** A request's `tools` are offered to the agent beside its own. When the agent calls one, the completion ends with `finish_reason: "tool_calls"` and the turn stays open; send the next request on the same thread with `role: "tool"` messages that carry the results, and the rest of the turn streams. The sandbox's own tools never come back as tool calls.
2542
- *
2543
- * Errors use OpenAI's `{"error": {...}}` envelope: 404 for an unknown model, 402 with no credit, 409 with `Retry-After` while the thread is already running a turn (`thread_busy`) or waiting on tool results (`tool_calls_pending`).
2544
- */
2545
- post: operations["FountainWeb.OpenAIController.create_chat_completion"];
2546
- delete?: never;
2547
- options?: never;
2548
- head?: never;
2549
- patch?: never;
2550
- trace?: never;
2551
- };
2552
- "/v1/models": {
2553
- parameters: {
2554
- query?: never;
2555
- header?: never;
2556
- path?: never;
2557
- cookie?: never;
2558
- };
2559
- /**
2560
- * The tenant's agents, as models (alpha)
2561
- * @description OpenAI's `GET /v1/models`, so a base-URL client's model picker fills itself. Each agent is a model whose `id` is the agent's name.
2562
- */
2563
- get: operations["FountainWeb.OpenAIController.list_models"];
2564
- put?: never;
2565
- post?: never;
2566
- delete?: never;
2567
- options?: never;
2568
- head?: never;
2569
- patch?: never;
2570
- trace?: never;
2571
- };
2572
- "/v1/models/{model}": {
2573
- parameters: {
2574
- query?: never;
2575
- header?: never;
2576
- path?: never;
2577
- cookie?: never;
2578
- };
2579
- /** One agent, as a model (alpha) */
2580
- get: operations["FountainWeb.OpenAIController.show_model"];
2581
- put?: never;
2582
- post?: never;
2583
- delete?: never;
2584
- options?: never;
2585
- head?: never;
2586
- patch?: never;
2587
- trace?: never;
2588
- };
2589
2498
  }
2590
2499
  export type webhooks = Record<string, never>;
2591
2500
  export interface components {
@@ -2777,13 +2686,13 @@ export interface components {
2777
2686
  metadata?: {
2778
2687
  [key: string]: unknown;
2779
2688
  };
2780
- /** @description Canonical provider/model_id (e.g. anthropic/claude-sonnet-5). The provider must match the runtime — anthropic for claude, openai for codex, google for gemini; opencode accepts any of the three. Other providers are rejected: Fountain has no credentials to export for them. The model id is not checked against a list, so a newly released model works without a Fountain release. The isolated fountain-fixture runtime is the exception: it accepts only fixture/deterministic-v1. Null on the acp runtime, which resolves no inference credential and reads no model. */
2689
+ /** @description Canonical provider/model_id (e.g. anthropic/claude-sonnet-5). The provider must match the runtime — anthropic for claude, openai for codex, google for gemini; opencode accepts any of the three. Other providers are rejected: Fountain has no credentials to export for them. The model id is not checked against a list, so a newly released model works without a Fountain release. Null on the acp runtime, which resolves no inference credential and reads no model. */
2781
2690
  model: string | null;
2782
2691
  name: string;
2783
2692
  /** @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. */
2784
2693
  permission_policy?: components["schemas"]["PermissionPolicy"] | null;
2785
2694
  /** @enum {string} */
2786
- runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2695
+ runtime: "claude" | "codex" | "gemini" | "opencode" | "acp";
2787
2696
  /** @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. */
2788
2697
  runtime_command?: string | null;
2789
2698
  /**
@@ -2818,7 +2727,7 @@ export interface components {
2818
2727
  };
2819
2728
  /** AgentRequest */
2820
2729
  AgentRequest: {
2821
- /** @description Environments a conversation may launch this agent under instead of its own. Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
2730
+ /** @description Environments a conversation may launch this agent under instead of its own (environment_id on create). Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
2822
2731
  allowed_environment_ids?: string[] | null;
2823
2732
  /** @description Credential sets a conversation may launch this agent on instead of the agent's (inference_credential_id on create). Same shape as allowed_vault_ids: null (default) allows any set the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own set always passes. */
2824
2733
  allowed_inference_credential_ids?: string[] | null;
@@ -2843,7 +2752,7 @@ export interface components {
2843
2752
  /** @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. */
2844
2753
  permission_policy?: components["schemas"]["PermissionPolicy"] | null;
2845
2754
  /** @enum {string} */
2846
- runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2755
+ runtime: "claude" | "codex" | "gemini" | "opencode" | "acp";
2847
2756
  /** @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. */
2848
2757
  runtime_command?: string | null;
2849
2758
  /**
@@ -2900,7 +2809,7 @@ export interface components {
2900
2809
  /** @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. */
2901
2810
  permission_policy?: components["schemas"]["PermissionPolicy"] | null;
2902
2811
  /** @enum {string} */
2903
- runtime?: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
2812
+ runtime?: "claude" | "codex" | "gemini" | "opencode" | "acp";
2904
2813
  /** @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. */
2905
2814
  runtime_command?: string | null;
2906
2815
  /**
@@ -3063,19 +2972,6 @@ export interface components {
3063
2972
  next_cursor?: number | null;
3064
2973
  };
3065
2974
  };
3066
- /**
3067
- * AuthError
3068
- * @description An auth failure with a stable reason code.
3069
- */
3070
- AuthError: {
3071
- /**
3072
- * @description Reason code, e.g. `expired`, `invalid_token`, `invalid_current_password`.
3073
- * @example invalid_token
3074
- */
3075
- error: string;
3076
- /** @description Human-readable detail. */
3077
- message?: string;
3078
- };
3079
2975
  /**
3080
2976
  * AuthMeResponse
3081
2977
  * @description Identity of the account the bearer token belongs to.
@@ -3206,18 +3102,6 @@ export interface components {
3206
3102
  } & {
3207
3103
  [key: string]: unknown;
3208
3104
  };
3209
- /**
3210
- * BrokerUnavailableError
3211
- * @description The egress broker did not answer the request log call.
3212
- */
3213
- BrokerUnavailableError: {
3214
- /** @description Always `broker_unavailable`. */
3215
- error: string;
3216
- /** @description A sentence for a human. */
3217
- message: string;
3218
- /** @description A stable word for a client to branch on: `econnrefused`, `timeout`, `nxdomain`, `api_error_<status>`, or `unknown`. The detail is in the server log, not here. */
3219
- reason: string;
3220
- };
3221
3105
  /**
3222
3106
  * BuzzAccessUpdateRequest
3223
3107
  * @description Change who may @-mention a hosted Buzz agent. Sets buzz-acp's inbound author gate on the identity and restarts its harness. At least one field is required. A later provider deploy from the desktop resends the desktop's record and overwrites this.
@@ -3358,75 +3242,6 @@ export interface components {
3358
3242
  };
3359
3243
  };
3360
3244
  };
3361
- /**
3362
- * ChangesetError
3363
- * @description Validation errors keyed by field, with each value an array of messages, beside the code every Fountain error carries.
3364
- */
3365
- ChangesetError: {
3366
- /** @description `validation_failed`. */
3367
- error?: string;
3368
- errors: {
3369
- [key: string]: string[];
3370
- };
3371
- };
3372
- /** ChatCompletion */
3373
- ChatCompletion: {
3374
- choices?: {
3375
- /** @enum {string} */
3376
- finish_reason?: "stop" | "tool_calls";
3377
- index?: number;
3378
- message?: {
3379
- content?: string;
3380
- /** @description Thinking, tool use and lifecycle stages, if any. */
3381
- reasoning_content?: string;
3382
- /** @enum {string} */
3383
- role?: "assistant";
3384
- /** @description The caller-defined tools the agent is waiting on, when `finish_reason` is `tool_calls`. */
3385
- tool_calls?: Record<string, never>[];
3386
- };
3387
- }[];
3388
- created?: number;
3389
- /** @description Where the turn ran, for a caller that wants the real API next. */
3390
- fountain?: {
3391
- conversation_id?: string;
3392
- thread?: string;
3393
- turn_id?: string | null;
3394
- };
3395
- id?: string;
3396
- /** @description The agent's name. */
3397
- model?: string;
3398
- /** @enum {string} */
3399
- object?: "chat.completion";
3400
- /** @description Always zeros: a turn is billed in seconds, not tokens. */
3401
- usage?: {
3402
- completion_tokens?: number;
3403
- prompt_tokens?: number;
3404
- total_tokens?: number;
3405
- };
3406
- };
3407
- /**
3408
- * ChatCompletionRequest
3409
- * @description The OpenAI chat-completions request. `model`, `messages`, `stream`, `user`, `safety_identifier`, `tools` and `tool_choice` are read; sampling parameters, `n`, `response_format` and the rest are accepted and ignored, because the thing behind the URL is an agent, not a model.
3410
- */
3411
- ChatCompletionRequest: {
3412
- /** @description The chat so far. The newest `user` message becomes the prompt (its `image_url` parts must be `data:` URLs); `system`/`developer` messages become the standing role of a new conversation and are ignored afterwards. When the newest messages are `role: "tool"`, they answer the `tool_calls` the previous completion ended with and the turn resumes. */
3413
- messages: Record<string, never>[];
3414
- /** @description A Fountain agent: its name or its id. Unknown → 404. */
3415
- model: string;
3416
- /** @description The thread key when neither `X-Fountain-Thread` nor `user` is set. An OpenAI safety identifier field supported by LiteLLM. */
3417
- safety_identifier?: string;
3418
- /**
3419
- * @description `true` streams `chat.completion.chunk` events as SSE, ending with `data: [DONE]`.
3420
- * @default false
3421
- */
3422
- stream: boolean;
3423
- /** @description `auto` (default) or `none` (register nothing for this request). `required` and a named tool are refused with 400: Fountain cannot force an agent's next action. */
3424
- tool_choice?: string;
3425
- /** @description Caller-defined function tools, in OpenAI's shape. The agent sees them beside its own; when it calls one the completion ends with `finish_reason: "tool_calls"` and the turn waits for the `role: "tool"` answer on the next request. */
3426
- tools?: Record<string, never>[];
3427
- /** @description The thread key when `X-Fountain-Thread` is not set. */
3428
- user?: string;
3429
- };
3430
3245
  /**
3431
3246
  * ClaimableUser
3432
3247
  * @description A claimable principal (ADR 0044): the anonymous tenant an application opens for a visitor who has no Fountain account yet. `principal_id` is the tenant every resource it builds belongs to, and it never changes — claiming attaches an owner rather than moving anything.
@@ -3705,12 +3520,12 @@ export interface components {
3705
3520
  last_read_at?: string | null;
3706
3521
  /** Format: uuid */
3707
3522
  parent_conversation_id?: string | null;
3708
- /** @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. */
3523
+ /** @description Permission requests that outlived a turn and are still waiting for an answer (#1635). Only GET /api/conversations/{id} can report one; every other response carrying this schema, including the list and the create response, sends an empty array rather than querying for it. */
3709
3524
  pending_requests?: components["schemas"]["PendingPermissionRequest"][];
3710
3525
  /** @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. */
3711
3526
  permission_policy?: components["schemas"]["PermissionPolicy"] | null;
3712
3527
  /** @enum {string} */
3713
- runtime: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
3528
+ runtime: "claude" | "codex" | "gemini" | "opencode" | "acp";
3714
3529
  runtime_session_id?: string | null;
3715
3530
  sandbox?: (components["schemas"]["Sandbox"] | (null)) | null;
3716
3531
  /**
@@ -3741,6 +3556,8 @@ export interface components {
3741
3556
  agent_id: string;
3742
3557
  /** @description Opaque key for the external channel this conversation is bound to (for example a Buzz channel id). When set, the latest live conversation for the same agent, vault and channel is resumed (200) instead of a new one being opened (201). */
3743
3558
  channel_id?: string | null;
3559
+ /** @description Your own name for the first prompt. Ignored when the request carries no `prompt`, and when `channel_id` resumes a conversation: a resume does not deliver the prompt, so send the value with it on the prompts route. Fountain stores it on the turn the prompt opens and sends it on that turn's `started` stage event, beside the `turn_id`, so a client can bind its work item to the exact turn without inferring it from turn order. Use the event to find a candidate turn and the turn itself to confirm it: the event's copy has been through event redaction, and the turn's is what you sent. It is a correlation and not an idempotency key: a second prompt with the same value opens a second turn that carries it too. Make it unique within the conversation. */
3560
+ client_request_id?: string | null;
3744
3561
  /**
3745
3562
  * Format: uuid
3746
3563
  * @description Optional environment to provision from instead of the agent's own; the conversation stays pinned to it across wakes. Must be owned by the caller (404 otherwise) and satisfy the agent's allowed_environment_ids when that allowlist is set (422 environment_not_allowed). Part of the channel_id resume key.
@@ -3772,7 +3589,7 @@ export interface components {
3772
3589
  sandbox_api_access?: "owner" | "none";
3773
3590
  /**
3774
3591
  * Format: uuid
3775
- * @description Attach the conversation to a sandbox you already have instead of provisioning one (ADR 0023). The sandbox must be yours (404 sandbox_not_found), ready or suspended (409 sandbox_not_attachable), and built for the same agent, environment and vault as this launch (422 sandbox_identity_mismatch; 422 sandbox_runtime_mismatch if the agent's runtime changed since). The conversation opens idle on that machine; a prompt here wakes it. Several conversations then run on one disk at once, except on opencode and gemini, where a second turn is refused with 409 sandbox_at_capacity while one runs.
3592
+ * @description Attach the conversation to a sandbox you already have instead of provisioning one (ADR 0023). The sandbox must be yours (404 sandbox_not_found), ready or suspended (409 sandbox_not_attachable), and built for the same agent, environment and vault as this launch (422 sandbox_identity_mismatch; 422 sandbox_runtime_mismatch if the agent's runtime changed since). The conversation opens idle on that machine; a prompt here wakes it. Several conversations then run on one disk at once, except on opencode and gemini, where a second turn of the same runtime is refused with 409 sandbox_at_capacity while one runs.
3776
3593
  */
3777
3594
  sandbox_id?: string | null;
3778
3595
  /**
@@ -3847,14 +3664,6 @@ export interface components {
3847
3664
  ConversationTreeResponse: {
3848
3665
  data: components["schemas"]["ConversationTreeNode"][];
3849
3666
  };
3850
- /** CredentialSetDeletionError */
3851
- CredentialSetDeletionError: {
3852
- /** @enum {string} */
3853
- error: "credential_set_is_default";
3854
- message: string;
3855
- /** @enum {string} */
3856
- reason: "is_default";
3857
- };
3858
3667
  /**
3859
3668
  * CreditsCheckoutRequest
3860
3669
  * @example {
@@ -4042,9 +3851,30 @@ export interface components {
4042
3851
  /** @description Setup exec timeout in seconds; defaults to 120. The overall provisioning deadline still applies. */
4043
3852
  setup_timeout_seconds?: number;
4044
3853
  };
4045
- /** Error */
3854
+ /**
3855
+ * Error
3856
+ * @description The one body every JSON error status carries (#2324). `error` is the code to branch on; the other keys accompany particular codes and are absent otherwise. A `406` is the exception: content negotiation fails before any controller runs and renders `NegotiationError` instead.
3857
+ */
4046
3858
  Error: {
3859
+ /** @description Sandboxes the account has in use, on `sandbox_quota_exceeded` (429). */
3860
+ active_sandboxes?: number;
3861
+ /**
3862
+ * @description The machine-readable code: `validation_failed`, `not_found`, `insufficient_credits`, `sandbox_quota_exceeded`, `expired`, `invalid_token` and the rest. On the key-authentication and scope refusals it is a sentence and `reason` carries the code.
3863
+ * @example validation_failed
3864
+ */
4047
3865
  error: string;
3866
+ /** @description Field validation messages keyed by field, beside `error: "validation_failed"`, whether the request died at the OpenAPI cast or in a changeset (#1431). */
3867
+ errors?: {
3868
+ [key: string]: string[];
3869
+ };
3870
+ /** @description The account's concurrent-sandbox cap, on `sandbox_quota_exceeded` (429). */
3871
+ limit?: number;
3872
+ /** @description A sentence for a human, when there is one. */
3873
+ message?: string;
3874
+ /** @description A second stable word. On the 401 and 403 refusals from key authentication and scope checks, `error` is prose and this is the code (`api_key_invalid`, `api_key_expired`, `insufficient_scope`). On `broker_unavailable`, `sandbox_not_resettable` and `credential_set_is_default`, `error` is the code and this narrows it (`econnrefused`, `timeout`, `is_default`, ...). */
3875
+ reason?: string;
3876
+ /** @description Where to buy credit, on `insufficient_credits` (402). */
3877
+ upgrade_url?: string;
4048
3878
  };
4049
3879
  /**
4050
3880
  * Export
@@ -4212,20 +4042,6 @@ export interface components {
4212
4042
  MessageResponse: {
4213
4043
  message: string;
4214
4044
  };
4215
- /** Model */
4216
- Model: {
4217
- created?: number;
4218
- fountain?: {
4219
- agent_id?: string;
4220
- model?: string | null;
4221
- runtime?: string;
4222
- };
4223
- /** @description The agent's name. */
4224
- id?: string;
4225
- /** @enum {string} */
4226
- object?: "model";
4227
- owned_by?: string;
4228
- };
4229
4045
  /** NegotiationError */
4230
4046
  NegotiationError: {
4231
4047
  errors: {
@@ -4311,15 +4127,6 @@ export interface components {
4311
4127
  completed_at?: string | null;
4312
4128
  };
4313
4129
  };
4314
- /** OpenAIError */
4315
- OpenAIError: {
4316
- error?: {
4317
- code?: string | null;
4318
- message?: string;
4319
- param?: string | null;
4320
- type?: string;
4321
- };
4322
- };
4323
4130
  /** PasswordChangeRequest */
4324
4131
  PasswordChangeRequest: {
4325
4132
  /** Format: password */
@@ -4385,12 +4192,16 @@ export interface components {
4385
4192
  }) | null;
4386
4193
  /** PromptRequest */
4387
4194
  PromptRequest: {
4195
+ /** @description Your own name for this prompt. Fountain stores it on the turn the prompt opens and sends it on that turn's `started` stage event, beside the `turn_id`, so a client can bind its work item to the exact turn without inferring it from turn order. Use the event to find a candidate turn and the turn itself to confirm it: the event's copy has been through event redaction, and the turn's is what you sent. It is a correlation and not an idempotency key: a second prompt with the same value opens a second turn that carries it too. Make it unique within the conversation. */
4196
+ client_request_id?: string | null;
4388
4197
  /** @description Optional images to attach to this prompt. */
4389
4198
  images?: components["schemas"]["ImageInput"][] | null;
4390
4199
  prompt: string;
4391
4200
  };
4392
4201
  /** PromptResponse */
4393
4202
  PromptResponse: {
4203
+ /** @description The `client_request_id` the request carried, or null when it carried none. The response cannot name the turn: a conversation that has to be woken is answered before its turn exists. Find the turn by this value instead. */
4204
+ client_request_id?: string | null;
4394
4205
  /** @example queued */
4395
4206
  status: string;
4396
4207
  };
@@ -4435,23 +4246,6 @@ export interface components {
4435
4246
  /** Format: uri */
4436
4247
  url: string;
4437
4248
  };
4438
- /**
4439
- * RunAgentInput
4440
- * @description The AG-UI run envelope, as the protocol defines it. Extra fields are accepted and ignored: only `threadId`, `runId`, `messages` and `tools` are read.
4441
- */
4442
- RunAgentInput: {
4443
- context?: Record<string, never>[];
4444
- forwardedProps?: Record<string, never>;
4445
- /** @description The thread so far. The newest `user` message becomes the prompt; `system`/`developer` messages become the standing role of a new conversation. */
4446
- messages: Record<string, never>[];
4447
- /** @description This run. Echoed in the events. */
4448
- runId: string;
4449
- state?: Record<string, never>;
4450
- /** @description The host's thread. Bound to one Fountain conversation as `agui:<threadId>`. */
4451
- threadId: string;
4452
- /** @description The host's tools (`name`, `description`, `parameters`). Offered to the agent beside its own; a call comes back as `TOOL_CALL_*` events and the run ends, and the next run's `role: "tool"` messages answer it. */
4453
- tools?: Record<string, never>[];
4454
- };
4455
4249
  /**
4456
4250
  * Runner
4457
4251
  * @description A self-hosted runner: a machine of yours running `fountain runner`, serving sandboxes for the `runner` provider (ADR 0022). `online` is live — whether the daemon holds a connection right now.
@@ -4561,7 +4355,7 @@ export interface components {
4561
4355
  /** @description True while this conversation is running a turn on the machine. */
4562
4356
  mid_turn: boolean;
4563
4357
  /** @enum {string} */
4564
- runtime?: "claude" | "codex" | "gemini" | "opencode" | "acp" | "fountain-fixture";
4358
+ runtime?: "claude" | "codex" | "gemini" | "opencode" | "acp";
4565
4359
  /** @enum {string} */
4566
4360
  status: "pending" | "running" | "idle" | "failed" | "terminated";
4567
4361
  title?: string | null;
@@ -4896,6 +4690,53 @@ export interface components {
4896
4690
  SecretResponse: {
4897
4691
  data: components["schemas"]["Secret"];
4898
4692
  };
4693
+ /**
4694
+ * StreamLogEvent
4695
+ * @description One frame of the conversation, events or team SSE log stream (#2297). Same fields as `LogEvent` minus `id` — the frame's id travels in the SSE `id:` line, never the JSON body — plus `conversation_id` and `agent_id`, which the REST log feed never sends because its URL or list item already names the conversation.
4696
+ *
4697
+ * Not every stream sends every optional field here; see each property's own description for which of `GET /api/conversations/:id/stream`, `GET /api/events/stream` and `GET /api/team/stream` include it. The events and team streams also send `StreamSignal` frames on the same connection.
4698
+ */
4699
+ StreamLogEvent: {
4700
+ /**
4701
+ * Format: uuid
4702
+ * @description The teammate whose conversation this is. Sent only on `GET /api/team/stream`, to route the event to a roster row.
4703
+ */
4704
+ agent_id?: string;
4705
+ /** @description Only with `?blocks=true`: `data` parsed server-side into the blocks a transcript renders. Empty for non-output events. */
4706
+ blocks?: components["schemas"]["Block"][];
4707
+ /**
4708
+ * Format: uuid
4709
+ * @description Which conversation this event belongs to. Sent on `GET /api/events/stream` and `GET /api/team/stream`; not sent on `GET /api/conversations/:id/stream`, whose URL already names the conversation.
4710
+ */
4711
+ conversation_id?: string;
4712
+ /** @description Output text, or JSON-encoded metadata for stage events. */
4713
+ data?: string;
4714
+ /** @description Sent on `GET /api/events/stream`. Not sent on `GET /api/conversations/:id/stream` or `GET /api/team/stream`. */
4715
+ duration_ms?: number | null;
4716
+ /** @enum {string} */
4717
+ kind: "output" | "stage";
4718
+ /** @description Lifecycle stage name. null on an event that has no stage. */
4719
+ stage?: string | null;
4720
+ /**
4721
+ * @description Lifecycle state of the stage. null on an event that has no state.
4722
+ * @enum {string|null}
4723
+ */
4724
+ state?: "started" | "done" | "failed" | "interrupted" | null;
4725
+ /** @description `stdout` / `stderr` for output events; empty for stage events. */
4726
+ stream?: string;
4727
+ /** Format: date-time */
4728
+ ts: string;
4729
+ /** Format: uuid */
4730
+ turn_id?: string | null;
4731
+ };
4732
+ /**
4733
+ * StreamSignal
4734
+ * @description A change-signal frame on the events or team SSE stream (#2297) — not a log event, and no `conversation_id`/`agent_id`/anything else `StreamLogEvent` declares. The event name says what changed: `conversations` on `GET /api/events/stream` (the caller's conversation list changed — created, titled, read, deleted, finished), `team` on `GET /api/team/stream` (the roster changed) and `schedule` on `GET /api/team/stream` (a team schedule was created, updated, deleted or fired). The client re-lists rather than reading anything from the body.
4735
+ */
4736
+ StreamSignal: {
4737
+ /** @enum {string} */
4738
+ reason: "changed";
4739
+ };
4899
4740
  /**
4900
4741
  * StripeUrlResponse
4901
4742
  * @description A Stripe-hosted URL to open in a browser. Single-use and short-lived.
@@ -5132,6 +4973,8 @@ export interface components {
5132
4973
  * @description One prompt → exit_code cycle within a conversation.
5133
4974
  */
5134
4975
  Turn: {
4976
+ /** @description The `client_request_id` of the prompt that opened this turn (#1406), or null: the caller sent none, or the turn is `autonomous`. Not unique. This is the value the caller sent, byte for byte, and it is the one to compare against: the copy on the turn's `started` stage event has been through event redaction, which rewrites any registered environment value it contains. */
4977
+ client_request_id?: string | null;
5135
4978
  /** Format: date-time */
5136
4979
  ended_at?: string | null;
5137
4980
  exit_code?: number | null;
@@ -5184,17 +5027,6 @@ export interface components {
5184
5027
  input?: number;
5185
5028
  output?: number;
5186
5029
  };
5187
- /**
5188
- * UnprocessableEntityError
5189
- * @description A rejected request. Field validation failures include errors; other refusals carry an error and may include a message.
5190
- */
5191
- UnprocessableEntityError: {
5192
- error: string;
5193
- errors?: {
5194
- [key: string]: string[];
5195
- };
5196
- message?: string;
5197
- };
5198
5030
  /**
5199
5031
  * UsageAccounting
5200
5032
  * @description The adapter's accounting claim, not independently verified billing. Interpret source, version and scope together. Reported does not imply whole-conversation coverage.
@@ -6096,7 +5928,7 @@ export interface operations {
6096
5928
  [name: string]: unknown;
6097
5929
  };
6098
5930
  content: {
6099
- "application/json": components["schemas"]["CredentialSetDeletionError"];
5931
+ "application/json": components["schemas"]["Error"];
6100
5932
  };
6101
5933
  };
6102
5934
  /** @description Too Many Requests */
@@ -6928,6 +6760,15 @@ export interface operations {
6928
6760
  "application/json": components["schemas"]["Error"];
6929
6761
  };
6930
6762
  };
6763
+ /** @description Another teardown holds this machine; retry */
6764
+ 503: {
6765
+ headers: {
6766
+ [name: string]: unknown;
6767
+ };
6768
+ content: {
6769
+ "application/json": components["schemas"]["Error"];
6770
+ };
6771
+ };
6931
6772
  };
6932
6773
  };
6933
6774
  "FountainWeb.AdminController.index_users": {
@@ -7687,7 +7528,7 @@ export interface operations {
7687
7528
  [name: string]: unknown;
7688
7529
  };
7689
7530
  content: {
7690
- "application/json": components["schemas"]["ChangesetError"];
7531
+ "application/json": components["schemas"]["Error"];
7691
7532
  };
7692
7533
  };
7693
7534
  /** @description Too Many Requests */
@@ -7844,7 +7685,7 @@ export interface operations {
7844
7685
  [name: string]: unknown;
7845
7686
  };
7846
7687
  content: {
7847
- "application/json": components["schemas"]["ChangesetError"];
7688
+ "application/json": components["schemas"]["Error"];
7848
7689
  };
7849
7690
  };
7850
7691
  /** @description Too Many Requests */
@@ -7999,7 +7840,7 @@ export interface operations {
7999
7840
  [name: string]: unknown;
8000
7841
  };
8001
7842
  content: {
8002
- "application/json": components["schemas"]["ChangesetError"];
7843
+ "application/json": components["schemas"]["Error"];
8003
7844
  };
8004
7845
  };
8005
7846
  /** @description Too Many Requests */
@@ -8362,112 +8203,6 @@ export interface operations {
8362
8203
  };
8363
8204
  };
8364
8205
  };
8365
- "FountainWeb.AguiController.run": {
8366
- parameters: {
8367
- query?: {
8368
- /** @description `off` streams the reply text only. Default `thinking`: tool use and lifecycle stages are relayed as AG-UI thinking events too, which is also what keeps a host's stall watchdog fed while a sandbox provisions. */
8369
- activity?: string;
8370
- };
8371
- header?: never;
8372
- path: {
8373
- /** @description The agent to run. */
8374
- agent_id: string;
8375
- };
8376
- cookie?: never;
8377
- };
8378
- /** @description AG-UI run input */
8379
- requestBody?: {
8380
- content: {
8381
- "application/json": {
8382
- context?: Record<string, never>[];
8383
- forwardedProps?: Record<string, never>;
8384
- /** @description The thread so far. The newest `user` message becomes the prompt; `system`/`developer` messages become the standing role of a new conversation. */
8385
- messages: Record<string, never>[];
8386
- /** @description This run. Echoed in the events. */
8387
- runId: string;
8388
- state?: Record<string, never>;
8389
- /** @description The host's thread. Bound to one Fountain conversation as `agui:<threadId>`. */
8390
- threadId: string;
8391
- /** @description The host's tools (`name`, `description`, `parameters`). Offered to the agent beside its own; a call comes back as `TOOL_CALL_*` events and the run ends, and the next run's `role: "tool"` messages answer it. */
8392
- tools?: Record<string, never>[];
8393
- };
8394
- };
8395
- };
8396
- responses: {
8397
- /** @description AG-UI event stream */
8398
- 200: {
8399
- headers: {
8400
- [name: string]: unknown;
8401
- };
8402
- content: {
8403
- "text/event-stream": string;
8404
- };
8405
- };
8406
- /** @description Malformed run input */
8407
- 400: {
8408
- headers: {
8409
- [name: string]: unknown;
8410
- };
8411
- content: {
8412
- "application/json": components["schemas"]["Error"];
8413
- };
8414
- };
8415
- /** @description Unauthorized */
8416
- 401: {
8417
- headers: {
8418
- [name: string]: unknown;
8419
- };
8420
- content: {
8421
- "application/json": components["schemas"]["Error"];
8422
- };
8423
- };
8424
- /** @description Forbidden */
8425
- 403: {
8426
- headers: {
8427
- [name: string]: unknown;
8428
- };
8429
- content: {
8430
- "application/json": components["schemas"]["Error"];
8431
- };
8432
- };
8433
- /** @description No such agent */
8434
- 404: {
8435
- headers: {
8436
- [name: string]: unknown;
8437
- };
8438
- content: {
8439
- "application/json": components["schemas"]["Error"];
8440
- };
8441
- };
8442
- /** @description Conflicting state */
8443
- 409: {
8444
- headers: {
8445
- [name: string]: unknown;
8446
- };
8447
- content: {
8448
- "application/json": components["schemas"]["Error"];
8449
- };
8450
- };
8451
- /** @description Saved execution policy refused */
8452
- 422: {
8453
- headers: {
8454
- [name: string]: unknown;
8455
- };
8456
- content: {
8457
- "application/json": components["schemas"]["Error"];
8458
- };
8459
- };
8460
- /** @description Too Many Requests */
8461
- 429: {
8462
- headers: {
8463
- [name: string]: unknown;
8464
- };
8465
- content: {
8466
- "application/json": components["schemas"]["Error"];
8467
- };
8468
- };
8469
- };
8470
- };
8471
8206
  "FountainWeb.ApplyController.create": {
8472
8207
  parameters: {
8473
8208
  query?: never;
@@ -8524,7 +8259,7 @@ export interface operations {
8524
8259
  [name: string]: unknown;
8525
8260
  };
8526
8261
  content: {
8527
- "application/json": components["schemas"]["ChangesetError"];
8262
+ "application/json": components["schemas"]["Error"];
8528
8263
  };
8529
8264
  };
8530
8265
  /** @description Too Many Requests */
@@ -8918,7 +8653,7 @@ export interface operations {
8918
8653
  [name: string]: unknown;
8919
8654
  };
8920
8655
  content: {
8921
- "application/json": components["schemas"]["AuthError"];
8656
+ "application/json": components["schemas"]["Error"];
8922
8657
  };
8923
8658
  };
8924
8659
  /** @description No acceptable representation */
@@ -8936,7 +8671,7 @@ export interface operations {
8936
8671
  [name: string]: unknown;
8937
8672
  };
8938
8673
  content: {
8939
- "application/json": components["schemas"]["AuthError"];
8674
+ "application/json": components["schemas"]["Error"];
8940
8675
  };
8941
8676
  };
8942
8677
  /** @description Too Many Requests */
@@ -8988,7 +8723,7 @@ export interface operations {
8988
8723
  [name: string]: unknown;
8989
8724
  };
8990
8725
  content: {
8991
- "application/json": components["schemas"]["AuthError"];
8726
+ "application/json": components["schemas"]["Error"];
8992
8727
  };
8993
8728
  };
8994
8729
  };
@@ -9121,7 +8856,7 @@ export interface operations {
9121
8856
  [name: string]: unknown;
9122
8857
  };
9123
8858
  content: {
9124
- "application/json": components["schemas"]["AuthError"];
8859
+ "application/json": components["schemas"]["Error"];
9125
8860
  };
9126
8861
  };
9127
8862
  /** @description No acceptable representation */
@@ -9139,7 +8874,7 @@ export interface operations {
9139
8874
  [name: string]: unknown;
9140
8875
  };
9141
8876
  content: {
9142
- "application/json": components["schemas"]["AuthError"];
8877
+ "application/json": components["schemas"]["Error"];
9143
8878
  };
9144
8879
  };
9145
8880
  /** @description Too Many Requests */
@@ -9182,7 +8917,7 @@ export interface operations {
9182
8917
  [name: string]: unknown;
9183
8918
  };
9184
8919
  content: {
9185
- "application/json": components["schemas"]["AuthError"];
8920
+ "application/json": components["schemas"]["Error"];
9186
8921
  };
9187
8922
  };
9188
8923
  /** @description No acceptable representation */
@@ -9200,7 +8935,7 @@ export interface operations {
9200
8935
  [name: string]: unknown;
9201
8936
  };
9202
8937
  content: {
9203
- "application/json": components["schemas"]["UnprocessableEntityError"];
8938
+ "application/json": components["schemas"]["Error"];
9204
8939
  };
9205
8940
  };
9206
8941
  };
@@ -9277,7 +9012,7 @@ export interface operations {
9277
9012
  [name: string]: unknown;
9278
9013
  };
9279
9014
  content: {
9280
- "application/json": components["schemas"]["AuthError"];
9015
+ "application/json": components["schemas"]["Error"];
9281
9016
  };
9282
9017
  };
9283
9018
  };
@@ -9320,7 +9055,7 @@ export interface operations {
9320
9055
  [name: string]: unknown;
9321
9056
  };
9322
9057
  content: {
9323
- "application/json": components["schemas"]["AuthError"];
9058
+ "application/json": components["schemas"]["Error"];
9324
9059
  };
9325
9060
  };
9326
9061
  /** @description No acceptable representation */
@@ -9390,7 +9125,7 @@ export interface operations {
9390
9125
  [name: string]: unknown;
9391
9126
  };
9392
9127
  content: {
9393
- "application/json": components["schemas"]["AuthError"];
9128
+ "application/json": components["schemas"]["Error"];
9394
9129
  };
9395
9130
  };
9396
9131
  };
@@ -11089,7 +10824,7 @@ export interface operations {
11089
10824
  [name: string]: unknown;
11090
10825
  };
11091
10826
  content: {
11092
- "application/json": components["schemas"]["ChangesetError"];
10827
+ "application/json": components["schemas"]["Error"];
11093
10828
  };
11094
10829
  };
11095
10830
  /** @description Too Many Requests */
@@ -11168,10 +10903,7 @@ export interface operations {
11168
10903
  [name: string]: unknown;
11169
10904
  };
11170
10905
  content: {
11171
- "application/json": {
11172
- error?: string;
11173
- upgrade_url?: string;
11174
- };
10906
+ "application/json": components["schemas"]["Error"];
11175
10907
  };
11176
10908
  };
11177
10909
  /** @description A sandbox token labelling the conversation a resume landed on */
@@ -11216,7 +10948,7 @@ export interface operations {
11216
10948
  [name: string]: unknown;
11217
10949
  };
11218
10950
  content: {
11219
- "application/json": components["schemas"]["UnprocessableEntityError"];
10951
+ "application/json": components["schemas"]["Error"];
11220
10952
  };
11221
10953
  };
11222
10954
  /** @description Tenant concurrency cap reached */
@@ -11315,7 +11047,7 @@ export interface operations {
11315
11047
  [name: string]: unknown;
11316
11048
  };
11317
11049
  content: {
11318
- "application/json": components["schemas"]["BrokerUnavailableError"];
11050
+ "application/json": components["schemas"]["Error"];
11319
11051
  };
11320
11052
  };
11321
11053
  };
@@ -11555,7 +11287,7 @@ export interface operations {
11555
11287
  [name: string]: unknown;
11556
11288
  };
11557
11289
  content: {
11558
- "application/json": components["schemas"]["UnprocessableEntityError"];
11290
+ "application/json": components["schemas"]["Error"];
11559
11291
  };
11560
11292
  };
11561
11293
  /** @description Too Many Requests */
@@ -11648,6 +11380,15 @@ export interface operations {
11648
11380
  "application/json": components["schemas"]["NegotiationError"];
11649
11381
  };
11650
11382
  };
11383
+ /** @description Sandbox is being reset */
11384
+ 409: {
11385
+ headers: {
11386
+ [name: string]: unknown;
11387
+ };
11388
+ content: {
11389
+ "application/json": components["schemas"]["Error"];
11390
+ };
11391
+ };
11651
11392
  /** @description Conversation is terminal */
11652
11393
  410: {
11653
11394
  headers: {
@@ -12003,7 +11744,7 @@ export interface operations {
12003
11744
  [name: string]: unknown;
12004
11745
  };
12005
11746
  content: {
12006
- "text/event-stream": string;
11747
+ "text/event-stream": components["schemas"]["StreamLogEvent"];
12007
11748
  };
12008
11749
  };
12009
11750
  /** @description Unauthorized */
@@ -12557,7 +12298,7 @@ export interface operations {
12557
12298
  [name: string]: unknown;
12558
12299
  };
12559
12300
  content: {
12560
- "application/json": components["schemas"]["ChangesetError"];
12301
+ "application/json": components["schemas"]["Error"];
12561
12302
  };
12562
12303
  };
12563
12304
  /** @description Too Many Requests */
@@ -12705,7 +12446,7 @@ export interface operations {
12705
12446
  [name: string]: unknown;
12706
12447
  };
12707
12448
  content: {
12708
- "application/json": components["schemas"]["ChangesetError"];
12449
+ "application/json": components["schemas"]["Error"];
12709
12450
  };
12710
12451
  };
12711
12452
  /** @description Too Many Requests */
@@ -12920,7 +12661,7 @@ export interface operations {
12920
12661
  [name: string]: unknown;
12921
12662
  };
12922
12663
  content: {
12923
- "application/json": components["schemas"]["ChangesetError"];
12664
+ "application/json": components["schemas"]["Error"];
12924
12665
  };
12925
12666
  };
12926
12667
  /** @description Too Many Requests */
@@ -13075,7 +12816,7 @@ export interface operations {
13075
12816
  [name: string]: unknown;
13076
12817
  };
13077
12818
  content: {
13078
- "application/json": components["schemas"]["ChangesetError"];
12819
+ "application/json": components["schemas"]["Error"];
13079
12820
  };
13080
12821
  };
13081
12822
  /** @description Too Many Requests */
@@ -13112,7 +12853,7 @@ export interface operations {
13112
12853
  [name: string]: unknown;
13113
12854
  };
13114
12855
  content: {
13115
- "text/event-stream": string;
12856
+ "text/event-stream": components["schemas"]["StreamLogEvent"] | components["schemas"]["StreamSignal"];
13116
12857
  };
13117
12858
  };
13118
12859
  /** @description Unauthorized */
@@ -14200,6 +13941,15 @@ export interface operations {
14200
13941
  "application/json": components["schemas"]["Error"];
14201
13942
  };
14202
13943
  };
13944
+ /** @description Another teardown of this sandbox is running */
13945
+ 503: {
13946
+ headers: {
13947
+ [name: string]: unknown;
13948
+ };
13949
+ content: {
13950
+ "application/json": components["schemas"]["Error"];
13951
+ };
13952
+ };
14203
13953
  };
14204
13954
  };
14205
13955
  "FountainWeb.SandboxFilesController.diff": {
@@ -15462,7 +15212,7 @@ export interface operations {
15462
15212
  [name: string]: unknown;
15463
15213
  };
15464
15214
  content: {
15465
- "text/event-stream": string;
15215
+ "text/event-stream": components["schemas"]["StreamLogEvent"] | components["schemas"]["StreamSignal"];
15466
15216
  };
15467
15217
  };
15468
15218
  /** @description Unauthorized */
@@ -15851,6 +15601,24 @@ export interface operations {
15851
15601
  "application/json": components["schemas"]["NegotiationError"];
15852
15602
  };
15853
15603
  };
15604
+ /** @description The computer is being reset or deleted */
15605
+ 409: {
15606
+ headers: {
15607
+ [name: string]: unknown;
15608
+ };
15609
+ content: {
15610
+ "application/json": components["schemas"]["Error"];
15611
+ };
15612
+ };
15613
+ /** @description The computer no longer matches the agent */
15614
+ 422: {
15615
+ headers: {
15616
+ [name: string]: unknown;
15617
+ };
15618
+ content: {
15619
+ "application/json": components["schemas"]["Error"];
15620
+ };
15621
+ };
15854
15622
  /** @description Too Many Requests */
15855
15623
  429: {
15856
15624
  headers: {
@@ -15860,7 +15628,7 @@ export interface operations {
15860
15628
  "application/json": components["schemas"]["Error"];
15861
15629
  };
15862
15630
  };
15863
- /** @description The computer is still starting */
15631
+ /** @description The computer is still starting, or an operation holds it */
15864
15632
  503: {
15865
15633
  headers: {
15866
15634
  [name: string]: unknown;
@@ -15947,7 +15715,7 @@ export interface operations {
15947
15715
  [name: string]: unknown;
15948
15716
  };
15949
15717
  content: {
15950
- "application/json": components["schemas"]["ChangesetError"];
15718
+ "application/json": components["schemas"]["Error"];
15951
15719
  };
15952
15720
  };
15953
15721
  /** @description Too Many Requests */
@@ -16505,7 +16273,7 @@ export interface operations {
16505
16273
  [name: string]: unknown;
16506
16274
  };
16507
16275
  content: {
16508
- "application/json": components["schemas"]["ChangesetError"];
16276
+ "application/json": components["schemas"]["Error"];
16509
16277
  };
16510
16278
  };
16511
16279
  /** @description Too Many Requests */
@@ -16653,7 +16421,7 @@ export interface operations {
16653
16421
  [name: string]: unknown;
16654
16422
  };
16655
16423
  content: {
16656
- "application/json": components["schemas"]["ChangesetError"];
16424
+ "application/json": components["schemas"]["Error"];
16657
16425
  };
16658
16426
  };
16659
16427
  /** @description Too Many Requests */
@@ -16808,7 +16576,7 @@ export interface operations {
16808
16576
  [name: string]: unknown;
16809
16577
  };
16810
16578
  content: {
16811
- "application/json": components["schemas"]["ChangesetError"];
16579
+ "application/json": components["schemas"]["Error"];
16812
16580
  };
16813
16581
  };
16814
16582
  /** @description Too Many Requests */
@@ -16956,7 +16724,7 @@ export interface operations {
16956
16724
  [name: string]: unknown;
16957
16725
  };
16958
16726
  content: {
16959
- "application/json": components["schemas"]["ChangesetError"];
16727
+ "application/json": components["schemas"]["Error"];
16960
16728
  };
16961
16729
  };
16962
16730
  /** @description Too Many Requests */
@@ -17106,7 +16874,7 @@ export interface operations {
17106
16874
  [name: string]: unknown;
17107
16875
  };
17108
16876
  content: {
17109
- "application/json": components["schemas"]["ChangesetError"];
16877
+ "application/json": components["schemas"]["Error"];
17110
16878
  };
17111
16879
  };
17112
16880
  /** @description Too Many Requests */
@@ -17798,347 +17566,4 @@ export interface operations {
17798
17566
  };
17799
17567
  };
17800
17568
  };
17801
- "FountainWeb.OpenAIController.create_chat_completion": {
17802
- parameters: {
17803
- query?: never;
17804
- header?: {
17805
- /** @description The thread key. Overrides `user` and `safety_identifier`. */
17806
- "x-fountain-thread"?: string;
17807
- };
17808
- path?: never;
17809
- cookie?: never;
17810
- };
17811
- /** @description Chat-completions request */
17812
- requestBody?: {
17813
- content: {
17814
- "application/json": {
17815
- /** @description The chat so far. The newest `user` message becomes the prompt (its `image_url` parts must be `data:` URLs); `system`/`developer` messages become the standing role of a new conversation and are ignored afterwards. When the newest messages are `role: "tool"`, they answer the `tool_calls` the previous completion ended with and the turn resumes. */
17816
- messages: Record<string, never>[];
17817
- /** @description A Fountain agent: its name or its id. Unknown → 404. */
17818
- model: string;
17819
- /** @description The thread key when neither `X-Fountain-Thread` nor `user` is set. An OpenAI safety identifier field supported by LiteLLM. */
17820
- safety_identifier?: string;
17821
- /**
17822
- * @description `true` streams `chat.completion.chunk` events as SSE, ending with `data: [DONE]`.
17823
- * @default false
17824
- */
17825
- stream?: boolean;
17826
- /** @description `auto` (default) or `none` (register nothing for this request). `required` and a named tool are refused with 400: Fountain cannot force an agent's next action. */
17827
- tool_choice?: string;
17828
- /** @description Caller-defined function tools, in OpenAI's shape. The agent sees them beside its own; when it calls one the completion ends with `finish_reason: "tool_calls"` and the turn waits for the `role: "tool"` answer on the next request. */
17829
- tools?: Record<string, never>[];
17830
- /** @description The thread key when `X-Fountain-Thread` is not set. */
17831
- user?: string;
17832
- };
17833
- };
17834
- };
17835
- responses: {
17836
- /** @description The completion (or, with `stream: true`, its SSE stream) */
17837
- 200: {
17838
- headers: {
17839
- [name: string]: unknown;
17840
- };
17841
- content: {
17842
- "application/json": {
17843
- choices?: {
17844
- /** @enum {string} */
17845
- finish_reason?: "stop" | "tool_calls";
17846
- index?: number;
17847
- message?: {
17848
- content?: string;
17849
- /** @description Thinking, tool use and lifecycle stages, if any. */
17850
- reasoning_content?: string;
17851
- /** @enum {string} */
17852
- role?: "assistant";
17853
- /** @description The caller-defined tools the agent is waiting on, when `finish_reason` is `tool_calls`. */
17854
- tool_calls?: Record<string, never>[];
17855
- };
17856
- }[];
17857
- created?: number;
17858
- /** @description Where the turn ran, for a caller that wants the real API next. */
17859
- fountain?: {
17860
- conversation_id?: string;
17861
- thread?: string;
17862
- turn_id?: string | null;
17863
- };
17864
- id?: string;
17865
- /** @description The agent's name. */
17866
- model?: string;
17867
- /** @enum {string} */
17868
- object?: "chat.completion";
17869
- /** @description Always zeros: a turn is billed in seconds, not tokens. */
17870
- usage?: {
17871
- completion_tokens?: number;
17872
- prompt_tokens?: number;
17873
- total_tokens?: number;
17874
- };
17875
- };
17876
- };
17877
- };
17878
- /** @description No thread key, or no user message */
17879
- 400: {
17880
- headers: {
17881
- [name: string]: unknown;
17882
- };
17883
- content: {
17884
- "application/json": {
17885
- error?: {
17886
- code?: string | null;
17887
- message?: string;
17888
- param?: string | null;
17889
- type?: string;
17890
- };
17891
- };
17892
- };
17893
- };
17894
- /** @description Unauthorized */
17895
- 401: {
17896
- headers: {
17897
- [name: string]: unknown;
17898
- };
17899
- content: {
17900
- "application/json": components["schemas"]["Error"];
17901
- };
17902
- };
17903
- /** @description Forbidden */
17904
- 403: {
17905
- headers: {
17906
- [name: string]: unknown;
17907
- };
17908
- content: {
17909
- "application/json": components["schemas"]["Error"];
17910
- };
17911
- };
17912
- /** @description No such model (agent) */
17913
- 404: {
17914
- headers: {
17915
- [name: string]: unknown;
17916
- };
17917
- content: {
17918
- "application/json": {
17919
- error?: {
17920
- code?: string | null;
17921
- message?: string;
17922
- param?: string | null;
17923
- type?: string;
17924
- };
17925
- };
17926
- };
17927
- };
17928
- /** @description The thread is running a turn; retry */
17929
- 409: {
17930
- headers: {
17931
- [name: string]: unknown;
17932
- };
17933
- content: {
17934
- "application/json": {
17935
- error?: {
17936
- code?: string | null;
17937
- message?: string;
17938
- param?: string | null;
17939
- type?: string;
17940
- };
17941
- };
17942
- };
17943
- };
17944
- /** @description Saved execution policy refused */
17945
- 422: {
17946
- headers: {
17947
- [name: string]: unknown;
17948
- };
17949
- content: {
17950
- "application/json": {
17951
- error?: {
17952
- code?: string | null;
17953
- message?: string;
17954
- param?: string | null;
17955
- type?: string;
17956
- };
17957
- };
17958
- };
17959
- };
17960
- /** @description Too Many Requests */
17961
- 429: {
17962
- headers: {
17963
- [name: string]: unknown;
17964
- };
17965
- content: {
17966
- "application/json": components["schemas"]["Error"];
17967
- };
17968
- };
17969
- /** @description Internal error */
17970
- 500: {
17971
- headers: {
17972
- [name: string]: unknown;
17973
- };
17974
- content: {
17975
- "application/json": {
17976
- error?: {
17977
- code?: string | null;
17978
- message?: string;
17979
- param?: string | null;
17980
- type?: string;
17981
- };
17982
- };
17983
- };
17984
- };
17985
- };
17986
- };
17987
- "FountainWeb.OpenAIController.list_models": {
17988
- parameters: {
17989
- query?: never;
17990
- header?: never;
17991
- path?: never;
17992
- cookie?: never;
17993
- };
17994
- requestBody?: never;
17995
- responses: {
17996
- /** @description Model list */
17997
- 200: {
17998
- headers: {
17999
- [name: string]: unknown;
18000
- };
18001
- content: {
18002
- "application/json": {
18003
- data?: {
18004
- created?: number;
18005
- fountain?: {
18006
- agent_id?: string;
18007
- model?: string | null;
18008
- runtime?: string;
18009
- };
18010
- /** @description The agent's name. */
18011
- id?: string;
18012
- /** @enum {string} */
18013
- object?: "model";
18014
- owned_by?: string;
18015
- }[];
18016
- /** @enum {string} */
18017
- object?: "list";
18018
- };
18019
- };
18020
- };
18021
- /** @description Unauthorized */
18022
- 401: {
18023
- headers: {
18024
- [name: string]: unknown;
18025
- };
18026
- content: {
18027
- "application/json": components["schemas"]["Error"];
18028
- };
18029
- };
18030
- /** @description Forbidden */
18031
- 403: {
18032
- headers: {
18033
- [name: string]: unknown;
18034
- };
18035
- content: {
18036
- "application/json": components["schemas"]["Error"];
18037
- };
18038
- };
18039
- /** @description Not found */
18040
- 404: {
18041
- headers: {
18042
- [name: string]: unknown;
18043
- };
18044
- content: {
18045
- "application/json": {
18046
- error?: {
18047
- code?: string | null;
18048
- message?: string;
18049
- param?: string | null;
18050
- type?: string;
18051
- };
18052
- };
18053
- };
18054
- };
18055
- /** @description Too Many Requests */
18056
- 429: {
18057
- headers: {
18058
- [name: string]: unknown;
18059
- };
18060
- content: {
18061
- "application/json": components["schemas"]["Error"];
18062
- };
18063
- };
18064
- };
18065
- };
18066
- "FountainWeb.OpenAIController.show_model": {
18067
- parameters: {
18068
- query?: never;
18069
- header?: never;
18070
- path: {
18071
- /** @description Agent name or id. */
18072
- model: string;
18073
- };
18074
- cookie?: never;
18075
- };
18076
- requestBody?: never;
18077
- responses: {
18078
- /** @description The model */
18079
- 200: {
18080
- headers: {
18081
- [name: string]: unknown;
18082
- };
18083
- content: {
18084
- "application/json": {
18085
- created?: number;
18086
- fountain?: {
18087
- agent_id?: string;
18088
- model?: string | null;
18089
- runtime?: string;
18090
- };
18091
- /** @description The agent's name. */
18092
- id?: string;
18093
- /** @enum {string} */
18094
- object?: "model";
18095
- owned_by?: string;
18096
- };
18097
- };
18098
- };
18099
- /** @description Unauthorized */
18100
- 401: {
18101
- headers: {
18102
- [name: string]: unknown;
18103
- };
18104
- content: {
18105
- "application/json": components["schemas"]["Error"];
18106
- };
18107
- };
18108
- /** @description Forbidden */
18109
- 403: {
18110
- headers: {
18111
- [name: string]: unknown;
18112
- };
18113
- content: {
18114
- "application/json": components["schemas"]["Error"];
18115
- };
18116
- };
18117
- /** @description No such model (agent) */
18118
- 404: {
18119
- headers: {
18120
- [name: string]: unknown;
18121
- };
18122
- content: {
18123
- "application/json": {
18124
- error?: {
18125
- code?: string | null;
18126
- message?: string;
18127
- param?: string | null;
18128
- type?: string;
18129
- };
18130
- };
18131
- };
18132
- };
18133
- /** @description Too Many Requests */
18134
- 429: {
18135
- headers: {
18136
- [name: string]: unknown;
18137
- };
18138
- content: {
18139
- "application/json": components["schemas"]["Error"];
18140
- };
18141
- };
18142
- };
18143
- };
18144
17569
  }