Automation Slack tool attaches image to a thread reply instead of the parent message that contains the `<img>` tag

Where does the bug appear (feature/product)?

Cloud Agent (GitHub, Slack, Web, Linear)

Describe the Bug

The send_slack_message docs say referenced artifacts are uploaded and shared on the Slack message that contains the HTML img tag.

In an Automation run that:

  1. posts a top-level Slack message whose message includes <img src="...">
  2. then posts a thread reply with no <img> tag

the image file was attached to the thread reply, not the parent.

The parent call did not set thread_ts. The reply call did not include an img tag.

Steps to Reproduce

  1. Create an Automation that can call send_slack_message (Cursor Automation Tools).
  2. Generate an image artifact under /opt/cursor/artifacts/ (e.g. via GenerateImage).
  3. Post a new top-level Slack message without thread_ts, with is_final_message: false, and with an img tag in message:
{
  "is_final_message": false,
  "message": "Hello\n\n<img src=\"/opt/cursor/artifacts/example.png\" alt=\"example\" />"
}
  1. Take the returned thread_ts and post a reply with is_final_message: true and no img tag:
{
  "is_final_message": true,
  "thread_ts": "<parent ts from step 3>",
  "message": "Follow-up text with no image tag"
}
  1. Check Slack: the image is on the reply, not the parent.

What the tool description says

To include artifacts in your message, reference image artifacts using HTML img tags … Referenced artifacts will be uploaded and shared in the Slack message.

is_final_message is documented only as controlling status metadata and action buttons, not file attachment:

Controls whether status metadata and action buttons are appended to this message. … If posting a top-level message then threaded replies, set false on the top-level and all thread replies except the last.

This run followed that sequence (false on parent, true on last reply). If attachments are intentionally bound to the final message, that is not documented.

Expected Behavior

The image is uploaded and attached to the parent (top-level) message, because that is the only message whose message field contains <img>.

Actual behavior

  • Parent: text only (no image file on the parent in Slack)
  • Thread reply: text plus the generated image file

Operating System

MacOS

Version Information

Version: 3.18.9
VS Code Extension API: 1.128.0
Commit: 2ba48ff3f7514cc4643c52ca9f7b3173d9b66130
Date: 2026-08-27T01:42:22.092Z
Layout: Agent Window
Build Type: Stable
Release Track: Default
Electron: 40.10.3
Chromium: 144.0.7559.236
Node.js: 24.15.0
V8: 14.4.258.32-electron.0
xterm.js: 6.1.0-beta.291
OS: Darwin arm64 25.5.0

For AI issues: which model did you use?

Grok 4.6

For AI issues: add Request ID with privacy disabled

Request ID: bc-b882ed3c-b95c-4eec-a7a6-2aa0b211aa41

Does this stop you from using Cursor

No - Cursor works, but with this issue

Hey @jun_sato,

This is how the Slack integration currently works, not something wrong in your run. Slack doesn’t let us attach a file to a message that’s already posted, so an image referenced with an <img> tag gets uploaded as its own post in the thread rather than onto the top-level message. The end-of-turn delivery is also why it landed right next to your follow-up.

You’re right that the tool description reads like the image should appear on the message with the tag. We’ve let the team know so we can clarify that. In the meantime, referencing the image in the final threaded reply keeps the text and image together.