From 7a0663201a031e73e7d6b7a5c68dc9a8ebfa01c2 Mon Sep 17 00:00:00 2001 From: chruffins <23645059+chruffins@users.noreply.github.com> Date: Tue, 10 Nov 2026 16:19:03 +0000 Subject: [PATCH 1/3] Build SDK Stainless-Generated-From: f317dd16d4beb2d17677816b2f3a6df043de934a --- src/kernel/types/browser_create_response.py | 27 ++++++++++++++++++- src/kernel/types/browser_list_response.py | 27 ++++++++++++++++++- .../types/browser_pool_acquire_response.py | 27 ++++++++++++++++++- src/kernel/types/browser_retrieve_response.py | 27 ++++++++++++++++++- src/kernel/types/browser_update_response.py | 27 ++++++++++++++++++- .../invocation_list_browsers_response.py | 27 ++++++++++++++++++- 6 files changed, 156 insertions(+), 6 deletions(-) diff --git a/src/kernel/types/browser_create_response.py b/src/kernel/types/browser_create_response.py index 995ebd17..8097d4c6 100644 --- a/src/kernel/types/browser_create_response.py +++ b/src/kernel/types/browser_create_response.py @@ -18,7 +18,25 @@ from .shared.browser_viewport import BrowserViewport from .browsers.browser_telemetry_config import BrowserTelemetryConfig -__all__ = ["BrowserCreateResponse"] +__all__ = ["BrowserCreateResponse", "Replay"] + + +class Replay(BaseModel): + """ + Replay recording started by `start_replay` when this browser was created or acquired. Omitted otherwise; list replays with `GET /browsers/{id_or_name}/replays`. + """ + + replay_id: str + """Unique identifier for the replay recording.""" + + finished_at: Optional[datetime] = None + """Timestamp when replay finished""" + + replay_view_url: Optional[str] = None + """URL for viewing the replay recording.""" + + started_at: Optional[datetime] = None + """Timestamp when replay started""" class BrowserCreateResponse(BaseModel): @@ -116,6 +134,13 @@ class BrowserCreateResponse(BaseModel): Deprecated in favor of proxy. """ + replay: Optional[Replay] = None + """ + Replay recording started by `start_replay` when this browser was created or + acquired. Omitted otherwise; list replays with + `GET /browsers/{id_or_name}/replays`. + """ + start_url: Optional[str] = None """URL the session was most recently asked to navigate to, if any. diff --git a/src/kernel/types/browser_list_response.py b/src/kernel/types/browser_list_response.py index 78419bf8..a4edef62 100644 --- a/src/kernel/types/browser_list_response.py +++ b/src/kernel/types/browser_list_response.py @@ -18,7 +18,25 @@ from .shared.browser_viewport import BrowserViewport from .browsers.browser_telemetry_config import BrowserTelemetryConfig -__all__ = ["BrowserListResponse"] +__all__ = ["BrowserListResponse", "Replay"] + + +class Replay(BaseModel): + """ + Replay recording started by `start_replay` when this browser was created or acquired. Omitted otherwise; list replays with `GET /browsers/{id_or_name}/replays`. + """ + + replay_id: str + """Unique identifier for the replay recording.""" + + finished_at: Optional[datetime] = None + """Timestamp when replay finished""" + + replay_view_url: Optional[str] = None + """URL for viewing the replay recording.""" + + started_at: Optional[datetime] = None + """Timestamp when replay started""" class BrowserListResponse(BaseModel): @@ -116,6 +134,13 @@ class BrowserListResponse(BaseModel): Deprecated in favor of proxy. """ + replay: Optional[Replay] = None + """ + Replay recording started by `start_replay` when this browser was created or + acquired. Omitted otherwise; list replays with + `GET /browsers/{id_or_name}/replays`. + """ + start_url: Optional[str] = None """URL the session was most recently asked to navigate to, if any. diff --git a/src/kernel/types/browser_pool_acquire_response.py b/src/kernel/types/browser_pool_acquire_response.py index 5a0ce004..50870ccc 100644 --- a/src/kernel/types/browser_pool_acquire_response.py +++ b/src/kernel/types/browser_pool_acquire_response.py @@ -19,7 +19,25 @@ from .shared.browser_viewport import BrowserViewport from .browsers.browser_telemetry_config import BrowserTelemetryConfig -__all__ = ["BrowserPoolAcquireResponse"] +__all__ = ["BrowserPoolAcquireResponse", "Replay"] + + +class Replay(BaseModel): + """ + Replay recording started by `start_replay` when this browser was created or acquired. Omitted otherwise; list replays with `GET /browsers/{id_or_name}/replays`. + """ + + replay_id: str + """Unique identifier for the replay recording.""" + + finished_at: Optional[datetime] = None + """Timestamp when replay finished""" + + replay_view_url: Optional[str] = None + """URL for viewing the replay recording.""" + + started_at: Optional[datetime] = None + """Timestamp when replay started""" class BrowserPoolAcquireResponse(NoContentAsNone, BaseModel): @@ -117,6 +135,13 @@ class BrowserPoolAcquireResponse(NoContentAsNone, BaseModel): Deprecated in favor of proxy. """ + replay: Optional[Replay] = None + """ + Replay recording started by `start_replay` when this browser was created or + acquired. Omitted otherwise; list replays with + `GET /browsers/{id_or_name}/replays`. + """ + start_url: Optional[str] = None """URL the session was most recently asked to navigate to, if any. diff --git a/src/kernel/types/browser_retrieve_response.py b/src/kernel/types/browser_retrieve_response.py index fc30d4f9..eaa6d4b0 100644 --- a/src/kernel/types/browser_retrieve_response.py +++ b/src/kernel/types/browser_retrieve_response.py @@ -18,7 +18,25 @@ from .shared.browser_viewport import BrowserViewport from .browsers.browser_telemetry_config import BrowserTelemetryConfig -__all__ = ["BrowserRetrieveResponse"] +__all__ = ["BrowserRetrieveResponse", "Replay"] + + +class Replay(BaseModel): + """ + Replay recording started by `start_replay` when this browser was created or acquired. Omitted otherwise; list replays with `GET /browsers/{id_or_name}/replays`. + """ + + replay_id: str + """Unique identifier for the replay recording.""" + + finished_at: Optional[datetime] = None + """Timestamp when replay finished""" + + replay_view_url: Optional[str] = None + """URL for viewing the replay recording.""" + + started_at: Optional[datetime] = None + """Timestamp when replay started""" class BrowserRetrieveResponse(BaseModel): @@ -116,6 +134,13 @@ class BrowserRetrieveResponse(BaseModel): Deprecated in favor of proxy. """ + replay: Optional[Replay] = None + """ + Replay recording started by `start_replay` when this browser was created or + acquired. Omitted otherwise; list replays with + `GET /browsers/{id_or_name}/replays`. + """ + start_url: Optional[str] = None """URL the session was most recently asked to navigate to, if any. diff --git a/src/kernel/types/browser_update_response.py b/src/kernel/types/browser_update_response.py index a88951d2..159603d8 100644 --- a/src/kernel/types/browser_update_response.py +++ b/src/kernel/types/browser_update_response.py @@ -18,7 +18,25 @@ from .shared.browser_viewport import BrowserViewport from .browsers.browser_telemetry_config import BrowserTelemetryConfig -__all__ = ["BrowserUpdateResponse"] +__all__ = ["BrowserUpdateResponse", "Replay"] + + +class Replay(BaseModel): + """ + Replay recording started by `start_replay` when this browser was created or acquired. Omitted otherwise; list replays with `GET /browsers/{id_or_name}/replays`. + """ + + replay_id: str + """Unique identifier for the replay recording.""" + + finished_at: Optional[datetime] = None + """Timestamp when replay finished""" + + replay_view_url: Optional[str] = None + """URL for viewing the replay recording.""" + + started_at: Optional[datetime] = None + """Timestamp when replay started""" class BrowserUpdateResponse(BaseModel): @@ -116,6 +134,13 @@ class BrowserUpdateResponse(BaseModel): Deprecated in favor of proxy. """ + replay: Optional[Replay] = None + """ + Replay recording started by `start_replay` when this browser was created or + acquired. Omitted otherwise; list replays with + `GET /browsers/{id_or_name}/replays`. + """ + start_url: Optional[str] = None """URL the session was most recently asked to navigate to, if any. diff --git a/src/kernel/types/invocation_list_browsers_response.py b/src/kernel/types/invocation_list_browsers_response.py index f3016e56..51874416 100644 --- a/src/kernel/types/invocation_list_browsers_response.py +++ b/src/kernel/types/invocation_list_browsers_response.py @@ -18,7 +18,25 @@ from .shared.browser_viewport import BrowserViewport from .browsers.browser_telemetry_config import BrowserTelemetryConfig -__all__ = ["InvocationListBrowsersResponse", "Browser"] +__all__ = ["InvocationListBrowsersResponse", "Browser", "BrowserReplay"] + + +class BrowserReplay(BaseModel): + """ + Replay recording started by `start_replay` when this browser was created or acquired. Omitted otherwise; list replays with `GET /browsers/{id_or_name}/replays`. + """ + + replay_id: str + """Unique identifier for the replay recording.""" + + finished_at: Optional[datetime] = None + """Timestamp when replay finished""" + + replay_view_url: Optional[str] = None + """URL for viewing the replay recording.""" + + started_at: Optional[datetime] = None + """Timestamp when replay started""" class Browser(BaseModel): @@ -116,6 +134,13 @@ class Browser(BaseModel): Deprecated in favor of proxy. """ + replay: Optional[BrowserReplay] = None + """ + Replay recording started by `start_replay` when this browser was created or + acquired. Omitted otherwise; list replays with + `GET /browsers/{id_or_name}/replays`. + """ + start_url: Optional[str] = None """URL the session was most recently asked to navigate to, if any. From 5976b838d244effe63464f64a35a8671a7624426 Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Thu, 12 Nov 2026 00:08:41 +0000 Subject: [PATCH 2/3] feat: Prepare native OAuth for MCP: path resource, exchange targets, static exchange client, retention, Clerk OAuth cutoff Stainless-Generated-From: 12fe170984ea55c209e28a34cebb74700e9754f7 --- api.md | 1 + src/kernel/types/auth/__init__.py | 2 ++ .../types/auth/managed_auth_browser_config.py | 7 +++++++ .../auth/managed_auth_browser_config_param.py | 7 +++++++ .../auth/managed_auth_browser_location.py | 20 ++++++++++++++++++ .../managed_auth_browser_location_param.py | 21 +++++++++++++++++++ tests/api_resources/auth/test_connections.py | 6 ++++++ 7 files changed, 64 insertions(+) create mode 100644 src/kernel/types/auth/managed_auth_browser_location.py create mode 100644 src/kernel/types/auth/managed_auth_browser_location_param.py diff --git a/api.md b/api.md index dada4a8b..e33b0798 100644 --- a/api.md +++ b/api.md @@ -436,6 +436,7 @@ from kernel.types.auth import ( LoginResponse, ManagedAuth, ManagedAuthBrowserConfig, + ManagedAuthBrowserLocation, ManagedAuthCreateRequest, ManagedAuthTimelineEvent, ManagedAuthUpdateRequest, diff --git a/src/kernel/types/auth/__init__.py b/src/kernel/types/auth/__init__.py index ced593b0..a3830af1 100644 --- a/src/kernel/types/auth/__init__.py +++ b/src/kernel/types/auth/__init__.py @@ -15,4 +15,6 @@ from .connection_timeline_params import ConnectionTimelineParams as ConnectionTimelineParams from .managed_auth_browser_config import ManagedAuthBrowserConfig as ManagedAuthBrowserConfig from .managed_auth_timeline_event import ManagedAuthTimelineEvent as ManagedAuthTimelineEvent +from .managed_auth_browser_location import ManagedAuthBrowserLocation as ManagedAuthBrowserLocation from .managed_auth_browser_config_param import ManagedAuthBrowserConfigParam as ManagedAuthBrowserConfigParam +from .managed_auth_browser_location_param import ManagedAuthBrowserLocationParam as ManagedAuthBrowserLocationParam diff --git a/src/kernel/types/auth/managed_auth_browser_config.py b/src/kernel/types/auth/managed_auth_browser_config.py index 0de4499d..3886d61d 100644 --- a/src/kernel/types/auth/managed_auth_browser_config.py +++ b/src/kernel/types/auth/managed_auth_browser_config.py @@ -5,6 +5,7 @@ from ..._models import BaseModel from ..browser_proxy_config import BrowserProxyConfig +from .managed_auth_browser_location import ManagedAuthBrowserLocation from ..browsers.browser_telemetry_categories_config import BrowserTelemetryCategoriesConfig __all__ = [ @@ -117,6 +118,12 @@ class ManagedAuthBrowserConfig(BaseModel): Browser configuration applied to browser sessions created for a managed auth connection. Managed auth controls the profile, headless mode, timeout, start URL, kiosk mode, and viewport. """ + location: Optional[ManagedAuthBrowserLocation] = None + """ + Browser locale for the connection's login, reauthentication, and health-check + sessions. Set on create or update; not supported on login. + """ + proxy: Optional[BrowserProxyConfig] = None """Proxy configuration for managed auth browser sessions. diff --git a/src/kernel/types/auth/managed_auth_browser_config_param.py b/src/kernel/types/auth/managed_auth_browser_config_param.py index 98577698..da9d2cee 100644 --- a/src/kernel/types/auth/managed_auth_browser_config_param.py +++ b/src/kernel/types/auth/managed_auth_browser_config_param.py @@ -6,6 +6,7 @@ from typing_extensions import Literal, TypedDict from ..browser_proxy_config_param import BrowserProxyConfigParam +from .managed_auth_browser_location_param import ManagedAuthBrowserLocationParam from ..browsers.browser_telemetry_categories_config_param import BrowserTelemetryCategoriesConfigParam __all__ = [ @@ -118,6 +119,12 @@ class ManagedAuthBrowserConfigParam(TypedDict, total=False): Browser configuration applied to browser sessions created for a managed auth connection. Managed auth controls the profile, headless mode, timeout, start URL, kiosk mode, and viewport. """ + location: ManagedAuthBrowserLocationParam + """ + Browser locale for the connection's login, reauthentication, and health-check + sessions. Set on create or update; not supported on login. + """ + proxy: BrowserProxyConfigParam """Proxy configuration for managed auth browser sessions. diff --git a/src/kernel/types/auth/managed_auth_browser_location.py b/src/kernel/types/auth/managed_auth_browser_location.py new file mode 100644 index 00000000..44aee57d --- /dev/null +++ b/src/kernel/types/auth/managed_auth_browser_location.py @@ -0,0 +1,20 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional + +from ..._models import BaseModel + +__all__ = ["ManagedAuthBrowserLocation"] + + +class ManagedAuthBrowserLocation(BaseModel): + """ + Browser locale applied to browser sessions created for a managed auth connection. + """ + + locale: Optional[str] = None + """ + Supported canonical BCP 47 locale for the browser's language and Accept-Language + header. Omit to use the default for the browser's region, or omit on update to + keep the current locale. Null clears it on update. + """ diff --git a/src/kernel/types/auth/managed_auth_browser_location_param.py b/src/kernel/types/auth/managed_auth_browser_location_param.py new file mode 100644 index 00000000..9e4e8cb1 --- /dev/null +++ b/src/kernel/types/auth/managed_auth_browser_location_param.py @@ -0,0 +1,21 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Optional +from typing_extensions import TypedDict + +__all__ = ["ManagedAuthBrowserLocationParam"] + + +class ManagedAuthBrowserLocationParam(TypedDict, total=False): + """ + Browser locale applied to browser sessions created for a managed auth connection. + """ + + locale: Optional[str] + """ + Supported canonical BCP 47 locale for the browser's language and Accept-Language + header. Omit to use the default for the browser's region, or omit on update to + keep the current locale. Null clears it on update. + """ diff --git a/tests/api_resources/auth/test_connections.py b/tests/api_resources/auth/test_connections.py index 3dded1fc..9ebb3e9f 100644 --- a/tests/api_resources/auth/test_connections.py +++ b/tests/api_resources/auth/test_connections.py @@ -41,6 +41,7 @@ def test_method_create_with_all_params(self, client: Kernel) -> None: allowed_domains=["login.netflix.com", "auth.netflix.com"], auto_reauth=True, browser={ + "location": {"locale": "sv-SE"}, "proxy": { "id": "x", "mode": "direct", @@ -210,6 +211,7 @@ def test_method_update_with_all_params(self, client: Kernel) -> None: allowed_domains=["login.netflix.com", "auth.netflix.com"], auto_reauth=True, browser={ + "location": {"locale": "sv-SE"}, "proxy": { "id": "x", "mode": "direct", @@ -464,6 +466,7 @@ def test_method_login_with_all_params(self, client: Kernel) -> None: connection = client.auth.connections.login( id="id", browser={ + "location": {"locale": "sv-SE"}, "proxy": { "id": "x", "mode": "direct", @@ -712,6 +715,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncKernel) -> allowed_domains=["login.netflix.com", "auth.netflix.com"], auto_reauth=True, browser={ + "location": {"locale": "sv-SE"}, "proxy": { "id": "x", "mode": "direct", @@ -881,6 +885,7 @@ async def test_method_update_with_all_params(self, async_client: AsyncKernel) -> allowed_domains=["login.netflix.com", "auth.netflix.com"], auto_reauth=True, browser={ + "location": {"locale": "sv-SE"}, "proxy": { "id": "x", "mode": "direct", @@ -1135,6 +1140,7 @@ async def test_method_login_with_all_params(self, async_client: AsyncKernel) -> connection = await async_client.auth.connections.login( id="id", browser={ + "location": {"locale": "sv-SE"}, "proxy": { "id": "x", "mode": "direct", From e8c33d6c39d91cfb7d7fecf331b905afe5bdb0d1 Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Thu, 12 Nov 2026 00:12:39 +0000 Subject: [PATCH 3/3] release: 0.147.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ pyproject.toml | 2 +- src/kernel/_version.py | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 123a5490..e205138b 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.146.0" + ".": "0.147.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f505b6c7..9c359945 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.147.0](https://github.com/kernel/kernel-python-sdk/compare/v0.146.0...v0.147.0) (2026-11-12) + + +### Features + +* Prepare native OAuth for MCP: path resource, exchange targets, static exchange client, retention, Clerk OAuth cutoff ([5976b83](https://github.com/kernel/kernel-python-sdk/commit/5976b838d244effe63464f64a35a8671a7624426)) + ## [0.146.0](https://github.com/kernel/kernel-python-sdk/compare/v0.145.0...v0.146.0) (2026-11-10) diff --git a/pyproject.toml b/pyproject.toml index 2aaa0c60..973785ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kernel" -version = "0.146.0" +version = "0.147.0" description = "The official Python library for the kernel API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/kernel/_version.py b/src/kernel/_version.py index 9ab4c49c..b92cbde8 100644 --- a/src/kernel/_version.py +++ b/src/kernel/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "kernel" -__version__ = "0.146.0" # x-release-please-version +__version__ = "0.147.0" # x-release-please-version