diff --git a/.release-please-manifest.json b/.release-please-manifest.json index efc2d51b4..cdcf20eb7 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.22.1" + ".": "1.23.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index f79cbaf49..ad0d55423 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 120 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-96b0ac0a148db6fde2e8363ea2dcfaa63f2dc23cf35c30c5fcfffbefc222e5d1.yml -openapi_spec_hash: 01b9dbab4b732e4b83952debd108e404 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-22ab4a80734e5e3792b7287a1281280d52eff936be4d805011521a1b64e1998d.yml +openapi_spec_hash: d109d3b797016fe7657935d55549cc31 config_hash: ed1fdd7c9f0a25647e16b602bad4ff2e diff --git a/CHANGELOG.md b/CHANGELOG.md index 338e576e6..675cadc1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 1.23.0 (2026-06-05) + +Full Changelog: [v1.22.1...v1.23.0](https://github.com/runloopai/api-client-python/compare/v1.22.1...v1.23.0) + +### Features + +* **devbox:** add SCHEDULED status to the data model ([#9654](https://github.com/runloopai/api-client-python/issues/9654)) ([8f45663](https://github.com/runloopai/api-client-python/commit/8f456631f96a56612ae9b438e9b6d2dc8d69095f)) +* **portal:** support tunnel authorization header ([#9597](https://github.com/runloopai/api-client-python/issues/9597)) ([8ca990e](https://github.com/runloopai/api-client-python/commit/8ca990e360f072adfdb9f789e37dbd2bb08e8f77)) + ## 1.22.1 (2026-06-01) Full Changelog: [v1.22.0...v1.22.1](https://github.com/runloopai/api-client-python/compare/v1.22.0...v1.22.1) diff --git a/pyproject.toml b/pyproject.toml index 2e0894a4c..8c5d5cea6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "runloop_api_client" -version = "1.22.1" +version = "1.23.0" description = "The official Python library for the runloop API" dynamic = ["readme"] license = "MIT" diff --git a/src/runloop_api_client/_version.py b/src/runloop_api_client/_version.py index 8acca19a1..a99d41677 100644 --- a/src/runloop_api_client/_version.py +++ b/src/runloop_api_client/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "runloop_api_client" -__version__ = "1.22.1" # x-release-please-version +__version__ = "1.23.0" # x-release-please-version diff --git a/src/runloop_api_client/resources/devboxes/devboxes.py b/src/runloop_api_client/resources/devboxes/devboxes.py index 166ab97d2..ec9f8eaf8 100644 --- a/src/runloop_api_client/resources/devboxes/devboxes.py +++ b/src/runloop_api_client/resources/devboxes/devboxes.py @@ -532,7 +532,15 @@ def list( limit: int | Omit = omit, starting_after: str | Omit = omit, status: Literal[ - "provisioning", "initializing", "running", "suspending", "suspended", "resuming", "failure", "shutdown" + "scheduled", + "provisioning", + "initializing", + "running", + "suspending", + "suspended", + "resuming", + "failure", + "shutdown", ] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -600,8 +608,8 @@ def create_pty_tunnel( Devbox. This tunnel is not persisted on the Devbox and is generated fresh on - each request. The returned auth_token must be passed as a Bearer token in the - Authorization header. + each request. The returned auth_token should be passed as a Bearer token in the + X-Runloop-Tunnel-Authorization header. Args: extra_headers: Send extra headers @@ -2195,7 +2203,15 @@ def list( limit: int | Omit = omit, starting_after: str | Omit = omit, status: Literal[ - "provisioning", "initializing", "running", "suspending", "suspended", "resuming", "failure", "shutdown" + "scheduled", + "provisioning", + "initializing", + "running", + "suspending", + "suspended", + "resuming", + "failure", + "shutdown", ] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -2263,8 +2279,8 @@ async def create_pty_tunnel( Devbox. This tunnel is not persisted on the Devbox and is generated fresh on - each request. The returned auth_token must be passed as a Bearer token in the - Authorization header. + each request. The returned auth_token should be passed as a Bearer token in the + X-Runloop-Tunnel-Authorization header. Args: extra_headers: Send extra headers diff --git a/src/runloop_api_client/types/devbox_list_params.py b/src/runloop_api_client/types/devbox_list_params.py index d8bae28d7..f845a53b6 100644 --- a/src/runloop_api_client/types/devbox_list_params.py +++ b/src/runloop_api_client/types/devbox_list_params.py @@ -21,6 +21,14 @@ class DevboxListParams(TypedDict, total=False): """Load the next page of data starting after the item with the given ID.""" status: Literal[ - "provisioning", "initializing", "running", "suspending", "suspended", "resuming", "failure", "shutdown" + "scheduled", + "provisioning", + "initializing", + "running", + "suspending", + "suspended", + "resuming", + "failure", + "shutdown", ] """Filter by status""" diff --git a/src/runloop_api_client/types/devbox_view.py b/src/runloop_api_client/types/devbox_view.py index 48f3c6f18..726f14e72 100644 --- a/src/runloop_api_client/types/devbox_view.py +++ b/src/runloop_api_client/types/devbox_view.py @@ -12,19 +12,30 @@ class StateTransition(BaseModel): status: Optional[ - Literal["provisioning", "initializing", "running", "suspending", "suspended", "resuming", "failure", "shutdown"] + Literal[ + "scheduled", + "provisioning", + "initializing", + "running", + "suspending", + "suspended", + "resuming", + "failure", + "shutdown", + ] ] = None """The status of the Devbox. - provisioning: Runloop is allocating and booting the necessary infrastructure - resources. initializing: Runloop defined boot scripts are running to enable the - environment for interaction. running: The Devbox is ready for interaction. - suspending: The Devbox disk is being snapshotted as part of suspension. - suspended: The Devbox disk is saved and no more active compute is being used for - the Devbox. resuming: The Devbox disk is being loaded as part of booting a - suspended Devbox. failure: The Devbox failed as part of booting or running user - requested actions. shutdown: The Devbox was successfully shutdown and no more - active compute is being used. + scheduled: The Devbox is scheduled to run but infrastructure allocation has not + started yet. provisioning: Runloop is allocating and booting the necessary + infrastructure resources. initializing: Runloop defined boot scripts are running + to enable the environment for interaction. running: The Devbox is ready for + interaction. suspending: The Devbox disk is being snapshotted as part of + suspension. suspended: The Devbox disk is saved and no more active compute is + being used for the Devbox. resuming: The Devbox disk is being loaded as part of + booting a suspended Devbox. failure: The Devbox failed as part of booting or + running user requested actions. shutdown: The Devbox was successfully shutdown + and no more active compute is being used. """ transition_time_ms: Optional[object] = None @@ -78,7 +89,15 @@ class DevboxView(BaseModel): """A list of state transitions in order with durations""" status: Literal[ - "provisioning", "initializing", "running", "suspending", "suspended", "resuming", "failure", "shutdown" + "scheduled", + "provisioning", + "initializing", + "running", + "suspending", + "suspended", + "resuming", + "failure", + "shutdown", ] """The current status of the Devbox.""" @@ -146,5 +165,6 @@ class DevboxView(BaseModel): services running inside a Devbox without requiring direct network access. Each tunnel is uniquely identified by an encrypted tunnel_key and can be configured for either open (public) or authenticated access. Usage: - https://{port}-{tunnel_key}.tunnel.runloop.ai + https://{port}-{tunnel_key}.tunnel.runloop.ai. Authenticated tunnels should pass + auth_token as X-Runloop-Tunnel-Authorization: Bearer {auth_token}. """ diff --git a/src/runloop_api_client/types/pty_tunnel_view.py b/src/runloop_api_client/types/pty_tunnel_view.py index 3012798ba..f7c228d36 100644 --- a/src/runloop_api_client/types/pty_tunnel_view.py +++ b/src/runloop_api_client/types/pty_tunnel_view.py @@ -8,11 +8,15 @@ class PtyTunnelView(BaseModel): """An ephemeral PTY tunnel providing authenticated terminal access to a Devbox. - These tunnels are not stored on the Devbox and are generated fresh on each request. Usage: https://{port}-{tunnel_key}.tunnel.runloop.ai with Authorization: Bearer {auth_token} + These tunnels are not stored on the Devbox and are generated fresh on each request. Usage: https://{port}-{tunnel_key}.tunnel.runloop.ai with X-Runloop-Tunnel-Authorization: Bearer {auth_token}. """ auth_token: str - """Bearer token for tunnel authentication. Always required for PTY tunnels.""" + """Bearer token for tunnel authentication. + + Always required for PTY tunnels. Pass as X-Runloop-Tunnel-Authorization: Bearer + {auth_token}. + """ tunnel_key: str """The encrypted tunnel key used to construct the tunnel URL. diff --git a/src/runloop_api_client/types/tunnel_view.py b/src/runloop_api_client/types/tunnel_view.py index 6188968a0..3bc3f6a1c 100644 --- a/src/runloop_api_client/types/tunnel_view.py +++ b/src/runloop_api_client/types/tunnel_view.py @@ -12,7 +12,7 @@ class TunnelView(BaseModel): """A V2 tunnel provides secure HTTP access to services running on a Devbox. Tunnels allow external clients to reach web servers, APIs, or other HTTP services running inside a Devbox without requiring direct network access. Each tunnel is uniquely identified by an encrypted tunnel_key and can be configured for either open (public) or authenticated access. - Usage: https://{port}-{tunnel_key}.tunnel.runloop.ai + Usage: https://{port}-{tunnel_key}.tunnel.runloop.ai. Authenticated tunnels should pass auth_token as X-Runloop-Tunnel-Authorization: Bearer {auth_token}. """ auth_mode: Literal["open", "authenticated"] @@ -42,5 +42,6 @@ class TunnelView(BaseModel): auth_token: Optional[str] = None """Bearer token for tunnel authentication. - Only present when auth_mode is 'authenticated'. + Only present when auth_mode is 'authenticated'. Pass as + X-Runloop-Tunnel-Authorization: Bearer {auth_token}. """ diff --git a/tests/api_resources/test_devboxes.py b/tests/api_resources/test_devboxes.py index dae981685..e755c8cd6 100644 --- a/tests/api_resources/test_devboxes.py +++ b/tests/api_resources/test_devboxes.py @@ -250,7 +250,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, starting_after="starting_after", - status="provisioning", + status="scheduled", ) assert_matches_type(SyncDevboxesCursorIDPage[DevboxView], devbox, path=["response"]) @@ -1919,7 +1919,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, starting_after="starting_after", - status="provisioning", + status="scheduled", ) assert_matches_type(AsyncDevboxesCursorIDPage[DevboxView], devbox, path=["response"])