diff --git a/.openclaw-sync/source.json b/.openclaw-sync/source.json
index 67f99dcae..e69622a70 100644
--- a/.openclaw-sync/source.json
+++ b/.openclaw-sync/source.json
@@ -1,5 +1,5 @@
{
"repository": "openclaw/openclaw",
- "sha": "b38e674c9fa12bc97bd410675dc0e07bd3e9f01a",
- "syncedAt": "2026-05-05T00:39:55.281Z"
+ "sha": "2d8fa23447584ad50d74f69aa6d10419f84b2a46",
+ "syncedAt": "2026-05-05T00:44:20.163Z"
}
diff --git a/docs/.generated/config-baseline.sha256 b/docs/.generated/config-baseline.sha256
index e0a057e0e..dfb09eede 100644
--- a/docs/.generated/config-baseline.sha256
+++ b/docs/.generated/config-baseline.sha256
@@ -1,4 +1,4 @@
-02987f4cecb64a98170b61c925fd7b16a22b276abfb261f9281b42f613ded923 config-baseline.json
-de5a6f65ef09dc23453a2e12512e41c133c941519e0ebef7f2946e4a24265d17 config-baseline.core.json
+7526a2ec39c5bbe905f8347f900d812f28dd65caaf3f0172d1e9692fb186dcd3 config-baseline.json
+baa4a12a48a03755cab302629a1f6b65b2e826c091a987d68de5989d39e8ed35 config-baseline.core.json
cd7c0c7fb1435bc7e59099e9ac334462d5ad444016e9ab4512aae63a238f78dc config-baseline.channel.json
9832b30a696930a3da7efccf38073137571e1b66cae84e54d747b733fdafcc54 config-baseline.plugin.json
diff --git a/docs/automation/tasks.md b/docs/automation/tasks.md
index c90865976..046ed7ad1 100644
--- a/docs/automation/tasks.md
+++ b/docs/automation/tasks.md
@@ -102,7 +102,7 @@ Not every agent run creates a task. Heartbeat turns and normal interactive chat
Main-session cron tasks use `silent` notify policy by default — they create records for tracking but do not generate notifications. Isolated cron tasks also default to `silent` but are more visible because they run in their own session.
- Session-backed `music_generate` and `video_generate` runs also use `silent` notify policy. They still create task records, but completion is handed back to the original agent session as an internal wake so the agent can write the follow-up message and attach the finished media itself. If you opt into `tools.media.asyncCompletion.directSend`, async `video_generate` completions can try direct channel delivery first; async `music_generate` completions stay on the requester-session wake path.
+ Session-backed `music_generate` and `video_generate` runs also use `silent` notify policy. They still create task records, but completion is handed back to the original agent session as an internal wake so the agent can write the follow-up message and attach the finished media itself. Group/channel completions follow the normal visible-reply policy, so the agent uses the message tool when source delivery requires it.
diff --git a/docs/gateway/config-tools.md b/docs/gateway/config-tools.md
index 32b031659..c23aa4e0f 100644
--- a/docs/gateway/config-tools.md
+++ b/docs/gateway/config-tools.md
@@ -209,7 +209,7 @@ Configures inbound media understanding (image/audio/video):
media: {
concurrency: 2,
asyncCompletion: {
- directSend: false, // opt-in: send finished async video directly to the channel
+ directSend: false, // deprecated: completions stay agent-mediated
},
audio: {
enabled: true,
@@ -262,7 +262,7 @@ Configures inbound media understanding (image/audio/video):
**Async completion fields:**
- - `asyncCompletion.directSend`: when `true`, completed async media tasks that support direct completion delivery try direct channel delivery first. Default: `false` (requester-session wake/model-delivery path). Today this applies to async `video_generate`; async `music_generate` completions stay requester-session mediated even when this is enabled.
+ - `asyncCompletion.directSend`: deprecated compatibility flag. Completed async media tasks stay requester-session mediated so the agent receives the result, decides how to tell the user, and uses the message tool when source delivery requires it.
diff --git a/docs/tools/media-overview.md b/docs/tools/media-overview.md
index 5feb8b5dd..ca2da2847 100644
--- a/docs/tools/media-overview.md
+++ b/docs/tools/media-overview.md
@@ -91,8 +91,9 @@ reply model.
For async tools, OpenClaw submits the request to the provider, returns a task
id immediately, and tracks the job in the task ledger. The agent continues
responding to other messages while the job runs. When the provider finishes,
-OpenClaw wakes the agent so it can post the finished media back into the
-original channel.
+OpenClaw wakes the agent with the generated media paths so it can tell the
+user and, when required by source-delivery policy, relay the result through
+the message tool.
## Speech-to-text and Voice Call
diff --git a/docs/tools/music-generation.md b/docs/tools/music-generation.md
index 5f5ece235..e0c5f61b7 100644
--- a/docs/tools/music-generation.md
+++ b/docs/tools/music-generation.md
@@ -14,8 +14,9 @@ MiniMax, and workflow-configured ComfyUI today.
For session-backed agent runs, OpenClaw starts music generation as a
background task, tracks it in the task ledger, then wakes the agent again
-when the track is ready so the agent can post the finished audio back into
-the original channel.
+when the track is ready so the agent can tell the user and attach the
+finished audio. In group/channel chats that use message-tool-only visible
+delivery, the agent relays the result through the message tool.
The built-in shared tool only appears when at least one music-generation
diff --git a/docs/tools/video-generation.md b/docs/tools/video-generation.md
index 7370a2496..4f6ab8f12 100644
--- a/docs/tools/video-generation.md
+++ b/docs/tools/video-generation.md
@@ -62,7 +62,9 @@ session:
1. OpenClaw submits the request to the provider and immediately returns a task id.
2. The provider processes the job in the background (typically 30 seconds to 5 minutes depending on the provider and resolution).
3. When the video is ready, OpenClaw wakes the same session with an internal completion event.
-4. The agent posts the finished video back into the original conversation.
+4. The agent tells the user and attaches the finished video. In group/channel
+ chats that use message-tool-only visible delivery, the agent relays the
+ result through the message tool instead of OpenClaw posting it directly.
While a job is in flight, duplicate `video_generate` calls in the same
session return the current task status instead of starting another