diff --git a/.openclaw-sync/source.json b/.openclaw-sync/source.json index 90265fcb2..9502c31f9 100644 --- a/.openclaw-sync/source.json +++ b/.openclaw-sync/source.json @@ -1,5 +1,5 @@ { "repository": "openclaw/openclaw", - "sha": "5c85624eeba4e5cbd3a14344dfadbee89623016c", - "syncedAt": "2026-04-21T02:22:37.690Z" + "sha": "b5f25de3520e7468d599613514e1f2406a1239f8", + "syncedAt": "2026-04-21T03:01:49.874Z" } diff --git a/docs/.generated/config-baseline.sha256 b/docs/.generated/config-baseline.sha256 index acffc2bf1..549c0a09b 100644 --- a/docs/.generated/config-baseline.sha256 +++ b/docs/.generated/config-baseline.sha256 @@ -1,4 +1,4 @@ -ab40431597e9f7c09a9f010f267bab250c7f9c570c4a100776de98869f589a92 config-baseline.json +580abc79677d84fa66cb55e42ea093bfa9681655861166c02dfaa5a313d44310 config-baseline.json 04a82c2208bf69e0a195e7712e3a518a8255c1bb002c31f712cb95003325635b config-baseline.core.json e239cc20f20f8d0172812bc0ad3ee6df52da88e2e2702e3d03a47e01561132ae config-baseline.channel.json -b695cb31b4c0cf1d31f842f2892e99cc3ff8d84263ae72b72977cae844b81d6e config-baseline.plugin.json +8fb3a1cf5fe56ab8fc2cb46341c3403aed32b0d1f0aaeac0e96cd3599db4f06e config-baseline.plugin.json diff --git a/docs/channels/bluebubbles.md b/docs/channels/bluebubbles.md index c717f273f..fc69c542c 100644 --- a/docs/channels/bluebubbles.md +++ b/docs/channels/bluebubbles.md @@ -217,6 +217,54 @@ Per-group configuration: - Uses `allowFrom` and `groupAllowFrom` to determine command authorization. - Authorized senders can run control commands even without mentioning in groups. +### Per-group system prompt + +Each entry under `channels.bluebubbles.groups.*` accepts an optional `systemPrompt` string. The value is injected into the agent's system prompt on every turn that handles a message in that group, so you can set per-group persona or behavioral rules without editing agent prompts: + +```json5 +{ + channels: { + bluebubbles: { + groups: { + "iMessage;-;chat123": { + systemPrompt: "Keep responses under 3 sentences. Mirror the group's casual tone.", + }, + }, + }, + }, +} +``` + +The key matches whatever BlueBubbles reports as `chatGuid` / `chatIdentifier` / numeric `chatId` for the group, and a `"*"` wildcard entry provides a default for every group without an exact match (same pattern used by `requireMention` and per-group tool policies). Exact matches always win over the wildcard. DMs ignore this field; use agent-level or account-level prompt customization instead. + +#### Worked example: threaded replies and tapback reactions (Private API) + +With the BlueBubbles Private API enabled, inbound messages arrive with short message IDs (for example `[[reply_to:5]]`) and the agent can call `action=reply` to thread into a specific message or `action=react` to drop a tapback. A per-group `systemPrompt` is a reliable way to keep the agent choosing the right tool: + +```json5 +{ + channels: { + bluebubbles: { + groups: { + "iMessage;+;chat-family": { + systemPrompt: [ + "When replying in this group, always call action=reply with the", + "[[reply_to:N]] messageId from context so your response threads", + "under the triggering message. Never send a new unlinked message.", + "", + "For short acknowledgements ('ok', 'got it', 'on it'), use", + "action=react with an appropriate tapback emoji (❤️, 👍, 😂, ‼️, ❓)", + "instead of sending a text reply.", + ].join(" "), + }, + }, + }, + }, +} +``` + +Tapback reactions and threaded replies both require the BlueBubbles Private API; see [Advanced actions](#advanced-actions) and [Message IDs](#message-ids-short-vs-full) for the underlying mechanics. + ## ACP conversation bindings BlueBubbles chats can be turned into durable ACP workspaces without changing the transport layer.