first
This commit is contained in:
94
agent/agent-ui/src-tauri/src/commands.rs
Normal file
94
agent/agent-ui/src-tauri/src/commands.rs
Normal file
@@ -0,0 +1,94 @@
|
||||
// Created by: Codex
|
||||
// Date: 2026-01-05
|
||||
// Purpose: Tauri commands for Mesh Agent UI
|
||||
// Refs: CLAUDE.md
|
||||
|
||||
use serde::Serialize;
|
||||
use tokio::sync::Mutex;
|
||||
|
||||
use mesh_agent::config::Config;
|
||||
use mesh_agent::runner::AgentHandle;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct AgentState {
|
||||
pub running: bool,
|
||||
pub last_error: Option<String>,
|
||||
pub handle: Option<AgentHandle>,
|
||||
}
|
||||
|
||||
pub struct AppState {
|
||||
pub inner: Mutex<AgentState>,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct AgentStatus {
|
||||
pub running: bool,
|
||||
pub last_error: Option<String>,
|
||||
}
|
||||
|
||||
impl AgentStatus {
|
||||
fn from_state(state: &AgentState) -> Self {
|
||||
Self {
|
||||
running: state.running,
|
||||
last_error: state.last_error.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_status(state: tauri::State<'_, AppState>) -> Result<AgentStatus, String> {
|
||||
let guard = state.inner.lock().await;
|
||||
Ok(AgentStatus::from_state(&guard))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_config() -> Result<Config, String> {
|
||||
Config::load().map_err(|err| err.to_string())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn save_config(config: Config) -> Result<(), String> {
|
||||
config.save_default_path().map_err(|err| err.to_string())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn start_agent(state: tauri::State<'_, AppState>) -> Result<AgentStatus, String> {
|
||||
{
|
||||
let guard = state.inner.lock().await;
|
||||
if guard.running {
|
||||
return Ok(AgentStatus::from_state(&guard));
|
||||
}
|
||||
}
|
||||
|
||||
let config = Config::load().map_err(|err| err.to_string())?;
|
||||
let handle = mesh_agent::runner::start_agent(config)
|
||||
.await
|
||||
.map_err(|err| err.to_string())?;
|
||||
|
||||
let mut guard = state.inner.lock().await;
|
||||
guard.handle = Some(handle);
|
||||
guard.running = true;
|
||||
guard.last_error = None;
|
||||
|
||||
Ok(AgentStatus::from_state(&guard))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn stop_agent(state: tauri::State<'_, AppState>) -> Result<AgentStatus, String> {
|
||||
let handle = {
|
||||
let mut guard = state.inner.lock().await;
|
||||
guard.running = false;
|
||||
guard.last_error = None;
|
||||
guard.handle.take()
|
||||
};
|
||||
|
||||
if let Some(handle) = handle {
|
||||
if let Err(err) = handle.stop().await {
|
||||
let mut guard = state.inner.lock().await;
|
||||
guard.last_error = Some(err.to_string());
|
||||
}
|
||||
}
|
||||
|
||||
let guard = state.inner.lock().await;
|
||||
Ok(AgentStatus::from_state(&guard))
|
||||
}
|
||||
30
agent/agent-ui/src-tauri/src/main.rs
Normal file
30
agent/agent-ui/src-tauri/src/main.rs
Normal file
@@ -0,0 +1,30 @@
|
||||
// Created by: Codex
|
||||
// Date: 2026-01-05
|
||||
// Purpose: Tauri entrypoint for Mesh Agent UI
|
||||
// Refs: CLAUDE.md
|
||||
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
mod commands;
|
||||
|
||||
use commands::{AppState, AgentState};
|
||||
use tokio::sync::Mutex;
|
||||
|
||||
fn main() {
|
||||
let result = tauri::Builder::default()
|
||||
.manage(AppState {
|
||||
inner: Mutex::new(AgentState::default()),
|
||||
})
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
commands::get_status,
|
||||
commands::get_config,
|
||||
commands::save_config,
|
||||
commands::start_agent,
|
||||
commands::stop_agent,
|
||||
])
|
||||
.run(tauri::generate_context!());
|
||||
|
||||
if let Err(err) = result {
|
||||
eprintln!("Mesh Agent UI failed to start: {}", err);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user