From d50957fc4fb9d2fc259d82404e3161cd26794189 Mon Sep 17 00:00:00 2001 From: Hyu Date: Thu, 3 Sep 2026 11:44:32 +0800 Subject: [PATCH] fix(cloud): request automatic Space launch (#2501) Co-authored-by: dadachann <185672915+dadachann@users.noreply.github.com> --- src/langbot/pkg/api/http/service/space.py | 2 +- tests/integration/api/test_user_space_oauth.py | 8 ++++++-- tests/unit_tests/api/service/test_space_service.py | 12 ++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/langbot/pkg/api/http/service/space.py b/src/langbot/pkg/api/http/service/space.py index 174cc965c..dc6308bc5 100644 --- a/src/langbot/pkg/api/http/service/space.py +++ b/src/langbot/pkg/api/http/service/space.py @@ -127,7 +127,7 @@ class SpaceService: def get_cloud_entry_url(self) -> str: """Return the Space-owned Cloud selector for a Cloud Account login.""" - return f'{self._get_space_config()["url"].rstrip("/")}/cloud?environment=beta' + return f'{self._get_space_config()["url"].rstrip("/")}/cloud?environment=beta&auto_launch=1' async def exchange_oauth_code( self, diff --git a/tests/integration/api/test_user_space_oauth.py b/tests/integration/api/test_user_space_oauth.py index 34c09451b..08e137dd2 100644 --- a/tests/integration/api/test_user_space_oauth.py +++ b/tests/integration/api/test_user_space_oauth.py @@ -71,7 +71,9 @@ async def space_oauth_api(): application.space_service.get_oauth_authorize_url = Mock( side_effect=lambda redirect_uri, state: f'https://space.example/authorize?state={state}' ) - application.space_service.get_cloud_entry_url = Mock(return_value='https://space.example/cloud?environment=beta') + application.space_service.get_cloud_entry_url = Mock( + return_value='https://space.example/cloud?environment=beta&auto_launch=1' + ) application.space_service.exchange_oauth_code = AsyncMock( return_value={ 'access_token': 'space-access-token', @@ -143,7 +145,9 @@ async def test_cloud_login_entry_redirects_to_space_workspace_launcher(space_oau ) assert response.status_code == 200 - assert (await response.get_json())['data']['authorize_url'] == ('https://space.example/cloud?environment=beta') + assert (await response.get_json())['data']['authorize_url'] == ( + 'https://space.example/cloud?environment=beta&auto_launch=1' + ) application.space_service.get_cloud_entry_url.assert_called_once_with() application.user_service.issue_space_oauth_state.assert_not_awaited() diff --git a/tests/unit_tests/api/service/test_space_service.py b/tests/unit_tests/api/service/test_space_service.py index a77dd14a1..787f30565 100644 --- a/tests/unit_tests/api/service/test_space_service.py +++ b/tests/unit_tests/api/service/test_space_service.py @@ -134,6 +134,18 @@ class TestSpaceServiceGetOAuthAuthorizeUrl: # Verify - uses default URL assert 'https://space.langbot.app/auth/authorize' in result + def test_cloud_entry_url_requests_automatic_launch(self): + """Cloud's login entry must continue through the Space launcher.""" + ap = SimpleNamespace( + instance_config=SimpleNamespace( + data={'space': {'url': 'https://space.example/base/'}}, + ), + ) + + result = SpaceService(ap).get_cloud_entry_url() + + assert result == 'https://space.example/base/cloud?environment=beta&auto_launch=1' + class TestSpaceServiceGetUserByEmail: """Tests for _get_user_by_email internal method."""