# Trigger.dev v4.5.13 — trigger.dev v4.5.13 - Product: Trigger.dev (https://whatsnew.fyi/product/trigger-dev) - Vendor: Trigger.dev - Date: 2026-08-28 - Version: v4.5.13 - Original notes: https://github.com/triggerdotdev/trigger.dev/releases/tag/v4.5.13 - Permalink: https://whatsnew.fyi/product/trigger-dev/releases/v4.5.13 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **changed** — trigger.dev deploy now asks the server whether to build with Depot or the native build server unless --native-build, --depot-build, or --local-build is passed, allowing per-organization rollout without CLI changes - **added** — Add an experimental --local-bundle deploy flag that runs install and bundling steps on your machine and uploads only the build output while the image is built remotely - **changed** — Send the CLI version header on all API requests so deployments are attributable to a CLI version - **changed** — Messages that arrive mid-turn and are not injected are now answered as the next turn instead of being dropped - **changed** — Browser chats now keep the active turn open across page reloads when older completion records are replayed - **added** — Add chat.endAndContinue() to hand off a conversation to a fresh run on the latest deployed task version while preserving unconsumed Session input - **changed** — Custom chat agents now validate and parse client data declared with chat.withClientData({ schema }) before passing it to agent code - **fixed** — Fix a case where a chat could silently lose a message if it arrived while the agent was between turns and a stop arrived after it - **fixed** — Fix a recovered answer being cut off after a crash by only applying a stop to the turn that was live when it arrived - **fixed** — Fix a retried send being answered twice when its idempotency claim was lost - **added** — Custom agent loops can now inspect pending chat input without consuming it using chat.messages.hasPending() and chat.messages.next() ##### Upgrade ```sh npx trigger.dev@latest update # npm pnpm dlx trigger.dev@latest update # pnpm yarn dlx trigger.dev@latest update # yarn bunx trigger.dev@latest update # bun ``` Self-hosted Docker image: [`ghcr.io/triggerdotdev/trigger.dev:v4.5.13`](https://github.com/triggerdotdev/trigger.dev/pkgs/container/trigger.dev/1181949158?tag=v4.5.13) ##### Release notes Read the full release notes: https://trigger.dev/changelog/v4-5-13 ##### What's changed ##### Improvements - `trigger.dev deploy` now asks the server whether to build with Depot or the native build server unless `--native-build`, `--depot-build`, or `--local-build` is passed, so the native build server can be rolled out per organization without a CLI change. `--local-bundle` and `--detach` now require `--native-build`. ([#4803](https://github.com/triggerdotdev/trigger.dev/pull/4803)) - Add an experimental `--local-bundle` deploy flag that runs the install and bundling steps on your machine and uploads only the build output; the image is still built remotely. Useful when your project's install step needs tooling or credentials that only exist locally. ([#4331](https://github.com/triggerdotdev/trigger.dev/pull/4331)) - Send the CLI version header on all API requests so deployments are attributable to a CLI version ([#4778](https://github.com/triggerdotdev/trigger.dev/pull/4778)) - A message that arrives mid-turn and is not injected into that turn is now answered as the next turn, instead of being dropped. This is what the `pendingMessages` docs have always described, and it applies to the default too: configuring `pendingMessages` without a `shouldInject` declines every batch, which previously meant every mid-turn message was lost with no error at either end. ([#4795](https://github.com/triggerdotdev/trigger.dev/pull/4795)) ```ts chat.agent({ id: "my-chat", pendingMessages: { onReceived: ({ message }) => logger.info("arrived mid-turn", { id: message.id }), // Only interrupt once the agent has started calling tools. shouldInject: ({ steps }) => steps.length > 0, }, run: async ({ messages, signal }) => streamText({ model, messages, abortSignal: signal, // Required for injection. Without it nothing injects, and every // mid-turn message is answered as the next turn instead. ...chat.toStreamTextOptions(), }), }); ``` A declined message keeps its place in the queue, so it survives a crash and is answered by whichever run picks the conversation up. An injected one is consumed at the moment it is injected, so it is never also answered as a later turn. - Browser chats now keep the active turn open across page reloads when older completion records are replayed. ([#4643](https://github.com/triggerdotdev/trigger.dev/pull/4643)) - Add `chat.endAndContinue()` so fully hand-rolled custom chat agents can hand a conversation off to a fresh run on the latest deployed task version while preserving unconsumed Session input. ([#4647](https://github.com/triggerdotdev/trigger.dev/pull/4647)) - Custom chat agents now validate and parse client data declared with `chat.withClientData({ schema })` before passing it to agent code. ([#4646](https://github.com/triggerdotdev/trigger.dev/pull/4646)) ##### Bug fixes - Fixes a case where a chat could silently lose a message. If a message arrived while the agent was between turns and a stop arrived after it, the cursor the next boot resumed from could point past that message, so it was never answered and no error was raised. This affected `chat.agent`, not just custom agents. ([#4644](https://github.com/triggerdotdev/trigger.dev/pull/4644)) Fixes a recovered answer being cut off. After a crash the agent replays the message it had not answered yet, but it was replaying the stop that arrived after that message too, so the turn answering it was aborted the moment it began. A stop is now only applied to _[Truncated at 4000 characters — full notes: https://github.com/triggerdotdev/trigger.dev/releases/tag/v4.5.13]_