diff --git a/.changeset/chat-agent-telemetry-default.md b/.changeset/chat-agent-telemetry-default.md deleted file mode 100644 index 853de1a1b30..00000000000 --- a/.changeset/chat-agent-telemetry-default.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/sdk": patch ---- - -The `streamText` passed to a `chat.agent`'s `run()` now turns AI SDK telemetry on by default, so each model step and tool call shows up as a span in the run trace even when the agent doesn't store a prompt with `chat.prompt.set()`. An agent with `telemetry: { recordUserMessage: false }` gets these spans without prompt and response content, including when it stores a prompt (whose variables are left out of the span metadata). Pass `experimental_telemetry: { isEnabled: false }` at the call site to turn them off, or `recordInputs: false` / `recordOutputs: false` to keep them without content. diff --git a/.changeset/hosted-webhook-channels.md b/.changeset/hosted-webhook-channels.md deleted file mode 100644 index 42b93b7bc4c..00000000000 --- a/.changeset/hosted-webhook-channels.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@trigger.dev/sdk": minor -"trigger.dev": minor ---- - -Route verified webhooks into agent sessions with `chat.event({ endpoint, key })`, and connect external chat surfaces with `chat.channels.custom({ endpoint })`. Both subscribe to a shared webhook endpoint, so an agent and your other webhook tasks can use the same provider URL. Channels support reply delivery, session binding, conversation seeding, and lifecycle reactions, and a failed turn posts a short line instead of the error (`errorMessage` sets it, as a string or a function of the failure). Use `chat.createWatchToken()` to watch a session from another surface. - -A connector can also stream replies natively (`stream()`), mirror the session's state into the surface (`lifecycle()`), show tool calls as they run (`progress()`), stop a running turn from the surface (`onControl()`), post approvals and tool controls and resume the run from a verified click, download files only the surface can read (`download()`), and acknowledge or fold in messages that arrive mid-turn (`received()`, `pendingMessages`). diff --git a/.changeset/hosted-webhook-ingress.md b/.changeset/hosted-webhook-ingress.md deleted file mode 100644 index 4e71d006710..00000000000 --- a/.changeset/hosted-webhook-ingress.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -"@trigger.dev/core": minor -"@trigger.dev/sdk": minor -"trigger.dev": minor ---- - -Add hosted webhooks: declare an endpoint once with `webhooks.endpoint.define({ id, source })` and Trigger.dev hosts its URL, verifies every request, and routes each event to the endpoint's subscribers. Subscribe tasks with `webhook({ endpoint, filter, onEvent })`, each with its own type-safe filter, and pause a run until a matching webhook arrives with `webhooks.waiter.create()` and `webhooks.waiter.wait()`. - -```ts -export const stripe = webhooks.endpoint.define({ id: "stripe", source: webhooks.stripe() }); - -export const fulfill = webhook({ - id: "fulfill", - endpoint: stripe, - filter: "event.type == 'checkout.session.completed'", - onEvent: async ({ event }) => {}, -}); - -const waiter = await webhooks.waiter.create(stripe, { - match: { "event.data.object.metadata.orderId": order.id }, -}); -const { event } = await webhooks.waiter.wait(waiter).unwrap(); -``` - -Sources cover presets (`webhooks.stripe()`, `webhooks.github()`, `webhooks.svix()`, `webhooks.discord()`, and others), named providers (`webhooks.clerk()`, `webhooks.shopify()`, and more) and `webhooks.custom(config)`, and most carry a setup prompt an AI coding agent can follow to register the endpoint. Retries are deduplicated on the provider's own event or delivery id where it sends one. Filters, keys and waiter `match` paths share the `event.`, `header.` and `webhook.` namespaces, and filters accept `== null` / `!= null` presence checks and `event any (...)` over a payload that is an array of events. `webhook()` takes `task()` options such as `queue`, `machine` and `retry`. The HTTP API lists endpoints and deliveries, replays deliveries, and creates and cancels waiters, and both it and the MCP server can read an endpoint's setup prompt and generate or store its signing secret. diff --git a/.changeset/hosted-webhook-slack.md b/.changeset/hosted-webhook-slack.md deleted file mode 100644 index 89a1f7053c3..00000000000 --- a/.changeset/hosted-webhook-slack.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -"@trigger.dev/sdk": minor -"@trigger.dev/slack": minor ---- - -Add `@trigger.dev/slack`: turn a `chat.agent` into a native Slack agent. Each DM or channel thread is a durable session, the reply streams into the thread with the turn's tool calls shown as a plan, approvals are Approve and Deny buttons, and Slack's stop button stops the turn. - -```ts -import { appMentions, slack, webhookSource } from "@trigger.dev/slack"; - -const slackEvents = webhooks.endpoint.define({ id: "slack", source: webhookSource() }); - -export const support = chat.agent({ - id: "support", - channels: [ - slack({ - id: "slack", - endpoint: slackEvents, - token: process.env.SLACK_BOT_TOKEN!, - startOn: appMentions(), - }), - ], - run: async ({ messages, signal, streamText }) => - streamText({ model, messages, abortSignal: signal }), -}); -``` - -`startOn` decides which channel messages start a session (`appMentions()` answers when the agent is @mentioned). Images and PDFs people share reach the model, messages sent while the agent is answering can be folded into the reply, tools can post their own buttons, and `ownWorkspaceOnly` ignores Slack Connect guests. diff --git a/.changeset/linear-channel.md b/.changeset/linear-channel.md deleted file mode 100644 index 0a75562f87d..00000000000 --- a/.changeset/linear-channel.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -"@trigger.dev/linear": minor -"@trigger.dev/sdk": minor ---- - -Add `@trigger.dev/linear`: turn a `chat.agent` into a Linear agent. Assign it an issue or @mention it, and Linear's agent session becomes a durable Trigger.dev session: the reply posts back to Linear, tool calls show as activities, `linearPlanTool()` keeps the plan Linear shows as a checklist, and approvals are Approve and Deny options that resume the run. - -```ts -import { linear, webhookSource } from "@trigger.dev/linear"; - -const linearEvents = webhooks.endpoint.define({ id: "linear", source: webhookSource() }); - -export const triage = chat.agent({ - id: "triage", - channels: [ - linear({ id: "linear", endpoint: linearEvents, token: process.env.LINEAR_ACCESS_TOKEN! }), - ], - run: async ({ messages, signal, streamText }) => - streamText({ model, messages, abortSignal: signal }), -}); -``` - -The first turn gets the issue's context and earlier comments, images and PDFs in the issue reach the model, a Stop in Linear winds the turn down, and `errorMessage` sets the text a failed turn shows. diff --git a/.changeset/realtime-stream-error-event.md b/.changeset/realtime-stream-error-event.md deleted file mode 100644 index d62a67f812d..00000000000 --- a/.changeset/realtime-stream-error-event.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -Realtime streams now reconnect and resume when the stream backend reports a failed read mid-stream, instead of ending early as if the stream had finished. This affects `runs.subscribeToRun` with streams, `useRealtimeRunWithStreams`, and chat streams. diff --git a/.changeset/webhook-additional-signature-headers.md b/.changeset/webhook-additional-signature-headers.md deleted file mode 100644 index 16b88a0425f..00000000000 --- a/.changeset/webhook-additional-signature-headers.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@trigger.dev/core": patch ---- - -HMAC webhook verifier configs accept `additionalSignatureHeaders`: more headers that can carry a signature, matched as alternatives to `signatureHeader`. Providers that send a second signature during a secret rotation (Hookdeck's `x-hookdeck-signature-2`) keep verifying through the rotation. diff --git a/.changeset/webhook-secret-grace-option.md b/.changeset/webhook-secret-grace-option.md deleted file mode 100644 index 7ee2f97de42..00000000000 --- a/.changeset/webhook-secret-grace-option.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/core": patch -"trigger.dev": patch ---- - -The `generate_webhook_secret` and `set_webhook_secret` MCP tools take an optional `previousSecretTtlSeconds` to keep accepting a webhook endpoint's old signing secret while the provider switches to the new one (up to 7 days), and report when the old secret stops working. diff --git a/.changeset/webhooks-hookdeck-source.md b/.changeset/webhooks-hookdeck-source.md deleted file mode 100644 index 52590506d58..00000000000 --- a/.changeset/webhooks-hookdeck-source.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@trigger.dev/core": patch -"@trigger.dev/sdk": patch ---- - -Add `webhooks.hookdeck()`, a source for deliveries relayed through a Hookdeck connection. It verifies the `x-hookdeck-signature` header with the project's signing secret, keeps verifying while the secret is being rolled (Hookdeck sends the previous secret's signature in `x-hookdeck-signature-2`), and deduplicates retries on `x-hookdeck-eventid`. The event is the original provider's payload, so pass its type: `webhooks.hookdeck()`. If the Hookdeck project's header prefix was changed, pass it as `webhooks.hookdeck({ headerPrefix })` so retries keep deduplicating. diff --git a/.server-changes/alerts-cadence.md b/.server-changes/alerts-cadence.md deleted file mode 100644 index 169a2aa7c90..00000000000 --- a/.server-changes/alerts-cadence.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: improvement ---- - -Alerts are now checked every minute instead of every 5–10 minutes, so they raise and recover sooner. diff --git a/.server-changes/alerts-create-without-agent.md b/.server-changes/alerts-create-without-agent.md deleted file mode 100644 index 258a93ebefd..00000000000 --- a/.server-changes/alerts-create-without-agent.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: fix ---- - -Creating an alert works without the dashboard agent. diff --git a/.server-changes/alerts-creation-follow-ups.md b/.server-changes/alerts-creation-follow-ups.md deleted file mode 100644 index 951b1a482d4..00000000000 --- a/.server-changes/alerts-creation-follow-ups.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: fix ---- - -Small fixes to creating and editing alerts. diff --git a/.server-changes/faster-traces-for-older-runs.md b/.server-changes/faster-traces-for-older-runs.md deleted file mode 100644 index 07c0beb1a96..00000000000 --- a/.server-changes/faster-traces-for-older-runs.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: improvement ---- - -Run traces and trace APIs load faster for older runs. diff --git a/.server-changes/legacy-slack-deleted-integration.md b/.server-changes/legacy-slack-deleted-integration.md deleted file mode 100644 index 9dc10131151..00000000000 --- a/.server-changes/legacy-slack-deleted-integration.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: fix ---- - -Alerts sent to Slack channels connected through a removed Slack installation deliver again. diff --git a/.server-changes/masked-hidden-root-api-key.md b/.server-changes/masked-hidden-root-api-key.md deleted file mode 100644 index 289f78f1d49..00000000000 --- a/.server-changes/masked-hidden-root-api-key.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: improvement ---- - -The API keys page now always lists your root API key, masked to its last 4 characters when it's hidden, so you can regenerate it and revoke the previous key. When the root key is hidden, the page points you to creating an API key for your backend. diff --git a/.server-changes/revoke-previous-root-api-key-immediately.md b/.server-changes/revoke-previous-root-api-key-immediately.md deleted file mode 100644 index d88254905ca..00000000000 --- a/.server-changes/revoke-previous-root-api-key-immediately.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: feature ---- - -When regenerating an environment's API key you can now revoke the previous key immediately instead of keeping it working for 24 hours. Use this when a key may have leaked. diff --git a/.server-changes/route-keyless-deployments-at-trigger.md b/.server-changes/route-keyless-deployments-at-trigger.md deleted file mode 100644 index 2e0277a729f..00000000000 --- a/.server-changes/route-keyless-deployments-at-trigger.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: improvement ---- - -Runs whose deployment has no compute template now go to containers when they are triggered, instead of first passing through the compute worker queue. diff --git a/.server-changes/supervisor-distrust-emudhra-roots.md b/.server-changes/supervisor-distrust-emudhra-roots.md deleted file mode 100644 index a5e15988b56..00000000000 --- a/.server-changes/supervisor-distrust-emudhra-roots.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: supervisor -type: fix ---- - -The supervisor no longer trusts certificates issued under the compromised emSign (eMudhra) certificate authorities. diff --git a/.server-changes/supervisor-reserved-source-ports.md b/.server-changes/supervisor-reserved-source-ports.md deleted file mode 100644 index 25c3c613bc9..00000000000 --- a/.server-changes/supervisor-reserved-source-ports.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: supervisor -type: feature ---- - -Set `KUBERNETES_POD_RESERVED_SOURCE_PORTS` on the supervisor (for example `50080,50081`) to stop runs using those ports for outbound connections, which is useful to avoid port clashes. diff --git a/.server-changes/trigger-dashboard-url.md b/.server-changes/trigger-dashboard-url.md deleted file mode 100644 index e36e0cbdd22..00000000000 --- a/.server-changes/trigger-dashboard-url.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: improvement ---- - -Runs now get a `TRIGGER_DASHBOARD_URL` environment variable with the dashboard's address, so a task can link to its run (`${TRIGGER_DASHBOARD_URL}/runs/${ctx.run.id}`) on any Trigger.dev instance. A `TRIGGER_DASHBOARD_URL` you set on the project still wins. diff --git a/.server-changes/webhook-secret-rotation-grace.md b/.server-changes/webhook-secret-rotation-grace.md deleted file mode 100644 index 3d13a4ee127..00000000000 --- a/.server-changes/webhook-secret-rotation-grace.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: feature ---- - -Rotating a webhook endpoint's signing secret can keep the old one valid for a while, so you can rotate without failing deliveries that are still signed with it. The rotate and regenerate dialogs let you choose how long the old secret stays valid (up to 7 days, 24 hours by default). The `rotate-secret` and `secret` endpoints accept an optional `previousSecretTtlSeconds` and return `previousSecretExpiresAt`. With no value, the old secret stops working immediately, as before. diff --git a/hosting/k8s/helm/Chart.yaml b/hosting/k8s/helm/Chart.yaml index 79ab33c3374..d3a807740db 100644 --- a/hosting/k8s/helm/Chart.yaml +++ b/hosting/k8s/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: trigger description: The official Trigger.dev Helm chart type: application -version: 4.7.6 -appVersion: v4.7.6 +version: 4.8.0 +appVersion: v4.8.0 home: https://trigger.dev sources: - https://github.com/triggerdotdev/trigger.dev diff --git a/packages/build/CHANGELOG.md b/packages/build/CHANGELOG.md index 7e9cbbf1268..fb2b476fc9f 100644 --- a/packages/build/CHANGELOG.md +++ b/packages/build/CHANGELOG.md @@ -1,5 +1,12 @@ # @trigger.dev/build +## 4.8.0 + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/core@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/build/package.json b/packages/build/package.json index 4446d90b3c1..f44a0d8c9b9 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/build", - "version": "4.7.6", + "version": "4.8.0", "description": "trigger.dev build extensions", "license": "MIT", "publishConfig": { @@ -82,7 +82,7 @@ }, "dependencies": { "@prisma/config": "^6.10.0", - "@trigger.dev/core": "workspace:4.7.6", + "@trigger.dev/core": "workspace:4.8.0", "mlly": "^1.7.1", "pkg-types": "^1.1.3", "tinyglobby": "^0.2.2", diff --git a/packages/cli-v3/CHANGELOG.md b/packages/cli-v3/CHANGELOG.md index 4eca3436ed4..2faf541428e 100644 --- a/packages/cli-v3/CHANGELOG.md +++ b/packages/cli-v3/CHANGELOG.md @@ -1,5 +1,44 @@ # trigger.dev +## 4.8.0 + +### Minor Changes + +- Route verified webhooks into agent sessions with `chat.event({ endpoint, key })`, and connect external chat surfaces with `chat.channels.custom({ endpoint })`. Both subscribe to a shared webhook endpoint, so an agent and your other webhook tasks can use the same provider URL. Channels support reply delivery, session binding, conversation seeding, and lifecycle reactions, and a failed turn posts a short line instead of the error (`errorMessage` sets it, as a string or a function of the failure). Use `chat.createWatchToken()` to watch a session from another surface. ([`d6955ee9f`](https://github.com/triggerdotdev/trigger.dev/commit/d6955ee9f31b0b1a3af55bb8fbbc77ba68bcb3f7)) + + A connector can also stream replies natively (`stream()`), mirror the session's state into the surface (`lifecycle()`), show tool calls as they run (`progress()`), stop a running turn from the surface (`onControl()`), post approvals and tool controls and resume the run from a verified click, download files only the surface can read (`download()`), and acknowledge or fold in messages that arrive mid-turn (`received()`, `pendingMessages`). + +- Add hosted webhooks: declare an endpoint once with `webhooks.endpoint.define({ id, source })` and Trigger.dev hosts its URL, verifies every request, and routes each event to the endpoint's subscribers. Subscribe tasks with `webhook({ endpoint, filter, onEvent })`, each with its own type-safe filter, and pause a run until a matching webhook arrives with `webhooks.waiter.create()` and `webhooks.waiter.wait()`. ([`d6955ee9f`](https://github.com/triggerdotdev/trigger.dev/commit/d6955ee9f31b0b1a3af55bb8fbbc77ba68bcb3f7)) + + ```ts + export const stripe = webhooks.endpoint.define({ + id: "stripe", + source: webhooks.stripe(), + }); + + export const fulfill = webhook({ + id: "fulfill", + endpoint: stripe, + filter: "event.type == 'checkout.session.completed'", + onEvent: async ({ event }) => {}, + }); + + const waiter = await webhooks.waiter.create(stripe, { + match: { "event.data.object.metadata.orderId": order.id }, + }); + const { event } = await webhooks.waiter.wait(waiter).unwrap(); + ``` + + Sources cover presets (`webhooks.stripe()`, `webhooks.github()`, `webhooks.svix()`, `webhooks.discord()`, and others), named providers (`webhooks.clerk()`, `webhooks.shopify()`, and more) and `webhooks.custom(config)`, and most carry a setup prompt an AI coding agent can follow to register the endpoint. Retries are deduplicated on the provider's own event or delivery id where it sends one. Filters, keys and waiter `match` paths share the `event.`, `header.` and `webhook.` namespaces, and filters accept `== null` / `!= null` presence checks and `event any (...)` over a payload that is an array of events. `webhook()` takes `task()` options such as `queue`, `machine` and `retry`. The HTTP API lists endpoints and deliveries, replays deliveries, and creates and cancels waiters, and both it and the MCP server can read an endpoint's setup prompt and generate or store its signing secret. + +### Patch Changes + +- The `generate_webhook_secret` and `set_webhook_secret` MCP tools take an optional `previousSecretTtlSeconds` to keep accepting a webhook endpoint's old signing secret while the provider switches to the new one (up to 7 days), and report when the old secret stops working. ([`98adb6662`](https://github.com/triggerdotdev/trigger.dev/commit/98adb6662562dbfa99f7c026ddb544c4486e03f6)) +- Updated dependencies: + - `@trigger.dev/core@4.8.0` + - `@trigger.dev/build@4.8.0` + - `@trigger.dev/schema-to-json@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index c919ccba5f4..ae71c67194f 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -1,6 +1,6 @@ { "name": "trigger.dev", - "version": "4.7.6", + "version": "4.8.0", "description": "A Command-Line Interface for Trigger.dev projects", "type": "module", "license": "MIT", @@ -84,9 +84,9 @@ "@opentelemetry/api-logs": "0.219.0", "@opentelemetry/instrumentation": "0.219.0", "@s2-dev/streamstore": "^0.25.0", - "@trigger.dev/build": "workspace:4.7.6", - "@trigger.dev/core": "workspace:4.7.6", - "@trigger.dev/schema-to-json": "workspace:4.7.6", + "@trigger.dev/build": "workspace:4.8.0", + "@trigger.dev/core": "workspace:4.8.0", + "@trigger.dev/schema-to-json": "workspace:4.8.0", "ansi-escapes": "^7.0.0", "braces": "^3.0.3", "c12": "^1.11.1", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index cbe141f70e1..8dd20167402 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,39 @@ # internal-platform +## 4.8.0 + +### Minor Changes + +- Add hosted webhooks: declare an endpoint once with `webhooks.endpoint.define({ id, source })` and Trigger.dev hosts its URL, verifies every request, and routes each event to the endpoint's subscribers. Subscribe tasks with `webhook({ endpoint, filter, onEvent })`, each with its own type-safe filter, and pause a run until a matching webhook arrives with `webhooks.waiter.create()` and `webhooks.waiter.wait()`. ([`d6955ee9f`](https://github.com/triggerdotdev/trigger.dev/commit/d6955ee9f31b0b1a3af55bb8fbbc77ba68bcb3f7)) + + ```ts + export const stripe = webhooks.endpoint.define({ + id: "stripe", + source: webhooks.stripe(), + }); + + export const fulfill = webhook({ + id: "fulfill", + endpoint: stripe, + filter: "event.type == 'checkout.session.completed'", + onEvent: async ({ event }) => {}, + }); + + const waiter = await webhooks.waiter.create(stripe, { + match: { "event.data.object.metadata.orderId": order.id }, + }); + const { event } = await webhooks.waiter.wait(waiter).unwrap(); + ``` + + Sources cover presets (`webhooks.stripe()`, `webhooks.github()`, `webhooks.svix()`, `webhooks.discord()`, and others), named providers (`webhooks.clerk()`, `webhooks.shopify()`, and more) and `webhooks.custom(config)`, and most carry a setup prompt an AI coding agent can follow to register the endpoint. Retries are deduplicated on the provider's own event or delivery id where it sends one. Filters, keys and waiter `match` paths share the `event.`, `header.` and `webhook.` namespaces, and filters accept `== null` / `!= null` presence checks and `event any (...)` over a payload that is an array of events. `webhook()` takes `task()` options such as `queue`, `machine` and `retry`. The HTTP API lists endpoints and deliveries, replays deliveries, and creates and cancels waiters, and both it and the MCP server can read an endpoint's setup prompt and generate or store its signing secret. + +### Patch Changes + +- Realtime streams now reconnect and resume when the stream backend reports a failed read mid-stream, instead of ending early as if the stream had finished. This affects `runs.subscribeToRun` with streams, `useRealtimeRunWithStreams`, and chat streams. ([`23730b034`](https://github.com/triggerdotdev/trigger.dev/commit/23730b0344342a96731d52dbdc60626565519e26)) +- HMAC webhook verifier configs accept `additionalSignatureHeaders`: more headers that can carry a signature, matched as alternatives to `signatureHeader`. Providers that send a second signature during a secret rotation (Hookdeck's `x-hookdeck-signature-2`) keep verifying through the rotation. ([`08d1ddbd3`](https://github.com/triggerdotdev/trigger.dev/commit/08d1ddbd3531d47ee4fb7f684f07987e2e59ec7e)) +- The `generate_webhook_secret` and `set_webhook_secret` MCP tools take an optional `previousSecretTtlSeconds` to keep accepting a webhook endpoint's old signing secret while the provider switches to the new one (up to 7 days), and report when the old secret stops working. ([`98adb6662`](https://github.com/triggerdotdev/trigger.dev/commit/98adb6662562dbfa99f7c026ddb544c4486e03f6)) +- Add `webhooks.hookdeck()`, a source for deliveries relayed through a Hookdeck connection. It verifies the `x-hookdeck-signature` header with the project's signing secret, keeps verifying while the secret is being rolled (Hookdeck sends the previous secret's signature in `x-hookdeck-signature-2`), and deduplicates retries on `x-hookdeck-eventid`. The event is the original provider's payload, so pass its type: `webhooks.hookdeck()`. If the Hookdeck project's header prefix was changed, pass it as `webhooks.hookdeck({ headerPrefix })` so retries keep deduplicating. ([`51b39fbc6`](https://github.com/triggerdotdev/trigger.dev/commit/51b39fbc6ff0eeeda78fd292d974e7aaa747a086)) + ## 4.7.6 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index a0c603d6d01..d88f27269d6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/core", - "version": "4.7.6", + "version": "4.8.0", "description": "Core code used across the Trigger.dev SDK and platform", "license": "MIT", "publishConfig": { diff --git a/packages/linear/CHANGELOG.md b/packages/linear/CHANGELOG.md new file mode 100644 index 00000000000..c9270333e56 --- /dev/null +++ b/packages/linear/CHANGELOG.md @@ -0,0 +1,37 @@ +# @trigger.dev/linear + +## 4.8.0 + +### Minor Changes + +- Add `@trigger.dev/linear`: turn a `chat.agent` into a Linear agent. Assign it an issue or @mention it, and Linear's agent session becomes a durable Trigger.dev session: the reply posts back to Linear, tool calls show as activities, `linearPlanTool()` keeps the plan Linear shows as a checklist, and approvals are Approve and Deny options that resume the run. ([`1586c4a3f`](https://github.com/triggerdotdev/trigger.dev/commit/1586c4a3f7638837a0615453f6e5b5d9b92491a4)) + + ```ts + import { linear, webhookSource } from "@trigger.dev/linear"; + + const linearEvents = webhooks.endpoint.define({ + id: "linear", + source: webhookSource(), + }); + + export const triage = chat.agent({ + id: "triage", + channels: [ + linear({ + id: "linear", + endpoint: linearEvents, + token: process.env.LINEAR_ACCESS_TOKEN!, + }), + ], + run: async ({ messages, signal, streamText }) => + streamText({ model, messages, abortSignal: signal }), + }); + ``` + + The first turn gets the issue's context and earlier comments, images and PDFs in the issue reach the model, a Stop in Linear winds the turn down, and `errorMessage` sets the text a failed turn shows. + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/sdk@4.8.0` + - `@trigger.dev/core@4.8.0` diff --git a/packages/linear/package.json b/packages/linear/package.json index e1352f32f78..7c69a7ffa42 100644 --- a/packages/linear/package.json +++ b/packages/linear/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/linear", - "version": "4.7.6", + "version": "4.8.0", "description": "Linear agent sessions as a chat frontend (channel) for trigger.dev agents", "license": "MIT", "publishConfig": { @@ -41,15 +41,15 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:4.7.6" + "@trigger.dev/core": "workspace:4.8.0" }, "peerDependencies": { - "@trigger.dev/sdk": "workspace:^4.7.6", + "@trigger.dev/sdk": "workspace:^4.8.0", "ai": "^5.0.0 || ^6.0.0 || >=7.0.0-canary <8" }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", - "@trigger.dev/sdk": "workspace:4.7.6", + "@trigger.dev/sdk": "workspace:4.8.0", "@types/node": "^24.13.3", "rimraf": "6.0.1", "tshy": "^3.0.2", diff --git a/packages/python/CHANGELOG.md b/packages/python/CHANGELOG.md index 235997f8b6a..5be3dea0f8c 100644 --- a/packages/python/CHANGELOG.md +++ b/packages/python/CHANGELOG.md @@ -1,5 +1,14 @@ # @trigger.dev/python +## 4.8.0 + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/sdk@4.8.0` + - `@trigger.dev/core@4.8.0` + - `@trigger.dev/build@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/python/package.json b/packages/python/package.json index a9db8087d23..68acdfaac6b 100644 --- a/packages/python/package.json +++ b/packages/python/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/python", - "version": "4.7.6", + "version": "4.8.0", "description": "Python runtime and build extension for Trigger.dev", "license": "MIT", "publishConfig": { @@ -45,7 +45,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:4.7.6", + "@trigger.dev/core": "workspace:4.8.0", "tinyexec": "^0.3.2" }, "devDependencies": { @@ -55,12 +55,12 @@ "typescript": "catalog:", "tsx": "4.17.0", "@arethetypeswrong/cli": "^0.18.5", - "@trigger.dev/build": "workspace:4.7.6", - "@trigger.dev/sdk": "workspace:4.7.6" + "@trigger.dev/build": "workspace:4.8.0", + "@trigger.dev/sdk": "workspace:4.8.0" }, "peerDependencies": { - "@trigger.dev/sdk": "workspace:^4.7.6", - "@trigger.dev/build": "workspace:^4.7.6" + "@trigger.dev/sdk": "workspace:^4.8.0", + "@trigger.dev/build": "workspace:^4.8.0" }, "engines": { "node": ">=18.20.0" diff --git a/packages/react-hooks/CHANGELOG.md b/packages/react-hooks/CHANGELOG.md index c4477243675..249c5908710 100644 --- a/packages/react-hooks/CHANGELOG.md +++ b/packages/react-hooks/CHANGELOG.md @@ -1,5 +1,12 @@ # @trigger.dev/react-hooks +## 4.8.0 + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/core@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/react-hooks/package.json b/packages/react-hooks/package.json index 173fbff5335..fb150bf69a5 100644 --- a/packages/react-hooks/package.json +++ b/packages/react-hooks/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/react-hooks", - "version": "4.7.6", + "version": "4.8.0", "description": "trigger.dev react hooks", "license": "MIT", "publishConfig": { @@ -37,7 +37,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:^4.7.6", + "@trigger.dev/core": "workspace:^4.8.0", "swr": "^2.2.5" }, "devDependencies": { diff --git a/packages/redis-worker/CHANGELOG.md b/packages/redis-worker/CHANGELOG.md index be2efdf182d..88bd725db39 100644 --- a/packages/redis-worker/CHANGELOG.md +++ b/packages/redis-worker/CHANGELOG.md @@ -1,5 +1,12 @@ # @trigger.dev/redis-worker +## 4.8.0 + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/core@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/redis-worker/package.json b/packages/redis-worker/package.json index 92fb9f080f7..0a44db8fd9f 100644 --- a/packages/redis-worker/package.json +++ b/packages/redis-worker/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/redis-worker", - "version": "4.7.6", + "version": "4.8.0", "description": "Redis worker for trigger.dev", "license": "MIT", "publishConfig": { @@ -23,7 +23,7 @@ "test": "vitest --sequence.concurrent=false --no-file-parallelism" }, "dependencies": { - "@trigger.dev/core": "workspace:4.7.6", + "@trigger.dev/core": "workspace:4.8.0", "nanoid": "^5.1.16", "p-limit": "^6.2.0", "seedrandom": "^3.0.5", diff --git a/packages/rsc/CHANGELOG.md b/packages/rsc/CHANGELOG.md index 5792f53eda1..eb95694bfa7 100644 --- a/packages/rsc/CHANGELOG.md +++ b/packages/rsc/CHANGELOG.md @@ -1,5 +1,12 @@ # @trigger.dev/rsc +## 4.8.0 + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/core@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/rsc/package.json b/packages/rsc/package.json index 588e9d493a2..af0dfa24609 100644 --- a/packages/rsc/package.json +++ b/packages/rsc/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/rsc", - "version": "4.7.6", + "version": "4.8.0", "description": "trigger.dev rsc", "license": "MIT", "publishConfig": { @@ -37,7 +37,7 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:^4.7.6", + "@trigger.dev/core": "workspace:^4.8.0", "mlly": "^1.7.1", "react": "19.0.0-rc.1", "react-dom": "19.0.0-rc.1" diff --git a/packages/schema-to-json/CHANGELOG.md b/packages/schema-to-json/CHANGELOG.md index c10dd8b4a55..091e690bb97 100644 --- a/packages/schema-to-json/CHANGELOG.md +++ b/packages/schema-to-json/CHANGELOG.md @@ -1,5 +1,12 @@ # @trigger.dev/schema-to-json +## 4.8.0 + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/core@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/schema-to-json/package.json b/packages/schema-to-json/package.json index 143ffdaa5d1..e3d28b1a7c3 100644 --- a/packages/schema-to-json/package.json +++ b/packages/schema-to-json/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/schema-to-json", - "version": "4.7.6", + "version": "4.8.0", "description": "Convert various schema validation libraries to JSON Schema", "license": "MIT", "publishConfig": { diff --git a/packages/slack/CHANGELOG.md b/packages/slack/CHANGELOG.md new file mode 100644 index 00000000000..320378947ee --- /dev/null +++ b/packages/slack/CHANGELOG.md @@ -0,0 +1,38 @@ +# @trigger.dev/slack + +## 4.8.0 + +### Minor Changes + +- Add `@trigger.dev/slack`: turn a `chat.agent` into a native Slack agent. Each DM or channel thread is a durable session, the reply streams into the thread with the turn's tool calls shown as a plan, approvals are Approve and Deny buttons, and Slack's stop button stops the turn. ([`6e715da77`](https://github.com/triggerdotdev/trigger.dev/commit/6e715da7709c48eedd134d52645d825b3569e0ff)) + + ```ts + import { appMentions, slack, webhookSource } from "@trigger.dev/slack"; + + const slackEvents = webhooks.endpoint.define({ + id: "slack", + source: webhookSource(), + }); + + export const support = chat.agent({ + id: "support", + channels: [ + slack({ + id: "slack", + endpoint: slackEvents, + token: process.env.SLACK_BOT_TOKEN!, + startOn: appMentions(), + }), + ], + run: async ({ messages, signal, streamText }) => + streamText({ model, messages, abortSignal: signal }), + }); + ``` + + `startOn` decides which channel messages start a session (`appMentions()` answers when the agent is @mentioned). Images and PDFs people share reach the model, messages sent while the agent is answering can be folded into the reply, tools can post their own buttons, and `ownWorkspaceOnly` ignores Slack Connect guests. + +### Patch Changes + +- Updated dependencies: + - `@trigger.dev/sdk@4.8.0` + - `@trigger.dev/core@4.8.0` diff --git a/packages/slack/package.json b/packages/slack/package.json index 0edafd03bda..b63550ee739 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/slack", - "version": "4.7.6", + "version": "4.8.0", "description": "Slack chat frontend (channel) for trigger.dev agents", "license": "MIT", "publishConfig": { @@ -41,14 +41,14 @@ "check-exports": "attw --pack ." }, "dependencies": { - "@trigger.dev/core": "workspace:4.7.6" + "@trigger.dev/core": "workspace:4.8.0" }, "peerDependencies": { - "@trigger.dev/sdk": "workspace:^4.7.6" + "@trigger.dev/sdk": "workspace:^4.8.0" }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", - "@trigger.dev/sdk": "workspace:4.7.6", + "@trigger.dev/sdk": "workspace:4.8.0", "@types/node": "^24.13.3", "rimraf": "6.0.1", "tshy": "^3.0.2", diff --git a/packages/trigger-sdk/CHANGELOG.md b/packages/trigger-sdk/CHANGELOG.md index ef3b33f5af3..c5af0424e25 100644 --- a/packages/trigger-sdk/CHANGELOG.md +++ b/packages/trigger-sdk/CHANGELOG.md @@ -1,5 +1,96 @@ # @trigger.dev/sdk +## 4.8.0 + +### Minor Changes + +- Route verified webhooks into agent sessions with `chat.event({ endpoint, key })`, and connect external chat surfaces with `chat.channels.custom({ endpoint })`. Both subscribe to a shared webhook endpoint, so an agent and your other webhook tasks can use the same provider URL. Channels support reply delivery, session binding, conversation seeding, and lifecycle reactions, and a failed turn posts a short line instead of the error (`errorMessage` sets it, as a string or a function of the failure). Use `chat.createWatchToken()` to watch a session from another surface. ([`d6955ee9f`](https://github.com/triggerdotdev/trigger.dev/commit/d6955ee9f31b0b1a3af55bb8fbbc77ba68bcb3f7)) + + A connector can also stream replies natively (`stream()`), mirror the session's state into the surface (`lifecycle()`), show tool calls as they run (`progress()`), stop a running turn from the surface (`onControl()`), post approvals and tool controls and resume the run from a verified click, download files only the surface can read (`download()`), and acknowledge or fold in messages that arrive mid-turn (`received()`, `pendingMessages`). + +- Add hosted webhooks: declare an endpoint once with `webhooks.endpoint.define({ id, source })` and Trigger.dev hosts its URL, verifies every request, and routes each event to the endpoint's subscribers. Subscribe tasks with `webhook({ endpoint, filter, onEvent })`, each with its own type-safe filter, and pause a run until a matching webhook arrives with `webhooks.waiter.create()` and `webhooks.waiter.wait()`. ([`d6955ee9f`](https://github.com/triggerdotdev/trigger.dev/commit/d6955ee9f31b0b1a3af55bb8fbbc77ba68bcb3f7)) + + ```ts + export const stripe = webhooks.endpoint.define({ + id: "stripe", + source: webhooks.stripe(), + }); + + export const fulfill = webhook({ + id: "fulfill", + endpoint: stripe, + filter: "event.type == 'checkout.session.completed'", + onEvent: async ({ event }) => {}, + }); + + const waiter = await webhooks.waiter.create(stripe, { + match: { "event.data.object.metadata.orderId": order.id }, + }); + const { event } = await webhooks.waiter.wait(waiter).unwrap(); + ``` + + Sources cover presets (`webhooks.stripe()`, `webhooks.github()`, `webhooks.svix()`, `webhooks.discord()`, and others), named providers (`webhooks.clerk()`, `webhooks.shopify()`, and more) and `webhooks.custom(config)`, and most carry a setup prompt an AI coding agent can follow to register the endpoint. Retries are deduplicated on the provider's own event or delivery id where it sends one. Filters, keys and waiter `match` paths share the `event.`, `header.` and `webhook.` namespaces, and filters accept `== null` / `!= null` presence checks and `event any (...)` over a payload that is an array of events. `webhook()` takes `task()` options such as `queue`, `machine` and `retry`. The HTTP API lists endpoints and deliveries, replays deliveries, and creates and cancels waiters, and both it and the MCP server can read an endpoint's setup prompt and generate or store its signing secret. + +- Add `@trigger.dev/slack`: turn a `chat.agent` into a native Slack agent. Each DM or channel thread is a durable session, the reply streams into the thread with the turn's tool calls shown as a plan, approvals are Approve and Deny buttons, and Slack's stop button stops the turn. ([`6e715da77`](https://github.com/triggerdotdev/trigger.dev/commit/6e715da7709c48eedd134d52645d825b3569e0ff)) + + ```ts + import { appMentions, slack, webhookSource } from "@trigger.dev/slack"; + + const slackEvents = webhooks.endpoint.define({ + id: "slack", + source: webhookSource(), + }); + + export const support = chat.agent({ + id: "support", + channels: [ + slack({ + id: "slack", + endpoint: slackEvents, + token: process.env.SLACK_BOT_TOKEN!, + startOn: appMentions(), + }), + ], + run: async ({ messages, signal, streamText }) => + streamText({ model, messages, abortSignal: signal }), + }); + ``` + + `startOn` decides which channel messages start a session (`appMentions()` answers when the agent is @mentioned). Images and PDFs people share reach the model, messages sent while the agent is answering can be folded into the reply, tools can post their own buttons, and `ownWorkspaceOnly` ignores Slack Connect guests. + +- Add `@trigger.dev/linear`: turn a `chat.agent` into a Linear agent. Assign it an issue or @mention it, and Linear's agent session becomes a durable Trigger.dev session: the reply posts back to Linear, tool calls show as activities, `linearPlanTool()` keeps the plan Linear shows as a checklist, and approvals are Approve and Deny options that resume the run. ([`1586c4a3f`](https://github.com/triggerdotdev/trigger.dev/commit/1586c4a3f7638837a0615453f6e5b5d9b92491a4)) + + ```ts + import { linear, webhookSource } from "@trigger.dev/linear"; + + const linearEvents = webhooks.endpoint.define({ + id: "linear", + source: webhookSource(), + }); + + export const triage = chat.agent({ + id: "triage", + channels: [ + linear({ + id: "linear", + endpoint: linearEvents, + token: process.env.LINEAR_ACCESS_TOKEN!, + }), + ], + run: async ({ messages, signal, streamText }) => + streamText({ model, messages, abortSignal: signal }), + }); + ``` + + The first turn gets the issue's context and earlier comments, images and PDFs in the issue reach the model, a Stop in Linear winds the turn down, and `errorMessage` sets the text a failed turn shows. + +### Patch Changes + +- The `streamText` passed to a `chat.agent`'s `run()` now turns AI SDK telemetry on by default, so each model step and tool call shows up as a span in the run trace even when the agent doesn't store a prompt with `chat.prompt.set()`. An agent with `telemetry: { recordUserMessage: false }` gets these spans without prompt and response content, including when it stores a prompt (whose variables are left out of the span metadata). Pass `experimental_telemetry: { isEnabled: false }` at the call site to turn them off, or `recordInputs: false` / `recordOutputs: false` to keep them without content. ([`bd7cc3525`](https://github.com/triggerdotdev/trigger.dev/commit/bd7cc35252d25223859a3e8f696de05cc6527bc7)) +- Add `webhooks.hookdeck()`, a source for deliveries relayed through a Hookdeck connection. It verifies the `x-hookdeck-signature` header with the project's signing secret, keeps verifying while the secret is being rolled (Hookdeck sends the previous secret's signature in `x-hookdeck-signature-2`), and deduplicates retries on `x-hookdeck-eventid`. The event is the original provider's payload, so pass its type: `webhooks.hookdeck()`. If the Hookdeck project's header prefix was changed, pass it as `webhooks.hookdeck({ headerPrefix })` so retries keep deduplicating. ([`51b39fbc6`](https://github.com/triggerdotdev/trigger.dev/commit/51b39fbc6ff0eeeda78fd292d974e7aaa747a086)) +- Updated dependencies: + - `@trigger.dev/core@4.8.0` + ## 4.7.6 ### Patch Changes diff --git a/packages/trigger-sdk/package.json b/packages/trigger-sdk/package.json index 2936971c39e..46ec4befe61 100644 --- a/packages/trigger-sdk/package.json +++ b/packages/trigger-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@trigger.dev/sdk", - "version": "4.7.6", + "version": "4.8.0", "description": "trigger.dev Node.JS SDK", "license": "MIT", "publishConfig": { @@ -80,7 +80,7 @@ "dependencies": { "@opentelemetry/api": "1.9.1", "@opentelemetry/semantic-conventions": "1.41.1", - "@trigger.dev/core": "workspace:4.7.6", + "@trigger.dev/core": "workspace:4.8.0", "uncrypto": "^0.1.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11ce9460496..d1bd6d7aece 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1575,7 +1575,7 @@ importers: specifier: ^6.10.0 version: 6.19.0(magicast@0.3.5) '@trigger.dev/core': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../core mlly: specifier: ^1.7.1 @@ -1642,13 +1642,13 @@ importers: specifier: ^0.25.0 version: 0.25.0(supports-color@10.0.0) '@trigger.dev/build': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../build '@trigger.dev/core': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../core '@trigger.dev/schema-to-json': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../schema-to-json ansi-escapes: specifier: ^7.0.0 @@ -1959,14 +1959,14 @@ importers: packages/linear: dependencies: '@trigger.dev/core': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../core devDependencies: '@arethetypeswrong/cli': specifier: ^0.18.5 version: 0.18.5 '@trigger.dev/sdk': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../trigger-sdk '@types/node': specifier: 24.13.3 @@ -2009,7 +2009,7 @@ importers: packages/python: dependencies: '@trigger.dev/core': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../core tinyexec: specifier: ^0.3.2 @@ -2019,10 +2019,10 @@ importers: specifier: ^0.18.5 version: 0.18.5 '@trigger.dev/build': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../build '@trigger.dev/sdk': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../trigger-sdk '@types/node': specifier: 24.13.3 @@ -2043,7 +2043,7 @@ importers: packages/react-hooks: dependencies: '@trigger.dev/core': - specifier: workspace:^4.7.6 + specifier: workspace:^4.8.0 version: link:../core react: specifier: 18.3.1 @@ -2077,7 +2077,7 @@ importers: packages/redis-worker: dependencies: '@trigger.dev/core': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../core cron-parser: specifier: ^4.9.0 @@ -2123,7 +2123,7 @@ importers: packages/rsc: dependencies: '@trigger.dev/core': - specifier: workspace:^4.7.6 + specifier: workspace:^4.8.0 version: link:../core mlly: specifier: ^1.7.1 @@ -2203,14 +2203,14 @@ importers: packages/slack: dependencies: '@trigger.dev/core': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../core devDependencies: '@arethetypeswrong/cli': specifier: ^0.18.5 version: 0.18.5 '@trigger.dev/sdk': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../trigger-sdk '@types/node': specifier: 24.13.3 @@ -2237,7 +2237,7 @@ importers: specifier: 1.41.1 version: 1.41.1 '@trigger.dev/core': - specifier: workspace:4.7.6 + specifier: workspace:4.8.0 version: link:../core react: specifier: 18.3.1