@boatdev/sdk 1.6.0 → 1.7.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.
@@ -121,6 +121,7 @@ docs/SteerEvent.md
121
121
  docs/SteerEventData.md
122
122
  docs/SteerRequest.md
123
123
  docs/SteerResponse.md
124
+ docs/StopOperation.md
124
125
  docs/StopRequest.md
125
126
  docs/SuccessBase.md
126
127
  docs/UnknownEvent.md
@@ -262,6 +263,7 @@ src/models/SteerEvent.ts
262
263
  src/models/SteerEventData.ts
263
264
  src/models/SteerRequest.ts
264
265
  src/models/SteerResponse.ts
266
+ src/models/StopOperation.ts
265
267
  src/models/StopRequest.ts
266
268
  src/models/SuccessBase.ts
267
269
  src/models/UnknownEvent.ts
@@ -1169,12 +1169,12 @@ export declare class BoatApi extends runtime.BaseAPI {
1169
1169
  */
1170
1170
  stopRequestOpts(input: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>): Promise<runtime.RequestOpts>;
1171
1171
  /**
1172
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1172
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1173
1173
  * Stop and archive sandbox
1174
1174
  */
1175
1175
  stopRaw(requestParameters: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SandboxActionResponse>>;
1176
1176
  /**
1177
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1177
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1178
1178
  * Stop and archive sandbox
1179
1179
  */
1180
1180
  stop(requestParameters: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SandboxActionResponse>;
@@ -2852,7 +2852,7 @@ class BoatApi extends runtime.BaseAPI {
2852
2852
  };
2853
2853
  }
2854
2854
  /**
2855
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2855
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2856
2856
  * Stop and archive sandbox
2857
2857
  */
2858
2858
  async stopRaw(requestParameters, initOverrides) {
@@ -2861,7 +2861,7 @@ class BoatApi extends runtime.BaseAPI {
2861
2861
  return new runtime.JSONApiResponse(response, (jsonValue) => (0, SandboxActionResponse_1.SandboxActionResponseFromJSON)(jsonValue));
2862
2862
  }
2863
2863
  /**
2864
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2864
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2865
2865
  * Stop and archive sandbox
2866
2866
  */
2867
2867
  async stop(requestParameters, initOverrides) {
@@ -1169,12 +1169,12 @@ export declare class BoatApi extends runtime.BaseAPI {
1169
1169
  */
1170
1170
  stopRequestOpts(input: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>): Promise<runtime.RequestOpts>;
1171
1171
  /**
1172
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1172
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1173
1173
  * Stop and archive sandbox
1174
1174
  */
1175
1175
  stopRaw(requestParameters: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SandboxActionResponse>>;
1176
1176
  /**
1177
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1177
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
1178
1178
  * Stop and archive sandbox
1179
1179
  */
1180
1180
  stop(requestParameters: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SandboxActionResponse>;
@@ -2816,7 +2816,7 @@ export class BoatApi extends runtime.BaseAPI {
2816
2816
  };
2817
2817
  }
2818
2818
  /**
2819
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2819
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2820
2820
  * Stop and archive sandbox
2821
2821
  */
2822
2822
  async stopRaw(requestParameters, initOverrides) {
@@ -2825,7 +2825,7 @@ export class BoatApi extends runtime.BaseAPI {
2825
2825
  return new runtime.JSONApiResponse(response, (jsonValue) => SandboxActionResponseFromJSON(jsonValue));
2826
2826
  }
2827
2827
  /**
2828
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2828
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
2829
2829
  * Stop and archive sandbox
2830
2830
  */
2831
2831
  async stop(requestParameters, initOverrides) {
@@ -46,7 +46,7 @@ export interface Conversation {
46
46
  */
47
47
  running: boolean;
48
48
  /**
49
- * Harness the most recent prompt ran on (`claude`, `codex`, `pi`, `opencode`, `prime-agent`, `kimi`).
49
+ * Harness the most recent prompt ran on (`claude`, `codex`, `pi`, `opencode`, `prime-agent`, `kimi`, `mistral`).
50
50
  * @type {string}
51
51
  * @memberof Conversation
52
52
  */
@@ -12,7 +12,7 @@
12
12
  /**
13
13
  * Work item to queue inside an existing sandbox. Provider credentials must already be configured in the Boat dashboard.
14
14
  *
15
- * **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`). Omit `provider` to use the harness the user selected on the Agents dashboard.
15
+ * **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`), `mistral` (Mistral Vibe). Omit `provider` to use the harness the user selected on the Agents dashboard.
16
16
  *
17
17
  * **Models & reasoning effort** are harness- and model-specific and change over time. Fetch the live catalog (every provider's models and which reasoning-effort levels each accepts) from `GET /provider-models`. Some models accept no reasoning control. `pi`, `opencode` and `prime-agent` also expose models routed through OpenRouter and llmgateway (ids like `openrouter:anthropic/claude-sonnet-4.5`).
18
18
  *
@@ -78,6 +78,7 @@ export declare const PromptRequestProviderEnum: {
78
78
  readonly Prime: 'prime';
79
79
  readonly Kimi: 'kimi';
80
80
  readonly KimiCode: 'kimi-code';
81
+ readonly Mistral: 'mistral';
81
82
  };
82
83
  export type PromptRequestProviderEnum = typeof PromptRequestProviderEnum[keyof typeof PromptRequestProviderEnum];
83
84
  /**
@@ -23,7 +23,8 @@ export const PromptRequestProviderEnum = {
23
23
  PrimeAgent: 'prime-agent',
24
24
  Prime: 'prime',
25
25
  Kimi: 'kimi',
26
- KimiCode: 'kimi-code'
26
+ KimiCode: 'kimi-code',
27
+ Mistral: 'mistral'
27
28
  };
28
29
  /**
29
30
  * Check if a given object implements the PromptRequest interface.
@@ -10,6 +10,7 @@
10
10
  * Do not edit the class manually.
11
11
  */
12
12
  import type { SandboxTeam } from './SandboxTeam';
13
+ import type { StopOperation } from './StopOperation';
13
14
  /**
14
15
  *
15
16
  * @export
@@ -58,6 +59,18 @@ export interface Sandbox {
58
59
  * @memberof Sandbox
59
60
  */
60
61
  degradedSince?: Date | null;
62
+ /**
63
+ * True once every file of the sandbox's snapshot is on its disk. A resumed or forked sandbox is usable before that: its files keep copying in the background, and its docker volumes move onto the real disk near the end. Its docker containers start earlier; at that point their volume mounts move onto the real disk in place, without a restart. The `sandbox.hydrated` webhook fires at the same moment this turns true. A sandbox that restored nothing is hydrated from the start.
64
+ * @type {boolean}
65
+ * @memberof Sandbox
66
+ */
67
+ hydrated?: boolean;
68
+ /**
69
+ * When the last resume or fork finished copying files in, or null.
70
+ * @type {Date}
71
+ * @memberof Sandbox
72
+ */
73
+ hydratedAt?: Date | null;
61
74
  /**
62
75
  * Current machine size: what the sandbox was created with, or the size it was last resumed or forked onto.
63
76
  * @type {SandboxTypeEnum}
@@ -238,6 +251,12 @@ export interface Sandbox {
238
251
  * @memberof Sandbox
239
252
  */
240
253
  environmentVersion?: number | null;
254
+ /**
255
+ * The last stop you requested (`POST /sandboxes/{sandboxId}/stop`), or null if you never stopped this sandbox.
256
+ * @type {StopOperation}
257
+ * @memberof Sandbox
258
+ */
259
+ stop?: StopOperation | null;
241
260
  }
242
261
  /**
243
262
  * @export
@@ -12,6 +12,7 @@
12
12
  * Do not edit the class manually.
13
13
  */
14
14
  import { SandboxTeamFromJSON, SandboxTeamToJSON, } from './SandboxTeam';
15
+ import { StopOperationFromJSON, StopOperationToJSON, } from './StopOperation';
15
16
  /**
16
17
  * @export
17
18
  */
@@ -108,6 +109,8 @@ export function SandboxFromJSONTyped(json, ignoreDiscriminator) {
108
109
  'health': json['health'] == null ? undefined : json['health'],
109
110
  'healthReason': json['healthReason'] == null ? undefined : json['healthReason'],
110
111
  'degradedSince': json['degradedSince'] == null ? undefined : (new Date(json['degradedSince'])),
112
+ 'hydrated': json['hydrated'] == null ? undefined : json['hydrated'],
113
+ 'hydratedAt': json['hydratedAt'] == null ? undefined : (new Date(json['hydratedAt'])),
111
114
  'type': json['type'] == null ? undefined : json['type'],
112
115
  'vcpu': json['vcpu'] == null ? undefined : json['vcpu'],
113
116
  'memoryGB': json['memoryGB'] == null ? undefined : json['memoryGB'],
@@ -138,6 +141,7 @@ export function SandboxFromJSONTyped(json, ignoreDiscriminator) {
138
141
  'setupError': json['setupError'] == null ? undefined : json['setupError'],
139
142
  'environment': json['environment'] == null ? undefined : json['environment'],
140
143
  'environmentVersion': json['environmentVersion'] == null ? undefined : json['environmentVersion'],
144
+ 'stop': json['stop'] == null ? undefined : StopOperationFromJSON(json['stop']),
141
145
  };
142
146
  }
143
147
  export function SandboxToJSON(json) {
@@ -155,6 +159,8 @@ export function SandboxToJSONTyped(value, ignoreDiscriminator = false) {
155
159
  'health': value['health'],
156
160
  'healthReason': value['healthReason'],
157
161
  'degradedSince': value['degradedSince'] == null ? value['degradedSince'] : value['degradedSince'].toISOString(),
162
+ 'hydrated': value['hydrated'],
163
+ 'hydratedAt': value['hydratedAt'] == null ? value['hydratedAt'] : value['hydratedAt'].toISOString(),
158
164
  'type': value['type'],
159
165
  'vcpu': value['vcpu'],
160
166
  'memoryGB': value['memoryGB'],
@@ -185,5 +191,6 @@ export function SandboxToJSONTyped(value, ignoreDiscriminator = false) {
185
191
  'setupError': value['setupError'],
186
192
  'environment': value['environment'],
187
193
  'environmentVersion': value['environmentVersion'],
194
+ 'stop': StopOperationToJSON(value['stop']),
188
195
  };
189
196
  }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Boat Public API v1
3
+ * Public JSON API for creating, operating, prompting, observing, and exposing sandboxes from backend services, CI jobs, hosted workers, and Boat automation products. The v1 reference intentionally documents the developer integration surface only. Dashboard billing actions are not part of v1.
4
+ *
5
+ * The version of the OpenAPI document: 1.0.0
6
+ *
7
+ *
8
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9
+ * https://openapi-generator.tech
10
+ * Do not edit the class manually.
11
+ */
12
+ /**
13
+ *
14
+ * @export
15
+ * @interface StopOperation
16
+ */
17
+ export interface StopOperation {
18
+ /**
19
+ * Stable id of this stop. Calling stop again while it is pending returns the same id.
20
+ * @type {string}
21
+ * @memberof StopOperation
22
+ */
23
+ id: string;
24
+ /**
25
+ * `pending`: accepted, the sandbox is archiving. `failing`: the last attempt failed (see `error`); it is retried automatically until the sandbox archives. Running commands or prompts does not cancel it. `completed`: the sandbox is archived. `superseded`: a resume ended it before it completed.
26
+ * @type {StopOperationStatusEnum}
27
+ * @memberof StopOperation
28
+ */
29
+ status: StopOperationStatusEnum;
30
+ /**
31
+ * When the stop was accepted. Null once it has ended.
32
+ * @type {Date}
33
+ * @memberof StopOperation
34
+ */
35
+ requestedAt: Date | null;
36
+ /**
37
+ * When the last archival attempt ended.
38
+ * @type {Date}
39
+ * @memberof StopOperation
40
+ */
41
+ lastAttemptAt: Date | null;
42
+ /**
43
+ * Why the last attempt failed, while `status` is `failing`. Otherwise null.
44
+ * @type {string}
45
+ * @memberof StopOperation
46
+ */
47
+ error: string | null;
48
+ /**
49
+ * When the stop completed or was superseded.
50
+ * @type {Date}
51
+ * @memberof StopOperation
52
+ */
53
+ endedAt: Date | null;
54
+ }
55
+ /**
56
+ * @export
57
+ */
58
+ export declare const StopOperationStatusEnum: {
59
+ readonly Pending: 'pending';
60
+ readonly Failing: 'failing';
61
+ readonly Completed: 'completed';
62
+ readonly Superseded: 'superseded';
63
+ };
64
+ export type StopOperationStatusEnum = typeof StopOperationStatusEnum[keyof typeof StopOperationStatusEnum];
65
+ /**
66
+ * Check if a given object implements the StopOperation interface.
67
+ */
68
+ export declare function instanceOfStopOperation(value: object): value is StopOperation;
69
+ export declare function StopOperationFromJSON(json: any): StopOperation;
70
+ export declare function StopOperationFromJSONTyped(json: any, ignoreDiscriminator: boolean): StopOperation;
71
+ export declare function StopOperationToJSON(json: any): StopOperation;
72
+ export declare function StopOperationToJSONTyped(value?: StopOperation | null, ignoreDiscriminator?: boolean): any;
@@ -0,0 +1,72 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /**
4
+ * Boat Public API v1
5
+ * Public JSON API for creating, operating, prompting, observing, and exposing sandboxes from backend services, CI jobs, hosted workers, and Boat automation products. The v1 reference intentionally documents the developer integration surface only. Dashboard billing actions are not part of v1.
6
+ *
7
+ * The version of the OpenAPI document: 1.0.0
8
+ *
9
+ *
10
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11
+ * https://openapi-generator.tech
12
+ * Do not edit the class manually.
13
+ */
14
+ /**
15
+ * @export
16
+ */
17
+ export const StopOperationStatusEnum = {
18
+ Pending: 'pending',
19
+ Failing: 'failing',
20
+ Completed: 'completed',
21
+ Superseded: 'superseded'
22
+ };
23
+ /**
24
+ * Check if a given object implements the StopOperation interface.
25
+ */
26
+ export function instanceOfStopOperation(value) {
27
+ if (!('id' in value) || value['id'] === undefined)
28
+ return false;
29
+ if (!('status' in value) || value['status'] === undefined)
30
+ return false;
31
+ if (!('requestedAt' in value) || value['requestedAt'] === undefined)
32
+ return false;
33
+ if (!('lastAttemptAt' in value) || value['lastAttemptAt'] === undefined)
34
+ return false;
35
+ if (!('error' in value) || value['error'] === undefined)
36
+ return false;
37
+ if (!('endedAt' in value) || value['endedAt'] === undefined)
38
+ return false;
39
+ return true;
40
+ }
41
+ export function StopOperationFromJSON(json) {
42
+ return StopOperationFromJSONTyped(json, false);
43
+ }
44
+ export function StopOperationFromJSONTyped(json, ignoreDiscriminator) {
45
+ if (json == null) {
46
+ return json;
47
+ }
48
+ return {
49
+ 'id': json['id'],
50
+ 'status': json['status'],
51
+ 'requestedAt': (json['requestedAt'] == null ? null : new Date(json['requestedAt'])),
52
+ 'lastAttemptAt': (json['lastAttemptAt'] == null ? null : new Date(json['lastAttemptAt'])),
53
+ 'error': json['error'],
54
+ 'endedAt': (json['endedAt'] == null ? null : new Date(json['endedAt'])),
55
+ };
56
+ }
57
+ export function StopOperationToJSON(json) {
58
+ return StopOperationToJSONTyped(json, false);
59
+ }
60
+ export function StopOperationToJSONTyped(value, ignoreDiscriminator = false) {
61
+ if (value == null) {
62
+ return value;
63
+ }
64
+ return {
65
+ 'id': value['id'],
66
+ 'status': value['status'],
67
+ 'requestedAt': value['requestedAt'] == null ? value['requestedAt'] : value['requestedAt'].toISOString(),
68
+ 'lastAttemptAt': value['lastAttemptAt'] == null ? value['lastAttemptAt'] : value['lastAttemptAt'].toISOString(),
69
+ 'error': value['error'],
70
+ 'endedAt': value['endedAt'] == null ? value['endedAt'] : value['endedAt'].toISOString(),
71
+ };
72
+ }
@@ -116,6 +116,7 @@ export * from './SteerEvent';
116
116
  export * from './SteerEventData';
117
117
  export * from './SteerRequest';
118
118
  export * from './SteerResponse';
119
+ export * from './StopOperation';
119
120
  export * from './StopRequest';
120
121
  export * from './SuccessBase';
121
122
  export * from './UnknownEvent';
@@ -118,6 +118,7 @@ export * from './SteerEvent';
118
118
  export * from './SteerEventData';
119
119
  export * from './SteerRequest';
120
120
  export * from './SteerResponse';
121
+ export * from './StopOperation';
121
122
  export * from './StopRequest';
122
123
  export * from './SuccessBase';
123
124
  export * from './UnknownEvent';
@@ -46,7 +46,7 @@ export interface Conversation {
46
46
  */
47
47
  running: boolean;
48
48
  /**
49
- * Harness the most recent prompt ran on (`claude`, `codex`, `pi`, `opencode`, `prime-agent`, `kimi`).
49
+ * Harness the most recent prompt ran on (`claude`, `codex`, `pi`, `opencode`, `prime-agent`, `kimi`, `mistral`).
50
50
  * @type {string}
51
51
  * @memberof Conversation
52
52
  */
@@ -12,7 +12,7 @@
12
12
  /**
13
13
  * Work item to queue inside an existing sandbox. Provider credentials must already be configured in the Boat dashboard.
14
14
  *
15
- * **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`). Omit `provider` to use the harness the user selected on the Agents dashboard.
15
+ * **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`), `mistral` (Mistral Vibe). Omit `provider` to use the harness the user selected on the Agents dashboard.
16
16
  *
17
17
  * **Models & reasoning effort** are harness- and model-specific and change over time. Fetch the live catalog (every provider's models and which reasoning-effort levels each accepts) from `GET /provider-models`. Some models accept no reasoning control. `pi`, `opencode` and `prime-agent` also expose models routed through OpenRouter and llmgateway (ids like `openrouter:anthropic/claude-sonnet-4.5`).
18
18
  *
@@ -78,6 +78,7 @@ export declare const PromptRequestProviderEnum: {
78
78
  readonly Prime: 'prime';
79
79
  readonly Kimi: 'kimi';
80
80
  readonly KimiCode: 'kimi-code';
81
+ readonly Mistral: 'mistral';
81
82
  };
82
83
  export type PromptRequestProviderEnum = typeof PromptRequestProviderEnum[keyof typeof PromptRequestProviderEnum];
83
84
  /**
@@ -31,7 +31,8 @@ exports.PromptRequestProviderEnum = {
31
31
  PrimeAgent: 'prime-agent',
32
32
  Prime: 'prime',
33
33
  Kimi: 'kimi',
34
- KimiCode: 'kimi-code'
34
+ KimiCode: 'kimi-code',
35
+ Mistral: 'mistral'
35
36
  };
36
37
  /**
37
38
  * Check if a given object implements the PromptRequest interface.
@@ -10,6 +10,7 @@
10
10
  * Do not edit the class manually.
11
11
  */
12
12
  import type { SandboxTeam } from './SandboxTeam';
13
+ import type { StopOperation } from './StopOperation';
13
14
  /**
14
15
  *
15
16
  * @export
@@ -58,6 +59,18 @@ export interface Sandbox {
58
59
  * @memberof Sandbox
59
60
  */
60
61
  degradedSince?: Date | null;
62
+ /**
63
+ * True once every file of the sandbox's snapshot is on its disk. A resumed or forked sandbox is usable before that: its files keep copying in the background, and its docker volumes move onto the real disk near the end. Its docker containers start earlier; at that point their volume mounts move onto the real disk in place, without a restart. The `sandbox.hydrated` webhook fires at the same moment this turns true. A sandbox that restored nothing is hydrated from the start.
64
+ * @type {boolean}
65
+ * @memberof Sandbox
66
+ */
67
+ hydrated?: boolean;
68
+ /**
69
+ * When the last resume or fork finished copying files in, or null.
70
+ * @type {Date}
71
+ * @memberof Sandbox
72
+ */
73
+ hydratedAt?: Date | null;
61
74
  /**
62
75
  * Current machine size: what the sandbox was created with, or the size it was last resumed or forked onto.
63
76
  * @type {SandboxTypeEnum}
@@ -238,6 +251,12 @@ export interface Sandbox {
238
251
  * @memberof Sandbox
239
252
  */
240
253
  environmentVersion?: number | null;
254
+ /**
255
+ * The last stop you requested (`POST /sandboxes/{sandboxId}/stop`), or null if you never stopped this sandbox.
256
+ * @type {StopOperation}
257
+ * @memberof Sandbox
258
+ */
259
+ stop?: StopOperation | null;
241
260
  }
242
261
  /**
243
262
  * @export
@@ -20,6 +20,7 @@ exports.SandboxFromJSONTyped = SandboxFromJSONTyped;
20
20
  exports.SandboxToJSON = SandboxToJSON;
21
21
  exports.SandboxToJSONTyped = SandboxToJSONTyped;
22
22
  const SandboxTeam_1 = require("./SandboxTeam");
23
+ const StopOperation_1 = require("./StopOperation");
23
24
  /**
24
25
  * @export
25
26
  */
@@ -116,6 +117,8 @@ function SandboxFromJSONTyped(json, ignoreDiscriminator) {
116
117
  'health': json['health'] == null ? undefined : json['health'],
117
118
  'healthReason': json['healthReason'] == null ? undefined : json['healthReason'],
118
119
  'degradedSince': json['degradedSince'] == null ? undefined : (new Date(json['degradedSince'])),
120
+ 'hydrated': json['hydrated'] == null ? undefined : json['hydrated'],
121
+ 'hydratedAt': json['hydratedAt'] == null ? undefined : (new Date(json['hydratedAt'])),
119
122
  'type': json['type'] == null ? undefined : json['type'],
120
123
  'vcpu': json['vcpu'] == null ? undefined : json['vcpu'],
121
124
  'memoryGB': json['memoryGB'] == null ? undefined : json['memoryGB'],
@@ -146,6 +149,7 @@ function SandboxFromJSONTyped(json, ignoreDiscriminator) {
146
149
  'setupError': json['setupError'] == null ? undefined : json['setupError'],
147
150
  'environment': json['environment'] == null ? undefined : json['environment'],
148
151
  'environmentVersion': json['environmentVersion'] == null ? undefined : json['environmentVersion'],
152
+ 'stop': json['stop'] == null ? undefined : (0, StopOperation_1.StopOperationFromJSON)(json['stop']),
149
153
  };
150
154
  }
151
155
  function SandboxToJSON(json) {
@@ -163,6 +167,8 @@ function SandboxToJSONTyped(value, ignoreDiscriminator = false) {
163
167
  'health': value['health'],
164
168
  'healthReason': value['healthReason'],
165
169
  'degradedSince': value['degradedSince'] == null ? value['degradedSince'] : value['degradedSince'].toISOString(),
170
+ 'hydrated': value['hydrated'],
171
+ 'hydratedAt': value['hydratedAt'] == null ? value['hydratedAt'] : value['hydratedAt'].toISOString(),
166
172
  'type': value['type'],
167
173
  'vcpu': value['vcpu'],
168
174
  'memoryGB': value['memoryGB'],
@@ -193,5 +199,6 @@ function SandboxToJSONTyped(value, ignoreDiscriminator = false) {
193
199
  'setupError': value['setupError'],
194
200
  'environment': value['environment'],
195
201
  'environmentVersion': value['environmentVersion'],
202
+ 'stop': (0, StopOperation_1.StopOperationToJSON)(value['stop']),
196
203
  };
197
204
  }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Boat Public API v1
3
+ * Public JSON API for creating, operating, prompting, observing, and exposing sandboxes from backend services, CI jobs, hosted workers, and Boat automation products. The v1 reference intentionally documents the developer integration surface only. Dashboard billing actions are not part of v1.
4
+ *
5
+ * The version of the OpenAPI document: 1.0.0
6
+ *
7
+ *
8
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9
+ * https://openapi-generator.tech
10
+ * Do not edit the class manually.
11
+ */
12
+ /**
13
+ *
14
+ * @export
15
+ * @interface StopOperation
16
+ */
17
+ export interface StopOperation {
18
+ /**
19
+ * Stable id of this stop. Calling stop again while it is pending returns the same id.
20
+ * @type {string}
21
+ * @memberof StopOperation
22
+ */
23
+ id: string;
24
+ /**
25
+ * `pending`: accepted, the sandbox is archiving. `failing`: the last attempt failed (see `error`); it is retried automatically until the sandbox archives. Running commands or prompts does not cancel it. `completed`: the sandbox is archived. `superseded`: a resume ended it before it completed.
26
+ * @type {StopOperationStatusEnum}
27
+ * @memberof StopOperation
28
+ */
29
+ status: StopOperationStatusEnum;
30
+ /**
31
+ * When the stop was accepted. Null once it has ended.
32
+ * @type {Date}
33
+ * @memberof StopOperation
34
+ */
35
+ requestedAt: Date | null;
36
+ /**
37
+ * When the last archival attempt ended.
38
+ * @type {Date}
39
+ * @memberof StopOperation
40
+ */
41
+ lastAttemptAt: Date | null;
42
+ /**
43
+ * Why the last attempt failed, while `status` is `failing`. Otherwise null.
44
+ * @type {string}
45
+ * @memberof StopOperation
46
+ */
47
+ error: string | null;
48
+ /**
49
+ * When the stop completed or was superseded.
50
+ * @type {Date}
51
+ * @memberof StopOperation
52
+ */
53
+ endedAt: Date | null;
54
+ }
55
+ /**
56
+ * @export
57
+ */
58
+ export declare const StopOperationStatusEnum: {
59
+ readonly Pending: 'pending';
60
+ readonly Failing: 'failing';
61
+ readonly Completed: 'completed';
62
+ readonly Superseded: 'superseded';
63
+ };
64
+ export type StopOperationStatusEnum = typeof StopOperationStatusEnum[keyof typeof StopOperationStatusEnum];
65
+ /**
66
+ * Check if a given object implements the StopOperation interface.
67
+ */
68
+ export declare function instanceOfStopOperation(value: object): value is StopOperation;
69
+ export declare function StopOperationFromJSON(json: any): StopOperation;
70
+ export declare function StopOperationFromJSONTyped(json: any, ignoreDiscriminator: boolean): StopOperation;
71
+ export declare function StopOperationToJSON(json: any): StopOperation;
72
+ export declare function StopOperationToJSONTyped(value?: StopOperation | null, ignoreDiscriminator?: boolean): any;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /* tslint:disable */
3
+ /* eslint-disable */
4
+ /**
5
+ * Boat Public API v1
6
+ * Public JSON API for creating, operating, prompting, observing, and exposing sandboxes from backend services, CI jobs, hosted workers, and Boat automation products. The v1 reference intentionally documents the developer integration surface only. Dashboard billing actions are not part of v1.
7
+ *
8
+ * The version of the OpenAPI document: 1.0.0
9
+ *
10
+ *
11
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
12
+ * https://openapi-generator.tech
13
+ * Do not edit the class manually.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.StopOperationStatusEnum = void 0;
17
+ exports.instanceOfStopOperation = instanceOfStopOperation;
18
+ exports.StopOperationFromJSON = StopOperationFromJSON;
19
+ exports.StopOperationFromJSONTyped = StopOperationFromJSONTyped;
20
+ exports.StopOperationToJSON = StopOperationToJSON;
21
+ exports.StopOperationToJSONTyped = StopOperationToJSONTyped;
22
+ /**
23
+ * @export
24
+ */
25
+ exports.StopOperationStatusEnum = {
26
+ Pending: 'pending',
27
+ Failing: 'failing',
28
+ Completed: 'completed',
29
+ Superseded: 'superseded'
30
+ };
31
+ /**
32
+ * Check if a given object implements the StopOperation interface.
33
+ */
34
+ function instanceOfStopOperation(value) {
35
+ if (!('id' in value) || value['id'] === undefined)
36
+ return false;
37
+ if (!('status' in value) || value['status'] === undefined)
38
+ return false;
39
+ if (!('requestedAt' in value) || value['requestedAt'] === undefined)
40
+ return false;
41
+ if (!('lastAttemptAt' in value) || value['lastAttemptAt'] === undefined)
42
+ return false;
43
+ if (!('error' in value) || value['error'] === undefined)
44
+ return false;
45
+ if (!('endedAt' in value) || value['endedAt'] === undefined)
46
+ return false;
47
+ return true;
48
+ }
49
+ function StopOperationFromJSON(json) {
50
+ return StopOperationFromJSONTyped(json, false);
51
+ }
52
+ function StopOperationFromJSONTyped(json, ignoreDiscriminator) {
53
+ if (json == null) {
54
+ return json;
55
+ }
56
+ return {
57
+ 'id': json['id'],
58
+ 'status': json['status'],
59
+ 'requestedAt': (json['requestedAt'] == null ? null : new Date(json['requestedAt'])),
60
+ 'lastAttemptAt': (json['lastAttemptAt'] == null ? null : new Date(json['lastAttemptAt'])),
61
+ 'error': json['error'],
62
+ 'endedAt': (json['endedAt'] == null ? null : new Date(json['endedAt'])),
63
+ };
64
+ }
65
+ function StopOperationToJSON(json) {
66
+ return StopOperationToJSONTyped(json, false);
67
+ }
68
+ function StopOperationToJSONTyped(value, ignoreDiscriminator = false) {
69
+ if (value == null) {
70
+ return value;
71
+ }
72
+ return {
73
+ 'id': value['id'],
74
+ 'status': value['status'],
75
+ 'requestedAt': value['requestedAt'] == null ? value['requestedAt'] : value['requestedAt'].toISOString(),
76
+ 'lastAttemptAt': value['lastAttemptAt'] == null ? value['lastAttemptAt'] : value['lastAttemptAt'].toISOString(),
77
+ 'error': value['error'],
78
+ 'endedAt': value['endedAt'] == null ? value['endedAt'] : value['endedAt'].toISOString(),
79
+ };
80
+ }
@@ -116,6 +116,7 @@ export * from './SteerEvent';
116
116
  export * from './SteerEventData';
117
117
  export * from './SteerRequest';
118
118
  export * from './SteerResponse';
119
+ export * from './StopOperation';
119
120
  export * from './StopRequest';
120
121
  export * from './SuccessBase';
121
122
  export * from './UnknownEvent';
@@ -134,6 +134,7 @@ __exportStar(require("./SteerEvent"), exports);
134
134
  __exportStar(require("./SteerEventData"), exports);
135
135
  __exportStar(require("./SteerRequest"), exports);
136
136
  __exportStar(require("./SteerResponse"), exports);
137
+ __exportStar(require("./StopOperation"), exports);
137
138
  __exportStar(require("./StopRequest"), exports);
138
139
  __exportStar(require("./SuccessBase"), exports);
139
140
  __exportStar(require("./UnknownEvent"), exports);
package/docs/BoatApi.md CHANGED
@@ -4600,7 +4600,7 @@ example().catch(console.error);
4600
4600
 
4601
4601
  Stop and archive sandbox
4602
4602
 
4603
- Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\&#39;s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set &#x60;force: true&#x60; to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
4603
+ Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\&#39;s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as &#x60;stop&#x60;, with an &#x60;id&#x60; and a &#x60;status&#x60;. Poll &#x60;GET /sandboxes/{sandboxId}&#x60; until &#x60;stop.status&#x60; is &#x60;completed&#x60;. A failed attempt shows &#x60;failing&#x60; with its &#x60;error&#x60; and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (&#x60;superseded&#x60;). Calling stop again while one is pending returns the same &#x60;id&#x60;. Set &#x60;force: true&#x60; to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
4604
4604
 
4605
4605
  ### Example
4606
4606
 
@@ -1,7 +1,7 @@
1
1
 
2
2
  # PromptRequest
3
3
 
4
- Work item to queue inside an existing sandbox. Provider credentials must already be configured in the Boat dashboard. **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`). Omit `provider` to use the harness the user selected on the Agents dashboard. **Models & reasoning effort** are harness- and model-specific and change over time. Fetch the live catalog (every provider\'s models and which reasoning-effort levels each accepts) from `GET /provider-models`. Some models accept no reasoning control. `pi`, `opencode` and `prime-agent` also expose models routed through OpenRouter and llmgateway (ids like `openrouter:anthropic/claude-sonnet-4.5`). **Conversations:** a sandbox runs many conversations in parallel, each with its own history. Set `new: true` to start a fresh conversation, or `conversationId` to continue a specific one; omit both to continue the sandbox\'s most-recently-active conversation. The response returns the `conversationId` this prompt ran in. Conversations run concurrently up to a per-sandbox limit that scales with the sandbox\'s memory; beyond it, prompts queue.
4
+ Work item to queue inside an existing sandbox. Provider credentials must already be configured in the Boat dashboard. **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`), `mistral` (Mistral Vibe). Omit `provider` to use the harness the user selected on the Agents dashboard. **Models & reasoning effort** are harness- and model-specific and change over time. Fetch the live catalog (every provider\'s models and which reasoning-effort levels each accepts) from `GET /provider-models`. Some models accept no reasoning control. `pi`, `opencode` and `prime-agent` also expose models routed through OpenRouter and llmgateway (ids like `openrouter:anthropic/claude-sonnet-4.5`). **Conversations:** a sandbox runs many conversations in parallel, each with its own history. Set `new: true` to start a fresh conversation, or `conversationId` to continue a specific one; omit both to continue the sandbox\'s most-recently-active conversation. The response returns the `conversationId` this prompt ran in. Conversations run concurrently up to a per-sandbox limit that scales with the sandbox\'s memory; beyond it, prompts queue.
5
5
 
6
6
  ## Properties
7
7
 
package/docs/Sandbox.md CHANGED
@@ -13,6 +13,8 @@ Name | Type
13
13
  `health` | string
14
14
  `healthReason` | string
15
15
  `degradedSince` | Date
16
+ `hydrated` | boolean
17
+ `hydratedAt` | Date
16
18
  `type` | string
17
19
  `vcpu` | number
18
20
  `memoryGB` | number
@@ -43,6 +45,7 @@ Name | Type
43
45
  `setupError` | string
44
46
  `environment` | string
45
47
  `environmentVersion` | number
48
+ `stop` | [StopOperation](StopOperation.md)
46
49
 
47
50
  ## Example
48
51
 
@@ -58,6 +61,8 @@ const example = {
58
61
  "health": null,
59
62
  "healthReason": null,
60
63
  "degradedSince": null,
64
+ "hydrated": null,
65
+ "hydratedAt": null,
61
66
  "type": null,
62
67
  "vcpu": null,
63
68
  "memoryGB": null,
@@ -88,6 +93,7 @@ const example = {
88
93
  "setupError": null,
89
94
  "environment": null,
90
95
  "environmentVersion": null,
96
+ "stop": null,
91
97
  } satisfies Sandbox
92
98
 
93
99
  console.log(example)
@@ -0,0 +1,42 @@
1
+
2
+ # StopOperation
3
+
4
+
5
+ ## Properties
6
+
7
+ Name | Type
8
+ ------------ | -------------
9
+ `id` | string
10
+ `status` | string
11
+ `requestedAt` | Date
12
+ `lastAttemptAt` | Date
13
+ `error` | string
14
+ `endedAt` | Date
15
+
16
+ ## Example
17
+
18
+ ```typescript
19
+ import type { StopOperation } from '@boatdev/sdk'
20
+
21
+ // TODO: Update the object below with actual values
22
+ const example = {
23
+ "id": null,
24
+ "status": null,
25
+ "requestedAt": null,
26
+ "lastAttemptAt": null,
27
+ "error": null,
28
+ "endedAt": null,
29
+ } satisfies StopOperation
30
+
31
+ console.log(example)
32
+
33
+ // Convert the instance to a JSON string
34
+ const exampleJSON: string = JSON.stringify(example)
35
+ console.log(exampleJSON)
36
+
37
+ // Parse the JSON string back to an object
38
+ const exampleParsed = JSON.parse(exampleJSON) as StopOperation
39
+ console.log(exampleParsed)
40
+ ```
41
+
42
+ [[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boatdev/sdk",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "OpenAPI client for @boatdev/sdk",
5
5
  "author": "OpenAPI-Generator",
6
6
  "license": "MIT",
@@ -4318,7 +4318,7 @@ export class BoatApi extends runtime.BaseAPI {
4318
4318
  }
4319
4319
 
4320
4320
  /**
4321
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
4321
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
4322
4322
  * Stop and archive sandbox
4323
4323
  */
4324
4324
  async stopRaw(requestParameters: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<SandboxActionResponse>> {
@@ -4329,7 +4329,7 @@ export class BoatApi extends runtime.BaseAPI {
4329
4329
  }
4330
4330
 
4331
4331
  /**
4332
- * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
4332
+ * Stop active work and archive/snapshot the sandbox for later resume or fork. A stop always saves the sandbox\'s disk first. If that save is failing, the stop is refused and the sandbox keeps running so your work is not discarded, we retry automatically and email you. You are not billed for time spent in that state. The stop is an operation: the response and the sandbox carry it as `stop`, with an `id` and a `status`. Poll `GET /sandboxes/{sandboxId}` until `stop.status` is `completed`. A failed attempt shows `failing` with its `error` and is retried until the sandbox archives; commands and prompts you send meanwhile do not cancel it. Only a resume ends it early (`superseded`). Calling stop again while one is pending returns the same `id`. Set `force: true` to stop anyway, accepting the loss of everything written since the last successful snapshot. This is irreversible; only reach for it after a stop has already failed.
4333
4333
  * Stop and archive sandbox
4334
4334
  */
4335
4335
  async stop(requestParameters: StopOperationRequest | runtime.FlatBody<StopOperationRequest, 'stopRequest'>, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<SandboxActionResponse> {
@@ -50,7 +50,7 @@ export interface Conversation {
50
50
  */
51
51
  running: boolean;
52
52
  /**
53
- * Harness the most recent prompt ran on (`claude`, `codex`, `pi`, `opencode`, `prime-agent`, `kimi`).
53
+ * Harness the most recent prompt ran on (`claude`, `codex`, `pi`, `opencode`, `prime-agent`, `kimi`, `mistral`).
54
54
  * @type {string}
55
55
  * @memberof Conversation
56
56
  */
@@ -16,7 +16,7 @@ import { mapValues } from '../runtime';
16
16
  /**
17
17
  * Work item to queue inside an existing sandbox. Provider credentials must already be configured in the Boat dashboard.
18
18
  *
19
- * **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`). Omit `provider` to use the harness the user selected on the Agents dashboard.
19
+ * **Providers (harnesses):** `codex`, `claude-code` (alias `claude`), `pi`, `opencode`, `prime-agent` (alias `prime`), `kimi` (Kimi Code CLI, alias `kimi-code`), `mistral` (Mistral Vibe). Omit `provider` to use the harness the user selected on the Agents dashboard.
20
20
  *
21
21
  * **Models & reasoning effort** are harness- and model-specific and change over time. Fetch the live catalog (every provider's models and which reasoning-effort levels each accepts) from `GET /provider-models`. Some models accept no reasoning control. `pi`, `opencode` and `prime-agent` also expose models routed through OpenRouter and llmgateway (ids like `openrouter:anthropic/claude-sonnet-4.5`).
22
22
  *
@@ -83,7 +83,8 @@ export const PromptRequestProviderEnum = {
83
83
  PrimeAgent: 'prime-agent',
84
84
  Prime: 'prime',
85
85
  Kimi: 'kimi',
86
- KimiCode: 'kimi-code'
86
+ KimiCode: 'kimi-code',
87
+ Mistral: 'mistral'
87
88
  } as const;
88
89
  export type PromptRequestProviderEnum = typeof PromptRequestProviderEnum[keyof typeof PromptRequestProviderEnum];
89
90
 
@@ -20,6 +20,13 @@ import {
20
20
  SandboxTeamToJSON,
21
21
  SandboxTeamToJSONTyped,
22
22
  } from './SandboxTeam';
23
+ import type { StopOperation } from './StopOperation';
24
+ import {
25
+ StopOperationFromJSON,
26
+ StopOperationFromJSONTyped,
27
+ StopOperationToJSON,
28
+ StopOperationToJSONTyped,
29
+ } from './StopOperation';
23
30
 
24
31
  /**
25
32
  *
@@ -69,6 +76,18 @@ export interface Sandbox {
69
76
  * @memberof Sandbox
70
77
  */
71
78
  degradedSince?: Date | null;
79
+ /**
80
+ * True once every file of the sandbox's snapshot is on its disk. A resumed or forked sandbox is usable before that: its files keep copying in the background, and its docker volumes move onto the real disk near the end. Its docker containers start earlier; at that point their volume mounts move onto the real disk in place, without a restart. The `sandbox.hydrated` webhook fires at the same moment this turns true. A sandbox that restored nothing is hydrated from the start.
81
+ * @type {boolean}
82
+ * @memberof Sandbox
83
+ */
84
+ hydrated?: boolean;
85
+ /**
86
+ * When the last resume or fork finished copying files in, or null.
87
+ * @type {Date}
88
+ * @memberof Sandbox
89
+ */
90
+ hydratedAt?: Date | null;
72
91
  /**
73
92
  * Current machine size: what the sandbox was created with, or the size it was last resumed or forked onto.
74
93
  * @type {SandboxTypeEnum}
@@ -249,6 +268,12 @@ export interface Sandbox {
249
268
  * @memberof Sandbox
250
269
  */
251
270
  environmentVersion?: number | null;
271
+ /**
272
+ * The last stop you requested (`POST /sandboxes/{sandboxId}/stop`), or null if you never stopped this sandbox.
273
+ * @type {StopOperation}
274
+ * @memberof Sandbox
275
+ */
276
+ stop?: StopOperation | null;
252
277
  }
253
278
 
254
279
 
@@ -361,6 +386,8 @@ export function SandboxFromJSONTyped(json: any, ignoreDiscriminator: boolean): S
361
386
  'health': json['health'] == null ? undefined : json['health'],
362
387
  'healthReason': json['healthReason'] == null ? undefined : json['healthReason'],
363
388
  'degradedSince': json['degradedSince'] == null ? undefined : (new Date(json['degradedSince'])),
389
+ 'hydrated': json['hydrated'] == null ? undefined : json['hydrated'],
390
+ 'hydratedAt': json['hydratedAt'] == null ? undefined : (new Date(json['hydratedAt'])),
364
391
  'type': json['type'] == null ? undefined : json['type'],
365
392
  'vcpu': json['vcpu'] == null ? undefined : json['vcpu'],
366
393
  'memoryGB': json['memoryGB'] == null ? undefined : json['memoryGB'],
@@ -391,6 +418,7 @@ export function SandboxFromJSONTyped(json: any, ignoreDiscriminator: boolean): S
391
418
  'setupError': json['setupError'] == null ? undefined : json['setupError'],
392
419
  'environment': json['environment'] == null ? undefined : json['environment'],
393
420
  'environmentVersion': json['environmentVersion'] == null ? undefined : json['environmentVersion'],
421
+ 'stop': json['stop'] == null ? undefined : StopOperationFromJSON(json['stop']),
394
422
  };
395
423
  }
396
424
 
@@ -412,6 +440,8 @@ export function SandboxToJSONTyped(value?: Sandbox | null, ignoreDiscriminator:
412
440
  'health': value['health'],
413
441
  'healthReason': value['healthReason'],
414
442
  'degradedSince': value['degradedSince'] == null ? value['degradedSince'] : value['degradedSince'].toISOString(),
443
+ 'hydrated': value['hydrated'],
444
+ 'hydratedAt': value['hydratedAt'] == null ? value['hydratedAt'] : value['hydratedAt'].toISOString(),
415
445
  'type': value['type'],
416
446
  'vcpu': value['vcpu'],
417
447
  'memoryGB': value['memoryGB'],
@@ -442,6 +472,7 @@ export function SandboxToJSONTyped(value?: Sandbox | null, ignoreDiscriminator:
442
472
  'setupError': value['setupError'],
443
473
  'environment': value['environment'],
444
474
  'environmentVersion': value['environmentVersion'],
475
+ 'stop': StopOperationToJSON(value['stop']),
445
476
  };
446
477
  }
447
478
 
@@ -0,0 +1,124 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /**
4
+ * Boat Public API v1
5
+ * Public JSON API for creating, operating, prompting, observing, and exposing sandboxes from backend services, CI jobs, hosted workers, and Boat automation products. The v1 reference intentionally documents the developer integration surface only. Dashboard billing actions are not part of v1.
6
+ *
7
+ * The version of the OpenAPI document: 1.0.0
8
+ *
9
+ *
10
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11
+ * https://openapi-generator.tech
12
+ * Do not edit the class manually.
13
+ */
14
+
15
+ import { mapValues } from '../runtime';
16
+ /**
17
+ *
18
+ * @export
19
+ * @interface StopOperation
20
+ */
21
+ export interface StopOperation {
22
+ /**
23
+ * Stable id of this stop. Calling stop again while it is pending returns the same id.
24
+ * @type {string}
25
+ * @memberof StopOperation
26
+ */
27
+ id: string;
28
+ /**
29
+ * `pending`: accepted, the sandbox is archiving. `failing`: the last attempt failed (see `error`); it is retried automatically until the sandbox archives. Running commands or prompts does not cancel it. `completed`: the sandbox is archived. `superseded`: a resume ended it before it completed.
30
+ * @type {StopOperationStatusEnum}
31
+ * @memberof StopOperation
32
+ */
33
+ status: StopOperationStatusEnum;
34
+ /**
35
+ * When the stop was accepted. Null once it has ended.
36
+ * @type {Date}
37
+ * @memberof StopOperation
38
+ */
39
+ requestedAt: Date | null;
40
+ /**
41
+ * When the last archival attempt ended.
42
+ * @type {Date}
43
+ * @memberof StopOperation
44
+ */
45
+ lastAttemptAt: Date | null;
46
+ /**
47
+ * Why the last attempt failed, while `status` is `failing`. Otherwise null.
48
+ * @type {string}
49
+ * @memberof StopOperation
50
+ */
51
+ error: string | null;
52
+ /**
53
+ * When the stop completed or was superseded.
54
+ * @type {Date}
55
+ * @memberof StopOperation
56
+ */
57
+ endedAt: Date | null;
58
+ }
59
+
60
+
61
+ /**
62
+ * @export
63
+ */
64
+ export const StopOperationStatusEnum = {
65
+ Pending: 'pending',
66
+ Failing: 'failing',
67
+ Completed: 'completed',
68
+ Superseded: 'superseded'
69
+ } as const;
70
+ export type StopOperationStatusEnum = typeof StopOperationStatusEnum[keyof typeof StopOperationStatusEnum];
71
+
72
+
73
+ /**
74
+ * Check if a given object implements the StopOperation interface.
75
+ */
76
+ export function instanceOfStopOperation(value: object): value is StopOperation {
77
+ if (!('id' in value) || value['id'] === undefined) return false;
78
+ if (!('status' in value) || value['status'] === undefined) return false;
79
+ if (!('requestedAt' in value) || value['requestedAt'] === undefined) return false;
80
+ if (!('lastAttemptAt' in value) || value['lastAttemptAt'] === undefined) return false;
81
+ if (!('error' in value) || value['error'] === undefined) return false;
82
+ if (!('endedAt' in value) || value['endedAt'] === undefined) return false;
83
+ return true;
84
+ }
85
+
86
+ export function StopOperationFromJSON(json: any): StopOperation {
87
+ return StopOperationFromJSONTyped(json, false);
88
+ }
89
+
90
+ export function StopOperationFromJSONTyped(json: any, ignoreDiscriminator: boolean): StopOperation {
91
+ if (json == null) {
92
+ return json;
93
+ }
94
+ return {
95
+
96
+ 'id': json['id'],
97
+ 'status': json['status'],
98
+ 'requestedAt': (json['requestedAt'] == null ? null : new Date(json['requestedAt'])),
99
+ 'lastAttemptAt': (json['lastAttemptAt'] == null ? null : new Date(json['lastAttemptAt'])),
100
+ 'error': json['error'],
101
+ 'endedAt': (json['endedAt'] == null ? null : new Date(json['endedAt'])),
102
+ };
103
+ }
104
+
105
+ export function StopOperationToJSON(json: any): StopOperation {
106
+ return StopOperationToJSONTyped(json, false);
107
+ }
108
+
109
+ export function StopOperationToJSONTyped(value?: StopOperation | null, ignoreDiscriminator: boolean = false): any {
110
+ if (value == null) {
111
+ return value;
112
+ }
113
+
114
+ return {
115
+
116
+ 'id': value['id'],
117
+ 'status': value['status'],
118
+ 'requestedAt': value['requestedAt'] == null ? value['requestedAt'] : value['requestedAt'].toISOString(),
119
+ 'lastAttemptAt': value['lastAttemptAt'] == null ? value['lastAttemptAt'] : value['lastAttemptAt'].toISOString(),
120
+ 'error': value['error'],
121
+ 'endedAt': value['endedAt'] == null ? value['endedAt'] : value['endedAt'].toISOString(),
122
+ };
123
+ }
124
+
@@ -118,6 +118,7 @@ export * from './SteerEvent';
118
118
  export * from './SteerEventData';
119
119
  export * from './SteerRequest';
120
120
  export * from './SteerResponse';
121
+ export * from './StopOperation';
121
122
  export * from './StopRequest';
122
123
  export * from './SuccessBase';
123
124
  export * from './UnknownEvent';