feat(embedding,vision): candle embeddings with offline fallback, on-demand clipboard vision capture, and concurrency audit

This commit is contained in:
Riz Ashraf committed 2026-10-07 06:36:09 +01:00
1 parent 5bd8b1587a
commit e4a0fe72df
47 files changed
+6292 -3503

No files matched your search

+31 -17
View File
@@ -13,25 +13,20 @@ pub async fn read_mcp_message<R: tokio::io::AsyncRead + Unpin>(
return None;
}
let trimmed_start = line.trim_start();
if trimmed_start.starts_with('{') {
let mut val = std::mem::take(&mut line);
let trimmed_len = val.trim_end().len();
val.truncate(trimmed_len);
let start = val.len() - val.trim_start().len();
if start > 0 {
val.drain(..start);
}
return Some(val);
let trimmed = line.trim();
if trimmed.starts_with('{') || trimmed.starts_with('[') {
return Some(trimmed.to_string());
}
let line = line.trim_end();
if line.is_empty() {
let trimmed_line = line.trim_end();
if trimmed_line.is_empty() {
break;
}
if line.as_bytes().len() >= 15 && line.as_bytes()[..15].eq_ignore_ascii_case(b"content-length:") {
length = line[15..].trim().parse().unwrap_or(0);
if trimmed_line.as_bytes().len() >= 15
&& trimmed_line.as_bytes()[..15].eq_ignore_ascii_case(b"content-length:")
{
length = trimmed_line[15..].trim().parse().unwrap_or(0);
}
}
@@ -42,7 +37,13 @@ pub async fn read_mcp_message<R: tokio::io::AsyncRead + Unpin>(
}
let mut buffer = Vec::with_capacity(length.min(64 * 1024));
if stdin.take(length as u64).read_to_end(&mut buffer).await.is_err() || buffer.len() != length {
if stdin
.take(length as u64)
.read_to_end(&mut buffer)
.await
.is_err()
|| buffer.len() != length
{
return None;
}
@@ -54,12 +55,26 @@ mod tests {
use super::*;
use std::io::Cursor;
#[tokio::test]
async fn test_read_batch_ndjson_message() {
let input = "[{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"ping\"}]\n";
let mut reader = BufReader::new(Cursor::new(input));
let msg = read_mcp_message(&mut reader).await;
assert_eq!(
msg,
Some("[{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"ping\"}]".to_string())
);
}
#[tokio::test]
async fn test_read_ndjson_message() {
let input = "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"ping\"}\n";
let mut reader = BufReader::new(Cursor::new(input));
let msg = read_mcp_message(&mut reader).await;
assert_eq!(msg, Some("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"ping\"}".to_string()));
assert_eq!(
msg,
Some("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"ping\"}".to_string())
);
}
#[tokio::test]
@@ -103,4 +118,3 @@ mod tests {
assert_eq!(msg, None);
}
}