xai-org/grok-build · error

{}

Error message

{}

What it means

connect_to_leader resolves the leader target and converts resolve_leader_target's structured error (e.message) into an anyhow error verbatim. This surfaces any failure in leader discovery/selection — no leader registered for the environment, ambiguous or invalid target, or stale registration data — before a socket connection is even attempted.

Source

Thrown at crates/codegen/xai-grok-pager-bin/src/main.rs:390

    } else {
        eprintln!("No live leader processes found.");
    }
    Ok(())
}
fn resolve_target(args: &LeaderTargetArgs) -> LeaderTarget {
    match args.pid {
        Some(pid) => LeaderTarget::Pid(pid),
        None => LeaderTarget::Environment(xai_grok_shell::env::GrokBuildEnvironment::Production),
    }
}
#[tracing::instrument(skip_all)]
async fn connect_to_leader(
    args: &LeaderTargetArgs,
) -> Result<(LeaderDescriptor, xai_grok_shell::leader::LeaderClient)> {
    let target = resolve_target(args);
    let selection = xai_grok_shell::leader::resolve_leader_target(target)
        .await
        .map_err(|e| anyhow::anyhow!("{}", e.message))?;
    let socket_path = selection
        .socket_path()
        .ok_or_else(|| anyhow::anyhow!("resolved leader target did not include a socket path"))?;
    let client = xai_grok_shell::leader::LeaderClient::connect(
        socket_path.to_path_buf(),
        "grok-pager-leader-cli",
        ClientMode::Stdio,
        ClientCapabilities::default(),
    )
    .await?;
    Ok((selection.descriptor, client))
}
/// Prefer socket-verified live PID over a possibly-recycled lock file PID.
fn leader_pid(d: &LeaderDescriptor) -> Option<u32> {
    d.live_info.as_ref().map(|li| li.pid).or(d.pid_from_lock)
}
fn print_leader_descriptor(d: &LeaderDescriptor) {
    let pid = leader_pid(d)

View on GitHub (pinned to bc7f02eddd)

Solutions

  1. Read the embedded e.message for the specific resolution failure and address it
  2. Start a grok session (or `grok workspace start`) so a leader registers for the environment
  3. Verify the --leader/target argument matches an existing environment/leader name
  4. Clear stale leader registration state and let a fresh session re-register
Defensive patterns

Strategy: validation

Validate before calling

// ensure a leader is registered before connecting
let target = resolve_target(args);
match xai_grok_shell::leader::resolve_leader_target(target).await {
    Ok(sel) if sel.socket_path().is_some() => Ok(sel),
    Ok(_) => Err(anyhow!("leader resolved but no socket path")),
    Err(e) => Err(anyhow!("leader resolution failed: {}", e.message)),
}

Type guard

fn leader_connectable(sel: &xai_grok_shell::leader::LeaderSelection) -> bool {
    sel.socket_path().map(|p| p.exists()).unwrap_or(false)
}

Try / catch

match connect_to_leader(args).await {
    Ok((desc, client)) => { /* use client */ }
    Err(e) => {
        eprintln!("cannot reach leader: {e:#}. Start a grok session or `grok workspace start`.");
        std::process::exit(1);
    }
}

Prevention

When it happens

Trigger: Calling connect_to_leader (from run_leader_mgmt or connect_workspace_control) when resolve_leader_target returns an error whose .message becomes the entire error text — e.g. no leader recorded for the target environment, unknown target name, or corrupt/stale leader registry.

Common situations: No `grok` session running so nothing registered as leader; pointing the pager at the wrong environment name; leftover stale leader registration after a crash.

Related errors


AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31). Data as JSON: /api/errors/8764d6811207c9c7. Report an issue: GitHub.