@@ -17,14 +17,15 @@ use crate::ai::agent_sdk::driver::{AgentDriverError, WARP_DRIVE_SYNC_TIMEOUT};
1717use crate :: ai:: ambient_agents:: AmbientAgentTaskId ;
1818use crate :: ai:: cloud_environments:: CloudAmbientAgentEnvironment ;
1919use crate :: ai:: llms:: { LLMId , LLMPreferences } ;
20+ use crate :: auth:: UserUid ;
2021use crate :: auth:: auth_state:: AuthStateProvider ;
2122use crate :: cloud_object:: { CloudObject , CloudObjectLookup as _, Owner } ;
2223use crate :: server:: cloud_objects:: update_manager:: UpdateManager ;
2324use crate :: server:: ids:: { ServerId , SyncId } ;
2425use crate :: server:: server_api:: ServerApiProvider ;
2526use crate :: server:: server_api:: ai:: AIClient ;
2627use crate :: workspaces:: update_manager:: TeamUpdateManager ;
27- use crate :: workspaces:: user_workspaces:: UserWorkspaces ;
28+ use crate :: workspaces:: user_workspaces:: { SoleTeamError , UserWorkspaces } ;
2829
2930/// How long to wait for workspace metadata to refresh.
3031pub const WORKSPACE_METADATA_REFRESH_TIMEOUT : Duration = Duration :: from_secs ( 10 ) ;
@@ -95,38 +96,56 @@ pub(super) fn set_ambient_task_context_from_run_id(
9596 Ok ( task_id)
9697}
9798
98- /// Resolve the owner of a new cloud object. This resolution is based on the CLI `--team` and `--personal` flags.
99+ pub ( super ) fn describe_sole_team_error ( error : SoleTeamError ) -> anyhow:: Error {
100+ match error {
101+ SoleTeamError :: NoTeam => anyhow:: anyhow!( "You are not on a team" ) ,
102+ SoleTeamError :: MoreThanOneTeam { team_uids } => anyhow:: anyhow!(
103+ "You are on {} teams; specify one with --team <UID>: {}" ,
104+ team_uids. len( ) ,
105+ team_uids
106+ . iter( )
107+ . map( ServerId :: to_string)
108+ . collect:: <Vec <_>>( )
109+ . join( ", " )
110+ ) ,
111+ }
112+ }
113+
114+ fn current_user_uid ( ctx : & AppContext ) -> anyhow:: Result < UserUid > {
115+ AuthStateProvider :: as_ref ( ctx)
116+ . get ( )
117+ . user_id ( )
118+ . ok_or_else ( || anyhow:: anyhow!( "User should be logged in" ) )
119+ }
120+
121+ /// Resolve the owner of a new cloud object, based on the CLI `--team` and `--personal` flags.
99122///
100- /// If `team_flag` is true, attempts to get the current team UID (errors if not on a team).
101- /// If `user_flag` is true, gets the current user's UID.
102- /// Otherwise, defaults to team if available, falling back to user .
123+ /// With neither flag, a user on exactly one team gets a team object and a user on no team gets
124+ /// a personal one. A user on several teams is asked to choose rather than silently handed a
125+ /// personal object .
103126pub fn resolve_owner ( team_flag : bool , user_flag : bool , ctx : & AppContext ) -> anyhow:: Result < Owner > {
104127 if team_flag {
105- let team_id = UserWorkspaces :: as_ref ( ctx)
128+ let team_uid = UserWorkspaces :: as_ref ( ctx)
106129 . sole_team_uid ( )
107- . ok_or_else ( || anyhow :: anyhow! ( "User is not on a team" ) ) ?;
108- return Ok ( Owner :: Team { team_uid : team_id } ) ;
130+ . map_err ( describe_sole_team_error ) ?;
131+ return Ok ( Owner :: Team { team_uid } ) ;
109132 }
110133
111134 if user_flag {
112- let user_id = AuthStateProvider :: as_ref ( ctx)
113- . get ( )
114- . user_id ( )
115- . ok_or_else ( || anyhow:: anyhow!( "User should be logged in" ) ) ?;
116- return Ok ( Owner :: User { user_uid : user_id } ) ;
135+ return Ok ( Owner :: User {
136+ user_uid : current_user_uid ( ctx) ?,
137+ } ) ;
117138 }
118139
119- // Default: try team first, fall back to user
120- if let Some ( team_uid) = UserWorkspaces :: as_ref ( ctx) . sole_team_uid ( ) {
121- return Ok ( Owner :: Team { team_uid } ) ;
140+ match UserWorkspaces :: as_ref ( ctx) . sole_team_uid ( ) {
141+ Ok ( team_uid) => Ok ( Owner :: Team { team_uid } ) ,
142+ Err ( SoleTeamError :: NoTeam ) => Ok ( Owner :: User {
143+ user_uid : current_user_uid ( ctx) ?,
144+ } ) ,
145+ Err ( error @ SoleTeamError :: MoreThanOneTeam { .. } ) => {
146+ Err ( describe_sole_team_error ( error) )
147+ }
122148 }
123-
124- log:: warn!( "Tried to default to creating team object, team could not be found." ) ;
125- let user_id = AuthStateProvider :: as_ref ( ctx)
126- . get ( )
127- . user_id ( )
128- . ok_or_else ( || anyhow:: anyhow!( "User should be logged in" ) ) ?;
129- Ok ( Owner :: User { user_uid : user_id } )
130149}
131150
132151/// Refresh workspace metadata before executing an operation.
0 commit comments