@openclaw/slack 2026.9.1 → 2026.9.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 (70) hide show
  1. package/dist/{action-runtime-DND4Pyp2.js → action-runtime-DftQWpI4.js} +4 -4
  2. package/dist/action-runtime.runtime-rHI3UAh4.js +2 -0
  3. package/dist/{actions-fh66A6lc.js → actions-CFkvEv1d.js} +3 -3
  4. package/dist/api.js +9 -9
  5. package/dist/{approval-handler.runtime-D7d8sKM0.js → approval-handler.runtime-BeILKdw4.js} +31 -15
  6. package/dist/{channel-4m8IAdMD.js → channel-CmOuxbOD.js} +24 -23
  7. package/dist/channel-config-api.js +1 -1
  8. package/dist/channel-plugin-api.js +1 -1
  9. package/dist/{channel-type-3-SqEMVc.js → channel-type-BWt2CRaI.js} +2 -2
  10. package/dist/{channel.setup-t_ghLGb_.js → channel.setup-D5z1ReaT.js} +8 -3
  11. package/dist/{config-schema-bP3eV2ra.js → config-schema-JDx_f9Zb.js} +2 -2
  12. package/dist/{directory-live-q32AW7N1.js → directory-live-BuBPHmju.js} +1 -1
  13. package/dist/{monitor-Chwu_SiZ.js → monitor-DI07pfJl.js} +3 -3
  14. package/dist/{outbound-adapter-BB8wAjm5.js → outbound-adapter-B5QyTRpJ.js} +3 -2
  15. package/dist/{pipeline.runtime-BklS_NEj.js → pipeline.runtime-BdIwZgm4.js} +567 -733
  16. package/dist/{policy-D7PKkiet.js → policy-Bh5TOqII.js} +2 -2
  17. package/dist/{probe-gj5yQgN2.js → probe-Biy--yhL.js} +42 -10
  18. package/dist/{provider-Do50wMWn.js → provider-DoaUvAM4.js} +5583 -4921
  19. package/dist/{relay-source-DWuduiJ2.js → relay-source-D4uecp68.js} +1 -1
  20. package/dist/{replies-Dc6WVh_Q.js → replies-DENuTcPO.js} +4 -3
  21. package/dist/reply-blocks-PRkhyAN7.js +790 -0
  22. package/dist/{resolve-channels-CU7Bg5Ka.js → resolve-channels-DQGV2VrE.js} +1 -1
  23. package/dist/{resolve-users-DrhttvRQ.js → resolve-users-DRGt_Q4I.js} +1 -1
  24. package/dist/runtime-api.js +10 -10
  25. package/dist/{scopes-B9HRguDe.js → scopes-CZzeGdWV.js} +1 -1
  26. package/dist/{send-Djswy6lf.js → send-DElUcgIs.js} +10 -10
  27. package/dist/{send.runtime-__WVTWLQ.js → send.runtime-C8D6cKGm.js} +1 -1
  28. package/dist/{group-policy-BKjMqT-8.js → session-status-BynwcZSO.js} +169 -799
  29. package/dist/setup-plugin-api.js +1 -1
  30. package/dist/{setup-surface-DO0e-MMS.js → setup-surface-B1_gpGBl.js} +4 -4
  31. package/dist/{shared-DEQBEKBL.js → shared-CNQsWJT7.js} +2 -2
  32. package/dist/{slash-dispatch.runtime-C3B4h5ZM.js → slash-dispatch.runtime-DhsXavSY.js} +1 -1
  33. package/node_modules/typebox/build/format/json_pointer.d.mts +2 -2
  34. package/node_modules/typebox/build/format/json_pointer.mjs +2 -2
  35. package/node_modules/typebox/build/format/json_pointer_uri_fragment.d.mts +2 -2
  36. package/node_modules/typebox/build/format/json_pointer_uri_fragment.mjs +2 -2
  37. package/node_modules/typebox/build/format/relative_json_pointer.d.mts +2 -2
  38. package/node_modules/typebox/build/format/relative_json_pointer.mjs +2 -2
  39. package/node_modules/typebox/build/system/memory/assign.mjs +2 -1
  40. package/node_modules/typebox/build/system/memory/create.mjs +3 -4
  41. package/node_modules/typebox/build/system/memory/discard.mjs +2 -2
  42. package/node_modules/typebox/build/system/memory/freeze.d.mts +4 -0
  43. package/node_modules/typebox/build/system/memory/freeze.mjs +6 -0
  44. package/node_modules/typebox/build/system/memory/update.mjs +3 -2
  45. package/node_modules/typebox/package.json +1 -1
  46. package/node_modules/undici/lib/dispatcher/balanced-pool.js +4 -2
  47. package/node_modules/undici/lib/dispatcher/client-h1.js +12 -4
  48. package/node_modules/undici/lib/dispatcher/client-h2.js +70 -14
  49. package/node_modules/undici/lib/dispatcher/client.js +6 -2
  50. package/node_modules/undici/lib/handler/cache-handler.js +21 -5
  51. package/node_modules/undici/lib/handler/retry-handler.js +42 -7
  52. package/node_modules/undici/lib/interceptor/cache.js +20 -1
  53. package/node_modules/undici/lib/interceptor/decompress.js +146 -14
  54. package/node_modules/undici/lib/interceptor/dump.js +10 -23
  55. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +245 -150
  56. package/node_modules/undici/lib/web/websocket/connection.js +1 -1
  57. package/node_modules/undici/lib/web/websocket/permessage-deflate.js +5 -0
  58. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +8 -10
  59. package/node_modules/undici/package.json +1 -1
  60. package/node_modules/undici/types/interceptors.d.ts +2 -0
  61. package/openclaw.plugin.json +3 -3
  62. package/package.json +6 -6
  63. package/skills/_vendor/slack-skills-plugin.LICENSE +21 -0
  64. package/skills/_vendor/slack-skills-plugin.json +31 -0
  65. package/skills/block-kit/SKILL.md +37 -0
  66. package/skills/block-kit/references/official-block-kit.md +257 -0
  67. package/skills/block-kit/references/official-common-patterns.md +385 -0
  68. package/skills/slack/SKILL.md +1 -1
  69. package/dist/action-runtime.runtime-CEhbmS-Z.js +0 -2
  70. package/dist/conversation-binding-route-Vee8Dgbf.js +0 -115
@@ -117,7 +117,10 @@ function staleResponseRequiresRevalidation (result, cacheType) {
117
117
  * @returns {boolean}
118
118
  */
119
119
  function revalidationResponseDisallowsCachedReuse (cacheType, headers) {
120
- if (headers.vary && isInvalidOrWildcardVaryHeader(headers.vary)) {
120
+ if (
121
+ (headers.vary && isInvalidOrWildcardVaryHeader(headers.vary)) ||
122
+ (cacheType === 'shared' && Object.hasOwn(headers, 'set-cookie'))
123
+ ) {
121
124
  return true
122
125
  }
123
126
 
@@ -376,6 +379,17 @@ function handleResult (
376
379
  return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
377
380
  }
378
381
 
382
+ // Shared stores may outlive the Undici version that wrote them. Do not
383
+ // re-serve a Set-Cookie header from an existing shared-cache entry.
384
+ if (globalOpts.type === 'shared' && Object.hasOwn(result.headers, 'set-cookie')) {
385
+ if (util.isStream(result.body)) {
386
+ result.body.on('error', nop).destroy()
387
+ }
388
+
389
+ deleteCachedValue(globalOpts.store, cacheKey)
390
+ return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl)
391
+ }
392
+
379
393
  const now = Date.now()
380
394
  if (now > result.deleteAt) {
381
395
  // Response is expired, cache store shouldn't have given this to us
@@ -574,6 +588,11 @@ module.exports = (opts = {}) => {
574
588
  * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}
575
589
  */
576
590
  const cacheKey = makeCacheKey(opts)
591
+
592
+ if (!arrayIncludes(util.safeHTTPMethods, opts.method)) {
593
+ return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler))
594
+ }
595
+
577
596
  const result = store.get(cacheKey)
578
597
 
579
598
  if (result && typeof result.then === 'function') {
@@ -1,7 +1,8 @@
1
1
  'use strict'
2
2
 
3
3
  const { createInflate, createGunzip, createBrotliDecompress, createZstdDecompress } = require('node:zlib')
4
- const { pipeline } = require('node:stream')
4
+ const { pipeline, Transform: TransformStream } = require('node:stream')
5
+ const { InvalidArgumentError, ResponseExceededMaxSizeError } = require('../core/errors')
5
6
  const DecoratorHandler = require('../handler/decorator-handler')
6
7
  const { runtimeFeatures } = require('../util/runtime-features')
7
8
 
@@ -21,6 +22,31 @@ const supportedEncodings = {
21
22
  }
22
23
 
23
24
  const defaultSkipStatusCodes = /** @type {const} */ ([204, 304])
25
+ const defaultMaxSize = 64 * 1024 * 1024
26
+
27
+ /**
28
+ * Limits the output of one stage in a decompression chain.
29
+ * @param {number} maxSize - Maximum output size in bytes
30
+ * @returns {Transform}
31
+ */
32
+ function createMaxSizeLimiter (maxSize) {
33
+ let size = 0
34
+
35
+ return new TransformStream({
36
+ transform (chunk, _encoding, callback) {
37
+ const decompressedSize = size + chunk.length
38
+ if (decompressedSize > maxSize) {
39
+ callback(new ResponseExceededMaxSizeError(
40
+ `Decompressed response size (${decompressedSize}) exceeded maxSize (${maxSize})`
41
+ ))
42
+ return
43
+ }
44
+
45
+ size = decompressedSize
46
+ callback(null, chunk)
47
+ }
48
+ })
49
+ }
24
50
 
25
51
  let warningEmitted = /** @type {boolean} */ (false)
26
52
 
@@ -28,20 +54,36 @@ let warningEmitted = /** @type {boolean} */ (false)
28
54
  * @typedef {Object} DecompressHandlerOptions
29
55
  * @property {number[]|Readonly<number[]>} [skipStatusCodes=[204, 304]] - List of status codes to skip decompression for
30
56
  * @property {boolean} [skipErrorResponses] - Whether to skip decompression for error responses (status codes >= 400)
57
+ * @property {number} [maxSize=67108864] - Maximum decompressed response size in bytes
31
58
  */
32
59
 
33
60
  class DecompressHandler extends DecoratorHandler {
34
61
  /** @type {Transform[]} */
35
62
  #decompressors = []
63
+ /** @type {Record<string, string | string[]> | undefined} */
64
+ #trailers
36
65
  /** @type {Readonly<number[]>} */
37
66
  #skipStatusCodes
38
67
  /** @type {boolean} */
39
68
  #skipErrorResponses
69
+ /** @type {number} */
70
+ #maxSize
71
+ /** @type {number} */
72
+ #decompressedSize = 0
73
+ /** @type {boolean} */
74
+ #terminated = false
75
+ /** @type {boolean} */
76
+ #inputEnded = false
77
+
78
+ constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true, maxSize = defaultMaxSize } = {}) {
79
+ if (!Number.isSafeInteger(maxSize) || maxSize < 1) {
80
+ throw new InvalidArgumentError('maxSize must be a positive integer')
81
+ }
40
82
 
41
- constructor (handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true } = {}) {
42
83
  super(handler)
43
84
  this.#skipStatusCodes = skipStatusCodes
44
85
  this.#skipErrorResponses = skipErrorResponses
86
+ this.#maxSize = maxSize
45
87
  }
46
88
 
47
89
  /**
@@ -61,7 +103,7 @@ class DecompressHandler extends DecoratorHandler {
61
103
  * Creates a chain of decompressors for multiple content encodings
62
104
  *
63
105
  * @param {string} encodings - Comma-separated list of content encodings
64
- * @returns {Array<DecompressorStream>} - Array of decompressor streams
106
+ * @returns {Array<Transform>} - Array of decompressor and limiting streams
65
107
  * @throws {Error} - If the number of content-encodings exceeds the maximum allowed
66
108
  */
67
109
  #createDecompressionChain (encodings) {
@@ -89,7 +131,40 @@ class DecompressHandler extends DecoratorHandler {
89
131
  decompressors.push(supportedEncodings[encoding]())
90
132
  }
91
133
 
92
- return decompressors
134
+ if (decompressors.length < 2) {
135
+ return decompressors
136
+ }
137
+
138
+ /** @type {Transform[]} */
139
+ const streams = []
140
+ for (let i = 0; i < decompressors.length; i++) {
141
+ streams.push(decompressors[i])
142
+ if (i < decompressors.length - 1) {
143
+ streams.push(createMaxSizeLimiter(this.#maxSize))
144
+ }
145
+ }
146
+
147
+ return streams
148
+ }
149
+
150
+ /**
151
+ * Stops decompression and reports an error.
152
+ * @param {Controller} controller - The controller to coordinate with
153
+ * @param {Error} error - The decompression error
154
+ * @returns {void}
155
+ */
156
+ #fail (controller, error) {
157
+ if (this.#terminated) {
158
+ return
159
+ }
160
+
161
+ if (this.#inputEnded) {
162
+ // The request is already marked complete once the compressed input ends,
163
+ // so controller.abort() can no longer propagate decoder flush errors.
164
+ this.onResponseError(controller, error)
165
+ } else {
166
+ controller.abort(error)
167
+ }
93
168
  }
94
169
 
95
170
  /**
@@ -100,8 +175,21 @@ class DecompressHandler extends DecoratorHandler {
100
175
  */
101
176
  #setupDecompressorEvents (decompressor, controller) {
102
177
  decompressor.on('readable', () => {
178
+ if (this.#terminated) {
179
+ return
180
+ }
181
+
103
182
  let chunk
104
183
  while ((chunk = decompressor.read()) !== null) {
184
+ const decompressedSize = this.#decompressedSize + chunk.length
185
+ if (decompressedSize > this.#maxSize) {
186
+ this.#fail(controller, new ResponseExceededMaxSizeError(
187
+ `Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`
188
+ ))
189
+ return
190
+ }
191
+
192
+ this.#decompressedSize = decompressedSize
105
193
  const result = super.onResponseData(controller, chunk)
106
194
  if (result === false) {
107
195
  break
@@ -110,7 +198,7 @@ class DecompressHandler extends DecoratorHandler {
110
198
  })
111
199
 
112
200
  decompressor.on('error', (error) => {
113
- super.onResponseError(controller, error)
201
+ this.#fail(controller, error)
114
202
  })
115
203
  }
116
204
 
@@ -124,7 +212,13 @@ class DecompressHandler extends DecoratorHandler {
124
212
  this.#setupDecompressorEvents(decompressor, controller)
125
213
 
126
214
  decompressor.on('end', () => {
127
- super.onResponseEnd(controller, {})
215
+ if (this.#terminated) {
216
+ return
217
+ }
218
+
219
+ this.#terminated = true
220
+ this.#cleanupDecompressors()
221
+ super.onResponseEnd(controller, this.#trailers)
128
222
  })
129
223
  }
130
224
 
@@ -138,11 +232,18 @@ class DecompressHandler extends DecoratorHandler {
138
232
  this.#setupDecompressorEvents(lastDecompressor, controller)
139
233
 
140
234
  pipeline(this.#decompressors, (err) => {
235
+ if (this.#terminated) {
236
+ return
237
+ }
238
+
141
239
  if (err) {
142
- super.onResponseError(controller, err)
240
+ this.#fail(controller, err)
143
241
  return
144
242
  }
145
- super.onResponseEnd(controller, {})
243
+
244
+ this.#terminated = true
245
+ this.#cleanupDecompressors()
246
+ super.onResponseEnd(controller, this.#trailers)
146
247
  })
147
248
  }
148
249
 
@@ -181,6 +282,33 @@ class DecompressHandler extends DecoratorHandler {
181
282
  // Remove compression headers since we're decompressing
182
283
  const { 'content-encoding': _, 'content-length': __, ...newHeaders } = headers
183
284
 
285
+ if (controller?.rawHeaders) {
286
+ const rawHeaders = controller.rawHeaders
287
+
288
+ if (Array.isArray(rawHeaders)) {
289
+ const filteredHeaders = []
290
+ for (let i = 0; i < rawHeaders.length; i += 2) {
291
+ const headerName = rawHeaders[i]
292
+ const name = Buffer.isBuffer(headerName) ? headerName.toString('latin1') : `${headerName}`
293
+ const lowerName = name.toLowerCase()
294
+
295
+ if (lowerName === 'content-encoding' || lowerName === 'content-length') {
296
+ continue
297
+ }
298
+
299
+ filteredHeaders.push(rawHeaders[i], rawHeaders[i + 1])
300
+ }
301
+ rawHeaders.splice(0, rawHeaders.length, ...filteredHeaders)
302
+ } else if (typeof rawHeaders === 'object') {
303
+ for (const name of Object.keys(rawHeaders)) {
304
+ const lowerName = name.toLowerCase()
305
+ if (lowerName === 'content-encoding' || lowerName === 'content-length') {
306
+ delete rawHeaders[name]
307
+ }
308
+ }
309
+ }
310
+ }
311
+
184
312
  if (this.#decompressors.length === 1) {
185
313
  this.#setupSingleDecompressor(controller)
186
314
  } else {
@@ -210,8 +338,9 @@ class DecompressHandler extends DecoratorHandler {
210
338
  */
211
339
  onResponseEnd (controller, trailers) {
212
340
  if (this.#decompressors.length > 0) {
341
+ this.#inputEnded = true
342
+ this.#trailers = trailers
213
343
  this.#decompressors[0].end()
214
- this.#cleanupDecompressors()
215
344
  return
216
345
  }
217
346
  super.onResponseEnd(controller, trailers)
@@ -223,12 +352,15 @@ class DecompressHandler extends DecoratorHandler {
223
352
  * @returns {void}
224
353
  */
225
354
  onResponseError (controller, err) {
226
- if (this.#decompressors.length > 0) {
227
- for (const decompressor of this.#decompressors) {
228
- decompressor.destroy(err)
229
- }
230
- this.#cleanupDecompressors()
355
+ if (this.#terminated) {
356
+ return
357
+ }
358
+
359
+ this.#terminated = true
360
+ for (const decompressor of this.#decompressors) {
361
+ decompressor.destroy()
231
362
  }
363
+ this.#cleanupDecompressors()
232
364
  super.onResponseError(controller, err)
233
365
  }
234
366
  }
@@ -7,7 +7,6 @@ class DumpHandler extends DecoratorHandler {
7
7
  #maxSize = 1024 * 1024
8
8
  #dumped = false
9
9
  #size = 0
10
- #controller = null
11
10
  aborted = false
12
11
  reason = false
13
12
 
@@ -29,7 +28,6 @@ class DumpHandler extends DecoratorHandler {
29
28
 
30
29
  onRequestStart (controller, context) {
31
30
  controller.abort = this.#abort.bind(this)
32
- this.#controller = controller
33
31
 
34
32
  return super.onRequestStart(controller, context)
35
33
  }
@@ -53,43 +51,32 @@ class DumpHandler extends DecoratorHandler {
53
51
  }
54
52
 
55
53
  onResponseError (controller, err) {
56
- if (this.#dumped) {
57
- return
58
- }
59
-
60
- // On network errors before connect, controller will be null
61
- err = this.#controller?.reason ?? err
62
-
63
- super.onResponseError(controller, err)
54
+ super.onResponseError(controller, this.aborted === true ? this.reason : err)
64
55
  }
65
56
 
66
57
  onResponseData (controller, chunk) {
67
58
  this.#size = this.#size + chunk.length
68
59
 
69
- if (this.#size >= this.#maxSize) {
70
- this.#dumped = true
60
+ if (this.#size > this.#maxSize) {
61
+ throw new RequestAbortedError(
62
+ `Response size (${this.#size}) larger than maxSize (${this.#maxSize})`
63
+ )
64
+ }
71
65
 
72
- if (this.aborted === true) {
73
- super.onResponseError(controller, this.reason)
74
- } else {
75
- super.onResponseEnd(controller, {})
76
- }
66
+ if (this.#size === this.#maxSize) {
67
+ this.#dumped = true
77
68
  }
78
69
 
79
70
  return true
80
71
  }
81
72
 
82
73
  onResponseEnd (controller, trailers) {
83
- if (this.#dumped) {
84
- return
85
- }
86
-
87
- if (this.#controller.aborted === true) {
74
+ if (this.aborted === true) {
88
75
  super.onResponseError(controller, this.reason)
89
76
  return
90
77
  }
91
78
 
92
- super.onResponseEnd(controller, trailers)
79
+ super.onResponseEnd(controller, this.#dumped ? {} : trailers)
93
80
  }
94
81
  }
95
82