@@ -169,6 +169,28 @@ pub struct AgentRunWithMetrics {
169169 pub output : Option < String > , // Real-time JSONL content
170170}
171171
172+ /// Agent export format
173+ #[ derive( Debug , Serialize , Deserialize ) ]
174+ pub struct AgentExport {
175+ pub version : u32 ,
176+ pub exported_at : String ,
177+ pub agent : AgentData ,
178+ }
179+
180+ /// Agent data within export
181+ #[ derive( Debug , Serialize , Deserialize ) ]
182+ pub struct AgentData {
183+ pub name : String ,
184+ pub icon : String ,
185+ pub system_prompt : String ,
186+ pub default_task : Option < String > ,
187+ pub model : String ,
188+ pub sandbox_enabled : bool ,
189+ pub enable_file_read : bool ,
190+ pub enable_file_write : bool ,
191+ pub enable_network : bool ,
192+ }
193+
172194/// Database connection state
173195pub struct AgentDb ( pub Mutex < Connection > ) ;
174196
@@ -1904,3 +1926,91 @@ fn create_command_with_env(program: &str) -> Command {
19041926
19051927 cmd
19061928}
1929+
1930+ /// Import an agent from JSON data
1931+ #[ tauri:: command]
1932+ pub async fn import_agent ( db : State < ' _ , AgentDb > , json_data : String ) -> Result < Agent , String > {
1933+ // Parse the JSON data
1934+ let export_data: AgentExport = serde_json:: from_str ( & json_data)
1935+ . map_err ( |e| format ! ( "Invalid JSON format: {}" , e) ) ?;
1936+
1937+ // Validate version
1938+ if export_data. version != 1 {
1939+ return Err ( format ! ( "Unsupported export version: {}. This version of the app only supports version 1." , export_data. version) ) ;
1940+ }
1941+
1942+ let agent_data = export_data. agent ;
1943+ let conn = db. 0 . lock ( ) . map_err ( |e| e. to_string ( ) ) ?;
1944+
1945+ // Check if an agent with the same name already exists
1946+ let existing_count: i64 = conn
1947+ . query_row (
1948+ "SELECT COUNT(*) FROM agents WHERE name = ?1" ,
1949+ params ! [ agent_data. name] ,
1950+ |row| row. get ( 0 ) ,
1951+ )
1952+ . map_err ( |e| e. to_string ( ) ) ?;
1953+
1954+ // If agent with same name exists, append a suffix
1955+ let final_name = if existing_count > 0 {
1956+ format ! ( "{} (Imported)" , agent_data. name)
1957+ } else {
1958+ agent_data. name
1959+ } ;
1960+
1961+ // Create the agent
1962+ conn. execute (
1963+ "INSERT INTO agents (name, icon, system_prompt, default_task, model, sandbox_enabled, enable_file_read, enable_file_write, enable_network) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)" ,
1964+ params ! [
1965+ final_name,
1966+ agent_data. icon,
1967+ agent_data. system_prompt,
1968+ agent_data. default_task,
1969+ agent_data. model,
1970+ agent_data. sandbox_enabled,
1971+ agent_data. enable_file_read,
1972+ agent_data. enable_file_write,
1973+ agent_data. enable_network
1974+ ] ,
1975+ )
1976+ . map_err ( |e| format ! ( "Failed to create agent: {}" , e) ) ?;
1977+
1978+ let id = conn. last_insert_rowid ( ) ;
1979+
1980+ // Fetch the created agent
1981+ let agent = conn
1982+ . query_row (
1983+ "SELECT id, name, icon, system_prompt, default_task, model, sandbox_enabled, enable_file_read, enable_file_write, enable_network, created_at, updated_at FROM agents WHERE id = ?1" ,
1984+ params ! [ id] ,
1985+ |row| {
1986+ Ok ( Agent {
1987+ id : Some ( row. get ( 0 ) ?) ,
1988+ name : row. get ( 1 ) ?,
1989+ icon : row. get ( 2 ) ?,
1990+ system_prompt : row. get ( 3 ) ?,
1991+ default_task : row. get ( 4 ) ?,
1992+ model : row. get ( 5 ) ?,
1993+ sandbox_enabled : row. get ( 6 ) ?,
1994+ enable_file_read : row. get ( 7 ) ?,
1995+ enable_file_write : row. get ( 8 ) ?,
1996+ enable_network : row. get ( 9 ) ?,
1997+ created_at : row. get ( 10 ) ?,
1998+ updated_at : row. get ( 11 ) ?,
1999+ } )
2000+ } ,
2001+ )
2002+ . map_err ( |e| format ! ( "Failed to fetch created agent: {}" , e) ) ?;
2003+
2004+ Ok ( agent)
2005+ }
2006+
2007+ /// Import agent from file
2008+ #[ tauri:: command]
2009+ pub async fn import_agent_from_file ( db : State < ' _ , AgentDb > , file_path : String ) -> Result < Agent , String > {
2010+ // Read the file
2011+ let json_data = std:: fs:: read_to_string ( & file_path)
2012+ . map_err ( |e| format ! ( "Failed to read file: {}" , e) ) ?;
2013+
2014+ // Import the agent
2015+ import_agent ( db, json_data) . await
2016+ }
0 commit comments