@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.
- package/assets/icon.png +0 -0
- package/dist/.setup/{account-inspect-DP1Bcwj4.mjs → account-inspect-DWBXpER6.mjs} +1 -1
- package/dist/.setup/{accounts-BBHvg0pY.mjs → accounts-D_N9IqNA.mjs} +23 -1
- package/dist/.setup/{action-runtime-B01d85zt.mjs → action-runtime-DfWvuiZd.mjs} +26 -41
- package/dist/.setup/action-runtime.runtime-Ck4bAWOX.mjs +2 -0
- package/dist/.setup/{actions-DKCtBgCI.mjs → actions-Df0CzcDl.mjs} +88 -175
- package/dist/.setup/{approval-handler.runtime-DMszKn_7.mjs → approval-handler.runtime-Ed6Sw5VK.mjs} +37 -47
- package/dist/.setup/{approval-message-updates-Tb_qRokK.mjs → approval-message-updates-BadvtA7R.mjs} +1 -2
- package/dist/.setup/{channel-CErYZ5zw.mjs → channel-C7bgPSTE.mjs} +181 -273
- package/dist/.setup/channel-meta-C443t-lI.mjs +27 -0
- package/dist/.setup/{channel-type-Dxk8VJUb.mjs → channel-type-ClOttrZ5.mjs} +13 -21
- package/dist/.setup/{channel.setup-BVoUtdPn.mjs → channel.setup-Dh2jzAjN.mjs} +35 -42
- package/dist/.setup/{config-schema-CyL279e7.mjs → config-schema-BZCxmHKG.mjs} +24 -21
- package/dist/.setup/{directory-config-CQTSH45W.mjs → directory-config-BOUWH3hR.mjs} +7 -10
- package/dist/.setup/{directory-live-BCcj89QV.mjs → directory-live-B2O4B_Ho.mjs} +9 -21
- package/dist/.setup/doctor-contract-CRN1Z_c7.mjs +342 -0
- package/dist/.setup/{message-tool-api-C0PTFaNV.mjs → message-tool-api-Cu4lwlGy.mjs} +34 -48
- package/dist/.setup/{provider-C-jPaGt2.mjs → monitor-BPVfkumU.mjs} +2181 -2693
- package/dist/.setup/{outbound-adapter-A7Wdn8ZT.mjs → outbound-adapter-Bv48XUjq.mjs} +10 -21
- package/dist/.setup/{pipeline.runtime-BlPOexmJ.mjs → pipeline.runtime-B1H63Frf.mjs} +311 -457
- package/dist/.setup/{plugin-routes-C3X0eVaK.mjs → plugin-routes-B8tooDLj.mjs} +1 -1
- package/dist/.setup/{policy-BApW53pI.mjs → policy-D-jfM174.mjs} +5 -5
- package/dist/.setup/{probe-DiYIMPJo.mjs → probe-B2Y9qc_z.mjs} +101 -39
- package/dist/.setup/{registry-bbjH7IHX.mjs → registry-CIbMfuf8.mjs} +6 -2
- package/dist/.setup/{relay-source-DfOnjJTE.mjs → relay-source-BpKdjsll.mjs} +10 -12
- package/dist/.setup/{replies-BBAJxUOQ.mjs → replies-BAnUtr2f.mjs} +16 -76
- package/dist/.setup/{reply-blocks-Bm8kf6mK.mjs → reply-blocks-SE1kTE3I.mjs} +27 -154
- package/dist/.setup/{resolve-channels-BXbMBbJD.mjs → resolve-channels-XXBn8UU_.mjs} +4 -5
- package/dist/.setup/{resolve-users-65WqvIqD.mjs → resolve-users-DW0ngD03.mjs} +20 -22
- package/dist/.setup/{scopes-h3YB-mMs.mjs → scopes-CasuDvaa.mjs} +6 -17
- package/dist/.setup/{secret-contract-DxmvbxBF.mjs → secret-contract-BaZcu6P_.mjs} +15 -20
- package/dist/.setup/{secret-contract-api-D9UfYujm.mjs → secret-contract-api-Dp6290Vg.mjs} +1 -1
- package/dist/.setup/{security-audit-BypHqcq5.mjs → security-audit-BqDc-6VL.mjs} +1 -1
- package/dist/.setup/{send-Cp6omkOg.mjs → send-BOVLQi3n.mjs} +84 -171
- package/dist/.setup/{session-status-Cf7AvWOt.mjs → session-status-DscajIsd.mjs} +315 -238
- package/dist/.setup/{setup-plugin-api-dLPkL06L.mjs → setup-plugin-api-DTtbTKNk.mjs} +1 -1
- package/dist/.setup/{setup-surface-D3DLcCxu.mjs → setup-surface-Dn7QgWRE.mjs} +24 -56
- package/dist/.setup/{shared-CJ3arAFL.mjs → shared-qau-uDGl.mjs} +30 -56
- package/dist/.setup/{slash-dispatch.runtime-HFy_XvyO.mjs → slash-dispatch.runtime--AEzLVBF.mjs} +1 -1
- package/dist/.setup/{streaming-compat-B-e0mqM0.mjs → streaming-compat-C5Wut626.mjs} +31 -8
- package/dist/.setup/{target-parsing-DEsPjngB.mjs → target-parsing-FFE26kOV.mjs} +1 -7
- package/dist/.setup/{targets-Cku2KCvg.mjs → targets-C6LZQL1Q.mjs} +1 -1
- package/dist/.setup/{thread-ts-CukseRVL.mjs → thread-ts-Cvt7WD6B.mjs} +0 -1
- package/dist/account-inspect-api.js +1 -1
- package/dist/api.js +18 -17
- package/dist/channel-config-api.js +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/doctor-contract-api.js +1 -1
- package/dist/http-routes-api.js +1 -1
- package/dist/index.js +1 -1
- package/dist/message-tool-api.js +1 -1
- package/dist/runtime-api.js +11 -12
- package/dist/secret-contract-api.js +1 -1
- package/dist/security-contract-api.js +1 -1
- package/dist/setup-entry.js +2 -2
- package/dist/setup-plugin-api.js +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/README.md +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/child_process.d.ts +1 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/crypto.d.ts +20 -8
- package/node_modules/@slack/bolt/node_modules/@types/node/ffi.d.ts +14 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/http2.d.ts +3 -2
- package/node_modules/@slack/bolt/node_modules/@types/node/net.d.ts +16 -4
- package/node_modules/@slack/bolt/node_modules/@types/node/package.json +2 -2
- package/node_modules/@slack/bolt/node_modules/@types/node/process.d.ts +1 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/quic.d.ts +39 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/stream/iter.d.ts +9 -12
- package/node_modules/@slack/bolt/node_modules/@types/node/test/reporters.d.ts +1 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/test.d.ts +72 -0
- package/node_modules/@slack/bolt/node_modules/@types/node/tls.d.ts +14 -10
- package/node_modules/@slack/bolt/node_modules/@types/node/vm.d.ts +2 -1
- package/node_modules/@slack/bolt/node_modules/@types/node/worker_threads.d.ts +4 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/README.md +1 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/child_process.d.ts +1 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/crypto.d.ts +20 -8
- package/node_modules/@slack/web-api/node_modules/@types/node/ffi.d.ts +14 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/http2.d.ts +3 -2
- package/node_modules/@slack/web-api/node_modules/@types/node/net.d.ts +16 -4
- package/node_modules/@slack/web-api/node_modules/@types/node/package.json +2 -2
- package/node_modules/@slack/web-api/node_modules/@types/node/process.d.ts +1 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/quic.d.ts +39 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/stream/iter.d.ts +9 -12
- package/node_modules/@slack/web-api/node_modules/@types/node/test/reporters.d.ts +1 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/test.d.ts +72 -0
- package/node_modules/@slack/web-api/node_modules/@types/node/tls.d.ts +14 -10
- package/node_modules/@slack/web-api/node_modules/@types/node/vm.d.ts +2 -1
- package/node_modules/@slack/web-api/node_modules/@types/node/worker_threads.d.ts +4 -1
- package/node_modules/get-east-asian-width/index.js +8 -3
- package/node_modules/get-east-asian-width/lookup-data.js +1 -1
- package/node_modules/get-east-asian-width/lookup.js +4 -4
- package/node_modules/get-east-asian-width/package.json +1 -1
- package/node_modules/typebox/build/compile/code.mjs +1 -2
- package/node_modules/typebox/build/compile/validator.mjs +5 -1
- package/node_modules/typebox/build/format/iri.mjs +16 -9
- package/node_modules/typebox/build/guard/emit.mjs +2 -2
- package/node_modules/typebox/build/guard/guard.d.mts +7 -5
- package/node_modules/typebox/build/guard/guard.mjs +14 -9
- package/node_modules/typebox/build/guard/index.mjs +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
- package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
- package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
- package/node_modules/typebox/build/schema/build.mjs +2 -3
- package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
- package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
- package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
- package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
- package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
- package/node_modules/typebox/build/schema/parse.mjs +3 -0
- package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
- package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
- package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
- package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
- package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
- package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
- package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
- package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
- package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
- package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
- package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +3 -1
- package/node_modules/undici/README.md +81 -25
- package/node_modules/undici/docs/docs/api/Agent.md +249 -42
- package/node_modules/undici/docs/docs/api/BalancedPool.md +246 -48
- package/node_modules/undici/docs/docs/api/CacheStorage.md +171 -13
- package/node_modules/undici/docs/docs/api/CacheStore.md +294 -98
- package/node_modules/undici/docs/docs/api/Client.md +407 -162
- package/node_modules/undici/docs/docs/api/ClientStats.md +80 -14
- package/node_modules/undici/docs/docs/api/Connector.md +118 -35
- package/node_modules/undici/docs/docs/api/ContentType.md +65 -25
- package/node_modules/undici/docs/docs/api/Cookies.md +122 -71
- package/node_modules/undici/docs/docs/api/Debug.md +34 -18
- package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +364 -164
- package/node_modules/undici/docs/docs/api/Dispatcher.md +490 -1055
- package/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +105 -93
- package/node_modules/undici/docs/docs/api/Errors.md +503 -28
- package/node_modules/undici/docs/docs/api/EventSource.md +326 -13
- package/node_modules/undici/docs/docs/api/Fetch.md +681 -30
- package/node_modules/undici/docs/docs/api/GlobalInstallation.md +78 -96
- package/node_modules/undici/docs/docs/api/H2CClient.md +298 -176
- package/node_modules/undici/docs/docs/api/Interceptors.md +418 -0
- package/node_modules/undici/docs/docs/api/MockAgent.md +333 -314
- package/node_modules/undici/docs/docs/api/MockCallHistory.md +272 -98
- package/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +189 -26
- package/node_modules/undici/docs/docs/api/MockClient.md +151 -33
- package/node_modules/undici/docs/docs/api/MockErrors.md +56 -5
- package/node_modules/undici/docs/docs/api/MockPool.md +321 -258
- package/node_modules/undici/docs/docs/api/Pool.md +236 -41
- package/node_modules/undici/docs/docs/api/PoolStats.md +119 -13
- package/node_modules/undici/docs/docs/api/ProxyAgent.md +179 -160
- package/node_modules/undici/docs/docs/api/RedirectHandler.md +238 -55
- package/node_modules/undici/docs/docs/api/RetryAgent.md +113 -27
- package/node_modules/undici/docs/docs/api/RetryHandler.md +161 -79
- package/node_modules/undici/docs/docs/api/RoundRobinPool.md +166 -72
- package/node_modules/undici/docs/docs/api/SnapshotAgent.md +262 -517
- package/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +177 -196
- package/node_modules/undici/docs/docs/api/Util.md +68 -11
- package/node_modules/undici/docs/docs/api/WebSocket.md +475 -80
- package/node_modules/undici/docs/docs/api/api-lifecycle.md +100 -32
- package/node_modules/undici/docs/docs/best-practices/client-certificate.md +2 -0
- package/node_modules/undici/docs/docs/best-practices/crawling.md +3 -1
- package/node_modules/undici/docs/docs/best-practices/migrating-from-v7-to-v8.md +233 -0
- package/node_modules/undici/docs/docs/best-practices/mocking-request.md +9 -7
- package/node_modules/undici/docs/docs/best-practices/proxy.md +3 -1
- package/node_modules/undici/docs/docs/best-practices/undici-vs-builtin-fetch.md +10 -8
- package/node_modules/undici/docs/docs/best-practices/writing-tests.md +2 -0
- package/node_modules/undici/docs/docs/getting-started.md +281 -0
- package/node_modules/undici/docs/docs/index.md +784 -0
- package/node_modules/undici/docs/docs/site.json +125 -0
- package/node_modules/undici/docs/docs/type-map.json +79 -0
- package/node_modules/undici/index.js +4 -2
- package/node_modules/undici/lib/api/api-connect.js +13 -11
- package/node_modules/undici/lib/api/api-pipeline.js +26 -13
- package/node_modules/undici/lib/api/api-request.js +51 -21
- package/node_modules/undici/lib/api/api-stream.js +81 -20
- package/node_modules/undici/lib/api/api-upgrade.js +21 -11
- package/node_modules/undici/lib/api/readable.js +45 -9
- package/node_modules/undici/lib/cache/memory-cache-store.js +3 -3
- package/node_modules/undici/lib/cache/sqlite-cache-store.js +3 -1
- package/node_modules/undici/lib/core/connect.js +46 -7
- package/node_modules/undici/lib/core/constants.js +1 -24
- package/node_modules/undici/lib/core/errors.js +22 -2
- package/node_modules/undici/lib/core/request.js +100 -18
- package/node_modules/undici/lib/core/symbols.js +4 -0
- package/node_modules/undici/lib/core/util.js +105 -48
- package/node_modules/undici/lib/dispatcher/agent.js +51 -32
- package/node_modules/undici/lib/dispatcher/balanced-pool.js +23 -27
- package/node_modules/undici/lib/dispatcher/client-h1.js +86 -24
- package/node_modules/undici/lib/dispatcher/client-h2.js +1091 -361
- package/node_modules/undici/lib/dispatcher/client.js +109 -36
- package/node_modules/undici/lib/dispatcher/dispatcher-base.js +19 -6
- package/node_modules/undici/lib/dispatcher/dispatcher.js +15 -5
- package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +110 -0
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +37 -8
- package/node_modules/undici/lib/dispatcher/h2c-client.js +4 -4
- package/node_modules/undici/lib/dispatcher/pool-base.js +28 -10
- package/node_modules/undici/lib/dispatcher/pool.js +30 -5
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +95 -19
- package/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
- package/node_modules/undici/lib/dispatcher/round-robin-pool.js +32 -10
- package/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +153 -63
- package/node_modules/undici/lib/global.js +37 -14
- package/node_modules/undici/lib/handler/cache-handler.js +49 -7
- package/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
- package/node_modules/undici/lib/handler/decorator-handler.js +8 -3
- package/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
- package/node_modules/undici/lib/handler/redirect-handler.js +66 -66
- package/node_modules/undici/lib/handler/retry-handler.js +191 -50
- package/node_modules/undici/lib/interceptor/cache.js +75 -25
- package/node_modules/undici/lib/interceptor/decompress.js +5 -2
- package/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
- package/node_modules/undici/lib/interceptor/dns.js +12 -1
- package/node_modules/undici/lib/interceptor/redirect.js +3 -3
- package/node_modules/undici/lib/llhttp/llhttp-wasm.js +1 -1
- package/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +1 -1
- package/node_modules/undici/lib/mock/mock-agent.js +21 -9
- package/node_modules/undici/lib/mock/mock-call-history.js +1 -1
- package/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
- package/node_modules/undici/lib/mock/mock-utils.js +281 -47
- package/node_modules/undici/lib/mock/snapshot-agent.js +25 -7
- package/node_modules/undici/lib/mock/snapshot-recorder.js +38 -3
- package/node_modules/undici/lib/util/cache.js +92 -10
- package/node_modules/undici/lib/util/runtime-features.js +3 -34
- package/node_modules/undici/lib/web/cache/cache.js +6 -8
- package/node_modules/undici/lib/web/cookies/parse.js +150 -146
- package/node_modules/undici/lib/web/cookies/util.js +1 -1
- package/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
- package/node_modules/undici/lib/web/eventsource/eventsource.js +20 -21
- package/node_modules/undici/lib/web/eventsource/util.js +32 -1
- package/node_modules/undici/lib/web/fetch/body.js +48 -10
- package/node_modules/undici/lib/web/fetch/constants.js +1 -1
- package/node_modules/undici/lib/web/fetch/formdata.js +21 -2
- package/node_modules/undici/lib/web/fetch/index.js +242 -223
- package/node_modules/undici/lib/web/fetch/request.js +35 -6
- package/node_modules/undici/lib/web/fetch/response.js +1 -3
- package/node_modules/undici/lib/web/fetch/util.js +10 -2
- package/node_modules/undici/lib/web/webidl/index.js +5 -7
- package/node_modules/undici/lib/web/websocket/frame.js +1 -7
- package/node_modules/undici/lib/web/websocket/receiver.js +1 -1
- package/node_modules/undici/lib/web/websocket/stream/websocketstream.js +10 -10
- package/node_modules/undici/lib/web/websocket/websocket.js +25 -3
- package/node_modules/undici/package.json +10 -10
- package/node_modules/undici/types/agent.d.ts +0 -2
- package/node_modules/undici/types/client.d.ts +69 -24
- package/node_modules/undici/types/connector.d.ts +1 -0
- package/node_modules/undici/types/cookies.d.ts +1 -1
- package/node_modules/undici/types/dispatcher.d.ts +8 -30
- package/node_modules/undici/types/dispatcher1-wrapper.d.ts +7 -0
- package/node_modules/undici/types/errors.d.ts +10 -0
- package/node_modules/undici/types/fetch.d.ts +5 -1
- package/node_modules/undici/types/formdata.d.ts +0 -6
- package/node_modules/undici/types/h2c-client.d.ts +6 -6
- package/node_modules/undici/types/handlers.d.ts +2 -0
- package/node_modules/undici/types/header.d.ts +5 -0
- package/node_modules/undici/types/index.d.ts +3 -1
- package/node_modules/undici/types/interceptors.d.ts +1 -1
- package/node_modules/undici/types/mock-agent.d.ts +11 -10
- package/node_modules/undici/types/mock-interceptor.d.ts +5 -1
- package/node_modules/undici/types/pool.d.ts +0 -2
- package/node_modules/undici/types/proxy-agent.d.ts +9 -2
- package/node_modules/undici/types/round-robin-pool.d.ts +0 -2
- package/node_modules/undici/types/snapshot-agent.d.ts +4 -0
- package/node_modules/undici/types/socks5-proxy-agent.d.ts +4 -2
- package/node_modules/undici/types/webidl.d.ts +0 -1
- package/openclaw.plugin.json +31 -3
- package/package.json +7 -7
- package/dist/.setup/accounts.runtime-DN-PPocC.mjs +0 -2
- package/dist/.setup/action-runtime.runtime-C8R8CUan.mjs +0 -2
- package/dist/.setup/doctor-contract-CtMUqjvk.mjs +0 -186
- package/dist/.setup/monitor-_Sht7Dqy.mjs +0 -13
- package/dist/.setup/rolldown-runtime-D7D4PA-g.mjs +0 -13
- package/dist/.setup/send.runtime-B4caZU6T.mjs +0 -2
- package/dist/.setup/slash-commands.runtime-BpSH0b3q.mjs +0 -2
- package/dist/.setup/slash-skill-commands.runtime-Bi1JWZHY.mjs +0 -2
- package/node_modules/undici/lib/handler/unwrap-handler.js +0 -106
- package/node_modules/undici/lib/handler/wrap-handler.js +0 -105
- package/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/node_modules/undici/lib/util/promise.js +0 -28
- /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
|
|
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 {
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as resolveSlackChannelConfig, t as isSlackChannelAllowedByPolicy } from "./policy-
|
|
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-
|
|
30
|
+
const loadSlackActionsRuntime = createLazyRuntimeModule(() => import("./actions-Df0CzcDl.mjs").then((n) => n.t));
|
|
31
31
|
const bindSlackAction = createLazyRuntimeMethodBinder(loadSlackActionsRuntime);
|
|
32
|
-
const loadSlackAccountsRuntime = createLazyRuntimeModule(() => import("./accounts
|
|
33
|
-
const loadSlackChannelTypeRuntime = createLazyRuntimeModule(() => import("./channel-type-
|
|
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:
|
|
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 =
|
|
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
|
|
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
|
-
...
|
|
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 =
|
|
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 (!
|
|
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);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
|
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) =>
|
|
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 =
|
|
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 (
|
|
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 ?
|
|
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
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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 (!
|
|
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 ${
|
|
277
|
-
},
|
|
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
|
|
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
|
|
326
|
+
logVerbose(`slack: refreshed file URL via files.info for file id=${params.file.id}`);
|
|
332
327
|
return freshUrl;
|
|
333
328
|
}
|
|
334
|
-
logVerbose
|
|
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
|
|
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
|
-
|
|
348
|
-
|
|
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
|
|
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
|
-
|
|
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) =>
|
|
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
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
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
|
|
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
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
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 (!
|
|
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
|
-
|
|
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) =>
|
|
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
|
|
886
|
-
const
|
|
887
|
-
|
|
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
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
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) =>
|
|
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 {
|
|
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 };
|