diff --git a/packages/kbot/dist-in/commands/images.js b/packages/kbot/dist-in/commands/images.js index 672eb78b..3fa9363f 100644 --- a/packages/kbot/dist-in/commands/images.js +++ b/packages/kbot/dist-in/commands/images.js @@ -159,8 +159,10 @@ async function launchGuiAndGetPrompt(argv) { apiKey: apiKey || null, files: absoluteIncludes }; - tauriProcess.stdin?.write(JSON.stringify(configResponse) + '\n'); - logger.info('📤 Sent config response to GUI'); + const jsonString = JSON.stringify(configResponse); + logger.info('📤 About to write to stdin:', jsonString); + tauriProcess.stdin?.write(jsonString + '\n'); + logger.info('📤 Sent config response to GUI', configResponse); // Send image data for (const imagePath of absoluteIncludes) { try { @@ -467,4 +469,4 @@ export const imageCommand = async (argv) => { logger.error('Failed to parse options or generate image:', error.message, error.issues, error.stack); } }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2ltYWdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0gsWUFBWSxFQUNaLFFBQVEsRUFDUixVQUFVLEVBQ2IsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFXLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLE1BQU0sSUFBSSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUMsU0FBUyxzQkFBc0IsQ0FBQyxHQUF1QixFQUFFLFFBQWtCO0lBQ3ZFLElBQUksTUFBYyxDQUFDO0lBRW5CLElBQUksR0FBRyxFQUFFLENBQUM7UUFDTixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcs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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2ltYWdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0gsWUFBWSxFQUNaLFFBQVEsRUFDUixVQUFVLEVBQ2IsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFXLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUFFLE1BQU0sSUFBSSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUMsU0FBUyxzQkFBc0IsQ0FBQyxHQUF1QixFQUFFLFFBQWtCO0lBQ3ZFLElBQUksTUFBYyxDQUFDO0lBRW5CLElBQUksR0FBRyxFQUFFLENBQUM7UUFDTixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcs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 \ No newline at end of file diff --git a/packages/kbot/dist/win-64/tauri-app.exe b/packages/kbot/dist/win-64/tauri-app.exe index bd812cbf..568db815 100644 Binary files a/packages/kbot/dist/win-64/tauri-app.exe and b/packages/kbot/dist/win-64/tauri-app.exe differ diff --git a/packages/kbot/gui/tauri-app/src-tauri/src/handlers.rs b/packages/kbot/gui/tauri-app/src-tauri/src/handlers.rs new file mode 100644 index 00000000..40eb5863 --- /dev/null +++ b/packages/kbot/gui/tauri-app/src-tauri/src/handlers.rs @@ -0,0 +1,222 @@ +use tauri::{Manager, Emitter}; +use serde::{Serialize, Deserialize}; +use dirs; + +use crate::{log_json, Counter, DebugMessages, DebugPayload}; + +#[derive(Serialize, Deserialize)] +pub struct Payload { + pub prompt: String, + pub files: Vec, + pub dst: String, +} + +#[derive(Serialize, Deserialize)] +pub struct IPCMessage { + #[serde(rename = "type")] + pub message_type: String, + pub data: serde_json::Value, + pub timestamp: Option, + pub id: Option, +} + +// Core command handlers +#[tauri::command] +pub fn submit_prompt(prompt: &str, files: Vec, dst: &str, window: tauri::Window) { + log_json("info", "submit_prompt command called", Some(serde_json::json!({ + "prompt": prompt, + "files": files, + "dst": dst + }))); + + let payload = Payload { + prompt: prompt.to_string(), + files, + dst: dst.to_string(), + }; + let json_payload = serde_json::to_string(&payload).unwrap(); + + log_json("info", "Sending JSON payload to stdout", Some(serde_json::json!({ + "payload_length": json_payload.len() + }))); + println!("{}", json_payload); + let _ = window.app_handle().exit(0); +} + +#[tauri::command] +pub fn log_error_to_console(error: &str) { + eprintln!("[WebView ERROR forwarded]: {}", error); +} + +#[tauri::command] +pub fn resolve_path_relative_to_home(absolute_path: String) -> Result { + let home_dir = dirs::home_dir().ok_or_else(|| "Could not find home directory".to_string())?; + let path_to_resolve = std::path::Path::new(&absolute_path); + let relative_path = pathdiff::diff_paths(path_to_resolve, home_dir) + .ok_or_else(|| "Failed to calculate relative path from home directory".to_string())?; + Ok(relative_path.to_string_lossy().to_string()) +} + +// Debug message handlers +#[tauri::command] +pub fn add_debug_message(message: String, level: String, data: Option, state: tauri::State<'_, DebugMessages>) -> Result<(), String> { + log_json(&level, &format!("Frontend: {}", message), data.clone()); + + let debug_payload = DebugPayload { + level, + message, + data, + }; + + let mut messages = state.0.lock().unwrap(); + messages.push(debug_payload); + + if messages.len() > 100 { + let len = messages.len(); + messages.drain(0..len - 100); + } + + Ok(()) +} + +#[tauri::command] +pub fn get_debug_messages(state: tauri::State<'_, DebugMessages>) -> Result, String> { + let messages = state.0.lock().unwrap(); + Ok(messages.clone()) +} + +#[tauri::command] +pub fn clear_debug_messages(state: tauri::State<'_, DebugMessages>) -> Result<(), String> { + let mut messages = state.0.lock().unwrap(); + messages.clear(); + Ok(()) +} + +// Counter handlers (legacy) +#[tauri::command] +pub fn increment_counter(state: tauri::State<'_, Counter>) -> Result { + let mut counter = state.0.lock().unwrap(); + *counter += 1; + Ok(*counter) +} + +#[tauri::command] +pub fn get_counter(state: tauri::State<'_, Counter>) -> Result { + let counter = state.0.lock().unwrap(); + Ok(*counter) +} + +#[tauri::command] +pub fn reset_counter(state: tauri::State<'_, Counter>) -> Result { + let mut counter = state.0.lock().unwrap(); + *counter = 0; + Ok(0) +} + +// IPC communication handlers +#[tauri::command] +pub fn send_ipc_message(message_type: String, data: serde_json::Value, _window: tauri::Window) -> Result<(), String> { + let ipc_message = IPCMessage { + message_type, + data, + timestamp: Some(std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_millis() as u64), + id: Some(format!("msg_{}_{}", + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_millis(), + rand::random::())), + }; + + let json_message = serde_json::to_string(&ipc_message).unwrap(); + println!("{}", json_message); + + Ok(()) +} + +#[tauri::command] +pub fn send_message_to_stdout(message: String) -> Result<(), String> { + println!("{}", message); + Ok(()) +} + +// Image generation handlers +#[tauri::command] +pub fn generate_image_via_backend(prompt: String, files: Vec, dst: String) -> Result<(), String> { + let request = serde_json::json!({ + "type": "generate_request", + "prompt": prompt, + "files": files, + "dst": dst, + "timestamp": std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_millis() + }); + + println!("{}", serde_json::to_string(&request).unwrap()); + + Ok(()) +} + +#[tauri::command] +pub fn request_config_from_images(_app: tauri::AppHandle) -> Result<(), String> { + let request = serde_json::json!({ + "type": "config_request", + "timestamp": std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_millis() + }); + + println!("{}", serde_json::to_string(&request).unwrap()); + + Ok(()) +} + +#[tauri::command] +pub fn request_file_deletion(path: String) -> Result<(), String> { + let request = serde_json::json!({ + "type": "delete_request", + "path": path, + }); + + println!("{}", serde_json::to_string(&request).unwrap()); + + Ok(()) +} + +// Legacy direct handlers (not used via stdin) +#[tauri::command] +pub fn forward_config_to_frontend(prompt: Option, dst: Option, api_key: Option, files: Vec, app: tauri::AppHandle) -> Result<(), String> { + let config_data = serde_json::json!({ + "prompt": prompt, + "dst": dst, + "apiKey": api_key, + "files": files + }); + + if let Err(e) = app.emit("config-received", &config_data) { + return Err(format!("Failed to emit config: {}", e)); + } + + Ok(()) +} + +#[tauri::command] +pub fn forward_image_to_frontend(base64: String, mime_type: String, filename: String, app: tauri::AppHandle) -> Result<(), String> { + let image_data = serde_json::json!({ + "base64": base64, + "mimeType": mime_type, + "filename": filename + }); + + if let Err(e) = app.emit("image-received", &image_data) { + return Err(format!("Failed to emit image: {}", e)); + } + + Ok(()) +} diff --git a/packages/kbot/gui/tauri-app/src-tauri/src/lib.rs b/packages/kbot/gui/tauri-app/src-tauri/src/lib.rs index bbe1fa2e..099d8098 100644 --- a/packages/kbot/gui/tauri-app/src-tauri/src/lib.rs +++ b/packages/kbot/gui/tauri-app/src-tauri/src/lib.rs @@ -1,6 +1,10 @@ -use tauri::{Manager, Emitter}; +use tauri::Manager; use serde::{Serialize, Deserialize}; -use dirs; + +mod handlers; +mod stdin_processor; + +pub use handlers::*; #[derive(Serialize)] struct LogMessage { @@ -11,7 +15,7 @@ struct LogMessage { timestamp: u64, } -fn log_json(level: &str, message: &str, data: Option) { +pub fn log_json(level: &str, message: &str, data: Option) { let log_msg = LogMessage { level: level.to_string(), message: message.to_string(), @@ -24,298 +28,17 @@ fn log_json(level: &str, message: &str, data: Option) { eprintln!("{}", serde_json::to_string(&log_msg).unwrap_or_else(|_| format!("{{\"level\":\"error\",\"message\":\"Failed to serialize log message\"}}"))); } -struct Counter(std::sync::Mutex); -struct DebugMessages(std::sync::Mutex>); - -#[derive(Serialize, Deserialize)] -struct Payload { - prompt: String, - files: Vec, - dst: String, -} - -#[derive(Serialize, Deserialize)] -struct IPCMessage { - #[serde(rename = "type")] - message_type: String, - data: serde_json::Value, - timestamp: Option, - id: Option, -} - -#[derive(Serialize, Deserialize)] -struct CounterPayload { - count: u32, - message: Option, -} +// App state structures +pub struct Counter(pub std::sync::Mutex); +pub struct DebugMessages(pub std::sync::Mutex>); #[derive(Serialize, Deserialize, Clone)] -struct DebugPayload { - level: String, - message: String, - data: Option, +pub struct DebugPayload { + pub level: String, + pub message: String, + pub data: Option, } -#[derive(Serialize, Deserialize)] -struct ImagePayload { - base64: String, - #[serde(rename = "mimeType")] - mime_type: String, - filename: Option, -} - -// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ -#[tauri::command] -fn submit_prompt(prompt: &str, files: Vec, dst: &str, window: tauri::Window) { - log_json("info", "submit_prompt command called", Some(serde_json::json!({ - "prompt": prompt, - "files": files, - "dst": dst - }))); - - let payload = Payload { - prompt: prompt.to_string(), - files, - dst: dst.to_string(), - }; - let json_payload = serde_json::to_string(&payload).unwrap(); - - log_json("info", "Sending JSON payload to stdout", Some(serde_json::json!({ - "payload_length": json_payload.len() - }))); - println!("{}", json_payload); // The actual payload - ONLY this should go to stdout - let _ = window.app_handle().exit(0); -} - -#[tauri::command] -fn log_error_to_console(error: &str) { - eprintln!("[WebView ERROR forwarded]: {}", error); -} - -#[tauri::command] -fn resolve_path_relative_to_home(absolute_path: String) -> Result { - eprintln!("[RUST LOG]: resolve_path_relative_to_home command called."); - eprintln!("[RUST LOG]: - Received absolute path: {}", absolute_path); - - let home_dir = dirs::home_dir().ok_or_else(|| "Could not find home directory".to_string())?; - - let path_to_resolve = std::path::Path::new(&absolute_path); - - let relative_path = pathdiff::diff_paths(path_to_resolve, home_dir) - .ok_or_else(|| "Failed to calculate relative path from home directory".to_string())?; - - let result = relative_path.to_string_lossy().to_string(); - eprintln!("[RUST LOG]: - Resolved to path relative to home: {}", result); - Ok(result) -} - -#[tauri::command] -fn increment_counter(state: tauri::State<'_, Counter>) -> Result { - eprintln!("[RUST LOG]: increment_counter command called."); - let mut counter = state.0.lock().unwrap(); - *counter += 1; - let current_value = *counter; - eprintln!("[RUST LOG]: - Counter incremented to: {}", current_value); - Ok(current_value) -} - -#[tauri::command] -fn get_counter(state: tauri::State<'_, Counter>) -> Result { - eprintln!("[RUST LOG]: get_counter command called."); - let counter = state.0.lock().unwrap(); - let current_value = *counter; - eprintln!("[RUST LOG]: - Current counter value: {}", current_value); - Ok(current_value) -} - -#[tauri::command] -fn reset_counter(state: tauri::State<'_, Counter>) -> Result { - eprintln!("[RUST LOG]: reset_counter command called."); - let mut counter = state.0.lock().unwrap(); - *counter = 0; - eprintln!("[RUST LOG]: - Counter reset to: 0"); - Ok(0) -} - -#[tauri::command] -fn add_debug_message(message: String, level: String, data: Option, state: tauri::State<'_, DebugMessages>) -> Result<(), String> { - // Forward frontend debug messages to CLI via structured logging - log_json(&level, &format!("Frontend: {}", message), data.clone()); - - let debug_payload = DebugPayload { - level, - message, - data, - }; - - let mut messages = state.0.lock().unwrap(); - messages.push(debug_payload); - - // Keep only the last 100 messages to prevent memory issues - if messages.len() > 100 { - let len = messages.len(); - messages.drain(0..len - 100); - } - - Ok(()) -} - -#[tauri::command] -fn get_debug_messages(state: tauri::State<'_, DebugMessages>) -> Result, String> { - eprintln!("[RUST LOG]: get_debug_messages command called."); - let messages = state.0.lock().unwrap(); - let result = messages.clone(); - eprintln!("[RUST LOG]: - Returning {} debug messages", result.len()); - Ok(result) -} - -#[tauri::command] -fn clear_debug_messages(state: tauri::State<'_, DebugMessages>) -> Result<(), String> { - eprintln!("[RUST LOG]: clear_debug_messages command called."); - let mut messages = state.0.lock().unwrap(); - messages.clear(); - eprintln!("[RUST LOG]: - Debug messages cleared"); - Ok(()) -} - -#[tauri::command] -fn send_ipc_message(message_type: String, data: serde_json::Value, _window: tauri::Window) -> Result<(), String> { - eprintln!("[RUST LOG]: send_ipc_message command called."); - eprintln!("[RUST LOG]: - Type: {}", message_type); - eprintln!("[RUST LOG]: - Data: {}", data); - - let ipc_message = IPCMessage { - message_type, - data, - timestamp: Some(std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_millis() as u64), - id: Some(format!("msg_{}_{}", - std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_millis(), - rand::random::())), - }; - - let json_message = serde_json::to_string(&ipc_message).unwrap(); - eprintln!("[RUST LOG]: - Sending IPC message to stdout: {}", json_message); - println!("{}", json_message); - - Ok(()) -} - -#[tauri::command] -fn send_message_to_stdout(message: String) -> Result<(), String> { - eprintln!("[RUST LOG]: send_message_to_stdout command called."); - eprintln!("[RUST LOG]: - Message: {}", message); - - // Send directly to stdout (this will be captured by images.ts) - println!("{}", message); - - Ok(()) -} - -#[tauri::command] -fn generate_image_via_backend(prompt: String, files: Vec, dst: String) -> Result<(), String> { - eprintln!("[RUST LOG]: generate_image_via_backend called"); - eprintln!("[RUST LOG]: - Prompt: {}", prompt); - eprintln!("[RUST LOG]: - Files: {:?}", files); - eprintln!("[RUST LOG]: - Dst: {}", dst); - - // Send generation request to images.ts via stdout - let request = serde_json::json!({ - "type": "generate_request", - "prompt": prompt, - "files": files, - "dst": dst, - "timestamp": std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_millis() - }); - - println!("{}", serde_json::to_string(&request).unwrap()); - eprintln!("[RUST LOG]: Generation request sent to images.ts"); - - Ok(()) -} - -#[tauri::command] -fn request_config_from_images(_app: tauri::AppHandle) -> Result<(), String> { - eprintln!("[RUST LOG]: request_config_from_images called"); - - // Send request to images.ts via stdout - let request = serde_json::json!({ - "type": "config_request", - "timestamp": std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_millis() - }); - - println!("{}", serde_json::to_string(&request).unwrap()); - eprintln!("[RUST LOG]: Config request sent to images.ts"); - - Ok(()) -} - -#[tauri::command] -fn forward_config_to_frontend(prompt: Option, dst: Option, api_key: Option, files: Vec, app: tauri::AppHandle) -> Result<(), String> { - eprintln!("[RUST LOG]: forward_config_to_frontend called"); - - let config_data = serde_json::json!({ - "prompt": prompt, - "dst": dst, - "apiKey": api_key, - "files": files - }); - - if let Err(e) = app.emit("config-received", &config_data) { - eprintln!("[RUST LOG]: Failed to emit config-received: {}", e); - return Err(format!("Failed to emit config: {}", e)); - } - - eprintln!("[RUST LOG]: Config forwarded to frontend successfully"); - Ok(()) -} - -#[tauri::command] -fn forward_image_to_frontend(base64: String, mime_type: String, filename: String, app: tauri::AppHandle) -> Result<(), String> { - eprintln!("[RUST LOG]: forward_image_to_frontend called for {}", filename); - - let image_data = serde_json::json!({ - "base64": base64, - "mimeType": mime_type, - "filename": filename - }); - - if let Err(e) = app.emit("image-received", &image_data) { - eprintln!("[RUST LOG]: Failed to emit image-received: {}", e); - return Err(format!("Failed to emit image: {}", e)); - } - - eprintln!("[RUST LOG]: Image forwarded to frontend successfully"); - Ok(()) -} - -#[tauri::command] -fn request_file_deletion(path: String) -> Result<(), String> { - log_json("info", "request_file_deletion command called", Some(serde_json::json!({ - "path": path - }))); - - let request = serde_json::json!({ - "type": "delete_request", - "path": path, - }); - - println!("{}", serde_json::to_string(&request).unwrap()); - log_json("info", "Deletion request sent to images.ts", None); - - Ok(()) -} #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { @@ -352,153 +75,9 @@ pub fn run() { } let app_handle = app.handle().clone(); - - // Test our new JSON logging - log_json("info", "Tauri app starting with improved logging", Some(serde_json::json!({ - "test": true, - "message": "This is a test of the new structured logging system" - }))); - - // Listen for stdin commands from images.ts - std::thread::spawn(move || { - use std::io::{self, BufRead, BufReader}; - let stdin = io::stdin(); - let reader = BufReader::new(stdin); - - log_json("info", "Stdin listener thread started", None); - - for line in reader.lines() { - if let Ok(line_content) = line { - if line_content.trim().is_empty() { - continue; - } - - // Log stdin command but hide binary data - if line_content.contains("\"base64\"") { - log_json("debug", "Received stdin command with base64 data", Some(serde_json::json!({ - "content_length": line_content.len() - }))); - } else { - log_json("debug", "Received stdin command", Some(serde_json::json!({ - "content": line_content - }))); - } - - // Parse command from images.ts - if let Ok(command) = serde_json::from_str::(&line_content) { - if let Some(cmd) = command.get("cmd").and_then(|v| v.as_str()) { - log_json("info", "Processing command", Some(serde_json::json!({ - "command": cmd - }))); - - match cmd { - "forward_config_to_frontend" => { - log_json("info", "Forwarding config to frontend", Some(serde_json::json!({ - "has_prompt": command.get("prompt").is_some(), - "has_dst": command.get("dst").is_some(), - "has_api_key": command.get("apiKey").is_some(), - "file_count": command.get("files").and_then(|f| f.as_array()).map(|a| a.len()).unwrap_or(0) - }))); - - let config_data = serde_json::json!({ - "prompt": command.get("prompt"), - "dst": command.get("dst"), - "apiKey": command.get("apiKey"), - "files": command.get("files") - }); - - if let Err(e) = app_handle.emit("config-received", &config_data) { - log_json("error", "Failed to emit config-received", Some(serde_json::json!({ - "error": e.to_string() - }))); - } else { - log_json("info", "Config emitted successfully to frontend", None); - } - } - "forward_image_to_frontend" => { - if let (Some(filename), Some(base64), Some(mime_type)) = ( - command.get("filename").and_then(|v| v.as_str()), - command.get("base64").and_then(|v| v.as_str()), - command.get("mimeType").and_then(|v| v.as_str()) - ) { - log_json("info", "Forwarding image to frontend", Some(serde_json::json!({ - "filename": filename, - "mime_type": mime_type, - "base64_size": base64.len() - }))); - let image_data = serde_json::json!({ - "base64": base64, - "mimeType": mime_type, - "filename": filename - }); - - if let Err(e) = app_handle.emit("image-received", &image_data) { - log_json("error", "Failed to emit image-received", Some(serde_json::json!({ - "error": e.to_string(), - "filename": filename - }))); - } else { - log_json("info", "Image emitted successfully", Some(serde_json::json!({ - "filename": filename - }))); - } - } - } - "generation_result" => { - eprintln!("[RUST LOG]: Forwarding generation result to frontend"); - if let Err(e) = app_handle.emit("generation-result", &command) { - eprintln!("[RUST LOG]: Failed to emit generation-result: {}", e); - } else { - eprintln!("[RUST LOG]: Generation result emitted successfully"); - } - } - "generation_error" => { - eprintln!("[RUST LOG]: Forwarding generation error to frontend"); - if let Err(e) = app_handle.emit("generation-error", &command) { - eprintln!("[RUST LOG]: Failed to emit generation-error: {}", e); - } else { - eprintln!("[RUST LOG]: Generation error emitted successfully"); - } - } - "generation_complete" => { - eprintln!("[RUST LOG]: Generation completed successfully"); - if let Err(e) = app_handle.emit("generation-complete", &command) { - eprintln!("[RUST LOG]: Failed to emit generation-complete: {}", e); - } else { - eprintln!("[RUST LOG]: Generation complete emitted successfully"); - } - } - "file_deleted_successfully" => { - if let Some(path) = command.get("path").and_then(|v| v.as_str()) { - eprintln!("[RUST LOG]: Received confirmation of file deletion: {}", path); - if let Err(e) = app_handle.emit("file-deleted-successfully", &serde_json::json!({ "path": path })) { - eprintln!("[RUST LOG]: Failed to emit file-deleted-successfully: {}", e); - } - } - } - "file_deletion_error" => { - if let (Some(path), Some(error)) = ( - command.get("path").and_then(|v| v.as_str()), - command.get("error").and_then(|v| v.as_str()) - ) { - eprintln!("[RUST LOG]: Received file deletion error for {}: {}", path, error); - if let Err(e) = app_handle.emit("file-deletion-error", &serde_json::json!({ "path": path, "error": error })) { - eprintln!("[RUST LOG]: Failed to emit file-deletion-error: {}", e); - } - } - } - _ => { - eprintln!("[RUST LOG]: Unknown command: {}", cmd); - } - } - } - } else { - eprintln!("[RUST LOG]: Failed to parse command as JSON"); - } - } - } - eprintln!("[RUST LOG]: Stdin listener thread ended"); - }); + + // Start stdin listener in separate module + stdin_processor::start_stdin_listener(app_handle); Ok(()) }) diff --git a/packages/kbot/gui/tauri-app/src-tauri/src/stdin_processor.rs b/packages/kbot/gui/tauri-app/src-tauri/src/stdin_processor.rs new file mode 100644 index 00000000..0642f496 --- /dev/null +++ b/packages/kbot/gui/tauri-app/src-tauri/src/stdin_processor.rs @@ -0,0 +1,158 @@ +use tauri::Emitter; +use std::io::{BufRead, BufReader}; + +use crate::log_json; + +pub fn start_stdin_listener(app_handle: tauri::AppHandle) { + std::thread::spawn(move || { + let stdin = std::io::stdin(); + let reader = BufReader::new(stdin); + + + for line in reader.lines() { + if let Ok(line_content) = line { + if line_content.trim().is_empty() { + continue; + } + + // Parse command from images.ts + if let Ok(command) = serde_json::from_str::(&line_content) { + if let Some(cmd) = command.get("cmd").and_then(|v| v.as_str()) { + log_json("info", "Processing command", Some(serde_json::json!({ + "command": cmd + }))); + + match cmd { + "forward_config_to_frontend" => { + handle_config_forward(&command, &app_handle); + } + "forward_image_to_frontend" => { + handle_image_forward(&command, &app_handle); + } + "generation_result" => { + if let Err(e) = app_handle.emit("generation-result", &command) { + log_json("error", "Failed to emit generation-result", Some(serde_json::json!({ + "error": e.to_string() + }))); + } + } + "generation_error" => { + if let Err(e) = app_handle.emit("generation-error", &command) { + log_json("error", "Failed to emit generation-error", Some(serde_json::json!({ + "error": e.to_string() + }))); + } + } + "generation_complete" => { + if let Err(e) = app_handle.emit("generation-complete", &command) { + log_json("error", "Failed to emit generation-complete", Some(serde_json::json!({ + "error": e.to_string() + }))); + } + } + "file_deleted_successfully" => { + if let Some(path) = command.get("path").and_then(|v| v.as_str()) { + if let Err(e) = app_handle.emit("file-deleted-successfully", &serde_json::json!({ "path": path })) { + log_json("error", "Failed to emit file-deleted-successfully", Some(serde_json::json!({ + "error": e.to_string() + }))); + } + } + } + "file_deletion_error" => { + if let (Some(path), Some(error)) = ( + command.get("path").and_then(|v| v.as_str()), + command.get("error").and_then(|v| v.as_str()) + ) { + if let Err(e) = app_handle.emit("file-deletion-error", &serde_json::json!({ "path": path, "error": error })) { + log_json("error", "Failed to emit file-deletion-error", Some(serde_json::json!({ + "error": e.to_string() + }))); + } + } + } + _ => { + log_json("warn", "Unknown command received", Some(serde_json::json!({ + "command": cmd + }))); + } + } + } + } else { + log_json("warn", "Failed to parse stdin as JSON", Some(serde_json::json!({ + "content_length": line_content.len() + }))); + } + } + } + + log_json("info", "Stdin listener thread ended", None); + }); +} + +fn handle_config_forward(command: &serde_json::Value, app_handle: &tauri::AppHandle) { + log_json("info", "Forwarding config to frontend", Some(serde_json::json!({ + "has_prompt": command.get("prompt").is_some(), + "has_dst": command.get("dst").is_some(), + "has_api_key": command.get("apiKey").is_some(), + "file_count": command.get("files").and_then(|f| f.as_array()).map(|a| a.len()).unwrap_or(0) + }))); + + // Extract values, handling both null and undefined + let prompt = command.get("prompt") + .and_then(|v| if v.is_null() { None } else { v.as_str().map(|s| s.to_string()) }); + let dst = command.get("dst") + .and_then(|v| if v.is_null() { None } else { v.as_str().map(|s| s.to_string()) }); + let api_key = command.get("apiKey") + .and_then(|v| if v.is_null() { None } else { v.as_str().map(|s| s.to_string()) }); + let files = command.get("files") + .and_then(|v| v.as_array()) + .map(|arr| arr.iter().filter_map(|f| f.as_str().map(|s| s.to_string())).collect::>()) + .unwrap_or_else(Vec::new); + + let config_data = serde_json::json!({ + "prompt": prompt, + "dst": dst, + "apiKey": api_key, + "files": files + }); + + if let Err(e) = app_handle.emit("config-received", &config_data) { + log_json("error", "Failed to emit config-received", Some(serde_json::json!({ + "error": e.to_string() + }))); + } else { + log_json("info", "Config emitted successfully to frontend", None); + } +} + +fn handle_image_forward(command: &serde_json::Value, app_handle: &tauri::AppHandle) { + if let (Some(filename), Some(base64), Some(mime_type)) = ( + command.get("filename").and_then(|v| v.as_str()), + command.get("base64").and_then(|v| v.as_str()), + command.get("mimeType").and_then(|v| v.as_str()) + ) { + log_json("info", "Forwarding image to frontend", Some(serde_json::json!({ + "filename": filename, + "mime_type": mime_type, + "base64_size": base64.len() + }))); + + let image_data = serde_json::json!({ + "base64": base64, + "mimeType": mime_type, + "filename": filename + }); + + if let Err(e) = app_handle.emit("image-received", &image_data) { + log_json("error", "Failed to emit image-received", Some(serde_json::json!({ + "error": e.to_string(), + "filename": filename + }))); + } else { + log_json("info", "Image emitted successfully", Some(serde_json::json!({ + "filename": filename + }))); + } + } +} diff --git a/packages/kbot/gui/tauri-app/src/App.tsx b/packages/kbot/gui/tauri-app/src/App.tsx index d3863ffc..82e0cfbc 100644 --- a/packages/kbot/gui/tauri-app/src/App.tsx +++ b/packages/kbot/gui/tauri-app/src/App.tsx @@ -26,7 +26,7 @@ function App() { const [apiKey, setApiKey] = useState(""); const [isDarkMode, setIsDarkMode] = useState(false); const [debugMessages, setDebugMessages] = useState([]); - const [showDebugPanel, setShowDebugPanel] = useState(true); // Default open for debugging + const [showDebugPanel, setShowDebugPanel] = useState(false); // Hidden in production // Initialize logging system and connect to UI useEffect(() => { @@ -140,10 +140,6 @@ function App() { } }; - // Legacy function for compatibility - just use log directly now - const addDebugMessage = (level: 'info' | 'warn' | 'error' | 'debug', message: string, data?: any) => { - log[level](message, data); - }; const addImageFromUrl = async (url: string) => { try { @@ -416,7 +412,7 @@ function App() { await generateImage(prompt, imagesToUse); // Don't clear prompt - let user iterate } else { - addDebugMessage('error', 'API key required for image generation'); + log.error('API key required for image generation'); } } @@ -591,7 +587,6 @@ function App() { {showDebugPanel && ( maxDepth) { + return '[Max depth reached]'; + } + + if (value === null || value === undefined) { + return value; + } + + if (typeof value !== 'object') { + return value; + } + + if (seen.has(value)) { + return '[Circular Reference]'; + } + + seen.add(value); + + if (Array.isArray(value)) { + return value.slice(0, 10).map((item, index) => { + if (index >= 10) return '[Truncated]'; + return serialize(item, depth + 1); + }); + } + + const result: any = {}; + const keys = Object.keys(value).slice(0, 20); // Limit keys + + for (const key of keys) { + try { + result[key] = serialize(value[key], depth + 1); + } catch (e) { + result[key] = '[Serialization Error]'; + } + } + + if (Object.keys(value).length > 20) { + result['[truncated]'] = `${Object.keys(value).length - 20} more keys...`; + } + + return result; + } + + try { + return JSON.stringify(serialize(obj, 0), null, 2); + } catch (e) { + return `[Serialization failed: ${e instanceof Error ? e.message : 'Unknown error'}]`; + } +} interface DebugPanelProps { debugMessages: any[]; - addDebugMessage: (level: 'info' | 'warn' | 'error' | 'debug', message: string, data?: any) => void; sendIPCMessage: (messageType: string, data: any) => void; clearDebugMessages: () => void; ipcInitialized: boolean; @@ -14,7 +69,6 @@ interface DebugPanelProps { const DebugPanel: React.FC = ({ debugMessages, - addDebugMessage, sendIPCMessage, clearDebugMessages, ipcInitialized, @@ -39,7 +93,7 @@ const DebugPanel: React.FC = ({ ? await tauriApi.path.join(dataDir, '.kbot-gui.json') : 'N/A'; - addDebugMessage('info', 'System Info & Store Paths', { + log.info('System Info & Store Paths', { platform: navigator.platform, userAgent: navigator.userAgent, isTauri: tauriApi.isTauri(), @@ -50,7 +104,7 @@ const DebugPanel: React.FC = ({ windowLocation: window.location.href }); } catch (error) { - addDebugMessage('error', 'Failed to get system info', { error: (error as Error).message }); + log.error('Failed to get system info', { error: (error as Error).message }); } }} className="glass-button text-sm px-4 py-2 rounded-lg" @@ -58,7 +112,7 @@ const DebugPanel: React.FC = ({ Test Info