chore: release v4.5.13 - #4769
Open
github-actions[bot] wants to merge 1 commit into
Open
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 25, 2026 08:22
fdfb2ee to
df2e0d7
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 25, 2026 13:40
df2e0d7 to
41de363
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 25, 2026 13:51
41de363 to
911cec7
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 25, 2026 15:02
911cec7 to
894a046
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 25, 2026 16:32
894a046 to
1283973
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 26, 2026 08:21
1283973 to
a90bd10
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 26, 2026 11:00
a90bd10 to
d5f825d
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 26, 2026 13:29
d5f825d to
5f9cdb7
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 26, 2026 17:59
5f9cdb7 to
fd30a39
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 08:09
fd30a39 to
8345be2
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 09:10
8345be2 to
b3b76d7
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 10:59
b3b76d7 to
d3cb21b
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 14:01
d3cb21b to
45b7086
Compare
Contributor
Author
🧭 Helm Chart Prerelease PublishedVersion: Install: helm upgrade --install trigger \
oci://ghcr.io/triggerdotdev/charts/trigger \
--version "4.5.13-pr4769.45b7086"
|
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 14:59
45b7086 to
cf7bf39
Compare
ericallam
approved these changes
Aug 27, 2026
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 16:37
cf7bf39 to
1659b67
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 27, 2026 17:43
1659b67 to
ce6c2e8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
4 new features, 11 improvements, 5 bug fixes.
Improvements
Add 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)Send the CLI version header on all API requests so deployments are attributable to a CLI version (#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
pendingMessagesdocs have always described, and it applies to the default too: configuringpendingMessageswithout ashouldInjectdeclines every batch, which previously meant every mid-turn message was lost with no error at either end. (#4795)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)
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)Custom chat agents now validate and parse client data declared with
chat.withClientData({ schema })before passing it to agent code. (#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)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 the turn that was live when it arrived. That holds however the stop got there: sent after the last completed turn, or sent to a chat whose most recent turn was completed by an older version of the SDK.
One limitation to know about: the recovered answer is persisted correctly, but a chat page that stayed open across the crash keeps showing the partial answer it had already received. Reload the page to see the full recovered answer.
Also fixes a retried send being answered twice. When a send was retried and its idempotency claim was lost, the agent could consume the same message a second time.
Custom agent loops can now inspect pending chat input without consuming it, and consume one record at a time, with
chat.messages.hasPending()andchat.messages.next(). Records carry stable identifiers so a redelivery is recognisable.hasPending()answers for messages alone, so a message sitting behind a stop, or behind a record this version of the SDK does not recognise, still reports as pending and is still delivered. Anything the agent has no consumer for is discarded rather than left where it would make every message queued behind it undeliverable.chat.messages.next()returningundefinedmeans no message became consumable before the timeout.chat.writeTurnComplete()'ssessionInEventIdis the cursor that is safe to resume from, not the sequence of the record the turn answered. It is held back behind any message still waiting to be handled, so a value below the record you just handled is expected.Fixed a chat agent hanging after an interrupted turn: when a run was killed mid-answer (out of memory, crash, or eviction) and only the one message it was answering was still outstanding, the new run never replied to it. That message is now re-answered on the new run. (#4768)
Fix 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)Fixes 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 could point past a message that had arrived during that turn but had not been answered yet, so the next boot skipped it and no error was raised anywhere. Such a message is now held until a turn actually takes it. (#4795)
This also removes the in-memory buffer those messages used to sit in, on both
chat.agentandchat.createSession(), so a message waiting for its turn is durable rather than only present in the worker that received it.Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
Raw changeset output
Releases
@trigger.dev/build@4.5.13
Patch Changes
@trigger.dev/core@4.5.13trigger.dev@4.5.13
Patch Changes
--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/core@4.5.13@trigger.dev/build@4.5.13@trigger.dev/schema-to-json@4.5.13@trigger.dev/core@4.5.13
Patch Changes
Add 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)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
pendingMessagesdocs have always described, and it applies to the default too: configuringpendingMessageswithout ashouldInjectdeclines every batch, which previously meant every mid-turn message was lost with no error at either end. (#4795)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.
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)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 the turn that was live when it arrived. That holds however the stop got there: sent after the last completed turn, or sent to a chat whose most recent turn was completed by an older version of the SDK.
One limitation to know about: the recovered answer is persisted correctly, but a chat page that stayed open across the crash keeps showing the partial answer it had already received. Reload the page to see the full recovered answer.
Also fixes a retried send being answered twice. When a send was retried and its idempotency claim was lost, the agent could consume the same message a second time.
Custom agent loops can now inspect pending chat input without consuming it, and consume one record at a time, with
chat.messages.hasPending()andchat.messages.next(). Records carry stable identifiers so a redelivery is recognisable.hasPending()answers for messages alone, so a message sitting behind a stop, or behind a record this version of the SDK does not recognise, still reports as pending and is still delivered. Anything the agent has no consumer for is discarded rather than left where it would make every message queued behind it undeliverable.chat.messages.next()returningundefinedmeans no message became consumable before the timeout.chat.writeTurnComplete()'ssessionInEventIdis the cursor that is safe to resume from, not the sequence of the record the turn answered. It is held back behind any message still waiting to be handled, so a value below the record you just handled is expected.@trigger.dev/python@4.5.13
Patch Changes
@trigger.dev/sdk@4.5.13@trigger.dev/core@4.5.13@trigger.dev/build@4.5.13@trigger.dev/react-hooks@4.5.13
Patch Changes
@trigger.dev/core@4.5.13@trigger.dev/redis-worker@4.5.13
Patch Changes
@trigger.dev/core@4.5.13@trigger.dev/rsc@4.5.13
Patch Changes
@trigger.dev/core@4.5.13@trigger.dev/schema-to-json@4.5.13
Patch Changes
@trigger.dev/core@4.5.13@trigger.dev/sdk@4.5.13
Patch Changes
Fixed a chat agent hanging after an interrupted turn: when a run was killed mid-answer (out of memory, crash, or eviction) and only the one message it was answering was still outstanding, the new run never replied to it. That message is now re-answered on the new run. (#4768)
Browser chats now keep the active turn open across page reloads when older completion records are replayed. (#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)Fix 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)Custom chat agents now validate and parse client data declared with
chat.withClientData({ schema })before passing it to agent code. (#4646)Fixes 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 could point past a message that had arrived during that turn but had not been answered yet, so the next boot skipped it and no error was raised anywhere. Such a message is now held until a turn actually takes it. (#4795)
This also removes the in-memory buffer those messages used to sit in, on both
chat.agentandchat.createSession(), so a message waiting for its turn is durable rather than only present in the worker that received it.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
pendingMessagesdocs have always described, and it applies to the default too: configuringpendingMessageswithout ashouldInjectdeclines every batch, which previously meant every mid-turn message was lost with no error at either end. (#4795)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.
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)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 the turn that was live when it arrived. That holds however the stop got there: sent after the last completed turn, or sent to a chat whose most recent turn was completed by an older version of the SDK.
One limitation to know about: the recovered answer is persisted correctly, but a chat page that stayed open across the crash keeps showing the partial answer it had already received. Reload the page to see the full recovered answer.
Also fixes a retried send being answered twice. When a send was retried and its idempotency claim was lost, the agent could consume the same message a second time.
Custom agent loops can now inspect pending chat input without consuming it, and consume one record at a time, with
chat.messages.hasPending()andchat.messages.next(). Records carry stable identifiers so a redelivery is recognisable.hasPending()answers for messages alone, so a message sitting behind a stop, or behind a record this version of the SDK does not recognise, still reports as pending and is still delivered. Anything the agent has no consumer for is discarded rather than left where it would make every message queued behind it undeliverable.chat.messages.next()returningundefinedmeans no message became consumable before the timeout.chat.writeTurnComplete()'ssessionInEventIdis the cursor that is safe to resume from, not the sequence of the record the turn answered. It is held back behind any message still waiting to be handled, so a value below the record you just handled is expected.Updated dependencies:
@trigger.dev/core@4.5.13