warpdotdev/warp · error · anyhow::Error

Conversation '{conversation_id}' is not backed by a cloud ag

Error message

Conversation '{conversation_id}' is not backed by a cloud agent task

What it means

`ambient_task_id_from_conversation_metadata` extracts the cloud ambient-agent task id from server-side conversation metadata. If `ambient_agent_task_id` is absent, the conversation was never backed by a cloud agent task (e.g. a local-only run), and artifact upload — which attaches files to a cloud task — has nothing to attach to.

Source

Thrown at app/src/ai/agent_sdk/artifact_upload.rs:291

}

fn single_conversation_metadata(
    conversation_id: &str,
    mut metadata: Vec<ServerAIConversationMetadata>,
) -> Result<ServerAIConversationMetadata> {
    match metadata.len() {
        0 => bail!("Conversation not found"),
        1 => Ok(metadata.pop().expect("metadata length checked")),
        _ => bail!("Multiple conversations found for '{conversation_id}'"),
    }
}

fn ambient_task_id_from_conversation_metadata(
    conversation_id: &str,
    metadata: ServerAIConversationMetadata,
) -> Result<AmbientAgentTaskId> {
    metadata.ambient_agent_task_id.ok_or_else(|| {
        anyhow!("Conversation '{conversation_id}' is not backed by a cloud agent task")
    })
}

fn parse_run_id(run_id: &str, error_prefix: &str) -> Result<AmbientAgentTaskId> {
    parse_ambient_task_id(run_id, error_prefix)
}

fn load_env_run_id() -> Result<Option<String>> {
    match env::var(OZ_RUN_ID_ENV_VAR) {
        Ok(run_id) => Ok(Some(run_id)),
        Err(env::VarError::NotPresent) => Ok(None),
        Err(env::VarError::NotUnicode(_)) => Err(anyhow!(
            "{OZ_RUN_ID_ENV_VAR} is set but is not valid Unicode"
        )),
    }
}

fn resolve_env_run_id(env_run_id: Option<String>) -> Result<AmbientAgentTaskId> {

View on GitHub (pinned to e72fd7aacb)

Solutions

  1. Pass `--run-id <ambient task id>` explicitly instead of the conversation id
  2. Run the agent through the cloud/ambient path so the conversation gets a backing task id
  3. Verify the conversation id actually belongs to the cloud run you mean

Example fix

# before
warp artifacts upload --conversation-id abc123 file.zip
# after
warp artifacts upload --run-id <ambient-task-id> file.zip
Defensive patterns

Strategy: validation

Validate before calling

async fn conversation_backed_by_cloud_task(client: &ServerApi, id: &ServerConversationToken)
    -> anyhow::Result<bool>
{
    let meta = fetch_conversation_metadata(client, id).await?;
    Ok(meta.ambient_agent_task_id.is_some())
}
// Offer conversation-based upload only when true; otherwise require --run-id.

Type guard

fn backed_by_cloud_task(m: &ServerAIConversationMetadata) -> bool {
    m.ambient_agent_task_id.is_some()
}

Prevention

When it happens

Trigger: Calling artifact upload with `--conversation-id <id>` where the fetched ServerAIConversationMetadata has `ambient_agent_task_id: None`.

Common situations: Uploading artifacts for a conversation created by a purely local agent run; conversations created before cloud-task backing shipped; targeting a conversation id from a different workspace or server.

Related errors


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