@shardflux/sdk 0.13.0 → 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 {
@@ -5630,6 +5970,21 @@ export interface components {
5630
5970
  } & {
5631
5971
  [key: string]: unknown;
5632
5972
  };
5973
+ host_lost?: {
5974
+ /** @description RFC 3339: when the host failure was detected; the workspace was suspended then. */
5975
+ detected_at: string;
5976
+ /**
5977
+ * @description resume and open: disk when the workspace booted from its disk (files kept, processes and memory not); checkpoint when it was restored from its newest checkpoint (see state_as_of). Absent on a suspend.
5978
+ * @enum {string}
5979
+ */
5980
+ restored_from?: "disk" | "checkpoint";
5981
+ /** @description restored_from checkpoint: the checkpoint this resume restored. */
5982
+ restored_checkpoint_id?: string;
5983
+ /** @description restored_from checkpoint, RFC 3339: when that checkpoint committed; the workspace state is as of then. */
5984
+ state_as_of?: string;
5985
+ } & {
5986
+ [key: string]: unknown;
5987
+ };
5633
5988
  } & {
5634
5989
  [key: string]: unknown;
5635
5990
  };
@@ -6735,6 +7090,102 @@ export interface components {
6735
7090
  */
6736
7091
  not_before: string;
6737
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
+ };
6738
7189
  Workspace: {
6739
7190
  /**
6740
7191
  * Format: uuid
@@ -6938,6 +7389,25 @@ export interface components {
6938
7389
  tools: ("exec" | "files" | "pty" | "process" | "git" | "browser")[];
6939
7390
  cell_endpoint: string;
6940
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
+ };
6941
7411
  Volume: {
6942
7412
  /**
6943
7413
  * Format: uuid
@@ -7116,6 +7586,39 @@ export interface components {
7116
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. */
7117
7587
  projected_reached_at: string | null;
7118
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
+ };
7119
7622
  };
7120
7623
  responses: never;
7121
7624
  parameters: never;
@@ -8663,7 +9166,7 @@ export interface operations {
8663
9166
  };
8664
9167
  };
8665
9168
  };
8666
- postV1AuthLogin: {
9169
+ postV1AuthSignup: {
8667
9170
  parameters: {
8668
9171
  query?: never;
8669
9172
  header?: never;
@@ -8674,9 +9177,10 @@ export interface operations {
8674
9177
  content: {
8675
9178
  "application/json": {
8676
9179
  /** @description Email address. */
8677
- email: string;
8678
- /** @description Password (12-256 characters). */
8679
- 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;
8680
9184
  };
8681
9185
  };
8682
9186
  };
@@ -8689,6 +9193,10 @@ export interface operations {
8689
9193
  content: {
8690
9194
  "application/json": {
8691
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";
8692
9200
  user: {
8693
9201
  /**
8694
9202
  * Format: uuid
@@ -8711,51 +9219,17 @@ export interface operations {
8711
9219
  };
8712
9220
  };
8713
9221
  /** @description Default Response */
8714
- "4XX": {
8715
- headers: {
8716
- [name: string]: unknown;
8717
- };
8718
- content: {
8719
- "application/json": components["schemas"]["ErrorBody"];
8720
- };
8721
- };
8722
- /** @description Default Response */
8723
- "5XX": {
8724
- headers: {
8725
- [name: string]: unknown;
8726
- };
8727
- content: {
8728
- "application/json": components["schemas"]["ErrorBody"];
8729
- };
8730
- };
8731
- };
8732
- };
8733
- postV1AuthMfaChallenge: {
8734
- parameters: {
8735
- query?: never;
8736
- header?: never;
8737
- path?: never;
8738
- cookie?: never;
8739
- };
8740
- requestBody: {
8741
- content: {
8742
- "application/json": {
8743
- /** @description Current 6-digit TOTP code. */
8744
- code?: string;
8745
- /** @description One-time recovery code. */
8746
- recovery_code?: string;
8747
- };
8748
- };
8749
- };
8750
- responses: {
8751
- /** @description Default Response */
8752
- 200: {
9222
+ 201: {
8753
9223
  headers: {
8754
9224
  [name: string]: unknown;
8755
9225
  };
8756
9226
  content: {
8757
9227
  "application/json": {
8758
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";
8759
9233
  user: {
8760
9234
  /**
8761
9235
  * Format: uuid
@@ -8797,57 +9271,45 @@ export interface operations {
8797
9271
  };
8798
9272
  };
8799
9273
  };
8800
- postV1AuthLogout: {
9274
+ postV1AuthVerifyEmailCode: {
8801
9275
  parameters: {
8802
9276
  query?: never;
8803
9277
  header?: never;
8804
9278
  path?: never;
8805
9279
  cookie?: never;
8806
9280
  };
8807
- requestBody?: never;
8808
- responses: {
8809
- /** @description No content. */
8810
- 204: {
8811
- headers: {
8812
- [name: string]: unknown;
9281
+ requestBody: {
9282
+ content: {
9283
+ "application/json": {
9284
+ /** @description The 6-digit code from the email. */
9285
+ code?: string;
8813
9286
  };
8814
- content?: never;
8815
9287
  };
9288
+ };
9289
+ responses: {
8816
9290
  /** @description Default Response */
8817
- "4XX": {
9291
+ 200: {
8818
9292
  headers: {
8819
9293
  [name: string]: unknown;
8820
9294
  };
8821
9295
  content: {
8822
- "application/json": components["schemas"]["ErrorBody"];
9296
+ "application/json": {
9297
+ /** @enum {string} */
9298
+ status: "verified";
9299
+ };
8823
9300
  };
8824
9301
  };
8825
9302
  /** @description Default Response */
8826
- "5XX": {
9303
+ 202: {
8827
9304
  headers: {
8828
9305
  [name: string]: unknown;
8829
9306
  };
8830
9307
  content: {
8831
- "application/json": components["schemas"]["ErrorBody"];
8832
- };
8833
- };
8834
- };
8835
- };
8836
- postV1AuthLogoutAll: {
8837
- parameters: {
8838
- query?: never;
8839
- header?: never;
8840
- path?: never;
8841
- cookie?: never;
8842
- };
8843
- requestBody?: never;
8844
- responses: {
8845
- /** @description No content. */
8846
- 204: {
8847
- headers: {
8848
- [name: string]: unknown;
9308
+ "application/json": {
9309
+ /** @enum {string} */
9310
+ status: "accepted";
9311
+ };
8849
9312
  };
8850
- content?: never;
8851
9313
  };
8852
9314
  /** @description Default Response */
8853
9315
  "4XX": {
@@ -8869,14 +9331,23 @@ export interface operations {
8869
9331
  };
8870
9332
  };
8871
9333
  };
8872
- getV1AuthSessions: {
9334
+ postV1AuthLogin: {
8873
9335
  parameters: {
8874
9336
  query?: never;
8875
9337
  header?: never;
8876
9338
  path?: never;
8877
9339
  cookie?: never;
8878
9340
  };
8879
- 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
+ };
8880
9351
  responses: {
8881
9352
  /** @description Default Response */
8882
9353
  200: {
@@ -8885,35 +9356,25 @@ export interface operations {
8885
9356
  };
8886
9357
  content: {
8887
9358
  "application/json": {
8888
- data: {
9359
+ status: "authenticated" | "mfa_required";
9360
+ user: {
8889
9361
  /**
8890
9362
  * Format: uuid
8891
9363
  * @description UUIDv7, lowercase canonical form.
8892
9364
  */
8893
9365
  id: string;
8894
- current: boolean;
8895
- aal: number;
8896
- /**
8897
- * Format: date-time
8898
- * @description RFC 3339 UTC timestamp with Z.
8899
- */
8900
- created_at: string;
8901
- /**
8902
- * Format: date-time
8903
- * @description RFC 3339 UTC timestamp with Z.
8904
- */
8905
- last_seen_at: string;
8906
- /**
8907
- * Format: date-time
8908
- * @description RFC 3339 UTC timestamp with Z.
8909
- */
8910
- absolute_expires_at: string;
8911
- client_ip: string | null;
8912
- user_agent: string | null;
8913
- /** @description browser: a web app sign-in; cli: `shard auth login` or an SDK account client (contracts §30.1). */
8914
- client: "browser" | "cli";
8915
- }[];
8916
- next_cursor: null;
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;
8917
9378
  };
8918
9379
  };
8919
9380
  };
@@ -8937,24 +9398,231 @@ export interface operations {
8937
9398
  };
8938
9399
  };
8939
9400
  };
8940
- deleteV1AuthSessionsSessionId: {
9401
+ postV1AuthMfaChallenge: {
8941
9402
  parameters: {
8942
9403
  query?: never;
8943
9404
  header?: never;
8944
- path: {
8945
- /** @description UUIDv7, lowercase canonical form. */
8946
- session_id: string;
8947
- };
9405
+ path?: never;
8948
9406
  cookie?: never;
8949
9407
  };
8950
- 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
+ };
8951
9418
  responses: {
8952
- /** @description No content. */
8953
- 204: {
9419
+ /** @description Default Response */
9420
+ 200: {
8954
9421
  headers: {
8955
9422
  [name: string]: unknown;
8956
9423
  };
8957
- 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
+ };
9447
+ };
9448
+ /** @description Default Response */
9449
+ "4XX": {
9450
+ headers: {
9451
+ [name: string]: unknown;
9452
+ };
9453
+ content: {
9454
+ "application/json": components["schemas"]["ErrorBody"];
9455
+ };
9456
+ };
9457
+ /** @description Default Response */
9458
+ "5XX": {
9459
+ headers: {
9460
+ [name: string]: unknown;
9461
+ };
9462
+ content: {
9463
+ "application/json": components["schemas"]["ErrorBody"];
9464
+ };
9465
+ };
9466
+ };
9467
+ };
9468
+ postV1AuthLogout: {
9469
+ parameters: {
9470
+ query?: never;
9471
+ header?: never;
9472
+ path?: never;
9473
+ cookie?: never;
9474
+ };
9475
+ requestBody?: never;
9476
+ responses: {
9477
+ /** @description No content. */
9478
+ 204: {
9479
+ headers: {
9480
+ [name: string]: unknown;
9481
+ };
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
+ };
9587
+ };
9588
+ /** @description Default Response */
9589
+ "4XX": {
9590
+ headers: {
9591
+ [name: string]: unknown;
9592
+ };
9593
+ content: {
9594
+ "application/json": components["schemas"]["ErrorBody"];
9595
+ };
9596
+ };
9597
+ /** @description Default Response */
9598
+ "5XX": {
9599
+ headers: {
9600
+ [name: string]: unknown;
9601
+ };
9602
+ content: {
9603
+ "application/json": components["schemas"]["ErrorBody"];
9604
+ };
9605
+ };
9606
+ };
9607
+ };
9608
+ deleteV1AuthSessionsSessionId: {
9609
+ parameters: {
9610
+ query?: never;
9611
+ header?: never;
9612
+ path: {
9613
+ /** @description UUIDv7, lowercase canonical form. */
9614
+ session_id: string;
9615
+ };
9616
+ cookie?: never;
9617
+ };
9618
+ requestBody?: never;
9619
+ responses: {
9620
+ /** @description No content. */
9621
+ 204: {
9622
+ headers: {
9623
+ [name: string]: unknown;
9624
+ };
9625
+ content?: never;
8958
9626
  };
8959
9627
  /** @description Default Response */
8960
9628
  "4XX": {
@@ -8987,7 +9655,9 @@ export interface operations {
8987
9655
  content: {
8988
9656
  "application/json": {
8989
9657
  /** @description Password (12-256 characters). */
8990
- 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;
8991
9661
  /** @description Current 6-digit TOTP code. */
8992
9662
  code?: string;
8993
9663
  /** @description One-time recovery code. */
@@ -11611,14 +12281,13 @@ export interface operations {
11611
12281
  };
11612
12282
  /** @description Template slug; new workspaces use its latest published version. */
11613
12283
  template: string;
11614
- /** @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). */
11615
12285
  caps?: {
11616
12286
  cpu_millis?: number;
11617
12287
  memory_mib?: number;
11618
12288
  disk_gib?: number;
11619
12289
  /**
11620
- * @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.
11621
- * @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.
11622
12291
  * @enum {string}
11623
12292
  */
11624
12293
  allocation_mode?: "fixed" | "elastic";
@@ -12201,6 +12870,66 @@ export interface operations {
12201
12870
  };
12202
12871
  };
12203
12872
  };
12873
+ patchV1WorkspacesWorkspaceIdCaps: {
12874
+ parameters: {
12875
+ query?: never;
12876
+ header?: {
12877
+ /** @description RFC 7240 preference, e.g. `wait=30` (at most 55; default 20). */
12878
+ prefer?: string;
12879
+ };
12880
+ path: {
12881
+ /** @description UUIDv7, lowercase canonical form. */
12882
+ workspace_id: string;
12883
+ };
12884
+ cookie?: never;
12885
+ };
12886
+ requestBody: {
12887
+ content: {
12888
+ "application/json": components["schemas"]["ResizeWorkspaceBody"];
12889
+ };
12890
+ };
12891
+ responses: {
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. */
12893
+ 200: {
12894
+ headers: {
12895
+ [name: string]: unknown;
12896
+ };
12897
+ content: {
12898
+ "application/json": components["schemas"]["ResizeResult"];
12899
+ };
12900
+ };
12901
+ /** @description Default Response */
12902
+ 202: {
12903
+ headers: {
12904
+ [name: string]: unknown;
12905
+ };
12906
+ content: {
12907
+ "application/json": {
12908
+ operation: components["schemas"]["Operation"];
12909
+ workspace: components["schemas"]["Workspace"];
12910
+ };
12911
+ };
12912
+ };
12913
+ /** @description Default Response */
12914
+ "4XX": {
12915
+ headers: {
12916
+ [name: string]: unknown;
12917
+ };
12918
+ content: {
12919
+ "application/json": components["schemas"]["ErrorBody"];
12920
+ };
12921
+ };
12922
+ /** @description Default Response */
12923
+ "5XX": {
12924
+ headers: {
12925
+ [name: string]: unknown;
12926
+ };
12927
+ content: {
12928
+ "application/json": components["schemas"]["ErrorBody"];
12929
+ };
12930
+ };
12931
+ };
12932
+ };
12204
12933
  postV1WorkspacesWorkspaceIdSuspendWhenIdle: {
12205
12934
  parameters: {
12206
12935
  query?: never;
@@ -12311,14 +13040,13 @@ export interface operations {
12311
13040
  "application/json": {
12312
13041
  /** @description Stable workspace key, unique per organization (e.g. `${customerId}/${projectId}`). */
12313
13042
  key: string;
12314
- /** @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. */
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). */
12315
13044
  caps?: {
12316
13045
  cpu_millis?: number;
12317
13046
  memory_mib?: number;
12318
13047
  disk_gib?: number;
12319
13048
  /**
12320
- * @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.
12321
- * @default fixed
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.
12322
13050
  * @enum {string}
12323
13051
  */
12324
13052
  allocation_mode?: "fixed" | "elastic";
@@ -12837,14 +13565,13 @@ export interface operations {
12837
13565
  };
12838
13566
  /** @description Template slug; new workspaces use its latest published version. */
12839
13567
  template: string;
12840
- /** @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). */
12841
13569
  caps?: {
12842
13570
  cpu_millis?: number;
12843
13571
  memory_mib?: number;
12844
13572
  disk_gib?: number;
12845
13573
  /**
12846
- * @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.
12847
- * @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.
12848
13575
  * @enum {string}
12849
13576
  */
12850
13577
  allocation_mode?: "fixed" | "elastic";
@@ -13427,10 +14154,13 @@ export interface operations {
13427
14154
  };
13428
14155
  };
13429
14156
  };
13430
- postApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
14157
+ patchApiV1WorkspacesWorkspaceIdCaps: {
13431
14158
  parameters: {
13432
14159
  query?: never;
13433
- header?: never;
14160
+ header?: {
14161
+ /** @description RFC 7240 preference, e.g. `wait=30` (at most 55; default 20). */
14162
+ prefer?: string;
14163
+ };
13434
14164
  path: {
13435
14165
  /** @description UUIDv7, lowercase canonical form. */
13436
14166
  workspace_id: string;
@@ -13439,23 +14169,28 @@ export interface operations {
13439
14169
  };
13440
14170
  requestBody: {
13441
14171
  content: {
13442
- "application/json": {
13443
- /** @description Seconds from now the workspace must stay idle before it is suspended (0..3600; 0 = as soon as it is idle). */
13444
- after_seconds: number;
13445
- };
14172
+ "application/json": components["schemas"]["ResizeWorkspaceBody"];
13446
14173
  };
13447
14174
  };
13448
14175
  responses: {
13449
- /** @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 */
13450
14186
  202: {
13451
14187
  headers: {
13452
14188
  [name: string]: unknown;
13453
14189
  };
13454
14190
  content: {
13455
14191
  "application/json": {
14192
+ operation: components["schemas"]["Operation"];
13456
14193
  workspace: components["schemas"]["Workspace"];
13457
- operation: components["schemas"]["Operation"] | null;
13458
- suspend_request: components["schemas"]["SuspendRequest"] | null;
13459
14194
  };
13460
14195
  };
13461
14196
  };
@@ -13479,7 +14214,7 @@ export interface operations {
13479
14214
  };
13480
14215
  };
13481
14216
  };
13482
- deleteApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
14217
+ postApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
13483
14218
  parameters: {
13484
14219
  query?: never;
13485
14220
  header?: never;
@@ -13489,15 +14224,67 @@ export interface operations {
13489
14224
  };
13490
14225
  cookie?: never;
13491
14226
  };
13492
- 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
+ };
13493
14235
  responses: {
13494
- /** @description Default Response */
13495
- 200: {
14236
+ /** @description suspend_request: the recorded request. operation: set (and suspend_request null) only when a suspend was already in progress. */
14237
+ 202: {
13496
14238
  headers: {
13497
14239
  [name: string]: unknown;
13498
14240
  };
13499
14241
  content: {
13500
- "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
+ };
14247
+ };
14248
+ };
14249
+ /** @description Default Response */
14250
+ "4XX": {
14251
+ headers: {
14252
+ [name: string]: unknown;
14253
+ };
14254
+ content: {
14255
+ "application/json": components["schemas"]["ErrorBody"];
14256
+ };
14257
+ };
14258
+ /** @description Default Response */
14259
+ "5XX": {
14260
+ headers: {
14261
+ [name: string]: unknown;
14262
+ };
14263
+ content: {
14264
+ "application/json": components["schemas"]["ErrorBody"];
14265
+ };
14266
+ };
14267
+ };
14268
+ };
14269
+ deleteApiV1WorkspacesWorkspaceIdSuspendWhenIdle: {
14270
+ parameters: {
14271
+ query?: never;
14272
+ header?: never;
14273
+ path: {
14274
+ /** @description UUIDv7, lowercase canonical form. */
14275
+ workspace_id: string;
14276
+ };
14277
+ cookie?: never;
14278
+ };
14279
+ requestBody?: never;
14280
+ responses: {
14281
+ /** @description Default Response */
14282
+ 200: {
14283
+ headers: {
14284
+ [name: string]: unknown;
14285
+ };
14286
+ content: {
14287
+ "application/json": components["schemas"]["Workspace"];
13501
14288
  };
13502
14289
  };
13503
14290
  /** @description Default Response */
@@ -13537,14 +14324,13 @@ export interface operations {
13537
14324
  "application/json": {
13538
14325
  /** @description Stable workspace key, unique per organization (e.g. `${customerId}/${projectId}`). */
13539
14326
  key: string;
13540
- /** @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. */
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). */
13541
14328
  caps?: {
13542
14329
  cpu_millis?: number;
13543
14330
  memory_mib?: number;
13544
14331
  disk_gib?: number;
13545
14332
  /**
13546
- * @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.
13547
- * @default fixed
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.
13548
14334
  * @enum {string}
13549
14335
  */
13550
14336
  allocation_mode?: "fixed" | "elastic";
@@ -13896,56 +14682,869 @@ export interface operations {
13896
14682
  };
13897
14683
  };
13898
14684
  };
13899
- 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: {
13900
15521
  parameters: {
13901
- query?: {
13902
- limit?: number;
13903
- cursor?: string;
13904
- };
15522
+ query?: never;
13905
15523
  header?: never;
13906
15524
  path: {
13907
15525
  /** @description UUIDv7, lowercase canonical form. */
13908
15526
  workspace_id: string;
15527
+ /** @description TCP port inside the workspace (1-65535). */
15528
+ port: number;
13909
15529
  };
13910
15530
  cookie?: never;
13911
15531
  };
13912
15532
  requestBody?: never;
13913
15533
  responses: {
13914
15534
  /** @description Default Response */
13915
- 200: {
15535
+ 201: {
13916
15536
  headers: {
13917
15537
  [name: string]: unknown;
13918
15538
  };
13919
15539
  content: {
13920
15540
  "application/json": {
13921
- data: {
13922
- /**
13923
- * Format: uuid
13924
- * @description UUIDv7, lowercase canonical form.
13925
- */
13926
- id: string;
13927
- /**
13928
- * Format: uuid
13929
- * @description UUIDv7, lowercase canonical form.
13930
- */
13931
- workspace_id: string;
13932
- agent_label: string;
13933
- principal_type: "user" | "api_key";
13934
- /**
13935
- * Format: uuid
13936
- * @description UUIDv7, lowercase canonical form.
13937
- */
13938
- principal_id: string;
13939
- /**
13940
- * Format: date-time
13941
- * @description RFC 3339 UTC timestamp with Z.
13942
- */
13943
- created_at: string;
13944
- last_token_issued_at: string | null;
13945
- tokens_issued: number;
13946
- revoked_at: string | null;
13947
- }[];
13948
- 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;
13949
15548
  };
13950
15549
  };
13951
15550
  };
@@ -13969,58 +15568,26 @@ export interface operations {
13969
15568
  };
13970
15569
  };
13971
15570
  };
13972
- postApiV1WorkspacesWorkspaceIdStreamTickets: {
15571
+ deleteApiV1WorkspacesWorkspaceIdPortsPortCallback: {
13973
15572
  parameters: {
13974
15573
  query?: never;
13975
15574
  header?: never;
13976
15575
  path: {
13977
15576
  /** @description UUIDv7, lowercase canonical form. */
13978
15577
  workspace_id: string;
15578
+ /** @description TCP port inside the workspace (1-65535). */
15579
+ port: number;
13979
15580
  };
13980
15581
  cookie?: never;
13981
15582
  };
13982
- requestBody: {
13983
- content: {
13984
- "application/json": {
13985
- /** @enum {string} */
13986
- tool: "exec" | "files" | "pty" | "process" | "git" | "browser";
13987
- /** @description Attribution label; one agent session per (workspace, principal, label). */
13988
- agent_label?: string;
13989
- };
13990
- };
13991
- };
15583
+ requestBody?: never;
13992
15584
  responses: {
13993
- /** @description Default Response */
13994
- 201: {
15585
+ /** @description No content. */
15586
+ 204: {
13995
15587
  headers: {
13996
15588
  [name: string]: unknown;
13997
15589
  };
13998
- content: {
13999
- "application/json": {
14000
- /** @description Single use, valid 30 s; pass as `?ticket=` on the cell WebSocket upgrade from the same Origin. */
14001
- ticket: string;
14002
- /**
14003
- * Format: date-time
14004
- * @description RFC 3339 UTC timestamp with Z.
14005
- */
14006
- expires_at: string;
14007
- /**
14008
- * Format: uuid
14009
- * @description UUIDv7, lowercase canonical form.
14010
- */
14011
- workspace_id: string;
14012
- /** @enum {string} */
14013
- tool: "exec" | "files" | "pty" | "process" | "git" | "browser";
14014
- /**
14015
- * Format: uuid
14016
- * @description UUIDv7, lowercase canonical form.
14017
- */
14018
- agent_session_id: string;
14019
- origin: string;
14020
- ownership_epoch: number;
14021
- cell_endpoint: string;
14022
- };
14023
- };
15590
+ content?: never;
14024
15591
  };
14025
15592
  /** @description Default Response */
14026
15593
  "4XX": {
@@ -14042,56 +15609,69 @@ export interface operations {
14042
15609
  };
14043
15610
  };
14044
15611
  };
14045
- getApiV1OrganizationsOrganizationIdEntitlements: {
15612
+ postV1InternalPortWakes: {
14046
15613
  parameters: {
14047
15614
  query?: never;
14048
- header?: never;
14049
- path: {
14050
- /** @description UUIDv7, lowercase canonical form. */
14051
- organization_id: string;
15615
+ header?: {
15616
+ /** @description RFC 7240 preference, e.g. `wait=20` (held wake). */
15617
+ prefer?: string;
14052
15618
  };
15619
+ path?: never;
14053
15620
  cookie?: never;
14054
15621
  };
14055
- 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
+ };
14056
15637
  responses: {
14057
- /** @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. */
14058
15639
  200: {
14059
15640
  headers: {
14060
15641
  [name: string]: unknown;
14061
15642
  };
14062
15643
  content: {
14063
15644
  "application/json": {
14064
- /**
14065
- * Format: uuid
14066
- * @description UUIDv7, lowercase canonical form.
14067
- */
14068
- organization_id: string;
14069
- plan: {
14070
- plan_key: string;
14071
- catalog_version: string;
14072
- source: "override" | "subscription" | "trial" | "default";
14073
- /** @description When this plan grant stops applying (a trial or partner grant); null when it lasts until changed. */
14074
- ends_at: string | null;
14075
- } | null;
14076
- /** @description Resolved plan limits (null = unlimited). */
14077
- limits: {
14078
- [key: string]: unknown;
14079
- };
14080
- allowances: {
14081
- [key: string]: unknown;
14082
- };
14083
- policies: {
14084
- [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;
14085
15653
  };
14086
- /** @description Active admission restrictions, e.g. `new_starts` {reason, since, grace_until} after a payment grace period ended. */
14087
- restrictions: {
14088
- [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;
14089
15673
  };
14090
- /**
14091
- * Format: date-time
14092
- * @description RFC 3339 UTC timestamp with Z.
14093
- */
14094
- resolved_at: string;
15674
+ operation: components["schemas"]["Operation"] | null;
14095
15675
  };
14096
15676
  };
14097
15677
  };
@@ -28007,8 +29587,8 @@ export interface operations {
28007
29587
  display_name: string;
28008
29588
  unit: string;
28009
29589
  meters: ("cpu_seconds" | "memory_gib_seconds" | "storage_gib_seconds" | "egress_bytes" | "ingress_bytes" | "volume_storage_gib_seconds")[];
28010
- /** @description hard_cap: exhausting it refuses opens/resumes (402 allowance_exhausted) and running workspaces are suspended; spare_capacity: no allowance cap (runs on reclaimable spare capacity); reported: shown and notified, never enforced by refusing access; egress_block (outbound_transfer_gb, contracts §18): at 100% outbound internet traffic is blocked by an organization egress override until upgrade, purchase or the next period (workspaces keep running, starts are not refused). */
28011
- enforcement: "hard_cap" | "spare_capacity" | "reported" | "egress_block";
29590
+ /** @description hard_cap: exhausting it refuses opens/resumes (402 allowance_exhausted) and running workspaces are suspended; spare_capacity: no allowance cap (runs on reclaimable spare capacity); reported: shown and notified, never enforced by refusing access; egress_block (outbound_transfer_gb, contracts §18): at 100% outbound internet traffic is blocked by an organization egress override until upgrade, purchase or the next period (workspaces keep running, starts are not refused); storage_block (retained_state_gib, contracts §40): at 100% opening a new workspace key and forking are refused (403 quota_exceeded, details.limit retained_state) until retained state is below the allowance (existing workspaces keep running, waking, suspending and resuming; nothing is deleted or charged). */
29591
+ enforcement: "hard_cap" | "spare_capacity" | "reported" | "egress_block" | "storage_block";
28012
29592
  included: number | null;
28013
29593
  used: number;
28014
29594
  remaining: number | null;
@@ -28016,8 +29596,8 @@ export interface operations {
28016
29596
  included_meter_units: number | null;
28017
29597
  used_meter_units: number | null;
28018
29598
  remaining_meter_units: number | null;
28019
- /** @description ok: below 80 %. warning: 80 % or more of the allowance. exhausted: a hard cap is used up and starts are refused (402 allowance_exhausted; see exhausted_reason). overage: a CPU-hours or RAM GiB-hours allowance is used up while opt-in overage is on and below its spend cap, so starts are admitted and the usage past it is charged (spend_cap). over_allowance: a reported allowance is exceeded (never refused). egress_blocked: the outbound transfer allowance is used up and outbound traffic is blocked. uncapped: runs on spare capacity. not_included: the plan does not define it. */
28020
- cap_state: "ok" | "warning" | "exhausted" | "overage" | "over_allowance" | "egress_blocked" | "uncapped" | "not_included";
29599
+ /** @description ok: below 80 %. warning: 80 % or more of the allowance. exhausted: a hard cap is used up and starts are refused (402 allowance_exhausted; see exhausted_reason). overage: a CPU-hours or RAM GiB-hours allowance is used up while opt-in overage is on and below its spend cap, so starts are admitted and the usage past it is charged (spend_cap). over_allowance: a reported allowance is exceeded (never refused). egress_blocked: the outbound transfer allowance is used up and outbound traffic is blocked. storage_blocked: the retained state allowance is used up and new workspaces and forks are refused (403 quota_exceeded). uncapped: runs on spare capacity. not_included: the plan does not define it. */
29600
+ cap_state: "ok" | "warning" | "exhausted" | "overage" | "over_allowance" | "egress_blocked" | "storage_blocked" | "uncapped" | "not_included";
28021
29601
  }[];
28022
29602
  meters: {
28023
29603
  /** @enum {string} */
@@ -29062,8 +30642,8 @@ export interface operations {
29062
30642
  display_name: string;
29063
30643
  unit: string;
29064
30644
  meters: ("cpu_seconds" | "memory_gib_seconds" | "storage_gib_seconds" | "egress_bytes" | "ingress_bytes" | "volume_storage_gib_seconds")[];
29065
- /** @description hard_cap: exhausting it refuses opens/resumes (402 allowance_exhausted) and running workspaces are suspended; spare_capacity: no allowance cap (runs on reclaimable spare capacity); reported: shown and notified, never enforced by refusing access; egress_block (outbound_transfer_gb, contracts §18): at 100% outbound internet traffic is blocked by an organization egress override until upgrade, purchase or the next period (workspaces keep running, starts are not refused). */
29066
- enforcement: "hard_cap" | "spare_capacity" | "reported" | "egress_block";
30645
+ /** @description hard_cap: exhausting it refuses opens/resumes (402 allowance_exhausted) and running workspaces are suspended; spare_capacity: no allowance cap (runs on reclaimable spare capacity); reported: shown and notified, never enforced by refusing access; egress_block (outbound_transfer_gb, contracts §18): at 100% outbound internet traffic is blocked by an organization egress override until upgrade, purchase or the next period (workspaces keep running, starts are not refused); storage_block (retained_state_gib, contracts §40): at 100% opening a new workspace key and forking are refused (403 quota_exceeded, details.limit retained_state) until retained state is below the allowance (existing workspaces keep running, waking, suspending and resuming; nothing is deleted or charged). */
30646
+ enforcement: "hard_cap" | "spare_capacity" | "reported" | "egress_block" | "storage_block";
29067
30647
  included: number | null;
29068
30648
  used: number;
29069
30649
  remaining: number | null;
@@ -29071,8 +30651,8 @@ export interface operations {
29071
30651
  included_meter_units: number | null;
29072
30652
  used_meter_units: number | null;
29073
30653
  remaining_meter_units: number | null;
29074
- /** @description ok: below 80 %. warning: 80 % or more of the allowance. exhausted: a hard cap is used up and starts are refused (402 allowance_exhausted; see exhausted_reason). overage: a CPU-hours or RAM GiB-hours allowance is used up while opt-in overage is on and below its spend cap, so starts are admitted and the usage past it is charged (spend_cap). over_allowance: a reported allowance is exceeded (never refused). egress_blocked: the outbound transfer allowance is used up and outbound traffic is blocked. uncapped: runs on spare capacity. not_included: the plan does not define it. */
29075
- cap_state: "ok" | "warning" | "exhausted" | "overage" | "over_allowance" | "egress_blocked" | "uncapped" | "not_included";
30654
+ /** @description ok: below 80 %. warning: 80 % or more of the allowance. exhausted: a hard cap is used up and starts are refused (402 allowance_exhausted; see exhausted_reason). overage: a CPU-hours or RAM GiB-hours allowance is used up while opt-in overage is on and below its spend cap, so starts are admitted and the usage past it is charged (spend_cap). over_allowance: a reported allowance is exceeded (never refused). egress_blocked: the outbound transfer allowance is used up and outbound traffic is blocked. storage_blocked: the retained state allowance is used up and new workspaces and forks are refused (403 quota_exceeded). uncapped: runs on spare capacity. not_included: the plan does not define it. */
30655
+ cap_state: "ok" | "warning" | "exhausted" | "overage" | "over_allowance" | "egress_blocked" | "storage_blocked" | "uncapped" | "not_included";
29076
30656
  }[];
29077
30657
  meters: {
29078
30658
  /** @enum {string} */
@@ -35348,6 +36928,18 @@ export interface operations {
35348
36928
  disk_gib: number;
35349
36929
  }[];
35350
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
+ };
35351
36943
  host: {
35352
36944
  /**
35353
36945
  * Format: uuid
@@ -35539,6 +37131,18 @@ export interface operations {
35539
37131
  disk_gib: number;
35540
37132
  }[];
35541
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
+ };
35542
37146
  host: {
35543
37147
  /**
35544
37148
  * Format: uuid
@@ -35727,6 +37331,18 @@ export interface operations {
35727
37331
  disk_gib: number;
35728
37332
  }[];
35729
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
+ };
35730
37346
  host: {
35731
37347
  /**
35732
37348
  * Format: uuid
@@ -35920,6 +37536,18 @@ export interface operations {
35920
37536
  disk_gib: number;
35921
37537
  }[];
35922
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
+ };
35923
37551
  host: {
35924
37552
  /**
35925
37553
  * Format: uuid
@@ -37070,4 +38698,116 @@ export interface operations {
37070
38698
  };
37071
38699
  };
37072
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
+ };
37073
38813
  }