@openclaw/slack 2026.5.16-beta.2 → 2026.5.16-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.js CHANGED
@@ -2,7 +2,7 @@ import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, l as resol
2
2
  import { t as inspectSlackAccount } from "./account-inspect-BJyQLSkN.js";
3
3
  import { i as resolveSlackChannelId, n as normalizeSlackMessagingTarget, r as parseSlackTarget, t as looksLikeSlackTargetId } from "./target-parsing-CQmv-iSm.js";
4
4
  import "./targets-B1tYCAr6.js";
5
- import { i as resolveSlackChannelType, n as buildSlackThreadingToolContext, o as resolveSlackAutoThreadId, r as __resetSlackChannelTypeCacheForTest, t as slackPlugin } from "./channel-CVSopl66.js";
5
+ import { i as resolveSlackChannelType, n as buildSlackThreadingToolContext, o as resolveSlackAutoThreadId, r as __resetSlackChannelTypeCacheForTest, t as slackPlugin } from "./channel-DoFtZGpw.js";
6
6
  import { n as resolveSlackGroupRequireMention, r as resolveSlackGroupToolPolicy } from "./reply-blocks-BFaJ_ejG.js";
7
7
  import { n as buildSlackPresentationBlocks, t as buildSlackInteractiveBlocks } from "./blocks-render-BAVfd6r0.js";
8
8
  import { a as validateSlackBlocksArray, i as parseSlackBlocksInput, r as SLACK_MAX_BLOCKS } from "./thread-ts-As_dcNbD.js";
@@ -10,12 +10,12 @@ import { n as extractSlackToolSend, r as listSlackMessageActions } from "./messa
10
10
  import { n as isSlackInteractiveRepliesEnabled, r as parseSlackOptionsLine, t as compileSlackInteractiveReplies } from "./interactive-replies-BSg5hXhj.js";
11
11
  import { a as getSlackWriteClient, c as resolveSlackWebClientOptions, i as createSlackWriteClient, l as resolveSlackWriteClientOptions, n as createSlackTokenCacheKey, o as SLACK_DEFAULT_RETRY_OPTIONS, r as createSlackWebClient, s as SLACK_WRITE_RETRY_OPTIONS, t as clearSlackWriteClientCacheForTest } from "./client-C_IaJbi5.js";
12
12
  import { a as normalizeSlackSlug, i as normalizeSlackAllowOwnerEntry, n as normalizeAllowList, o as resolveSlackAllowListMatch, r as normalizeAllowListLower, s as resolveSlackUserAllowed, t as allowListMatches } from "./allow-list-nwXs_eCP.js";
13
- import { t as slackSetupPlugin } from "./channel.setup-DknBgufI.js";
13
+ import { t as slackSetupPlugin } from "./channel.setup-BDL4qn9U.js";
14
14
  import { a as recordSlackThreadParticipation, n as clearSlackThreadParticipationCache, r as hasSlackThreadParticipation } from "./send-CxXFbqN1.js";
15
15
  import { a as listSlackEmojis, c as pinSlackMessage, d as removeOwnSlackReactions, f as removeSlackReaction, i as getSlackMemberInfo, l as reactSlackMessage, m as unpinSlackMessage, n as downloadSlackFile, o as listSlackPins, p as sendSlackMessage, r as editSlackMessage, s as listSlackReactions, t as deleteSlackMessage, u as readSlackMessages } from "./actions-BCRbHv1Q.js";
16
16
  import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./directory-config-CMvFiswf.js";
17
17
  import { n as registerSlackHttpHandler, r as normalizeSlackWebhookPath, t as handleSlackHttpRequest } from "./registry-D2cWOLZV.js";
18
18
  import { t as probeSlack } from "./probe-FL4sUJsH.js";
19
19
  import { t as collectSlackSecurityAuditFindings } from "./security-audit-BJzADAw3.js";
20
- import { n as resolveSlackRuntimeGroupPolicy } from "./provider-bKg1hkf5.js";
20
+ import { n as resolveSlackRuntimeGroupPolicy } from "./provider-3Y7c15_J.js";
21
21
  export { SLACK_DEFAULT_RETRY_OPTIONS, SLACK_MAX_BLOCKS, SLACK_WRITE_RETRY_OPTIONS, __resetSlackChannelTypeCacheForTest, allowListMatches, buildSlackInteractiveBlocks, buildSlackPresentationBlocks, buildSlackThreadingToolContext, clearSlackThreadParticipationCache, clearSlackWriteClientCacheForTest, collectSlackSecurityAuditFindings, compileSlackInteractiveReplies, createSlackTokenCacheKey, createSlackWebClient, createSlackWriteClient, deleteSlackMessage, downloadSlackFile, editSlackMessage, extractSlackToolSend, getSlackMemberInfo, getSlackWriteClient, handleSlackHttpRequest, hasSlackThreadParticipation, inspectSlackAccount, isSlackInteractiveRepliesEnabled, listEnabledSlackAccounts, listSlackAccountIds, listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig, listSlackEmojis, listSlackMessageActions, listSlackPins, listSlackReactions, looksLikeSlackTargetId, mergeSlackAccountConfig, normalizeAllowList, normalizeAllowListLower, normalizeSlackAllowOwnerEntry, normalizeSlackMessagingTarget, normalizeSlackSlug, normalizeSlackWebhookPath, parseSlackBlocksInput, parseSlackOptionsLine, parseSlackTarget, pinSlackMessage, probeSlack, reactSlackMessage, readSlackMessages, recordSlackThreadParticipation, registerSlackHttpHandler, removeOwnSlackReactions, removeSlackReaction, resolveDefaultSlackAccountId, resolveSlackAccount, resolveSlackAllowListMatch, resolveSlackAutoThreadId, resolveSlackChannelId, resolveSlackChannelType, resolveSlackGroupRequireMention, resolveSlackGroupToolPolicy, resolveSlackReplyToMode, resolveSlackRuntimeGroupPolicy, resolveSlackUserAllowed, resolveSlackWebClientOptions, resolveSlackWriteClientOptions, sendSlackMessage, slackPlugin, slackSetupPlugin, unpinSlackMessage, validateSlackBlocksArray };
@@ -9,7 +9,7 @@ import { n as isSlackInteractiveRepliesEnabled, t as compileSlackInteractiveRepl
9
9
  import { d as PAIRING_APPROVED_MESSAGE, m as resolveConfiguredFromRequiredCredentialStatuses, p as projectCredentialSnapshotFields, r as createSlackWebClient, u as DEFAULT_ACCOUNT_ID } from "./client-C_IaJbi5.js";
10
10
  import { r as normalizeAllowListLower } from "./allow-list-nwXs_eCP.js";
11
11
  import { t as getOptionalSlackRuntime } from "./runtime-DQxkf7k2.js";
12
- import { i as slackSecurityAdapter, n as isSlackPluginAccountConfigured, r as slackConfigAdapter, t as createSlackPluginBase } from "./shared-7Vi9j4aV.js";
12
+ import { i as slackSecurityAdapter, n as isSlackPluginAccountConfigured, r as slackConfigAdapter, t as createSlackPluginBase } from "./shared-BEabCPK3.js";
13
13
  import { i as SLACK_CHANNEL, n as createSlackSetupWizardProxy, r as slackSetupAdapter } from "./setup-core-B7pou7oe.js";
14
14
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
15
15
  import { adaptScopedAccountAccessor } from "openclaw/plugin-sdk/channel-config-helpers";
@@ -449,11 +449,15 @@ function buildSlackThreadingToolContext(params) {
449
449
  cfg: params.cfg,
450
450
  accountId: params.accountId
451
451
  }), params.context.ChatType);
452
- const effectiveReplyToMode = params.context.MessageThreadId != null ? "all" : configuredReplyToMode;
453
- const threadId = params.context.MessageThreadId ?? params.context.ReplyToId;
452
+ const messageThreadTs = normalizeSlackThreadTsCandidate(params.context.MessageThreadId);
453
+ const transportThreadTs = normalizeSlackThreadTsCandidate(params.context.TransportThreadId);
454
+ const replyToThreadTs = normalizeSlackThreadTsCandidate(params.context.ReplyToId);
455
+ const currentMessageTs = normalizeSlackThreadTsCandidate(params.context.CurrentMessageId);
456
+ const currentThreadTs = messageThreadTs ?? transportThreadTs ?? replyToThreadTs;
457
+ const effectiveReplyToMode = messageThreadTs != null || transportThreadTs != null || replyToThreadTs != null && currentMessageTs != null && replyToThreadTs !== currentMessageTs ? "all" : configuredReplyToMode;
454
458
  return {
455
459
  currentChannelId: params.context.To?.startsWith("channel:") ? params.context.To.slice(8) : normalizeOptionalString(params.context.NativeChannelId),
456
- currentThreadTs: normalizeSlackThreadTsCandidate(threadId),
460
+ currentThreadTs,
457
461
  replyToMode: effectiveReplyToMode,
458
462
  hasRepliedRef: params.hasRepliedRef
459
463
  };
@@ -464,7 +468,7 @@ const EXTENSION_SHARED_MODULE_ID = "openclaw/plugin-sdk/extension-shared";
464
468
  const TARGET_RESOLVER_RUNTIME_MODULE_ID = "openclaw/plugin-sdk/target-resolver-runtime";
465
469
  const loadExtensionSharedSdk = createLazyRuntimeModule(() => import(EXTENSION_SHARED_MODULE_ID));
466
470
  const loadTargetResolverRuntimeSdk = createLazyRuntimeModule(() => import(TARGET_RESOLVER_RUNTIME_MODULE_ID));
467
- const loadSlackSetupSurfaceModule = createLazyRuntimeModule(() => import("./setup-surface-D6LLzeRz.js"));
471
+ const loadSlackSetupSurfaceModule = createLazyRuntimeModule(() => import("./setup-surface-CJS-L7PA.js"));
468
472
  const loadSlackScopesModule = createLazyRuntimeModule(() => import("./scopes-Bvg_ZzqZ.js"));
469
473
  const loadSlackOutboundAdapterModule = createLazyRuntimeModule(() => import("./outbound-adapter-CHm6e-0Q.js").then((n) => n.t));
470
474
  async function resolveSlackHandleAction() {
@@ -502,7 +506,7 @@ async function loadSlackProbeModule() {
502
506
  return await slackProbeModulePromise;
503
507
  }
504
508
  async function loadSlackMonitorModule() {
505
- slackMonitorModulePromise ??= import("./monitor-CdVxsuHi.js").then((n) => n.t);
509
+ slackMonitorModulePromise ??= import("./monitor-Djnd8pGL.js").then((n) => n.t);
506
510
  return await slackMonitorModulePromise;
507
511
  }
508
512
  async function loadSlackDirectoryLiveModule() {
@@ -1,2 +1,2 @@
1
- import { t as slackPlugin } from "./channel-CVSopl66.js";
1
+ import { t as slackPlugin } from "./channel-DoFtZGpw.js";
2
2
  export { slackPlugin };
@@ -4,7 +4,7 @@ import { t as SlackChannelConfigSchema } from "./config-schema-CNRousxw.js";
4
4
  import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter } from "openclaw/plugin-sdk/channel-config-helpers";
5
5
  import { formatAllowFromLowercase } from "openclaw/plugin-sdk/allow-from";
6
6
  //#region extensions/slack/src/channel.setup.ts
7
- const slackSetupWizard = createSlackSetupWizardProxy(async () => ({ slackSetupWizard: (await import("./setup-surface-D6LLzeRz.js")).slackSetupWizard }));
7
+ const slackSetupWizard = createSlackSetupWizardProxy(async () => ({ slackSetupWizard: (await import("./setup-surface-CJS-L7PA.js")).slackSetupWizard }));
8
8
  const slackSetupConfigAdapter = createScopedChannelConfigAdapter({
9
9
  sectionKey: SLACK_CHANNEL,
10
10
  listAccountIds: listSlackAccountIds,
@@ -1,3 +1,3 @@
1
- import { t as prepareSlackMessage } from "./prepare-DSRUr44d.js";
1
+ import { t as prepareSlackMessage } from "./prepare-Or_6_XXl.js";
2
2
  import { t as createInboundSlackTestContext } from "./prepare.test-helpers-CU1qB54Q.js";
3
3
  export { createInboundSlackTestContext, prepareSlackMessage };
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
2
2
  import { D as buildSlackSlashCommandMatcher, p as isSlackChannelAllowedByPolicy } from "./room-context-Cd8jFpS-.js";
3
- import { t as monitorSlackProvider } from "./provider-bKg1hkf5.js";
3
+ import { t as monitorSlackProvider } from "./provider-3Y7c15_J.js";
4
4
  import { o as resolveSlackThreadTs } from "./replies-Fg1T3ZzU.js";
5
5
  //#region extensions/slack/src/monitor.ts
6
6
  var monitor_exports = /* @__PURE__ */ __exportAll({
@@ -6,8 +6,8 @@ import { a as recordSlackThreadParticipation, s as normalizeSlackOutboundText, t
6
6
  import { b as buildSlackEditTextPayload, f as removeSlackReaction, l as reactSlackMessage, r as editSlackMessage, t as deleteSlackMessage } from "./actions-BCRbHv1Q.js";
7
7
  import { t as formatSlackError } from "./errors-C_sW0Zgl.js";
8
8
  import { T as updateLastRoute, a as recordInboundSession, w as resolveStorePath } from "./room-context-Cd8jFpS-.js";
9
- import { r as escapeSlackMrkdwn } from "./provider-bKg1hkf5.js";
10
- import { n as resolveSlackThreadTargets, t as prepareSlackMessage } from "./prepare-DSRUr44d.js";
9
+ import { r as escapeSlackMrkdwn } from "./provider-3Y7c15_J.js";
10
+ import { n as resolveSlackThreadTargets, t as prepareSlackMessage } from "./prepare-Or_6_XXl.js";
11
11
  import { a as resolveDeliveredSlackReplyThreadTs, i as readSlackReplyBlocks, n as deliverReplies, o as resolveSlackThreadTs, t as createSlackReplyDeliveryPlan } from "./replies-Fg1T3ZzU.js";
12
12
  import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
13
13
  import { resolveInboundLastRouteSessionKey } from "openclaw/plugin-sdk/routing";
@@ -627,7 +627,7 @@ async function dispatchPreparedSlackMessage(prepared) {
627
627
  channel: "slack",
628
628
  to: `user:${message.user}`,
629
629
  accountId: route.accountId,
630
- threadId: prepared.ctxPayload.MessageThreadId
630
+ threadId: prepared.ctxPayload.MessageThreadId ?? prepared.ctxPayload.TransportThreadId
631
631
  },
632
632
  ctx: prepared.ctxPayload
633
633
  });
@@ -460,17 +460,18 @@ function resolveSlackRoutingContext(params) {
460
460
  const isThreadReply = threadContext.isThreadReply;
461
461
  const autoThreadId = !isThreadReply && replyToMode === "all" && threadContext.messageTs ? threadContext.messageTs : void 0;
462
462
  const seedCandidateThreadId = threadContext.incomingThreadTs ?? threadContext.messageTs;
463
- const routedThreadId = (isDirectMessage ? isThreadReply ? threadTs : void 0 : isRoomish ? isThreadReply && threadTs ? threadTs : void 0 : isThreadReply ? threadTs : autoThreadId) ?? (isRoomish ? !isThreadReply && isRoom && seedTopLevelRoomThread && replyToMode !== "off" && seedCandidateThreadId ? seedCandidateThreadId : void 0 : void 0);
463
+ const routedThreadId = (isDirectMessage ? void 0 : isRoomish ? isThreadReply && threadTs ? threadTs : void 0 : isThreadReply ? threadTs : autoThreadId) ?? (isRoomish ? !isThreadReply && isRoom && seedTopLevelRoomThread && replyToMode !== "off" && seedCandidateThreadId ? seedCandidateThreadId : void 0 : void 0);
464
464
  const baseConversationId = resolveSlackBaseConversationId({
465
465
  message,
466
466
  isDirectMessage
467
467
  });
468
- const boundThreadRoute = routedThreadId ? resolveRuntimeConversationBindingRoute({
468
+ const runtimeBindingThreadId = routedThreadId ?? (isDirectMessage && isThreadReply ? threadTs : void 0);
469
+ const boundThreadRoute = runtimeBindingThreadId ? resolveRuntimeConversationBindingRoute({
469
470
  route,
470
471
  conversation: {
471
472
  channel: "slack",
472
473
  accountId: account.accountId,
473
- conversationId: routedThreadId,
474
+ conversationId: runtimeBindingThreadId,
474
475
  parentConversationId: baseConversationId
475
476
  }
476
477
  }) : null;
@@ -686,7 +687,7 @@ async function resolveSlackThreadContextData(params) {
686
687
  logVerbose("slack: retained current-bot thread starter as assistant root context");
687
688
  }
688
689
  const threadInitialHistoryLimit = params.account.config?.thread?.initialHistoryLimit ?? 20;
689
- if (threadInitialHistoryLimit > 0 && !threadSessionPreviousTimestamp) {
690
+ if (threadInitialHistoryLimit > 0 && (!threadSessionPreviousTimestamp || params.forceInitialHistory)) {
690
691
  const currentBotRootTs = starter?.ts ?? params.threadTs;
691
692
  const threadHistoryWithBotRoot = ensureSlackThreadHistoryHasBotRoot({
692
693
  history: await resolveSlackThreadHistory({
@@ -1150,6 +1151,7 @@ async function prepareSlackMessage(params) {
1150
1151
  return null;
1151
1152
  }
1152
1153
  }
1154
+ const directThreadRoutedToDmSession = isDirectMessage && isThreadReply && threadTs && runtimeBinding?.conversation.conversationId !== threadTs;
1153
1155
  let implicitMentionKinds = [];
1154
1156
  if (!isDirectMessage && ctx.botUserId && message.thread_ts && !ctx.threadRequireExplicitMention && !wasMentioned) {
1155
1157
  const replyToBotKinds = implicitMentionKindWhen("reply_to_bot", message.parent_user_id === ctx.botUserId);
@@ -1446,6 +1448,7 @@ async function prepareSlackMessage(params) {
1446
1448
  roomLabel,
1447
1449
  storePath,
1448
1450
  sessionKey,
1451
+ forceInitialHistory: Boolean(directThreadRoutedToDmSession),
1449
1452
  allowFromLower: threadContextAllowFromLower,
1450
1453
  allowNameMatching: ctx.allowNameMatching,
1451
1454
  contextVisibilityMode,
@@ -1458,6 +1461,7 @@ async function prepareSlackMessage(params) {
1458
1461
  limit: ctx.historyLimit
1459
1462
  }) : dmHistoryContext.inboundHistory;
1460
1463
  const commandBody = textForCommandDetection.trim();
1464
+ const supplementalThreadHistoryBody = directThreadRoutedToDmSession && !threadHistoryBody ? threadStarterBody : threadHistoryBody;
1461
1465
  const ctxPayload = buildChannelTurnContext({
1462
1466
  channel: "slack",
1463
1467
  provider: "slack",
@@ -1476,7 +1480,7 @@ async function prepareSlackMessage(params) {
1476
1480
  id: message.channel,
1477
1481
  label: envelopeFrom,
1478
1482
  spaceId: ctx.teamId || void 0,
1479
- threadId: threadContext.messageThreadId,
1483
+ threadId: directThreadRoutedToDmSession ? void 0 : threadContext.messageThreadId,
1480
1484
  nativeChannelId: message.channel,
1481
1485
  routePeer: {
1482
1486
  kind: chatType,
@@ -1493,7 +1497,7 @@ async function prepareSlackMessage(params) {
1493
1497
  to: slackTo,
1494
1498
  originatingTo: slackTo,
1495
1499
  replyToId: threadContext.replyToId,
1496
- messageThreadId: threadContext.messageThreadId,
1500
+ messageThreadId: directThreadRoutedToDmSession ? void 0 : threadContext.messageThreadId,
1497
1501
  nativeChannelId: message.channel
1498
1502
  },
1499
1503
  message: {
@@ -1523,16 +1527,17 @@ async function prepareSlackMessage(params) {
1523
1527
  media: toInboundMediaFacts(effectiveMedia),
1524
1528
  supplemental: {
1525
1529
  thread: {
1526
- starterBody: !threadSessionPreviousTimestamp ? threadStarterBody : void 0,
1527
- historyBody: threadHistoryBody,
1528
- label: threadLabel
1530
+ starterBody: !directThreadRoutedToDmSession && !threadSessionPreviousTimestamp ? threadStarterBody : void 0,
1531
+ historyBody: supplementalThreadHistoryBody,
1532
+ label: directThreadRoutedToDmSession ? void 0 : threadLabel
1529
1533
  },
1530
1534
  groupSystemPrompt
1531
1535
  },
1532
1536
  extra: {
1533
1537
  GroupSubject: isRoomish ? roomLabel : void 0,
1534
1538
  UntrustedContext: untrustedChannelMetadata ? [untrustedChannelMetadata] : void 0,
1535
- IsFirstThreadTurn: isThreadReply && threadTs && !threadSessionPreviousTimestamp ? true : void 0,
1539
+ TransportThreadId: directThreadRoutedToDmSession ? threadContext.messageThreadId : void 0,
1540
+ IsFirstThreadTurn: isThreadReply && threadTs && !directThreadRoutedToDmSession && !threadSessionPreviousTimestamp ? true : void 0,
1536
1541
  ...buildSlackMentionContextPayload({
1537
1542
  isRoomish,
1538
1543
  effectiveWasMentioned,
@@ -1418,7 +1418,10 @@ function resolveAssistantMessageChangedInbound(params) {
1418
1418
  message,
1419
1419
  botUserId: params.ctx.botUserId
1420
1420
  });
1421
- if (!senderId) return;
1421
+ if (!senderId) {
1422
+ if (shouldLogVerbose()) logVerbose(`slack: assistant_app_thread message_changed in DM channel=${changed.channel} dropped: no sender resolved from metadata`);
1423
+ return;
1424
+ }
1422
1425
  return {
1423
1426
  type: "message",
1424
1427
  channel: changed.channel ?? params.event.channel,
@@ -1761,7 +1764,7 @@ function createSlackThreadTsResolver(params) {
1761
1764
  //#region extensions/slack/src/monitor/message-handler.ts
1762
1765
  let slackMessagePipelinePromise;
1763
1766
  function loadSlackMessagePipeline() {
1764
- slackMessagePipelinePromise ??= import("./pipeline.runtime-CakcaQh9.js");
1767
+ slackMessagePipelinePromise ??= import("./pipeline.runtime-DJcwOZky.js");
1765
1768
  return slackMessagePipelinePromise;
1766
1769
  }
1767
1770
  const APP_MENTION_RETRY_TTL_MS = 6e4;
@@ -6,9 +6,9 @@ import { a as listSlackEmojis, c as pinSlackMessage, d as removeOwnSlackReaction
6
6
  import { t as probeSlack } from "./probe-FL4sUJsH.js";
7
7
  import { t as resolveSlackChannelAllowlist } from "./resolve-channels-B_eKaOkE.js";
8
8
  import { t as resolveSlackUserAllowlist } from "./resolve-users-BzBAJwvq.js";
9
- import { t as monitorSlackProvider } from "./provider-bKg1hkf5.js";
9
+ import { t as monitorSlackProvider } from "./provider-3Y7c15_J.js";
10
10
  import { t as registerSlackPluginHttpRoutes } from "./plugin-routes-CRnfsTTX.js";
11
11
  import { n as slackActionRuntime, t as handleSlackAction } from "./action-runtime-p39JLqwf.js";
12
12
  import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./directory-live-CZPzpQZF.js";
13
- import "./monitor-CdVxsuHi.js";
13
+ import "./monitor-Djnd8pGL.js";
14
14
  export { deleteSlackMessage, editSlackMessage, getSlackMemberInfo, handleSlackAction, listEnabledSlackAccounts, listSlackAccountIds, listSlackDirectoryGroupsLive, listSlackDirectoryPeersLive, listSlackEmojis, listSlackPins, listSlackReactions, monitorSlackProvider, pinSlackMessage, probeSlack, reactSlackMessage, readSlackMessages, registerSlackPluginHttpRoutes, removeOwnSlackReactions, removeSlackReaction, resolveDefaultSlackAccountId, resolveSlackAccount, resolveSlackAppToken, resolveSlackBotToken, resolveSlackChannelAllowlist, resolveSlackGroupRequireMention, resolveSlackGroupToolPolicy, resolveSlackUserAllowlist, sendMessageSlack, sendSlackMessage, setSlackRuntime, slackActionRuntime, unpinSlackMessage };
@@ -1,2 +1,2 @@
1
- import { t as slackSetupPlugin } from "./channel.setup-DknBgufI.js";
1
+ import { t as slackSetupPlugin } from "./channel.setup-BDL4qn9U.js";
2
2
  export { slackSetupPlugin };
@@ -1,5 +1,5 @@
1
1
  import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, o as resolveSlackAccountAllowFrom } from "./accounts-yk5K3wQU.js";
2
- import "./shared-7Vi9j4aV.js";
2
+ import "./shared-BEabCPK3.js";
3
3
  import { i as SLACK_CHANNEL, t as createSlackSetupWizardBase } from "./setup-core-B7pou7oe.js";
4
4
  import { t as resolveSlackChannelAllowlist } from "./resolve-channels-B_eKaOkE.js";
5
5
  import { t as resolveSlackUserAllowlist } from "./resolve-users-BzBAJwvq.js";
@@ -171,7 +171,11 @@ function createSlackPluginBase(params) {
171
171
  "- Prefer Slack buttons/selects for 2-5 discrete choices or parameter picks instead of asking the user to type one.",
172
172
  "- Slack interactive replies: use `[[slack_buttons: Label:value, Other:other]]` to add action buttons that route clicks back as Slack interaction system events.",
173
173
  "- Slack selects: use `[[slack_select: Placeholder | Label:value, Other:other]]` to add a static select menu that routes the chosen value back as a Slack interaction system event."
174
- ] : ["- Slack interactive replies are disabled. If needed, ask to set `channels.slack.capabilities.interactiveReplies=true` (or the same under `channels.slack.accounts.<account>.capabilities`)."]).concat(["- Slack plain text sends: write standard Markdown; OpenClaw converts it to Slack mrkdwn, including `**bold**`, headings, lists, and `[label](url)` links.", "- Slack Block Kit or presentation text fields are sent as Slack mrkdwn directly; use `*bold*`, `_italic_`, `~strike~`, `<url|label>` links, and avoid Markdown headings or pipe tables there."])
174
+ ] : ["- Slack interactive replies are disabled. If needed, ask to set `channels.slack.capabilities.interactiveReplies=true` (or the same under `channels.slack.accounts.<account>.capabilities`)."]).concat([
175
+ "- Slack plain text sends: write standard Markdown; OpenClaw converts it to Slack mrkdwn, including `**bold**`, headings, lists, and `[label](url)` links.",
176
+ "- When mentioning Slack users, use the stable `<@USER_ID>` token from Slack context instead of plain `@name` text so Slack notifies and links the user.",
177
+ "- Slack Block Kit or presentation text fields are sent as Slack mrkdwn directly; use `*bold*`, `_italic_`, `~strike~`, `<url|label>` links, and avoid Markdown headings or pipe tables there."
178
+ ])
175
179
  },
176
180
  streaming: { blockStreamingCoalesceDefaults: {
177
181
  minChars: 1500,
package/dist/test-api.js CHANGED
@@ -1,7 +1,7 @@
1
- import { a as createSlackActions, t as slackPlugin } from "./channel-CVSopl66.js";
1
+ import { a as createSlackActions, t as slackPlugin } from "./channel-DoFtZGpw.js";
2
2
  import { n as setSlackRuntime } from "./runtime-DQxkf7k2.js";
3
3
  import { t as sendMessageSlack } from "./send-CxXFbqN1.js";
4
- import { t as prepareSlackMessage } from "./prepare-DSRUr44d.js";
4
+ import { t as prepareSlackMessage } from "./prepare-Or_6_XXl.js";
5
5
  import { t as createInboundSlackTestContext } from "./prepare.test-helpers-CU1qB54Q.js";
6
6
  import { t as createSlackOutboundPayloadHarness } from "./outbound-payload.test-harness-C0CW7_CE.js";
7
7
  import { n as slackOutbound } from "./outbound-adapter-CHm6e-0Q.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/slack",
3
- "version": "2026.5.16-beta.2",
3
+ "version": "2026.5.16-beta.3",
4
4
  "description": "OpenClaw Slack channel plugin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,7 +20,7 @@
20
20
  "openclaw": "workspace:*"
21
21
  },
22
22
  "peerDependencies": {
23
- "openclaw": ">=2026.5.16-beta.2"
23
+ "openclaw": ">=2026.5.16-beta.3"
24
24
  },
25
25
  "peerDependenciesMeta": {
26
26
  "openclaw": {
@@ -65,10 +65,10 @@
65
65
  "allowInvalidConfigRecovery": true
66
66
  },
67
67
  "compat": {
68
- "pluginApi": ">=2026.5.16-beta.2"
68
+ "pluginApi": ">=2026.5.16-beta.3"
69
69
  },
70
70
  "build": {
71
- "openclawVersion": "2026.5.16-beta.2",
71
+ "openclawVersion": "2026.5.16-beta.3",
72
72
  "bundledDist": false
73
73
  },
74
74
  "release": {