feat(v2): add SidecarManager and agent Tauri commands

Implement Rust SidecarManager that spawns Node.js sidecar process,
communicates via stdio NDJSON, and manages agent session lifecycle.
Add agent_query, agent_stop, agent_ready Tauri commands. Sidecar
auto-starts on app launch.
This commit is contained in:
Hibryda 2026-03-06 01:01:35 +01:00
parent 54b0d44bc1
commit f0ec44f6a6
2 changed files with 257 additions and 3 deletions

View file

@ -4,13 +4,17 @@ mod watcher;
mod session;
use pty::{PtyManager, PtyOptions};
use sidecar::{AgentQueryOptions, SidecarManager};
use std::sync::Arc;
use tauri::State;
struct AppState {
pty_manager: Arc<PtyManager>,
sidecar_manager: Arc<SidecarManager>,
}
// --- PTY commands ---
#[tauri::command]
fn pty_spawn(
app: tauri::AppHandle,
@ -40,10 +44,34 @@ fn pty_kill(state: State<'_, AppState>, id: String) -> Result<(), String> {
state.pty_manager.kill(&id)
}
// --- Agent/sidecar commands ---
#[tauri::command]
fn agent_query(
state: State<'_, AppState>,
options: AgentQueryOptions,
) -> Result<(), String> {
state.sidecar_manager.query(&options)
}
#[tauri::command]
fn agent_stop(state: State<'_, AppState>, session_id: String) -> Result<(), String> {
state.sidecar_manager.stop_session(&session_id)
}
#[tauri::command]
fn agent_ready(state: State<'_, AppState>) -> bool {
state.sidecar_manager.is_ready()
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
let pty_manager = Arc::new(PtyManager::new());
let sidecar_manager = Arc::new(SidecarManager::new());
let app_state = AppState {
pty_manager: Arc::new(PtyManager::new()),
pty_manager,
sidecar_manager: sidecar_manager.clone(),
};
tauri::Builder::default()
@ -53,8 +81,11 @@ pub fn run() {
pty_write,
pty_resize,
pty_kill,
agent_query,
agent_stop,
agent_ready,
])
.setup(|app| {
.setup(move |app| {
if cfg!(debug_assertions) {
app.handle().plugin(
tauri_plugin_log::Builder::default()
@ -62,6 +93,13 @@ pub fn run() {
.build(),
)?;
}
// Start sidecar on app launch
match sidecar_manager.start(app.handle()) {
Ok(()) => log::info!("Sidecar startup initiated"),
Err(e) => log::warn!("Sidecar startup failed (agent features unavailable): {e}"),
}
Ok(())
})
.run(tauri::generate_context!())