---
name: Bolt JS
slug: slack-bolt-js
type: github
source_url: https://github.com/slackapi/bolt-js
organization: Slack
organization_slug: slack
total_releases: 86
latest_version: @slack/bolt@4.7.0
latest_date: 2026-04-06
last_updated: 2026-04-19
tracking_since: 2019-04-24
canonical: https://releases.sh/slack/slack-bolt-js
organization_url: https://releases.sh/slack
---

<Release version="@slack/bolt@4.7.0" date="April 6, 2026" published="2026-04-06T22:28:48.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.7.0">
## What's Changed

Bring magic to a conversation with `sayStream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `setStatus`. Now available for `app.event` and `app.message` listeners:

```ts
app.event('app_mention', async ({ sayStream, setStatus }) => {
  setStatus({
    status: 'Thinking...',
    loading_messages: ['Waking up...', 'Loading a witty response...'],
  });
  const stream = sayStream({ buffer_size: 100 });
  await stream.append({ markdown_text: 'Thinking... :thinking_face:\n\n' });
  await stream.append({ markdown_text: 'Here is my response!' });
  await stream.stop();
});
```

The `respond` function now accepts `thread_ts` to publish responses in a thread:

```ts
app.action('my_action', async ({ ack, respond }) => {
  await ack();
  await respond({ text: 'Replying in thread!', thread_ts: '1234567890.123456' });
});
```

Configure ping timeouts, reconnect behavior, and other Socket Mode settings directly through `App` options:

```ts
const app = new App({
  socketMode: true,
  appToken: process.env.SLACK_APP_TOKEN,
  token: process.env.SLACK_BOT_TOKEN,
  clientPingTimeout: 15000,
  serverPingTimeout: 60000,
  pingPongLoggingEnabled: true,
});
```


### 👾 Enhancements

- feat: add support for sayStream listener argument in #2841 - Thanks @WilliamBergamin!
- feat: surface the setStatus argument to listeners if required event details are available in #2843 - Thanks @WilliamBergamin!
- Add thread_ts to RespondFn type in #2732 - Thanks @misscoded!
- feat(SocketModeReceiver): expose Socket Mode timeout and reconnect options in #2786 - Thanks @shivasymbl!
- Enable esModuleInterop in tsconfig in #2719 - Thanks @misscoded!

### 🐛 Fixes

- fix: Improve ESM compatibility for named exports in #2724 - Thanks @grantjoy!
- Fixed edge case when there was error during authorize in #2753 - Thanks @shlomisas!

### 📚 Documentation

- docs: add "random fact generator" custom step workshop to tutorials in #2694 - Thanks @haleychaas!
- docs: rework ai tutorial to use openai provider and starter template in #2731 - Thanks @haleychaas!
- docs: Deploy with Vercel in #2767 - Thanks @haleychaas!
- docs: Add Vercel note about AI Gateway token needed only locally in #2781 - Thanks @haleychaas!
- Docs: Add headings so copy as markdown button shows up in #2796 - Thanks @haleychaas!
- docs: update links to tools reference pages to avoid redirects in #2722 - Thanks @zimeg!
- docs: updates outmoded links in #2737 - Thanks @lukegalbraithrussell!
- docs: updates outmoded steps from apps links in #2738 - Thanks @lukegalbraithrussell!

### 🧰 Maintenance

- refactor: consolidate event channel and thread extraction in #2830 - Thanks @WilliamBergamin!
- chore: consolidate context utility creators in #2828 - Thanks @WilliamBergamin!
- build: use pinned minimum supported node18 version for type checks in #2801 - Thanks @zimeg!
- build: include the package lockfile for custom receiver example in #2744 - Thanks @zimeg!
- ci: support node 24 in #2831 - Thanks @zimeg!
- ci: perform sample and example app tests on regression schedules in #2743 - Thanks @zimeg!
- ci(deps): auto-approve / auto-merge dependencies from dependabot in #2780 - Thanks @mwbrooks!
- chore: Add .github/CODEOWNERS file in #2718 - Thanks @mwbrooks!
- chore: add AGENTS.md in #2826 - Thanks @WilliamBergamin!
- chore(release): version @slack/bolt@4.7.0 in #2848 - Thanks @zimeg!

### 🎁 Dependencies

#### Core

- chore(deps): update @slack/types requirement from ^2.18.0 to ^2.19.0 in #2727 - Thanks @dependabot[bot]!
- chore(deps): update @slack/types requirement from ^2.19.0 to ^2.20.0 in #2790 - Thanks @dependabot[bot]!
- chore(deps): update @slack/types requirement from ^2.20.0 to ^2.20.1 in #2820 - Thanks @dependabot[bot]!
- chore(deps): update @slack/web-api requirement from ^7.12.0 to ^7.13.0 in #2730 - Thanks @dependabot[bot]!
- chore(deps): update @slack/web-api requirement from ^7.13.0 to ^7.14.1 in #2791 - Thanks @dependabot[bot]!
- chore(deps): update @slack/web-api requirement from ^7.14.1 to ^7.15.0 in #2817 - Thanks @dependabot[bot]!
- chore(deps): update @slack/socket-mode requirement from ^2.0.5 to ^2.0.6 in #2816 - Thanks @dependabot[bot]!
- chore(deps): update @slack/logger requirement from ^4.0.0 to ^4.0.1 in #2818 - Thanks @dependabot[bot]!
- chore(deps): update @slack/oauth requirement from ^3.0.4 to ^3.0.5 in #2819 - Thanks @dependabot[bot]!

<details>
<summary>CI</summary>

- chore(deps): bump actions/stale from 10.0.0 to 10.1.0 in #2706 - Thanks @dependabot[bot]!
- chore(deps): bump actions/stale from 10.1.0 to 10.1.1 in #2756 - Thanks @dependabot[bot]!
- chore(deps): bump actions/stale from 10.1.1 to 10.2.0 in #2804 - Thanks @dependabot[bot]!
- chore(deps): bump actions/setup-node from 5.0.0 to 6.0.0 in #2707 - Thanks @dependabot[bot]!
- chore(deps): bump actions/setup-node from 6.0.0 to 6.1.0 in #2757 - Thanks @dependabot[bot]!
- chore(deps): bump actions/setup-node from 6.1.0 to 6.2.0 in #2775 - Thanks @dependabot[bot]!
- chore(deps): bump actions/setup-node from 6.2.0 to 6.3.0 in #2833 - Thanks @dependabot[bot]!
- chore(deps): bump actions/checkout from 5.0.0 to 6.0.0 in #2729 - Thanks @dependabot[bot]!
- chore(deps): bump actions/checkout from 6.0.0 to 6.0.1 in #2758 - Thanks @dependabot[bot]!
- chore(deps): bump actions/checkout from 6.0.1 to 6.0.2 in #2774 - Thanks @dependabot[bot]!
- chore(deps): bump codecov/codecov-action from 5.5.1 to 5.5.2 in #2755 - Thanks @dependabot[bot]!
- chore(deps): bump codecov/codecov-action from 5.5.2 to 6.0.0 in #2834 - Thanks @dependabot[bot]!
- chore(deps): bump dependabot/fetch-metadata from 2.5.0 to 3.0.0 in #2835 - Thanks @dependabot[bot]!
- chore(deps): bump slackapi/slack-github-action from 2.1.1 to 3.0.1 in #2832 - Thanks @dependabot[bot]!

</details>


<details>
<summary>Dev</summary>

- chore(deps-dev): bump @types/node from 24.9.1 to 24.10.0 in #2708 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 24.10.0 to 24.10.1 in #2720 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 24.10.1 to 25.0.3 in #2746 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.0.6 to 25.0.9 in #2762 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.0.9 to 25.0.10 in #2769 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.0.10 to 25.2.0 in #2776 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.2.0 to 25.2.2 in #2782 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.2.2 to 25.2.3 in #2792 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.2.3 to 25.3.0 in #2798 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.3.0 to 25.3.3 in #2805 - Thanks @dependabot[bot]!

</details>

<details>
<summary>Examples</summary>

- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/socket-mode-oauth in #2716 - Thanks @dependabot[bot]!
- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/deploy-aws-lambda in #2709 - Thanks @dependabot[bot]!
- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/deploy-heroku in #2710 - Thanks @dependabot[bot]!
- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/getting-started-typescript in #2711 - Thanks @dependabot[bot]!
- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/message-metadata in #2712 - Thanks @dependabot[bot]!
- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/oauth in #2713 - Thanks @dependabot[bot]!
- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/oauth-express-receiver in #2714 - Thanks @dependabot[bot]!
- chore(deps): update @slack/bolt requirement from ^4.5.0 to ^4.6.0 in /examples/socket-mode in #2715 - Thanks @dependabot[bot]!
- chore(deps): bump @koa/router from 14.0.0 to 15.0.0 in /examples/custom-receiver in #2733 - Thanks @dependabot[bot]!
- chore(deps): bump @koa/router from 15.0.0 to 15.3.1 in /examples/custom-receiver in #2812 - Thanks @dependabot[bot]!
- chore(deps): bump @koa/router from 15.3.1 to 15.4.0 in /examples/custom-receiver in #2824 - Thanks @dependabot[bot]!
- chore(deps): bump @slack/oauth from 3.0.4 to 3.0.5 in /examples/custom-receiver in #2823 - Thanks @dependabot[bot]!
- chore(deps): bump ajv from 8.17.1 to 8.18.0 in /examples/custom-receiver in #2797 - Thanks @dependabot[bot]!
- chore(deps): bump axios from 1.13.2 to 1.13.5 in /examples/custom-receiver in #2785 - Thanks @dependabot[bot]!
- chore(deps): bump dotenv from 17.2.3 to 17.2.4 in /examples/custom-receiver in #2784 - Thanks @dependabot[bot]!
- chore(deps): bump dotenv from 17.2.4 to 17.3.1 in /examples/custom-receiver in #2793 - Thanks @dependabot[bot]!
- chore(deps): bump dotenv from 17.3.1 to 17.4.0 in /examples/custom-receiver in #2845 - Thanks @dependabot[bot]!
- chore(deps): bump fastify from 5.6.2 to 5.7.1 in /examples/custom-receiver in #2764 - Thanks @dependabot[bot]!
- chore(deps): bump fastify from 5.7.1 to 5.7.2 in /examples/custom-receiver in #2770 - Thanks @dependabot[bot]!
- chore(deps): bump fastify from 5.7.2 to 5.7.4 in /examples/custom-receiver in #2777 - Thanks @dependabot[bot]!
- chore(deps): bump fastify from 5.7.4 to 5.8.1 in /examples/custom-receiver in #2810 - Thanks @dependabot[bot]!
- chore(deps): bump fastify from 5.8.1 to 5.8.2 in /examples/custom-receiver in #2821 - Thanks @dependabot[bot]!
- chore(deps): bump fastify from 5.8.2 to 5.8.3 in /examples/custom-receiver in #2829 - Thanks @dependabot[bot]!
- chore(deps): bump fastify from 5.8.3 to 5.8.4 in /examples/custom-receiver in #2837 - Thanks @dependabot[bot]!
- chore(deps): bump koa from 3.1.1 to 3.1.2 in /examples/custom-receiver in #2803 - Thanks @dependabot[bot]!
- chore(deps): bump koa from 3.1.1 to 3.1.2 in /examples/custom-receiver in #2809 - Thanks @dependabot[bot]!
- chore(deps): bump koa from 3.1.2 to 3.2.0 in /examples/custom-receiver in #2846 - Thanks @dependabot[bot]!
- chore(deps): bump path-to-regexp from 8.3.0 to 8.4.0 in /examples/custom-receiver in #2842 - Thanks @dependabot[bot]!
- chore(deps): bump qs from 6.14.0 to 6.14.1 in /examples/custom-receiver in #2759 - Thanks @dependabot[bot]!
- chore(deps): bump qs from 6.14.1 to 6.14.2 in /examples/custom-receiver in #2787 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 24.10.4 to 25.0.3 in /examples/custom-receiver in #2748 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.0.6 to 25.0.9 in /examples/custom-receiver in #2763 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.0.9 to 25.0.10 in /examples/custom-receiver in #2771 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.0.10 to 25.2.0 in /examples/custom-receiver in #2778 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.2.0 to 25.2.2 in /examples/custom-receiver in #2783 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.2.2 to 25.2.3 in /examples/custom-receiver in #2794 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.2.3 to 25.3.0 in /examples/custom-receiver in #2799 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 25.3.2 to 25.3.3 in /examples/custom-receiver in #2806 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 22.19.11 to 22.19.13 in /examples/custom-receiver in #2808 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 22.19.13 to 22.19.15 in /examples/custom-receiver in #2811 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 22.19.15 to 24.12.0 in /examples/custom-receiver in #2836 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 24.12.0 to 24.12.2 in /examples/custom-receiver in #2844 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/koa from 3.0.1 to 3.0.2 in /examples/custom-receiver in #2825 - Thanks @dependabot[bot]!
- chore(deps-dev): bump @types/node from 24.10.4 to 25.0.3 in /examples/getting-started-typescript in #2750 - Thanks @dependabot[bot]!
- chore(deps-dev): bump typescript from 5.9.3 to 6.0.2 in /examples/getting-started-typescript in #2839 - Thanks @dependabot[bot]!
- chore(deps-dev): bump typescript from 5.9.3 to 6.0.2 in /examples/custom-receiver in #2838 - Thanks @dependabot[bot]!
- chore(deps-dev): update @tsconfig/node18 requirement from ^18.2.4 to ^18.2.5 in /examples/getting-started-typescript in #2721 - Thanks @dependabot[bot]!
- chore(deps-dev): update @tsconfig/node18 requirement from ^18.2.5 to ^18.2.6 in /examples/getting-started-typescript in #2726 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.22.0 to ^4.23.0 in /examples/deploy-aws-lambda in #2717 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.23.0 to ^4.25.0 in /examples/deploy-aws-lambda in #2725 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.25.0 to ^4.27.0 in /examples/deploy-aws-lambda in #2734 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.27.0 to ^4.28.0 in /examples/deploy-aws-lambda in #2741 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.28.0 to ^4.29.0 in /examples/deploy-aws-lambda in #2749 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.30.0 to ^4.31.0 in /examples/deploy-aws-lambda in #2765 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.31.0 to ^4.31.2 in /examples/deploy-aws-lambda in #2779 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.31.2 to ^4.32.0 in /examples/deploy-aws-lambda in #2795 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.32.0 to ^4.33.0 in /examples/deploy-aws-lambda in #2800 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless requirement from ^4.33.0 to ^4.33.3 in /examples/deploy-aws-lambda in #2847 - Thanks @dependabot[bot]!
- chore(deps-dev): update serverless-offline requirement from ^14.4.0 to ^14.5.0 in /examples/deploy-aws-lambda in #2807 - Thanks @dependabot[bot]!

</details>

## 👋 New Contributors 🎉 

- @grantjoy made their first contribution in https://github.com/slackapi/bolt-js/pull/2724
- @shlomisas made their first contribution in https://github.com/slackapi/bolt-js/pull/2753
- @shivasymbl made their first contribution in https://github.com/slackapi/bolt-js/pull/2786

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.6.0...@slack/bolt@4.7.0
**Milestone**: https://github.com/slackapi/bolt-js/milestone/61
**Package**: https://www.npmjs.com/package/@slack/bolt/v/4.7.0
</Release>

<Release version="@slack/bolt@4.6.0" date="October 28, 2025" published="2025-10-28T18:43:09.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.6.0">
### 📚 Changelog

* https://docs.slack.dev/changelog/2025/10/22/work-objects

## What's Changed

### 👾 Enhancements

* feat: add support for work objects in https://github.com/slackapi/bolt-js/pull/2652 - Thanks @vegeris! 
* feat: extend ack timeout for function executed events in https://github.com/slackapi/bolt-js/pull/2645 - Thanks @WilliamBergamin! 
* feat: add hasBeenCalled on complete & fail utility in https://github.com/slackapi/bolt-js/pull/2677 - Thanks @WilliamBergamin!

### 🐛 Bug fixes

* fix: anticipate optional chained parameters as undefined when parsing events details in https://github.com/slackapi/bolt-js/pull/2700 - Thanks @hello-ashleyintech!

### 📚 Documentation

* docs: add AI to quickstart in https://github.com/slackapi/bolt-js/pull/2676 - Thanks @haleychaas!

### 🤖 Dependencies

* chore(deps-dev): update serverless requirement from ^4.21.1 to ^4.22.0 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2704
* chore(deps-dev): bump @types/node from 24.8.1 to 24.9.1 in https://github.com/slackapi/bolt-js/pull/2703
* chore(deps-dev): bump @types/node from 24.7.2 to 24.8.1 in https://github.com/slackapi/bolt-js/pull/2692
* chore(deps-dev): update serverless requirement from ^4.20.2 to ^4.21.1 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2691
* chore(deps-dev): bump @types/node from 24.7.0 to 24.7.2 in https://github.com/slackapi/bolt-js/pull/2679
* chore(deps): update @slack/types requirement from ^2.17.0 to ^2.18.0 in https://github.com/slackapi/bolt-js/pull/2702
* chore(deps): update @slack/web-api requirement from ^7.11.0 to ^7.12.0 in https://github.com/slackapi/bolt-js/pull/2701
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/message-metadata in https://github.com/slackapi/bolt-js/pull/2687
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/socket-mode in https://github.com/slackapi/bolt-js/pull/2686
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/socket-mode-oauth in https://github.com/slackapi/bolt-js/pull/2685
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/oauth in https://github.com/slackapi/bolt-js/pull/2684
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/oauth-express-receiver in https://github.com/slackapi/bolt-js/pull/2683
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/getting-started-typescript in https://github.com/slackapi/bolt-js/pull/2682
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/deploy-heroku in https://github.com/slackapi/bolt-js/pull/2681
* chore(deps): update @slack/bolt requirement from ^4.4.0 to ^4.5.0 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2680

### 🧰 Maintenance

* chore(release): version @slack/bolt@4.6.0 in https://github.com/slackapi/bolt-js/pull/2705 - Thanks @vegeris!

**Milestone**: https://github.com/slackapi/bolt-js/milestone/60?closed=1
**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.5.0...@slack/bolt@4.6.0
**Package**: https://www.npmjs.com/package/@slack/bolt/v/4.6.0
</Release>

<Release version="@slack/bolt@4.5.0" date="October 7, 2025" published="2025-10-07T04:11:52.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.5.0">
## AI-Enabled Features: Loading States, Text Streaming, and Feedback Buttons

### 🍿 Preview

https://github.com/user-attachments/assets/bc16597b-1632-46bb-b7aa-fe22330daf84

### 📚 Changelog

* https://docs.slack.dev/changelog/2025/10/7/chat-streaming

### ⚡ Getting Started

Try the AI Agent Sample app to explore the AI-enabled features and existing Assistant helper:

```bash
# Create a new AI Agent app
$ slack create slack-ai-agent-app --template slack-samples/bolt-js-assistant-template
$ cd slack-ai-agent-app/

# Add your OPENAI_API_KEY
$ export OPENAI_API_KEY=sk-proj-ahM...

# Run the local dev server
$ slack run
```

After the app starts, send a message to the "slack-ai-agent-app" bot for a unique response.

### ⌛ Loading States

Loading states allows you to not only set the status (e.g. "My app is typing...") but also sprinkle some personality by cycling through a collection of loading messages:

#### Web Client SDK:

```javascript
app.event('message', async ({ client, context, event, logger }) => {
    // ...
    await client.assistant.threads.setStatus({
        channel_id: channelId,
        thread_ts: threadTs,
        status: 'thinking...',
        loading_messages: [
            'Teaching the hamsters to type faster…',
            'Untangling the internet cables…',
            'Consulting the office goldfish…',
            'Polishing up the response just for you…',
            'Convincing the AI to stop overthinking…',
        ],
    });

    // Start a new message stream
});
```

- https://docs.slack.dev/reference/methods/assistant.threads.setStatus

#### Assistant Class:

```javascript
const assistant = new Assistant({
    threadStarted: assistantThreadStarted,
    threadContextChanged: assistantThreadContextChanged,
    userMessage: async ({ client, context, logger, message, getThreadContext, say, setTitle, setStatus }) => {
        await setStatus({
            status: 'thinking...',
            loading_messages: [
                'Teaching the hamsters to type faster…',
                'Untangling the internet cables…',
                'Consulting the office goldfish…',
                'Polishing up the response just for you…',
                'Convincing the AI to stop overthinking…',
            ],
        });
    },
});
```

### 🔮 Text Streaming Helper

The `client.chatStream()` helper utility can be used to streamline calling the 3 text streaming methods:

```javascript
app.event('message', async ({ client, context, event, logger }) => {
    // ...

    // Start a new message stream
    const streamer = client.chatStream({
        channel: channelId,
        recipient_team_id: teamId,
        recipient_user_id: userId,
        thread_ts: threadTs,
    });

    // Loop over OpenAI response stream
    // https://platform.openai.com/docs/api-reference/responses/create
    for await (const chunk of llmResponse) {
        if (chunk.type === 'response.output_text.delta') {
            await streamer.append({
                markdown_text: chunk.delta,
            });
        }
    }

    // Stop the stream and attach feedback buttons
    await streamer.stop({ blocks: [feedbackBlock] });
});
```

- https://docs.slack.dev/tools/node-slack-sdk/reference/web-api/classes/WebClient#chatstream

### 🔠 Text Streaming Methods

Alternative to the Text Streaming Helper is to call the individual methods.

#### 1) `client.chat.startStream`

First, start a chat text stream to stream a response to any message:

```javascript
app.event('message', async ({ client, context, event, logger }) => {
    // ...
    const streamResponse = await client.chat.startStream({
        channel: channelId,
        recipient_team_id: teamId,
        recipient_user_id: userId,
        thread_ts: threadTs,
    });

    const streamTs = streamResponse.ts
```

- https://docs.slack.dev/reference/methods/chat.startStream

#### 2) `client.chat.appendStream`

After starting a chat text stream, you can then append text to it in chunks (often from your favourite LLM SDK) to convey a streaming effect:

```javascript
for await (const chunk of llmResponse) {
    if (chunk.type === 'response.output_text.delta') {
        await client.chat.appendSteam({
            channel: channelId,
            markdown_text: chunk.delta,
            ts: streamTs,
        });
    }
}
```

- https://docs.slack.dev/reference/methods/chat.appendStream

#### 3) `client.chat.stopStream`

Lastly, you can stop the chat text stream to finalize your message:

```javascript
await client.chat.stopStream({
    blocks: [feedbackBlock],
    channel: channelId,
    ts: streamTs,
});
```

- https://docs.slack.dev/reference/methods/chat.stopStream

### 👍🏻 Feedback Buttons

Add feedback buttons to the bottom of a message, after stopping a text stream, to gather user feedback:

```javascript
const feedbackBlock = {
    type: 'context_actions',
    elements: [{
        type: 'feedback_buttons',
        action_id: 'feedback',
        positive_button: {
            text: { type: 'plain_text', text: 'Good Response' },
            accessibility_label: 'Submit positive feedback on this response',
            value: 'good-feedback',
        },
        negative_button: {
            text: { type: 'plain_text', text: 'Bad Response' },
            accessibility_label: 'Submit negative feedback on this response',
            value: 'bad-feedback',
        },
    }],
};

// Using the Text Streaming Helper
await streamer.stop({ blocks: [feedbackBlock] });
```

```javascript
// Or, using the Text Streaming Method
await client.chat.stopStream({
    blocks: [feedbackBlock],
    channel: channelId,
    ts: streamTs,
});
```

- https://docs.slack.dev/reference/block-kit/blocks/context-actions-block/
- https://docs.slack.dev/reference/block-kit/block-elements/feedback-buttons-element/
- https://docs.slack.dev/reference/block-kit/block-elements/icon-button-element/

## What's Changed

### 👾 Enhancements

* feat: add ai-enabled features text streaming methods, feedback blocks, and loading state in https://github.com/slackapi/bolt-js/pull/2674 - Thanks @zimeg!

### 🐛 Bug fixes

* Fix: allows Assistant say function to properly pass metadata in https://github.com/slackapi/bolt-js/pull/2569 - Thanks @jamessimone!
* refactor: check payload type before extracting assistant thread info in https://github.com/slackapi/bolt-js/pull/2603 - Thanks @zimeg!
* fix: better ES module support for App class in https://github.com/slackapi/bolt-js/pull/2632 - Thanks @malewis5!
* fix(typescript): accept empty list of suggested prompts for the assistant class in https://github.com/slackapi/bolt-js/pull/2650 - Thanks @zimeg!

### 📚 Documentation

* docs(fix): redirect links for project package migration guides to the tools site in https://github.com/slackapi/bolt-js/pull/2539 - Thanks @zimeg!
* Docs: moved over custom steps dynamic options page.  in https://github.com/slackapi/bolt-js/pull/2552 - Thanks @technically-tracy!
* docs: updated nav in https://github.com/slackapi/bolt-js/pull/2564 - Thanks @technically-tracy!
* docs: rotate tokens on a separate schedule with the oauth package in https://github.com/slackapi/bolt-js/pull/2558 - Thanks @zimeg!
* docs: guide quick start app creation using the slack cli in https://github.com/slackapi/bolt-js/pull/2535 - Thanks @zimeg!
* Update event-listening.md in https://github.com/slackapi/bolt-js/pull/2584 - Thanks @jfbn!
* docs: Update language around AI apps in https://github.com/slackapi/bolt-js/pull/2606 - Thanks @haleychaas!
* docs: fix listener middleware function and use global middleware examples in https://github.com/slackapi/bolt-js/pull/2610 - Thanks @zimeg!
* docs: update ai hugging face tutorial examples in https://github.com/slackapi/bolt-js/pull/2613 - Thanks @zimeg!
* docs: guide building an app tutorial using the slack cli in https://github.com/slackapi/bolt-js/pull/2597 - Thanks @zimeg!
* docs: use the app logger in examples in https://github.com/slackapi/bolt-js/pull/2651 - Thanks @zimeg!
* docs: updates for combined quickstart in https://github.com/slackapi/bolt-js/pull/2661 - Thanks @haleychaas!

### 🤖 Dependencies

* Update axios dependency to version ^1.12.0 in https://github.com/slackapi/bolt-js/pull/2657 - Thanks @malewis5!
* chore(deps): update @slack/web-api requirement from ^7.9.1 to ^7.9.2 in https://github.com/slackapi/bolt-js/pull/2541 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/deploy-heroku in https://github.com/slackapi/bolt-js/pull/2542 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/getting-started-typescript in https://github.com/slackapi/bolt-js/pull/2543 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/oauth in https://github.com/slackapi/bolt-js/pull/2544 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/oauth-express-receiver in https://github.com/slackapi/bolt-js/pull/2545 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/socket-mode-oauth in https://github.com/slackapi/bolt-js/pull/2546 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2547 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/socket-mode in https://github.com/slackapi/bolt-js/pull/2548 - Thanks @dependabot[bot]!
* chore(deps): update @slack/bolt requirement from ^4.3.0 to ^4.4.0 in /examples/message-metadata in https://github.com/slackapi/bolt-js/pull/2549 - Thanks @dependabot[bot]!
* chore(deps): bump the docusaurus group in /docs with 5 updates in https://github.com/slackapi/bolt-js/pull/2553 - Thanks @dependabot[bot]!
* chore(deps): bump brace-expansion from 1.1.11 to 1.1.12 in /docs in https://github.com/slackapi/bolt-js/pull/2574 - Thanks @dependabot[bot]!
* chore(deps): update @slack/web-api requirement from ^7.9.2 to ^7.9.3 in https://github.com/slackapi/bolt-js/pull/2578 - Thanks @dependabot[bot]!
* chore(deps): bump dotenv from 16.6.1 to 17.0.0 in /examples/getting-started-typescript in https://github.com/slackapi/bolt-js/pull/2589 - Thanks @dependabot[bot]!
* chore(deps): bump dotenv from 16.6.1 to 17.0.0 in /examples/custom-receiver in https://github.com/slackapi/bolt-js/pull/2590 - Thanks @dependabot[bot]!
* chore(deps): update @slack/types requirement from ^2.14.0 to ^2.15.0 in https://github.com/slackapi/bolt-js/pull/2600 - Thanks @dependabot[bot]!
* chore(deps): bump on-headers and compression in /docs in https://github.com/slackapi/bolt-js/pull/2607 - Thanks @dependabot[bot]!
* chore(deps): bump slackapi/slack-github-action from 2.1.0 to 2.1.1 in https://github.com/slackapi/bolt-js/pull/2615 - Thanks @dependabot[bot]!
* chore(deps): bump @koa/router from 13.1.1 to 14.0.0 in /examples/custom-receiver in https://github.com/slackapi/bolt-js/pull/2622 - Thanks @dependabot[bot]!
* chore(deps): update @slack/types requirement from ^2.15.0 to ^2.16.0 in https://github.com/slackapi/bolt-js/pull/2633 - Thanks @dependabot[bot]!
* chore(deps): update @slack/web-api requirement from ^7.9.3 to ^7.10.0 in https://github.com/slackapi/bolt-js/pull/2634 - Thanks @dependabot[bot]!
* chore(deps): bump codecov/codecov-action from 5.4.3 to 5.5.0 in https://github.com/slackapi/bolt-js/pull/2643 - Thanks @dependabot[bot]!
* chore(deps): bump actions/checkout from 4.2.2 to 5.0.0 in https://github.com/slackapi/bolt-js/pull/2642 - Thanks @dependabot[bot]!
* chore(deps): update @slack/socket-mode requirement from ^2.0.4 to ^2.0.5 in https://github.com/slackapi/bolt-js/pull/2646 - Thanks @dependabot[bot]!
* chore(deps): update @slack/oauth requirement from ^3.0.3 to ^3.0.4 in https://github.com/slackapi/bolt-js/pull/2647 - Thanks @dependabot[bot]!
* chore(deps): bump codecov/codecov-action from 5.5.0 to 5.5.1 in https://github.com/slackapi/bolt-js/pull/2662 - Thanks @dependabot[bot]!
* chore(deps): bump actions/stale from 9.1.0 to 10.0.0 in https://github.com/slackapi/bolt-js/pull/2663 - Thanks @dependabot[bot]!
* chore(deps): bump actions/setup-node from 4.4.0 to 5.0.0 in https://github.com/slackapi/bolt-js/pull/2664 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 22.15.19 to 22.15.21 in https://github.com/slackapi/bolt-js/pull/2540 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.14.3 to ^4.14.4 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2554 - Thanks @dependabot[bot]!
* chore(deps-dev): bump stylelint from 16.19.1 to 16.20.0 in /docs in https://github.com/slackapi/bolt-js/pull/2561 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.14.4 to ^4.15.1 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2562 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 22.15.21 to 22.15.29 in https://github.com/slackapi/bolt-js/pull/2563 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 22.15.29 to 22.15.30 in https://github.com/slackapi/bolt-js/pull/2566 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.15.1 to ^4.17.0 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2567 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 22.15.30 to 24.0.3 in https://github.com/slackapi/bolt-js/pull/2570 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 22.15.32 to 24.0.3 in /examples/getting-started-typescript in https://github.com/slackapi/bolt-js/pull/2571 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 22.15.32 to 24.0.3 in /examples/custom-receiver in https://github.com/slackapi/bolt-js/pull/2572 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.17.0 to ^4.17.1 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2577 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.0.3 to 24.0.7 in https://github.com/slackapi/bolt-js/pull/2591 - Thanks @dependabot[bot]!
* chore(deps-dev): bump stylelint from 16.20.0 to 16.21.0 in /docs in https://github.com/slackapi/bolt-js/pull/2593 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.0.7 to 24.0.10 in https://github.com/slackapi/bolt-js/pull/2594 - Thanks @dependabot[bot]!
* chore(deps-dev): bump stylelint from 16.21.0 to 16.21.1 in /docs in https://github.com/slackapi/bolt-js/pull/2596 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.0.10 to 24.0.14 in https://github.com/slackapi/bolt-js/pull/2604 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.0.14 to 24.0.15 in https://github.com/slackapi/bolt-js/pull/2609 - Thanks @dependabot[bot]!
* chore(deps-dev): bump stylelint-config-standard from 38.0.0 to 39.0.0 in /docs in https://github.com/slackapi/bolt-js/pull/2617 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.0.15 to 24.2.0 in https://github.com/slackapi/bolt-js/pull/2619 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.17.1 to ^4.17.2 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2621 - Thanks @dependabot[bot]!
* chore(deps-dev): bump typescript from 5.8.3 to 5.9.2 in /examples/custom-receiver in https://github.com/slackapi/bolt-js/pull/2620 - Thanks @dependabot[bot]!
* chore(deps-dev): bump typescript from 5.8.3 to 5.9.2 in /examples/getting-started-typescript in https://github.com/slackapi/bolt-js/pull/2623 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.17.2 to ^4.18.0 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2624 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.2.0 to 24.2.1 in https://github.com/slackapi/bolt-js/pull/2626 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.2.1 to 24.3.0 in https://github.com/slackapi/bolt-js/pull/2635 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.18.0 to ^4.18.1 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2636 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.3.0 to 24.3.1 in https://github.com/slackapi/bolt-js/pull/2648 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.3.1 to 24.4.0 in https://github.com/slackapi/bolt-js/pull/2655 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.4.0 to 24.5.2 in https://github.com/slackapi/bolt-js/pull/2658 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.18.1 to ^4.19.1 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2659 - Thanks @dependabot[bot]!
* chore(deps-dev): bump @types/node from 24.5.2 to 24.7.0 in https://github.com/slackapi/bolt-js/pull/2669 - Thanks @dependabot[bot]!
* chore(deps-dev): update serverless requirement from ^4.19.1 to ^4.20.2 in /examples/deploy-aws-lambda in https://github.com/slackapi/bolt-js/pull/2670 - Thanks @dependabot[bot]!
* chore(deps-dev): bump typescript from 5.9.2 to 5.9.3 in /examples/custom-receiver in https://github.com/slackapi/bolt-js/pull/2671 - Thanks @dependabot[bot]!
* chore(deps-dev): bump typescript from 5.9.2 to 5.9.3 in /examples/getting-started-typescript in https://github.com/slackapi/bolt-js/pull/2672 - Thanks @dependabot[bot]!

### 🧰 Maintaince

* ci: pin actions workflow step hashes and use minimum permissions in https://github.com/slackapi/bolt-js/pull/2537 - Thanks @zimeg!
* chore: update dependabot to open one PR for all @slack dependencies in /examples in https://github.com/slackapi/bolt-js/pull/2550 - Thanks @WilliamBergamin!
* Revert "chore: update dependabot to open one PR for all @slack depend… in https://github.com/slackapi/bolt-js/pull/2551 - Thanks @WilliamBergamin!
* build: clone repository "docs" and configuration when syncing project docs + removing separate docusaurus build in https://github.com/slackapi/bolt-js/pull/2586 - Thanks @lukegalbraithrussell!
* Revert "build: clone repository "docs" and configuration when syncing project docs + removing separate docusaurus build" in https://github.com/slackapi/bolt-js/pull/2595 - Thanks @lukegalbraithrussell!
* ci: send a notification of scheduled failing tests in https://github.com/slackapi/bolt-js/pull/2601 - Thanks @zimeg!
* ci: output verbose details when installing packages for tests in https://github.com/slackapi/bolt-js/pull/2602 - Thanks @zimeg!
* Build: remove docusaurus configuration files in https://github.com/slackapi/bolt-js/pull/2614 - Thanks @lukegalbraithrussell!
* test: swap rewiremock with proxyquire in https://github.com/slackapi/bolt-js/pull/2629 - Thanks @WilliamBergamin!
* ci: post regression notifications if scheduled tests do not succeed in https://github.com/slackapi/bolt-js/pull/2667 - Thanks @zimeg!
* chore(release): version @slack/bolt@4.5.0 in https://github.com/slackapi/bolt-js/pull/2675 - Thanks @zimeg!


## New Contributors 🎉 

* @jamessimone made their first contribution in https://github.com/slackapi/bolt-js/pull/2569
* @jfbn made their first contribution in https://github.com/slackapi/bolt-js/pull/2584
* @malewis5 made their first contribution in https://github.com/slackapi/bolt-js/pull/2632

**Milestone**: https://github.com/slackapi/bolt-js/milestone/59?closed=1
**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.4.0...@slack/bolt@4.5.0
**Package**: https://www.npmjs.com/package/@slack/bolt/v/4.5.0
</Release>

<Release version="@slack/bolt@4.4.0" date="May 20, 2025" published="2025-05-20T19:04:02.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.4.0">
## What's Changed
### 🚀 Features
* feat: support for synchronous custom step handling by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2408

### 🐛 Fixes
* fix: socket mode should warn when ack is invoked multiple times by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2519

### 🧰 Maintenance
* fix: bump sinon version by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2522
* test: confirm socket mode receiver acknowledges processed events by @zimeg in https://github.com/slackapi/bolt-js/pull/2520
* chore: release @slack/bolt@4.4.0 by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2538

### 🤖 Dependencies
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/oauth-express-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2532
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/socket-mode-oauth by @dependabot in https://github.com/slackapi/bolt-js/pull/2527
* chore(deps-dev): bump @types/node from 22.15.3 to 22.15.17 by @dependabot in https://github.com/slackapi/bolt-js/pull/2523
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/oauth by @dependabot in https://github.com/slackapi/bolt-js/pull/2531
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2524
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/socket-mode by @dependabot in https://github.com/slackapi/bolt-js/pull/2530
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/message-metadata by @dependabot in https://github.com/slackapi/bolt-js/pull/2529
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/deploy-heroku by @dependabot in https://github.com/slackapi/bolt-js/pull/2525
* chore(deps-dev): update serverless requirement from ^4.14.2 to ^4.14.3 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2526
* chore(deps): update @slack/bolt requirement from ^4.2.1 to ^4.3.0 in /examples/getting-started-typescript by @dependabot in https://github.com/slackapi/bolt-js/pull/2528
* chore(deps-dev): bump @types/node from 22.15.17 to 22.15.19 by @dependabot in https://github.com/slackapi/bolt-js/pull/2536


**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.3.0...@slack/bolt@4.4.0
**Milstone**: https://github.com/slackapi/bolt-js/milestone/58?closed=1
</Release>

<Release version="@slack/bolt@4.3.0" date="May 7, 2025" published="2025-05-07T13:36:50.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.3.0">
## What's Changed

## 🐛 Fixes
* fix: configure dependbot to group react deps by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2440
* fix: refactor function handler for follow up auto ack behavior by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2424
* fix: always attach the function bot access token to the context if available by @zimeg in https://github.com/slackapi/bolt-js/pull/2513
* fix: allow all web api client option types in app initialization by @zimeg in https://github.com/slackapi/bolt-js/pull/2501
* fix: always attach the function inputs to the context if available by @zimeg in https://github.com/slackapi/bolt-js/pull/2517

## 📚 Documentation
* Docs - matches site css to slack.dev and  docs.slack.dev by @slackapi in https://github.com/slackapi/bolt-js/pull/2434
* fixes broken apps navbar link by @slackapi in https://github.com/slackapi/bolt-js/pull/2443
* API Docs: AI app with Hugging Face tutorial by @haleychaas in https://github.com/slackapi/bolt-js/pull/2464
* API Docs: Fix directory paste error by @haleychaas in https://github.com/slackapi/bolt-js/pull/2466
* API Docs: Update links to go to new site by @haleychaas in https://github.com/slackapi/bolt-js/pull/2494
* API Docs: Update AI tutorial to include markdown block by @haleychaas in https://github.com/slackapi/bolt-js/pull/2486
* API Docs: Replace OpenAI references with Hugging Face by @haleychaas in https://github.com/slackapi/bolt-js/pull/2507

## 🧰 Maintenance
* ci: label updates to example app dependencies with an 'area:examples' label by @zimeg in https://github.com/slackapi/bolt-js/pull/2485
* ci: increase updated versions to depend on the latest releases by @zimeg in https://github.com/slackapi/bolt-js/pull/2468

## 🤖 Dependencies
* chore(deps-dev): bump stylelint from 16.14.1 to 16.15.0 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2435
* chore(deps-dev): bump @types/node from 22.13.5 to 22.13.8 by @dependabot in https://github.com/slackapi/bolt-js/pull/2436
* chore(deps-dev): bump @types/node from 22.13.8 to 22.13.9 by @dependabot in https://github.com/slackapi/bolt-js/pull/2441
* chore(deps): bump the react group in /docs with 2 updates by @dependabot in https://github.com/slackapi/bolt-js/pull/2442
* chore(deps-dev): bump typescript from 5.7.3 to 5.8.2 in /examples/custom-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2438
* chore(deps-dev): bump typescript from 5.7.3 to 5.8.2 in /examples/getting-started-typescript by @dependabot in https://github.com/slackapi/bolt-js/pull/2439
* Docs: Update reference to "Concepts guides". by @technically-tracy in https://github.com/slackapi/bolt-js/pull/2446
* chore(deps-dev): bump @types/node from 22.13.9 to 22.13.10 by @dependabot in https://github.com/slackapi/bolt-js/pull/2450
* chore(deps): bump prismjs from 1.29.0 to 1.30.0 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2452
* chore(deps): bump axios to 1.8.3 to address CVE-2025-27152 by @zimeg in https://github.com/slackapi/bolt-js/pull/2453
* chore(deps): bump @babel/helpers from 7.26.0 to 7.26.10 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2456
* chore(deps): bump @babel/runtime from 7.26.0 to 7.26.10 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2457
* chore(deps): bump @babel/runtime-corejs3 from 7.26.9 to 7.26.10 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2458
* chore(deps-dev): bump @types/node from 22.13.10 to 22.13.13 by @dependabot in https://github.com/slackapi/bolt-js/pull/2463
* chore(deps-dev): bump @types/node from 22.13.13 to 22.13.14 by @dependabot in https://github.com/slackapi/bolt-js/pull/2467
* chore(deps-dev): bump stylelint from 16.15.0 to 16.17.0 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2469
* chore(deps): update @slack/socket-mode requirement from ^2.0.3 to ^2.0.4 by @dependabot in https://github.com/slackapi/bolt-js/pull/2470
* chore(deps): bump css-minimizer-webpack-plugin from 7.0.0 to 7.0.2 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2471
* chore(deps): update @slack/types requirement from ^2.13.0 to ^2.14.0 by @dependabot in https://github.com/slackapi/bolt-js/pull/2472
* chore(deps): update @slack/web-api requirement from ^7.8.0 to ^7.9.1 by @dependabot in https://github.com/slackapi/bolt-js/pull/2473
* chore(deps): update @slack/oauth requirement from ^3.0.2 to ^3.0.3 by @dependabot in https://github.com/slackapi/bolt-js/pull/2474
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2475
* chore(deps-dev): update serverless requirement from ^4.4.18 to ^4.9.1 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2476
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/deploy-heroku by @dependabot in https://github.com/slackapi/bolt-js/pull/2477
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/getting-started-typescript by @dependabot in https://github.com/slackapi/bolt-js/pull/2478
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/message-metadata by @dependabot in https://github.com/slackapi/bolt-js/pull/2479
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/oauth by @dependabot in https://github.com/slackapi/bolt-js/pull/2480
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/oauth-express-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2481
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/socket-mode by @dependabot in https://github.com/slackapi/bolt-js/pull/2482
* chore(deps): update @slack/bolt requirement from ^4.2.0 to ^4.2.1 in /examples/socket-mode-oauth by @dependabot in https://github.com/slackapi/bolt-js/pull/2483
* chore(deps): bump the react group in /docs with 2 updates by @dependabot in https://github.com/slackapi/bolt-js/pull/2488
* chore(deps): bump image-size from 1.2.0 to 1.2.1 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2489
* chore(deps-dev): bump typescript from 5.8.2 to 5.8.3 in /examples/custom-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2490
* chore(deps-dev): bump typescript from 5.8.2 to 5.8.3 in /examples/getting-started-typescript by @dependabot in https://github.com/slackapi/bolt-js/pull/2491
* chore(deps-dev): bump @types/node from 22.13.14 to 22.14.0 by @dependabot in https://github.com/slackapi/bolt-js/pull/2493
* chore(deps-dev): update serverless requirement from ^4.9.1 to ^4.11.1 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2492
* chore(deps): bump estree-util-value-to-estree from 3.3.2 to 3.3.3 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2495
* chore(deps-dev): bump @types/node from 22.14.0 to 22.14.1 by @dependabot in https://github.com/slackapi/bolt-js/pull/2498
* chore(deps-dev): update serverless requirement from ^4.11.1 to ^4.12.0 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2499
* chore(deps-dev): update serverless requirement from ^4.12.0 to ^4.14.1 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2503
* chore(deps-dev): bump stylelint-config-standard from 37.0.0 to 38.0.0 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2514
* chore(deps): bump http-proxy-middleware from 2.0.7 to 2.0.9 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2504
* chore(deps-dev): bump @types/node from 22.14.1 to 22.15.3 by @dependabot in https://github.com/slackapi/bolt-js/pull/2511
* chore(deps-dev): update serverless requirement from ^4.14.1 to ^4.14.2 in /examples/deploy-aws-lambda by @dependabot in https://github.com/slackapi/bolt-js/pull/2516
* chore(deps): bump koa from 2.16.1 to 3.0.0 in /examples/custom-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2512
* chore: release @slack/bolt@4.3.0 by @hello-ashleyintech in https://github.com/slackapi/bolt-js/pull/2518

Thank you to all our lovely contributors ✨ 

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.2.1...@slack/bolt@4.3.0
</Release>

<Release version="@slack/bolt@4.2.1" date="February 28, 2025" published="2025-02-28T18:39:13.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.2.1">
## What's Changed
## 🐛 Fixes
* bug: make `@types/express` an optional peer dependency by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2421

## 📚 Documentation
* docs: Syncing config files with Deno Slack SDK and Slack CLI docs by @slackapi in https://github.com/slackapi/bolt-js/pull/2373
* docs: nested sidebar format by @lukegalbraithrussell in https://github.com/slackapi/bolt-js/pull/2374
* docs(example): update aws lambda deployment to latest dependencies by @zimeg in https://github.com/slackapi/bolt-js/pull/2383
* docs(examples): fix the "deploy to heroku" button using latest dependencies by @zimeg in https://github.com/slackapi/bolt-js/pull/2385
* docs: fixed typo in getting-started.mdx by @tomdevisser29 in https://github.com/slackapi/bolt-js/pull/2406
* docs: update getting-started.mdx by @msoyka in https://github.com/slackapi/bolt-js/pull/2402
* docs: update Heroku version in deployment guide. by @technically-tracy in https://github.com/slackapi/bolt-js/pull/2419
* docs - typo for link going to original site by @lukegalbraithrussell in https://github.com/slackapi/bolt-js/pull/2431
* docs: Migrate custom steps tutorials. by @technically-tracy in https://github.com/slackapi/bolt-js/pull/2429
* docs: remove mention of assistants and replace with AI apps by @haleychaas in https://github.com/slackapi/bolt-js/pull/2432

## 🧰 Maintenance
* ci: complete all sample tests even if one fails fast by @zimeg in https://github.com/slackapi/bolt-js/pull/2386
* ci: add example app dependencies to weekly dependabot configurations by @zimeg in https://github.com/slackapi/bolt-js/pull/2387
* ci: test samples and examples with a packaged bolt build by @zimeg in https://github.com/slackapi/bolt-js/pull/2372
* fix: improve the maintainers_guide local development instruction by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2422
* chore: release @slack/bolt@4.2.1 by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2433

## 🤖 Dependencies
* chore(deps-dev): bump @types/node from 22.13.4 to 22.13.5 by @dependabot in https://github.com/slackapi/bolt-js/pull/2428
* chore(deps-dev): bump @types/node from 22.13.0 to 22.13.1 by @dependabot in https://github.com/slackapi/bolt-js/pull/2420
* chore(deps-dev): bump @types/node from 22.13.1 to 22.13.4 by @dependabot in https://github.com/slackapi/bolt-js/pull/2425
* chore(deps-dev): bump @types/node from 22.10.7 to 22.13.0 by @dependabot in https://github.com/slackapi/bolt-js/pull/2416
* chore(deps): bump actions/stale from 9.0.0 to 9.1.0 by @dependabot in https://github.com/slackapi/bolt-js/pull/2415
* chore(deps-dev): bump @types/node from 22.10.5 to 22.10.7 by @dependabot in https://github.com/slackapi/bolt-js/pull/2403
* chore(deps-dev): bump @types/node from 22.10.2 to 22.10.5 by @dependabot in https://github.com/slackapi/bolt-js/pull/2382

### docs
* chore(deps-dev): bump stylelint-config-standard from 36.0.1 to 37.0.0 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2412
* chore(deps): bump the docusaurus group in /docs with 5 updates by @dependabot in https://github.com/slackapi/bolt-js/pull/2392
* chore(deps-dev): bump stylelint from 16.11.0 to 16.12.0 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2379
* chore(deps): bump prism-react-renderer from 2.4.0 to 2.4.1 in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2378

### examples
* chore(deps-dev): bump @types/node from 18.19.71 to 22.10.7 in /examples/custom-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2404
* chore(deps-dev): bump typescript from 5.3.3 to 5.7.3 in /examples/getting-started-typescript by @dependabot in https://github.com/slackapi/bolt-js/pull/2393
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/getting-started-typescript by @dependabot in https://github.com/slackapi/bolt-js/pull/2394
* chore(deps-dev): bump @types/node from 18.19.70 to 22.10.5 in /examples/getting-started-typescript by @dependabot in https://github.com/slackapi/bolt-js/pull/2395
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/message-metadata by @dependabot in https://github.com/slackapi/bolt-js/pull/2396
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/socket-mode-oauth by @dependabot in https://github.com/slackapi/bolt-js/pull/2400
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/socket-mode by @dependabot in https://github.com/slackapi/bolt-js/pull/2399
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/oauth-express-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2398
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/oauth by @dependabot in https://github.com/slackapi/bolt-js/pull/2397
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/custom-properties by @dependabot in https://github.com/slackapi/bolt-js/pull/2388
* chore(deps-dev): bump typescript from 5.3.3 to 5.7.3 in /examples/custom-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2390
* chore(deps): bump @slack/bolt from 3.22.0 to 4.2.0 in /examples/custom-receiver by @dependabot in https://github.com/slackapi/bolt-js/pull/2391


## New Contributors
* @tomdevisser29 made their first contribution in https://github.com/slackapi/bolt-js/pull/2406
* @msoyka made their first contribution in https://github.com/slackapi/bolt-js/pull/2402

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.2.0...@slack/bolt@4.2.1
</Release>

<Release version="@slack/bolt@4.2.0" date="December 17, 2024" published="2024-12-17T02:08:16.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.2.0">
## What's Changed

Hello! 👋  This release updates dependencies to keep packages secure and makes the `logger` of your `app` public for use outside of event listeners when using TypeScript! 🔐 🌲 

```javascript
const app = new App({ ... });

(async () => {
  await app.start(process.env.PORT || 3000);
  app.logger.info('⚡️ Bolt app is running!'); // The app logger can now be used here!
})();
```

### 🎁 Enhancements

* feat: make the app logger attached to the app instance public in https://github.com/slackapi/bolt-js/pull/2365 - thanks @zimeg! 

### 🔐  Security

* chore(deps): bump slack and axios dependencies to latest secure versions in https://github.com/slackapi/bolt-js/pull/2360 - thanks @hello-ashleyintech!

### 📚 Documentation

* docs: show descriptions of function listener arguments in https://github.com/slackapi/bolt-js/pull/2364 - thanks @zimeg! 
* docs: replace redirected or missing links to bolt documentation in https://github.com/slackapi/bolt-js/pull/2367 - thanks @zimeg! 

### 🧰 Maintenance

* build: install @types/express@^v5 as a dev dependency for express@^5 in https://github.com/slackapi/bolt-js/pull/2355 - thanks @zimeg!
* ci: check for linting errors without writing required changes in https://github.com/slackapi/bolt-js/pull/2357 - thanks @zimeg! 
* build: find the biome config schema from the installed path in https://github.com/slackapi/bolt-js/pull/2363 - thanks @zimeg! 
* build: ignore autogenerated docusaurus files when running the formatter in https://github.com/slackapi/bolt-js/pull/2362 - thanks @zimeg!
* build: update the redirected repo homepage url to postfix js in https://github.com/slackapi/bolt-js/pull/2370 - thanks @zimeg! 

### 🤖 Dependencies

* chore(deps): bump codecov/codecov-action from 4 to 5 in https://github.com/slackapi/bolt-js/pull/2349 - thanks @dependabot! 
* chore(deps): bump the docusaurus group in /docs with 5 updates in https://github.com/slackapi/bolt-js/pull/2350 - thanks @dependabot! 
* chore(deps): bump path-to-regexp from 1.8.0 to 1.9.0 in /docs in https://github.com/slackapi/bolt-js/pull/2352 - thanks @dependabot! 
* chore(deps-dev): bump stylelint from 16.10.0 to 16.11.0 in /docs in https://github.com/slackapi/bolt-js/pull/2351 - thanks @dependabot! 
* chore(deps): bump path-to-regexp and express in /docs in https://github.com/slackapi/bolt-js/pull/2358 - thanks @dependabot! 
* chore(deps-dev): @types/node from 22.9.3 to 22.10.1 in https://github.com/slackapi/bolt-js/pull/2359 - thanks @dependabot!
* chore(deps): bump nanoid from 3.3.7 to 3.3.8 in /docs in https://github.com/slackapi/bolt-js/pull/2368 - thanks @dependabot! 
* chore(deps-dev): @types/node from 22.10.1 to 22.10.2 in https://github.com/slackapi/bolt-js/pull/2369 - thanks @dependabot!

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.1.1...@slack/bolt@4.2.0
</Release>

<Release version="@slack/bolt@4.1.2-rc.1" date="November 26, 2024" published="2024-11-26T16:28:32.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.1.2-rc.1">
# What's Changed

This pre-release contains the proposed `socket-mode` library fix addressing runaway connection spawning spiral behaviour observed in https://github.com/slackapi/node-slack-sdk/issues/2094 and fixed in https://github.com/slackapi/node-slack-sdk/issues/2099.

Developers wishing to evaluate the fix for their app may try out this pre-release.

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.1.1...@slack/bolt@4.1.2-rc.1
</Release>

<Release version="@slack/bolt@4.1.1" date="November 26, 2024" published="2024-11-26T16:11:38.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.1.1">
## What's Changed

- 🏭 A fix related to the TypeScript types for the Assistant handler utilities. Fixes #2319 in #2325, thanks @misscoded!
- 📚 Our bolt-js online documentation at https://tools.slack.dev/bolt-js/ received many updates. Thanks to @lukegalbraithrussell, @haleychaas and @kuredev!

## Changelog
* Docs: agents and assistants by @lukegalbraithrussell in https://github.com/slackapi/bolt-js/pull/2295
* fix: Assistant utility types by @misscoded in https://github.com/slackapi/bolt-js/pull/2325
* Docs: Tutorial for assistant app by @haleychaas in https://github.com/slackapi/bolt-js/pull/2331
* docs: Changed "App Token" to "App-Level Tokens" by @kuredev in https://github.com/slackapi/bolt-js/pull/2336
* docs: add xapp section by @kuredev in https://github.com/slackapi/bolt-js/pull/2339

## New Contributors
* @haleychaas made their first contribution in https://github.com/slackapi/bolt-js/pull/2331
* @kuredev made their first contribution in https://github.com/slackapi/bolt-js/pull/2336

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.1.0...@slack/bolt@4.1.1
</Release>

<Release version="@slack/bolt@4.1.0" date="November 1, 2024" published="2024-11-01T18:59:37.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.1.0">
## What's Changed
* fix: Include metadata with Assistant `say` util by @misscoded in https://github.com/slackapi/bolt-js/pull/2300
* docs: concept focused nav by @lukegalbraithrussell in https://github.com/slackapi/bolt-js/pull/2302
* feat: Add `title` to setSuggestedPrompts utility by @misscoded in https://github.com/slackapi/bolt-js/pull/2308

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.1...@slack/bolt@4.1.0
</Release>

<Release version="@slack/bolt@4.0.1" date="October 22, 2024" published="2024-10-22T18:22:32.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.0.1">
## What's Changed

* Fix a bug where parsing assistant thread message event fails for beta feature enabled apps by @seratch in https://github.com/slackapi/bolt-js/pull/2298


**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0...@slack/bolt@4.0.1
</Release>

<Release version="@slack/bolt@4.0.0" date="October 17, 2024" published="2024-10-17T19:53:25.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.0.0">
# Bolt v4

## What's Changed

### New Features

Support for [Agents & Assistants](https://api.slack.com/docs/apps/ai) is now available! 

Bolt now offers a simple and intuitive way to create an Agent/Assistant using the new `Assistant` class. Simply include the required callbacks and add the assistant to your `App` instance. Get up and running even quicker with a working, out-of-the-box example that utilizes OpenAI [here](https://github.com/slack-samples/bolt-js-assistant-template).

### Breaking Changes

We have prepared [a migration guide](https://docs.slack.dev/tools/bolt-js/migration/migration-v4) to help BoltJS consumers migrate their Bolt v3 apps to v4.

While a few breaking changes were introduced, we don't expect a majority of bolt v3 users to require changing their apps to upgrade to v4. More complex apps may need a few tweaks. TL;DR is: if your bolt v3 app is built with TypeScript, or uses the `ExpressReceiver` or the `AwsLambdaReceiver`, or your app used previously-deprecated types or functions, best to read the [migration guide](https://tools.slack.dev/bolt-js/tutorial/migration-v4).

#### Middleware Type Changes

In bolt we have [a set of `Slack*MiddlewareArgs` types](https://github.com/slackapi/bolt-js/blob/main/src/types/middleware.ts#L12-L18): for events, shortcuts, commands, and so on. They 'wrap' the underlying event payloads with additional middleware-relevant bits like a `next()` method, a `context` object for devs to augment, and so on.

Many of these types, for example [the `SlackEventMiddlewareArgs` type](https://github.com/slackapi/bolt-js/blob/main/src/types/events/index.ts#L11-L19), previously used a conditional to _sometimes_ define particular additional helper utilities on the middleware arguments. For example, [the `say`](https://github.com/slackapi/bolt-js/blob/main/src/types/actions/index.ts#L47) utility, or [tacking on a convenience `message` property](https://github.com/slackapi/bolt-js/blob/main/src/types/events/index.ts#L14) for message-event-related payloads. This was problematic in practice in TypeScript situations, not just internally (this change fixes https://github.com/slackapi/bolt-js/issues/2135) within the bolt codebase but for developers as well: when the payload was _not_ of a type that required the extra utility, these properties would be required to exist on the middleware arguments but have a value of `undefined`. Those of us trying to build generic middleware utilities would have to deal with TS compilation errors and needing to liberally type-cast to avoid these conditional mismatches with `undefined`.

Instead, these `MiddlewareArgs` types [now conditionally create a type _intersection_ when appropriate in order to provide this conditional-utility-extension mechanism](https://github.com/slackapi/bolt-js/pull/2254/files#diff-b5e4a4e82f104fd913ed68e1fd01c16a046705b0a35fd64204ddbafc9dccca74R14). In practice that looks something like:

```typescript
type SomeMiddlewareArgs<EventType extends string = string> = {
  // some type in here
} & (EventType extends 'message'
  // If this is a message event, add a `message` property
  ? { message: EventFromType<EventType> }
  : unknown
)
```

With the above, now when a message payload is wrapped up into middleware arguments, it will contain an appropriate `message` property, whereas a non-message payload will be intersected with `unknown` - effectively a type "noop." No more e.g. `say: undefined` or `message: undefined` to deal with!

### Other Breaking Changes

- drops node v14 and v16 (are now EOL'ed)
- `express` to v4->v5; `ExpressReceiver` users will be exposed to [express v4 -> v5 breaking changes](https://github.com/expressjs/express/blob/5.0/History.md#500--2024-09-10) - fixes #2242
- upgrades to `@slack/socket-mode` v2; `SocketModeReceiver` users who have attached custom event listeners to the public `socketModeClient` directly should read the [v1 -> v2 migration guide](https://github.com/slackapi/node-slack-sdk/wiki/Migration-Guide-for-socket%E2%80%90mode-2.0) in case the major upgrade could affect them - fixes #2225
- upgrades `@slack/web-api` v7; all users should read [the web-api v6->v7 migration guide](https://github.com/slackapi/node-slack-sdk/wiki/Migration-Guide-for-web%E2%80%90api-v7) to see what the scope of breaking changes the `client` within listeners is affected by
- removed exported type: `KnownKeys`
- `@slack/types` now exist under a named export `types`.
- removed the `SocketModeFunctions` class that had a single static method on it and instead directly exposed the `defaultProcessEventErrorHandler` method from it.
- the built-in middleware functions `ignoreSelf` and `directMention` now no longer must be invoked as a method in order to return middleware; instead they are middleware to be used directly. this lines up the API for these built-in middlewares to match the other builtins.
- AWSReceiver's `AwsEvent` interface now models event payloads a bit differently; we now properly model AWS API Gateway v1 and v2 payloads separately - fixes #2272 
- remove deprecated methods/modules/properties:
  - `OptionsRequest` interface
  - `authed_users` and `authed_teams` from event payload envelope
  - `render-html-for-install-path` module
  - `verify` and `VerifyOptions` from the `verify-request` module
  - `src/receivers/http-utils.ts` module

## Non-breaking Changes

- expose the bundled `@slack/web-api` dependency under the `webApi` named export
- fixed an issue in `AwsLambdaReceiver` where apps with no registered handlers that processed an incoming event would still log out an error related to not acknowledging the request in time - fixes #2284 
- dependency updates:
  - upgrades `raw-body` to v3
  - upgrades `@slack/oauth` to v3
  - removes `promise.allsettled` since that is natively supported in node since v14
  - moves `@types/tsscmp` to dev dependencies since that is not exposed to developers

## Changelog

* chore(deps-dev): bump @types/node from 22.5.5 to 22.7.4 by @dependabot in https://github.com/slackapi/bolt-js/pull/2276
* chore(deps-dev): bump @types/node from 22.7.4 to 22.7.5 by @dependabot in https://github.com/slackapi/bolt-js/pull/2289
* chore(deps): bump cookie and express in /docs by @dependabot in https://github.com/slackapi/bolt-js/pull/2291
* Add support for Agents/Assistants by @misscoded in https://github.com/slackapi/bolt-js/pull/2286
* bolt v4 by @filmaj in https://github.com/slackapi/bolt-js/pull/2254
* Publish `@slack/bolt@v4.0.0` by @filmaj in https://github.com/slackapi/bolt-js/pull/2294

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.22.0...@slack/bolt@4.0.0
</Release>

<Release version="@slack/bolt@4.0.0-rc.4" date="October 9, 2024" published="2024-10-09T16:47:57.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.0.0-rc.4">
# Bolt v4 Release Candidate 4

A lot! We have prepared [a migration guide](https://github.com/slackapi/bolt-js/wiki/Bolt-v3-%E2%80%90--v4-Migration-Guide) to help bolt-js consumers migrate their bolt v3 apps to v4.

## What's Changed

### Breaking Changes

#### Middleware Type Changes

In bolt we have [a set of `Slack*MiddlewareArgs` types](https://github.com/slackapi/bolt-js/blob/main/src/types/middleware.ts#L12-L18): for events, shortcuts, commands, and so on. They 'wrap' the underlying event payloads with additional middleware-relevant bits like a `next()` method, a `context` object for devs to augment, and so on.

Many of these types, for example [the `SlackEventMiddlewareArgs` type](https://github.com/slackapi/bolt-js/blob/main/src/types/events/index.ts#L11-L19), previously used a conditional to _sometimes_ define particular additional helper utilities on the middleware arguments. For example, [the `say`](https://github.com/slackapi/bolt-js/blob/main/src/types/actions/index.ts#L47) utility, or [tacking on a convenience `message` property](https://github.com/slackapi/bolt-js/blob/main/src/types/events/index.ts#L14) for message-event-related payloads. This was problematic in practice in TypeScript situations, not just internally (this change fixes https://github.com/slackapi/bolt-js/issues/2135) within the bolt codebase but for developers as well: when the payload was _not_ of a type that required the extra utility, these properties would be required to exist on the middleware arguments but have a value of `undefined`. Those of us trying to build generic middleware utilities would have to deal with TS compilation errors and needing to liberally type-cast to avoid these conditional mismatches with `undefined`.

Instead, these `MiddlewareArgs` types [now conditionally create a type _intersection_ when appropriate in order to provide this conditional-utility-extension mechanism](https://github.com/slackapi/bolt-js/pull/2254/files#diff-b5e4a4e82f104fd913ed68e1fd01c16a046705b0a35fd64204ddbafc9dccca74R14). In practice that looks something like:

```typescript
type SomeMiddlewareArgs<EventType extends string = string> = {
  // some type in here
} & (EventType extends 'message'
  // If this is a message event, add a `message` property
  ? { message: EventFromType<EventType> }
  : unknown
)
```

With the above, now when a message payload is wrapped up into middleware arguments, it will contain an appropriate `message` property, whereas a non-message payload will be intersected with `unknown` - effectively a type "noop." No more e.g. `say: undefined` or `message: undefined` to deal with!

### Other Breaking Changes

- drops node v14 and v16 (are now EOL'ed)
- `express` to v4->v5; `ExpressReceiver` users will be exposed to [express v4 -> v5 breaking changes](https://github.com/expressjs/express/blob/5.0/History.md#500--2024-09-10)
  - fixes #2242
- upgrades to `@slack/socket-mode` v2; `SocketModeReceiver` users who have attached custom event listeners to the public `socketModeClient` directly should read the [v1 -> v2 migration guide](https://github.com/slackapi/node-slack-sdk/wiki/Migration-Guide-for-socket%E2%80%90mode-2.0) in case the major upgrade could affect them
  - fixes #2225
- upgrades `@slack/web-api` v7; all users should read [the web-api v6->v7 migration guide](https://github.com/slackapi/node-slack-sdk/wiki/Migration-Guide-for-web%E2%80%90api-v7) to see what the scope of breaking changes the `client` within listeners is affected by
- removed exported type: `KnownKeys`
- `@slack/types` now exist under a named export `types`.
- removed the `SocketModeFunctions` class that had a single static method on it and instead directly exposed the `defaultProcessEventErrorHandler` method from it.
- the built-in middleware functions `ignoreSelf` and `directMention` now no longer must be invoked as a method in order to return middleware; instead they are middleware to be used directly. this lines up the API for these built-in middlewares to match the other builtins.
- AWSReceiver's `AwsEvent` interface now models event payloads a bit differently; we now properly model AWS API Gateway v1 and v2 payloads separately.
  - This resolves #2272 
- remove deprecated methods/modules/properties:
  - `OptionsRequest` interface
  - `authed_users` and `authed_teams` from event payload envelope
  - `render-html-for-install-path` module
  - `verify` and `VerifyOptions` from the `verify-request` module
  - `src/receivers/http-utils.ts` module

## Non-breaking Changes

- expose the bundled `@slack/web-api` dependency under the `webApi` named export
- fixed an issue in `AwsLambdaReceiver` where apps with no registered handlers that processed an incoming event would still log out an error related to not acknowledging the request in time. Resolves #2284 
- dependency updates:
  - upgrades `raw-body` to v3
  - upgrades `@slack/oauth` to v3
  - removes `promise.allsettled` since that is natively supported in node since v14
  - moves `@types/tsscmp` to dev dependencies since that is not exposed to developers
</Release>

<Release version="@slack/bolt@4.0.0-rc.3" date="October 8, 2024" published="2024-10-08T16:13:51.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%404.0.0-rc.3">
# Bolt v4 Release Candidate 3

A lot! We have prepared [a migration guide](https://github.com/slackapi/bolt-js/wiki/Bolt-v3-%E2%80%90--v4-Migration-Guide) to help bolt-js consumers migrate their bolt v3 apps to v4.

## What's Changed

### Breaking Changes

#### Middleware Type Changes

In bolt we have [a set of `Slack*MiddlewareArgs` types](https://github.com/slackapi/bolt-js/blob/main/src/types/middleware.ts#L12-L18): for events, shortcuts, commands, and so on. They 'wrap' the underlying event payloads with additional middleware-relevant bits like a `next()` method, a `context` object for devs to augment, and so on.

Many of these types, for example [the `SlackEventMiddlewareArgs` type](https://github.com/slackapi/bolt-js/blob/main/src/types/events/index.ts#L11-L19), previously used a conditional to _sometimes_ define particular additional helper utilities on the middleware arguments. For example, [the `say`](https://github.com/slackapi/bolt-js/blob/main/src/types/actions/index.ts#L47) utility, or [tacking on a convenience `message` property](https://github.com/slackapi/bolt-js/blob/main/src/types/events/index.ts#L14) for message-event-related payloads. This was problematic in practice in TypeScript situations, not just internally (this change fixes https://github.com/slackapi/bolt-js/issues/2135) within the bolt codebase but for developers as well: when the payload was _not_ of a type that required the extra utility, these properties would be required to exist on the middleware arguments but have a value of `undefined`. Those of us trying to build generic middleware utilities would have to deal with TS compilation errors and needing to liberally type-cast to avoid these conditional mismatches with `undefined`.

Instead, these `MiddlewareArgs` types [now conditionally create a type _intersection_ when appropriate in order to provide this conditional-utility-extension mechanism](https://github.com/slackapi/bolt-js/pull/2254/files#diff-b5e4a4e82f104fd913ed68e1fd01c16a046705b0a35fd64204ddbafc9dccca74R14). In practice that looks something like:

```typescript
type SomeMiddlewareArgs<EventType extends string = string> = {
  // some type in here
} & (EventType extends 'message'
  // If this is a message event, add a `message` property
  ? { message: EventFromType<EventType> }
  : unknown
)
```

With the above, now when a message payload is wrapped up into middleware arguments, it will contain an appropriate `message` property, whereas a non-message payload will be intersected with `unknown` - effectively a type "noop." No more e.g. `say: undefined` or `message: undefined` to deal with!

### Other Breaking Changes

- drops node v14 and v16 (are now EOL'ed)
- `express` to v4->v5; `ExpressReceiver` users will be exposed to [express v4 -> v5 breaking changes](https://github.com/expressjs/express/blob/5.0/History.md#500--2024-09-10)
  - fixes #2242
- upgrades to `@slack/socket-mode` v2; `SocketModeReceiver` users who have attached custom event listeners to the public `socketModeClient` directly should read the [v1 -> v2 migration guide](https://github.com/slackapi/node-slack-sdk/wiki/Migration-Guide-for-socket%E2%80%90mode-2.0) in case the major upgrade could affect them
  - fixes #2225
- upgrades `@slack/web-api` v7; all users should read [the web-api v6->v7 migration guide](https://github.com/slackapi/node-slack-sdk/wiki/Migration-Guide-for-web%E2%80%90api-v7) to see what the scope of breaking changes the `client` within listeners is affected by
- removed exported type: `KnownKeys`
- `@slack/types` now exist under a named export `types`.
- removed the `SocketModeFunctions` class that had a single static method on it and instead directly exposed the `defaultProcessEventErrorHandler` method from it.
- the built-in middleware functions `ignoreSelf` and `directMention` now no longer must be invoked as a method in order to return middleware; instead they are middleware to be used directly. this lines up the API for these built-in middlewares to match the other builtins.
- AWSReceiver's `AwsEvent` interface now models event payloads a bit differently; we now properly model AWS API Gateway v1 and v2 payloads separately.
  - This resolves #2272 
- remove deprecated methods/modules/properties:
  - `OptionsRequest` interface
  - `authed_users` and `authed_teams` from event payload envelope
  - `render-html-for-install-path` module
  - `verify` and `VerifyOptions` from the `verify-request` module
  - `src/receivers/http-utils.ts` module

## Non-breaking Changes

- expose the bundled `@slack/web-api` dependency under the `webApi` named export
- dependency updates:
  - upgrades `raw-body` to v3
  - upgrades `@slack/oauth` to v3
  - removes `promise.allsettled` since that is natively supported in node since v14
  - moves `@types/tsscmp` to dev dependencies since that is not exposed to developers
</Release>

<Release version="@slack/bolt@3.22.0" date="September 27, 2024" published="2024-09-27T23:20:51.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%403.22.0">
## What's new

This release adds support for the `assistant.threads.*` API methods introduced in [`@slack/web-api@6.13.0`](https://github.com/slackapi/node-slack-sdk/releases/tag/%40slack%2Fweb-api%406.13.0) 🤖  as well as improvements to documentation at the new https://tools.slack.dev/bolt-js site and patches to dependencies 🔒 

### Example usage

More details about these endpoints can be [discovered in the documentation](https://api.slack.com/docs/apps/ai), and listeners can be added to code to respond to incoming events like so:

```js

app.event('assistant_thread_started', async ({ client, event, logger }) => {
  logger.info('A new thread started');
  logger.debug(event);
  const now = new Date();
  const title = await client.assistant.threads.setTitle({
    title: `Chats from ${now.toISOString()}`,
    channel_id: event.assistant_thread.channel_id,
    thread_ts: event.assistant_thread.thread_ts,
  });
  logger.debug(title);
  const suggestions = await client.assistant.threads.setSuggestedPrompts({
    channel_id: event.assistant_thread.channel_id,
    thread_ts: event.assistant_thread.thread_ts,
    title: 'Ask the computer for answers',
    prompts: [
      {
        title: 'Find the time',
        message: `What happens at ${Math.floor(now.getTime() / 1000)}`,
      },
    ],
  });
  logger.debug(suggestions);
});

app.event('assistant_thread_context_changed', async ({ client, event, logger }) => {
  logger.info('The channel of focus changed');
  logger.debug(event);
  const response = client.chat.postMessage({
    thread_ts: event.assistant_thread.thread_ts,
    channel: event.assistant_thread.channel_id,
    text: `Now visiting <#${event.assistant_thread.context.channel_id}>`,
  });
  logger.debug(response);
});

app.message(async ({ client, message, logger }) => {
  logger.info('A new message was received');
  logger.debug(message);
  if (message.subtype === 'message_changed' || message.subtype === 'message_deleted') {
    return;
  }
  const status = await client.assistant.threads.setStatus({
    channel_id: message.channel,
    thread_ts: message.thread_ts,
    status: 'is thinking...',
  });
  logger.debug(status);
  /**
    * Actual response generation could happen here!
    */
  setTimeout(async () => {
    const response = await client.chat.postMessage({
      channel: message.channel,
      thread_ts: message.thread_ts,
      text: 'How insightful!',
    });
    logger.debug(response);
  }, 3000);
});
```

### Changes

#### 📚 Documentation

* typo: update error link in App.ts - Thanks @ChinoUkaegbu! https://github.com/slackapi/bolt-js/pull/2260
* docs: new URL (HOLD) - Thanks @lukegalbraithrussell! https://github.com/slackapi/bolt-js/pull/2253

#### 📦 Dependencies

* chore(deps-dev): bump @types/node from 22.5.4 to 22.5.5 - Thanks @dependabot! https://github.com/slackapi/bolt-js/pull/2263
* Upgrade express version - Thanks @helzahalim! https://github.com/slackapi/bolt-js/pull/2270
* chore(deps): bump @slack/web-api from 6.12.1 to 6.13.0 - Thanks @zimeg! https://github.com/slackapi/bolt-js/pull/2273

## 🎉 New contributors

* @ChinoUkaegbu made their first contribution in https://github.com/slackapi/bolt-js/pull/2260

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.21.4...@slack/bolt@3.22.0
</Release>

<Release version="@slack/bolt@3.21.4" date="September 11, 2024" published="2024-09-11T22:28:06.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%403.21.4">
## What's Changed
* chore(deps): upgrade `path-to-regexp` to partially address a security vulnerability (#2242) by @filmaj in https://github.com/slackapi/bolt-js/pull/2251


**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.21.3...@slack/bolt@3.21.4
</Release>

<Release version="@slack/bolt@3.21.3" date="September 11, 2024" published="2024-09-11T12:57:52.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%403.21.3">
## What's Changed

Woops! We (*cough*filmaj*cough*) removed the `EnvelopedEvent` export in a recent change. We are adding it back in in this patch release. Please accept our sincere apologies for this temporary breaking change in bolt 3.21.2.

## Changelog

* Link to JS release notes by @bpfoster in https://github.com/slackapi/bolt-js/pull/2239
* chore(deps-dev): bump @types/node from 22.5.2 to 22.5.4 by @dependabot in https://github.com/slackapi/bolt-js/pull/2241
* fix: re-export EnvelopedEvent by @filmaj in https://github.com/slackapi/bolt-js/pull/2245

## New Contributors
* @bpfoster made their first contribution in https://github.com/slackapi/bolt-js/pull/2239

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.21.2...@slack/bolt@3.21.3
</Release>

<Release version="@slack/bolt@3.21.2" date="September 6, 2024" published="2024-09-06T12:07:50.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%403.21.2">
## What's Changed

The main change in this patch release is creating an npm release for the change in #2223, where exported event payload types were moved from bolt-js to `@slack/types`. If you see errors compiling your TypeScript-based application that look like:

```
Module './types' has already exported a member
```

.. then upgrading to this release should address the issue (see #2233 and #2234 for issue details).

* fix: pass a no-op `next` function to the last listener middleware by @filmaj in https://github.com/slackapi/bolt-js/pull/2214 (fixes #1457)
* fix: remove please-upgrade-node by @filmaj in https://github.com/slackapi/bolt-js/pull/2221 (fixes #1274)
* Bump `@slack/types` and consume event payloads from it by @filmaj in https://github.com/slackapi/bolt-js/pull/2223
* fix: tsconfig - skip checking dependency d.ts files by @filmaj in https://github.com/slackapi/bolt-js/pull/2226

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.21.1...@slack/bolt@3.21.2
</Release>

<Release version="@slack/bolt@3.21.1" date="August 16, 2024" published="2024-08-16T02:23:48.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%403.21.1">
## What's Changed

This patch release brings improvements to documentation and sureness in our CI, as well as security updates to certain `@slack` packages - see CVE-2024-39338 and [`axios@1.7.4`](https://github.com/axios/axios/releases/tag/v1.7.4) for more details!

## Changes

### 📚 Documentation

* docs: document custom step usage - Thanks @WilliamBergamin! https://github.com/slackapi/bolt-js/pull/2198

### 🔒 Security

* chore(deps): set a minimum @slack/web-api@^6.12.1 to address CVE-2024-39338 - Thanks @zimeg! https://github.com/slackapi/bolt-js/pull/2207

### 🧰 Maintenance

* ci: add bolt-ts-custom-function-template to list of test samples - Thanks @filmaj! https://github.com/slackapi/bolt-js/pull/2205

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.21.0...@slack/bolt@3.21.1
</Release>

<Release version="@slack/bolt@3.21.0" date="August 14, 2024" published="2024-08-14T18:41:56.000Z" url="https://github.com/slackapi/bolt-js/releases/tag/%40slack/bolt%403.21.0">
## What's Changed

Bolt-JS now supports Custom Steps! That's right, your trusty Bolt app now let's you expose [Custom Steps in Bolt](https://api.slack.com/automation/functions/custom-bolt), allowing you to provide steps for use in Workflow Builder.

You can now use the new `function()` method to register handlers for the `function_executed` event. Check out our [API docs on the topic](https://api.slack.com/automation/functions/custom-bolt) to get started.

# Changelog

* Add support for remote functions by @misscoded in https://github.com/slackapi/bolt-js/pull/2026
* chore(deps): bump axios to 1.7.4 to address CVE by @helzahalim in https://github.com/slackapi/bolt-js/pull/2201
* chore: purge the "workflow step" terminology by @WilliamBergamin in https://github.com/slackapi/bolt-js/pull/2199


## New Contributors
* @helzahalim made their first contribution in https://github.com/slackapi/bolt-js/pull/2201

**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.20.0...@slack/bolt@3.21.0
</Release>

<Pagination page="1" total-pages="5" total-items="86" next="https://releases.sh/slack/slack-bolt-js.md?page=2" />
