From 57c4c76f99f3329754037a9207a9ce61bb63d39f Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Wed, 21 Oct 2026 10:09:44 +0000 Subject: [PATCH 1/3] docs(webhooks): document signing secret rotation grace period --- docs/v3-openapi.yaml | 43 ++++++++++++++++++++++++++++++++++++--- docs/webhooks/connect.mdx | 6 +++++- docs/webhooks/sources.mdx | 2 ++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/docs/v3-openapi.yaml b/docs/v3-openapi.yaml index 1a9cfa5c31e..e09cc060120 100644 --- a/docs/v3-openapi.yaml +++ b/docs/v3-openapi.yaml @@ -4933,8 +4933,24 @@ paths: Generate a new signing secret for the endpoint, store it, and return it once. Use this for providers where you choose the secret, such as GitHub. It replaces any existing secret, so deliveries fail - verification until the provider uses the new one. Endpoints whose source verifies with a public key - refuse this; set the provider's key with the set secret endpoint instead. + verification until the provider uses the new one, unless you pass `previousSecretTtlSeconds` to keep + the old secret valid for a while. Endpoints whose source verifies with a public key refuse this; set the + provider's key with the set secret endpoint instead. + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: + previousSecretTtlSeconds: + type: integer + minimum: 0 + maximum: 604800 + description: >- + How many seconds the replaced secret keeps verifying deliveries, up to 7 days. Omit or pass + `0` to stop accepting the old secret immediately. + example: 86400 responses: "200": description: Successful request @@ -4972,7 +4988,8 @@ paths: **Private beta:** [request access](https://trigger.dev/webhooks-beta) to use webhooks. Store the signing secret or public key the provider issued for this endpoint, such as the `whsec_` - secret Stripe returns when you create a webhook endpoint. It replaces any existing secret. + secret Stripe returns when you create a webhook endpoint. It replaces any existing secret. Pass + `previousSecretTtlSeconds` to keep the old one valid for a while. requestBody: required: true content: @@ -4988,6 +5005,14 @@ paths: maxLength: 4096 description: The signing secret or public key. Leading and trailing whitespace is trimmed. example: whsec_5f2b... + previousSecretTtlSeconds: + type: integer + minimum: 0 + maximum: 604800 + description: >- + How many seconds the replaced secret keeps verifying deliveries, up to 7 days. Omit or pass + `0` to stop accepting the old secret immediately. + example: 86400 responses: "200": description: Successful request @@ -5884,6 +5909,12 @@ components: type: string description: The new signing secret. It is returned only in this response and can't be read again. example: whsec_5f2b... + previousSecretExpiresAt: + type: string + format: date-time + description: >- + When the replaced secret stops verifying deliveries. Present only when `previousSecretTtlSeconds` + kept the old secret valid. SetWebhookEndpointSecretResponse: type: object required: [id, secretSet] @@ -5895,6 +5926,12 @@ components: secretSet: type: boolean const: true + previousSecretExpiresAt: + type: string + format: date-time + description: >- + When the replaced secret stops verifying deliveries. Present only when `previousSecretTtlSeconds` + kept the old secret valid. WebhookDeliveryStatus: type: string enum: [pending, processing, succeeded, failed, filtered, unmatched] diff --git a/docs/webhooks/connect.mdx b/docs/webhooks/connect.mdx index 0f429810193..0c09270e907 100644 --- a/docs/webhooks/connect.mdx +++ b/docs/webhooks/connect.mdx @@ -78,7 +78,11 @@ The verify token answers the URL check. The signing secret verifies event delive Choose **Rotate signing secret** to replace a provider-supplied secret. For a secret you generate, choose **Regenerate secret**, copy the new value, and update the provider's configuration. Use **Rotate public key** when replacing an asymmetric provider's key. +The rotate and regenerate dialogs include **Keep accepting the old signing secret for** (or the old public key). Trigger.dev keeps verifying deliveries signed with the old credential until that time passes, so you can update the provider without failing deliveries. Choose **1 hour**, **24 hours** (the default) or **7 days**. Choose **Stop immediately** if the old credential leaked. + +Over the API, pass `previousSecretTtlSeconds` (up to `604800`, 7 days) to [generate a secret](/management/webhooks/generate-secret) or [set a secret](/management/webhooks/set-secret). The response includes `previousSecretExpiresAt`. Without `previousSecretTtlSeconds`, the old secret stops verifying immediately. + Trigger.dev stores credentials encrypted and doesn't display saved values. Copy a generated secret - before closing the dialog. Deliveries signed with the old secret fail verification after rotation. + before closing the dialog. diff --git a/docs/webhooks/sources.mdx b/docs/webhooks/sources.mdx index 574a812fb88..989343a9a35 100644 --- a/docs/webhooks/sources.mdx +++ b/docs/webhooks/sources.mdx @@ -150,6 +150,8 @@ export const internalEvents = webhook({ }); ``` +To accept a signature from more than one header, list the extra headers in `additionalSignatureHeaders` (up to 4). Trigger.dev parses them like `signatureHeader` and accepts a match in any of them. This keeps deliveries verifying when a provider sends a second signature during a secret rotation, such as Hookdeck's `x-hookdeck-signature-2`. `signatureHeader` is still required. + The optional `setupPrompt` is the provider-specific part of the endpoint's [setup prompt](/webhooks/connect#set-it-up-with-an-ai-agent): where the provider's webhook settings are and how to register a URL there. Trigger.dev adds the URL, the subscribers' filters and the signing secret steps around it. ### Form-encoded bodies From dbc030cd8f7931661a6238942767d72ff412a089 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Thu, 22 Oct 2026 09:12:44 +0000 Subject: [PATCH 2/3] docs(webhooks): trim to additionalSignatureHeaders, rotation docs landed on main --- .changeset/chat-agent-telemetry-default.md | 5 + .changeset/webhook-secret-grace-option.md | 6 + .changeset/webhooks-hookdeck-source.md | 6 + .github/workflows/changesets-pr.yml | 2 +- .github/workflows/claude.yml | 2 +- .github/workflows/code-quality.yml | 2 +- .github/workflows/e2e-webapp-auth-full.yml | 2 +- .github/workflows/e2e-webapp.yml | 2 +- .github/workflows/e2e.yml | 2 +- .github/workflows/fk-cascade-guard.yml | 2 +- .github/workflows/migration-guard.yml | 2 +- .github/workflows/observability-map.yml | 4 +- .github/workflows/preview-packages.yml | 2 +- .github/workflows/release.yml | 4 +- .github/workflows/runops-guard.yml | 2 +- .github/workflows/sdk-compat.yml | 8 +- .github/workflows/typecheck.yml | 2 +- .github/workflows/unit-tests-internal.yml | 4 +- .../unit-tests-observability-map.yml | 2 +- .github/workflows/unit-tests-packages.yml | 4 +- .github/workflows/unit-tests-webapp.yml | 4 +- .nvmrc | 2 +- .../alerts-create-without-agent.md | 6 + .../legacy-slack-deleted-integration.md | 6 + ...evoke-previous-root-api-key-immediately.md | 6 + .server-changes/trigger-dashboard-url.md | 6 + CONTRIBUTING.md | 4 +- apps/supervisor/.nvmrc | 2 +- apps/supervisor/Containerfile | 2 +- .../components/alerts/LegacyAlertsSection.tsx | 8 +- .../alerts/ManualAlertCreation.dom.test.ts | 256 +++++++++++++++++ .../components/alerts/ManualAlertCreation.tsx | 272 ++++++++++++++++++ .../ManualAlertCreationDock.dom.test.ts | 159 ++++++++++ .../components/alerts/createAlertRequest.ts | 68 +++++ .../dashboard-agent/DashboardAgentHeader.tsx | 134 ++++----- .../dashboard-agent/DashboardPanelChrome.tsx | 39 +++ .../environments/RegenerateApiKeyModal.tsx | 23 +- .../app/components/navigation/SideMenu.tsx | 3 +- .../navigation/sideMenuSections.tsx | 5 +- apps/webapp/app/features.server.ts | 3 + apps/webapp/app/hooks/useFeatures.ts | 1 + apps/webapp/app/models/api-key.server.ts | 22 +- .../route.createPrefill.render.test.tsx | 114 +++++++- .../route.tsx | 119 +++++--- .../route.replace.render.test.tsx | 140 +++++++++ .../route.tsx | 86 ++++-- .../route.tsx | 9 +- .../app/routes/account._index/route.tsx | 24 +- ...cts.$projectRef.$env.regenerate-api-key.ts | 23 ++ ...oks.endpoints.$endpointId.rotate-secret.ts | 11 +- ...1.webhooks.endpoints.$endpointId.secret.ts | 7 +- ...ents.$environmentId.regenerate-api-key.tsx | 7 +- apps/webapp/app/v3/canUseAlertsList.server.ts | 7 +- apps/webapp/app/v3/canUseAlertsList.test.ts | 12 +- apps/webapp/app/v3/canUseAlertsList.ts | 12 +- .../environmentVariablesRepository.server.ts | 4 + apps/webapp/app/v3/featureFlags.ts | 2 + apps/webapp/app/v3/invocationUsage.server.ts | 3 + apps/webapp/app/v3/runEngine.server.ts | 6 + .../webapp/app/v3/runEngineHandlers.server.ts | 3 +- .../services/alerts/alertTransport.server.ts | 19 +- .../v3/services/alerts/deliverAlert.server.ts | 12 +- .../deliverDashboardAgentWatchAlert.server.ts | 12 +- .../alerts/deliverErrorGroupAlert.server.ts | 27 +- .../findSlackIntegration.server.test.ts | 57 ++++ .../v3/utils/waitpointStoreEnabled.server.ts | 26 ++ apps/webapp/app/v3/webhookSetupPrompt.ts | 2 +- apps/webapp/app/v3/webhookSigningSecret.ts | 9 - apps/webapp/test/alertsGateRoutes.test.ts | 22 +- .../webapp/test/alertsListRouteLegacy.test.ts | 3 + apps/webapp/test/alertsRequireEnabled.test.ts | 19 +- apps/webapp/test/api-auth.e2e.test.ts | 34 +++ .../test/canUseMonitoringAlerts.test.ts | 9 +- .../test/dashboardAgentAlertsGate.test.ts | 19 +- .../dashboardAgentMonitoringAlerts.test.ts | 1 + .../test/helpers/seedTestUserProject.ts | 3 + apps/webapp/test/invocationUsage.test.ts | 18 ++ apps/webapp/test/monitoringAlertsApi.test.ts | 4 + apps/webapp/test/regenerateApiKey.test.ts | 70 +++++ .../regenerateApiKeyBranch.e2e.full.test.ts | 63 +++- apps/webapp/test/sideMenuSections.test.ts | 3 + apps/webapp/test/waitpointRollout.test.ts | 35 +++ apps/webapp/test/webhookSetupPrompt.test.ts | 3 +- apps/webapp/test/webhookSigningSecret.test.ts | 9 +- base-images/images.json | 6 +- docker/Dockerfile | 2 +- docs/ai-chat/backend.mdx | 6 +- docs/ai-chat/patterns/redacting-telemetry.mdx | 10 +- docs/ai-chat/pending-messages.mdx | 2 +- docs/ai-chat/reference.mdx | 8 +- docs/apikeys.mdx | 2 +- docs/guides/examples/hookdeck-webhook.mdx | 105 ++++--- docs/mcp-tools.mdx | 4 - docs/snippets/webhooks-beta-banner.mdx | 7 - docs/snippets/webhooks-beta-note.mdx | 4 - docs/v3-openapi.yaml | 75 ++--- docs/webhooks/channels.mdx | 4 - docs/webhooks/connect.mdx | 19 +- docs/webhooks/deliveries.mdx | 6 +- docs/webhooks/filters.mdx | 4 - docs/webhooks/human-in-the-loop.mdx | 4 - docs/webhooks/linear.mdx | 4 - docs/webhooks/overview.mdx | 4 - docs/webhooks/session-routing.mdx | 4 - docs/webhooks/slack.mdx | 4 - docs/webhooks/sources.mdx | 36 ++- docs/webhooks/waiters.mdx | 4 - .../run-engine/src/engine/index.ts | 1 + .../completedWaitpointRecordAdapter.test.ts | 209 ++++++++++++++ .../completedWaitpointRecordAdapter.ts | 251 ++++++++++++++++ .../completedWaitpointResolver.test.ts | 118 +++++++- .../systems/completedWaitpointResolver.ts | 53 +++- .../redisPrimaryCompletionAssociation.test.ts | 174 ++++++++++- .../engine/systems/waitpointResultRunStore.ts | 52 ++++ .../engine/systems/waitpointSystem.test.ts | 73 ++++- .../src/engine/systems/waitpointSystem.ts | 81 +++++- .../run-engine/src/engine/types.ts | 5 + ...reCoordinator.readCompletedRecords.test.ts | 136 +++++++++ .../waitpointCoordinator/storeCoordinator.ts | 56 ++++ internal-packages/run-engine/src/index.ts | 7 +- .../completedWaitpointHydratingRunStore.ts | 97 +++++++ internal-packages/run-store/src/index.ts | 1 + .../redisSnapshotStore.recoveryLease.test.ts | 9 +- ...tionSnapshotStore.resolverLaziness.test.ts | 123 ++++++++ .../src/taskRunExecutionSnapshotStore.ts | 18 +- .../webhook-sources/catalog/providers.json | 21 ++ .../src/handAuthored/hookdeck.ts | 67 +++++ .../webhook-sources/src/handAuthored/index.ts | 2 + .../src/providerSignatures.test.ts | 58 ++++ .../webhook-sources/src/registry/hookdeck.ts | 19 ++ .../webhook-sources/src/registry/index.ts | 2 + packages/cli-v3/src/mcp/config.ts | 4 +- packages/cli-v3/src/mcp/tools/webhooks.ts | 40 ++- packages/core/src/v3/apiClient/index.ts | 9 +- packages/core/src/v3/schemas/webhookApi.ts | 25 ++ packages/core/src/v3/webhooks/index.ts | 34 +++ packages/core/test/runStream.test.ts | 24 +- packages/trigger-sdk/src/v3/ai.ts | 22 +- packages/trigger-sdk/src/v3/webhooks.ts | 25 +- .../trigger-sdk/test/bound-streamtext.test.ts | 86 ++++++ 140 files changed, 3878 insertions(+), 512 deletions(-) create mode 100644 .changeset/chat-agent-telemetry-default.md create mode 100644 .changeset/webhook-secret-grace-option.md create mode 100644 .changeset/webhooks-hookdeck-source.md create mode 100644 .server-changes/alerts-create-without-agent.md create mode 100644 .server-changes/legacy-slack-deleted-integration.md create mode 100644 .server-changes/revoke-previous-root-api-key-immediately.md create mode 100644 .server-changes/trigger-dashboard-url.md create mode 100644 apps/webapp/app/components/alerts/ManualAlertCreation.dom.test.ts create mode 100644 apps/webapp/app/components/alerts/ManualAlertCreation.tsx create mode 100644 apps/webapp/app/components/alerts/ManualAlertCreationDock.dom.test.ts create mode 100644 apps/webapp/app/components/alerts/createAlertRequest.ts create mode 100644 apps/webapp/app/components/dashboard-agent/DashboardPanelChrome.tsx create mode 100644 apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.alerts_.legacy/route.replace.render.test.tsx create mode 100644 apps/webapp/app/v3/invocationUsage.server.ts create mode 100644 apps/webapp/app/v3/utils/waitpointStoreEnabled.server.ts create mode 100644 apps/webapp/test/invocationUsage.test.ts create mode 100644 apps/webapp/test/regenerateApiKey.test.ts create mode 100644 apps/webapp/test/waitpointRollout.test.ts delete mode 100644 docs/snippets/webhooks-beta-banner.mdx delete mode 100644 docs/snippets/webhooks-beta-note.mdx create mode 100644 internal-packages/run-engine/src/engine/systems/completedWaitpointRecordAdapter.test.ts create mode 100644 internal-packages/run-engine/src/engine/systems/completedWaitpointRecordAdapter.ts create mode 100644 internal-packages/run-engine/src/engine/systems/waitpointResultRunStore.ts create mode 100644 internal-packages/run-engine/src/engine/waitpointCoordinator/storeCoordinator.readCompletedRecords.test.ts create mode 100644 internal-packages/run-store/src/completedWaitpointHydratingRunStore.ts create mode 100644 internal-packages/run-store/src/taskRunExecutionSnapshotStore.resolverLaziness.test.ts create mode 100644 internal-packages/webhook-sources/src/handAuthored/hookdeck.ts create mode 100644 internal-packages/webhook-sources/src/registry/hookdeck.ts diff --git a/.changeset/chat-agent-telemetry-default.md b/.changeset/chat-agent-telemetry-default.md new file mode 100644 index 00000000000..853de1a1b30 --- /dev/null +++ b/.changeset/chat-agent-telemetry-default.md @@ -0,0 +1,5 @@ +--- +"@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/webhook-secret-grace-option.md b/.changeset/webhook-secret-grace-option.md new file mode 100644 index 00000000000..7ee2f97de42 --- /dev/null +++ b/.changeset/webhook-secret-grace-option.md @@ -0,0 +1,6 @@ +--- +"@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 new file mode 100644 index 00000000000..52590506d58 --- /dev/null +++ b/.changeset/webhooks-hookdeck-source.md @@ -0,0 +1,6 @@ +--- +"@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/.github/workflows/changesets-pr.yml b/.github/workflows/changesets-pr.yml index 8e166211fa1..1f9210192cb 100644 --- a/.github/workflows/changesets-pr.yml +++ b/.github/workflows/changesets-pr.yml @@ -36,7 +36,7 @@ jobs: - name: Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: Install dependencies diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 6372bb2628b..486692691f4 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -44,7 +44,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 705233e839e..637c3c990ab 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -25,7 +25,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/e2e-webapp-auth-full.yml b/.github/workflows/e2e-webapp-auth-full.yml index 8721c4bc201..989c33fd1a2 100644 --- a/.github/workflows/e2e-webapp-auth-full.yml +++ b/.github/workflows/e2e-webapp-auth-full.yml @@ -85,7 +85,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: 🐳 Login to DockerHub diff --git a/.github/workflows/e2e-webapp.yml b/.github/workflows/e2e-webapp.yml index 7ef6a9b0722..e4a95335f9e 100644 --- a/.github/workflows/e2e-webapp.yml +++ b/.github/workflows/e2e-webapp.yml @@ -66,7 +66,7 @@ jobs: - name: βŽ” Setup node uses: WarpBuilds/setup-node@2867cf8f859d73439e1ad18b542617e5a29f0f10 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" # ..to avoid rate limits when pulling images diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index c024696e251..be6d8e81ddc 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -37,7 +37,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 - name: πŸ“₯ Download deps run: pnpm install --frozen-lockfile --filter trigger.dev... diff --git a/.github/workflows/fk-cascade-guard.yml b/.github/workflows/fk-cascade-guard.yml index 1c942a3ac39..48a5a4c3674 100644 --- a/.github/workflows/fk-cascade-guard.yml +++ b/.github/workflows/fk-cascade-guard.yml @@ -25,7 +25,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/migration-guard.yml b/.github/workflows/migration-guard.yml index 72672c9d927..6a16b5404cc 100644 --- a/.github/workflows/migration-guard.yml +++ b/.github/workflows/migration-guard.yml @@ -24,7 +24,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/observability-map.yml b/.github/workflows/observability-map.yml index ba283c6f603..1f590713571 100644 --- a/.github/workflows/observability-map.yml +++ b/.github/workflows/observability-map.yml @@ -184,7 +184,7 @@ jobs: - name: βŽ” Setup node uses: WarpBuilds/setup-node@2867cf8f859d73439e1ad18b542617e5a29f0f10 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps @@ -244,7 +244,7 @@ jobs: - name: βŽ” Setup node uses: WarpBuilds/setup-node@2867cf8f859d73439e1ad18b542617e5a29f0f10 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/preview-packages.yml b/.github/workflows/preview-packages.yml index ed0717c3bdd..b822c72f847 100644 --- a/.github/workflows/preview-packages.yml +++ b/.github/workflows/preview-packages.yml @@ -59,7 +59,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Install dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04333584916..bf48afb0ccd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,7 +90,7 @@ jobs: - name: Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" # npm v11.5.1 or newer is required for OIDC support @@ -303,7 +303,7 @@ jobs: - name: Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" # npm v11.5.1 or newer is required for OIDC support diff --git a/.github/workflows/runops-guard.yml b/.github/workflows/runops-guard.yml index c974aa1590f..080a21e701a 100644 --- a/.github/workflows/runops-guard.yml +++ b/.github/workflows/runops-guard.yml @@ -25,7 +25,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/sdk-compat.yml b/.github/workflows/sdk-compat.yml index 26baca286bf..2c5a65a5281 100644 --- a/.github/workflows/sdk-compat.yml +++ b/.github/workflows/sdk-compat.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [warp-ubuntu-latest-x64-4x] - node: ["20.20", "22.23", "24.18", "26.4"] + node: ["20.20", "22.23.4", "24.22.1", "26.12.1"] steps: - name: ⬇️ Checkout repo @@ -70,7 +70,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ₯Ÿ Setup Bun @@ -112,7 +112,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ¦• Setup Deno @@ -158,7 +158,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml index e9329191d05..420ffceba3d 100644 --- a/.github/workflows/typecheck.yml +++ b/.github/workflows/typecheck.yml @@ -25,7 +25,7 @@ jobs: - name: βŽ” Setup node uses: WarpBuilds/setup-node@2867cf8f859d73439e1ad18b542617e5a29f0f10 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: Restore Turbo cache diff --git a/.github/workflows/unit-tests-internal.yml b/.github/workflows/unit-tests-internal.yml index b836907e2c1..908f90d3455 100644 --- a/.github/workflows/unit-tests-internal.yml +++ b/.github/workflows/unit-tests-internal.yml @@ -67,7 +67,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" # ..to avoid rate limits when pulling images @@ -174,7 +174,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 - name: Download blob reports uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 diff --git a/.github/workflows/unit-tests-observability-map.yml b/.github/workflows/unit-tests-observability-map.yml index 2338bb6c51a..72b971f973d 100644 --- a/.github/workflows/unit-tests-observability-map.yml +++ b/.github/workflows/unit-tests-observability-map.yml @@ -30,7 +30,7 @@ jobs: - name: βŽ” Setup node uses: WarpBuilds/setup-node@2867cf8f859d73439e1ad18b542617e5a29f0f10 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" - name: πŸ“₯ Download deps diff --git a/.github/workflows/unit-tests-packages.yml b/.github/workflows/unit-tests-packages.yml index b7b8d7d01b6..2a293fb4e9e 100644 --- a/.github/workflows/unit-tests-packages.yml +++ b/.github/workflows/unit-tests-packages.yml @@ -66,7 +66,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" # ..to avoid rate limits when pulling images @@ -145,7 +145,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 # no cache enabled, we're not installing deps - name: Download blob reports from GitHub Actions Artifacts diff --git a/.github/workflows/unit-tests-webapp.yml b/.github/workflows/unit-tests-webapp.yml index c2c3ca54f84..22a2fd48d1c 100644 --- a/.github/workflows/unit-tests-webapp.yml +++ b/.github/workflows/unit-tests-webapp.yml @@ -68,7 +68,7 @@ jobs: - name: βŽ” Setup node uses: WarpBuilds/setup-node@2867cf8f859d73439e1ad18b542617e5a29f0f10 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 cache: "pnpm" # ..to avoid rate limits when pulling images @@ -180,7 +180,7 @@ jobs: - name: βŽ” Setup node uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: - node-version: 24.18.0 + node-version: 24.22.1 # no cache enabled, we're not installing deps - name: Download blob reports from GitHub Actions Artifacts diff --git a/.nvmrc b/.nvmrc index 5bcf9c6e6ac..474d750b504 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v24.18.0 +v24.22.1 diff --git a/.server-changes/alerts-create-without-agent.md b/.server-changes/alerts-create-without-agent.md new file mode 100644 index 00000000000..258a93ebefd --- /dev/null +++ b/.server-changes/alerts-create-without-agent.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: fix +--- + +Creating an alert works without the dashboard agent. diff --git a/.server-changes/legacy-slack-deleted-integration.md b/.server-changes/legacy-slack-deleted-integration.md new file mode 100644 index 00000000000..9dc10131151 --- /dev/null +++ b/.server-changes/legacy-slack-deleted-integration.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: fix +--- + +Alerts sent to Slack channels connected through a removed Slack installation deliver again. diff --git a/.server-changes/revoke-previous-root-api-key-immediately.md b/.server-changes/revoke-previous-root-api-key-immediately.md new file mode 100644 index 00000000000..d88254905ca --- /dev/null +++ b/.server-changes/revoke-previous-root-api-key-immediately.md @@ -0,0 +1,6 @@ +--- +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/trigger-dashboard-url.md b/.server-changes/trigger-dashboard-url.md new file mode 100644 index 00000000000..e36e0cbdd22 --- /dev/null +++ b/.server-changes/trigger-dashboard-url.md @@ -0,0 +1,6 @@ +--- +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/CONTRIBUTING.md b/CONTRIBUTING.md index 804c9cc5df1..88288a4b417 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,7 +33,7 @@ branch are tagged into a release periodically. ### Prerequisites -- [Node.js](https://nodejs.org/en) version 24.18.0 +- [Node.js](https://nodejs.org/en) version 24.22.1 - [pnpm package manager](https://pnpm.io/installation) version 10.33.2 - [Docker](https://www.docker.com/get-started/) (Compose 2.24.4 or newer for `dev:docker`) - [protobuf](https://github.com/protocolbuffers/protobuf) @@ -53,7 +53,7 @@ branch are tagged into a release periodically. ``` cd trigger.dev ``` -3. Ensure you are on the correct version of Node.js (24.18.0). If you are using `nvm`, there is an `.nvmrc` file that will automatically select the correct version of Node.js when you navigate to the repository. +3. Ensure you are on the correct version of Node.js (24.22.1). If you are using `nvm`, there is an `.nvmrc` file that will automatically select the correct version of Node.js when you navigate to the repository. 4. Run `corepack enable` to use the correct version of pnpm (`10.33.2`) as specified in the root `package.json` file. diff --git a/apps/supervisor/.nvmrc b/apps/supervisor/.nvmrc index 5bcf9c6e6ac..474d750b504 100644 --- a/apps/supervisor/.nvmrc +++ b/apps/supervisor/.nvmrc @@ -1 +1 @@ -v24.18.0 +v24.22.1 diff --git a/apps/supervisor/Containerfile b/apps/supervisor/Containerfile index 727ae6db442..a759e8f6f9d 100644 --- a/apps/supervisor/Containerfile +++ b/apps/supervisor/Containerfile @@ -1,4 +1,4 @@ -FROM node:24.18.0-alpine@sha256:a0b9bf06e4e6193cf7a0f58816cc935ff8c2a908f81e6f1a95432d679c54fbfd AS node-24-alpine +FROM node:24.22.1-alpine@sha256:06d7adf3e0ef61a13f1d28682726366f97a15aa1888c934d3ecec86c33918b53 AS node-24-alpine WORKDIR /app diff --git a/apps/webapp/app/components/alerts/LegacyAlertsSection.tsx b/apps/webapp/app/components/alerts/LegacyAlertsSection.tsx index d70e6039f29..b5be2f10f89 100644 --- a/apps/webapp/app/components/alerts/LegacyAlertsSection.tsx +++ b/apps/webapp/app/components/alerts/LegacyAlertsSection.tsx @@ -1,3 +1,4 @@ +import { BellAlertIcon } from "@heroicons/react/20/solid"; import { TrashIcon } from "~/assets/icons/TrashIcon"; import { useState } from "react"; import { AgentIcon } from "~/components/dashboard-agent/agent-identity"; @@ -48,6 +49,7 @@ export function LegacyAlertsSection({ canWrite = true, canDelete = true, replacing = false, + manualReplace = false, }: { channels: LegacyAlertChannelRow[]; onReplace: (row: LegacySubscriptionRow) => void; @@ -55,6 +57,7 @@ export function LegacyAlertsSection({ canWrite?: boolean; canDelete?: boolean; replacing?: boolean; + manualReplace?: boolean; }) { const [deleting, setDeleting] = useState(); const rows = legacySubscriptions(channels); @@ -87,8 +90,9 @@ export function LegacyAlertsSection({ {row.migration.kind === "replace" ? (