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
- Pass `--run-id <ambient task id>` explicitly instead of the conversation id
- Run the agent through the cloud/ambient path so the conversation gets a backing task id
- 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
- Check conversation metadata for ambient_agent_task_id before upload
- Always pass --run-id in automation
- Do not reuse conversation ids from local-only runs
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
- Failed to resolve artifact upload association for conversati
- Attachment upload is not enabled
- {} is set but is not valid Unicode
- {OZ_RUN_ID_ENV_VAR} is set but is not valid Unicode
- Failed to resolve artifact upload association: no usable --r
AI-assisted analysis of warpdotdev/warp@e72fd7aacb (2026-08-16).
Data as JSON: /api/errors/0d5768ae5df1c3be.
Report an issue: GitHub.