chore: release v4.7.0 - #4947
github-actions[bot] wants to merge 1 commit into
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
169b3de to
bd3f9a6
Compare
bd3f9a6 to
fca2622
Compare
fca2622 to
ae1a3b8
Compare
ae1a3b8 to
eeb077a
Compare
eeb077a to
3d2240c
Compare
3d2240c to
5425e2b
Compare
5425e2b to
776d715
Compare
776d715 to
dedb058
Compare
dedb058 to
e22937d
Compare
e22937d to
7187118
Compare
7187118 to
db9f8dd
Compare
db9f8dd to
be4b6f9
Compare
be4b6f9 to
9219d3a
Compare
There was a problem hiding this comment.
Devin Review found 1 new potential issue.
⚠️ 1 issue in files not directly in the diff
⚠️ Docker ignores the replication URL
Docker users setting WEBHOOK_DELIVERIES_REPLICATION_DATABASE_URL never pass it into the webapp container. Replication falls back to the pooled writer URL and cannot start.
9219d3a to
7083ac1
Compare
7083ac1 to
14819cf
Compare
14819cf to
49579fc
Compare
49579fc to
0686c3f
Compare
Summary
2 new features, 10 improvements, 4 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 viatriggerConfig.concurrencywhen starting a chat session, fromchat.createStartSessionAction, theAgentChatclient, or a handover. Keys are never defaulted, so a session without one shares the task's keyless pool. (ea9758117)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, andconcurrencyLimits.resume(name)starts them again. (fa94febb6)Control a task's concurrency with the new
concurrencyoption, 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 ownconcurrencyoption. (ea9758117)perKeycaps eachconcurrencyKeypool andtotalcaps across everything, keys or not. The queue-levelconcurrencyLimitoption keeps working unchanged and is deprecated in favor ofconcurrency. Enforcement happens server-side; servers without support accept the option but do not enforce it yet.Manage limits at runtime with the new
concurrencyLimitsnamespace:list()andretrieve(name)report each limit's bounds plus its liverunningandqueuedcounts,override(name, { perKey, total })changes only the given bounds (overridingtotalto0pauses the limit), andreset(name)restores the declared values.Queue reads (
queues.list()andqueues.retrieve()) now report aversionthat discriminates the shape:V1queues keep today's fields (their ownconcurrencyLimitand its override state), whileV2queues (tasks declared withconcurrency) carry no queue-level concurrency, since their limits are read and overridden throughconcurrencyLimits(a task's inline limit under its derivedtask/<task-id>name). Existing reads keep compiling: aV2queue reportsconcurrencyLimitas null andconcurrencyas undefined.Chat streams now report
Stream stalled: no records receivedafter 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)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)Deprecate
queues.overrideConcurrencyLimitandqueues.resetConcurrencyLimit. These operate on the legacy model where a queue carried its own concurrency limit; declare concurrency with the taskconcurrencyoption and manage it withconcurrencyLimits.overrideandconcurrencyLimits.resetinstead. (414e5a268)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)Authenticate
trigger promotewith environment API keys supplied throughTRIGGER_ACCESS_TOKEN. Environment API key commands now use the saved profile API URL when no explicit override is provided. (562c9433a)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)Bug fixes
trigger dev, and support empty values insyncEnvVars(). (f384e8334)zodto 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)Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
Raw changeset output
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 viatriggerConfig.concurrencywhen starting a chat session, fromchat.createStartSessionAction, theAgentChatclient, or a handover. Keys are never defaulted, so a session without one shares the task's keyless pool. (ea9758117)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, andconcurrencyLimits.resume(name)starts them again. (fa94febb6)Control a task's concurrency with the new
concurrencyoption, 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 ownconcurrencyoption. (ea9758117)perKeycaps eachconcurrencyKeypool andtotalcaps across everything, keys or not. The queue-levelconcurrencyLimitoption keeps working unchanged and is deprecated in favor ofconcurrency. Enforcement happens server-side; servers without support accept the option but do not enforce it yet.Manage limits at runtime with the new
concurrencyLimitsnamespace:list()andretrieve(name)report each limit's bounds plus its liverunningandqueuedcounts,override(name, { perKey, total })changes only the given bounds (overridingtotalto0pauses the limit), andreset(name)restores the declared values.Queue reads (
queues.list()andqueues.retrieve()) now report aversionthat discriminates the shape:V1queues keep today's fields (their ownconcurrencyLimitand its override state), whileV2queues (tasks declared withconcurrency) carry no queue-level concurrency, since their limits are read and overridden throughconcurrencyLimits(a task's inline limit under its derivedtask/<task-id>name). Existing reads keep compiling: aV2queue reportsconcurrencyLimitas null andconcurrencyas undefined.Patch Changes
trigger dev, and support empty values insyncEnvVars(). (f384e8334)Stream stalled: no records receivedafter 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)zodto 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)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)@trigger.dev/react-hooks@4.7.0
Minor Changes
Control a task's concurrency with the new
concurrencyoption, 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 ownconcurrencyoption. (ea9758117)perKeycaps eachconcurrencyKeypool andtotalcaps across everything, keys or not. The queue-levelconcurrencyLimitoption keeps working unchanged and is deprecated in favor ofconcurrency. Enforcement happens server-side; servers without support accept the option but do not enforce it yet.Manage limits at runtime with the new
concurrencyLimitsnamespace:list()andretrieve(name)report each limit's bounds plus its liverunningandqueuedcounts,override(name, { perKey, total })changes only the given bounds (overridingtotalto0pauses the limit), andreset(name)restores the declared values.Queue reads (
queues.list()andqueues.retrieve()) now report aversionthat discriminates the shape:V1queues keep today's fields (their ownconcurrencyLimitand its override state), whileV2queues (tasks declared withconcurrency) carry no queue-level concurrency, since their limits are read and overridden throughconcurrencyLimits(a task's inline limit under its derivedtask/<task-id>name). Existing reads keep compiling: aV2queue reportsconcurrencyLimitas null andconcurrencyas undefined.Patch Changes
@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 viatriggerConfig.concurrencywhen starting a chat session, fromchat.createStartSessionAction, theAgentChatclient, or a handover. Keys are never defaulted, so a session without one shares the task's keyless pool. (ea9758117)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, andconcurrencyLimits.resume(name)starts them again. (fa94febb6)Control a task's concurrency with the new
concurrencyoption, 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 ownconcurrencyoption. (ea9758117)perKeycaps eachconcurrencyKeypool andtotalcaps across everything, keys or not. The queue-levelconcurrencyLimitoption keeps working unchanged and is deprecated in favor ofconcurrency. Enforcement happens server-side; servers without support accept the option but do not enforce it yet.Manage limits at runtime with the new
concurrencyLimitsnamespace:list()andretrieve(name)report each limit's bounds plus its liverunningandqueuedcounts,override(name, { perKey, total })changes only the given bounds (overridingtotalto0pauses the limit), andreset(name)restores the declared values.Queue reads (
queues.list()andqueues.retrieve()) now report aversionthat discriminates the shape:V1queues keep today's fields (their ownconcurrencyLimitand its override state), whileV2queues (tasks declared withconcurrency) carry no queue-level concurrency, since their limits are read and overridden throughconcurrencyLimits(a task's inline limit under its derivedtask/<task-id>name). Existing reads keep compiling: aV2queue reportsconcurrencyLimitas null andconcurrencyas undefined.Patch Changes
queues.overrideConcurrencyLimitandqueues.resetConcurrencyLimit. These operate on the legacy model where a queue carried its own concurrency limit; declare concurrency with the taskconcurrencyoption and manage it withconcurrencyLimits.overrideandconcurrencyLimits.resetinstead. (414e5a268)Stream stalled: no records receivedafter 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)5619acf26)@trigger.dev/core@4.7.0@trigger.dev/build@4.7.0
Patch Changes
@trigger.dev/core@4.7.0trigger.dev@4.7.0
Patch Changes
trigger dev, and support empty values insyncEnvVars(). (f384e8334)trigger promotewith environment API keys supplied throughTRIGGER_ACCESS_TOKEN. Environment API key commands now use the saved profile API URL when no explicit override is provided. (562c9433a)@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
@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
@trigger.dev/core@4.7.0@trigger.dev/rsc@4.7.0
Patch Changes
@trigger.dev/core@4.7.0@trigger.dev/schema-to-json@4.7.0
Patch Changes
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)@trigger.dev/core@4.7.0