@shardflux/sdk 0.13.1 → 0.14.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.
@@ -125,8 +125,8 @@ export interface paths {
125
125
  cookie?: never;
126
126
  };
127
127
  /**
128
- * Public keys (JWKS) for verifying ES256 workspace tool tokens
129
- * @description Consumed by the cell gateway. Tokens carry `kid`; TTL <= 15 min.
128
+ * Public keys (JWKS) for verifying ES256 workspace tool tokens and port tokens
129
+ * @description Consumed by the cell gateway. Tokens carry `kid`. Tool tokens live at most 15 min; port tokens (`sfp_` + JWS, aud shardflux-ports, contracts §39.3) at most 1 day (bearer) or 7 days (link): keep a rotated-out key in TOOL_TOKEN_KMS_VERIFY_KEYS for 7 days.
130
130
  */
131
131
  get: operations["getV1WellKnownToolTokenKeys"];
132
132
  put?: never;
@@ -602,6 +602,46 @@ export interface paths {
602
602
  patch?: never;
603
603
  trace?: never;
604
604
  };
605
+ "/v1/auth/signup": {
606
+ parameters: {
607
+ query?: never;
608
+ header?: never;
609
+ path?: never;
610
+ cookie?: never;
611
+ };
612
+ get?: never;
613
+ put?: never;
614
+ /**
615
+ * Sign up from an agent, without a browser or an email round-trip
616
+ * @description Returns a CLI session at once. With `codex_id_token` (a Codex CLI login, contracts §44.2) the email is verified and the request signs in to the account of that ChatGPT identity or email, creating it when there is none (201 when created, 200 when it signed in; `mfa_required` when the account has TOTP). With `email` only, a new unverified account is created (201) with `access: provisional` (resource routes on the default plan before verification) or `verification_required`; an address that already has an account is 409 conflict, details.reason `email_registered`. Verify later with POST /v1/auth/verify-email/code.
617
+ */
618
+ post: operations["postV1AuthSignup"];
619
+ delete?: never;
620
+ options?: never;
621
+ head?: never;
622
+ patch?: never;
623
+ trace?: never;
624
+ };
625
+ "/v1/auth/verify-email/code": {
626
+ parameters: {
627
+ query?: never;
628
+ header?: never;
629
+ path?: never;
630
+ cookie?: never;
631
+ };
632
+ get?: never;
633
+ put?: never;
634
+ /**
635
+ * Verify the email with a 6-digit code
636
+ * @description Without `code`: emails a 6-digit code to the account address (202; valid 15 minutes, once; a new one ends the previous). With `code`: verifies the address (200). The code proves that whoever holds this session reads the inbox, so nothing is signed out; the signup trial is granted when it applies. 5 wrong attempts end a code: 400 token_invalid.
637
+ */
638
+ post: operations["postV1AuthVerifyEmailCode"];
639
+ delete?: never;
640
+ options?: never;
641
+ head?: never;
642
+ patch?: never;
643
+ trace?: never;
644
+ };
605
645
  "/v1/auth/login": {
606
646
  parameters: {
607
647
  query?: never;
@@ -724,7 +764,7 @@ export interface paths {
724
764
  put?: never;
725
765
  /**
726
766
  * Re-authenticate for sensitive actions
727
- * @description Password, plus a TOTP or recovery code when MFA is enabled. Rotates the session; valid for STEP_UP_WINDOW_SECONDS.
767
+ * @description Password, or a Codex identity proof (`codex_id_token`) of a Codex login linked to the account (contracts §44.2), plus a TOTP or recovery code when MFA is enabled. Rotates the session; valid for STEP_UP_WINDOW_SECONDS.
728
768
  */
729
769
  post: operations["postV1AuthStepUp"];
730
770
  delete?: never;
@@ -1553,6 +1593,26 @@ export interface paths {
1553
1593
  patch?: never;
1554
1594
  trace?: never;
1555
1595
  };
1596
+ "/v1/workspaces/{workspace_id}/caps": {
1597
+ parameters: {
1598
+ query?: never;
1599
+ header?: never;
1600
+ path?: never;
1601
+ cookie?: never;
1602
+ };
1603
+ get?: never;
1604
+ put?: never;
1605
+ post?: never;
1606
+ delete?: never;
1607
+ options?: never;
1608
+ head?: never;
1609
+ /**
1610
+ * Resize a workspace: memory, its allocation mode, CPU and disk, running or suspended
1611
+ * @description Changes the caps of any workspace, fixed or elastic, running or suspended, without restarting or forking it. Each given field replaces the stored one (omitted fields keep theirs); every later start uses the new caps. Each value is bounded like caps at open: by the plan’s per-workspace maximum and the template’s limit (`limit_reason` plan or template). A running workspace changes live where it can (memory plugged or unplugged, CPU within its boot vCPUs, disk grown online); a suspended one gets the change right after its next resume, before the first call; what cannot apply now says `applies_at: next_start` and applies at the next start. The request is held until the resize finishes, up to `Prefer: wait=<seconds>` (default 20, at most 55): 200 ResizeResult (per resource: `applies_at` now | resume | next_start, requested, target, previous and applied values, `limit_reason`, `reason`) with the workspace caps; otherwise 202 with the `resize` operation, whose `result` carries the same per-resource fields when it succeeds. A resize that fails answers with its error. Errors (nothing changes): 409 conflict reason resize_not_available (not enabled for the organization), workspace_deleted, operation_in_progress (another lifecycle operation is active; details.active_operation_id, retryable); 422 validation_failed reason not_supported_for_mode (file-first workspace), shrink_not_supported (disk_gib below the current disk; details.current_disk_gib), requires_elastic (memory_mib_held without an elastic mode), exceeds_memory_mib (memory_mib_held above the maximum), allocation_mode_not_available (elastic memory is not available to the organization); 402 as for a start (no plan, new starts on hold). Owners, admins and members, and API keys with a tool permission. Supports Idempotency-Key.
1612
+ */
1613
+ patch: operations["patchV1WorkspacesWorkspaceIdCaps"];
1614
+ trace?: never;
1615
+ };
1556
1616
  "/v1/workspaces/{workspace_id}/suspend-when-idle": {
1557
1617
  parameters: {
1558
1618
  query?: never;
@@ -1946,6 +2006,26 @@ export interface paths {
1946
2006
  patch?: never;
1947
2007
  trace?: never;
1948
2008
  };
2009
+ "/api/v1/workspaces/{workspace_id}/caps": {
2010
+ parameters: {
2011
+ query?: never;
2012
+ header?: never;
2013
+ path?: never;
2014
+ cookie?: never;
2015
+ };
2016
+ get?: never;
2017
+ put?: never;
2018
+ post?: never;
2019
+ delete?: never;
2020
+ options?: never;
2021
+ head?: never;
2022
+ /**
2023
+ * Resize a workspace: memory, its allocation mode, CPU and disk, running or suspended
2024
+ * @description Changes the caps of any workspace, fixed or elastic, running or suspended, without restarting or forking it. Each given field replaces the stored one (omitted fields keep theirs); every later start uses the new caps. Each value is bounded like caps at open: by the plan’s per-workspace maximum and the template’s limit (`limit_reason` plan or template). A running workspace changes live where it can (memory plugged or unplugged, CPU within its boot vCPUs, disk grown online); a suspended one gets the change right after its next resume, before the first call; what cannot apply now says `applies_at: next_start` and applies at the next start. The request is held until the resize finishes, up to `Prefer: wait=<seconds>` (default 20, at most 55): 200 ResizeResult (per resource: `applies_at` now | resume | next_start, requested, target, previous and applied values, `limit_reason`, `reason`) with the workspace caps; otherwise 202 with the `resize` operation, whose `result` carries the same per-resource fields when it succeeds. A resize that fails answers with its error. Errors (nothing changes): 409 conflict reason resize_not_available (not enabled for the organization), workspace_deleted, operation_in_progress (another lifecycle operation is active; details.active_operation_id, retryable); 422 validation_failed reason not_supported_for_mode (file-first workspace), shrink_not_supported (disk_gib below the current disk; details.current_disk_gib), requires_elastic (memory_mib_held without an elastic mode), exceeds_memory_mib (memory_mib_held above the maximum), allocation_mode_not_available (elastic memory is not available to the organization); 402 as for a start (no plan, new starts on hold). Owners, admins and members, and API keys with a tool permission. Supports Idempotency-Key.
2025
+ */
2026
+ patch: operations["patchApiV1WorkspacesWorkspaceIdCaps"];
2027
+ trace?: never;
2028
+ };
1949
2029
  "/api/v1/workspaces/{workspace_id}/suspend-when-idle": {
1950
2030
  parameters: {
1951
2031
  query?: never;
@@ -2161,6 +2241,242 @@ export interface paths {
2161
2241
  patch?: never;
2162
2242
  trace?: never;
2163
2243
  };
2244
+ "/v1/workspaces/{workspace_id}/ports/{port}": {
2245
+ parameters: {
2246
+ query?: never;
2247
+ header?: never;
2248
+ path?: never;
2249
+ cookie?: never;
2250
+ };
2251
+ get?: never;
2252
+ /**
2253
+ * Expose a port of the workspace at its own HTTPS URL
2254
+ * @description Serves TCP `port` inside the workspace at `https://<port>-<handle>.<ingress domain>` (contracts §39.3). The port is private: every request needs a port token (POST …/tokens), a signed link (POST …/links) or the port’s callback URL (POST …/callback). A request to a suspended workspace resumes it and is held until it runs; a parked one wakes inside the request. 201 when exposed now, 200 when it already was (unchanged: its tokens, links and callback URL stay valid). The handle is the workspace’s for good (kept when ports are closed and exposed again, across suspend, resume and reset; a fork gets none). At most 10 exposed ports: 409 conflict details.reason port_limit (details.limit 10). Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2255
+ */
2256
+ put: operations["putV1WorkspacesWorkspaceIdPortsPort"];
2257
+ post?: never;
2258
+ /**
2259
+ * Close an exposed port
2260
+ * @description 204, also when the port was not exposed. Its tokens, links and callback URL stop working at once (the gateway caches for at most 5 s), and stay revoked if the port is exposed again. The workspace keeps its URL handle. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2261
+ */
2262
+ delete: operations["deleteV1WorkspacesWorkspaceIdPortsPort"];
2263
+ options?: never;
2264
+ head?: never;
2265
+ patch?: never;
2266
+ trace?: never;
2267
+ };
2268
+ "/v1/workspaces/{workspace_id}/ports": {
2269
+ parameters: {
2270
+ query?: never;
2271
+ header?: never;
2272
+ path?: never;
2273
+ cookie?: never;
2274
+ };
2275
+ /**
2276
+ * List the workspace’s exposed ports
2277
+ * @description Ordered by port. `callback` is set when the port has a callback URL (its secret is never shown again). Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2278
+ */
2279
+ get: operations["getV1WorkspacesWorkspaceIdPorts"];
2280
+ put?: never;
2281
+ post?: never;
2282
+ delete?: never;
2283
+ options?: never;
2284
+ head?: never;
2285
+ patch?: never;
2286
+ trace?: never;
2287
+ };
2288
+ "/v1/workspaces/{workspace_id}/ports/{port}/tokens": {
2289
+ parameters: {
2290
+ query?: never;
2291
+ header?: never;
2292
+ path?: never;
2293
+ cookie?: never;
2294
+ };
2295
+ get?: never;
2296
+ put?: never;
2297
+ /**
2298
+ * Mint a port token for an exposed port
2299
+ * @description A bearer token for requests to the port’s URL: `Authorization: Bearer <token>` (or `X-Shardflux-Token: <token>` when the app uses Authorization itself). `sfp_` + an ES256 JWS (claims iss, aud `shardflux-ports`, sub, pty, org, prj, ws, port, pxid, use `bearer`, iat, exp, jti; keys at GET /v1/.well-known/tool-token-keys). Revoked by closing the port, deleting the workspace, revoking the API key that minted it, or the minting member’s removal or role change. 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2300
+ */
2301
+ post: operations["postV1WorkspacesWorkspaceIdPortsPortTokens"];
2302
+ delete?: never;
2303
+ options?: never;
2304
+ head?: never;
2305
+ patch?: never;
2306
+ trace?: never;
2307
+ };
2308
+ "/v1/workspaces/{workspace_id}/ports/{port}/links": {
2309
+ parameters: {
2310
+ query?: never;
2311
+ header?: never;
2312
+ path?: never;
2313
+ cookie?: never;
2314
+ };
2315
+ get?: never;
2316
+ put?: never;
2317
+ /**
2318
+ * Create a signed link that opens an exposed port in a browser
2319
+ * @description Opening the link sets a session cookie for the port’s host (HttpOnly, Secure, until `expires_at`) and redirects to `path`, so a person can use the app in a browser without a header. Share it like a password: anyone with the link can open the port until it expires. Revoked like a port token (closing the port, deleting the workspace, revoking the minting API key). 422 validation_failed details.field path for a path that does not start with one `/` or has characters other than printable ASCII. 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2320
+ */
2321
+ post: operations["postV1WorkspacesWorkspaceIdPortsPortLinks"];
2322
+ delete?: never;
2323
+ options?: never;
2324
+ head?: never;
2325
+ patch?: never;
2326
+ trace?: never;
2327
+ };
2328
+ "/v1/workspaces/{workspace_id}/ports/{port}/callback": {
2329
+ parameters: {
2330
+ query?: never;
2331
+ header?: never;
2332
+ path?: never;
2333
+ cookie?: never;
2334
+ };
2335
+ get?: never;
2336
+ put?: never;
2337
+ /**
2338
+ * Create or replace the port’s callback URL (webhooks, OAuth redirects)
2339
+ * @description A URL with a secret in its path that reaches the port without a token header: register `<url><your path>` with GitHub, Slack, Stripe or an OAuth provider; a request to `/__shardflux/callback/<secret>/<rest>` reaches `/<rest>` (query kept) and wakes the workspace like any request. Creating it again replaces it (the previous URL stops working). The secret is shown only in this response (stored as a SHA-256 hash). Revoke it with DELETE, by closing the port, or by deleting the workspace; it also stops waking the workspace when its creator can no longer manage the workspace. 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2340
+ */
2341
+ post: operations["postV1WorkspacesWorkspaceIdPortsPortCallback"];
2342
+ /**
2343
+ * Revoke the port’s callback URL
2344
+ * @description 204, also when the port has no callback URL. The URL stops working at once (the gateway caches for at most 5 s). 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2345
+ */
2346
+ delete: operations["deleteV1WorkspacesWorkspaceIdPortsPortCallback"];
2347
+ options?: never;
2348
+ head?: never;
2349
+ patch?: never;
2350
+ trace?: never;
2351
+ };
2352
+ "/api/v1/workspaces/{workspace_id}/ports/{port}": {
2353
+ parameters: {
2354
+ query?: never;
2355
+ header?: never;
2356
+ path?: never;
2357
+ cookie?: never;
2358
+ };
2359
+ get?: never;
2360
+ /**
2361
+ * Expose a port of the workspace at its own HTTPS URL
2362
+ * @description Serves TCP `port` inside the workspace at `https://<port>-<handle>.<ingress domain>` (contracts §39.3). The port is private: every request needs a port token (POST …/tokens), a signed link (POST …/links) or the port’s callback URL (POST …/callback). A request to a suspended workspace resumes it and is held until it runs; a parked one wakes inside the request. 201 when exposed now, 200 when it already was (unchanged: its tokens, links and callback URL stay valid). The handle is the workspace’s for good (kept when ports are closed and exposed again, across suspend, resume and reset; a fork gets none). At most 10 exposed ports: 409 conflict details.reason port_limit (details.limit 10). Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2363
+ */
2364
+ put: operations["putApiV1WorkspacesWorkspaceIdPortsPort"];
2365
+ post?: never;
2366
+ /**
2367
+ * Close an exposed port
2368
+ * @description 204, also when the port was not exposed. Its tokens, links and callback URL stop working at once (the gateway caches for at most 5 s), and stay revoked if the port is exposed again. The workspace keeps its URL handle. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2369
+ */
2370
+ delete: operations["deleteApiV1WorkspacesWorkspaceIdPortsPort"];
2371
+ options?: never;
2372
+ head?: never;
2373
+ patch?: never;
2374
+ trace?: never;
2375
+ };
2376
+ "/api/v1/workspaces/{workspace_id}/ports": {
2377
+ parameters: {
2378
+ query?: never;
2379
+ header?: never;
2380
+ path?: never;
2381
+ cookie?: never;
2382
+ };
2383
+ /**
2384
+ * List the workspace’s exposed ports
2385
+ * @description Ordered by port. `callback` is set when the port has a callback URL (its secret is never shown again). Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2386
+ */
2387
+ get: operations["getApiV1WorkspacesWorkspaceIdPorts"];
2388
+ put?: never;
2389
+ post?: never;
2390
+ delete?: never;
2391
+ options?: never;
2392
+ head?: never;
2393
+ patch?: never;
2394
+ trace?: never;
2395
+ };
2396
+ "/api/v1/workspaces/{workspace_id}/ports/{port}/tokens": {
2397
+ parameters: {
2398
+ query?: never;
2399
+ header?: never;
2400
+ path?: never;
2401
+ cookie?: never;
2402
+ };
2403
+ get?: never;
2404
+ put?: never;
2405
+ /**
2406
+ * Mint a port token for an exposed port
2407
+ * @description A bearer token for requests to the port’s URL: `Authorization: Bearer <token>` (or `X-Shardflux-Token: <token>` when the app uses Authorization itself). `sfp_` + an ES256 JWS (claims iss, aud `shardflux-ports`, sub, pty, org, prj, ws, port, pxid, use `bearer`, iat, exp, jti; keys at GET /v1/.well-known/tool-token-keys). Revoked by closing the port, deleting the workspace, revoking the API key that minted it, or the minting member’s removal or role change. 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2408
+ */
2409
+ post: operations["postApiV1WorkspacesWorkspaceIdPortsPortTokens"];
2410
+ delete?: never;
2411
+ options?: never;
2412
+ head?: never;
2413
+ patch?: never;
2414
+ trace?: never;
2415
+ };
2416
+ "/api/v1/workspaces/{workspace_id}/ports/{port}/links": {
2417
+ parameters: {
2418
+ query?: never;
2419
+ header?: never;
2420
+ path?: never;
2421
+ cookie?: never;
2422
+ };
2423
+ get?: never;
2424
+ put?: never;
2425
+ /**
2426
+ * Create a signed link that opens an exposed port in a browser
2427
+ * @description Opening the link sets a session cookie for the port’s host (HttpOnly, Secure, until `expires_at`) and redirects to `path`, so a person can use the app in a browser without a header. Share it like a password: anyone with the link can open the port until it expires. Revoked like a port token (closing the port, deleting the workspace, revoking the minting API key). 422 validation_failed details.field path for a path that does not start with one `/` or has characters other than printable ASCII. 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2428
+ */
2429
+ post: operations["postApiV1WorkspacesWorkspaceIdPortsPortLinks"];
2430
+ delete?: never;
2431
+ options?: never;
2432
+ head?: never;
2433
+ patch?: never;
2434
+ trace?: never;
2435
+ };
2436
+ "/api/v1/workspaces/{workspace_id}/ports/{port}/callback": {
2437
+ parameters: {
2438
+ query?: never;
2439
+ header?: never;
2440
+ path?: never;
2441
+ cookie?: never;
2442
+ };
2443
+ get?: never;
2444
+ put?: never;
2445
+ /**
2446
+ * Create or replace the port’s callback URL (webhooks, OAuth redirects)
2447
+ * @description A URL with a secret in its path that reaches the port without a token header: register `<url><your path>` with GitHub, Slack, Stripe or an OAuth provider; a request to `/__shardflux/callback/<secret>/<rest>` reaches `/<rest>` (query kept) and wakes the workspace like any request. Creating it again replaces it (the previous URL stops working). The secret is shown only in this response (stored as a SHA-256 hash). Revoke it with DELETE, by closing the port, or by deleting the workspace; it also stops waking the workspace when its creator can no longer manage the workspace. 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2448
+ */
2449
+ post: operations["postApiV1WorkspacesWorkspaceIdPortsPortCallback"];
2450
+ /**
2451
+ * Revoke the port’s callback URL
2452
+ * @description 204, also when the port has no callback URL. The URL stops working at once (the gateway caches for at most 5 s). 404 not_found details.reason port_not_exposed. Errors: 403 forbidden details.reason inbound_ports_not_available (inbound ports are not enabled for the organization), 409 conflict not_supported_for_mode (file-first workspace) or workspace_deleted, 422 validation_failed for a port outside 1-65535.
2453
+ */
2454
+ delete: operations["deleteApiV1WorkspacesWorkspaceIdPortsPortCallback"];
2455
+ options?: never;
2456
+ head?: never;
2457
+ patch?: never;
2458
+ trace?: never;
2459
+ };
2460
+ "/v1/internal/port-wakes": {
2461
+ parameters: {
2462
+ query?: never;
2463
+ header?: never;
2464
+ path?: never;
2465
+ cookie?: never;
2466
+ };
2467
+ get?: never;
2468
+ put?: never;
2469
+ /**
2470
+ * Wake a workspace for an inbound port request (called by the cell gateway)
2471
+ * @description Contracts §39.3. The credential is the ingress request’s port token, forwarded unchanged as `Authorization: Bearer sfp_…` (`use` bearer or link), or the callback URL’s secret in `callback_secret`. The API verifies it as the gateway does: ES256 with its own keys, iss, aud shardflux-ports, iat/exp, workspace and port of the token (403 port_token_scope), the port exposed (404 port_not_exposed) under the token’s exposure (`pxid`), the revocation watermarks of the minting principal and the workspace and the minting API key (401 port_token_revoked), or the callback secret’s SHA-256 and its creator’s lifecycle permission (401 callback_invalid); then the organization’s `policy.inbound_ports` (403 inbound_ports_not_enabled). A deleted workspace is 404 unknown_host. It then resumes the workspace as that principal exactly like POST /v1/workspaces/{id}/resume (joins an active resume/open, recovers a failed workspace with an open, refuses with its admission errors, which the gateway passes through), audited workspace.resume with details.via inbound_port. With `Prefer: wait=<seconds>` (at most 20) it holds like a held resume: 200 {workspace, operation} once the operation succeeded, 202 with the operation otherwise (also without the preference). A running workspace answers 200 at once with operation null. 401 port_auth_required (no credential), port_token_invalid; 429 rate_limited per workspace. `Cache-Control: no-store`.
2472
+ */
2473
+ post: operations["postV1InternalPortWakes"];
2474
+ delete?: never;
2475
+ options?: never;
2476
+ head?: never;
2477
+ patch?: never;
2478
+ trace?: never;
2479
+ };
2164
2480
  "/v1/projects/{project_id}/volumes": {
2165
2481
  parameters: {
2166
2482
  query?: never;
@@ -5524,6 +5840,30 @@ export interface paths {
5524
5840
  patch?: never;
5525
5841
  trace?: never;
5526
5842
  };
5843
+ "/api/v1/oauth/authorization": {
5844
+ parameters: {
5845
+ query?: never;
5846
+ header?: never;
5847
+ path?: never;
5848
+ cookie?: never;
5849
+ };
5850
+ /**
5851
+ * Describe a hosted MCP connection request (consent page)
5852
+ * @description Validates an authorization request for the hosted MCP endpoint and returns the client, where the browser goes afterwards and the projects the user may connect. 422 `validation_failed` (details.oauth_error) when the client or its redirect_uri cannot be trusted; otherwise a request with another problem still describes the client, and the POST answers it with the OAuth error.
5853
+ */
5854
+ get: operations["getApiV1OauthAuthorization"];
5855
+ put?: never;
5856
+ /**
5857
+ * Approve or decline a hosted MCP connection request
5858
+ * @description approve (with project_id, a project where the user is owner or admin) creates the connection: a project API key named "<client> (MCP connector)" with every tool permission, held by Shardflux for the client, and a single-use authorization code (5 minutes). deny sends access_denied. Either way the answer is redirect_to, where the browser goes next.
5859
+ */
5860
+ post: operations["postApiV1OauthAuthorization"];
5861
+ delete?: never;
5862
+ options?: never;
5863
+ head?: never;
5864
+ patch?: never;
5865
+ trace?: never;
5866
+ };
5527
5867
  }
5528
5868
  export type webhooks = Record<string, never>;
5529
5869
  export interface components {
@@ -6750,6 +7090,102 @@ export interface components {
6750
7090
  */
6751
7091
  not_before: string;
6752
7092
  };
7093
+ /** @description At least one field. Each given value replaces the stored one; omitted fields keep theirs. */
7094
+ ResizeWorkspaceBody: {
7095
+ /** @description Memory (MiB): the size of a fixed workspace, the maximum of an elastic one. Bounded by the plan and the template (`limit_reason`). */
7096
+ memory_mib?: number;
7097
+ /** @description Elastic only: the memory held while idle (MiB), at most the maximum. */
7098
+ memory_mib_held?: number;
7099
+ /**
7100
+ * @description fixed: memory_mib is plugged and held; elastic: the workspace holds memory_mib_held and grows to memory_mib when a command needs it.
7101
+ * @enum {string}
7102
+ */
7103
+ allocation_mode?: "fixed" | "elastic";
7104
+ /** @description CPU (millicores). Bounded by the plan and the template. */
7105
+ cpu_millis?: number;
7106
+ /** @description Disk (GiB). Grow only. Bounded by the plan and the template. */
7107
+ disk_gib?: number;
7108
+ };
7109
+ /** @description Per resource the request named (allocation_mode and memory_mib_held report under memory): what applied now and what applies later. caps: the workspace caps every later start uses. */
7110
+ ResizeResult: {
7111
+ /**
7112
+ * Format: uuid
7113
+ * @description UUIDv7, lowercase canonical form.
7114
+ */
7115
+ workspace_id: string;
7116
+ /**
7117
+ * Format: uuid
7118
+ * @description UUIDv7, lowercase canonical form.
7119
+ */
7120
+ operation_id: string;
7121
+ /** @description The workspace state the resize found (running, suspended, ...). */
7122
+ state: string;
7123
+ memory?: {
7124
+ /**
7125
+ * @description now: live; resume: right after the next resume, before its first call; next_start: at the next start that boots the workspace.
7126
+ * @enum {string}
7127
+ */
7128
+ applies_at: "now" | "resume" | "next_start";
7129
+ /**
7130
+ * @description The memory layout after the resize.
7131
+ * @enum {string}
7132
+ */
7133
+ allocation_mode: "fixed" | "elastic";
7134
+ requested_mib: number | null;
7135
+ target_mib: number | null;
7136
+ previous_mib: number | null;
7137
+ applied_mib: number | null;
7138
+ held_mib: number | null;
7139
+ converged: boolean | null;
7140
+ /** @description Why the target or the applied value is below what was requested: plan or template (bounded like caps at open), host_capacity (the rest did not fit on the host at once), shrink_stalled (the guest kept the memory its processes use). */
7141
+ limit_reason: ("plan" | "template" | "host_capacity" | "shrink_stalled") | null;
7142
+ /** @description Why it does not apply now (null when it does). */
7143
+ reason: ("region" | "below_base" | "legacy_layout" | "boot_vcpus" | "suspended" | "stopped") | null;
7144
+ };
7145
+ cpu?: {
7146
+ /**
7147
+ * @description now: live; resume: right after the next resume, before its first call; next_start: at the next start that boots the workspace.
7148
+ * @enum {string}
7149
+ */
7150
+ applies_at: "now" | "resume" | "next_start";
7151
+ requested_millis: number | null;
7152
+ target_millis: number | null;
7153
+ previous_millis: number | null;
7154
+ applied_millis: number | null;
7155
+ /** @description Why the target or the applied value is below what was requested: plan or template (bounded like caps at open), host_capacity (the rest did not fit on the host at once), shrink_stalled (the guest kept the memory its processes use). */
7156
+ limit_reason: ("plan" | "template" | "host_capacity" | "shrink_stalled") | null;
7157
+ /** @description Why it does not apply now (null when it does). */
7158
+ reason: ("region" | "below_base" | "legacy_layout" | "boot_vcpus" | "suspended" | "stopped") | null;
7159
+ };
7160
+ disk?: {
7161
+ /**
7162
+ * @description now: live; resume: right after the next resume, before its first call; next_start: at the next start that boots the workspace.
7163
+ * @enum {string}
7164
+ */
7165
+ applies_at: "now" | "resume" | "next_start";
7166
+ requested_gib: number | null;
7167
+ target_gib: number | null;
7168
+ previous_gib: number | null;
7169
+ applied_gib: number | null;
7170
+ /** @description Why the target or the applied value is below what was requested: plan or template (bounded like caps at open), host_capacity (the rest did not fit on the host at once), shrink_stalled (the guest kept the memory its processes use). */
7171
+ limit_reason: ("plan" | "template" | "host_capacity" | "shrink_stalled") | null;
7172
+ /** @description Why it does not apply now (null when it does). */
7173
+ reason: ("region" | "below_base" | "legacy_layout" | "boot_vcpus" | "suspended" | "stopped") | null;
7174
+ };
7175
+ /** @description User caps for this workspace (null = no user restriction) and its memory allocation mode. */
7176
+ caps: {
7177
+ cpu_millis: number | null;
7178
+ memory_mib: number | null;
7179
+ disk_gib: number | null;
7180
+ /**
7181
+ * @description Memory allocation (contracts §32): fixed (default) boots memory_mib and holds it; elastic holds memory_mib_held while idle and is grown up to memory_mib (the promise) when a command needs it. The mode the next VM start uses: an elastic request whose promise does not exceed the held floor by at least 512 MiB is fixed at the promise.
7182
+ * @enum {string}
7183
+ */
7184
+ allocation_mode: "fixed" | "elastic";
7185
+ /** @description Elastic only: the memory held while idle (MiB). */
7186
+ memory_mib_held?: number;
7187
+ };
7188
+ };
6753
7189
  Workspace: {
6754
7190
  /**
6755
7191
  * Format: uuid
@@ -6953,6 +7389,25 @@ export interface components {
6953
7389
  tools: ("exec" | "files" | "pty" | "process" | "git" | "browser")[];
6954
7390
  cell_endpoint: string;
6955
7391
  };
7392
+ /** @description An exposed port of a workspace (contracts §39.3). Private: every request needs a credential. */
7393
+ Port: {
7394
+ /** @description TCP port inside the workspace (1-65535). */
7395
+ port: number;
7396
+ /** @description https://<port>-<handle>.<ingress domain>: requests need a port token (Authorization: Bearer sfp_…), a signed link’s cookie, or the callback URL. */
7397
+ url: string;
7398
+ /**
7399
+ * Format: date-time
7400
+ * @description RFC 3339 UTC timestamp with Z.
7401
+ */
7402
+ created_at: string;
7403
+ callback: {
7404
+ /**
7405
+ * Format: date-time
7406
+ * @description RFC 3339 UTC timestamp with Z.
7407
+ */
7408
+ created_at: string;
7409
+ } | null;
7410
+ };
6956
7411
  Volume: {
6957
7412
  /**
6958
7413
  * Format: uuid
@@ -7131,6 +7586,39 @@ export interface components {
7131
7586
  /** @description When the charges reach the effective cap at the average burn of this period so far. Null when not accruing or when it would fall after resets_at. */
7132
7587
  projected_reached_at: string | null;
7133
7588
  };
7589
+ OAuthConsentView: {
7590
+ client: {
7591
+ client_id: string;
7592
+ /** @description client_name from its registration or metadata document. Self-declared: show it with redirect_host. */
7593
+ name: string;
7594
+ uri: string | null;
7595
+ logo_uri: string | null;
7596
+ /** @description `metadata_document`: client_id is an https URL its owner serves (the host is verified by that); `registered`: dynamic client registration. */
7597
+ kind: "registered" | "metadata_document";
7598
+ client_id_host: string | null;
7599
+ };
7600
+ /** @description Where the browser goes after the decision (host, or scheme://host for a native app). */
7601
+ redirect_host: string;
7602
+ scope: string;
7603
+ /** @description The MCP endpoint the client will be able to use. */
7604
+ resource: string;
7605
+ /** @description Projects the user may connect (owner or admin of the organization), by organization then project name; at most 200. */
7606
+ projects: {
7607
+ /**
7608
+ * Format: uuid
7609
+ * @description UUIDv7, lowercase canonical form.
7610
+ */
7611
+ organization_id: string;
7612
+ organization_name: string;
7613
+ /**
7614
+ * Format: uuid
7615
+ * @description UUIDv7, lowercase canonical form.
7616
+ */
7617
+ project_id: string;
7618
+ project_name: string;
7619
+ role: "owner" | "admin";
7620
+ }[];
7621
+ };
7134
7622
  };
7135
7623
  responses: never;
7136
7624
  parameters: never;
@@ -8678,7 +9166,7 @@ export interface operations {
8678
9166
  };
8679
9167
  };
8680
9168
  };
8681
- postV1AuthLogin: {
9169
+ postV1AuthSignup: {
8682
9170
  parameters: {
8683
9171
  query?: never;
8684
9172
  header?: never;
@@ -8689,9 +9177,10 @@ export interface operations {
8689
9177
  content: {
8690
9178
  "application/json": {
8691
9179
  /** @description Email address. */
8692
- email: string;
8693
- /** @description Password (12-256 characters). */
8694
- password: string;
9180
+ email?: string;
9181
+ display_name?: string;
9182
+ /** @description The OpenAI ID token of a Codex CLI login (`tokens.id_token` in `~/.codex/auth.json`, refreshed by Codex within CODEX_PROOF_MAX_AGE_SECONDS). Proves a verified email; it is not a credential to OpenAI. */
9183
+ codex_id_token?: string;
8695
9184
  };
8696
9185
  };
8697
9186
  };
@@ -8704,6 +9193,43 @@ export interface operations {
8704
9193
  content: {
8705
9194
  "application/json": {
8706
9195
  status: "authenticated" | "mfa_required";
9196
+ /** @description True when this request created the account; false: it signed in to an existing one (a Codex proof only). */
9197
+ created: boolean;
9198
+ /** @description verified: the email is verified (a Codex proof, or verified before). provisional: unverified, and the account may use resource routes on its default plan now; the signup trial comes when the email is verified. verification_required: unverified, and resource routes answer 403 email_unverified until POST /v1/auth/verify-email/code. */
9199
+ access: "verified" | "provisional" | "verification_required";
9200
+ user: {
9201
+ /**
9202
+ * Format: uuid
9203
+ * @description UUIDv7, lowercase canonical form.
9204
+ */
9205
+ id: string;
9206
+ email: string;
9207
+ email_verified: boolean;
9208
+ display_name: string | null;
9209
+ mfa_enabled: boolean;
9210
+ } | null;
9211
+ /** @description The session: send `Authorization: Bearer <session_token>` from now on (a previous token of this session is revoked). */
9212
+ session_token: string;
9213
+ /**
9214
+ * Format: date-time
9215
+ * @description RFC 3339 UTC timestamp with Z.
9216
+ */
9217
+ session_expires_at: string;
9218
+ };
9219
+ };
9220
+ };
9221
+ /** @description Default Response */
9222
+ 201: {
9223
+ headers: {
9224
+ [name: string]: unknown;
9225
+ };
9226
+ content: {
9227
+ "application/json": {
9228
+ status: "authenticated" | "mfa_required";
9229
+ /** @description True when this request created the account; false: it signed in to an existing one (a Codex proof only). */
9230
+ created: boolean;
9231
+ /** @description verified: the email is verified (a Codex proof, or verified before). provisional: unverified, and the account may use resource routes on its default plan now; the signup trial comes when the email is verified. verification_required: unverified, and resource routes answer 403 email_unverified until POST /v1/auth/verify-email/code. */
9232
+ access: "verified" | "provisional" | "verification_required";
8707
9233
  user: {
8708
9234
  /**
8709
9235
  * Format: uuid
@@ -8745,7 +9271,7 @@ export interface operations {
8745
9271
  };
8746
9272
  };
8747
9273
  };
8748
- postV1AuthMfaChallenge: {
9274
+ postV1AuthVerifyEmailCode: {
8749
9275
  parameters: {
8750
9276
  query?: never;
8751
9277
  header?: never;
@@ -8755,10 +9281,8 @@ export interface operations {
8755
9281
  requestBody: {
8756
9282
  content: {
8757
9283
  "application/json": {
8758
- /** @description Current 6-digit TOTP code. */
9284
+ /** @description The 6-digit code from the email. */
8759
9285
  code?: string;
8760
- /** @description One-time recovery code. */
8761
- recovery_code?: string;
8762
9286
  };
8763
9287
  };
8764
9288
  };
@@ -8770,25 +9294,20 @@ export interface operations {
8770
9294
  };
8771
9295
  content: {
8772
9296
  "application/json": {
8773
- status: "authenticated" | "mfa_required";
8774
- user: {
8775
- /**
8776
- * Format: uuid
8777
- * @description UUIDv7, lowercase canonical form.
8778
- */
8779
- id: string;
8780
- email: string;
8781
- email_verified: boolean;
8782
- display_name: string | null;
8783
- mfa_enabled: boolean;
8784
- } | null;
8785
- /** @description The session: send `Authorization: Bearer <session_token>` from now on (a previous token of this session is revoked). */
8786
- session_token: string;
8787
- /**
8788
- * Format: date-time
8789
- * @description RFC 3339 UTC timestamp with Z.
8790
- */
8791
- session_expires_at: string;
9297
+ /** @enum {string} */
9298
+ status: "verified";
9299
+ };
9300
+ };
9301
+ };
9302
+ /** @description Default Response */
9303
+ 202: {
9304
+ headers: {
9305
+ [name: string]: unknown;
9306
+ };
9307
+ content: {
9308
+ "application/json": {
9309
+ /** @enum {string} */
9310
+ status: "accepted";
8792
9311
  };
8793
9312
  };
8794
9313
  };
@@ -8812,21 +9331,52 @@ export interface operations {
8812
9331
  };
8813
9332
  };
8814
9333
  };
8815
- postV1AuthLogout: {
9334
+ postV1AuthLogin: {
8816
9335
  parameters: {
8817
9336
  query?: never;
8818
9337
  header?: never;
8819
9338
  path?: never;
8820
9339
  cookie?: never;
8821
9340
  };
8822
- requestBody?: never;
9341
+ requestBody: {
9342
+ content: {
9343
+ "application/json": {
9344
+ /** @description Email address. */
9345
+ email: string;
9346
+ /** @description Password (12-256 characters). */
9347
+ password: string;
9348
+ };
9349
+ };
9350
+ };
8823
9351
  responses: {
8824
- /** @description No content. */
8825
- 204: {
9352
+ /** @description Default Response */
9353
+ 200: {
8826
9354
  headers: {
8827
9355
  [name: string]: unknown;
8828
9356
  };
8829
- content?: never;
9357
+ content: {
9358
+ "application/json": {
9359
+ status: "authenticated" | "mfa_required";
9360
+ user: {
9361
+ /**
9362
+ * Format: uuid
9363
+ * @description UUIDv7, lowercase canonical form.
9364
+ */
9365
+ id: string;
9366
+ email: string;
9367
+ email_verified: boolean;
9368
+ display_name: string | null;
9369
+ mfa_enabled: boolean;
9370
+ } | null;
9371
+ /** @description The session: send `Authorization: Bearer <session_token>` from now on (a previous token of this session is revoked). */
9372
+ session_token: string;
9373
+ /**
9374
+ * Format: date-time
9375
+ * @description RFC 3339 UTC timestamp with Z.
9376
+ */
9377
+ session_expires_at: string;
9378
+ };
9379
+ };
8830
9380
  };
8831
9381
  /** @description Default Response */
8832
9382
  "4XX": {
@@ -8848,21 +9398,52 @@ export interface operations {
8848
9398
  };
8849
9399
  };
8850
9400
  };
8851
- postV1AuthLogoutAll: {
9401
+ postV1AuthMfaChallenge: {
8852
9402
  parameters: {
8853
9403
  query?: never;
8854
9404
  header?: never;
8855
9405
  path?: never;
8856
9406
  cookie?: never;
8857
9407
  };
8858
- requestBody?: never;
9408
+ requestBody: {
9409
+ content: {
9410
+ "application/json": {
9411
+ /** @description Current 6-digit TOTP code. */
9412
+ code?: string;
9413
+ /** @description One-time recovery code. */
9414
+ recovery_code?: string;
9415
+ };
9416
+ };
9417
+ };
8859
9418
  responses: {
8860
- /** @description No content. */
8861
- 204: {
9419
+ /** @description Default Response */
9420
+ 200: {
8862
9421
  headers: {
8863
9422
  [name: string]: unknown;
8864
9423
  };
8865
- content?: never;
9424
+ content: {
9425
+ "application/json": {
9426
+ status: "authenticated" | "mfa_required";
9427
+ user: {
9428
+ /**
9429
+ * Format: uuid
9430
+ * @description UUIDv7, lowercase canonical form.
9431
+ */
9432
+ id: string;
9433
+ email: string;
9434
+ email_verified: boolean;
9435
+ display_name: string | null;
9436
+ mfa_enabled: boolean;
9437
+ } | null;
9438
+ /** @description The session: send `Authorization: Bearer <session_token>` from now on (a previous token of this session is revoked). */
9439
+ session_token: string;
9440
+ /**
9441
+ * Format: date-time
9442
+ * @description RFC 3339 UTC timestamp with Z.
9443
+ */
9444
+ session_expires_at: string;
9445
+ };
9446
+ };
8866
9447
  };
8867
9448
  /** @description Default Response */
8868
9449
  "4XX": {
@@ -8884,7 +9465,7 @@ export interface operations {
8884
9465
  };
8885
9466
  };
8886
9467
  };
8887
- getV1AuthSessions: {
9468
+ postV1AuthLogout: {
8888
9469
  parameters: {
8889
9470
  query?: never;
8890
9471
  header?: never;
@@ -8893,44 +9474,116 @@ export interface operations {
8893
9474
  };
8894
9475
  requestBody?: never;
8895
9476
  responses: {
8896
- /** @description Default Response */
8897
- 200: {
9477
+ /** @description No content. */
9478
+ 204: {
8898
9479
  headers: {
8899
9480
  [name: string]: unknown;
8900
9481
  };
8901
- content: {
8902
- "application/json": {
8903
- data: {
8904
- /**
8905
- * Format: uuid
8906
- * @description UUIDv7, lowercase canonical form.
8907
- */
8908
- id: string;
8909
- current: boolean;
8910
- aal: number;
8911
- /**
8912
- * Format: date-time
8913
- * @description RFC 3339 UTC timestamp with Z.
8914
- */
8915
- created_at: string;
8916
- /**
8917
- * Format: date-time
8918
- * @description RFC 3339 UTC timestamp with Z.
8919
- */
8920
- last_seen_at: string;
8921
- /**
8922
- * Format: date-time
8923
- * @description RFC 3339 UTC timestamp with Z.
8924
- */
8925
- absolute_expires_at: string;
8926
- client_ip: string | null;
8927
- user_agent: string | null;
8928
- /** @description browser: a web app sign-in; cli: `shard auth login` or an SDK account client (contracts §30.1). */
8929
- client: "browser" | "cli";
8930
- }[];
8931
- next_cursor: null;
8932
- };
8933
- };
9482
+ content?: never;
9483
+ };
9484
+ /** @description Default Response */
9485
+ "4XX": {
9486
+ headers: {
9487
+ [name: string]: unknown;
9488
+ };
9489
+ content: {
9490
+ "application/json": components["schemas"]["ErrorBody"];
9491
+ };
9492
+ };
9493
+ /** @description Default Response */
9494
+ "5XX": {
9495
+ headers: {
9496
+ [name: string]: unknown;
9497
+ };
9498
+ content: {
9499
+ "application/json": components["schemas"]["ErrorBody"];
9500
+ };
9501
+ };
9502
+ };
9503
+ };
9504
+ postV1AuthLogoutAll: {
9505
+ parameters: {
9506
+ query?: never;
9507
+ header?: never;
9508
+ path?: never;
9509
+ cookie?: never;
9510
+ };
9511
+ requestBody?: never;
9512
+ responses: {
9513
+ /** @description No content. */
9514
+ 204: {
9515
+ headers: {
9516
+ [name: string]: unknown;
9517
+ };
9518
+ content?: never;
9519
+ };
9520
+ /** @description Default Response */
9521
+ "4XX": {
9522
+ headers: {
9523
+ [name: string]: unknown;
9524
+ };
9525
+ content: {
9526
+ "application/json": components["schemas"]["ErrorBody"];
9527
+ };
9528
+ };
9529
+ /** @description Default Response */
9530
+ "5XX": {
9531
+ headers: {
9532
+ [name: string]: unknown;
9533
+ };
9534
+ content: {
9535
+ "application/json": components["schemas"]["ErrorBody"];
9536
+ };
9537
+ };
9538
+ };
9539
+ };
9540
+ getV1AuthSessions: {
9541
+ parameters: {
9542
+ query?: never;
9543
+ header?: never;
9544
+ path?: never;
9545
+ cookie?: never;
9546
+ };
9547
+ requestBody?: never;
9548
+ responses: {
9549
+ /** @description Default Response */
9550
+ 200: {
9551
+ headers: {
9552
+ [name: string]: unknown;
9553
+ };
9554
+ content: {
9555
+ "application/json": {
9556
+ data: {
9557
+ /**
9558
+ * Format: uuid
9559
+ * @description UUIDv7, lowercase canonical form.
9560
+ */
9561
+ id: string;
9562
+ current: boolean;
9563
+ aal: number;
9564
+ /**
9565
+ * Format: date-time
9566
+ * @description RFC 3339 UTC timestamp with Z.
9567
+ */
9568
+ created_at: string;
9569
+ /**
9570
+ * Format: date-time
9571
+ * @description RFC 3339 UTC timestamp with Z.
9572
+ */
9573
+ last_seen_at: string;
9574
+ /**
9575
+ * Format: date-time
9576
+ * @description RFC 3339 UTC timestamp with Z.
9577
+ */
9578
+ absolute_expires_at: string;
9579
+ client_ip: string | null;
9580
+ user_agent: string | null;
9581
+ /** @description browser: a web app sign-in; cli: `shard auth login` or an SDK account client (contracts §30.1). */
9582
+ client: "browser" | "cli";
9583
+ }[];
9584
+ next_cursor: null;
9585
+ };
9586
+ };
8934
9587
  };
8935
9588
  /** @description Default Response */
8936
9589
  "4XX": {
@@ -9002,7 +9655,9 @@ export interface operations {
9002
9655
  content: {
9003
9656
  "application/json": {
9004
9657
  /** @description Password (12-256 characters). */
9005
- password: string;
9658
+ password?: string;
9659
+ /** @description The OpenAI ID token of a Codex CLI login (`tokens.id_token` in `~/.codex/auth.json`, refreshed by Codex within CODEX_PROOF_MAX_AGE_SECONDS). Proves a verified email; it is not a credential to OpenAI. */
9660
+ codex_id_token?: string;
9006
9661
  /** @description Current 6-digit TOTP code. */
9007
9662
  code?: string;
9008
9663
  /** @description One-time recovery code. */
@@ -11626,14 +12281,13 @@ export interface operations {
11626
12281
  };
11627
12282
  /** @description Template slug; new workspaces use its latest published version. */
11628
12283
  template: string;
11629
- /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction (allocation_mode: fixed). Given caps replace the stored ones. */
12284
+ /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction. Given caps replace the stored ones (a reopen keeps an elastic workspace’s mode when elastic is the organization’s default and allocation_mode is omitted). */
11630
12285
  caps?: {
11631
12286
  cpu_millis?: number;
11632
12287
  memory_mib?: number;
11633
12288
  disk_gib?: number;
11634
12289
  /**
11635
- * @description Memory allocation (contracts §32): fixed (default) boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Takes effect at the next VM start.
11636
- * @default fixed
12290
+ * @description Memory allocation (contracts §32): fixed boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Omitted: fixed, or elastic where that is the organization’s default (a reopen then keeps the stored mode). Takes effect at the next VM start.
11637
12291
  * @enum {string}
11638
12292
  */
11639
12293
  allocation_mode?: "fixed" | "elastic";
@@ -12216,103 +12870,11 @@ export interface operations {
12216
12870
  };
12217
12871
  };
12218
12872
  };
12219
- postV1WorkspacesWorkspaceIdSuspendWhenIdle: {
12220
- parameters: {
12221
- query?: never;
12222
- header?: never;
12223
- path: {
12224
- /** @description UUIDv7, lowercase canonical form. */
12225
- workspace_id: string;
12226
- };
12227
- cookie?: never;
12228
- };
12229
- requestBody: {
12230
- content: {
12231
- "application/json": {
12232
- /** @description Seconds from now the workspace must stay idle before it is suspended (0..3600; 0 = as soon as it is idle). */
12233
- after_seconds: number;
12234
- };
12235
- };
12236
- };
12237
- responses: {
12238
- /** @description suspend_request: the recorded request. operation: set (and suspend_request null) only when a suspend was already in progress. */
12239
- 202: {
12240
- headers: {
12241
- [name: string]: unknown;
12242
- };
12243
- content: {
12244
- "application/json": {
12245
- workspace: components["schemas"]["Workspace"];
12246
- operation: components["schemas"]["Operation"] | null;
12247
- suspend_request: components["schemas"]["SuspendRequest"] | null;
12248
- };
12249
- };
12250
- };
12251
- /** @description Default Response */
12252
- "4XX": {
12253
- headers: {
12254
- [name: string]: unknown;
12255
- };
12256
- content: {
12257
- "application/json": components["schemas"]["ErrorBody"];
12258
- };
12259
- };
12260
- /** @description Default Response */
12261
- "5XX": {
12262
- headers: {
12263
- [name: string]: unknown;
12264
- };
12265
- content: {
12266
- "application/json": components["schemas"]["ErrorBody"];
12267
- };
12268
- };
12269
- };
12270
- };
12271
- deleteV1WorkspacesWorkspaceIdSuspendWhenIdle: {
12272
- parameters: {
12273
- query?: never;
12274
- header?: never;
12275
- path: {
12276
- /** @description UUIDv7, lowercase canonical form. */
12277
- workspace_id: string;
12278
- };
12279
- cookie?: never;
12280
- };
12281
- requestBody?: never;
12282
- responses: {
12283
- /** @description Default Response */
12284
- 200: {
12285
- headers: {
12286
- [name: string]: unknown;
12287
- };
12288
- content: {
12289
- "application/json": components["schemas"]["Workspace"];
12290
- };
12291
- };
12292
- /** @description Default Response */
12293
- "4XX": {
12294
- headers: {
12295
- [name: string]: unknown;
12296
- };
12297
- content: {
12298
- "application/json": components["schemas"]["ErrorBody"];
12299
- };
12300
- };
12301
- /** @description Default Response */
12302
- "5XX": {
12303
- headers: {
12304
- [name: string]: unknown;
12305
- };
12306
- content: {
12307
- "application/json": components["schemas"]["ErrorBody"];
12308
- };
12309
- };
12310
- };
12311
- };
12312
- postV1WorkspacesWorkspaceIdFork: {
12873
+ patchV1WorkspacesWorkspaceIdCaps: {
12313
12874
  parameters: {
12314
12875
  query?: never;
12315
12876
  header?: {
12877
+ /** @description RFC 7240 preference, e.g. `wait=30` (at most 55; default 20). */
12316
12878
  prefer?: string;
12317
12879
  };
12318
12880
  path: {
@@ -12323,48 +12885,17 @@ export interface operations {
12323
12885
  };
12324
12886
  requestBody: {
12325
12887
  content: {
12326
- "application/json": {
12327
- /** @description Stable workspace key, unique per organization (e.g. `${customerId}/${projectId}`). */
12328
- key: string;
12329
- /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction (allocation_mode: fixed). Given caps replace the stored ones. */
12330
- caps?: {
12331
- cpu_millis?: number;
12332
- memory_mib?: number;
12333
- disk_gib?: number;
12334
- /**
12335
- * @description Memory allocation (contracts §32): fixed (default) boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Takes effect at the next VM start.
12336
- * @default fixed
12337
- * @enum {string}
12338
- */
12339
- allocation_mode?: "fixed" | "elastic";
12340
- /** @description Elastic only: memory held while idle (MiB, default 1024, at most memory_mib). */
12341
- memory_mib_held?: number;
12342
- };
12343
- lifetime?: components["schemas"]["WorkspaceLifetime"];
12344
- /** @description Attribution label; one agent session per (workspace, principal, label). */
12345
- agent_label?: string;
12346
- tools?: ("exec" | "files" | "pty" | "process" | "git" | "browser")[];
12347
- };
12888
+ "application/json": components["schemas"]["ResizeWorkspaceBody"];
12348
12889
  };
12349
12890
  };
12350
12891
  responses: {
12351
- /** @description Default Response */
12892
+ /** @description Per resource the request named (allocation_mode and memory_mib_held report under memory): what applied now and what applies later. caps: the workspace caps every later start uses. */
12352
12893
  200: {
12353
12894
  headers: {
12354
12895
  [name: string]: unknown;
12355
12896
  };
12356
12897
  content: {
12357
- "application/json": {
12358
- operation: components["schemas"]["Operation"];
12359
- workspace: components["schemas"]["Workspace"];
12360
- /**
12361
- * Format: uuid
12362
- * @description UUIDv7, lowercase canonical form.
12363
- */
12364
- source_workspace_id: string;
12365
- cell_endpoint: string | null;
12366
- tool_token: components["schemas"]["ToolToken"] | null;
12367
- };
12898
+ "application/json": components["schemas"]["ResizeResult"];
12368
12899
  };
12369
12900
  };
12370
12901
  /** @description Default Response */
@@ -12376,11 +12907,6 @@ export interface operations {
12376
12907
  "application/json": {
12377
12908
  operation: components["schemas"]["Operation"];
12378
12909
  workspace: components["schemas"]["Workspace"];
12379
- /**
12380
- * Format: uuid
12381
- * @description UUIDv7, lowercase canonical form.
12382
- */
12383
- source_workspace_id: string;
12384
12910
  };
12385
12911
  };
12386
12912
  };
@@ -12404,7 +12930,7 @@ export interface operations {
12404
12930
  };
12405
12931
  };
12406
12932
  };
12407
- postV1WorkspacesWorkspaceIdClose: {
12933
+ postV1WorkspacesWorkspaceIdSuspendWhenIdle: {
12408
12934
  parameters: {
12409
12935
  query?: never;
12410
12936
  header?: never;
@@ -12414,17 +12940,25 @@ export interface operations {
12414
12940
  };
12415
12941
  cookie?: never;
12416
12942
  };
12417
- requestBody?: never;
12943
+ requestBody: {
12944
+ content: {
12945
+ "application/json": {
12946
+ /** @description Seconds from now the workspace must stay idle before it is suspended (0..3600; 0 = as soon as it is idle). */
12947
+ after_seconds: number;
12948
+ };
12949
+ };
12950
+ };
12418
12951
  responses: {
12419
- /** @description Default Response */
12952
+ /** @description suspend_request: the recorded request. operation: set (and suspend_request null) only when a suspend was already in progress. */
12420
12953
  202: {
12421
12954
  headers: {
12422
12955
  [name: string]: unknown;
12423
12956
  };
12424
12957
  content: {
12425
12958
  "application/json": {
12426
- operation: components["schemas"]["Operation"];
12427
12959
  workspace: components["schemas"]["Workspace"];
12960
+ operation: components["schemas"]["Operation"] | null;
12961
+ suspend_request: components["schemas"]["SuspendRequest"] | null;
12428
12962
  };
12429
12963
  };
12430
12964
  };
@@ -12448,7 +12982,7 @@ export interface operations {
12448
12982
  };
12449
12983
  };
12450
12984
  };
12451
- postV1WorkspacesWorkspaceIdReset: {
12985
+ deleteV1WorkspacesWorkspaceIdSuspendWhenIdle: {
12452
12986
  parameters: {
12453
12987
  query?: never;
12454
12988
  header?: never;
@@ -12458,22 +12992,201 @@ export interface operations {
12458
12992
  };
12459
12993
  cookie?: never;
12460
12994
  };
12461
- requestBody: {
12462
- content: {
12463
- "application/json": components["schemas"]["ResetWorkspaceBody"];
12464
- };
12465
- };
12995
+ requestBody?: never;
12466
12996
  responses: {
12467
12997
  /** @description Default Response */
12468
- 202: {
12998
+ 200: {
12469
12999
  headers: {
12470
13000
  [name: string]: unknown;
12471
13001
  };
12472
13002
  content: {
12473
- "application/json": {
12474
- operation: components["schemas"]["Operation"];
12475
- workspace: components["schemas"]["Workspace"];
12476
- };
13003
+ "application/json": components["schemas"]["Workspace"];
13004
+ };
13005
+ };
13006
+ /** @description Default Response */
13007
+ "4XX": {
13008
+ headers: {
13009
+ [name: string]: unknown;
13010
+ };
13011
+ content: {
13012
+ "application/json": components["schemas"]["ErrorBody"];
13013
+ };
13014
+ };
13015
+ /** @description Default Response */
13016
+ "5XX": {
13017
+ headers: {
13018
+ [name: string]: unknown;
13019
+ };
13020
+ content: {
13021
+ "application/json": components["schemas"]["ErrorBody"];
13022
+ };
13023
+ };
13024
+ };
13025
+ };
13026
+ postV1WorkspacesWorkspaceIdFork: {
13027
+ parameters: {
13028
+ query?: never;
13029
+ header?: {
13030
+ prefer?: string;
13031
+ };
13032
+ path: {
13033
+ /** @description UUIDv7, lowercase canonical form. */
13034
+ workspace_id: string;
13035
+ };
13036
+ cookie?: never;
13037
+ };
13038
+ requestBody: {
13039
+ content: {
13040
+ "application/json": {
13041
+ /** @description Stable workspace key, unique per organization (e.g. `${customerId}/${projectId}`). */
13042
+ key: string;
13043
+ /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction. Given caps replace the stored ones (a reopen keeps an elastic workspace’s mode when elastic is the organization’s default and allocation_mode is omitted). */
13044
+ caps?: {
13045
+ cpu_millis?: number;
13046
+ memory_mib?: number;
13047
+ disk_gib?: number;
13048
+ /**
13049
+ * @description Memory allocation (contracts §32): fixed boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Omitted: fixed, or elastic where that is the organization’s default (a reopen then keeps the stored mode). Takes effect at the next VM start.
13050
+ * @enum {string}
13051
+ */
13052
+ allocation_mode?: "fixed" | "elastic";
13053
+ /** @description Elastic only: memory held while idle (MiB, default 1024, at most memory_mib). */
13054
+ memory_mib_held?: number;
13055
+ };
13056
+ lifetime?: components["schemas"]["WorkspaceLifetime"];
13057
+ /** @description Attribution label; one agent session per (workspace, principal, label). */
13058
+ agent_label?: string;
13059
+ tools?: ("exec" | "files" | "pty" | "process" | "git" | "browser")[];
13060
+ };
13061
+ };
13062
+ };
13063
+ responses: {
13064
+ /** @description Default Response */
13065
+ 200: {
13066
+ headers: {
13067
+ [name: string]: unknown;
13068
+ };
13069
+ content: {
13070
+ "application/json": {
13071
+ operation: components["schemas"]["Operation"];
13072
+ workspace: components["schemas"]["Workspace"];
13073
+ /**
13074
+ * Format: uuid
13075
+ * @description UUIDv7, lowercase canonical form.
13076
+ */
13077
+ source_workspace_id: string;
13078
+ cell_endpoint: string | null;
13079
+ tool_token: components["schemas"]["ToolToken"] | null;
13080
+ };
13081
+ };
13082
+ };
13083
+ /** @description Default Response */
13084
+ 202: {
13085
+ headers: {
13086
+ [name: string]: unknown;
13087
+ };
13088
+ content: {
13089
+ "application/json": {
13090
+ operation: components["schemas"]["Operation"];
13091
+ workspace: components["schemas"]["Workspace"];
13092
+ /**
13093
+ * Format: uuid
13094
+ * @description UUIDv7, lowercase canonical form.
13095
+ */
13096
+ source_workspace_id: string;
13097
+ };
13098
+ };
13099
+ };
13100
+ /** @description Default Response */
13101
+ "4XX": {
13102
+ headers: {
13103
+ [name: string]: unknown;
13104
+ };
13105
+ content: {
13106
+ "application/json": components["schemas"]["ErrorBody"];
13107
+ };
13108
+ };
13109
+ /** @description Default Response */
13110
+ "5XX": {
13111
+ headers: {
13112
+ [name: string]: unknown;
13113
+ };
13114
+ content: {
13115
+ "application/json": components["schemas"]["ErrorBody"];
13116
+ };
13117
+ };
13118
+ };
13119
+ };
13120
+ postV1WorkspacesWorkspaceIdClose: {
13121
+ parameters: {
13122
+ query?: never;
13123
+ header?: never;
13124
+ path: {
13125
+ /** @description UUIDv7, lowercase canonical form. */
13126
+ workspace_id: string;
13127
+ };
13128
+ cookie?: never;
13129
+ };
13130
+ requestBody?: never;
13131
+ responses: {
13132
+ /** @description Default Response */
13133
+ 202: {
13134
+ headers: {
13135
+ [name: string]: unknown;
13136
+ };
13137
+ content: {
13138
+ "application/json": {
13139
+ operation: components["schemas"]["Operation"];
13140
+ workspace: components["schemas"]["Workspace"];
13141
+ };
13142
+ };
13143
+ };
13144
+ /** @description Default Response */
13145
+ "4XX": {
13146
+ headers: {
13147
+ [name: string]: unknown;
13148
+ };
13149
+ content: {
13150
+ "application/json": components["schemas"]["ErrorBody"];
13151
+ };
13152
+ };
13153
+ /** @description Default Response */
13154
+ "5XX": {
13155
+ headers: {
13156
+ [name: string]: unknown;
13157
+ };
13158
+ content: {
13159
+ "application/json": components["schemas"]["ErrorBody"];
13160
+ };
13161
+ };
13162
+ };
13163
+ };
13164
+ postV1WorkspacesWorkspaceIdReset: {
13165
+ parameters: {
13166
+ query?: never;
13167
+ header?: never;
13168
+ path: {
13169
+ /** @description UUIDv7, lowercase canonical form. */
13170
+ workspace_id: string;
13171
+ };
13172
+ cookie?: never;
13173
+ };
13174
+ requestBody: {
13175
+ content: {
13176
+ "application/json": components["schemas"]["ResetWorkspaceBody"];
13177
+ };
13178
+ };
13179
+ responses: {
13180
+ /** @description Default Response */
13181
+ 202: {
13182
+ headers: {
13183
+ [name: string]: unknown;
13184
+ };
13185
+ content: {
13186
+ "application/json": {
13187
+ operation: components["schemas"]["Operation"];
13188
+ workspace: components["schemas"]["Workspace"];
13189
+ };
12477
13190
  };
12478
13191
  };
12479
13192
  /** @description Default Response */
@@ -12852,14 +13565,13 @@ export interface operations {
12852
13565
  };
12853
13566
  /** @description Template slug; new workspaces use its latest published version. */
12854
13567
  template: string;
12855
- /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction (allocation_mode: fixed). Given caps replace the stored ones. */
13568
+ /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction. Given caps replace the stored ones (a reopen keeps an elastic workspace’s mode when elastic is the organization’s default and allocation_mode is omitted). */
12856
13569
  caps?: {
12857
13570
  cpu_millis?: number;
12858
13571
  memory_mib?: number;
12859
13572
  disk_gib?: number;
12860
13573
  /**
12861
- * @description Memory allocation (contracts §32): fixed (default) boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Takes effect at the next VM start.
12862
- * @default fixed
13574
+ * @description Memory allocation (contracts §32): fixed boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Omitted: fixed, or elastic where that is the organization’s default (a reopen then keeps the stored mode). Takes effect at the next VM start.
12863
13575
  * @enum {string}
12864
13576
  */
12865
13577
  allocation_mode?: "fixed" | "elastic";
@@ -13442,10 +14154,13 @@ export interface operations {
13442
14154
  };
13443
14155
  };
13444
14156
  };
13445
- postApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
14157
+ patchApiV1WorkspacesWorkspaceIdCaps: {
13446
14158
  parameters: {
13447
14159
  query?: never;
13448
- header?: never;
14160
+ header?: {
14161
+ /** @description RFC 7240 preference, e.g. `wait=30` (at most 55; default 20). */
14162
+ prefer?: string;
14163
+ };
13449
14164
  path: {
13450
14165
  /** @description UUIDv7, lowercase canonical form. */
13451
14166
  workspace_id: string;
@@ -13454,23 +14169,28 @@ export interface operations {
13454
14169
  };
13455
14170
  requestBody: {
13456
14171
  content: {
13457
- "application/json": {
13458
- /** @description Seconds from now the workspace must stay idle before it is suspended (0..3600; 0 = as soon as it is idle). */
13459
- after_seconds: number;
13460
- };
14172
+ "application/json": components["schemas"]["ResizeWorkspaceBody"];
13461
14173
  };
13462
14174
  };
13463
14175
  responses: {
13464
- /** @description suspend_request: the recorded request. operation: set (and suspend_request null) only when a suspend was already in progress. */
14176
+ /** @description Per resource the request named (allocation_mode and memory_mib_held report under memory): what applied now and what applies later. caps: the workspace caps every later start uses. */
14177
+ 200: {
14178
+ headers: {
14179
+ [name: string]: unknown;
14180
+ };
14181
+ content: {
14182
+ "application/json": components["schemas"]["ResizeResult"];
14183
+ };
14184
+ };
14185
+ /** @description Default Response */
13465
14186
  202: {
13466
14187
  headers: {
13467
14188
  [name: string]: unknown;
13468
14189
  };
13469
14190
  content: {
13470
14191
  "application/json": {
14192
+ operation: components["schemas"]["Operation"];
13471
14193
  workspace: components["schemas"]["Workspace"];
13472
- operation: components["schemas"]["Operation"] | null;
13473
- suspend_request: components["schemas"]["SuspendRequest"] | null;
13474
14194
  };
13475
14195
  };
13476
14196
  };
@@ -13494,7 +14214,7 @@ export interface operations {
13494
14214
  };
13495
14215
  };
13496
14216
  };
13497
- deleteApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
14217
+ postApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
13498
14218
  parameters: {
13499
14219
  query?: never;
13500
14220
  header?: never;
@@ -13504,15 +14224,26 @@ export interface operations {
13504
14224
  };
13505
14225
  cookie?: never;
13506
14226
  };
13507
- requestBody?: never;
14227
+ requestBody: {
14228
+ content: {
14229
+ "application/json": {
14230
+ /** @description Seconds from now the workspace must stay idle before it is suspended (0..3600; 0 = as soon as it is idle). */
14231
+ after_seconds: number;
14232
+ };
14233
+ };
14234
+ };
13508
14235
  responses: {
13509
- /** @description Default Response */
13510
- 200: {
14236
+ /** @description suspend_request: the recorded request. operation: set (and suspend_request null) only when a suspend was already in progress. */
14237
+ 202: {
13511
14238
  headers: {
13512
14239
  [name: string]: unknown;
13513
14240
  };
13514
14241
  content: {
13515
- "application/json": components["schemas"]["Workspace"];
14242
+ "application/json": {
14243
+ workspace: components["schemas"]["Workspace"];
14244
+ operation: components["schemas"]["Operation"] | null;
14245
+ suspend_request: components["schemas"]["SuspendRequest"] | null;
14246
+ };
13516
14247
  };
13517
14248
  };
13518
14249
  /** @description Default Response */
@@ -13535,44 +14266,17 @@ export interface operations {
13535
14266
  };
13536
14267
  };
13537
14268
  };
13538
- postApiV1WorkspacesWorkspaceIdFork: {
14269
+ deleteApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
13539
14270
  parameters: {
13540
14271
  query?: never;
13541
- header?: {
13542
- prefer?: string;
13543
- };
14272
+ header?: never;
13544
14273
  path: {
13545
14274
  /** @description UUIDv7, lowercase canonical form. */
13546
14275
  workspace_id: string;
13547
14276
  };
13548
14277
  cookie?: never;
13549
14278
  };
13550
- requestBody: {
13551
- content: {
13552
- "application/json": {
13553
- /** @description Stable workspace key, unique per organization (e.g. `${customerId}/${projectId}`). */
13554
- key: string;
13555
- /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction (allocation_mode: fixed). Given caps replace the stored ones. */
13556
- caps?: {
13557
- cpu_millis?: number;
13558
- memory_mib?: number;
13559
- disk_gib?: number;
13560
- /**
13561
- * @description Memory allocation (contracts §32): fixed (default) boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Takes effect at the next VM start.
13562
- * @default fixed
13563
- * @enum {string}
13564
- */
13565
- allocation_mode?: "fixed" | "elastic";
13566
- /** @description Elastic only: memory held while idle (MiB, default 1024, at most memory_mib). */
13567
- memory_mib_held?: number;
13568
- };
13569
- lifetime?: components["schemas"]["WorkspaceLifetime"];
13570
- /** @description Attribution label; one agent session per (workspace, principal, label). */
13571
- agent_label?: string;
13572
- tools?: ("exec" | "files" | "pty" | "process" | "git" | "browser")[];
13573
- };
13574
- };
13575
- };
14279
+ requestBody?: never;
13576
14280
  responses: {
13577
14281
  /** @description Default Response */
13578
14282
  200: {
@@ -13580,34 +14284,101 @@ export interface operations {
13580
14284
  [name: string]: unknown;
13581
14285
  };
13582
14286
  content: {
13583
- "application/json": {
13584
- operation: components["schemas"]["Operation"];
13585
- workspace: components["schemas"]["Workspace"];
13586
- /**
13587
- * Format: uuid
13588
- * @description UUIDv7, lowercase canonical form.
13589
- */
13590
- source_workspace_id: string;
13591
- cell_endpoint: string | null;
13592
- tool_token: components["schemas"]["ToolToken"] | null;
13593
- };
13594
- };
13595
- };
13596
- /** @description Default Response */
13597
- 202: {
13598
- headers: {
13599
- [name: string]: unknown;
13600
- };
13601
- content: {
13602
- "application/json": {
13603
- operation: components["schemas"]["Operation"];
13604
- workspace: components["schemas"]["Workspace"];
13605
- /**
13606
- * Format: uuid
13607
- * @description UUIDv7, lowercase canonical form.
13608
- */
13609
- source_workspace_id: string;
13610
- };
14287
+ "application/json": components["schemas"]["Workspace"];
14288
+ };
14289
+ };
14290
+ /** @description Default Response */
14291
+ "4XX": {
14292
+ headers: {
14293
+ [name: string]: unknown;
14294
+ };
14295
+ content: {
14296
+ "application/json": components["schemas"]["ErrorBody"];
14297
+ };
14298
+ };
14299
+ /** @description Default Response */
14300
+ "5XX": {
14301
+ headers: {
14302
+ [name: string]: unknown;
14303
+ };
14304
+ content: {
14305
+ "application/json": components["schemas"]["ErrorBody"];
14306
+ };
14307
+ };
14308
+ };
14309
+ };
14310
+ postApiV1WorkspacesWorkspaceIdFork: {
14311
+ parameters: {
14312
+ query?: never;
14313
+ header?: {
14314
+ prefer?: string;
14315
+ };
14316
+ path: {
14317
+ /** @description UUIDv7, lowercase canonical form. */
14318
+ workspace_id: string;
14319
+ };
14320
+ cookie?: never;
14321
+ };
14322
+ requestBody: {
14323
+ content: {
14324
+ "application/json": {
14325
+ /** @description Stable workspace key, unique per organization (e.g. `${customerId}/${projectId}`). */
14326
+ key: string;
14327
+ /** @description Optional user caps; the ceiling is min(template, cap, plan). Absent fields add no restriction. Given caps replace the stored ones (a reopen keeps an elastic workspace’s mode when elastic is the organization’s default and allocation_mode is omitted). */
14328
+ caps?: {
14329
+ cpu_millis?: number;
14330
+ memory_mib?: number;
14331
+ disk_gib?: number;
14332
+ /**
14333
+ * @description Memory allocation (contracts §32): fixed boots memory_mib and holds it; elastic makes memory_mib a promise: the VM holds memory_mib_held while idle and is grown towards the promise when a command needs it. Needs the elastic memory entitlement (422 details.reason allocation_mode_not_available). A promise that does not exceed the held floor by at least 512 MiB is fixed at the promise (the response caps say which). Omitted: fixed, or elastic where that is the organization’s default (a reopen then keeps the stored mode). Takes effect at the next VM start.
14334
+ * @enum {string}
14335
+ */
14336
+ allocation_mode?: "fixed" | "elastic";
14337
+ /** @description Elastic only: memory held while idle (MiB, default 1024, at most memory_mib). */
14338
+ memory_mib_held?: number;
14339
+ };
14340
+ lifetime?: components["schemas"]["WorkspaceLifetime"];
14341
+ /** @description Attribution label; one agent session per (workspace, principal, label). */
14342
+ agent_label?: string;
14343
+ tools?: ("exec" | "files" | "pty" | "process" | "git" | "browser")[];
14344
+ };
14345
+ };
14346
+ };
14347
+ responses: {
14348
+ /** @description Default Response */
14349
+ 200: {
14350
+ headers: {
14351
+ [name: string]: unknown;
14352
+ };
14353
+ content: {
14354
+ "application/json": {
14355
+ operation: components["schemas"]["Operation"];
14356
+ workspace: components["schemas"]["Workspace"];
14357
+ /**
14358
+ * Format: uuid
14359
+ * @description UUIDv7, lowercase canonical form.
14360
+ */
14361
+ source_workspace_id: string;
14362
+ cell_endpoint: string | null;
14363
+ tool_token: components["schemas"]["ToolToken"] | null;
14364
+ };
14365
+ };
14366
+ };
14367
+ /** @description Default Response */
14368
+ 202: {
14369
+ headers: {
14370
+ [name: string]: unknown;
14371
+ };
14372
+ content: {
14373
+ "application/json": {
14374
+ operation: components["schemas"]["Operation"];
14375
+ workspace: components["schemas"]["Workspace"];
14376
+ /**
14377
+ * Format: uuid
14378
+ * @description UUIDv7, lowercase canonical form.
14379
+ */
14380
+ source_workspace_id: string;
14381
+ };
13611
14382
  };
13612
14383
  };
13613
14384
  /** @description Default Response */
@@ -13911,56 +14682,869 @@ export interface operations {
13911
14682
  };
13912
14683
  };
13913
14684
  };
13914
- getApiV1WorkspacesWorkspaceIdAgentSessions: {
14685
+ getApiV1WorkspacesWorkspaceIdAgentSessions: {
14686
+ parameters: {
14687
+ query?: {
14688
+ limit?: number;
14689
+ cursor?: string;
14690
+ };
14691
+ header?: never;
14692
+ path: {
14693
+ /** @description UUIDv7, lowercase canonical form. */
14694
+ workspace_id: string;
14695
+ };
14696
+ cookie?: never;
14697
+ };
14698
+ requestBody?: never;
14699
+ responses: {
14700
+ /** @description Default Response */
14701
+ 200: {
14702
+ headers: {
14703
+ [name: string]: unknown;
14704
+ };
14705
+ content: {
14706
+ "application/json": {
14707
+ data: {
14708
+ /**
14709
+ * Format: uuid
14710
+ * @description UUIDv7, lowercase canonical form.
14711
+ */
14712
+ id: string;
14713
+ /**
14714
+ * Format: uuid
14715
+ * @description UUIDv7, lowercase canonical form.
14716
+ */
14717
+ workspace_id: string;
14718
+ agent_label: string;
14719
+ principal_type: "user" | "api_key";
14720
+ /**
14721
+ * Format: uuid
14722
+ * @description UUIDv7, lowercase canonical form.
14723
+ */
14724
+ principal_id: string;
14725
+ /**
14726
+ * Format: date-time
14727
+ * @description RFC 3339 UTC timestamp with Z.
14728
+ */
14729
+ created_at: string;
14730
+ last_token_issued_at: string | null;
14731
+ tokens_issued: number;
14732
+ revoked_at: string | null;
14733
+ }[];
14734
+ next_cursor: string | null;
14735
+ };
14736
+ };
14737
+ };
14738
+ /** @description Default Response */
14739
+ "4XX": {
14740
+ headers: {
14741
+ [name: string]: unknown;
14742
+ };
14743
+ content: {
14744
+ "application/json": components["schemas"]["ErrorBody"];
14745
+ };
14746
+ };
14747
+ /** @description Default Response */
14748
+ "5XX": {
14749
+ headers: {
14750
+ [name: string]: unknown;
14751
+ };
14752
+ content: {
14753
+ "application/json": components["schemas"]["ErrorBody"];
14754
+ };
14755
+ };
14756
+ };
14757
+ };
14758
+ postApiV1WorkspacesWorkspaceIdStreamTickets: {
14759
+ parameters: {
14760
+ query?: never;
14761
+ header?: never;
14762
+ path: {
14763
+ /** @description UUIDv7, lowercase canonical form. */
14764
+ workspace_id: string;
14765
+ };
14766
+ cookie?: never;
14767
+ };
14768
+ requestBody: {
14769
+ content: {
14770
+ "application/json": {
14771
+ /** @enum {string} */
14772
+ tool: "exec" | "files" | "pty" | "process" | "git" | "browser";
14773
+ /** @description Attribution label; one agent session per (workspace, principal, label). */
14774
+ agent_label?: string;
14775
+ };
14776
+ };
14777
+ };
14778
+ responses: {
14779
+ /** @description Default Response */
14780
+ 201: {
14781
+ headers: {
14782
+ [name: string]: unknown;
14783
+ };
14784
+ content: {
14785
+ "application/json": {
14786
+ /** @description Single use, valid 30 s; pass as `?ticket=` on the cell WebSocket upgrade from the same Origin. */
14787
+ ticket: string;
14788
+ /**
14789
+ * Format: date-time
14790
+ * @description RFC 3339 UTC timestamp with Z.
14791
+ */
14792
+ expires_at: string;
14793
+ /**
14794
+ * Format: uuid
14795
+ * @description UUIDv7, lowercase canonical form.
14796
+ */
14797
+ workspace_id: string;
14798
+ /** @enum {string} */
14799
+ tool: "exec" | "files" | "pty" | "process" | "git" | "browser";
14800
+ /**
14801
+ * Format: uuid
14802
+ * @description UUIDv7, lowercase canonical form.
14803
+ */
14804
+ agent_session_id: string;
14805
+ origin: string;
14806
+ ownership_epoch: number;
14807
+ cell_endpoint: string;
14808
+ };
14809
+ };
14810
+ };
14811
+ /** @description Default Response */
14812
+ "4XX": {
14813
+ headers: {
14814
+ [name: string]: unknown;
14815
+ };
14816
+ content: {
14817
+ "application/json": components["schemas"]["ErrorBody"];
14818
+ };
14819
+ };
14820
+ /** @description Default Response */
14821
+ "5XX": {
14822
+ headers: {
14823
+ [name: string]: unknown;
14824
+ };
14825
+ content: {
14826
+ "application/json": components["schemas"]["ErrorBody"];
14827
+ };
14828
+ };
14829
+ };
14830
+ };
14831
+ getApiV1OrganizationsOrganizationIdEntitlements: {
14832
+ parameters: {
14833
+ query?: never;
14834
+ header?: never;
14835
+ path: {
14836
+ /** @description UUIDv7, lowercase canonical form. */
14837
+ organization_id: string;
14838
+ };
14839
+ cookie?: never;
14840
+ };
14841
+ requestBody?: never;
14842
+ responses: {
14843
+ /** @description Default Response */
14844
+ 200: {
14845
+ headers: {
14846
+ [name: string]: unknown;
14847
+ };
14848
+ content: {
14849
+ "application/json": {
14850
+ /**
14851
+ * Format: uuid
14852
+ * @description UUIDv7, lowercase canonical form.
14853
+ */
14854
+ organization_id: string;
14855
+ plan: {
14856
+ plan_key: string;
14857
+ catalog_version: string;
14858
+ source: "override" | "subscription" | "trial" | "default";
14859
+ /** @description When this plan grant stops applying (a trial or partner grant); null when it lasts until changed. */
14860
+ ends_at: string | null;
14861
+ } | null;
14862
+ /** @description Resolved plan limits (null = unlimited). */
14863
+ limits: {
14864
+ [key: string]: unknown;
14865
+ };
14866
+ allowances: {
14867
+ [key: string]: unknown;
14868
+ };
14869
+ policies: {
14870
+ [key: string]: unknown;
14871
+ };
14872
+ /** @description Active admission restrictions, e.g. `new_starts` {reason, since, grace_until} after a payment grace period ended. */
14873
+ restrictions: {
14874
+ [key: string]: unknown;
14875
+ };
14876
+ /**
14877
+ * Format: date-time
14878
+ * @description RFC 3339 UTC timestamp with Z.
14879
+ */
14880
+ resolved_at: string;
14881
+ };
14882
+ };
14883
+ };
14884
+ /** @description Default Response */
14885
+ "4XX": {
14886
+ headers: {
14887
+ [name: string]: unknown;
14888
+ };
14889
+ content: {
14890
+ "application/json": components["schemas"]["ErrorBody"];
14891
+ };
14892
+ };
14893
+ /** @description Default Response */
14894
+ "5XX": {
14895
+ headers: {
14896
+ [name: string]: unknown;
14897
+ };
14898
+ content: {
14899
+ "application/json": components["schemas"]["ErrorBody"];
14900
+ };
14901
+ };
14902
+ };
14903
+ };
14904
+ putV1WorkspacesWorkspaceIdPortsPort: {
14905
+ parameters: {
14906
+ query?: never;
14907
+ header?: never;
14908
+ path: {
14909
+ /** @description UUIDv7, lowercase canonical form. */
14910
+ workspace_id: string;
14911
+ /** @description TCP port inside the workspace (1-65535). */
14912
+ port: number;
14913
+ };
14914
+ cookie?: never;
14915
+ };
14916
+ requestBody?: never;
14917
+ responses: {
14918
+ /** @description An exposed port of a workspace (contracts §39.3). Private: every request needs a credential. */
14919
+ 200: {
14920
+ headers: {
14921
+ [name: string]: unknown;
14922
+ };
14923
+ content: {
14924
+ "application/json": components["schemas"]["Port"];
14925
+ };
14926
+ };
14927
+ /** @description An exposed port of a workspace (contracts §39.3). Private: every request needs a credential. */
14928
+ 201: {
14929
+ headers: {
14930
+ [name: string]: unknown;
14931
+ };
14932
+ content: {
14933
+ "application/json": components["schemas"]["Port"];
14934
+ };
14935
+ };
14936
+ /** @description Default Response */
14937
+ "4XX": {
14938
+ headers: {
14939
+ [name: string]: unknown;
14940
+ };
14941
+ content: {
14942
+ "application/json": components["schemas"]["ErrorBody"];
14943
+ };
14944
+ };
14945
+ /** @description Default Response */
14946
+ "5XX": {
14947
+ headers: {
14948
+ [name: string]: unknown;
14949
+ };
14950
+ content: {
14951
+ "application/json": components["schemas"]["ErrorBody"];
14952
+ };
14953
+ };
14954
+ };
14955
+ };
14956
+ deleteV1WorkspacesWorkspaceIdPortsPort: {
14957
+ parameters: {
14958
+ query?: never;
14959
+ header?: never;
14960
+ path: {
14961
+ /** @description UUIDv7, lowercase canonical form. */
14962
+ workspace_id: string;
14963
+ /** @description TCP port inside the workspace (1-65535). */
14964
+ port: number;
14965
+ };
14966
+ cookie?: never;
14967
+ };
14968
+ requestBody?: never;
14969
+ responses: {
14970
+ /** @description No content. */
14971
+ 204: {
14972
+ headers: {
14973
+ [name: string]: unknown;
14974
+ };
14975
+ content?: never;
14976
+ };
14977
+ /** @description Default Response */
14978
+ "4XX": {
14979
+ headers: {
14980
+ [name: string]: unknown;
14981
+ };
14982
+ content: {
14983
+ "application/json": components["schemas"]["ErrorBody"];
14984
+ };
14985
+ };
14986
+ /** @description Default Response */
14987
+ "5XX": {
14988
+ headers: {
14989
+ [name: string]: unknown;
14990
+ };
14991
+ content: {
14992
+ "application/json": components["schemas"]["ErrorBody"];
14993
+ };
14994
+ };
14995
+ };
14996
+ };
14997
+ getV1WorkspacesWorkspaceIdPorts: {
14998
+ parameters: {
14999
+ query?: never;
15000
+ header?: never;
15001
+ path: {
15002
+ /** @description UUIDv7, lowercase canonical form. */
15003
+ workspace_id: string;
15004
+ };
15005
+ cookie?: never;
15006
+ };
15007
+ requestBody?: never;
15008
+ responses: {
15009
+ /** @description Default Response */
15010
+ 200: {
15011
+ headers: {
15012
+ [name: string]: unknown;
15013
+ };
15014
+ content: {
15015
+ "application/json": {
15016
+ ports: components["schemas"]["Port"][];
15017
+ };
15018
+ };
15019
+ };
15020
+ /** @description Default Response */
15021
+ "4XX": {
15022
+ headers: {
15023
+ [name: string]: unknown;
15024
+ };
15025
+ content: {
15026
+ "application/json": components["schemas"]["ErrorBody"];
15027
+ };
15028
+ };
15029
+ /** @description Default Response */
15030
+ "5XX": {
15031
+ headers: {
15032
+ [name: string]: unknown;
15033
+ };
15034
+ content: {
15035
+ "application/json": components["schemas"]["ErrorBody"];
15036
+ };
15037
+ };
15038
+ };
15039
+ };
15040
+ postV1WorkspacesWorkspaceIdPortsPortTokens: {
15041
+ parameters: {
15042
+ query?: never;
15043
+ header?: never;
15044
+ path: {
15045
+ /** @description UUIDv7, lowercase canonical form. */
15046
+ workspace_id: string;
15047
+ /** @description TCP port inside the workspace (1-65535). */
15048
+ port: number;
15049
+ };
15050
+ cookie?: never;
15051
+ };
15052
+ requestBody?: {
15053
+ content: {
15054
+ "application/json": {
15055
+ /**
15056
+ * @description Lifetime in seconds (60-86400, default 3600).
15057
+ * @default 3600
15058
+ */
15059
+ ttl_seconds?: number;
15060
+ };
15061
+ };
15062
+ };
15063
+ responses: {
15064
+ /** @description Default Response */
15065
+ 201: {
15066
+ headers: {
15067
+ [name: string]: unknown;
15068
+ };
15069
+ content: {
15070
+ "application/json": {
15071
+ /** @description sfp_…: send as `Authorization: Bearer <token>` (or `X-Shardflux-Token`) to `url`. Revoked when the port is closed. */
15072
+ token: string;
15073
+ /**
15074
+ * Format: date-time
15075
+ * @description RFC 3339 UTC timestamp with Z.
15076
+ */
15077
+ expires_at: string;
15078
+ /** @description The port’s URL. */
15079
+ url: string;
15080
+ };
15081
+ };
15082
+ };
15083
+ /** @description Default Response */
15084
+ "4XX": {
15085
+ headers: {
15086
+ [name: string]: unknown;
15087
+ };
15088
+ content: {
15089
+ "application/json": components["schemas"]["ErrorBody"];
15090
+ };
15091
+ };
15092
+ /** @description Default Response */
15093
+ "5XX": {
15094
+ headers: {
15095
+ [name: string]: unknown;
15096
+ };
15097
+ content: {
15098
+ "application/json": components["schemas"]["ErrorBody"];
15099
+ };
15100
+ };
15101
+ };
15102
+ };
15103
+ postV1WorkspacesWorkspaceIdPortsPortLinks: {
15104
+ parameters: {
15105
+ query?: never;
15106
+ header?: never;
15107
+ path: {
15108
+ /** @description UUIDv7, lowercase canonical form. */
15109
+ workspace_id: string;
15110
+ /** @description TCP port inside the workspace (1-65535). */
15111
+ port: number;
15112
+ };
15113
+ cookie?: never;
15114
+ };
15115
+ requestBody?: {
15116
+ content: {
15117
+ "application/json": {
15118
+ /**
15119
+ * @description Lifetime of the link and of the browser session it starts (60-604800 s, default 86400).
15120
+ * @default 86400
15121
+ */
15122
+ ttl_seconds?: number;
15123
+ /** @description Where the link lands (default `/`): a path starting with one `/`, printable ASCII, query allowed. */
15124
+ path?: string;
15125
+ };
15126
+ };
15127
+ };
15128
+ responses: {
15129
+ /** @description Default Response */
15130
+ 201: {
15131
+ headers: {
15132
+ [name: string]: unknown;
15133
+ };
15134
+ content: {
15135
+ "application/json": {
15136
+ /** @description Open in a browser: it sets a session cookie for the port’s host (until expires_at) and redirects to `path`. */
15137
+ url: string;
15138
+ /**
15139
+ * Format: date-time
15140
+ * @description RFC 3339 UTC timestamp with Z.
15141
+ */
15142
+ expires_at: string;
15143
+ };
15144
+ };
15145
+ };
15146
+ /** @description Default Response */
15147
+ "4XX": {
15148
+ headers: {
15149
+ [name: string]: unknown;
15150
+ };
15151
+ content: {
15152
+ "application/json": components["schemas"]["ErrorBody"];
15153
+ };
15154
+ };
15155
+ /** @description Default Response */
15156
+ "5XX": {
15157
+ headers: {
15158
+ [name: string]: unknown;
15159
+ };
15160
+ content: {
15161
+ "application/json": components["schemas"]["ErrorBody"];
15162
+ };
15163
+ };
15164
+ };
15165
+ };
15166
+ postV1WorkspacesWorkspaceIdPortsPortCallback: {
15167
+ parameters: {
15168
+ query?: never;
15169
+ header?: never;
15170
+ path: {
15171
+ /** @description UUIDv7, lowercase canonical form. */
15172
+ workspace_id: string;
15173
+ /** @description TCP port inside the workspace (1-65535). */
15174
+ port: number;
15175
+ };
15176
+ cookie?: never;
15177
+ };
15178
+ requestBody?: never;
15179
+ responses: {
15180
+ /** @description Default Response */
15181
+ 201: {
15182
+ headers: {
15183
+ [name: string]: unknown;
15184
+ };
15185
+ content: {
15186
+ "application/json": {
15187
+ /** @description https://<port>-<handle>.<domain>/__shardflux/callback/sfcb_…/: append your own path. Shown once. */
15188
+ url: string;
15189
+ /**
15190
+ * Format: date-time
15191
+ * @description RFC 3339 UTC timestamp with Z.
15192
+ */
15193
+ created_at: string;
15194
+ };
15195
+ };
15196
+ };
15197
+ /** @description Default Response */
15198
+ "4XX": {
15199
+ headers: {
15200
+ [name: string]: unknown;
15201
+ };
15202
+ content: {
15203
+ "application/json": components["schemas"]["ErrorBody"];
15204
+ };
15205
+ };
15206
+ /** @description Default Response */
15207
+ "5XX": {
15208
+ headers: {
15209
+ [name: string]: unknown;
15210
+ };
15211
+ content: {
15212
+ "application/json": components["schemas"]["ErrorBody"];
15213
+ };
15214
+ };
15215
+ };
15216
+ };
15217
+ deleteV1WorkspacesWorkspaceIdPortsPortCallback: {
15218
+ parameters: {
15219
+ query?: never;
15220
+ header?: never;
15221
+ path: {
15222
+ /** @description UUIDv7, lowercase canonical form. */
15223
+ workspace_id: string;
15224
+ /** @description TCP port inside the workspace (1-65535). */
15225
+ port: number;
15226
+ };
15227
+ cookie?: never;
15228
+ };
15229
+ requestBody?: never;
15230
+ responses: {
15231
+ /** @description No content. */
15232
+ 204: {
15233
+ headers: {
15234
+ [name: string]: unknown;
15235
+ };
15236
+ content?: never;
15237
+ };
15238
+ /** @description Default Response */
15239
+ "4XX": {
15240
+ headers: {
15241
+ [name: string]: unknown;
15242
+ };
15243
+ content: {
15244
+ "application/json": components["schemas"]["ErrorBody"];
15245
+ };
15246
+ };
15247
+ /** @description Default Response */
15248
+ "5XX": {
15249
+ headers: {
15250
+ [name: string]: unknown;
15251
+ };
15252
+ content: {
15253
+ "application/json": components["schemas"]["ErrorBody"];
15254
+ };
15255
+ };
15256
+ };
15257
+ };
15258
+ putApiV1WorkspacesWorkspaceIdPortsPort: {
15259
+ parameters: {
15260
+ query?: never;
15261
+ header?: never;
15262
+ path: {
15263
+ /** @description UUIDv7, lowercase canonical form. */
15264
+ workspace_id: string;
15265
+ /** @description TCP port inside the workspace (1-65535). */
15266
+ port: number;
15267
+ };
15268
+ cookie?: never;
15269
+ };
15270
+ requestBody?: never;
15271
+ responses: {
15272
+ /** @description An exposed port of a workspace (contracts §39.3). Private: every request needs a credential. */
15273
+ 200: {
15274
+ headers: {
15275
+ [name: string]: unknown;
15276
+ };
15277
+ content: {
15278
+ "application/json": components["schemas"]["Port"];
15279
+ };
15280
+ };
15281
+ /** @description An exposed port of a workspace (contracts §39.3). Private: every request needs a credential. */
15282
+ 201: {
15283
+ headers: {
15284
+ [name: string]: unknown;
15285
+ };
15286
+ content: {
15287
+ "application/json": components["schemas"]["Port"];
15288
+ };
15289
+ };
15290
+ /** @description Default Response */
15291
+ "4XX": {
15292
+ headers: {
15293
+ [name: string]: unknown;
15294
+ };
15295
+ content: {
15296
+ "application/json": components["schemas"]["ErrorBody"];
15297
+ };
15298
+ };
15299
+ /** @description Default Response */
15300
+ "5XX": {
15301
+ headers: {
15302
+ [name: string]: unknown;
15303
+ };
15304
+ content: {
15305
+ "application/json": components["schemas"]["ErrorBody"];
15306
+ };
15307
+ };
15308
+ };
15309
+ };
15310
+ deleteApiV1WorkspacesWorkspaceIdPortsPort: {
15311
+ parameters: {
15312
+ query?: never;
15313
+ header?: never;
15314
+ path: {
15315
+ /** @description UUIDv7, lowercase canonical form. */
15316
+ workspace_id: string;
15317
+ /** @description TCP port inside the workspace (1-65535). */
15318
+ port: number;
15319
+ };
15320
+ cookie?: never;
15321
+ };
15322
+ requestBody?: never;
15323
+ responses: {
15324
+ /** @description No content. */
15325
+ 204: {
15326
+ headers: {
15327
+ [name: string]: unknown;
15328
+ };
15329
+ content?: never;
15330
+ };
15331
+ /** @description Default Response */
15332
+ "4XX": {
15333
+ headers: {
15334
+ [name: string]: unknown;
15335
+ };
15336
+ content: {
15337
+ "application/json": components["schemas"]["ErrorBody"];
15338
+ };
15339
+ };
15340
+ /** @description Default Response */
15341
+ "5XX": {
15342
+ headers: {
15343
+ [name: string]: unknown;
15344
+ };
15345
+ content: {
15346
+ "application/json": components["schemas"]["ErrorBody"];
15347
+ };
15348
+ };
15349
+ };
15350
+ };
15351
+ getApiV1WorkspacesWorkspaceIdPorts: {
15352
+ parameters: {
15353
+ query?: never;
15354
+ header?: never;
15355
+ path: {
15356
+ /** @description UUIDv7, lowercase canonical form. */
15357
+ workspace_id: string;
15358
+ };
15359
+ cookie?: never;
15360
+ };
15361
+ requestBody?: never;
15362
+ responses: {
15363
+ /** @description Default Response */
15364
+ 200: {
15365
+ headers: {
15366
+ [name: string]: unknown;
15367
+ };
15368
+ content: {
15369
+ "application/json": {
15370
+ ports: components["schemas"]["Port"][];
15371
+ };
15372
+ };
15373
+ };
15374
+ /** @description Default Response */
15375
+ "4XX": {
15376
+ headers: {
15377
+ [name: string]: unknown;
15378
+ };
15379
+ content: {
15380
+ "application/json": components["schemas"]["ErrorBody"];
15381
+ };
15382
+ };
15383
+ /** @description Default Response */
15384
+ "5XX": {
15385
+ headers: {
15386
+ [name: string]: unknown;
15387
+ };
15388
+ content: {
15389
+ "application/json": components["schemas"]["ErrorBody"];
15390
+ };
15391
+ };
15392
+ };
15393
+ };
15394
+ postApiV1WorkspacesWorkspaceIdPortsPortTokens: {
15395
+ parameters: {
15396
+ query?: never;
15397
+ header?: never;
15398
+ path: {
15399
+ /** @description UUIDv7, lowercase canonical form. */
15400
+ workspace_id: string;
15401
+ /** @description TCP port inside the workspace (1-65535). */
15402
+ port: number;
15403
+ };
15404
+ cookie?: never;
15405
+ };
15406
+ requestBody?: {
15407
+ content: {
15408
+ "application/json": {
15409
+ /**
15410
+ * @description Lifetime in seconds (60-86400, default 3600).
15411
+ * @default 3600
15412
+ */
15413
+ ttl_seconds?: number;
15414
+ };
15415
+ };
15416
+ };
15417
+ responses: {
15418
+ /** @description Default Response */
15419
+ 201: {
15420
+ headers: {
15421
+ [name: string]: unknown;
15422
+ };
15423
+ content: {
15424
+ "application/json": {
15425
+ /** @description sfp_…: send as `Authorization: Bearer <token>` (or `X-Shardflux-Token`) to `url`. Revoked when the port is closed. */
15426
+ token: string;
15427
+ /**
15428
+ * Format: date-time
15429
+ * @description RFC 3339 UTC timestamp with Z.
15430
+ */
15431
+ expires_at: string;
15432
+ /** @description The port’s URL. */
15433
+ url: string;
15434
+ };
15435
+ };
15436
+ };
15437
+ /** @description Default Response */
15438
+ "4XX": {
15439
+ headers: {
15440
+ [name: string]: unknown;
15441
+ };
15442
+ content: {
15443
+ "application/json": components["schemas"]["ErrorBody"];
15444
+ };
15445
+ };
15446
+ /** @description Default Response */
15447
+ "5XX": {
15448
+ headers: {
15449
+ [name: string]: unknown;
15450
+ };
15451
+ content: {
15452
+ "application/json": components["schemas"]["ErrorBody"];
15453
+ };
15454
+ };
15455
+ };
15456
+ };
15457
+ postApiV1WorkspacesWorkspaceIdPortsPortLinks: {
15458
+ parameters: {
15459
+ query?: never;
15460
+ header?: never;
15461
+ path: {
15462
+ /** @description UUIDv7, lowercase canonical form. */
15463
+ workspace_id: string;
15464
+ /** @description TCP port inside the workspace (1-65535). */
15465
+ port: number;
15466
+ };
15467
+ cookie?: never;
15468
+ };
15469
+ requestBody?: {
15470
+ content: {
15471
+ "application/json": {
15472
+ /**
15473
+ * @description Lifetime of the link and of the browser session it starts (60-604800 s, default 86400).
15474
+ * @default 86400
15475
+ */
15476
+ ttl_seconds?: number;
15477
+ /** @description Where the link lands (default `/`): a path starting with one `/`, printable ASCII, query allowed. */
15478
+ path?: string;
15479
+ };
15480
+ };
15481
+ };
15482
+ responses: {
15483
+ /** @description Default Response */
15484
+ 201: {
15485
+ headers: {
15486
+ [name: string]: unknown;
15487
+ };
15488
+ content: {
15489
+ "application/json": {
15490
+ /** @description Open in a browser: it sets a session cookie for the port’s host (until expires_at) and redirects to `path`. */
15491
+ url: string;
15492
+ /**
15493
+ * Format: date-time
15494
+ * @description RFC 3339 UTC timestamp with Z.
15495
+ */
15496
+ expires_at: string;
15497
+ };
15498
+ };
15499
+ };
15500
+ /** @description Default Response */
15501
+ "4XX": {
15502
+ headers: {
15503
+ [name: string]: unknown;
15504
+ };
15505
+ content: {
15506
+ "application/json": components["schemas"]["ErrorBody"];
15507
+ };
15508
+ };
15509
+ /** @description Default Response */
15510
+ "5XX": {
15511
+ headers: {
15512
+ [name: string]: unknown;
15513
+ };
15514
+ content: {
15515
+ "application/json": components["schemas"]["ErrorBody"];
15516
+ };
15517
+ };
15518
+ };
15519
+ };
15520
+ postApiV1WorkspacesWorkspaceIdPortsPortCallback: {
13915
15521
  parameters: {
13916
- query?: {
13917
- limit?: number;
13918
- cursor?: string;
13919
- };
15522
+ query?: never;
13920
15523
  header?: never;
13921
15524
  path: {
13922
15525
  /** @description UUIDv7, lowercase canonical form. */
13923
15526
  workspace_id: string;
15527
+ /** @description TCP port inside the workspace (1-65535). */
15528
+ port: number;
13924
15529
  };
13925
15530
  cookie?: never;
13926
15531
  };
13927
15532
  requestBody?: never;
13928
15533
  responses: {
13929
15534
  /** @description Default Response */
13930
- 200: {
15535
+ 201: {
13931
15536
  headers: {
13932
15537
  [name: string]: unknown;
13933
15538
  };
13934
15539
  content: {
13935
15540
  "application/json": {
13936
- data: {
13937
- /**
13938
- * Format: uuid
13939
- * @description UUIDv7, lowercase canonical form.
13940
- */
13941
- id: string;
13942
- /**
13943
- * Format: uuid
13944
- * @description UUIDv7, lowercase canonical form.
13945
- */
13946
- workspace_id: string;
13947
- agent_label: string;
13948
- principal_type: "user" | "api_key";
13949
- /**
13950
- * Format: uuid
13951
- * @description UUIDv7, lowercase canonical form.
13952
- */
13953
- principal_id: string;
13954
- /**
13955
- * Format: date-time
13956
- * @description RFC 3339 UTC timestamp with Z.
13957
- */
13958
- created_at: string;
13959
- last_token_issued_at: string | null;
13960
- tokens_issued: number;
13961
- revoked_at: string | null;
13962
- }[];
13963
- next_cursor: string | null;
15541
+ /** @description https://<port>-<handle>.<domain>/__shardflux/callback/sfcb_…/: append your own path. Shown once. */
15542
+ url: string;
15543
+ /**
15544
+ * Format: date-time
15545
+ * @description RFC 3339 UTC timestamp with Z.
15546
+ */
15547
+ created_at: string;
13964
15548
  };
13965
15549
  };
13966
15550
  };
@@ -13984,58 +15568,26 @@ export interface operations {
13984
15568
  };
13985
15569
  };
13986
15570
  };
13987
- postApiV1WorkspacesWorkspaceIdStreamTickets: {
15571
+ deleteApiV1WorkspacesWorkspaceIdPortsPortCallback: {
13988
15572
  parameters: {
13989
15573
  query?: never;
13990
15574
  header?: never;
13991
15575
  path: {
13992
15576
  /** @description UUIDv7, lowercase canonical form. */
13993
15577
  workspace_id: string;
15578
+ /** @description TCP port inside the workspace (1-65535). */
15579
+ port: number;
13994
15580
  };
13995
15581
  cookie?: never;
13996
15582
  };
13997
- requestBody: {
13998
- content: {
13999
- "application/json": {
14000
- /** @enum {string} */
14001
- tool: "exec" | "files" | "pty" | "process" | "git" | "browser";
14002
- /** @description Attribution label; one agent session per (workspace, principal, label). */
14003
- agent_label?: string;
14004
- };
14005
- };
14006
- };
15583
+ requestBody?: never;
14007
15584
  responses: {
14008
- /** @description Default Response */
14009
- 201: {
15585
+ /** @description No content. */
15586
+ 204: {
14010
15587
  headers: {
14011
15588
  [name: string]: unknown;
14012
15589
  };
14013
- content: {
14014
- "application/json": {
14015
- /** @description Single use, valid 30 s; pass as `?ticket=` on the cell WebSocket upgrade from the same Origin. */
14016
- ticket: string;
14017
- /**
14018
- * Format: date-time
14019
- * @description RFC 3339 UTC timestamp with Z.
14020
- */
14021
- expires_at: string;
14022
- /**
14023
- * Format: uuid
14024
- * @description UUIDv7, lowercase canonical form.
14025
- */
14026
- workspace_id: string;
14027
- /** @enum {string} */
14028
- tool: "exec" | "files" | "pty" | "process" | "git" | "browser";
14029
- /**
14030
- * Format: uuid
14031
- * @description UUIDv7, lowercase canonical form.
14032
- */
14033
- agent_session_id: string;
14034
- origin: string;
14035
- ownership_epoch: number;
14036
- cell_endpoint: string;
14037
- };
14038
- };
15590
+ content?: never;
14039
15591
  };
14040
15592
  /** @description Default Response */
14041
15593
  "4XX": {
@@ -14057,56 +15609,69 @@ export interface operations {
14057
15609
  };
14058
15610
  };
14059
15611
  };
14060
- getApiV1OrganizationsOrganizationIdEntitlements: {
15612
+ postV1InternalPortWakes: {
14061
15613
  parameters: {
14062
15614
  query?: never;
14063
- header?: never;
14064
- path: {
14065
- /** @description UUIDv7, lowercase canonical form. */
14066
- organization_id: string;
15615
+ header?: {
15616
+ /** @description RFC 7240 preference, e.g. `wait=20` (held wake). */
15617
+ prefer?: string;
14067
15618
  };
15619
+ path?: never;
14068
15620
  cookie?: never;
14069
15621
  };
14070
- requestBody?: never;
15622
+ requestBody: {
15623
+ content: {
15624
+ "application/json": {
15625
+ /**
15626
+ * Format: uuid
15627
+ * @description UUIDv7, lowercase canonical form.
15628
+ */
15629
+ workspace_id: string;
15630
+ /** @description TCP port inside the workspace (1-65535). */
15631
+ port: number;
15632
+ /** @description The callback URL’s secret (`sfcb_…`) when the request came in on the callback path; omit when Authorization carries a port token. */
15633
+ callback_secret?: string;
15634
+ };
15635
+ };
15636
+ };
14071
15637
  responses: {
14072
- /** @description Default Response */
15638
+ /** @description 200: running (operation null: it already was) or the resume succeeded during the hold. 202: the resume/open to wait for. */
14073
15639
  200: {
14074
15640
  headers: {
14075
15641
  [name: string]: unknown;
14076
15642
  };
14077
15643
  content: {
14078
15644
  "application/json": {
14079
- /**
14080
- * Format: uuid
14081
- * @description UUIDv7, lowercase canonical form.
14082
- */
14083
- organization_id: string;
14084
- plan: {
14085
- plan_key: string;
14086
- catalog_version: string;
14087
- source: "override" | "subscription" | "trial" | "default";
14088
- /** @description When this plan grant stops applying (a trial or partner grant); null when it lasts until changed. */
14089
- ends_at: string | null;
14090
- } | null;
14091
- /** @description Resolved plan limits (null = unlimited). */
14092
- limits: {
14093
- [key: string]: unknown;
14094
- };
14095
- allowances: {
14096
- [key: string]: unknown;
14097
- };
14098
- policies: {
14099
- [key: string]: unknown;
15645
+ workspace: {
15646
+ /**
15647
+ * Format: uuid
15648
+ * @description UUIDv7, lowercase canonical form.
15649
+ */
15650
+ id: string;
15651
+ observed_state: string;
15652
+ ownership_epoch: number;
14100
15653
  };
14101
- /** @description Active admission restrictions, e.g. `new_starts` {reason, since, grace_until} after a payment grace period ended. */
14102
- restrictions: {
14103
- [key: string]: unknown;
15654
+ operation: components["schemas"]["Operation"] | null;
15655
+ };
15656
+ };
15657
+ };
15658
+ /** @description 200: running (operation null: it already was) or the resume succeeded during the hold. 202: the resume/open to wait for. */
15659
+ 202: {
15660
+ headers: {
15661
+ [name: string]: unknown;
15662
+ };
15663
+ content: {
15664
+ "application/json": {
15665
+ workspace: {
15666
+ /**
15667
+ * Format: uuid
15668
+ * @description UUIDv7, lowercase canonical form.
15669
+ */
15670
+ id: string;
15671
+ observed_state: string;
15672
+ ownership_epoch: number;
14104
15673
  };
14105
- /**
14106
- * Format: date-time
14107
- * @description RFC 3339 UTC timestamp with Z.
14108
- */
14109
- resolved_at: string;
15674
+ operation: components["schemas"]["Operation"] | null;
14110
15675
  };
14111
15676
  };
14112
15677
  };
@@ -35363,6 +36928,18 @@ export interface operations {
35363
36928
  disk_gib: number;
35364
36929
  }[];
35365
36930
  heartbeat_stale_after_seconds: number;
36931
+ /** @description Contracts §42.5: what draining this host costs in memory (cell.hosts.drain_runtime_impact). */
36932
+ runtime_impact?: {
36933
+ /** @description known: recorded by the cell’s capacity tick within 15 minutes; unknown: not recorded; stale: older (both reported, neither blocks). */
36934
+ status: "known" | "unknown" | "stale";
36935
+ memory_lost: number | null;
36936
+ waits: number | null;
36937
+ /** @description Affected snapshot compatibility keys with counts and their outlook without this host (largest first, at most 20). */
36938
+ keys: {
36939
+ [key: string]: unknown;
36940
+ }[];
36941
+ computed_at: string | null;
36942
+ };
35366
36943
  host: {
35367
36944
  /**
35368
36945
  * Format: uuid
@@ -35554,6 +37131,18 @@ export interface operations {
35554
37131
  disk_gib: number;
35555
37132
  }[];
35556
37133
  heartbeat_stale_after_seconds: number;
37134
+ /** @description Contracts §42.5: what draining this host costs in memory (cell.hosts.drain_runtime_impact). */
37135
+ runtime_impact?: {
37136
+ /** @description known: recorded by the cell’s capacity tick within 15 minutes; unknown: not recorded; stale: older (both reported, neither blocks). */
37137
+ status: "known" | "unknown" | "stale";
37138
+ memory_lost: number | null;
37139
+ waits: number | null;
37140
+ /** @description Affected snapshot compatibility keys with counts and their outlook without this host (largest first, at most 20). */
37141
+ keys: {
37142
+ [key: string]: unknown;
37143
+ }[];
37144
+ computed_at: string | null;
37145
+ };
35557
37146
  host: {
35558
37147
  /**
35559
37148
  * Format: uuid
@@ -35742,6 +37331,18 @@ export interface operations {
35742
37331
  disk_gib: number;
35743
37332
  }[];
35744
37333
  heartbeat_stale_after_seconds: number;
37334
+ /** @description Contracts §42.5: what draining this host costs in memory (cell.hosts.drain_runtime_impact). */
37335
+ runtime_impact?: {
37336
+ /** @description known: recorded by the cell’s capacity tick within 15 minutes; unknown: not recorded; stale: older (both reported, neither blocks). */
37337
+ status: "known" | "unknown" | "stale";
37338
+ memory_lost: number | null;
37339
+ waits: number | null;
37340
+ /** @description Affected snapshot compatibility keys with counts and their outlook without this host (largest first, at most 20). */
37341
+ keys: {
37342
+ [key: string]: unknown;
37343
+ }[];
37344
+ computed_at: string | null;
37345
+ };
35745
37346
  host: {
35746
37347
  /**
35747
37348
  * Format: uuid
@@ -35935,6 +37536,18 @@ export interface operations {
35935
37536
  disk_gib: number;
35936
37537
  }[];
35937
37538
  heartbeat_stale_after_seconds: number;
37539
+ /** @description Contracts §42.5: what draining this host costs in memory (cell.hosts.drain_runtime_impact). */
37540
+ runtime_impact?: {
37541
+ /** @description known: recorded by the cell’s capacity tick within 15 minutes; unknown: not recorded; stale: older (both reported, neither blocks). */
37542
+ status: "known" | "unknown" | "stale";
37543
+ memory_lost: number | null;
37544
+ waits: number | null;
37545
+ /** @description Affected snapshot compatibility keys with counts and their outlook without this host (largest first, at most 20). */
37546
+ keys: {
37547
+ [key: string]: unknown;
37548
+ }[];
37549
+ computed_at: string | null;
37550
+ };
35938
37551
  host: {
35939
37552
  /**
35940
37553
  * Format: uuid
@@ -37085,4 +38698,116 @@ export interface operations {
37085
38698
  };
37086
38699
  };
37087
38700
  };
38701
+ getApiV1OauthAuthorization: {
38702
+ parameters: {
38703
+ query?: {
38704
+ response_type?: string;
38705
+ client_id?: string;
38706
+ redirect_uri?: string;
38707
+ code_challenge?: string;
38708
+ code_challenge_method?: string;
38709
+ scope?: string;
38710
+ state?: string;
38711
+ resource?: string;
38712
+ };
38713
+ header?: never;
38714
+ path?: never;
38715
+ cookie?: never;
38716
+ };
38717
+ requestBody?: never;
38718
+ responses: {
38719
+ /** @description Default Response */
38720
+ 200: {
38721
+ headers: {
38722
+ [name: string]: unknown;
38723
+ };
38724
+ content: {
38725
+ "application/json": components["schemas"]["OAuthConsentView"];
38726
+ };
38727
+ };
38728
+ /** @description Default Response */
38729
+ "4XX": {
38730
+ headers: {
38731
+ [name: string]: unknown;
38732
+ };
38733
+ content: {
38734
+ "application/json": components["schemas"]["ErrorBody"];
38735
+ };
38736
+ };
38737
+ /** @description Default Response */
38738
+ "5XX": {
38739
+ headers: {
38740
+ [name: string]: unknown;
38741
+ };
38742
+ content: {
38743
+ "application/json": components["schemas"]["ErrorBody"];
38744
+ };
38745
+ };
38746
+ };
38747
+ };
38748
+ postApiV1OauthAuthorization: {
38749
+ parameters: {
38750
+ query?: never;
38751
+ header?: never;
38752
+ path?: never;
38753
+ cookie?: never;
38754
+ };
38755
+ requestBody: {
38756
+ content: {
38757
+ "application/json": {
38758
+ /** @description The authorization request exactly as /oauth/authorize received it (RFC 6749 §4.1.1, PKCE S256, RFC 8707 resource). */
38759
+ request: {
38760
+ response_type?: string;
38761
+ client_id?: string;
38762
+ redirect_uri?: string;
38763
+ code_challenge?: string;
38764
+ code_challenge_method?: string;
38765
+ scope?: string;
38766
+ state?: string;
38767
+ resource?: string;
38768
+ } & {
38769
+ [key: string]: unknown;
38770
+ };
38771
+ decision: "approve" | "deny";
38772
+ /**
38773
+ * Format: uuid
38774
+ * @description UUIDv7, lowercase canonical form.
38775
+ */
38776
+ project_id?: string;
38777
+ };
38778
+ };
38779
+ };
38780
+ responses: {
38781
+ /** @description Default Response */
38782
+ 200: {
38783
+ headers: {
38784
+ [name: string]: unknown;
38785
+ };
38786
+ content: {
38787
+ "application/json": {
38788
+ /** @description Send the browser here (the client’s redirect_uri with code or error, state and iss). */
38789
+ redirect_to: string;
38790
+ };
38791
+ };
38792
+ };
38793
+ /** @description Default Response */
38794
+ "4XX": {
38795
+ headers: {
38796
+ [name: string]: unknown;
38797
+ };
38798
+ content: {
38799
+ "application/json": components["schemas"]["ErrorBody"];
38800
+ };
38801
+ };
38802
+ /** @description Default Response */
38803
+ "5XX": {
38804
+ headers: {
38805
+ [name: string]: unknown;
38806
+ };
38807
+ content: {
38808
+ "application/json": components["schemas"]["ErrorBody"];
38809
+ };
38810
+ };
38811
+ };
38812
+ };
37088
38813
  }