From 2379fbdb589eb2117f6dc9a28ea1ad04a55c2cc6 Mon Sep 17 00:00:00 2001 From: stlc-bot Date: Fri, 25 Sep 2026 14:20:58 +0000 Subject: [PATCH] Build SDK Stainless-Generated-From: 4d3f209e85fcfa41e34d988b83ff4cce2877828d --- .../resources/connect/proxies.py | 12 ++ .../resources/devices/browser.py | 20 ++- .../resources/devices/devices.py | 149 +++++++++--------- .../resources/devices/recordings.py | 12 +- .../resources/mailboxes/mailboxes.py | 6 +- src/mobilerun_sdk/resources/tasks/tasks.py | 8 +- .../resources/workflows/action_catalog.py | 4 +- .../resources/workflows/actions/actions.py | 4 +- .../resources/workflows/flows/flows.py | 14 +- src/mobilerun_sdk/types/app_list_response.py | 2 +- .../types/app_list_versions_response.py | 2 +- .../assistant/conversation_create_response.py | 2 + .../assistant/conversation_list_response.py | 4 + .../assistant/conversation_update_response.py | 2 + .../types/connect/proxy_buy_params.py | 7 + .../types/connect/proxy_buy_response.py | 8 + .../types/connect/proxy_list_response.py | 8 + .../types/connect/proxy_retrieve_response.py | 8 + .../types/device_create_params.py | 31 ++-- src/mobilerun_sdk/types/device_list_params.py | 15 +- .../types/devices/recording_start_params.py | 6 +- .../types/mailbox_create_response.py | 16 +- .../types/mailbox_delete_response.py | 16 +- .../types/mailbox_list_response.py | 16 +- .../types/mailbox_restart_response.py | 16 +- .../types/mailbox_retrieve_response.py | 16 +- .../types/mailbox_uncancel_response.py | 16 +- .../types/mailbox_update_response.py | 16 +- .../types/store/app_list_response.py | 2 +- .../types/store/app_retrieve_response.py | 4 +- .../types/task_get_trajectory_response.py | 3 + src/mobilerun_sdk/types/task_run_params.py | 2 +- .../types/task_run_streamed_params.py | 2 +- .../types/webhook_event_types_response.py | 2 + .../workflows/action_catalog_list_params.py | 2 +- .../workflows/action_catalog_list_response.py | 6 +- .../action_catalog_retrieve_response.py | 6 +- .../types/workflows/action_create_response.py | 2 +- .../types/workflows/action_list_params.py | 2 +- .../types/workflows/action_list_response.py | 2 +- .../workflows/action_retrieve_response.py | 2 +- .../types/workflows/action_update_response.py | 2 +- .../types/workflows/event_dry_run_response.py | 20 ++- .../workflows/execution_retrieve_response.py | 102 +++++++++++- .../types/workflows/flow_clone_response.py | 18 ++- .../types/workflows/flow_create_params.py | 31 +++- .../types/workflows/flow_create_response.py | 18 ++- .../types/workflows/flow_dry_run_response.py | 2 +- .../types/workflows/flow_list_response.py | 18 ++- .../types/workflows/flow_retrieve_response.py | 18 ++- .../types/workflows/flow_unblock_response.py | 18 ++- .../types/workflows/flow_update_params.py | 18 ++- .../types/workflows/flow_update_response.py | 18 ++- tests/api_resources/connect/test_proxies.py | 2 + tests/api_resources/test_devices.py | 38 +++-- tests/api_resources/workflows/test_flows.py | 24 +++ 56 files changed, 631 insertions(+), 189 deletions(-) diff --git a/src/mobilerun_sdk/resources/connect/proxies.py b/src/mobilerun_sdk/resources/connect/proxies.py index 718dc6d6..a313f5b3 100644 --- a/src/mobilerun_sdk/resources/connect/proxies.py +++ b/src/mobilerun_sdk/resources/connect/proxies.py @@ -140,6 +140,7 @@ def buy( *, country: str, type: Literal["dedicated_residential", "residential", "mobile"], + name: str | Omit = omit, idempotency_key: str | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -154,6 +155,10 @@ def buy( Args: country: ISO 3166-1 alpha-2 country code to provision the proxy in. + name: Display name for the proxy, up to 64 characters excluding surrounding + whitespace, and containing no NUL. Omit it (or send only whitespace) to get a + generated label built from the country, type, and id. + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -169,6 +174,7 @@ def buy( { "country": country, "type": type, + "name": name, }, proxy_buy_params.ProxyBuyParams, ), @@ -507,6 +513,7 @@ async def buy( *, country: str, type: Literal["dedicated_residential", "residential", "mobile"], + name: str | Omit = omit, idempotency_key: str | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -521,6 +528,10 @@ async def buy( Args: country: ISO 3166-1 alpha-2 country code to provision the proxy in. + name: Display name for the proxy, up to 64 characters excluding surrounding + whitespace, and containing no NUL. Omit it (or send only whitespace) to get a + generated label built from the country, type, and id. + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -536,6 +547,7 @@ async def buy( { "country": country, "type": type, + "name": name, }, proxy_buy_params.ProxyBuyParams, ), diff --git a/src/mobilerun_sdk/resources/devices/browser.py b/src/mobilerun_sdk/resources/devices/browser.py index 42eca5bb..6a9367ad 100644 --- a/src/mobilerun_sdk/resources/devices/browser.py +++ b/src/mobilerun_sdk/resources/devices/browser.py @@ -55,9 +55,13 @@ def execute_script( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> BrowserExecuteScriptResponse: """ - Evaluates a JavaScript expression in the device's foreground Chrome tab via the - Chrome DevTools Protocol and returns its JSON-serialized result. Devices without - browser support return an unsupported-feature error. + Evaluates a JavaScript expression exactly once in the device's single, confirmed + foreground Chrome tab via the Chrome DevTools Protocol and returns its + JSON-serialized result. A responsive browser state without exactly one visible + page returns DEVICE_NO_BROWSER_TARGET (400). Transient discovery or target-probe + transport failures return CDP_TRANSPORT_UNAVAILABLE (503) with Retry-After and + an executionOutcome; the service never retries a user script after sending it. + Devices without browser support return an unsupported-feature error. Args: script: JavaScript expression to evaluate in the device's foreground Chrome tab (CDP @@ -125,9 +129,13 @@ async def execute_script( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> BrowserExecuteScriptResponse: """ - Evaluates a JavaScript expression in the device's foreground Chrome tab via the - Chrome DevTools Protocol and returns its JSON-serialized result. Devices without - browser support return an unsupported-feature error. + Evaluates a JavaScript expression exactly once in the device's single, confirmed + foreground Chrome tab via the Chrome DevTools Protocol and returns its + JSON-serialized result. A responsive browser state without exactly one visible + page returns DEVICE_NO_BROWSER_TARGET (400). Transient discovery or target-probe + transport failures return CDP_TRANSPORT_UNAVAILABLE (503) with Retry-After and + an executionOutcome; the service never retries a user script after sending it. + Devices without browser support return an unsupported-feature error. Args: script: JavaScript expression to evaluate in the device's foreground Chrome tab (CDP diff --git a/src/mobilerun_sdk/resources/devices/devices.py b/src/mobilerun_sdk/resources/devices/devices.py index beb5138b..ba87fda8 100644 --- a/src/mobilerun_sdk/resources/devices/devices.py +++ b/src/mobilerun_sdk/resources/devices/devices.py @@ -2,6 +2,7 @@ from __future__ import annotations +import typing_extensions from typing import List, Union, Optional from datetime import datetime from typing_extensions import Literal @@ -300,14 +301,7 @@ def create( *, billing: Literal["auto", "subscription", "minute"] | Omit = omit, query_country: str | Omit = omit, - device_type: Literal[ - "android_cloud_phone", - "dedicated_premium_device", - "dedicated_physical_device", - "dedicated_ios_device", - "dedicated_emulated_device", - ] - | Omit = omit, + device_type: str | Omit = omit, profile_id: str | Omit = omit, android_version: int | Omit = omit, apps: Optional[SequenceNotStr[str]] | Omit = omit, @@ -327,27 +321,29 @@ def create( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> DeviceCreateResponse: - """ - Requests a new device for the authenticated user from the device spec in the - request body. Optional query parameters select the canonical device type, target - country, billing mode, and a profile to use as the base spec; deprecated - device-type aliases remain accepted only during the documented compatibility - grace period. The response returns the device and its stream token. + """Requests a new device from the specification in the request body. + + Optional query + parameters select the canonical device type, country, billing mode, and base + profile. Returns the device, its resolved billing strategy, and its stream + token. Args: - billing: Billing mode. 'auto' uses a subscription slot when available and otherwise bills - per minute; 'subscription' requires an available subscription slot; 'minute' - bills per minute. Only cloud phone and cloud emulator devices support per-minute - billing. + billing: Billing mode. 'auto' tries subscription first, then minute billing if no + subscription entitlement exists or all subscription slots are in use, provided + minute billing is enabled. When subscription billing is disabled, auto uses + minutes directly. Billing-service failures never trigger fallback. + 'subscription' requires an available subscription slot and never falls back. + 'minute' uses minute billing only, subject to balance and concurrency checks. + Modes depend on the device type's billing configuration. query_country: ISO 3166-1 alpha-2 country code. If omitted the system picks the country with the most availability. - device_type: - Deprecated device type aliases are accepted during a compatibility grace period: - dedicated_premium_device maps to android_cloud_phone, dedicated_physical_device - maps to android_physical_phone, dedicated_ios_device maps to ios_stealth_phone, - and dedicated_emulated_device maps to android_emulator. + device_type: Use android*cloud_phone for a cloud Android phone. Only canonical identifiers + are accepted. Other backends are deployment-specific; recognized but unavailable + types return DEVICE_TYPE_UNAVAILABLE (422). Retired dedicated*\\** aliases are + rejected with a canonical replacement. profile_id: Profile ID to use as device spec @@ -460,11 +456,7 @@ def list( ] | Omit = omit, type: Literal[ - "android_cloud_phone", - "dedicated_premium_device", - "dedicated_physical_device", - "dedicated_ios_device", - "dedicated_emulated_device", + "android_cloud_phone", "android_physical_phone", "ios_stealth_phone", "android_emulator", "ios_simulator" ] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -483,11 +475,8 @@ def list( mine: When true, only return devices created by the calling user (resolved from X-User-ID, never a client-supplied id). - type: - Deprecated device type aliases are accepted during a compatibility grace period: - dedicated_premium_device maps to android_cloud_phone, dedicated_physical_device - maps to android_physical_phone, dedicated_ios_device maps to ios_stealth_phone, - and dedicated_emulated_device maps to android_emulator. + type: Canonical device type. Retired dedicated\\__\\** aliases are no longer accepted. + Availability depends on the deployment. extra_headers: Send extra headers @@ -524,6 +513,7 @@ def list( cast_to=DeviceListResponse, ) + @typing_extensions.deprecated("deprecated") def count( self, *, @@ -534,7 +524,12 @@ def count( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> DeviceCountResponse: - """Returns the number of claimed devices for the user, broken down by device type.""" + """Deprecated: use GET /devices/summary instead. + + Returns the number of active + claimed devices for the user, broken down by device type, in the legacy response + shape. + """ return self._get( "/devices/count", options=make_request_options( @@ -990,14 +985,7 @@ async def create( *, billing: Literal["auto", "subscription", "minute"] | Omit = omit, query_country: str | Omit = omit, - device_type: Literal[ - "android_cloud_phone", - "dedicated_premium_device", - "dedicated_physical_device", - "dedicated_ios_device", - "dedicated_emulated_device", - ] - | Omit = omit, + device_type: str | Omit = omit, profile_id: str | Omit = omit, android_version: int | Omit = omit, apps: Optional[SequenceNotStr[str]] | Omit = omit, @@ -1017,27 +1005,29 @@ async def create( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> DeviceCreateResponse: - """ - Requests a new device for the authenticated user from the device spec in the - request body. Optional query parameters select the canonical device type, target - country, billing mode, and a profile to use as the base spec; deprecated - device-type aliases remain accepted only during the documented compatibility - grace period. The response returns the device and its stream token. + """Requests a new device from the specification in the request body. + + Optional query + parameters select the canonical device type, country, billing mode, and base + profile. Returns the device, its resolved billing strategy, and its stream + token. Args: - billing: Billing mode. 'auto' uses a subscription slot when available and otherwise bills - per minute; 'subscription' requires an available subscription slot; 'minute' - bills per minute. Only cloud phone and cloud emulator devices support per-minute - billing. + billing: Billing mode. 'auto' tries subscription first, then minute billing if no + subscription entitlement exists or all subscription slots are in use, provided + minute billing is enabled. When subscription billing is disabled, auto uses + minutes directly. Billing-service failures never trigger fallback. + 'subscription' requires an available subscription slot and never falls back. + 'minute' uses minute billing only, subject to balance and concurrency checks. + Modes depend on the device type's billing configuration. query_country: ISO 3166-1 alpha-2 country code. If omitted the system picks the country with the most availability. - device_type: - Deprecated device type aliases are accepted during a compatibility grace period: - dedicated_premium_device maps to android_cloud_phone, dedicated_physical_device - maps to android_physical_phone, dedicated_ios_device maps to ios_stealth_phone, - and dedicated_emulated_device maps to android_emulator. + device_type: Use android*cloud_phone for a cloud Android phone. Only canonical identifiers + are accepted. Other backends are deployment-specific; recognized but unavailable + types return DEVICE_TYPE_UNAVAILABLE (422). Retired dedicated*\\** aliases are + rejected with a canonical replacement. profile_id: Profile ID to use as device spec @@ -1150,11 +1140,7 @@ async def list( ] | Omit = omit, type: Literal[ - "android_cloud_phone", - "dedicated_premium_device", - "dedicated_physical_device", - "dedicated_ios_device", - "dedicated_emulated_device", + "android_cloud_phone", "android_physical_phone", "ios_stealth_phone", "android_emulator", "ios_simulator" ] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -1173,11 +1159,8 @@ async def list( mine: When true, only return devices created by the calling user (resolved from X-User-ID, never a client-supplied id). - type: - Deprecated device type aliases are accepted during a compatibility grace period: - dedicated_premium_device maps to android_cloud_phone, dedicated_physical_device - maps to android_physical_phone, dedicated_ios_device maps to ios_stealth_phone, - and dedicated_emulated_device maps to android_emulator. + type: Canonical device type. Retired dedicated\\__\\** aliases are no longer accepted. + Availability depends on the deployment. extra_headers: Send extra headers @@ -1214,6 +1197,7 @@ async def list( cast_to=DeviceListResponse, ) + @typing_extensions.deprecated("deprecated") async def count( self, *, @@ -1224,7 +1208,12 @@ async def count( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> DeviceCountResponse: - """Returns the number of claimed devices for the user, broken down by device type.""" + """Deprecated: use GET /devices/summary instead. + + Returns the number of active + claimed devices for the user, broken down by device type, in the legacy response + shape. + """ return await self._get( "/devices/count", options=make_request_options( @@ -1588,8 +1577,10 @@ def __init__(self, devices: DevicesResource) -> None: self.list = to_raw_response_wrapper( devices.list, ) - self.count = to_raw_response_wrapper( - devices.count, + self.count = ( # pyright: ignore[reportDeprecated] + to_raw_response_wrapper( + devices.count, # pyright: ignore[reportDeprecated], + ) ) self.fingerprint = to_raw_response_wrapper( devices.fingerprint, @@ -1713,8 +1704,10 @@ def __init__(self, devices: AsyncDevicesResource) -> None: self.list = async_to_raw_response_wrapper( devices.list, ) - self.count = async_to_raw_response_wrapper( - devices.count, + self.count = ( # pyright: ignore[reportDeprecated] + async_to_raw_response_wrapper( + devices.count, # pyright: ignore[reportDeprecated], + ) ) self.fingerprint = async_to_raw_response_wrapper( devices.fingerprint, @@ -1838,8 +1831,10 @@ def __init__(self, devices: DevicesResource) -> None: self.list = to_streamed_response_wrapper( devices.list, ) - self.count = to_streamed_response_wrapper( - devices.count, + self.count = ( # pyright: ignore[reportDeprecated] + to_streamed_response_wrapper( + devices.count, # pyright: ignore[reportDeprecated], + ) ) self.fingerprint = to_streamed_response_wrapper( devices.fingerprint, @@ -1963,8 +1958,10 @@ def __init__(self, devices: AsyncDevicesResource) -> None: self.list = async_to_streamed_response_wrapper( devices.list, ) - self.count = async_to_streamed_response_wrapper( - devices.count, + self.count = ( # pyright: ignore[reportDeprecated] + async_to_streamed_response_wrapper( + devices.count, # pyright: ignore[reportDeprecated], + ) ) self.fingerprint = async_to_streamed_response_wrapper( devices.fingerprint, diff --git a/src/mobilerun_sdk/resources/devices/recordings.py b/src/mobilerun_sdk/resources/devices/recordings.py index 1591a3b8..df8b337a 100644 --- a/src/mobilerun_sdk/resources/devices/recordings.py +++ b/src/mobilerun_sdk/resources/devices/recordings.py @@ -153,9 +153,11 @@ def start( device's full quality. Honored by devices recording through the portal stream bridge. - types: Artifacts to capture: trajectory (input actions), video, and audio (captured + types: Artifacts to capture: trajectory (input actions; on portal stream-bridge devices + only when the handset announces trajectory capture), video, and audio (captured into the video artifact, so it requires video; honored by portal stream-bridge - recorders). Defaults to trajectory and video. + recorders). Defaults to trajectory and video, narrowed to what the device + produces. extra_headers: Send extra headers @@ -468,9 +470,11 @@ async def start( device's full quality. Honored by devices recording through the portal stream bridge. - types: Artifacts to capture: trajectory (input actions), video, and audio (captured + types: Artifacts to capture: trajectory (input actions; on portal stream-bridge devices + only when the handset announces trajectory capture), video, and audio (captured into the video artifact, so it requires video; honored by portal stream-bridge - recorders). Defaults to trajectory and video. + recorders). Defaults to trajectory and video, narrowed to what the device + produces. extra_headers: Send extra headers diff --git a/src/mobilerun_sdk/resources/mailboxes/mailboxes.py b/src/mobilerun_sdk/resources/mailboxes/mailboxes.py index 50e03570..b532f26f 100644 --- a/src/mobilerun_sdk/resources/mailboxes/mailboxes.py +++ b/src/mobilerun_sdk/resources/mailboxes/mailboxes.py @@ -252,7 +252,8 @@ def delete( ) -> MailboxDeleteResponse: """ Cancels a pending mailbox or schedules an active paid mailbox for cancellation. - Existing addresses and messages are retained. Repeating the request is safe. + Existing addresses and messages are retained. Repeating the request is safe. An + external inbox (Gmail) cannot be cancelled here; disconnect the link instead. Args: extra_headers: Send extra headers @@ -627,7 +628,8 @@ async def delete( ) -> MailboxDeleteResponse: """ Cancels a pending mailbox or schedules an active paid mailbox for cancellation. - Existing addresses and messages are retained. Repeating the request is safe. + Existing addresses and messages are retained. Repeating the request is safe. An + external inbox (Gmail) cannot be cancelled here; disconnect the link instead. Args: extra_headers: Send extra headers diff --git a/src/mobilerun_sdk/resources/tasks/tasks.py b/src/mobilerun_sdk/resources/tasks/tasks.py index c6656997..a9b30562 100644 --- a/src/mobilerun_sdk/resources/tasks/tasks.py +++ b/src/mobilerun_sdk/resources/tasks/tasks.py @@ -321,7 +321,7 @@ def run( execution_timeout: Maximum agent execution time in seconds (1–2700). - llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-5.6-luna') + llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-6-luna') recording_enabled: Record device video for the whole task and persist a retrievable reference @@ -415,7 +415,7 @@ def run_streamed( execution_timeout: Maximum agent execution time in seconds (1–2700). - llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-5.6-luna') + llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-6-luna') recording_enabled: Record device video for the whole task and persist a retrievable reference @@ -817,7 +817,7 @@ async def run( execution_timeout: Maximum agent execution time in seconds (1–2700). - llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-5.6-luna') + llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-6-luna') recording_enabled: Record device video for the whole task and persist a retrievable reference @@ -911,7 +911,7 @@ async def run_streamed( execution_timeout: Maximum agent execution time in seconds (1–2700). - llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-5.6-luna') + llm_model: The LLM model identifier to use for the task (e.g. 'openai/gpt-6-luna') recording_enabled: Record device video for the whole task and persist a retrievable reference diff --git a/src/mobilerun_sdk/resources/workflows/action_catalog.py b/src/mobilerun_sdk/resources/workflows/action_catalog.py index da75896c..2fc99f7d 100644 --- a/src/mobilerun_sdk/resources/workflows/action_catalog.py +++ b/src/mobilerun_sdk/resources/workflows/action_catalog.py @@ -83,7 +83,7 @@ def list( *, page: int | Omit = omit, page_size: int | Omit = omit, - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] | Omit = omit, + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -184,7 +184,7 @@ async def list( *, page: int | Omit = omit, page_size: int | Omit = omit, - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] | Omit = omit, + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, diff --git a/src/mobilerun_sdk/resources/workflows/actions/actions.py b/src/mobilerun_sdk/resources/workflows/actions/actions.py index d99bbf4e..68ad5699 100644 --- a/src/mobilerun_sdk/resources/workflows/actions/actions.py +++ b/src/mobilerun_sdk/resources/workflows/actions/actions.py @@ -192,7 +192,7 @@ def list( page: int | Omit = omit, page_size: int | Omit = omit, search: str | Omit = omit, - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] | Omit = omit, + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -427,7 +427,7 @@ async def list( page: int | Omit = omit, page_size: int | Omit = omit, search: str | Omit = omit, - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] | Omit = omit, + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, diff --git a/src/mobilerun_sdk/resources/workflows/flows/flows.py b/src/mobilerun_sdk/resources/workflows/flows/flows.py index 1faf5913..e4873230 100644 --- a/src/mobilerun_sdk/resources/workflows/flows/flows.py +++ b/src/mobilerun_sdk/resources/workflows/flows/flows.py @@ -79,6 +79,7 @@ def create( trigger_id: str, cooldown_scope: Literal["flow", "device"] | Omit = omit, cooldown_seconds: Optional[int] | Omit = omit, + delivery: flow_create_params.Delivery | Omit = omit, description: str | Omit = omit, device_ids: SequenceNotStr[str] | Omit = omit, enabled: bool | Omit = omit, @@ -104,9 +105,6 @@ def create( success or failure. Args: - recording_enabled: Deprecated compatibility field. true maps to recordingPolicy.mode="flow"; false - maps to "off". - extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -124,6 +122,7 @@ def create( "trigger_id": trigger_id, "cooldown_scope": cooldown_scope, "cooldown_seconds": cooldown_seconds, + "delivery": delivery, "description": description, "device_ids": device_ids, "enabled": enabled, @@ -184,6 +183,7 @@ def update( *, cooldown_scope: Literal["flow", "device"] | Omit = omit, cooldown_seconds: Optional[int] | Omit = omit, + delivery: Optional[flow_update_params.Delivery] | Omit = omit, description: str | Omit = omit, device_ids: SequenceNotStr[str] | Omit = omit, enabled: bool | Omit = omit, @@ -233,6 +233,7 @@ def update( { "cooldown_scope": cooldown_scope, "cooldown_seconds": cooldown_seconds, + "delivery": delivery, "description": description, "device_ids": device_ids, "enabled": enabled, @@ -575,6 +576,7 @@ async def create( trigger_id: str, cooldown_scope: Literal["flow", "device"] | Omit = omit, cooldown_seconds: Optional[int] | Omit = omit, + delivery: flow_create_params.Delivery | Omit = omit, description: str | Omit = omit, device_ids: SequenceNotStr[str] | Omit = omit, enabled: bool | Omit = omit, @@ -600,9 +602,6 @@ async def create( success or failure. Args: - recording_enabled: Deprecated compatibility field. true maps to recordingPolicy.mode="flow"; false - maps to "off". - extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -620,6 +619,7 @@ async def create( "trigger_id": trigger_id, "cooldown_scope": cooldown_scope, "cooldown_seconds": cooldown_seconds, + "delivery": delivery, "description": description, "device_ids": device_ids, "enabled": enabled, @@ -680,6 +680,7 @@ async def update( *, cooldown_scope: Literal["flow", "device"] | Omit = omit, cooldown_seconds: Optional[int] | Omit = omit, + delivery: Optional[flow_update_params.Delivery] | Omit = omit, description: str | Omit = omit, device_ids: SequenceNotStr[str] | Omit = omit, enabled: bool | Omit = omit, @@ -729,6 +730,7 @@ async def update( { "cooldown_scope": cooldown_scope, "cooldown_seconds": cooldown_seconds, + "delivery": delivery, "description": description, "device_ids": device_ids, "enabled": enabled, diff --git a/src/mobilerun_sdk/types/app_list_response.py b/src/mobilerun_sdk/types/app_list_response.py index c7088c0c..5d85ac9c 100644 --- a/src/mobilerun_sdk/types/app_list_response.py +++ b/src/mobilerun_sdk/types/app_list_response.py @@ -292,7 +292,7 @@ class ItemVersion(BaseModel): size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None) - source: Literal["user", "system", "portal", "store", "catalog"] + source: Literal["user", "system", "portal", "store"] status: Literal["queued", "available", "failed"] diff --git a/src/mobilerun_sdk/types/app_list_versions_response.py b/src/mobilerun_sdk/types/app_list_versions_response.py index a4181ed7..a2bfedbd 100644 --- a/src/mobilerun_sdk/types/app_list_versions_response.py +++ b/src/mobilerun_sdk/types/app_list_versions_response.py @@ -281,7 +281,7 @@ class Data(BaseModel): size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None) - source: Literal["user", "system", "portal", "store", "catalog"] + source: Literal["user", "system", "portal", "store"] status: Literal["queued", "available", "failed"] diff --git a/src/mobilerun_sdk/types/assistant/conversation_create_response.py b/src/mobilerun_sdk/types/assistant/conversation_create_response.py index 34341512..9c701f3f 100644 --- a/src/mobilerun_sdk/types/assistant/conversation_create_response.py +++ b/src/mobilerun_sdk/types/assistant/conversation_create_response.py @@ -25,6 +25,8 @@ class Session(BaseModel): created_at: str = FieldInfo(alias="createdAt") + credits_used: Optional[float] = FieldInfo(alias="creditsUsed", default=None) + description: Optional[str] = None last_active_at: str = FieldInfo(alias="lastActiveAt") diff --git a/src/mobilerun_sdk/types/assistant/conversation_list_response.py b/src/mobilerun_sdk/types/assistant/conversation_list_response.py index 3f3ba16a..efa428bd 100644 --- a/src/mobilerun_sdk/types/assistant/conversation_list_response.py +++ b/src/mobilerun_sdk/types/assistant/conversation_list_response.py @@ -25,6 +25,8 @@ class SessionUnionMember0(BaseModel): created_at: str = FieldInfo(alias="createdAt") + credits_used: Optional[float] = FieldInfo(alias="creditsUsed", default=None) + description: Optional[str] = None episode: int @@ -69,6 +71,8 @@ class SessionUnionMember1(BaseModel): created_at: str = FieldInfo(alias="createdAt") + credits_used: Optional[float] = FieldInfo(alias="creditsUsed", default=None) + description: Optional[str] = None episode: int diff --git a/src/mobilerun_sdk/types/assistant/conversation_update_response.py b/src/mobilerun_sdk/types/assistant/conversation_update_response.py index 514fad09..7cd37fe1 100644 --- a/src/mobilerun_sdk/types/assistant/conversation_update_response.py +++ b/src/mobilerun_sdk/types/assistant/conversation_update_response.py @@ -25,6 +25,8 @@ class Session(BaseModel): created_at: str = FieldInfo(alias="createdAt") + credits_used: Optional[float] = FieldInfo(alias="creditsUsed", default=None) + description: Optional[str] = None last_active_at: str = FieldInfo(alias="lastActiveAt") diff --git a/src/mobilerun_sdk/types/connect/proxy_buy_params.py b/src/mobilerun_sdk/types/connect/proxy_buy_params.py index 8426ebeb..6e7193d8 100644 --- a/src/mobilerun_sdk/types/connect/proxy_buy_params.py +++ b/src/mobilerun_sdk/types/connect/proxy_buy_params.py @@ -15,4 +15,11 @@ class ProxyBuyParams(TypedDict, total=False): type: Required[Literal["dedicated_residential", "residential", "mobile"]] + name: str + """ + Display name for the proxy, up to 64 characters excluding surrounding + whitespace, and containing no NUL. Omit it (or send only whitespace) to get a + generated label built from the country, type, and id. + """ + idempotency_key: Annotated[str, PropertyInfo(alias="Idempotency-Key")] diff --git a/src/mobilerun_sdk/types/connect/proxy_buy_response.py b/src/mobilerun_sdk/types/connect/proxy_buy_response.py index d512bbef..410cd95f 100644 --- a/src/mobilerun_sdk/types/connect/proxy_buy_response.py +++ b/src/mobilerun_sdk/types/connect/proxy_buy_response.py @@ -23,6 +23,14 @@ class ProxyBuyResponse(BaseModel): host: str + name: str + """Display name for the proxy. + + Set it on create or change it with PATCH; when no name has been set, a label + generated from the proxy's country, type, and id is returned instead — so this + is never empty. + """ + password: str port: int diff --git a/src/mobilerun_sdk/types/connect/proxy_list_response.py b/src/mobilerun_sdk/types/connect/proxy_list_response.py index e68fd457..04aba83a 100644 --- a/src/mobilerun_sdk/types/connect/proxy_list_response.py +++ b/src/mobilerun_sdk/types/connect/proxy_list_response.py @@ -23,6 +23,14 @@ class Item(BaseModel): host: str + name: str + """Display name for the proxy. + + Set it on create or change it with PATCH; when no name has been set, a label + generated from the proxy's country, type, and id is returned instead — so this + is never empty. + """ + port: int status: Literal["checking", "pending_payment", "provisioning", "active", "cancelling", "ended", "error"] diff --git a/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py b/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py index 41014606..d4607b03 100644 --- a/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py +++ b/src/mobilerun_sdk/types/connect/proxy_retrieve_response.py @@ -23,6 +23,14 @@ class ProxyRetrieveResponse(BaseModel): host: str + name: str + """Display name for the proxy. + + Set it on create or change it with PATCH; when no name has been set, a label + generated from the proxy's country, type, and id is returned instead — so this + is never empty. + """ + password: str port: int diff --git a/src/mobilerun_sdk/types/device_create_params.py b/src/mobilerun_sdk/types/device_create_params.py index 4596899e..c8169523 100644 --- a/src/mobilerun_sdk/types/device_create_params.py +++ b/src/mobilerun_sdk/types/device_create_params.py @@ -18,9 +18,13 @@ class DeviceCreateParams(TypedDict, total=False): billing: Literal["auto", "subscription", "minute"] """Billing mode. - 'auto' uses a subscription slot when available and otherwise bills per minute; - 'subscription' requires an available subscription slot; 'minute' bills per - minute. Only cloud phone and cloud emulator devices support per-minute billing. + 'auto' tries subscription first, then minute billing if no subscription + entitlement exists or all subscription slots are in use, provided minute billing + is enabled. When subscription billing is disabled, auto uses minutes directly. + Billing-service failures never trigger fallback. 'subscription' requires an + available subscription slot and never falls back. 'minute' uses minute billing + only, subject to balance and concurrency checks. Modes depend on the device + type's billing configuration. """ query_country: Annotated[str, PropertyInfo(alias="country")] @@ -29,21 +33,12 @@ class DeviceCreateParams(TypedDict, total=False): If omitted the system picks the country with the most availability. """ - device_type: Annotated[ - Literal[ - "android_cloud_phone", - "dedicated_premium_device", - "dedicated_physical_device", - "dedicated_ios_device", - "dedicated_emulated_device", - ], - PropertyInfo(alias="deviceType"), - ] - """ - Deprecated device type aliases are accepted during a compatibility grace period: - dedicated_premium_device maps to android_cloud_phone, dedicated_physical_device - maps to android_physical_phone, dedicated_ios_device maps to ios_stealth_phone, - and dedicated_emulated_device maps to android_emulator. + device_type: Annotated[str, PropertyInfo(alias="deviceType")] + """Use android_cloud_phone for a cloud Android phone. + + Only canonical identifiers are accepted. Other backends are deployment-specific; + recognized but unavailable types return DEVICE*TYPE_UNAVAILABLE (422). Retired + dedicated*\\** aliases are rejected with a canonical replacement. """ profile_id: Annotated[str, PropertyInfo(alias="profileId")] diff --git a/src/mobilerun_sdk/types/device_list_params.py b/src/mobilerun_sdk/types/device_list_params.py index 2f102f82..a3eedfdb 100644 --- a/src/mobilerun_sdk/types/device_list_params.py +++ b/src/mobilerun_sdk/types/device_list_params.py @@ -52,15 +52,10 @@ class DeviceListParams(TypedDict, total=False): ] type: Literal[ - "android_cloud_phone", - "dedicated_premium_device", - "dedicated_physical_device", - "dedicated_ios_device", - "dedicated_emulated_device", + "android_cloud_phone", "android_physical_phone", "ios_stealth_phone", "android_emulator", "ios_simulator" ] - """ - Deprecated device type aliases are accepted during a compatibility grace period: - dedicated_premium_device maps to android_cloud_phone, dedicated_physical_device - maps to android_physical_phone, dedicated_ios_device maps to ios_stealth_phone, - and dedicated_emulated_device maps to android_emulator. + """Canonical device type. + + Retired dedicated\\__\\** aliases are no longer accepted. Availability depends on + the deployment. """ diff --git a/src/mobilerun_sdk/types/devices/recording_start_params.py b/src/mobilerun_sdk/types/devices/recording_start_params.py index 007181d3..f2b6fefc 100644 --- a/src/mobilerun_sdk/types/devices/recording_start_params.py +++ b/src/mobilerun_sdk/types/devices/recording_start_params.py @@ -25,7 +25,9 @@ class RecordingStartParams(TypedDict, total=False): types: Optional[SequenceNotStr[str]] """ - Artifacts to capture: trajectory (input actions), video, and audio (captured + Artifacts to capture: trajectory (input actions; on portal stream-bridge devices + only when the handset announces trajectory capture), video, and audio (captured into the video artifact, so it requires video; honored by portal stream-bridge - recorders). Defaults to trajectory and video. + recorders). Defaults to trajectory and video, narrowed to what the device + produces. """ diff --git a/src/mobilerun_sdk/types/mailbox_create_response.py b/src/mobilerun_sdk/types/mailbox_create_response.py index 2bb8b3c9..e900323c 100644 --- a/src/mobilerun_sdk/types/mailbox_create_response.py +++ b/src/mobilerun_sdk/types/mailbox_create_response.py @@ -26,7 +26,7 @@ class Data(BaseModel): address: Optional[str] = None - billing_mode: Literal["rent", "included", "domain"] = FieldInfo(alias="billingMode") + billing_mode: Literal["rent", "included", "domain", "external"] = FieldInfo(alias="billingMode") cancel_at_period_end: bool = FieldInfo(alias="cancelAtPeriodEnd") @@ -44,7 +44,19 @@ class Data(BaseModel): label: Optional[str] = None - status: Literal["provisioning", "awaiting_payment", "active", "cancel_scheduled", "archived", "billing_error"] + provider: Literal["matix", "gmail"] + + status: Literal[ + "provisioning", + "awaiting_payment", + "active", + "cancel_scheduled", + "archived", + "billing_error", + "pending_connection", + "connection_expired", + "connection_removed", + ] class MailboxCreateResponse(BaseModel): diff --git a/src/mobilerun_sdk/types/mailbox_delete_response.py b/src/mobilerun_sdk/types/mailbox_delete_response.py index ac6cd9b8..4ef6563d 100644 --- a/src/mobilerun_sdk/types/mailbox_delete_response.py +++ b/src/mobilerun_sdk/types/mailbox_delete_response.py @@ -26,7 +26,7 @@ class Data(BaseModel): address: Optional[str] = None - billing_mode: Literal["rent", "included", "domain"] = FieldInfo(alias="billingMode") + billing_mode: Literal["rent", "included", "domain", "external"] = FieldInfo(alias="billingMode") cancel_at_period_end: bool = FieldInfo(alias="cancelAtPeriodEnd") @@ -44,7 +44,19 @@ class Data(BaseModel): label: Optional[str] = None - status: Literal["provisioning", "awaiting_payment", "active", "cancel_scheduled", "archived", "billing_error"] + provider: Literal["matix", "gmail"] + + status: Literal[ + "provisioning", + "awaiting_payment", + "active", + "cancel_scheduled", + "archived", + "billing_error", + "pending_connection", + "connection_expired", + "connection_removed", + ] class MailboxDeleteResponse(BaseModel): diff --git a/src/mobilerun_sdk/types/mailbox_list_response.py b/src/mobilerun_sdk/types/mailbox_list_response.py index 70ace920..8bde5500 100644 --- a/src/mobilerun_sdk/types/mailbox_list_response.py +++ b/src/mobilerun_sdk/types/mailbox_list_response.py @@ -27,7 +27,7 @@ class Item(BaseModel): address: Optional[str] = None - billing_mode: Literal["rent", "included", "domain"] = FieldInfo(alias="billingMode") + billing_mode: Literal["rent", "included", "domain", "external"] = FieldInfo(alias="billingMode") cancel_at_period_end: bool = FieldInfo(alias="cancelAtPeriodEnd") @@ -45,7 +45,19 @@ class Item(BaseModel): label: Optional[str] = None - status: Literal["provisioning", "awaiting_payment", "active", "cancel_scheduled", "archived", "billing_error"] + provider: Literal["matix", "gmail"] + + status: Literal[ + "provisioning", + "awaiting_payment", + "active", + "cancel_scheduled", + "archived", + "billing_error", + "pending_connection", + "connection_expired", + "connection_removed", + ] class MailboxListResponse(BaseModel): diff --git a/src/mobilerun_sdk/types/mailbox_restart_response.py b/src/mobilerun_sdk/types/mailbox_restart_response.py index ab9e1d79..316f0c79 100644 --- a/src/mobilerun_sdk/types/mailbox_restart_response.py +++ b/src/mobilerun_sdk/types/mailbox_restart_response.py @@ -26,7 +26,7 @@ class Data(BaseModel): address: Optional[str] = None - billing_mode: Literal["rent", "included", "domain"] = FieldInfo(alias="billingMode") + billing_mode: Literal["rent", "included", "domain", "external"] = FieldInfo(alias="billingMode") cancel_at_period_end: bool = FieldInfo(alias="cancelAtPeriodEnd") @@ -44,7 +44,19 @@ class Data(BaseModel): label: Optional[str] = None - status: Literal["provisioning", "awaiting_payment", "active", "cancel_scheduled", "archived", "billing_error"] + provider: Literal["matix", "gmail"] + + status: Literal[ + "provisioning", + "awaiting_payment", + "active", + "cancel_scheduled", + "archived", + "billing_error", + "pending_connection", + "connection_expired", + "connection_removed", + ] class MailboxRestartResponse(BaseModel): diff --git a/src/mobilerun_sdk/types/mailbox_retrieve_response.py b/src/mobilerun_sdk/types/mailbox_retrieve_response.py index ed490495..d9106311 100644 --- a/src/mobilerun_sdk/types/mailbox_retrieve_response.py +++ b/src/mobilerun_sdk/types/mailbox_retrieve_response.py @@ -26,7 +26,7 @@ class Data(BaseModel): address: Optional[str] = None - billing_mode: Literal["rent", "included", "domain"] = FieldInfo(alias="billingMode") + billing_mode: Literal["rent", "included", "domain", "external"] = FieldInfo(alias="billingMode") cancel_at_period_end: bool = FieldInfo(alias="cancelAtPeriodEnd") @@ -44,7 +44,19 @@ class Data(BaseModel): label: Optional[str] = None - status: Literal["provisioning", "awaiting_payment", "active", "cancel_scheduled", "archived", "billing_error"] + provider: Literal["matix", "gmail"] + + status: Literal[ + "provisioning", + "awaiting_payment", + "active", + "cancel_scheduled", + "archived", + "billing_error", + "pending_connection", + "connection_expired", + "connection_removed", + ] class MailboxRetrieveResponse(BaseModel): diff --git a/src/mobilerun_sdk/types/mailbox_uncancel_response.py b/src/mobilerun_sdk/types/mailbox_uncancel_response.py index fc6b588e..9c613702 100644 --- a/src/mobilerun_sdk/types/mailbox_uncancel_response.py +++ b/src/mobilerun_sdk/types/mailbox_uncancel_response.py @@ -26,7 +26,7 @@ class Data(BaseModel): address: Optional[str] = None - billing_mode: Literal["rent", "included", "domain"] = FieldInfo(alias="billingMode") + billing_mode: Literal["rent", "included", "domain", "external"] = FieldInfo(alias="billingMode") cancel_at_period_end: bool = FieldInfo(alias="cancelAtPeriodEnd") @@ -44,7 +44,19 @@ class Data(BaseModel): label: Optional[str] = None - status: Literal["provisioning", "awaiting_payment", "active", "cancel_scheduled", "archived", "billing_error"] + provider: Literal["matix", "gmail"] + + status: Literal[ + "provisioning", + "awaiting_payment", + "active", + "cancel_scheduled", + "archived", + "billing_error", + "pending_connection", + "connection_expired", + "connection_removed", + ] class MailboxUncancelResponse(BaseModel): diff --git a/src/mobilerun_sdk/types/mailbox_update_response.py b/src/mobilerun_sdk/types/mailbox_update_response.py index 99de186b..43419175 100644 --- a/src/mobilerun_sdk/types/mailbox_update_response.py +++ b/src/mobilerun_sdk/types/mailbox_update_response.py @@ -26,7 +26,7 @@ class Data(BaseModel): address: Optional[str] = None - billing_mode: Literal["rent", "included", "domain"] = FieldInfo(alias="billingMode") + billing_mode: Literal["rent", "included", "domain", "external"] = FieldInfo(alias="billingMode") cancel_at_period_end: bool = FieldInfo(alias="cancelAtPeriodEnd") @@ -44,7 +44,19 @@ class Data(BaseModel): label: Optional[str] = None - status: Literal["provisioning", "awaiting_payment", "active", "cancel_scheduled", "archived", "billing_error"] + provider: Literal["matix", "gmail"] + + status: Literal[ + "provisioning", + "awaiting_payment", + "active", + "cancel_scheduled", + "archived", + "billing_error", + "pending_connection", + "connection_expired", + "connection_removed", + ] class MailboxUpdateResponse(BaseModel): diff --git a/src/mobilerun_sdk/types/store/app_list_response.py b/src/mobilerun_sdk/types/store/app_list_response.py index c8dce76d..7ee43700 100644 --- a/src/mobilerun_sdk/types/store/app_list_response.py +++ b/src/mobilerun_sdk/types/store/app_list_response.py @@ -282,7 +282,7 @@ class ItemVersion(BaseModel): size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None) - source: Literal["user", "system", "portal", "store", "catalog"] + source: Literal["user", "system", "portal", "store"] status: Literal["queued", "available", "failed"] diff --git a/src/mobilerun_sdk/types/store/app_retrieve_response.py b/src/mobilerun_sdk/types/store/app_retrieve_response.py index c9461110..a7e430e6 100644 --- a/src/mobilerun_sdk/types/store/app_retrieve_response.py +++ b/src/mobilerun_sdk/types/store/app_retrieve_response.py @@ -281,7 +281,7 @@ class DataVersion(BaseModel): size_bytes: Optional[int] = FieldInfo(alias="sizeBytes", default=None) - source: Literal["user", "system", "portal", "store", "catalog"] + source: Literal["user", "system", "portal", "store"] status: Literal["queued", "available", "failed"] @@ -324,6 +324,8 @@ class Data(BaseModel): version: DataVersion + versions: List[DataVersion] + class AppRetrieveResponse(BaseModel): data: Data diff --git a/src/mobilerun_sdk/types/task_get_trajectory_response.py b/src/mobilerun_sdk/types/task_get_trajectory_response.py index b078d881..2afe64a6 100644 --- a/src/mobilerun_sdk/types/task_get_trajectory_response.py +++ b/src/mobilerun_sdk/types/task_get_trajectory_response.py @@ -298,6 +298,9 @@ class TrajectoryTrajectoryFastAgentResponseEventData(BaseModel): code: Optional[str] = None + tool_call_status: Optional[Literal["valid", "no_markup", "malformed"]] = None + """Classification of tool-call markup in an LLM response.""" + usage: Optional[TrajectoryTrajectoryFastAgentResponseEventDataUsage] = None diff --git a/src/mobilerun_sdk/types/task_run_params.py b/src/mobilerun_sdk/types/task_run_params.py index e0b99bc9..d4e01806 100644 --- a/src/mobilerun_sdk/types/task_run_params.py +++ b/src/mobilerun_sdk/types/task_run_params.py @@ -34,7 +34,7 @@ class TaskRunParams(TypedDict, total=False): files: SequenceNotStr[str] llm_model: Annotated[str, PropertyInfo(alias="llmModel")] - """The LLM model identifier to use for the task (e.g. 'openai/gpt-5.6-luna')""" + """The LLM model identifier to use for the task (e.g. 'openai/gpt-6-luna')""" max_steps: Annotated[int, PropertyInfo(alias="maxSteps")] diff --git a/src/mobilerun_sdk/types/task_run_streamed_params.py b/src/mobilerun_sdk/types/task_run_streamed_params.py index 5de0656e..64267509 100644 --- a/src/mobilerun_sdk/types/task_run_streamed_params.py +++ b/src/mobilerun_sdk/types/task_run_streamed_params.py @@ -34,7 +34,7 @@ class TaskRunStreamedParams(TypedDict, total=False): files: SequenceNotStr[str] llm_model: Annotated[str, PropertyInfo(alias="llmModel")] - """The LLM model identifier to use for the task (e.g. 'openai/gpt-5.6-luna')""" + """The LLM model identifier to use for the task (e.g. 'openai/gpt-6-luna')""" max_steps: Annotated[int, PropertyInfo(alias="maxSteps")] diff --git a/src/mobilerun_sdk/types/webhook_event_types_response.py b/src/mobilerun_sdk/types/webhook_event_types_response.py index 9c7439d7..749cdcf3 100644 --- a/src/mobilerun_sdk/types/webhook_event_types_response.py +++ b/src/mobilerun_sdk/types/webhook_event_types_response.py @@ -19,6 +19,8 @@ class DataSourceEventSurfaces(BaseModel): agent: Optional[bool] = None + live: Optional[bool] = None + class DataSourceEvent(BaseModel): description: str diff --git a/src/mobilerun_sdk/types/workflows/action_catalog_list_params.py b/src/mobilerun_sdk/types/workflows/action_catalog_list_params.py index 4e756a96..1e8cfead 100644 --- a/src/mobilerun_sdk/types/workflows/action_catalog_list_params.py +++ b/src/mobilerun_sdk/types/workflows/action_catalog_list_params.py @@ -14,4 +14,4 @@ class ActionCatalogListParams(TypedDict, total=False): page_size: Annotated[int, PropertyInfo(alias="pageSize")] - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] diff --git a/src/mobilerun_sdk/types/workflows/action_catalog_list_response.py b/src/mobilerun_sdk/types/workflows/action_catalog_list_response.py index 231b0240..b79983ea 100644 --- a/src/mobilerun_sdk/types/workflows/action_catalog_list_response.py +++ b/src/mobilerun_sdk/types/workflows/action_catalog_list_response.py @@ -22,10 +22,14 @@ class Item(BaseModel): name: str - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + provider: Literal["mobilerun", "oneDrive", "googleDrive"] + + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None) + output_schema: Optional[object] = FieldInfo(alias="outputSchema", default=None) + params_schema: Optional[object] = FieldInfo(alias="paramsSchema", default=None) diff --git a/src/mobilerun_sdk/types/workflows/action_catalog_retrieve_response.py b/src/mobilerun_sdk/types/workflows/action_catalog_retrieve_response.py index 8769f574..3b7fa39c 100644 --- a/src/mobilerun_sdk/types/workflows/action_catalog_retrieve_response.py +++ b/src/mobilerun_sdk/types/workflows/action_catalog_retrieve_response.py @@ -21,10 +21,14 @@ class Data(BaseModel): name: str - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + provider: Literal["mobilerun", "oneDrive", "googleDrive"] + + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None) + output_schema: Optional[object] = FieldInfo(alias="outputSchema", default=None) + params_schema: Optional[object] = FieldInfo(alias="paramsSchema", default=None) diff --git a/src/mobilerun_sdk/types/workflows/action_create_response.py b/src/mobilerun_sdk/types/workflows/action_create_response.py index 3a44b0a6..a1cef28a 100644 --- a/src/mobilerun_sdk/types/workflows/action_create_response.py +++ b/src/mobilerun_sdk/types/workflows/action_create_response.py @@ -27,7 +27,7 @@ class Data(BaseModel): owner_id: str = FieldInfo(alias="ownerId") - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None) diff --git a/src/mobilerun_sdk/types/workflows/action_list_params.py b/src/mobilerun_sdk/types/workflows/action_list_params.py index 9873843d..a5c3ac22 100644 --- a/src/mobilerun_sdk/types/workflows/action_list_params.py +++ b/src/mobilerun_sdk/types/workflows/action_list_params.py @@ -20,4 +20,4 @@ class ActionListParams(TypedDict, total=False): search: str - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] diff --git a/src/mobilerun_sdk/types/workflows/action_list_response.py b/src/mobilerun_sdk/types/workflows/action_list_response.py index 9fc8ce86..b9ee463b 100644 --- a/src/mobilerun_sdk/types/workflows/action_list_response.py +++ b/src/mobilerun_sdk/types/workflows/action_list_response.py @@ -28,7 +28,7 @@ class Item(BaseModel): owner_id: str = FieldInfo(alias="ownerId") - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None) diff --git a/src/mobilerun_sdk/types/workflows/action_retrieve_response.py b/src/mobilerun_sdk/types/workflows/action_retrieve_response.py index 61d45f65..54b7cea0 100644 --- a/src/mobilerun_sdk/types/workflows/action_retrieve_response.py +++ b/src/mobilerun_sdk/types/workflows/action_retrieve_response.py @@ -27,7 +27,7 @@ class Data(BaseModel): owner_id: str = FieldInfo(alias="ownerId") - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None) diff --git a/src/mobilerun_sdk/types/workflows/action_update_response.py b/src/mobilerun_sdk/types/workflows/action_update_response.py index 1b5a53b4..273952b5 100644 --- a/src/mobilerun_sdk/types/workflows/action_update_response.py +++ b/src/mobilerun_sdk/types/workflows/action_update_response.py @@ -27,7 +27,7 @@ class Data(BaseModel): owner_id: str = FieldInfo(alias="ownerId") - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] updated_at: Optional[str] = FieldInfo(alias="updatedAt", default=None) diff --git a/src/mobilerun_sdk/types/workflows/event_dry_run_response.py b/src/mobilerun_sdk/types/workflows/event_dry_run_response.py index e7bb6eee..51478752 100644 --- a/src/mobilerun_sdk/types/workflows/event_dry_run_response.py +++ b/src/mobilerun_sdk/types/workflows/event_dry_run_response.py @@ -13,6 +13,8 @@ "DataMatchedFlow", "DataMatchedFlowAction", "DataMatchedFlowFlow", + "DataMatchedFlowFlowDelivery", + "DataMatchedFlowFlowDeliveryRecording", "DataMatchedFlowFlowRecordingPolicy", "DataMatchedFlowGates", "DataMatchedFlowTrigger", @@ -32,7 +34,7 @@ class DataMatchedFlowAction(BaseModel): recording_enabled: bool = FieldInfo(alias="recordingEnabled") - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] children: Optional[List[object]] = None """ @@ -43,6 +45,20 @@ class DataMatchedFlowAction(BaseModel): params: Optional[Dict[str, object]] = None +class DataMatchedFlowFlowDeliveryRecording(BaseModel): + filename: str + + +class DataMatchedFlowFlowDelivery(BaseModel): + destination: Literal["one_drive", "google_drive"] + + folder: Optional[str] = None + + recording: Optional[DataMatchedFlowFlowDeliveryRecording] = None + + screenshots: Optional[object] = None + + class DataMatchedFlowFlowRecordingPolicy(BaseModel): mode: Literal["off", "flow", "selected_steps"] @@ -64,6 +80,8 @@ class DataMatchedFlowFlow(BaseModel): created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + delivery: Optional[DataMatchedFlowFlowDelivery] = None + description: Optional[str] = None device_ids: List[str] = FieldInfo(alias="deviceIds") diff --git a/src/mobilerun_sdk/types/workflows/execution_retrieve_response.py b/src/mobilerun_sdk/types/workflows/execution_retrieve_response.py index 9af89a42..1a5fd5a3 100644 --- a/src/mobilerun_sdk/types/workflows/execution_retrieve_response.py +++ b/src/mobilerun_sdk/types/workflows/execution_retrieve_response.py @@ -1,13 +1,45 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional +from datetime import datetime from typing_extensions import Literal from pydantic import Field as FieldInfo from ..._models import BaseModel -__all__ = ["ExecutionRetrieveResponse", "Data", "DataFile", "DataRecording"] +__all__ = [ + "ExecutionRetrieveResponse", + "Data", + "DataDelivery", + "DataFile", + "DataProgress", + "DataProgressStep", + "DataRecording", + "DataScreenshot", +] + + +class DataDelivery(BaseModel): + artifact: Literal["recording", "file", "screenshot"] + + destination: Literal["one_drive", "google_drive"] + + error_code: Optional[str] = FieldInfo(alias="errorCode", default=None) + + filename: str + + finished_at: Optional[str] = FieldInfo(alias="finishedAt", default=None) + + folder: Optional[str] = None + + started_at: Optional[str] = FieldInfo(alias="startedAt", default=None) + + status: Literal["waiting", "uploading", "succeeded", "failed", "unknown", "cancelled"] + + step_index: Optional[int] = FieldInfo(alias="stepIndex", default=None) + + web_url: Optional[str] = FieldInfo(alias="webUrl", default=None) class DataFile(BaseModel): @@ -20,6 +52,36 @@ class DataFile(BaseModel): size_bytes: int = FieldInfo(alias="sizeBytes") +class DataProgressStep(BaseModel): + finished_at: Optional[datetime] = FieldInfo(alias="finishedAt", default=None) + + index: int + + method: str + + name: str + + service: str + + session_id: Optional[str] = FieldInfo(alias="sessionId", default=None) + + started_at: Optional[datetime] = FieldInfo(alias="startedAt", default=None) + + status: Literal["pending", "running", "success", "failed", "skipped", "cancelled"] + + +class DataProgress(BaseModel): + """ + Live progress read from step_progress; null for runs started before this feature. + """ + + current_index: Optional[int] = FieldInfo(alias="currentIndex", default=None) + + steps: List[DataProgressStep] + + total: int + + class DataRecording(BaseModel): id: str @@ -50,11 +112,36 @@ class DataRecording(BaseModel): stopped_at: Optional[str] = FieldInfo(alias="stoppedAt", default=None) +class DataScreenshot(BaseModel): + id: str + + captured_at: Optional[str] = FieldInfo(alias="capturedAt", default=None) + + iteration_index: int = FieldInfo(alias="iterationIndex") + + mime_type: str = FieldInfo(alias="mimeType") + + seq: int + + source: Literal["task", "agent"] + + step_index: int = FieldInfo(alias="stepIndex") + + step_name: str = FieldInfo(alias="stepName") + + class Data(BaseModel): id: str created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + deliveries: List[DataDelivery] + """ + OneDrive/Google Drive delivery lifecycle for this run's recording, file, and + screenshot uploads, ordered by startedAt. Empty when the flow has no delivery + configured. + """ + device_id: Optional[str] = FieldInfo(alias="deviceId", default=None) """Device this execution targets (the job's deviceId). @@ -87,6 +174,12 @@ class Data(BaseModel): kind: Literal["live", "dry_run", "verification"] + progress: Optional[DataProgress] = None + """ + Live progress read from step_progress; null for runs started before this + feature. + """ + recording_device_id: Optional[str] = FieldInfo(alias="recordingDeviceId", default=None) recording_id: Optional[str] = FieldInfo(alias="recordingId", default=None) @@ -102,6 +195,13 @@ class Data(BaseModel): Whole-flow recordings use -1 for every coordinate. """ + screenshots: List[DataScreenshot] + """Screenshots captured by tasks.run/agent.run steps, ordered by seq. + + Image bytes are never returned here — fetch a fresh signed URL via GET + /executions/{id}/screenshots/{screenshotId}. + """ + started_at: Optional[str] = FieldInfo(alias="startedAt", default=None) status: Optional[Literal["pending", "running", "success", "failed", "cancelled", "skipped", "invalid"]] = None diff --git a/src/mobilerun_sdk/types/workflows/flow_clone_response.py b/src/mobilerun_sdk/types/workflows/flow_clone_response.py index e08b73dd..ce1ec237 100644 --- a/src/mobilerun_sdk/types/workflows/flow_clone_response.py +++ b/src/mobilerun_sdk/types/workflows/flow_clone_response.py @@ -7,7 +7,21 @@ from ..._models import BaseModel -__all__ = ["FlowCloneResponse", "Data", "DataRecordingPolicy"] +__all__ = ["FlowCloneResponse", "Data", "DataDelivery", "DataDeliveryRecording", "DataRecordingPolicy"] + + +class DataDeliveryRecording(BaseModel): + filename: str + + +class DataDelivery(BaseModel): + destination: Literal["one_drive", "google_drive"] + + folder: Optional[str] = None + + recording: Optional[DataDeliveryRecording] = None + + screenshots: Optional[object] = None class DataRecordingPolicy(BaseModel): @@ -31,6 +45,8 @@ class Data(BaseModel): created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + delivery: Optional[DataDelivery] = None + description: Optional[str] = None device_ids: List[str] = FieldInfo(alias="deviceIds") diff --git a/src/mobilerun_sdk/types/workflows/flow_create_params.py b/src/mobilerun_sdk/types/workflows/flow_create_params.py index 1a292cf5..c6df47e9 100644 --- a/src/mobilerun_sdk/types/workflows/flow_create_params.py +++ b/src/mobilerun_sdk/types/workflows/flow_create_params.py @@ -8,7 +8,16 @@ from ..._types import SequenceNotStr from ..._utils import PropertyInfo -__all__ = ["FlowCreateParams", "Action", "ActionChild", "ActionChildOverrides", "ActionOverrides", "RecordingPolicy"] +__all__ = [ + "FlowCreateParams", + "Action", + "ActionChild", + "ActionChildOverrides", + "ActionOverrides", + "Delivery", + "DeliveryRecording", + "RecordingPolicy", +] class FlowCreateParams(TypedDict, total=False): @@ -22,6 +31,8 @@ class FlowCreateParams(TypedDict, total=False): cooldown_seconds: Annotated[Optional[int], PropertyInfo(alias="cooldownSeconds")] + delivery: Delivery + description: str device_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="deviceIds")] @@ -37,10 +48,6 @@ class FlowCreateParams(TypedDict, total=False): notify_webhook_id: Annotated[Optional[str], PropertyInfo(alias="notifyWebhookId")] recording_enabled: Annotated[bool, PropertyInfo(alias="recordingEnabled")] - """Deprecated compatibility field. - - true maps to recordingPolicy.mode="flow"; false maps to "off". - """ recording_policy: Annotated[RecordingPolicy, PropertyInfo(alias="recordingPolicy")] @@ -87,5 +94,19 @@ class Action(TypedDict, total=False): recording_enabled: Annotated[bool, PropertyInfo(alias="recordingEnabled")] +class DeliveryRecording(TypedDict, total=False): + filename: Required[str] + + +class Delivery(TypedDict, total=False): + destination: Required[Literal["one_drive", "google_drive"]] + + folder: str + + recording: DeliveryRecording + + screenshots: object + + class RecordingPolicy(TypedDict, total=False): mode: Required[Literal["off", "flow", "selected_steps"]] diff --git a/src/mobilerun_sdk/types/workflows/flow_create_response.py b/src/mobilerun_sdk/types/workflows/flow_create_response.py index d4129117..6a0b08cb 100644 --- a/src/mobilerun_sdk/types/workflows/flow_create_response.py +++ b/src/mobilerun_sdk/types/workflows/flow_create_response.py @@ -7,7 +7,21 @@ from ..._models import BaseModel -__all__ = ["FlowCreateResponse", "Data", "DataRecordingPolicy"] +__all__ = ["FlowCreateResponse", "Data", "DataDelivery", "DataDeliveryRecording", "DataRecordingPolicy"] + + +class DataDeliveryRecording(BaseModel): + filename: str + + +class DataDelivery(BaseModel): + destination: Literal["one_drive", "google_drive"] + + folder: Optional[str] = None + + recording: Optional[DataDeliveryRecording] = None + + screenshots: Optional[object] = None class DataRecordingPolicy(BaseModel): @@ -31,6 +45,8 @@ class Data(BaseModel): created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + delivery: Optional[DataDelivery] = None + description: Optional[str] = None device_ids: List[str] = FieldInfo(alias="deviceIds") diff --git a/src/mobilerun_sdk/types/workflows/flow_dry_run_response.py b/src/mobilerun_sdk/types/workflows/flow_dry_run_response.py index 5592add2..233ec632 100644 --- a/src/mobilerun_sdk/types/workflows/flow_dry_run_response.py +++ b/src/mobilerun_sdk/types/workflows/flow_dry_run_response.py @@ -21,7 +21,7 @@ class DataAction(BaseModel): recording_enabled: bool = FieldInfo(alias="recordingEnabled") - service: Literal["tasks_api", "devices_api", "agents_api", "webhooks"] + service: Literal["tasks_api", "devices_api", "agents_api", "webhooks", "integrations_api"] children: Optional[List[object]] = None """ diff --git a/src/mobilerun_sdk/types/workflows/flow_list_response.py b/src/mobilerun_sdk/types/workflows/flow_list_response.py index 01705f9f..fec008d7 100644 --- a/src/mobilerun_sdk/types/workflows/flow_list_response.py +++ b/src/mobilerun_sdk/types/workflows/flow_list_response.py @@ -8,7 +8,21 @@ from ..._models import BaseModel from ..shared.pagination import Pagination -__all__ = ["FlowListResponse", "Item", "ItemRecordingPolicy"] +__all__ = ["FlowListResponse", "Item", "ItemDelivery", "ItemDeliveryRecording", "ItemRecordingPolicy"] + + +class ItemDeliveryRecording(BaseModel): + filename: str + + +class ItemDelivery(BaseModel): + destination: Literal["one_drive", "google_drive"] + + folder: Optional[str] = None + + recording: Optional[ItemDeliveryRecording] = None + + screenshots: Optional[object] = None class ItemRecordingPolicy(BaseModel): @@ -32,6 +46,8 @@ class Item(BaseModel): created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + delivery: Optional[ItemDelivery] = None + description: Optional[str] = None device_ids: List[str] = FieldInfo(alias="deviceIds") diff --git a/src/mobilerun_sdk/types/workflows/flow_retrieve_response.py b/src/mobilerun_sdk/types/workflows/flow_retrieve_response.py index b4cd5806..67752c72 100644 --- a/src/mobilerun_sdk/types/workflows/flow_retrieve_response.py +++ b/src/mobilerun_sdk/types/workflows/flow_retrieve_response.py @@ -7,7 +7,21 @@ from ..._models import BaseModel -__all__ = ["FlowRetrieveResponse", "Data", "DataRecordingPolicy"] +__all__ = ["FlowRetrieveResponse", "Data", "DataDelivery", "DataDeliveryRecording", "DataRecordingPolicy"] + + +class DataDeliveryRecording(BaseModel): + filename: str + + +class DataDelivery(BaseModel): + destination: Literal["one_drive", "google_drive"] + + folder: Optional[str] = None + + recording: Optional[DataDeliveryRecording] = None + + screenshots: Optional[object] = None class DataRecordingPolicy(BaseModel): @@ -31,6 +45,8 @@ class Data(BaseModel): created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + delivery: Optional[DataDelivery] = None + description: Optional[str] = None device_ids: List[str] = FieldInfo(alias="deviceIds") diff --git a/src/mobilerun_sdk/types/workflows/flow_unblock_response.py b/src/mobilerun_sdk/types/workflows/flow_unblock_response.py index d71392de..23ef02ab 100644 --- a/src/mobilerun_sdk/types/workflows/flow_unblock_response.py +++ b/src/mobilerun_sdk/types/workflows/flow_unblock_response.py @@ -7,7 +7,21 @@ from ..._models import BaseModel -__all__ = ["FlowUnblockResponse", "Data", "DataRecordingPolicy"] +__all__ = ["FlowUnblockResponse", "Data", "DataDelivery", "DataDeliveryRecording", "DataRecordingPolicy"] + + +class DataDeliveryRecording(BaseModel): + filename: str + + +class DataDelivery(BaseModel): + destination: Literal["one_drive", "google_drive"] + + folder: Optional[str] = None + + recording: Optional[DataDeliveryRecording] = None + + screenshots: Optional[object] = None class DataRecordingPolicy(BaseModel): @@ -31,6 +45,8 @@ class Data(BaseModel): created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + delivery: Optional[DataDelivery] = None + description: Optional[str] = None device_ids: List[str] = FieldInfo(alias="deviceIds") diff --git a/src/mobilerun_sdk/types/workflows/flow_update_params.py b/src/mobilerun_sdk/types/workflows/flow_update_params.py index 9f32e4bb..7d925975 100644 --- a/src/mobilerun_sdk/types/workflows/flow_update_params.py +++ b/src/mobilerun_sdk/types/workflows/flow_update_params.py @@ -8,7 +8,7 @@ from ..._types import SequenceNotStr from ..._utils import PropertyInfo -__all__ = ["FlowUpdateParams", "RecordingPolicy"] +__all__ = ["FlowUpdateParams", "Delivery", "DeliveryRecording", "RecordingPolicy"] class FlowUpdateParams(TypedDict, total=False): @@ -16,6 +16,8 @@ class FlowUpdateParams(TypedDict, total=False): cooldown_seconds: Annotated[Optional[int], PropertyInfo(alias="cooldownSeconds")] + delivery: Optional[Delivery] + description: str device_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="deviceIds")] @@ -50,5 +52,19 @@ class FlowUpdateParams(TypedDict, total=False): trigger_id: Annotated[str, PropertyInfo(alias="triggerId")] +class DeliveryRecording(TypedDict, total=False): + filename: Required[str] + + +class Delivery(TypedDict, total=False): + destination: Required[Literal["one_drive", "google_drive"]] + + folder: str + + recording: DeliveryRecording + + screenshots: object + + class RecordingPolicy(TypedDict, total=False): mode: Required[Literal["off", "flow", "selected_steps"]] diff --git a/src/mobilerun_sdk/types/workflows/flow_update_response.py b/src/mobilerun_sdk/types/workflows/flow_update_response.py index 511e934a..b9703c1f 100644 --- a/src/mobilerun_sdk/types/workflows/flow_update_response.py +++ b/src/mobilerun_sdk/types/workflows/flow_update_response.py @@ -7,7 +7,21 @@ from ..._models import BaseModel -__all__ = ["FlowUpdateResponse", "Data", "DataRecordingPolicy"] +__all__ = ["FlowUpdateResponse", "Data", "DataDelivery", "DataDeliveryRecording", "DataRecordingPolicy"] + + +class DataDeliveryRecording(BaseModel): + filename: str + + +class DataDelivery(BaseModel): + destination: Literal["one_drive", "google_drive"] + + folder: Optional[str] = None + + recording: Optional[DataDeliveryRecording] = None + + screenshots: Optional[object] = None class DataRecordingPolicy(BaseModel): @@ -31,6 +45,8 @@ class Data(BaseModel): created_by: Optional[str] = FieldInfo(alias="createdBy", default=None) + delivery: Optional[DataDelivery] = None + description: Optional[str] = None device_ids: List[str] = FieldInfo(alias="deviceIds") diff --git a/tests/api_resources/connect/test_proxies.py b/tests/api_resources/connect/test_proxies.py index f2e62efb..9d3734b4 100644 --- a/tests/api_resources/connect/test_proxies.py +++ b/tests/api_resources/connect/test_proxies.py @@ -119,6 +119,7 @@ def test_method_buy_with_all_params(self, client: Mobilerun) -> None: proxy = client.connect.proxies.buy( country="country", type="dedicated_residential", + name="name", idempotency_key="Idempotency-Key", ) assert_matches_type(ProxyBuyResponse, proxy, path=["response"]) @@ -411,6 +412,7 @@ async def test_method_buy_with_all_params(self, async_client: AsyncMobilerun) -> proxy = await async_client.connect.proxies.buy( country="country", type="dedicated_residential", + name="name", idempotency_key="Idempotency-Key", ) assert_matches_type(ProxyBuyResponse, proxy, path=["response"]) diff --git a/tests/api_resources/test_devices.py b/tests/api_resources/test_devices.py index 19b6067c..86a3ce31 100644 --- a/tests/api_resources/test_devices.py +++ b/tests/api_resources/test_devices.py @@ -21,6 +21,8 @@ ) from mobilerun_sdk._utils import parse_datetime +# pyright: reportDeprecated=false + base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -207,13 +209,16 @@ def test_streaming_response_list(self, client: Mobilerun) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_method_count(self, client: Mobilerun) -> None: - device = client.devices.count() + with pytest.warns(DeprecationWarning): + device = client.devices.count() + assert_matches_type(DeviceCountResponse, device, path=["response"]) @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_raw_response_count(self, client: Mobilerun) -> None: - response = client.devices.with_raw_response.count() + with pytest.warns(DeprecationWarning): + response = client.devices.with_raw_response.count() assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -223,12 +228,13 @@ def test_raw_response_count(self, client: Mobilerun) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize def test_streaming_response_count(self, client: Mobilerun) -> None: - with client.devices.with_streaming_response.count() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" + with pytest.warns(DeprecationWarning): + with client.devices.with_streaming_response.count() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" - device = response.parse() - assert_matches_type(DeviceCountResponse, device, path=["response"]) + device = response.parse() + assert_matches_type(DeviceCountResponse, device, path=["response"]) assert cast(Any, response.is_closed) is True @@ -819,13 +825,16 @@ async def test_streaming_response_list(self, async_client: AsyncMobilerun) -> No @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_method_count(self, async_client: AsyncMobilerun) -> None: - device = await async_client.devices.count() + with pytest.warns(DeprecationWarning): + device = await async_client.devices.count() + assert_matches_type(DeviceCountResponse, device, path=["response"]) @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_raw_response_count(self, async_client: AsyncMobilerun) -> None: - response = await async_client.devices.with_raw_response.count() + with pytest.warns(DeprecationWarning): + response = await async_client.devices.with_raw_response.count() assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" @@ -835,12 +844,13 @@ async def test_raw_response_count(self, async_client: AsyncMobilerun) -> None: @pytest.mark.skip(reason="Mock server tests are disabled") @parametrize async def test_streaming_response_count(self, async_client: AsyncMobilerun) -> None: - async with async_client.devices.with_streaming_response.count() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" + with pytest.warns(DeprecationWarning): + async with async_client.devices.with_streaming_response.count() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" - device = await response.parse() - assert_matches_type(DeviceCountResponse, device, path=["response"]) + device = await response.parse() + assert_matches_type(DeviceCountResponse, device, path=["response"]) assert cast(Any, response.is_closed) is True diff --git a/tests/api_resources/workflows/test_flows.py b/tests/api_resources/workflows/test_flows.py index eb527497..2e90302d 100644 --- a/tests/api_resources/workflows/test_flows.py +++ b/tests/api_resources/workflows/test_flows.py @@ -71,6 +71,12 @@ def test_method_create_with_all_params(self, client: Mobilerun) -> None: trigger_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", cooldown_scope="flow", cooldown_seconds=0, + delivery={ + "destination": "one_drive", + "folder": "x", + "recording": {"filename": "x"}, + "screenshots": {}, + }, description="description", device_ids=["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"], enabled=True, @@ -182,6 +188,12 @@ def test_method_update_with_all_params(self, client: Mobilerun) -> None: flow_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", cooldown_scope="flow", cooldown_seconds=0, + delivery={ + "destination": "one_drive", + "folder": "x", + "recording": {"filename": "x"}, + "screenshots": {}, + }, description="description", device_ids=["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"], enabled=True, @@ -584,6 +596,12 @@ async def test_method_create_with_all_params(self, async_client: AsyncMobilerun) trigger_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", cooldown_scope="flow", cooldown_seconds=0, + delivery={ + "destination": "one_drive", + "folder": "x", + "recording": {"filename": "x"}, + "screenshots": {}, + }, description="description", device_ids=["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"], enabled=True, @@ -695,6 +713,12 @@ async def test_method_update_with_all_params(self, async_client: AsyncMobilerun) flow_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", cooldown_scope="flow", cooldown_seconds=0, + delivery={ + "destination": "one_drive", + "folder": "x", + "recording": {"filename": "x"}, + "screenshots": {}, + }, description="description", device_ids=["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"], enabled=True,