Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.52.0"
".": "0.53.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 112
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-4ce09d1a7546ab36f578cb27d819187eeb90c580b11834c7ff7a375aa22f9a20.yml
openapi_spec_hash: 1043ab2d699f6c828680c3352cd4cece
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-b51c72a040c8dfea9c0693de6631feabfffe42922d5feb60b4ac0ee5c83bb8f4.yml
openapi_spec_hash: 8b671cfe4debe8d9ad7c39ba5b0eaf6d
config_hash: 08d55086449943a8fec212b870061a3f
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## 0.53.0 (2026-05-05)

Full Changelog: [v0.52.0...v0.53.0](https://github.com/kernel/kernel-python-sdk/compare/v0.52.0...v0.53.0)

### Features

* Add 'switch' MFA option type for generic method-switcher links ([ed6a2d2](https://github.com/kernel/kernel-python-sdk/commit/ed6a2d2e05b20a6d80c122e7baec032e21de79eb))
* **api:** server-side search on GET /projects ([51c4f79](https://github.com/kernel/kernel-python-sdk/commit/51c4f7906d21382f10c7bb57cfe05f136edc0e42))
* Scope name uniqueness to project for profiles, session_pools, extensions, credentials ([19a5d40](https://github.com/kernel/kernel-python-sdk/commit/19a5d40a08e13daedff5da0b695305eb9556acab))


### Chores

* **internal:** reformat pyproject.toml ([120de63](https://github.com/kernel/kernel-python-sdk/commit/120de634b59406e86e5c7f100fa665f45e81c076))

## 0.52.0 (2026-04-29)

Full Changelog: [v0.51.0...v0.52.0](https://github.com/kernel/kernel-python-sdk/compare/v0.51.0...v0.52.0)
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "kernel"
version = "0.52.0"
version = "0.53.0"
description = "The official Python library for the kernel API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down Expand Up @@ -168,7 +168,7 @@ show_error_codes = true
#
# We also exclude our `tests` as mypy doesn't always infer
# types correctly and Pyright will still catch any type errors.
exclude = ['src/kernel/_files.py', '_dev/.*.py', 'tests/.*']
exclude = ["src/kernel/_files.py", "_dev/.*.py", "tests/.*"]

strict_equality = true
implicit_reexport = true
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "kernel"
__version__ = "0.52.0" # x-release-please-version
__version__ = "0.53.0" # x-release-please-version
8 changes: 4 additions & 4 deletions src/kernel/resources/browser_pools.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def create(
kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live
view.

name: Optional name for the browser pool. Must be unique within the organization.
name: Optional name for the browser pool. Must be unique within the project.

profile: Profile selection for the browser session. Provide either id or name. If
specified, the matching profile will be loaded into the browser session.
Expand Down Expand Up @@ -243,7 +243,7 @@ def update(
kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live
view.

name: Optional name for the browser pool. Must be unique within the organization.
name: Optional name for the browser pool. Must be unique within the project.

profile: Profile selection for the browser session. Provide either id or name. If
specified, the matching profile will be loaded into the browser session.
Expand Down Expand Up @@ -562,7 +562,7 @@ async def create(
kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live
view.

name: Optional name for the browser pool. Must be unique within the organization.
name: Optional name for the browser pool. Must be unique within the project.

profile: Profile selection for the browser session. Provide either id or name. If
specified, the matching profile will be loaded into the browser session.
Expand Down Expand Up @@ -705,7 +705,7 @@ async def update(
kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live
view.

name: Optional name for the browser pool. Must be unique within the organization.
name: Optional name for the browser pool. Must be unique within the project.

profile: Profile selection for the browser session. Provide either id or name. If
specified, the matching profile will be loaded into the browser session.
Expand Down
4 changes: 2 additions & 2 deletions src/kernel/resources/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def create(
Args:
domain: Target domain this credential is for

name: Unique name for the credential within the organization
name: Unique name for the credential within the project

values: Field name to value mapping (e.g., username, password)

Expand Down Expand Up @@ -365,7 +365,7 @@ async def create(
Args:
domain: Target domain this credential is for

name: Unique name for the credential within the organization
name: Unique name for the credential within the project

values: Field name to value mapping (e.g., username, password)

Expand Down
4 changes: 2 additions & 2 deletions src/kernel/resources/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ def upload(
Args:
file: ZIP file containing the browser extension.

name: Optional unique name within the organization to reference this extension.
name: Optional unique name within the project to reference this extension.

extra_headers: Send extra headers

Expand Down Expand Up @@ -421,7 +421,7 @@ async def upload(
Args:
file: ZIP file containing the browser extension.

name: Optional unique name within the organization to reference this extension.
name: Optional unique name within the project to reference this extension.

extra_headers: Send extra headers

Expand Down
4 changes: 2 additions & 2 deletions src/kernel/resources/profiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def create(
sessions.

Args:
name: Optional name of the profile. Must be unique within the organization.
name: Optional name of the profile. Must be unique within the project.

extra_headers: Send extra headers

Expand Down Expand Up @@ -278,7 +278,7 @@ async def create(
sessions.

Args:
name: Optional name of the profile. Must be unique within the organization.
name: Optional name of the profile. Must be unique within the project.

extra_headers: Send extra headers

Expand Down
8 changes: 8 additions & 0 deletions src/kernel/resources/projects/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ def list(
*,
limit: int | Omit = omit,
offset: int | Omit = omit,
query: 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.
extra_headers: Headers | None = None,
Expand All @@ -194,6 +195,8 @@ def list(

offset: Number of results to skip

query: Case-insensitive substring match against project name

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -214,6 +217,7 @@ def list(
{
"limit": limit,
"offset": offset,
"query": query,
},
project_list_params.ProjectListParams,
),
Expand Down Expand Up @@ -404,6 +408,7 @@ def list(
*,
limit: int | Omit = omit,
offset: int | Omit = omit,
query: 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.
extra_headers: Headers | None = None,
Expand All @@ -419,6 +424,8 @@ def list(

offset: Number of results to skip

query: Case-insensitive substring match against project name

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -439,6 +446,7 @@ def list(
{
"limit": limit,
"offset": offset,
"query": query,
},
project_list_params.ProjectListParams,
),
Expand Down
11 changes: 7 additions & 4 deletions src/kernel/types/auth/connection_follow_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class ManagedAuthStateEventDiscoveredField(BaseModel):
"Enter the phone ending in (**_) _**-\\**\\**92")
"""

linked_mfa_type: Optional[Literal["sms", "call", "email", "totp", "push", "password"]] = None
linked_mfa_type: Optional[Literal["sms", "call", "email", "totp", "push", "password", "switch"]] = None
"""
If this field is associated with an MFA option, the type of that option (e.g.,
password field linked to "Enter password" option)
Expand All @@ -59,9 +59,12 @@ class ManagedAuthStateEventMfaOption(BaseModel):
label: str
"""The visible option text"""

type: Literal["sms", "call", "email", "totp", "push", "password"]
"""
The MFA delivery method type (includes password for auth method selection pages)
type: Literal["sms", "call", "email", "totp", "push", "password", "switch"]
"""The MFA delivery method type.

Includes 'password' for auth method selection pages and 'switch' for generic
method-switcher links like "Use another method" that do not name a specific
method.
"""

description: Optional[str] = None
Expand Down
11 changes: 7 additions & 4 deletions src/kernel/types/auth/managed_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class DiscoveredField(BaseModel):
"Enter the phone ending in (**_) _**-\\**\\**92")
"""

linked_mfa_type: Optional[Literal["sms", "call", "email", "totp", "push", "password"]] = None
linked_mfa_type: Optional[Literal["sms", "call", "email", "totp", "push", "password", "switch"]] = None
"""
If this field is associated with an MFA option, the type of that option (e.g.,
password field linked to "Enter password" option)
Expand All @@ -71,9 +71,12 @@ class MfaOption(BaseModel):
label: str
"""The visible option text"""

type: Literal["sms", "call", "email", "totp", "push", "password"]
"""
The MFA delivery method type (includes password for auth method selection pages)
type: Literal["sms", "call", "email", "totp", "push", "password", "switch"]
"""The MFA delivery method type.

Includes 'password' for auth method selection pages and 'switch' for generic
method-switcher links like "Use another method" that do not name a specific
method.
"""

description: Optional[str] = None
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/browser_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class BrowserPoolConfig(BaseModel):
"""

name: Optional[str] = None
"""Optional name for the browser pool. Must be unique within the organization."""
"""Optional name for the browser pool. Must be unique within the project."""

profile: Optional[BrowserProfile] = None
"""Profile selection for the browser session.
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/browser_pool_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class BrowserPoolCreateParams(TypedDict, total=False):
"""

name: str
"""Optional name for the browser pool. Must be unique within the organization."""
"""Optional name for the browser pool. Must be unique within the project."""

profile: BrowserProfile
"""Profile selection for the browser session.
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/browser_pool_update_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class BrowserPoolUpdateParams(TypedDict, total=False):
"""

name: str
"""Optional name for the browser pool. Must be unique within the organization."""
"""Optional name for the browser pool. Must be unique within the project."""

profile: BrowserProfile
"""Profile selection for the browser session.
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/credential.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class Credential(BaseModel):
"""Target domain this credential is for"""

name: str
"""Unique name for the credential within the organization"""
"""Unique name for the credential within the project"""

updated_at: datetime
"""When the credential was last updated"""
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/credential_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class CredentialCreateParams(TypedDict, total=False):
"""Target domain this credential is for"""

name: Required[str]
"""Unique name for the credential within the organization"""
"""Unique name for the credential within the project"""

values: Required[Dict[str, str]]
"""Field name to value mapping (e.g., username, password)"""
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/extension_list_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class ExtensionListResponseItem(BaseModel):
name: Optional[str] = None
"""Optional, easier-to-reference name for the extension.

Must be unique within the organization.
Must be unique within the project.
"""


Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/extension_upload_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ class ExtensionUploadParams(TypedDict, total=False):
"""ZIP file containing the browser extension."""

name: str
"""Optional unique name within the organization to reference this extension."""
"""Optional unique name within the project to reference this extension."""
2 changes: 1 addition & 1 deletion src/kernel/types/extension_upload_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@ class ExtensionUploadResponse(BaseModel):
name: Optional[str] = None
"""Optional, easier-to-reference name for the extension.

Must be unique within the organization.
Must be unique within the project.
"""
2 changes: 1 addition & 1 deletion src/kernel/types/profile_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@

class ProfileCreateParams(TypedDict, total=False):
name: str
"""Optional name of the profile. Must be unique within the organization."""
"""Optional name of the profile. Must be unique within the project."""
3 changes: 3 additions & 0 deletions src/kernel/types/project_list_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ class ProjectListParams(TypedDict, total=False):

offset: int
"""Number of results to skip"""

query: str
"""Case-insensitive substring match against project name"""
2 changes: 2 additions & 0 deletions tests/api_resources/test_projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ def test_method_list_with_all_params(self, client: Kernel) -> None:
project = client.projects.list(
limit=100,
offset=0,
query="query",
)
assert_matches_type(SyncOffsetPagination[Project], project, path=["response"])

Expand Down Expand Up @@ -371,6 +372,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncKernel) -> N
project = await async_client.projects.list(
limit=100,
offset=0,
query="query",
)
assert_matches_type(AsyncOffsetPagination[Project], project, path=["response"])

Expand Down
Loading