warpdotdev/warp · warning

No updates requested

Error message

No updates requested

What it means

The agent-update command assembles an UpdateAgentRequest from the provided flags (fetching the current agent only when secrets/skills change); request_is_empty detects that every field of the built request is None and returns this anyhow error (app/src/ai/agent_sdk/agent_management.rs:176) instead of sending an empty mutation. It is an argument-validation guard, fail-fast before any API call.

Source

Thrown at app/src/ai/agent_sdk/agent_management.rs:176

        output_format: OutputFormat,
        ctx: &mut ModelContext<Self>,
    ) -> anyhow::Result<()> {
        let ai_client = ServerApiProvider::as_ref(ctx).get_ai_client();
        let future = async move {
            let uid = args.uid.clone();
            let json_output = args.json_output.clone();
            let needs_current_agent = !args.add_secrets.is_empty()
                || !args.remove_secrets.is_empty()
                || !args.add_skills.is_empty()
                || !args.remove_skills.is_empty();
            let current_agent = if needs_current_agent {
                Some(ai_client.get_agent(&uid).await?)
            } else {
                None
            };
            let request = build_update_request(args, current_agent.as_ref());
            if request_is_empty(&request) {
                return Err(anyhow!("No updates requested"));
            }

            if matches!(output_format, OutputFormat::Json) || json_output.force_json_output() {
                let response = ai_client.update_agent_raw(&uid, request).await?;
                super::output::print_raw_json(response, &json_output)?;
            } else {
                let agent = ai_client.update_agent(&uid, request).await?;
                print_single_agent(&agent, output_format)?;
            }
            Ok(())
        };
        self.spawn_command(future, ctx);
        Ok(())
    }

    fn delete(
        &self,
        args: AgentDeleteArgs,

View on GitHub (pinned to e72fd7aacb)

Solutions

  1. Add at least one actual change flag (e.g. --description, --add-secret, --add-skill, --base-model) to the command
  2. If you meant to inspect the agent, use the get/show subcommand instead

Example fix

# before
agent update my-agent
# after
agent update my-agent --description "new description"
Defensive patterns

Strategy: validation

Validate before calling

let has_any_update = !args.add_secrets.is_empty()
    || !args.remove_secrets.is_empty()
    || !args.add_skills.is_empty()
    || !args.remove_skills.is_empty()
    || args.name.is_some()
    || args.description.is_some();
if !has_any_update {
    // skip invoking `agent update`; nothing would be sent
}

Try / catch

match run_update(args, ctx).await {
    Err(e) if e.to_string() == "No updates requested" => {
        // fix the caller: require at least one change flag before dispatch
    }
    rest => rest,
}

Prevention

When it happens

Trigger: Running agent update passing only the agent id and output flags — no --name/--description, no add/remove secrets, no add/remove skills, no model or environment change.

Common situations: Scripts templating update commands with all-change-flags commented out; users expecting `update` with no changes to be a no-op or a refresh.

Related errors


AI-assisted analysis of warpdotdev/warp@e72fd7aacb (2026-08-16). Data as JSON: /api/errors/0a07b1f87f35138e. Report an issue: GitHub.