22
33from basic_memory .cli .commands .cloud .api_client import make_api_request
44from basic_memory .config import ConfigManager
5+ from basic_memory .mcp .async_client import resolve_configured_workspace
56from basic_memory .schemas .cloud import (
67 CloudProjectList ,
78 CloudProjectCreateRequest ,
@@ -16,8 +17,25 @@ class CloudUtilsError(Exception):
1617 pass
1718
1819
20+ def _workspace_headers (
21+ * ,
22+ project_name : str | None = None ,
23+ workspace : str | None = None ,
24+ ) -> dict [str , str ]:
25+ """Build optional workspace headers using the CLI config resolution chain."""
26+ resolved_workspace = resolve_configured_workspace (
27+ project_name = project_name ,
28+ workspace = workspace ,
29+ )
30+ if resolved_workspace is None :
31+ return {}
32+ return {"X-Workspace-ID" : resolved_workspace }
33+
34+
1935async def fetch_cloud_projects (
2036 * ,
37+ project_name : str | None = None ,
38+ workspace : str | None = None ,
2139 api_request = make_api_request ,
2240) -> CloudProjectList :
2341 """Fetch list of projects from cloud API.
@@ -30,7 +48,11 @@ async def fetch_cloud_projects(
3048 config = config_manager .config
3149 host_url = config .cloud_host .rstrip ("/" )
3250
33- response = await api_request (method = "GET" , url = f"{ host_url } /proxy/v2/projects/" )
51+ response = await api_request (
52+ method = "GET" ,
53+ url = f"{ host_url } /proxy/v2/projects/" ,
54+ headers = _workspace_headers (project_name = project_name , workspace = workspace ),
55+ )
3456
3557 return CloudProjectList .model_validate (response .json ())
3658 except Exception as e :
@@ -40,6 +62,7 @@ async def fetch_cloud_projects(
4062async def create_cloud_project (
4163 project_name : str ,
4264 * ,
65+ workspace : str | None = None ,
4366 api_request = make_api_request ,
4467) -> CloudProjectCreateResponse :
4568 """Create a new project on cloud.
@@ -67,7 +90,10 @@ async def create_cloud_project(
6790 response = await api_request (
6891 method = "POST" ,
6992 url = f"{ host_url } /proxy/v2/projects/" ,
70- headers = {"Content-Type" : "application/json" },
93+ headers = {
94+ "Content-Type" : "application/json" ,
95+ ** _workspace_headers (project_name = project_name , workspace = workspace ),
96+ },
7197 json_data = project_data .model_dump (),
7298 )
7399
@@ -91,7 +117,12 @@ async def sync_project(project_name: str, force_full: bool = False) -> None:
91117 raise CloudUtilsError (f"Failed to sync project '{ project_name } ': { e } " ) from e
92118
93119
94- async def project_exists (project_name : str , * , api_request = make_api_request ) -> bool :
120+ async def project_exists (
121+ project_name : str ,
122+ * ,
123+ workspace : str | None = None ,
124+ api_request = make_api_request ,
125+ ) -> bool :
95126 """Check if a project exists on cloud.
96127
97128 Args:
@@ -101,7 +132,11 @@ async def project_exists(project_name: str, *, api_request=make_api_request) ->
101132 True if project exists, False otherwise
102133 """
103134 try :
104- projects = await fetch_cloud_projects (api_request = api_request )
135+ projects = await fetch_cloud_projects (
136+ project_name = project_name ,
137+ workspace = workspace ,
138+ api_request = api_request ,
139+ )
105140 project_names = {p .name for p in projects .projects }
106141 return project_name in project_names
107142 except Exception :
0 commit comments