@openclaw/slack 2026.8.2 → 2026.9.1

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 (36) hide show
  1. package/dist/{action-runtime-B0kRJ69h.js → action-runtime-DND4Pyp2.js} +4 -4
  2. package/dist/action-runtime.runtime-CEhbmS-Z.js +2 -0
  3. package/dist/{actions-BOxiu2Vy.js → actions-fh66A6lc.js} +2 -2
  4. package/dist/api.js +8 -8
  5. package/dist/{approval-handler.runtime-l5_2JLqi.js → approval-handler.runtime-D7d8sKM0.js} +13 -8
  6. package/dist/{channel-BguxhhNG.js → channel-4m8IAdMD.js} +28 -23
  7. package/dist/channel-config-api.js +1 -1
  8. package/dist/channel-plugin-api.js +1 -1
  9. package/dist/{channel-type-ChkODKBW.js → channel-type-3-SqEMVc.js} +1 -1
  10. package/dist/{channel.setup-BJohRJha.js → channel.setup-t_ghLGb_.js} +2 -2
  11. package/dist/{config-schema-B9GwoRlE.js → config-schema-bP3eV2ra.js} +1 -1
  12. package/dist/{cursor-pages-eX7p8Wwt.js → cursor-pages-ByFwo-Py.js} +7 -1
  13. package/dist/{directory-live-BOILcXPo.js → directory-live-q32AW7N1.js} +2 -7
  14. package/dist/{group-policy-BYH74y50.js → group-policy-BKjMqT-8.js} +46 -87
  15. package/dist/{message-tool-api-BsZbsulu.js → message-tool-api-uNEfQYGY.js} +1 -1
  16. package/dist/message-tool-api.js +1 -1
  17. package/dist/{monitor-B72wWXWg.js → monitor-Chwu_SiZ.js} +3 -3
  18. package/dist/{outbound-adapter-CPgYQ-BM.js → outbound-adapter-BB8wAjm5.js} +3 -3
  19. package/dist/{pipeline.runtime-CcdujV99.js → pipeline.runtime-BklS_NEj.js} +61 -95
  20. package/dist/{policy-CUpBeOt9.js → policy-D7PKkiet.js} +1 -1
  21. package/dist/{provider-DW9YC_no.js → provider-Do50wMWn.js} +52 -35
  22. package/dist/{relay-source-BLMdBrAw.js → relay-source-DWuduiJ2.js} +1 -1
  23. package/dist/{replies-DLjQ8RYU.js → replies-Dc6WVh_Q.js} +9 -10
  24. package/dist/{resolve-channels-Bv6IiGZ4.js → resolve-channels-CU7Bg5Ka.js} +2 -7
  25. package/dist/{resolve-users-BXw2pA7y.js → resolve-users-DrhttvRQ.js} +1 -1
  26. package/dist/runtime-api.js +9 -9
  27. package/dist/{send-GUz4_v2E.js → send-Djswy6lf.js} +2 -2
  28. package/dist/{send.runtime-rScD-UJi.js → send.runtime-__WVTWLQ.js} +1 -1
  29. package/dist/setup-plugin-api.js +1 -1
  30. package/dist/{setup-surface-Cc3P-z35.js → setup-surface-DO0e-MMS.js} +4 -4
  31. package/dist/{shared-CQGVZ_8a.js → shared-DEQBEKBL.js} +1 -1
  32. package/dist/{slash-dispatch.runtime-C2015r6s.js → slash-dispatch.runtime-C3B4h5ZM.js} +1 -1
  33. package/dist/{thread-ts-DUGhaYKq.js → thread-ts-CukseRVL.js} +5 -1
  34. package/openclaw.plugin.json +1 -1
  35. package/package.json +4 -4
  36. package/dist/action-runtime.runtime-IuA14rev.js +0 -2
@@ -1,7 +1,7 @@
1
1
  import { a as parseSlackTarget, n as formatSlackTarget, o as resolveSlackChannelId } from "./target-parsing-PbxGDbr9.js";
2
2
  import { t as slackContextTargetsMatch } from "./targets-7FexXJ62.js";
3
- import { At as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, b as hasSlackNativeDataBlock, c as assertSlackDetachedTargetAllowed, jt as resolveSlackAutoThreadId, ot as parseSlackBlocksInput, t as buildSlackChannelIdCandidates, yt as getSlackInstallationKind } from "./group-policy-BYH74y50.js";
4
- import { n as resolveSlackChannelConfig, t as isSlackChannelAllowedByPolicy } from "./policy-CUpBeOt9.js";
3
+ import { At as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, b as hasSlackNativeDataBlock, c as assertSlackDetachedTargetAllowed, jt as resolveSlackAutoThreadId, ot as parseSlackBlocksInput, t as buildSlackChannelIdCandidates, yt as getSlackInstallationKind } from "./group-policy-BKjMqT-8.js";
4
+ import { n as resolveSlackChannelConfig, t as isSlackChannelAllowedByPolicy } from "./policy-D7PKkiet.js";
5
5
  import { t as mergeSlackSendResults } from "./send-results-eeOu_HYm.js";
6
6
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
7
7
  import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -27,9 +27,9 @@ const pinActions = /* @__PURE__ */ new Set([
27
27
  "listPins"
28
28
  ]);
29
29
  const SLACK_REACTION_RESULT_LIMIT = 100;
30
- const loadSlackActionsRuntime = createLazyRuntimeModule(() => import("./actions-BOxiu2Vy.js").then((n) => n.t));
30
+ const loadSlackActionsRuntime = createLazyRuntimeModule(() => import("./actions-fh66A6lc.js").then((n) => n.t));
31
31
  const loadSlackAccountsRuntime = createLazyRuntimeModule(() => import("./accounts.runtime-DRuEK6mL.js"));
32
- const loadSlackChannelTypeRuntime = createLazyRuntimeModule(() => import("./channel-type-ChkODKBW.js").then((n) => n.t));
32
+ const loadSlackChannelTypeRuntime = createLazyRuntimeModule(() => import("./channel-type-3-SqEMVc.js").then((n) => n.t));
33
33
  function createLazySlackAction(key) {
34
34
  return (async (...args) => {
35
35
  const action = (await loadSlackActionsRuntime())[key];
@@ -0,0 +1,2 @@
1
+ import { t as handleSlackAction } from "./action-runtime-DND4Pyp2.js";
2
+ export { handleSlackAction };
@@ -1,9 +1,9 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { a as resolveSlackAccount, f as resolveSlackBotToken, i as resolveDefaultSlackAccountId } from "./accounts-Dm_H77gH.js";
3
3
  import { n as formatSlackTarget } from "./target-parsing-PbxGDbr9.js";
4
- import { At as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, D as renderSlackBlockFallbackText, E as buildSlackCompleteBlocksFallbackText, I as countSlackTextUtf8Bytes, Q as normalizeSlackOutboundText, R as truncateSlackTextByUtf8Bytes, T as buildSlackBlocksFallbackText, _ as appendSlackNativeDataPlainTextFallback, b as hasSlackNativeDataBlock, c as assertSlackDetachedTargetAllowed, et as escapeSlackMrkdwn, g as appendSlackNativeDataFallbackText, k as SLACK_EDIT_TEXT_MAX_BYTES, st as validateSlackBlocksArray, w as stripSlackNativeDataBlocks, x as isSlackInvalidBlocksError } from "./group-policy-BYH74y50.js";
4
+ import { At as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, D as renderSlackBlockFallbackText, E as buildSlackCompleteBlocksFallbackText, I as countSlackTextUtf8Bytes, Q as normalizeSlackOutboundText, R as truncateSlackTextByUtf8Bytes, T as buildSlackBlocksFallbackText, _ as appendSlackNativeDataPlainTextFallback, b as hasSlackNativeDataBlock, c as assertSlackDetachedTargetAllowed, et as escapeSlackMrkdwn, g as appendSlackNativeDataFallbackText, k as SLACK_EDIT_TEXT_MAX_BYTES, st as validateSlackBlocksArray, w as stripSlackNativeDataBlocks, x as isSlackInvalidBlocksError } from "./group-policy-BKjMqT-8.js";
5
5
  import { m as getSlackWriteClient, s as createSlackLookupClient } from "./probe-gj5yQgN2.js";
6
- import { m as buildSlackNativeDataDeliveryPlan, r as sendMessageSlack } from "./send-GUz4_v2E.js";
6
+ import { m as buildSlackNativeDataDeliveryPlan, r as sendMessageSlack } from "./send-Djswy6lf.js";
7
7
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
8
8
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
9
9
  import { createSubsystemLogger, logVerbose, logVerbose as logVerbose$1 } from "openclaw/plugin-sdk/runtime-env";
package/dist/api.js CHANGED
@@ -4,15 +4,15 @@ import { r as resolveSlackReplyToMode } from "./conversation-binding-route-Vee8D
4
4
  import { t as inspectSlackAccount } from "./account-inspect-C3sePHWa.js";
5
5
  import { a as parseSlackTarget, i as normalizeSlackMessagingTarget, o as resolveSlackChannelId, r as looksLikeSlackTargetId } from "./target-parsing-PbxGDbr9.js";
6
6
  import "./targets-7FexXJ62.js";
7
- import { N as buildSlackInteractiveBlocks, P as buildSlackPresentationBlocks, at as SLACK_MAX_BLOCKS, i as resolveSlackGroupToolPolicy, jt as resolveSlackAutoThreadId, ot as parseSlackBlocksInput, r as resolveSlackGroupRequireMention, st as validateSlackBlocksArray } from "./group-policy-BYH74y50.js";
7
+ import { N as buildSlackInteractiveBlocks, P as buildSlackPresentationBlocks, at as SLACK_MAX_BLOCKS, i as resolveSlackGroupToolPolicy, jt as resolveSlackAutoThreadId, ot as parseSlackBlocksInput, r as resolveSlackGroupRequireMention, st as validateSlackBlocksArray } from "./group-policy-BKjMqT-8.js";
8
8
  import { C as normalizeAllowListLower, E as resolveSlackAllowListMatch, O as resolveSlackUserAllowed, S as normalizeAllowList, T as normalizeSlackSlug, b as resolveSlackWriteClientOptions, d as createSlackWebClient, f as createSlackWriteClient, g as SLACK_WRITE_RETRY_OPTIONS, h as SLACK_DEFAULT_RETRY_OPTIONS, m as getSlackWriteClient, t as probeSlack, u as createSlackTokenCacheKey, w as normalizeSlackAllowOwnerEntry, x as allowListMatches, y as resolveSlackWebClientOptions } from "./probe-gj5yQgN2.js";
9
- import { n as buildSlackThreadingToolContext, t as slackPlugin } from "./channel-BguxhhNG.js";
10
- import { n as extractSlackToolSend, r as listSlackMessageActions } from "./message-tool-api-BsZbsulu.js";
11
- import { n as resolveSlackChannelType } from "./channel-type-ChkODKBW.js";
12
- import { t as slackSetupPlugin } from "./channel.setup-BJohRJha.js";
13
- import { c as listSlackPins, d as reactSlackMessage, f as readSlackMessages, g as unpinSlackMessage, h as sendSlackMessage, i as editSlackMessage, l as listSlackReactions, m as removeSlackReaction, n as deleteSlackMessage, o as getSlackMemberInfo, p as removeOwnSlackReactions, r as downloadSlackFile, s as listSlackEmojis, u as pinSlackMessage } from "./actions-BOxiu2Vy.js";
14
- import { f as recordSlackThreadParticipation, l as hasSlackThreadParticipation, s as clearSlackThreadParticipationCache } from "./send-GUz4_v2E.js";
9
+ import { n as buildSlackThreadingToolContext, t as slackPlugin } from "./channel-4m8IAdMD.js";
10
+ import { n as extractSlackToolSend, r as listSlackMessageActions } from "./message-tool-api-uNEfQYGY.js";
11
+ import { n as resolveSlackChannelType } from "./channel-type-3-SqEMVc.js";
12
+ import { t as slackSetupPlugin } from "./channel.setup-t_ghLGb_.js";
13
+ import { c as listSlackPins, d as reactSlackMessage, f as readSlackMessages, g as unpinSlackMessage, h as sendSlackMessage, i as editSlackMessage, l as listSlackReactions, m as removeSlackReaction, n as deleteSlackMessage, o as getSlackMemberInfo, p as removeOwnSlackReactions, r as downloadSlackFile, s as listSlackEmojis, u as pinSlackMessage } from "./actions-fh66A6lc.js";
14
+ import { f as recordSlackThreadParticipation, l as hasSlackThreadParticipation, s as clearSlackThreadParticipationCache } from "./send-Djswy6lf.js";
15
15
  import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./directory-config-Bmw4ykSy.js";
16
16
  import { t as collectSlackSecurityAuditFindings } from "./security-audit-B_yKr7MW.js";
17
- import { n as resolveSlackRuntimeGroupPolicy } from "./provider-DW9YC_no.js";
17
+ import { n as resolveSlackRuntimeGroupPolicy } from "./provider-Do50wMWn.js";
18
18
  export { SLACK_DEFAULT_RETRY_OPTIONS, SLACK_MAX_BLOCKS, SLACK_WRITE_RETRY_OPTIONS, allowListMatches, buildSlackInteractiveBlocks, buildSlackPresentationBlocks, buildSlackThreadingToolContext, clearSlackThreadParticipationCache, collectSlackSecurityAuditFindings, createSlackTokenCacheKey, createSlackWebClient, createSlackWriteClient, deleteSlackMessage, downloadSlackFile, editSlackMessage, extractSlackToolSend, getSlackMemberInfo, getSlackWriteClient, handleSlackHttpRequest, hasSlackThreadParticipation, inspectSlackAccount, listEnabledSlackAccounts, listSlackAccountIds, listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig, listSlackEmojis, listSlackMessageActions, listSlackPins, listSlackReactions, looksLikeSlackTargetId, mergeSlackAccountConfig, normalizeAllowList, normalizeAllowListLower, normalizeSlackAllowOwnerEntry, normalizeSlackMessagingTarget, normalizeSlackSlug, normalizeSlackWebhookPath, parseSlackBlocksInput, 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,6 +1,6 @@
1
1
  import { a as parseSlackTarget } from "./target-parsing-PbxGDbr9.js";
2
- import { Dt as normalizeSlackApproverId, R as truncateSlackTextByUtf8Bytes, f as resolveSlackReplyBlocks, gt as shouldHandleSlackNativeApprovalRequest, k as SLACK_EDIT_TEXT_MAX_BYTES, lt as isSlackAnyNativeApprovalClientEnabled, tt as SLACK_APPROVAL_HEADER_BLOCK_ID } from "./group-policy-BYH74y50.js";
3
- import { r as sendMessageSlack } from "./send-GUz4_v2E.js";
2
+ import { Dt as normalizeSlackApproverId, R as truncateSlackTextByUtf8Bytes, f as resolveSlackReplyBlocks, gt as shouldHandleSlackNativeApprovalRequest, k as SLACK_EDIT_TEXT_MAX_BYTES, lt as isSlackAnyNativeApprovalClientEnabled, tt as SLACK_APPROVAL_HEADER_BLOCK_ID } from "./group-policy-BKjMqT-8.js";
3
+ import { r as sendMessageSlack } from "./send-Djswy6lf.js";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { buildChannelApprovalNativeTargetKey } from "openclaw/plugin-sdk/approval-native-runtime";
6
6
  import { buildApprovalPresentationFromActionDescriptors } from "openclaw/plugin-sdk/approval-reply-runtime";
@@ -93,14 +93,15 @@ function buildSlackPluginRequestBlocks(view) {
93
93
  function buildSlackApprovalPayload(input) {
94
94
  const { phase, view } = input;
95
95
  const isPlugin = view.approvalKind === "plugin";
96
- const approvalName = isPlugin ? "Plugin" : "Exec";
96
+ const isSystemAgent = view.approvalKind === "system-agent";
97
+ const approvalName = isPlugin ? "Plugin" : isSystemAgent ? "OpenClaw change" : "Exec";
97
98
  let heading;
98
99
  let description;
99
100
  if (phase === "pending") {
100
101
  heading = `*${approvalName} approval required*`;
101
- description = view.approvalKind === "plugin" ? resolveSlackPluginDescription(view) : "A command needs your approval.";
102
+ description = view.approvalKind === "plugin" ? resolveSlackPluginDescription(view) : isSystemAgent ? "An OpenClaw change needs your approval." : "A command needs your approval.";
102
103
  } else if (phase === "resolved") {
103
- heading = `*${approvalName} approval: ${resolveSlackApprovalDecisionLabel(view.decision)}*`;
104
+ heading = `*${approvalName} approval: ${isSystemAgent && view.terminalStatus === "cancelled" ? "Cancelled" : isSystemAgent && view.applicationStatus === "applied" ? "Applied" : isSystemAgent && view.applicationStatus === "not-applied" ? "Not applied" : resolveSlackApprovalDecisionLabel(view.decision)}*`;
104
105
  const resolvedBy = formatSlackApprover(view.resolvedBy);
105
106
  description = resolvedBy ? `Resolved by ${resolvedBy}.` : "Resolved.";
106
107
  } else {
@@ -108,7 +109,7 @@ function buildSlackApprovalPayload(input) {
108
109
  description = "This approval request expired before it was resolved.";
109
110
  }
110
111
  const metadata = isPlugin ? buildSlackPluginMetadata(view) : view.metadata;
111
- const bodyLabel = isPlugin ? "*Request*" : "*Command*";
112
+ const bodyLabel = isPlugin ? "*Request*" : isSystemAgent ? "*Change*" : "*Command*";
112
113
  const bodyText = isPlugin ? view.title : buildSlackCodeBlock(view.commandText);
113
114
  const text = [
114
115
  heading,
@@ -130,7 +131,7 @@ function buildSlackApprovalPayload(input) {
130
131
  type: "section",
131
132
  text: {
132
133
  type: "mrkdwn",
133
- text: `*Command*\n${buildSlackCodeBlock(truncateSlackMrkdwn(view.commandText, 2600))}`
134
+ text: `${bodyLabel}\n${buildSlackCodeBlock(truncateSlackMrkdwn(view.commandText, 2600))}`
134
135
  }
135
136
  }, ...phase === "pending" ? buildSlackMetadataContextBlocks(view.metadata) : []]];
136
137
  if (phase === "pending") blocks.push(...resolveSlackReplyBlocks({
@@ -155,7 +156,11 @@ async function updateMessage(params) {
155
156
  }
156
157
  }
157
158
  const slackApprovalNativeRuntime = createChannelApprovalNativeRuntimeAdapter({
158
- eventKinds: ["exec", "plugin"],
159
+ eventKinds: [
160
+ "exec",
161
+ "plugin",
162
+ "system-agent"
163
+ ],
159
164
  availability: {
160
165
  isConfigured: (params) => {
161
166
  const resolved = resolveHandlerContext(params);
@@ -3,14 +3,14 @@ import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, l as resol
3
3
  import { n as resolveSlackConversationBindingRoute, r as resolveSlackReplyToMode, t as normalizeSlackRouteBindingConfig } from "./conversation-binding-route-Vee8Dgbf.js";
4
4
  import { a as parseSlackTarget, i as normalizeSlackMessagingTarget, n as formatSlackTarget, o as resolveSlackChannelId, r as looksLikeSlackTargetId, t as canonicalizeSlackApiTargetId } from "./target-parsing-PbxGDbr9.js";
5
5
  import { t as slackContextTargetsMatch } from "./targets-7FexXJ62.js";
6
- import { $ as renderSlackMessagePresentationFallbackText, Ct as isSlackApprovalAuthorizedSender, Et as isSlackExecApprovalClientEnabled, F as canRenderSlackPresentation, I as countSlackTextUtf8Bytes, M as SLACK_TEXT_LIMIT, Ot as resolveSlackExecApprovalTarget, P as buildSlackPresentationBlocks, Q as normalizeSlackOutboundText, St as getSlackApprovalApproversForTeam, Tt as isSlackExecApprovalAuthorizedSender, _t as shouldHandleSlackPluginViaForwardingSession, a as qualifySlackConversationId, bt as isSlackWorkspaceInstallation, c as assertSlackDetachedTargetAllowed, ct as hasSlackPluginApprovers, d as resolveSlackReplyBlockResolution, dt as normalizeSlackOriginTarget, f as resolveSlackReplyBlocks, ft as resolveEnterpriseApprovalTeamId, gt as shouldHandleSlackNativeApprovalRequest, ht as resolveTurnSourceSlackOriginTarget, i as resolveSlackGroupToolPolicy, jt as resolveSlackAutoThreadId, k as SLACK_EDIT_TEXT_MAX_BYTES, kt as shouldSuppressLocalSlackExecApprovalPrompt, lt as isSlackAnyNativeApprovalClientEnabled, mt as resolveSlackFallbackOriginTarget, o as qualifySlackRoutePeerId, p as resolveSlackReplyDeliveryMessages, pt as resolveSessionSlackOriginTarget, r as resolveSlackGroupRequireMention, rt as SLACK_PRESENTATION_CAPABILITIES, ut as normalizeSlackForwardTarget, vt as slackTargetsMatch, wt as getSlackExecApprovalApprovers, yt as getSlackInstallationKind } from "./group-policy-BYH74y50.js";
6
+ import { $ as renderSlackMessagePresentationFallbackText, Ct as isSlackApprovalAuthorizedSender, Et as isSlackExecApprovalClientEnabled, F as canRenderSlackPresentation, I as countSlackTextUtf8Bytes, M as SLACK_TEXT_LIMIT, Ot as resolveSlackExecApprovalTarget, P as buildSlackPresentationBlocks, Q as normalizeSlackOutboundText, St as getSlackApprovalApproversForTeam, Tt as isSlackExecApprovalAuthorizedSender, _t as shouldHandleSlackPluginViaForwardingSession, a as qualifySlackConversationId, bt as isSlackWorkspaceInstallation, c as assertSlackDetachedTargetAllowed, ct as hasSlackPluginApprovers, d as resolveSlackReplyBlockResolution, dt as normalizeSlackOriginTarget, f as resolveSlackReplyBlocks, ft as resolveEnterpriseApprovalTeamId, gt as shouldHandleSlackNativeApprovalRequest, ht as resolveTurnSourceSlackOriginTarget, i as resolveSlackGroupToolPolicy, jt as resolveSlackAutoThreadId, k as SLACK_EDIT_TEXT_MAX_BYTES, kt as shouldSuppressLocalSlackExecApprovalPrompt, lt as isSlackAnyNativeApprovalClientEnabled, mt as resolveSlackFallbackOriginTarget, o as qualifySlackRoutePeerId, p as resolveSlackReplyDeliveryMessages, pt as resolveSessionSlackOriginTarget, r as resolveSlackGroupRequireMention, rt as SLACK_PRESENTATION_CAPABILITIES, ut as normalizeSlackForwardTarget, vt as slackTargetsMatch, wt as getSlackExecApprovalApprovers, yt as getSlackInstallationKind } from "./group-policy-BKjMqT-8.js";
7
7
  import { m as getSlackWriteClient, o as formatSlackError } from "./probe-gj5yQgN2.js";
8
- import { n as resolveSlackThreadTsValue, t as normalizeSlackThreadTsCandidate } from "./thread-ts-DUGhaYKq.js";
9
- import { n as extractSlackToolSend, t as describeSlackMessageTool } from "./message-tool-api-BsZbsulu.js";
10
- import { a as PAIRING_APPROVED_MESSAGE, i as DEFAULT_ACCOUNT_ID$1, n as slackConfigAdapter, o as projectCredentialSnapshotFields, r as slackSecurityAdapter, s as resolveConfiguredFromRequiredCredentialStatuses, t as createSlackPluginBase } from "./shared-CQGVZ_8a.js";
11
- import { n as resolveSlackChannelType, r as resolveSlackConversationInfo } from "./channel-type-ChkODKBW.js";
8
+ import { n as resolveSlackReplyThreadTs, r as resolveSlackThreadTsValue, t as normalizeSlackThreadTsCandidate } from "./thread-ts-CukseRVL.js";
9
+ import { n as extractSlackToolSend, t as describeSlackMessageTool } from "./message-tool-api-uNEfQYGY.js";
10
+ import { a as PAIRING_APPROVED_MESSAGE, i as DEFAULT_ACCOUNT_ID$1, n as slackConfigAdapter, o as projectCredentialSnapshotFields, r as slackSecurityAdapter, s as resolveConfiguredFromRequiredCredentialStatuses, t as createSlackPluginBase } from "./shared-DEQBEKBL.js";
11
+ import { n as resolveSlackChannelType, r as resolveSlackConversationInfo } from "./channel-type-3-SqEMVc.js";
12
12
  import { t as getOptionalSlackRuntime } from "./runtime-JSVZSWAj.js";
13
- import { a as slackSetupContract, i as createSlackSetupWizardProxy, o as SLACK_CHANNEL } from "./channel.setup-BJohRJha.js";
13
+ import { a as slackSetupContract, i as createSlackSetupWizardProxy, o as SLACK_CHANNEL } from "./channel.setup-t_ghLGb_.js";
14
14
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
15
15
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
16
16
  import { adaptScopedAccountAccessor } from "openclaw/plugin-sdk/channel-config-helpers";
@@ -126,7 +126,11 @@ const baseSlackApprovalCapability = createApproverRestrictedNativeApprovalCapabi
126
126
  resolveApproverDmTargets: resolveSlackApproverDmTargets,
127
127
  notifyOriginWhenDmOnly: true,
128
128
  nativeRuntime: createLazyChannelApprovalNativeRuntimeAdapter({
129
- eventKinds: ["exec", "plugin"],
129
+ eventKinds: [
130
+ "exec",
131
+ "plugin",
132
+ "system-agent"
133
+ ],
130
134
  isConfigured: ({ cfg, accountId }) => isSlackAnyNativeApprovalClientEnabled({
131
135
  cfg,
132
136
  accountId
@@ -137,7 +141,7 @@ const baseSlackApprovalCapability = createApproverRestrictedNativeApprovalCapabi
137
141
  approvalKind,
138
142
  request
139
143
  }),
140
- load: async () => (await import("./approval-handler.runtime-l5_2JLqi.js")).slackApprovalNativeRuntime
144
+ load: async () => (await import("./approval-handler.runtime-D7d8sKM0.js")).slackApprovalNativeRuntime
141
145
  })
142
146
  });
143
147
  const baseSlackNativeAdapter = baseSlackApprovalCapability.native;
@@ -421,7 +425,7 @@ const SLACK_TOOL_DELIVERY_ACTIONS = /* @__PURE__ */ new Set([
421
425
  "unpinMessage",
422
426
  "uploadFile"
423
427
  ]);
424
- const loadSlackActionRuntime$1 = createLazyRuntimeModule(() => import("./action-runtime.runtime-IuA14rev.js"));
428
+ const loadSlackActionRuntime$1 = createLazyRuntimeModule(() => import("./action-runtime.runtime-CEhbmS-Z.js"));
425
429
  function resolveSlackActionContext(ctx, toolContext) {
426
430
  if (!toolContext && !ctx.mediaAccess && !ctx.mediaLocalRoots && !ctx.mediaReadFile && !ctx.conversationReadOrigin && !ctx.requesterAccountId && !ctx.requesterSenderId) return;
427
431
  return {
@@ -563,9 +567,9 @@ const EXTENSION_SHARED_MODULE_ID = "openclaw/plugin-sdk/extension-shared";
563
567
  const TARGET_RESOLVER_RUNTIME_MODULE_ID = "openclaw/plugin-sdk/target-resolver-runtime";
564
568
  const loadExtensionSharedSdk = createLazyRuntimeModule(() => import(EXTENSION_SHARED_MODULE_ID));
565
569
  const loadTargetResolverRuntimeSdk = createLazyRuntimeModule(() => import(TARGET_RESOLVER_RUNTIME_MODULE_ID));
566
- const loadSlackSetupSurfaceModule = createLazyRuntimeModule(() => import("./setup-surface-Cc3P-z35.js"));
570
+ const loadSlackSetupSurfaceModule = createLazyRuntimeModule(() => import("./setup-surface-DO0e-MMS.js"));
567
571
  const loadSlackScopesModule = createLazyRuntimeModule(() => import("./scopes-B9HRguDe.js"));
568
- const loadSlackOutboundAdapterModule = createLazyRuntimeModule(() => import("./outbound-adapter-CPgYQ-BM.js"));
572
+ const loadSlackOutboundAdapterModule = createLazyRuntimeModule(() => import("./outbound-adapter-BB8wAjm5.js"));
569
573
  async function resolveSlackHandleAction() {
570
574
  return getOptionalSlackRuntime()?.channel?.slack?.handleSlackAction ?? (await loadSlackActionRuntime()).handleSlackAction;
571
575
  }
@@ -573,13 +577,13 @@ function shouldTreatSlackDeliveredTextAsVisible(params) {
573
577
  return params.kind === "block" && typeof params.text === "string" && params.text.trim().length > 0;
574
578
  }
575
579
  const loadSlackDirectoryConfigModule = createLazyRuntimeModule(() => import("./directory-config-Bmw4ykSy.js").then((n) => n.t));
576
- const loadSlackResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-Bv6IiGZ4.js").then((n) => n.n));
577
- const loadSlackResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-BXw2pA7y.js").then((n) => n.n));
578
- const loadSlackActionRuntime = createLazyRuntimeModule(() => import("./action-runtime.runtime-IuA14rev.js"));
579
- const loadSlackSendRuntime = createLazyRuntimeModule(() => import("./send.runtime-rScD-UJi.js"));
580
+ const loadSlackResolveChannelsModule = createLazyRuntimeModule(() => import("./resolve-channels-CU7Bg5Ka.js").then((n) => n.n));
581
+ const loadSlackResolveUsersModule = createLazyRuntimeModule(() => import("./resolve-users-DrhttvRQ.js").then((n) => n.n));
582
+ const loadSlackActionRuntime = createLazyRuntimeModule(() => import("./action-runtime.runtime-CEhbmS-Z.js"));
583
+ const loadSlackSendRuntime = createLazyRuntimeModule(() => import("./send.runtime-__WVTWLQ.js"));
580
584
  const loadSlackProbeModule = createLazyRuntimeModule(() => import("./probe-gj5yQgN2.js").then((n) => n.n));
581
- const loadSlackMonitorModule = createLazyRuntimeModule(() => import("./monitor-B72wWXWg.js").then((n) => n.t));
582
- const loadSlackDirectoryLiveModule = createLazyRuntimeModule(() => import("./directory-live-BOILcXPo.js").then((n) => n.t));
585
+ const loadSlackMonitorModule = createLazyRuntimeModule(() => import("./monitor-Chwu_SiZ.js").then((n) => n.t));
586
+ const loadSlackDirectoryLiveModule = createLazyRuntimeModule(() => import("./directory-live-q32AW7N1.js").then((n) => n.t));
583
587
  async function setSlackHeartbeatThreadStatus(params) {
584
588
  const threadTs = resolveSlackThreadTsValue({ threadId: params.threadId });
585
589
  const target = parseSlackTarget(params.to, { defaultKind: "channel" });
@@ -1141,12 +1145,13 @@ const slackPlugin = createChatChannelPlugin({
1141
1145
  to,
1142
1146
  toolContext
1143
1147
  })),
1144
- resolveReplyTransport: ({ threadId, replyToId, replyToIsExplicit, replyDelivery }) => {
1145
- const allowedReplyToId = replyDelivery?.replyToMode === "off" ? void 0 : replyToId;
1146
- const preferThreadId = replyToIsExplicit === false;
1147
- const resolvedReplyToId = resolveSlackThreadTsValue({
1148
- replyToId: preferThreadId ? threadId : allowedReplyToId,
1149
- threadId: preferThreadId ? allowedReplyToId : threadId
1148
+ resolveReplyTransport: ({ threadId, replyToId, replyToIsExplicit, replyToCurrent, replyDelivery }) => {
1149
+ const resolvedReplyToId = resolveSlackReplyThreadTs({
1150
+ replyToId: normalizeSlackThreadTsCandidate(replyToId),
1151
+ threadId: normalizeSlackThreadTsCandidate(threadId),
1152
+ replyToMode: replyDelivery?.replyToMode,
1153
+ replyToIsExplicit,
1154
+ replyToCurrent
1150
1155
  });
1151
1156
  return {
1152
1157
  replyToId: replyDelivery?.replyToMode === "off" && !resolvedReplyToId ? null : resolvedReplyToId,
@@ -1,2 +1,2 @@
1
- import { t as SlackChannelConfigSchema } from "./config-schema-B9GwoRlE.js";
1
+ import { t as SlackChannelConfigSchema } from "./config-schema-bP3eV2ra.js";
2
2
  export { SlackChannelConfigSchema };
@@ -1,2 +1,2 @@
1
- import { t as slackPlugin } from "./channel-BguxhhNG.js";
1
+ import { t as slackPlugin } from "./channel-4m8IAdMD.js";
2
2
  export { slackPlugin };
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { a as resolveSlackAccount, l as resolveSlackOperationToken } from "./accounts-Dm_H77gH.js";
3
- import { c as assertSlackDetachedTargetAllowed } from "./group-policy-BYH74y50.js";
3
+ import { c as assertSlackDetachedTargetAllowed } from "./group-policy-BKjMqT-8.js";
4
4
  import { C as normalizeAllowListLower, c as createSlackReadClient, d as createSlackWebClient } from "./probe-gj5yQgN2.js";
5
5
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { createHash } from "node:crypto";
@@ -1,7 +1,7 @@
1
1
  import { r as isSlackSetupAccountConfigured } from "./account-configured-sUohAxZr.js";
2
2
  import { a as resolveSlackAccount, c as resolveSlackConfigAccessorAccount, i as resolveDefaultSlackAccountId, n as listSlackAccountIds } from "./accounts-Dm_H77gH.js";
3
3
  import { t as inspectSlackAccount } from "./account-inspect-C3sePHWa.js";
4
- import { t as SlackChannelConfigSchema } from "./config-schema-B9GwoRlE.js";
4
+ import { t as SlackChannelConfigSchema } from "./config-schema-bP3eV2ra.js";
5
5
  import { normalizeSecretInputString } from "openclaw/plugin-sdk/secret-input";
6
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter } from "openclaw/plugin-sdk/channel-config-helpers";
@@ -556,7 +556,7 @@ const slackBaseConfigAdapter = createScopedChannelConfigAdapter({
556
556
  });
557
557
  //#endregion
558
558
  //#region extensions/slack/src/channel.setup.ts
559
- const slackSetupWizard = createSlackSetupWizardProxy(async () => ({ slackSetupWizard: (await import("./setup-surface-Cc3P-z35.js")).slackSetupWizard }));
559
+ const slackSetupWizard = createSlackSetupWizardProxy(async () => ({ slackSetupWizard: (await import("./setup-surface-DO0e-MMS.js")).slackSetupWizard }));
560
560
  const slackSetupPlugin = {
561
561
  id: SLACK_CHANNEL,
562
562
  meta: {
@@ -32,7 +32,7 @@ const slackChannelConfigUiHints = {
32
32
  nativeTransport: "Enable native Slack text streaming (chat.startStream/chat.appendStream/chat.stopStream) when channels.slack.streaming.mode is partial (default: true). Native streaming and Slack assistant thread status require a reply thread target; top-level DMs can still use draft post-and-edit preview streaming.",
33
33
  "preview.toolProgress": "Show tool/progress activity in the live draft preview message (default: true). Set false to hide interim tool updates while the draft preview stays active.",
34
34
  "preview.commandText": "Command/exec detail in preview tool-progress lines: \"status\" is the safe default; \"raw\" opts into command text.",
35
- "progress.style": "Slack progress presentation: \"card\" (default) uses structured task/session cards; \"compact\" keeps one editable text draft that the final answer replaces in place when Slack can safely edit it.",
35
+ "progress.style": "Slack progress presentation: \"card\" uses structured task/session cards; \"compact\" keeps one editable text draft that the final answer replaces in place when Slack can safely edit it. Defaults to \"compact\" when progress.toolProgress is false, otherwise \"card\".",
36
36
  "progress.nativeTaskCards": "Slack native task-card progress updates when channels.slack.streaming.mode=\"progress\", progress.style=\"card\", and streaming.nativeTransport is enabled. Set false to fall back to the Block Kit progress card. Default: true."
37
37
  },
38
38
  progress: { labels: "openclaw" }
@@ -1,5 +1,11 @@
1
1
  //#region extensions/slack/src/cursor-pages.ts
2
2
  const SLACK_CURSOR_PAGE_LIMIT = 1e4;
3
+ const fetchSlackChannelListPage = (client, cursor) => client.conversations.list({
4
+ types: "public_channel,private_channel",
5
+ exclude_archived: false,
6
+ limit: 1e3,
7
+ cursor
8
+ });
3
9
  async function collectSlackCursorPages(params) {
4
10
  const items = [];
5
11
  let cursor;
@@ -16,4 +22,4 @@ async function collectSlackCursorPages(params) {
16
22
  throw new Error(`Slack cursor pagination exceeded ${SLACK_CURSOR_PAGE_LIMIT} pages`);
17
23
  }
18
24
  //#endregion
19
- export { collectSlackCursorPages as t };
25
+ export { fetchSlackChannelListPage as n, collectSlackCursorPages as t };
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
2
  import { a as resolveSlackAccount } from "./accounts-Dm_H77gH.js";
3
3
  import { s as createSlackLookupClient } from "./probe-gj5yQgN2.js";
4
- import { t as collectSlackCursorPages } from "./cursor-pages-eX7p8Wwt.js";
4
+ import { n as fetchSlackChannelListPage, t as collectSlackCursorPages } from "./cursor-pages-ByFwo-Py.js";
5
5
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  //#region extensions/slack/src/directory-live.ts
7
7
  var directory_live_exports = /* @__PURE__ */ __exportAll({
@@ -91,12 +91,7 @@ async function listSlackDirectoryGroupsLive(params) {
91
91
  if (!client) return [];
92
92
  const query = normalizeQuery(params.query);
93
93
  const rows = (await collectSlackCursorPages({
94
- fetchPage: (cursor) => client.conversations.list({
95
- types: "public_channel,private_channel",
96
- exclude_archived: false,
97
- limit: 1e3,
98
- cursor
99
- }),
94
+ fetchPage: (cursor) => fetchSlackChannelListPage(client, cursor),
100
95
  collectPageItems: (res) => Array.isArray(res.channels) ? res.channels : []
101
96
  })).filter((channel) => {
102
97
  const name = normalizeOptionalLowercaseString(channel.name);
@@ -599,58 +599,55 @@ function renderSlackMessagePresentationFallbackText(params) {
599
599
  });
600
600
  }
601
601
  //#endregion
602
+ //#region extensions/slack/src/rich-text.ts
603
+ const RICH_TEXT_CONTAINER_TYPES = /* @__PURE__ */ new Set([
604
+ "rich_text_section",
605
+ "rich_text_preformatted",
606
+ "rich_text_quote",
607
+ "rich_text_list"
608
+ ]);
609
+ function renderSlackRichText(value, mode, separator = "") {
610
+ if (!Array.isArray(value)) return "";
611
+ const table = mode === "table";
612
+ const read = table ? readNonBlankString : normalizeOptionalString;
613
+ const literal = table ? (text) => text : escapeSlackMrkdwn;
614
+ const reference = mode === "escaped" ? escapeSlackMrkdwn : (text) => text;
615
+ const formatReference = (raw, prefix, suffix) => {
616
+ const text = read(raw);
617
+ return text ? reference(`${prefix}${text}${suffix}`) : "";
618
+ };
619
+ return value.map((rawElement) => {
620
+ const element = asOptionalRecord(rawElement);
621
+ if (!element) return "";
622
+ if (Array.isArray(element.elements) && (table || RICH_TEXT_CONTAINER_TYPES.has(element.type))) return renderSlackRichText(element.elements, mode, element.type === "rich_text_list" ? "\n" : "");
623
+ if (table) {
624
+ if (element.type === "text" && typeof element.text === "string") return element.text;
625
+ const text = readNonBlankString(element.text);
626
+ if (text) return text;
627
+ }
628
+ switch (element.type) {
629
+ case "text": return typeof element.text === "string" ? literal(element.text) : "";
630
+ case "link": return literal(read(element.text) ?? read(element.url) ?? "");
631
+ case "user": return formatReference(element.user_id, "<@", ">");
632
+ case "channel": return formatReference(element.channel_id, "<#", ">");
633
+ case "usergroup": return formatReference(element.usergroup_id, "<!subteam^", ">");
634
+ case "broadcast": return formatReference(element.range, "<!", ">");
635
+ case "emoji": {
636
+ const name = read(element.name);
637
+ return name ? `:${name}:` : "";
638
+ }
639
+ case "date": return literal(read(element.fallback) ?? "");
640
+ default: return "";
641
+ }
642
+ }).filter(Boolean).join(separator);
643
+ }
644
+ //#endregion
602
645
  //#region extensions/slack/src/data-table.ts
603
646
  const SLACK_DATA_TABLE_COLUMNS_MAX = 20;
604
647
  const SLACK_DATA_TABLE_ROWS_MAX = 100;
605
648
  function countCharacters(value) {
606
649
  return Array.from(value).length;
607
650
  }
608
- function readRichTextLeaf(record) {
609
- if (record.type === "text" && typeof record.text === "string") return record.text;
610
- const text = readNonBlankString(record.text);
611
- if (text) return text;
612
- switch (record.type) {
613
- case "link": return readNonBlankString(record.url) ?? "";
614
- case "user": {
615
- const userId = readNonBlankString(record.user_id);
616
- return userId ? `<@${userId}>` : "";
617
- }
618
- case "channel": {
619
- const channelId = readNonBlankString(record.channel_id);
620
- return channelId ? `<#${channelId}>` : "";
621
- }
622
- case "usergroup": {
623
- const usergroupId = readNonBlankString(record.usergroup_id);
624
- return usergroupId ? `<!subteam^${usergroupId}>` : "";
625
- }
626
- case "broadcast": {
627
- const range = readNonBlankString(record.range);
628
- return range ? `<!${range}>` : "";
629
- }
630
- case "emoji": {
631
- const name = readNonBlankString(record.name);
632
- return name ? `:${name}:` : "";
633
- }
634
- case "date": return readNonBlankString(record.fallback) ?? "";
635
- default: return "";
636
- }
637
- }
638
- function readRichTextElements(value, separator = "") {
639
- if (!Array.isArray(value)) return "";
640
- const parts = [];
641
- for (const rawElement of value) {
642
- const element = asOptionalRecord(rawElement);
643
- if (!element) continue;
644
- if (Array.isArray(element.elements)) {
645
- const rendered = readRichTextElements(element.elements, element.type === "rich_text_list" ? "\n" : "");
646
- if (rendered) parts.push(rendered);
647
- continue;
648
- }
649
- const rendered = readRichTextLeaf(element);
650
- if (rendered) parts.push(rendered);
651
- }
652
- return parts.join(separator);
653
- }
654
651
  function readSlackBasicTableCell(value) {
655
652
  const cell = asOptionalRecord(value);
656
653
  if (!cell) return "";
@@ -660,7 +657,7 @@ function readSlackBasicTableCell(value) {
660
657
  if (typeof cell.value === "number" && Number.isFinite(cell.value)) return String(cell.value);
661
658
  return typeof cell.value === "string" ? cell.value : "";
662
659
  }
663
- return cell.type === "rich_text" ? readRichTextElements(cell.elements, "\n") : "";
660
+ return cell.type === "rich_text" ? renderSlackRichText(cell.elements, "table", "\n") : "";
664
661
  }
665
662
  function parseSlackBasicTableRows(value) {
666
663
  const block = asOptionalRecord(value);
@@ -682,7 +679,7 @@ function readSlackDataTableCell(value, allowRichText) {
682
679
  if (!cell) return;
683
680
  if (cell.type === "raw_text") return readNonBlankString(cell.text);
684
681
  if (cell.type === "raw_number") return typeof cell.value === "number" && Number.isFinite(cell.value) ? readNonBlankString(cell.text) : void 0;
685
- if (allowRichText && cell.type === "rich_text") return readNonBlankString(readRichTextElements(cell.elements));
682
+ if (allowRichText && cell.type === "rich_text") return readNonBlankString(renderSlackRichText(cell.elements, "table"));
686
683
  }
687
684
  function parseSlackDataTable(value, options = {}) {
688
685
  const block = asOptionalRecord(value);
@@ -1790,44 +1787,6 @@ function readTextObject(value, options = {}) {
1790
1787
  function readTextValue(value, options = {}) {
1791
1788
  return normalizeOptionalString(value) ?? readTextObject(value, options);
1792
1789
  }
1793
- function renderSlackRichTextElement(value, renderReference) {
1794
- const element = asOptionalRecord(value);
1795
- if (!element) return "";
1796
- switch (element.type) {
1797
- case "rich_text_section":
1798
- case "rich_text_preformatted":
1799
- case "rich_text_quote": return renderSlackRichTextElements(element.elements, "", renderReference);
1800
- case "rich_text_list": return renderSlackRichTextElements(element.elements, "\n", renderReference);
1801
- case "text": return typeof element.text === "string" ? escapeSlackMrkdwn(element.text) : "";
1802
- case "link": return escapeSlackMrkdwn(normalizeOptionalString(element.text) ?? normalizeOptionalString(element.url) ?? "");
1803
- case "user": {
1804
- const userId = normalizeOptionalString(element.user_id);
1805
- return userId ? renderReference(`<@${userId}>`) : "";
1806
- }
1807
- case "channel": {
1808
- const channelId = normalizeOptionalString(element.channel_id);
1809
- return channelId ? renderReference(`<#${channelId}>`) : "";
1810
- }
1811
- case "usergroup": {
1812
- const usergroupId = normalizeOptionalString(element.usergroup_id);
1813
- return usergroupId ? renderReference(`<!subteam^${usergroupId}>`) : "";
1814
- }
1815
- case "broadcast": {
1816
- const range = normalizeOptionalString(element.range);
1817
- return range ? renderReference(`<!${range}>`) : "";
1818
- }
1819
- case "emoji": {
1820
- const name = normalizeOptionalString(element.name);
1821
- return name ? `:${name}:` : "";
1822
- }
1823
- case "date": return escapeSlackMrkdwn(normalizeOptionalString(element.fallback) ?? "");
1824
- default: return "";
1825
- }
1826
- }
1827
- function renderSlackRichTextElements(value, separator, renderReference) {
1828
- if (!Array.isArray(value)) return "";
1829
- return value.map((element) => renderSlackRichTextElement(element, renderReference)).filter(Boolean).join(separator);
1830
- }
1831
1790
  function readImageText(block) {
1832
1791
  const altText = normalizeOptionalString(block.alt_text);
1833
1792
  return (altText ? escapeSlackMrkdwn(altText) : void 0) ?? readTextObject(block.title);
@@ -1877,7 +1836,7 @@ function renderSlackBlockFallbackText(raw, options = {}) {
1877
1836
  const block = asOptionalRecord(raw);
1878
1837
  if (!block) return;
1879
1838
  switch (block.type) {
1880
- case "rich_text": return normalizeOptionalString(renderSlackRichTextElements(block.elements, "\n", options.nativeReferenceFormat === "plain" ? (text) => text : escapeSlackMrkdwn));
1839
+ case "rich_text": return normalizeOptionalString(renderSlackRichText(block.elements, options.nativeReferenceFormat === "plain" ? "native-reference" : "escaped", "\n"));
1881
1840
  case "header": return readTextObject(block.text, options);
1882
1841
  case "section": return readSectionText(block, options);
1883
1842
  case "image": return readImageText(block) ?? "Shared an image";
@@ -1,6 +1,6 @@
1
1
  import { n as listSlackAccountIds } from "./accounts-Dm_H77gH.js";
2
2
  import { t as inspectSlackAccount } from "./account-inspect-C3sePHWa.js";
3
- import { n as resolveSlackThreadTsValue, t as normalizeSlackThreadTsCandidate } from "./thread-ts-DUGhaYKq.js";
3
+ import { r as resolveSlackThreadTsValue, t as normalizeSlackThreadTsCandidate } from "./thread-ts-CukseRVL.js";
4
4
  import { createActionGate } from "openclaw/plugin-sdk/channel-actions";
5
5
  import { extractToolSend } from "openclaw/plugin-sdk/tool-send";
6
6
  import { Type } from "typebox";
@@ -1,2 +1,2 @@
1
- import { t as describeSlackMessageTool } from "./message-tool-api-BsZbsulu.js";
1
+ import { t as describeSlackMessageTool } from "./message-tool-api-uNEfQYGY.js";
2
2
  export { describeSlackMessageTool as describeMessageTool };
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { T as buildSlackSlashCommandMatcher, t as monitorSlackProvider } from "./provider-DW9YC_no.js";
3
- import { t as isSlackChannelAllowedByPolicy } from "./policy-CUpBeOt9.js";
4
- import { o as resolveSlackThreadTs } from "./replies-DLjQ8RYU.js";
2
+ import { T as buildSlackSlashCommandMatcher, t as monitorSlackProvider } from "./provider-Do50wMWn.js";
3
+ import { t as isSlackChannelAllowedByPolicy } from "./policy-D7PKkiet.js";
4
+ import { a as resolveSlackThreadTs } from "./replies-Dc6WVh_Q.js";
5
5
  //#region extensions/slack/src/monitor.ts
6
6
  var monitor_exports = /* @__PURE__ */ __exportAll({
7
7
  buildSlackSlashCommandMatcher: () => buildSlackSlashCommandMatcher,
@@ -1,7 +1,7 @@
1
1
  import { a as resolveSlackAccount, l as resolveSlackOperationToken } from "./accounts-Dm_H77gH.js";
2
2
  import { a as parseSlackTarget } from "./target-parsing-PbxGDbr9.js";
3
- import { M as SLACK_TEXT_LIMIT, O as resolveSlackAuthoredTextPlacement, c as assertSlackDetachedTargetAllowed, d as resolveSlackReplyBlockResolution, et as escapeSlackMrkdwn, p as resolveSlackReplyDeliveryMessages, q as resolveSlackQuestionActionIds, rt as SLACK_PRESENTATION_CAPABILITIES, u as parseSlackReplyBlockSegments, z as SLACK_QUESTION_FINALIZATION_BLOCKS } from "./group-policy-BYH74y50.js";
4
- import { n as resolveSlackThreadTsValue } from "./thread-ts-DUGhaYKq.js";
3
+ import { M as SLACK_TEXT_LIMIT, O as resolveSlackAuthoredTextPlacement, c as assertSlackDetachedTargetAllowed, d as resolveSlackReplyBlockResolution, et as escapeSlackMrkdwn, p as resolveSlackReplyDeliveryMessages, q as resolveSlackQuestionActionIds, rt as SLACK_PRESENTATION_CAPABILITIES, u as parseSlackReplyBlockSegments, z as SLACK_QUESTION_FINALIZATION_BLOCKS } from "./group-policy-BKjMqT-8.js";
4
+ import { r as resolveSlackThreadTsValue } from "./thread-ts-CukseRVL.js";
5
5
  import { t as mergeSlackSendResults } from "./send-results-eeOu_HYm.js";
6
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-outbound";
@@ -51,7 +51,7 @@ function readSlackRenderedPresentation(slackData) {
51
51
  return;
52
52
  }
53
53
  }
54
- const loadSlackSendRuntime = createLazyRuntimeModule(() => import("./send.runtime-rScD-UJi.js"));
54
+ const loadSlackSendRuntime = createLazyRuntimeModule(() => import("./send.runtime-__WVTWLQ.js"));
55
55
  function resolveSlackSendIdentity(identity) {
56
56
  if (!identity) return;
57
57
  const username = normalizeOptionalString(identity.name);