From c6c518e6e9adb2eda8561038846b9b4e9bf46a61 Mon Sep 17 00:00:00 2001 From: "clawsweeper[bot]" <274271284+clawsweeper[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 22:25:29 -0700 Subject: [PATCH] fix(slack): cap select option values Co-authored-by: openclaw-clawsweeper[bot] <280122609+openclaw-clawsweeper[bot]@users.noreply.github.com> --- extensions/slack/src/blocks-render.ts | 2 +- extensions/slack/src/monitor/slash.test.ts | 13 +++++++++++-- extensions/slack/src/monitor/slash.ts | 2 +- extensions/slack/src/shared-interactive.test.ts | 8 ++++---- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/extensions/slack/src/blocks-render.ts b/extensions/slack/src/blocks-render.ts index 37b161a732f..26f54afd561 100644 --- a/extensions/slack/src/blocks-render.ts +++ b/extensions/slack/src/blocks-render.ts @@ -13,7 +13,7 @@ import { truncateSlackText } from "./truncate.js"; const SLACK_SECTION_TEXT_MAX = 3000; const SLACK_PLAIN_TEXT_MAX = 75; -const SLACK_OPTION_VALUE_MAX = 75; +const SLACK_OPTION_VALUE_MAX = 150; const SLACK_BUTTON_VALUE_MAX = 2000; const SLACK_BUTTON_URL_MAX = 3000; const SLACK_STATIC_SELECT_OPTIONS_MAX = 100; diff --git a/extensions/slack/src/monitor/slash.test.ts b/extensions/slack/src/monitor/slash.test.ts index 846510f1d48..d739cb00fa0 100644 --- a/extensions/slack/src/monitor/slash.test.ts +++ b/extensions/slack/src/monitor/slash.test.ts @@ -177,7 +177,7 @@ vi.mock("./slash-commands.runtime.js", () => { if (params.command?.key === "reportlong") { return resolvePeriodMenu(params, [ ...fullReportPeriodChoices, - { value: "x".repeat(45), label: "long" }, + { value: "x".repeat(100), label: "long" }, ]); } if (params.command?.key === "reportlongbutton") { @@ -632,8 +632,17 @@ describe("Slack native command argument menus", () => { }); it("uses static_select when encoded values fit Slack option limits", async () => { - const firstElement = await getFirstActionElementFromCommand(reportLongHandler); + const firstElement = (await getFirstActionElementFromCommand(reportLongHandler)) as + | { + type?: string; + options?: Array<{ value?: string }>; + confirm?: unknown; + } + | undefined; expect(firstElement?.type).toBe("static_select"); + const longOption = firstElement?.options?.find((option) => option.value?.includes("xxx")); + expect(longOption?.value?.length).toBeGreaterThan(75); + expect(longOption?.value?.length).toBeLessThanOrEqual(150); expect(firstElement?.confirm).toBeTruthy(); }); diff --git a/extensions/slack/src/monitor/slash.ts b/extensions/slack/src/monitor/slash.ts index 21d9ae777de..d99ce8d62f3 100644 --- a/extensions/slack/src/monitor/slash.ts +++ b/extensions/slack/src/monitor/slash.ts @@ -54,7 +54,7 @@ const SLACK_COMMAND_ARG_OVERFLOW_MIN = 3; const SLACK_COMMAND_ARG_OVERFLOW_MAX = 5; const SLACK_COMMAND_ARG_SELECT_OPTIONS_MAX = 100; const SLACK_COMMAND_ARG_SELECT_OPTION_TEXT_MAX = 75; -const SLACK_COMMAND_ARG_SELECT_OPTION_VALUE_MAX = 75; +const SLACK_COMMAND_ARG_SELECT_OPTION_VALUE_MAX = 150; const SLACK_COMMAND_ARG_BUTTON_TEXT_MAX = 75; const SLACK_COMMAND_ARG_BUTTON_VALUE_MAX = 2000; const SLACK_COMMAND_ARG_CONFIRM_TEXT_MAX = 300; diff --git a/extensions/slack/src/shared-interactive.test.ts b/extensions/slack/src/shared-interactive.test.ts index abc1d764cb5..ca0948c6486 100644 --- a/extensions/slack/src/shared-interactive.test.ts +++ b/extensions/slack/src/shared-interactive.test.ts @@ -89,8 +89,8 @@ describe("buildSlackInteractiveBlocks", () => { { type: "select", options: [ - { label: "Allowed", value: "a".repeat(75) }, - { label: "Too long", value: "b".repeat(76) }, + { label: "Allowed", value: "a".repeat(150) }, + { label: "Too long", value: "b".repeat(151) }, ], }, ], @@ -101,7 +101,7 @@ describe("buildSlackInteractiveBlocks", () => { }; expect(selectBlock.elements?.[0]?.options).toHaveLength(1); - expect(selectBlock.elements?.[0]?.options?.[0]?.value).toBe("a".repeat(75)); + expect(selectBlock.elements?.[0]?.options?.[0]?.value).toBe("a".repeat(150)); }); it("omits Slack select blocks when every option value exceeds Block Kit limits", () => { @@ -110,7 +110,7 @@ describe("buildSlackInteractiveBlocks", () => { blocks: [ { type: "select", - options: [{ label: "Too long", value: "x".repeat(76) }], + options: [{ label: "Too long", value: "x".repeat(151) }], }, ], }),