Skip to content

Commit 6891211

Browse files
committed
fix(slack): avoid generic inline button prompt hint
1 parent 4bc79f9 commit 6891211

3 files changed

Lines changed: 29 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Docs: https://docs.openclaw.ai
2424
### Fixes
2525

2626
- Models/UI: hide unauthenticated providers from the default Web chat, `/models`, and model setup pickers while keeping explicit full-catalog browse paths through `view: "all"`, `/models <provider> all`, and `models list --all`. Fixes #74423. Thanks @guarismo and @SymbolStar.
27+
- Slack/prompts: rely on Slack `interactiveReplies` guidance instead of generic `inlineButtons` config hints so enabled Slack button directives are not contradicted. Fixes #46647. Thanks @jeremykoerber.
2728
- Slack/reactions: treat duplicate `already_reacted` responses as idempotent success so repeated agent reaction adds no longer surface as tool failures. Fixes #69005. Thanks @shipitsteven and @martingarramon.
2829
- Slack/tools: expose `fileId` in the shared message tool schema so `download-file` can receive Slack attachment IDs from inbound placeholders. Fixes #45574. Thanks @chadvegas.
2930
- Exec: reject invalid per-call `host` values instead of silently falling back to the default target, so hostname-like values fail before commands run. Fixes #74426. Thanks @scr00ge-00 and @vyctorbrzezowski.

src/agents/system-prompt.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,26 @@ describe("buildAgentSystemPrompt", () => {
759759
expect(prompt).toContain("`style` can be `primary`, `success`, or `danger`");
760760
});
761761

762+
it("uses Slack interactive reply hints instead of generic inline button config guidance", () => {
763+
const prompt = buildAgentSystemPrompt({
764+
workspaceDir: "/tmp/openclaw",
765+
toolNames: ["message"],
766+
runtimeInfo: {
767+
channel: "slack",
768+
},
769+
messageToolHints: [
770+
"- Prefer Slack buttons/selects for 2-5 discrete choices or parameter picks instead of asking the user to type one.",
771+
"- Slack interactive replies: use `[[slack_buttons: Label:value, Other:other]]` to add action buttons that route clicks back as Slack interaction system events.",
772+
],
773+
});
774+
775+
expect(prompt).toContain("Slack interactive replies");
776+
expect(prompt).toContain("[[slack_buttons: Label:value, Other:other]]");
777+
expect(prompt).not.toContain("Inline buttons not enabled for slack");
778+
expect(prompt).not.toContain("slack.capabilities.inlineButtons");
779+
expect(prompt).not.toContain("buttons=[[{text,callback_data,style?}]]");
780+
});
781+
762782
it("describes message-tool-only source delivery without requiring target", () => {
763783
const prompt = buildAgentSystemPrompt({
764784
workspaceDir: "/tmp/openclaw",

src/agents/system-prompt.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ function buildMessagingSection(params: {
346346
return [];
347347
}
348348
const messageToolOnly = params.sourceReplyDeliveryMode === "message_tool_only";
349+
const showGenericInlineButtonHint = params.runtimeChannel !== "slack";
349350
const hasSessionsSpawn = params.availableTools.has("sessions_spawn");
350351
const hasSubagents = params.availableTools.has("subagents");
351352
const subagentOrchestrationGuidance = hasSessionsSpawn
@@ -376,11 +377,13 @@ function buildMessagingSection(params: {
376377
messageToolOnly
377378
? "- If you use `message` (`action=send`) to deliver visible output, do not repeat that visible content in your final answer; final answers are private in this mode."
378379
: `- If you use \`message\` (\`action=send\`) to deliver your user-visible reply, respond with ONLY: ${SILENT_REPLY_TOKEN} (avoid duplicate replies).`,
379-
params.inlineButtonsEnabled
380-
? "- Inline buttons supported. Use `action=send` with `buttons=[[{text,callback_data,style?}]]`; `style` can be `primary`, `success`, or `danger`."
381-
: params.runtimeChannel
382-
? `- Inline buttons not enabled for ${params.runtimeChannel}. If you need them, ask to set ${params.runtimeChannel}.capabilities.inlineButtons ("dm"|"group"|"all"|"allowlist").`
383-
: "",
380+
showGenericInlineButtonHint
381+
? params.inlineButtonsEnabled
382+
? "- Inline buttons supported. Use `action=send` with `buttons=[[{text,callback_data,style?}]]`; `style` can be `primary`, `success`, or `danger`."
383+
: params.runtimeChannel
384+
? `- Inline buttons not enabled for ${params.runtimeChannel}. If you need them, ask to set ${params.runtimeChannel}.capabilities.inlineButtons ("dm"|"group"|"all"|"allowlist").`
385+
: ""
386+
: "",
384387
...(params.messageToolHints ?? []),
385388
]
386389
.filter(Boolean)

0 commit comments

Comments
 (0)