chat
4.43.0 · 19 Oct 2026MIT2.1M / weekRepositoryHomepagenpmAtom feed
Latest releases
All 88 releases4.43.0
19 Oct 2026115cd39: Add
@chat-adapter/gitlabfor merge request and issue comment threads on GitLab.com, GitLab Self-Managed, and GitLab Dedicated. It verifies webhooks with a signing token or secret token, replies inside each comment's discussion, handles emoji reactions, uploads files, and resolvesmessage.subjectto the parent merge request or issue. Registers the adapter in@chat-adapter/catalogand thecreate-chat-sdkCLI scaffold, and adds GitLab emoji platform support.a32470e: Keep literal tildes, asterisks, underscores, and backslashes as written in outgoing WhatsApp messages. A backslash escape is kept only where the text would otherwise turn into WhatsApp formatting, such as
\_word\_or a line starting with\>. Render bold, italic, and strikethrough from their AST nodes so formatting markers inside inline and fenced code stay unchanged, and send hard breaks as plain newlines. Add ahandlersoption tostringifyMarkdownfor platform-specific serialization.228b30d: Pass the current message ID to
Adapter.startTypingasTypingOptions.messageId.
Minor Changes
115cd39: Add
@chat-adapter/gitlabfor merge request and issue comment threads on GitLab.com, GitLab Self-Managed, and GitLab Dedicated. It verifies webhooks with a signing token or secret token, replies inside each comment's discussion, handles emoji reactions, uploads files, and resolvesmessage.subjectto the parent merge request or issue. Registers the adapter in@chat-adapter/catalogand thecreate-chat-sdkCLI scaffold, and adds GitLab emoji platform support.a32470e: Keep literal tildes, asterisks, underscores, and backslashes as written in outgoing WhatsApp messages. A backslash escape is kept only where the text would otherwise turn into WhatsApp formatting, such as
\_word\_or a line starting with\>. Render bold, italic, and strikethrough from their AST nodes so formatting markers inside inline and fenced code stay unchanged, and send hard breaks as plain newlines. Add ahandlersoption tostringifyMarkdownfor platform-specific serialization.228b30d: Pass the current message ID to
Adapter.startTypingasTypingOptions.messageId.
4.42.0
14 Oct 2026daaa0ac: Add
@chat-adapter/catalog, a zero-dependency catalog of every adapter on chat-sdk.dev. It lists official, vendor-official, and community adapters with their npm package, maintainer, README, and capability support, plus the factory export, peer dependencies, and environment variables for official and vendor-official adapters. New helpers includelistAdapters(),getCatalogEntry(), andgetFeatureSupport().The
chat/adapterssubpath is now deprecated. It re-exports the original API from@chat-adapter/catalog, so existing imports keep working. ItsADAPTERSkeeps alphabetical key order, and itsCatalogAdaptertype accepts objects without the newfeaturesandreadmefields. In@chat-adapter/catalog,ADAPTERSfollows chat-sdk.dev listing order andCatalogAdapterrequires both fields.create-chat-sdkreads adapter metadata from@chat-adapter/catalog.getAdapter()andlistEnvVars()now returnundefinedand `` for inherited object keys such as"toString", instead of returningObject.prototypemembers.fd291b8: feat(teams): let a card carry a text input
TextInput, which modals already use, is now also aCardChild, so a user can type a reply on the card instead of opening a dialog. Teams renders it as an Adaptive CardInput.Textwith the same mapping the modal converter uses, and the@chat-adapter/teams/cardssubpath emits the same element. Slack, Google Chat, Discord, GitHub, and Linear show its label as text. WhatsApp, Messenger, Twilio, and X omit it, so don't make an input the only content on a card that reaches them.ActionEventgainsvalues?: Record<string, string>, the card's own input values keyed by input ID. It has the same shape asModalSubmitEvent.values. The Teams adapter fills it from theAction.Submitpayload, and it is absent on platforms with no card inputs. A button'scallbackUrlPOST now carriesvaluestoo, so a webhook-driven flow with noonActionhandler still receives what was typed.An input is required unless
optionalis set, and Teams validates every input on the card before it lets a button through, so mark itoptionalunless the buttons beside it should be blocked until it is filled. That validation is client-side, so treatvaluesas user input and validate it in the handler. A Teams button withactionType: "modal"now renders withassociatedInputs: "none", so it opens its dialog without waiting on the card's inputs and doesn't send them.Teams merges card inputs into the button's own submit data, so a card
TextInputwith the IDactionId,value, ormsteamsthrows aValidationErrorwhen the card is rendered, and the@chat-adapter/teams/cardssubpath throws anError. Modal inputs can still useactionIdandvalue.CardChildgained a member, so an adapter outside this repo that exhausts the union with anevercheck needs atext_inputcase. Every in-repo converter reaches it through adefault:branch instead, so none needed changing.19c7aa2: Add a handler-only
onNewMessage(handler)overload for messages that reach pattern routing, including attachment-only messages without text. InvalidonNewMessagearguments now throw aChatErrorat registration.
Minor Changes
daaa0ac: Add
@chat-adapter/catalog, a zero-dependency catalog of every adapter on chat-sdk.dev. It lists official, vendor-official, and community adapters with their npm package, maintainer, README, and capability support, plus the factory export, peer dependencies, and environment variables for official and vendor-official adapters. New helpers includelistAdapters(),getCatalogEntry(), andgetFeatureSupport().The
chat/adapterssubpath is now deprecated. It re-exports the original API from@chat-adapter/catalog, so existing imports keep working. ItsADAPTERSkeeps alphabetical key order, and itsCatalogAdaptertype accepts objects without the newfeaturesandreadmefields. In@chat-adapter/catalog,ADAPTERSfollows chat-sdk.dev listing order andCatalogAdapterrequires both fields.create-chat-sdkreads adapter metadata from@chat-adapter/catalog.getAdapter()andlistEnvVars()now returnundefinedand `` for inherited object keys such as"toString", instead of returningObject.prototypemembers.fd291b8: feat(teams): let a card carry a text input
TextInput, which modals already use, is now also aCardChild, so a user can type a reply on the card instead of opening a dialog. Teams renders it as an Adaptive CardInput.Textwith the same mapping the modal converter uses, and the@chat-adapter/teams/cardssubpath emits the same element. Slack, Google Chat, Discord, GitHub, and Linear show its label as text. WhatsApp, Messenger, Twilio, and X omit it, so don't make an input the only content on a card that reaches them.ActionEventgainsvalues?: Record<string, string>, the card's own input values keyed by input ID. It has the same shape asModalSubmitEvent.values. The Teams adapter fills it from theAction.Submitpayload, and it is absent on platforms with no card inputs. A button'scallbackUrlPOST now carriesvaluestoo, so a webhook-driven flow with noonActionhandler still receives what was typed.An input is required unless
optionalis set, and Teams validates every input on the card before it lets a button through, so mark itoptionalunless the buttons beside it should be blocked until it is filled. That validation is client-side, so treatvaluesas user input and validate it in the handler. A Teams button withactionType: "modal"now renders withassociatedInputs: "none", so it opens its dialog without waiting on the card's inputs and doesn't send them.Teams merges card inputs into the button's own submit data, so a card
TextInputwith the IDactionId,value, ormsteamsthrows aValidationErrorwhen the card is rendered, and the@chat-adapter/teams/cardssubpath throws anError. Modal inputs can still useactionIdandvalue.CardChildgained a member, so an adapter outside this repo that exhausts the union with anevercheck needs atext_inputcase. Every in-repo converter reaches it through adefault:branch instead, so none needed changing.19c7aa2: Add a handler-only
onNewMessage(handler)overload for messages that reach pattern routing, including attachment-only messages without text. InvalidonNewMessagearguments now throw aChatErrorat registration.08081fa: Reject AI tool calls that have no conversation scope when they run inside a handler with no conversation, such as an action in App Home or inside a modal, an options-load handler, or a modal opened outside a thread or channel. Pass an explicit
scope, orscope: falsefor intentionally workspace-wide access. Calls outside any handler, such as in a cron job or script, still run workspace-wide and log a warning. An emptyscopeid now throws when the tools are created.The standalone tool factories exported from
chat/ai, such asfetchMessagesandpostMessage, now acceptscopeandstrictScopeand follow the same rules ascreateChatTools. Inside a handler they inherit the conversation being handled, so a call that targets another channel is now rejected. Outside a handler they log the same unscoped warning once per tool. Passing a guard function still works but is deprecated in favor ofscope.7b7d73c: Add a
visibleTooption toButtonandLinkButtonthat lists the user IDs allowed to see the button. The Slack adapter renders it asvisible_to_user_ids. Other adapters ignore it and show the button to everyone. It only hides the button, so action handlers still need to check who clicked.f8527b2: Add an optional
aiGeneratedfield toPostableRaw,PostableMarkdown,PostableAst,PostableCard,StreamingPlanOptions, andStreamOptions. When it'strue, adapters with a native AI label show it. The Teams adapter shows Teams' "AI generated" label on new, edited, channel, targeted, and streamed messages. An edit must set the flag again to keep the label. The built-in AI tools now setaiGenerated: trueon themarkdownandrawmessages they post or edit.9a83b22: Isolate Slack message concurrency and turn cancellation by installation to prevent cross-workspace bot token reuse. Adapters can now namespace dedupe, lock, queue, and turn keys with the optional
Adapter.getConcurrencyScope()hook. In multi-workspace mode, messages queued under the old keys aren't migrated, and old and new workers don't exclude each other, so upgradechatand@chat-adapter/slacktogether and restart all workers.f635dbe: Add a Twitch adapter. It reads channel chat through EventSub webhooks, replies with the Helix Chat API as a bot account, deletes messages as a moderator, and sends and receives whispers. The
chat/adapterscatalog andcreate-chat-sdknow include Twitch.
Patch Changes
2f1cfa2: Allow
SlackAdapterandTelegramAdapterto be assigned toAdapterwhenexactOptionalPropertyTypesis enabled.19c7aa2: Fix
onNewMessagepatterns with the global or sticky flag so they match on every message instead of skipping alternate ones.80e7bae: Stop describing the ioredis state adapter as supporting Redis Cluster. Its
clientoption accepts an ioredisRedisinstance, which aClusterdoesn't satisfy; Sentinel is still supported.08081fa: Keep modal context until the modal closes, so
relatedThreadandrelatedChannelare still available when a user resubmits after a submit handler returns validation errors, or after anupdateorpushresponse.8178fdb: Fix Workflow DevKit workflows failing to start with
ReferenceError: AbortController is not defined. The default thread signal is now created on first use, and threads revived inside the workflow VM get an inert signal that never aborts.
4.41.0
18 Sep 2026ad90432: Add opt-in selection change events for Select and RadioSelect inputs in Slack modals
dc2a777: Add TanStack AI support.
thread.post(),thread.reply(), andchannel.post()accept the stream returned by TanStack'schat(), and the newchat/ai/tanstacksubpath providestoTanStackMessagesfor thread history andcreateTanStackToolsfor the Chat SDK toolset. Neither adds a runtime dependency on@tanstack/ai; the tools require zod 4.2 or newer.139d337: Support Vercel Connect in the Teams adapter with lazy app identity resolution and custom webhook verification. Ensure custom Bot Framework and Graph token factories take precedence over client-secret environment variables.
Add Teams to
create-chat-sdk --connectand interactive Connect scaffolding, including the helper, connector environment variable, and setup documentation.
Minor Changes
ad90432: Add opt-in selection change events for Select and RadioSelect inputs in Slack modals
dc2a777: Add TanStack AI support.
thread.post(),thread.reply(), andchannel.post()accept the stream returned by TanStack'schat(), and the newchat/ai/tanstacksubpath providestoTanStackMessagesfor thread history andcreateTanStackToolsfor the Chat SDK toolset. Neither adds a runtime dependency on@tanstack/ai; the tools require zod 4.2 or newer.139d337: Support Vercel Connect in the Teams adapter with lazy app identity resolution and custom webhook verification. Ensure custom Bot Framework and Graph token factories take precedence over client-secret environment variables.
Add Teams to
create-chat-sdk --connectand interactive Connect scaffolding, including the helper, connector environment variable, and setup documentation.2e2426d: Add
onInstalledandonUninstalledhandlers for installation lifecycle events. The Teams adapter emits them forinstallationUpdateactivities, including theadd-upgradeandremove-upgradeactions, with a persistablechannelIdfor later proactive messages.The Teams adapter now sends, edits, deletes, reacts, and types against the service URL encoded in the thread ID instead of the app-wide default, so conversations hosted on regional or sovereign Bot Framework endpoints are reached correctly. An explicit
apiUrlstill pins every call to that endpoint.8421953: feat(teams): render tables as the Adaptive Card 1.5 Table element
The Teams adapter now renders
Tableas the native Adaptive CardsTableelement instead of aContainerofColumnSets. Teams draws grid lines between cells, sizes columns by relative weight and marks the header row for accessibility. The@chat-adapter/teams/cardssubpath emits the same element.Tablegains optional rendering options that only Teams reads:widths(positive integer column weights),verticalAlign(vertical alignment of cell content),gridLines(defaulttrue) andgridStyle. Other adapters ignore them. PassgridLines: falseto keep a borderless table.The chat JSX runtime now forwards
alignon<Table>, matchingfromReactElement.056d883: Allow
history.user.maxPerUserand legacytranscripts.maxPerUserto befalseto disable count-based history eviction. The default remains 200 entries per user.fcdc1c9: Honor an adapter's definitive
isMention: falseinstead of re-detecting mentions from the message text.An adapter that reads structured platform content reports
trueorfalse, and the SDK falls back to matching@usernamein the text only when the adapter reports nothing. A definitivefalsenow wins, so an adapter can suppress a mention that exists only in text its platform renders literally, such as a code sample. Adapters that previously returnedfalseto mean "not detected" should returnundefinedinstead. Direct messages are unchanged: with noonDirectMessagehandler registered they still route toonNewMention.Adapter changes that follow from the new contract:
Linear: ordinary comments are left undetermined, so SDK text detection still applies to them.
Notion:
keywordmode leaves comments without a keyword match undetermined instead of reportingfalse, so@userNamein the text still counts.X: posts rebuilt from raw or fetched by id are left undetermined instead of reporting
false. Onlypost.mention.createevents reporttrue.Discord: a real ping, role mention,
@everyone, or allowlisted channel reportstrue; anything else is left undetermined instead offalse, so a literal@botnametyped in the text still counts as before.
Patch Changes
f233ffe: Retry initialization after a failed state connection. Once the state adapter (for example Redis) recovers, the next
initialize()call or webhook tries again instead of rejecting with the original connection error. Concurrent callers still share one attempt. Adapter initialization failures remain cached untilshutdown()so retries cannot restart adapters that are already running or still starting.91683e5: Wait for Telegram polling handlers to settle before advancing update offsets.
c21ccbc: Add an opt-in webhook option to propagate message, action, and slash command handler errors through
waitUntilwhile preserving default behavior.
4.40.0
5 Sep 20264a0b5c0: Add
tooltiptoButtonandLinkButton, and awidthhint toCard. The Teams adapter and the@chat-adapter/teams/cardssubpath render them as the Adaptive Card actiontooltipand themsteamsfull-width card property; other adapters ignore them. Emitted Adaptive Cards now declare schema version 1.5, which is the version that introduced action tooltips. Buttons with acallbackUrlkeep theirtooltipand other fields when the URL is swapped for a callback token.f485255: Harden webhook tenant isolation, require explicit Google Chat bot identity for reliable mention handling, use native Google Chat pagination, isolate Slack caches, and bound recording storage.
b7c9316: Tighten AI tool and queued-message scoping, isolate direct-message conversations, preserve ephemeral follow-ups, consume callback tokens once, and mark external link metadata as untrusted.
Dependency tracking · free for 3 projects
Know when your own dependencies move
chat shipped a new major in the last 12 months, among 60 releases. Inlinr shows which of your projects are behind, and what the upgrade breaks.
Advisories reach you
An email when a critical or high advisory affects a project, before the next install.
Upgrades checked first
Peer ranges, Node, ESM-only and types changes read before you bump.
Only what matters
Majors and breaking notes stay; patches and sibling bumps fold into one line.
Registry facts last checked 22 Oct 2026. Releases and advisories last read 22 Oct 2026.