@openclaw/slack 2026.10.5-beta.4 → 2026.10.10-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 (60) hide show
  1. package/dist/.setup/{account-inspect-D58VVDjk.mjs → account-inspect-CmkKiSb9.mjs} +1 -1
  2. package/dist/.setup/{accounts-BMg9YLIv.mjs → accounts-msihSF3-.mjs} +1 -1
  3. package/dist/.setup/{action-runtime-BiRZNsIG.mjs → action-runtime-CgYsBWl6.mjs} +5 -5
  4. package/dist/.setup/action-runtime.runtime-WS3mGjut.mjs +1 -0
  5. package/dist/.setup/{actions-KGKwTAKO.mjs → actions-CafoV8hS.mjs} +4 -4
  6. package/dist/.setup/{approval-handler.runtime-DYrsG2Ox.mjs → approval-handler.runtime-Pty8hAZ9.mjs} +8 -8
  7. package/dist/.setup/{approval-message-updates-CwdDew9i.mjs → approval-message-updates-DCnXFLf3.mjs} +1 -1
  8. package/dist/.setup/{channel-C7MY-Hhg.mjs → channel-B-jnk0Gl.mjs} +51 -55
  9. package/dist/.setup/{channel-type-NjX2SwvS.mjs → channel-type-BrbGGbzI.mjs} +3 -3
  10. package/dist/.setup/{channel.setup-BFpQowO3.mjs → channel.setup-u6QQdbTa.mjs} +4 -4
  11. package/dist/.setup/{config-schema-BH0K9-Um.mjs → config-schema-DNnh6bWU.mjs} +1 -1
  12. package/dist/.setup/{directory-config-BEDZPfDn.mjs → directory-config-Cjj0N8R0.mjs} +1 -1
  13. package/dist/.setup/{directory-live-FipfeCwt.mjs → directory-live-BIKD-5B_.mjs} +2 -2
  14. package/dist/.setup/http-C9sM-FXe.mjs +2 -0
  15. package/dist/.setup/{message-tool-api-C7im5ETh.mjs → message-tool-api-BS5ekEA_.mjs} +2 -2
  16. package/dist/.setup/{monitor-BnN2px0N.mjs → monitor-DmJ-Qbx4.mjs} +181 -145
  17. package/dist/.setup/{outbound-adapter-4HdGq-8r.mjs → outbound-adapter-BlN9vmT-.mjs} +4 -4
  18. package/dist/.setup/{pipeline.runtime-ByPbC6MN.mjs → pipeline.runtime-DOf1Ghcz.mjs} +66 -129
  19. package/dist/.setup/{plugin-routes-B8tooDLj.mjs → plugin-routes-D4qozHVn.mjs} +1 -1
  20. package/dist/.setup/{policy-BaY9_eh1.mjs → policy-D4eNyn8m.mjs} +2 -2
  21. package/dist/.setup/{probe-CyX52GtD.mjs → probe-IiHogLQN.mjs} +3 -9
  22. package/dist/.setup/{registry-CIbMfuf8.mjs → registry-DizWcnNp.mjs} +4 -11
  23. package/dist/.setup/{relay-source-CVfH-fBO.mjs → relay-source-CUVJNz6R.mjs} +2 -2
  24. package/dist/.setup/{replies-WmfwvQxc.mjs → replies-Cs9SqIIs.mjs} +4 -4
  25. package/dist/.setup/{reply-blocks-rqHQ_3pr.mjs → reply-blocks-CoZ_dGM_.mjs} +1 -1
  26. package/dist/.setup/{resolve-channels-B96cgprw.mjs → resolve-channels-DRRhElwz.mjs} +1 -1
  27. package/dist/.setup/{resolve-users-Xz9aPdns.mjs → resolve-users-Cz8e17ky.mjs} +1 -1
  28. package/dist/.setup/runtime-setter-api-Cx_PV-xu.mjs +2 -0
  29. package/dist/.setup/{scopes-aMcMHhXk.mjs → scopes-DfQVi8Jw.mjs} +1 -1
  30. package/dist/.setup/secret-contract-api-DB6CMdgc.mjs +2 -0
  31. package/dist/.setup/{send-CLmsR42r.mjs → send-pi6r24yv.mjs} +5 -5
  32. package/dist/.setup/{session-status-CcXe10zN.mjs → session-status-DQY4hZLd.mjs} +73 -29
  33. package/dist/.setup/setup-plugin-api-B18kDKtr.mjs +2 -0
  34. package/dist/.setup/{setup-surface-368jx6Uc.mjs → setup-surface-9WVQgYCT.mjs} +6 -6
  35. package/dist/.setup/{shared-CtprVh_G.mjs → shared-DpHCoKy2.mjs} +7 -6
  36. package/dist/.setup/{slash-dispatch.runtime-Dzwj6TPI.mjs → slash-dispatch.runtime-BlBuHX9x.mjs} +3 -2
  37. package/dist/account-inspect-api.js +1 -1
  38. package/dist/api.js +15 -14
  39. package/dist/channel-config-api.js +1 -2
  40. package/dist/channel-plugin-api.js +1 -2
  41. package/dist/directory-contract-api.js +1 -2
  42. package/dist/doctor-contract-api.js +1 -2
  43. package/dist/http-routes-api.js +1 -2
  44. package/dist/index.js +1 -1
  45. package/dist/message-tool-api.js +1 -2
  46. package/dist/runtime-api.js +11 -11
  47. package/dist/runtime-setter-api.js +1 -2
  48. package/dist/secret-contract-api.js +1 -2
  49. package/dist/security-contract-api.js +1 -2
  50. package/dist/setup-entry.js +3 -3
  51. package/dist/setup-plugin-api.js +1 -2
  52. package/node_modules/typebox/build/value/clean/from_object.mjs +1 -1
  53. package/node_modules/typebox/package.json +1 -1
  54. package/openclaw.plugin.json +1 -1
  55. package/package.json +5 -5
  56. package/dist/.setup/action-runtime.runtime-C5xceJoS.mjs +0 -2
  57. package/dist/.setup/runtime-setter-api-CMFvhrAr.mjs +0 -3
  58. package/dist/.setup/secret-contract-api-DmUVxIRs.mjs +0 -3
  59. package/dist/.setup/setup-plugin-api-D92P5p51.mjs +0 -3
  60. package/dist/.setup/{security-audit-C1nOGzJa.mjs → security-audit-DFGiFLqd.mjs} +1 -1
@@ -1,8 +1,9 @@
1
1
  import { r as isSlackPluginAccountConfigured } from "./account-configured-zcR9TJJN.mjs";
2
- import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, o as resolveDefaultSlackAccountId, s as resolveSlackAccount } from "./accounts-BMg9YLIv.mjs";
2
+ import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, o as resolveDefaultSlackAccountId, s as resolveSlackAccount } from "./accounts-msihSF3-.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 resolveSlackAllowListMatch, j as resolveSlackUserAllowListForTeam, o as formatSlackError } from "./probe-CyX52GtD.mjs";
5
+ import { A as resolveSlackAllowListMatch, j as resolveSlackUserAllowListForTeam, o as formatSlackError } from "./probe-IiHogLQN.mjs";
6
+ import { resolveGlobalMap } from "openclaw/plugin-sdk/global-singleton";
6
7
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
7
8
  import { asOptionalRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringifiedOptionalString, readNonBlankString } from "openclaw/plugin-sdk/string-coerce-runtime";
8
9
  import { normalizeMessageChannel, resolveAgentRoute } from "openclaw/plugin-sdk/routing";
@@ -11,11 +12,10 @@ import { FormatCapabilityProfile, chunkTextForOutbound, markdownToIR, renderMark
11
12
  import { sliceUtf16Safe, truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
12
13
  import { isSingleUseReplyToMode } from "openclaw/plugin-sdk/reply-reference";
13
14
  import { buildChannelKeyCandidates } from "openclaw/plugin-sdk/channel-targets";
14
- import { createNativeApprovalChannelRouteGates, doesApprovalRequestSelectChannelAccount, resolveApprovalKind, resolveApprovalRequestSessionConversation } from "openclaw/plugin-sdk/approval-native-runtime";
15
+ import { createNativeApprovalChannelRouteGatesAsync, doesApprovalRequestSelectChannelAccountAsync, resolveApprovalKind, resolveApprovalRequestSessionConversation } from "openclaw/plugin-sdk/approval-native-runtime";
15
16
  import { createChannelApprovalAuth, resolveApprovalApprovers } from "openclaw/plugin-sdk/approval-auth-runtime";
16
17
  import { normalizeHyphenSlug, normalizeStringEntriesLower } from "openclaw/plugin-sdk/string-normalization-runtime";
17
- import { createChannelExecApprovalProfile, isChannelExecApprovalClientEnabledFromConfig, isChannelExecApprovalTargetRecipient, matchesApprovalRequestFilters } from "openclaw/plugin-sdk/approval-client-runtime";
18
- import { resolveGlobalMap } from "openclaw/plugin-sdk/global-singleton";
18
+ import { createChannelExecApprovalProfileAsync, isChannelExecApprovalClientEnabledFromConfig, isChannelExecApprovalTargetRecipient, matchesApprovalRequestFilters } from "openclaw/plugin-sdk/approval-client-runtime";
19
19
  import { channelRouteTargetsMatchExact, stringifyRouteThreadId } from "openclaw/plugin-sdk/channel-route";
20
20
  import { normalizeMessagePresentation, renderMessagePresentationChartFallbackText, renderMessagePresentationFallbackText, renderMessagePresentationTableFallbackText } from "openclaw/plugin-sdk/interactive-runtime";
21
21
  import { buildApprovalResolutionRef } from "openclaw/plugin-sdk/approval-reference-runtime";
@@ -23,8 +23,7 @@ import { eastAsianWidthType } from "get-east-asian-width";
23
23
  import { resolveIntegerOption } from "openclaw/plugin-sdk/number-runtime";
24
24
  import { questionGatewayRuntime } from "openclaw/plugin-sdk/question-gateway-runtime";
25
25
  import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
26
- import { inspectRuntimeConversationBindingRoute } from "openclaw/plugin-sdk/conversation-binding-runtime";
27
- import { resolveConfiguredBindingRoute, resolveRuntimeConversationBindingRoute } from "openclaw/plugin-sdk/conversation-runtime";
26
+ import { inspectRuntimeConversationBindingRoute, resolveConfiguredBindingRoute, resolveRuntimeConversationBindingRouteAsync } from "openclaw/plugin-sdk/conversation-binding-runtime";
28
27
  import { resolveScopeRequireMention, resolveScopeToolsPolicy } from "openclaw/plugin-sdk/channel-policy";
29
28
  //#region extensions/slack/src/action-threading.ts
30
29
  const SLACK_PRIVATE_ACTION_DELIVERY_RESULT = Symbol("slack.action.delivery-result");
@@ -91,7 +90,7 @@ function getSlackExecApprovalApprovers(params) {
91
90
  normalizeApprover: normalizeSlackApproverId
92
91
  });
93
92
  }
94
- const slackExecApprovalProfile = createChannelExecApprovalProfile({
93
+ const slackExecApprovalProfile = createChannelExecApprovalProfileAsync({
95
94
  resolveConfig: (params) => resolveSlackAccount(params).config.execApprovals,
96
95
  resolveApprovers: getSlackExecApprovalApprovers,
97
96
  normalizeSenderId: normalizeSlackApproverId,
@@ -213,8 +212,8 @@ function resolveSlackApprovalTeamId(params) {
213
212
  function isSlackPluginApprovalRequest(request) {
214
213
  return resolveApprovalKind(request) === "plugin";
215
214
  }
216
- function resolveSlackApproverDmTargets(params) {
217
- if (!shouldHandleSlackNativeApprovalRequest(params)) return [];
215
+ async function resolveSlackApproverDmTargets(params) {
216
+ if (!await shouldHandleSlackNativeApprovalRequest(params)) return [];
218
217
  const teamId = resolveSlackApprovalTeamId(params);
219
218
  return (params.approvalKind === "plugin" ? isSlackPluginApprovalRequest(params.request) ? getSlackApprovalApproversForTeam({
220
219
  ...params,
@@ -325,7 +324,7 @@ function normalizeSlackForwardTarget(target) {
325
324
  threadId: stringifyRouteThreadId(target.threadId)
326
325
  };
327
326
  }
328
- const { canApprovalPotentiallyRouteToChannel: canApprovalPotentiallyRouteToSlack, isSessionApprovalEligible: isForwardedSlackSessionApprovalEligible, isExplicitTargetEligible: isForwardedSlackExplicitTargetEligible } = createNativeApprovalChannelRouteGates({
327
+ const { canApprovalPotentiallyRouteToChannel: canApprovalPotentiallyRouteToSlack, isSessionApprovalEligible: isForwardedSlackSessionApprovalEligible, isExplicitTargetEligible: isForwardedSlackExplicitTargetEligible } = createNativeApprovalChannelRouteGatesAsync({
329
328
  channel: "slack",
330
329
  defaultForwardingMode: "session",
331
330
  isTransportEnabled: isSlackApprovalTransportEnabled,
@@ -343,8 +342,8 @@ function isSlackPluginNativeApprovalClientConfigEnabled(params) {
343
342
  approverCount: getSlackApprovalApprovers(params).length
344
343
  });
345
344
  }
346
- function shouldHandleSlackViaNativeClientConfig(params) {
347
- if (!doesApprovalRequestSelectChannelAccount({
345
+ async function shouldHandleSlackViaNativeClientConfig(params) {
346
+ if (!await doesApprovalRequestSelectChannelAccountAsync({
348
347
  ...params,
349
348
  channel: "slack",
350
349
  defaultAccountId: resolveDefaultSlackAccountId(params.cfg),
@@ -383,7 +382,7 @@ function listSlackNativeApprovalEligibleAccountIds(params) {
383
382
  accountId
384
383
  }) ? [accountId] : [];
385
384
  }
386
- function shouldHandleSlackPluginViaForwardingSession(params) {
385
+ async function shouldHandleSlackPluginViaForwardingSession(params) {
387
386
  return isForwardedSlackSessionApprovalEligible({
388
387
  ...params,
389
388
  approvalKind: "plugin"
@@ -395,7 +394,7 @@ function isSlackAnyNativeApprovalClientEnabled(params) {
395
394
  approvalKind: "plugin"
396
395
  });
397
396
  }
398
- function shouldHandleSlackNativeApprovalRequest(params) {
397
+ async function shouldHandleSlackNativeApprovalRequest(params) {
399
398
  if (getSlackInstallationKind(resolveSlackAccount(params).accountId) === "enterprise" && !resolveSlackApprovalOriginTeamId(params.request)) return false;
400
399
  const approvalKind = resolveApprovalKind(params.request, params.approvalKind);
401
400
  if (approvalKind === "plugin") {
@@ -404,10 +403,10 @@ function shouldHandleSlackNativeApprovalRequest(params) {
404
403
  ...params,
405
404
  approvalKind
406
405
  });
407
- return shouldHandleSlackViaNativeClientConfig({
406
+ return await shouldHandleSlackViaNativeClientConfig({
408
407
  ...params,
409
408
  approvalKind
410
- }) || shouldHandleSlackPluginViaForwardingSession(params) || (params.cfg.approvals?.plugin?.targets ?? []).some((target) => isForwardedSlackExplicitTargetEligible({
409
+ }) || await shouldHandleSlackPluginViaForwardingSession(params) || (params.cfg.approvals?.plugin?.targets ?? []).some((target) => isForwardedSlackExplicitTargetEligible({
411
410
  ...params,
412
411
  approvalKind,
413
412
  target
@@ -907,7 +906,8 @@ function escapeSlackMrkdwnContent(text, mentions) {
907
906
  const matchIndex = match.index;
908
907
  out.push(escapeSlackMrkdwn(text.slice(lastIndex, matchIndex)));
909
908
  const token = match[0];
910
- out.push(isAllowedSlackAngleToken(token) ? token : escapeSlackMrkdwn(token));
909
+ const escapeControl = mentions === "escape-controls" && /^<[@#!]/u.test(token);
910
+ out.push(isAllowedSlackAngleToken(token) && !escapeControl ? token : escapeSlackMrkdwn(token));
911
911
  lastIndex = matchIndex + token.length;
912
912
  }
913
913
  out.push(escapeSlackMrkdwn(text.slice(lastIndex)));
@@ -922,7 +922,7 @@ function escapeSlackMrkdwnText(text, mentions) {
922
922
  }
923
923
  function buildSlackLink(link, text) {
924
924
  const href = link.href.trim();
925
- if (!href) return null;
925
+ if (!href || /^[@#!]/u.test(href)) return null;
926
926
  const trimmedLabel = text.slice(link.start, link.end).trim();
927
927
  const comparableHref = href.startsWith("mailto:") ? href.slice(7) : href;
928
928
  if (!(trimmedLabel.length > 0 && trimmedLabel !== href && trimmedLabel !== comparableHref)) return null;
@@ -1348,7 +1348,7 @@ function readControlElementText(value, options = {}) {
1348
1348
  const element = asOptionalRecord(value);
1349
1349
  const type = normalizeOptionalString(element?.type);
1350
1350
  if (type === "button" || type === "workflow_button") return normalizeOptionalString(element?.text) ?? readTextObject(element?.text, options);
1351
- if (type && SLACK_SELECT_ELEMENT_TYPES.has(type)) {
1351
+ if (type && (SLACK_SELECT_ELEMENT_TYPES.has(type) || type === "overflow")) {
1352
1352
  if (!options.includeSelectOptions) return readTextObject(element?.placeholder, options);
1353
1353
  const choices = Array.isArray(element?.options) ? element.options : [];
1354
1354
  return [readTextObject(element?.placeholder, options), ...choices.map((choice) => readTextObject(asOptionalRecord(choice)?.text, options))].filter(Boolean).join("\n");
@@ -1559,10 +1559,10 @@ function normalizeSlackRouteBindingConfig(cfg) {
1559
1559
  }
1560
1560
  function resolveSlackConversationBindingRoute(params) {
1561
1561
  const { resolveRoute } = params;
1562
- const resolveRuntime = (input, role) => params.inspections ? inspectRuntimeConversationBindingRoute({
1562
+ const resolveRuntime = (input, role) => inspectRuntimeConversationBindingRoute({
1563
1563
  ...input,
1564
1564
  inspection: params.inspections[role]
1565
- }) : resolveRuntimeConversationBindingRoute(input);
1565
+ });
1566
1566
  let baseRuntimeRoute;
1567
1567
  const resolveBaseRoute = (threadInspection) => baseRuntimeRoute ??= resolveRuntime({
1568
1568
  resolveRoute: threadInspection ? (selection) => inspectRuntimeConversationBindingRoute({
@@ -1586,9 +1586,39 @@ function resolveSlackConversationBindingRoute(params) {
1586
1586
  parentConversationId: params.baseConversationId
1587
1587
  }
1588
1588
  }, "thread") : null;
1589
- const runtimeRoute = !params.bindingsEnabled ? {
1589
+ return applySlackConfiguredBindingRoute(params, !params.bindingsEnabled ? resolveUnboundSlackRoute(params) : boundThreadRoute && (boundThreadRoute.bindingRecord || boundThreadRoute.bindingOwnerAvailable === false) ? boundThreadRoute : resolveBaseRoute());
1590
+ }
1591
+ async function resolveSlackConversationBindingRouteAsync(params) {
1592
+ if (!params.bindingsEnabled) return applySlackConfiguredBindingRoute(params, resolveUnboundSlackRoute(params));
1593
+ let baseRuntimeRoute;
1594
+ const resolveBaseRoute = (threadInspection) => baseRuntimeRoute ??= resolveRuntimeConversationBindingRouteAsync({
1595
+ resolveRoute: threadInspection ? (selection) => inspectRuntimeConversationBindingRoute({
1596
+ route: params.resolveRoute(selection),
1597
+ inspection: threadInspection
1598
+ }).route : params.resolveRoute,
1599
+ touchBinding: params.touchBinding,
1600
+ conversation: {
1601
+ channel: "slack",
1602
+ accountId: params.accountId,
1603
+ conversationId: params.baseConversationId
1604
+ }
1605
+ });
1606
+ const boundThreadRoute = params.runtimeBindingThreadId ? await resolveRuntimeConversationBindingRouteAsync({
1607
+ resolveRoute: async (selection) => selection.bindingRecord || !selection.bindingOwnerAvailable ? params.resolveRoute(selection) : (await resolveBaseRoute(selection.inspection)).route,
1608
+ touchBinding: params.touchBinding,
1609
+ conversation: {
1610
+ channel: "slack",
1611
+ accountId: params.accountId,
1612
+ conversationId: params.runtimeBindingThreadId,
1613
+ parentConversationId: params.baseConversationId
1614
+ }
1615
+ }) : null;
1616
+ return applySlackConfiguredBindingRoute(params, boundThreadRoute && (boundThreadRoute.bindingRecord || boundThreadRoute.bindingOwnerAvailable === false) ? boundThreadRoute : await resolveBaseRoute());
1617
+ }
1618
+ function resolveUnboundSlackRoute(params) {
1619
+ return {
1590
1620
  bindingOwnerAvailable: true,
1591
- route: resolveRoute({
1621
+ route: params.resolveRoute({
1592
1622
  inspection: {
1593
1623
  status: "available",
1594
1624
  binding: null
@@ -1598,7 +1628,9 @@ function resolveSlackConversationBindingRoute(params) {
1598
1628
  }),
1599
1629
  bindingRecord: null,
1600
1630
  boundSessionKey: void 0
1601
- } : boundThreadRoute && (boundThreadRoute.bindingRecord || boundThreadRoute.bindingOwnerAvailable === false) ? boundThreadRoute : resolveBaseRoute();
1631
+ };
1632
+ }
1633
+ function applySlackConfiguredBindingRoute(params, runtimeRoute) {
1602
1634
  const configuredRoute = params.bindingsEnabled && !runtimeRoute.boundSessionKey && !runtimeRoute.bindingRecord ? resolveConfiguredBindingRoute({
1603
1635
  cfg: params.cfg,
1604
1636
  route: runtimeRoute.route,
@@ -1650,6 +1682,17 @@ function qualifySlackConversationId(conversationId, eventScope) {
1650
1682
  return eventScope ? `team:${encodeURIComponent(eventScope.teamId)}:${conversationId}` : conversationId;
1651
1683
  }
1652
1684
  //#endregion
1685
+ //#region extensions/slack/src/channel-policy-state.ts
1686
+ const slackChannelPolicyBindings = resolveGlobalMap(Symbol.for("openclaw.slack.channel-policy-bindings"), "close-and-restart");
1687
+ function setSlackChannelPolicyBindings(accountId, bindings) {
1688
+ slackChannelPolicyBindings.set(normalizeAccountId(accountId), new Map([...bindings].map(([key, id]) => [key, id.toUpperCase()])));
1689
+ }
1690
+ function getSlackChannelPolicyKeys(accountId, channelId) {
1691
+ const id = channelId?.trim().toUpperCase();
1692
+ if (!id) return [];
1693
+ return [...slackChannelPolicyBindings.get(normalizeAccountId(accountId)) ?? []].filter(([, resolvedId]) => resolvedId === id).map(([key]) => key);
1694
+ }
1695
+ //#endregion
1653
1696
  //#region extensions/slack/src/group-policy.ts
1654
1697
  function buildSlackChannelIdCandidates(channelId, teamId, options) {
1655
1698
  const trimmedId = channelId?.trim();
@@ -1679,12 +1722,13 @@ function buildSlackChannelPolicyScope(params) {
1679
1722
  }
1680
1723
  function resolveSlackGroupPolicyScope(params) {
1681
1724
  const accountId = normalizeAccountId(params.accountId ?? resolveDefaultSlackAccountId(params.cfg));
1682
- const channels = mergeSlackAccountConfig(params.cfg, accountId).channels;
1683
- const channelName = params.groupChannel?.replace(/^#/, "");
1725
+ const slack = mergeSlackAccountConfig(params.cfg, accountId);
1726
+ const channels = slack.channels;
1727
+ const channelName = slack.dangerouslyAllowNameMatching === true ? params.groupChannel?.replace(/^#/, "") : void 0;
1684
1728
  const allowUnscoped = getSlackInstallationKind(accountId) !== "enterprise";
1685
1729
  return buildSlackChannelPolicyScope({
1686
1730
  channels,
1687
- candidates: buildChannelKeyCandidates(...buildSlackChannelIdCandidates(params.groupId, params.groupSpace, { allowUnscoped }), channelName ? `#${channelName}` : void 0, channelName, normalizeHyphenSlug(channelName))
1731
+ candidates: buildChannelKeyCandidates(...buildSlackChannelIdCandidates(params.groupId, params.groupSpace, { allowUnscoped }), ...getSlackChannelPolicyKeys(accountId, params.groupId), channelName ? `#${channelName}` : void 0, channelName, normalizeHyphenSlug(channelName))
1688
1732
  });
1689
1733
  }
1690
1734
  function resolveSlackGroupRequireMention(params) {
@@ -1744,4 +1788,4 @@ async function renameSlackSession(params) {
1744
1788
  }
1745
1789
  }
1746
1790
  //#endregion
1747
- export { SLACK_DATA_TABLE_AGGREGATE_CELL_CHARACTERS_MAX as $, SLACK_TEXT_LIMIT as A, isSlackWorkspaceInstallation as At, SLACK_SESSION_LINK_ACTION_ID as B, resolveSlackAutoThreadId as Bt, stripSlackNativeDataBlocks as C, shouldHandleSlackNativeApprovalRequest as Ct, SLACK_EDIT_TEXT_MAX_BYTES as D, isSlackPluginApprovalAuthorizedSender as Dt, renderSlackBlockFallbackText as E, getSlackApprovalApproversForTeam as Et, SLACK_QUESTION_FINALIZATION_BLOCKS as F, normalizeSlackApproverId as Ft, decodeSlackQuestionAction as G, isSlackCallbackActionId as H, SLACK_REPLY_BUTTON_ACTION_ID as I, resolveSlackExecApprovalTarget as It, chunkSlackMrkdwnText as J, encodeSlackQuestionAction as K, SLACK_REPLY_LINK_ACTION_ID as L, shouldSuppressLocalSlackExecApprovalPrompt as Lt, truncateSlackText as M, getSlackExecApprovalApprovers as Mt, truncateSlackTextByUtf8Bytes as N, isSlackExecApprovalAuthorizedSender as Nt, SLACK_MESSAGE_TEXT_HARD_LIMIT as O, resolveSlackApprovalTeamId as Ot, SLACK_BUTTON_ACTION_IDS as P, isSlackExecApprovalClientEnabled as Pt, hasSlackDataVisualizationBlock as Q, SLACK_REPLY_SELECT_ACTION_ID as R, resolvePluginApprovalSlackApprovers as Rt, renderSlackNativeDataPlainTextBlock as S, resolveTurnSourceSlackOriginTarget as St, buildSlackCompleteBlocksFallbackText as T, slackTargetsMatch as Tt, isSlackQuestionActionId as U, isSlackApprovalActionId as V, resolveSlackQuestionActionIds as W, normalizeSlackOutboundText as X, markdownToSlackMrkdwnChunks as Y, buildSlackDataVisualizationBlock as Z, createSlackNativeDataBaseTextConsumer as _, normalizeSlackForwardTarget as _t, resolveSlackGroupRequireMention as a, escapeSlackMrkdwn as at, isSlackInvalidBlocksResponse as b, resolveSlackApproverDmTargets as bt, qualifySlackRoutePeerId as c, encodeSlackApprovalAction as ct, resolveSlackConversationBindingRoute as d, SLACK_SECTION_TEXT_MAX as dt, buildSlackDataTableBlock as et, assertSlackDetachedTargetAllowed as f, SLACK_MAX_BLOCKS as ft, buildSlackNativeDataAccessibilityText as g, isSlackPluginApprovalRequest as gt, appendSlackNativeDataPlainTextFallback as h, isSlackAnyNativeApprovalClientEnabled as ht, buildSlackChannelPolicyScope as i, renderSlackMessagePresentationFallbackText as it, countSlackTextUtf8Bytes as j, registerSlackInstallationState as jt, SLACK_MESSAGE_TEXT_RECOMMENDED_LIMIT as k, getSlackInstallationKind as kt, resolveSlackAgentRoute as l, SLACK_BUTTON_VALUE_MAX as lt, appendSlackNativeDataFallbackText as m, validateSlackBlocksArray as mt, setSlackSessionStatus as n, countSlackDataTableCellCharacters as nt, resolveSlackGroupToolPolicy as o, SLACK_APPROVAL_HEADER_BLOCK_ID as ot, SLACK_MALFORMED_NATIVE_DATA_FALLBACK as p, parseSlackBlocksInput as pt, resolveSlackQuestionAction as q, buildSlackChannelIdCandidates as r, renderSlackMessagePresentationChartFallbackText as rt, qualifySlackConversationId as s, decodeSlackApprovalAction as st, renameSlackSession as t, countSlackDataTableBlocksCellCharacters as tt, normalizeSlackRouteBindingConfig as u, SLACK_PRESENTATION_CAPABILITIES as ut, hasSlackNativeDataBlock as v, normalizeSlackOriginTarget as vt, buildSlackBlocksFallbackText as w, shouldHandleSlackPluginViaForwardingSession as wt, isSlackNativeResponseUrlRejection as x, resolveSlackFallbackOriginTarget as xt, isSlackInvalidBlocksError as y, resolveSessionSlackOriginTarget as yt, SLACK_SELECT_ACTION_IDS as z, SLACK_PRIVATE_ACTION_DELIVERY_RESULT as zt };
1791
+ export { buildSlackDataVisualizationBlock as $, SLACK_MESSAGE_TEXT_HARD_LIMIT as A, resolveSlackApprovalTeamId as At, SLACK_REPLY_SELECT_ACTION_ID as B, resolvePluginApprovalSlackApprovers as Bt, isSlackNativeResponseUrlRejection as C, resolveSlackFallbackOriginTarget as Ct, buildSlackCompleteBlocksFallbackText as D, slackTargetsMatch as Dt, buildSlackBlocksFallbackText as E, shouldHandleSlackPluginViaForwardingSession as Et, truncateSlackTextByUtf8Bytes as F, isSlackExecApprovalAuthorizedSender as Ft, isSlackQuestionActionId as G, SLACK_SESSION_LINK_ACTION_ID as H, resolveSlackAutoThreadId as Ht, SLACK_BUTTON_ACTION_IDS as I, isSlackExecApprovalClientEnabled as It, encodeSlackQuestionAction as J, resolveSlackQuestionActionIds as K, SLACK_QUESTION_FINALIZATION_BLOCKS as L, normalizeSlackApproverId as Lt, SLACK_TEXT_LIMIT as M, isSlackWorkspaceInstallation as Mt, countSlackTextUtf8Bytes as N, registerSlackInstallationState as Nt, renderSlackBlockFallbackText as O, getSlackApprovalApproversForTeam as Ot, truncateSlackText as P, getSlackExecApprovalApprovers as Pt, normalizeSlackOutboundText as Q, SLACK_REPLY_BUTTON_ACTION_ID as R, resolveSlackExecApprovalTarget as Rt, isSlackInvalidBlocksResponse as S, resolveSlackApproverDmTargets as St, stripSlackNativeDataBlocks as T, shouldHandleSlackNativeApprovalRequest as Tt, isSlackApprovalActionId as U, SLACK_SELECT_ACTION_IDS as V, SLACK_PRIVATE_ACTION_DELIVERY_RESULT as Vt, isSlackCallbackActionId as W, chunkSlackMrkdwnText as X, resolveSlackQuestionAction as Y, markdownToSlackMrkdwnChunks as Z, appendSlackNativeDataPlainTextFallback as _, isSlackAnyNativeApprovalClientEnabled as _t, resolveSlackGroupRequireMention as a, renderSlackMessagePresentationChartFallbackText as at, hasSlackNativeDataBlock as b, normalizeSlackOriginTarget as bt, qualifySlackConversationId as c, SLACK_APPROVAL_HEADER_BLOCK_ID as ct, normalizeSlackRouteBindingConfig as d, SLACK_BUTTON_VALUE_MAX as dt, hasSlackDataVisualizationBlock as et, resolveSlackConversationBindingRoute as f, SLACK_PRESENTATION_CAPABILITIES as ft, appendSlackNativeDataFallbackText as g, validateSlackBlocksArray as gt, SLACK_MALFORMED_NATIVE_DATA_FALLBACK as h, parseSlackBlocksInput as ht, buildSlackChannelPolicyScope as i, countSlackDataTableCellCharacters as it, SLACK_MESSAGE_TEXT_RECOMMENDED_LIMIT as j, getSlackInstallationKind as jt, SLACK_EDIT_TEXT_MAX_BYTES as k, isSlackPluginApprovalAuthorizedSender as kt, qualifySlackRoutePeerId as l, decodeSlackApprovalAction as lt, assertSlackDetachedTargetAllowed as m, SLACK_MAX_BLOCKS as mt, setSlackSessionStatus as n, buildSlackDataTableBlock as nt, resolveSlackGroupToolPolicy as o, renderSlackMessagePresentationFallbackText as ot, resolveSlackConversationBindingRouteAsync as p, SLACK_SECTION_TEXT_MAX as pt, decodeSlackQuestionAction as q, buildSlackChannelIdCandidates as r, countSlackDataTableBlocksCellCharacters as rt, setSlackChannelPolicyBindings as s, escapeSlackMrkdwn as st, renameSlackSession as t, SLACK_DATA_TABLE_AGGREGATE_CELL_CHARACTERS_MAX as tt, resolveSlackAgentRoute as u, encodeSlackApprovalAction as ut, buildSlackNativeDataAccessibilityText as v, isSlackPluginApprovalRequest as vt, renderSlackNativeDataPlainTextBlock as w, resolveTurnSourceSlackOriginTarget as wt, isSlackInvalidBlocksError as x, resolveSessionSlackOriginTarget as xt, createSlackNativeDataBaseTextConsumer as y, normalizeSlackForwardTarget as yt, SLACK_REPLY_LINK_ACTION_ID as z, shouldSuppressLocalSlackExecApprovalPrompt as zt };
@@ -0,0 +1,2 @@
1
+ export { t as slackSetupPlugin } from "./channel.setup-u6QQdbTa.mjs";
2
+ import "../setup-plugin-api.js";
@@ -1,9 +1,9 @@
1
- import { c as resolveSlackAccountAllowFrom, o as resolveDefaultSlackAccountId } from "./accounts-BMg9YLIv.mjs";
2
- import { t as inspectSlackAccount } from "./account-inspect-D58VVDjk.mjs";
3
- import "./shared-CtprVh_G.mjs";
4
- import { a as buildSlackAllowFromPrompt, i as SLACK_CHANNEL, n as createSlackSetupWizardBase } from "./channel.setup-BFpQowO3.mjs";
5
- import { t as resolveSlackChannelAllowlist } from "./resolve-channels-B96cgprw.mjs";
6
- import { t as resolveSlackUserAllowlist } from "./resolve-users-Xz9aPdns.mjs";
1
+ import { c as resolveSlackAccountAllowFrom, o as resolveDefaultSlackAccountId } from "./accounts-msihSF3-.mjs";
2
+ import { t as inspectSlackAccount } from "./account-inspect-CmkKiSb9.mjs";
3
+ import "./shared-DpHCoKy2.mjs";
4
+ import { a as buildSlackAllowFromPrompt, i as SLACK_CHANNEL, n as createSlackSetupWizardBase } from "./channel.setup-u6QQdbTa.mjs";
5
+ import { t as resolveSlackChannelAllowlist } from "./resolve-channels-DRRhElwz.mjs";
6
+ import { t as resolveSlackUserAllowlist } from "./resolve-users-Cz8e17ky.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";
@@ -1,10 +1,10 @@
1
1
  import { r as isSlackPluginAccountConfigured } from "./account-configured-zcR9TJJN.mjs";
2
- import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, l as resolveSlackAccountDmPolicy } from "./accounts-BMg9YLIv.mjs";
3
- import { t as inspectSlackAccount } from "./account-inspect-D58VVDjk.mjs";
2
+ import { a as mergeSlackAccountConfig, c as resolveSlackAccountAllowFrom, i as listSlackAccountIds, l as resolveSlackAccountDmPolicy } from "./accounts-msihSF3-.mjs";
3
+ import { t as inspectSlackAccount } from "./account-inspect-CmkKiSb9.mjs";
4
4
  import { a as parseSlackTarget } from "./target-parsing-FFE26kOV.mjs";
5
- import { a as slackIngressIdentity, t as probeSlack } from "./probe-CyX52GtD.mjs";
5
+ import { a as slackIngressIdentity, t as probeSlack } from "./probe-IiHogLQN.mjs";
6
6
  import { n as SLACK_CHANNEL_META } from "./channel-meta-C443t-lI.mjs";
7
- import { r as slackBaseConfigAdapter, t as slackSetupPlugin } from "./channel.setup-BFpQowO3.mjs";
7
+ import { r as slackBaseConfigAdapter, t as slackSetupPlugin } from "./channel.setup-u6QQdbTa.mjs";
8
8
  import { n as normalizeCompatibilityConfig, r as runtime_doctor_migrations_exports, t as legacyConfigRules } from "./doctor-contract-Cd4-VzIM.mjs";
9
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";
@@ -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-C1nOGzJa.mjs").then((n) => n.n));
56
+ const loadSlackSecurityAuditModule = createLazyRuntimeModule(() => import("./security-audit-DFGiFLqd.mjs").then((n) => n.n));
57
57
  const slackSecurityAdapter = {
58
58
  resolveDmPolicy: resolveSlackDmPolicy,
59
59
  collectWarnings: collectSlackSecurityFindings,
@@ -150,7 +150,7 @@ function collectSlackNameKeyedChannelWarnings({ cfg }) {
150
150
  warnings.add(`${channelsPrefix}.channels."${channelKey}" is ambiguous: it may be a lowercase Slack channel ID or a channel name. If it is a channel name, inbound routing will not match it and ${fallbackDescription}. Re-key it with the channel's stable ID (e.g. C0123ABCD, from the channel's About details or conversations.info).`);
151
151
  continue;
152
152
  }
153
- warnings.add(`${channelsPrefix}.channels."${channelKey}" is keyed by a channel name or non-canonical ID form, not a routable Slack channel ID; under groupPolicy: "${effectiveGroupPolicy}" inbound routing does not match this entry, so ${fallbackDescription}. Re-key it with the channel's ID (e.g. C0123ABCD, from the channel's About details or conversations.info).`);
153
+ warnings.add(`${channelsPrefix}.channels."${channelKey}" is keyed by a channel name or unsupported ID form, not a routable Slack channel ID; under groupPolicy: "${effectiveGroupPolicy}" inbound routing does not match this entry, so ${fallbackDescription}. Re-key it with the channel's ID (e.g. C0123ABCD, from the channel's About details or conversations.info).`);
154
154
  }
155
155
  }
156
156
  return [...warnings];
@@ -216,6 +216,7 @@ const slackPluginBase = {
216
216
  },
217
217
  doctor: slackDoctor,
218
218
  agentPrompt: {
219
+ customInlineButtonHint: true,
219
220
  inboundFormattingHints: () => ({
220
221
  text_markup: "markdown",
221
222
  rules: [
@@ -1,7 +1,8 @@
1
- import { i as sanitizeSlackMonitorReplyPayload, r as deliverSlackSlashReplies } from "./replies-WmfwvQxc.mjs";
1
+ import { i as sanitizeSlackMonitorReplyPayload, r as deliverSlackSlashReplies } from "./replies-Cs9SqIIs.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";
5
5
  import { dispatchChannelInboundTurn, isChannelPartialDeliveryError } from "openclaw/plugin-sdk/channel-inbound";
6
6
  import { finalizeInboundContext, resolveChunkMode } from "openclaw/plugin-sdk/reply-runtime";
7
- export { deliverSlackSlashReplies, dispatchChannelInboundTurn, finalizeInboundContext, isChannelPartialDeliveryError, resolveAgentRoute, resolveChunkMode, resolveConversationLabel, resolveMarkdownTableMode, sanitizeSlackMonitorReplyPayload };
7
+ import { recordDeliveredCommandExchange } from "openclaw/plugin-sdk/session-transcript-runtime";
8
+ export { deliverSlackSlashReplies, dispatchChannelInboundTurn, finalizeInboundContext, isChannelPartialDeliveryError, recordDeliveredCommandExchange, resolveAgentRoute, resolveChunkMode, resolveConversationLabel, resolveMarkdownTableMode, sanitizeSlackMonitorReplyPayload };
@@ -1,4 +1,4 @@
1
- import { t as inspectSlackAccount } from "./.setup/account-inspect-D58VVDjk.mjs";
1
+ import { t as inspectSlackAccount } from "./.setup/account-inspect-CmkKiSb9.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,20 @@
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-BMg9YLIv.mjs";
3
- import { t as inspectSlackAccount } from "./.setup/account-inspect-D58VVDjk.mjs";
1
+ import { n as registerSlackHttpHandler, r as normalizeSlackWebhookPath, t as handleSlackHttpRequest } from "./.setup/registry-DizWcnNp.mjs";
2
+ import { a as mergeSlackAccountConfig, f as resolveSlackReplyToMode, i as listSlackAccountIds, o as resolveDefaultSlackAccountId, r as listEnabledSlackAccounts, s as resolveSlackAccount } from "./.setup/accounts-msihSF3-.mjs";
3
+ import { t as inspectSlackAccount } from "./.setup/account-inspect-CmkKiSb9.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 { Bt as resolveSlackAutoThreadId, a as resolveSlackGroupRequireMention, ft as SLACK_MAX_BLOCKS, mt as validateSlackBlocksArray, o as resolveSlackGroupToolPolicy, pt as parseSlackBlocksInput } from "./.setup/session-status-CcXe10zN.mjs";
7
- import { A as resolveSlackAllowListMatch, D as allowListMatches, E as resolveSlackWriteClientOptions, M as resolveSlackUserAllowed, O as normalizeSlackAllowOwnerEntry, S as SLACK_WRITE_RETRY_OPTIONS, T as resolveSlackWebClientOptions, _ as getSlackWriteClient, h as createSlackWriteClient, k as normalizeSlackSlug, m as createSlackWebClient, p as createSlackTokenCacheKey, t as probeSlack, x as SLACK_DEFAULT_RETRY_OPTIONS } from "./.setup/probe-CyX52GtD.mjs";
8
- import { n as buildSlackThreadingToolContext, t as slackPlugin } from "./.setup/channel-C7MY-Hhg.mjs";
9
- import { d as buildSlackInteractiveBlocks, f as buildSlackPresentationBlocks } from "./.setup/reply-blocks-rqHQ_3pr.mjs";
10
- import { n as extractSlackToolSend, r as listSlackMessageActions } from "./.setup/message-tool-api-C7im5ETh.mjs";
11
- import { n as resolveSlackChannelType } from "./.setup/channel-type-NjX2SwvS.mjs";
12
- import { t as slackSetupPlugin } from "./.setup/channel.setup-BFpQowO3.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-KGKwTAKO.mjs";
14
- import { a as clearSlackThreadParticipationCache, s as hasSlackThreadParticipation, u as recordSlackThreadParticipation } from "./.setup/send-CLmsR42r.mjs";
15
- import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-BEDZPfDn.mjs";
16
- import { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-C1nOGzJa.mjs";
6
+ import { Ht as resolveSlackAutoThreadId, a as resolveSlackGroupRequireMention, gt as validateSlackBlocksArray, ht as parseSlackBlocksInput, mt as SLACK_MAX_BLOCKS, o as resolveSlackGroupToolPolicy } from "./.setup/session-status-DQY4hZLd.mjs";
7
+ import { A as resolveSlackAllowListMatch, D as allowListMatches, E as resolveSlackWriteClientOptions, M as resolveSlackUserAllowed, O as normalizeSlackAllowOwnerEntry, S as SLACK_WRITE_RETRY_OPTIONS, T as resolveSlackWebClientOptions, _ as getSlackWriteClient, h as createSlackWriteClient, k as normalizeSlackSlug, m as createSlackWebClient, p as createSlackTokenCacheKey, t as probeSlack, x as SLACK_DEFAULT_RETRY_OPTIONS } from "./.setup/probe-IiHogLQN.mjs";
8
+ import { n as buildSlackThreadingToolContext, t as slackPlugin } from "./.setup/channel-B-jnk0Gl.mjs";
9
+ import { d as buildSlackInteractiveBlocks, f as buildSlackPresentationBlocks } from "./.setup/reply-blocks-CoZ_dGM_.mjs";
10
+ import { n as extractSlackToolSend, r as listSlackMessageActions } from "./.setup/message-tool-api-BS5ekEA_.mjs";
11
+ import { n as resolveSlackChannelType } from "./.setup/channel-type-BrbGGbzI.mjs";
12
+ import { t as slackSetupPlugin } from "./.setup/channel.setup-u6QQdbTa.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-CafoV8hS.mjs";
14
+ import { a as clearSlackThreadParticipationCache, s as hasSlackThreadParticipation, u as recordSlackThreadParticipation } from "./.setup/send-pi6r24yv.mjs";
15
+ import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-Cjj0N8R0.mjs";
16
+ import "./.setup/http-C9sM-FXe.mjs";
17
+ import { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-DFGiFLqd.mjs";
17
18
  import { normalizeStringEntries as normalizeAllowList, normalizeStringEntriesLower as normalizeAllowListLower } from "openclaw/plugin-sdk/string-normalization-runtime";
18
19
  import { resolveOpenProviderRuntimeGroupPolicy as resolveSlackRuntimeGroupPolicy } from "openclaw/plugin-sdk/runtime-group-policy";
19
20
  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 @@
1
- import { t as SlackChannelConfigSchema } from "./.setup/config-schema-BH0K9-Um.mjs";
2
- export { SlackChannelConfigSchema };
1
+ export { t as SlackChannelConfigSchema } from "./.setup/config-schema-DNnh6bWU.mjs";
@@ -1,2 +1 @@
1
- import { t as slackPlugin } from "./.setup/channel-C7MY-Hhg.mjs";
2
- export { slackPlugin };
1
+ export { t as slackPlugin } from "./.setup/channel-B-jnk0Gl.mjs";
@@ -1,2 +1 @@
1
- import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-BEDZPfDn.mjs";
2
- export { listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig };
1
+ export { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./.setup/directory-config-Cjj0N8R0.mjs";
@@ -1,2 +1 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./.setup/doctor-contract-Cd4-VzIM.mjs";
2
- export { legacyConfigRules, normalizeCompatibilityConfig };
1
+ export { t as legacyConfigRules, n as normalizeCompatibilityConfig } from "./.setup/doctor-contract-Cd4-VzIM.mjs";
@@ -1,2 +1 @@
1
- import { t as registerSlackPluginHttpRoutes } from "./.setup/plugin-routes-B8tooDLj.mjs";
2
- export { registerSlackPluginHttpRoutes };
1
+ export { t as registerSlackPluginHttpRoutes } from "./.setup/plugin-routes-D4qozHVn.mjs";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as registerSlackPluginHttpRoutes } from "./.setup/plugin-routes-B8tooDLj.mjs";
1
+ import { t as registerSlackPluginHttpRoutes } from "./.setup/plugin-routes-D4qozHVn.mjs";
2
2
  import "./http-routes-api.js";
3
3
  import { defineBundledChannelEntry } from "openclaw/plugin-sdk/channel-entry-contract";
4
4
  //#region extensions/slack/index.ts
@@ -1,2 +1 @@
1
- import { t as describeSlackMessageTool } from "./.setup/message-tool-api-C7im5ETh.mjs";
2
- export { describeSlackMessageTool as describeMessageTool };
1
+ export { t as describeMessageTool } from "./.setup/message-tool-api-BS5ekEA_.mjs";
@@ -1,13 +1,13 @@
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-BMg9YLIv.mjs";
3
- import { a as resolveSlackGroupRequireMention, o as resolveSlackGroupToolPolicy } from "./.setup/session-status-CcXe10zN.mjs";
4
- import { t as probeSlack } from "./.setup/probe-CyX52GtD.mjs";
1
+ import { t as registerSlackPluginHttpRoutes } from "./.setup/plugin-routes-D4qozHVn.mjs";
2
+ import { h as resolveSlackBotToken, i as listSlackAccountIds, m as resolveSlackAppToken, o as resolveDefaultSlackAccountId, r as listEnabledSlackAccounts, s as resolveSlackAccount } from "./.setup/accounts-msihSF3-.mjs";
3
+ import { a as resolveSlackGroupRequireMention, o as resolveSlackGroupToolPolicy } from "./.setup/session-status-DQY4hZLd.mjs";
4
+ import { t as probeSlack } from "./.setup/probe-IiHogLQN.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-KGKwTAKO.mjs";
7
- import { t as sendMessageSlack } from "./.setup/send-CLmsR42r.mjs";
8
- import { n as slackActionRuntime, t as handleSlackAction } from "./.setup/action-runtime-BiRZNsIG.mjs";
9
- import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./.setup/directory-live-FipfeCwt.mjs";
10
- import { n as monitorSlackProvider } from "./.setup/monitor-BnN2px0N.mjs";
11
- import { t as resolveSlackChannelAllowlist } from "./.setup/resolve-channels-B96cgprw.mjs";
12
- import { t as resolveSlackUserAllowlist } from "./.setup/resolve-users-Xz9aPdns.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-CafoV8hS.mjs";
7
+ import { t as sendMessageSlack } from "./.setup/send-pi6r24yv.mjs";
8
+ import { n as slackActionRuntime, t as handleSlackAction } from "./.setup/action-runtime-CgYsBWl6.mjs";
9
+ import { n as listSlackDirectoryGroupsLive, r as listSlackDirectoryPeersLive } from "./.setup/directory-live-BIKD-5B_.mjs";
10
+ import { n as monitorSlackProvider } from "./.setup/monitor-DmJ-Qbx4.mjs";
11
+ import { t as resolveSlackChannelAllowlist } from "./.setup/resolve-channels-DRRhElwz.mjs";
12
+ import { t as resolveSlackUserAllowlist } from "./.setup/resolve-users-Cz8e17ky.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 @@
1
- import { r as setSlackRuntime } from "./.setup/runtime-JSVZSWAj.mjs";
2
- export { setSlackRuntime };
1
+ export { r as setSlackRuntime } from "./.setup/runtime-JSVZSWAj.mjs";
@@ -1,2 +1 @@
1
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./.setup/secret-contract-B-Qm6aQQ.mjs";
2
- export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
1
+ export { t as channelSecrets, n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./.setup/secret-contract-B-Qm6aQQ.mjs";
@@ -1,2 +1 @@
1
- import { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-C1nOGzJa.mjs";
2
- export { collectSlackSecurityAuditFindings };
1
+ export { t as collectSlackSecurityAuditFindings } from "./.setup/security-audit-DFGiFLqd.mjs";
@@ -4,15 +4,15 @@ 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-D92P5p51.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/setup-plugin-api-B18kDKtr.mjs", import.meta.url).href),
8
8
  exportName: "slackSetupPlugin"
9
9
  },
10
10
  secrets: {
11
- specifier: fileURLToPath(new URL(".setup/secret-contract-api-DmUVxIRs.mjs", import.meta.url).href),
11
+ specifier: fileURLToPath(new URL(".setup/secret-contract-api-DB6CMdgc.mjs", import.meta.url).href),
12
12
  exportName: "channelSecrets"
13
13
  },
14
14
  runtime: {
15
- specifier: fileURLToPath(new URL(".setup/runtime-setter-api-CMFvhrAr.mjs", import.meta.url).href),
15
+ specifier: fileURLToPath(new URL(".setup/runtime-setter-api-Cx_PV-xu.mjs", import.meta.url).href),
16
16
  exportName: "setSlackRuntime"
17
17
  }
18
18
  });
@@ -1,2 +1 @@
1
- import { t as slackSetupPlugin } from "./.setup/channel.setup-BFpQowO3.mjs";
2
- export { slackSetupPlugin };
1
+ export { t as slackSetupPlugin } from "./.setup/channel.setup-u6QQdbTa.mjs";
@@ -12,7 +12,7 @@ export function FromObject(context, type, value) {
12
12
  return value;
13
13
  const additionalProperties = GetAdditionalProperties(type);
14
14
  for (const key of Guard.Keys(value)) {
15
- if (Guard.HasPropertyKey(type.properties, key)) {
15
+ if (Guard.HasPropertyKey(type.properties, key) && IsSchema(type.properties[key])) {
16
16
  value[key] = FromType(context, type.properties[key], value[key]);
17
17
  continue;
18
18
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.3.34",
4
+ "version": "1.3.35",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
@@ -2932,7 +2932,7 @@
2932
2932
  },
2933
2933
  "streaming.mode": {
2934
2934
  "label": "Slack Streaming Mode",
2935
- "help": "Canonical Slack preview mode: \"off\" | \"partial\" | \"block\" | \"progress\" (default). Default progress outside reply threads uses only a temporary typing reaction. Any explicit streaming.progress setting opts top-level turns into a preview, except nativeTaskCards: true, which only affects threads."
2935
+ "help": "Slack preview mode: \"off\" | \"partial\" | \"block\" | \"progress\" (default). Default progress outside reply threads uses only a temporary typing reaction. Any explicit streaming.progress setting opts top-level turns into a preview, except nativeTaskCards: true, which only affects threads."
2936
2936
  },
2937
2937
  "streaming.chunkMode": {
2938
2938
  "label": "Slack Chunk Mode",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/slack",
3
- "version": "2026.10.5-beta.4",
3
+ "version": "2026.10.10-beta.1",
4
4
  "description": "OpenClaw Slack channel plugin for channels, DMs, commands, and app events.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,12 +12,12 @@
12
12
  "@slack/types": "3.2.0",
13
13
  "@slack/web-api": "8.2.0",
14
14
  "get-east-asian-width": "1.7.0",
15
- "typebox": "1.3.34",
15
+ "typebox": "1.3.35",
16
16
  "undici": "8.11.2",
17
17
  "zod": "4.6.5"
18
18
  },
19
19
  "peerDependencies": {
20
- "openclaw": ">=2026.10.5-beta.4"
20
+ "openclaw": ">=2026.10.10-beta.1"
21
21
  },
22
22
  "peerDependenciesMeta": {
23
23
  "openclaw": {
@@ -150,10 +150,10 @@
150
150
  "allowInvalidConfigRecovery": true
151
151
  },
152
152
  "compat": {
153
- "pluginApi": ">=2026.10.5-beta.4"
153
+ "pluginApi": ">=2026.10.10-beta.1"
154
154
  },
155
155
  "build": {
156
- "openclawVersion": "2026.10.5-beta.4",
156
+ "openclawVersion": "2026.10.10-beta.1",
157
157
  "bundledDist": false
158
158
  },
159
159
  "release": {
@@ -1,2 +0,0 @@
1
- import { t as handleSlackAction } from "./action-runtime-BiRZNsIG.mjs";
2
- export { handleSlackAction };
@@ -1,3 +0,0 @@
1
- import { r as setSlackRuntime } from "./runtime-JSVZSWAj.mjs";
2
- import "../runtime-setter-api.js";
3
- export { setSlackRuntime };
@@ -1,3 +0,0 @@
1
- import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries, t as channelSecrets } from "./secret-contract-B-Qm6aQQ.mjs";
2
- import "../secret-contract-api.js";
3
- export { channelSecrets, collectRuntimeConfigAssignments, secretTargetRegistryEntries };
@@ -1,3 +0,0 @@
1
- import { t as slackSetupPlugin } from "./channel.setup-BFpQowO3.mjs";
2
- import "../setup-plugin-api.js";
3
- export { slackSetupPlugin };
@@ -1,6 +1,6 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-B4FMCO8f.mjs";
2
- import { readChannelAllowFromStore } from "openclaw/plugin-sdk/conversation-runtime";
3
2
  import { coerceNativeSetting, normalizeAllowFromList } from "openclaw/plugin-sdk/channel-policy";
3
+ import { readChannelAllowFromStore } from "openclaw/plugin-sdk/conversation-runtime";
4
4
  import { resolveNativeCommandsEnabled, resolveNativeSkillsEnabled } from "openclaw/plugin-sdk/native-command-config-runtime";
5
5
  //#region extensions/slack/src/security-audit.ts
6
6
  var security_audit_exports = /* @__PURE__ */ __exportAll({ collectSlackSecurityAuditFindings: () => collectSlackSecurityAuditFindings });