Skip to content

Tags: triggerdotdev/trigger.dev

Tags

v4.7.2

Toggle v4.7.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release v4.7.2 (#4996)

## Summary
3 improvements, 1 bug fix.

## Improvements
- Use the current Node.js LTS for deployments whose `runtime` is unset
or set to `"node"`. Set a versioned runtime such as `"node-24"` to keep
deployments pinned to that Node.js major.
([`9ecdf735e`](9ecdf73))
- `chat.agent` now sends parallel tool results to the model in the order
the tools were called, the same order the next turn's history uses.
Models that bind their thinking to the exact conversation (Claude Sonnet
5.5, Claude Opus 5.5, Claude Fable 5.1) no longer lose a turn's
reasoning, or fail the request on accounts that enforce the check, when
its tools finish out of order.
([`760737258`](7607372))
- Recovering a long unfinished `chat.agent` response on a continuation
run no longer blocks the worker. Rebuilding the response from its
streamed chunks now takes time linear in its length and yields to the
event loop as it goes, so heartbeats keep firing and the run is not
killed mid-replay. Capturing the response at the end of a long turn gets
the same speedup.
([`93c63c685`](93c63c6))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- Fix the "Download payload" and "Download output" buttons for large
payloads and outputs, which downloaded an error file instead of the
data.

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/build@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## trigger.dev@4.7.2

### Patch Changes

- Use the current Node.js LTS for deployments whose `runtime` is unset
or set to `"node"`. Set a versioned runtime such as `"node-24"` to keep
deployments pinned to that Node.js major.
([`9ecdf735e`](9ecdf73))
- Updated dependencies:
  - `@trigger.dev/build@4.7.2`
  - `@trigger.dev/core@4.7.2`
  - `@trigger.dev/schema-to-json@4.7.2`
## @trigger.dev/python@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/sdk@4.7.2`
  - `@trigger.dev/build@4.7.2`
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/react-hooks@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/redis-worker@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/rsc@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/schema-to-json@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/sdk@4.7.2

### Patch Changes

- `chat.agent` now sends parallel tool results to the model in the order
the tools were called, the same order the next turn's history uses.
Models that bind their thinking to the exact conversation (Claude Sonnet
5.5, Claude Opus 5.5, Claude Fable 5.1) no longer lose a turn's
reasoning, or fail the request on accounts that enforce the check, when
its tools finish out of order.
([`760737258`](7607372))
- Recovering a long unfinished `chat.agent` response on a continuation
run no longer blocks the worker. Rebuilding the response from its
streamed chunks now takes time linear in its length and yields to the
event loop as it goes, so heartbeats keep firing and the run is not
killed mid-replay. Capturing the response at the end of a long turn gets
the same speedup.
([`93c63c685`](93c63c6))
- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/core@4.7.2

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v4.7.1

Toggle v4.7.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release v4.7.1 (#4994)

## Summary
2 improvements.

## Improvements
- `trigger.dev init` now stops with a clear error when the target
directory has no `package.json`, instead of installing packages into a
parent project. A custom task directory entered during interactive `init
<path>` is now written to `trigger.config.ts` relative to the project
directory.
([`9499bd2a8`](9499bd2))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- The CLI and MCP authorization page now shows the account and
organizations you're granting access to.

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/build@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## trigger.dev@4.7.1

### Patch Changes

- `trigger.dev init` now stops with a clear error when the target
directory has no `package.json`, instead of installing packages into a
parent project. A custom task directory entered during interactive `init
<path>` is now written to `trigger.config.ts` relative to the project
directory.
([`9499bd2a8`](9499bd2))
- Updated dependencies:
  - `@trigger.dev/build@4.7.1`
  - `@trigger.dev/core@4.7.1`
  - `@trigger.dev/schema-to-json@4.7.1`
## @trigger.dev/python@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/build@4.7.1`
  - `@trigger.dev/core@4.7.1`
  - `@trigger.dev/sdk@4.7.1`
## @trigger.dev/react-hooks@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/redis-worker@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/rsc@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/schema-to-json@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/sdk@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/core@4.7.1

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v.docker.4.7.2

Toggle v.docker.4.7.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release v4.7.2 (#4996)

## Summary
3 improvements, 1 bug fix.

## Improvements
- Use the current Node.js LTS for deployments whose `runtime` is unset
or set to `"node"`. Set a versioned runtime such as `"node-24"` to keep
deployments pinned to that Node.js major.
([`9ecdf735e`](9ecdf73))
- `chat.agent` now sends parallel tool results to the model in the order
the tools were called, the same order the next turn's history uses.
Models that bind their thinking to the exact conversation (Claude Sonnet
5.5, Claude Opus 5.5, Claude Fable 5.1) no longer lose a turn's
reasoning, or fail the request on accounts that enforce the check, when
its tools finish out of order.
([`760737258`](7607372))
- Recovering a long unfinished `chat.agent` response on a continuation
run no longer blocks the worker. Rebuilding the response from its
streamed chunks now takes time linear in its length and yields to the
event loop as it goes, so heartbeats keep firing and the run is not
killed mid-replay. Capturing the response at the end of a long turn gets
the same speedup.
([`93c63c685`](93c63c6))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- Fix the "Download payload" and "Download output" buttons for large
payloads and outputs, which downloaded an error file instead of the
data.

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/build@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## trigger.dev@4.7.2

### Patch Changes

- Use the current Node.js LTS for deployments whose `runtime` is unset
or set to `"node"`. Set a versioned runtime such as `"node-24"` to keep
deployments pinned to that Node.js major.
([`9ecdf735e`](9ecdf73))
- Updated dependencies:
  - `@trigger.dev/build@4.7.2`
  - `@trigger.dev/core@4.7.2`
  - `@trigger.dev/schema-to-json@4.7.2`
## @trigger.dev/python@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/sdk@4.7.2`
  - `@trigger.dev/build@4.7.2`
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/react-hooks@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/redis-worker@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/rsc@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/schema-to-json@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/sdk@4.7.2

### Patch Changes

- `chat.agent` now sends parallel tool results to the model in the order
the tools were called, the same order the next turn's history uses.
Models that bind their thinking to the exact conversation (Claude Sonnet
5.5, Claude Opus 5.5, Claude Fable 5.1) no longer lose a turn's
reasoning, or fail the request on accounts that enforce the check, when
its tools finish out of order.
([`760737258`](7607372))
- Recovering a long unfinished `chat.agent` response on a continuation
run no longer blocks the worker. Rebuilding the response from its
streamed chunks now takes time linear in its length and yields to the
event loop as it goes, so heartbeats keep firing and the run is not
killed mid-replay. Capturing the response at the end of a long turn gets
the same speedup.
([`93c63c685`](93c63c6))
- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/core@4.7.2

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v.docker.4.7.1

Toggle v.docker.4.7.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release v4.7.1 (#4994)

## Summary
2 improvements.

## Improvements
- `trigger.dev init` now stops with a clear error when the target
directory has no `package.json`, instead of installing packages into a
parent project. A custom task directory entered during interactive `init
<path>` is now written to `trigger.config.ts` relative to the project
directory.
([`9499bd2a8`](9499bd2))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- The CLI and MCP authorization page now shows the account and
organizations you're granting access to.

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/build@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## trigger.dev@4.7.1

### Patch Changes

- `trigger.dev init` now stops with a clear error when the target
directory has no `package.json`, instead of installing packages into a
parent project. A custom task directory entered during interactive `init
<path>` is now written to `trigger.config.ts` relative to the project
directory.
([`9499bd2a8`](9499bd2))
- Updated dependencies:
  - `@trigger.dev/build@4.7.1`
  - `@trigger.dev/core@4.7.1`
  - `@trigger.dev/schema-to-json@4.7.1`
## @trigger.dev/python@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/build@4.7.1`
  - `@trigger.dev/core@4.7.1`
  - `@trigger.dev/sdk@4.7.1`
## @trigger.dev/react-hooks@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/redis-worker@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/rsc@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/schema-to-json@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/sdk@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/core@4.7.1

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

helm-v4.7.2

Toggle helm-v4.7.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release v4.7.2 (#4996)

## Summary
3 improvements, 1 bug fix.

## Improvements
- Use the current Node.js LTS for deployments whose `runtime` is unset
or set to `"node"`. Set a versioned runtime such as `"node-24"` to keep
deployments pinned to that Node.js major.
([`9ecdf735e`](9ecdf73))
- `chat.agent` now sends parallel tool results to the model in the order
the tools were called, the same order the next turn's history uses.
Models that bind their thinking to the exact conversation (Claude Sonnet
5.5, Claude Opus 5.5, Claude Fable 5.1) no longer lose a turn's
reasoning, or fail the request on accounts that enforce the check, when
its tools finish out of order.
([`760737258`](7607372))
- Recovering a long unfinished `chat.agent` response on a continuation
run no longer blocks the worker. Rebuilding the response from its
streamed chunks now takes time linear in its length and yields to the
event loop as it goes, so heartbeats keep firing and the run is not
killed mid-replay. Capturing the response at the end of a long turn gets
the same speedup.
([`93c63c685`](93c63c6))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- Fix the "Download payload" and "Download output" buttons for large
payloads and outputs, which downloaded an error file instead of the
data.

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/build@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## trigger.dev@4.7.2

### Patch Changes

- Use the current Node.js LTS for deployments whose `runtime` is unset
or set to `"node"`. Set a versioned runtime such as `"node-24"` to keep
deployments pinned to that Node.js major.
([`9ecdf735e`](9ecdf73))
- Updated dependencies:
  - `@trigger.dev/build@4.7.2`
  - `@trigger.dev/core@4.7.2`
  - `@trigger.dev/schema-to-json@4.7.2`
## @trigger.dev/python@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/sdk@4.7.2`
  - `@trigger.dev/build@4.7.2`
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/react-hooks@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/redis-worker@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/rsc@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/schema-to-json@4.7.2

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/sdk@4.7.2

### Patch Changes

- `chat.agent` now sends parallel tool results to the model in the order
the tools were called, the same order the next turn's history uses.
Models that bind their thinking to the exact conversation (Claude Sonnet
5.5, Claude Opus 5.5, Claude Fable 5.1) no longer lose a turn's
reasoning, or fail the request on accounts that enforce the check, when
its tools finish out of order.
([`760737258`](7607372))
- Recovering a long unfinished `chat.agent` response on a continuation
run no longer blocks the worker. Rebuilding the response from its
streamed chunks now takes time linear in its length and yields to the
event loop as it goes, so heartbeats keep firing and the run is not
killed mid-replay. Capturing the response at the end of a long turn gets
the same speedup.
([`93c63c685`](93c63c6))
- Updated dependencies:
  - `@trigger.dev/core@4.7.2`
## @trigger.dev/core@4.7.2

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

helm-v4.7.1

Toggle helm-v4.7.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release v4.7.1 (#4994)

## Summary
2 improvements.

## Improvements
- `trigger.dev init` now stops with a clear error when the target
directory has no `package.json`, instead of installing packages into a
parent project. A custom task directory entered during interactive `init
<path>` is now written to `trigger.config.ts` relative to the project
directory.
([`9499bd2a8`](9499bd2))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- The CLI and MCP authorization page now shows the account and
organizations you're granting access to.

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/build@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## trigger.dev@4.7.1

### Patch Changes

- `trigger.dev init` now stops with a clear error when the target
directory has no `package.json`, instead of installing packages into a
parent project. A custom task directory entered during interactive `init
<path>` is now written to `trigger.config.ts` relative to the project
directory.
([`9499bd2a8`](9499bd2))
- Updated dependencies:
  - `@trigger.dev/build@4.7.1`
  - `@trigger.dev/core@4.7.1`
  - `@trigger.dev/schema-to-json@4.7.1`
## @trigger.dev/python@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/build@4.7.1`
  - `@trigger.dev/core@4.7.1`
  - `@trigger.dev/sdk@4.7.1`
## @trigger.dev/react-hooks@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/redis-worker@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/rsc@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/schema-to-json@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/sdk@4.7.1

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.1`
## @trigger.dev/core@4.7.1

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

docs-release-2026-10-02

Toggle docs-release-2026-10-02's commit message
Publish docs: Node.js LTS defaults, CI deployment API keys, and nativ…

…e realtime self-hosting

v4.7.0

Toggle v4.7.0's commit message
fix(supervisor): watch a restore Runner and report a failed restore

Supervisor: with the Runner CRD backend, a restore that fails on its
node is detected and reported with the reason, instead of only surfacing
when the platform's heartbeat timeout fires.
Mono-RevId: c95a9ebc98d5b336717fba5cae03510a46c5b19c

v.docker.4.7.0

Toggle v.docker.4.7.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore: release v4.7.0 (#4947)

## Summary
6 new features, 17 improvements, 13 bug fixes.

## Improvements
- Chat agents can now scope concurrency per session. Pass
`concurrencyKey` (for example, your chat ID or tenant ID) and
trigger-time named limits via `triggerConfig.concurrency` when starting
a chat session, from `chat.createStartSessionAction`, the `AgentChat`
client, or a handover. Keys are never defaulted, so a session without
one shares the task's keyless pool.
([`ea9758117`](ea97581))
  
  ```ts
  const start = chat.createStartSessionAction("support-chat", {
  triggerConfig: { concurrencyKey: user.id },
  });
  ```
- Concurrency limits can now be paused and resumed, just like queues:
`concurrencyLimits.pause(name)` stops every run holding the limit from
being dequeued while keeping its configured bounds, and
`concurrencyLimits.resume(name)` starts them again.
([`fa94febb6`](fa94feb))
  
  ```ts
  import { concurrencyLimits } from "@trigger.dev/sdk";
  
  await concurrencyLimits.pause("openai");
  await concurrencyLimits.resume("openai");
  ```
- Control a task's concurrency with the new `concurrency` option, and
share limits across tasks with named concurrency limits. An inline shape
caps the task itself; `concurrencyLimit()` declares a limit any task can
hold (up to two named limits per task), and a trigger call can switch a
run's named limits with its own `concurrency` option.
([`ea9758117`](ea97581))
  
  ```ts
  import { concurrencyLimit, task } from "@trigger.dev/sdk";
  
export const openaiLimit = concurrencyLimit({ name: "openai", total: 25
});
  
  export const generateSummary = task({
  id: "generate-summary",
  concurrency: [{ perKey: 1, total: 5 }, openaiLimit],
  run: async (payload) => {},
  });
  ```
  
`perKey` caps each `concurrencyKey` pool and `total` caps across
everything, keys or not. The queue-level `concurrencyLimit` option keeps
working unchanged and is deprecated in favor of `concurrency`.
Enforcement happens server-side; servers without support accept the
option but do not enforce it yet.
  
Manage limits at runtime with the new `concurrencyLimits` namespace:
`list()` and `retrieve(name)` report each limit's bounds plus its live
`running` and `queued` counts, `override(name, { perKey, total })`
changes only the given bounds (overriding `total` to `0` pauses the
limit), and `reset(name)` restores the declared values.
  
Queue reads (`queues.list()` and `queues.retrieve()`) now report a
`version` that discriminates the shape: `V1` queues keep today's fields
(their own `concurrencyLimit` and its override state), while `V2` queues
(tasks declared with `concurrency`) carry no queue-level concurrency,
since their limits are read and overridden through `concurrencyLimits`
(a task's inline limit under its derived `task/<task-id>` name).
Existing reads keep compiling: a `V2` queue reports `concurrencyLimit`
as null and `concurrency` as undefined.
- Chat streams now report `Stream stalled: no records received` after
five retries of a connected stream that sends no records. Network
failures and browser wakeups retain automatic recovery. Healthy tool
calls with no records for about six minutes also reach this silence
limit. Watch subscriptions remain unlimited, and caller cancellation
still closes cleanly.
([#4949](#4949))
- Webhook verifier artifacts can now declare the provider's response
contract as data: a handshake `respondStatus`, the status codes returned
for accepted deliveries and rejected signatures, and a GET verification
flow (`getHandshake`) for providers that confirm a callback URL with a
challenge. HMAC verifiers can read the timestamp from a body field,
which the Linear provider config uses for its replay window, and the
dashboard's test-send re-signs a recorded sample as of now so it passes
that window.
([`5f54fb27f`](5f54fb2))
- Add an optional `onSettled` callback to
`TriggerChatTransport.sendAction()` so callers can confirm that their
action's input was processed, independently of whether the response
stream closes.
([#4956](#4956))
- Chat agents now return to a durable wait when a session wake does not
deliver a matching message. This prevents resumed runs from staying
active until their maximum duration and preserves the configured turn
timeout across repeated wakes.
([`e6ec2c4e8`](e6ec2c4))
- Deprecate `queues.overrideConcurrencyLimit` and
`queues.resetConcurrencyLimit`. These operate on the legacy model where
a queue carried its own concurrency limit; declare concurrency with the
task `concurrency` option and manage it with
`concurrencyLimits.override` and `concurrencyLimits.reset` instead.
([`414e5a268`](414e5a2))
- Steering messages now remain in context across agent steps and keep
their original position in saved conversations, including custom
response data written between steps.
([`5619acf26`](5619acf))
- Set up a new Trigger.dev account from the CLI. Login can prefill an
email address, save the user's full name after authorization, and resume
authorization later, while `init` can create the first organization,
activate its Free plan, and create the first project before scaffolding
the app.
([`fb3b26d4f`](fb3b26d))
- Added a `submit_feedback` MCP tool so coding agents can report a
confusing tool error, a docs mismatch, or a missing capability without
the user having to file it by hand. Turn it off with `--skip-telemetry`
or `TRIGGER_TELEMETRY_DISABLED`; the tool is hidden while it is off.
([`9d38ff508`](9d38ff5))
- Authenticate `trigger promote` with environment API keys supplied
through `TRIGGER_ACCESS_TOKEN`. Environment API key commands now use the
saved profile API URL when no explicit override is provided.
([`562c9433a`](562c943))
- Convert Zod 4 `z.date()` fields to date-time strings in JSON Schema
without weakening validation for other unsupported types. This prevents
MCP tool discovery from failing when a tool input schema contains a
date.
([`f8babdf9b`](f8babdf))

## Bug fixes
- Fix stale and empty project environment values in `trigger dev`, and
support empty values in `syncEnvVars()`.
([`f384e8334`](f384e83))
- Fixes warm starts silently failing for deployments built with 4.6.0 to
4.6.3 in projects that resolve `zod` to a 3.x release. The runner could
not parse the run handed to it by the warm-start service and exited,
leaving the run waiting until the platform redrove it a few minutes
later and started it cold. Redeploy to pick up the fix.
([#4972](#4972))
- Fix a ~6-second delay between a task finishing and its run completing
(and a ~31-second delay when cancelling a run) in projects that use zod
4.4 or newer. Run cost and billed usage was not impacted by this issue.
([#4980](#4980))
- Fix Windows deploys failing at indexing with `Cannot find module` on a
percent-encoded path when the project directory contains spaces or
non-ASCII characters.
([`b32c1d157`](b32c1d1))

## Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

- One concurrency key with a large backlog no longer holds up runs
waiting on other keys on the same queue.
([#4367](#4367))
- API rate limit usage is now recorded per environment in the `metrics`
table as `api.rate_limit.allowed`, `api.rate_limit.denied`,
`api.rate_limit.remaining_min` and the limit itself
(`api.rate_limit.limit.per_second` and `api.rate_limit.limit.burst`), so
you can chart requests against your limit and 429s over time on the
Query page and dashboards.
- Archive queues you no longer use from the Concurrency page. Archived
queues are hidden from the list and no longer count towards allocated
concurrency.
- Automatically archive preview branches after a configurable period
without deployments, with protected branch names and a preview of
affected branches.
- Download a session’s original saved transcript file from the session
inspector.
- Organization Owners and Admins can now choose, in Settings under
Support Access, whether Trigger.dev support can open their dashboard
directly or only after an Owner or Admin approves a request, with each
approval lasting 7 days.
- Allocating extra concurrency to environments now requires billing
permissions, the same as purchasing it. Allocation changes are also
applied atomically, so simultaneous edits can no longer exceed your
purchased concurrency.
- Changing your account email address now sends a confirmation link to
the new address; the change only takes effect once that link is opened.
Requesting a magic link no longer creates an account until the link is
used.
- Removed the organization-wide Node.js 21 deprecation banner while
keeping runtime upgrade guidance in Projects settings.
- Creating a project now asks only for its name.
- Prevent batch waits from remaining suspended when batch completion is
briefly interrupted
- Reject batch-and-wait requests when the parent run belongs to another
environment
- Keep dashboard pages visible during network interruptions, with a
disconnected banner and a Refresh button instead of a full-page error.
- Allow deployments to replace declarative schedules at the schedule
limit when the resulting set stays within quota.
- "Deploy now" now tells you when the branch doesn't exist on GitHub
instead of showing a generic error, and a first deployment no longer
flags a harmless build-cache message as an error.
- Support empty-string environment values across the dashboard, API, and
Vercel sync behind a feature flag, disabled by default.
- Fixed a bug where a burst of telemetry could leave OpenTelemetry
ingest rejecting every batch for a long time. Batches that wait too long
are now dropped individually instead of restarting the processing
workers, so ingest recovers as soon as the burst passes.
- Keep scheduled task "Last run" times stable across unchanged
deployments and align them with configured schedule windows.
- Team members and pending invites on the organization Team page are now
listed in alphabetical order.

<details>
<summary>Raw changeset output</summary>

# Releases
## @trigger.dev/core@4.7.0

### Minor Changes

- Chat agents can now scope concurrency per session. Pass
`concurrencyKey` (for example, your chat ID or tenant ID) and
trigger-time named limits via `triggerConfig.concurrency` when starting
a chat session, from `chat.createStartSessionAction`, the `AgentChat`
client, or a handover. Keys are never defaulted, so a session without
one shares the task's keyless pool.
([`ea9758117`](ea97581))

  ```ts
  const start = chat.createStartSessionAction("support-chat", {
    triggerConfig: { concurrencyKey: user.id },
  });
  ```

- Concurrency limits can now be paused and resumed, just like queues:
`concurrencyLimits.pause(name)` stops every run holding the limit from
being dequeued while keeping its configured bounds, and
`concurrencyLimits.resume(name)` starts them again.
([`fa94febb6`](fa94feb))

  ```ts
  import { concurrencyLimits } from "@trigger.dev/sdk";

  await concurrencyLimits.pause("openai");
  await concurrencyLimits.resume("openai");
  ```

- Control a task's concurrency with the new `concurrency` option, and
share limits across tasks with named concurrency limits. An inline shape
caps the task itself; `concurrencyLimit()` declares a limit any task can
hold (up to two named limits per task), and a trigger call can switch a
run's named limits with its own `concurrency` option.
([`ea9758117`](ea97581))

  ```ts
  import { concurrencyLimit, task } from "@trigger.dev/sdk";

export const openaiLimit = concurrencyLimit({ name: "openai", total: 25
});

  export const generateSummary = task({
    id: "generate-summary",
    concurrency: [{ perKey: 1, total: 5 }, openaiLimit],
    run: async (payload) => {},
  });
  ```

`perKey` caps each `concurrencyKey` pool and `total` caps across
everything, keys or not. The queue-level `concurrencyLimit` option keeps
working unchanged and is deprecated in favor of `concurrency`.
Enforcement happens server-side; servers without support accept the
option but do not enforce it yet.

Manage limits at runtime with the new `concurrencyLimits` namespace:
`list()` and `retrieve(name)` report each limit's bounds plus its live
`running` and `queued` counts, `override(name, { perKey, total })`
changes only the given bounds (overriding `total` to `0` pauses the
limit), and `reset(name)` restores the declared values.

Queue reads (`queues.list()` and `queues.retrieve()`) now report a
`version` that discriminates the shape: `V1` queues keep today's fields
(their own `concurrencyLimit` and its override state), while `V2` queues
(tasks declared with `concurrency`) carry no queue-level concurrency,
since their limits are read and overridden through `concurrencyLimits`
(a task's inline limit under its derived `task/<task-id>` name).
Existing reads keep compiling: a `V2` queue reports `concurrencyLimit`
as null and `concurrency` as undefined.

### Patch Changes

- Fix stale and empty project environment values in `trigger dev`, and
support empty values in `syncEnvVars()`.
([`f384e8334`](f384e83))
- Chat streams now report `Stream stalled: no records received` after
five retries of a connected stream that sends no records. Network
failures and browser wakeups retain automatic recovery. Healthy tool
calls with no records for about six minutes also reach this silence
limit. Watch subscriptions remain unlimited, and caller cancellation
still closes cleanly.
([#4949](#4949))
- Fixes warm starts silently failing for deployments built with 4.6.0 to
4.6.3 in projects that resolve `zod` to a 3.x release. The runner could
not parse the run handed to it by the warm-start service and exited,
leaving the run waiting until the platform redrove it a few minutes
later and started it cold. Redeploy to pick up the fix.
([#4972](#4972))
- Fix a ~6-second delay between a task finishing and its run completing
(and a ~31-second delay when cancelling a run) in projects that use zod
4.4 or newer. Run cost and billed usage was not impacted by this issue.
([#4980](#4980))
- Webhook verifier artifacts can now declare the provider's response
contract as data: a handshake `respondStatus`, the status codes returned
for accepted deliveries and rejected signatures, and a GET verification
flow (`getHandshake`) for providers that confirm a callback URL with a
challenge. HMAC verifiers can read the timestamp from a body field,
which the Linear provider config uses for its replay window, and the
dashboard's test-send re-signs a recorded sample as of now so it passes
that window.
([`5f54fb27f`](5f54fb2))
## @trigger.dev/react-hooks@4.7.0

### Minor Changes

- Control a task's concurrency with the new `concurrency` option, and
share limits across tasks with named concurrency limits. An inline shape
caps the task itself; `concurrencyLimit()` declares a limit any task can
hold (up to two named limits per task), and a trigger call can switch a
run's named limits with its own `concurrency` option.
([`ea9758117`](ea97581))

  ```ts
  import { concurrencyLimit, task } from "@trigger.dev/sdk";

export const openaiLimit = concurrencyLimit({ name: "openai", total: 25
});

  export const generateSummary = task({
    id: "generate-summary",
    concurrency: [{ perKey: 1, total: 5 }, openaiLimit],
    run: async (payload) => {},
  });
  ```

`perKey` caps each `concurrencyKey` pool and `total` caps across
everything, keys or not. The queue-level `concurrencyLimit` option keeps
working unchanged and is deprecated in favor of `concurrency`.
Enforcement happens server-side; servers without support accept the
option but do not enforce it yet.

Manage limits at runtime with the new `concurrencyLimits` namespace:
`list()` and `retrieve(name)` report each limit's bounds plus its live
`running` and `queued` counts, `override(name, { perKey, total })`
changes only the given bounds (overriding `total` to `0` pauses the
limit), and `reset(name)` restores the declared values.

Queue reads (`queues.list()` and `queues.retrieve()`) now report a
`version` that discriminates the shape: `V1` queues keep today's fields
(their own `concurrencyLimit` and its override state), while `V2` queues
(tasks declared with `concurrency`) carry no queue-level concurrency,
since their limits are read and overridden through `concurrencyLimits`
(a task's inline limit under its derived `task/<task-id>` name).
Existing reads keep compiling: a `V2` queue reports `concurrencyLimit`
as null and `concurrency` as undefined.

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.0`
## @trigger.dev/sdk@4.7.0

### Minor Changes

- Chat agents can now scope concurrency per session. Pass
`concurrencyKey` (for example, your chat ID or tenant ID) and
trigger-time named limits via `triggerConfig.concurrency` when starting
a chat session, from `chat.createStartSessionAction`, the `AgentChat`
client, or a handover. Keys are never defaulted, so a session without
one shares the task's keyless pool.
([`ea9758117`](ea97581))

  ```ts
  const start = chat.createStartSessionAction("support-chat", {
    triggerConfig: { concurrencyKey: user.id },
  });
  ```

- Concurrency limits can now be paused and resumed, just like queues:
`concurrencyLimits.pause(name)` stops every run holding the limit from
being dequeued while keeping its configured bounds, and
`concurrencyLimits.resume(name)` starts them again.
([`fa94febb6`](fa94feb))

  ```ts
  import { concurrencyLimits } from "@trigger.dev/sdk";

  await concurrencyLimits.pause("openai");
  await concurrencyLimits.resume("openai");
  ```

- Control a task's concurrency with the new `concurrency` option, and
share limits across tasks with named concurrency limits. An inline shape
caps the task itself; `concurrencyLimit()` declares a limit any task can
hold (up to two named limits per task), and a trigger call can switch a
run's named limits with its own `concurrency` option.
([`ea9758117`](ea97581))

  ```ts
  import { concurrencyLimit, task } from "@trigger.dev/sdk";

export const openaiLimit = concurrencyLimit({ name: "openai", total: 25
});

  export const generateSummary = task({
    id: "generate-summary",
    concurrency: [{ perKey: 1, total: 5 }, openaiLimit],
    run: async (payload) => {},
  });
  ```

`perKey` caps each `concurrencyKey` pool and `total` caps across
everything, keys or not. The queue-level `concurrencyLimit` option keeps
working unchanged and is deprecated in favor of `concurrency`.
Enforcement happens server-side; servers without support accept the
option but do not enforce it yet.

Manage limits at runtime with the new `concurrencyLimits` namespace:
`list()` and `retrieve(name)` report each limit's bounds plus its live
`running` and `queued` counts, `override(name, { perKey, total })`
changes only the given bounds (overriding `total` to `0` pauses the
limit), and `reset(name)` restores the declared values.

Queue reads (`queues.list()` and `queues.retrieve()`) now report a
`version` that discriminates the shape: `V1` queues keep today's fields
(their own `concurrencyLimit` and its override state), while `V2` queues
(tasks declared with `concurrency`) carry no queue-level concurrency,
since their limits are read and overridden through `concurrencyLimits`
(a task's inline limit under its derived `task/<task-id>` name).
Existing reads keep compiling: a `V2` queue reports `concurrencyLimit`
as null and `concurrency` as undefined.

### Patch Changes

- Add an optional `onSettled` callback to
`TriggerChatTransport.sendAction()` so callers can confirm that their
action's input was processed, independently of whether the response
stream closes.
([#4956](#4956))
- Chat agents now return to a durable wait when a session wake does not
deliver a matching message. This prevents resumed runs from staying
active until their maximum duration and preserves the configured turn
timeout across repeated wakes.
([`e6ec2c4e8`](e6ec2c4))
- Deprecate `queues.overrideConcurrencyLimit` and
`queues.resetConcurrencyLimit`. These operate on the legacy model where
a queue carried its own concurrency limit; declare concurrency with the
task `concurrency` option and manage it with
`concurrencyLimits.override` and `concurrencyLimits.reset` instead.
([`414e5a268`](414e5a2))
- Chat streams now report `Stream stalled: no records received` after
five retries of a connected stream that sends no records. Network
failures and browser wakeups retain automatic recovery. Healthy tool
calls with no records for about six minutes also reach this silence
limit. Watch subscriptions remain unlimited, and caller cancellation
still closes cleanly.
([#4949](#4949))
- Steering messages now remain in context across agent steps and keep
their original position in saved conversations, including custom
response data written between steps.
([`5619acf26`](5619acf))
- Updated dependencies:
  - `@trigger.dev/core@4.7.0`
## @trigger.dev/build@4.7.0

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.0`
## trigger.dev@4.7.0

### Patch Changes

- Fix stale and empty project environment values in `trigger dev`, and
support empty values in `syncEnvVars()`.
([`f384e8334`](f384e83))
- Set up a new Trigger.dev account from the CLI. Login can prefill an
email address, save the user's full name after authorization, and resume
authorization later, while `init` can create the first organization,
activate its Free plan, and create the first project before scaffolding
the app.
([`fb3b26d4f`](fb3b26d))
- Added a `submit_feedback` MCP tool so coding agents can report a
confusing tool error, a docs mismatch, or a missing capability without
the user having to file it by hand. Turn it off with `--skip-telemetry`
or `TRIGGER_TELEMETRY_DISABLED`; the tool is hidden while it is off.
([`9d38ff508`](9d38ff5))
- Authenticate `trigger promote` with environment API keys supplied
through `TRIGGER_ACCESS_TOKEN`. Environment API key commands now use the
saved profile API URL when no explicit override is provided.
([`562c9433a`](562c943))
- Fix Windows deploys failing at indexing with `Cannot find module` on a
percent-encoded path when the project directory contains spaces or
non-ASCII characters.
([`b32c1d157`](b32c1d1))
- Updated dependencies:
  - `@trigger.dev/schema-to-json@4.7.0`
  - `@trigger.dev/core@4.7.0`
  - `@trigger.dev/build@4.7.0`
## @trigger.dev/python@4.7.0

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/sdk@4.7.0`
  - `@trigger.dev/core@4.7.0`
  - `@trigger.dev/build@4.7.0`
## @trigger.dev/redis-worker@4.7.0

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.0`
## @trigger.dev/rsc@4.7.0

### Patch Changes

- Updated dependencies:
  - `@trigger.dev/core@4.7.0`
## @trigger.dev/schema-to-json@4.7.0

### Patch Changes

- Convert Zod 4 `z.date()` fields to date-time strings in JSON Schema
without weakening validation for other unsupported types. This prevents
MCP tool discovery from failing when a tool input schema contains a
date.
([`f8babdf9b`](f8babdf))
- Updated dependencies:
  - `@trigger.dev/core@4.7.0`

</details>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

re2-test-supervisor-main-f049c34

Toggle re2-test-supervisor-main-f049c34's commit message
fix(supervisor): watch a restore Runner and report a failed restore

Supervisor: with the Runner CRD backend, a restore that fails on its
node is detected and reported with the reason, instead of only surfacing
when the platform's heartbeat timeout fires.
Mono-RevId: c95a9ebc98d5b336717fba5cae03510a46c5b19c