| 235 | } |
| 236 | |
| 237 | fn handle_binary_file( |
| 238 | path: &Path, |
| 239 | content: &[u8], |
| 240 | mime: &str, |
| 241 | title: String, |
| 242 | ) -> Result<ToolResult, ToolError> { |
| 243 | let base64_content = |
| 244 | base64::Engine::encode(&base64::engine::general_purpose::STANDARD, content); |
| 245 | let data_url = format!("data:{};base64,{}", mime, base64_content); |
| 246 | |
| 247 | let file_type = if mime.starts_with("image/") { |
| 248 | "Image" |
| 249 | } else { |
| 250 | "PDF" |
| 251 | }; |
| 252 | let msg = format!("{} read successfully ({} bytes)", file_type, content.len()); |
| 253 | |
| 254 | let output = format!( |
| 255 | "<path>{}</path>\n<type>binary</type>\n<mime>{}</mime>\n<size>{}</size>\n<data-url>\n{}\n</data-url>", |
| 256 | path.display(), |
| 257 | mime, |
| 258 | content.len(), |
| 259 | data_url |
| 260 | ); |
| 261 | |
| 262 | Ok(ToolResult { |
| 263 | title, |
| 264 | output, |
| 265 | metadata: { |
| 266 | let mut m = Metadata::new(); |
| 267 | m.insert("preview".into(), serde_json::json!(msg)); |
| 268 | m.insert("truncated".into(), serde_json::json!(false)); |
| 269 | m.insert("mime".into(), serde_json::json!(mime)); |
| 270 | m.insert("size".into(), serde_json::json!(content.len())); |
| 271 | m |
| 272 | }, |
| 273 | truncated: false, |
| 274 | }) |
| 275 | } |
| 276 | |
| 277 | fn read_directory( |
| 278 | path: &Path, |