Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 11 additions & 43 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ url = "2"
proptest = "1"

# MCP SDK (used by buzz-dev-mcp and buzz-agent)
rmcp = { version = "1.1.0", features = ["server", "transport-io", "macros"] }
rmcp = { version = "3.9.0", features = ["server", "transport-io", "macros"] }
schemars = { version = "1", default-features = false }

# Internal crates
Expand Down
2 changes: 1 addition & 1 deletion crates/buzz-agent/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ serde = { workspace = true }
serde_json = { workspace = true }
serde_yaml = { workspace = true }
reqwest = { workspace = true, features = ["json", "rustls", "form"] }
rmcp = { version = "1", default-features = false, features = ["client", "transport-child-process"] }
rmcp = { version = "3.9.0", default-features = false, features = ["client", "transport-child-process"] }
arc-swap = "1"
getrandom = "0.4"
tracing = { workspace = true }
Expand Down
19 changes: 10 additions & 9 deletions crates/buzz-agent/src/mcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -956,11 +956,11 @@ pub(crate) fn truncate_middle(s: &str, max: usize) -> String {
/// with a marker; text is middle-elided so the head (what ran) and tail
/// (how it ended) both survive. Every elision leaves an inline marker.
fn tool_result_content(
blocks: &[rmcp::model::Content],
blocks: &[rmcp::model::ContentBlock],
max_bytes: usize,
max_text_bytes: usize,
) -> Vec<ToolResultContent> {
use rmcp::model::RawContent;
use rmcp::model::ContentBlock;
let mut out = Vec::new();
let mut text = String::new();
let mut used = 0usize; // total bytes emitted (text + images)
Expand Down Expand Up @@ -994,9 +994,9 @@ fn tool_result_content(
};

for c in blocks {
match &c.raw {
RawContent::Text(t) => append(&mut text, &t.text),
RawContent::Image(i) => {
match c {
ContentBlock::Text(t) => append(&mut text, &t.text),
ContentBlock::Image(i) => {
flush_text(&mut out, &mut text, &mut used, &mut text_used);
let image_bytes = i.data.len().saturating_add(i.mime_type.len());
if used.saturating_add(image_bytes) <= max_bytes {
Expand All @@ -1016,18 +1016,19 @@ fn tool_result_content(
);
}
}
RawContent::Audio(a) => append(
ContentBlock::Audio(a) => append(
&mut text,
&format!(
"[audio elided: {}, {} bytes]",
short(&a.mime_type),
a.data.len()
),
),
RawContent::ResourceLink(r) => {
ContentBlock::ResourceLink(r) => {
append(&mut text, &format!("[resource: {}]", short(&r.uri)));
}
RawContent::Resource(_) => append(&mut text, "[resource elided]"),
ContentBlock::Resource(_) => append(&mut text, "[resource elided]"),
_ => append(&mut text, "[unsupported content elided]"),
}
}
flush_text(&mut out, &mut text, &mut used, &mut text_used);
Expand Down Expand Up @@ -1090,7 +1091,7 @@ mod content_tests {
);
}
}
use rmcp::model::Content;
use rmcp::model::ContentBlock as Content;

#[cfg(windows)]
#[test]
Expand Down
4 changes: 3 additions & 1 deletion crates/buzz-agent/tests/regressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,9 @@ async fn tool_metadata_caps_enforced() {
"args": [],
"env": [
{ "name": "FAKE_MCP_TOOL_COUNT", "value": "200" },
{ "name": "FAKE_MCP_HUGE_DESC", "value": "1" },
// Stay below rmcp's 16 MiB stdio frame bound so this
// fixture reaches Buzz's tool-count and metadata guards.
{ "name": "FAKE_MCP_DESC_SIZE", "value": "10000" },
],
}],
}),
Expand Down
2 changes: 1 addition & 1 deletion crates/buzz-dev-mcp/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ serde = { workspace = true }
serde_json = { workspace = true }
# Discovery-based clients (including Goose 1.52) require the modern lifecycle.
# Keep the native agent's independent MCP client dependency unchanged.
rmcp = { version = "3.4.1", features = ["server", "transport-io", "macros"] }
rmcp = { version = "3.9.0", features = ["server", "transport-io", "macros"] }
schemars = { workspace = true }
similar = "3"
tempfile = "3"
Expand Down
4 changes: 4 additions & 0 deletions deny-desktop.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ all-features = true

[advisories]
ignore = [
# The mesh-llm log-store still requires rusqlite 0.40 / libsqlite3-sys
# 0.38.2. The maintainer accepted this SQLite exception until the upstream
# dependency can use the patched 0.39 series; remove on that upgrade.
{ id = "RUSTSEC-2026-0459", reason = "upstream mesh-llm SQLite stack has no compatible fix yet; maintainer accepted temporary exception" },
# zip 8.6.0 < 9: extraction keeps setuid/setgid bits (0367), creates
# symlinks that escape the destination (0368) and applies permissions through
# symlinks (0369). Only path: the optional mesh-llm feature → mesh-llm v0.76.2
Expand Down
4 changes: 4 additions & 0 deletions deny-mesh.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Mesh-LLM smoke harness only. Desktop and runtime crates use deny.toml.
[advisories]
ignore = [
# The mesh-llm log-store still requires rusqlite 0.40 / libsqlite3-sys
# 0.38.2. The maintainer accepted this SQLite exception until the upstream
# dependency can use the patched 0.39 series; remove on that upgrade.
{ id = "RUSTSEC-2026-0459", reason = "upstream mesh-llm SQLite stack has no compatible fix yet; maintainer accepted temporary exception" },
# 0.26.11 contains no roots: it re-exports webpki-roots 1.x. Both lockfiles
# resolve that parent to 1.0.10, which removes the distrusted emSign root.
# The advisory also flags this compatibility wrapper. The bans below keep
Expand Down
5 changes: 5 additions & 0 deletions deny.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ ignore = [
{ id = "RUSTSEC-2026-0368", reason = "zip 8.6.0 via buzz-mesh-smoke → mesh-llm v0.76.2; manual entry copy, never extracts; fix in unreleased mesh-llm#2471" },
{ id = "RUSTSEC-2026-0369", reason = "zip 8.6.0 via buzz-mesh-smoke → mesh-llm v0.76.2; manual entry copy, never extracts; fix in unreleased mesh-llm#2471" },
{ id = "RUSTSEC-2026-0429", reason = "zip 8.6.0 via buzz-mesh-smoke → mesh-llm v0.76.2; manual entry copy, never extracts; fix in unreleased mesh-llm#2471" },
# libsqlite3-sys 0.38.2 via dev-only buzz-mesh-smoke → mesh-llm v0.76.2
# → rusqlite 0.40.2. The parent stack cannot yet select the patched 0.39
# release. Temporary exception accepted by the maintainer; remove when
# mesh-llm updates its SQLite stack.
{ id = "RUSTSEC-2026-0459", reason = "dev-only mesh-llm SQLite stack has no upstream-compatible fix yet; maintainer accepted temporary exception" },
# zbus 5 D-Bus crates (zvariant, zbus_names, zvariant_derive) — unmaintained,
# not vulnerable. Only path: buzz-mesh-smoke → mesh-llm → keyring 4 →
# zbus-secret-service-keyring-store / secret-service 5 → zbus 5.
Expand Down
Loading
Loading