From d6a1726d9806c8433ba7bc1612018bc84309147e Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 11:38:17 +0000
Subject: [PATCH 01/55] chore(ci): upgrade `actions/github-script`
---
.github/workflows/ci.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e4988ca..a4b89c4 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -63,7 +63,7 @@ jobs:
- name: Get GitHub OIDC Token
if: github.repository == 'stainless-sdks/gitpod-python'
id: github-oidc
- uses: actions/github-script@00f12e3e20659f42342b1c0226afda7f7c042325 # v6
+ uses: actions/github-script@v8
with:
script: core.setOutput('github_token', await core.getIDToken());
From 2777780d987da76ab00f131c243b1ee69e39c901 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 26 Jan 2026 05:26:40 +0000
Subject: [PATCH 02/55] feat: Introduce projects admin org role
---
src/gitpod/types/shared/resource_role.py | 1 +
src/gitpod/types/shared_params/resource_role.py | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/gitpod/types/shared/resource_role.py b/src/gitpod/types/shared/resource_role.py
index 33ecbb7..7672e1f 100644
--- a/src/gitpod/types/shared/resource_role.py
+++ b/src/gitpod/types/shared/resource_role.py
@@ -9,6 +9,7 @@
"RESOURCE_ROLE_ORG_ADMIN",
"RESOURCE_ROLE_ORG_MEMBER",
"RESOURCE_ROLE_ORG_RUNNERS_ADMIN",
+ "RESOURCE_ROLE_ORG_PROJECTS_ADMIN",
"RESOURCE_ROLE_GROUP_ADMIN",
"RESOURCE_ROLE_GROUP_VIEWER",
"RESOURCE_ROLE_USER_IDENTITY",
diff --git a/src/gitpod/types/shared_params/resource_role.py b/src/gitpod/types/shared_params/resource_role.py
index 053e954..8dcf94c 100644
--- a/src/gitpod/types/shared_params/resource_role.py
+++ b/src/gitpod/types/shared_params/resource_role.py
@@ -11,6 +11,7 @@
"RESOURCE_ROLE_ORG_ADMIN",
"RESOURCE_ROLE_ORG_MEMBER",
"RESOURCE_ROLE_ORG_RUNNERS_ADMIN",
+ "RESOURCE_ROLE_ORG_PROJECTS_ADMIN",
"RESOURCE_ROLE_GROUP_ADMIN",
"RESOURCE_ROLE_GROUP_VIEWER",
"RESOURCE_ROLE_USER_IDENTITY",
From 06fbc11922f9318531a825f017880a6ade58de57 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 26 Jan 2026 08:58:42 +0000
Subject: [PATCH 03/55] codegen metadata
From 5febe7711e4fdcce4b370f8a461387c5d1f60b76 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 26 Jan 2026 10:00:36 +0000
Subject: [PATCH 04/55] codegen metadata
From b292d8f4fb2520ba65bb6701ac8507b16f56080e Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 26 Jan 2026 10:57:03 +0000
Subject: [PATCH 05/55] feat(cli): add --name flag to environment create
command
---
.stats.yml | 4 +--
.../resources/environments/environments.py | 34 +++++++++++++++++--
.../environment_create_from_project_params.py | 7 ++++
src/gitpod/types/environment_create_params.py | 7 ++++
tests/api_resources/test_environments.py | 4 +++
5 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 886c83c..f8ba7d8 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 170
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-2423c089f280cdf34a987d40531692097a69f4aa971c6adf9aeec4fd7984cec2.yml
-openapi_spec_hash: 24037c3ab9ceca689150d07ecec7aa80
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-b43acdb0d7e591ca6dc119778dfc405afa6c4d5aeb43d06fc6aff9f941c552b6.yml
+openapi_spec_hash: f52b33b13c9efa8f5941d40dc6315e80
config_hash: d726afb2a92132197e4eae04303e8041
diff --git a/src/gitpod/resources/environments/environments.py b/src/gitpod/resources/environments/environments.py
index 6de9f76..3f5defc 100644
--- a/src/gitpod/resources/environments/environments.py
+++ b/src/gitpod/resources/environments/environments.py
@@ -91,6 +91,7 @@ def with_streaming_response(self) -> EnvironmentsResourceWithStreamingResponse:
def create(
self,
*,
+ name: Optional[str] | Omit = omit,
spec: EnvironmentSpecParam | 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.
@@ -164,6 +165,9 @@ def create(
```
Args:
+ name: name is a user-defined identifier for the environment. If not specified, the
+ system will generate a name.
+
spec: spec is the configuration of the environment that's required for the to start
the environment
@@ -177,7 +181,13 @@ def create(
"""
return self._post(
"/gitpod.v1.EnvironmentService/CreateEnvironment",
- body=maybe_transform({"spec": spec}, environment_create_params.EnvironmentCreateParams),
+ body=maybe_transform(
+ {
+ "name": name,
+ "spec": spec,
+ },
+ environment_create_params.EnvironmentCreateParams,
+ ),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -549,6 +559,7 @@ def create_environment_token(
def create_from_project(
self,
*,
+ name: Optional[str] | Omit = omit,
project_id: str | Omit = omit,
spec: EnvironmentSpecParam | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -591,6 +602,9 @@ def create_from_project(
```
Args:
+ name: name is a user-defined identifier for the environment. If not specified, the
+ system will generate a name.
+
spec: Spec is the configuration of the environment that's required for the runner to
start the environment Configuration already defined in the Project will override
parts of the spec, if set
@@ -607,6 +621,7 @@ def create_from_project(
"/gitpod.v1.EnvironmentService/CreateEnvironmentFromProject",
body=maybe_transform(
{
+ "name": name,
"project_id": project_id,
"spec": spec,
},
@@ -905,6 +920,7 @@ def with_streaming_response(self) -> AsyncEnvironmentsResourceWithStreamingRespo
async def create(
self,
*,
+ name: Optional[str] | Omit = omit,
spec: EnvironmentSpecParam | 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.
@@ -978,6 +994,9 @@ async def create(
```
Args:
+ name: name is a user-defined identifier for the environment. If not specified, the
+ system will generate a name.
+
spec: spec is the configuration of the environment that's required for the to start
the environment
@@ -991,7 +1010,13 @@ async def create(
"""
return await self._post(
"/gitpod.v1.EnvironmentService/CreateEnvironment",
- body=await async_maybe_transform({"spec": spec}, environment_create_params.EnvironmentCreateParams),
+ body=await async_maybe_transform(
+ {
+ "name": name,
+ "spec": spec,
+ },
+ environment_create_params.EnvironmentCreateParams,
+ ),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -1363,6 +1388,7 @@ async def create_environment_token(
async def create_from_project(
self,
*,
+ name: Optional[str] | Omit = omit,
project_id: str | Omit = omit,
spec: EnvironmentSpecParam | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -1405,6 +1431,9 @@ async def create_from_project(
```
Args:
+ name: name is a user-defined identifier for the environment. If not specified, the
+ system will generate a name.
+
spec: Spec is the configuration of the environment that's required for the runner to
start the environment Configuration already defined in the Project will override
parts of the spec, if set
@@ -1421,6 +1450,7 @@ async def create_from_project(
"/gitpod.v1.EnvironmentService/CreateEnvironmentFromProject",
body=await async_maybe_transform(
{
+ "name": name,
"project_id": project_id,
"spec": spec,
},
diff --git a/src/gitpod/types/environment_create_from_project_params.py b/src/gitpod/types/environment_create_from_project_params.py
index 2c9806f..4a26228 100644
--- a/src/gitpod/types/environment_create_from_project_params.py
+++ b/src/gitpod/types/environment_create_from_project_params.py
@@ -2,6 +2,7 @@
from __future__ import annotations
+from typing import Optional
from typing_extensions import Annotated, TypedDict
from .._utils import PropertyInfo
@@ -11,6 +12,12 @@
class EnvironmentCreateFromProjectParams(TypedDict, total=False):
+ name: Optional[str]
+ """
+ name is a user-defined identifier for the environment. If not specified, the
+ system will generate a name.
+ """
+
project_id: Annotated[str, PropertyInfo(alias="projectId")]
spec: EnvironmentSpecParam
diff --git a/src/gitpod/types/environment_create_params.py b/src/gitpod/types/environment_create_params.py
index e49a7d2..d5c55e8 100644
--- a/src/gitpod/types/environment_create_params.py
+++ b/src/gitpod/types/environment_create_params.py
@@ -2,6 +2,7 @@
from __future__ import annotations
+from typing import Optional
from typing_extensions import TypedDict
from .environment_spec_param import EnvironmentSpecParam
@@ -10,6 +11,12 @@
class EnvironmentCreateParams(TypedDict, total=False):
+ name: Optional[str]
+ """
+ name is a user-defined identifier for the environment. If not specified, the
+ system will generate a name.
+ """
+
spec: EnvironmentSpecParam
"""
spec is the configuration of the environment that's required for the to start
diff --git a/tests/api_resources/test_environments.py b/tests/api_resources/test_environments.py
index b2a37f6..c1e6442 100644
--- a/tests/api_resources/test_environments.py
+++ b/tests/api_resources/test_environments.py
@@ -36,6 +36,7 @@ def test_method_create(self, client: Gitpod) -> None:
@parametrize
def test_method_create_with_all_params(self, client: Gitpod) -> None:
environment = client.environments.create(
+ name="name",
spec={
"admission": "ADMISSION_LEVEL_UNSPECIFIED",
"automations_file": {
@@ -387,6 +388,7 @@ def test_method_create_from_project(self, client: Gitpod) -> None:
@parametrize
def test_method_create_from_project_with_all_params(self, client: Gitpod) -> None:
environment = client.environments.create_from_project(
+ name="name",
project_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
spec={
"admission": "ADMISSION_LEVEL_UNSPECIFIED",
@@ -692,6 +694,7 @@ async def test_method_create(self, async_client: AsyncGitpod) -> None:
@parametrize
async def test_method_create_with_all_params(self, async_client: AsyncGitpod) -> None:
environment = await async_client.environments.create(
+ name="name",
spec={
"admission": "ADMISSION_LEVEL_UNSPECIFIED",
"automations_file": {
@@ -1043,6 +1046,7 @@ async def test_method_create_from_project(self, async_client: AsyncGitpod) -> No
@parametrize
async def test_method_create_from_project_with_all_params(self, async_client: AsyncGitpod) -> None:
environment = await async_client.environments.create_from_project(
+ name="name",
project_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
spec={
"admission": "ADMISSION_LEVEL_UNSPECIFIED",
From d1573e5ce54ee383cf4828227fbb3aa54a0bcd51 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 26 Jan 2026 15:35:39 +0000
Subject: [PATCH 06/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index f8ba7d8..aff6e29 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 170
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-b43acdb0d7e591ca6dc119778dfc405afa6c4d5aeb43d06fc6aff9f941c552b6.yml
-openapi_spec_hash: f52b33b13c9efa8f5941d40dc6315e80
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-4e4b65aac5cad420f0090e1925de4d9c576b7cae6e839120963c94b5b245e335.yml
+openapi_spec_hash: ebc6921eaa311aaaff497646f16adf10
config_hash: d726afb2a92132197e4eae04303e8041
From 153d9babce677adb9cda8b900b078ed7d16879b7 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 27 Jan 2026 13:06:01 +0000
Subject: [PATCH 07/55] feat: [backend] Resource admin should be able to see
all resource shares
---
.stats.yml | 4 ++--
src/gitpod/types/groups/role_assignment_list_params.py | 8 ++++++++
tests/api_resources/groups/test_role_assignments.py | 2 ++
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index aff6e29..3400277 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 170
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-4e4b65aac5cad420f0090e1925de4d9c576b7cae6e839120963c94b5b245e335.yml
-openapi_spec_hash: ebc6921eaa311aaaff497646f16adf10
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-23f7678921f123913793223b36eb15c9f483ec734e49f2ba25f771dba409e781.yml
+openapi_spec_hash: cad5d5f46f759aea198ce46ba9c16aeb
config_hash: d726afb2a92132197e4eae04303e8041
diff --git a/src/gitpod/types/groups/role_assignment_list_params.py b/src/gitpod/types/groups/role_assignment_list_params.py
index 63b97bd..52ceaac 100644
--- a/src/gitpod/types/groups/role_assignment_list_params.py
+++ b/src/gitpod/types/groups/role_assignment_list_params.py
@@ -33,6 +33,14 @@ class Filter(TypedDict, total=False):
Empty string is allowed and means no filtering by group
"""
+ resource_id: Annotated[str, PropertyInfo(alias="resourceId")]
+ """
+ resource_id filters the response to only role assignments for this specific
+ resource When provided, users with :grant permission on the resource can see its
+ role assignments even if they don't belong to the assigned groups Empty string
+ is allowed and means no filtering by resource
+ """
+
resource_roles: Annotated[List[ResourceRole], PropertyInfo(alias="resourceRoles")]
"""
resource_roles filters the response to only role assignments with these specific
diff --git a/tests/api_resources/groups/test_role_assignments.py b/tests/api_resources/groups/test_role_assignments.py
index 2394082..a21be7e 100644
--- a/tests/api_resources/groups/test_role_assignments.py
+++ b/tests/api_resources/groups/test_role_assignments.py
@@ -74,6 +74,7 @@ def test_method_list_with_all_params(self, client: Gitpod) -> None:
page_size=0,
filter={
"group_id": "groupId",
+ "resource_id": "resourceId",
"resource_roles": ["RESOURCE_ROLE_UNSPECIFIED"],
"resource_types": ["RESOURCE_TYPE_RUNNER"],
"user_id": "userId",
@@ -202,6 +203,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncGitpod) -> N
page_size=0,
filter={
"group_id": "groupId",
+ "resource_id": "resourceId",
"resource_roles": ["RESOURCE_ROLE_UNSPECIFIED"],
"resource_types": ["RESOURCE_TYPE_RUNNER"],
"user_id": "userId",
From 4a87ef22bd88a83fb2eaa9255d9ae60bf8eee618 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 27 Jan 2026 18:22:47 +0000
Subject: [PATCH 08/55] feat(runner): add capability check for
ListSCMOrganizations
---
.stats.yml | 4 ++--
src/gitpod/types/runner_capability.py | 2 ++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 3400277..ea9440e 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 170
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-23f7678921f123913793223b36eb15c9f483ec734e49f2ba25f771dba409e781.yml
-openapi_spec_hash: cad5d5f46f759aea198ce46ba9c16aeb
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-f7bb80f4a382bf0cb03a48cd955c2f342cd4686874cb9f7b9ad93f92e2d18cd3.yml
+openapi_spec_hash: 2557264a73db1a756fc118125e0df2a9
config_hash: d726afb2a92132197e4eae04303e8041
diff --git a/src/gitpod/types/runner_capability.py b/src/gitpod/types/runner_capability.py
index 36bb1f9..be53db0 100644
--- a/src/gitpod/types/runner_capability.py
+++ b/src/gitpod/types/runner_capability.py
@@ -13,4 +13,6 @@
"RUNNER_CAPABILITY_DEFAULT_DEV_CONTAINER_IMAGE",
"RUNNER_CAPABILITY_ENVIRONMENT_SNAPSHOT",
"RUNNER_CAPABILITY_PREBUILDS_BEFORE_SNAPSHOT_TRIGGER",
+ "RUNNER_CAPABILITY_LIST_SCM_ORGANIZATIONS",
+ "RUNNER_CAPABILITY_CHECK_REPOSITORY_ACCESS",
]
From d335a9319756e5a47e9f6185b6759d1ba02301a2 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 11:49:24 +0000
Subject: [PATCH 09/55] codegen metadata
From 16049ed4392e5551137a0bf7930b0a8ebcaa7b5e Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 28 Jan 2026 11:35:03 +0000
Subject: [PATCH 10/55] feat: [SCIM] Configurable token expiration duration
---
.../organizations/scim_configurations.py | 78 +++++++++++++++++--
.../types/organizations/scim_configuration.py | 3 +
.../scim_configuration_create_params.py | 6 ++
.../scim_configuration_create_response.py | 5 ++
...m_configuration_regenerate_token_params.py | 7 ++
...configuration_regenerate_token_response.py | 7 ++
.../organizations/test_scim_configurations.py | 20 +++++
7 files changed, 120 insertions(+), 6 deletions(-)
diff --git a/src/gitpod/resources/organizations/scim_configurations.py b/src/gitpod/resources/organizations/scim_configurations.py
index 529ae16..6176c40 100644
--- a/src/gitpod/resources/organizations/scim_configurations.py
+++ b/src/gitpod/resources/organizations/scim_configurations.py
@@ -61,6 +61,7 @@ def create(
organization_id: str,
sso_configuration_id: str,
name: Optional[str] | Omit = omit,
+ token_expires_in: Optional[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,
@@ -81,13 +82,24 @@ def create(
- Create basic SCIM configuration:
- Creates a SCIM configuration linked to an SSO provider.
+ Creates a SCIM configuration linked to an SSO provider with default 1 year
+ token expiration.
```yaml
organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
ssoConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
```
+ - Create SCIM configuration with custom token expiration:
+
+ Creates a SCIM configuration with a 90-day token expiration.
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ ssoConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
+ tokenExpiresIn: "7776000s"
+ ```
+
Args:
organization_id: organization_id is the ID of the organization to create the SCIM configuration
for
@@ -97,6 +109,9 @@ def create(
name: name is a human-readable name for the SCIM configuration
+ token_expires_in: token_expires_in is the duration until the token expires. Defaults to 1 year.
+ Minimum 1 day, maximum 2 years.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -112,6 +127,7 @@ def create(
"organization_id": organization_id,
"sso_configuration_id": sso_configuration_id,
"name": name,
+ "token_expires_in": token_expires_in,
},
scim_configuration_create_params.ScimConfigurationCreateParams,
),
@@ -373,6 +389,7 @@ def regenerate_token(
self,
*,
scim_configuration_id: str,
+ token_expires_in: Optional[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,
@@ -393,16 +410,29 @@ def regenerate_token(
- Regenerate token:
- Creates a new bearer token, invalidating the old one.
+ Creates a new bearer token with the same expiration duration as the previous
+ token.
```yaml
scimConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
```
+ - Regenerate token with new expiration:
+
+ Creates a new bearer token with a custom 180-day expiration.
+
+ ```yaml
+ scimConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
+ tokenExpiresIn: "15552000s"
+ ```
+
Args:
scim_configuration_id: scim_configuration_id is the ID of the SCIM configuration to regenerate token
for
+ token_expires_in: token_expires_in is the duration until the new token expires. If not specified,
+ uses the same duration as the previous token.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -414,7 +444,10 @@ def regenerate_token(
return self._post(
"/gitpod.v1.OrganizationService/RegenerateSCIMToken",
body=maybe_transform(
- {"scim_configuration_id": scim_configuration_id},
+ {
+ "scim_configuration_id": scim_configuration_id,
+ "token_expires_in": token_expires_in,
+ },
scim_configuration_regenerate_token_params.ScimConfigurationRegenerateTokenParams,
),
options=make_request_options(
@@ -450,6 +483,7 @@ async def create(
organization_id: str,
sso_configuration_id: str,
name: Optional[str] | Omit = omit,
+ token_expires_in: Optional[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,
@@ -470,13 +504,24 @@ async def create(
- Create basic SCIM configuration:
- Creates a SCIM configuration linked to an SSO provider.
+ Creates a SCIM configuration linked to an SSO provider with default 1 year
+ token expiration.
```yaml
organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
ssoConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
```
+ - Create SCIM configuration with custom token expiration:
+
+ Creates a SCIM configuration with a 90-day token expiration.
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ ssoConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
+ tokenExpiresIn: "7776000s"
+ ```
+
Args:
organization_id: organization_id is the ID of the organization to create the SCIM configuration
for
@@ -486,6 +531,9 @@ async def create(
name: name is a human-readable name for the SCIM configuration
+ token_expires_in: token_expires_in is the duration until the token expires. Defaults to 1 year.
+ Minimum 1 day, maximum 2 years.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -501,6 +549,7 @@ async def create(
"organization_id": organization_id,
"sso_configuration_id": sso_configuration_id,
"name": name,
+ "token_expires_in": token_expires_in,
},
scim_configuration_create_params.ScimConfigurationCreateParams,
),
@@ -762,6 +811,7 @@ async def regenerate_token(
self,
*,
scim_configuration_id: str,
+ token_expires_in: Optional[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,
@@ -782,16 +832,29 @@ async def regenerate_token(
- Regenerate token:
- Creates a new bearer token, invalidating the old one.
+ Creates a new bearer token with the same expiration duration as the previous
+ token.
```yaml
scimConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
```
+ - Regenerate token with new expiration:
+
+ Creates a new bearer token with a custom 180-day expiration.
+
+ ```yaml
+ scimConfigurationId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
+ tokenExpiresIn: "15552000s"
+ ```
+
Args:
scim_configuration_id: scim_configuration_id is the ID of the SCIM configuration to regenerate token
for
+ token_expires_in: token_expires_in is the duration until the new token expires. If not specified,
+ uses the same duration as the previous token.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -803,7 +866,10 @@ async def regenerate_token(
return await self._post(
"/gitpod.v1.OrganizationService/RegenerateSCIMToken",
body=await async_maybe_transform(
- {"scim_configuration_id": scim_configuration_id},
+ {
+ "scim_configuration_id": scim_configuration_id,
+ "token_expires_in": token_expires_in,
+ },
scim_configuration_regenerate_token_params.ScimConfigurationRegenerateTokenParams,
),
options=make_request_options(
diff --git a/src/gitpod/types/organizations/scim_configuration.py b/src/gitpod/types/organizations/scim_configuration.py
index 289db0f..8b12ff0 100644
--- a/src/gitpod/types/organizations/scim_configuration.py
+++ b/src/gitpod/types/organizations/scim_configuration.py
@@ -24,6 +24,9 @@ class ScimConfiguration(BaseModel):
organization_id is the ID of the organization this SCIM configuration belongs to
"""
+ token_expires_at: datetime = FieldInfo(alias="tokenExpiresAt")
+ """token_expires_at is when the current SCIM token expires"""
+
updated_at: datetime = FieldInfo(alias="updatedAt")
"""updated_at is when the SCIM configuration was last updated"""
diff --git a/src/gitpod/types/organizations/scim_configuration_create_params.py b/src/gitpod/types/organizations/scim_configuration_create_params.py
index fae3380..e8f5a2e 100644
--- a/src/gitpod/types/organizations/scim_configuration_create_params.py
+++ b/src/gitpod/types/organizations/scim_configuration_create_params.py
@@ -25,3 +25,9 @@ class ScimConfigurationCreateParams(TypedDict, total=False):
name: Optional[str]
"""name is a human-readable name for the SCIM configuration"""
+
+ token_expires_in: Annotated[Optional[str], PropertyInfo(alias="tokenExpiresIn")]
+ """token_expires_in is the duration until the token expires. Defaults to 1 year.
+
+ Minimum 1 day, maximum 2 years.
+ """
diff --git a/src/gitpod/types/organizations/scim_configuration_create_response.py b/src/gitpod/types/organizations/scim_configuration_create_response.py
index 95ba89b..af94970 100644
--- a/src/gitpod/types/organizations/scim_configuration_create_response.py
+++ b/src/gitpod/types/organizations/scim_configuration_create_response.py
@@ -1,5 +1,7 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+from datetime import datetime
+
from pydantic import Field as FieldInfo
from ..._models import BaseModel
@@ -17,3 +19,6 @@ class ScimConfigurationCreateResponse(BaseModel):
scim_configuration: ScimConfiguration = FieldInfo(alias="scimConfiguration")
"""scim_configuration is the created SCIM configuration"""
+
+ token_expires_at: datetime = FieldInfo(alias="tokenExpiresAt")
+ """token_expires_at is when the token will expire"""
diff --git a/src/gitpod/types/organizations/scim_configuration_regenerate_token_params.py b/src/gitpod/types/organizations/scim_configuration_regenerate_token_params.py
index b6cedad..42dc805 100644
--- a/src/gitpod/types/organizations/scim_configuration_regenerate_token_params.py
+++ b/src/gitpod/types/organizations/scim_configuration_regenerate_token_params.py
@@ -2,6 +2,7 @@
from __future__ import annotations
+from typing import Optional
from typing_extensions import Required, Annotated, TypedDict
from ..._utils import PropertyInfo
@@ -15,3 +16,9 @@ class ScimConfigurationRegenerateTokenParams(TypedDict, total=False):
scim_configuration_id is the ID of the SCIM configuration to regenerate token
for
"""
+
+ token_expires_in: Annotated[Optional[str], PropertyInfo(alias="tokenExpiresIn")]
+ """
+ token_expires_in is the duration until the new token expires. If not specified,
+ uses the same duration as the previous token.
+ """
diff --git a/src/gitpod/types/organizations/scim_configuration_regenerate_token_response.py b/src/gitpod/types/organizations/scim_configuration_regenerate_token_response.py
index 0af03b1..16d79ab 100644
--- a/src/gitpod/types/organizations/scim_configuration_regenerate_token_response.py
+++ b/src/gitpod/types/organizations/scim_configuration_regenerate_token_response.py
@@ -1,5 +1,9 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+from datetime import datetime
+
+from pydantic import Field as FieldInfo
+
from ..._models import BaseModel
__all__ = ["ScimConfigurationRegenerateTokenResponse"]
@@ -11,3 +15,6 @@ class ScimConfigurationRegenerateTokenResponse(BaseModel):
token is the new bearer token for SCIM API authentication. This invalidates the
previous token - store it securely.
"""
+
+ token_expires_at: datetime = FieldInfo(alias="tokenExpiresAt")
+ """token_expires_at is when the new token will expire"""
diff --git a/tests/api_resources/organizations/test_scim_configurations.py b/tests/api_resources/organizations/test_scim_configurations.py
index 16c6e25..4404e23 100644
--- a/tests/api_resources/organizations/test_scim_configurations.py
+++ b/tests/api_resources/organizations/test_scim_configurations.py
@@ -40,6 +40,7 @@ def test_method_create_with_all_params(self, client: Gitpod) -> None:
organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
sso_configuration_id="d2c94c27-3b76-4a42-b88c-95a85e392c68",
name="name",
+ token_expires_in="+9125115.360s",
)
assert_matches_type(ScimConfigurationCreateResponse, scim_configuration, path=["response"])
@@ -233,6 +234,15 @@ def test_method_regenerate_token(self, client: Gitpod) -> None:
)
assert_matches_type(ScimConfigurationRegenerateTokenResponse, scim_configuration, path=["response"])
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_regenerate_token_with_all_params(self, client: Gitpod) -> None:
+ scim_configuration = client.organizations.scim_configurations.regenerate_token(
+ scim_configuration_id="d2c94c27-3b76-4a42-b88c-95a85e392c68",
+ token_expires_in="+9125115.360s",
+ )
+ assert_matches_type(ScimConfigurationRegenerateTokenResponse, scim_configuration, path=["response"])
+
@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
def test_raw_response_regenerate_token(self, client: Gitpod) -> None:
@@ -281,6 +291,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncGitpod) ->
organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
sso_configuration_id="d2c94c27-3b76-4a42-b88c-95a85e392c68",
name="name",
+ token_expires_in="+9125115.360s",
)
assert_matches_type(ScimConfigurationCreateResponse, scim_configuration, path=["response"])
@@ -474,6 +485,15 @@ async def test_method_regenerate_token(self, async_client: AsyncGitpod) -> None:
)
assert_matches_type(ScimConfigurationRegenerateTokenResponse, scim_configuration, path=["response"])
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_regenerate_token_with_all_params(self, async_client: AsyncGitpod) -> None:
+ scim_configuration = await async_client.organizations.scim_configurations.regenerate_token(
+ scim_configuration_id="d2c94c27-3b76-4a42-b88c-95a85e392c68",
+ token_expires_in="+9125115.360s",
+ )
+ assert_matches_type(ScimConfigurationRegenerateTokenResponse, scim_configuration, path=["response"])
+
@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
async def test_raw_response_regenerate_token(self, async_client: AsyncGitpod) -> None:
From 1cbdaaa69c1077d7d354991621af88f7e71e4df0 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 23 Jan 2026 05:11:12 +0000
Subject: [PATCH 11/55] feat(api): add announcement banner fields to
organization proto
---
.stats.yml | 8 +-
api.md | 17 +
.../resources/organizations/__init__.py | 14 +
.../organizations/announcement_banner.py | 342 ++++++++++++++++++
.../resources/organizations/organizations.py | 32 ++
src/gitpod/types/organizations/__init__.py | 5 +
.../organizations/announcement_banner.py | 20 +
.../announcement_banner_get_params.py | 14 +
.../announcement_banner_get_response.py | 11 +
.../announcement_banner_update_params.py | 24 ++
.../announcement_banner_update_response.py | 11 +
.../organizations/test_announcement_banner.py | 183 ++++++++++
12 files changed, 677 insertions(+), 4 deletions(-)
create mode 100644 src/gitpod/resources/organizations/announcement_banner.py
create mode 100644 src/gitpod/types/organizations/announcement_banner.py
create mode 100644 src/gitpod/types/organizations/announcement_banner_get_params.py
create mode 100644 src/gitpod/types/organizations/announcement_banner_get_response.py
create mode 100644 src/gitpod/types/organizations/announcement_banner_update_params.py
create mode 100644 src/gitpod/types/organizations/announcement_banner_update_response.py
create mode 100644 tests/api_resources/organizations/test_announcement_banner.py
diff --git a/.stats.yml b/.stats.yml
index ea9440e..eb5040a 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 170
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-f7bb80f4a382bf0cb03a48cd955c2f342cd4686874cb9f7b9ad93f92e2d18cd3.yml
-openapi_spec_hash: 2557264a73db1a756fc118125e0df2a9
-config_hash: d726afb2a92132197e4eae04303e8041
+configured_endpoints: 172
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-b1f3c630c150b9219800d95b3bb4df29bede775d34f46fc2eb3af34cb91110b5.yml
+openapi_spec_hash: 49ece69cbfc81e6172f62a7542b2541a
+config_hash: dad4ee53c894c682895d6d045c4c2105
diff --git a/api.md b/api.md
index 0b70b7b..57eff1c 100644
--- a/api.md
+++ b/api.md
@@ -365,6 +365,23 @@ Methods:
- client.organizations.list_members(\*\*params) -> SyncMembersPage[OrganizationMember]
- client.organizations.set_role(\*\*params) -> object
+## AnnouncementBanner
+
+Types:
+
+```python
+from gitpod.types.organizations import (
+ AnnouncementBanner,
+ AnnouncementBannerUpdateResponse,
+ AnnouncementBannerGetResponse,
+)
+```
+
+Methods:
+
+- client.organizations.announcement_banner.update(\*\*params) -> AnnouncementBannerUpdateResponse
+- client.organizations.announcement_banner.get(\*\*params) -> AnnouncementBannerGetResponse
+
## CustomDomains
Types:
diff --git a/src/gitpod/resources/organizations/__init__.py b/src/gitpod/resources/organizations/__init__.py
index 21debec..c0a5e79 100644
--- a/src/gitpod/resources/organizations/__init__.py
+++ b/src/gitpod/resources/organizations/__init__.py
@@ -40,6 +40,14 @@
SSOConfigurationsResourceWithStreamingResponse,
AsyncSSOConfigurationsResourceWithStreamingResponse,
)
+from .announcement_banner import (
+ AnnouncementBannerResource,
+ AsyncAnnouncementBannerResource,
+ AnnouncementBannerResourceWithRawResponse,
+ AsyncAnnouncementBannerResourceWithRawResponse,
+ AnnouncementBannerResourceWithStreamingResponse,
+ AsyncAnnouncementBannerResourceWithStreamingResponse,
+)
from .scim_configurations import (
ScimConfigurationsResource,
AsyncScimConfigurationsResource,
@@ -58,6 +66,12 @@
)
__all__ = [
+ "AnnouncementBannerResource",
+ "AsyncAnnouncementBannerResource",
+ "AnnouncementBannerResourceWithRawResponse",
+ "AsyncAnnouncementBannerResourceWithRawResponse",
+ "AnnouncementBannerResourceWithStreamingResponse",
+ "AsyncAnnouncementBannerResourceWithStreamingResponse",
"CustomDomainsResource",
"AsyncCustomDomainsResource",
"CustomDomainsResourceWithRawResponse",
diff --git a/src/gitpod/resources/organizations/announcement_banner.py b/src/gitpod/resources/organizations/announcement_banner.py
new file mode 100644
index 0000000..e8ab3a9
--- /dev/null
+++ b/src/gitpod/resources/organizations/announcement_banner.py
@@ -0,0 +1,342 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+
+import httpx
+
+from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from ..._utils import maybe_transform, async_maybe_transform
+from ..._compat import cached_property
+from ..._resource import SyncAPIResource, AsyncAPIResource
+from ..._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from ..._base_client import make_request_options
+from ...types.organizations import announcement_banner_get_params, announcement_banner_update_params
+from ...types.organizations.announcement_banner_get_response import AnnouncementBannerGetResponse
+from ...types.organizations.announcement_banner_update_response import AnnouncementBannerUpdateResponse
+
+__all__ = ["AnnouncementBannerResource", "AsyncAnnouncementBannerResource"]
+
+
+class AnnouncementBannerResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AnnouncementBannerResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/gitpod-io/gitpod-sdk-python#accessing-raw-response-data-eg-headers
+ """
+ return AnnouncementBannerResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AnnouncementBannerResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/gitpod-io/gitpod-sdk-python#with_streaming_response
+ """
+ return AnnouncementBannerResourceWithStreamingResponse(self)
+
+ def update(
+ self,
+ *,
+ organization_id: str,
+ enabled: Optional[bool] | Omit = omit,
+ message: Optional[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,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AnnouncementBannerUpdateResponse:
+ """
+ Updates the announcement banner configuration for an organization.
+
+ Use this method to configure the announcement banner displayed to all users.
+ Only organization admins can update the banner. Requires Enterprise tier.
+
+ ### Examples
+
+ - Enable announcement banner:
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ message: "Scheduled maintenance on Saturday 10pm-2am UTC"
+ enabled: true
+ ```
+
+ - Disable announcement banner:
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ enabled: false
+ ```
+
+ Args:
+ organization_id: organization_id is the ID of the organization
+
+ enabled: enabled controls whether the banner is displayed
+
+ message: message is the banner message. Supports basic Markdown. Maximum 1000 characters.
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._post(
+ "/gitpod.v1.OrganizationService/UpdateAnnouncementBanner",
+ body=maybe_transform(
+ {
+ "organization_id": organization_id,
+ "enabled": enabled,
+ "message": message,
+ },
+ announcement_banner_update_params.AnnouncementBannerUpdateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AnnouncementBannerUpdateResponse,
+ )
+
+ def get(
+ self,
+ *,
+ organization_id: str,
+ # 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,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AnnouncementBannerGetResponse:
+ """
+ Retrieves the announcement banner configuration for an organization.
+
+ Use this method to fetch the current announcement banner settings. All
+ organization members can read the banner configuration.
+
+ ### Examples
+
+ - Get announcement banner:
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ ```
+
+ Args:
+ organization_id: organization_id is the ID of the organization
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._post(
+ "/gitpod.v1.OrganizationService/GetAnnouncementBanner",
+ body=maybe_transform(
+ {"organization_id": organization_id}, announcement_banner_get_params.AnnouncementBannerGetParams
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AnnouncementBannerGetResponse,
+ )
+
+
+class AsyncAnnouncementBannerResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncAnnouncementBannerResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/gitpod-io/gitpod-sdk-python#accessing-raw-response-data-eg-headers
+ """
+ return AsyncAnnouncementBannerResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncAnnouncementBannerResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/gitpod-io/gitpod-sdk-python#with_streaming_response
+ """
+ return AsyncAnnouncementBannerResourceWithStreamingResponse(self)
+
+ async def update(
+ self,
+ *,
+ organization_id: str,
+ enabled: Optional[bool] | Omit = omit,
+ message: Optional[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,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AnnouncementBannerUpdateResponse:
+ """
+ Updates the announcement banner configuration for an organization.
+
+ Use this method to configure the announcement banner displayed to all users.
+ Only organization admins can update the banner. Requires Enterprise tier.
+
+ ### Examples
+
+ - Enable announcement banner:
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ message: "Scheduled maintenance on Saturday 10pm-2am UTC"
+ enabled: true
+ ```
+
+ - Disable announcement banner:
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ enabled: false
+ ```
+
+ Args:
+ organization_id: organization_id is the ID of the organization
+
+ enabled: enabled controls whether the banner is displayed
+
+ message: message is the banner message. Supports basic Markdown. Maximum 1000 characters.
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._post(
+ "/gitpod.v1.OrganizationService/UpdateAnnouncementBanner",
+ body=await async_maybe_transform(
+ {
+ "organization_id": organization_id,
+ "enabled": enabled,
+ "message": message,
+ },
+ announcement_banner_update_params.AnnouncementBannerUpdateParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AnnouncementBannerUpdateResponse,
+ )
+
+ async def get(
+ self,
+ *,
+ organization_id: str,
+ # 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,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AnnouncementBannerGetResponse:
+ """
+ Retrieves the announcement banner configuration for an organization.
+
+ Use this method to fetch the current announcement banner settings. All
+ organization members can read the banner configuration.
+
+ ### Examples
+
+ - Get announcement banner:
+
+ ```yaml
+ organizationId: "b0e12f6c-4c67-429d-a4a6-d9838b5da047"
+ ```
+
+ Args:
+ organization_id: organization_id is the ID of the organization
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._post(
+ "/gitpod.v1.OrganizationService/GetAnnouncementBanner",
+ body=await async_maybe_transform(
+ {"organization_id": organization_id}, announcement_banner_get_params.AnnouncementBannerGetParams
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AnnouncementBannerGetResponse,
+ )
+
+
+class AnnouncementBannerResourceWithRawResponse:
+ def __init__(self, announcement_banner: AnnouncementBannerResource) -> None:
+ self._announcement_banner = announcement_banner
+
+ self.update = to_raw_response_wrapper(
+ announcement_banner.update,
+ )
+ self.get = to_raw_response_wrapper(
+ announcement_banner.get,
+ )
+
+
+class AsyncAnnouncementBannerResourceWithRawResponse:
+ def __init__(self, announcement_banner: AsyncAnnouncementBannerResource) -> None:
+ self._announcement_banner = announcement_banner
+
+ self.update = async_to_raw_response_wrapper(
+ announcement_banner.update,
+ )
+ self.get = async_to_raw_response_wrapper(
+ announcement_banner.get,
+ )
+
+
+class AnnouncementBannerResourceWithStreamingResponse:
+ def __init__(self, announcement_banner: AnnouncementBannerResource) -> None:
+ self._announcement_banner = announcement_banner
+
+ self.update = to_streamed_response_wrapper(
+ announcement_banner.update,
+ )
+ self.get = to_streamed_response_wrapper(
+ announcement_banner.get,
+ )
+
+
+class AsyncAnnouncementBannerResourceWithStreamingResponse:
+ def __init__(self, announcement_banner: AsyncAnnouncementBannerResource) -> None:
+ self._announcement_banner = announcement_banner
+
+ self.update = async_to_streamed_response_wrapper(
+ announcement_banner.update,
+ )
+ self.get = async_to_streamed_response_wrapper(
+ announcement_banner.get,
+ )
diff --git a/src/gitpod/resources/organizations/organizations.py b/src/gitpod/resources/organizations/organizations.py
index c45b8a5..d1a9f66 100644
--- a/src/gitpod/resources/organizations/organizations.py
+++ b/src/gitpod/resources/organizations/organizations.py
@@ -60,6 +60,14 @@
SSOConfigurationsResourceWithStreamingResponse,
AsyncSSOConfigurationsResourceWithStreamingResponse,
)
+from .announcement_banner import (
+ AnnouncementBannerResource,
+ AsyncAnnouncementBannerResource,
+ AnnouncementBannerResourceWithRawResponse,
+ AsyncAnnouncementBannerResourceWithRawResponse,
+ AnnouncementBannerResourceWithStreamingResponse,
+ AsyncAnnouncementBannerResourceWithStreamingResponse,
+)
from .scim_configurations import (
ScimConfigurationsResource,
AsyncScimConfigurationsResource,
@@ -88,6 +96,10 @@
class OrganizationsResource(SyncAPIResource):
+ @cached_property
+ def announcement_banner(self) -> AnnouncementBannerResource:
+ return AnnouncementBannerResource(self._client)
+
@cached_property
def custom_domains(self) -> CustomDomainsResource:
return CustomDomainsResource(self._client)
@@ -678,6 +690,10 @@ def set_role(
class AsyncOrganizationsResource(AsyncAPIResource):
+ @cached_property
+ def announcement_banner(self) -> AsyncAnnouncementBannerResource:
+ return AsyncAnnouncementBannerResource(self._client)
+
@cached_property
def custom_domains(self) -> AsyncCustomDomainsResource:
return AsyncCustomDomainsResource(self._client)
@@ -1296,6 +1312,10 @@ def __init__(self, organizations: OrganizationsResource) -> None:
organizations.set_role,
)
+ @cached_property
+ def announcement_banner(self) -> AnnouncementBannerResourceWithRawResponse:
+ return AnnouncementBannerResourceWithRawResponse(self._organizations.announcement_banner)
+
@cached_property
def custom_domains(self) -> CustomDomainsResourceWithRawResponse:
return CustomDomainsResourceWithRawResponse(self._organizations.custom_domains)
@@ -1350,6 +1370,10 @@ def __init__(self, organizations: AsyncOrganizationsResource) -> None:
organizations.set_role,
)
+ @cached_property
+ def announcement_banner(self) -> AsyncAnnouncementBannerResourceWithRawResponse:
+ return AsyncAnnouncementBannerResourceWithRawResponse(self._organizations.announcement_banner)
+
@cached_property
def custom_domains(self) -> AsyncCustomDomainsResourceWithRawResponse:
return AsyncCustomDomainsResourceWithRawResponse(self._organizations.custom_domains)
@@ -1404,6 +1428,10 @@ def __init__(self, organizations: OrganizationsResource) -> None:
organizations.set_role,
)
+ @cached_property
+ def announcement_banner(self) -> AnnouncementBannerResourceWithStreamingResponse:
+ return AnnouncementBannerResourceWithStreamingResponse(self._organizations.announcement_banner)
+
@cached_property
def custom_domains(self) -> CustomDomainsResourceWithStreamingResponse:
return CustomDomainsResourceWithStreamingResponse(self._organizations.custom_domains)
@@ -1458,6 +1486,10 @@ def __init__(self, organizations: AsyncOrganizationsResource) -> None:
organizations.set_role,
)
+ @cached_property
+ def announcement_banner(self) -> AsyncAnnouncementBannerResourceWithStreamingResponse:
+ return AsyncAnnouncementBannerResourceWithStreamingResponse(self._organizations.announcement_banner)
+
@cached_property
def custom_domains(self) -> AsyncCustomDomainsResourceWithStreamingResponse:
return AsyncCustomDomainsResourceWithStreamingResponse(self._organizations.custom_domains)
diff --git a/src/gitpod/types/organizations/__init__.py b/src/gitpod/types/organizations/__init__.py
index 60c60eb..a0d0c8f 100644
--- a/src/gitpod/types/organizations/__init__.py
+++ b/src/gitpod/types/organizations/__init__.py
@@ -7,6 +7,7 @@
from .provider_type import ProviderType as ProviderType
from .sso_configuration import SSOConfiguration as SSOConfiguration
from .scim_configuration import ScimConfiguration as ScimConfiguration
+from .announcement_banner import AnnouncementBanner as AnnouncementBanner
from .crowd_strike_config import CrowdStrikeConfig as CrowdStrikeConfig
from .domain_verification import DomainVerification as DomainVerification
from .organization_invite import OrganizationInvite as OrganizationInvite
@@ -31,15 +32,18 @@
from .custom_domain_retrieve_params import CustomDomainRetrieveParams as CustomDomainRetrieveParams
from .custom_domain_update_response import CustomDomainUpdateResponse as CustomDomainUpdateResponse
from .sso_configuration_list_params import SSOConfigurationListParams as SSOConfigurationListParams
+from .announcement_banner_get_params import AnnouncementBannerGetParams as AnnouncementBannerGetParams
from .scim_configuration_list_params import ScimConfigurationListParams as ScimConfigurationListParams
from .custom_domain_retrieve_response import CustomDomainRetrieveResponse as CustomDomainRetrieveResponse
from .domain_verification_list_params import DomainVerificationListParams as DomainVerificationListParams
from .sso_configuration_create_params import SSOConfigurationCreateParams as SSOConfigurationCreateParams
from .sso_configuration_delete_params import SSOConfigurationDeleteParams as SSOConfigurationDeleteParams
from .sso_configuration_update_params import SSOConfigurationUpdateParams as SSOConfigurationUpdateParams
+from .announcement_banner_get_response import AnnouncementBannerGetResponse as AnnouncementBannerGetResponse
from .scim_configuration_create_params import ScimConfigurationCreateParams as ScimConfigurationCreateParams
from .scim_configuration_delete_params import ScimConfigurationDeleteParams as ScimConfigurationDeleteParams
from .scim_configuration_update_params import ScimConfigurationUpdateParams as ScimConfigurationUpdateParams
+from .announcement_banner_update_params import AnnouncementBannerUpdateParams as AnnouncementBannerUpdateParams
from .domain_verification_create_params import DomainVerificationCreateParams as DomainVerificationCreateParams
from .domain_verification_delete_params import DomainVerificationDeleteParams as DomainVerificationDeleteParams
from .domain_verification_verify_params import DomainVerificationVerifyParams as DomainVerificationVerifyParams
@@ -48,6 +52,7 @@
from .scim_configuration_create_response import ScimConfigurationCreateResponse as ScimConfigurationCreateResponse
from .scim_configuration_retrieve_params import ScimConfigurationRetrieveParams as ScimConfigurationRetrieveParams
from .scim_configuration_update_response import ScimConfigurationUpdateResponse as ScimConfigurationUpdateResponse
+from .announcement_banner_update_response import AnnouncementBannerUpdateResponse as AnnouncementBannerUpdateResponse
from .domain_verification_create_response import DomainVerificationCreateResponse as DomainVerificationCreateResponse
from .domain_verification_retrieve_params import DomainVerificationRetrieveParams as DomainVerificationRetrieveParams
from .domain_verification_verify_response import DomainVerificationVerifyResponse as DomainVerificationVerifyResponse
diff --git a/src/gitpod/types/organizations/announcement_banner.py b/src/gitpod/types/organizations/announcement_banner.py
new file mode 100644
index 0000000..299540a
--- /dev/null
+++ b/src/gitpod/types/organizations/announcement_banner.py
@@ -0,0 +1,20 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+
+from pydantic import Field as FieldInfo
+
+from ..._models import BaseModel
+
+__all__ = ["AnnouncementBanner"]
+
+
+class AnnouncementBanner(BaseModel):
+ organization_id: str = FieldInfo(alias="organizationId")
+ """organization_id is the ID of the organization"""
+
+ enabled: Optional[bool] = None
+ """enabled controls whether the banner is displayed"""
+
+ message: Optional[str] = None
+ """message is the banner message displayed to users. Supports basic Markdown."""
diff --git a/src/gitpod/types/organizations/announcement_banner_get_params.py b/src/gitpod/types/organizations/announcement_banner_get_params.py
new file mode 100644
index 0000000..59c75b8
--- /dev/null
+++ b/src/gitpod/types/organizations/announcement_banner_get_params.py
@@ -0,0 +1,14 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Required, Annotated, TypedDict
+
+from ..._utils import PropertyInfo
+
+__all__ = ["AnnouncementBannerGetParams"]
+
+
+class AnnouncementBannerGetParams(TypedDict, total=False):
+ organization_id: Required[Annotated[str, PropertyInfo(alias="organizationId")]]
+ """organization_id is the ID of the organization"""
diff --git a/src/gitpod/types/organizations/announcement_banner_get_response.py b/src/gitpod/types/organizations/announcement_banner_get_response.py
new file mode 100644
index 0000000..da43240
--- /dev/null
+++ b/src/gitpod/types/organizations/announcement_banner_get_response.py
@@ -0,0 +1,11 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from ..._models import BaseModel
+from .announcement_banner import AnnouncementBanner
+
+__all__ = ["AnnouncementBannerGetResponse"]
+
+
+class AnnouncementBannerGetResponse(BaseModel):
+ banner: AnnouncementBanner
+ """banner is the announcement banner configuration"""
diff --git a/src/gitpod/types/organizations/announcement_banner_update_params.py b/src/gitpod/types/organizations/announcement_banner_update_params.py
new file mode 100644
index 0000000..7dfe53f
--- /dev/null
+++ b/src/gitpod/types/organizations/announcement_banner_update_params.py
@@ -0,0 +1,24 @@
+# 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 Required, Annotated, TypedDict
+
+from ..._utils import PropertyInfo
+
+__all__ = ["AnnouncementBannerUpdateParams"]
+
+
+class AnnouncementBannerUpdateParams(TypedDict, total=False):
+ organization_id: Required[Annotated[str, PropertyInfo(alias="organizationId")]]
+ """organization_id is the ID of the organization"""
+
+ enabled: Optional[bool]
+ """enabled controls whether the banner is displayed"""
+
+ message: Optional[str]
+ """message is the banner message.
+
+ Supports basic Markdown. Maximum 1000 characters.
+ """
diff --git a/src/gitpod/types/organizations/announcement_banner_update_response.py b/src/gitpod/types/organizations/announcement_banner_update_response.py
new file mode 100644
index 0000000..d470189
--- /dev/null
+++ b/src/gitpod/types/organizations/announcement_banner_update_response.py
@@ -0,0 +1,11 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from ..._models import BaseModel
+from .announcement_banner import AnnouncementBanner
+
+__all__ = ["AnnouncementBannerUpdateResponse"]
+
+
+class AnnouncementBannerUpdateResponse(BaseModel):
+ banner: AnnouncementBanner
+ """banner is the updated announcement banner configuration"""
diff --git a/tests/api_resources/organizations/test_announcement_banner.py b/tests/api_resources/organizations/test_announcement_banner.py
new file mode 100644
index 0000000..2e1c5b8
--- /dev/null
+++ b/tests/api_resources/organizations/test_announcement_banner.py
@@ -0,0 +1,183 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from gitpod import Gitpod, AsyncGitpod
+from tests.utils import assert_matches_type
+from gitpod.types.organizations import (
+ AnnouncementBannerGetResponse,
+ AnnouncementBannerUpdateResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestAnnouncementBanner:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_update(self, client: Gitpod) -> None:
+ announcement_banner = client.organizations.announcement_banner.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_update_with_all_params(self, client: Gitpod) -> None:
+ announcement_banner = client.organizations.announcement_banner.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ enabled=False,
+ message="message",
+ )
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_update(self, client: Gitpod) -> None:
+ response = client.organizations.announcement_banner.with_raw_response.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ announcement_banner = response.parse()
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_update(self, client: Gitpod) -> None:
+ with client.organizations.announcement_banner.with_streaming_response.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ announcement_banner = response.parse()
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_get(self, client: Gitpod) -> None:
+ announcement_banner = client.organizations.announcement_banner.get(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+ assert_matches_type(AnnouncementBannerGetResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_get(self, client: Gitpod) -> None:
+ response = client.organizations.announcement_banner.with_raw_response.get(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ announcement_banner = response.parse()
+ assert_matches_type(AnnouncementBannerGetResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_get(self, client: Gitpod) -> None:
+ with client.organizations.announcement_banner.with_streaming_response.get(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ announcement_banner = response.parse()
+ assert_matches_type(AnnouncementBannerGetResponse, announcement_banner, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncAnnouncementBanner:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_update(self, async_client: AsyncGitpod) -> None:
+ announcement_banner = await async_client.organizations.announcement_banner.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_update_with_all_params(self, async_client: AsyncGitpod) -> None:
+ announcement_banner = await async_client.organizations.announcement_banner.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ enabled=False,
+ message="message",
+ )
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_update(self, async_client: AsyncGitpod) -> None:
+ response = await async_client.organizations.announcement_banner.with_raw_response.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ announcement_banner = await response.parse()
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_update(self, async_client: AsyncGitpod) -> None:
+ async with async_client.organizations.announcement_banner.with_streaming_response.update(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ announcement_banner = await response.parse()
+ assert_matches_type(AnnouncementBannerUpdateResponse, announcement_banner, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_get(self, async_client: AsyncGitpod) -> None:
+ announcement_banner = await async_client.organizations.announcement_banner.get(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+ assert_matches_type(AnnouncementBannerGetResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_get(self, async_client: AsyncGitpod) -> None:
+ response = await async_client.organizations.announcement_banner.with_raw_response.get(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ announcement_banner = await response.parse()
+ assert_matches_type(AnnouncementBannerGetResponse, announcement_banner, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_get(self, async_client: AsyncGitpod) -> None:
+ async with async_client.organizations.announcement_banner.with_streaming_response.get(
+ organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ announcement_banner = await response.parse()
+ assert_matches_type(AnnouncementBannerGetResponse, announcement_banner, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
From 6482c1a4b50742622a90815484c6b59020d196f6 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 23 Jan 2026 10:54:17 +0000
Subject: [PATCH 12/55] feat(api): implement GetAnnouncementBanner and
UpdateAnnouncementBanner handlers
---
.stats.yml | 4 ++--
src/gitpod/types/shared/resource_type.py | 1 +
src/gitpod/types/shared_params/resource_type.py | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index eb5040a..ac19f87 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-b1f3c630c150b9219800d95b3bb4df29bede775d34f46fc2eb3af34cb91110b5.yml
-openapi_spec_hash: 49ece69cbfc81e6172f62a7542b2541a
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-7a8e71d8c69a12f718bf1357225cab2970088b6b35f2980569ae4f459cb235a3.yml
+openapi_spec_hash: 5bc62dbddf307449c2ae1f43503725fd
config_hash: dad4ee53c894c682895d6d045c4c2105
diff --git a/src/gitpod/types/shared/resource_type.py b/src/gitpod/types/shared/resource_type.py
index 599108b..dd44b4e 100644
--- a/src/gitpod/types/shared/resource_type.py
+++ b/src/gitpod/types/shared/resource_type.py
@@ -50,4 +50,5 @@
"RESOURCE_TYPE_WEBHOOK",
"RESOURCE_TYPE_SCIM_CONFIGURATION",
"RESOURCE_TYPE_SERVICE_ACCOUNT_SECRET",
+ "RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
]
diff --git a/src/gitpod/types/shared_params/resource_type.py b/src/gitpod/types/shared_params/resource_type.py
index 9d489e4..6b260e8 100644
--- a/src/gitpod/types/shared_params/resource_type.py
+++ b/src/gitpod/types/shared_params/resource_type.py
@@ -52,4 +52,5 @@
"RESOURCE_TYPE_WEBHOOK",
"RESOURCE_TYPE_SCIM_CONFIGURATION",
"RESOURCE_TYPE_SERVICE_ACCOUNT_SECRET",
+ "RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
]
From 4bc3f9f92f2de35c0cb1427df1af602014856000 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 23 Jan 2026 10:56:14 +0000
Subject: [PATCH 13/55] feat(api): add filters to ListPrebuilds for inventory
page
---
.stats.yml | 4 ++--
src/gitpod/types/prebuild_list_params.py | 10 ++++++++++
tests/api_resources/test_prebuilds.py | 6 ++++++
3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index ac19f87..7817249 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-7a8e71d8c69a12f718bf1357225cab2970088b6b35f2980569ae4f459cb235a3.yml
-openapi_spec_hash: 5bc62dbddf307449c2ae1f43503725fd
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-37c2e5cd0ac1442c376f5744c957f93ef39c3baf64b5443b99296a937f79889b.yml
+openapi_spec_hash: e4e981e4d61a227ca326eb776e81c6d0
config_hash: dad4ee53c894c682895d6d045c4c2105
diff --git a/src/gitpod/types/prebuild_list_params.py b/src/gitpod/types/prebuild_list_params.py
index 5907535..6893140 100644
--- a/src/gitpod/types/prebuild_list_params.py
+++ b/src/gitpod/types/prebuild_list_params.py
@@ -8,6 +8,7 @@
from .._types import SequenceNotStr
from .._utils import PropertyInfo
from .prebuild_phase import PrebuildPhase
+from .prebuild_trigger import PrebuildTrigger
__all__ = ["PrebuildListParams", "Filter", "Pagination"]
@@ -27,12 +28,21 @@ class PrebuildListParams(TypedDict, total=False):
class Filter(TypedDict, total=False):
"""filter contains the filter options for listing prebuilds"""
+ creator_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="creatorIds")]
+ """creator_ids filters prebuilds by who created them"""
+
+ executor_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="executorIds")]
+ """executor_ids filters prebuilds by whose credentials were used to run them"""
+
phases: List[PrebuildPhase]
"""phases filters prebuilds by their current phase"""
project_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="projectIds")]
"""project_ids filters prebuilds to specific projects"""
+ triggered_by: Annotated[List[PrebuildTrigger], PropertyInfo(alias="triggeredBy")]
+ """triggered_by filters prebuilds by how they were triggered"""
+
class Pagination(TypedDict, total=False):
"""pagination contains the pagination options for listing prebuilds"""
diff --git a/tests/api_resources/test_prebuilds.py b/tests/api_resources/test_prebuilds.py
index 258dcef..8d1518e 100644
--- a/tests/api_resources/test_prebuilds.py
+++ b/tests/api_resources/test_prebuilds.py
@@ -122,8 +122,11 @@ def test_method_list_with_all_params(self, client: Gitpod) -> None:
token="token",
page_size=0,
filter={
+ "creator_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
+ "executor_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
"phases": ["PREBUILD_PHASE_UNSPECIFIED"],
"project_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
+ "triggered_by": ["PREBUILD_TRIGGER_UNSPECIFIED"],
},
pagination={
"token": "token",
@@ -360,8 +363,11 @@ async def test_method_list_with_all_params(self, async_client: AsyncGitpod) -> N
token="token",
page_size=0,
filter={
+ "creator_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
+ "executor_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
"phases": ["PREBUILD_PHASE_UNSPECIFIED"],
"project_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
+ "triggered_by": ["PREBUILD_TRIGGER_UNSPECIFIED"],
},
pagination={
"token": "token",
From 71eb2b62d685a409abe4a27129e0408758bc735f Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 13:01:20 +0000
Subject: [PATCH 14/55] feat: [SCIM] Configurable token expiration duration
From b6e8d28b9e01a85ea0a0656a494a0ca05abe8ee0 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 28 Jan 2026 13:28:11 +0000
Subject: [PATCH 15/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 7817249..277e7b1 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-37c2e5cd0ac1442c376f5744c957f93ef39c3baf64b5443b99296a937f79889b.yml
-openapi_spec_hash: e4e981e4d61a227ca326eb776e81c6d0
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-95efb8e364af30d5c9a4972eb6d834df95697b08917ada62478aa37086f51e57.yml
+openapi_spec_hash: 114d42f049c4bb734d3c2a923c603895
config_hash: dad4ee53c894c682895d6d045c4c2105
From 688cf2e01a33ca12de9443d3857360d4223fa0f8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 13:03:32 +0000
Subject: [PATCH 16/55] feat(db): add service_account_tokens table
---
.stats.yml | 6 +++---
src/gitpod/types/shared/resource_type.py | 1 +
src/gitpod/types/shared_params/resource_type.py | 1 +
3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 277e7b1..2557016 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-95efb8e364af30d5c9a4972eb6d834df95697b08917ada62478aa37086f51e57.yml
-openapi_spec_hash: 114d42f049c4bb734d3c2a923c603895
-config_hash: dad4ee53c894c682895d6d045c4c2105
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-888178c57cb0f9d7aede8f3fc5ec24bd62f619b728f00716f352b3b5a2fa306d.yml
+openapi_spec_hash: 701f004e9dcb6dd3472d8468a789c338
+config_hash: 8758ac1f8d8913bd960a98b4f05d6391
diff --git a/src/gitpod/types/shared/resource_type.py b/src/gitpod/types/shared/resource_type.py
index dd44b4e..aca1888 100644
--- a/src/gitpod/types/shared/resource_type.py
+++ b/src/gitpod/types/shared/resource_type.py
@@ -51,4 +51,5 @@
"RESOURCE_TYPE_SCIM_CONFIGURATION",
"RESOURCE_TYPE_SERVICE_ACCOUNT_SECRET",
"RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
+ "RESOURCE_TYPE_SERVICE_ACCOUNT_TOKEN",
]
diff --git a/src/gitpod/types/shared_params/resource_type.py b/src/gitpod/types/shared_params/resource_type.py
index 6b260e8..b5036ff 100644
--- a/src/gitpod/types/shared_params/resource_type.py
+++ b/src/gitpod/types/shared_params/resource_type.py
@@ -53,4 +53,5 @@
"RESOURCE_TYPE_SCIM_CONFIGURATION",
"RESOURCE_TYPE_SERVICE_ACCOUNT_SECRET",
"RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
+ "RESOURCE_TYPE_SERVICE_ACCOUNT_TOKEN",
]
From f7b7cb37e2349ef60d26890c1a4cc72db34b32f8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 28 Jan 2026 17:07:12 +0000
Subject: [PATCH 17/55] feat(chat): add Pylon identity verification for chat
widget
---
.stats.yml | 8 +-
api.md | 2 +
src/gitpod/resources/accounts.py | 118 ++++++++++++++++++
src/gitpod/types/__init__.py | 6 +
.../account_get_chat_identity_token_params.py | 11 ++
...ccount_get_chat_identity_token_response.py | 15 +++
tests/api_resources/test_accounts.py | 73 +++++++++++
7 files changed, 229 insertions(+), 4 deletions(-)
create mode 100644 src/gitpod/types/account_get_chat_identity_token_params.py
create mode 100644 src/gitpod/types/account_get_chat_identity_token_response.py
diff --git a/.stats.yml b/.stats.yml
index 2557016..1f25476 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-888178c57cb0f9d7aede8f3fc5ec24bd62f619b728f00716f352b3b5a2fa306d.yml
-openapi_spec_hash: 701f004e9dcb6dd3472d8468a789c338
-config_hash: 8758ac1f8d8913bd960a98b4f05d6391
+configured_endpoints: 173
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-51c0e9db3fb9e3aadf35fb4fcf76107a2fcd9da1b8ff6cd593c1ae23d1a24bc3.yml
+openapi_spec_hash: db222df8620e2270763bef95ff247445
+config_hash: 2fa5dd58c6ab4dd15de320fa0f85dde8
diff --git a/api.md b/api.md
index 57eff1c..a7861fc 100644
--- a/api.md
+++ b/api.md
@@ -42,6 +42,7 @@ from gitpod.types import (
JoinableOrganization,
LoginProvider,
AccountRetrieveResponse,
+ AccountGetChatIdentityTokenResponse,
AccountGetSSOLoginURLResponse,
AccountListSSOLoginsResponse,
)
@@ -51,6 +52,7 @@ Methods:
- client.accounts.retrieve(\*\*params) -> AccountRetrieveResponse
- client.accounts.delete(\*\*params) -> object
+- client.accounts.get_chat_identity_token(\*\*params) -> AccountGetChatIdentityTokenResponse
- client.accounts.get_sso_login_url(\*\*params) -> AccountGetSSOLoginURLResponse
- client.accounts.list_joinable_organizations(\*\*params) -> SyncJoinableOrganizationsPage[JoinableOrganization]
- client.accounts.list_login_providers(\*\*params) -> SyncLoginProvidersPage[LoginProvider]
diff --git a/src/gitpod/resources/accounts.py b/src/gitpod/resources/accounts.py
index 69b4815..275e61d 100644
--- a/src/gitpod/resources/accounts.py
+++ b/src/gitpod/resources/accounts.py
@@ -12,6 +12,7 @@
account_list_sso_logins_params,
account_get_sso_login_url_params,
account_list_login_providers_params,
+ account_get_chat_identity_token_params,
account_list_joinable_organizations_params,
)
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
@@ -38,6 +39,7 @@
from ..types.account_retrieve_response import AccountRetrieveResponse
from ..types.account_list_sso_logins_response import AccountListSSOLoginsResponse
from ..types.account_get_sso_login_url_response import AccountGetSSOLoginURLResponse
+from ..types.account_get_chat_identity_token_response import AccountGetChatIdentityTokenResponse
__all__ = ["AccountsResource", "AsyncAccountsResource"]
@@ -170,6 +172,58 @@ def delete(
cast_to=object,
)
+ def get_chat_identity_token(
+ self,
+ *,
+ empty: bool | 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,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AccountGetChatIdentityTokenResponse:
+ """
+ Gets the chat identity token for the currently authenticated account.
+
+ Use this method to:
+
+ - Obtain a verification hash for in-app chat identity verification
+ - Secure chat sessions against impersonation
+
+ The returned hash is an HMAC-SHA256 signature of the account's email, used by
+ the chat widget to verify user identity.
+
+ ### Examples
+
+ - Get chat identity token:
+
+ Retrieves the identity verification hash for the authenticated account.
+
+ ```yaml
+ {}
+ ```
+
+ Args:
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._post(
+ "/gitpod.v1.AccountService/GetChatIdentityToken",
+ body=maybe_transform(
+ {"empty": empty}, account_get_chat_identity_token_params.AccountGetChatIdentityTokenParams
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AccountGetChatIdentityTokenResponse,
+ )
+
def get_sso_login_url(
self,
*,
@@ -580,6 +634,58 @@ async def delete(
cast_to=object,
)
+ async def get_chat_identity_token(
+ self,
+ *,
+ empty: bool | 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,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AccountGetChatIdentityTokenResponse:
+ """
+ Gets the chat identity token for the currently authenticated account.
+
+ Use this method to:
+
+ - Obtain a verification hash for in-app chat identity verification
+ - Secure chat sessions against impersonation
+
+ The returned hash is an HMAC-SHA256 signature of the account's email, used by
+ the chat widget to verify user identity.
+
+ ### Examples
+
+ - Get chat identity token:
+
+ Retrieves the identity verification hash for the authenticated account.
+
+ ```yaml
+ {}
+ ```
+
+ Args:
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._post(
+ "/gitpod.v1.AccountService/GetChatIdentityToken",
+ body=await async_maybe_transform(
+ {"empty": empty}, account_get_chat_identity_token_params.AccountGetChatIdentityTokenParams
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AccountGetChatIdentityTokenResponse,
+ )
+
async def get_sso_login_url(
self,
*,
@@ -872,6 +978,9 @@ def __init__(self, accounts: AccountsResource) -> None:
self.delete = to_raw_response_wrapper(
accounts.delete,
)
+ self.get_chat_identity_token = to_raw_response_wrapper(
+ accounts.get_chat_identity_token,
+ )
self.get_sso_login_url = to_raw_response_wrapper(
accounts.get_sso_login_url,
)
@@ -896,6 +1005,9 @@ def __init__(self, accounts: AsyncAccountsResource) -> None:
self.delete = async_to_raw_response_wrapper(
accounts.delete,
)
+ self.get_chat_identity_token = async_to_raw_response_wrapper(
+ accounts.get_chat_identity_token,
+ )
self.get_sso_login_url = async_to_raw_response_wrapper(
accounts.get_sso_login_url,
)
@@ -920,6 +1032,9 @@ def __init__(self, accounts: AccountsResource) -> None:
self.delete = to_streamed_response_wrapper(
accounts.delete,
)
+ self.get_chat_identity_token = to_streamed_response_wrapper(
+ accounts.get_chat_identity_token,
+ )
self.get_sso_login_url = to_streamed_response_wrapper(
accounts.get_sso_login_url,
)
@@ -944,6 +1059,9 @@ def __init__(self, accounts: AsyncAccountsResource) -> None:
self.delete = async_to_streamed_response_wrapper(
accounts.delete,
)
+ self.get_chat_identity_token = async_to_streamed_response_wrapper(
+ accounts.get_chat_identity_token,
+ )
self.get_sso_login_url = async_to_streamed_response_wrapper(
accounts.get_sso_login_url,
)
diff --git a/src/gitpod/types/__init__.py b/src/gitpod/types/__init__.py
index 4b195c7..45f7428 100644
--- a/src/gitpod/types/__init__.py
+++ b/src/gitpod/types/__init__.py
@@ -227,6 +227,9 @@
from .runner_check_repository_access_params import (
RunnerCheckRepositoryAccessParams as RunnerCheckRepositoryAccessParams,
)
+from .account_get_chat_identity_token_params import (
+ AccountGetChatIdentityTokenParams as AccountGetChatIdentityTokenParams,
+)
from .environment_create_from_project_params import (
EnvironmentCreateFromProjectParams as EnvironmentCreateFromProjectParams,
)
@@ -242,6 +245,9 @@
from .runner_check_repository_access_response import (
RunnerCheckRepositoryAccessResponse as RunnerCheckRepositoryAccessResponse,
)
+from .account_get_chat_identity_token_response import (
+ AccountGetChatIdentityTokenResponse as AccountGetChatIdentityTokenResponse,
+)
from .environment_create_from_project_response import (
EnvironmentCreateFromProjectResponse as EnvironmentCreateFromProjectResponse,
)
diff --git a/src/gitpod/types/account_get_chat_identity_token_params.py b/src/gitpod/types/account_get_chat_identity_token_params.py
new file mode 100644
index 0000000..a63c4cc
--- /dev/null
+++ b/src/gitpod/types/account_get_chat_identity_token_params.py
@@ -0,0 +1,11 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+__all__ = ["AccountGetChatIdentityTokenParams"]
+
+
+class AccountGetChatIdentityTokenParams(TypedDict, total=False):
+ empty: bool
diff --git a/src/gitpod/types/account_get_chat_identity_token_response.py b/src/gitpod/types/account_get_chat_identity_token_response.py
new file mode 100644
index 0000000..30e15a7
--- /dev/null
+++ b/src/gitpod/types/account_get_chat_identity_token_response.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from pydantic import Field as FieldInfo
+
+from .._models import BaseModel
+
+__all__ = ["AccountGetChatIdentityTokenResponse"]
+
+
+class AccountGetChatIdentityTokenResponse(BaseModel):
+ email_hash: str = FieldInfo(alias="emailHash")
+ """
+ email_hash is the HMAC-SHA256 hash of the account's email address, used for chat
+ widget identity verification
+ """
diff --git a/tests/api_resources/test_accounts.py b/tests/api_resources/test_accounts.py
index 41f2192..ff2f15a 100644
--- a/tests/api_resources/test_accounts.py
+++ b/tests/api_resources/test_accounts.py
@@ -15,6 +15,7 @@
AccountRetrieveResponse,
AccountListSSOLoginsResponse,
AccountGetSSOLoginURLResponse,
+ AccountGetChatIdentityTokenResponse,
)
from gitpod.pagination import (
SyncLoginsPage,
@@ -110,6 +111,42 @@ def test_streaming_response_delete(self, client: Gitpod) -> None:
assert cast(Any, response.is_closed) is True
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_get_chat_identity_token(self, client: Gitpod) -> None:
+ account = client.accounts.get_chat_identity_token()
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_method_get_chat_identity_token_with_all_params(self, client: Gitpod) -> None:
+ account = client.accounts.get_chat_identity_token(
+ empty=True,
+ )
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_raw_response_get_chat_identity_token(self, client: Gitpod) -> None:
+ response = client.accounts.with_raw_response.get_chat_identity_token()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ account = response.parse()
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ def test_streaming_response_get_chat_identity_token(self, client: Gitpod) -> None:
+ with client.accounts.with_streaming_response.get_chat_identity_token() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ account = response.parse()
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
def test_method_get_sso_login_url(self, client: Gitpod) -> None:
@@ -373,6 +410,42 @@ async def test_streaming_response_delete(self, async_client: AsyncGitpod) -> Non
assert cast(Any, response.is_closed) is True
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_get_chat_identity_token(self, async_client: AsyncGitpod) -> None:
+ account = await async_client.accounts.get_chat_identity_token()
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_method_get_chat_identity_token_with_all_params(self, async_client: AsyncGitpod) -> None:
+ account = await async_client.accounts.get_chat_identity_token(
+ empty=True,
+ )
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_raw_response_get_chat_identity_token(self, async_client: AsyncGitpod) -> None:
+ response = await async_client.accounts.with_raw_response.get_chat_identity_token()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ account = await response.parse()
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ @pytest.mark.skip(reason="Prism tests are disabled")
+ @parametrize
+ async def test_streaming_response_get_chat_identity_token(self, async_client: AsyncGitpod) -> None:
+ async with async_client.accounts.with_streaming_response.get_chat_identity_token() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ account = await response.parse()
+ assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
async def test_method_get_sso_login_url(self, async_client: AsyncGitpod) -> None:
From 1176fce9b14b0bf657282228a20c222b2cb14ea5 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 28 Jan 2026 17:21:20 +0000
Subject: [PATCH 18/55] chore: update OpenAPI spec to
e50946de8cddc549be7f7423903ad444632abce6
---
.stats.yml | 4 +-
api.md | 2 -
src/gitpod/resources/accounts.py | 118 ------------------
src/gitpod/types/__init__.py | 6 -
.../account_get_chat_identity_token_params.py | 11 --
...ccount_get_chat_identity_token_response.py | 15 ---
tests/api_resources/test_accounts.py | 73 -----------
7 files changed, 2 insertions(+), 227 deletions(-)
delete mode 100644 src/gitpod/types/account_get_chat_identity_token_params.py
delete mode 100644 src/gitpod/types/account_get_chat_identity_token_response.py
diff --git a/.stats.yml b/.stats.yml
index 1f25476..fd03563 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 173
+configured_endpoints: 172
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-51c0e9db3fb9e3aadf35fb4fcf76107a2fcd9da1b8ff6cd593c1ae23d1a24bc3.yml
openapi_spec_hash: db222df8620e2270763bef95ff247445
-config_hash: 2fa5dd58c6ab4dd15de320fa0f85dde8
+config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/api.md b/api.md
index a7861fc..57eff1c 100644
--- a/api.md
+++ b/api.md
@@ -42,7 +42,6 @@ from gitpod.types import (
JoinableOrganization,
LoginProvider,
AccountRetrieveResponse,
- AccountGetChatIdentityTokenResponse,
AccountGetSSOLoginURLResponse,
AccountListSSOLoginsResponse,
)
@@ -52,7 +51,6 @@ Methods:
- client.accounts.retrieve(\*\*params) -> AccountRetrieveResponse
- client.accounts.delete(\*\*params) -> object
-- client.accounts.get_chat_identity_token(\*\*params) -> AccountGetChatIdentityTokenResponse
- client.accounts.get_sso_login_url(\*\*params) -> AccountGetSSOLoginURLResponse
- client.accounts.list_joinable_organizations(\*\*params) -> SyncJoinableOrganizationsPage[JoinableOrganization]
- client.accounts.list_login_providers(\*\*params) -> SyncLoginProvidersPage[LoginProvider]
diff --git a/src/gitpod/resources/accounts.py b/src/gitpod/resources/accounts.py
index 275e61d..69b4815 100644
--- a/src/gitpod/resources/accounts.py
+++ b/src/gitpod/resources/accounts.py
@@ -12,7 +12,6 @@
account_list_sso_logins_params,
account_get_sso_login_url_params,
account_list_login_providers_params,
- account_get_chat_identity_token_params,
account_list_joinable_organizations_params,
)
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
@@ -39,7 +38,6 @@
from ..types.account_retrieve_response import AccountRetrieveResponse
from ..types.account_list_sso_logins_response import AccountListSSOLoginsResponse
from ..types.account_get_sso_login_url_response import AccountGetSSOLoginURLResponse
-from ..types.account_get_chat_identity_token_response import AccountGetChatIdentityTokenResponse
__all__ = ["AccountsResource", "AsyncAccountsResource"]
@@ -172,58 +170,6 @@ def delete(
cast_to=object,
)
- def get_chat_identity_token(
- self,
- *,
- empty: bool | 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,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> AccountGetChatIdentityTokenResponse:
- """
- Gets the chat identity token for the currently authenticated account.
-
- Use this method to:
-
- - Obtain a verification hash for in-app chat identity verification
- - Secure chat sessions against impersonation
-
- The returned hash is an HMAC-SHA256 signature of the account's email, used by
- the chat widget to verify user identity.
-
- ### Examples
-
- - Get chat identity token:
-
- Retrieves the identity verification hash for the authenticated account.
-
- ```yaml
- {}
- ```
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/gitpod.v1.AccountService/GetChatIdentityToken",
- body=maybe_transform(
- {"empty": empty}, account_get_chat_identity_token_params.AccountGetChatIdentityTokenParams
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AccountGetChatIdentityTokenResponse,
- )
-
def get_sso_login_url(
self,
*,
@@ -634,58 +580,6 @@ async def delete(
cast_to=object,
)
- async def get_chat_identity_token(
- self,
- *,
- empty: bool | 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,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> AccountGetChatIdentityTokenResponse:
- """
- Gets the chat identity token for the currently authenticated account.
-
- Use this method to:
-
- - Obtain a verification hash for in-app chat identity verification
- - Secure chat sessions against impersonation
-
- The returned hash is an HMAC-SHA256 signature of the account's email, used by
- the chat widget to verify user identity.
-
- ### Examples
-
- - Get chat identity token:
-
- Retrieves the identity verification hash for the authenticated account.
-
- ```yaml
- {}
- ```
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/gitpod.v1.AccountService/GetChatIdentityToken",
- body=await async_maybe_transform(
- {"empty": empty}, account_get_chat_identity_token_params.AccountGetChatIdentityTokenParams
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=AccountGetChatIdentityTokenResponse,
- )
-
async def get_sso_login_url(
self,
*,
@@ -978,9 +872,6 @@ def __init__(self, accounts: AccountsResource) -> None:
self.delete = to_raw_response_wrapper(
accounts.delete,
)
- self.get_chat_identity_token = to_raw_response_wrapper(
- accounts.get_chat_identity_token,
- )
self.get_sso_login_url = to_raw_response_wrapper(
accounts.get_sso_login_url,
)
@@ -1005,9 +896,6 @@ def __init__(self, accounts: AsyncAccountsResource) -> None:
self.delete = async_to_raw_response_wrapper(
accounts.delete,
)
- self.get_chat_identity_token = async_to_raw_response_wrapper(
- accounts.get_chat_identity_token,
- )
self.get_sso_login_url = async_to_raw_response_wrapper(
accounts.get_sso_login_url,
)
@@ -1032,9 +920,6 @@ def __init__(self, accounts: AccountsResource) -> None:
self.delete = to_streamed_response_wrapper(
accounts.delete,
)
- self.get_chat_identity_token = to_streamed_response_wrapper(
- accounts.get_chat_identity_token,
- )
self.get_sso_login_url = to_streamed_response_wrapper(
accounts.get_sso_login_url,
)
@@ -1059,9 +944,6 @@ def __init__(self, accounts: AsyncAccountsResource) -> None:
self.delete = async_to_streamed_response_wrapper(
accounts.delete,
)
- self.get_chat_identity_token = async_to_streamed_response_wrapper(
- accounts.get_chat_identity_token,
- )
self.get_sso_login_url = async_to_streamed_response_wrapper(
accounts.get_sso_login_url,
)
diff --git a/src/gitpod/types/__init__.py b/src/gitpod/types/__init__.py
index 45f7428..4b195c7 100644
--- a/src/gitpod/types/__init__.py
+++ b/src/gitpod/types/__init__.py
@@ -227,9 +227,6 @@
from .runner_check_repository_access_params import (
RunnerCheckRepositoryAccessParams as RunnerCheckRepositoryAccessParams,
)
-from .account_get_chat_identity_token_params import (
- AccountGetChatIdentityTokenParams as AccountGetChatIdentityTokenParams,
-)
from .environment_create_from_project_params import (
EnvironmentCreateFromProjectParams as EnvironmentCreateFromProjectParams,
)
@@ -245,9 +242,6 @@
from .runner_check_repository_access_response import (
RunnerCheckRepositoryAccessResponse as RunnerCheckRepositoryAccessResponse,
)
-from .account_get_chat_identity_token_response import (
- AccountGetChatIdentityTokenResponse as AccountGetChatIdentityTokenResponse,
-)
from .environment_create_from_project_response import (
EnvironmentCreateFromProjectResponse as EnvironmentCreateFromProjectResponse,
)
diff --git a/src/gitpod/types/account_get_chat_identity_token_params.py b/src/gitpod/types/account_get_chat_identity_token_params.py
deleted file mode 100644
index a63c4cc..0000000
--- a/src/gitpod/types/account_get_chat_identity_token_params.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-__all__ = ["AccountGetChatIdentityTokenParams"]
-
-
-class AccountGetChatIdentityTokenParams(TypedDict, total=False):
- empty: bool
diff --git a/src/gitpod/types/account_get_chat_identity_token_response.py b/src/gitpod/types/account_get_chat_identity_token_response.py
deleted file mode 100644
index 30e15a7..0000000
--- a/src/gitpod/types/account_get_chat_identity_token_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from pydantic import Field as FieldInfo
-
-from .._models import BaseModel
-
-__all__ = ["AccountGetChatIdentityTokenResponse"]
-
-
-class AccountGetChatIdentityTokenResponse(BaseModel):
- email_hash: str = FieldInfo(alias="emailHash")
- """
- email_hash is the HMAC-SHA256 hash of the account's email address, used for chat
- widget identity verification
- """
diff --git a/tests/api_resources/test_accounts.py b/tests/api_resources/test_accounts.py
index ff2f15a..41f2192 100644
--- a/tests/api_resources/test_accounts.py
+++ b/tests/api_resources/test_accounts.py
@@ -15,7 +15,6 @@
AccountRetrieveResponse,
AccountListSSOLoginsResponse,
AccountGetSSOLoginURLResponse,
- AccountGetChatIdentityTokenResponse,
)
from gitpod.pagination import (
SyncLoginsPage,
@@ -111,42 +110,6 @@ def test_streaming_response_delete(self, client: Gitpod) -> None:
assert cast(Any, response.is_closed) is True
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- def test_method_get_chat_identity_token(self, client: Gitpod) -> None:
- account = client.accounts.get_chat_identity_token()
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- def test_method_get_chat_identity_token_with_all_params(self, client: Gitpod) -> None:
- account = client.accounts.get_chat_identity_token(
- empty=True,
- )
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- def test_raw_response_get_chat_identity_token(self, client: Gitpod) -> None:
- response = client.accounts.with_raw_response.get_chat_identity_token()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- account = response.parse()
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- def test_streaming_response_get_chat_identity_token(self, client: Gitpod) -> None:
- with client.accounts.with_streaming_response.get_chat_identity_token() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- account = response.parse()
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
def test_method_get_sso_login_url(self, client: Gitpod) -> None:
@@ -410,42 +373,6 @@ async def test_streaming_response_delete(self, async_client: AsyncGitpod) -> Non
assert cast(Any, response.is_closed) is True
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- async def test_method_get_chat_identity_token(self, async_client: AsyncGitpod) -> None:
- account = await async_client.accounts.get_chat_identity_token()
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- async def test_method_get_chat_identity_token_with_all_params(self, async_client: AsyncGitpod) -> None:
- account = await async_client.accounts.get_chat_identity_token(
- empty=True,
- )
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- async def test_raw_response_get_chat_identity_token(self, async_client: AsyncGitpod) -> None:
- response = await async_client.accounts.with_raw_response.get_chat_identity_token()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- account = await response.parse()
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- @pytest.mark.skip(reason="Prism tests are disabled")
- @parametrize
- async def test_streaming_response_get_chat_identity_token(self, async_client: AsyncGitpod) -> None:
- async with async_client.accounts.with_streaming_response.get_chat_identity_token() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- account = await response.parse()
- assert_matches_type(AccountGetChatIdentityTokenResponse, account, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
async def test_method_get_sso_login_url(self, async_client: AsyncGitpod) -> None:
From d59ab9810266a68d5b4cd31dd6da669d2691436f Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 09:14:41 +0000
Subject: [PATCH 19/55] feat(types): add RoleAssignment value to ResourceType
enum
---
.stats.yml | 4 ++--
src/gitpod/types/shared/resource_type.py | 1 +
src/gitpod/types/shared_params/resource_type.py | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index fd03563..a8492aa 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-51c0e9db3fb9e3aadf35fb4fcf76107a2fcd9da1b8ff6cd593c1ae23d1a24bc3.yml
-openapi_spec_hash: db222df8620e2270763bef95ff247445
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-871abe56c856169257435fbf85a09a3c075c2677671282c92606590e0a1bfc54.yml
+openapi_spec_hash: 7d0d7816110fc899f755a9d39770c044
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/types/shared/resource_type.py b/src/gitpod/types/shared/resource_type.py
index aca1888..9bd2c13 100644
--- a/src/gitpod/types/shared/resource_type.py
+++ b/src/gitpod/types/shared/resource_type.py
@@ -52,4 +52,5 @@
"RESOURCE_TYPE_SERVICE_ACCOUNT_SECRET",
"RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
"RESOURCE_TYPE_SERVICE_ACCOUNT_TOKEN",
+ "RESOURCE_TYPE_ROLE_ASSIGNMENT",
]
diff --git a/src/gitpod/types/shared_params/resource_type.py b/src/gitpod/types/shared_params/resource_type.py
index b5036ff..19a20e4 100644
--- a/src/gitpod/types/shared_params/resource_type.py
+++ b/src/gitpod/types/shared_params/resource_type.py
@@ -54,4 +54,5 @@
"RESOURCE_TYPE_SERVICE_ACCOUNT_SECRET",
"RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
"RESOURCE_TYPE_SERVICE_ACCOUNT_TOKEN",
+ "RESOURCE_TYPE_ROLE_ASSIGNMENT",
]
From c3458714c345048e05c74b213bcf087f3b977313 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 13:07:17 +0000
Subject: [PATCH 20/55] feat(api): add dev_runner_id to agents,
dev_environment_id and provider to runners
---
.stats.yml | 4 ++--
src/gitpod/resources/agents.py | 12 ++++++++++++
src/gitpod/types/agent_start_execution_params.py | 7 +++++++
src/gitpod/types/runner_provider.py | 1 +
tests/api_resources/test_agents.py | 2 ++
5 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index a8492aa..dbb17fb 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-871abe56c856169257435fbf85a09a3c075c2677671282c92606590e0a1bfc54.yml
-openapi_spec_hash: 7d0d7816110fc899f755a9d39770c044
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-700cd47eae87ca42bbbdc8b39e84e864226d169f0c369f414680f9eda694d3a5.yml
+openapi_spec_hash: 9364ced18661e420a15fb1be5203da4b
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/resources/agents.py b/src/gitpod/resources/agents.py
index 9c2e9d1..eaea47c 100644
--- a/src/gitpod/resources/agents.py
+++ b/src/gitpod/resources/agents.py
@@ -540,6 +540,7 @@ def start_execution(
code_context: AgentCodeContextParam | Omit = omit,
mode: AgentMode | Omit = omit,
name: str | Omit = omit,
+ runner_id: str | Omit = omit,
workflow_action_id: Optional[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.
@@ -569,6 +570,10 @@ def start_execution(
mode: mode specifies the operational mode for this agent execution If not specified,
defaults to AGENT_MODE_EXECUTION
+ runner_id: runner_id specifies a runner for this agent execution. When set, the agent
+ execution is routed to this runner instead of the runner associated with the
+ environment.
+
workflow_action_id: workflow_action_id is an optional reference to the workflow execution action
that created this agent execution. Used for tracking and event correlation.
@@ -588,6 +593,7 @@ def start_execution(
"code_context": code_context,
"mode": mode,
"name": name,
+ "runner_id": runner_id,
"workflow_action_id": workflow_action_id,
},
agent_start_execution_params.AgentStartExecutionParams,
@@ -1194,6 +1200,7 @@ async def start_execution(
code_context: AgentCodeContextParam | Omit = omit,
mode: AgentMode | Omit = omit,
name: str | Omit = omit,
+ runner_id: str | Omit = omit,
workflow_action_id: Optional[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.
@@ -1223,6 +1230,10 @@ async def start_execution(
mode: mode specifies the operational mode for this agent execution If not specified,
defaults to AGENT_MODE_EXECUTION
+ runner_id: runner_id specifies a runner for this agent execution. When set, the agent
+ execution is routed to this runner instead of the runner associated with the
+ environment.
+
workflow_action_id: workflow_action_id is an optional reference to the workflow execution action
that created this agent execution. Used for tracking and event correlation.
@@ -1242,6 +1253,7 @@ async def start_execution(
"code_context": code_context,
"mode": mode,
"name": name,
+ "runner_id": runner_id,
"workflow_action_id": workflow_action_id,
},
agent_start_execution_params.AgentStartExecutionParams,
diff --git a/src/gitpod/types/agent_start_execution_params.py b/src/gitpod/types/agent_start_execution_params.py
index b021f7e..83308be 100644
--- a/src/gitpod/types/agent_start_execution_params.py
+++ b/src/gitpod/types/agent_start_execution_params.py
@@ -25,6 +25,13 @@ class AgentStartExecutionParams(TypedDict, total=False):
name: str
+ runner_id: Annotated[str, PropertyInfo(alias="runnerId")]
+ """
+ runner_id specifies a runner for this agent execution. When set, the agent
+ execution is routed to this runner instead of the runner associated with the
+ environment.
+ """
+
workflow_action_id: Annotated[Optional[str], PropertyInfo(alias="workflowActionId")]
"""
workflow_action_id is an optional reference to the workflow execution action
diff --git a/src/gitpod/types/runner_provider.py b/src/gitpod/types/runner_provider.py
index f0730df..4d40404 100644
--- a/src/gitpod/types/runner_provider.py
+++ b/src/gitpod/types/runner_provider.py
@@ -11,4 +11,5 @@
"RUNNER_PROVIDER_DESKTOP_MAC",
"RUNNER_PROVIDER_MANAGED",
"RUNNER_PROVIDER_GCP",
+ "RUNNER_PROVIDER_DEV_AGENT",
]
diff --git a/tests/api_resources/test_agents.py b/tests/api_resources/test_agents.py
index e006c3c..98229f1 100644
--- a/tests/api_resources/test_agents.py
+++ b/tests/api_resources/test_agents.py
@@ -438,6 +438,7 @@ def test_method_start_execution_with_all_params(self, client: Gitpod) -> None:
},
mode="AGENT_MODE_UNSPECIFIED",
name="name",
+ runner_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
workflow_action_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
)
assert_matches_type(AgentStartExecutionResponse, agent, path=["response"])
@@ -963,6 +964,7 @@ async def test_method_start_execution_with_all_params(self, async_client: AsyncG
},
mode="AGENT_MODE_UNSPECIFIED",
name="name",
+ runner_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
workflow_action_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
)
assert_matches_type(AgentStartExecutionResponse, agent, path=["response"])
From afaf49734b8103f8f6a4ddff4003ef9644083dbf Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 16:33:56 +0000
Subject: [PATCH 21/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index dbb17fb..0b00935 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-700cd47eae87ca42bbbdc8b39e84e864226d169f0c369f414680f9eda694d3a5.yml
-openapi_spec_hash: 9364ced18661e420a15fb1be5203da4b
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-00ba82d543cfbd7d43712fb508d286a0a07b2aad1c6edf8084d794a903b09e3b.yml
+openapi_spec_hash: 381d9164ae462351125af601e9f5c951
config_hash: ad1db65b32248aecda41b64586aac9ce
From 48e0b4951e34166dba1c29cd4e6b15fb2314b54e Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 16:57:44 +0000
Subject: [PATCH 22/55] feat(client): add custom JSON encoder for extended type
support
---
src/gitpod/_base_client.py | 7 +-
src/gitpod/_compat.py | 6 +-
src/gitpod/_utils/_json.py | 35 ++++++++++
tests/test_utils/test_json.py | 126 ++++++++++++++++++++++++++++++++++
4 files changed, 169 insertions(+), 5 deletions(-)
create mode 100644 src/gitpod/_utils/_json.py
create mode 100644 tests/test_utils/test_json.py
diff --git a/src/gitpod/_base_client.py b/src/gitpod/_base_client.py
index e6ccedf..cc7f8af 100644
--- a/src/gitpod/_base_client.py
+++ b/src/gitpod/_base_client.py
@@ -86,6 +86,7 @@
APIConnectionError,
APIResponseValidationError,
)
+from ._utils._json import openapi_dumps
log: logging.Logger = logging.getLogger(__name__)
@@ -554,8 +555,10 @@ def _build_request(
kwargs["content"] = options.content
elif isinstance(json_data, bytes):
kwargs["content"] = json_data
- else:
- kwargs["json"] = json_data if is_given(json_data) else None
+ elif not files:
+ # Don't set content when JSON is sent as multipart/form-data,
+ # since httpx's content param overrides other body arguments
+ kwargs["content"] = openapi_dumps(json_data) if is_given(json_data) and json_data is not None else None
kwargs["files"] = files
else:
headers.pop("Content-Type", None)
diff --git a/src/gitpod/_compat.py b/src/gitpod/_compat.py
index bdef67f..786ff42 100644
--- a/src/gitpod/_compat.py
+++ b/src/gitpod/_compat.py
@@ -139,6 +139,7 @@ def model_dump(
exclude_defaults: bool = False,
warnings: bool = True,
mode: Literal["json", "python"] = "python",
+ by_alias: bool | None = None,
) -> dict[str, Any]:
if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
return model.model_dump(
@@ -148,13 +149,12 @@ def model_dump(
exclude_defaults=exclude_defaults,
# warnings are not supported in Pydantic v1
warnings=True if PYDANTIC_V1 else warnings,
+ by_alias=by_alias,
)
return cast(
"dict[str, Any]",
model.dict( # pyright: ignore[reportDeprecated, reportUnnecessaryCast]
- exclude=exclude,
- exclude_unset=exclude_unset,
- exclude_defaults=exclude_defaults,
+ exclude=exclude, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, by_alias=bool(by_alias)
),
)
diff --git a/src/gitpod/_utils/_json.py b/src/gitpod/_utils/_json.py
new file mode 100644
index 0000000..6058421
--- /dev/null
+++ b/src/gitpod/_utils/_json.py
@@ -0,0 +1,35 @@
+import json
+from typing import Any
+from datetime import datetime
+from typing_extensions import override
+
+import pydantic
+
+from .._compat import model_dump
+
+
+def openapi_dumps(obj: Any) -> bytes:
+ """
+ Serialize an object to UTF-8 encoded JSON bytes.
+
+ Extends the standard json.dumps with support for additional types
+ commonly used in the SDK, such as `datetime`, `pydantic.BaseModel`, etc.
+ """
+ return json.dumps(
+ obj,
+ cls=_CustomEncoder,
+ # Uses the same defaults as httpx's JSON serialization
+ ensure_ascii=False,
+ separators=(",", ":"),
+ allow_nan=False,
+ ).encode()
+
+
+class _CustomEncoder(json.JSONEncoder):
+ @override
+ def default(self, o: Any) -> Any:
+ if isinstance(o, datetime):
+ return o.isoformat()
+ if isinstance(o, pydantic.BaseModel):
+ return model_dump(o, exclude_unset=True, mode="json", by_alias=True)
+ return super().default(o)
diff --git a/tests/test_utils/test_json.py b/tests/test_utils/test_json.py
new file mode 100644
index 0000000..28f61d2
--- /dev/null
+++ b/tests/test_utils/test_json.py
@@ -0,0 +1,126 @@
+from __future__ import annotations
+
+import datetime
+from typing import Union
+
+import pydantic
+
+from gitpod import _compat
+from gitpod._utils._json import openapi_dumps
+
+
+class TestOpenapiDumps:
+ def test_basic(self) -> None:
+ data = {"key": "value", "number": 42}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"key":"value","number":42}'
+
+ def test_datetime_serialization(self) -> None:
+ dt = datetime.datetime(2023, 1, 1, 12, 0, 0)
+ data = {"datetime": dt}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"datetime":"2023-01-01T12:00:00"}'
+
+ def test_pydantic_model_serialization(self) -> None:
+ class User(pydantic.BaseModel):
+ first_name: str
+ last_name: str
+ age: int
+
+ model_instance = User(first_name="John", last_name="Kramer", age=83)
+ data = {"model": model_instance}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"first_name":"John","last_name":"Kramer","age":83}}'
+
+ def test_pydantic_model_with_default_values(self) -> None:
+ class User(pydantic.BaseModel):
+ name: str
+ role: str = "user"
+ active: bool = True
+ score: int = 0
+
+ model_instance = User(name="Alice")
+ data = {"model": model_instance}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"name":"Alice"}}'
+
+ def test_pydantic_model_with_default_values_overridden(self) -> None:
+ class User(pydantic.BaseModel):
+ name: str
+ role: str = "user"
+ active: bool = True
+
+ model_instance = User(name="Bob", role="admin", active=False)
+ data = {"model": model_instance}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"name":"Bob","role":"admin","active":false}}'
+
+ def test_pydantic_model_with_alias(self) -> None:
+ class User(pydantic.BaseModel):
+ first_name: str = pydantic.Field(alias="firstName")
+ last_name: str = pydantic.Field(alias="lastName")
+
+ model_instance = User(firstName="John", lastName="Doe")
+ data = {"model": model_instance}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"firstName":"John","lastName":"Doe"}}'
+
+ def test_pydantic_model_with_alias_and_default(self) -> None:
+ class User(pydantic.BaseModel):
+ user_name: str = pydantic.Field(alias="userName")
+ user_role: str = pydantic.Field(default="member", alias="userRole")
+ is_active: bool = pydantic.Field(default=True, alias="isActive")
+
+ model_instance = User(userName="charlie")
+ data = {"model": model_instance}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"userName":"charlie"}}'
+
+ model_with_overrides = User(userName="diana", userRole="admin", isActive=False)
+ data = {"model": model_with_overrides}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"userName":"diana","userRole":"admin","isActive":false}}'
+
+ def test_pydantic_model_with_nested_models_and_defaults(self) -> None:
+ class Address(pydantic.BaseModel):
+ street: str
+ city: str = "Unknown"
+
+ class User(pydantic.BaseModel):
+ name: str
+ address: Address
+ verified: bool = False
+
+ if _compat.PYDANTIC_V1:
+ # to handle forward references in Pydantic v1
+ User.update_forward_refs(**locals()) # type: ignore[reportDeprecated]
+
+ address = Address(street="123 Main St")
+ user = User(name="Diana", address=address)
+ data = {"user": user}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"user":{"name":"Diana","address":{"street":"123 Main St"}}}'
+
+ address_with_city = Address(street="456 Oak Ave", city="Boston")
+ user_verified = User(name="Eve", address=address_with_city, verified=True)
+ data = {"user": user_verified}
+ json_bytes = openapi_dumps(data)
+ assert (
+ json_bytes == b'{"user":{"name":"Eve","address":{"street":"456 Oak Ave","city":"Boston"},"verified":true}}'
+ )
+
+ def test_pydantic_model_with_optional_fields(self) -> None:
+ class User(pydantic.BaseModel):
+ name: str
+ email: Union[str, None]
+ phone: Union[str, None]
+
+ model_with_none = User(name="Eve", email=None, phone=None)
+ data = {"model": model_with_none}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"name":"Eve","email":null,"phone":null}}'
+
+ model_with_values = User(name="Frank", email="frank@example.com", phone=None)
+ data = {"model": model_with_values}
+ json_bytes = openapi_dumps(data)
+ assert json_bytes == b'{"model":{"name":"Frank","email":"frank@example.com","phone":null}}'
From 09c2210f258504cbebaed878233e2d5e06f939ec Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 19:19:57 +0000
Subject: [PATCH 23/55] feat(agent): add annotations field to AgentExecution
---
.stats.yml | 4 ++--
src/gitpod/resources/agents.py | 14 +++++++++++++-
src/gitpod/types/agent_execution.py | 3 +++
src/gitpod/types/agent_list_executions_params.py | 9 ++++++++-
src/gitpod/types/agent_start_execution_params.py | 9 ++++++++-
tests/api_resources/test_agents.py | 4 ++++
6 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 0b00935..bb13927 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-00ba82d543cfbd7d43712fb508d286a0a07b2aad1c6edf8084d794a903b09e3b.yml
-openapi_spec_hash: 381d9164ae462351125af601e9f5c951
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-e77dd932e4cfde041f712e0e130d6075754e2f5893bca0a03ee5cd0734b35089.yml
+openapi_spec_hash: faa844cfe771c3762e3a4d79b476cebf
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/resources/agents.py b/src/gitpod/resources/agents.py
index eaea47c..3206d8c 100644
--- a/src/gitpod/resources/agents.py
+++ b/src/gitpod/resources/agents.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import Optional
+from typing import Dict, Optional
import httpx
@@ -537,6 +537,7 @@ def start_execution(
self,
*,
agent_id: str | Omit = omit,
+ annotations: Dict[str, str] | Omit = omit,
code_context: AgentCodeContextParam | Omit = omit,
mode: AgentMode | Omit = omit,
name: str | Omit = omit,
@@ -567,6 +568,10 @@ def start_execution(
```
Args:
+ annotations: annotations are key-value pairs for tracking external context (e.g., Linear
+ session IDs, GitHub issue references). Keys should follow domain/name convention
+ (e.g., "linear.app/session-id").
+
mode: mode specifies the operational mode for this agent execution If not specified,
defaults to AGENT_MODE_EXECUTION
@@ -590,6 +595,7 @@ def start_execution(
body=maybe_transform(
{
"agent_id": agent_id,
+ "annotations": annotations,
"code_context": code_context,
"mode": mode,
"name": name,
@@ -1197,6 +1203,7 @@ async def start_execution(
self,
*,
agent_id: str | Omit = omit,
+ annotations: Dict[str, str] | Omit = omit,
code_context: AgentCodeContextParam | Omit = omit,
mode: AgentMode | Omit = omit,
name: str | Omit = omit,
@@ -1227,6 +1234,10 @@ async def start_execution(
```
Args:
+ annotations: annotations are key-value pairs for tracking external context (e.g., Linear
+ session IDs, GitHub issue references). Keys should follow domain/name convention
+ (e.g., "linear.app/session-id").
+
mode: mode specifies the operational mode for this agent execution If not specified,
defaults to AGENT_MODE_EXECUTION
@@ -1250,6 +1261,7 @@ async def start_execution(
body=await async_maybe_transform(
{
"agent_id": agent_id,
+ "annotations": annotations,
"code_context": code_context,
"mode": mode,
"name": name,
diff --git a/src/gitpod/types/agent_execution.py b/src/gitpod/types/agent_execution.py
index ad11938..4e4cd90 100644
--- a/src/gitpod/types/agent_execution.py
+++ b/src/gitpod/types/agent_execution.py
@@ -31,6 +31,9 @@ class Metadata(BaseModel):
parts of Gitpod to function
"""
+ annotations: Optional[Dict[str, str]] = None
+ """annotations are key-value pairs for tracking external context."""
+
created_at: Optional[datetime] = FieldInfo(alias="createdAt", default=None)
"""
A Timestamp represents a point in time independent of any time zone or local
diff --git a/src/gitpod/types/agent_list_executions_params.py b/src/gitpod/types/agent_list_executions_params.py
index 3a61341..f01aef2 100644
--- a/src/gitpod/types/agent_list_executions_params.py
+++ b/src/gitpod/types/agent_list_executions_params.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import List
+from typing import Dict, List
from typing_extensions import Literal, Annotated, TypedDict
from .._types import SequenceNotStr
@@ -24,6 +24,13 @@ class AgentListExecutionsParams(TypedDict, total=False):
class Filter(TypedDict, total=False):
agent_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="agentIds")]
+ annotations: Dict[str, str]
+ """annotations filters by key-value pairs.
+
+ Only executions containing all specified annotations (with matching values) are
+ returned.
+ """
+
creator_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="creatorIds")]
environment_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="environmentIds")]
diff --git a/src/gitpod/types/agent_start_execution_params.py b/src/gitpod/types/agent_start_execution_params.py
index 83308be..4d9f640 100644
--- a/src/gitpod/types/agent_start_execution_params.py
+++ b/src/gitpod/types/agent_start_execution_params.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from typing import Optional
+from typing import Dict, Optional
from typing_extensions import Annotated, TypedDict
from .._utils import PropertyInfo
@@ -15,6 +15,13 @@
class AgentStartExecutionParams(TypedDict, total=False):
agent_id: Annotated[str, PropertyInfo(alias="agentId")]
+ annotations: Dict[str, str]
+ """
+ annotations are key-value pairs for tracking external context (e.g., Linear
+ session IDs, GitHub issue references). Keys should follow domain/name convention
+ (e.g., "linear.app/session-id").
+ """
+
code_context: Annotated[AgentCodeContextParam, PropertyInfo(alias="codeContext")]
mode: AgentMode
diff --git a/tests/api_resources/test_agents.py b/tests/api_resources/test_agents.py
index 98229f1..979d8ae 100644
--- a/tests/api_resources/test_agents.py
+++ b/tests/api_resources/test_agents.py
@@ -192,6 +192,7 @@ def test_method_list_executions_with_all_params(self, client: Gitpod) -> None:
page_size=0,
filter={
"agent_ids": ["b8a64cfa-43e2-4b9d-9fb3-07edc63f5971"],
+ "annotations": {"foo": "string"},
"creator_ids": ["string"],
"environment_ids": ["string"],
"project_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
@@ -412,6 +413,7 @@ def test_method_start_execution(self, client: Gitpod) -> None:
def test_method_start_execution_with_all_params(self, client: Gitpod) -> None:
agent = client.agents.start_execution(
agent_id="b8a64cfa-43e2-4b9d-9fb3-07edc63f5971",
+ annotations={"foo": "string"},
code_context={
"context_url": {
"environment_class_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
@@ -718,6 +720,7 @@ async def test_method_list_executions_with_all_params(self, async_client: AsyncG
page_size=0,
filter={
"agent_ids": ["b8a64cfa-43e2-4b9d-9fb3-07edc63f5971"],
+ "annotations": {"foo": "string"},
"creator_ids": ["string"],
"environment_ids": ["string"],
"project_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
@@ -938,6 +941,7 @@ async def test_method_start_execution(self, async_client: AsyncGitpod) -> None:
async def test_method_start_execution_with_all_params(self, async_client: AsyncGitpod) -> None:
agent = await async_client.agents.start_execution(
agent_id="b8a64cfa-43e2-4b9d-9fb3-07edc63f5971",
+ annotations={"foo": "string"},
code_context={
"context_url": {
"environment_class_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
From e1ed9353e48590389e21fa38137280daeef56da9 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 30 Jan 2026 10:05:48 +0000
Subject: [PATCH 24/55] feat(api): add derivedFromOrgRole field to
RoleAssignment
---
.stats.yml | 4 ++--
src/gitpod/types/groups/role_assignment.py | 8 ++++++++
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index bb13927..09bb7b1 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-e77dd932e4cfde041f712e0e130d6075754e2f5893bca0a03ee5cd0734b35089.yml
-openapi_spec_hash: faa844cfe771c3762e3a4d79b476cebf
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-92cecb570bf9966e9dc5cff1eedd2981a57121b013aa3b79d6b955d011e72e7e.yml
+openapi_spec_hash: 2adc05896eb8bdc68ca146d1a84666d1
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/types/groups/role_assignment.py b/src/gitpod/types/groups/role_assignment.py
index 39512d0..8973309 100644
--- a/src/gitpod/types/groups/role_assignment.py
+++ b/src/gitpod/types/groups/role_assignment.py
@@ -17,6 +17,14 @@ class RoleAssignment(BaseModel):
id: Optional[str] = None
"""Unique identifier for the role assignment"""
+ derived_from_org_role: Optional[ResourceRole] = FieldInfo(alias="derivedFromOrgRole", default=None)
+ """
+ The org-level role that created this assignment, if any.
+ RESOURCE_ROLE_UNSPECIFIED means this is a direct share (manually created).
+ Non-zero (e.g., ORG_PROJECTS_ADMIN, ORG_RUNNERS_ADMIN) means this assignment was
+ derived from an org-level role.
+ """
+
group_id: Optional[str] = FieldInfo(alias="groupId", default=None)
"""Group identifier"""
From 911140bc7050b5e02daec1f207bbced61db39e0b Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 30 Jan 2026 13:57:22 +0000
Subject: [PATCH 25/55] feat(api): add mcp_integrations field and type to
agent_execution
---
.stats.yml | 4 +--
src/gitpod/types/agent_execution.py | 42 +++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 09bb7b1..218acd8 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-92cecb570bf9966e9dc5cff1eedd2981a57121b013aa3b79d6b955d011e72e7e.yml
-openapi_spec_hash: 2adc05896eb8bdc68ca146d1a84666d1
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-09dc2c5238bcddd171d21ef3307566abc18e4958934f00e7331b8123a40d7f56.yml
+openapi_spec_hash: 79e5524d84ea8e44eb2bde551eb9f3af
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/types/agent_execution.py b/src/gitpod/types/agent_execution.py
index 4e4cd90..9c71cd3 100644
--- a/src/gitpod/types/agent_execution.py
+++ b/src/gitpod/types/agent_execution.py
@@ -20,6 +20,7 @@
"StatusCurrentOperation",
"StatusCurrentOperationLlm",
"StatusCurrentOperationToolUse",
+ "StatusMcpIntegrationStatus",
"StatusOutputs",
"StatusUsedEnvironment",
]
@@ -296,6 +297,39 @@ class StatusCurrentOperation(BaseModel):
tool_use: Optional[StatusCurrentOperationToolUse] = FieldInfo(alias="toolUse", default=None)
+class StatusMcpIntegrationStatus(BaseModel):
+ """
+ MCPIntegrationStatus represents the status of a single MCP integration
+ within an agent execution context
+ """
+
+ id: Optional[str] = None
+ """id is the unique name of the MCP integration"""
+
+ failure_message: Optional[str] = FieldInfo(alias="failureMessage", default=None)
+ """
+ failure_message contains the reason the MCP integration failed to connect or
+ operate
+ """
+
+ name: Optional[str] = None
+ """name is the unique name of the MCP integration (e.g., "linear", "notion")"""
+
+ phase: Optional[
+ Literal[
+ "MCP_INTEGRATION_PHASE_UNSPECIFIED",
+ "MCP_INTEGRATION_PHASE_INITIALIZING",
+ "MCP_INTEGRATION_PHASE_READY",
+ "MCP_INTEGRATION_PHASE_FAILED",
+ "MCP_INTEGRATION_PHASE_UNAVAILABLE",
+ ]
+ ] = None
+ """phase is the current connection/health phase"""
+
+ warning_message: Optional[str] = FieldInfo(alias="warningMessage", default=None)
+ """warning_message contains warnings (e.g., rate limiting, degraded performance)"""
+
+
class StatusOutputs(BaseModel):
bool_value: Optional[bool] = FieldInfo(alias="boolValue", default=None)
@@ -355,6 +389,14 @@ class Status(BaseModel):
judgement: Optional[str] = None
"""judgement is the judgement of the agent run produced by the judgement prompt."""
+ mcp_integration_statuses: Optional[List[StatusMcpIntegrationStatus]] = FieldInfo(
+ alias="mcpIntegrationStatuses", default=None
+ )
+ """
+ mcp_integration_statuses contains the status of all MCP integrations used by
+ this agent execution
+ """
+
mode: Optional[AgentMode] = None
"""
mode is the current operational mode of the agent execution. This is set by the
From 5abdcaecdc351d12e4715c1e4970d836173d6d9f Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 30 Jan 2026 14:05:40 +0000
Subject: [PATCH 26/55] feat(api): add user_ids filter to organization list
members method
---
.stats.yml | 4 ++--
src/gitpod/types/organization_list_members_params.py | 4 ++++
tests/api_resources/test_organizations.py | 2 ++
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 218acd8..d76713e 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-09dc2c5238bcddd171d21ef3307566abc18e4958934f00e7331b8123a40d7f56.yml
-openapi_spec_hash: 79e5524d84ea8e44eb2bde551eb9f3af
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-8045c2fdd23dfc0829570bd933443e57b57b0960cc9ab24641aeb17a32af1181.yml
+openapi_spec_hash: 70dd24a3356591fe5cc9eabec6efb7e3
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/types/organization_list_members_params.py b/src/gitpod/types/organization_list_members_params.py
index 2e5f87e..797d277 100644
--- a/src/gitpod/types/organization_list_members_params.py
+++ b/src/gitpod/types/organization_list_members_params.py
@@ -5,6 +5,7 @@
from typing import List
from typing_extensions import Literal, Required, Annotated, TypedDict
+from .._types import SequenceNotStr
from .._utils import PropertyInfo
from .shared.user_status import UserStatus
from .shared.organization_role import OrganizationRole
@@ -45,6 +46,9 @@ class Filter(TypedDict, total=False):
statuses: List[UserStatus]
"""status filters members by their user status"""
+ user_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="userIds")]
+ """user_ids filters the response to only members with the specified user IDs"""
+
class Pagination(TypedDict, total=False):
"""pagination contains the pagination options for listing members"""
diff --git a/tests/api_resources/test_organizations.py b/tests/api_resources/test_organizations.py
index b404eb7..0bc4e4f 100644
--- a/tests/api_resources/test_organizations.py
+++ b/tests/api_resources/test_organizations.py
@@ -270,6 +270,7 @@ def test_method_list_members_with_all_params(self, client: Gitpod) -> None:
"roles": ["ORGANIZATION_ROLE_UNSPECIFIED"],
"search": "search",
"statuses": ["USER_STATUS_UNSPECIFIED"],
+ "user_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
},
pagination={
"token": "token",
@@ -607,6 +608,7 @@ async def test_method_list_members_with_all_params(self, async_client: AsyncGitp
"roles": ["ORGANIZATION_ROLE_UNSPECIFIED"],
"search": "search",
"statuses": ["USER_STATUS_UNSPECIFIED"],
+ "user_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
},
pagination={
"token": "token",
From 320b285f1fd8723e6c6fa0dc027812cff0891485 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 30 Jan 2026 16:15:02 +0000
Subject: [PATCH 27/55] feat(api): add ResourceRoleOrgAutomationsAdmin to
ResourceRole enum
---
.stats.yml | 4 ++--
src/gitpod/types/shared/resource_role.py | 1 +
src/gitpod/types/shared_params/resource_role.py | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index d76713e..53b7b15 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-8045c2fdd23dfc0829570bd933443e57b57b0960cc9ab24641aeb17a32af1181.yml
-openapi_spec_hash: 70dd24a3356591fe5cc9eabec6efb7e3
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-634e8b0ac8d6d0dd5b5a27d882bbbb1d41c51fc3a07e5da82f3f500b667aef54.yml
+openapi_spec_hash: 70acf81c08d9692320671c10e7675114
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/types/shared/resource_role.py b/src/gitpod/types/shared/resource_role.py
index 7672e1f..6c12ed9 100644
--- a/src/gitpod/types/shared/resource_role.py
+++ b/src/gitpod/types/shared/resource_role.py
@@ -10,6 +10,7 @@
"RESOURCE_ROLE_ORG_MEMBER",
"RESOURCE_ROLE_ORG_RUNNERS_ADMIN",
"RESOURCE_ROLE_ORG_PROJECTS_ADMIN",
+ "RESOURCE_ROLE_ORG_AUTOMATIONS_ADMIN",
"RESOURCE_ROLE_GROUP_ADMIN",
"RESOURCE_ROLE_GROUP_VIEWER",
"RESOURCE_ROLE_USER_IDENTITY",
diff --git a/src/gitpod/types/shared_params/resource_role.py b/src/gitpod/types/shared_params/resource_role.py
index 8dcf94c..f481fd7 100644
--- a/src/gitpod/types/shared_params/resource_role.py
+++ b/src/gitpod/types/shared_params/resource_role.py
@@ -12,6 +12,7 @@
"RESOURCE_ROLE_ORG_MEMBER",
"RESOURCE_ROLE_ORG_RUNNERS_ADMIN",
"RESOURCE_ROLE_ORG_PROJECTS_ADMIN",
+ "RESOURCE_ROLE_ORG_AUTOMATIONS_ADMIN",
"RESOURCE_ROLE_GROUP_ADMIN",
"RESOURCE_ROLE_GROUP_VIEWER",
"RESOURCE_ROLE_USER_IDENTITY",
From c2fceff932dc786e8fc66d1fb44021e25f59c07e Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 30 Jan 2026 16:50:28 +0000
Subject: [PATCH 28/55] feat(api): add ResourceRoleOrgGroupsAdmin to
ResourceRole enum
---
.stats.yml | 4 ++--
src/gitpod/types/shared/resource_role.py | 1 +
src/gitpod/types/shared_params/resource_role.py | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 53b7b15..dfe50d7 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-634e8b0ac8d6d0dd5b5a27d882bbbb1d41c51fc3a07e5da82f3f500b667aef54.yml
-openapi_spec_hash: 70acf81c08d9692320671c10e7675114
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-937b2430bb562a8d67dfcb55bbc8d815912d3b5f6baba1e656fdaa8dc4bc1124.yml
+openapi_spec_hash: 669bf5b86f4300c4ac35e0836406aa72
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/types/shared/resource_role.py b/src/gitpod/types/shared/resource_role.py
index 6c12ed9..0f967e8 100644
--- a/src/gitpod/types/shared/resource_role.py
+++ b/src/gitpod/types/shared/resource_role.py
@@ -11,6 +11,7 @@
"RESOURCE_ROLE_ORG_RUNNERS_ADMIN",
"RESOURCE_ROLE_ORG_PROJECTS_ADMIN",
"RESOURCE_ROLE_ORG_AUTOMATIONS_ADMIN",
+ "RESOURCE_ROLE_ORG_GROUPS_ADMIN",
"RESOURCE_ROLE_GROUP_ADMIN",
"RESOURCE_ROLE_GROUP_VIEWER",
"RESOURCE_ROLE_USER_IDENTITY",
diff --git a/src/gitpod/types/shared_params/resource_role.py b/src/gitpod/types/shared_params/resource_role.py
index f481fd7..9ce4133 100644
--- a/src/gitpod/types/shared_params/resource_role.py
+++ b/src/gitpod/types/shared_params/resource_role.py
@@ -13,6 +13,7 @@
"RESOURCE_ROLE_ORG_RUNNERS_ADMIN",
"RESOURCE_ROLE_ORG_PROJECTS_ADMIN",
"RESOURCE_ROLE_ORG_AUTOMATIONS_ADMIN",
+ "RESOURCE_ROLE_ORG_GROUPS_ADMIN",
"RESOURCE_ROLE_GROUP_ADMIN",
"RESOURCE_ROLE_GROUP_VIEWER",
"RESOURCE_ROLE_USER_IDENTITY",
From 2b17fd5edfdb24eae166034cfaa6a526eb0e99b3 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 31 Jan 2026 12:08:44 +0000
Subject: [PATCH 29/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index dfe50d7..b27dde5 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-937b2430bb562a8d67dfcb55bbc8d815912d3b5f6baba1e656fdaa8dc4bc1124.yml
-openapi_spec_hash: 669bf5b86f4300c4ac35e0836406aa72
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-79f80f60df3a294748b8bd8ce2a759ae08637fab58abdc467e1de7238113b593.yml
+openapi_spec_hash: cfbaa294580b6dd5f05c7f3b360bf51a
config_hash: ad1db65b32248aecda41b64586aac9ce
From ebb58af507056efc59c72dd0a440320161598278 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 2 Feb 2026 16:00:36 +0000
Subject: [PATCH 30/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index b27dde5..8ff0345 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-79f80f60df3a294748b8bd8ce2a759ae08637fab58abdc467e1de7238113b593.yml
-openapi_spec_hash: cfbaa294580b6dd5f05c7f3b360bf51a
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-f63ed183567d574cc063cf415990670e949f058ebc27c8f5b58a66c88a47f1b9.yml
+openapi_spec_hash: 7ef9fdbaf346bf292cd40344c35915e5
config_hash: ad1db65b32248aecda41b64586aac9ce
From fb4f63f9369cdcdb2cbc729bcd0a4bc0aa7b7745 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 3 Feb 2026 08:57:16 +0000
Subject: [PATCH 31/55] fix(api): reject double-slash prefix in secret file
paths
---
.stats.yml | 4 ++--
src/gitpod/resources/secrets.py | 8 ++++----
src/gitpod/types/secret_create_params.py | 4 ++--
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 8ff0345..41efbf5 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-f63ed183567d574cc063cf415990670e949f058ebc27c8f5b58a66c88a47f1b9.yml
-openapi_spec_hash: 7ef9fdbaf346bf292cd40344c35915e5
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-95f4b5f46092288bbcb7239f4645a5c4a8bab207af478d684bda7b1824302249.yml
+openapi_spec_hash: 71d0bd114741dc44f319186f1bb29388
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/resources/secrets.py b/src/gitpod/resources/secrets.py
index 6367df2..915a0c7 100644
--- a/src/gitpod/resources/secrets.py
+++ b/src/gitpod/resources/secrets.py
@@ -126,10 +126,10 @@ def create(
secret
file_path: absolute path to the file where the secret is mounted value must be an absolute
- path (start with a /):
+ path (e.g. /path/to/file):
```
- this.matches("^/(?:[^/]*/)*.*$")
+ this.matches("^/[^/].*$")
```
project_id: project_id is the ProjectID this Secret belongs to Deprecated: use scope instead
@@ -502,10 +502,10 @@ async def create(
secret
file_path: absolute path to the file where the secret is mounted value must be an absolute
- path (start with a /):
+ path (e.g. /path/to/file):
```
- this.matches("^/(?:[^/]*/)*.*$")
+ this.matches("^/[^/].*$")
```
project_id: project_id is the ProjectID this Secret belongs to Deprecated: use scope instead
diff --git a/src/gitpod/types/secret_create_params.py b/src/gitpod/types/secret_create_params.py
index 37c2462..99e545f 100644
--- a/src/gitpod/types/secret_create_params.py
+++ b/src/gitpod/types/secret_create_params.py
@@ -33,10 +33,10 @@ class SecretCreateParams(TypedDict, total=False):
file_path: Annotated[str, PropertyInfo(alias="filePath")]
"""
absolute path to the file where the secret is mounted value must be an absolute
- path (start with a /):
+ path (e.g. /path/to/file):
```
- this.matches('^/(?:[^/]*/)*.*$')
+ this.matches('^/[^/].*$')
```
"""
From a8bd16ac36f9a98088c52970a98cb4606d6b548d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 3 Feb 2026 10:38:19 +0000
Subject: [PATCH 32/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 41efbf5..600ece7 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-95f4b5f46092288bbcb7239f4645a5c4a8bab207af478d684bda7b1824302249.yml
-openapi_spec_hash: 71d0bd114741dc44f319186f1bb29388
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-583526ba88a23fb4f201caf9cb943ec686266f6d1a3824236e02bd8b8d0ac88b.yml
+openapi_spec_hash: b5136c37f676a08ed07e14b39621ccd3
config_hash: ad1db65b32248aecda41b64586aac9ce
From 36cb0e0c52b1cf2f0039da792bdf2f830c51e411 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 4 Feb 2026 10:28:01 +0000
Subject: [PATCH 33/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 600ece7..6d84536 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-583526ba88a23fb4f201caf9cb943ec686266f6d1a3824236e02bd8b8d0ac88b.yml
-openapi_spec_hash: b5136c37f676a08ed07e14b39621ccd3
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-faa2b30146fbefb03cdd7d90cb77db52433bf688ab4af666a08a8adecb0f7886.yml
+openapi_spec_hash: 98830e3ab84b8b43d56688a9cc5dfea9
config_hash: ad1db65b32248aecda41b64586aac9ce
From 26f8232a0394ef61853c358248d3473b656afcba Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 4 Feb 2026 11:40:42 +0000
Subject: [PATCH 34/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 6d84536..9870600 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-faa2b30146fbefb03cdd7d90cb77db52433bf688ab4af666a08a8adecb0f7886.yml
-openapi_spec_hash: 98830e3ab84b8b43d56688a9cc5dfea9
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-cc8d238990c3a71d86bf784c242d790e73221f81df4e7cba974b869981830040.yml
+openapi_spec_hash: 0796d9a99d8468b8047be4adb0521554
config_hash: ad1db65b32248aecda41b64586aac9ce
From a58a2072984b1dc00dcb9e4bb6dde6739005d158 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 4 Feb 2026 13:32:43 +0000
Subject: [PATCH 35/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 9870600..9637de4 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-cc8d238990c3a71d86bf784c242d790e73221f81df4e7cba974b869981830040.yml
-openapi_spec_hash: 0796d9a99d8468b8047be4adb0521554
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-07e6f884c2d7d3023e23fce3a09bf303ab5edfbcafa0a41d5737008adc146058.yml
+openapi_spec_hash: 5e3806700798b135ab378ad69a3a59a8
config_hash: ad1db65b32248aecda41b64586aac9ce
From c1272d1a95dbcdb0366cff0c3158e3f9d4769f1a Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 4 Feb 2026 13:36:02 +0000
Subject: [PATCH 36/55] feat(api): add restrict_account_creation_to_scim field
to organization policy
---
.stats.yml | 4 ++--
src/gitpod/resources/organizations/policies.py | 12 ++++++++++++
.../types/organizations/organization_policies.py | 7 +++++++
.../types/organizations/policy_update_params.py | 7 +++++++
tests/api_resources/organizations/test_policies.py | 2 ++
5 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 9637de4..d6f9a14 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-07e6f884c2d7d3023e23fce3a09bf303ab5edfbcafa0a41d5737008adc146058.yml
-openapi_spec_hash: 5e3806700798b135ab378ad69a3a59a8
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-3b3f2a4c16effce7e3d18cb37a6210edfe1b4abc64e73103cccea8314d8231da.yml
+openapi_spec_hash: 32fa6acbed5a7465fbd93c939c81a78f
config_hash: ad1db65b32248aecda41b64586aac9ce
diff --git a/src/gitpod/resources/organizations/policies.py b/src/gitpod/resources/organizations/policies.py
index 93b785e..506afa8 100644
--- a/src/gitpod/resources/organizations/policies.py
+++ b/src/gitpod/resources/organizations/policies.py
@@ -112,6 +112,7 @@ def update(
members_require_projects: Optional[bool] | Omit = omit,
port_sharing_disabled: Optional[bool] | Omit = omit,
require_custom_domain_access: Optional[bool] | Omit = omit,
+ restrict_account_creation_to_scim: Optional[bool] | Omit = omit,
security_agent_policy: Optional[policy_update_params.SecurityAgentPolicy] | 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.
@@ -204,6 +205,10 @@ def update(
require_custom_domain_access: require_custom_domain_access controls whether users must access via custom
domain when one is configured. When true, access via app.gitpod.io is blocked.
+ restrict_account_creation_to_scim: restrict_account_creation_to_scim controls whether account creation is
+ restricted to SCIM-provisioned users only. When true and SCIM is configured for
+ the organization, only users provisioned via SCIM can create accounts.
+
security_agent_policy: security_agent_policy contains security agent configuration updates
extra_headers: Send extra headers
@@ -234,6 +239,7 @@ def update(
"members_require_projects": members_require_projects,
"port_sharing_disabled": port_sharing_disabled,
"require_custom_domain_access": require_custom_domain_access,
+ "restrict_account_creation_to_scim": restrict_account_creation_to_scim,
"security_agent_policy": security_agent_policy,
},
policy_update_params.PolicyUpdateParams,
@@ -336,6 +342,7 @@ async def update(
members_require_projects: Optional[bool] | Omit = omit,
port_sharing_disabled: Optional[bool] | Omit = omit,
require_custom_domain_access: Optional[bool] | Omit = omit,
+ restrict_account_creation_to_scim: Optional[bool] | Omit = omit,
security_agent_policy: Optional[policy_update_params.SecurityAgentPolicy] | 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.
@@ -428,6 +435,10 @@ async def update(
require_custom_domain_access: require_custom_domain_access controls whether users must access via custom
domain when one is configured. When true, access via app.gitpod.io is blocked.
+ restrict_account_creation_to_scim: restrict_account_creation_to_scim controls whether account creation is
+ restricted to SCIM-provisioned users only. When true and SCIM is configured for
+ the organization, only users provisioned via SCIM can create accounts.
+
security_agent_policy: security_agent_policy contains security agent configuration updates
extra_headers: Send extra headers
@@ -458,6 +469,7 @@ async def update(
"members_require_projects": members_require_projects,
"port_sharing_disabled": port_sharing_disabled,
"require_custom_domain_access": require_custom_domain_access,
+ "restrict_account_creation_to_scim": restrict_account_creation_to_scim,
"security_agent_policy": security_agent_policy,
},
policy_update_params.PolicyUpdateParams,
diff --git a/src/gitpod/types/organizations/organization_policies.py b/src/gitpod/types/organizations/organization_policies.py
index e84968b..8572da7 100644
--- a/src/gitpod/types/organizations/organization_policies.py
+++ b/src/gitpod/types/organizations/organization_policies.py
@@ -87,6 +87,13 @@ class OrganizationPolicies(BaseModel):
domain when one is configured. When true, access via app.gitpod.io is blocked.
"""
+ restrict_account_creation_to_scim: bool = FieldInfo(alias="restrictAccountCreationToScim")
+ """
+ restrict_account_creation_to_scim controls whether account creation is
+ restricted to SCIM-provisioned users only. When true and SCIM is configured for
+ the organization, only users provisioned via SCIM can create accounts.
+ """
+
delete_archived_environments_after: Optional[str] = FieldInfo(alias="deleteArchivedEnvironmentsAfter", default=None)
"""
delete_archived_environments_after controls how long archived environments are
diff --git a/src/gitpod/types/organizations/policy_update_params.py b/src/gitpod/types/organizations/policy_update_params.py
index 6c5f5eb..312bc12 100644
--- a/src/gitpod/types/organizations/policy_update_params.py
+++ b/src/gitpod/types/organizations/policy_update_params.py
@@ -112,6 +112,13 @@ class PolicyUpdateParams(TypedDict, total=False):
domain when one is configured. When true, access via app.gitpod.io is blocked.
"""
+ restrict_account_creation_to_scim: Annotated[Optional[bool], PropertyInfo(alias="restrictAccountCreationToScim")]
+ """
+ restrict_account_creation_to_scim controls whether account creation is
+ restricted to SCIM-provisioned users only. When true and SCIM is configured for
+ the organization, only users provisioned via SCIM can create accounts.
+ """
+
security_agent_policy: Annotated[Optional[SecurityAgentPolicy], PropertyInfo(alias="securityAgentPolicy")]
"""security_agent_policy contains security agent configuration updates"""
diff --git a/tests/api_resources/organizations/test_policies.py b/tests/api_resources/organizations/test_policies.py
index eed1d45..1d7ba27 100644
--- a/tests/api_resources/organizations/test_policies.py
+++ b/tests/api_resources/organizations/test_policies.py
@@ -84,6 +84,7 @@ def test_method_update_with_all_params(self, client: Gitpod) -> None:
members_require_projects=True,
port_sharing_disabled=True,
require_custom_domain_access=True,
+ restrict_account_creation_to_scim=True,
security_agent_policy={
"crowdstrike": {
"additional_options": {"foo": "string"},
@@ -195,6 +196,7 @@ async def test_method_update_with_all_params(self, async_client: AsyncGitpod) ->
members_require_projects=True,
port_sharing_disabled=True,
require_custom_domain_access=True,
+ restrict_account_creation_to_scim=True,
security_agent_policy={
"crowdstrike": {
"additional_options": {"foo": "string"},
From 2f7c026258961754cf862ad2caa52514a061036b Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 5 Feb 2026 09:27:30 +0000
Subject: [PATCH 37/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index d6f9a14..9bdc4e4 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-3b3f2a4c16effce7e3d18cb37a6210edfe1b4abc64e73103cccea8314d8231da.yml
-openapi_spec_hash: 32fa6acbed5a7465fbd93c939c81a78f
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-92fffd301d2d050355d06eafcfdba8fc4a702de6c27c624460355ad24c84efab.yml
+openapi_spec_hash: 2f357ec436f18dd0437372e87c65d719
config_hash: ad1db65b32248aecda41b64586aac9ce
From af512f54181bc7da478f5e47b949715bec0e8b03 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 5 Feb 2026 11:02:43 +0000
Subject: [PATCH 38/55] feat(api): add port access methods and organization
admission level to environments
---
.stats.yml | 6 +++---
src/gitpod/types/admission_level.py | 6 +++++-
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 9bdc4e4..b05bd28 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-92fffd301d2d050355d06eafcfdba8fc4a702de6c27c624460355ad24c84efab.yml
-openapi_spec_hash: 2f357ec436f18dd0437372e87c65d719
-config_hash: ad1db65b32248aecda41b64586aac9ce
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-67c67966cd1e08521239198f80dc006070947f4b5d91b77aa44bc0412a419707.yml
+openapi_spec_hash: 9684b4d6977a2d6f135246ba0dd65ec1
+config_hash: 2b9740817f5ef36649d603ece3a30906
diff --git a/src/gitpod/types/admission_level.py b/src/gitpod/types/admission_level.py
index 40ee48d..cfa4ee4 100644
--- a/src/gitpod/types/admission_level.py
+++ b/src/gitpod/types/admission_level.py
@@ -5,5 +5,9 @@
__all__ = ["AdmissionLevel"]
AdmissionLevel: TypeAlias = Literal[
- "ADMISSION_LEVEL_UNSPECIFIED", "ADMISSION_LEVEL_OWNER_ONLY", "ADMISSION_LEVEL_EVERYONE"
+ "ADMISSION_LEVEL_UNSPECIFIED",
+ "ADMISSION_LEVEL_OWNER_ONLY",
+ "ADMISSION_LEVEL_EVERYONE",
+ "ADMISSION_LEVEL_ORGANIZATION",
+ "ADMISSION_LEVEL_CREATOR_ONLY",
]
From 71e660d25b7d164b2d37b09058aa3e74f445e5ca Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 5 Feb 2026 20:14:06 +0000
Subject: [PATCH 39/55] feat(api): add opus 4.6 model variants to agent
supported models
---
.stats.yml | 4 ++--
src/gitpod/types/agent_execution.py | 2 ++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index b05bd28..5677a7c 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-67c67966cd1e08521239198f80dc006070947f4b5d91b77aa44bc0412a419707.yml
-openapi_spec_hash: 9684b4d6977a2d6f135246ba0dd65ec1
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-51659fa76fd9f1e88225f9cf97af0e2ebf5a675728618460693d7456c281f9a7.yml
+openapi_spec_hash: 84d0520cf93175c6993b93c8d3be2677
config_hash: 2b9740817f5ef36649d603ece3a30906
diff --git a/src/gitpod/types/agent_execution.py b/src/gitpod/types/agent_execution.py
index 9c71cd3..ee64847 100644
--- a/src/gitpod/types/agent_execution.py
+++ b/src/gitpod/types/agent_execution.py
@@ -440,6 +440,8 @@ class Status(BaseModel):
"SUPPORTED_MODEL_OPUS_4_EXTENDED",
"SUPPORTED_MODEL_OPUS_4_5",
"SUPPORTED_MODEL_OPUS_4_5_EXTENDED",
+ "SUPPORTED_MODEL_OPUS_4_6",
+ "SUPPORTED_MODEL_OPUS_4_6_EXTENDED",
"SUPPORTED_MODEL_OPENAI_4O",
"SUPPORTED_MODEL_OPENAI_4O_MINI",
"SUPPORTED_MODEL_OPENAI_O1",
From 110c2efc4f4d5dac2fa1209b7c85554060110889 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 6 Feb 2026 10:45:12 +0000
Subject: [PATCH 40/55] feat(api): add ExecutableDenyList to environment and
organization policy
---
.stats.yml | 6 +--
api.md | 3 ++
.../resources/organizations/policies.py | 11 +++++
src/gitpod/types/__init__.py | 4 ++
src/gitpod/types/environment_spec.py | 4 ++
src/gitpod/types/environment_spec_param.py | 4 ++
src/gitpod/types/environment_update_params.py | 4 ++
src/gitpod/types/kernel_controls_config.py | 15 ++++++
.../types/kernel_controls_config_param.py | 16 +++++++
src/gitpod/types/organizations/__init__.py | 2 +
.../organizations/executable_deny_list.py | 19 ++++++++
.../executable_deny_list_param.py | 21 ++++++++
.../organizations/organization_policies.py | 7 +++
.../organizations/policy_update_params.py | 7 +++
src/gitpod/types/veto.py | 24 ++++++++++
src/gitpod/types/veto_param.py | 26 ++++++++++
.../organizations/test_policies.py | 12 ++++-
tests/api_resources/test_environments.py | 48 +++++++++++++++++++
18 files changed, 229 insertions(+), 4 deletions(-)
create mode 100644 src/gitpod/types/kernel_controls_config.py
create mode 100644 src/gitpod/types/kernel_controls_config_param.py
create mode 100644 src/gitpod/types/organizations/executable_deny_list.py
create mode 100644 src/gitpod/types/organizations/executable_deny_list_param.py
create mode 100644 src/gitpod/types/veto.py
create mode 100644 src/gitpod/types/veto_param.py
diff --git a/.stats.yml b/.stats.yml
index 5677a7c..2331431 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-51659fa76fd9f1e88225f9cf97af0e2ebf5a675728618460693d7456c281f9a7.yml
-openapi_spec_hash: 84d0520cf93175c6993b93c8d3be2677
-config_hash: 2b9740817f5ef36649d603ece3a30906
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-912e6f9f02b4b4e145bd8c12e8ea65422246fb626abedb150c9791065d9407c1.yml
+openapi_spec_hash: e1ffa39323c616de827752550560ee7c
+config_hash: 1666c4673215d2af73eb14329610e026
diff --git a/api.md b/api.md
index 57eff1c..319c9df 100644
--- a/api.md
+++ b/api.md
@@ -121,6 +121,8 @@ from gitpod.types import (
EnvironmentRole,
EnvironmentSpec,
EnvironmentStatus,
+ KernelControlsConfig,
+ Veto,
EnvironmentCreateResponse,
EnvironmentRetrieveResponse,
EnvironmentCreateEnvironmentTokenResponse,
@@ -452,6 +454,7 @@ Types:
from gitpod.types.organizations import (
AgentPolicy,
CrowdStrikeConfig,
+ ExecutableDenyList,
OrganizationPolicies,
SecurityAgentPolicy,
PolicyRetrieveResponse,
diff --git a/src/gitpod/resources/organizations/policies.py b/src/gitpod/resources/organizations/policies.py
index 506afa8..0123019 100644
--- a/src/gitpod/resources/organizations/policies.py
+++ b/src/gitpod/resources/organizations/policies.py
@@ -19,6 +19,7 @@
from ..._base_client import make_request_options
from ...types.organizations import policy_update_params, policy_retrieve_params
from ...types.organizations.policy_retrieve_response import PolicyRetrieveResponse
+from ...types.organizations.executable_deny_list_param import ExecutableDenyListParam
__all__ = ["PoliciesResource", "AsyncPoliciesResource"]
@@ -104,6 +105,7 @@ def update(
default_environment_image: Optional[str] | Omit = omit,
delete_archived_environments_after: Optional[str] | Omit = omit,
editor_version_restrictions: Dict[str, policy_update_params.EditorVersionRestrictions] | Omit = omit,
+ executable_deny_list: Optional[ExecutableDenyListParam] | Omit = omit,
maximum_environment_lifetime: Optional[str] | Omit = omit,
maximum_environments_per_user: Optional[str] | Omit = omit,
maximum_environment_timeout: Optional[str] | Omit = omit,
@@ -180,6 +182,9 @@ def update(
editor_version_restrictions: editor_version_restrictions restricts which editor versions can be used. Maps
editor ID to version policy with allowed major versions.
+ executable_deny_list: executable_deny_list contains executables that are blocked from execution in
+ environments.
+
maximum_environment_lifetime: maximum_environment_lifetime controls for how long environments are allowed to
be reused. 0 means no maximum lifetime. Maximum duration is 180 days (15552000
seconds).
@@ -231,6 +236,7 @@ def update(
"default_environment_image": default_environment_image,
"delete_archived_environments_after": delete_archived_environments_after,
"editor_version_restrictions": editor_version_restrictions,
+ "executable_deny_list": executable_deny_list,
"maximum_environment_lifetime": maximum_environment_lifetime,
"maximum_environments_per_user": maximum_environments_per_user,
"maximum_environment_timeout": maximum_environment_timeout,
@@ -334,6 +340,7 @@ async def update(
default_environment_image: Optional[str] | Omit = omit,
delete_archived_environments_after: Optional[str] | Omit = omit,
editor_version_restrictions: Dict[str, policy_update_params.EditorVersionRestrictions] | Omit = omit,
+ executable_deny_list: Optional[ExecutableDenyListParam] | Omit = omit,
maximum_environment_lifetime: Optional[str] | Omit = omit,
maximum_environments_per_user: Optional[str] | Omit = omit,
maximum_environment_timeout: Optional[str] | Omit = omit,
@@ -410,6 +417,9 @@ async def update(
editor_version_restrictions: editor_version_restrictions restricts which editor versions can be used. Maps
editor ID to version policy with allowed major versions.
+ executable_deny_list: executable_deny_list contains executables that are blocked from execution in
+ environments.
+
maximum_environment_lifetime: maximum_environment_lifetime controls for how long environments are allowed to
be reused. 0 means no maximum lifetime. Maximum duration is 180 days (15552000
seconds).
@@ -461,6 +471,7 @@ async def update(
"default_environment_image": default_environment_image,
"delete_archived_environments_after": delete_archived_environments_after,
"editor_version_restrictions": editor_version_restrictions,
+ "executable_deny_list": executable_deny_list,
"maximum_environment_lifetime": maximum_environment_lifetime,
"maximum_environments_per_user": maximum_environments_per_user,
"maximum_environment_timeout": maximum_environment_timeout,
diff --git a/src/gitpod/types/__init__.py b/src/gitpod/types/__init__.py
index 4b195c7..b6f524e 100644
--- a/src/gitpod/types/__init__.py
+++ b/src/gitpod/types/__init__.py
@@ -3,6 +3,7 @@
from __future__ import annotations
from .user import User as User
+from .veto import Veto as Veto
from .group import Group as Group
from .editor import Editor as Editor
from .prompt import Prompt as Prompt
@@ -41,6 +42,7 @@
from .prebuild import Prebuild as Prebuild
from .log_level import LogLevel as LogLevel
from .agent_mode import AgentMode as AgentMode
+from .veto_param import VetoParam as VetoParam
from .environment import Environment as Environment
from .error_level import ErrorLevel as ErrorLevel
from .prompt_spec import PromptSpec as PromptSpec
@@ -120,6 +122,7 @@
from .project_update_params import ProjectUpdateParams as ProjectUpdateParams
from .editor_retrieve_params import EditorRetrieveParams as EditorRetrieveParams
from .environment_spec_param import EnvironmentSpecParam as EnvironmentSpecParam
+from .kernel_controls_config import KernelControlsConfig as KernelControlsConfig
from .prebuild_cancel_params import PrebuildCancelParams as PrebuildCancelParams
from .prebuild_create_params import PrebuildCreateParams as PrebuildCreateParams
from .prebuild_delete_params import PrebuildDeleteParams as PrebuildDeleteParams
@@ -184,6 +187,7 @@
from .agent_update_prompt_response import AgentUpdatePromptResponse as AgentUpdatePromptResponse
from .environment_unarchive_params import EnvironmentUnarchiveParams as EnvironmentUnarchiveParams
from .identity_get_id_token_params import IdentityGetIDTokenParams as IdentityGetIDTokenParams
+from .kernel_controls_config_param import KernelControlsConfigParam as KernelControlsConfigParam
from .organization_create_response import OrganizationCreateResponse as OrganizationCreateResponse
from .organization_retrieve_params import OrganizationRetrieveParams as OrganizationRetrieveParams
from .organization_set_role_params import OrganizationSetRoleParams as OrganizationSetRoleParams
diff --git a/src/gitpod/types/environment_spec.py b/src/gitpod/types/environment_spec.py
index 679336f..9d565a1 100644
--- a/src/gitpod/types/environment_spec.py
+++ b/src/gitpod/types/environment_spec.py
@@ -8,6 +8,7 @@
from .._models import BaseModel
from .admission_level import AdmissionLevel
from .environment_phase import EnvironmentPhase
+from .kernel_controls_config import KernelControlsConfig
from .environment_initializer import EnvironmentInitializer
from .shared.automation_trigger import AutomationTrigger
@@ -209,6 +210,9 @@ class EnvironmentSpec(BaseModel):
devcontainer: Optional[Devcontainer] = None
"""devcontainer is the devcontainer spec of the environment"""
+ kernel_controls_config: Optional[KernelControlsConfig] = FieldInfo(alias="kernelControlsConfig", default=None)
+ """kernel_controls_config configures kernel-level controls for this environment"""
+
machine: Optional[Machine] = None
"""machine is the machine spec of the environment"""
diff --git a/src/gitpod/types/environment_spec_param.py b/src/gitpod/types/environment_spec_param.py
index 3c10dbd..dc8b41f 100644
--- a/src/gitpod/types/environment_spec_param.py
+++ b/src/gitpod/types/environment_spec_param.py
@@ -8,6 +8,7 @@
from .._utils import PropertyInfo
from .admission_level import AdmissionLevel
from .environment_phase import EnvironmentPhase
+from .kernel_controls_config_param import KernelControlsConfigParam
from .environment_initializer_param import EnvironmentInitializerParam
from .shared_params.automation_trigger import AutomationTrigger
@@ -216,6 +217,9 @@ class EnvironmentSpecParam(TypedDict, total=False):
devcontainer: Devcontainer
"""devcontainer is the devcontainer spec of the environment"""
+ kernel_controls_config: Annotated[KernelControlsConfigParam, PropertyInfo(alias="kernelControlsConfig")]
+ """kernel_controls_config configures kernel-level controls for this environment"""
+
machine: Machine
"""machine is the machine spec of the environment"""
diff --git a/src/gitpod/types/environment_update_params.py b/src/gitpod/types/environment_update_params.py
index 904aa43..28879eb 100644
--- a/src/gitpod/types/environment_update_params.py
+++ b/src/gitpod/types/environment_update_params.py
@@ -7,6 +7,7 @@
from .._utils import PropertyInfo
from .admission_level import AdmissionLevel
+from .kernel_controls_config_param import KernelControlsConfigParam
from .environment_initializer_param import EnvironmentInitializerParam
__all__ = [
@@ -132,6 +133,9 @@ class Spec(TypedDict, total=False):
devcontainer: Optional[SpecDevcontainer]
+ kernel_controls_config: Annotated[Optional[KernelControlsConfigParam], PropertyInfo(alias="kernelControlsConfig")]
+ """kernel_controls_config configures kernel-level controls for this environment"""
+
ports: Iterable[SpecPort]
"""ports controls port sharing"""
diff --git a/src/gitpod/types/kernel_controls_config.py b/src/gitpod/types/kernel_controls_config.py
new file mode 100644
index 0000000..f8f06a9
--- /dev/null
+++ b/src/gitpod/types/kernel_controls_config.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+
+from .veto import Veto
+from .._models import BaseModel
+
+__all__ = ["KernelControlsConfig"]
+
+
+class KernelControlsConfig(BaseModel):
+ """KernelControlsConfig configures kernel-level controls for the environment"""
+
+ veto: Optional[Veto] = None
+ """veto controls blocking mechanisms"""
diff --git a/src/gitpod/types/kernel_controls_config_param.py b/src/gitpod/types/kernel_controls_config_param.py
new file mode 100644
index 0000000..11e6a86
--- /dev/null
+++ b/src/gitpod/types/kernel_controls_config_param.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+from .veto_param import VetoParam
+
+__all__ = ["KernelControlsConfigParam"]
+
+
+class KernelControlsConfigParam(TypedDict, total=False):
+ """KernelControlsConfig configures kernel-level controls for the environment"""
+
+ veto: VetoParam
+ """veto controls blocking mechanisms"""
diff --git a/src/gitpod/types/organizations/__init__.py b/src/gitpod/types/organizations/__init__.py
index a0d0c8f..71b61d5 100644
--- a/src/gitpod/types/organizations/__init__.py
+++ b/src/gitpod/types/organizations/__init__.py
@@ -11,6 +11,7 @@
from .crowd_strike_config import CrowdStrikeConfig as CrowdStrikeConfig
from .domain_verification import DomainVerification as DomainVerification
from .organization_invite import OrganizationInvite as OrganizationInvite
+from .executable_deny_list import ExecutableDenyList as ExecutableDenyList
from .invite_create_params import InviteCreateParams as InviteCreateParams
from .policy_update_params import PolicyUpdateParams as PolicyUpdateParams
from .organization_policies import OrganizationPolicies as OrganizationPolicies
@@ -24,6 +25,7 @@
from .policy_retrieve_response import PolicyRetrieveResponse as PolicyRetrieveResponse
from .domain_verification_state import DomainVerificationState as DomainVerificationState
from .invite_get_summary_params import InviteGetSummaryParams as InviteGetSummaryParams
+from .executable_deny_list_param import ExecutableDenyListParam as ExecutableDenyListParam
from .custom_domain_create_params import CustomDomainCreateParams as CustomDomainCreateParams
from .custom_domain_delete_params import CustomDomainDeleteParams as CustomDomainDeleteParams
from .custom_domain_update_params import CustomDomainUpdateParams as CustomDomainUpdateParams
diff --git a/src/gitpod/types/organizations/executable_deny_list.py b/src/gitpod/types/organizations/executable_deny_list.py
new file mode 100644
index 0000000..0fc4ea3
--- /dev/null
+++ b/src/gitpod/types/organizations/executable_deny_list.py
@@ -0,0 +1,19 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List, Optional
+
+from ..._models import BaseModel
+
+__all__ = ["ExecutableDenyList"]
+
+
+class ExecutableDenyList(BaseModel):
+ """
+ ExecutableDenyList contains executables that are blocked from execution in environments.
+ """
+
+ enabled: Optional[bool] = None
+ """enabled controls whether executable blocking is active"""
+
+ executables: Optional[List[str]] = None
+ """executables is the list of executable paths or names to block"""
diff --git a/src/gitpod/types/organizations/executable_deny_list_param.py b/src/gitpod/types/organizations/executable_deny_list_param.py
new file mode 100644
index 0000000..bfe2677
--- /dev/null
+++ b/src/gitpod/types/organizations/executable_deny_list_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_extensions import TypedDict
+
+from ..._types import SequenceNotStr
+
+__all__ = ["ExecutableDenyListParam"]
+
+
+class ExecutableDenyListParam(TypedDict, total=False):
+ """
+ ExecutableDenyList contains executables that are blocked from execution in environments.
+ """
+
+ enabled: bool
+ """enabled controls whether executable blocking is active"""
+
+ executables: SequenceNotStr[str]
+ """executables is the list of executable paths or names to block"""
diff --git a/src/gitpod/types/organizations/organization_policies.py b/src/gitpod/types/organizations/organization_policies.py
index 8572da7..bf2c814 100644
--- a/src/gitpod/types/organizations/organization_policies.py
+++ b/src/gitpod/types/organizations/organization_policies.py
@@ -6,6 +6,7 @@
from ..._models import BaseModel
from .agent_policy import AgentPolicy
+from .executable_deny_list import ExecutableDenyList
from .security_agent_policy import SecurityAgentPolicy
__all__ = ["OrganizationPolicies", "EditorVersionRestrictions"]
@@ -111,6 +112,12 @@ class OrganizationPolicies(BaseModel):
of the editor
"""
+ executable_deny_list: Optional[ExecutableDenyList] = FieldInfo(alias="executableDenyList", default=None)
+ """
+ executable_deny_list contains executables that are blocked from execution in
+ environments.
+ """
+
maximum_environment_lifetime: Optional[str] = FieldInfo(alias="maximumEnvironmentLifetime", default=None)
"""
maximum_environment_lifetime controls for how long environments are allowed to
diff --git a/src/gitpod/types/organizations/policy_update_params.py b/src/gitpod/types/organizations/policy_update_params.py
index 312bc12..d9dc1b2 100644
--- a/src/gitpod/types/organizations/policy_update_params.py
+++ b/src/gitpod/types/organizations/policy_update_params.py
@@ -7,6 +7,7 @@
from ..._types import SequenceNotStr
from ..._utils import PropertyInfo
+from .executable_deny_list_param import ExecutableDenyListParam
__all__ = [
"PolicyUpdateParams",
@@ -63,6 +64,12 @@ class PolicyUpdateParams(TypedDict, total=False):
editor ID to version policy with allowed major versions.
"""
+ executable_deny_list: Annotated[Optional[ExecutableDenyListParam], PropertyInfo(alias="executableDenyList")]
+ """
+ executable_deny_list contains executables that are blocked from execution in
+ environments.
+ """
+
maximum_environment_lifetime: Annotated[Optional[str], PropertyInfo(alias="maximumEnvironmentLifetime")]
"""
maximum_environment_lifetime controls for how long environments are allowed to
diff --git a/src/gitpod/types/veto.py b/src/gitpod/types/veto.py
new file mode 100644
index 0000000..e01f3ab
--- /dev/null
+++ b/src/gitpod/types/veto.py
@@ -0,0 +1,24 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import List, Optional
+
+from .._models import BaseModel
+
+__all__ = ["Veto", "Exec"]
+
+
+class Exec(BaseModel):
+ """exec controls executable blocking"""
+
+ denylist: Optional[List[str]] = None
+ """denylist is the list of executable paths or names to block"""
+
+ enabled: Optional[bool] = None
+ """enabled controls whether executable blocking is active"""
+
+
+class Veto(BaseModel):
+ """Veto controls kernel-level blocking mechanisms"""
+
+ exec: Optional[Exec] = None
+ """exec controls executable blocking"""
diff --git a/src/gitpod/types/veto_param.py b/src/gitpod/types/veto_param.py
new file mode 100644
index 0000000..ba6d52d
--- /dev/null
+++ b/src/gitpod/types/veto_param.py
@@ -0,0 +1,26 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+from .._types import SequenceNotStr
+
+__all__ = ["VetoParam", "Exec"]
+
+
+class Exec(TypedDict, total=False):
+ """exec controls executable blocking"""
+
+ denylist: SequenceNotStr[str]
+ """denylist is the list of executable paths or names to block"""
+
+ enabled: bool
+ """enabled controls whether executable blocking is active"""
+
+
+class VetoParam(TypedDict, total=False):
+ """Veto controls kernel-level blocking mechanisms"""
+
+ exec: Exec
+ """exec controls executable blocking"""
diff --git a/tests/api_resources/organizations/test_policies.py b/tests/api_resources/organizations/test_policies.py
index 1d7ba27..b7a74d8 100644
--- a/tests/api_resources/organizations/test_policies.py
+++ b/tests/api_resources/organizations/test_policies.py
@@ -9,7 +9,9 @@
from gitpod import Gitpod, AsyncGitpod
from tests.utils import assert_matches_type
-from gitpod.types.organizations import PolicyRetrieveResponse
+from gitpod.types.organizations import (
+ PolicyRetrieveResponse,
+)
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -76,6 +78,10 @@ def test_method_update_with_all_params(self, client: Gitpod) -> None:
default_environment_image="defaultEnvironmentImage",
delete_archived_environments_after="+9125115.360s",
editor_version_restrictions={"foo": {"allowed_versions": ["string"]}},
+ executable_deny_list={
+ "enabled": True,
+ "executables": ["string"],
+ },
maximum_environment_lifetime="+9125115.360s",
maximum_environments_per_user="20",
maximum_environment_timeout="3600s",
@@ -188,6 +194,10 @@ async def test_method_update_with_all_params(self, async_client: AsyncGitpod) ->
default_environment_image="defaultEnvironmentImage",
delete_archived_environments_after="+9125115.360s",
editor_version_restrictions={"foo": {"allowed_versions": ["string"]}},
+ executable_deny_list={
+ "enabled": True,
+ "executables": ["string"],
+ },
maximum_environment_lifetime="+9125115.360s",
maximum_environments_per_user="20",
maximum_environment_timeout="3600s",
diff --git a/tests/api_resources/test_environments.py b/tests/api_resources/test_environments.py
index c1e6442..8ade45d 100644
--- a/tests/api_resources/test_environments.py
+++ b/tests/api_resources/test_environments.py
@@ -80,6 +80,14 @@ def test_method_create_with_all_params(self, client: Gitpod) -> None:
"lifecycle_stage": "LIFECYCLE_STAGE_UNSPECIFIED",
"session": "session",
},
+ "kernel_controls_config": {
+ "veto": {
+ "exec": {
+ "denylist": ["string"],
+ "enabled": True,
+ }
+ }
+ },
"machine": {
"class": "d2c94c27-3b76-4a42-b88c-95a85e392c68",
"session": "session",
@@ -215,6 +223,14 @@ def test_method_update_with_all_params(self, client: Gitpod) -> None:
"devcontainer_file_path": "devcontainerFilePath",
"session": "session",
},
+ "kernel_controls_config": {
+ "veto": {
+ "exec": {
+ "denylist": ["string"],
+ "enabled": True,
+ }
+ }
+ },
"ports": [
{
"admission": "ADMISSION_LEVEL_UNSPECIFIED",
@@ -433,6 +449,14 @@ def test_method_create_from_project_with_all_params(self, client: Gitpod) -> Non
"lifecycle_stage": "LIFECYCLE_STAGE_UNSPECIFIED",
"session": "session",
},
+ "kernel_controls_config": {
+ "veto": {
+ "exec": {
+ "denylist": ["string"],
+ "enabled": True,
+ }
+ }
+ },
"machine": {
"class": "d2c94c27-3b76-4a42-b88c-95a85e392c68",
"session": "session",
@@ -738,6 +762,14 @@ async def test_method_create_with_all_params(self, async_client: AsyncGitpod) ->
"lifecycle_stage": "LIFECYCLE_STAGE_UNSPECIFIED",
"session": "session",
},
+ "kernel_controls_config": {
+ "veto": {
+ "exec": {
+ "denylist": ["string"],
+ "enabled": True,
+ }
+ }
+ },
"machine": {
"class": "d2c94c27-3b76-4a42-b88c-95a85e392c68",
"session": "session",
@@ -873,6 +905,14 @@ async def test_method_update_with_all_params(self, async_client: AsyncGitpod) ->
"devcontainer_file_path": "devcontainerFilePath",
"session": "session",
},
+ "kernel_controls_config": {
+ "veto": {
+ "exec": {
+ "denylist": ["string"],
+ "enabled": True,
+ }
+ }
+ },
"ports": [
{
"admission": "ADMISSION_LEVEL_UNSPECIFIED",
@@ -1091,6 +1131,14 @@ async def test_method_create_from_project_with_all_params(self, async_client: As
"lifecycle_stage": "LIFECYCLE_STAGE_UNSPECIFIED",
"session": "session",
},
+ "kernel_controls_config": {
+ "veto": {
+ "exec": {
+ "denylist": ["string"],
+ "enabled": True,
+ }
+ }
+ },
"machine": {
"class": "d2c94c27-3b76-4a42-b88c-95a85e392c68",
"session": "session",
From 371f8f7fc5e3fc882205b852aa684d5626c34e11 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 6 Feb 2026 12:45:25 +0000
Subject: [PATCH 41/55] feat(api): add scope field and enum to environment
secrets
---
.stats.yml | 4 ++--
src/gitpod/types/environment_spec.py | 15 +++++++++++++++
src/gitpod/types/environment_spec_param.py | 13 +++++++++++++
tests/api_resources/test_environments.py | 4 ++++
4 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 2331431..cb4b89a 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-912e6f9f02b4b4e145bd8c12e8ea65422246fb626abedb150c9791065d9407c1.yml
-openapi_spec_hash: e1ffa39323c616de827752550560ee7c
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-e086ada0c2b3511c0c38525a98751d806ba816a451b62f7f9c2265862c871914.yml
+openapi_spec_hash: 3c97cfd62d45e01dbadffb67fbfba1a3
config_hash: 1666c4673215d2af73eb14329610e026
diff --git a/src/gitpod/types/environment_spec.py b/src/gitpod/types/environment_spec.py
index 9d565a1..c4a10ec 100644
--- a/src/gitpod/types/environment_spec.py
+++ b/src/gitpod/types/environment_spec.py
@@ -158,6 +158,21 @@ class Secret(BaseModel):
name: Optional[str] = None
"""name is the human readable description of the secret"""
+ scope: Optional[
+ Literal[
+ "SCOPE_UNSPECIFIED",
+ "SCOPE_ORGANIZATION",
+ "SCOPE_PROJECT",
+ "SCOPE_USER",
+ "SCOPE_SERVICE_ACCOUNT",
+ "SCOPE_RUNNER",
+ ]
+ ] = None
+ """
+ scope indicates where this secret originated from. Used to filter secrets during
+ build (only org and project secrets are injected).
+ """
+
session: Optional[str] = None
"""
session indicated the current session of the secret. When the session does not
diff --git a/src/gitpod/types/environment_spec_param.py b/src/gitpod/types/environment_spec_param.py
index dc8b41f..a646dac 100644
--- a/src/gitpod/types/environment_spec_param.py
+++ b/src/gitpod/types/environment_spec_param.py
@@ -165,6 +165,19 @@ class Secret(TypedDict, total=False):
name: str
"""name is the human readable description of the secret"""
+ scope: Literal[
+ "SCOPE_UNSPECIFIED",
+ "SCOPE_ORGANIZATION",
+ "SCOPE_PROJECT",
+ "SCOPE_USER",
+ "SCOPE_SERVICE_ACCOUNT",
+ "SCOPE_RUNNER",
+ ]
+ """
+ scope indicates where this secret originated from. Used to filter secrets during
+ build (only org and project secrets are injected).
+ """
+
session: str
"""
session indicated the current session of the secret. When the session does not
diff --git a/tests/api_resources/test_environments.py b/tests/api_resources/test_environments.py
index 8ade45d..5c33ab5 100644
--- a/tests/api_resources/test_environments.py
+++ b/tests/api_resources/test_environments.py
@@ -109,6 +109,7 @@ def test_method_create_with_all_params(self, client: Gitpod) -> None:
"file_path": "filePath",
"git_credential_host": "gitCredentialHost",
"name": "name",
+ "scope": "SCOPE_UNSPECIFIED",
"session": "session",
"source": "source",
"source_ref": "sourceRef",
@@ -478,6 +479,7 @@ def test_method_create_from_project_with_all_params(self, client: Gitpod) -> Non
"file_path": "filePath",
"git_credential_host": "gitCredentialHost",
"name": "name",
+ "scope": "SCOPE_UNSPECIFIED",
"session": "session",
"source": "source",
"source_ref": "sourceRef",
@@ -791,6 +793,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncGitpod) ->
"file_path": "filePath",
"git_credential_host": "gitCredentialHost",
"name": "name",
+ "scope": "SCOPE_UNSPECIFIED",
"session": "session",
"source": "source",
"source_ref": "sourceRef",
@@ -1160,6 +1163,7 @@ async def test_method_create_from_project_with_all_params(self, async_client: As
"file_path": "filePath",
"git_credential_host": "gitCredentialHost",
"name": "name",
+ "scope": "SCOPE_UNSPECIFIED",
"session": "session",
"source": "source",
"source_ref": "sourceRef",
From 4daea73a72ddc65496bac0e57eafe44293d7b641 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 6 Feb 2026 16:51:37 +0000
Subject: [PATCH 42/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index cb4b89a..245dc82 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-e086ada0c2b3511c0c38525a98751d806ba816a451b62f7f9c2265862c871914.yml
-openapi_spec_hash: 3c97cfd62d45e01dbadffb67fbfba1a3
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-6e5f0e3fba6ca7b4fea95f8d634ed724bdc18a8b98fa1da473b18ac0a2931c27.yml
+openapi_spec_hash: a53d29056c5ed38b26508ed2cb9050a3
config_hash: 1666c4673215d2af73eb14329610e026
From fb0560e4feea8ad1c275c1033f6605edcec6c920 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 6 Feb 2026 17:23:25 +0000
Subject: [PATCH 43/55] codegen metadata
---
.stats.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 245dc82..6e5d882 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-6e5f0e3fba6ca7b4fea95f8d634ed724bdc18a8b98fa1da473b18ac0a2931c27.yml
-openapi_spec_hash: a53d29056c5ed38b26508ed2cb9050a3
-config_hash: 1666c4673215d2af73eb14329610e026
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-bb4e6859a80947948a22daab52f6d72617c89201cc0d06f94e4fedfc95eb6dbd.yml
+openapi_spec_hash: 76e9882895783cabd4c25a84c4c18ed0
+config_hash: 401f8a117c48e880889ed27a8403db29
From 2154cd8abfa221c6c5aa4af9e85919fc927d888e Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sat, 7 Feb 2026 11:28:21 +0000
Subject: [PATCH 44/55] docs(api): clarify port_sharing_disabled behavior in
organization policy
---
.stats.yml | 4 ++--
src/gitpod/resources/organizations/policies.py | 10 ++++++----
.../types/organizations/organization_policies.py | 5 +++--
src/gitpod/types/organizations/policy_update_params.py | 5 +++--
4 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 6e5d882..5acbe2d 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-bb4e6859a80947948a22daab52f6d72617c89201cc0d06f94e4fedfc95eb6dbd.yml
-openapi_spec_hash: 76e9882895783cabd4c25a84c4c18ed0
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-4e76b45ac7aedb89d725b01fea9f009672c3f3b0117393178e034718095339a3.yml
+openapi_spec_hash: 11437695b49cfe5d28bef5d4ee65d696
config_hash: 401f8a117c48e880889ed27a8403db29
diff --git a/src/gitpod/resources/organizations/policies.py b/src/gitpod/resources/organizations/policies.py
index 0123019..28d2142 100644
--- a/src/gitpod/resources/organizations/policies.py
+++ b/src/gitpod/resources/organizations/policies.py
@@ -204,8 +204,9 @@ def update(
members_require_projects: members_require_projects controls whether environments can only be created from
projects by non-admin users
- port_sharing_disabled: port_sharing_disabled controls whether port sharing is disabled in the
- organization
+ port_sharing_disabled: port_sharing_disabled controls whether user-initiated port sharing is disabled
+ in the organization. System ports (VS Code Browser, agents) are always exempt
+ from this policy.
require_custom_domain_access: require_custom_domain_access controls whether users must access via custom
domain when one is configured. When true, access via app.gitpod.io is blocked.
@@ -439,8 +440,9 @@ async def update(
members_require_projects: members_require_projects controls whether environments can only be created from
projects by non-admin users
- port_sharing_disabled: port_sharing_disabled controls whether port sharing is disabled in the
- organization
+ port_sharing_disabled: port_sharing_disabled controls whether user-initiated port sharing is disabled
+ in the organization. System ports (VS Code Browser, agents) are always exempt
+ from this policy.
require_custom_domain_access: require_custom_domain_access controls whether users must access via custom
domain when one is configured. When true, access via app.gitpod.io is blocked.
diff --git a/src/gitpod/types/organizations/organization_policies.py b/src/gitpod/types/organizations/organization_policies.py
index bf2c814..ea62f2e 100644
--- a/src/gitpod/types/organizations/organization_policies.py
+++ b/src/gitpod/types/organizations/organization_policies.py
@@ -78,8 +78,9 @@ class OrganizationPolicies(BaseModel):
port_sharing_disabled: bool = FieldInfo(alias="portSharingDisabled")
"""
- port_sharing_disabled controls whether port sharing is disabled in the
- organization
+ port_sharing_disabled controls whether user-initiated port sharing is disabled
+ in the organization. System ports (VS Code Browser, agents) are always exempt
+ from this policy.
"""
require_custom_domain_access: bool = FieldInfo(alias="requireCustomDomainAccess")
diff --git a/src/gitpod/types/organizations/policy_update_params.py b/src/gitpod/types/organizations/policy_update_params.py
index d9dc1b2..33cc314 100644
--- a/src/gitpod/types/organizations/policy_update_params.py
+++ b/src/gitpod/types/organizations/policy_update_params.py
@@ -109,8 +109,9 @@ class PolicyUpdateParams(TypedDict, total=False):
port_sharing_disabled: Annotated[Optional[bool], PropertyInfo(alias="portSharingDisabled")]
"""
- port_sharing_disabled controls whether port sharing is disabled in the
- organization
+ port_sharing_disabled controls whether user-initiated port sharing is disabled
+ in the organization. System ports (VS Code Browser, agents) are always exempt
+ from this policy.
"""
require_custom_domain_access: Annotated[Optional[bool], PropertyInfo(alias="requireCustomDomainAccess")]
From 07aa0cc02a4b65244104be04289c949bfb013c14 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 9 Feb 2026 10:35:00 +0000
Subject: [PATCH 45/55] feat(api): add additional_scopes to organization SSO
configuration
---
.stats.yml | 6 ++---
api.md | 1 +
.../organizations/sso_configurations.py | 25 +++++++++++++++++++
src/gitpod/types/organizations/__init__.py | 1 +
.../additional_scopes_update_param.py | 19 ++++++++++++++
.../types/organizations/sso_configuration.py | 6 +++++
.../sso_configuration_create_params.py | 7 ++++++
.../sso_configuration_update_params.py | 8 ++++++
.../organizations/test_sso_configurations.py | 4 +++
9 files changed, 74 insertions(+), 3 deletions(-)
create mode 100644 src/gitpod/types/organizations/additional_scopes_update_param.py
diff --git a/.stats.yml b/.stats.yml
index 5acbe2d..003adc8 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-4e76b45ac7aedb89d725b01fea9f009672c3f3b0117393178e034718095339a3.yml
-openapi_spec_hash: 11437695b49cfe5d28bef5d4ee65d696
-config_hash: 401f8a117c48e880889ed27a8403db29
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-a6b5c6f4bd34c0b9cbb1321be432905e6120f4479ad2a53d35790f99c2e05b29.yml
+openapi_spec_hash: 83b243294469b6646f0c4659566b3f48
+config_hash: 73b8de7922813d562151d404149c768d
diff --git a/api.md b/api.md
index 319c9df..ce41da2 100644
--- a/api.md
+++ b/api.md
@@ -495,6 +495,7 @@ Types:
```python
from gitpod.types.organizations import (
+ AdditionalScopesUpdate,
ProviderType,
SSOConfiguration,
SSOConfigurationState,
diff --git a/src/gitpod/resources/organizations/sso_configurations.py b/src/gitpod/resources/organizations/sso_configurations.py
index 7d9796c..a6b0056 100644
--- a/src/gitpod/resources/organizations/sso_configurations.py
+++ b/src/gitpod/resources/organizations/sso_configurations.py
@@ -28,6 +28,7 @@
)
from ...types.organizations.sso_configuration import SSOConfiguration
from ...types.organizations.sso_configuration_state import SSOConfigurationState
+from ...types.organizations.additional_scopes_update_param import AdditionalScopesUpdateParam
from ...types.organizations.sso_configuration_create_response import SSOConfigurationCreateResponse
from ...types.organizations.sso_configuration_retrieve_response import SSOConfigurationRetrieveResponse
@@ -61,6 +62,7 @@ def create(
client_secret: str,
issuer_url: str,
organization_id: str,
+ additional_scopes: SequenceNotStr[str] | Omit = omit,
display_name: str | Omit = omit,
email_domain: Optional[str] | Omit = omit,
email_domains: SequenceNotStr[str] | Omit = omit,
@@ -114,6 +116,10 @@ def create(
issuer_url: issuer_url is the URL of the IdP issuer
+ additional_scopes: additional_scopes are extra OIDC scopes to request from the identity provider
+ during sign-in. These are appended to the default scopes (openid, email,
+ profile).
+
email_domain: email_domain is the domain that is allowed to sign in to the organization
extra_headers: Send extra headers
@@ -132,6 +138,7 @@ def create(
"client_secret": client_secret,
"issuer_url": issuer_url,
"organization_id": organization_id,
+ "additional_scopes": additional_scopes,
"display_name": display_name,
"email_domain": email_domain,
"email_domains": email_domains,
@@ -201,6 +208,7 @@ def update(
self,
*,
sso_configuration_id: str,
+ additional_scopes: Optional[AdditionalScopesUpdateParam] | Omit = omit,
claims: Dict[str, str] | Omit = omit,
client_id: Optional[str] | Omit = omit,
client_secret: Optional[str] | Omit = omit,
@@ -251,6 +259,10 @@ def update(
Args:
sso_configuration_id: sso_configuration_id is the ID of the SSO configuration to update
+ additional_scopes: additional_scopes replaces the configured OIDC scopes when present. When absent
+ (nil), scopes are left unchanged. When present with an empty scopes list, all
+ additional scopes are cleared.
+
claims: claims are key/value pairs that defines a mapping of claims issued by the IdP.
client_id: client_id is the client ID of the SSO provider
@@ -274,6 +286,7 @@ def update(
body=maybe_transform(
{
"sso_configuration_id": sso_configuration_id,
+ "additional_scopes": additional_scopes,
"claims": claims,
"client_id": client_id,
"client_secret": client_secret,
@@ -455,6 +468,7 @@ async def create(
client_secret: str,
issuer_url: str,
organization_id: str,
+ additional_scopes: SequenceNotStr[str] | Omit = omit,
display_name: str | Omit = omit,
email_domain: Optional[str] | Omit = omit,
email_domains: SequenceNotStr[str] | Omit = omit,
@@ -508,6 +522,10 @@ async def create(
issuer_url: issuer_url is the URL of the IdP issuer
+ additional_scopes: additional_scopes are extra OIDC scopes to request from the identity provider
+ during sign-in. These are appended to the default scopes (openid, email,
+ profile).
+
email_domain: email_domain is the domain that is allowed to sign in to the organization
extra_headers: Send extra headers
@@ -526,6 +544,7 @@ async def create(
"client_secret": client_secret,
"issuer_url": issuer_url,
"organization_id": organization_id,
+ "additional_scopes": additional_scopes,
"display_name": display_name,
"email_domain": email_domain,
"email_domains": email_domains,
@@ -595,6 +614,7 @@ async def update(
self,
*,
sso_configuration_id: str,
+ additional_scopes: Optional[AdditionalScopesUpdateParam] | Omit = omit,
claims: Dict[str, str] | Omit = omit,
client_id: Optional[str] | Omit = omit,
client_secret: Optional[str] | Omit = omit,
@@ -645,6 +665,10 @@ async def update(
Args:
sso_configuration_id: sso_configuration_id is the ID of the SSO configuration to update
+ additional_scopes: additional_scopes replaces the configured OIDC scopes when present. When absent
+ (nil), scopes are left unchanged. When present with an empty scopes list, all
+ additional scopes are cleared.
+
claims: claims are key/value pairs that defines a mapping of claims issued by the IdP.
client_id: client_id is the client ID of the SSO provider
@@ -668,6 +692,7 @@ async def update(
body=await async_maybe_transform(
{
"sso_configuration_id": sso_configuration_id,
+ "additional_scopes": additional_scopes,
"claims": claims,
"client_id": client_id,
"client_secret": client_secret,
diff --git a/src/gitpod/types/organizations/__init__.py b/src/gitpod/types/organizations/__init__.py
index 71b61d5..86ec7ae 100644
--- a/src/gitpod/types/organizations/__init__.py
+++ b/src/gitpod/types/organizations/__init__.py
@@ -34,6 +34,7 @@
from .custom_domain_retrieve_params import CustomDomainRetrieveParams as CustomDomainRetrieveParams
from .custom_domain_update_response import CustomDomainUpdateResponse as CustomDomainUpdateResponse
from .sso_configuration_list_params import SSOConfigurationListParams as SSOConfigurationListParams
+from .additional_scopes_update_param import AdditionalScopesUpdateParam as AdditionalScopesUpdateParam
from .announcement_banner_get_params import AnnouncementBannerGetParams as AnnouncementBannerGetParams
from .scim_configuration_list_params import ScimConfigurationListParams as ScimConfigurationListParams
from .custom_domain_retrieve_response import CustomDomainRetrieveResponse as CustomDomainRetrieveResponse
diff --git a/src/gitpod/types/organizations/additional_scopes_update_param.py b/src/gitpod/types/organizations/additional_scopes_update_param.py
new file mode 100644
index 0000000..8c45b5e
--- /dev/null
+++ b/src/gitpod/types/organizations/additional_scopes_update_param.py
@@ -0,0 +1,19 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+from ..._types import SequenceNotStr
+
+__all__ = ["AdditionalScopesUpdateParam"]
+
+
+class AdditionalScopesUpdateParam(TypedDict, total=False):
+ """
+ AdditionalScopesUpdate wraps a list of OIDC scopes so that the update request
+ can distinguish "not changing scopes" (field absent) from "clearing all scopes"
+ (field present, empty list).
+ """
+
+ scopes: SequenceNotStr[str]
diff --git a/src/gitpod/types/organizations/sso_configuration.py b/src/gitpod/types/organizations/sso_configuration.py
index 7f7f70b..f5dd4db 100644
--- a/src/gitpod/types/organizations/sso_configuration.py
+++ b/src/gitpod/types/organizations/sso_configuration.py
@@ -26,6 +26,12 @@ class SSOConfiguration(BaseModel):
state: SSOConfigurationState
"""state is the state of the SSO configuration"""
+ additional_scopes: Optional[List[str]] = FieldInfo(alias="additionalScopes", default=None)
+ """
+ additional_scopes are extra OIDC scopes requested from the identity provider
+ during sign-in.
+ """
+
claims: Optional[Dict[str, str]] = None
"""claims are key/value pairs that defines a mapping of claims issued by the IdP."""
diff --git a/src/gitpod/types/organizations/sso_configuration_create_params.py b/src/gitpod/types/organizations/sso_configuration_create_params.py
index 04f39fb..16ffadb 100644
--- a/src/gitpod/types/organizations/sso_configuration_create_params.py
+++ b/src/gitpod/types/organizations/sso_configuration_create_params.py
@@ -23,6 +23,13 @@ class SSOConfigurationCreateParams(TypedDict, total=False):
organization_id: Required[Annotated[str, PropertyInfo(alias="organizationId")]]
+ additional_scopes: Annotated[SequenceNotStr[str], PropertyInfo(alias="additionalScopes")]
+ """
+ additional_scopes are extra OIDC scopes to request from the identity provider
+ during sign-in. These are appended to the default scopes (openid, email,
+ profile).
+ """
+
display_name: Annotated[str, PropertyInfo(alias="displayName")]
email_domain: Annotated[Optional[str], PropertyInfo(alias="emailDomain")]
diff --git a/src/gitpod/types/organizations/sso_configuration_update_params.py b/src/gitpod/types/organizations/sso_configuration_update_params.py
index 998789a..7f85387 100644
--- a/src/gitpod/types/organizations/sso_configuration_update_params.py
+++ b/src/gitpod/types/organizations/sso_configuration_update_params.py
@@ -8,6 +8,7 @@
from ..._types import SequenceNotStr
from ..._utils import PropertyInfo
from .sso_configuration_state import SSOConfigurationState
+from .additional_scopes_update_param import AdditionalScopesUpdateParam
__all__ = ["SSOConfigurationUpdateParams"]
@@ -16,6 +17,13 @@ class SSOConfigurationUpdateParams(TypedDict, total=False):
sso_configuration_id: Required[Annotated[str, PropertyInfo(alias="ssoConfigurationId")]]
"""sso_configuration_id is the ID of the SSO configuration to update"""
+ additional_scopes: Annotated[Optional[AdditionalScopesUpdateParam], PropertyInfo(alias="additionalScopes")]
+ """
+ additional_scopes replaces the configured OIDC scopes when present. When absent
+ (nil), scopes are left unchanged. When present with an empty scopes list, all
+ additional scopes are cleared.
+ """
+
claims: Dict[str, str]
"""claims are key/value pairs that defines a mapping of claims issued by the IdP."""
diff --git a/tests/api_resources/organizations/test_sso_configurations.py b/tests/api_resources/organizations/test_sso_configurations.py
index 9e10ff8..9dd1f95 100644
--- a/tests/api_resources/organizations/test_sso_configurations.py
+++ b/tests/api_resources/organizations/test_sso_configurations.py
@@ -41,6 +41,7 @@ def test_method_create_with_all_params(self, client: Gitpod) -> None:
client_secret="GOCSPX-abcdefghijklmnopqrstuvwxyz123456",
issuer_url="https://accounts.google.com",
organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ additional_scopes=["x"],
display_name="displayName",
email_domain="acme-corp.com",
email_domains=["sfN2.l.iJR-BU.u9JV9.a.m.o2D-4b-Jd.0Z-kX.L.n.S.f.UKbxB"],
@@ -126,6 +127,7 @@ def test_method_update(self, client: Gitpod) -> None:
def test_method_update_with_all_params(self, client: Gitpod) -> None:
sso_configuration = client.organizations.sso_configurations.update(
sso_configuration_id="d2c94c27-3b76-4a42-b88c-95a85e392c68",
+ additional_scopes={"scopes": ["x"]},
claims={"foo": "string"},
client_id="new-client-id",
client_secret="new-client-secret",
@@ -270,6 +272,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncGitpod) ->
client_secret="GOCSPX-abcdefghijklmnopqrstuvwxyz123456",
issuer_url="https://accounts.google.com",
organization_id="b0e12f6c-4c67-429d-a4a6-d9838b5da047",
+ additional_scopes=["x"],
display_name="displayName",
email_domain="acme-corp.com",
email_domains=["sfN2.l.iJR-BU.u9JV9.a.m.o2D-4b-Jd.0Z-kX.L.n.S.f.UKbxB"],
@@ -355,6 +358,7 @@ async def test_method_update(self, async_client: AsyncGitpod) -> None:
async def test_method_update_with_all_params(self, async_client: AsyncGitpod) -> None:
sso_configuration = await async_client.organizations.sso_configurations.update(
sso_configuration_id="d2c94c27-3b76-4a42-b88c-95a85e392c68",
+ additional_scopes={"scopes": ["x"]},
claims={"foo": "string"},
client_id="new-client-id",
client_secret="new-client-secret",
From 330558de3704863336c8b0bce5559237ef2d0e79 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 9 Feb 2026 14:38:26 +0000
Subject: [PATCH 46/55] chore(internal): bump dependencies
---
requirements-dev.lock | 71 +++++++++++++++++++++++++------------------
requirements.lock | 8 ++---
2 files changed, 45 insertions(+), 34 deletions(-)
diff --git a/requirements-dev.lock b/requirements-dev.lock
index 7e74323..08e698e 100644
--- a/requirements-dev.lock
+++ b/requirements-dev.lock
@@ -12,15 +12,15 @@
-e file:.
aiohappyeyeballs==2.6.1
# via aiohttp
-aiohttp==3.13.2
+aiohttp==3.13.3
# via gitpod-sdk
# via httpx-aiohttp
aiosignal==1.4.0
# via aiohttp
annotated-types==0.7.0
# via pydantic
-anthropic==0.45.2
-anyio==4.4.0
+anthropic==0.79.0
+anyio==4.12.1
# via anthropic
# via gitpod-sdk
# via httpx
@@ -30,25 +30,32 @@ async-timeout==5.0.1
# via aiohttp
attrs==25.4.0
# via aiohttp
-bcrypt==4.2.1
+ # via nox
+backports-asyncio-runner==1.2.0
+ # via pytest-asyncio
+bcrypt==5.0.0
# via paramiko
-certifi==2023.7.22
+certifi==2026.1.4
# via httpcore
# via httpx
-cffi==1.17.1
+cffi==2.0.0
# via cryptography
# via pynacl
-colorlog==6.7.0
+colorlog==6.10.1
# via nox
-cryptography==44.0.1
+cryptography==46.0.5
# via paramiko
# via types-paramiko
-dirty-equals==0.6.0
-distlib==0.3.7
+dependency-groups==1.3.1
+ # via nox
+dirty-equals==0.11
+distlib==0.4.0
# via virtualenv
-distro==1.8.0
+distro==1.9.0
# via anthropic
# via gitpod-sdk
+docstring-parser==0.17.0
+ # via anthropic
exceptiongroup==1.3.1
# via anyio
# via pytest
@@ -68,7 +75,7 @@ httpx==0.28.1
# via gitpod-sdk
# via httpx-aiohttp
# via respx
-httpx-aiohttp==0.1.9
+httpx-aiohttp==0.1.12
# via gitpod-sdk
humanize==4.13.0
# via nox
@@ -76,10 +83,12 @@ idna==3.11
# via anyio
# via httpx
# via yarl
-importlib-metadata==8.7.0
+importlib-metadata==8.7.1
iniconfig==2.1.0
# via pytest
-jiter==0.8.2
+invoke==2.2.1
+ # via paramiko
+jiter==0.13.0
# via anthropic
markdown-it-py==3.0.0
# via rich
@@ -91,33 +100,34 @@ multidict==6.7.0
mypy==1.17.0
mypy-extensions==1.1.0
# via mypy
-nodeenv==1.9.1
+nodeenv==1.10.0
# via pyright
nox==2025.11.12
packaging==25.0
# via dependency-groups
# via nox
# via pytest
-pathspec==0.12.1
+paramiko==4.0.0
+pathspec==1.0.3
# via mypy
-paramiko==3.5.1
-platformdirs==3.11.0
+platformdirs==4.4.0
# via virtualenv
pluggy==1.6.0
# via pytest
propcache==0.4.1
# via aiohttp
# via yarl
-pydantic==2.11.9
- # via anthropic
-pycparser==2.22
+pycparser==2.23
# via cffi
-pydantic-core==2.33.2
+pydantic==2.12.5
+ # via anthropic
+ # via gitpod-sdk
+pydantic-core==2.41.5
# via pydantic
pygments==2.19.2
# via pytest
# via rich
-pynacl==1.5.0
+pynacl==1.6.2
# via paramiko
pyright==1.1.399
pytest==8.4.2
@@ -129,23 +139,24 @@ python-dateutil==2.9.0.post0
# via time-machine
respx==0.22.0
rich==14.2.0
-ruff==0.14.7
+ruff==0.14.13
six==1.17.0
# via python-dateutil
-sniffio==1.3.0
+sniffio==1.3.1
# via anthropic
- # via anyio
# via gitpod-sdk
time-machine==2.19.0
-tomli==2.3.0
+tomli==2.4.0
# via dependency-groups
# via mypy
# via nox
# via pytest
-types-paramiko==3.5.0.20240928
-typing-extensions==4.12.2
+types-paramiko==4.0.0.20250822
+typing-extensions==4.15.0
+ # via aiosignal
# via anthropic
# via anyio
+ # via cryptography
# via exceptiongroup
# via gitpod-sdk
# via multidict
@@ -158,7 +169,7 @@ typing-extensions==4.12.2
# via virtualenv
typing-inspection==0.4.2
# via pydantic
-virtualenv==20.35.4
+virtualenv==20.36.1
# via nox
yarl==1.22.0
# via aiohttp
diff --git a/requirements.lock b/requirements.lock
index 73d1ab7..009f1a1 100644
--- a/requirements.lock
+++ b/requirements.lock
@@ -12,21 +12,21 @@
-e file:.
aiohappyeyeballs==2.6.1
# via aiohttp
-aiohttp==3.13.2
+aiohttp==3.13.3
# via gitpod-sdk
# via httpx-aiohttp
aiosignal==1.4.0
# via aiohttp
annotated-types==0.7.0
# via pydantic
-anyio==4.12.0
+anyio==4.12.1
# via gitpod-sdk
# via httpx
async-timeout==5.0.1
# via aiohttp
attrs==25.4.0
# via aiohttp
-certifi==2025.11.12
+certifi==2026.1.4
# via httpcore
# via httpx
distro==1.9.0
@@ -43,7 +43,7 @@ httpcore==1.0.9
httpx==0.28.1
# via gitpod-sdk
# via httpx-aiohttp
-httpx-aiohttp==0.1.9
+httpx-aiohttp==0.1.12
# via gitpod-sdk
idna==3.11
# via anyio
From 35ed7a75b6a7c71d3252f8af2e741ecad4a4864f Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 10 Feb 2026 09:21:57 +0000
Subject: [PATCH 47/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 003adc8..0be9cd8 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-a6b5c6f4bd34c0b9cbb1321be432905e6120f4479ad2a53d35790f99c2e05b29.yml
-openapi_spec_hash: 83b243294469b6646f0c4659566b3f48
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-b965bf6fa31985d197c1898d68474d8089286972638497d1adcccb01b843cd18.yml
+openapi_spec_hash: 75acb7e119f7eb4144c0df0f2f221afe
config_hash: 73b8de7922813d562151d404149c768d
From c1c9496353789068fb93e56b6de89136c511cdb0 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 10 Feb 2026 09:59:34 +0000
Subject: [PATCH 48/55] codegen metadata
---
.stats.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 0be9cd8..bfc0571 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-b965bf6fa31985d197c1898d68474d8089286972638497d1adcccb01b843cd18.yml
-openapi_spec_hash: 75acb7e119f7eb4144c0df0f2f221afe
-config_hash: 73b8de7922813d562151d404149c768d
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-2083161ba9b1eb8429e21c30b34c94ed1fc450095f54498a1dfeba19c4cb780f.yml
+openapi_spec_hash: 675370d39672e735988f8501c9502dfc
+config_hash: 2daf822ad8d9d03f0a72a8bf8adc92a1
From b997cfe8e95a7e55a645e7fa54446555ed0108e4 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 10 Feb 2026 16:32:36 +0000
Subject: [PATCH 49/55] feat(api): add warm pools resource to prebuilds
---
.stats.yml | 4 ++--
src/gitpod/types/shared/resource_role.py | 1 +
src/gitpod/types/shared/resource_type.py | 1 +
src/gitpod/types/shared_params/resource_role.py | 1 +
src/gitpod/types/shared_params/resource_type.py | 1 +
5 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index bfc0571..51dc30e 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-2083161ba9b1eb8429e21c30b34c94ed1fc450095f54498a1dfeba19c4cb780f.yml
-openapi_spec_hash: 675370d39672e735988f8501c9502dfc
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-c6bbc07d363a615337303ef6c5338faed25448b6963b992ed29418dba3de6136.yml
+openapi_spec_hash: acc8bbf6f8313c075e9bdba83700baa7
config_hash: 2daf822ad8d9d03f0a72a8bf8adc92a1
diff --git a/src/gitpod/types/shared/resource_role.py b/src/gitpod/types/shared/resource_role.py
index 0f967e8..8228948 100644
--- a/src/gitpod/types/shared/resource_role.py
+++ b/src/gitpod/types/shared/resource_role.py
@@ -59,4 +59,5 @@
"RESOURCE_ROLE_SNAPSHOT_RUNNER",
"RESOURCE_ROLE_WEBHOOK_ADMIN",
"RESOURCE_ROLE_WEBHOOK_VIEWER",
+ "RESOURCE_ROLE_WARMPOOL_RUNNER",
]
diff --git a/src/gitpod/types/shared/resource_type.py b/src/gitpod/types/shared/resource_type.py
index 9bd2c13..0f7f756 100644
--- a/src/gitpod/types/shared/resource_type.py
+++ b/src/gitpod/types/shared/resource_type.py
@@ -53,4 +53,5 @@
"RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
"RESOURCE_TYPE_SERVICE_ACCOUNT_TOKEN",
"RESOURCE_TYPE_ROLE_ASSIGNMENT",
+ "RESOURCE_TYPE_WARM_POOL",
]
diff --git a/src/gitpod/types/shared_params/resource_role.py b/src/gitpod/types/shared_params/resource_role.py
index 9ce4133..dd7e43a 100644
--- a/src/gitpod/types/shared_params/resource_role.py
+++ b/src/gitpod/types/shared_params/resource_role.py
@@ -61,4 +61,5 @@
"RESOURCE_ROLE_SNAPSHOT_RUNNER",
"RESOURCE_ROLE_WEBHOOK_ADMIN",
"RESOURCE_ROLE_WEBHOOK_VIEWER",
+ "RESOURCE_ROLE_WARMPOOL_RUNNER",
]
diff --git a/src/gitpod/types/shared_params/resource_type.py b/src/gitpod/types/shared_params/resource_type.py
index 19a20e4..4928c23 100644
--- a/src/gitpod/types/shared_params/resource_type.py
+++ b/src/gitpod/types/shared_params/resource_type.py
@@ -55,4 +55,5 @@
"RESOURCE_TYPE_ANNOUNCEMENT_BANNER",
"RESOURCE_TYPE_SERVICE_ACCOUNT_TOKEN",
"RESOURCE_TYPE_ROLE_ASSIGNMENT",
+ "RESOURCE_TYPE_WARM_POOL",
]
From 03d8e1fb79c06f212ddd078b6b5efc6f42da1626 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 10 Feb 2026 18:29:56 +0000
Subject: [PATCH 50/55] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 51dc30e..838f379 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-c6bbc07d363a615337303ef6c5338faed25448b6963b992ed29418dba3de6136.yml
-openapi_spec_hash: acc8bbf6f8313c075e9bdba83700baa7
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-66128ab1937fbbb10b33b62b505e301ca89640489a59f6c6ac03c58c3f67917e.yml
+openapi_spec_hash: a3794565b067fe9f393a0f1be04d52a3
config_hash: 2daf822ad8d9d03f0a72a8bf8adc92a1
From 008ae2b90fef5c2f8eb5e1d624c9e5a2a6a1f83a Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 08:17:32 +0000
Subject: [PATCH 51/55] feat(api): add exclude_group_id filter to organization
list members
---
.stats.yml | 4 ++--
src/gitpod/types/organization_list_members_params.py | 6 ++++++
tests/api_resources/test_organizations.py | 2 ++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 838f379..b9611e2 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-66128ab1937fbbb10b33b62b505e301ca89640489a59f6c6ac03c58c3f67917e.yml
-openapi_spec_hash: a3794565b067fe9f393a0f1be04d52a3
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-7a38c308f8e8c0c90f0804160e0b88d502f068508e2a198523432f8a7da988a6.yml
+openapi_spec_hash: 1421eed0586bb7086b33e3506fd57c10
config_hash: 2daf822ad8d9d03f0a72a8bf8adc92a1
diff --git a/src/gitpod/types/organization_list_members_params.py b/src/gitpod/types/organization_list_members_params.py
index 797d277..986af24 100644
--- a/src/gitpod/types/organization_list_members_params.py
+++ b/src/gitpod/types/organization_list_members_params.py
@@ -37,6 +37,12 @@ class OrganizationListMembersParams(TypedDict, total=False):
class Filter(TypedDict, total=False):
+ exclude_group_ids: Annotated[SequenceNotStr[str], PropertyInfo(alias="excludeGroupIds")]
+ """
+ exclude_group_ids excludes members who are already in any of the specified
+ groups
+ """
+
roles: List[OrganizationRole]
"""roles filters members by their organization role"""
diff --git a/tests/api_resources/test_organizations.py b/tests/api_resources/test_organizations.py
index 0bc4e4f..a8653c7 100644
--- a/tests/api_resources/test_organizations.py
+++ b/tests/api_resources/test_organizations.py
@@ -267,6 +267,7 @@ def test_method_list_members_with_all_params(self, client: Gitpod) -> None:
token="token",
page_size=0,
filter={
+ "exclude_group_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
"roles": ["ORGANIZATION_ROLE_UNSPECIFIED"],
"search": "search",
"statuses": ["USER_STATUS_UNSPECIFIED"],
@@ -605,6 +606,7 @@ async def test_method_list_members_with_all_params(self, async_client: AsyncGitp
token="token",
page_size=0,
filter={
+ "exclude_group_ids": ["182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"],
"roles": ["ORGANIZATION_ROLE_UNSPECIFIED"],
"search": "search",
"statuses": ["USER_STATUS_UNSPECIFIED"],
From 5b7ad5763c17a055edc75293d55aafb85bdf5879 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 10:39:08 +0000
Subject: [PATCH 52/55] codegen metadata
---
.stats.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index b9611e2..fbf4fbf 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-7a38c308f8e8c0c90f0804160e0b88d502f068508e2a198523432f8a7da988a6.yml
-openapi_spec_hash: 1421eed0586bb7086b33e3506fd57c10
-config_hash: 2daf822ad8d9d03f0a72a8bf8adc92a1
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-aae941ae291f8be9199f03c287a82feea38420d9f0e90415d05e2f03e1947abe.yml
+openapi_spec_hash: 4e5d3e8aa0e731807a83f0e0638cdb37
+config_hash: f0929f1f3810f16d770af0e1ac268297
From 028bb96be59df400e6350b1bfcc07f209d48462c Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 10:57:23 +0000
Subject: [PATCH 53/55] codegen metadata
---
.stats.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index fbf4fbf..592d8a4 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 172
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-aae941ae291f8be9199f03c287a82feea38420d9f0e90415d05e2f03e1947abe.yml
-openapi_spec_hash: 4e5d3e8aa0e731807a83f0e0638cdb37
-config_hash: f0929f1f3810f16d770af0e1ac268297
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-b97dcde84128bcf3740b0cf3c2c005e1dcd1cdac9b0768a28bd734f8d83c9fa2.yml
+openapi_spec_hash: 1172889d2eb3f0453514c6caae3459b3
+config_hash: 49d499b8ab46cede0e3461ef7cd549ca
From ecb24f297e892aecf91c294594f062c0baf6f8f5 Mon Sep 17 00:00:00 2001
From: meorphis
Date: Wed, 11 Feb 2026 08:10:24 -0500
Subject: [PATCH 54/55] chore(internal): formatting
---
.github/workflows/ci.yml | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a4b89c4..9e99d03 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,15 +2,15 @@ name: CI
on:
push:
branches-ignore:
- - "generated"
- - "codegen/**"
- - "integrated/**"
- - "stl-preview-head/**"
- - "stl-preview-base/**"
+ - 'generated'
+ - 'codegen/**'
+ - 'integrated/**'
+ - 'stl-preview-head/**'
+ - 'stl-preview-base/**'
pull_request:
branches-ignore:
- - "stl-preview-head/**"
- - "stl-preview-base/**"
+ - 'stl-preview-head/**'
+ - 'stl-preview-base/**'
jobs:
lint:
@@ -26,8 +26,8 @@ jobs:
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
- RYE_VERSION: "0.44.0"
- RYE_INSTALL_OPTION: "--yes"
+ RYE_VERSION: '0.44.0'
+ RYE_INSTALL_OPTION: '--yes'
- name: Install dependencies
run: rye sync --all-features
@@ -51,8 +51,8 @@ jobs:
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
- RYE_VERSION: "0.44.0"
- RYE_INSTALL_OPTION: "--yes"
+ RYE_VERSION: '0.44.0'
+ RYE_INSTALL_OPTION: '--yes'
- name: Install dependencies
run: rye sync --all-features
@@ -88,8 +88,8 @@ jobs:
curl -sSf https://rye.astral.sh/get | bash
echo "$HOME/.rye/shims" >> $GITHUB_PATH
env:
- RYE_VERSION: "0.44.0"
- RYE_INSTALL_OPTION: "--yes"
+ RYE_VERSION: '0.44.0'
+ RYE_INSTALL_OPTION: '--yes'
- name: Bootstrap
run: ./scripts/bootstrap
From 8490f7360c37e479296da23be4b199b9a8e42a8a Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 11 Feb 2026 13:11:09 +0000
Subject: [PATCH 55/55] release: 0.8.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 53 +++++++++++++++++++++++++++++++++++
pyproject.toml | 2 +-
src/gitpod/_version.py | 2 +-
4 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 1b77f50..6538ca9 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.7.0"
+ ".": "0.8.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9d5779c..b5584ae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,58 @@
# Changelog
+## 0.8.0 (2026-02-11)
+
+Full Changelog: [v0.7.0...v0.8.0](https://github.com/gitpod-io/gitpod-sdk-python/compare/v0.7.0...v0.8.0)
+
+### Features
+
+* [backend] Resource admin should be able to see all resource shares ([153d9ba](https://github.com/gitpod-io/gitpod-sdk-python/commit/153d9babce677adb9cda8b900b078ed7d16879b7))
+* [SCIM] Configurable token expiration duration ([71eb2b6](https://github.com/gitpod-io/gitpod-sdk-python/commit/71eb2b62d685a409abe4a27129e0408758bc735f))
+* [SCIM] Configurable token expiration duration ([16049ed](https://github.com/gitpod-io/gitpod-sdk-python/commit/16049ed4392e5551137a0bf7930b0a8ebcaa7b5e))
+* **agent:** add annotations field to AgentExecution ([09c2210](https://github.com/gitpod-io/gitpod-sdk-python/commit/09c2210f258504cbebaed878233e2d5e06f939ec))
+* **api:** add additional_scopes to organization SSO configuration ([07aa0cc](https://github.com/gitpod-io/gitpod-sdk-python/commit/07aa0cc02a4b65244104be04289c949bfb013c14))
+* **api:** add announcement banner fields to organization proto ([1cbdaaa](https://github.com/gitpod-io/gitpod-sdk-python/commit/1cbdaaa69c1077d7d354991621af88f7e71e4df0))
+* **api:** add derivedFromOrgRole field to RoleAssignment ([e1ed935](https://github.com/gitpod-io/gitpod-sdk-python/commit/e1ed9353e48590389e21fa38137280daeef56da9))
+* **api:** add dev_runner_id to agents, dev_environment_id and provider to runners ([c345871](https://github.com/gitpod-io/gitpod-sdk-python/commit/c3458714c345048e05c74b213bcf087f3b977313))
+* **api:** add exclude_group_id filter to organization list members ([008ae2b](https://github.com/gitpod-io/gitpod-sdk-python/commit/008ae2b90fef5c2f8eb5e1d624c9e5a2a6a1f83a))
+* **api:** add ExecutableDenyList to environment and organization policy ([110c2ef](https://github.com/gitpod-io/gitpod-sdk-python/commit/110c2efc4f4d5dac2fa1209b7c85554060110889))
+* **api:** add filters to ListPrebuilds for inventory page ([4bc3f9f](https://github.com/gitpod-io/gitpod-sdk-python/commit/4bc3f9f92f2de35c0cb1427df1af602014856000))
+* **api:** add mcp_integrations field and type to agent_execution ([911140b](https://github.com/gitpod-io/gitpod-sdk-python/commit/911140bc7050b5e02daec1f207bbced61db39e0b))
+* **api:** add opus 4.6 model variants to agent supported models ([71e660d](https://github.com/gitpod-io/gitpod-sdk-python/commit/71e660d25b7d164b2d37b09058aa3e74f445e5ca))
+* **api:** add port access methods and organization admission level to environments ([af512f5](https://github.com/gitpod-io/gitpod-sdk-python/commit/af512f54181bc7da478f5e47b949715bec0e8b03))
+* **api:** add ResourceRoleOrgAutomationsAdmin to ResourceRole enum ([320b285](https://github.com/gitpod-io/gitpod-sdk-python/commit/320b285f1fd8723e6c6fa0dc027812cff0891485))
+* **api:** add ResourceRoleOrgGroupsAdmin to ResourceRole enum ([c2fceff](https://github.com/gitpod-io/gitpod-sdk-python/commit/c2fceff932dc786e8fc66d1fb44021e25f59c07e))
+* **api:** add restrict_account_creation_to_scim field to organization policy ([c1272d1](https://github.com/gitpod-io/gitpod-sdk-python/commit/c1272d1a95dbcdb0366cff0c3158e3f9d4769f1a))
+* **api:** add scope field and enum to environment secrets ([371f8f7](https://github.com/gitpod-io/gitpod-sdk-python/commit/371f8f7fc5e3fc882205b852aa684d5626c34e11))
+* **api:** add user_ids filter to organization list members method ([5abdcae](https://github.com/gitpod-io/gitpod-sdk-python/commit/5abdcaecdc351d12e4715c1e4970d836173d6d9f))
+* **api:** add warm pools resource to prebuilds ([b997cfe](https://github.com/gitpod-io/gitpod-sdk-python/commit/b997cfe8e95a7e55a645e7fa54446555ed0108e4))
+* **api:** implement GetAnnouncementBanner and UpdateAnnouncementBanner handlers ([6482c1a](https://github.com/gitpod-io/gitpod-sdk-python/commit/6482c1a4b50742622a90815484c6b59020d196f6))
+* **chat:** add Pylon identity verification for chat widget ([f7b7cb3](https://github.com/gitpod-io/gitpod-sdk-python/commit/f7b7cb37e2349ef60d26890c1a4cc72db34b32f8))
+* **cli:** add --name flag to environment create command ([b292d8f](https://github.com/gitpod-io/gitpod-sdk-python/commit/b292d8f4fb2520ba65bb6701ac8507b16f56080e))
+* **client:** add custom JSON encoder for extended type support ([48e0b49](https://github.com/gitpod-io/gitpod-sdk-python/commit/48e0b4951e34166dba1c29cd4e6b15fb2314b54e))
+* **db:** add service_account_tokens table ([688cf2e](https://github.com/gitpod-io/gitpod-sdk-python/commit/688cf2e01a33ca12de9443d3857360d4223fa0f8))
+* Introduce projects admin org role ([2777780](https://github.com/gitpod-io/gitpod-sdk-python/commit/2777780d987da76ab00f131c243b1ee69e39c901))
+* **runner:** add capability check for ListSCMOrganizations ([4a87ef2](https://github.com/gitpod-io/gitpod-sdk-python/commit/4a87ef22bd88a83fb2eaa9255d9ae60bf8eee618))
+* **types:** add RoleAssignment value to ResourceType enum ([d59ab98](https://github.com/gitpod-io/gitpod-sdk-python/commit/d59ab9810266a68d5b4cd31dd6da669d2691436f))
+
+
+### Bug Fixes
+
+* **api:** reject double-slash prefix in secret file paths ([fb4f63f](https://github.com/gitpod-io/gitpod-sdk-python/commit/fb4f63f9369cdcdb2cbc729bcd0a4bc0aa7b7745))
+
+
+### Chores
+
+* **ci:** upgrade `actions/github-script` ([d6a1726](https://github.com/gitpod-io/gitpod-sdk-python/commit/d6a1726d9806c8433ba7bc1612018bc84309147e))
+* **internal:** bump dependencies ([330558d](https://github.com/gitpod-io/gitpod-sdk-python/commit/330558de3704863336c8b0bce5559237ef2d0e79))
+* **internal:** formatting ([ecb24f2](https://github.com/gitpod-io/gitpod-sdk-python/commit/ecb24f297e892aecf91c294594f062c0baf6f8f5))
+* update OpenAPI spec to e50946de8cddc549be7f7423903ad444632abce6 ([1176fce](https://github.com/gitpod-io/gitpod-sdk-python/commit/1176fce9b14b0bf657282228a20c222b2cb14ea5))
+
+
+### Documentation
+
+* **api:** clarify port_sharing_disabled behavior in organization policy ([2154cd8](https://github.com/gitpod-io/gitpod-sdk-python/commit/2154cd8abfa221c6c5aa4af9e85919fc927d888e))
+
## 0.7.0 (2026-01-21)
Full Changelog: [v0.6.0...v0.7.0](https://github.com/gitpod-io/gitpod-sdk-python/compare/v0.6.0...v0.7.0)
diff --git a/pyproject.toml b/pyproject.toml
index 4f4d826..6e89f84 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "gitpod-sdk"
-version = "0.7.0"
+version = "0.8.0"
description = "The official Python library for the gitpod API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/gitpod/_version.py b/src/gitpod/_version.py
index 88739dd..58df503 100644
--- a/src/gitpod/_version.py
+++ b/src/gitpod/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "gitpod"
-__version__ = "0.7.0" # x-release-please-version
+__version__ = "0.8.0" # x-release-please-version