feat(embedding,vision): candle embeddings with offline fallback, on-demand clipboard vision capture, and concurrency audit
This commit is contained in:
1 parent
5bd8b1587a
commit
e4a0fe72df
47 files changed
+6292
-3503
No files matched your search
+31
-17
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user