block/buzz · error

-32601

-32601

Error message

jsonrpc: method not found: {method}

What it means

dispatch() routes only the methods this harness implements: session/new, session/prompt, session/set_model, session/cancel, and _goose/unstable/session/steer (plus the session/cancel notification arm). Any other method string falls to the catch-all, replying with JSON-RPC error code -32601 (method not found) and the caller's request id.

Source

Thrown at crates/buzz-agent/src/lib.rs:335

        }
        "session/cancel" => {
            cancel_session(app, params).await;
            wire::send(wire_tx, wire::ok(id, Value::Null)).await;
        }
        // goose-compatible non-standard extension: inject user input into the
        // currently active prompt without starting a new one. Mirrors goose's
        // `_goose/unstable/session/steer` wire contract so a single client-side
        // delivery path serves both agents.
        "_goose/unstable/session/steer" => {
            steer_session(app, id, params, wire_tx).await;
        }
        _ => {
            wire::send(
                wire_tx,
                wire::err(
                    id,
                    METHOD_NOT_FOUND,
                    &format!("jsonrpc: method not found: {method}"),
                ),
            )
            .await
        }
    }
}

async fn handle_notification(app: &Arc<App>, method: &str, params: Value) {
    if method == "session/cancel" {
        cancel_session(app, params).await;
    }
}

async fn initialize(app: &Arc<App>, id: Value, params: Value, wire_tx: &WireSender) {
    let p: InitializeParams = match decode(params, "initialize") {
        Ok(p) => p,
        Err(m) => return reject(wire_tx, id, INVALID_PARAMS, &m).await,
    };

View on GitHub (pinned to dad5a33865)

Solutions

  1. Match your client's call list to the arms in handle_request/dispatch in crates/buzz-agent/src/lib.rs
  2. Upgrade buzz-agent if the method exists in a newer release
  3. Treat -32601 as capability discovery: catch it and disable that code path in the client instead of retrying

Example fix

// before (client)
await call("session/steer", params); // typo → -32601

// after
await call("_goose/unstable/session/steer", params);
Defensive patterns

Strategy: type-guard

Type guard

const KNOWN_METHODS = new Set([
  "session/new",
  "session/prompt",
  "session/set_model",
  "session/cancel",
  "_goose/unstable/session/steer",
]); // keep in sync with crates/buzz-agent/src/lib.rs dispatch()
function isKnownMethod(m: string): m is (typeof KNOWN_METHODS extends Set<infer T> ? T : never) {
  return KNOWN_METHODS.has(m);
}

Try / catch

try {
  await call(method, params);
} catch (e) {
  if (e instanceof JsonRpcError && e.code === -32601) {
    disableFeature(method); // capability mismatch, not a transient error
  } else throw e;
}

Prevention

When it happens

Trigger: Calling a method this buzz-agent version does not implement (e.g. a newer client extension or another agent's API); a typo'd method name; sending a request for a notification-only method and expecting a success reply.

Common situations: Version skew between an ACP/goose-era client and buzz-agent; porting a client from a different agent runtime that supports extra methods; capability probing scripts.

Related errors


AI-assisted analysis of block/buzz@dad5a33865 (2026-08-20). Data as JSON: /api/errors/400b2c7fdcdc8aeb. Report an issue: GitHub.