@openclaw/slack 2026.5.31-beta.4 → 2026.6.1-beta.2

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.
Files changed (35) hide show
  1. package/dist/{action-runtime-Cg2tZbNu.js → action-runtime-CgrHdqkC.js} +4 -4
  2. package/dist/action-runtime.runtime-D05xDf1s.js +2 -0
  3. package/dist/{actions-CkiDNtJN.js → actions-YkhEE5f1.js} +3 -3
  4. package/dist/{actions.runtime-BCrYXk_p.js → actions.runtime-DyVzqzLc.js} +1 -1
  5. package/dist/api.js +8 -8
  6. package/dist/{approval-handler.runtime-D89odl0s.js → approval-handler.runtime-KWkR1mEG.js} +2 -2
  7. package/dist/{channel-C3A408fP.js → channel-C15EZbTc.js} +48 -132
  8. package/dist/channel-plugin-api.js +1 -1
  9. package/dist/{channel.setup-Bwe4Z6kB.js → channel.setup-DrCTObMp.js} +1 -1
  10. package/dist/{client-qvqS9fQM.js → client-Cn2WwpcA.js} +11 -2
  11. package/dist/{directory-live-WZwhRYe2.js → directory-live-C1acgXKJ.js} +1 -1
  12. package/dist/{monitor-NFID7817.js → monitor-C1P_IgPU.js} +3 -3
  13. package/dist/{outbound-adapter-C0WSWc70.js → outbound-adapter-DvXnHfDP.js} +2 -2
  14. package/dist/{pipeline.runtime-DikPOwwv.js → pipeline.runtime-DDELeqeP.js} +8 -8
  15. package/dist/{policy-Bb46UkJW.js → policy-DT3mRh58.js} +1 -1
  16. package/dist/{probe-DczaQTdi.js → probe-BTKzLT2u.js} +1 -1
  17. package/dist/{provider-B4QaoPTL.js → provider-Cxqi3uh_.js} +7 -7
  18. package/dist/{replies-BPnv9QT6.js → replies-FEOdgSlE.js} +2 -2
  19. package/dist/{resolve-channels-DIxJRl0F.js → resolve-channels-DX2GSx9c.js} +1 -1
  20. package/dist/{resolve-users-B3vczJHE.js → resolve-users-DOULgUwy.js} +1 -1
  21. package/dist/{runtime-api-BpGQDSTg.js → runtime-api-DudG6lbf.js} +1 -1
  22. package/dist/runtime-api.js +10 -10
  23. package/dist/{scopes-Q1VjNpWb.js → scopes-CErQL0td.js} +1 -1
  24. package/dist/{send-DzphzfbK.js → send-rekB-Xjp.js} +3 -3
  25. package/dist/send.runtime-DGyqPLWj.js +2 -0
  26. package/dist/setup-plugin-api.js +1 -1
  27. package/dist/{setup-surface-CMNvy84L.js → setup-surface-BB_ivsoR.js} +3 -3
  28. package/dist/{shared-VMk8NGYC.js → shared-Bviszgb6.js} +2 -8
  29. package/dist/{slash-dispatch.runtime-Dr5g7nrJ.js → slash-dispatch.runtime-CoFAysiw.js} +1 -1
  30. package/dist/{thread-ts-CzxxhSE5.js → thread-ts-Cffag8e2.js} +155 -83
  31. package/npm-shrinkwrap.json +3 -3
  32. package/openclaw.plugin.json +13 -13
  33. package/package.json +4 -4
  34. package/dist/action-runtime.runtime-Cy2yYwZP.js +0 -2
  35. package/dist/send.runtime-2BUc6y7a.js +0 -2
@@ -1,8 +1,8 @@
1
1
  import { i as resolveSlackChannelId, r as parseSlackTarget } from "./target-parsing-C7eeWg7M.js";
2
2
  import "./targets-nUqxHGgg.js";
3
- import { a as parseSlackBlocksInput } from "./thread-ts-CzxxhSE5.js";
4
- import { a as readPositiveIntegerParam, c as withNormalizedTimestamp, n as imageResultFromFile, o as readReactionParams, r as jsonResult, s as readStringParam, t as createActionGate } from "./runtime-api-BpGQDSTg.js";
5
- import { n as resolveSlackChannelConfig, t as isSlackChannelAllowedByPolicy } from "./policy-Bb46UkJW.js";
3
+ import { a as parseSlackBlocksInput } from "./thread-ts-Cffag8e2.js";
4
+ import { a as readPositiveIntegerParam, c as withNormalizedTimestamp, n as imageResultFromFile, o as readReactionParams, r as jsonResult, s as readStringParam, t as createActionGate } from "./runtime-api-DudG6lbf.js";
5
+ import { n as resolveSlackChannelConfig, t as isSlackChannelAllowedByPolicy } from "./policy-DT3mRh58.js";
6
6
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { isSingleUseReplyToMode } from "openclaw/plugin-sdk/reply-reference";
8
8
  import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
@@ -30,7 +30,7 @@ function sameSlackChannelTarget(targetChannel, currentChannelId) {
30
30
  let slackActionsRuntimePromise;
31
31
  let slackAccountsRuntimePromise;
32
32
  function loadSlackActionsRuntime() {
33
- slackActionsRuntimePromise ??= import("./actions.runtime-BCrYXk_p.js");
33
+ slackActionsRuntimePromise ??= import("./actions.runtime-DyVzqzLc.js");
34
34
  return slackActionsRuntimePromise;
35
35
  }
36
36
  function loadSlackAccountsRuntime() {
@@ -0,0 +1,2 @@
1
+ import { t as handleSlackAction } from "./action-runtime-CgrHdqkC.js";
2
+ export { handleSlackAction };
@@ -1,8 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
2
  import { a as resolveSlackAccount, d as resolveSlackBotToken } from "./accounts-f6Xcv9Vi.js";
3
- import { b as truncateSlackText, o as validateSlackBlocksArray, s as SLACK_TEXT_LIMIT } from "./thread-ts-CzxxhSE5.js";
4
- import { a as getSlackWriteClient, r as createSlackWebClient } from "./client-qvqS9fQM.js";
5
- import { c as buildSlackBlocksFallbackText, t as sendMessageSlack } from "./send-DzphzfbK.js";
3
+ import { b as truncateSlackText, o as validateSlackBlocksArray, s as SLACK_TEXT_LIMIT } from "./thread-ts-Cffag8e2.js";
4
+ import { a as getSlackWriteClient, r as createSlackWebClient } from "./client-Cn2WwpcA.js";
5
+ import { c as buildSlackBlocksFallbackText, t as sendMessageSlack } from "./send-rekB-Xjp.js";
6
6
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
8
8
  import { logVerbose, logVerbose as logVerbose$1 } from "openclaw/plugin-sdk/runtime-env";
@@ -1,2 +1,2 @@
1
- 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-CkiDNtJN.js";
1
+ 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-YkhEE5f1.js";
2
2
  export { deleteSlackMessage, downloadSlackFile, editSlackMessage, getSlackMemberInfo, listSlackEmojis, listSlackPins, listSlackReactions, pinSlackMessage, reactSlackMessage, readSlackMessages, removeOwnSlackReactions, removeSlackReaction, sendSlackMessage, unpinSlackMessage };
package/dist/api.js CHANGED
@@ -3,16 +3,16 @@ import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, l as resol
3
3
  import { t as inspectSlackAccount } from "./account-inspect-CdGk6R7l.js";
4
4
  import { i as resolveSlackChannelId, n as normalizeSlackMessagingTarget, r as parseSlackTarget, t as looksLikeSlackTargetId } from "./target-parsing-C7eeWg7M.js";
5
5
  import "./targets-nUqxHGgg.js";
6
- import { a as resolveSlackAutoThreadId, i as resolveSlackChannelType, n as buildSlackThreadingToolContext, r as resetSlackChannelTypeCacheForTest, t as slackPlugin } from "./channel-C3A408fP.js";
7
- import { _ as buildSlackInteractiveBlocks, a as parseSlackBlocksInput, c as resolveSlackGroupRequireMention, d as normalizeAllowList, f as normalizeAllowListLower, g as resolveSlackUserAllowed, h as resolveSlackAllowListMatch, i as SLACK_MAX_BLOCKS, l as resolveSlackGroupToolPolicy, m as normalizeSlackSlug, o as validateSlackBlocksArray, p as normalizeSlackAllowOwnerEntry, u as allowListMatches, v as buildSlackPresentationBlocks } from "./thread-ts-CzxxhSE5.js";
6
+ import { a as resolveSlackAutoThreadId, i as resolveSlackChannelType, n as buildSlackThreadingToolContext, r as resetSlackChannelTypeCacheForTest, t as slackPlugin } from "./channel-C15EZbTc.js";
7
+ import { _ as buildSlackInteractiveBlocks, a as parseSlackBlocksInput, c as resolveSlackGroupRequireMention, d as normalizeAllowList, f as normalizeAllowListLower, g as resolveSlackUserAllowed, h as resolveSlackAllowListMatch, i as SLACK_MAX_BLOCKS, l as resolveSlackGroupToolPolicy, m as normalizeSlackSlug, o as validateSlackBlocksArray, p as normalizeSlackAllowOwnerEntry, u as allowListMatches, v as buildSlackPresentationBlocks } from "./thread-ts-Cffag8e2.js";
8
+ 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-Cn2WwpcA.js";
8
9
  import { n as extractSlackToolSend, r as listSlackMessageActions } from "./message-tool-api-B9M0zzlQ.js";
9
10
  import { n as isSlackInteractiveRepliesEnabled, r as parseSlackOptionsLine, t as compileSlackInteractiveReplies } from "./interactive-replies-DrBq4Mld.js";
10
- 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-qvqS9fQM.js";
11
- import { t as slackSetupPlugin } from "./channel.setup-Bwe4Z6kB.js";
12
- import { a as recordSlackThreadParticipation, n as clearSlackThreadParticipationCache, r as hasSlackThreadParticipation } from "./send-DzphzfbK.js";
13
- 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-CkiDNtJN.js";
11
+ import { t as slackSetupPlugin } from "./channel.setup-DrCTObMp.js";
12
+ import { a as recordSlackThreadParticipation, n as clearSlackThreadParticipationCache, r as hasSlackThreadParticipation } from "./send-rekB-Xjp.js";
13
+ 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-YkhEE5f1.js";
14
14
  import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./directory-config-8UPAEyNg.js";
15
- import { t as probeSlack } from "./probe-DczaQTdi.js";
15
+ import { t as probeSlack } from "./probe-BTKzLT2u.js";
16
16
  import { t as collectSlackSecurityAuditFindings } from "./security-audit-CikQhBUY.js";
17
- import { n as resolveSlackRuntimeGroupPolicy } from "./provider-B4QaoPTL.js";
17
+ import { n as resolveSlackRuntimeGroupPolicy } from "./provider-Cxqi3uh_.js";
18
18
  export { SLACK_DEFAULT_RETRY_OPTIONS, SLACK_MAX_BLOCKS, SLACK_WRITE_RETRY_OPTIONS, resetSlackChannelTypeCacheForTest as __resetSlackChannelTypeCacheForTest, 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 };
@@ -1,5 +1,5 @@
1
- import { C as isSlackAnyNativeApprovalClientEnabled, T as shouldHandleSlackNativeApprovalRequest, b as truncateSlackText, j as normalizeSlackApproverId, r as resolveSlackReplyBlocks, w as resolveSlackApprovalKind } from "./thread-ts-CzxxhSE5.js";
2
- import { t as sendMessageSlack } from "./send-DzphzfbK.js";
1
+ import { O as resolveSlackApprovalKind, b as truncateSlackText, j as shouldHandleSlackNativeApprovalRequest, r as resolveSlackReplyBlocks, w as isSlackAnyNativeApprovalClientEnabled, z as normalizeSlackApproverId } from "./thread-ts-Cffag8e2.js";
2
+ import { t as sendMessageSlack } from "./send-rekB-Xjp.js";
3
3
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { buildChannelApprovalNativeTargetKey } from "openclaw/plugin-sdk/approval-native-runtime";
5
5
  import { buildApprovalPresentationFromActionDescriptors } from "openclaw/plugin-sdk/approval-reply-runtime";
@@ -1,12 +1,12 @@
1
1
  import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, l as resolveSlackReplyToMode, n as listSlackAccountIds, o as resolveSlackAccountAllowFrom } from "./accounts-f6Xcv9Vi.js";
2
2
  import { i as resolveSlackChannelId, n as normalizeSlackMessagingTarget, r as parseSlackTarget, t as looksLikeSlackTargetId } from "./target-parsing-C7eeWg7M.js";
3
3
  import "./targets-nUqxHGgg.js";
4
- import { A as isSlackExecApprovalClientEnabled, C as isSlackAnyNativeApprovalClientEnabled, D as isSlackApprovalAuthorizedSender, E as getSlackApprovalApprovers, M as resolveSlackExecApprovalTarget, N as shouldSuppressLocalSlackExecApprovalPrompt, O as getSlackExecApprovalApprovers, T as shouldHandleSlackNativeApprovalRequest, _ as buildSlackInteractiveBlocks, c as resolveSlackGroupRequireMention, f as normalizeAllowListLower, k as isSlackExecApprovalAuthorizedSender, l as resolveSlackGroupToolPolicy, n as resolveSlackThreadTsValue, r as resolveSlackReplyBlocks, s as SLACK_TEXT_LIMIT, t as normalizeSlackThreadTsCandidate, v as buildSlackPresentationBlocks, w as resolveSlackApprovalKind, y as resolveSlackInteractiveBlockOffsets } from "./thread-ts-CzxxhSE5.js";
4
+ import { A as resolveTurnSourceSlackOriginTarget, B as resolveSlackExecApprovalTarget, C as hasSlackPluginApprovers, D as resolveSessionSlackOriginTarget, E as normalizeSlackOriginTarget, F as isSlackApprovalAuthorizedSender, I as getSlackExecApprovalApprovers, L as isSlackExecApprovalAuthorizedSender, M as shouldHandleSlackPluginViaForwardingSession, N as slackTargetsMatch, O as resolveSlackApprovalKind, P as getSlackApprovalApprovers, R as isSlackExecApprovalClientEnabled, T as normalizeSlackForwardTarget, V as shouldSuppressLocalSlackExecApprovalPrompt, _ as buildSlackInteractiveBlocks, c as resolveSlackGroupRequireMention, f as normalizeAllowListLower, j as shouldHandleSlackNativeApprovalRequest, k as resolveSlackFallbackOriginTarget, l as resolveSlackGroupToolPolicy, n as resolveSlackThreadTsValue, r as resolveSlackReplyBlocks, s as SLACK_TEXT_LIMIT, t as normalizeSlackThreadTsCandidate, v as buildSlackPresentationBlocks, w as isSlackAnyNativeApprovalClientEnabled, y as resolveSlackInteractiveBlockOffsets } from "./thread-ts-Cffag8e2.js";
5
+ import { d as PAIRING_APPROVED_MESSAGE, h as isSlackPluginAccountConfigured, m as resolveConfiguredFromRequiredCredentialStatuses, p as projectCredentialSnapshotFields, r as createSlackWebClient, u as DEFAULT_ACCOUNT_ID } from "./client-Cn2WwpcA.js";
5
6
  import { n as extractSlackToolSend, t as describeSlackMessageTool } from "./message-tool-api-B9M0zzlQ.js";
6
7
  import { n as isSlackInteractiveRepliesEnabled, t as compileSlackInteractiveReplies } from "./interactive-replies-DrBq4Mld.js";
7
- import { d as PAIRING_APPROVED_MESSAGE, m as resolveConfiguredFromRequiredCredentialStatuses, p as projectCredentialSnapshotFields, r as createSlackWebClient, u as DEFAULT_ACCOUNT_ID } from "./client-qvqS9fQM.js";
8
8
  import { t as getOptionalSlackRuntime } from "./runtime-BOk7xkOl.js";
9
- import { i as slackSecurityAdapter, n as isSlackPluginAccountConfigured, r as slackConfigAdapter, t as createSlackPluginBase } from "./shared-VMk8NGYC.js";
9
+ import { n as slackConfigAdapter, r as slackSecurityAdapter, t as createSlackPluginBase } from "./shared-Bviszgb6.js";
10
10
  import { i as SLACK_CHANNEL, n as createSlackSetupWizardProxy, r as slackSetupAdapter } from "./setup-core-POfI_bgP.js";
11
11
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
12
12
  import { adaptScopedAccountAccessor } from "openclaw/plugin-sdk/channel-config-helpers";
@@ -22,8 +22,7 @@ import { createComputedAccountStatusAdapter, createDefaultChannelRuntimeState }
22
22
  import { isSingleUseReplyToMode } from "openclaw/plugin-sdk/reply-reference";
23
23
  import { createApproverRestrictedNativeApprovalCapability, splitChannelApprovalCapability } from "openclaw/plugin-sdk/approval-delivery-runtime";
24
24
  import { createLazyChannelApprovalNativeRuntimeAdapter } from "openclaw/plugin-sdk/approval-handler-adapter-runtime";
25
- import { createChannelNativeOriginTargetResolver, resolveApprovalRequestSessionConversation } from "openclaw/plugin-sdk/approval-native-runtime";
26
- import { channelRouteTargetsMatchExact, stringifyRouteThreadId } from "openclaw/plugin-sdk/channel-route";
25
+ import { createChannelNativeOriginTargetResolver, createNativeApprovalForwardingFallbackSuppressor } from "openclaw/plugin-sdk/approval-native-runtime";
27
26
  import { readBooleanParam } from "openclaw/plugin-sdk/boolean-param";
28
27
  import { normalizeInteractiveReply, normalizeMessagePresentation } from "openclaw/plugin-sdk/interactive-runtime";
29
28
  import { readPositiveIntegerParam, readStringParam } from "openclaw/plugin-sdk/param-readers";
@@ -44,88 +43,6 @@ function resolveSlackAutoThreadId(params) {
44
43
  }
45
44
  //#endregion
46
45
  //#region extensions/slack/src/approval-native.ts
47
- const SLACK_DM_CHANNEL_ID_RE = /^D[A-Z0-9]{8,}$/i;
48
- const SLACK_USER_ID_RE = /^[UW][A-Z0-9]{8,}$/i;
49
- function extractSlackSessionKind(sessionKey) {
50
- if (!sessionKey) return null;
51
- const kind = normalizeLowercaseStringOrEmpty(sessionKey.match(/slack:(direct|channel|group):/i)?.[1]);
52
- return kind ? kind : null;
53
- }
54
- function normalizeComparableTarget(value) {
55
- return normalizeLowercaseStringOrEmpty(value);
56
- }
57
- function normalizeSlackThreadMatchKey(threadId) {
58
- return threadId?.trim() ?? "";
59
- }
60
- function resolveSlackTurnSourceDefaultKind(params) {
61
- if (SLACK_DM_CHANNEL_ID_RE.test(params.turnSourceTo)) return "channel";
62
- return params.sessionKind === "direct" ? "user" : "channel";
63
- }
64
- function resolveTurnSourceSlackOriginTarget(request) {
65
- const turnSourceChannel = normalizeLowercaseStringOrEmpty(request.request.turnSourceChannel);
66
- const turnSourceTo = normalizeOptionalString(request.request.turnSourceTo) ?? "";
67
- if (turnSourceChannel !== "slack" || !turnSourceTo) return null;
68
- const parsed = parseSlackTarget(turnSourceTo, { defaultKind: resolveSlackTurnSourceDefaultKind({
69
- turnSourceTo,
70
- sessionKind: extractSlackSessionKind(request.request.sessionKey ?? void 0)
71
- }) });
72
- if (!parsed) return null;
73
- const threadId = stringifyRouteThreadId(request.request.turnSourceThreadId);
74
- return {
75
- to: `${parsed.kind}:${parsed.id}`,
76
- threadId
77
- };
78
- }
79
- function resolveSessionSlackOriginTarget(sessionTarget) {
80
- return {
81
- to: sessionTarget.to,
82
- threadId: stringifyRouteThreadId(sessionTarget.threadId)
83
- };
84
- }
85
- function resolveSlackFallbackOriginTarget(request) {
86
- const sessionTarget = resolveApprovalRequestSessionConversation({
87
- request,
88
- channel: "slack",
89
- bundledFallback: false
90
- });
91
- if (!sessionTarget) return null;
92
- const parsed = parseSlackTarget(sessionTarget.id.toUpperCase(), { defaultKind: "channel" });
93
- if (!parsed) return null;
94
- return {
95
- to: `${parsed.kind}:${parsed.id}`,
96
- threadId: sessionTarget.threadId
97
- };
98
- }
99
- function normalizeSlackOriginTarget(target) {
100
- return {
101
- ...target,
102
- to: normalizeComparableTarget(target.to)
103
- };
104
- }
105
- function parseComparableSlackTarget(target) {
106
- return parseSlackTarget(target.to, { defaultKind: "channel" });
107
- }
108
- function isSlackDmChannelToUserRoutePair(a, b) {
109
- const left = parseComparableSlackTarget(a);
110
- const right = parseComparableSlackTarget(b);
111
- if (!left || !right) return false;
112
- return left.kind === "channel" && SLACK_DM_CHANNEL_ID_RE.test(left.id) && right.kind === "user" || right.kind === "channel" && SLACK_DM_CHANNEL_ID_RE.test(right.id) && left.kind === "user";
113
- }
114
- function slackTargetsMatch(a, b) {
115
- const threadKey = normalizeSlackThreadMatchKey(a.threadId);
116
- if (threadKey !== normalizeSlackThreadMatchKey(b.threadId)) return false;
117
- if (channelRouteTargetsMatchExact({
118
- left: {
119
- channel: "slack",
120
- to: a.to
121
- },
122
- right: {
123
- channel: "slack",
124
- to: b.to
125
- }
126
- })) return true;
127
- return Boolean(threadKey && isSlackDmChannelToUserRoutePair(a, b));
128
- }
129
46
  function resolveSlackNativeSuppressionAccountId({ target, request }) {
130
47
  return normalizeOptionalString(target.accountId) ?? normalizeOptionalString(request.request.turnSourceAccountId);
131
48
  }
@@ -134,34 +51,6 @@ function shouldConsiderSlackNativeForwardingSuppression(input) {
134
51
  if (input.approvalKind === "plugin") return true;
135
52
  return normalizeMessageChannel(input.request.request.turnSourceChannel) === "slack";
136
53
  }
137
- function resolveForwardingFallbackSlackTarget(target) {
138
- const to = normalizeOptionalString(target.to);
139
- if (!to) return null;
140
- const parsed = parseSlackTarget(to, { defaultKind: SLACK_USER_ID_RE.test(to) ? "user" : "channel" });
141
- if (!parsed) return null;
142
- return {
143
- to: `${parsed.kind}:${parsed.id}`,
144
- threadId: stringifyRouteThreadId(target.threadId)
145
- };
146
- }
147
- function isSlackPluginForwardingFallbackHandledNatively(input) {
148
- const forwardingTarget = resolveForwardingFallbackSlackTarget(input.target);
149
- if (!forwardingTarget) return false;
150
- const request = input.request;
151
- const originTarget = resolveSlackOriginTarget({
152
- cfg: input.cfg,
153
- accountId: resolveSlackNativeSuppressionAccountId(input),
154
- approvalKind: input.approvalKind,
155
- request
156
- });
157
- if (originTarget && slackTargetsMatch(forwardingTarget, originTarget)) return true;
158
- return resolveSlackApproverDmTargets({
159
- cfg: input.cfg,
160
- accountId: resolveSlackNativeSuppressionAccountId(input),
161
- approvalKind: input.approvalKind,
162
- request
163
- }).some((target) => slackTargetsMatch(forwardingTarget, target));
164
- }
165
54
  const resolveSlackOriginTarget = createChannelNativeOriginTargetResolver({
166
55
  channel: "slack",
167
56
  shouldHandleRequest: ({ cfg, accountId, request }) => shouldHandleSlackNativeApprovalRequest({
@@ -184,6 +73,19 @@ function resolveSlackApproverDmTargets(params) {
184
73
  })) return [];
185
74
  return (params.approvalKind === "plugin" ? getSlackApprovalApprovers(params) : getSlackExecApprovalApprovers(params)).map((approver) => ({ to: `user:${approver}` }));
186
75
  }
76
+ const shouldSuppressSlackForwardingFallback = createNativeApprovalForwardingFallbackSuppressor({
77
+ channel: "slack",
78
+ normalizeForwardTarget: normalizeSlackForwardTarget,
79
+ resolveAccountId: ({ target, request }) => resolveSlackNativeSuppressionAccountId({
80
+ target,
81
+ request
82
+ }),
83
+ isSessionRouteEligible: shouldHandleSlackNativeApprovalRequest,
84
+ isExplicitTargetEligible: shouldHandleSlackNativeApprovalRequest,
85
+ resolveOriginTarget: resolveSlackOriginTarget,
86
+ resolveApproverDmTargets: resolveSlackApproverDmTargets,
87
+ targetsMatch: slackTargetsMatch
88
+ });
187
89
  const baseSlackApprovalCapability = createApproverRestrictedNativeApprovalCapability({
188
90
  channel: "slack",
189
91
  channelLabel: "Slack",
@@ -231,7 +133,7 @@ const baseSlackApprovalCapability = createApproverRestrictedNativeApprovalCapabi
231
133
  approvalKind: resolveSlackApprovalKind(request),
232
134
  request
233
135
  }),
234
- load: async () => (await import("./approval-handler.runtime-D89odl0s.js")).slackApprovalNativeRuntime
136
+ load: async () => (await import("./approval-handler.runtime-KWkR1mEG.js")).slackApprovalNativeRuntime
235
137
  })
236
138
  });
237
139
  const baseSlackNativeAdapter = baseSlackApprovalCapability.native;
@@ -248,20 +150,34 @@ const slackApprovalCapability = {
248
150
  request: input.request
249
151
  });
250
152
  if (!canHandleNative || input.approvalKind !== "plugin") return canHandleNative;
251
- return isSlackPluginForwardingFallbackHandledNatively(input);
153
+ return shouldSuppressSlackForwardingFallback(input);
252
154
  }
253
155
  },
254
156
  native: baseSlackNativeAdapter ? {
255
157
  ...baseSlackNativeAdapter,
256
158
  describeDeliveryCapabilities: (params) => {
159
+ const capabilities = baseSlackNativeAdapter.describeDeliveryCapabilities(params);
160
+ const request = params.request;
161
+ const approvalKind = params.approvalKind;
257
162
  return {
258
- ...baseSlackNativeAdapter.describeDeliveryCapabilities(params),
163
+ ...capabilities,
259
164
  enabled: shouldHandleSlackNativeApprovalRequest({
260
165
  cfg: params.cfg,
261
166
  accountId: params.accountId,
262
- approvalKind: params.approvalKind,
263
- request: params.request
264
- })
167
+ approvalKind,
168
+ request
169
+ }),
170
+ ...approvalKind === "plugin" && shouldHandleSlackPluginViaForwardingSession({
171
+ cfg: params.cfg,
172
+ accountId: params.accountId,
173
+ request
174
+ }) ? {
175
+ preferredSurface: "origin",
176
+ supportsApproverDmSurface: hasSlackPluginApprovers({
177
+ cfg: params.cfg,
178
+ accountId: params.accountId
179
+ })
180
+ } : {}
265
181
  };
266
182
  }
267
183
  } : void 0
@@ -430,7 +346,7 @@ async function handleSlackMessageAction(params) {
430
346
  //#region extensions/slack/src/channel-actions.ts
431
347
  let slackActionRuntimePromise$1;
432
348
  async function loadSlackActionRuntime$1() {
433
- slackActionRuntimePromise$1 ??= import("./action-runtime.runtime-Cy2yYwZP.js");
349
+ slackActionRuntimePromise$1 ??= import("./action-runtime.runtime-D05xDf1s.js");
434
350
  return await slackActionRuntimePromise$1;
435
351
  }
436
352
  function resolveSlackActionContext(params) {
@@ -560,9 +476,9 @@ const EXTENSION_SHARED_MODULE_ID = "openclaw/plugin-sdk/extension-shared";
560
476
  const TARGET_RESOLVER_RUNTIME_MODULE_ID = "openclaw/plugin-sdk/target-resolver-runtime";
561
477
  const loadExtensionSharedSdk = createLazyRuntimeModule(() => import(EXTENSION_SHARED_MODULE_ID));
562
478
  const loadTargetResolverRuntimeSdk = createLazyRuntimeModule(() => import(TARGET_RESOLVER_RUNTIME_MODULE_ID));
563
- const loadSlackSetupSurfaceModule = createLazyRuntimeModule(() => import("./setup-surface-CMNvy84L.js"));
564
- const loadSlackScopesModule = createLazyRuntimeModule(() => import("./scopes-Q1VjNpWb.js"));
565
- const loadSlackOutboundAdapterModule = createLazyRuntimeModule(() => import("./outbound-adapter-C0WSWc70.js"));
479
+ const loadSlackSetupSurfaceModule = createLazyRuntimeModule(() => import("./setup-surface-BB_ivsoR.js"));
480
+ const loadSlackScopesModule = createLazyRuntimeModule(() => import("./scopes-CErQL0td.js"));
481
+ const loadSlackOutboundAdapterModule = createLazyRuntimeModule(() => import("./outbound-adapter-DvXnHfDP.js"));
566
482
  async function resolveSlackHandleAction() {
567
483
  return getOptionalSlackRuntime()?.channel?.slack?.handleSlackAction ?? (await loadSlackActionRuntime()).handleSlackAction;
568
484
  }
@@ -583,26 +499,26 @@ let slackProbeModulePromise;
583
499
  let slackMonitorModulePromise;
584
500
  let slackDirectoryLiveModulePromise;
585
501
  const loadSlackDirectoryConfigModule = createLazyRuntimeModule(() => import("./directory-config-8UPAEyNg.js").then((n) => n.t));
586
- const loadSlackResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-DIxJRl0F.js").then((n) => n.n));
587
- const loadSlackResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-B3vczJHE.js").then((n) => n.n));
502
+ const loadSlackResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-DX2GSx9c.js").then((n) => n.n));
503
+ const loadSlackResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-DOULgUwy.js").then((n) => n.n));
588
504
  async function loadSlackActionRuntime() {
589
- slackActionRuntimePromise ??= import("./action-runtime.runtime-Cy2yYwZP.js");
505
+ slackActionRuntimePromise ??= import("./action-runtime.runtime-D05xDf1s.js");
590
506
  return await slackActionRuntimePromise;
591
507
  }
592
508
  async function loadSlackSendRuntime() {
593
- slackSendRuntimePromise ??= import("./send.runtime-2BUc6y7a.js");
509
+ slackSendRuntimePromise ??= import("./send.runtime-DGyqPLWj.js");
594
510
  return await slackSendRuntimePromise;
595
511
  }
596
512
  async function loadSlackProbeModule() {
597
- slackProbeModulePromise ??= import("./probe-DczaQTdi.js").then((n) => n.n);
513
+ slackProbeModulePromise ??= import("./probe-BTKzLT2u.js").then((n) => n.n);
598
514
  return await slackProbeModulePromise;
599
515
  }
600
516
  async function loadSlackMonitorModule() {
601
- slackMonitorModulePromise ??= import("./monitor-NFID7817.js").then((n) => n.t);
517
+ slackMonitorModulePromise ??= import("./monitor-C1P_IgPU.js").then((n) => n.t);
602
518
  return await slackMonitorModulePromise;
603
519
  }
604
520
  async function loadSlackDirectoryLiveModule() {
605
- slackDirectoryLiveModulePromise ??= import("./directory-live-WZwhRYe2.js").then((n) => n.t);
521
+ slackDirectoryLiveModulePromise ??= import("./directory-live-C1acgXKJ.js").then((n) => n.t);
606
522
  return await slackDirectoryLiveModulePromise;
607
523
  }
608
524
  async function resolveSlackSendContext(params) {
@@ -1,2 +1,2 @@
1
- import { t as slackPlugin } from "./channel-C3A408fP.js";
1
+ import { t as slackPlugin } from "./channel-C15EZbTc.js";
2
2
  export { slackPlugin };
@@ -4,7 +4,7 @@ import { t as SlackChannelConfigSchema } from "./config-schema-BjAjs8_6.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-CMNvy84L.js")).slackSetupWizard }));
7
+ const slackSetupWizard = createSlackSetupWizardProxy(async () => ({ slackSetupWizard: (await import("./setup-surface-BB_ivsoR.js")).slackSetupWizard }));
8
8
  const slackSetupConfigAdapter = createScopedChannelConfigAdapter({
9
9
  sectionKey: SLACK_CHANNEL,
10
10
  listAccountIds: listSlackAccountIds,
@@ -1,9 +1,18 @@
1
1
  import "./target-parsing-C7eeWg7M.js";
2
- import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1 } from "openclaw/plugin-sdk/account-id";
2
+ import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$2 } from "openclaw/plugin-sdk/account-id";
3
+ import { hasConfiguredAccountValue } from "openclaw/plugin-sdk/account-resolution";
3
4
  import { PAIRING_APPROVED_MESSAGE, projectCredentialSnapshotFields, resolveConfiguredFromRequiredCredentialStatuses } from "openclaw/plugin-sdk/channel-status";
4
5
  import { createHash } from "node:crypto";
5
6
  import { WebClient } from "@slack/web-api";
6
7
  import { createNodeProxyAgent } from "openclaw/plugin-sdk/fetch-runtime";
8
+ //#region extensions/slack/src/account-configured.ts
9
+ function isSlackPluginAccountConfigured(account) {
10
+ const mode = account.config.mode ?? "socket";
11
+ if (!Boolean(account.botToken?.trim())) return false;
12
+ if (mode === "http") return hasConfiguredAccountValue(account.config.signingSecret);
13
+ return Boolean(account.appToken?.trim());
14
+ }
15
+ //#endregion
7
16
  //#region extensions/slack/src/channel-api.ts
8
17
  const SLACK_CHANNEL_META = {
9
18
  id: "slack",
@@ -103,4 +112,4 @@ function clearSlackWriteClientCacheForTest() {
103
112
  slackWriteClientCache.clear();
104
113
  }
105
114
  //#endregion
106
- export { getSlackWriteClient as a, resolveSlackWebClientOptions as c, PAIRING_APPROVED_MESSAGE as d, getChatChannelMeta as f, createSlackWriteClient as i, resolveSlackWriteClientOptions as l, resolveConfiguredFromRequiredCredentialStatuses as m, createSlackTokenCacheKey as n, SLACK_DEFAULT_RETRY_OPTIONS as o, projectCredentialSnapshotFields as p, createSlackWebClient as r, SLACK_WRITE_RETRY_OPTIONS as s, clearSlackWriteClientCacheForTest as t, DEFAULT_ACCOUNT_ID$1 as u };
115
+ export { getSlackWriteClient as a, resolveSlackWebClientOptions as c, PAIRING_APPROVED_MESSAGE as d, getChatChannelMeta as f, isSlackPluginAccountConfigured as h, createSlackWriteClient as i, resolveSlackWriteClientOptions as l, resolveConfiguredFromRequiredCredentialStatuses as m, createSlackTokenCacheKey as n, SLACK_DEFAULT_RETRY_OPTIONS as o, projectCredentialSnapshotFields as p, createSlackWebClient as r, SLACK_WRITE_RETRY_OPTIONS as s, clearSlackWriteClientCacheForTest as t, DEFAULT_ACCOUNT_ID$2 as u };
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
2
  import { a as resolveSlackAccount } from "./accounts-f6Xcv9Vi.js";
3
- import { r as createSlackWebClient } from "./client-qvqS9fQM.js";
3
+ import { r as createSlackWebClient } from "./client-Cn2WwpcA.js";
4
4
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/slack/src/directory-live.ts
6
6
  var directory_live_exports = /* @__PURE__ */ __exportAll({
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { t as monitorSlackProvider, y as buildSlackSlashCommandMatcher } from "./provider-B4QaoPTL.js";
3
- import { t as isSlackChannelAllowedByPolicy } from "./policy-Bb46UkJW.js";
4
- import { o as resolveSlackThreadTs } from "./replies-BPnv9QT6.js";
2
+ import { t as monitorSlackProvider, y as buildSlackSlashCommandMatcher } from "./provider-Cxqi3uh_.js";
3
+ import { t as isSlackChannelAllowedByPolicy } from "./policy-DT3mRh58.js";
4
+ import { o as resolveSlackThreadTs } from "./replies-FEOdgSlE.js";
5
5
  //#region extensions/slack/src/monitor.ts
6
6
  var monitor_exports = /* @__PURE__ */ __exportAll({
7
7
  buildSlackSlashCommandMatcher: () => buildSlackSlashCommandMatcher,
@@ -1,4 +1,4 @@
1
- import { _ as buildSlackInteractiveBlocks, a as parseSlackBlocksInput, n as resolveSlackThreadTsValue, s as SLACK_TEXT_LIMIT, v as buildSlackPresentationBlocks, y as resolveSlackInteractiveBlockOffsets } from "./thread-ts-CzxxhSE5.js";
1
+ import { _ as buildSlackInteractiveBlocks, a as parseSlackBlocksInput, n as resolveSlackThreadTsValue, s as SLACK_TEXT_LIMIT, v as buildSlackPresentationBlocks, y as resolveSlackInteractiveBlockOffsets } from "./thread-ts-Cffag8e2.js";
2
2
  import { t as compileSlackInteractiveReplies } from "./interactive-replies-DrBq4Mld.js";
3
3
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-outbound";
@@ -9,7 +9,7 @@ import { resolvePayloadMediaUrls, sendPayloadMediaSequenceAndFinalize, sendTextM
9
9
  const SLACK_MAX_BLOCKS = 50;
10
10
  let slackSendRuntimePromise;
11
11
  async function loadSlackSendRuntime() {
12
- slackSendRuntimePromise ??= import("./send.runtime-2BUc6y7a.js");
12
+ slackSendRuntimePromise ??= import("./send.runtime-DGyqPLWj.js");
13
13
  return await slackSendRuntimePromise;
14
14
  }
15
15
  function resolveRenderedInteractiveBlocks(interactive, previousBlocks) {
@@ -1,15 +1,15 @@
1
1
  import { l as resolveSlackReplyToMode } from "./accounts-f6Xcv9Vi.js";
2
2
  import { r as parseSlackTarget } from "./target-parsing-C7eeWg7M.js";
3
3
  import "./targets-nUqxHGgg.js";
4
- import { b as truncateSlackText, f as normalizeAllowListLower, h as resolveSlackAllowListMatch, p as normalizeSlackAllowOwnerEntry, s as SLACK_TEXT_LIMIT } from "./thread-ts-CzxxhSE5.js";
4
+ import { b as truncateSlackText, f as normalizeAllowListLower, h as resolveSlackAllowListMatch, p as normalizeSlackAllowOwnerEntry, s as SLACK_TEXT_LIMIT } from "./thread-ts-Cffag8e2.js";
5
5
  import { n as isSlackInteractiveRepliesEnabled, t as compileSlackInteractiveReplies } from "./interactive-replies-DrBq4Mld.js";
6
6
  import { n as resolveSlackNativeStreaming, r as resolveSlackStreamingMode, t as mapStreamingModeToSlackLegacyDraftStreamMode } from "./streaming-compat-DjlgH-Be.js";
7
- import { a as recordSlackThreadParticipation, i as hasSlackThreadParticipationWithPersistence, s as normalizeSlackOutboundText, t as sendMessageSlack } from "./send-DzphzfbK.js";
8
- import { _ as resolveSlackThreadStarter, b as buildSlackEditTextPayload, f as removeSlackReaction, g as resolveSlackThreadHistory, l as reactSlackMessage, r as editSlackMessage, t as deleteSlackMessage, y as formatSlackFileReference } from "./actions-CkiDNtJN.js";
7
+ import { a as recordSlackThreadParticipation, i as hasSlackThreadParticipationWithPersistence, s as normalizeSlackOutboundText, t as sendMessageSlack } from "./send-rekB-Xjp.js";
8
+ import { _ as resolveSlackThreadStarter, b as buildSlackEditTextPayload, f as removeSlackReaction, g as resolveSlackThreadHistory, l as reactSlackMessage, r as editSlackMessage, t as deleteSlackMessage, y as formatSlackFileReference } from "./actions-YkhEE5f1.js";
9
9
  import { t as formatSlackError } from "./errors-CZtmv-h0.js";
10
- import { _ as resolveStorePath, a as escapeSlackMrkdwn, b as stripSlackMentionsForCommandDetection, c as authorizeSlackBotRoomMessage, d as buildSlackAssistantThreadMetadata, f as parseSlackAssistantThreadMetadata, g as resolveChannelContextVisibilityMode, h as readSessionUpdatedAt, i as authorizeSlackDirectMessage, l as resolveSlackCommandIngress, m as resolveSlackChatType, o as recordInboundSession, p as normalizeSlackChannelType, r as resolveSlackRoomContextHints, s as resolveConversationLabel$1, u as resolveSlackEffectiveAllowFrom, v as updateLastRoute } from "./provider-B4QaoPTL.js";
11
- import { n as resolveSlackChannelConfig } from "./policy-Bb46UkJW.js";
12
- import { a as resolveDeliveredSlackReplyThreadTs, i as readSlackReplyBlocks, n as deliverReplies, o as resolveSlackThreadTs, t as createSlackReplyDeliveryPlan } from "./replies-BPnv9QT6.js";
10
+ import { _ as resolveStorePath, a as escapeSlackMrkdwn, b as stripSlackMentionsForCommandDetection, c as authorizeSlackBotRoomMessage, d as buildSlackAssistantThreadMetadata, f as parseSlackAssistantThreadMetadata, g as resolveChannelContextVisibilityMode, h as readSessionUpdatedAt, i as authorizeSlackDirectMessage, l as resolveSlackCommandIngress, m as resolveSlackChatType, o as recordInboundSession, p as normalizeSlackChannelType, r as resolveSlackRoomContextHints, s as resolveConversationLabel$1, u as resolveSlackEffectiveAllowFrom, v as updateLastRoute } from "./provider-Cxqi3uh_.js";
11
+ import { n as resolveSlackChannelConfig } from "./policy-DT3mRh58.js";
12
+ import { a as resolveDeliveredSlackReplyThreadTs, i as readSlackReplyBlocks, n as deliverReplies, o as resolveSlackThreadTs, t as createSlackReplyDeliveryPlan } from "./replies-FEOdgSlE.js";
13
13
  import { asOptionalRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/string-coerce-runtime";
14
14
  import { resolveAgentRoute, resolveInboundLastRouteSessionKey, resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing";
15
15
  import { buildChannelProgressDraftLine, buildChannelProgressDraftLineForEntry, createChannelMessageReplyPipeline, createChannelProgressDraftGate, createDraftStreamLoop, defineFinalizableLivePreviewAdapter, deliverWithFinalizableLivePreviewAdapter, formatChannelProgressDraftText, isChannelProgressDraftWorkToolName, mergeChannelProgressDraftLine, resolveAgentOutboundIdentity, resolveChannelMessageSourceReplyDeliveryMode, resolveChannelProgressDraftConfig, resolveChannelProgressDraftMaxLineChars, resolveChannelProgressDraftMaxLines, resolveChannelProgressDraftRender, resolveChannelStreamingBlockEnabled, resolveChannelStreamingNativeTransport, resolveChannelStreamingPreviewToolProgress, resolveChannelStreamingSuppressDefaultToolProgressMessages } from "openclaw/plugin-sdk/channel-outbound";
@@ -1865,7 +1865,7 @@ const SLACK_MENTION_RESOLUTION_MAX_LOOKUPS_PER_MESSAGE = 20;
1865
1865
  const SLACK_USER_MENTION_RE$1 = /<@([A-Z0-9]+)(?:\|[^>]+)?>/gi;
1866
1866
  let slackMediaModulePromise$1;
1867
1867
  function loadSlackMediaModule$1() {
1868
- slackMediaModulePromise$1 ??= import("./actions-CkiDNtJN.js").then((n) => n.h);
1868
+ slackMediaModulePromise$1 ??= import("./actions-YkhEE5f1.js").then((n) => n.h);
1869
1869
  return slackMediaModulePromise$1;
1870
1870
  }
1871
1871
  function collectUniqueSlackMentionIds$1(texts) {
@@ -2379,7 +2379,7 @@ function formatSlackBotStarterThreadLabel(params) {
2379
2379
  //#region extensions/slack/src/monitor/message-handler/prepare-thread-context.ts
2380
2380
  let slackMediaModulePromise;
2381
2381
  function loadSlackMediaModule() {
2382
- slackMediaModulePromise ??= import("./actions-CkiDNtJN.js").then((n) => n.h);
2382
+ slackMediaModulePromise ??= import("./actions-YkhEE5f1.js").then((n) => n.h);
2383
2383
  return slackMediaModulePromise;
2384
2384
  }
2385
2385
  const SLACK_THREAD_CONTEXT_USER_LOOKUP_CONCURRENCY = 4;
@@ -1,4 +1,4 @@
1
- import { m as normalizeSlackSlug } from "./thread-ts-CzxxhSE5.js";
1
+ import { m as normalizeSlackSlug } from "./thread-ts-Cffag8e2.js";
2
2
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { applyChannelMatchMeta, buildChannelKeyCandidates, resolveChannelEntryMatchWithFallback } from "openclaw/plugin-sdk/channel-targets";
4
4
  import { mergePairLoopGuardConfig } from "openclaw/plugin-sdk/pair-loop-guard-runtime";
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { r as createSlackWebClient } from "./client-qvqS9fQM.js";
2
+ import { r as createSlackWebClient } from "./client-Cn2WwpcA.js";
3
3
  import { t as formatSlackError } from "./errors-CZtmv-h0.js";
4
4
  import { withTimeout } from "openclaw/plugin-sdk/text-utility-runtime";
5
5
  //#region extensions/slack/src/probe.ts
@@ -1,13 +1,13 @@
1
1
  import { n as registerSlackHttpHandler, r as normalizeSlackWebhookPath } from "./registry-bbjH7IHX.js";
2
2
  import { a as resolveSlackAccount, d as resolveSlackBotToken, o as resolveSlackAccountAllowFrom, s as resolveSlackAccountDmPolicy, u as resolveSlackAppToken } from "./accounts-f6Xcv9Vi.js";
3
- import { C as isSlackAnyNativeApprovalClientEnabled, D as isSlackApprovalAuthorizedSender, b as truncateSlackText, d as normalizeAllowList, f as normalizeAllowListLower, h as resolveSlackAllowListMatch, k as isSlackExecApprovalAuthorizedSender, m as normalizeSlackSlug, p as normalizeSlackAllowOwnerEntry, s as SLACK_TEXT_LIMIT, u as allowListMatches } from "./thread-ts-CzxxhSE5.js";
3
+ import { F as isSlackApprovalAuthorizedSender, L as isSlackExecApprovalAuthorizedSender, b as truncateSlackText, d as normalizeAllowList, f as normalizeAllowListLower, h as resolveSlackAllowListMatch, m as normalizeSlackSlug, p as normalizeSlackAllowOwnerEntry, s as SLACK_TEXT_LIMIT, u as allowListMatches, w as isSlackAnyNativeApprovalClientEnabled } from "./thread-ts-Cffag8e2.js";
4
+ import { c as resolveSlackWebClientOptions } from "./client-Cn2WwpcA.js";
4
5
  import { n as isSlackInteractiveRepliesEnabled, t as compileSlackInteractiveReplies } from "./interactive-replies-DrBq4Mld.js";
5
- import { c as resolveSlackWebClientOptions } from "./client-qvqS9fQM.js";
6
6
  import { t as getOptionalSlackRuntime } from "./runtime-BOk7xkOl.js";
7
7
  import { t as formatSlackError } from "./errors-CZtmv-h0.js";
8
- import { t as resolveSlackChannelAllowlist } from "./resolve-channels-DIxJRl0F.js";
9
- import { t as resolveSlackUserAllowlist } from "./resolve-users-B3vczJHE.js";
10
- import { n as resolveSlackChannelConfig, r as resolveSlackChannelLabel, t as isSlackChannelAllowedByPolicy } from "./policy-Bb46UkJW.js";
8
+ import { t as resolveSlackChannelAllowlist } from "./resolve-channels-DX2GSx9c.js";
9
+ import { t as resolveSlackUserAllowlist } from "./resolve-users-DOULgUwy.js";
10
+ import { n as resolveSlackChannelConfig, r as resolveSlackChannelLabel, t as isSlackChannelAllowedByPolicy } from "./policy-DT3mRh58.js";
11
11
  import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
12
12
  import { asOptionalRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringEntries, normalizeStringEntriesLower, normalizeUniqueTrimmedStringList } from "openclaw/plugin-sdk/string-coerce-runtime";
13
13
  import { normalizeAccountId, normalizeMainKey, resolveAgentRoute, resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing";
@@ -2699,7 +2699,7 @@ function createSlackThreadTsResolver(params) {
2699
2699
  //#region extensions/slack/src/monitor/message-handler.ts
2700
2700
  let slackMessagePipelinePromise;
2701
2701
  function loadSlackMessagePipeline() {
2702
- slackMessagePipelinePromise ??= import("./pipeline.runtime-DikPOwwv.js");
2702
+ slackMessagePipelinePromise ??= import("./pipeline.runtime-DDELeqeP.js");
2703
2703
  return slackMessagePipelinePromise;
2704
2704
  }
2705
2705
  const APP_MENTION_RETRY_TTL_MS = 6e4;
@@ -3341,7 +3341,7 @@ function loadSlashCommandsRuntime() {
3341
3341
  return slashCommandsRuntimePromise;
3342
3342
  }
3343
3343
  function loadSlashDispatchRuntime() {
3344
- slashDispatchRuntimePromise ??= import("./slash-dispatch.runtime-Dr5g7nrJ.js");
3344
+ slashDispatchRuntimePromise ??= import("./slash-dispatch.runtime-CoFAysiw.js");
3345
3345
  return slashDispatchRuntimePromise;
3346
3346
  }
3347
3347
  function loadSlackPluginCommandsRuntime() {
@@ -1,5 +1,5 @@
1
- import { r as resolveSlackReplyBlocks, s as SLACK_TEXT_LIMIT } from "./thread-ts-CzxxhSE5.js";
2
- import { o as markdownToSlackMrkdwnChunks, t as sendMessageSlack } from "./send-DzphzfbK.js";
1
+ import { r as resolveSlackReplyBlocks, s as SLACK_TEXT_LIMIT } from "./thread-ts-Cffag8e2.js";
2
+ import { o as markdownToSlackMrkdwnChunks, t as sendMessageSlack } from "./send-rekB-Xjp.js";
3
3
  import { createReplyReferencePlanner } from "openclaw/plugin-sdk/reply-reference";
4
4
  import { SILENT_REPLY_TOKEN, chunkMarkdownTextWithMode, isSilentReplyText } from "openclaw/plugin-sdk/reply-chunking";
5
5
  import { deliverTextOrMediaReply, resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { r as createSlackWebClient } from "./client-qvqS9fQM.js";
2
+ import { r as createSlackWebClient } from "./client-Cn2WwpcA.js";
3
3
  import { n as resolveSlackAllowlistEntries, t as collectSlackCursorItems } from "./resolve-allowlist-common-CP8SH0Zf.js";
4
4
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/slack/src/resolve-channels.ts
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { r as createSlackWebClient } from "./client-qvqS9fQM.js";
2
+ import { r as createSlackWebClient } from "./client-Cn2WwpcA.js";
3
3
  import { n as resolveSlackAllowlistEntries, t as collectSlackCursorItems } from "./resolve-allowlist-common-CP8SH0Zf.js";
4
4
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/slack/src/resolve-users.ts
@@ -1,5 +1,5 @@
1
1
  import "./target-parsing-C7eeWg7M.js";
2
- import "./client-qvqS9fQM.js";
2
+ import "./client-Cn2WwpcA.js";
3
3
  import "./config-api-DnT9ohtE.js";
4
4
  import "openclaw/plugin-sdk/account-id";
5
5
  import { createActionGate as createActionGate$1, imageResultFromFile, jsonResult, readPositiveIntegerParam, readReactionParams, readStringParam, withNormalizedTimestamp } from "openclaw/plugin-sdk/channel-actions";
@@ -1,14 +1,14 @@
1
1
  import { t as registerSlackPluginHttpRoutes } from "./plugin-routes-B9PvcDQJ.js";
2
2
  import { a as resolveSlackAccount, d as resolveSlackBotToken, i as resolveDefaultSlackAccountId, n as listSlackAccountIds, t as listEnabledSlackAccounts, u as resolveSlackAppToken } from "./accounts-f6Xcv9Vi.js";
3
- import { c as resolveSlackGroupRequireMention, l as resolveSlackGroupToolPolicy } from "./thread-ts-CzxxhSE5.js";
3
+ import { c as resolveSlackGroupRequireMention, l as resolveSlackGroupToolPolicy } from "./thread-ts-Cffag8e2.js";
4
4
  import { n as setSlackRuntime } from "./runtime-BOk7xkOl.js";
5
- import { t as sendMessageSlack } from "./send-DzphzfbK.js";
6
- import { a as listSlackEmojis, c as pinSlackMessage, d as removeOwnSlackReactions, f as removeSlackReaction, i as getSlackMemberInfo, l as reactSlackMessage, m as unpinSlackMessage, o as listSlackPins, p as sendSlackMessage, r as editSlackMessage, s as listSlackReactions, t as deleteSlackMessage, u as readSlackMessages } from "./actions-CkiDNtJN.js";
7
- import { t as probeSlack } from "./probe-DczaQTdi.js";
8
- import { t as resolveSlackChannelAllowlist } from "./resolve-channels-DIxJRl0F.js";
9
- import { t as resolveSlackUserAllowlist } from "./resolve-users-B3vczJHE.js";
10
- import { t as monitorSlackProvider } from "./provider-B4QaoPTL.js";
11
- import { n as slackActionRuntime, t as handleSlackAction } from "./action-runtime-Cg2tZbNu.js";
12
- import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./directory-live-WZwhRYe2.js";
13
- import "./monitor-NFID7817.js";
5
+ import { t as sendMessageSlack } from "./send-rekB-Xjp.js";
6
+ import { a as listSlackEmojis, c as pinSlackMessage, d as removeOwnSlackReactions, f as removeSlackReaction, i as getSlackMemberInfo, l as reactSlackMessage, m as unpinSlackMessage, o as listSlackPins, p as sendSlackMessage, r as editSlackMessage, s as listSlackReactions, t as deleteSlackMessage, u as readSlackMessages } from "./actions-YkhEE5f1.js";
7
+ import { t as probeSlack } from "./probe-BTKzLT2u.js";
8
+ import { t as resolveSlackChannelAllowlist } from "./resolve-channels-DX2GSx9c.js";
9
+ import { t as resolveSlackUserAllowlist } from "./resolve-users-DOULgUwy.js";
10
+ import { t as monitorSlackProvider } from "./provider-Cxqi3uh_.js";
11
+ import { n as slackActionRuntime, t as handleSlackAction } from "./action-runtime-CgrHdqkC.js";
12
+ import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./directory-live-C1acgXKJ.js";
13
+ import "./monitor-C1P_IgPU.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,4 +1,4 @@
1
- import { r as createSlackWebClient } from "./client-qvqS9fQM.js";
1
+ import { r as createSlackWebClient } from "./client-Cn2WwpcA.js";
2
2
  import { t as formatSlackError } from "./errors-CZtmv-h0.js";
3
3
  import { isRecord, normalizeOptionalString, normalizeStringEntries, sortUniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  //#region extensions/slack/src/scopes.ts
@@ -1,10 +1,10 @@
1
1
  import { a as resolveSlackAccount, d as resolveSlackBotToken } from "./accounts-f6Xcv9Vi.js";
2
2
  import { r as parseSlackTarget } from "./target-parsing-C7eeWg7M.js";
3
3
  import "./targets-nUqxHGgg.js";
4
- import { b as truncateSlackText, o as validateSlackBlocksArray, s as SLACK_TEXT_LIMIT, t as normalizeSlackThreadTsCandidate } from "./thread-ts-CzxxhSE5.js";
5
- import { a as getSlackWriteClient, n as createSlackTokenCacheKey } from "./client-qvqS9fQM.js";
4
+ import { b as truncateSlackText, o as validateSlackBlocksArray, s as SLACK_TEXT_LIMIT, t as normalizeSlackThreadTsCandidate } from "./thread-ts-Cffag8e2.js";
5
+ import { a as getSlackWriteClient, n as createSlackTokenCacheKey } from "./client-Cn2WwpcA.js";
6
6
  import { t as getOptionalSlackRuntime } from "./runtime-BOk7xkOl.js";
7
- import { i as loadOutboundMediaFromUrl } from "./runtime-api-BpGQDSTg.js";
7
+ import { i as loadOutboundMediaFromUrl } from "./runtime-api-DudG6lbf.js";
8
8
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-outbound";
10
10
  import { withTrustedEnvProxyGuardedFetchMode } from "openclaw/plugin-sdk/fetch-runtime";
@@ -0,0 +1,2 @@
1
+ import { t as sendMessageSlack } from "./send-rekB-Xjp.js";
2
+ export { sendMessageSlack };
@@ -1,2 +1,2 @@
1
- import { t as slackSetupPlugin } from "./channel.setup-Bwe4Z6kB.js";
1
+ import { t as slackSetupPlugin } from "./channel.setup-DrCTObMp.js";
2
2
  export { slackSetupPlugin };
@@ -1,8 +1,8 @@
1
1
  import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, o as resolveSlackAccountAllowFrom } from "./accounts-f6Xcv9Vi.js";
2
- import "./shared-VMk8NGYC.js";
2
+ import "./shared-Bviszgb6.js";
3
3
  import { i as SLACK_CHANNEL, t as createSlackSetupWizardBase } from "./setup-core-POfI_bgP.js";
4
- import { t as resolveSlackChannelAllowlist } from "./resolve-channels-DIxJRl0F.js";
5
- import { t as resolveSlackUserAllowlist } from "./resolve-users-B3vczJHE.js";
4
+ import { t as resolveSlackChannelAllowlist } from "./resolve-channels-DX2GSx9c.js";
5
+ import { t as resolveSlackUserAllowlist } from "./resolve-users-DOULgUwy.js";
6
6
  import { normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { adaptScopedAccountAccessor } from "openclaw/plugin-sdk/channel-config-helpers";
8
8
  import { createSetupTranslator, noteChannelLookupFailure, noteChannelLookupSummary, parseMentionOrPrefixedId, promptLegacyChannelAllowFromForAccount, resolveEntriesWithOptionalToken } from "openclaw/plugin-sdk/setup-runtime";
@@ -1,7 +1,7 @@
1
1
  import { a as resolveSlackAccount, c as resolveSlackConfigAccessorAccount, i as resolveDefaultSlackAccountId, n as listSlackAccountIds, o as resolveSlackAccountAllowFrom, s as resolveSlackAccountDmPolicy } from "./accounts-f6Xcv9Vi.js";
2
2
  import { t as inspectSlackAccount } from "./account-inspect-CdGk6R7l.js";
3
+ import { f as getChatChannelMeta, h as isSlackPluginAccountConfigured } from "./client-Cn2WwpcA.js";
3
4
  import { n as isSlackInteractiveRepliesEnabled } from "./interactive-replies-DrBq4Mld.js";
4
- import { f as getChatChannelMeta } from "./client-qvqS9fQM.js";
5
5
  import { i as SLACK_CHANNEL } from "./setup-core-POfI_bgP.js";
6
6
  import { t as SlackChannelConfigSchema } from "./config-schema-BjAjs8_6.js";
7
7
  import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-XL6HeNCb.js";
@@ -106,12 +106,6 @@ const slackDoctor = {
106
106
  };
107
107
  //#endregion
108
108
  //#region extensions/slack/src/shared.ts
109
- function isSlackPluginAccountConfigured(account) {
110
- const mode = account.config.mode ?? "socket";
111
- if (!Boolean(account.botToken?.trim())) return false;
112
- if (mode === "http") return Boolean(account.config.signingSecret?.trim());
113
- return Boolean(account.appToken?.trim());
114
- }
115
109
  const slackConfigAdapter = createScopedChannelConfigAdapter({
116
110
  sectionKey: SLACK_CHANNEL,
117
111
  listAccountIds: listSlackAccountIds,
@@ -209,4 +203,4 @@ function createSlackPluginBase(params) {
209
203
  };
210
204
  }
211
205
  //#endregion
212
- export { slackSecurityAdapter as i, isSlackPluginAccountConfigured as n, slackConfigAdapter as r, createSlackPluginBase as t };
206
+ export { slackConfigAdapter as n, slackSecurityAdapter as r, createSlackPluginBase as t };
@@ -1,4 +1,4 @@
1
- import { r as deliverSlackSlashReplies$1 } from "./replies-BPnv9QT6.js";
1
+ import { r as deliverSlackSlashReplies$1 } from "./replies-FEOdgSlE.js";
2
2
  import { resolveAgentRoute as resolveAgentRoute$1 } from "openclaw/plugin-sdk/routing";
3
3
  import { resolveMarkdownTableMode as resolveMarkdownTableMode$1 } from "openclaw/plugin-sdk/markdown-table-runtime";
4
4
  import { recordInboundSessionMetaSafe as recordInboundSessionMetaSafe$1, resolveConversationLabel as resolveConversationLabel$1 } from "openclaw/plugin-sdk/conversation-runtime";
@@ -1,10 +1,14 @@
1
- import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, o as resolveSlackAccountAllowFrom, r as mergeSlackAccountConfig } from "./accounts-f6Xcv9Vi.js";
1
+ import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, n as listSlackAccountIds, o as resolveSlackAccountAllowFrom, r as mergeSlackAccountConfig } from "./accounts-f6Xcv9Vi.js";
2
+ import { r as parseSlackTarget } from "./target-parsing-C7eeWg7M.js";
3
+ import "./targets-nUqxHGgg.js";
4
+ import { h as isSlackPluginAccountConfigured } from "./client-Cn2WwpcA.js";
2
5
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
3
- import { normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringifiedOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeStringifiedOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
7
  import { normalizeMessageChannel } from "openclaw/plugin-sdk/routing";
5
- import { doesApprovalRequestMatchChannelAccount, resolveApprovalRequestSessionConversation } from "openclaw/plugin-sdk/approval-native-runtime";
8
+ import { createNativeApprovalChannelRouteGates, doesApprovalRequestMatchChannelAccount, resolveApprovalRequestSessionConversation } from "openclaw/plugin-sdk/approval-native-runtime";
6
9
  import { createResolvedApproverActionAuthAdapter, resolveApprovalApprovers } from "openclaw/plugin-sdk/approval-auth-runtime";
7
10
  import { createChannelExecApprovalProfile, isChannelExecApprovalClientEnabledFromConfig, isChannelExecApprovalTargetRecipient, matchesApprovalRequestFilters } from "openclaw/plugin-sdk/approval-client-runtime";
11
+ import { channelRouteTargetsMatchExact, stringifyRouteThreadId } from "openclaw/plugin-sdk/channel-route";
8
12
  import { reduceInteractiveReply, resolveMessagePresentationControlValue } from "openclaw/plugin-sdk/interactive-runtime";
9
13
  import { parseExecApprovalCommandText } from "openclaw/plugin-sdk/approval-reply-runtime";
10
14
  import { compileAllowlist, resolveCompiledAllowlistMatch } from "openclaw/plugin-sdk/allow-from";
@@ -79,7 +83,9 @@ function getSlackApprovalApprovers(params) {
79
83
  function isSlackApprovalAuthorizedSender(params) {
80
84
  const senderId = params.senderId ? normalizeSlackApproverId(params.senderId) : void 0;
81
85
  if (!senderId) return false;
82
- return getSlackApprovalApprovers(params).includes(senderId);
86
+ const approvers = getSlackApprovalApprovers(params);
87
+ if (approvers.length > 0) return approvers.includes(senderId);
88
+ return (resolveSlackAccountAllowFrom(params) ?? []).some((entry) => entry.trim() === "*");
83
89
  }
84
90
  createResolvedApproverActionAuthAdapter({
85
91
  channelLabel: "Slack",
@@ -91,85 +97,139 @@ createResolvedApproverActionAuthAdapter({
91
97
  });
92
98
  //#endregion
93
99
  //#region extensions/slack/src/approval-native-gates.ts
100
+ const DEFAULT_APPROVAL_FORWARDING_MODE = "session";
101
+ const SLACK_DM_CHANNEL_ID_RE = /^D[A-Z0-9]{8,}$/i;
102
+ const SLACK_USER_ID_RE = /^[UW][A-Z0-9]{8,}$/i;
94
103
  function resolveSlackApprovalKind(request) {
95
104
  return request.id.startsWith("plugin:") ? "plugin" : "exec";
96
105
  }
106
+ function isSlackApprovalTransportEnabled(params) {
107
+ return isSlackPluginAccountConfigured(resolveSlackAccount(params));
108
+ }
97
109
  function resolveSlackNativeApprovalConfig(params) {
98
110
  return resolveSlackAccount(params).config.execApprovals;
99
111
  }
100
112
  function resolvePluginApprovalForwardingConfig(cfg) {
101
113
  return cfg.approvals?.plugin;
102
114
  }
103
- function getSlackNativeApprovalApprovers(params) {
104
- return params.approvalKind === "plugin" ? getSlackApprovalApprovers(params) : getSlackExecApprovalApprovers(params);
105
- }
106
- function normalizeAccountId$2(value) {
107
- return normalizeOptionalString(value)?.toLowerCase();
108
- }
109
- function matchesSlackAccount(params) {
110
- const expected = normalizeAccountId$2(params.expectedAccountId);
111
- const actual = normalizeAccountId$2(params.actualAccountId);
112
- return !expected || !actual || expected === actual;
113
- }
114
- function modeIncludesSession(mode) {
115
- return mode === void 0 || mode === "session" || mode === "both";
116
- }
117
- function modeIncludesTargets(mode) {
118
- return mode === "targets" || mode === "both";
115
+ function normalizeSlackThreadMatchKey(threadId) {
116
+ return threadId == null ? "" : String(threadId).trim();
117
+ }
118
+ function normalizeComparableTarget(value) {
119
+ return normalizeLowercaseStringOrEmpty(value);
120
+ }
121
+ function extractSlackSessionKind(sessionKey) {
122
+ if (!sessionKey) return null;
123
+ const kind = normalizeLowercaseStringOrEmpty(sessionKey.match(/slack:(direct|channel|group):/i)?.[1]);
124
+ return kind ? kind : null;
125
+ }
126
+ function resolveSlackTurnSourceDefaultKind(params) {
127
+ if (SLACK_DM_CHANNEL_ID_RE.test(params.turnSourceTo)) return "channel";
128
+ return params.sessionKind === "direct" ? "user" : "channel";
129
+ }
130
+ function resolveTurnSourceSlackOriginTarget(request) {
131
+ const turnSourceChannel = normalizeLowercaseStringOrEmpty(request.request.turnSourceChannel);
132
+ const turnSourceTo = normalizeOptionalString(request.request.turnSourceTo) ?? "";
133
+ if (turnSourceChannel !== "slack" || !turnSourceTo) return null;
134
+ const parsed = parseSlackTarget(turnSourceTo, { defaultKind: resolveSlackTurnSourceDefaultKind({
135
+ turnSourceTo,
136
+ sessionKind: extractSlackSessionKind(request.request.sessionKey ?? void 0)
137
+ }) });
138
+ if (!parsed) return null;
139
+ return {
140
+ to: `${parsed.kind}:${parsed.id}`,
141
+ threadId: stringifyRouteThreadId(request.request.turnSourceThreadId)
142
+ };
119
143
  }
120
- function hasSlackPluginForwardingTarget(params) {
121
- return (resolvePluginApprovalForwardingConfig(params.cfg)?.targets ?? []).some((target) => {
122
- return (normalizeMessageChannel(target.channel) ?? target.channel) === "slack" && matchesSlackAccount({
123
- expectedAccountId: params.accountId,
124
- actualAccountId: target.accountId
125
- });
126
- });
144
+ function resolveSessionSlackOriginTarget(sessionTarget) {
145
+ return {
146
+ to: sessionTarget.to,
147
+ threadId: stringifyRouteThreadId(sessionTarget.threadId)
148
+ };
127
149
  }
128
- function requestHasSlackOriginOrSession(params) {
129
- const request = params.request.request;
130
- const turnSourceChannel = normalizeMessageChannel(request.turnSourceChannel);
131
- if (turnSourceChannel) return turnSourceChannel === "slack" && matchesSlackAccount({
132
- expectedAccountId: params.accountId,
133
- actualAccountId: request.turnSourceAccountId
134
- });
135
- return resolveApprovalRequestSessionConversation({
136
- request: params.request,
150
+ function resolveSlackFallbackOriginTarget(request) {
151
+ const sessionTarget = resolveApprovalRequestSessionConversation({
152
+ request,
137
153
  channel: "slack",
138
154
  bundledFallback: false
139
- }) !== null && doesApprovalRequestMatchChannelAccount({
140
- cfg: params.cfg,
141
- request: params.request,
142
- channel: "slack",
143
- accountId: params.accountId
144
155
  });
156
+ if (!sessionTarget) return null;
157
+ const parsed = parseSlackTarget(sessionTarget.id.toUpperCase(), { defaultKind: "channel" });
158
+ if (!parsed) return null;
159
+ return {
160
+ to: `${parsed.kind}:${parsed.id}`,
161
+ threadId: sessionTarget.threadId
162
+ };
145
163
  }
146
- function isPluginForwardingEnabledForRequest(params) {
147
- const config = resolvePluginApprovalForwardingConfig(params.cfg);
148
- if (!config?.enabled) return false;
149
- return matchesApprovalRequestFilters({
150
- request: params.request.request,
151
- agentFilter: config.agentFilter,
152
- sessionFilter: config.sessionFilter
153
- });
164
+ function normalizeSlackOriginTarget(target) {
165
+ return {
166
+ ...target,
167
+ to: normalizeComparableTarget(target.to)
168
+ };
154
169
  }
155
- function canPluginForwardingRouteToSlack(params) {
156
- const mode = resolvePluginApprovalForwardingConfig(params.cfg)?.mode;
157
- if (modeIncludesSession(mode) && requestHasSlackOriginOrSession({
158
- cfg: params.cfg,
159
- request: params.request,
160
- accountId: params.accountId
170
+ function parseComparableSlackTarget(target) {
171
+ return parseSlackTarget(target.to, { defaultKind: "channel" });
172
+ }
173
+ function isSlackDmChannelToUserRoutePair(a, b) {
174
+ const left = parseComparableSlackTarget(a);
175
+ const right = parseComparableSlackTarget(b);
176
+ if (!left || !right) return false;
177
+ return left.kind === "channel" && SLACK_DM_CHANNEL_ID_RE.test(left.id) && right.kind === "user" || right.kind === "channel" && SLACK_DM_CHANNEL_ID_RE.test(right.id) && left.kind === "user";
178
+ }
179
+ function slackTargetsMatch(a, b) {
180
+ const threadKey = normalizeSlackThreadMatchKey(a.threadId);
181
+ if (threadKey !== normalizeSlackThreadMatchKey(b.threadId)) return false;
182
+ if (channelRouteTargetsMatchExact({
183
+ left: {
184
+ channel: "slack",
185
+ to: a.to
186
+ },
187
+ right: {
188
+ channel: "slack",
189
+ to: b.to
190
+ }
161
191
  })) return true;
162
- return modeIncludesTargets(mode) && hasSlackPluginForwardingTarget(params);
192
+ return Boolean(threadKey && isSlackDmChannelToUserRoutePair(a, b));
193
+ }
194
+ function normalizeSlackForwardTarget(target) {
195
+ if ((normalizeMessageChannel(target.channel) ?? target.channel) !== "slack") return null;
196
+ const to = normalizeOptionalString(target.to);
197
+ if (!to) return null;
198
+ const parsed = parseSlackTarget(to, { defaultKind: SLACK_USER_ID_RE.test(to) ? "user" : "channel" });
199
+ if (!parsed) return null;
200
+ return {
201
+ to: `${parsed.kind}:${parsed.id}`,
202
+ accountId: normalizeOptionalString(target.accountId),
203
+ threadId: stringifyRouteThreadId(target.threadId)
204
+ };
163
205
  }
164
- function isSlackPluginNativeApprovalClientEnabled(params) {
165
- if (isChannelExecApprovalClientEnabledFromConfig({
206
+ const { canApprovalPotentiallyRouteToChannel: canApprovalPotentiallyRouteToSlack, isSessionApprovalEligible: isForwardedSlackSessionApprovalEligible, isExplicitTargetEligible: isForwardedSlackExplicitTargetEligible } = createNativeApprovalChannelRouteGates({
207
+ channel: "slack",
208
+ defaultForwardingMode: DEFAULT_APPROVAL_FORWARDING_MODE,
209
+ isTransportEnabled: isSlackApprovalTransportEnabled,
210
+ listAccountIds: listSlackAccountIds,
211
+ resolveDefaultAccountId: resolveDefaultSlackAccountId,
212
+ normalizeForwardTarget: normalizeSlackForwardTarget,
213
+ resolveTurnSourceTarget: resolveTurnSourceSlackOriginTarget,
214
+ targetsMatch: slackTargetsMatch
215
+ });
216
+ function hasSlackPluginApprovers(params) {
217
+ return getSlackApprovalApprovers(params).length > 0;
218
+ }
219
+ function isSlackPluginNativeApprovalClientConfigEnabled(params) {
220
+ return isChannelExecApprovalClientEnabledFromConfig({
166
221
  enabled: resolveSlackNativeApprovalConfig(params)?.enabled,
167
222
  approverCount: getSlackApprovalApprovers(params).length
168
- })) return true;
169
- const config = resolvePluginApprovalForwardingConfig(params.cfg);
170
- if (!config?.enabled || getSlackApprovalApprovers(params).length <= 0) return false;
171
- const mode = config.mode;
172
- return modeIncludesSession(mode) || modeIncludesTargets(mode) && hasSlackPluginForwardingTarget(params);
223
+ });
224
+ }
225
+ function isSlackPluginForwardingRoutePotentiallyEnabled(params) {
226
+ return canApprovalPotentiallyRouteToSlack({
227
+ ...params,
228
+ approvalKind: "plugin"
229
+ });
230
+ }
231
+ function isSlackPluginNativeApprovalClientEnabled(params) {
232
+ return isSlackPluginNativeApprovalClientConfigEnabled(params) || isSlackPluginForwardingRoutePotentiallyEnabled(params);
173
233
  }
174
234
  function shouldHandleSlackPluginViaNativeClientConfig(params) {
175
235
  if (!doesApprovalRequestMatchChannelAccount({
@@ -183,17 +243,37 @@ function shouldHandleSlackPluginViaNativeClientConfig(params) {
183
243
  enabled: config?.enabled,
184
244
  approverCount: getSlackApprovalApprovers(params).length
185
245
  })) return false;
186
- return matchesApprovalRequestFilters({
187
- request: params.request.request,
246
+ return matchesSlackNativeApprovalFilters({
247
+ request: params.request,
188
248
  agentFilter: config?.agentFilter,
189
249
  sessionFilter: config?.sessionFilter
190
250
  });
191
251
  }
192
- function shouldHandleSlackPluginNativeApprovalRequest(params) {
193
- if (getSlackApprovalApprovers(params).length <= 0) return false;
194
- if (shouldHandleSlackPluginViaNativeClientConfig(params)) return true;
195
- if (!isPluginForwardingEnabledForRequest(params)) return false;
196
- return canPluginForwardingRouteToSlack(params);
252
+ function matchesSlackNativeApprovalFilters(params) {
253
+ return matchesApprovalRequestFilters({
254
+ request: params.request.request,
255
+ agentFilter: params.agentFilter,
256
+ sessionFilter: params.sessionFilter
257
+ });
258
+ }
259
+ function isAnyForwardedSlackExplicitTargetEligible(params) {
260
+ return (resolvePluginApprovalForwardingConfig(params.cfg)?.targets ?? []).some((target) => isForwardedSlackExplicitTargetEligible({
261
+ ...params,
262
+ approvalKind: "plugin",
263
+ target
264
+ }));
265
+ }
266
+ function shouldHandleSlackPluginViaForwarding(params) {
267
+ return isForwardedSlackSessionApprovalEligible({
268
+ ...params,
269
+ approvalKind: "plugin"
270
+ }) || isAnyForwardedSlackExplicitTargetEligible(params);
271
+ }
272
+ function shouldHandleSlackPluginViaForwardingSession(params) {
273
+ return isForwardedSlackSessionApprovalEligible({
274
+ ...params,
275
+ approvalKind: "plugin"
276
+ });
197
277
  }
198
278
  function isSlackNativeApprovalClientEnabled(params) {
199
279
  if (params.approvalKind === "exec") return isSlackExecApprovalClientEnabled(params);
@@ -209,12 +289,7 @@ function isSlackAnyNativeApprovalClientEnabled(params) {
209
289
  });
210
290
  }
211
291
  function shouldHandleSlackNativeApprovalRequest(params) {
212
- const approvalKind = params.approvalKind ?? resolveSlackApprovalKind(params.request);
213
- if (approvalKind === "plugin") return shouldHandleSlackPluginNativeApprovalRequest({
214
- cfg: params.cfg,
215
- accountId: params.accountId,
216
- request: params.request
217
- });
292
+ if ((params.approvalKind ?? resolveSlackApprovalKind(params.request)) === "plugin") return shouldHandleSlackPluginViaNativeClientConfig(params) || shouldHandleSlackPluginViaForwarding(params);
218
293
  if (!doesApprovalRequestMatchChannelAccount({
219
294
  cfg: params.cfg,
220
295
  request: params.request,
@@ -224,13 +299,10 @@ function shouldHandleSlackNativeApprovalRequest(params) {
224
299
  const config = resolveSlackNativeApprovalConfig(params);
225
300
  if (!isChannelExecApprovalClientEnabledFromConfig({
226
301
  enabled: config?.enabled,
227
- approverCount: getSlackNativeApprovalApprovers({
228
- ...params,
229
- approvalKind
230
- }).length
302
+ approverCount: getSlackExecApprovalApprovers(params).length
231
303
  })) return false;
232
- return matchesApprovalRequestFilters({
233
- request: params.request.request,
304
+ return matchesSlackNativeApprovalFilters({
305
+ request: params.request,
234
306
  agentFilter: config?.agentFilter,
235
307
  sessionFilter: config?.sessionFilter
236
308
  });
@@ -664,4 +736,4 @@ function resolveSlackThreadTsValue(params) {
664
736
  return normalizeSlackThreadTsCandidate(params.replyToId) ?? normalizeSlackThreadTsCandidate(params.threadId);
665
737
  }
666
738
  //#endregion
667
- export { isSlackExecApprovalClientEnabled as A, isSlackAnyNativeApprovalClientEnabled as C, isSlackApprovalAuthorizedSender as D, getSlackApprovalApprovers as E, resolveSlackExecApprovalTarget as M, shouldSuppressLocalSlackExecApprovalPrompt as N, getSlackExecApprovalApprovers as O, SLACK_REPLY_SELECT_ACTION_ID as S, shouldHandleSlackNativeApprovalRequest as T, buildSlackInteractiveBlocks as _, parseSlackBlocksInput as a, truncateSlackText as b, resolveSlackGroupRequireMention as c, normalizeAllowList as d, normalizeAllowListLower as f, resolveSlackUserAllowed as g, resolveSlackAllowListMatch as h, SLACK_MAX_BLOCKS as i, normalizeSlackApproverId as j, isSlackExecApprovalAuthorizedSender as k, resolveSlackGroupToolPolicy as l, normalizeSlackSlug as m, resolveSlackThreadTsValue as n, validateSlackBlocksArray as o, normalizeSlackAllowOwnerEntry as p, resolveSlackReplyBlocks as r, SLACK_TEXT_LIMIT as s, normalizeSlackThreadTsCandidate as t, allowListMatches as u, buildSlackPresentationBlocks as v, resolveSlackApprovalKind as w, SLACK_REPLY_BUTTON_ACTION_ID as x, resolveSlackInteractiveBlockOffsets as y };
739
+ export { resolveTurnSourceSlackOriginTarget as A, resolveSlackExecApprovalTarget as B, hasSlackPluginApprovers as C, resolveSessionSlackOriginTarget as D, normalizeSlackOriginTarget as E, isSlackApprovalAuthorizedSender as F, getSlackExecApprovalApprovers as I, isSlackExecApprovalAuthorizedSender as L, shouldHandleSlackPluginViaForwardingSession as M, slackTargetsMatch as N, resolveSlackApprovalKind as O, getSlackApprovalApprovers as P, isSlackExecApprovalClientEnabled as R, SLACK_REPLY_SELECT_ACTION_ID as S, normalizeSlackForwardTarget as T, shouldSuppressLocalSlackExecApprovalPrompt as V, buildSlackInteractiveBlocks as _, parseSlackBlocksInput as a, truncateSlackText as b, resolveSlackGroupRequireMention as c, normalizeAllowList as d, normalizeAllowListLower as f, resolveSlackUserAllowed as g, resolveSlackAllowListMatch as h, SLACK_MAX_BLOCKS as i, shouldHandleSlackNativeApprovalRequest as j, resolveSlackFallbackOriginTarget as k, resolveSlackGroupToolPolicy as l, normalizeSlackSlug as m, resolveSlackThreadTsValue as n, validateSlackBlocksArray as o, normalizeSlackAllowOwnerEntry as p, resolveSlackReplyBlocks as r, SLACK_TEXT_LIMIT as s, normalizeSlackThreadTsCandidate as t, allowListMatches as u, buildSlackPresentationBlocks as v, isSlackAnyNativeApprovalClientEnabled as w, SLACK_REPLY_BUTTON_ACTION_ID as x, resolveSlackInteractiveBlockOffsets as y, normalizeSlackApproverId as z };
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@openclaw/slack",
3
- "version": "2026.5.31-beta.4",
3
+ "version": "2026.6.1-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/slack",
9
- "version": "2026.5.31-beta.4",
9
+ "version": "2026.6.1-beta.2",
10
10
  "dependencies": {
11
11
  "@slack/bolt": "4.7.3",
12
12
  "@slack/types": "2.21.1",
@@ -15,7 +15,7 @@
15
15
  "zod": "4.4.3"
16
16
  },
17
17
  "peerDependencies": {
18
- "openclaw": ">=2026.5.31-beta.4"
18
+ "openclaw": ">=2026.6.1-beta.2"
19
19
  },
20
20
  "peerDependenciesMeta": {
21
21
  "openclaw": {
@@ -8,18 +8,6 @@
8
8
  "channels": [
9
9
  "slack"
10
10
  ],
11
- "channelEnvVars": {
12
- "slack": [
13
- "SLACK_BOT_TOKEN",
14
- "SLACK_APP_TOKEN",
15
- "SLACK_USER_TOKEN"
16
- ]
17
- },
18
- "configSchema": {
19
- "type": "object",
20
- "additionalProperties": false,
21
- "properties": {}
22
- },
23
11
  "channelConfigs": {
24
12
  "slack": {
25
13
  "schema": {
@@ -2427,7 +2415,7 @@
2427
2415
  "additionalProperties": false
2428
2416
  },
2429
2417
  "label": "Slack",
2430
- "description": "supported (Socket Mode).",
2418
+ "description": "Slack channel, DM, command, and app event integration.",
2431
2419
  "uiHints": {
2432
2420
  "": {
2433
2421
  "label": "Slack",
@@ -2635,5 +2623,17 @@
2635
2623
  }
2636
2624
  }
2637
2625
  }
2626
+ },
2627
+ "channelEnvVars": {
2628
+ "slack": [
2629
+ "SLACK_BOT_TOKEN",
2630
+ "SLACK_APP_TOKEN",
2631
+ "SLACK_USER_TOKEN"
2632
+ ]
2633
+ },
2634
+ "configSchema": {
2635
+ "type": "object",
2636
+ "additionalProperties": false,
2637
+ "properties": {}
2638
2638
  }
2639
2639
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/slack",
3
- "version": "2026.5.31-beta.4",
3
+ "version": "2026.6.1-beta.2",
4
4
  "description": "OpenClaw Slack channel plugin for channels, DMs, commands, and app events.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,7 +15,7 @@
15
15
  "zod": "4.4.3"
16
16
  },
17
17
  "peerDependencies": {
18
- "openclaw": ">=2026.5.31-beta.4"
18
+ "openclaw": ">=2026.6.1-beta.2"
19
19
  },
20
20
  "peerDependenciesMeta": {
21
21
  "openclaw": {
@@ -60,13 +60,13 @@
60
60
  "allowInvalidConfigRecovery": true
61
61
  },
62
62
  "compat": {
63
- "pluginApi": ">=2026.5.31-beta.4"
63
+ "pluginApi": ">=2026.6.1-beta.2"
64
64
  },
65
65
  "startup": {
66
66
  "deferConfiguredChannelFullLoadUntilAfterListen": true
67
67
  },
68
68
  "build": {
69
- "openclawVersion": "2026.5.31-beta.4",
69
+ "openclawVersion": "2026.6.1-beta.2",
70
70
  "bundledDist": false
71
71
  },
72
72
  "release": {
@@ -1,2 +0,0 @@
1
- import { t as handleSlackAction } from "./action-runtime-Cg2tZbNu.js";
2
- export { handleSlackAction };
@@ -1,2 +0,0 @@
1
- import { t as sendMessageSlack } from "./send-DzphzfbK.js";
2
- export { sendMessageSlack };