@openclaw/slack 2026.7.1 → 2026.7.2-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 (69) hide show
  1. package/dist/accounts.runtime-KvftRRek.js +2 -0
  2. package/dist/{action-runtime-DoQGk_8D.js → action-runtime-p6M2ULpv.js} +205 -29
  3. package/dist/action-runtime.runtime-DQstDkHG.js +2 -0
  4. package/dist/{actions-DMpDmKEA.js → actions-DkTcWmpT.js} +87 -138
  5. package/dist/{actions.runtime-C103_BPW.js → actions.runtime-BSxpwgUc.js} +1 -1
  6. package/dist/api.js +14 -13
  7. package/dist/{approval-handler.runtime-CIUbOt5T.js → approval-handler.runtime-UGbnz9OC.js} +3 -3
  8. package/dist/{channel-BjlsaGHn.js → channel-B0_j6C6z.js} +116 -140
  9. package/dist/channel-config-api.js +1 -1
  10. package/dist/channel-plugin-api.js +1 -1
  11. package/dist/channel-type-BpeTezY4.js +109 -0
  12. package/dist/{channel.setup-Dq6syTNU.js → channel.setup-BQFut21T.js} +2 -2
  13. package/dist/{client-DGxwSL7f.js → client-D2F6m8CP.js} +38 -2
  14. package/dist/config-api-Df9a1B8C.js +3 -0
  15. package/dist/{config-schema-BzqzFW__.js → config-schema-DYI01PV2.js} +20 -37
  16. package/dist/cursor-pages-DSmTg0su.js +13 -0
  17. package/dist/{directory-config-BZuS8141.js → directory-config-DRkFujwG.js} +2 -2
  18. package/dist/directory-contract-api.js +1 -1
  19. package/dist/{directory-live-BNsxCgqP.js → directory-live-DX7yFsM-.js} +2 -2
  20. package/dist/{doctor-contract-XL6HeNCb.js → doctor-contract-DddfkMlF.js} +25 -38
  21. package/dist/doctor-contract-api.js +1 -1
  22. package/dist/group-policy-C-b2ZnSl.js +2332 -0
  23. package/dist/{interactive-replies-CXpT-vA_.js → interactive-replies-BilWUdcI.js} +5 -1
  24. package/dist/interactive-replies-api.js +1 -1
  25. package/dist/{message-tool-api-BgWKyu2r.js → message-tool-api-CA9jZrCY.js} +1 -1
  26. package/dist/message-tool-api.js +1 -1
  27. package/dist/{monitor-Ux-wzUWI.js → monitor-BN_uuvrQ.js} +3 -3
  28. package/dist/outbound-adapter-ECl0go7d.js +228 -0
  29. package/dist/{pipeline.runtime-rpVpay59.js → pipeline.runtime-f0eJJoJL.js} +492 -178
  30. package/dist/{policy-Dj-puVPb.js → policy-f8b0edSi.js} +1 -1
  31. package/dist/preflight-audio.runtime-D5Bgags0.js +3 -0
  32. package/dist/{probe-CuwRDE5j.js → probe-CfALk0l4.js} +2 -2
  33. package/dist/{provider-C1-DFSpw.js → provider-Ds-y-imP.js} +658 -192
  34. package/dist/{relay-source-D2jv1iGg.js → relay-source-B-6LFUdz.js} +6 -17
  35. package/dist/replies-BMvf3ihj.js +420 -0
  36. package/dist/{resolve-channels-CstkChBE.js → resolve-channels-DOMgNCWb.js} +17 -6
  37. package/dist/{resolve-users-C3NP2c-Q.js → resolve-users-aL6-Ssee.js} +11 -6
  38. package/dist/{runtime-BOk7xkOl.js → runtime-CauEvswP.js} +1 -1
  39. package/dist/{runtime-api-CEmqYxR-.js → runtime-api-CVb6CQjX.js} +3 -3
  40. package/dist/runtime-api.js +11 -11
  41. package/dist/runtime-setter-api.js +1 -1
  42. package/dist/{scopes-DCWVD5-8.js → scopes-Dw8wbU0j.js} +2 -2
  43. package/dist/{secret-contract-C3ChHo5A.js → secret-contract-CMohXFWS.js} +18 -113
  44. package/dist/secret-contract-api.js +1 -1
  45. package/dist/{send-DKDXoeoV.js → send-NEfJ0GvM.js} +662 -325
  46. package/dist/{send.runtime-GPRa63l1.js → send.runtime-BkKpitPu.js} +1 -1
  47. package/dist/setup-plugin-api.js +1 -1
  48. package/dist/{setup-surface-Dv2fIJNB.js → setup-surface-BN2WeG5c.js} +3 -3
  49. package/dist/{shared-CosfcFri.js → shared-BLnB9R1T.js} +7 -5
  50. package/dist/{slash-dispatch.runtime-CcMbbT3_.js → slash-dispatch.runtime-C0Otuf_T.js} +1 -1
  51. package/dist/{streaming-compat-DjlgH-Be.js → streaming-compat-3_X-21wW.js} +1 -0
  52. package/dist/{target-parsing-3jYH8LfB.js → target-parsing-N6lHogYZ.js} +16 -3
  53. package/dist/{targets-Dll4NJgs.js → targets-KmjP2E8s.js} +1 -1
  54. package/node_modules/p-map/index.d.ts +155 -0
  55. package/node_modules/p-map/index.js +284 -0
  56. package/node_modules/p-map/license +9 -0
  57. package/node_modules/p-map/package.json +57 -0
  58. package/node_modules/p-map/readme.md +190 -0
  59. package/npm-shrinkwrap.json +16 -3
  60. package/openclaw.plugin.json +16 -0
  61. package/package.json +6 -4
  62. package/dist/accounts.runtime-DWvaCb-X.js +0 -2
  63. package/dist/action-runtime.runtime-BABj3aM-.js +0 -2
  64. package/dist/config-api-DnT9ohtE.js +0 -2
  65. package/dist/format-YCNoNkM2.js +0 -107
  66. package/dist/outbound-adapter-DVoBfBW5.js +0 -272
  67. package/dist/replies-DpF38e1y.js +0 -287
  68. package/dist/reply-blocks-BGQ6zSqM.js +0 -877
  69. package/dist/resolve-allowlist-common-CP8SH0Zf.js +0 -43
@@ -78,8 +78,11 @@ function buildSelectBlock(raw) {
78
78
  const parts = normalizeStringEntries(raw.split("|"));
79
79
  if (parts.length === 0) return null;
80
80
  const [first, second] = parts;
81
+ if (!first || parts.length >= 2 && !second) return null;
81
82
  const placeholder = parts.length >= 2 ? first : "Choose an option";
82
- const choices = parseChoices(parts.length >= 2 ? second : first, SLACK_SELECT_MAX_ITEMS);
83
+ const choicesText = parts.length >= 2 ? second : first;
84
+ if (!choicesText) return null;
85
+ const choices = parseChoices(choicesText, SLACK_SELECT_MAX_ITEMS);
83
86
  if (choices.length === 0) return null;
84
87
  return {
85
88
  type: "select",
@@ -134,6 +137,7 @@ function compileSlackInteractiveReplies(payload) {
134
137
  const matchText = match[0];
135
138
  const directiveType = match[1];
136
139
  const body = match[2];
140
+ if (!directiveType || !body) continue;
137
141
  const index = match.index ?? 0;
138
142
  const precedingText = text.slice(cursor, index);
139
143
  visibleTextParts.push(precedingText);
@@ -1,2 +1,2 @@
1
- import { n as isSlackInteractiveRepliesEnabled, t as compileSlackInteractiveReplies } from "./interactive-replies-CXpT-vA_.js";
1
+ import { n as isSlackInteractiveRepliesEnabled, t as compileSlackInteractiveReplies } from "./interactive-replies-BilWUdcI.js";
2
2
  export { compileSlackInteractiveReplies, isSlackInteractiveRepliesEnabled };
@@ -1,6 +1,6 @@
1
1
  import { a as resolveSlackAccount, t as listEnabledSlackAccounts } from "./accounts-BOJJiHSr.js";
2
2
  import { n as resolveSlackThreadTsValue, t as normalizeSlackThreadTsCandidate } from "./thread-ts-DUGhaYKq.js";
3
- import { n as isSlackInteractiveRepliesEnabled } from "./interactive-replies-CXpT-vA_.js";
3
+ import { n as isSlackInteractiveRepliesEnabled } from "./interactive-replies-BilWUdcI.js";
4
4
  import { createActionGate } from "openclaw/plugin-sdk/channel-actions";
5
5
  import { extractToolSend } from "openclaw/plugin-sdk/tool-send";
6
6
  import { Type } from "typebox";
@@ -1,2 +1,2 @@
1
- import { t as describeSlackMessageTool } from "./message-tool-api-BgWKyu2r.js";
1
+ import { t as describeSlackMessageTool } from "./message-tool-api-CA9jZrCY.js";
2
2
  export { describeSlackMessageTool as describeMessageTool };
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { S as buildSlackSlashCommandMatcher, t as monitorSlackProvider } from "./provider-C1-DFSpw.js";
3
- import { t as isSlackChannelAllowedByPolicy } from "./policy-Dj-puVPb.js";
4
- import { o as resolveSlackThreadTs } from "./replies-DpF38e1y.js";
2
+ import { C as buildSlackSlashCommandMatcher, t as monitorSlackProvider } from "./provider-Ds-y-imP.js";
3
+ import { t as isSlackChannelAllowedByPolicy } from "./policy-f8b0edSi.js";
4
+ import { o as resolveSlackThreadTs } from "./replies-BMvf3ihj.js";
5
5
  //#region extensions/slack/src/monitor.ts
6
6
  var monitor_exports = /* @__PURE__ */ __exportAll({
7
7
  buildSlackSlashCommandMatcher: () => buildSlackSlashCommandMatcher,
@@ -0,0 +1,228 @@
1
+ import { F as SLACK_TEXT_LIMIT, J as SLACK_PRESENTATION_CAPABILITIES, M as resolveSlackAuthoredTextPlacement, g as resolveSlackReplyDeliveryMessages, m as resolveSlackReplyBlockResolution, p as parseSlackReplyBlockSegments } from "./group-policy-C-b2ZnSl.js";
2
+ import { n as resolveSlackThreadTsValue } from "./thread-ts-DUGhaYKq.js";
3
+ import { n as isSlackInteractiveRepliesEnabled, t as compileSlackInteractiveReplies } from "./interactive-replies-BilWUdcI.js";
4
+ import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
+ import { resolveOutboundSendDep } from "openclaw/plugin-sdk/channel-outbound";
6
+ import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
7
+ import { normalizeMessagePresentation, resolveInteractiveTextFallback } from "openclaw/plugin-sdk/interactive-runtime";
8
+ import { resolvePayloadMediaUrls, sendPayloadMediaSequenceAndFinalize, sendTextMediaPayload } from "openclaw/plugin-sdk/reply-payload";
9
+ import { attachChannelToResult, createAttachedChannelResultAdapter } from "openclaw/plugin-sdk/channel-send-result";
10
+ //#region extensions/slack/src/outbound-adapter.ts
11
+ const SLACK_RENDERED_PRESENTATION_PROVENANCE = Object.freeze({});
12
+ const loadSlackSendRuntime = createLazyRuntimeModule(() => import("./send.runtime-BkKpitPu.js"));
13
+ function resolveSlackSendIdentity(identity) {
14
+ if (!identity) return;
15
+ const username = normalizeOptionalString(identity.name);
16
+ const iconUrl = normalizeOptionalString(identity.avatarUrl);
17
+ const rawEmoji = normalizeOptionalString(identity.emoji);
18
+ const iconEmoji = !iconUrl ? rawEmoji : void 0;
19
+ if (!username && !iconUrl && !iconEmoji) return;
20
+ return {
21
+ username,
22
+ iconUrl,
23
+ iconEmoji
24
+ };
25
+ }
26
+ function resolveSlackOutboundBlockResolution(payload) {
27
+ const slackData = payload.channelData?.slack;
28
+ const presentation = normalizeMessagePresentation(payload.presentation);
29
+ if (!Boolean(slackData?.blocks !== void 0 || presentation || payload.interactive?.blocks.length)) return {
30
+ authoredTextPlacement: resolveSlackAuthoredTextPlacement(payload),
31
+ segments: []
32
+ };
33
+ const { authoredTextPlacement: _authoredTextPlacement, renderedPresentationProvenance: _renderedPresentationProvenance, renderedPresentationSegments: _renderedPresentationSegments, ...preservedSlackData } = slackData ?? {};
34
+ return resolveSlackReplyBlockResolution({
35
+ ...payload,
36
+ channelData: {
37
+ ...payload.channelData,
38
+ slack: preservedSlackData
39
+ }
40
+ }, { materializeAuthoredText: true });
41
+ }
42
+ function withSlackRenderedPresentation(payload, slackData, resolution) {
43
+ const { authoredTextPlacement: _authoredTextPlacement, blocks: _blocks, renderedPresentationProvenance: _renderedPresentationProvenance, renderedPresentationSegments: _renderedPresentationSegments, ...preservedSlackData } = slackData ?? {};
44
+ return {
45
+ ...payload,
46
+ channelData: {
47
+ ...payload.channelData,
48
+ slack: {
49
+ ...preservedSlackData,
50
+ authoredTextPlacement: resolution.authoredTextPlacement,
51
+ renderedPresentationProvenance: SLACK_RENDERED_PRESENTATION_PROVENANCE,
52
+ renderedPresentationSegments: resolution.segments
53
+ }
54
+ }
55
+ };
56
+ }
57
+ function readSlackAuthoredTextPlacement(value) {
58
+ return value === "none" || value === "blocks" || value === "outside-blocks" ? value : void 0;
59
+ }
60
+ async function sendSlackOutboundMessage(params) {
61
+ const send = resolveOutboundSendDep(params.deps, "slack") ?? (await loadSlackSendRuntime()).sendMessageSlack;
62
+ const slackIdentity = resolveSlackSendIdentity(params.identity);
63
+ const threadTs = resolveSlackThreadTsValue({
64
+ replyToId: params.replyToId,
65
+ threadId: params.threadId
66
+ });
67
+ const sendOptions = {
68
+ cfg: params.cfg,
69
+ threadTs,
70
+ accountId: params.accountId ?? void 0,
71
+ ...params.mediaUrl ? {
72
+ mediaUrl: params.mediaUrl,
73
+ mediaAccess: params.mediaAccess,
74
+ mediaLocalRoots: params.mediaLocalRoots,
75
+ mediaReadFile: params.mediaReadFile
76
+ } : {},
77
+ ...params.blocks ? { blocks: params.blocks } : {},
78
+ ...params.authoredTextPlacement ? { authoredTextPlacement: params.authoredTextPlacement } : {},
79
+ ...Object.hasOwn(params, "nativeDataFallbackBaseText") ? { nativeDataFallbackBaseText: params.nativeDataFallbackBaseText } : {},
80
+ ...params.textIsSlackPlainText ? { textIsSlackPlainText: true } : {},
81
+ ...slackIdentity ? { identity: slackIdentity } : {},
82
+ ...params.deliveryQueueId ? { deliveryQueueId: params.deliveryQueueId } : {},
83
+ ...params.onPlatformSendDispatch ? { onPlatformSendDispatch: params.onPlatformSendDispatch } : {},
84
+ ...params.onDeliveryResult ? { onDeliveryResult: async (progress) => {
85
+ await params.onDeliveryResult?.(attachChannelToResult("slack", progress));
86
+ } } : {}
87
+ };
88
+ return await send(params.to, params.text, sendOptions);
89
+ }
90
+ function createSlackAttachedSendAdapter() {
91
+ return createAttachedChannelResultAdapter({
92
+ channel: "slack",
93
+ sendText: async ({ cfg, to, text, accountId, deps, replyToId, threadId, identity, deliveryQueueId, onPlatformSendDispatch, onDeliveryResult }) => await sendSlackOutboundMessage({
94
+ cfg,
95
+ to,
96
+ text,
97
+ accountId,
98
+ deps,
99
+ replyToId,
100
+ threadId,
101
+ identity,
102
+ deliveryQueueId,
103
+ onPlatformSendDispatch,
104
+ onDeliveryResult
105
+ }),
106
+ sendMedia: async ({ cfg, to, text, mediaUrl, mediaAccess, mediaLocalRoots, mediaReadFile, accountId, deps, replyToId, threadId, identity, deliveryQueueId, onPlatformSendDispatch, onDeliveryResult }) => await sendSlackOutboundMessage({
107
+ cfg,
108
+ to,
109
+ text,
110
+ mediaUrl,
111
+ mediaAccess,
112
+ mediaLocalRoots,
113
+ mediaReadFile,
114
+ accountId,
115
+ deps,
116
+ replyToId,
117
+ threadId,
118
+ identity,
119
+ deliveryQueueId,
120
+ onPlatformSendDispatch,
121
+ onDeliveryResult
122
+ })
123
+ });
124
+ }
125
+ const slackOutbound = {
126
+ deliveryMode: "direct",
127
+ chunker: null,
128
+ textChunkLimit: SLACK_TEXT_LIMIT,
129
+ normalizePayload: ({ payload, cfg, accountId }) => isSlackInteractiveRepliesEnabled({
130
+ cfg,
131
+ accountId
132
+ }) ? compileSlackInteractiveReplies(payload) : payload,
133
+ presentationCapabilities: SLACK_PRESENTATION_CAPABILITIES,
134
+ renderPresentation: ({ payload, ctx }) => {
135
+ const payloadForBudget = isSlackInteractiveRepliesEnabled({
136
+ cfg: ctx.cfg,
137
+ accountId: ctx.accountId
138
+ }) ? compileSlackInteractiveReplies(payload) : payload;
139
+ const slackData = payload.channelData?.slack;
140
+ const resolution = resolveSlackOutboundBlockResolution(payloadForBudget);
141
+ return resolution.segments.length > 0 ? withSlackRenderedPresentation(payloadForBudget, slackData, resolution) : null;
142
+ },
143
+ sendPayload: async (ctx) => {
144
+ const payload = {
145
+ ...ctx.payload,
146
+ text: resolveInteractiveTextFallback({
147
+ text: ctx.payload.text,
148
+ interactive: ctx.payload.interactive
149
+ }) ?? ""
150
+ };
151
+ const slackData = payload.channelData?.slack;
152
+ const hasRenderedPresentationProvenance = slackData?.renderedPresentationProvenance === SLACK_RENDERED_PRESENTATION_PROVENANCE;
153
+ const renderedSegments = hasRenderedPresentationProvenance ? parseSlackReplyBlockSegments(slackData?.renderedPresentationSegments) : void 0;
154
+ const renderedPlacement = hasRenderedPresentationProvenance ? readSlackAuthoredTextPlacement(slackData?.authoredTextPlacement) : void 0;
155
+ let resolution;
156
+ if (renderedSegments) {
157
+ if (!renderedPlacement) throw new Error("Slack rendered presentation is missing authored text placement");
158
+ resolution = {
159
+ authoredTextPlacement: renderedPlacement,
160
+ segments: renderedSegments
161
+ };
162
+ } else resolution = resolveSlackOutboundBlockResolution(payload);
163
+ if (resolution.segments.length === 0) return await sendTextMediaPayload({
164
+ channel: "slack",
165
+ ctx: {
166
+ ...ctx,
167
+ payload
168
+ },
169
+ adapter: slackOutbound
170
+ });
171
+ const mediaUrls = resolvePayloadMediaUrls(payload);
172
+ const deliveryMessages = resolveSlackReplyDeliveryMessages({
173
+ authoredTextPlacement: resolution.authoredTextPlacement,
174
+ segments: resolution.segments,
175
+ text: payload.text
176
+ });
177
+ const useSingleDeliveryMarker = mediaUrls.length === 0 && deliveryMessages.length === 1;
178
+ return attachChannelToResult("slack", await sendPayloadMediaSequenceAndFinalize({
179
+ text: "",
180
+ mediaUrls,
181
+ send: async ({ text, mediaUrl }) => await sendSlackOutboundMessage({
182
+ cfg: ctx.cfg,
183
+ to: ctx.to,
184
+ text,
185
+ mediaUrl,
186
+ mediaAccess: ctx.mediaAccess,
187
+ mediaLocalRoots: ctx.mediaLocalRoots,
188
+ mediaReadFile: ctx.mediaReadFile,
189
+ accountId: ctx.accountId,
190
+ deps: ctx.deps,
191
+ replyToId: ctx.replyToId,
192
+ threadId: ctx.threadId,
193
+ identity: ctx.identity,
194
+ deliveryQueueId: useSingleDeliveryMarker ? ctx.deliveryQueueId : void 0,
195
+ onPlatformSendDispatch: useSingleDeliveryMarker ? ctx.onPlatformSendDispatch : void 0,
196
+ onDeliveryResult: ctx.onDeliveryResult
197
+ }),
198
+ finalize: async () => {
199
+ let lastResult;
200
+ for (const message of deliveryMessages) lastResult = await sendSlackOutboundMessage({
201
+ cfg: ctx.cfg,
202
+ to: ctx.to,
203
+ text: message.text,
204
+ mediaAccess: ctx.mediaAccess,
205
+ mediaLocalRoots: ctx.mediaLocalRoots,
206
+ mediaReadFile: ctx.mediaReadFile,
207
+ ...message.blocks ? { blocks: message.blocks } : {},
208
+ ...message.authoredTextPlacement ? { authoredTextPlacement: message.authoredTextPlacement } : {},
209
+ ...message.nativeDataFallbackBaseText ? { nativeDataFallbackBaseText: message.nativeDataFallbackBaseText } : {},
210
+ ...message.textIsSlackPlainText ? { textIsSlackPlainText: true } : {},
211
+ accountId: ctx.accountId,
212
+ deps: ctx.deps,
213
+ replyToId: ctx.replyToId,
214
+ threadId: ctx.threadId,
215
+ identity: ctx.identity,
216
+ deliveryQueueId: useSingleDeliveryMarker ? ctx.deliveryQueueId : void 0,
217
+ onPlatformSendDispatch: useSingleDeliveryMarker ? ctx.onPlatformSendDispatch : void 0,
218
+ onDeliveryResult: ctx.onDeliveryResult
219
+ });
220
+ if (!lastResult) throw new Error("Slack rendered presentation produced no deliverable segment");
221
+ return lastResult;
222
+ }
223
+ }));
224
+ },
225
+ ...createSlackAttachedSendAdapter()
226
+ };
227
+ //#endregion
228
+ export { slackOutbound };