@@ -5,9 +5,10 @@ use super::export_util::save_json_with_dialog;
55use crate :: {
66 app_state:: AppState ,
77 managed_agents:: {
8- encode_team_json, ensure_persona_ids_are_active, load_personas, load_teams,
9- parse_team_json, save_teams, validate_team_deletion, CreateTeamRequest , ParsedTeamPreview ,
10- TeamRecord , UpdateTeamRequest ,
8+ delete_team_with_cascade, encode_team_json, ensure_persona_ids_are_active,
9+ import_team_from_directory as do_import_team, load_personas, load_teams, parse_team_json,
10+ save_teams, sync_team_from_dir as do_sync_team, try_regenerate_nest, CreateTeamRequest ,
11+ ParsedTeamPreview , SyncResult , TeamRecord , UpdateTeamRequest ,
1112 } ,
1213 util:: now_iso,
1314} ;
@@ -59,6 +60,10 @@ pub fn create_team(
5960 description,
6061 persona_ids : input. persona_ids ,
6162 is_builtin : false ,
63+ source_dir : None ,
64+ is_symlink : false ,
65+ symlink_target : None ,
66+ version : None ,
6267 created_at : now. clone ( ) ,
6368 updated_at : now,
6469 } ;
@@ -104,14 +109,51 @@ pub fn delete_team(id: String, app: AppHandle, state: State<'_, AppState>) -> Re
104109 . managed_agents_store_lock
105110 . lock ( )
106111 . map_err ( |error| error. to_string ( ) ) ?;
107- let mut teams = load_teams ( & app) ?;
108- let team = teams
109- . iter ( )
110- . find ( |record| record. id == id)
111- . ok_or_else ( || format ! ( "team {id} not found" ) ) ?;
112- validate_team_deletion ( team) ?;
113- teams. retain ( |record| record. id != id) ;
114- save_teams ( & app, & teams)
112+ delete_team_with_cascade ( & app, & id) ?;
113+ try_regenerate_nest ( & app) ;
114+ Ok ( ( ) )
115+ }
116+
117+ #[ tauri:: command]
118+ pub fn install_team_from_directory (
119+ app : AppHandle ,
120+ state : State < ' _ , AppState > ,
121+ path : String ,
122+ symlink : Option < bool > ,
123+ ) -> Result < TeamRecord , String > {
124+ let _store_guard = state
125+ . managed_agents_store_lock
126+ . lock ( )
127+ . map_err ( |e| e. to_string ( ) ) ?;
128+ let source = std:: path:: PathBuf :: from ( & path) ;
129+ if !source. is_dir ( ) {
130+ return Err ( format ! ( "team path is not a directory: {path}" ) ) ;
131+ }
132+ let result = do_import_team ( & app, & source, symlink. unwrap_or ( false ) ) ?;
133+ try_regenerate_nest ( & app) ;
134+ Ok ( result)
135+ }
136+
137+ #[ tauri:: command]
138+ pub fn sync_team_directory (
139+ app : AppHandle ,
140+ state : State < ' _ , AppState > ,
141+ team_id : String ,
142+ ) -> Result < SyncResult , String > {
143+ let _store_guard = state
144+ . managed_agents_store_lock
145+ . lock ( )
146+ . map_err ( |e| e. to_string ( ) ) ?;
147+ let result = do_sync_team ( & app, & team_id) ?;
148+ try_regenerate_nest ( & app) ;
149+ Ok ( result)
150+ }
151+
152+ #[ tauri:: command]
153+ pub async fn pick_team_directory ( app : AppHandle ) -> Result < Option < String > , String > {
154+ use tauri_plugin_dialog:: DialogExt ;
155+ let path = app. dialog ( ) . file ( ) . blocking_pick_folder ( ) ;
156+ Ok ( path. map ( |p| p. to_string ( ) ) )
115157}
116158
117159// ---------------------------------------------------------------------------
0 commit comments