@openclaw/slack 2026.5.14-beta.1 → 2026.5.16-beta.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 (83) hide show
  1. package/dist/{action-runtime-gtC-RM3r.js → action-runtime-p39JLqwf.js} +4 -4
  2. package/dist/action-runtime.runtime-BzrPV3EA.js +2 -0
  3. package/dist/{media-B-nNpS2G.js → actions-BCRbHv1Q.js} +309 -3
  4. package/dist/{actions.runtime-DD6hfFCA.js → actions.runtime-CpywQR3D.js} +1 -1
  5. package/dist/api.js +16 -16
  6. package/dist/{approval-handler.runtime-DeYBuIaU.js → approval-handler.runtime-DXrdRbkT.js} +3 -4
  7. package/dist/{blocks-render-BdLueE_v.js → blocks-render-BAVfd6r0.js} +1 -1
  8. package/dist/{channel-CC04F-xs.js → channel-CVSopl66.js} +23 -27
  9. package/dist/channel-config-api.js +1 -1
  10. package/dist/channel-plugin-api.js +1 -1
  11. package/dist/{channel.setup-jzYjY634.js → channel.setup-DknBgufI.js} +3 -3
  12. package/dist/{client-8r7r7aZ3.js → client-C_IaJbi5.js} +20 -1
  13. package/dist/{config-schema-Bueih4yH.js → config-schema-CNRousxw.js} +1 -1
  14. package/dist/contract-api.js +4 -4
  15. package/dist/directory-contract-api.js +1 -1
  16. package/dist/{directory-live-CuaWaGnM.js → directory-live-CZPzpQZF.js} +1 -1
  17. package/dist/{doctor-contract-DCkS8eNN.js → doctor-contract-B8QIWMs1.js} +1 -1
  18. package/dist/doctor-contract-api.js +1 -1
  19. package/dist/http-routes-api.js +1 -1
  20. package/dist/inbound-contract-test-api.js +2 -2
  21. package/dist/interactive-replies-api.js +1 -1
  22. package/dist/{message-tool-api-B_bKUmP0.js → message-tool-api-C7gc7goF.js} +1 -1
  23. package/dist/message-tool-api.js +1 -1
  24. package/dist/{monitor-B3QB1ysK.js → monitor-CdVxsuHi.js} +3 -3
  25. package/dist/{outbound-adapter-DsAvCwpZ.js → outbound-adapter-CHm6e-0Q.js} +4 -5
  26. package/dist/outbound-payload-test-api.js +1 -1
  27. package/dist/{outbound-payload.test-harness-DM9ZdY2f.js → outbound-payload.test-harness-C0CW7_CE.js} +2 -2
  28. package/dist/{pipeline.runtime-D-YJZZaI.js → pipeline.runtime-CakcaQh9.js} +119 -143
  29. package/dist/{plugin-routes-Dt_jh9W8.js → plugin-routes-CRnfsTTX.js} +1 -1
  30. package/dist/{prepare-CXI8nHbJ.js → prepare-DSRUr44d.js} +223 -85
  31. package/dist/{prepare.test-helpers-BhFHtbz3.js → prepare.test-helpers-CU1qB54Q.js} +1 -1
  32. package/dist/{probe-D1wYA05H.js → probe-FL4sUJsH.js} +2 -2
  33. package/dist/{provider-Ut7IF0Mn.js → provider-bKg1hkf5.js} +158 -24
  34. package/dist/{replies-CzfjCaLG.js → replies-Fg1T3ZzU.js} +4 -4
  35. package/dist/reply-blocks-BFaJ_ejG.js +134 -0
  36. package/dist/{resolve-channels-BiVxSLVm.js → resolve-channels-B_eKaOkE.js} +2 -2
  37. package/dist/{resolve-users-CcpSlYw-.js → resolve-users-BzBAJwvq.js} +2 -2
  38. package/dist/{room-context-D0hGOp8m.js → room-context-Cd8jFpS-.js} +2 -2
  39. package/dist/{runtime-api-D8wiG9BS.js → runtime-api-B5HGOzX3.js} +2 -2
  40. package/dist/runtime-api.js +12 -12
  41. package/dist/runtime-setter-api.js +1 -1
  42. package/dist/{scopes-BTkB8PPE.js → scopes-Bvg_ZzqZ.js} +2 -2
  43. package/dist/secret-contract-api.js +1 -1
  44. package/dist/security-contract-api.js +1 -1
  45. package/dist/{send-ioky2Xpy.js → send-CxXFbqN1.js} +5 -6
  46. package/dist/send.runtime-BHCPpSj_.js +2 -0
  47. package/dist/send.runtime-CDG5AgU3.js +2 -0
  48. package/dist/{setup-core-DgLJ7dQY.js → setup-core-B7pou7oe.js} +23 -22
  49. package/dist/setup-plugin-api.js +1 -1
  50. package/dist/{setup-surface-B6w9gtds.js → setup-surface-D6LLzeRz.js} +16 -15
  51. package/dist/{shared-CSiHkaVO.js → shared-7Vi9j4aV.js} +7 -7
  52. package/dist/{slash-dispatch.runtime-DNr1EDON.js → slash-dispatch.runtime-Cg7uU92H.js} +1 -1
  53. package/dist/test-api.js +7 -7
  54. package/dist/thread-ts-As_dcNbD.js +52 -0
  55. package/package.json +5 -5
  56. package/dist/action-runtime.runtime-DbVd7_Na.js +0 -2
  57. package/dist/actions-Cqyj7oRr.js +0 -309
  58. package/dist/approval-auth-D3xf0sS6.js +0 -28
  59. package/dist/blocks-input-BJZ8vv03.js +0 -29
  60. package/dist/channel-api-BfBK89IN.js +0 -20
  61. package/dist/exec-approvals-BLn4Zx7V.js +0 -58
  62. package/dist/group-policy-utF2iWnE.js +0 -41
  63. package/dist/mrkdwn-18IzcEAY.js +0 -6
  64. package/dist/reply-blocks-DWoZrUll.js +0 -14
  65. package/dist/send.runtime-5Kl3Wzbf.js +0 -2
  66. package/dist/send.runtime-DoifekaA.js +0 -2
  67. package/dist/thread-ts-o-QBwB3k.js +0 -24
  68. /package/dist/{accounts.runtime-CkfFIisb.js → accounts.runtime-BhbEu1ZK.js} +0 -0
  69. /package/dist/{allow-list-T7ZDpUsF.js → allow-list-nwXs_eCP.js} +0 -0
  70. /package/dist/{config-api-B48Z4H47.js → config-api-CmgE_ORg.js} +0 -0
  71. /package/dist/{directory-config-BKKNBkCq.js → directory-config-CMvFiswf.js} +0 -0
  72. /package/dist/{errors-BrtayXHa.js → errors-C_sW0Zgl.js} +0 -0
  73. /package/dist/{interactive-replies-CawNPL-h.js → interactive-replies-BSg5hXhj.js} +0 -0
  74. /package/dist/{magic-string.es-BLAi6qQC.js → magic-string.es-9lw4MGoF.js} +0 -0
  75. /package/dist/{registry-BdfKYina.js → registry-D2cWOLZV.js} +0 -0
  76. /package/dist/{resolve-allowlist-common-rhfyDyWi.js → resolve-allowlist-common-DLub2I2i.js} +0 -0
  77. /package/dist/{runtime--VlVtTPu.js → runtime-DQxkf7k2.js} +0 -0
  78. /package/dist/{secret-contract-BurGIyhv.js → secret-contract-0TL3L5Kb.js} +0 -0
  79. /package/dist/{security-audit-DvOpSaZM.js → security-audit-BJzADAw3.js} +0 -0
  80. /package/dist/{slash-commands.runtime-DRkNgIQ2.js → slash-commands.runtime-bcDwsGnu.js} +0 -0
  81. /package/dist/{slash-plugin-commands.runtime-Dj5h8hmv.js → slash-plugin-commands.runtime-DBHGUSj2.js} +0 -0
  82. /package/dist/{slash-skill-commands.runtime-B-_KAk0C.js → slash-skill-commands.runtime-rrY2hXvN.js} +0 -0
  83. /package/dist/{streaming-compat-C6rySwiD.js → streaming-compat-eu5Rj5gj.js} +0 -0
@@ -1,17 +1,14 @@
1
1
  import { a as resolveSlackAccount, d as resolveSlackBotToken, o as resolveSlackAccountAllowFrom, s as resolveSlackAccountDmPolicy, u as resolveSlackAppToken } from "./accounts-yk5K3wQU.js";
2
- import { n as isSlackExecApprovalAuthorizedSender, r as isSlackExecApprovalClientEnabled } from "./exec-approvals-BLn4Zx7V.js";
3
- import { t as isSlackApprovalAuthorizedSender } from "./approval-auth-D3xf0sS6.js";
4
- import "./blocks-render-BdLueE_v.js";
5
- import { i as truncateSlackText, r as SLACK_TEXT_LIMIT } from "./thread-ts-o-QBwB3k.js";
6
- import { c as resolveSlackWebClientOptions } from "./client-8r7r7aZ3.js";
7
- import { n as normalizeAllowList, r as normalizeAllowListLower, t as allowListMatches } from "./allow-list-T7ZDpUsF.js";
8
- import "./blocks-input-BJZ8vv03.js";
9
- import { n as registerSlackHttpHandler, r as normalizeSlackWebhookPath } from "./registry-BdfKYina.js";
10
- import { t as formatSlackError } from "./errors-BrtayXHa.js";
11
- import { t as resolveSlackChannelAllowlist } from "./resolve-channels-BiVxSLVm.js";
12
- import { t as resolveSlackUserAllowlist } from "./resolve-users-CcpSlYw-.js";
13
- import { C as resolveOpenProviderRuntimeGroupPolicy, D as buildSlackSlashCommandMatcher, E as warnMissingProviderGroupPolicyFallbackOnce, O as resolveSlackSlashCommandConfig, S as resolveDefaultGroupPolicy, _ as resolveSlackChannelLabel, d as resolveSlackEffectiveAllowFrom, f as createSlackMonitorContext, g as resolveSlackChannelConfig, h as resolveSlackChatType, i as parsePluginBindingApprovalCustomId, k as stripSlackMentionsForCommandDetection, l as authorizeSlackSystemEventSender, m as normalizeSlackChannelType, n as authorizeSlackDirectMessage, p as isSlackChannelAllowedByPolicy, r as buildPluginBindingResolvedText, s as resolvePluginConversationBindingApproval, t as resolveSlackRoomContextHints, u as resolveSlackCommandIngress, v as getRuntimeConfig$1, y as isDangerousNameMatchingEnabled } from "./room-context-D0hGOp8m.js";
14
- import { t as escapeSlackMrkdwn } from "./mrkdwn-18IzcEAY.js";
2
+ import { i as isSlackApprovalAuthorizedSender, o as isSlackExecApprovalAuthorizedSender, s as isSlackExecApprovalClientEnabled } from "./reply-blocks-BFaJ_ejG.js";
3
+ import "./blocks-render-BAVfd6r0.js";
4
+ import { o as SLACK_TEXT_LIMIT, s as truncateSlackText } from "./thread-ts-As_dcNbD.js";
5
+ import { c as resolveSlackWebClientOptions } from "./client-C_IaJbi5.js";
6
+ import { n as normalizeAllowList, r as normalizeAllowListLower, t as allowListMatches } from "./allow-list-nwXs_eCP.js";
7
+ import { n as registerSlackHttpHandler, r as normalizeSlackWebhookPath } from "./registry-D2cWOLZV.js";
8
+ import { t as formatSlackError } from "./errors-C_sW0Zgl.js";
9
+ import { t as resolveSlackChannelAllowlist } from "./resolve-channels-B_eKaOkE.js";
10
+ import { t as resolveSlackUserAllowlist } from "./resolve-users-BzBAJwvq.js";
11
+ import { C as resolveOpenProviderRuntimeGroupPolicy, D as buildSlackSlashCommandMatcher, E as warnMissingProviderGroupPolicyFallbackOnce, O as resolveSlackSlashCommandConfig, S as resolveDefaultGroupPolicy, _ as resolveSlackChannelLabel, d as resolveSlackEffectiveAllowFrom, f as createSlackMonitorContext, g as resolveSlackChannelConfig, h as resolveSlackChatType, i as parsePluginBindingApprovalCustomId, k as stripSlackMentionsForCommandDetection, l as authorizeSlackSystemEventSender, m as normalizeSlackChannelType, n as authorizeSlackDirectMessage, p as isSlackChannelAllowedByPolicy, r as buildPluginBindingResolvedText, s as resolvePluginConversationBindingApproval, t as resolveSlackRoomContextHints, u as resolveSlackCommandIngress, v as getRuntimeConfig$1, y as isDangerousNameMatchingEnabled } from "./room-context-Cd8jFpS-.js";
15
12
  import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
16
13
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
17
14
  import { normalizeAccountId, normalizeMainKey } from "openclaw/plugin-sdk/routing";
@@ -124,6 +121,7 @@ function registerSlackChannelEvents(params) {
124
121
  enqueueSystemEvent(`Slack channel ${params.kind}: ${label}.`, {
125
122
  sessionKey,
126
123
  contextKey: `slack:channel:${params.kind}:${params.channelId ?? params.channelName ?? "unknown"}`,
124
+ forceSenderIsOwnerFalse: true,
127
125
  trusted: false
128
126
  });
129
127
  };
@@ -293,6 +291,11 @@ async function dispatchSlackPluginInteractiveHandler(params) {
293
291
  });
294
292
  }
295
293
  //#endregion
294
+ //#region extensions/slack/src/monitor/mrkdwn.ts
295
+ function escapeSlackMrkdwn(value) {
296
+ return value.replaceAll("\\", "\\\\").replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replace(/([*_`~])/g, "\\$1");
297
+ }
298
+ //#endregion
296
299
  //#region extensions/slack/src/monitor/events/interactions.block-actions.ts
297
300
  function readOptionValues(options) {
298
301
  if (!Array.isArray(options)) return;
@@ -698,6 +701,7 @@ function enqueueSlackBlockActionEvent(params) {
698
701
  accountId: params.ctx.accountId,
699
702
  threadId: params.parsed.threadTs
700
703
  },
704
+ forceSenderIsOwnerFalse: true,
701
705
  trusted: false
702
706
  })) requestHeartbeat({
703
707
  source: "hook",
@@ -843,7 +847,8 @@ function parseSlackModalPrivateMetadata(raw) {
843
847
  sessionKey: normalizeOptionalString(parsed.sessionKey),
844
848
  channelId: normalizeOptionalString(parsed.channelId),
845
849
  channelType: normalizeOptionalString(parsed.channelType),
846
- userId: normalizeOptionalString(parsed.userId)
850
+ userId: normalizeOptionalString(parsed.userId),
851
+ pluginInteractiveData: normalizeOptionalString(parsed.pluginInteractiveData)
847
852
  };
848
853
  } catch {
849
854
  return {};
@@ -851,6 +856,35 @@ function parseSlackModalPrivateMetadata(raw) {
851
856
  }
852
857
  //#endregion
853
858
  //#region extensions/slack/src/monitor/events/interactions.modal.ts
859
+ const OPENCLAW_MODAL_CALLBACK_PREFIX = "openclaw:";
860
+ function resolveSlackModalPluginInteractiveData(params) {
861
+ const metadataData = params.metadata.pluginInteractiveData?.trim();
862
+ if (metadataData) return metadataData;
863
+ if (!params.callbackId.startsWith(OPENCLAW_MODAL_CALLBACK_PREFIX)) return;
864
+ return params.callbackId.slice(9).trim() || void 0;
865
+ }
866
+ function shouldHandleSlackModalLifecycleBody(body) {
867
+ const typed = body;
868
+ if ((typed.view?.callback_id ?? "").startsWith(OPENCLAW_MODAL_CALLBACK_PREFIX)) return true;
869
+ const metadata = parseSlackModalPrivateMetadata(typed.view?.private_metadata);
870
+ return Boolean(metadata.pluginInteractiveData?.trim());
871
+ }
872
+ function resolveSlackModalPluginNamespace(data) {
873
+ if (!data) return;
874
+ const separatorIndex = data.indexOf(":");
875
+ return separatorIndex >= 0 ? data.slice(0, separatorIndex) : data;
876
+ }
877
+ function resolveSlackPluginSystemEventPayload(result) {
878
+ if (!result || typeof result !== "object") return;
879
+ const systemEvent = result.systemEvent;
880
+ if (!systemEvent || typeof systemEvent !== "object") return;
881
+ const typed = systemEvent;
882
+ const output = {};
883
+ if (typeof typed.summary === "string" && typed.summary.trim()) output.summary = typed.summary;
884
+ if (typeof typed.reference === "string" && typed.reference.trim()) output.reference = typed.reference;
885
+ if (typed.data && typeof typed.data === "object" && !Array.isArray(typed.data)) output.data = typed.data;
886
+ return Object.keys(output).length > 0 ? output : void 0;
887
+ }
854
888
  function resolveModalSessionRouting(params) {
855
889
  const metadata = params.metadata;
856
890
  if (metadata.sessionKey) return {
@@ -897,6 +931,7 @@ function resolveSlackModalEventBase(params) {
897
931
  expectedUserId: metadata.userId,
898
932
  viewId,
899
933
  sessionRouting,
934
+ stateValues: params.body.view?.state?.values,
900
935
  payload: {
901
936
  actionId: `view:${callbackId}`,
902
937
  callbackId,
@@ -916,12 +951,68 @@ function resolveSlackModalEventBase(params) {
916
951
  }
917
952
  };
918
953
  }
954
+ async function dispatchSlackModalPluginInteractiveHandler(params) {
955
+ if (!params.data) return {
956
+ matched: false,
957
+ handled: false,
958
+ duplicate: false
959
+ };
960
+ const isViewClosed = params.interactionType === "view_closed";
961
+ const interactionId = [
962
+ params.interactionType,
963
+ params.payload.callbackId,
964
+ params.payload.viewId,
965
+ params.payload.userId
966
+ ].filter(Boolean).join(":");
967
+ const result = await dispatchSlackPluginInteractiveHandler({
968
+ data: params.data,
969
+ interactionId,
970
+ ctx: {
971
+ accountId: params.ctx.accountId,
972
+ interactionId,
973
+ conversationId: params.sessionRouting.channelId ?? "",
974
+ parentConversationId: void 0,
975
+ threadId: void 0,
976
+ senderId: params.payload.userId,
977
+ senderUsername: void 0,
978
+ auth: params.auth,
979
+ interaction: {
980
+ kind: params.interactionType,
981
+ callbackId: params.payload.callbackId,
982
+ viewId: params.payload.viewId,
983
+ rootViewId: params.payload.rootViewId,
984
+ previousViewId: params.payload.previousViewId,
985
+ externalId: params.payload.externalId,
986
+ isStackedView: params.payload.isStackedView,
987
+ isCleared: isViewClosed ? params.body.is_cleared === true : void 0,
988
+ inputs: params.payload.inputs,
989
+ stateValues: params.stateValues,
990
+ triggerId: params.body.trigger_id
991
+ }
992
+ },
993
+ respond: {
994
+ acknowledge: async () => {},
995
+ reply: async () => {},
996
+ followUp: async () => {},
997
+ editMessage: async () => {}
998
+ }
999
+ });
1000
+ return {
1001
+ ...result,
1002
+ namespace: result.matched ? resolveSlackModalPluginNamespace(params.data) : void 0,
1003
+ systemEvent: result.matched ? resolveSlackPluginSystemEventPayload(result.result) : void 0
1004
+ };
1005
+ }
919
1006
  async function emitSlackModalLifecycleEvent(params) {
920
- const { callbackId, userId, expectedUserId, viewId, sessionRouting, payload } = resolveSlackModalEventBase({
1007
+ const { callbackId, userId, expectedUserId, viewId, sessionRouting, stateValues, payload } = resolveSlackModalEventBase({
921
1008
  ctx: params.ctx,
922
1009
  body: params.body,
923
1010
  summarizeViewState: params.summarizeViewState
924
1011
  });
1012
+ const pluginInteractiveData = resolveSlackModalPluginInteractiveData({
1013
+ callbackId,
1014
+ metadata: parseSlackModalPrivateMetadata(params.body.view?.private_metadata)
1015
+ });
925
1016
  const isViewClosed = params.interactionType === "view_closed";
926
1017
  const isCleared = params.body.is_cleared === true;
927
1018
  const eventPayload = isViewClosed ? {
@@ -935,6 +1026,20 @@ async function emitSlackModalLifecycleEvent(params) {
935
1026
  if (isViewClosed) params.ctx.runtime.log?.(`slack:interaction view_closed callback=${callbackId} user=${userId} cleared=${isCleared}`);
936
1027
  else params.ctx.runtime.log?.(`slack:interaction view_submission callback=${callbackId} user=${userId} inputs=${payload.inputs.length}`);
937
1028
  if (!expectedUserId) {
1029
+ if (pluginInteractiveData) try {
1030
+ await dispatchSlackModalPluginInteractiveHandler({
1031
+ ctx: params.ctx,
1032
+ body: params.body,
1033
+ interactionType: params.interactionType,
1034
+ data: pluginInteractiveData,
1035
+ auth: { isAuthorizedSender: false },
1036
+ payload,
1037
+ stateValues,
1038
+ sessionRouting
1039
+ });
1040
+ } catch (error) {
1041
+ params.ctx.runtime.log?.(`slack:interaction modal plugin dispatch failed callback=${callbackId} error=${error instanceof Error ? error.message : String(error)}`);
1042
+ }
938
1043
  params.ctx.runtime.log?.(`slack:interaction drop modal callback=${callbackId} user=${userId} reason=missing-expected-user`);
939
1044
  return;
940
1045
  }
@@ -950,7 +1055,31 @@ async function emitSlackModalLifecycleEvent(params) {
950
1055
  params.ctx.runtime.log?.(`slack:interaction drop modal callback=${callbackId} user=${userId} reason=${auth.reason ?? "unauthorized"}`);
951
1056
  return;
952
1057
  }
953
- enqueueSystemEvent(params.formatSystemEvent(eventPayload), {
1058
+ let pluginDispatch;
1059
+ try {
1060
+ pluginDispatch = await dispatchSlackModalPluginInteractiveHandler({
1061
+ ctx: params.ctx,
1062
+ body: params.body,
1063
+ interactionType: params.interactionType,
1064
+ data: pluginInteractiveData,
1065
+ auth: { isAuthorizedSender: auth.allowed },
1066
+ payload,
1067
+ stateValues,
1068
+ sessionRouting
1069
+ });
1070
+ } catch (error) {
1071
+ params.ctx.runtime.log?.(`slack:interaction modal plugin dispatch failed callback=${callbackId} error=${error instanceof Error ? error.message : String(error)}`);
1072
+ }
1073
+ const pluginEventFields = pluginDispatch?.matched === true ? {
1074
+ pluginHandled: pluginDispatch.handled,
1075
+ pluginNamespace: pluginDispatch.namespace,
1076
+ pluginDuplicate: pluginDispatch.duplicate || void 0,
1077
+ pluginSystemEvent: pluginDispatch.systemEvent
1078
+ } : {};
1079
+ enqueueSystemEvent(params.formatSystemEvent({
1080
+ ...eventPayload,
1081
+ ...pluginEventFields
1082
+ }), {
954
1083
  sessionKey: sessionRouting.sessionKey,
955
1084
  contextKey: [
956
1085
  params.contextPrefix,
@@ -962,6 +1091,7 @@ async function emitSlackModalLifecycleEvent(params) {
962
1091
  }
963
1092
  function registerModalLifecycleHandler(params) {
964
1093
  params.register(params.matcher, async ({ ack, body }) => {
1094
+ if (!shouldHandleSlackModalLifecycleBody(body)) return;
965
1095
  await ack();
966
1096
  if (params.ctx.shouldDropMismatchedSlackEvent?.(body)) {
967
1097
  params.ctx.runtime.log?.(`slack:interaction drop ${params.interactionType} payload (mismatched app/team)`);
@@ -980,7 +1110,6 @@ function registerModalLifecycleHandler(params) {
980
1110
  }
981
1111
  //#endregion
982
1112
  //#region extensions/slack/src/monitor/events/interactions.ts
983
- const OPENCLAW_ACTION_PREFIX = "openclaw:";
984
1113
  const SLACK_INTERACTION_EVENT_PREFIX = "Slack interaction: ";
985
1114
  const REDACTED_INTERACTION_VALUE = "[redacted]";
986
1115
  const SLACK_INTERACTION_EVENT_MAX_CHARS = 2400;
@@ -1056,6 +1185,10 @@ function buildCompactSlackInteractionPayload(payload) {
1056
1185
  selectedDateTime: payload.selectedDateTime,
1057
1186
  workflowId: payload.workflowId,
1058
1187
  routedChannelType: payload.routedChannelType,
1188
+ pluginHandled: payload.pluginHandled,
1189
+ pluginNamespace: payload.pluginNamespace,
1190
+ pluginDuplicate: payload.pluginDuplicate,
1191
+ pluginSystemEvent: payload.pluginSystemEvent,
1059
1192
  inputs: compactInputs.length > 0 ? compactInputs : void 0,
1060
1193
  inputsOmitted: rawInputs.length > SLACK_INTERACTION_COMPACT_INPUTS_MAX_ITEMS ? rawInputs.length - SLACK_INTERACTION_COMPACT_INPUTS_MAX_ITEMS : void 0,
1061
1194
  payloadTruncated: true
@@ -1101,7 +1234,7 @@ function registerSlackInteractionEvents(params) {
1101
1234
  formatSystemEvent: formatSlackInteractionSystemEvent
1102
1235
  });
1103
1236
  if (typeof ctx.app.view !== "function") return;
1104
- const modalMatcher = new RegExp(`^${OPENCLAW_ACTION_PREFIX}`);
1237
+ const modalMatcher = /.*/;
1105
1238
  registerModalLifecycleHandler({
1106
1239
  register: (matcher, handler) => ctx.app.view(matcher, handler),
1107
1240
  matcher: modalMatcher,
@@ -1462,6 +1595,7 @@ function registerSlackReactionEvents(params) {
1462
1595
  enqueueSystemEvent(authorLabel ? `${baseText} from ${authorLabel}` : baseText, {
1463
1596
  sessionKey: ingressContext.sessionKey,
1464
1597
  contextKey: `slack:reaction:${action}:${item.channel}:${item.ts}:${event.user}:${emojiLabel}`,
1598
+ forceSenderIsOwnerFalse: true,
1465
1599
  trusted: false
1466
1600
  });
1467
1601
  } catch (err) {
@@ -1627,7 +1761,7 @@ function createSlackThreadTsResolver(params) {
1627
1761
  //#region extensions/slack/src/monitor/message-handler.ts
1628
1762
  let slackMessagePipelinePromise;
1629
1763
  function loadSlackMessagePipeline() {
1630
- slackMessagePipelinePromise ??= import("./pipeline.runtime-D-YJZZaI.js");
1764
+ slackMessagePipelinePromise ??= import("./pipeline.runtime-CakcaQh9.js");
1631
1765
  return slackMessagePipelinePromise;
1632
1766
  }
1633
1767
  const APP_MENTION_RETRY_TTL_MS = 6e4;
@@ -2165,19 +2299,19 @@ let slashDispatchRuntimePromise = null;
2165
2299
  let slackPluginCommandsRuntimePromise = null;
2166
2300
  let slashSkillCommandsRuntimePromise = null;
2167
2301
  function loadSlashCommandsRuntime() {
2168
- slashCommandsRuntimePromise ??= import("./slash-commands.runtime-DRkNgIQ2.js");
2302
+ slashCommandsRuntimePromise ??= import("./slash-commands.runtime-bcDwsGnu.js");
2169
2303
  return slashCommandsRuntimePromise;
2170
2304
  }
2171
2305
  function loadSlashDispatchRuntime() {
2172
- slashDispatchRuntimePromise ??= import("./slash-dispatch.runtime-DNr1EDON.js");
2306
+ slashDispatchRuntimePromise ??= import("./slash-dispatch.runtime-Cg7uU92H.js");
2173
2307
  return slashDispatchRuntimePromise;
2174
2308
  }
2175
2309
  function loadSlackPluginCommandsRuntime() {
2176
- slackPluginCommandsRuntimePromise ??= import("./slash-plugin-commands.runtime-Dj5h8hmv.js");
2310
+ slackPluginCommandsRuntimePromise ??= import("./slash-plugin-commands.runtime-DBHGUSj2.js");
2177
2311
  return slackPluginCommandsRuntimePromise;
2178
2312
  }
2179
2313
  function loadSlashSkillCommandsRuntime() {
2180
- slashSkillCommandsRuntimePromise ??= import("./slash-skill-commands.runtime-B-_KAk0C.js");
2314
+ slashSkillCommandsRuntimePromise ??= import("./slash-skill-commands.runtime-rrY2hXvN.js");
2181
2315
  return slashSkillCommandsRuntimePromise;
2182
2316
  }
2183
2317
  function resolveSlackCommandMenuModelContext(params) {
@@ -3269,4 +3403,4 @@ async function monitorSlackProvider(opts = {}) {
3269
3403
  }
3270
3404
  const resolveSlackRuntimeGroupPolicy = resolveOpenProviderRuntimeGroupPolicy;
3271
3405
  //#endregion
3272
- export { resolveSlackRuntimeGroupPolicy as n, monitorSlackProvider as t };
3406
+ export { resolveSlackRuntimeGroupPolicy as n, escapeSlackMrkdwn as r, monitorSlackProvider as t };
@@ -1,7 +1,7 @@
1
- import { r as SLACK_TEXT_LIMIT } from "./thread-ts-o-QBwB3k.js";
2
- import { t as resolveSlackReplyBlocks } from "./reply-blocks-DWoZrUll.js";
3
- import { o as markdownToSlackMrkdwnChunks, t as sendMessageSlack } from "./send-ioky2Xpy.js";
4
- import "./send.runtime-DoifekaA.js";
1
+ import { t as resolveSlackReplyBlocks } from "./reply-blocks-BFaJ_ejG.js";
2
+ import { o as SLACK_TEXT_LIMIT } from "./thread-ts-As_dcNbD.js";
3
+ import { o as markdownToSlackMrkdwnChunks, t as sendMessageSlack } from "./send-CxXFbqN1.js";
4
+ import "./send.runtime-BHCPpSj_.js";
5
5
  import { createReplyReferencePlanner } from "openclaw/plugin-sdk/reply-reference";
6
6
  import { SILENT_REPLY_TOKEN, chunkMarkdownTextWithMode, isSilentReplyText } from "openclaw/plugin-sdk/reply-chunking";
7
7
  import { deliverTextOrMediaReply, resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
@@ -0,0 +1,134 @@
1
+ import { a as resolveSlackAccount, i as resolveDefaultSlackAccountId, o as resolveSlackAccountAllowFrom, r as mergeSlackAccountConfig } from "./accounts-yk5K3wQU.js";
2
+ import { t as buildSlackInteractiveBlocks } from "./blocks-render-BAVfd6r0.js";
3
+ import { i as parseSlackBlocksInput } from "./thread-ts-As_dcNbD.js";
4
+ import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
5
+ import { normalizeStringifiedOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
+ import { doesApprovalRequestMatchChannelAccount } from "openclaw/plugin-sdk/approval-native-runtime";
7
+ import { createResolvedApproverActionAuthAdapter, resolveApprovalApprovers } from "openclaw/plugin-sdk/approval-auth-runtime";
8
+ import { createChannelExecApprovalProfile, isChannelExecApprovalTargetRecipient } from "openclaw/plugin-sdk/approval-client-runtime";
9
+ import { normalizeHyphenSlug } from "openclaw/plugin-sdk/string-normalization-runtime";
10
+ import { resolveToolsBySender } from "openclaw/plugin-sdk/channel-policy";
11
+ //#region extensions/slack/src/exec-approvals.ts
12
+ function normalizeSlackApproverId(value) {
13
+ const trimmed = normalizeStringifiedOptionalString(value);
14
+ if (!trimmed) return;
15
+ const prefixed = trimmed.match(/^(?:slack|user):([A-Z0-9]+)$/i);
16
+ if (prefixed?.[1]) return prefixed[1];
17
+ const mention = trimmed.match(/^<@([A-Z0-9]+)>$/i);
18
+ if (mention?.[1]) return mention[1];
19
+ return /^[UW][A-Z0-9]+$/i.test(trimmed) ? trimmed : void 0;
20
+ }
21
+ function resolveSlackOwnerApprovers(cfg) {
22
+ const ownerAllowFrom = cfg.commands?.ownerAllowFrom;
23
+ if (!Array.isArray(ownerAllowFrom) || ownerAllowFrom.length === 0) return [];
24
+ return resolveApprovalApprovers({
25
+ explicit: ownerAllowFrom,
26
+ normalizeApprover: normalizeSlackApproverId
27
+ });
28
+ }
29
+ function getSlackExecApprovalApprovers(params) {
30
+ const account = resolveSlackAccount(params).config;
31
+ return resolveApprovalApprovers({
32
+ explicit: account.execApprovals?.approvers ?? resolveSlackOwnerApprovers(params.cfg),
33
+ normalizeApprover: normalizeSlackApproverId
34
+ });
35
+ }
36
+ function isSlackExecApprovalTargetRecipient(params) {
37
+ return isChannelExecApprovalTargetRecipient({
38
+ ...params,
39
+ channel: "slack",
40
+ normalizeSenderId: normalizeSlackApproverId,
41
+ matchTarget: ({ target, normalizedSenderId }) => normalizeSlackApproverId(target.to) === normalizedSenderId
42
+ });
43
+ }
44
+ const slackExecApprovalProfile = createChannelExecApprovalProfile({
45
+ resolveConfig: (params) => resolveSlackAccount(params).config.execApprovals,
46
+ resolveApprovers: getSlackExecApprovalApprovers,
47
+ normalizeSenderId: normalizeSlackApproverId,
48
+ isTargetRecipient: isSlackExecApprovalTargetRecipient,
49
+ matchesRequestAccount: (params) => doesApprovalRequestMatchChannelAccount({
50
+ cfg: params.cfg,
51
+ request: params.request,
52
+ channel: "slack",
53
+ accountId: params.accountId
54
+ })
55
+ });
56
+ const isSlackExecApprovalClientEnabled = slackExecApprovalProfile.isClientEnabled;
57
+ slackExecApprovalProfile.isApprover;
58
+ const isSlackExecApprovalAuthorizedSender = slackExecApprovalProfile.isAuthorizedSender;
59
+ const resolveSlackExecApprovalTarget = slackExecApprovalProfile.resolveTarget;
60
+ const shouldHandleSlackExecApprovalRequest = slackExecApprovalProfile.shouldHandleRequest;
61
+ const shouldSuppressLocalSlackExecApprovalPrompt = slackExecApprovalProfile.shouldSuppressLocalPrompt;
62
+ //#endregion
63
+ //#region extensions/slack/src/approval-auth.ts
64
+ function getSlackApprovalApprovers(params) {
65
+ const account = resolveSlackAccount(params).config;
66
+ return resolveApprovalApprovers({
67
+ allowFrom: resolveSlackAccountAllowFrom(params),
68
+ defaultTo: account.defaultTo,
69
+ normalizeApprover: normalizeSlackApproverId,
70
+ normalizeDefaultTo: normalizeSlackApproverId
71
+ });
72
+ }
73
+ function isSlackApprovalAuthorizedSender(params) {
74
+ const senderId = params.senderId ? normalizeSlackApproverId(params.senderId) : void 0;
75
+ if (!senderId) return false;
76
+ return getSlackApprovalApprovers(params).includes(senderId);
77
+ }
78
+ createResolvedApproverActionAuthAdapter({
79
+ channelLabel: "Slack",
80
+ resolveApprovers: ({ cfg, accountId }) => getSlackApprovalApprovers({
81
+ cfg,
82
+ accountId
83
+ }),
84
+ normalizeSenderId: (value) => normalizeSlackApproverId(value)
85
+ });
86
+ //#endregion
87
+ //#region extensions/slack/src/group-policy.ts
88
+ function resolveSlackChannelPolicyEntry(params) {
89
+ const accountId = normalizeAccountId(params.accountId ?? resolveDefaultSlackAccountId(params.cfg));
90
+ const channelMap = mergeSlackAccountConfig(params.cfg, accountId).channels ?? {};
91
+ if (Object.keys(channelMap).length === 0) return;
92
+ const channelId = params.groupId?.trim();
93
+ const channelName = params.groupChannel?.replace(/^#/, "");
94
+ const normalizedName = normalizeHyphenSlug(channelName);
95
+ const candidates = [
96
+ channelId ?? "",
97
+ channelName ? `#${channelName}` : "",
98
+ channelName ?? "",
99
+ normalizedName
100
+ ].filter(Boolean);
101
+ for (const candidate of candidates) if (candidate && channelMap[candidate]) return channelMap[candidate];
102
+ return channelMap["*"];
103
+ }
104
+ function resolveSenderToolsEntry(entry, params) {
105
+ if (!entry) return;
106
+ return resolveToolsBySender({
107
+ toolsBySender: entry.toolsBySender,
108
+ senderId: params.senderId,
109
+ senderName: params.senderName,
110
+ senderUsername: params.senderUsername,
111
+ senderE164: params.senderE164
112
+ }) ?? entry.tools;
113
+ }
114
+ function resolveSlackGroupRequireMention(params) {
115
+ const resolved = resolveSlackChannelPolicyEntry(params);
116
+ if (typeof resolved?.requireMention === "boolean") return resolved.requireMention;
117
+ return true;
118
+ }
119
+ function resolveSlackGroupToolPolicy(params) {
120
+ return resolveSenderToolsEntry(resolveSlackChannelPolicyEntry(params), params);
121
+ }
122
+ //#endregion
123
+ //#region extensions/slack/src/reply-blocks.ts
124
+ function resolveSlackReplyBlocks(payload) {
125
+ const slackData = payload.channelData?.slack;
126
+ const interactiveBlocks = buildSlackInteractiveBlocks(payload.interactive);
127
+ let channelBlocks = [];
128
+ if (slackData && typeof slackData === "object" && !Array.isArray(slackData)) channelBlocks = parseSlackBlocksInput(slackData.blocks) ?? [];
129
+ const blocks = [...channelBlocks, ...interactiveBlocks];
130
+ if (blocks.length > 50) throw new Error(`Slack blocks cannot exceed 50 items after interactive render`);
131
+ return blocks.length > 0 ? blocks : void 0;
132
+ }
133
+ //#endregion
134
+ export { getSlackExecApprovalApprovers as a, normalizeSlackApproverId as c, shouldSuppressLocalSlackExecApprovalPrompt as d, isSlackApprovalAuthorizedSender as i, resolveSlackExecApprovalTarget as l, resolveSlackGroupRequireMention as n, isSlackExecApprovalAuthorizedSender as o, resolveSlackGroupToolPolicy as r, isSlackExecApprovalClientEnabled as s, resolveSlackReplyBlocks as t, shouldHandleSlackExecApprovalRequest as u };
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
2
- import { r as createSlackWebClient } from "./client-8r7r7aZ3.js";
3
- import { n as resolveSlackAllowlistEntries, t as collectSlackCursorItems } from "./resolve-allowlist-common-rhfyDyWi.js";
2
+ import { r as createSlackWebClient } from "./client-C_IaJbi5.js";
3
+ import { n as resolveSlackAllowlistEntries, t as collectSlackCursorItems } from "./resolve-allowlist-common-DLub2I2i.js";
4
4
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/slack/src/resolve-channels.ts
6
6
  var resolve_channels_exports = /* @__PURE__ */ __exportAll({ resolveSlackChannelAllowlist: () => resolveSlackChannelAllowlist });
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-CiIaOW0V.js";
2
- import { r as createSlackWebClient } from "./client-8r7r7aZ3.js";
3
- import { n as resolveSlackAllowlistEntries, t as collectSlackCursorItems } from "./resolve-allowlist-common-rhfyDyWi.js";
2
+ import { r as createSlackWebClient } from "./client-C_IaJbi5.js";
3
+ import { n as resolveSlackAllowlistEntries, t as collectSlackCursorItems } from "./resolve-allowlist-common-DLub2I2i.js";
4
4
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/slack/src/resolve-users.ts
6
6
  var resolve_users_exports = /* @__PURE__ */ __exportAll({ resolveSlackUserAllowlist: () => resolveSlackUserAllowlist });
@@ -1,5 +1,5 @@
1
- import { a as normalizeSlackSlug, i as normalizeSlackAllowOwnerEntry, n as normalizeAllowList, o as resolveSlackAllowListMatch, r as normalizeAllowListLower, t as allowListMatches } from "./allow-list-T7ZDpUsF.js";
2
- import { t as formatSlackError } from "./errors-BrtayXHa.js";
1
+ import { a as normalizeSlackSlug, i as normalizeSlackAllowOwnerEntry, n as normalizeAllowList, o as resolveSlackAllowListMatch, r as normalizeAllowListLower, t as allowListMatches } from "./allow-list-nwXs_eCP.js";
2
+ import { t as formatSlackError } from "./errors-C_sW0Zgl.js";
3
3
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { resolveAgentRoute, resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing";
5
5
  import { createChannelPairingChallengeIssuer } from "openclaw/plugin-sdk/channel-pairing";
@@ -1,6 +1,6 @@
1
1
  import "./target-parsing-CQmv-iSm.js";
2
- import "./channel-api-BfBK89IN.js";
3
- import "./config-api-B48Z4H47.js";
2
+ import "./client-C_IaJbi5.js";
3
+ import "./config-api-CmgE_ORg.js";
4
4
  import { createActionGate as createActionGate$1, imageResultFromFile, jsonResult, readNumberParam, readReactionParams, readStringParam, withNormalizedTimestamp } from "openclaw/plugin-sdk/channel-actions";
5
5
  import "openclaw/plugin-sdk/account-id";
6
6
  import "openclaw/plugin-sdk/channel-status";
@@ -1,14 +1,14 @@
1
1
  import { a as resolveSlackAccount, d as resolveSlackBotToken, i as resolveDefaultSlackAccountId, n as listSlackAccountIds, t as listEnabledSlackAccounts, u as resolveSlackAppToken } from "./accounts-yk5K3wQU.js";
2
- import { n as resolveSlackGroupToolPolicy, t as resolveSlackGroupRequireMention } from "./group-policy-utF2iWnE.js";
3
- import { n as setSlackRuntime } from "./runtime--VlVtTPu.js";
4
- import { t as sendMessageSlack } from "./send-ioky2Xpy.js";
5
- 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-Cqyj7oRr.js";
6
- import { t as probeSlack } from "./probe-D1wYA05H.js";
7
- import { t as resolveSlackChannelAllowlist } from "./resolve-channels-BiVxSLVm.js";
8
- import { t as resolveSlackUserAllowlist } from "./resolve-users-CcpSlYw-.js";
9
- import { t as monitorSlackProvider } from "./provider-Ut7IF0Mn.js";
10
- import { t as registerSlackPluginHttpRoutes } from "./plugin-routes-Dt_jh9W8.js";
11
- import { n as slackActionRuntime, t as handleSlackAction } from "./action-runtime-gtC-RM3r.js";
12
- import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./directory-live-CuaWaGnM.js";
13
- import "./monitor-B3QB1ysK.js";
2
+ import { n as resolveSlackGroupRequireMention, r as resolveSlackGroupToolPolicy } from "./reply-blocks-BFaJ_ejG.js";
3
+ import { n as setSlackRuntime } from "./runtime-DQxkf7k2.js";
4
+ import { t as sendMessageSlack } from "./send-CxXFbqN1.js";
5
+ 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-BCRbHv1Q.js";
6
+ import { t as probeSlack } from "./probe-FL4sUJsH.js";
7
+ import { t as resolveSlackChannelAllowlist } from "./resolve-channels-B_eKaOkE.js";
8
+ import { t as resolveSlackUserAllowlist } from "./resolve-users-BzBAJwvq.js";
9
+ import { t as monitorSlackProvider } from "./provider-bKg1hkf5.js";
10
+ import { t as registerSlackPluginHttpRoutes } from "./plugin-routes-CRnfsTTX.js";
11
+ import { n as slackActionRuntime, t as handleSlackAction } from "./action-runtime-p39JLqwf.js";
12
+ import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./directory-live-CZPzpQZF.js";
13
+ import "./monitor-CdVxsuHi.js";
14
14
  export { deleteSlackMessage, editSlackMessage, getSlackMemberInfo, handleSlackAction, listEnabledSlackAccounts, listSlackAccountIds, listSlackDirectoryGroupsLive, listSlackDirectoryPeersLive, listSlackEmojis, listSlackPins, listSlackReactions, monitorSlackProvider, pinSlackMessage, probeSlack, reactSlackMessage, readSlackMessages, registerSlackPluginHttpRoutes, removeOwnSlackReactions, removeSlackReaction, resolveDefaultSlackAccountId, resolveSlackAccount, resolveSlackAppToken, resolveSlackBotToken, resolveSlackChannelAllowlist, resolveSlackGroupRequireMention, resolveSlackGroupToolPolicy, resolveSlackUserAllowlist, sendMessageSlack, sendSlackMessage, setSlackRuntime, slackActionRuntime, unpinSlackMessage };
@@ -1,2 +1,2 @@
1
- import { n as setSlackRuntime } from "./runtime--VlVtTPu.js";
1
+ import { n as setSlackRuntime } from "./runtime-DQxkf7k2.js";
2
2
  export { setSlackRuntime };
@@ -1,5 +1,5 @@
1
- import { r as createSlackWebClient } from "./client-8r7r7aZ3.js";
2
- import { t as formatSlackError } from "./errors-BrtayXHa.js";
1
+ import { r as createSlackWebClient } from "./client-C_IaJbi5.js";
2
+ import { t as formatSlackError } from "./errors-C_sW0Zgl.js";
3
3
  import { isRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  //#region extensions/slack/src/scopes.ts
5
5
  function collectScopes(value, into) {
@@ -1,2 +1,2 @@
1
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-BurGIyhv.js";
1
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-0TL3L5Kb.js";
2
2
  export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
@@ -1,2 +1,2 @@
1
- import { t as collectSlackSecurityAuditFindings } from "./security-audit-DvOpSaZM.js";
1
+ import { t as collectSlackSecurityAuditFindings } from "./security-audit-BJzADAw3.js";
2
2
  export { collectSlackSecurityAuditFindings };
@@ -1,11 +1,10 @@
1
1
  import { a as resolveSlackAccount, d as resolveSlackBotToken } from "./accounts-yk5K3wQU.js";
2
2
  import { r as parseSlackTarget } from "./target-parsing-CQmv-iSm.js";
3
3
  import "./targets-B1tYCAr6.js";
4
- import { i as truncateSlackText, r as SLACK_TEXT_LIMIT, t as normalizeSlackThreadTsCandidate } from "./thread-ts-o-QBwB3k.js";
5
- import { a as getSlackWriteClient, n as createSlackTokenCacheKey } from "./client-8r7r7aZ3.js";
6
- import { r as validateSlackBlocksArray } from "./blocks-input-BJZ8vv03.js";
7
- import { t as getOptionalSlackRuntime } from "./runtime--VlVtTPu.js";
8
- import { i as loadOutboundMediaFromUrl } from "./runtime-api-D8wiG9BS.js";
4
+ import { a as validateSlackBlocksArray, o as SLACK_TEXT_LIMIT, s as truncateSlackText, t as normalizeSlackThreadTsCandidate } from "./thread-ts-As_dcNbD.js";
5
+ import { a as getSlackWriteClient, n as createSlackTokenCacheKey } from "./client-C_IaJbi5.js";
6
+ import { t as getOptionalSlackRuntime } from "./runtime-DQxkf7k2.js";
7
+ import { i as loadOutboundMediaFromUrl } from "./runtime-api-B5HGOzX3.js";
9
8
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
10
9
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-message";
11
10
  import { withTrustedEnvProxyGuardedFetchMode } from "openclaw/plugin-sdk/fetch-runtime";
@@ -299,7 +298,7 @@ function hasCustomIdentity(identity) {
299
298
  }
300
299
  function buildSlackUnfurlPayload(options) {
301
300
  return {
302
- ...typeof options?.unfurlLinks === "boolean" ? { unfurl_links: options.unfurlLinks } : {},
301
+ unfurl_links: options?.unfurlLinks ?? false,
303
302
  ...typeof options?.unfurlMedia === "boolean" ? { unfurl_media: options.unfurlMedia } : {}
304
303
  };
305
304
  }
@@ -0,0 +1,2 @@
1
+ import "./send-CxXFbqN1.js";
2
+ export {};
@@ -0,0 +1,2 @@
1
+ import { t as sendMessageSlack } from "./send-CxXFbqN1.js";
2
+ export { sendMessageSlack };