Trigger.dev v4.5.13

More reliable chat agent message delivery, new custom-agent building blocks, and customizable runs list columns.

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 pendingMessages without a shouldInject declined 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-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)

  • 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 explicitly passed. --local-bundle and --detach now 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 with chat.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. skipToTurnComplete is now reset when a new message or action is sent, so a message sent after stopGeneration streams 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.agent and chat.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.list API 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.list API, 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 # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun

Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.5.13.

Ready to start building?

Build and deploy your first task in 3 minutes.

Get started now