@openclaw/slack 2026.9.8 → 2026.10.1-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 (103) hide show
  1. package/dist/.setup/{account-inspect-DWBXpER6.mjs → account-inspect-Cs-7DXXW.mjs} +1 -1
  2. package/dist/.setup/{accounts-D_N9IqNA.mjs → accounts-CDgkV7Cm.mjs} +4 -16
  3. package/dist/.setup/{action-runtime-DfWvuiZd.mjs → action-runtime-DJ1daRAZ.mjs} +5 -7
  4. package/dist/.setup/action-runtime.runtime-CdWL2mLC.mjs +2 -0
  5. package/dist/.setup/{actions-Df0CzcDl.mjs → actions-DDoAJnrH.mjs} +16 -35
  6. package/dist/.setup/{approval-handler.runtime-Ed6Sw5VK.mjs → approval-handler.runtime-BcE_shWc.mjs} +5 -5
  7. package/dist/.setup/{approval-message-updates-BadvtA7R.mjs → approval-message-updates-EgKGmFXx.mjs} +1 -1
  8. package/dist/.setup/{channel-C7bgPSTE.mjs → channel-DgKSu8Iv.mjs} +46 -48
  9. package/dist/.setup/{channel-type-ClOttrZ5.mjs → channel-type-B9zYYzBU.mjs} +4 -4
  10. package/dist/.setup/{channel.setup-Dh2jzAjN.mjs → channel.setup-BYIlwbQ7.mjs} +27 -27
  11. package/dist/.setup/{config-schema-BZCxmHKG.mjs → config-schema-BH0K9-Um.mjs} +4 -0
  12. package/dist/.setup/{directory-config-BOUWH3hR.mjs → directory-config-B_by7zrc.mjs} +2 -2
  13. package/dist/.setup/{directory-live-B2O4B_Ho.mjs → directory-live-C48wazJt.mjs} +3 -3
  14. package/dist/.setup/{doctor-contract-CRN1Z_c7.mjs → doctor-contract-Cd4-VzIM.mjs} +28 -28
  15. package/dist/.setup/{message-tool-api-Cu4lwlGy.mjs → message-tool-api-CcjLPN3v.mjs} +2 -2
  16. package/dist/.setup/{monitor-BPVfkumU.mjs → monitor-BuYBDmm7.mjs} +190 -315
  17. package/dist/.setup/{outbound-adapter-Bv48XUjq.mjs → outbound-adapter-BZFkK-mw.mjs} +6 -17
  18. package/dist/.setup/{pipeline.runtime-B1H63Frf.mjs → pipeline.runtime-CIepKmZt.mjs} +241 -247
  19. package/dist/.setup/{policy-D-jfM174.mjs → policy-KKTqEiDv.mjs} +12 -22
  20. package/dist/.setup/{probe-B2Y9qc_z.mjs → probe-BVlJ3dp0.mjs} +4 -7
  21. package/dist/.setup/{relay-source-BpKdjsll.mjs → relay-source-CC3h6M7y.mjs} +2 -2
  22. package/dist/.setup/{replies-BAnUtr2f.mjs → replies-DHbuthIR.mjs} +12 -26
  23. package/dist/.setup/{reply-blocks-SE1kTE3I.mjs → reply-blocks-CKnO4BSG.mjs} +4 -29
  24. package/dist/.setup/{resolve-channels-XXBn8UU_.mjs → resolve-channels-HR0TgArR.mjs} +2 -2
  25. package/dist/.setup/{resolve-users-DW0ngD03.mjs → resolve-users-BNYBhF0q.mjs} +4 -4
  26. package/dist/.setup/rolldown-runtime-B4FMCO8f.mjs +28 -0
  27. package/dist/.setup/{scopes-CasuDvaa.mjs → scopes-DrDbyUH2.mjs} +1 -1
  28. package/dist/.setup/secret-contract-B-Qm6aQQ.mjs +65 -0
  29. package/dist/.setup/{secret-contract-api-Dp6290Vg.mjs → secret-contract-api-DmUVxIRs.mjs} +1 -1
  30. package/dist/.setup/{security-audit-BqDc-6VL.mjs → security-audit-C1nOGzJa.mjs} +1 -1
  31. package/dist/.setup/{send-BOVLQi3n.mjs → send-CgPI3Zj8.mjs} +22 -53
  32. package/dist/.setup/{session-status-DscajIsd.mjs → session-status-D46GHwOV.mjs} +39 -49
  33. package/dist/.setup/{setup-plugin-api-DTtbTKNk.mjs → setup-plugin-api-ZrHs0N4U.mjs} +1 -1
  34. package/dist/.setup/{setup-surface-Dn7QgWRE.mjs → setup-surface-83lxvE2y.mjs} +10 -13
  35. package/dist/.setup/{shared-qau-uDGl.mjs → shared-VtmYNj-v.mjs} +53 -57
  36. package/dist/.setup/{slash-dispatch.runtime--AEzLVBF.mjs → slash-dispatch.runtime-gBj_uaLM.mjs} +1 -1
  37. package/dist/account-inspect-api.js +1 -1
  38. package/dist/api.js +13 -13
  39. package/dist/channel-config-api.js +1 -1
  40. package/dist/channel-plugin-api.js +1 -1
  41. package/dist/control-ui/2f4b1e827be6b68ced2ea0d8b7da8529a4eafbe72be27ee37e1064bdd530ec10/index.js +1 -0
  42. package/dist/directory-contract-api.js +1 -1
  43. package/dist/doctor-contract-api.js +1 -1
  44. package/dist/message-tool-api.js +1 -1
  45. package/dist/runtime-api.js +10 -10
  46. package/dist/secret-contract-api.js +1 -1
  47. package/dist/security-contract-api.js +1 -1
  48. package/dist/setup-entry.js +2 -2
  49. package/dist/setup-plugin-api.js +1 -1
  50. package/node_modules/undici/README.md +10 -1
  51. package/node_modules/undici/docs/docs/api/Agent.md +8 -8
  52. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +9 -6
  53. package/node_modules/undici/docs/docs/api/Dispatcher.md +9 -0
  54. package/node_modules/undici/docs/docs/api/Errors.md +25 -0
  55. package/node_modules/undici/docs/docs/api/Fetch.md +10 -0
  56. package/node_modules/undici/docs/docs/api/Interceptors.md +4 -3
  57. package/node_modules/undici/docs/docs/api/Pool.md +5 -6
  58. package/node_modules/undici/docs/docs/index.md +10 -1
  59. package/node_modules/undici/lib/api/readable.js +1 -2
  60. package/node_modules/undici/lib/core/request.js +23 -2
  61. package/node_modules/undici/lib/core/util.js +0 -39
  62. package/node_modules/undici/lib/dispatcher/client-h1.js +11 -4
  63. package/node_modules/undici/lib/dispatcher/client-h2.js +52 -8
  64. package/node_modules/undici/lib/dispatcher/client.js +6 -1
  65. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +21 -6
  66. package/node_modules/undici/lib/dispatcher/pool-base.js +63 -2
  67. package/node_modules/undici/lib/dispatcher/pool.js +90 -7
  68. package/node_modules/undici/lib/dispatcher/proxy-agent.js +16 -3
  69. package/node_modules/undici/lib/handler/deduplication-handler.js +24 -11
  70. package/node_modules/undici/lib/handler/redirect-handler.js +5 -0
  71. package/node_modules/undici/lib/handler/retry-handler.js +72 -13
  72. package/node_modules/undici/lib/interceptor/cache.js +4 -1
  73. package/node_modules/undici/lib/interceptor/decompress.js +236 -69
  74. package/node_modules/undici/lib/web/cache/cache.js +17 -8
  75. package/node_modules/undici/lib/web/cache/cachestorage.js +11 -5
  76. package/node_modules/undici/lib/web/cookies/index.js +19 -7
  77. package/node_modules/undici/lib/web/cookies/util.js +3 -1
  78. package/node_modules/undici/lib/web/eventsource/eventsource.js +25 -1
  79. package/node_modules/undici/lib/web/fetch/body.js +22 -15
  80. package/node_modules/undici/lib/web/fetch/data-url.js +6 -6
  81. package/node_modules/undici/lib/web/fetch/formdata.js +30 -36
  82. package/node_modules/undici/lib/web/fetch/headers.js +34 -31
  83. package/node_modules/undici/lib/web/fetch/index.js +46 -25
  84. package/node_modules/undici/lib/web/fetch/request.js +74 -79
  85. package/node_modules/undici/lib/web/fetch/response.js +43 -44
  86. package/node_modules/undici/lib/web/fetch/util.js +7 -7
  87. package/node_modules/undici/lib/web/infra/index.js +16 -1
  88. package/node_modules/undici/lib/web/webidl/index.js +2 -14
  89. package/node_modules/undici/lib/web/websocket/connection.js +33 -12
  90. package/node_modules/undici/lib/web/websocket/events.js +43 -26
  91. package/node_modules/undici/lib/web/websocket/receiver.js +2 -0
  92. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +13 -10
  93. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +19 -4
  94. package/node_modules/undici/lib/web/websocket/websocket.js +44 -41
  95. package/node_modules/undici/package.json +1 -1
  96. package/node_modules/undici/types/diagnostics-channel.d.ts +2 -1
  97. package/node_modules/undici/types/interceptors.d.ts +1 -1
  98. package/node_modules/undici/types/webidl.d.ts +13 -7
  99. package/openclaw.plugin.json +4 -1
  100. package/package.json +14 -6
  101. package/dist/.setup/action-runtime.runtime-Ck4bAWOX.mjs +0 -2
  102. package/dist/.setup/secret-contract-BaZcu6P_.mjs +0 -82
  103. package/dist/.setup/streaming-compat-C5Wut626.mjs +0 -62
@@ -1,8 +1,8 @@
1
1
  import { n as isSlackPluginAccountConfigured } from "./account-configured-sUohAxZr.mjs";
2
- import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, o as resolveDefaultSlackAccountId, s as resolveSlackAccount } from "./accounts-D_N9IqNA.mjs";
2
+ import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, o as resolveDefaultSlackAccountId, s as resolveSlackAccount } from "./accounts-CDgkV7Cm.mjs";
3
3
  import { a as parseSlackTarget, n as formatSlackTarget, t as canonicalizeSlackApiTargetId } from "./target-parsing-FFE26kOV.mjs";
4
4
  import { t as slackContextTargetsMatch } from "./targets-C6LZQL1Q.mjs";
5
- import { A as resolveSlackUserAllowListForTeam, k as resolveSlackAllowListMatch, o as formatSlackError } from "./probe-B2Y9qc_z.mjs";
5
+ import { A as resolveSlackUserAllowListForTeam, k as resolveSlackAllowListMatch, o as formatSlackError } from "./probe-BVlJ3dp0.mjs";
6
6
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
7
7
  import { asOptionalRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringifiedOptionalString, readNonBlankString } from "openclaw/plugin-sdk/string-coerce-runtime";
8
8
  import { normalizeMessageChannel } from "openclaw/plugin-sdk/routing";
@@ -1284,8 +1284,7 @@ const SLACK_QUESTION_VALUE_PREFIX = "slq1:";
1284
1284
  const QUESTION_RECORD_ID_PATTERN = /^ask_[a-f0-9]{32}$/u;
1285
1285
  function encodeSlackQuestionAction(action) {
1286
1286
  if (!QUESTION_RECORD_ID_PATTERN.test(action.questionId) || !Number.isInteger(action.optionIndex) || action.optionIndex < 0 || action.optionIndex > 3) return;
1287
- const value = `${SLACK_QUESTION_VALUE_PREFIX}${action.questionId}:${action.optionIndex}`;
1288
- return value.length <= 2e3 ? value : void 0;
1287
+ return `${SLACK_QUESTION_VALUE_PREFIX}${action.questionId}:${action.optionIndex}`;
1289
1288
  }
1290
1289
  function decodeSlackQuestionAction(value) {
1291
1290
  if (typeof value !== "string" || value.length > 2e3) return null;
@@ -1322,9 +1321,21 @@ const SLACK_CALLBACK_SELECT_ACTION_ID = "openclaw:callback_select";
1322
1321
  const SLACK_APPROVAL_BUTTON_ACTION_ID = "openclaw:approval_button";
1323
1322
  const SLACK_APPROVAL_SELECT_ACTION_ID = "openclaw:approval_select";
1324
1323
  const SLACK_QUESTION_BUTTON_ACTION_ID = "openclaw:question_button";
1324
+ const SLACK_BUTTON_ACTION_IDS = {
1325
+ approval: SLACK_APPROVAL_BUTTON_ACTION_ID,
1326
+ callback: SLACK_CALLBACK_BUTTON_ACTION_ID,
1327
+ link: SLACK_REPLY_LINK_ACTION_ID,
1328
+ question: SLACK_QUESTION_BUTTON_ACTION_ID,
1329
+ reply: SLACK_REPLY_BUTTON_ACTION_ID
1330
+ };
1331
+ const SLACK_SELECT_ACTION_IDS = {
1332
+ approval: SLACK_APPROVAL_SELECT_ACTION_ID,
1333
+ callback: SLACK_CALLBACK_SELECT_ACTION_ID,
1334
+ reply: SLACK_REPLY_SELECT_ACTION_ID
1335
+ };
1325
1336
  const SLACK_QUESTION_FINALIZATION_BLOCKS = Symbol("slackQuestionFinalizationBlocks");
1326
1337
  function isSlackQuestionActionId(actionId) {
1327
- return actionId === "openclaw:question_button" || actionId.startsWith(`openclaw:question_button:`);
1338
+ return actionId === SLACK_QUESTION_BUTTON_ACTION_ID || actionId.startsWith(`${SLACK_QUESTION_BUTTON_ACTION_ID}:`);
1328
1339
  }
1329
1340
  /** Read only question control identities from the blocks actually sent to Slack. */
1330
1341
  function resolveSlackQuestionActionIds(blocks) {
@@ -1334,10 +1345,10 @@ function resolveSlackQuestionActionIds(blocks) {
1334
1345
  });
1335
1346
  }
1336
1347
  function isSlackApprovalActionId(actionId) {
1337
- return actionId === "openclaw:approval_button" || actionId === "openclaw:approval_select" || actionId.startsWith(`openclaw:approval_button:`) || actionId.startsWith(`openclaw:approval_select:`);
1348
+ return actionId === SLACK_APPROVAL_BUTTON_ACTION_ID || actionId === SLACK_APPROVAL_SELECT_ACTION_ID || actionId.startsWith(`${SLACK_APPROVAL_BUTTON_ACTION_ID}:`) || actionId.startsWith(`${SLACK_APPROVAL_SELECT_ACTION_ID}:`);
1338
1349
  }
1339
1350
  function isSlackCallbackActionId(actionId) {
1340
- return actionId === "openclaw:callback_button" || actionId === "openclaw:callback_select" || actionId.startsWith(`openclaw:callback_button:`) || actionId.startsWith(`openclaw:callback_select:`);
1351
+ return actionId === SLACK_CALLBACK_BUTTON_ACTION_ID || actionId === SLACK_CALLBACK_SELECT_ACTION_ID || actionId.startsWith(`${SLACK_CALLBACK_BUTTON_ACTION_ID}:`) || actionId.startsWith(`${SLACK_CALLBACK_SELECT_ACTION_ID}:`);
1341
1352
  }
1342
1353
  //#endregion
1343
1354
  //#region extensions/slack/src/truncate.ts
@@ -1390,35 +1401,26 @@ const SLACK_SELECT_ELEMENT_TYPES = /* @__PURE__ */ new Set([
1390
1401
  ]);
1391
1402
  function readTextObject(value, options = {}) {
1392
1403
  const record = asOptionalRecord(value);
1393
- if (!record) return;
1394
1404
  const text = normalizeOptionalString(record?.text);
1395
1405
  if (!text) return;
1396
- return record.type === "plain_text" && options.nativeDataFormat !== "plain" ? escapeSlackMrkdwn(text) : text;
1397
- }
1398
- function readTextValue(value, options = {}) {
1399
- return normalizeOptionalString(value) ?? readTextObject(value, options);
1400
- }
1401
- function readImageText(block) {
1402
- const altText = normalizeOptionalString(block.alt_text);
1403
- return (altText ? escapeSlackMrkdwn(altText) : void 0) ?? readTextObject(block.title);
1406
+ return record?.type === "plain_text" && options.nativeDataFormat !== "plain" ? escapeSlackMrkdwn(text) : text;
1404
1407
  }
1405
- function readVideoText(block, options = {}) {
1406
- const altText = normalizeOptionalString(block.alt_text);
1407
- return readTextObject(block.title, options) ?? (altText ? escapeSlackMrkdwn(altText) : void 0);
1408
+ function readAltText(value) {
1409
+ const text = normalizeOptionalString(value);
1410
+ return text ? escapeSlackMrkdwn(text) : void 0;
1408
1411
  }
1409
1412
  function readContextText(block, options = {}) {
1410
1413
  if (!Array.isArray(block.elements)) return;
1411
1414
  const parts = block.elements.map((element) => {
1412
1415
  const record = asOptionalRecord(element);
1413
- const altText = normalizeOptionalString(record?.alt_text);
1414
- return readTextObject(record, options) ?? (altText ? escapeSlackMrkdwn(altText) : void 0);
1416
+ return readTextObject(record, options) ?? readAltText(record?.alt_text);
1415
1417
  }).filter((part) => Boolean(part));
1416
1418
  return parts.length > 0 ? parts.join(" ") : void 0;
1417
1419
  }
1418
1420
  function readControlElementText(value, options = {}) {
1419
1421
  const element = asOptionalRecord(value);
1420
1422
  const type = normalizeOptionalString(element?.type);
1421
- if (type === "button" || type === "workflow_button") return readTextValue(element?.text, options);
1423
+ if (type === "button" || type === "workflow_button") return normalizeOptionalString(element?.text) ?? readTextObject(element?.text, options);
1422
1424
  if (type && SLACK_SELECT_ELEMENT_TYPES.has(type)) {
1423
1425
  if (!options.includeSelectOptions) return readTextObject(element?.placeholder, options);
1424
1426
  const choices = Array.isArray(element?.options) ? element.options : [];
@@ -1436,9 +1438,6 @@ function readSectionText(block, options = {}) {
1436
1438
  const visibleParts = parts.filter((part) => Boolean(part));
1437
1439
  return visibleParts.length > 0 ? visibleParts.join("\n") : void 0;
1438
1440
  }
1439
- function readActionsText(block, options = {}) {
1440
- return Array.isArray(block.elements) ? readControlElementsText(block.elements, options) : void 0;
1441
- }
1442
1441
  /** Read only user-visible text from one Slack block. */
1443
1442
  function renderSlackBlockFallbackText(raw, options = {}) {
1444
1443
  const block = asOptionalRecord(raw);
@@ -1447,11 +1446,11 @@ function renderSlackBlockFallbackText(raw, options = {}) {
1447
1446
  case "rich_text": return normalizeOptionalString(renderSlackRichText(block.elements, options.nativeReferenceFormat === "plain" ? "native-reference" : "escaped", "\n"));
1448
1447
  case "header": return readTextObject(block.text, options);
1449
1448
  case "section": return readSectionText(block, options);
1450
- case "image": return readImageText(block) ?? "Shared an image";
1451
- case "video": return readVideoText(block, options) ?? "Shared a video";
1449
+ case "image": return readAltText(block.alt_text) ?? readTextObject(block.title) ?? "Shared an image";
1450
+ case "video": return readTextObject(block.title, options) ?? readAltText(block.alt_text) ?? "Shared a video";
1452
1451
  case "file": return "Shared a file";
1453
1452
  case "context": return readContextText(block, options);
1454
- case "actions": return readActionsText(block, options);
1453
+ case "actions": return Array.isArray(block.elements) ? readControlElementsText(block.elements, options) : void 0;
1455
1454
  case "data_visualization": return renderSlackDataVisualizationFallbackText(block, options.nativeDataFormat !== "plain");
1456
1455
  case "data_table": return renderSlackDataTableFallbackText(block, options.nativeDataFormat !== "plain");
1457
1456
  case "table": return renderSlackTableFallbackText(block, options.nativeDataFormat !== "plain");
@@ -1594,29 +1593,20 @@ function assertSlackDetachedTargetAllowed(accountId, teamId) {
1594
1593
  //#endregion
1595
1594
  //#region extensions/slack/src/conversation-binding-route.ts
1596
1595
  const slackRouteBindingConfigCache = /* @__PURE__ */ new WeakMap();
1597
- function slackTargetDefaultKindForPeer(kind) {
1598
- return kind === "direct" ? "user" : "channel";
1599
- }
1600
- function slackTargetKindMatchesPeer(peerKind, targetKind) {
1601
- if (targetKind === "user") return peerKind === "direct";
1602
- return peerKind === "channel" || peerKind === "group";
1603
- }
1604
1596
  function normalizeSlackRouteBindingPeer(peer) {
1605
1597
  const rawId = peer.id.trim();
1606
1598
  if (!rawId || rawId === "*") return peer;
1607
- const target = (() => {
1608
- try {
1609
- return parseSlackTarget(rawId, { defaultKind: slackTargetDefaultKindForPeer(peer.kind) });
1610
- } catch {
1611
- return;
1612
- }
1613
- })();
1614
- if (!target || !slackTargetKindMatchesPeer(peer.kind, target.kind)) return peer;
1615
- const normalizedId = target.teamId ? `team:${target.teamId}:${target.kind}:${target.id}` : target.id;
1616
- return normalizedId === peer.id ? peer : {
1617
- ...peer,
1618
- id: normalizedId
1619
- };
1599
+ try {
1600
+ const target = parseSlackTarget(rawId, { defaultKind: peer.kind === "direct" ? "user" : "channel" });
1601
+ if (!target || target.kind === "user" !== (peer.kind === "direct")) return peer;
1602
+ const normalizedId = target.teamId ? `team:${target.teamId}:${target.kind}:${target.id}` : target.id;
1603
+ return normalizedId === peer.id ? peer : {
1604
+ ...peer,
1605
+ id: normalizedId
1606
+ };
1607
+ } catch {
1608
+ return peer;
1609
+ }
1620
1610
  }
1621
1611
  function normalizeSlackRouteBindingConfig(cfg) {
1622
1612
  const bindings = cfg.bindings;
@@ -1811,4 +1801,4 @@ async function renameSlackSession(params) {
1811
1801
  }
1812
1802
  }
1813
1803
  //#endregion
1814
- export { buildSlackDataVisualizationBlock as $, countSlackTextUtf8Bytes as A, getSlackApprovalApproversForTeam as At, SLACK_REPLY_LINK_ACTION_ID as B, resolveSlackExecApprovalTarget as Bt, buildSlackBlocksFallbackText as C, resolveSessionSlackOriginTarget as Ct, SLACK_MESSAGE_TEXT_HARD_LIMIT as D, shouldHandleSlackNativeApprovalRequest as Dt, SLACK_EDIT_TEXT_MAX_BYTES as E, resolveTurnSourceSlackOriginTarget as Et, SLACK_CALLBACK_BUTTON_ACTION_ID as F, registerSlackInstallationState as Ft, isSlackQuestionActionId as G, SLACK_SESSION_LINK_ACTION_ID as H, resolvePluginApprovalSlackApprovers as Ht, SLACK_CALLBACK_SELECT_ACTION_ID as I, getSlackExecApprovalApprovers as It, encodeSlackQuestionAction as J, resolveSlackQuestionActionIds as K, SLACK_QUESTION_BUTTON_ACTION_ID as L, isSlackExecApprovalAuthorizedSender as Lt, truncateSlackTextByUtf8Bytes as M, resolveSlackApprovalTeamId as Mt, SLACK_APPROVAL_BUTTON_ACTION_ID as N, getSlackInstallationKind as Nt, SLACK_MESSAGE_TEXT_RECOMMENDED_LIMIT as O, shouldHandleSlackPluginViaForwardingSession as Ot, SLACK_APPROVAL_SELECT_ACTION_ID as P, isSlackWorkspaceInstallation as Pt, normalizeSlackOutboundText as Q, SLACK_QUESTION_FINALIZATION_BLOCKS as R, isSlackExecApprovalClientEnabled as Rt, stripSlackNativeDataBlocks as S, normalizeSlackOriginTarget as St, renderSlackBlockFallbackText as T, resolveSlackFallbackOriginTarget as Tt, isSlackApprovalActionId as U, SLACK_PRIVATE_ACTION_DELIVERY_RESULT as Ut, SLACK_REPLY_SELECT_ACTION_ID as V, shouldSuppressLocalSlackExecApprovalPrompt as Vt, isSlackCallbackActionId as W, resolveSlackAutoThreadId as Wt, chunkSlackMrkdwnText as X, resolveSlackQuestionAction as Y, markdownToSlackMrkdwnChunks as Z, createSlackNativeDataBaseTextConsumer as _, parseSlackBlocksInput as _t, resolveSlackGroupRequireMention as a, countSlackDataTableCellCharacters as at, isSlackInvalidBlocksResponse as b, isSlackPluginApprovalRequest as bt, qualifySlackRoutePeerId as c, renderSlackMessagePresentationFallbackText as ct, resolveSlackConversationBindingRoute as d, decodeSlackApprovalAction as dt, canRenderSlackDataVisualization as et, assertSlackDetachedTargetAllowed as f, encodeSlackApprovalAction as ft, buildSlackNativeDataAccessibilityText as g, SLACK_MAX_BLOCKS as gt, appendSlackNativeDataPlainTextFallback as h, SLACK_SECTION_TEXT_MAX as ht, buildSlackChannelPolicyScope as i, countSlackDataTableBlocksCellCharacters as it, truncateSlackText as j, isSlackPluginApprovalAuthorizedSender as jt, SLACK_TEXT_LIMIT as k, slackTargetsMatch as kt, resolveSlackEnterpriseMainDmSessionKey as l, escapeSlackMrkdwn as lt, appendSlackNativeDataFallbackText as m, SLACK_PRESENTATION_CAPABILITIES as mt, setSlackSessionStatus as n, SLACK_DATA_TABLE_AGGREGATE_CELL_CHARACTERS_MAX as nt, resolveSlackGroupToolPolicy as o, resolveSlackDataTableCellCharacterCount as ot, SLACK_MALFORMED_NATIVE_DATA_FALLBACK as p, SLACK_BUTTON_VALUE_MAX as pt, decodeSlackQuestionAction as q, buildSlackChannelIdCandidates as r, buildSlackDataTableBlock as rt, qualifySlackConversationId as s, renderSlackMessagePresentationChartFallbackText as st, renameSlackSession as t, hasSlackDataVisualizationBlock as tt, normalizeSlackRouteBindingConfig as u, SLACK_APPROVAL_HEADER_BLOCK_ID as ut, hasSlackNativeDataBlock as v, validateSlackBlocksArray as vt, buildSlackCompleteBlocksFallbackText as w, resolveSlackApproverDmTargets as wt, isSlackNativeResponseUrlRejection as x, normalizeSlackForwardTarget as xt, isSlackInvalidBlocksError as y, isSlackAnyNativeApprovalClientEnabled as yt, SLACK_REPLY_BUTTON_ACTION_ID as z, normalizeSlackApproverId as zt };
1804
+ export { SLACK_DATA_TABLE_AGGREGATE_CELL_CHARACTERS_MAX as $, countSlackTextUtf8Bytes as A, getSlackInstallationKind as At, isSlackApprovalActionId as B, SLACK_PRIVATE_ACTION_DELIVERY_RESULT as Bt, buildSlackBlocksFallbackText as C, resolveTurnSourceSlackOriginTarget as Ct, SLACK_MESSAGE_TEXT_HARD_LIMIT as D, getSlackApprovalApproversForTeam as Dt, SLACK_EDIT_TEXT_MAX_BYTES as E, slackTargetsMatch as Et, SLACK_REPLY_BUTTON_ACTION_ID as F, isSlackExecApprovalClientEnabled as Ft, encodeSlackQuestionAction as G, isSlackQuestionActionId as H, SLACK_REPLY_LINK_ACTION_ID as I, normalizeSlackApproverId as It, markdownToSlackMrkdwnChunks as J, resolveSlackQuestionAction as K, SLACK_REPLY_SELECT_ACTION_ID as L, resolveSlackExecApprovalTarget as Lt, truncateSlackTextByUtf8Bytes as M, registerSlackInstallationState as Mt, SLACK_BUTTON_ACTION_IDS as N, getSlackExecApprovalApprovers as Nt, SLACK_MESSAGE_TEXT_RECOMMENDED_LIMIT as O, isSlackPluginApprovalAuthorizedSender as Ot, SLACK_QUESTION_FINALIZATION_BLOCKS as P, isSlackExecApprovalAuthorizedSender as Pt, hasSlackDataVisualizationBlock as Q, SLACK_SELECT_ACTION_IDS as R, shouldSuppressLocalSlackExecApprovalPrompt as Rt, stripSlackNativeDataBlocks as S, resolveSlackFallbackOriginTarget as St, renderSlackBlockFallbackText as T, shouldHandleSlackPluginViaForwardingSession as Tt, resolveSlackQuestionActionIds as U, isSlackCallbackActionId as V, resolveSlackAutoThreadId as Vt, decodeSlackQuestionAction as W, buildSlackDataVisualizationBlock as X, normalizeSlackOutboundText as Y, canRenderSlackDataVisualization as Z, createSlackNativeDataBaseTextConsumer as _, isSlackPluginApprovalRequest as _t, resolveSlackGroupRequireMention as a, renderSlackMessagePresentationFallbackText as at, isSlackInvalidBlocksResponse as b, resolveSessionSlackOriginTarget as bt, qualifySlackRoutePeerId as c, decodeSlackApprovalAction as ct, resolveSlackConversationBindingRoute as d, SLACK_PRESENTATION_CAPABILITIES as dt, buildSlackDataTableBlock as et, assertSlackDetachedTargetAllowed as f, SLACK_SECTION_TEXT_MAX as ft, buildSlackNativeDataAccessibilityText as g, isSlackAnyNativeApprovalClientEnabled as gt, appendSlackNativeDataPlainTextFallback as h, validateSlackBlocksArray as ht, buildSlackChannelPolicyScope as i, renderSlackMessagePresentationChartFallbackText as it, truncateSlackText as j, isSlackWorkspaceInstallation as jt, SLACK_TEXT_LIMIT as k, resolveSlackApprovalTeamId as kt, resolveSlackEnterpriseMainDmSessionKey as l, encodeSlackApprovalAction as lt, appendSlackNativeDataFallbackText as m, parseSlackBlocksInput as mt, setSlackSessionStatus as n, countSlackDataTableCellCharacters as nt, resolveSlackGroupToolPolicy as o, escapeSlackMrkdwn as ot, SLACK_MALFORMED_NATIVE_DATA_FALLBACK as p, SLACK_MAX_BLOCKS as pt, chunkSlackMrkdwnText as q, buildSlackChannelIdCandidates as r, resolveSlackDataTableCellCharacterCount as rt, qualifySlackConversationId as s, SLACK_APPROVAL_HEADER_BLOCK_ID as st, renameSlackSession as t, countSlackDataTableBlocksCellCharacters as tt, normalizeSlackRouteBindingConfig as u, SLACK_BUTTON_VALUE_MAX as ut, hasSlackNativeDataBlock as v, normalizeSlackForwardTarget as vt, buildSlackCompleteBlocksFallbackText as w, shouldHandleSlackNativeApprovalRequest as wt, isSlackNativeResponseUrlRejection as x, resolveSlackApproverDmTargets as xt, isSlackInvalidBlocksError as y, normalizeSlackOriginTarget as yt, SLACK_SESSION_LINK_ACTION_ID as z, resolvePluginApprovalSlackApprovers as zt };
@@ -1,3 +1,3 @@
1
- import { t as slackSetupPlugin } from "./channel.setup-Dh2jzAjN.mjs";
1
+ import { t as slackSetupPlugin } from "./channel.setup-BYIlwbQ7.mjs";
2
2
  import "../setup-plugin-api.js";
3
3
  export { slackSetupPlugin };
@@ -1,9 +1,9 @@
1
- import { c as resolveSlackAccountAllowFrom, o as resolveDefaultSlackAccountId } from "./accounts-D_N9IqNA.mjs";
2
- import { t as inspectSlackAccount } from "./account-inspect-DWBXpER6.mjs";
3
- import "./shared-qau-uDGl.mjs";
4
- import { o as SLACK_CHANNEL, r as createSlackSetupWizardBase, s as buildSlackAllowFromPrompt } from "./channel.setup-Dh2jzAjN.mjs";
5
- import { t as resolveSlackChannelAllowlist } from "./resolve-channels-XXBn8UU_.mjs";
6
- import { t as resolveSlackUserAllowlist } from "./resolve-users-DW0ngD03.mjs";
1
+ import { c as resolveSlackAccountAllowFrom, o as resolveDefaultSlackAccountId } from "./accounts-CDgkV7Cm.mjs";
2
+ import { t as inspectSlackAccount } from "./account-inspect-Cs-7DXXW.mjs";
3
+ import "./shared-VtmYNj-v.mjs";
4
+ import { a as buildSlackAllowFromPrompt, i as SLACK_CHANNEL, n as createSlackSetupWizardBase } from "./channel.setup-BYIlwbQ7.mjs";
5
+ import { t as resolveSlackChannelAllowlist } from "./resolve-channels-HR0TgArR.mjs";
6
+ import { t as resolveSlackUserAllowlist } from "./resolve-users-BNYBhF0q.mjs";
7
7
  import { normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
8
8
  import { resolveBasicAllowFromEntries } from "openclaw/plugin-sdk/allow-from";
9
9
  import { createSetupTranslator, noteChannelLookupFailure, noteChannelLookupSummary, patchChannelConfigForAccount, promptResolvedAllowFrom, resolveEntriesWithOptionalToken, resolveSetupAccountId, splitSetupEntries } from "openclaw/plugin-sdk/setup-runtime";
@@ -37,14 +37,11 @@ async function promptSlackAllowFrom(params) {
37
37
  parseInputs: splitSetupEntries,
38
38
  parseId: prompt.parseId,
39
39
  invalidWithoutTokenNote: prompt.invalidWithoutCredentialNote,
40
- resolveEntries: async ({ token, entries }) => (await resolveSlackUserAllowlist({
40
+ resolveEntries: async ({ token, entries }) => await resolveBasicAllowFromEntries({
41
41
  token,
42
- entries
43
- })).map((entry) => ({
44
- input: entry.input,
45
- resolved: entry.resolved,
46
- id: entry.id ?? null
47
- }))
42
+ entries,
43
+ resolveEntries: resolveSlackUserAllowlist
44
+ })
48
45
  });
49
46
  return patchChannelConfigForAccount({
50
47
  cfg: params.cfg,
@@ -1,12 +1,12 @@
1
1
  import { n as isSlackPluginAccountConfigured } from "./account-configured-sUohAxZr.mjs";
2
- import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, l as resolveSlackAccountDmPolicy } from "./accounts-D_N9IqNA.mjs";
3
- import { t as inspectSlackAccount } from "./account-inspect-DWBXpER6.mjs";
2
+ import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, l as resolveSlackAccountDmPolicy } from "./accounts-CDgkV7Cm.mjs";
3
+ import { t as inspectSlackAccount } from "./account-inspect-Cs-7DXXW.mjs";
4
4
  import { a as parseSlackTarget } from "./target-parsing-FFE26kOV.mjs";
5
- import { a as slackIngressIdentity, t as probeSlack } from "./probe-B2Y9qc_z.mjs";
5
+ import { a as slackIngressIdentity, t as probeSlack } from "./probe-BVlJ3dp0.mjs";
6
6
  import { n as SLACK_CHANNEL_META } from "./channel-meta-C443t-lI.mjs";
7
- import { n as slackBaseConfigAdapter, t as slackSetupPlugin } from "./channel.setup-Dh2jzAjN.mjs";
8
- import { n as normalizeCompatibilityConfig, r as runtime_doctor_migrations_exports, t as legacyConfigRules } from "./doctor-contract-CRN1Z_c7.mjs";
9
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-BaZcu6P_.mjs";
7
+ import { r as slackBaseConfigAdapter, t as slackSetupPlugin } from "./channel.setup-BYIlwbQ7.mjs";
8
+ import { n as normalizeCompatibilityConfig, r as runtime_doctor_migrations_exports, t as legacyConfigRules } from "./doctor-contract-Cd4-VzIM.mjs";
9
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-B-Qm6aQQ.mjs";
10
10
  import { adaptScopedAccountAccessor, createScopedDmSecurityResolver } from "openclaw/plugin-sdk/channel-config-helpers";
11
11
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
12
12
  import { buildMutableAllowEntryDetector, collectStandardAllowlistLists, createConditionalWarningCollector, createDangerousNameMatchingMutableAllowlistWarningCollector, createOpenProviderConfiguredRouteWarningCollector } from "openclaw/plugin-sdk/channel-policy";
@@ -53,7 +53,7 @@ const collectSlackSecurityFindings = createConditionalWarningCollector.findings(
53
53
  severity: "warn",
54
54
  title: "Slack security warning"
55
55
  });
56
- const loadSlackSecurityAuditModule = createLazyRuntimeModule(() => import("./security-audit-BqDc-6VL.mjs").then((n) => n.n));
56
+ const loadSlackSecurityAuditModule = createLazyRuntimeModule(() => import("./security-audit-C1nOGzJa.mjs").then((n) => n.n));
57
57
  const slackSecurityAdapter = {
58
58
  resolveDmPolicy: resolveSlackDmPolicy,
59
59
  collectWarnings: collectSlackSecurityFindings,
@@ -208,55 +208,51 @@ const slackConfigAdapter = {
208
208
  ...slackBaseConfigAdapter,
209
209
  inspectAccount: adaptScopedAccountAccessor(inspectSlackAccount)
210
210
  };
211
- function createSlackPluginBase(params) {
212
- return {
213
- ...slackSetupPlugin,
214
- meta: {
215
- ...SLACK_CHANNEL_META,
216
- preferSessionLookupForAnnounceTarget: true
217
- },
218
- setupWizard: params.setupWizard,
219
- setupContract: params.setupContract,
220
- doctor: slackDoctor,
221
- agentPrompt: {
222
- inboundFormattingHints: () => ({
223
- text_markup: "markdown",
224
- rules: [
225
- "Write replies in standard Markdown; OpenClaw converts them to Slack mrkdwn.",
226
- "Bold uses **double asterisks**; *single asterisks* or _underscores_ produce italics.",
227
- "Links use [label](url). Keep Slack mentions as <@USER_ID>.",
228
- "Use presentation table blocks for tabular data; Markdown pipe tables are not auto-promoted.",
229
- "Only raw Block Kit or presentation text fields use Slack mrkdwn directly: *bold*, _italic_, ~strike~, and <url|label> links. Avoid Markdown headings or pipe tables in those fields."
230
- ]
231
- }),
232
- messageToolHints: () => [
233
- "- Use `presentation` buttons/selects for discrete choices or parameter picks instead of asking the user to type one.",
234
- "- For line, bar, area, or pie data, use a `presentation` chart block; Slack renders it as a native chart and retains a text data summary for accessibility.",
235
- "- For row-and-column data, use an explicit `presentation` table block; Slack renders it as a native table and retains a linear text summary for accessibility. Markdown pipe tables are not auto-promoted.",
236
- "- Slack plain text sends: write standard Markdown; OpenClaw converts it to Slack mrkdwn, including `**bold**`, headings, lists, and `[label](url)` links.",
237
- "- When mentioning Slack users, use the stable `<@USER_ID>` token from Slack context instead of plain `@name` text so Slack notifies and links the user.",
238
- "- Slack Block Kit or presentation text fields are sent as Slack mrkdwn directly; use `*bold*`, `_italic_`, `~strike~`, `<url|label>` links, and avoid Markdown headings or pipe tables there."
211
+ const slackPluginBase = {
212
+ ...slackSetupPlugin,
213
+ meta: {
214
+ ...SLACK_CHANNEL_META,
215
+ preferSessionLookupForAnnounceTarget: true
216
+ },
217
+ doctor: slackDoctor,
218
+ agentPrompt: {
219
+ inboundFormattingHints: () => ({
220
+ text_markup: "markdown",
221
+ rules: [
222
+ "Write replies in standard Markdown; OpenClaw converts them to Slack mrkdwn.",
223
+ "Bold uses **double asterisks**; *single asterisks* or _underscores_ produce italics.",
224
+ "Links use [label](url). Keep Slack mentions as <@USER_ID>.",
225
+ "Use presentation table blocks for tabular data; Markdown pipe tables are not auto-promoted.",
226
+ "Only raw Block Kit or presentation text fields use Slack mrkdwn directly: *bold*, _italic_, ~strike~, and <url|label> links. Avoid Markdown headings or pipe tables in those fields."
239
227
  ]
240
- },
241
- security: slackSecurityAdapter,
242
- config: {
243
- ...slackSetupPlugin.config,
244
- ...slackConfigAdapter,
245
- isConfigured: isSlackPluginAccountConfigured,
246
- describeAccount: (account) => describeAccountSnapshot({
247
- account,
248
- configured: isSlackPluginAccountConfigured(account),
249
- extra: {
250
- botTokenSource: account.botTokenSource,
251
- appTokenSource: account.appTokenSource
252
- }
253
- })
254
- },
255
- secrets: {
256
- secretTargetRegistryEntries,
257
- collectRuntimeConfigAssignments
258
- }
259
- };
260
- }
228
+ }),
229
+ messageToolHints: () => [
230
+ "- Use `presentation` buttons/selects for discrete choices or parameter picks instead of asking the user to type one.",
231
+ "- For line, bar, area, or pie data, use a `presentation` chart block; Slack renders it as a native chart and retains a text data summary for accessibility.",
232
+ "- For row-and-column data, use an explicit `presentation` table block; Slack renders it as a native table and retains a linear text summary for accessibility. Markdown pipe tables are not auto-promoted.",
233
+ "- Slack plain text sends: write standard Markdown; OpenClaw converts it to Slack mrkdwn, including `**bold**`, headings, lists, and `[label](url)` links.",
234
+ "- When mentioning Slack users, use the stable `<@USER_ID>` token from Slack context instead of plain `@name` text so Slack notifies and links the user.",
235
+ "- Slack Block Kit or presentation text fields are sent as Slack mrkdwn directly; use `*bold*`, `_italic_`, `~strike~`, `<url|label>` links, and avoid Markdown headings or pipe tables there."
236
+ ]
237
+ },
238
+ security: slackSecurityAdapter,
239
+ config: {
240
+ ...slackSetupPlugin.config,
241
+ ...slackConfigAdapter,
242
+ isConfigured: isSlackPluginAccountConfigured,
243
+ describeAccount: (account) => describeAccountSnapshot({
244
+ account,
245
+ configured: isSlackPluginAccountConfigured(account),
246
+ extra: {
247
+ botTokenSource: account.botTokenSource,
248
+ appTokenSource: account.appTokenSource
249
+ }
250
+ })
251
+ },
252
+ secrets: {
253
+ secretTargetRegistryEntries,
254
+ collectRuntimeConfigAssignments
255
+ }
256
+ };
261
257
  //#endregion
262
- export { slackConfigAdapter as n, slackSecurityAdapter as r, createSlackPluginBase as t };
258
+ export { slackPluginBase as n, slackSecurityAdapter as r, slackConfigAdapter as t };
@@ -1,4 +1,4 @@
1
- import { i as sanitizeSlackMonitorReplyPayload, r as deliverSlackSlashReplies } from "./replies-BAnUtr2f.mjs";
1
+ import { i as sanitizeSlackMonitorReplyPayload, r as deliverSlackSlashReplies } from "./replies-DHbuthIR.mjs";
2
2
  import { resolveAgentRoute } from "openclaw/plugin-sdk/routing";
3
3
  import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
4
4
  import { resolveConversationLabel } from "openclaw/plugin-sdk/conversation-runtime";
@@ -1,4 +1,4 @@
1
- import { t as inspectSlackAccount } from "./.setup/account-inspect-DWBXpER6.mjs";
1
+ import { t as inspectSlackAccount } from "./.setup/account-inspect-Cs-7DXXW.mjs";
2
2
  //#region extensions/slack/account-inspect-api.ts
3
3
  function inspectSlackReadOnlyAccount(cfg, accountId) {
4
4
  return inspectSlackAccount({
package/dist/api.js CHANGED
@@ -1,19 +1,19 @@
1
1
  import { n as registerSlackHttpHandler, r as normalizeSlackWebhookPath, t as handleSlackHttpRequest } from "./.setup/registry-CIbMfuf8.mjs";
2
- import { a as mergeSlackAccountConfig, f as resolveSlackReplyToMode, i as listSlackAccountIds, o as resolveDefaultSlackAccountId, r as listEnabledSlackAccounts, s as resolveSlackAccount } from "./.setup/accounts-D_N9IqNA.mjs";
3
- import { t as inspectSlackAccount } from "./.setup/account-inspect-DWBXpER6.mjs";
2
+ import { a as mergeSlackAccountConfig, f as resolveSlackReplyToMode, i as listSlackAccountIds, o as resolveDefaultSlackAccountId, r as listEnabledSlackAccounts, s as resolveSlackAccount } from "./.setup/accounts-CDgkV7Cm.mjs";
3
+ import { t as inspectSlackAccount } from "./.setup/account-inspect-Cs-7DXXW.mjs";
4
4
  import { a as parseSlackTarget, i as normalizeSlackMessagingTarget, o as resolveSlackChannelId, r as looksLikeSlackTargetId } from "./.setup/target-parsing-FFE26kOV.mjs";
5
5
  import "./.setup/targets-C6LZQL1Q.mjs";
6
- import { Wt as resolveSlackAutoThreadId, _t as parseSlackBlocksInput, a as resolveSlackGroupRequireMention, gt as SLACK_MAX_BLOCKS, o as resolveSlackGroupToolPolicy, vt as validateSlackBlocksArray } from "./.setup/session-status-DscajIsd.mjs";
7
- import { D as normalizeSlackAllowOwnerEntry, E as allowListMatches, O as normalizeSlackSlug, T as resolveSlackWriteClientOptions, _ as getSlackWriteClient, b as SLACK_DEFAULT_RETRY_OPTIONS, h as createSlackWriteClient, j as resolveSlackUserAllowed, k as resolveSlackAllowListMatch, m as createSlackWebClient, p as createSlackTokenCacheKey, t as probeSlack, w as resolveSlackWebClientOptions, x as SLACK_WRITE_RETRY_OPTIONS } from "./.setup/probe-B2Y9qc_z.mjs";
8
- import { n as buildSlackThreadingToolContext, t as slackPlugin } from "./.setup/channel-C7bgPSTE.mjs";
9
- import { d as buildSlackInteractiveBlocks, f as buildSlackPresentationBlocks } from "./.setup/reply-blocks-SE1kTE3I.mjs";
10
- import { n as extractSlackToolSend, r as listSlackMessageActions } from "./.setup/message-tool-api-Cu4lwlGy.mjs";
11
- import { n as resolveSlackChannelType } from "./.setup/channel-type-ClOttrZ5.mjs";
12
- import { t as slackSetupPlugin } from "./.setup/channel.setup-Dh2jzAjN.mjs";
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 "./.setup/actions-Df0CzcDl.mjs";
14
- import { a as clearSlackThreadParticipationCache, s as hasSlackThreadParticipation, u as recordSlackThreadParticipation } from "./.setup/send-BOVLQi3n.mjs";
15
- import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-BOUWH3hR.mjs";
16
- import { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-BqDc-6VL.mjs";
6
+ import { Vt as resolveSlackAutoThreadId, a as resolveSlackGroupRequireMention, ht as validateSlackBlocksArray, mt as parseSlackBlocksInput, o as resolveSlackGroupToolPolicy, pt as SLACK_MAX_BLOCKS } from "./.setup/session-status-D46GHwOV.mjs";
7
+ import { D as normalizeSlackAllowOwnerEntry, E as allowListMatches, O as normalizeSlackSlug, T as resolveSlackWriteClientOptions, _ as getSlackWriteClient, b as SLACK_DEFAULT_RETRY_OPTIONS, h as createSlackWriteClient, j as resolveSlackUserAllowed, k as resolveSlackAllowListMatch, m as createSlackWebClient, p as createSlackTokenCacheKey, t as probeSlack, w as resolveSlackWebClientOptions, x as SLACK_WRITE_RETRY_OPTIONS } from "./.setup/probe-BVlJ3dp0.mjs";
8
+ import { n as buildSlackThreadingToolContext, t as slackPlugin } from "./.setup/channel-DgKSu8Iv.mjs";
9
+ import { d as buildSlackInteractiveBlocks, f as buildSlackPresentationBlocks } from "./.setup/reply-blocks-CKnO4BSG.mjs";
10
+ import { n as extractSlackToolSend, r as listSlackMessageActions } from "./.setup/message-tool-api-CcjLPN3v.mjs";
11
+ import { n as resolveSlackChannelType } from "./.setup/channel-type-B9zYYzBU.mjs";
12
+ import { t as slackSetupPlugin } from "./.setup/channel.setup-BYIlwbQ7.mjs";
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 "./.setup/actions-DDoAJnrH.mjs";
14
+ import { a as clearSlackThreadParticipationCache, s as hasSlackThreadParticipation, u as recordSlackThreadParticipation } from "./.setup/send-CgPI3Zj8.mjs";
15
+ import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-B_by7zrc.mjs";
16
+ import { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-C1nOGzJa.mjs";
17
17
  import { normalizeStringEntries as normalizeAllowList, normalizeStringEntriesLower as normalizeAllowListLower } from "openclaw/plugin-sdk/string-normalization-runtime";
18
18
  import { resolveOpenProviderRuntimeGroupPolicy as resolveSlackRuntimeGroupPolicy } from "openclaw/plugin-sdk/runtime-group-policy";
19
19
  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,2 +1,2 @@
1
- import { t as SlackChannelConfigSchema } from "./.setup/config-schema-BZCxmHKG.mjs";
1
+ import { t as SlackChannelConfigSchema } from "./.setup/config-schema-BH0K9-Um.mjs";
2
2
  export { SlackChannelConfigSchema };
@@ -1,2 +1,2 @@
1
- import { t as slackPlugin } from "./.setup/channel-C7bgPSTE.mjs";
1
+ import { t as slackPlugin } from "./.setup/channel-DgKSu8Iv.mjs";
2
2
  export { slackPlugin };
@@ -0,0 +1 @@
1
+ function l(s){return(n,o)=>{let e=document.createElement("a");e.className="plugin-session-header-link",e.target="_blank",e.rel="noopener noreferrer",e.dataset.linkReaderExternal="";let d=!1,a=()=>{d=!0,e.removeAttribute("href"),e.remove()},p=t=>{if(d)return;let r=t.presented&&!t.signal.aborted&&t.props.session?s(t.props.session):void 0,i=r?URL.parse(r.url):null;if(!r||!i||i.protocol!=="https:"&&i.protocol!=="http:"){e.removeAttribute("href"),e.remove();return}e.href=i.href,e.textContent=`${r.label} \u2197`,e.parentNode!==n&&n.append(e)};return o.signal.addEventListener("abort",a,{once:!0}),p(o),{update:p,dispose(){o.signal.removeEventListener("abort",a),a()}}}}var b={id:"slack",activate(s){return s.ui.registerAccessory({id:"conversation-origin",placement:"session-header",mount:l(({conversationLink:n})=>{let o=n&&URL.parse(n.url);return o?.protocol==="https:"&&(o.hostname==="slack.com"||o.hostname.endsWith(".slack.com")||o.hostname==="slack-gov.com"||o.hostname.endsWith(".slack-gov.com"))?n:void 0})})}};export{b as default};
@@ -1,2 +1,2 @@
1
- import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-BOUWH3hR.mjs";
1
+ import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-B_by7zrc.mjs";
2
2
  export { listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig };
@@ -1,2 +1,2 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./.setup/doctor-contract-CRN1Z_c7.mjs";
1
+ import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./.setup/doctor-contract-Cd4-VzIM.mjs";
2
2
  export { legacyConfigRules, normalizeCompatibilityConfig };
@@ -1,2 +1,2 @@
1
- import { t as describeSlackMessageTool } from "./.setup/message-tool-api-Cu4lwlGy.mjs";
1
+ import { t as describeSlackMessageTool } from "./.setup/message-tool-api-CcjLPN3v.mjs";
2
2
  export { describeSlackMessageTool as describeMessageTool };
@@ -1,13 +1,13 @@
1
1
  import { t as registerSlackPluginHttpRoutes } from "./.setup/plugin-routes-B8tooDLj.mjs";
2
- import { h as resolveSlackBotToken, i as listSlackAccountIds, m as resolveSlackAppToken, o as resolveDefaultSlackAccountId, r as listEnabledSlackAccounts, s as resolveSlackAccount } from "./.setup/accounts-D_N9IqNA.mjs";
3
- import { a as resolveSlackGroupRequireMention, o as resolveSlackGroupToolPolicy } from "./.setup/session-status-DscajIsd.mjs";
4
- import { t as probeSlack } from "./.setup/probe-B2Y9qc_z.mjs";
2
+ import { h as resolveSlackBotToken, i as listSlackAccountIds, m as resolveSlackAppToken, o as resolveDefaultSlackAccountId, r as listEnabledSlackAccounts, s as resolveSlackAccount } from "./.setup/accounts-CDgkV7Cm.mjs";
3
+ import { a as resolveSlackGroupRequireMention, o as resolveSlackGroupToolPolicy } from "./.setup/session-status-D46GHwOV.mjs";
4
+ import { t as probeSlack } from "./.setup/probe-BVlJ3dp0.mjs";
5
5
  import { r as setSlackRuntime } from "./.setup/runtime-JSVZSWAj.mjs";
6
- 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, s as listSlackEmojis, u as pinSlackMessage } from "./.setup/actions-Df0CzcDl.mjs";
7
- import { t as sendMessageSlack } from "./.setup/send-BOVLQi3n.mjs";
8
- import { n as slackActionRuntime, t as handleSlackAction } from "./.setup/action-runtime-DfWvuiZd.mjs";
9
- import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./.setup/directory-live-B2O4B_Ho.mjs";
10
- import { n as monitorSlackProvider } from "./.setup/monitor-BPVfkumU.mjs";
11
- import { t as resolveSlackChannelAllowlist } from "./.setup/resolve-channels-XXBn8UU_.mjs";
12
- import { t as resolveSlackUserAllowlist } from "./.setup/resolve-users-DW0ngD03.mjs";
6
+ 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, s as listSlackEmojis, u as pinSlackMessage } from "./.setup/actions-DDoAJnrH.mjs";
7
+ import { t as sendMessageSlack } from "./.setup/send-CgPI3Zj8.mjs";
8
+ import { n as slackActionRuntime, t as handleSlackAction } from "./.setup/action-runtime-DJ1daRAZ.mjs";
9
+ import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./.setup/directory-live-C48wazJt.mjs";
10
+ import { n as monitorSlackProvider } from "./.setup/monitor-BuYBDmm7.mjs";
11
+ import { t as resolveSlackChannelAllowlist } from "./.setup/resolve-channels-HR0TgArR.mjs";
12
+ import { t as resolveSlackUserAllowlist } from "./.setup/resolve-users-BNYBhF0q.mjs";
13
13
  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 collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-BaZcu6P_.mjs";
1
+ import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-B-Qm6aQQ.mjs";
2
2
  export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
@@ -1,2 +1,2 @@
1
- import { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-BqDc-6VL.mjs";
1
+ import { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-C1nOGzJa.mjs";
2
2
  export { collectSlackSecurityAuditFindings };
@@ -4,11 +4,11 @@ import { fileURLToPath } from "node:url";
4
4
  var setup_entry_default = defineBundledChannelSetupEntry({
5
5
  importMetaUrl: import.meta.url,
6
6
  plugin: {
7
- specifier: fileURLToPath(new URL(".setup/setup-plugin-api-DTtbTKNk.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/setup-plugin-api-ZrHs0N4U.mjs", import.meta.url).href),
8
8
  exportName: "slackSetupPlugin"
9
9
  },
10
10
  secrets: {
11
- specifier: fileURLToPath(new URL(".setup/secret-contract-api-Dp6290Vg.mjs", import.meta.url).href),
11
+ specifier: fileURLToPath(new URL(".setup/secret-contract-api-DmUVxIRs.mjs", import.meta.url).href),
12
12
  exportName: "channelSecrets"
13
13
  },
14
14
  runtime: {
@@ -1,2 +1,2 @@
1
- import { t as slackSetupPlugin } from "./.setup/channel.setup-Dh2jzAjN.mjs";
1
+ import { t as slackSetupPlugin } from "./.setup/channel.setup-BYIlwbQ7.mjs";
2
2
  export { slackSetupPlugin };
@@ -378,7 +378,16 @@ The `body` mixins are the most common way to format the request/response body. M
378
378
  > The body returned from `undici.request` does not implement `.formData()`.
379
379
 
380
380
  > [!WARNING]
381
- > Calling `body.formData()` on a fetch response causes undici to buffer and parse the entire body. Since this is dictated by the spec, `body.formData()` must only be called on responses from trusted servers.
381
+ > The body mixins `.arrayBuffer()`, `.blob()`, `.bytes()`, `.json()`, `.text()`,
382
+ > and `.formData()` buffer the entire body in memory before returning. Where
383
+ > applicable, they also decode or parse the payload and retain that
384
+ > representation in memory. Calling these methods therefore means trusting that
385
+ > the response body is small enough to fit in the available memory. Do not use
386
+ > them for responses from untrusted or user-controlled sources. Instead, consume
387
+ > the response body as a stream and enforce an application-specific size limit:
388
+ > use `response.body` for fetch responses or the `body` returned by
389
+ > `undici.request()`. For streaming decoded text, use `body.textStream()` on a
390
+ > fetch `Request` or `Response`.
382
391
 
383
392
  Example usage:
384
393
 
@@ -56,16 +56,16 @@ changes:
56
56
  `Infinity`, no limit is enforced. Must be a number greater than `0`.
57
57
  **Default:** `Infinity`.
58
58
 
59
- `Agent` inherits all {PoolOptions} (and therefore all {ClientOptions}). The
60
- per-origin {Pool} it creates uses the default unlimited `connections`, so
61
- concurrent requests to the same origin are spread across separate {Client}
62
- instances on separate sockets.
59
+ `Agent` inherits all {PoolOptions} (and therefore all {ClientOptions}). Each
60
+ origin gets a separate {Pool}, with `connections` acting as the maximum number
61
+ of clients that pool may create.
63
62
 
64
63
  > [!NOTE]
65
- > Because each concurrent request to an origin may use a different {Client},
66
- > HTTP/2 multiplexing on a shared session does not apply unless `connections` is
67
- > set to a small value (for example `connections: 1`). See {PoolOptions} and
68
- > {ClientOptions} for the full set of inherited options such as `allowH2`
64
+ > For an h2-capable HTTPS origin, the per-origin pool waits for the first TLS
65
+ > connection to finish ALPN negotiation. If the server selects h2, concurrent
66
+ > requests share that session up to `maxConcurrentStreams`. If it selects
67
+ > HTTP/1.1, normal connection fan-out resumes up to `connections`. See
68
+ > {PoolOptions} and {ClientOptions} for inherited options such as `allowH2`
69
69
  > (default `true`) and `maxConcurrentStreams` (default `100`).
70
70
 
71
71
  ### `agent.closed`
@@ -120,7 +120,8 @@ diagnosticsChannel.channel('undici:request:bodySent').subscribe(({ request }) =>
120
120
  added: v6.3.0
121
121
  -->
122
122
 
123
- Published after the response headers have been received.
123
+ Published after the response headers have been received. This includes a
124
+ successful CONNECT or protocol upgrade response.
124
125
 
125
126
  * `message` {Object}
126
127
  * `request` {Object} The same object published by
@@ -128,8 +129,9 @@ Published after the response headers have been received.
128
129
  * `response` {Object} The response being received.
129
130
  * `statusCode` {number} The HTTP status code.
130
131
  * `statusText` {string} The HTTP status message.
131
- * `headers` {Buffer[]} The raw response headers as an array of buffers,
132
- alternating between header name and value.
132
+ * `headers` {Buffer[]|Object} HTTP/1.1 response headers are an array of
133
+ buffers alternating between header name and value. HTTP/2 response
134
+ headers are an object.
133
135
 
134
136
  ```mjs
135
137
  import diagnosticsChannel from 'node:diagnostics_channel'
@@ -137,7 +139,7 @@ import diagnosticsChannel from 'node:diagnostics_channel'
137
139
  diagnosticsChannel.channel('undici:request:headers').subscribe(({ request, response }) => {
138
140
  console.log('statusCode', response.statusCode)
139
141
  console.log(response.statusText)
140
- console.log(response.headers.map((x) => x.toString()))
142
+ console.log(response.headers)
141
143
  })
142
144
  ```
143
145
 
@@ -168,8 +170,9 @@ diagnosticsChannel.channel('undici:request:bodyChunkReceived').subscribe(({ requ
168
170
  added: v6.3.0
169
171
  -->
170
172
 
171
- Published after the response body and trailers have been received, that is, once
172
- the response has fully completed.
173
+ Published once the response has fully completed. After an upgraded socket has
174
+ been passed to the request handler, this event is published with an empty
175
+ `trailers` array.
173
176
 
174
177
  * `message` {Object}
175
178
  * `request` {Object} The same object published by