@openclaw/slack 2026.7.2-beta.7 → 2026.8.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/{account-inspect-DEKpg9Ip.js → account-inspect-Drw2gAiN.js} +1 -1
  2. package/dist/account-inspect-api.js +1 -1
  3. package/dist/{accounts-CHAeNZOX.js → accounts-CK4AVI2_.js} +2 -2
  4. package/dist/{accounts.runtime-BHD4Ma2R.js → accounts.runtime-Cb7QwWBz.js} +1 -1
  5. package/dist/{action-runtime-DfuYoMjG.js → action-runtime-BkGe7ny_.js} +148 -76
  6. package/dist/action-runtime.runtime-D9I6uc0Q.js +2 -0
  7. package/dist/{actions-D3NuJvva.js → actions-BTDXwwE3.js} +85 -44
  8. package/dist/actions.runtime-DLFyUkvg.js +2 -0
  9. package/dist/api.js +15 -15
  10. package/dist/{approval-handler.runtime-BA05P0QT.js → approval-handler.runtime-CJaNzAq2.js} +51 -14
  11. package/dist/{block-text-DkHaoGem.js → block-text-YtiNkqmx.js} +1 -1
  12. package/dist/{channel-B9fVdW3s.js → channel-D_tovcUL.js} +151 -91
  13. package/dist/channel-config-api.js +1 -1
  14. package/dist/channel-plugin-api.js +1 -1
  15. package/dist/{channel-type-DXyos1d2.js → channel-type-B9MSdoGN.js} +9 -8
  16. package/dist/{config-adapter-CxBQH8fq.js → channel.setup-Bch9dYmA.js} +83 -25
  17. package/dist/{config-schema-SgZT6nXV.js → config-schema-xto5jFIx.js} +5 -11
  18. package/dist/{directory-config-CnCIAktf.js → directory-config-CNBz8lJa.js} +3 -3
  19. package/dist/directory-contract-api.js +1 -1
  20. package/dist/{directory-live-DKunWh3A.js → directory-live-CFKUtW9E.js} +13 -22
  21. package/dist/{doctor-contract-CsGH1Dfc.js → doctor-contract-BAy7-EUQ.js} +30 -3
  22. package/dist/doctor-contract-api.js +1 -1
  23. package/dist/{group-policy-NQZti9t-.js → group-policy-c4RP9bjc.js} +248 -163
  24. package/dist/index.js +4 -1
  25. package/dist/{message-tool-api-DkhFpMoy.js → message-tool-api-BykQB4AU.js} +14 -3
  26. package/dist/message-tool-api.js +1 -1
  27. package/dist/{monitor-CmKz0wtI.js → monitor-1nF1NtqT.js} +3 -3
  28. package/dist/{outbound-adapter-BkuMp2Vs.js → outbound-adapter-S81tsswN.js} +19 -17
  29. package/dist/{pipeline.runtime-DgtmuYCP.js → pipeline.runtime-BvYsM5JO.js} +1087 -682
  30. package/dist/{policy-PRysPn23.js → policy-TapwbeaT.js} +18 -14
  31. package/dist/{probe-CgDsSops.js → probe-HoEg_WxB.js} +38 -18
  32. package/dist/{provider-DmRizMZt.js → provider-CDNvBXUi.js} +3422 -2590
  33. package/dist/{relay-source-Blxj8xb4.js → relay-source-C9leF11u.js} +11 -21
  34. package/dist/{replies-4s_Vq_z9.js → replies-CeOfv82I.js} +52 -6
  35. package/dist/{resolve-channels-yEqmM-3I.js → resolve-channels-CNPrxaXY.js} +39 -12
  36. package/dist/{resolve-users-BOrt5K-5.js → resolve-users-Dzomuwnr.js} +28 -5
  37. package/dist/{runtime-api-QMb-Q5Ko.js → runtime-api-Cj9nxBNv.js} +3 -3
  38. package/dist/runtime-api.js +11 -11
  39. package/dist/{scopes-BJSrkAp6.js → scopes-cYXKkrRD.js} +1 -1
  40. package/dist/{send-DsLeZpST.js → send-Nor0iBwY.js} +211 -105
  41. package/dist/{send.runtime-gUdK6V3h.js → send.runtime-BmgNe6S9.js} +1 -1
  42. package/dist/setup-entry.js +1 -4
  43. package/dist/setup-plugin-api.js +1 -1
  44. package/dist/{setup-surface-BeNzrMrJ.js → setup-surface-CbX1-Knh.js} +6 -6
  45. package/dist/{shared-DgIN3Dcr.js → shared-zdT5AMp-.js} +36 -42
  46. package/dist/{slash-dispatch.runtime-zPkyl7dB.js → slash-dispatch.runtime-Bnr9GR1S.js} +1 -1
  47. package/dist/{streaming-compat-3_X-21wW.js → streaming-compat-B-e0mqM0.js} +3 -8
  48. package/dist/{target-parsing-N6lHogYZ.js → target-parsing-BnMD2ZqZ.js} +40 -2
  49. package/dist/{targets-KmjP2E8s.js → targets-Cx5W_n3W.js} +1 -1
  50. package/node_modules/@slack/bolt/node_modules/@types/node/README.md +1 -1
  51. package/node_modules/@slack/bolt/node_modules/@types/node/crypto.d.ts +1 -1
  52. package/node_modules/@slack/bolt/node_modules/@types/node/package.json +2 -2
  53. package/node_modules/@slack/socket-mode/node_modules/@types/node/README.md +1 -1
  54. package/node_modules/@slack/socket-mode/node_modules/@types/node/crypto.d.ts +1 -1
  55. package/node_modules/@slack/socket-mode/node_modules/@types/node/package.json +2 -2
  56. package/node_modules/@slack/web-api/node_modules/@types/node/README.md +1 -1
  57. package/node_modules/@slack/web-api/node_modules/@types/node/crypto.d.ts +1 -1
  58. package/node_modules/@slack/web-api/node_modules/@types/node/package.json +2 -2
  59. package/node_modules/undici/lib/cache/memory-cache-store.js +54 -9
  60. package/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
  61. package/node_modules/undici/lib/core/request.js +12 -1
  62. package/node_modules/undici/lib/dispatcher/client-h1.js +11 -2
  63. package/node_modules/undici/lib/handler/cache-handler.js +246 -64
  64. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +3 -3
  65. package/node_modules/undici/lib/handler/retry-handler.js +24 -0
  66. package/node_modules/undici/lib/interceptor/cache.js +159 -52
  67. package/node_modules/undici/lib/util/cache.js +324 -62
  68. package/node_modules/undici/lib/util/date.js +23 -6
  69. package/node_modules/undici/lib/web/cookies/util.js +79 -9
  70. package/node_modules/undici/package.json +1 -1
  71. package/openclaw.plugin.json +239 -34
  72. package/package.json +9 -9
  73. package/skills/slack/SKILL.md +10 -68
  74. package/dist/action-runtime.runtime-DQErZYpz.js +0 -2
  75. package/dist/actions.runtime-BIRU_G4M.js +0 -2
  76. package/dist/channel.setup-CLP5oTvh.js +0 -56
  77. package/dist/preflight-audio.runtime-D5Bgags0.js +0 -3
  78. package/dist/slash-plugin-commands.runtime-Dosfcx3X.js +0 -2
@@ -1,6 +1,7 @@
1
- import { a as resolveSlackAccount, c as resolveSlackConfigAccessorAccount, i as resolveDefaultSlackAccountId, n as listSlackAccountIds } from "./accounts-CHAeNZOX.js";
2
- import { t as inspectSlackAccount } from "./account-inspect-DEKpg9Ip.js";
1
+ import { a as resolveSlackAccount, c as resolveSlackConfigAccessorAccount, i as resolveDefaultSlackAccountId, n as listSlackAccountIds } from "./accounts-CK4AVI2_.js";
2
+ import { t as inspectSlackAccount } from "./account-inspect-Drw2gAiN.js";
3
3
  import { t as isSlackPluginAccountConfigured } from "./account-configured-BwfXBo_F.js";
4
+ import { t as SlackChannelConfigSchema } from "./config-schema-xto5jFIx.js";
4
5
  import { hasConfiguredSecretInput, normalizeSecretInputString } from "openclaw/plugin-sdk/secret-input";
5
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
6
7
  import { adaptScopedAccountAccessor, createScopedChannelConfigAdapter } from "openclaw/plugin-sdk/channel-config-helpers";
@@ -247,7 +248,12 @@ const slackSetupAdapterBase = createPatchedAccountSetupAdapter({
247
248
  const identity = setupInput.identity ?? account.config.postAs ?? "bot";
248
249
  const mode = setupInput.mode ?? account.config.mode ?? "socket";
249
250
  if (identity === "user" && mode === "relay") return "Slack user identity setup supports mode \"socket\" or \"http\", not \"relay\".";
250
- if (setupInput.useEnv) return identity === "user" ? "Slack user identity setup does not support --use-env; configure userToken and the transport credential explicitly." : null;
251
+ if (setupInput.useEnv) {
252
+ if (identity === "user") return "Slack user identity setup does not support --use-env; configure userToken and the transport credential explicitly.";
253
+ if (mode === "socket" && !normalizeOptionalString(setupInput.appToken) && account.appTokenStatus === "missing") return "Slack Socket Mode requires SLACK_APP_TOKEN when using --use-env.";
254
+ if (mode === "http" && !normalizeOptionalString(setupInput.signingSecret) && account.signingSecretStatus === "missing") return "Slack HTTP mode requires a configured signing secret when using --use-env.";
255
+ return null;
256
+ }
251
257
  if (hasSlackSetupCredentials({
252
258
  input: setupInput,
253
259
  identity,
@@ -268,25 +274,6 @@ const slackSetupAdapterBase = createPatchedAccountSetupAdapter({
268
274
  };
269
275
  }
270
276
  });
271
- const slackSetupAdapter = {
272
- ...slackSetupAdapterBase,
273
- singleAccountKeysToMove: ["appToken"],
274
- applyAccountConfig: ({ cfg, accountId, input }) => {
275
- const setupInput = input;
276
- const identity = setupInput.identity ?? inspectSlackAccount({
277
- cfg,
278
- accountId
279
- }).config.postAs;
280
- return slackSetupAdapterBase.applyAccountConfig({
281
- cfg,
282
- accountId,
283
- input: identity === "user" ? {
284
- ...setupInput,
285
- identity
286
- } : setupInput
287
- });
288
- }
289
- };
290
277
  const slackSetupContract = defineChannelSetupContract({
291
278
  fields: {
292
279
  botToken: {
@@ -342,10 +329,29 @@ const slackSetupContract = defineChannelSetupContract({
342
329
  cli: {
343
330
  flags: "--use-env",
344
331
  description: "Use Slack environment credentials"
345
- }
332
+ },
333
+ envVars: ["SLACK_BOT_TOKEN"]
346
334
  }
347
335
  },
348
- legacyAdapter: slackSetupAdapter
336
+ legacyAdapter: {
337
+ ...slackSetupAdapterBase,
338
+ singleAccountKeysToMove: ["appToken"],
339
+ applyAccountConfig: ({ cfg, accountId, input }) => {
340
+ const setupInput = input;
341
+ const identity = setupInput.identity ?? inspectSlackAccount({
342
+ cfg,
343
+ accountId
344
+ }).config.postAs;
345
+ return slackSetupAdapterBase.applyAccountConfig({
346
+ cfg,
347
+ accountId,
348
+ input: identity === "user" ? {
349
+ ...setupInput,
350
+ identity
351
+ } : setupInput
352
+ });
353
+ }
354
+ }
349
355
  });
350
356
  function createSlackSetupWizardBase(handlers) {
351
357
  const slackDmPolicy = createChannelDmPolicy({
@@ -563,4 +569,56 @@ const slackBaseConfigAdapter = createScopedChannelConfigAdapter({
563
569
  resolveDefaultTo: (account) => account.defaultTo
564
570
  });
565
571
  //#endregion
566
- export { slackSetupContract as a, isSlackSetupAccountConfigured as c, slackSetupAdapter as i, createSlackSetupWizardBase as n, SLACK_CHANNEL as o, createSlackSetupWizardProxy as r, describeSlackSetupAccount as s, slackBaseConfigAdapter as t };
572
+ //#region extensions/slack/src/channel.setup.ts
573
+ const slackSetupWizard = createSlackSetupWizardProxy(async () => ({ slackSetupWizard: (await import("./setup-surface-CbX1-Knh.js")).slackSetupWizard }));
574
+ const slackSetupPlugin = {
575
+ id: SLACK_CHANNEL,
576
+ meta: {
577
+ id: SLACK_CHANNEL,
578
+ label: "Slack",
579
+ selectionLabel: "Slack (Socket Mode)",
580
+ detailLabel: "Slack Bot",
581
+ docsPath: "/channels/slack",
582
+ docsLabel: "slack",
583
+ blurb: "supported (Socket Mode).",
584
+ systemImage: "number",
585
+ markdownCapable: true,
586
+ preferSessionLookupForAnnounceTarget: true
587
+ },
588
+ setupWizard: slackSetupWizard,
589
+ capabilities: {
590
+ chatTypes: [
591
+ "direct",
592
+ "channel",
593
+ "thread"
594
+ ],
595
+ reactions: true,
596
+ threads: true,
597
+ media: true,
598
+ nativeCommands: true
599
+ },
600
+ commands: {
601
+ nativeCommandsAutoEnabled: false,
602
+ nativeSkillsAutoEnabled: false,
603
+ resolveNativeCommandName: ({ commandKey, defaultName }) => commandKey === "status" ? "agentstatus" : defaultName
604
+ },
605
+ streaming: { blockStreamingCoalesceDefaults: {
606
+ minChars: 1500,
607
+ idleMs: 1e3
608
+ } },
609
+ reload: { configPrefixes: ["channels.slack"] },
610
+ configSchema: SlackChannelConfigSchema,
611
+ config: {
612
+ ...slackBaseConfigAdapter,
613
+ hasConfiguredState: ({ env }) => [
614
+ "SLACK_APP_TOKEN",
615
+ "SLACK_BOT_TOKEN",
616
+ "SLACK_USER_TOKEN"
617
+ ].some((key) => typeof env?.[key] === "string" && env[key]?.trim().length > 0),
618
+ isConfigured: (account) => isSlackSetupAccountConfigured(account),
619
+ describeAccount: (account) => describeSlackSetupAccount(account)
620
+ },
621
+ setupContract: slackSetupContract
622
+ };
623
+ //#endregion
624
+ export { slackSetupContract as a, createSlackSetupWizardProxy as i, slackBaseConfigAdapter as n, SLACK_CHANNEL as o, createSlackSetupWizardBase as r, slackSetupPlugin as t };
@@ -8,10 +8,6 @@ const slackChannelConfigUiHints = {
8
8
  label: "Slack",
9
9
  help: "Slack channel provider configuration for bot/app tokens, streaming behavior, and DM policy controls. Keep token handling and thread behavior explicit to avoid noisy workspace interactions."
10
10
  },
11
- enterpriseOrgInstall: {
12
- label: "Slack Enterprise Grid Org Install",
13
- help: "Enable only for an Enterprise Grid org-wide bot installation. OpenClaw verifies the token with Slack auth.test at startup; DMs must be disabled or use dmPolicy=\"open\" with allowFrom=[\"*\"]."
14
- },
15
11
  postAs: {
16
12
  label: "Slack Identity",
17
13
  help: "Select \"bot\" (default) for the classic Slack app/bot identity or \"user\" to post as the authorizing human through a user token while the app carries event transport."
@@ -28,16 +24,15 @@ const slackChannelConfigUiHints = {
28
24
  nativeCommands: true,
29
25
  implicitMentions: true,
30
26
  streaming: {
31
- "": "Unified Slack stream preview mode: \"off\" | \"partial\" | \"block\" | \"progress\". Legacy boolean/streamMode keys are auto-mapped.",
32
- mode: "Canonical Slack preview mode: \"off\" | \"partial\" | \"block\" | \"progress\".",
27
+ "": "Unified Slack stream preview mode: \"off\" | \"partial\" | \"block\" | \"progress\" (default). Legacy boolean/streamMode keys are auto-mapped.",
28
+ mode: "Canonical Slack preview mode: \"off\" | \"partial\" | \"block\" | \"progress\" (default).",
33
29
  chunkMode: "Chunking mode for outbound Slack text delivery: \"length\" (default) or \"newline\".",
34
30
  "block.enabled": "Enable chunked block-style Slack preview delivery when channels.slack.streaming.mode=\"block\".",
35
31
  "block.coalesce": "Merge streamed Slack block replies before final delivery.",
36
32
  nativeTransport: "Enable native Slack text streaming (chat.startStream/chat.appendStream/chat.stopStream) when channels.slack.streaming.mode is partial (default: true). Native streaming and Slack assistant thread status require a reply thread target; top-level DMs can still use draft post-and-edit preview streaming.",
37
33
  "preview.toolProgress": "Show tool/progress activity in the live draft preview message (default: true). Set false to hide interim tool updates while the draft preview stays active.",
38
- "preview.commandText": "Command/exec detail in preview tool-progress lines: \"raw\" preserves released behavior; \"status\" shows only the tool label.",
39
- "progress.render": "Progress draft renderer: \"text\" uses one portable text body; \"rich\" renders structured Slack Block Kit fields with the same text fallback.",
40
- "progress.nativeTaskCards": "Opt in to Slack native task-card progress updates when channels.slack.streaming.mode=\"progress\" and streaming.nativeTransport is enabled. Default: false."
34
+ "preview.commandText": "Command/exec detail in preview tool-progress lines: \"status\" is the safe default; \"raw\" opts into command text.",
35
+ "progress.nativeTaskCards": "Slack native task-card progress updates when channels.slack.streaming.mode=\"progress\" and streaming.nativeTransport is enabled. Set false to fall back to the Block Kit progress card. Default: true."
41
36
  },
42
37
  progress: { labels: "openclaw" }
43
38
  }),
@@ -99,7 +94,7 @@ const slackChannelConfigUiHints = {
99
94
  },
100
95
  execApprovals: {
101
96
  label: "Slack Exec Approvals",
102
- help: "Slack-native exec approval routing and approver authorization. When unset, OpenClaw auto-enables DM-first native approvals if approvers can be resolved for this workspace account."
97
+ help: "Slack-native exec approval routing and approver authorization. When unset, OpenClaw auto-enables DM-first native approvals if approvers can be resolved for this Slack account."
103
98
  },
104
99
  presenceEvents: {
105
100
  label: "Slack Presence Events",
@@ -199,7 +194,6 @@ const SlackAccountSchema = z.object({
199
194
  "http",
200
195
  "relay"
201
196
  ]).optional(),
202
- enterpriseOrgInstall: z.boolean().optional(),
203
197
  relay: SlackRelaySchema.optional(),
204
198
  signingSecret: SecretInputSchema.optional(),
205
199
  webhookPath: z.string().optional(),
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { i as resolveDefaultSlackAccountId, o as resolveSlackAccountAllowFrom, r as mergeSlackAccountConfig } from "./accounts-CHAeNZOX.js";
3
- import { i as parseSlackTarget } from "./target-parsing-N6lHogYZ.js";
4
- import "./targets-KmjP2E8s.js";
2
+ import { i as resolveDefaultSlackAccountId, o as resolveSlackAccountAllowFrom, r as mergeSlackAccountConfig } from "./accounts-CK4AVI2_.js";
3
+ import { a as parseSlackTarget } from "./target-parsing-BnMD2ZqZ.js";
4
+ import "./targets-Cx5W_n3W.js";
5
5
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
6
6
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { createResolvedDirectoryEntriesLister } from "openclaw/plugin-sdk/directory-config-runtime";
@@ -1,2 +1,2 @@
1
- import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./directory-config-CnCIAktf.js";
1
+ import { n as listSlackDirectoryGroupsFromConfig, r as listSlackDirectoryPeersFromConfig } from "./directory-config-CNBz8lJa.js";
2
2
  export { listSlackDirectoryGroupsFromConfig, listSlackDirectoryPeersFromConfig };
@@ -1,6 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
2
- import { a as resolveSlackAccount } from "./accounts-CHAeNZOX.js";
3
- import { a as createSlackLookupClient } from "./probe-CgDsSops.js";
2
+ import { a as resolveSlackAccount } from "./accounts-CK4AVI2_.js";
3
+ import { i as createSlackLookupClient } from "./probe-HoEg_WxB.js";
4
+ import { t as collectSlackCursorPages } from "./cursor-pages-eX7p8Wwt.js";
4
5
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
6
  //#region extensions/slack/src/directory-live.ts
6
7
  var directory_live_exports = /* @__PURE__ */ __exportAll({
@@ -67,18 +68,13 @@ async function listSlackDirectoryPeersLive(params) {
67
68
  const client = createSlackDirectoryClient(params);
68
69
  if (!client) return [];
69
70
  const query = normalizeQuery(params.query);
70
- const members = [];
71
- let cursor;
72
- do {
73
- const res = await client.users.list({
71
+ const rows = (await collectSlackCursorPages({
72
+ fetchPage: (cursor) => client.users.list({
74
73
  limit: 200,
75
74
  cursor
76
- });
77
- if (Array.isArray(res.members)) members.push(...res.members);
78
- const next = res.response_metadata?.next_cursor?.trim();
79
- cursor = next ? next : void 0;
80
- } while (cursor);
81
- const rows = members.filter((member) => {
75
+ }),
76
+ collectPageItems: (res) => Array.isArray(res.members) ? res.members : []
77
+ })).filter((member) => {
82
78
  const candidates = [
83
79
  member.profile?.display_name || member.profile?.real_name || member.real_name,
84
80
  member.name,
@@ -94,20 +90,15 @@ async function listSlackDirectoryGroupsLive(params) {
94
90
  const client = createSlackDirectoryClient(params);
95
91
  if (!client) return [];
96
92
  const query = normalizeQuery(params.query);
97
- const channels = [];
98
- let cursor;
99
- do {
100
- const res = await client.conversations.list({
93
+ const rows = (await collectSlackCursorPages({
94
+ fetchPage: (cursor) => client.conversations.list({
101
95
  types: "public_channel,private_channel",
102
96
  exclude_archived: false,
103
97
  limit: 1e3,
104
98
  cursor
105
- });
106
- if (Array.isArray(res.channels)) channels.push(...res.channels);
107
- const next = res.response_metadata?.next_cursor?.trim();
108
- cursor = next ? next : void 0;
109
- } while (cursor);
110
- const rows = channels.filter((channel) => {
99
+ }),
100
+ collectPageItems: (res) => Array.isArray(res.channels) ? res.channels : []
101
+ })).filter((channel) => {
111
102
  const name = normalizeOptionalLowercaseString(channel.name);
112
103
  if (!query) return true;
113
104
  return Boolean(name && name.includes(query));
@@ -1,5 +1,5 @@
1
- import { n as resolveSlackNativeStreaming, r as resolveSlackStreamingMode } from "./streaming-compat-3_X-21wW.js";
2
- import { asObjectRecord, defineChannelAliasMigration, defineKeyMoveMigration, hasLegacyAccountStreamingAliases, normalizeChannelConfigEntries } from "openclaw/plugin-sdk/runtime-doctor";
1
+ import { n as resolveSlackStreamingMode, t as resolveSlackNativeStreaming } from "./streaming-compat-B-e0mqM0.js";
2
+ import { asObjectRecord, defineChannelAliasMigration, defineKeyMoveMigration, hasLegacyAccountStreamingAliases, normalizeChannelConfigEntries, stripRetiredChannelKeys } from "openclaw/plugin-sdk/runtime-doctor-migrations";
3
3
  //#region extensions/slack/src/doctor-contract.ts
4
4
  const streamingAliasMigration = defineChannelAliasMigration({
5
5
  channelId: "slack",
@@ -35,6 +35,9 @@ function hasInteractiveRepliesCapability(value) {
35
35
  const capabilitiesRecord = asObjectRecord(capabilities);
36
36
  return Boolean(capabilitiesRecord && (Object.keys(capabilitiesRecord).length === 0 || Object.hasOwn(capabilitiesRecord, "interactiveReplies")));
37
37
  }
38
+ function hasEnterpriseOrgInstall(value) {
39
+ return Object.hasOwn(asObjectRecord(value) ?? {}, "enterpriseOrgInstall");
40
+ }
38
41
  function removeInteractiveRepliesCapability(params) {
39
42
  const capabilities = params.entry.capabilities;
40
43
  let nextCapabilities;
@@ -66,6 +69,23 @@ function removeInteractiveRepliesCapability(params) {
66
69
  }
67
70
  const legacyConfigRules = [
68
71
  ...streamingAliasMigration.legacyConfigRules,
72
+ {
73
+ path: [
74
+ "channels",
75
+ "slack",
76
+ "enterpriseOrgInstall"
77
+ ],
78
+ message: "channels.slack.enterpriseOrgInstall is retired; Slack now detects org-wide installations automatically. Run \"openclaw doctor --fix\"."
79
+ },
80
+ {
81
+ path: [
82
+ "channels",
83
+ "slack",
84
+ "accounts"
85
+ ],
86
+ message: "channels.slack.accounts.<id>.enterpriseOrgInstall is retired; Slack now detects org-wide installations automatically. Run \"openclaw doctor --fix\".",
87
+ match: (value) => hasLegacyAccountStreamingAliases(value, hasEnterpriseOrgInstall)
88
+ },
69
89
  {
70
90
  path: ["channels", "slack"],
71
91
  message: "channels.slack.capabilities.interactiveReplies is retired; use typed presentation actions instead. Run \"openclaw doctor --fix\".",
@@ -144,9 +164,16 @@ function normalizeSlackEntry(params) {
144
164
  }
145
165
  function normalizeCompatibilityConfig({ cfg }) {
146
166
  const changes = [];
167
+ const retired = stripRetiredChannelKeys({
168
+ cfg,
169
+ channelId: "slack",
170
+ keys: /* @__PURE__ */ new Set(["enterpriseOrgInstall"]),
171
+ scope: "root-and-accounts",
172
+ onRemove: ({ key, pathPrefix }) => changes.push(`Removed retired ${pathPrefix}.${key}; Slack detects org-wide installations automatically.`)
173
+ });
147
174
  return normalizeChannelConfigEntries({
148
175
  cfg: streamingAliasMigration.normalizeChannelConfig({
149
- cfg,
176
+ cfg: retired.config,
150
177
  changes
151
178
  }).config,
152
179
  channelId: "slack",
@@ -1,2 +1,2 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-CsGH1Dfc.js";
1
+ import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-BAy7-EUQ.js";
2
2
  export { legacyConfigRules, normalizeCompatibilityConfig };