From 1c3b388f1a4597f65ed3926a8ec2646f5e0fc994 Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2026 18:39:11 +0000 Subject: [PATCH 1/3] feat: Expose vault access in organization entitlements Stainless-Generated-From: 0553bf6048bcef35a58d4c3536f16301fa5ed99a --- .../types/organization/org_entitlements.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/kernel/types/organization/org_entitlements.py b/src/kernel/types/organization/org_entitlements.py index c940cbef..ed13dcc8 100644 --- a/src/kernel/types/organization/org_entitlements.py +++ b/src/kernel/types/organization/org_entitlements.py @@ -21,6 +21,7 @@ "FeaturesManagedProxies", "FeaturesProfiles", "FeaturesProxyBypassHosts", + "FeaturesVaults", "Limits", "Plan", ] @@ -114,6 +115,15 @@ class FeaturesProxyBypassHosts(BaseModel): """Whether the organization is entitled to use this feature.""" +class FeaturesVaults(BaseModel): + """ + Whether the organization can access vaults, using the same access check as vault API routes. + """ + + enabled: bool + """Whether the organization is entitled to use this feature.""" + + class Features(BaseModel): browser_extensions: FeaturesBrowserExtensions @@ -139,6 +149,12 @@ class Features(BaseModel): proxy_bypass_hosts: FeaturesProxyBypassHosts + vaults: FeaturesVaults + """ + Whether the organization can access vaults, using the same access check as vault + API routes. + """ + class Limits(BaseModel): default_max_concurrent_invocations_per_app: int From b0d5628acbe0a9d9d006a3349ba1338fdc3d4402 Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:21:54 +0000 Subject: [PATCH 2/3] feat: Limit free organizations to three vaults Stainless-Generated-From: ba7e1af409ddd0c708f01417cc714eb89c3739f0 --- src/kernel/resources/organization/limits.py | 4 ++-- src/kernel/resources/vaults/vaults.py | 8 ++++++-- src/kernel/types/organization/org_entitlements.py | 6 ++++++ src/kernel/types/organization/org_limits.py | 9 +++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/kernel/resources/organization/limits.py b/src/kernel/resources/organization/limits.py index d1bb6ecb..9dcd9dbb 100644 --- a/src/kernel/resources/organization/limits.py +++ b/src/kernel/resources/organization/limits.py @@ -55,7 +55,7 @@ def retrieve( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> OrgLimits: - """Get the organization's effective limits and managed auth usage.""" + """Get the organization's effective limits and managed auth and vault usage.""" return self._get( "/org/limits", options=make_request_options( @@ -138,7 +138,7 @@ async def retrieve( extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> OrgLimits: - """Get the organization's effective limits and managed auth usage.""" + """Get the organization's effective limits and managed auth and vault usage.""" return await self._get( "/org/limits", options=make_request_options( diff --git a/src/kernel/resources/vaults/vaults.py b/src/kernel/resources/vaults/vaults.py index ec33277c..f88ac5f1 100644 --- a/src/kernel/resources/vaults/vaults.py +++ b/src/kernel/resources/vaults/vaults.py @@ -176,7 +176,9 @@ def upsert( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> Vault: """ - Create or retrieve a vault by immutable name + Free organizations can store up to 3 non-deleted vaults across all projects. + Paid plans and active trials have no vault cap. Retrieving an existing vault by + name succeeds even at the limit. Args: name: Immutable name used to create or retrieve the vault. @@ -345,7 +347,9 @@ async def upsert( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> Vault: """ - Create or retrieve a vault by immutable name + Free organizations can store up to 3 non-deleted vaults across all projects. + Paid plans and active trials have no vault cap. Retrieving an existing vault by + name succeeds even at the limit. Args: name: Immutable name used to create or retrieve the vault. diff --git a/src/kernel/types/organization/org_entitlements.py b/src/kernel/types/organization/org_entitlements.py index ed13dcc8..614ce2fa 100644 --- a/src/kernel/types/organization/org_entitlements.py +++ b/src/kernel/types/organization/org_entitlements.py @@ -172,6 +172,12 @@ class Limits(BaseModel): max_concurrent_invocations: int """Effective organization-wide concurrent app invocation ceiling.""" + max_vaults: Optional[int] = None + """Maximum non-deleted vaults allowed org-wide across all projects. + + Null means unlimited. The vaults feature flag still controls access. + """ + class Plan(BaseModel): id: Literal["FREE", "HOBBYIST", "START_UP", "ENTERPRISE"] diff --git a/src/kernel/types/organization/org_limits.py b/src/kernel/types/organization/org_limits.py index bdc3cb4a..4e24a5f0 100644 --- a/src/kernel/types/organization/org_limits.py +++ b/src/kernel/types/organization/org_limits.py @@ -22,6 +22,12 @@ class OrgLimits(BaseModel): projects. """ + max_vaults: Optional[int] = None + """Maximum non-deleted vaults allowed org-wide across all projects. + + Null means unlimited. + """ + min_health_check_interval_seconds: int """ Smallest health_check_interval the organization's plan accepts on a managed auth @@ -29,6 +35,9 @@ class OrgLimits(BaseModel): stored below the floor are grandfathered until edited. """ + vaults_used: int + """Current non-deleted vault count across all projects in the organization.""" + default_project_max_concurrent_sessions: Optional[int] = None """ Default maximum concurrent browsers applied to every project that has no From 4d209c06783a2937d13b62ba33d1c42c24cfa2b9 Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:26:26 +0000 Subject: [PATCH 3/3] release: 0.101.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- src/kernel/_version.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 97d8dbba..aebbc8bc 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.100.0" + ".": "0.101.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a14e35a..1d78bde8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.101.0](https://github.com/kernel/kernel-python-sdk/compare/v0.100.0...v0.101.0) (2026-09-05) + + +### Features + +* Expose vault access in organization entitlements ([1c3b388](https://github.com/kernel/kernel-python-sdk/commit/1c3b388f1a4597f65ed3926a8ec2646f5e0fc994)) +* Limit free organizations to three vaults ([b0d5628](https://github.com/kernel/kernel-python-sdk/commit/b0d5628acbe0a9d9d006a3349ba1338fdc3d4402)) + ## [0.100.0](https://github.com/kernel/kernel-python-sdk/compare/v0.99.0...v0.100.0) (2026-09-04) diff --git a/pyproject.toml b/pyproject.toml index 84718a85..ce24d358 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kernel" -version = "0.100.0" +version = "0.101.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 2fba39cd..058933d0 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.100.0" # x-release-please-version +__version__ = "0.101.0" # x-release-please-version