zeroclaw-labs/zeroclaw · error · anyhow::Error

files.completeUploadExternal failed: {err}

Error message

files.completeUploadExternal failed: {err}

What it means

Error "files.completeUploadExternal failed: {err}" thrown in zeroclaw-labs/zeroclaw.

Source

Thrown at crates/zeroclaw-channels/src/slack.rs:1203

            }],
        });
        if let Some(ts) = thread_ts {
            complete_request["thread_ts"] = serde_json::json!(ts);
        }
        let complete_resp = self
            .http_client()
            .post(self.slack_api_url("files.completeUploadExternal"))
            .bearer_auth(&self.bot_token)
            .json(&complete_request)
            .send()
            .await?;
        let complete_body: serde_json::Value = complete_resp.json().await?;
        if complete_body.get("ok") != Some(&serde_json::Value::Bool(true)) {
            let err = complete_body
                .get("error")
                .and_then(|value| value.as_str())
                .unwrap_or("unknown");
            anyhow::bail!("files.completeUploadExternal failed: {err}");
        }

        Ok(())
    }

    async fn upload_outbound_attachments(
        &self,
        channel_id: &str,
        thread_ts: Option<&str>,
        attachments: &[MediaAttachment],
    ) -> anyhow::Result<()> {
        for attachment in attachments
            .iter()
            .take(SLACK_ATTACHMENT_MAX_FILES_PER_MESSAGE)
        {
            self.upload_outbound_attachment(channel_id, thread_ts, attachment)
                .await?;
        }

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Ensure the upload session from files.getUploadURLExternal is still valid and complete it before expiry; retry the upload.

When it happens

Trigger: Thrown at crates/zeroclaw-channels/src/slack.rs:1203 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/4a8df193bae8dc07. Report an issue: GitHub.