@openclaw/slack 2026.9.6 → 2026.9.7

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 (291) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/.setup/{account-inspect-DP1Bcwj4.mjs → account-inspect-DWBXpER6.mjs} +1 -1
  3. package/dist/.setup/{accounts-BBHvg0pY.mjs → accounts-D_N9IqNA.mjs} +23 -1
  4. package/dist/.setup/{action-runtime-B01d85zt.mjs → action-runtime-DfWvuiZd.mjs} +26 -41
  5. package/dist/.setup/action-runtime.runtime-Ck4bAWOX.mjs +2 -0
  6. package/dist/.setup/{actions-DKCtBgCI.mjs → actions-Df0CzcDl.mjs} +88 -175
  7. package/dist/.setup/{approval-handler.runtime-DMszKn_7.mjs → approval-handler.runtime-Ed6Sw5VK.mjs} +37 -47
  8. package/dist/.setup/{approval-message-updates-Tb_qRokK.mjs → approval-message-updates-BadvtA7R.mjs} +1 -2
  9. package/dist/.setup/{channel-CErYZ5zw.mjs → channel-C7bgPSTE.mjs} +181 -273
  10. package/dist/.setup/channel-meta-C443t-lI.mjs +27 -0
  11. package/dist/.setup/{channel-type-Dxk8VJUb.mjs → channel-type-ClOttrZ5.mjs} +13 -21
  12. package/dist/.setup/{channel.setup-BVoUtdPn.mjs → channel.setup-Dh2jzAjN.mjs} +35 -42
  13. package/dist/.setup/{config-schema-CyL279e7.mjs → config-schema-BZCxmHKG.mjs} +24 -21
  14. package/dist/.setup/{directory-config-CQTSH45W.mjs → directory-config-BOUWH3hR.mjs} +7 -10
  15. package/dist/.setup/{directory-live-BCcj89QV.mjs → directory-live-B2O4B_Ho.mjs} +9 -21
  16. package/dist/.setup/doctor-contract-CRN1Z_c7.mjs +342 -0
  17. package/dist/.setup/{message-tool-api-C0PTFaNV.mjs → message-tool-api-Cu4lwlGy.mjs} +34 -48
  18. package/dist/.setup/{provider-C-jPaGt2.mjs → monitor-BPVfkumU.mjs} +2181 -2693
  19. package/dist/.setup/{outbound-adapter-A7Wdn8ZT.mjs → outbound-adapter-Bv48XUjq.mjs} +10 -21
  20. package/dist/.setup/{pipeline.runtime-BlPOexmJ.mjs → pipeline.runtime-B1H63Frf.mjs} +311 -457
  21. package/dist/.setup/{plugin-routes-C3X0eVaK.mjs → plugin-routes-B8tooDLj.mjs} +1 -1
  22. package/dist/.setup/{policy-BApW53pI.mjs → policy-D-jfM174.mjs} +5 -5
  23. package/dist/.setup/{probe-DiYIMPJo.mjs → probe-B2Y9qc_z.mjs} +101 -39
  24. package/dist/.setup/{registry-bbjH7IHX.mjs → registry-CIbMfuf8.mjs} +6 -2
  25. package/dist/.setup/{relay-source-DfOnjJTE.mjs → relay-source-BpKdjsll.mjs} +10 -12
  26. package/dist/.setup/{replies-BBAJxUOQ.mjs → replies-BAnUtr2f.mjs} +16 -76
  27. package/dist/.setup/{reply-blocks-Bm8kf6mK.mjs → reply-blocks-SE1kTE3I.mjs} +27 -154
  28. package/dist/.setup/{resolve-channels-BXbMBbJD.mjs → resolve-channels-XXBn8UU_.mjs} +4 -5
  29. package/dist/.setup/{resolve-users-65WqvIqD.mjs → resolve-users-DW0ngD03.mjs} +20 -22
  30. package/dist/.setup/{scopes-h3YB-mMs.mjs → scopes-CasuDvaa.mjs} +6 -17
  31. package/dist/.setup/{secret-contract-DxmvbxBF.mjs → secret-contract-BaZcu6P_.mjs} +15 -20
  32. package/dist/.setup/{secret-contract-api-D9UfYujm.mjs → secret-contract-api-Dp6290Vg.mjs} +1 -1
  33. package/dist/.setup/{security-audit-BypHqcq5.mjs → security-audit-BqDc-6VL.mjs} +1 -1
  34. package/dist/.setup/{send-Cp6omkOg.mjs → send-BOVLQi3n.mjs} +84 -171
  35. package/dist/.setup/{session-status-Cf7AvWOt.mjs → session-status-DscajIsd.mjs} +315 -238
  36. package/dist/.setup/{setup-plugin-api-dLPkL06L.mjs → setup-plugin-api-DTtbTKNk.mjs} +1 -1
  37. package/dist/.setup/{setup-surface-D3DLcCxu.mjs → setup-surface-Dn7QgWRE.mjs} +24 -56
  38. package/dist/.setup/{shared-CJ3arAFL.mjs → shared-qau-uDGl.mjs} +30 -56
  39. package/dist/.setup/{slash-dispatch.runtime-HFy_XvyO.mjs → slash-dispatch.runtime--AEzLVBF.mjs} +1 -1
  40. package/dist/.setup/{streaming-compat-B-e0mqM0.mjs → streaming-compat-C5Wut626.mjs} +31 -8
  41. package/dist/.setup/{target-parsing-DEsPjngB.mjs → target-parsing-FFE26kOV.mjs} +1 -7
  42. package/dist/.setup/{targets-Cku2KCvg.mjs → targets-C6LZQL1Q.mjs} +1 -1
  43. package/dist/.setup/{thread-ts-CukseRVL.mjs → thread-ts-Cvt7WD6B.mjs} +0 -1
  44. package/dist/account-inspect-api.js +1 -1
  45. package/dist/api.js +18 -17
  46. package/dist/channel-config-api.js +1 -1
  47. package/dist/channel-plugin-api.js +1 -1
  48. package/dist/directory-contract-api.js +1 -1
  49. package/dist/doctor-contract-api.js +1 -1
  50. package/dist/http-routes-api.js +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/message-tool-api.js +1 -1
  53. package/dist/runtime-api.js +11 -12
  54. package/dist/secret-contract-api.js +1 -1
  55. package/dist/security-contract-api.js +1 -1
  56. package/dist/setup-entry.js +2 -2
  57. package/dist/setup-plugin-api.js +1 -1
  58. package/node_modules/@slack/bolt/node_modules/@types/node/README.md +1 -1
  59. package/node_modules/@slack/bolt/node_modules/@types/node/child_process.d.ts +1 -1
  60. package/node_modules/@slack/bolt/node_modules/@types/node/crypto.d.ts +20 -8
  61. package/node_modules/@slack/bolt/node_modules/@types/node/ffi.d.ts +14 -0
  62. package/node_modules/@slack/bolt/node_modules/@types/node/http2.d.ts +3 -2
  63. package/node_modules/@slack/bolt/node_modules/@types/node/net.d.ts +16 -4
  64. package/node_modules/@slack/bolt/node_modules/@types/node/package.json +2 -2
  65. package/node_modules/@slack/bolt/node_modules/@types/node/process.d.ts +1 -0
  66. package/node_modules/@slack/bolt/node_modules/@types/node/quic.d.ts +39 -1
  67. package/node_modules/@slack/bolt/node_modules/@types/node/stream/iter.d.ts +9 -12
  68. package/node_modules/@slack/bolt/node_modules/@types/node/test/reporters.d.ts +1 -0
  69. package/node_modules/@slack/bolt/node_modules/@types/node/test.d.ts +72 -0
  70. package/node_modules/@slack/bolt/node_modules/@types/node/tls.d.ts +14 -10
  71. package/node_modules/@slack/bolt/node_modules/@types/node/vm.d.ts +2 -1
  72. package/node_modules/@slack/bolt/node_modules/@types/node/worker_threads.d.ts +4 -1
  73. package/node_modules/@slack/web-api/node_modules/@types/node/README.md +1 -1
  74. package/node_modules/@slack/web-api/node_modules/@types/node/child_process.d.ts +1 -1
  75. package/node_modules/@slack/web-api/node_modules/@types/node/crypto.d.ts +20 -8
  76. package/node_modules/@slack/web-api/node_modules/@types/node/ffi.d.ts +14 -0
  77. package/node_modules/@slack/web-api/node_modules/@types/node/http2.d.ts +3 -2
  78. package/node_modules/@slack/web-api/node_modules/@types/node/net.d.ts +16 -4
  79. package/node_modules/@slack/web-api/node_modules/@types/node/package.json +2 -2
  80. package/node_modules/@slack/web-api/node_modules/@types/node/process.d.ts +1 -0
  81. package/node_modules/@slack/web-api/node_modules/@types/node/quic.d.ts +39 -1
  82. package/node_modules/@slack/web-api/node_modules/@types/node/stream/iter.d.ts +9 -12
  83. package/node_modules/@slack/web-api/node_modules/@types/node/test/reporters.d.ts +1 -0
  84. package/node_modules/@slack/web-api/node_modules/@types/node/test.d.ts +72 -0
  85. package/node_modules/@slack/web-api/node_modules/@types/node/tls.d.ts +14 -10
  86. package/node_modules/@slack/web-api/node_modules/@types/node/vm.d.ts +2 -1
  87. package/node_modules/@slack/web-api/node_modules/@types/node/worker_threads.d.ts +4 -1
  88. package/node_modules/get-east-asian-width/index.js +8 -3
  89. package/node_modules/get-east-asian-width/lookup-data.js +1 -1
  90. package/node_modules/get-east-asian-width/lookup.js +4 -4
  91. package/node_modules/get-east-asian-width/package.json +1 -1
  92. package/node_modules/typebox/build/compile/code.mjs +1 -2
  93. package/node_modules/typebox/build/compile/validator.mjs +5 -1
  94. package/node_modules/typebox/build/format/iri.mjs +16 -9
  95. package/node_modules/typebox/build/guard/emit.mjs +2 -2
  96. package/node_modules/typebox/build/guard/guard.d.mts +7 -5
  97. package/node_modules/typebox/build/guard/guard.mjs +14 -9
  98. package/node_modules/typebox/build/guard/index.mjs +6 -0
  99. package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
  100. package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
  101. package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
  102. package/node_modules/typebox/build/schema/build.mjs +2 -3
  103. package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
  104. package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
  105. package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
  106. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
  107. package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
  108. package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
  109. package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
  110. package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
  111. package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
  112. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
  113. package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
  114. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
  115. package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
  116. package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
  117. package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
  118. package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
  119. package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
  120. package/node_modules/typebox/build/schema/parse.mjs +3 -0
  121. package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
  122. package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
  123. package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
  124. package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
  125. package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
  126. package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
  127. package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
  128. package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
  129. package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
  130. package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
  131. package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
  132. package/node_modules/typebox/package.json +1 -1
  133. package/node_modules/typebox/readme.md +3 -1
  134. package/node_modules/undici/README.md +81 -25
  135. package/node_modules/undici/docs/docs/api/Agent.md +249 -42
  136. package/node_modules/undici/docs/docs/api/BalancedPool.md +246 -48
  137. package/node_modules/undici/docs/docs/api/CacheStorage.md +171 -13
  138. package/node_modules/undici/docs/docs/api/CacheStore.md +294 -98
  139. package/node_modules/undici/docs/docs/api/Client.md +407 -162
  140. package/node_modules/undici/docs/docs/api/ClientStats.md +80 -14
  141. package/node_modules/undici/docs/docs/api/Connector.md +118 -35
  142. package/node_modules/undici/docs/docs/api/ContentType.md +65 -25
  143. package/node_modules/undici/docs/docs/api/Cookies.md +122 -71
  144. package/node_modules/undici/docs/docs/api/Debug.md +34 -18
  145. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +364 -164
  146. package/node_modules/undici/docs/docs/api/Dispatcher.md +490 -1055
  147. package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +105 -93
  148. package/node_modules/undici/docs/docs/api/Errors.md +503 -28
  149. package/node_modules/undici/docs/docs/api/EventSource.md +326 -13
  150. package/node_modules/undici/docs/docs/api/Fetch.md +681 -30
  151. package/node_modules/undici/docs/docs/api/GlobalInstallation.md +78 -96
  152. package/node_modules/undici/docs/docs/api/H2CClient.md +298 -176
  153. package/node_modules/undici/docs/docs/api/Interceptors.md +418 -0
  154. package/node_modules/undici/docs/docs/api/MockAgent.md +333 -314
  155. package/node_modules/undici/docs/docs/api/MockCallHistory.md +272 -98
  156. package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +189 -26
  157. package/node_modules/undici/docs/docs/api/MockClient.md +151 -33
  158. package/node_modules/undici/docs/docs/api/MockErrors.md +56 -5
  159. package/node_modules/undici/docs/docs/api/MockPool.md +321 -258
  160. package/node_modules/undici/docs/docs/api/Pool.md +236 -41
  161. package/node_modules/undici/docs/docs/api/PoolStats.md +119 -13
  162. package/node_modules/undici/docs/docs/api/ProxyAgent.md +179 -160
  163. package/node_modules/undici/docs/docs/api/RedirectHandler.md +238 -55
  164. package/node_modules/undici/docs/docs/api/RetryAgent.md +113 -27
  165. package/node_modules/undici/docs/docs/api/RetryHandler.md +161 -79
  166. package/node_modules/undici/docs/docs/api/RoundRobinPool.md +166 -72
  167. package/node_modules/undici/docs/docs/api/SnapshotAgent.md +262 -517
  168. package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +177 -196
  169. package/node_modules/undici/docs/docs/api/Util.md +68 -11
  170. package/node_modules/undici/docs/docs/api/WebSocket.md +475 -80
  171. package/node_modules/undici/docs/docs/api/api-lifecycle.md +100 -32
  172. package/node_modules/undici/docs/docs/best-practices/client-certificate.md +2 -0
  173. package/node_modules/undici/docs/docs/best-practices/crawling.md +3 -1
  174. package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +233 -0
  175. package/node_modules/undici/docs/docs/best-practices/mocking-request.md +9 -7
  176. package/node_modules/undici/docs/docs/best-practices/proxy.md +3 -1
  177. package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +10 -8
  178. package/node_modules/undici/docs/docs/best-practices/writing-tests.md +2 -0
  179. package/node_modules/undici/docs/docs/getting-started.md +281 -0
  180. package/node_modules/undici/docs/docs/index.md +784 -0
  181. package/node_modules/undici/docs/docs/site.json +125 -0
  182. package/node_modules/undici/docs/docs/type-map.json +79 -0
  183. package/node_modules/undici/index.js +4 -2
  184. package/node_modules/undici/lib/api/api-connect.js +13 -11
  185. package/node_modules/undici/lib/api/api-pipeline.js +26 -13
  186. package/node_modules/undici/lib/api/api-request.js +51 -21
  187. package/node_modules/undici/lib/api/api-stream.js +81 -20
  188. package/node_modules/undici/lib/api/api-upgrade.js +21 -11
  189. package/node_modules/undici/lib/api/readable.js +45 -9
  190. package/node_modules/undici/lib/cache/memory-cache-store.js +3 -3
  191. package/node_modules/undici/lib/cache/sqlite-cache-store.js +3 -1
  192. package/node_modules/undici/lib/core/connect.js +46 -7
  193. package/node_modules/undici/lib/core/constants.js +1 -24
  194. package/node_modules/undici/lib/core/errors.js +22 -2
  195. package/node_modules/undici/lib/core/request.js +100 -18
  196. package/node_modules/undici/lib/core/symbols.js +4 -0
  197. package/node_modules/undici/lib/core/util.js +105 -48
  198. package/node_modules/undici/lib/dispatcher/agent.js +51 -32
  199. package/node_modules/undici/lib/dispatcher/balanced-pool.js +23 -27
  200. package/node_modules/undici/lib/dispatcher/client-h1.js +86 -24
  201. package/node_modules/undici/lib/dispatcher/client-h2.js +1091 -361
  202. package/node_modules/undici/lib/dispatcher/client.js +109 -36
  203. package/node_modules/undici/lib/dispatcher/dispatcher-base.js +19 -6
  204. package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -5
  205. package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +110 -0
  206. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
  207. package/node_modules/undici/lib/dispatcher/h2c-client.js +4 -4
  208. package/node_modules/undici/lib/dispatcher/pool-base.js +28 -10
  209. package/node_modules/undici/lib/dispatcher/pool.js +30 -5
  210. package/node_modules/undici/lib/dispatcher/proxy-agent.js +95 -19
  211. package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
  212. package/node_modules/undici/lib/dispatcher/round-robin-pool.js +32 -10
  213. package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +153 -63
  214. package/node_modules/undici/lib/global.js +37 -14
  215. package/node_modules/undici/lib/handler/cache-handler.js +49 -7
  216. package/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
  217. package/node_modules/undici/lib/handler/decorator-handler.js +8 -3
  218. package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
  219. package/node_modules/undici/lib/handler/redirect-handler.js +66 -66
  220. package/node_modules/undici/lib/handler/retry-handler.js +191 -50
  221. package/node_modules/undici/lib/interceptor/cache.js +75 -25
  222. package/node_modules/undici/lib/interceptor/decompress.js +5 -2
  223. package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
  224. package/node_modules/undici/lib/interceptor/dns.js +12 -1
  225. package/node_modules/undici/lib/interceptor/redirect.js +3 -3
  226. package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -1
  227. package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -1
  228. package/node_modules/undici/lib/mock/mock-agent.js +21 -9
  229. package/node_modules/undici/lib/mock/mock-call-history.js +1 -1
  230. package/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  231. package/node_modules/undici/lib/mock/mock-utils.js +281 -47
  232. package/node_modules/undici/lib/mock/snapshot-agent.js +25 -7
  233. package/node_modules/undici/lib/mock/snapshot-recorder.js +38 -3
  234. package/node_modules/undici/lib/util/cache.js +92 -10
  235. package/node_modules/undici/lib/util/runtime-features.js +3 -34
  236. package/node_modules/undici/lib/web/cache/cache.js +6 -8
  237. package/node_modules/undici/lib/web/cookies/parse.js +150 -146
  238. package/node_modules/undici/lib/web/cookies/util.js +1 -1
  239. package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
  240. package/node_modules/undici/lib/web/eventsource/eventsource.js +20 -21
  241. package/node_modules/undici/lib/web/eventsource/util.js +32 -1
  242. package/node_modules/undici/lib/web/fetch/body.js +48 -10
  243. package/node_modules/undici/lib/web/fetch/constants.js +1 -1
  244. package/node_modules/undici/lib/web/fetch/formdata.js +21 -2
  245. package/node_modules/undici/lib/web/fetch/index.js +242 -223
  246. package/node_modules/undici/lib/web/fetch/request.js +35 -6
  247. package/node_modules/undici/lib/web/fetch/response.js +1 -3
  248. package/node_modules/undici/lib/web/fetch/util.js +10 -2
  249. package/node_modules/undici/lib/web/webidl/index.js +5 -7
  250. package/node_modules/undici/lib/web/websocket/frame.js +1 -7
  251. package/node_modules/undici/lib/web/websocket/receiver.js +1 -1
  252. package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +10 -10
  253. package/node_modules/undici/lib/web/websocket/websocket.js +25 -3
  254. package/node_modules/undici/package.json +10 -10
  255. package/node_modules/undici/types/agent.d.ts +0 -2
  256. package/node_modules/undici/types/client.d.ts +69 -24
  257. package/node_modules/undici/types/connector.d.ts +1 -0
  258. package/node_modules/undici/types/cookies.d.ts +1 -1
  259. package/node_modules/undici/types/dispatcher.d.ts +8 -30
  260. package/node_modules/undici/types/dispatcher1-wrapper.d.ts +7 -0
  261. package/node_modules/undici/types/errors.d.ts +10 -0
  262. package/node_modules/undici/types/fetch.d.ts +5 -1
  263. package/node_modules/undici/types/formdata.d.ts +0 -6
  264. package/node_modules/undici/types/h2c-client.d.ts +6 -6
  265. package/node_modules/undici/types/handlers.d.ts +2 -0
  266. package/node_modules/undici/types/header.d.ts +5 -0
  267. package/node_modules/undici/types/index.d.ts +3 -1
  268. package/node_modules/undici/types/interceptors.d.ts +1 -1
  269. package/node_modules/undici/types/mock-agent.d.ts +11 -10
  270. package/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  271. package/node_modules/undici/types/pool.d.ts +0 -2
  272. package/node_modules/undici/types/proxy-agent.d.ts +9 -2
  273. package/node_modules/undici/types/round-robin-pool.d.ts +0 -2
  274. package/node_modules/undici/types/snapshot-agent.d.ts +4 -0
  275. package/node_modules/undici/types/socks5-proxy-agent.d.ts +4 -2
  276. package/node_modules/undici/types/webidl.d.ts +0 -1
  277. package/openclaw.plugin.json +31 -3
  278. package/package.json +7 -7
  279. package/dist/.setup/accounts.runtime-DN-PPocC.mjs +0 -2
  280. package/dist/.setup/action-runtime.runtime-C8R8CUan.mjs +0 -2
  281. package/dist/.setup/doctor-contract-CtMUqjvk.mjs +0 -186
  282. package/dist/.setup/monitor-_Sht7Dqy.mjs +0 -13
  283. package/dist/.setup/rolldown-runtime-D7D4PA-g.mjs +0 -13
  284. package/dist/.setup/send.runtime-B4caZU6T.mjs +0 -2
  285. package/dist/.setup/slash-commands.runtime-BpSH0b3q.mjs +0 -2
  286. package/dist/.setup/slash-skill-commands.runtime-Bi1JWZHY.mjs +0 -2
  287. package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
  288. package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
  289. package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
  290. package/node_modules/undici/lib/util/promise.js +0 -28
  291. /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
package/assets/icon.png CHANGED
Binary file
@@ -1,5 +1,5 @@
1
1
  import { t as hasSlackAccountCredentials } from "./account-configured-sUohAxZr.mjs";
2
- import { a as resolveDefaultSlackAccountId, i as mergeSlackAccountConfig } from "./accounts-BBHvg0pY.mjs";
2
+ import { a as mergeSlackAccountConfig, o as resolveDefaultSlackAccountId } from "./accounts-D_N9IqNA.mjs";
3
3
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
4
4
  import { hasConfiguredSecretInput, normalizeSecretInputString } from "openclaw/plugin-sdk/secret-input";
5
5
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -1,9 +1,11 @@
1
+ import { r as __exportAll } from "./streaming-compat-C5Wut626.mjs";
1
2
  import { t as hasSlackAccountCredentials } from "./account-configured-sUohAxZr.mjs";
2
3
  import { DEFAULT_ACCOUNT_ID, createAccountListHelpers, hasConfiguredAccountValue, normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
3
4
  import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
4
5
  import { asOptionalRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
6
  import { mapAllowFromEntries, normalizeChannelDmPolicy } from "openclaw/plugin-sdk/channel-config-helpers";
6
7
  import { resolveAccountEntry } from "openclaw/plugin-sdk/routing";
8
+ import { normalizeChatType } from "openclaw/plugin-sdk/account-core";
7
9
  //#region extensions/slack/src/token.ts
8
10
  function formatSlackBotTokenIdentityWarning(params) {
9
11
  const userId = params.auth.user_id?.trim();
@@ -31,7 +33,27 @@ function resolveSlackUserToken(raw, path = "channels.slack.userToken") {
31
33
  });
32
34
  }
33
35
  //#endregion
36
+ //#region extensions/slack/src/account-reply-mode.ts
37
+ function resolveSlackReplyToMode(account, chatType) {
38
+ const normalized = normalizeChatType(chatType ?? void 0);
39
+ if (normalized && account.replyToModeByChatType?.[normalized] !== void 0) return account.replyToModeByChatType[normalized] ?? "off";
40
+ return account.replyToMode ?? "off";
41
+ }
42
+ //#endregion
34
43
  //#region extensions/slack/src/accounts.ts
44
+ var accounts_exports = /* @__PURE__ */ __exportAll({
45
+ hasImplicitDefaultSlackAccount: () => hasImplicitDefaultSlackAccount,
46
+ listEnabledSlackAccounts: () => listEnabledSlackAccounts,
47
+ listSlackAccountIds: () => listSlackAccountIds,
48
+ mergeSlackAccountConfig: () => mergeSlackAccountConfig,
49
+ resolveDefaultSlackAccountId: () => resolveDefaultSlackAccountId,
50
+ resolveSlackAccount: () => resolveSlackAccount,
51
+ resolveSlackAccountAllowFrom: () => resolveSlackAccountAllowFrom,
52
+ resolveSlackAccountDmPolicy: () => resolveSlackAccountDmPolicy,
53
+ resolveSlackConfigAccessorAccount: () => resolveSlackConfigAccessorAccount,
54
+ resolveSlackOperationToken: () => resolveSlackOperationToken,
55
+ resolveSlackReplyToMode: () => resolveSlackReplyToMode
56
+ });
35
57
  function resolveSlackOperationToken(account, operation) {
36
58
  if (account.identity === "user") return normalizeOptionalString(account.userToken);
37
59
  const userToken = normalizeOptionalString(account.userToken);
@@ -185,4 +207,4 @@ function listEnabledSlackAccounts(cfg) {
185
207
  })).filter((account) => account.enabled);
186
208
  }
187
209
  //#endregion
188
- export { resolveDefaultSlackAccountId as a, resolveSlackAccountDmPolicy as c, formatSlackBotTokenIdentityWarning as d, resolveSlackAppToken as f, mergeSlackAccountConfig as i, resolveSlackConfigAccessorAccount as l, listEnabledSlackAccounts as n, resolveSlackAccount as o, resolveSlackBotToken as p, listSlackAccountIds as r, resolveSlackAccountAllowFrom as s, hasImplicitDefaultSlackAccount as t, resolveSlackOperationToken as u };
210
+ export { mergeSlackAccountConfig as a, resolveSlackAccountAllowFrom as c, resolveSlackOperationToken as d, resolveSlackReplyToMode as f, resolveSlackBotToken as h, listSlackAccountIds as i, resolveSlackAccountDmPolicy as l, resolveSlackAppToken as m, hasImplicitDefaultSlackAccount as n, resolveDefaultSlackAccountId as o, formatSlackBotTokenIdentityWarning as p, listEnabledSlackAccounts as r, resolveSlackAccount as s, accounts_exports as t, resolveSlackConfigAccessorAccount as u };
@@ -1,7 +1,7 @@
1
- import { Mt as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, Nt as resolveSlackAutoThreadId, ct as parseSlackBlocksInput, f as assertSlackDetachedTargetAllowed, r as buildSlackChannelIdCandidates, v as hasSlackNativeDataBlock, xt as getSlackInstallationKind } from "./session-status-Cf7AvWOt.mjs";
2
- import { a as parseSlackTarget, n as formatSlackTarget, o as resolveSlackChannelId } from "./target-parsing-DEsPjngB.mjs";
3
- import { t as slackContextTargetsMatch } from "./targets-Cku2KCvg.mjs";
4
- import { n as resolveSlackChannelConfig, t as isSlackChannelAllowedByPolicy } from "./policy-BApW53pI.mjs";
1
+ import { a as parseSlackTarget, n as formatSlackTarget, o as resolveSlackChannelId } from "./target-parsing-FFE26kOV.mjs";
2
+ import { t as slackContextTargetsMatch } from "./targets-C6LZQL1Q.mjs";
3
+ import { Nt as getSlackInstallationKind, Ut as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, Wt as resolveSlackAutoThreadId, _t as parseSlackBlocksInput, f as assertSlackDetachedTargetAllowed, r as buildSlackChannelIdCandidates, v as hasSlackNativeDataBlock } from "./session-status-DscajIsd.mjs";
4
+ import { n as resolveSlackChannelConfig, t as isSlackChannelAllowedByPolicy } from "./policy-D-jfM174.mjs";
5
5
  import { t as mergeSlackSendResults } from "./send-results-eeOu_HYm.mjs";
6
6
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
7
7
  import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -27,10 +27,10 @@ const pinActions = /* @__PURE__ */ new Set([
27
27
  "listPins"
28
28
  ]);
29
29
  const SLACK_REACTION_RESULT_LIMIT = 100;
30
- const loadSlackActionsRuntime = createLazyRuntimeModule(() => import("./actions-DKCtBgCI.mjs").then((n) => n.t));
30
+ const loadSlackActionsRuntime = createLazyRuntimeModule(() => import("./actions-Df0CzcDl.mjs").then((n) => n.t));
31
31
  const bindSlackAction = createLazyRuntimeMethodBinder(loadSlackActionsRuntime);
32
- const loadSlackAccountsRuntime = createLazyRuntimeModule(() => import("./accounts.runtime-DN-PPocC.mjs"));
33
- const loadSlackChannelTypeRuntime = createLazyRuntimeModule(() => import("./channel-type-Dxk8VJUb.mjs").then((n) => n.t));
32
+ const loadSlackAccountsRuntime = createLazyRuntimeModule(() => import("./accounts-D_N9IqNA.mjs").then((n) => n.t));
33
+ const loadSlackChannelTypeRuntime = createLazyRuntimeModule(() => import("./channel-type-ClOttrZ5.mjs").then((n) => n.t));
34
34
  const bindSlackChannelType = createLazyRuntimeMethodBinder(loadSlackChannelTypeRuntime);
35
35
  const slackActionRuntime = {
36
36
  deleteSlackMessage: bindSlackAction((runtime) => runtime.deleteSlackMessage),
@@ -49,7 +49,7 @@ const slackActionRuntime = {
49
49
  removeSlackReaction: bindSlackAction((runtime) => runtime.removeSlackReaction),
50
50
  resolveSlackConversationName: bindSlackAction((runtime) => runtime.resolveSlackConversationName),
51
51
  resolveSlackConversationInfo: bindSlackChannelType((runtime) => runtime.resolveSlackConversationInfo),
52
- resolveSlackChannelType: async (params) => (await loadSlackChannelTypeRuntime()).resolveSlackChannelType(params),
52
+ resolveSlackChannelType: bindSlackChannelType((runtime) => runtime.resolveSlackChannelType),
53
53
  sendSlackMessage: bindSlackAction((runtime) => runtime.sendSlackMessage),
54
54
  unpinSlackMessage: bindSlackAction((runtime) => runtime.unpinSlackMessage)
55
55
  };
@@ -63,12 +63,6 @@ function resolveThreadTsFromContext(explicitThreadTs, targetChannel, context, op
63
63
  if (isSingleUseReplyToMode(context?.replyToMode ?? "off") && !context?.hasRepliedRef) return;
64
64
  return threadTs;
65
65
  }
66
- function readSlackBlocksParam(params) {
67
- return slackActionRuntime.parseSlackBlocksInput(params.blocks);
68
- }
69
- function isImageContentType(value) {
70
- return value?.trim().toLowerCase().startsWith("image/") === true;
71
- }
72
66
  function hasPotentialSlackNamedPolicy(params) {
73
67
  if (params.allowNameMatching !== true) return false;
74
68
  return Object.entries(params.channels ?? {}).some(([key, entry]) => {
@@ -345,6 +339,17 @@ async function handleSlackAction(params, cfg, context) {
345
339
  if (messagingActions.has(action)) {
346
340
  if (!isActionEnabled("messages")) throw new Error("Slack messages are disabled.");
347
341
  const sentResults = [];
342
+ const buildSendOpts = (destination, forceDocument) => {
343
+ const threadTs = resolveThreadTsFromContext(readStringParam(params, "threadTs"), destination, context, { suppressImplicitThread: params.topLevel === true || params.threadTs === null });
344
+ return {
345
+ ...buildActionOpts("write"),
346
+ mediaAccess: context?.mediaAccess,
347
+ mediaLocalRoots: context?.mediaLocalRoots,
348
+ mediaReadFile: context?.mediaReadFile,
349
+ threadTs,
350
+ ...forceDocument ? { forceDocument: true } : {}
351
+ };
352
+ };
348
353
  const sendSlackMessage = async (target, content, options) => {
349
354
  const replyReference = context?.hasRepliedRef && slackContextTargetsMatch(target, context) ? context.hasRepliedRef : void 0;
350
355
  const result = await slackActionRuntime.sendSlackMessage(target, content, {
@@ -374,7 +379,7 @@ async function handleSlackAction(params, cfg, context) {
374
379
  const destination = resolveSlackActionTarget(account, readStringParam(params, "to", { required: true }), context).routingTarget;
375
380
  const content = readStringParam(params, "content", { allowEmpty: true });
376
381
  const mediaUrl = readStringParam(params, "mediaUrl");
377
- const blocks = readSlackBlocksParam(params);
382
+ const blocks = slackActionRuntime.parseSlackBlocksInput(params.blocks);
378
383
  const replyBroadcast = readBooleanParam(params, "replyBroadcast");
379
384
  const textIsSlackMrkdwn = readBooleanParam(params, "textIsSlackMrkdwn");
380
385
  const textIsSlackPlainText = readBooleanParam(params, "textIsSlackPlainText");
@@ -385,15 +390,7 @@ async function handleSlackAction(params, cfg, context) {
385
390
  const nativeDataFallbackBaseText = readStringParam(params, "nativeDataFallbackBaseText", { allowEmpty: true });
386
391
  if (!content && !mediaUrl && !blocks && !preparedMessages?.length) throw new Error("Slack sendMessage requires content, blocks, or mediaUrl.");
387
392
  if (replyBroadcast && mediaUrl) throw new Error("Slack replyBroadcast is only supported for text or block thread replies.");
388
- const threadTs = resolveThreadTsFromContext(readStringParam(params, "threadTs"), destination, context, { suppressImplicitThread: params.topLevel === true || params.threadTs === null });
389
- const baseSendOpts = {
390
- ...buildActionOpts("write"),
391
- mediaAccess: context?.mediaAccess,
392
- mediaLocalRoots: context?.mediaLocalRoots,
393
- mediaReadFile: context?.mediaReadFile,
394
- threadTs: threadTs ?? void 0,
395
- ...forceDocument ? { forceDocument: true } : {}
396
- };
393
+ const baseSendOpts = buildSendOpts(destination, forceDocument);
397
394
  const sendOpts = {
398
395
  ...baseSendOpts,
399
396
  ...replyBroadcast ? { replyBroadcast } : {},
@@ -451,15 +448,9 @@ async function handleSlackAction(params, cfg, context) {
451
448
  const title = readStringParam(params, "title");
452
449
  const forceDocument = readBooleanParam(params, "forceDocument") === true;
453
450
  if (readBooleanParam(params, "replyBroadcast")) throw new Error("Slack replyBroadcast is only supported for text or block thread replies.");
454
- const threadTs = resolveThreadTsFromContext(readStringParam(params, "threadTs"), destination, context, { suppressImplicitThread: params.topLevel === true || params.threadTs === null });
455
451
  const result = await sendSlackMessage(destination, initialComment ?? "", {
456
- ...buildActionOpts("write"),
452
+ ...buildSendOpts(destination, forceDocument),
457
453
  mediaUrl: filePath,
458
- mediaAccess: context?.mediaAccess,
459
- mediaLocalRoots: context?.mediaLocalRoots,
460
- mediaReadFile: context?.mediaReadFile,
461
- threadTs: threadTs ?? void 0,
462
- ...forceDocument ? { forceDocument: true } : {},
463
454
  ...filename ? { uploadFileName: filename } : {},
464
455
  ...title ? { uploadTitle: title } : {}
465
456
  });
@@ -473,7 +464,7 @@ async function handleSlackAction(params, cfg, context) {
473
464
  const { channelId } = target;
474
465
  const messageId = readStringParam(params, "messageId", { required: true });
475
466
  const content = readStringParam(params, "content", { allowEmpty: true });
476
- const blocks = readSlackBlocksParam(params);
467
+ const blocks = slackActionRuntime.parseSlackBlocksInput(params.blocks);
477
468
  if (!content && !blocks) throw new Error("Slack editMessage requires content or blocks.");
478
469
  await assertReadTargetAllowed(target);
479
470
  const writeOpts = buildActionOpts("write", target.teamId);
@@ -541,7 +532,7 @@ async function handleSlackAction(params, cfg, context) {
541
532
  ok: false,
542
533
  error: "File could not be downloaded. Confirm the fileId came from the requested Slack channel or explicit thread and that the file is accessible and within the size limit."
543
534
  });
544
- if (!isImageContentType(downloaded.contentType)) return jsonResult({
535
+ if (!downloaded.contentType?.trim().toLowerCase().startsWith("image/")) return jsonResult({
545
536
  ok: true,
546
537
  fileId,
547
538
  path: downloaded.path,
@@ -574,16 +565,10 @@ async function handleSlackAction(params, cfg, context) {
574
565
  const { channelId } = target;
575
566
  const readOpts = buildActionOpts("read", target.teamId);
576
567
  const writeOpts = buildActionOpts("write", target.teamId);
577
- if (action === "pinMessage") {
578
- const messageId = readStringParam(params, "messageId", { required: true });
579
- await assertReadTargetAllowed(target);
580
- await slackActionRuntime.pinSlackMessage(channelId, messageId, writeOpts);
581
- return jsonResult({ ok: true });
582
- }
583
- if (action === "unpinMessage") {
568
+ if (action === "pinMessage" || action === "unpinMessage") {
584
569
  const messageId = readStringParam(params, "messageId", { required: true });
585
570
  await assertReadTargetAllowed(target);
586
- await slackActionRuntime.unpinSlackMessage(channelId, messageId, writeOpts);
571
+ await (action === "pinMessage" ? slackActionRuntime.pinSlackMessage : slackActionRuntime.unpinSlackMessage)(channelId, messageId, writeOpts);
587
572
  return jsonResult({ ok: true });
588
573
  }
589
574
  await assertReadTargetAllowed(target);
@@ -0,0 +1,2 @@
1
+ import { t as handleSlackAction } from "./action-runtime-DfWvuiZd.mjs";
2
+ export { handleSlackAction };
@@ -1,12 +1,12 @@
1
- import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { a as resolveDefaultSlackAccountId, o as resolveSlackAccount, p as resolveSlackBotToken } from "./accounts-BBHvg0pY.mjs";
3
- import { A as countSlackTextUtf8Bytes, C as buildSlackBlocksFallbackText, E as SLACK_EDIT_TEXT_MAX_BYTES, M as truncateSlackTextByUtf8Bytes, Mt as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, S as stripSlackNativeDataBlocks, T as renderSlackBlockFallbackText, Y as normalizeSlackOutboundText, f as assertSlackDetachedTargetAllowed, h as appendSlackNativeDataPlainTextFallback, lt as validateSlackBlocksArray, m as appendSlackNativeDataFallbackText, ot as escapeSlackMrkdwn, v as hasSlackNativeDataBlock, w as buildSlackCompleteBlocksFallbackText, y as isSlackInvalidBlocksError } from "./session-status-Cf7AvWOt.mjs";
4
- import { n as formatSlackTarget } from "./target-parsing-DEsPjngB.mjs";
5
- import { g as getSlackWriteClient, l as createSlackLookupClient, m as createSlackWriteClient } from "./probe-DiYIMPJo.mjs";
6
- import { m as buildSlackNativeDataDeliveryPlan, r as sendMessageSlack } from "./send-Cp6omkOg.mjs";
1
+ import { r as __exportAll } from "./streaming-compat-C5Wut626.mjs";
2
+ import { h as resolveSlackBotToken, o as resolveDefaultSlackAccountId, s as resolveSlackAccount } from "./accounts-D_N9IqNA.mjs";
3
+ import { n as formatSlackTarget } from "./target-parsing-FFE26kOV.mjs";
4
+ import { A as countSlackTextUtf8Bytes, C as buildSlackBlocksFallbackText, E as SLACK_EDIT_TEXT_MAX_BYTES, M as truncateSlackTextByUtf8Bytes, Q as normalizeSlackOutboundText, S as stripSlackNativeDataBlocks, T as renderSlackBlockFallbackText, Ut as SLACK_PRIVATE_ACTION_DELIVERY_RESULT, f as assertSlackDetachedTargetAllowed, h as appendSlackNativeDataPlainTextFallback, lt as escapeSlackMrkdwn, m as appendSlackNativeDataFallbackText, v as hasSlackNativeDataBlock, vt as validateSlackBlocksArray, w as buildSlackCompleteBlocksFallbackText, y as isSlackInvalidBlocksError } from "./session-status-DscajIsd.mjs";
5
+ import { _ as getSlackWriteClient, h as createSlackWriteClient, u as createSlackLookupClient } from "./probe-B2Y9qc_z.mjs";
6
+ import { p as buildSlackNativeDataDeliveryPlan, t as sendMessageSlack } from "./send-BOVLQi3n.mjs";
7
7
  import { normalizeAccountId } from "openclaw/plugin-sdk/account-resolution";
8
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
9
- import { createSubsystemLogger, logVerbose, logVerbose as logVerbose$1 } from "openclaw/plugin-sdk/runtime-env";
8
+ import { asOptionalRecord, isRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, readNonBlankString } from "openclaw/plugin-sdk/string-coerce-runtime";
9
+ import { createSubsystemLogger, logVerbose } from "openclaw/plugin-sdk/runtime-env";
10
10
  import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
11
11
  import { captureChannelReadAuthority as captureChannelReadAuthority$1 } from "openclaw/plugin-sdk/fetch-runtime";
12
12
  import { fetchWithRuntimeDispatcher as fetchWithRuntimeDispatcher$1 } from "openclaw/plugin-sdk/runtime-fetch";
@@ -57,11 +57,8 @@ function buildSlackEditTextPayload(content, blocks) {
57
57
  }
58
58
  //#endregion
59
59
  //#region extensions/slack/src/monitor/block-text.ts
60
- function readSlackBlockType(block) {
61
- return block && typeof block === "object" && !Array.isArray(block) ? block.type : void 0;
62
- }
63
60
  function hasSlackTableBlock(blocks) {
64
- return blocks?.some((block) => readSlackBlockType(block) === "table") ?? false;
61
+ return blocks?.some((block) => asOptionalRecord(block)?.type === "table") ?? false;
65
62
  }
66
63
  function hasSlackMessageTableBlock(message) {
67
64
  return hasSlackTableBlock(message.blocks) || message.attachments?.some((attachment) => !isSlackUnfurlAttachment(attachment) && hasSlackTableBlock(attachment.blocks)) === true;
@@ -75,7 +72,7 @@ function resolveSlackBlocksText(blocks) {
75
72
  let hasRichText = false;
76
73
  let hasNativeData = false;
77
74
  for (const block of blocks) {
78
- const blockType = readSlackBlockType(block);
75
+ const blockType = asOptionalRecord(block)?.type;
79
76
  hasRichText ||= blockType === "rich_text";
80
77
  hasNativeData ||= blockType === "data_visualization" || blockType === "data_table" || blockType === "table";
81
78
  const text = renderSlackBlockFallbackText(block, {
@@ -103,7 +100,7 @@ function resolveSlackAttachmentTableTexts(attachments) {
103
100
  for (const attachment of attachments ?? []) {
104
101
  if (isSlackUnfurlAttachment(attachment)) continue;
105
102
  for (const block of attachment.blocks ?? []) {
106
- if (readSlackBlockType(block) !== "table") continue;
103
+ if (asOptionalRecord(block)?.type !== "table") continue;
107
104
  const text = renderSlackBlockFallbackText(block, { nativeDataFormat: "plain" });
108
105
  if (!text || seen.has(text)) continue;
109
106
  seen.add(text);
@@ -115,7 +112,7 @@ function resolveSlackAttachmentTableTexts(attachments) {
115
112
  /** Resolve agent-visible Slack text while admitting only native tables from attachments. */
116
113
  function resolveSlackMessageText(message, options = {}) {
117
114
  let resolved = chooseSlackPrimaryText({
118
- messageText: options.preserveMessageTextWhitespace ? typeof message.text === "string" && message.text.trim().length > 0 ? message.text : void 0 : normalizeOptionalString(message.text),
115
+ messageText: options.preserveMessageTextWhitespace ? readNonBlankString(message.text) : normalizeOptionalString(message.text),
119
116
  blocksText: resolveSlackBlocksText(message.blocks)
120
117
  });
121
118
  for (const tableText of resolveSlackAttachmentTableTexts(message.attachments)) resolved = appendDistinctSlackText(resolved, tableText);
@@ -195,9 +192,6 @@ function assertSlackFileUrl(rawUrl, govSlack) {
195
192
  if (!isSlackHostname(parsed.hostname, govSlack)) throw new Error(`Refusing to send Slack token to non-Slack host "${parsed.hostname}" (url: ${rawUrl})`);
196
193
  return parsed;
197
194
  }
198
- function createSlackAuthHeaders(token) {
199
- return { Authorization: `Bearer ${token}` };
200
- }
201
195
  function captureSlackMediaReadGuard(params) {
202
196
  const inherited = captureChannelReadAuthority$1();
203
197
  const { assertCurrent, abortSignal } = params;
@@ -208,12 +202,6 @@ function captureSlackMediaReadGuard(params) {
208
202
  assertCurrent?.();
209
203
  };
210
204
  }
211
- function createSlackMediaRequest(url, token, govSlack) {
212
- return {
213
- url: assertSlackFileUrl(url, govSlack).href,
214
- requestInit: { headers: createSlackAuthHeaders(token) }
215
- };
216
- }
217
205
  function createSlackMediaFetch(govSlack, assertReadAuthority = captureChannelReadAuthority$1()) {
218
206
  return async (input, init) => {
219
207
  const url = resolveRequestUrl(input);
@@ -247,34 +235,41 @@ const SLACK_GOV_MEDIA_SSRF_POLICY = {
247
235
  const SLACK_MEDIA_READ_IDLE_TIMEOUT_MS = 6e4;
248
236
  const SLACK_MEDIA_TOTAL_TIMEOUT_MS = 12e4;
249
237
  async function saveSlackMedia(params) {
250
- const timeoutAbortController = params.totalTimeoutMs ? new AbortController() : void 0;
251
- const abortSignals = [
252
- params.abortSignal,
253
- params.options.requestInit?.signal ?? void 0,
254
- timeoutAbortController?.signal
255
- ].filter((signal) => Boolean(signal));
238
+ const url = assertSlackFileUrl(params.url, params.govSlack).href;
239
+ const totalTimeoutMs = params.totalTimeoutMs ?? SLACK_MEDIA_TOTAL_TIMEOUT_MS;
240
+ const timeoutAbortController = totalTimeoutMs ? new AbortController() : void 0;
241
+ const abortSignals = [params.abortSignal, timeoutAbortController?.signal].filter((signal) => Boolean(signal));
256
242
  const signal = abortSignals.length > 1 ? AbortSignal.any(abortSignals) : abortSignals[0];
257
243
  let timedOut = false;
258
244
  let timeoutHandle = null;
259
245
  const savePromise = saveRemoteMedia({
260
- ...params.options,
261
- readIdleTimeoutMs: params.readIdleTimeoutMs ?? 6e4,
262
- ...signal ? { requestInit: {
263
- ...params.options.requestInit,
264
- signal
265
- } } : {}
246
+ url,
247
+ fetchImpl: createSlackMediaFetch(params.govSlack, params.assertReadAuthority),
248
+ beforeRequest: params.assertReadAuthority,
249
+ assertCurrent: params.assertCurrent,
250
+ requestInit: {
251
+ headers: { Authorization: `Bearer ${params.token}` },
252
+ ...signal ? { signal } : {}
253
+ },
254
+ ...params.file ? {
255
+ filePathHint: params.file.name,
256
+ fallbackContentType: resolveSlackMediaMimetype(params.file)
257
+ } : {},
258
+ maxBytes: params.maxBytes,
259
+ ssrfPolicy: params.govSlack ? SLACK_GOV_MEDIA_SSRF_POLICY : SLACK_MEDIA_SSRF_POLICY,
260
+ readIdleTimeoutMs: params.readIdleTimeoutMs ?? 6e4
266
261
  }).catch((error) => {
267
262
  if (timedOut) return new Promise(() => {});
268
263
  throw error;
269
264
  });
270
265
  try {
271
- if (!params.totalTimeoutMs) return await savePromise;
266
+ if (!totalTimeoutMs) return await savePromise;
272
267
  const timeoutPromise = new Promise((_, reject) => {
273
268
  timeoutHandle = setTimeout(() => {
274
269
  timedOut = true;
275
270
  timeoutAbortController?.abort();
276
- reject(/* @__PURE__ */ new Error(`slack media download timed out after ${params.totalTimeoutMs}ms`));
277
- }, params.totalTimeoutMs);
271
+ reject(/* @__PURE__ */ new Error(`slack media download timed out after ${totalTimeoutMs}ms`));
272
+ }, totalTimeoutMs);
278
273
  timeoutHandle.unref?.();
279
274
  });
280
275
  return await Promise.race([savePromise, timeoutPromise]);
@@ -323,41 +318,28 @@ async function fetchFreshSlackFileUrl(params) {
323
318
  assertCurrent?.();
324
319
  const freshFile = info.file;
325
320
  if (freshFile && params.isRefreshedFileAllowed?.(freshFile) === false) {
326
- logVerbose$1(`slack: refreshed file metadata rejected for file id=${params.file.id}`);
321
+ logVerbose(`slack: refreshed file metadata rejected for file id=${params.file.id}`);
327
322
  return null;
328
323
  }
329
324
  const freshUrl = freshFile?.url_private_download ?? freshFile?.url_private;
330
325
  if (freshUrl) {
331
- logVerbose$1(`slack: refreshed file URL via files.info for file id=${params.file.id}`);
326
+ logVerbose(`slack: refreshed file URL via files.info for file id=${params.file.id}`);
332
327
  return freshUrl;
333
328
  }
334
- logVerbose$1(`slack: files.info returned no private URL for file id=${params.file.id}`);
329
+ logVerbose(`slack: files.info returned no private URL for file id=${params.file.id}`);
335
330
  return null;
336
331
  } catch (error) {
337
332
  assertCurrent?.();
338
- logVerbose$1(`slack: files.info failed for file id=${params.file.id}: ${formatErrorMessage(error)}`);
333
+ logVerbose(`slack: files.info failed for file id=${params.file.id}: ${formatErrorMessage(error)}`);
339
334
  return null;
340
335
  }
341
336
  }
342
337
  async function downloadSlackMediaFile(params) {
343
338
  const assertReadAuthority = captureSlackMediaReadGuard(params);
344
339
  assertReadAuthority?.();
345
- const { url: slackUrl, requestInit } = createSlackMediaRequest(params.url, params.token, params.govSlack);
346
340
  const saved = await saveSlackMedia({
347
- options: {
348
- url: slackUrl,
349
- fetchImpl: createSlackMediaFetch(params.govSlack, assertReadAuthority),
350
- beforeRequest: assertReadAuthority,
351
- assertCurrent: params.assertCurrent,
352
- requestInit,
353
- filePathHint: params.file.name,
354
- fallbackContentType: resolveSlackMediaMimetype(params.file, params.file.mimetype),
355
- maxBytes: params.maxBytes,
356
- ssrfPolicy: params.govSlack ? SLACK_GOV_MEDIA_SSRF_POLICY : SLACK_MEDIA_SSRF_POLICY
357
- },
358
- readIdleTimeoutMs: params.readIdleTimeoutMs,
359
- totalTimeoutMs: params.totalTimeoutMs ?? SLACK_MEDIA_TOTAL_TIMEOUT_MS,
360
- abortSignal: params.abortSignal
341
+ ...params,
342
+ assertReadAuthority
361
343
  });
362
344
  const fileMime = normalizeOptionalLowercaseString(params.file.mimetype);
363
345
  const fileName = normalizeLowercaseStringOrEmpty(params.file.name);
@@ -367,9 +349,8 @@ async function downloadSlackMediaFile(params) {
367
349
  throw new Error("blocked: unexpected HTML content");
368
350
  }
369
351
  }
370
- const effectiveMime = resolveSlackMediaMimetype(params.file, saved.contentType);
352
+ const contentType = resolveSlackMediaMimetype(params.file, saved.contentType);
371
353
  const label = saved.fileName ?? params.file.name;
372
- const contentType = effectiveMime ?? saved.contentType;
373
354
  return {
374
355
  path: saved.path,
375
356
  ...contentType ? { contentType } : {},
@@ -380,16 +361,11 @@ async function downloadSlackMediaFile(params) {
380
361
  })}]`
381
362
  };
382
363
  }
383
- function isForwardedSlackAttachment(attachment) {
384
- return attachment.is_share === true;
385
- }
386
364
  function resolveForwardedAttachmentImageUrl(attachment, govSlack) {
387
365
  const rawUrl = attachment.image_url?.trim();
388
366
  if (!rawUrl) return null;
389
367
  try {
390
- const parsed = new URL(rawUrl);
391
- if (parsed.protocol !== "https:" || !isSlackHostname(parsed.hostname, govSlack)) return null;
392
- return parsed.toString();
368
+ return assertSlackFileUrl(rawUrl, govSlack).href;
393
369
  } catch {
394
370
  return null;
395
371
  }
@@ -446,7 +422,7 @@ async function resolveSlackMedia(params) {
446
422
  }
447
423
  /** Extracts text and media from forwarded-message attachments. Returns null when empty. */
448
424
  async function resolveSlackAttachmentContent(params) {
449
- const forwardedAttachments = (params.attachments ?? []).filter((attachment) => isForwardedSlackAttachment(attachment)).slice(0, MAX_SLACK_FORWARDED_ATTACHMENTS);
425
+ const forwardedAttachments = (params.attachments ?? []).filter((attachment) => attachment.is_share === true).slice(0, MAX_SLACK_FORWARDED_ATTACHMENTS);
450
426
  const candidates = [...params.files ?? [], ...forwardedAttachments.flatMap((attachment) => attachment.files ?? [])];
451
427
  if (forwardedAttachments.length === 0 && candidates.length === 0) return null;
452
428
  const fileIds = /* @__PURE__ */ new Set();
@@ -492,21 +468,12 @@ async function resolveSlackAttachmentContent(params) {
492
468
  }
493
469
  const imageUrl = resolveForwardedAttachmentImageUrl(att, govSlack);
494
470
  if (imageUrl) try {
495
- const { url: slackUrl, requestInit } = createSlackMediaRequest(imageUrl, params.token, govSlack);
496
471
  const assertReadAuthority = captureSlackMediaReadGuard(params);
497
472
  const saved = await saveSlackMedia({
498
- options: {
499
- url: slackUrl,
500
- fetchImpl: createSlackMediaFetch(govSlack, assertReadAuthority),
501
- beforeRequest: assertReadAuthority,
502
- assertCurrent: params.assertCurrent,
503
- requestInit,
504
- maxBytes: params.maxBytes,
505
- ssrfPolicy: govSlack ? SLACK_GOV_MEDIA_SSRF_POLICY : SLACK_MEDIA_SSRF_POLICY
506
- },
507
- readIdleTimeoutMs: params.readIdleTimeoutMs,
508
- totalTimeoutMs: params.totalTimeoutMs ?? SLACK_MEDIA_TOTAL_TIMEOUT_MS,
509
- abortSignal: params.abortSignal
473
+ ...params,
474
+ url: imageUrl,
475
+ govSlack,
476
+ assertReadAuthority
510
477
  });
511
478
  const label = saved.fileName ?? "forwarded image";
512
479
  attachmentMedia.push({
@@ -679,39 +646,29 @@ async function getClient(opts = {}, mode = "read") {
679
646
  if (opts.assertDirectAdapterHandoff) return createSlackWriteClient(token, { teamId: opts.teamId }, opts.assertDirectAdapterHandoff);
680
647
  return getSlackWriteClient(token, { teamId: opts.teamId });
681
648
  }
682
- return opts.assertDirectAdapterHandoff ? createSlackLookupClient(token, { teamId: opts.teamId }, opts.assertDirectAdapterHandoff) : createSlackLookupClient(token, { teamId: opts.teamId });
649
+ return createSlackLookupClient(token, { teamId: opts.teamId }, opts.assertDirectAdapterHandoff);
683
650
  }
684
651
  async function resolveBotUserId(client) {
685
652
  const auth = await client.auth.test();
686
653
  if (!auth?.user_id) throw new Error("Failed to resolve Slack bot user id");
687
654
  return auth.user_id;
688
655
  }
689
- async function reactSlackMessage(channelId, messageId, emoji, opts = {}) {
690
- const client = await getClient(opts, "write");
691
- try {
692
- await client.reactions.add({
693
- channel: channelId,
694
- timestamp: messageId,
695
- name: normalizeSlackEmojiName(emoji)
696
- });
697
- } catch (err) {
698
- if (hasSlackPlatformError(err, "already_reacted")) return;
699
- throw err;
700
- }
701
- }
702
- async function removeSlackReaction(channelId, messageId, emoji, opts = {}) {
703
- const client = await getClient(opts, "write");
704
- try {
705
- await client.reactions.remove({
706
- channel: channelId,
707
- timestamp: messageId,
708
- name: normalizeSlackEmojiName(emoji)
709
- });
710
- } catch (err) {
711
- if (hasSlackPlatformError(err, "no_reaction")) return;
712
- throw err;
713
- }
656
+ function createSlackReactionUpdater(method, unchangedError) {
657
+ return async (channelId, messageId, emoji, opts = {}) => {
658
+ const client = await getClient(opts, "write");
659
+ try {
660
+ await client.reactions[method]({
661
+ channel: channelId,
662
+ timestamp: messageId,
663
+ name: normalizeSlackEmojiName(emoji)
664
+ });
665
+ } catch (err) {
666
+ if (!hasSlackPlatformError(err, unchangedError)) throw err;
667
+ }
668
+ };
714
669
  }
670
+ const reactSlackMessage = createSlackReactionUpdater("add", "already_reacted");
671
+ const removeSlackReaction = createSlackReactionUpdater("remove", "no_reaction");
715
672
  async function removeOwnSlackReactions(channelId, messageId, opts = {}) {
716
673
  const client = await getClient(opts, "write");
717
674
  const userId = await resolveBotUserId(client);
@@ -783,7 +740,7 @@ async function editSlackRenderedMessage(channelId, messageId, content, opts = {}
783
740
  try {
784
741
  await client.chat.update(update);
785
742
  } catch (error) {
786
- if (!hasSlackNativeDataBlock(blocks) || !isSlackInvalidBlocksError(error)) throw error;
743
+ if (!hasNativeData || !isSlackInvalidBlocksError(error)) throw error;
787
744
  logVerbose("slack edit: native data block rejected, retrying with text fallback");
788
745
  const survivorBlocks = stripSlackNativeDataBlocks(blocks);
789
746
  const survivorText = buildSlackBlocksFallbackText(survivorBlocks) ?? "";
@@ -834,30 +791,18 @@ async function readSlackMessages(channelId, opts = {}) {
834
791
  oldest: normalizeSlackReadTimestamp(opts.after, "after")
835
792
  };
836
793
  const client = await getClient(opts);
837
- if (opts.threadId) {
838
- const oldest = exactMessageId ? exactMessageId : exactBounds.oldest && Number(exactBounds.oldest) > Number(opts.threadId) ? exactBounds.oldest : opts.threadId;
839
- const result = await client.conversations.replies({
840
- channel: channelId,
841
- ts: opts.threadId,
842
- limit: readLimit,
843
- ...exactBounds,
844
- oldest
845
- });
846
- return {
847
- messages: (result.messages ?? []).filter((message) => {
848
- if (exactMessageId) return message.ts === exactMessageId;
849
- return message.ts !== opts.threadId;
850
- }).map(renderSlackReadMessageText),
851
- hasMore: exactMessageId ? false : Boolean(result.has_more)
852
- };
853
- }
854
- const result = await client.conversations.history({
794
+ const query = {
855
795
  channel: channelId,
856
796
  limit: readLimit,
857
797
  ...exactBounds
858
- });
798
+ };
799
+ const result = opts.threadId ? await client.conversations.replies({
800
+ ...query,
801
+ ts: opts.threadId,
802
+ oldest: exactMessageId ? exactMessageId : exactBounds.oldest && Number(exactBounds.oldest) > Number(opts.threadId) ? exactBounds.oldest : opts.threadId
803
+ }) : await client.conversations.history(query);
859
804
  return {
860
- messages: (result.messages ?? []).filter((message) => !exactMessageId || message.ts === exactMessageId).map(renderSlackReadMessageText),
805
+ messages: (result.messages ?? []).filter((message) => exactMessageId ? message.ts === exactMessageId : !opts.threadId || message.ts !== opts.threadId).map(renderSlackReadMessageText),
861
806
  hasMore: exactMessageId ? false : Boolean(result.has_more)
862
807
  };
863
808
  }
@@ -882,55 +827,23 @@ async function unpinSlackMessage(channelId, messageId, opts = {}) {
882
827
  async function listSlackPins(channelId, opts = {}) {
883
828
  return (await (await getClient(opts)).pins.list({ channel: channelId })).items ?? [];
884
829
  }
885
- function collectSlackDirectShareChannelIds(file) {
886
- const ids = /* @__PURE__ */ new Set();
887
- for (const group of [
830
+ function hasSlackScopeProof(params) {
831
+ const channelId = normalizeOptionalString(params.channelId);
832
+ if (!channelId) return false;
833
+ const threadId = normalizeOptionalString(params.threadId);
834
+ const { file } = params;
835
+ if (!threadId && [
888
836
  file.channels,
889
837
  file.groups,
890
838
  file.ims
891
- ]) {
892
- if (!Array.isArray(group)) continue;
893
- for (const entry of group) {
894
- if (typeof entry !== "string") continue;
895
- const normalized = normalizeOptionalString(entry);
896
- if (normalized) ids.add(normalized);
897
- }
898
- }
899
- return ids;
900
- }
901
- function collectSlackShareMaps(file) {
902
- if (!file.shares || typeof file.shares !== "object" || Array.isArray(file.shares)) return [];
903
- const shares = file.shares;
904
- return [shares.public, shares.private].filter((value) => Boolean(value) && typeof value === "object" && !Array.isArray(value));
905
- }
906
- function collectSlackShares(file) {
907
- const shares = [];
908
- for (const shareMap of collectSlackShareMaps(file)) for (const [rawChannelId, rawEntries] of Object.entries(shareMap)) {
909
- const channelId = normalizeOptionalString(rawChannelId);
910
- if (!channelId || !Array.isArray(rawEntries)) continue;
911
- for (const rawEntry of rawEntries) {
912
- if (!rawEntry || typeof rawEntry !== "object" || Array.isArray(rawEntry)) continue;
913
- const entry = rawEntry;
914
- const ts = typeof entry.ts === "string" ? normalizeOptionalString(entry.ts) : void 0;
915
- const threadTs = typeof entry.thread_ts === "string" ? normalizeOptionalString(entry.thread_ts) : void 0;
916
- if (ts || threadTs) shares.push({
917
- channelId,
918
- ts,
919
- threadTs
920
- });
921
- }
922
- }
923
- return shares;
924
- }
925
- function lacksSlackScopeProof(params) {
926
- const channelId = normalizeOptionalString(params.channelId);
927
- if (!channelId) return true;
928
- const threadId = normalizeOptionalString(params.threadId);
929
- const directIds = collectSlackDirectShareChannelIds(params.file);
930
- const shares = collectSlackShares(params.file);
931
- if (!(directIds.has(channelId) || shares.some((entry) => entry.channelId === channelId))) return true;
932
- if (!threadId) return false;
933
- return !shares.some((entry) => entry.channelId === channelId && (entry.threadTs === threadId || entry.ts === threadId));
839
+ ].some((group) => Array.isArray(group) && group.some((entry) => normalizeOptionalString(entry) === channelId))) return true;
840
+ if (!isRecord(file.shares)) return false;
841
+ return [file.shares.public, file.shares.private].some((shareMap) => isRecord(shareMap) && Object.entries(shareMap).some(([sharedChannelId, entries]) => normalizeOptionalString(sharedChannelId) === channelId && Array.isArray(entries) && entries.some((entry) => {
842
+ if (!isRecord(entry)) return false;
843
+ const ts = normalizeOptionalString(entry.ts);
844
+ const threadTs = normalizeOptionalString(entry.thread_ts);
845
+ return threadId ? ts === threadId || threadTs === threadId : Boolean(ts || threadTs);
846
+ })));
934
847
  }
935
848
  /**
936
849
  * Downloads a Slack file by ID and saves it to the local media store.
@@ -940,7 +853,7 @@ function lacksSlackScopeProof(params) {
940
853
  async function downloadSlackFile(fileId, opts) {
941
854
  const token = resolveToken(opts.token, opts.accountId, opts.cfg);
942
855
  const client = await getClient(opts);
943
- const isFileAllowed = (file) => !lacksSlackScopeProof({
856
+ const isFileAllowed = (file) => hasSlackScopeProof({
944
857
  file,
945
858
  channelId: opts.channelId,
946
859
  threadId: opts.threadId
@@ -963,4 +876,4 @@ async function downloadSlackFile(fileId, opts) {
963
876
  }))?.[0] ?? null;
964
877
  }
965
878
  //#endregion
966
- export { hasSlackMessageTableBlock as C, resolveSlackMessageText as D, resolveSlackBlocksText as E, buildSlackEditTextPayload as O, formatSlackFileReferenceList as S, isSlackUnfurlAttachment as T, media_exports as _, editSlackRenderedMessage as a, saveRemoteMedia as b, listSlackPins as c, reactSlackMessage as d, readSlackMessages as f, unpinSlackMessage as g, sendSlackMessage as h, editSlackMessage as i, listSlackReactions as l, removeSlackReaction as m, deleteSlackMessage as n, getSlackMemberInfo as o, removeOwnSlackReactions as p, downloadSlackFile as r, listSlackEmojis as s, actions_exports as t, pinSlackMessage as u, logVerbose$1 as v, hasSlackTableBlock as w, formatSlackFileReference as x, isGovSlackClient as y };
879
+ export { hasSlackTableBlock as C, buildSlackEditTextPayload as D, resolveSlackMessageText as E, hasSlackMessageTableBlock as S, resolveSlackBlocksText as T, media_exports as _, editSlackRenderedMessage as a, formatSlackFileReference as b, listSlackPins as c, reactSlackMessage as d, readSlackMessages as f, unpinSlackMessage as g, sendSlackMessage as h, editSlackMessage as i, listSlackReactions as l, removeSlackReaction as m, deleteSlackMessage as n, getSlackMemberInfo as o, removeOwnSlackReactions as p, downloadSlackFile as r, listSlackEmojis as s, actions_exports as t, pinSlackMessage as u, isGovSlackClient as v, isSlackUnfurlAttachment as w, formatSlackFileReferenceList as x, saveRemoteMedia as y };