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