6 improvements, 4 bug fixes, and 10 server changes.
Highlights
More reliable chat agents
This release hardens chat agent message delivery from end to end. A message that arrives while an agent is mid-turn is no longer dropped, a recovered answer after a crash is no longer cut off, and a message left outstanding when a run is killed is now re-answered on the next run. Together these close the cases where a chat could silently lose a message or leave a turn stuck.
Custom agents also get new building blocks. chat.messages.hasPending() and chat.messages.next() let a hand-rolled loop inspect pending input without consuming it and take one record at a time:
if (await chat.messages.hasPending()) { const record = await chat.messages.next({ timeoutInSeconds: 0 }); if (record) handle(record.payload);}
chat.endAndContinue() hands a conversation off to a fresh run on the latest deployed task version while preserving unconsumed session input, and chat.withClientData({ schema }) now validates and parses client data before it reaches agent code.
Improvements
-
A message that arrives mid-turn and isn't injected into the current turn is now answered as the next turn instead of being dropped. Previously, configuring
pendingMessageswithout ashouldInjectdeclined every batch, so every mid-turn message was silently lost. A declined message keeps its place in the queue and survives a crash; an injected one is consumed at injection and never also answered as a later turn. (#4795)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....chat.toStreamTextOptions(),}),}); -
Browser chats now keep the active turn open across page reloads when older completion records are replayed. (#4643)
-
Added
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) -
Custom chat agents now validate and parse client data declared with
chat.withClientData({ schema })before passing it to agent code. (#4646) -
Added an experimental
--local-bundledeploy 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) -
trigger.dev deploynow asks the server whether to build with Depot or the native build server, unless--native-build,--depot-build, or--local-buildis explicitly passed.--local-bundleand--detachnow require--native-build. (#4803)
Bug fixes
- Fixed several chat message reliability issues: a message arriving mid-turn could be silently lost if the run crashed; a recovered answer after a crash could be cut off because the stop that arrived during the turn was replayed into the recovery run; a retried send could be answered twice when its idempotency claim was lost. Custom agent loops can now inspect pending input without consuming it using
chat.messages.hasPending()and consume one record at a time withchat.messages.next(). (#4644) - Fixed a chat agent hanging after an interrupted turn: when a run was killed mid-answer and only the one message it was answering was still outstanding, the new run never replied to it. (#4768)
- Fixed chat transport discarding the next turn after stopping generation.
skipToTurnCompleteis now reset when a new message or action is sent, so a message sent afterstopGenerationstreams normally instead of leaving the chat stuck in a streaming state. (#4744) - Fixed a message sent while the agent was mid-answer being lost if the run then crashed. The cursor written at the end of each turn now holds back behind any message still waiting to be handled. The in-memory buffer for pending mid-turn messages has been removed from both
chat.agentandchat.createSession()so waiting messages are durable. (#4795)
Server changes
These changes are included in the v4.5.13 Docker image and are already live on Trigger.dev Cloud:
- Self-hosted instances can now disable the admin dashboard and user impersonation entirely via a new setting. (#4774)
- The dashboard has two new themes, Black and White, plus appearance options for stronger colors and underlined links. (#4547)
- Deployment logs no longer jump to the bottom while you are reading earlier output. Scroll up to pause auto-scroll; scroll back down or use the new scroll-to-bottom button in the log header to resume. (#4776)
- Customize the runs list: show, hide, and reorder columns, and add smart columns that pull a value out of a run's payload, metadata, or output. Column choices are saved in the page URL so you can share or bookmark a view. (#4652)
- The browser no longer offers to autofill or save environment variable values as saved credentials. (#4777)
- Cut webapp CPU usage by about a quarter on the routes workers call most. Detailed event-loop blocking traces are no longer recorded by default, as producing them was a significant part of that cost. (#4746)
- Runs list and
runs.listAPI requests that span too much data now return a clear error asking you to narrow the time range, instead of failing with a generic error. (#4773) - Improved performance and reliability of the runs list and
runs.listAPI, especially for large projects and filtered views. (#4763) - New Vercel connections now get version skew protection turned on automatically, so each run uses the task version its deployment shipped with. Automatic atomic deployments are deprecated and no longer offered when connecting a project, but remain available in your Vercel integration settings. (#4741)
- The Staging branch setting now shows a correct status when it's not available in the current configuration, instead of appearing editable and silently doing nothing on save. (#4784)
How to upgrade
Update the trigger.dev/* packages to v4.5.13 using your package manager:
npx trigger.dev@latest update # npmpnpm dlx trigger.dev@latest update # pnpmyarn dlx trigger.dev@latest update # yarnbunx trigger.dev@latest update # bun
Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.5.13.




