Compare commits

...

20 Commits

Author SHA1 Message Date
Matt Aitken a8db8ce4e4 Latest lockfile 2024-05-16 19:13:16 +01:00
github-actions[bot] a7ca1222d7 chore: Update version for release (beta) (#1104)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-05-16 19:00:06 +01:00
Eric Allam c9733f357f Fix issues with special characters in queue/task names causing runs to get stuck in queued 2024-05-16 17:35:50 +01:00
Matt Aitken ba61bfe3b9 Fixed feedback panel links (status page and docs) 2024-05-16 17:30:44 +01:00
James Ritchie 89eaef495f New alerts platform status + Alerts docs (#1098)
* debug tooltip now scrolls

* Added a link to subscribe to alerts and improved the project alerts blank state

* Better external link icon

* Docs: Removed webhook tasks

* Docs: removed limits performance

* Docs: removed FAQs

* Docs: Removed Architecture section

* Docs: Removed API reference: CLI

* Docs: Removed API reference: Objects

* Docs: Removed API reference: Functions

* Docs: removed automated tests

* Docs: removed Middleware

* Docs: removed Using APIs

* Docs: removed Rollbacks

* Docs: removed Trigger Filters

* Docs: removed Webhook Tasks

* Docs: removed Zod Tasks

* Docs: Renamed Community page

* Docs: Added a new Troubleshooting section and Alerts docs page

* Hide the New Alerts button again if list is greater than 10 items

* Customers now have to contact us for Slack Connect Support.

* Fix the alerts docs link

* Added env vars for a different alert email address, and whether the feature is enabled or not

* Only show the alerts sidemenu item if the feature is enabled

* Use a separate email client for sending alerts

* Removed the link to Context from v3 docs

* Removed obvious docs links that are now missing pages

---------

Co-authored-by: Matt Aitken <matt@mattaitken.com>
2024-05-16 16:03:25 +01:00
Eric Allam 6a379e4e91 Fix 3rd party otel propagation from breaking our Task Events data from being properly correlated to the correct trace 2024-05-16 12:07:21 +01:00
Eric Allam c0b815c363 Check for an existing restore event before trying to restore a checkpoint 2024-05-16 09:27:44 +01:00
Matt Aitken 598906fc4c Fix for typo in v3 CLI login command 2024-05-16 09:23:45 +01:00
Eric Allam b77ece1567 Log when disabling an endpoint 2024-05-15 21:51:08 +01:00
Eric Allam a73dc80177 Failing jobs shouldn’t log as an error 2024-05-15 21:49:52 +01:00
Eric Allam 2496917a7a v2: Graphile auto-cleanup and auto-endpoint disabling (#1103)
* Auto-cleanup failed graphile jobs instead of keeping them around

* Disable endpoint after a period of sequential indexing failures

* Remove log
2024-05-15 21:15:06 +01:00
Matt Aitken dc53f0f432 Added steps on how to test local tasks 2024-05-15 18:56:48 +01:00
Matt Aitken 87788f29c9 A v3 catalog readme 2024-05-15 18:53:38 +01:00
Eric Allam 6ede68648a Remove alerts side menu (again) 2024-05-15 17:25:41 +01:00
Eric Allam f24b5b770d Protect against doWork getting called mulitple times per consumer 2024-05-15 17:01:03 +01:00
Eric Allam cb81d6c835 Release 3.0.0-beta.32 2024-05-15 16:23:06 +01:00
github-actions[bot] 72748603ab chore: Update version for release (beta) (#1102)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-05-15 16:21:58 +01:00
Eric Allam f96f1e91a2 Adding changeset 2024-05-15 13:49:11 +01:00
Eric Allam 21c8b847e5 Better handle resolving dependencies when there are conflicts 2024-05-15 13:26:03 +01:00
Matt Aitken b39f79f0ab Use an env var for the Graphile cleanup ttl, set the default to 3 days (was 7) 2024-05-14 19:07:50 +01:00
154 changed files with 1320 additions and 713 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"trigger.dev": patch
---
Better handle issues with resolving dependency versions during deploy
+3
View File
@@ -61,6 +61,7 @@
"dull-mangos-press",
"eight-pumas-float",
"eleven-paws-join",
"famous-boats-tease",
"few-students-share",
"funny-swans-destroy",
"gorgeous-gorillas-compete",
@@ -117,8 +118,10 @@
"tender-moose-tell",
"tender-oranges-rhyme",
"thin-parents-heal",
"thirty-islands-kiss",
"tidy-balloons-suffer",
"tidy-dryers-sleep",
"tidy-tomatoes-explain",
"tiny-doors-type",
"tiny-elephants-scream",
"tricky-bulldogs-heal",
+5
View File
@@ -0,0 +1,5 @@
---
"trigger.dev": patch
---
Fix for typo in v3 CLI login command
+5
View File
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---
Fix 3rd party otel propagation from breaking our Task Events data from being properly correlated to the correct trace
+1 -8
View File
@@ -115,14 +115,7 @@ export function Feedback({ button, defaultValue = "bug" }: FeedbackProps) {
Docs
</LinkButton>
<LinkButton
to={docsPath("v3/introduction")}
variant="tertiary/medium"
LeadingIcon={BookOpenIcon}
>
v3 Docs (Developer preview)
</LinkButton>
<LinkButton
to={"https://trigger.openstatus.dev/"}
to={"https://status.trigger.dev/"}
variant="tertiary/medium"
LeadingIcon={ActivityIcon}
>
@@ -20,9 +20,11 @@ export function AdminDebugTooltip({ children }: { children: React.ReactNode }) {
<TooltipProvider>
<Tooltip>
<TooltipTrigger>
<ShieldCheckIcon className="h-5 w-5" />
<ShieldCheckIcon className="size-5" />
</TooltipTrigger>
<TooltipContent className="flex items-center gap-1">{children}</TooltipContent>
<TooltipContent className="flex max-h-[90vh] items-center gap-1 overflow-y-auto">
{children}
</TooltipContent>
</Tooltip>
</TooltipProvider>
);
@@ -233,31 +233,22 @@ export function SideMenu({ user, project, organization, organizations }: SideMen
</div>
<hr className="border-charcoal-800" />
<div>
<StepNumber stepNumber="1" title="Create a new Slack channel" />
<StepNumber stepNumber="1" title="Email us" />
<StepContentContainer>
<Paragraph>
In your Slack app, create a new channel from the main menu by going to File{" "}
<ArrowRightIcon className="inline h-4 w-4 text-text-dimmed" /> New Channel
</Paragraph>
</StepContentContainer>
<StepNumber stepNumber="2" title="Setup your channel" />
<StepContentContainer>
<Paragraph>
Name your channel, set its visibility and click 'Create'.
</Paragraph>
</StepContentContainer>
<StepNumber stepNumber="3" title="Invite Trigger.dev" />
<StepContentContainer>
<Paragraph>
Invite this email address to your channel:{" "}
Send us an email to this address from your Trigger.dev account email
address:
<ClipboardField
variant="primary/medium"
value="james@trigger.dev"
value="priority-support@trigger.dev"
className="my-2"
/>
</Paragraph>
</StepContentContainer>
<StepNumber stepNumber="2" title="Look out for an invite from Slack" />
<StepContentContainer>
<Paragraph>
As soon as we can, we'll accept your invitation and say hello!
As soon as we can, we'll setup a Slack Connect channel and say hello!
</Paragraph>
</StepContentContainer>
</div>
@@ -551,6 +542,8 @@ function V3ProjectSideMenu({
project: SideMenuProject;
organization: MatchedOrganization;
}) {
const { alertsEnabled } = useFeatures();
return (
<>
<SideMenuHeader title={"Project (v3)"} />
@@ -603,13 +596,15 @@ function V3ProjectSideMenu({
to={v3DeploymentsPath(organization, project)}
data-action="deployments"
/>
<SideMenuItem
name="Alerts"
icon={BellAlertIcon}
iconColor="text-red-500"
to={v3ProjectAlertsPath(organization, project)}
data-action="alerts"
/>
{alertsEnabled && (
<SideMenuItem
name="Alerts"
icon={BellAlertIcon}
iconColor="text-red-500"
to={v3ProjectAlertsPath(organization, project)}
data-action="alerts"
/>
)}
<SideMenuItem
name="Project settings"
icon="settings"
+8
View File
@@ -47,6 +47,8 @@ const EnvironmentSchema = z.object({
WORKER_SCHEMA: z.string().default("graphile_worker"),
WORKER_CONCURRENCY: z.coerce.number().int().default(10),
WORKER_POLL_INTERVAL: z.coerce.number().int().default(1000),
/** The number of days a failed Graphile task should stay before getting cleaned up */
WORKER_CLEANUP_TTL_DAYS: z.coerce.number().int().default(3),
EXECUTION_WORKER_CONCURRENCY: z.coerce.number().int().default(10),
EXECUTION_WORKER_POLL_INTERVAL: z.coerce.number().int().default(1000),
WORKER_ENABLED: z.string().default("true"),
@@ -156,6 +158,12 @@ const EnvironmentSchema = z.object({
ORG_SLACK_INTEGRATION_CLIENT_ID: z.string().optional(),
ORG_SLACK_INTEGRATION_CLIENT_SECRET: z.string().optional(),
/** These enable the alerts feature in v3 */
ALERT_FROM_EMAIL: z.string().optional(),
ALERT_RESEND_API_KEY: z.string().optional(),
MAX_SEQUENTIAL_INDEX_FAILURE_COUNT: z.coerce.number().default(96),
});
export type Environment = z.infer<typeof EnvironmentSchema>;
+2
View File
@@ -4,6 +4,7 @@ import { requestUrl } from "./utils/requestUrl.server";
export type TriggerFeatures = {
isManagedCloud: boolean;
v3Enabled: boolean;
alertsEnabled: boolean;
};
// If the request host is cloud.trigger.dev then we are on the managed cloud
@@ -20,5 +21,6 @@ export function featuresForRequest(request: Request): TriggerFeatures {
return {
isManagedCloud,
v3Enabled: env.V3_ENABLED === "true",
alertsEnabled: env.ALERT_FROM_EMAIL !== undefined && env.ALERT_RESEND_API_KEY !== undefined,
};
}
+1 -1
View File
@@ -5,5 +5,5 @@ import type { TriggerFeatures } from "~/features.server";
export function useFeatures(): TriggerFeatures {
const routeMatch = useTypedRouteLoaderData<typeof loader>("root");
return routeMatch?.features ?? { isManagedCloud: false, v3Enabled: false };
return routeMatch?.features ?? { isManagedCloud: false, v3Enabled: false, alertsEnabled: false };
}
@@ -577,6 +577,17 @@ export class ZodWorker<TMessageCatalog extends MessageCatalogSchema> {
span.recordException(new Error(String(error)));
}
if (job.attempts >= job.max_attempts) {
logger.debug("Job failed after max attempts", {
job,
attempts: job.attempts,
max_attempts: job.max_attempts,
error: error instanceof Error ? error.message : error,
});
return;
}
throw error;
} finally {
span.end();
@@ -1,6 +1,7 @@
import { useForm } from "@conform-to/react";
import { parse } from "@conform-to/zod";
import {
ArrowUpRightIcon,
BoltIcon,
BoltSlashIcon,
BookOpenIcon,
@@ -15,12 +16,14 @@ import { ActionFunctionArgs, LoaderFunctionArgs, json } from "@remix-run/server-
import { SlackIcon } from "@trigger.dev/companyicons";
import { ProjectAlertChannelType, ProjectAlertType } from "@trigger.dev/database";
import assertNever from "assert-never";
import { ExternalLinkIcon } from "lucide-react";
import { typedjson, useTypedLoaderData } from "remix-typedjson";
import { z } from "zod";
import { PageBody, PageContainer } from "~/components/layout/AppLayout";
import { Button, LinkButton } from "~/components/primitives/Buttons";
import { ClipboardField } from "~/components/primitives/ClipboardField";
import { DetailCell } from "~/components/primitives/DetailCell";
import { Header2 } from "~/components/primitives/Headers";
import { NavBar, PageAccessories, PageTitle } from "~/components/primitives/PageHeader";
import { Paragraph } from "~/components/primitives/Paragraph";
import {
@@ -155,7 +158,7 @@ export default function Page() {
<PageAccessories>
<LinkButton
LeadingIcon={BookOpenIcon}
to={docsPath("v3/project-alerts")}
to={docsPath("v3/troubleshooting-alerts")}
variant="minimal/small"
>
Alerts docs
@@ -164,16 +167,19 @@ export default function Page() {
</NavBar>
<PageBody>
<div className={cn("flex h-full flex-col gap-3")}>
<div className="flex items-center justify-end gap-2">
<LinkButton
to={v3NewProjectAlertPath(organization, project)}
variant="primary/small"
LeadingIcon={PlusIcon}
shortcut={{ key: "n" }}
>
New alert
</LinkButton>
</div>
{alertChannels.length > 0 && alertChannels.length < 10 && (
<div className="flex items-end justify-between">
<Header2 className="">Project alerts</Header2>
<LinkButton
to={v3NewProjectAlertPath(organization, project)}
variant="primary/small"
LeadingIcon={PlusIcon}
shortcut={{ key: "n" }}
>
New alert
</LinkButton>
</div>
)}
<Table>
<TableHeader>
<TableRow>
@@ -214,14 +220,42 @@ export default function Page() {
) : (
<TableRow>
<TableCell colSpan={5}>
<div className="flex items-center justify-center">
<Paragraph>No alerts have been created</Paragraph>
<div className="flex flex-col items-center justify-center py-6">
<Header2 spacing className="text-text-bright">
You haven't created any project alerts yet
</Header2>
<Paragraph variant="small" className="mb-4">
Get alerted when runs or deployments fail, or when deployments succeed.
</Paragraph>
<LinkButton
to={v3NewProjectAlertPath(organization, project)}
variant="primary/medium"
LeadingIcon={PlusIcon}
shortcut={{ key: "n" }}
>
New alert
</LinkButton>
</div>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
<div className="mt-4">
<Header2 className="mb-1">Platform alerts</Header2>
<Paragraph variant="small" className="mb-4">
Get email notifications when Trigger.dev creates, updates or resolves a platform
incident.
</Paragraph>
<LinkButton
variant="tertiary/medium"
TrailingIcon={ArrowUpRightIcon}
to="https://status.trigger.dev/"
target="_blank"
>
Subscribe
</LinkButton>
</div>
</div>
<Outlet />
</PageBody>
@@ -106,7 +106,7 @@ export class TriggerEndpointIndexHookService {
},
});
if (!endpoint) {
if (!endpoint || !endpoint.url) {
throw new Error("Endpoint not found");
}
@@ -11,9 +11,10 @@ const ParamsSchema = z.object({
});
export const HeadersSchema = z.object({
"idempotency-key": z.string().optional().nullable(),
"trigger-version": z.string().optional().nullable(),
"x-trigger-span-parent-as-link": z.coerce.number().optional().nullable(),
"idempotency-key": z.string().nullish(),
"trigger-version": z.string().nullish(),
"x-trigger-span-parent-as-link": z.coerce.number().nullish(),
"x-trigger-worker": z.string().nullish(),
traceparent: z.string().optional(),
tracestate: z.string().optional(),
});
@@ -45,6 +46,7 @@ export async function action({ request, params }: ActionFunctionArgs) {
"x-trigger-span-parent-as-link": spanParentAsLink,
traceparent,
tracestate,
"x-trigger-worker": isFromWorker,
} = headers.data;
const { taskId } = ParamsSchema.parse(params);
@@ -58,20 +60,31 @@ export async function action({ request, params }: ActionFunctionArgs) {
return json({ error: "Invalid request body" }, { status: 400 });
}
logger.debug("Triggering task", {
taskId,
idempotencyKey,
triggerVersion,
body: body.data,
});
const service = new TriggerTaskService();
try {
const traceContext = traceparent
? !triggerVersion // If the trigger version is NOT set, we are in an older version of the SDK
? { traceparent, tracestate }
: isFromWorker // If the trigger version is set, and the request is from a worker, we should pass the trace context
? { traceparent, tracestate }
: undefined
: undefined;
logger.debug("Triggering task", {
taskId,
idempotencyKey,
triggerVersion,
headers: Object.fromEntries(request.headers),
body: body.data,
isFromWorker,
traceContext,
});
const run = await service.call(taskId, authenticationResult.environment, body.data, {
idempotencyKey: idempotencyKey ?? undefined,
triggerVersion: triggerVersion ?? undefined,
traceContext: traceparent ? { traceparent, tracestate } : undefined,
traceContext,
spanParentAsLink: spanParentAsLink === 1,
});
@@ -191,6 +191,7 @@ export const apiRateLimiter = authorizationRateLimitMiddleware({
pathMatchers: [/^\/api/],
// Allow /api/v1/tasks/:id/callback/:secret
pathWhiteList: [
"/api/internal/stripe_webhooks",
"/api/v1/authorization-code",
"/api/v1/token",
/^\/api\/v1\/tasks\/[^\/]+\/callback\/[^\/]+$/, // /api/v1/tasks/$id/callback/$secret
+15
View File
@@ -20,6 +20,17 @@ const client = singleton(
})
);
const alertsClient = singleton(
"alerts-email-client",
() =>
new EmailClient({
apikey: env.ALERT_RESEND_API_KEY,
imagesBaseUrl: env.APP_ORIGIN,
from: env.ALERT_FROM_EMAIL ?? "noreply@alerts.trigger.dev",
replyTo: env.REPLY_TO_EMAIL ?? "help@email.trigger.dev",
})
);
export async function sendMagicLinkEmail(options: SendEmailOptions<AuthUser>): Promise<void> {
// Auto redirect when in development mode
if (env.NODE_ENV === "development") {
@@ -67,3 +78,7 @@ export async function scheduleEmail(data: DeliverEmail, delay?: { seconds: numbe
export async function sendEmail(data: DeliverEmail) {
return client.send(data);
}
export async function sendAlertEmail(data: DeliverEmail) {
return alertsClient.send(data);
}
@@ -14,6 +14,9 @@ import { IndexEndpointStats } from "@trigger.dev/core";
import { RegisterHttpEndpointService } from "../triggers/registerHttpEndpoint.server";
import { RegisterWebhookService } from "../triggers/registerWebhook.server";
import { EndpointIndex } from "@trigger.dev/database";
import { env } from "~/env.server";
const MAX_SEQUENTIAL_FAILURE_COUNT = env.MAX_SEQUENTIAL_INDEX_FAILURE_COUNT;
export class PerformEndpointIndexService {
#prismaClient: PrismaClient;
@@ -56,9 +59,16 @@ export class PerformEndpointIndexService {
if (!endpointIndex.endpoint.url) {
logger.debug("Endpoint URL is not set", endpointIndex);
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: "Endpoint URL is not set",
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: "Endpoint URL is not set",
},
false
);
}
// Make a request to the endpoint to fetch a list of jobs
@@ -69,9 +79,15 @@ export class PerformEndpointIndexService {
const { response, parser, headerParser, errorParser } = await client.indexEndpoint();
if (!response) {
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}`,
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}`,
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
if (isRedirect(response.status)) {
@@ -83,15 +99,27 @@ export class PerformEndpointIndexService {
const location = response.headers.get("location");
if (!location) {
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting but no location header is present`,
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting but no location header is present`,
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
if (redirectCount > 5) {
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting too many times`,
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: `Endpoint ${endpointIndex.endpoint.url} is redirecting too many times`,
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
await this.#prismaClient.endpoint.update({
@@ -111,20 +139,38 @@ export class PerformEndpointIndexService {
const body = await safeBodyFromResponse(response, errorParser);
if (body) {
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: body.message,
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: body.message,
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: "Trigger API key is invalid",
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: "Trigger API key is invalid",
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
if (!response.ok) {
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}. Status code: ${response.status}`,
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: `Could not connect to endpoint ${endpointIndex.endpoint.url}. Status code: ${response.status}`,
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
const anyBody = await response.json();
@@ -152,10 +198,16 @@ export class PerformEndpointIndexService {
}).message;
}
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: friendlyError,
raw: fromZodError(bodyResult.error).message,
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: friendlyError,
raw: fromZodError(bodyResult.error).message,
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
const headerResult = headerParser.safeParse(Object.fromEntries(response.headers.entries()));
@@ -163,10 +215,16 @@ export class PerformEndpointIndexService {
const friendlyError = fromZodError(headerResult.error, {
prefix: "Your headers are invalid",
});
return updateEndpointIndexWithError(this.#prismaClient, id, {
message: friendlyError.message,
raw: headerResult.error.issues,
});
return updateEndpointIndexWithError(
this.#prismaClient,
id,
endpointIndex.endpoint.id,
{
message: friendlyError.message,
raw: headerResult.error.issues,
},
endpointIndex.endpoint.environment.type !== "DEVELOPMENT"
);
}
const { jobs, sources, dynamicTriggers, dynamicSchedules, httpEndpoints, webhooks } =
@@ -407,8 +465,49 @@ export class PerformEndpointIndexService {
async function updateEndpointIndexWithError(
prismaClient: PrismaClient,
id: string,
error: EndpointIndexError
endpointId: string,
error: EndpointIndexError,
checkDisabling = true
) {
// Check here to see if this endpoint has only failed for the last 50 times
// And if so, we disable the endpoint by setting the url to null
if (checkDisabling) {
const recentIndexes = await prismaClient.endpointIndex.findMany({
where: {
endpointId,
id: {
not: id,
},
},
orderBy: {
createdAt: "desc",
},
take: MAX_SEQUENTIAL_FAILURE_COUNT - 1,
select: {
status: true,
},
});
if (
recentIndexes.length === MAX_SEQUENTIAL_FAILURE_COUNT - 1 &&
recentIndexes.every((index) => index.status === "FAILURE")
) {
logger.debug("Disabling endpoint", {
endpointId,
error,
});
await prismaClient.endpoint.update({
where: {
id: endpointId,
},
data: {
url: null,
},
});
}
}
return await prismaClient.endpointIndex.update({
where: {
id,
@@ -32,10 +32,11 @@ export class HandleHttpSourceService {
return { status: 200 };
}
if (!triggerSource.endpoint.url) {
return { status: 404 };
}
if (!triggerSource.organization.runsEnabled) {
logger.debug("HandleHttpSourceService: Runs are disabled for this organization", {
organizationId: triggerSource.organization.id,
});
return { status: 404 };
}
@@ -232,11 +232,6 @@ function getWorkerQueue() {
return new ZodWorker({
name: "workerQueue",
prisma,
cleanup: {
frequencyExpression: "13,27,43 * * * *",
ttl: 7 * 24 * 60 * 60 * 1000, // 7 days
maxCount: 1000,
},
runnerOptions: {
connectionString: env.DATABASE_URL,
concurrency: env.WORKER_CONCURRENCY,
@@ -12,7 +12,7 @@ import { prisma } from "~/db.server";
import { createNewSession, disconnectSession } from "~/models/runtimeEnvironment.server";
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
import { logger } from "~/services/logger.server";
import { marqs } from "~/v3/marqs/index.server";
import { marqs, sanitizeQueueName } from "~/v3/marqs/index.server";
import { EnvironmentVariablesRepository } from "../environmentVariables/environmentVariablesRepository.server";
import { generateFriendlyId } from "../friendlyIdentifiers";
import { CancelAttemptService } from "../services/cancelAttempt.server";
@@ -90,6 +90,10 @@ export class DevQueueConsumer {
return;
}
if (this._backgroundWorkers.has(backgroundWorker.id)) {
return;
}
this._backgroundWorkers.set(backgroundWorker.id, backgroundWorker);
logger.debug("Registered background worker", { backgroundWorker: backgroundWorker.id });
@@ -271,10 +275,10 @@ export class DevQueueConsumer {
return;
}
this._enabled = true;
// Create the session
await createNewSession(this.env, this._options.ipAddress ?? "unknown");
this._enabled = true;
this._perTraceCountdown = this._options.maximumItemsPerTrace;
this._lastNewTrace = new Date();
this._taskFailures = 0;
@@ -448,11 +452,21 @@ export class DevQueueConsumer {
const queue = await prisma.taskQueue.findUnique({
where: {
runtimeEnvironmentId_name: { runtimeEnvironmentId: this.env.id, name: lockedTaskRun.queue },
runtimeEnvironmentId_name: {
runtimeEnvironmentId: this.env.id,
name: sanitizeQueueName(lockedTaskRun.queue),
},
},
});
if (!queue) {
logger.debug("[DevQueueConsumer] Failed to find queue", {
queueName: lockedTaskRun.queue,
sanitizedName: sanitizeQueueName(lockedTaskRun.queue),
taskRun: lockedTaskRun.id,
messageId: message.messageId,
});
await marqs?.nackMessage(message.messageId);
setTimeout(() => this.#doWork(), 1000);
return;
@@ -21,7 +21,7 @@ import { z } from "zod";
import { prisma } from "~/db.server";
import { logger } from "~/services/logger.server";
import { singleton } from "~/utils/singleton";
import { marqs } from "~/v3/marqs/index.server";
import { marqs, sanitizeQueueName } from "~/v3/marqs/index.server";
import { EnvironmentVariablesRepository } from "../environmentVariables/environmentVariablesRepository.server";
import { generateFriendlyId } from "../friendlyIdentifiers";
import { socketIo } from "../handleSocketIo.server";
@@ -408,7 +408,7 @@ export class SharedQueueConsumer {
where: {
runtimeEnvironmentId_name: {
runtimeEnvironmentId: lockedTaskRun.runtimeEnvironmentId,
name: lockedTaskRun.queue,
name: sanitizeQueueName(lockedTaskRun.queue),
},
},
});
@@ -635,12 +635,17 @@ export class SharedQueueConsumer {
where: {
runtimeEnvironmentId_name: {
runtimeEnvironmentId: resumableAttempt.runtimeEnvironmentId,
name: resumableRun.queue,
name: sanitizeQueueName(resumableRun.queue),
},
},
});
if (!queue) {
logger.debug("SharedQueueConsumer queue not found, so nacking message", {
queueName: sanitizeQueueName(resumableRun.queue),
attempt: resumableAttempt,
});
await this.#nackAndDoMoreWork(message.messageId, this._options.nextTickInterval);
return;
}
@@ -10,7 +10,7 @@ import {
ProjectAlertWebhookProperties,
} from "~/models/projectAlert.server";
import { DeploymentPresenter } from "~/presenters/v3/DeploymentPresenter.server";
import { sendEmail } from "~/services/email.server";
import { sendAlertEmail, sendEmail } from "~/services/email.server";
import { logger } from "~/services/logger.server";
import { decryptSecret } from "~/services/secrets/secretStore.server";
import { workerQueue } from "~/services/worker.server";
@@ -144,7 +144,7 @@ export class DeliverAlertService extends BaseService {
return;
}
await sendEmail({
await sendAlertEmail({
email: "alert-attempt",
to: emailProperties.data.email,
taskIdentifier: alert.taskRunAttempt.taskRun.taskIdentifier,
@@ -177,7 +177,7 @@ export class DeliverAlertService extends BaseService {
return;
}
await sendEmail({
await sendAlertEmail({
email: "alert-deployment-failure",
to: emailProperties.data.email,
version: alert.workerDeployment.version,
@@ -197,7 +197,7 @@ export class DeliverAlertService extends BaseService {
}
case "DEPLOYMENT_SUCCESS": {
if (alert.workerDeployment) {
await sendEmail({
await sendAlertEmail({
email: "alert-deployment-success",
to: emailProperties.data.email,
version: alert.workerDeployment.version,
@@ -81,6 +81,22 @@ export class RestoreCheckpointService extends BaseService {
return;
}
const restoreEvent = await this._prisma.checkpointRestoreEvent.findFirst({
where: {
checkpointId: checkpoint.id,
type: "RESTORE",
},
});
if (restoreEvent) {
logger.error("Restore event already exists", {
checkpointId: checkpoint.id,
restoreEventId: restoreEvent.id,
});
return;
}
const eventService = new CreateCheckpointRestoreEventService(this._prisma);
await eventService.restore({ checkpointId: checkpoint.id });
+1 -1
View File
@@ -100,7 +100,7 @@ function getTracer() {
if (env.INTERNAL_OTEL_TRACE_EXPORTER_URL) {
const exporter = new OTLPTraceExporter({
url: env.INTERNAL_OTEL_TRACE_EXPORTER_URL,
timeoutMillis: 1000,
timeoutMillis: 10_000,
headers:
env.INTERNAL_OTEL_TRACE_EXPORTER_AUTH_HEADER_NAME &&
env.INTERNAL_OTEL_TRACE_EXPORTER_AUTH_HEADER_VALUE
Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

+13 -72
View File
@@ -95,13 +95,7 @@
{
"group": "Getting Started",
"version": "v3 (Developer Preview)",
"pages": [
"v3/quick-start",
"v3/upgrading-from-v2",
"v3/changelog",
"v3/feature-matrix",
"v3/limits-performance"
]
"pages": ["v3/quick-start", "v3/upgrading-from-v2", "v3/changelog", "v3/feature-matrix"]
},
{
"group": "Fundamentals",
@@ -113,7 +107,7 @@
"v3/apikeys",
{
"group": "Task types",
"pages": ["v3/tasks-regular", "v3/tasks-scheduled", "v3/tasks-zod", "v3/tasks-webhooks"]
"pages": ["v3/tasks-regular", "v3/tasks-scheduled"]
},
"v3/trigger-config"
]
@@ -158,12 +152,7 @@
"v3/machines",
"v3/idempotency",
"v3/reattempting-replaying",
"v3/trigger-filters",
"v3/notifications",
"v3/rollbacks",
"v3/using-apis",
"v3/middleware",
"v3/automated-tests"
"v3/notifications"
]
},
{
@@ -189,77 +178,29 @@
"v3/management-deactivate-schedule",
"v3/management-activate-schedule"
]
},
{
"group": "Functions",
"pages": [
"v3/reference-task",
"v3/reference-cron-task",
"v3/reference-cron-dynamic",
"v3/reference-interval-task",
"v3/reference-interval-dynamic",
"v3/reference-zod-task",
"v3/reference-zod-catalog",
"v3/reference-task-trigger",
"v3/reference-task-trigger-and-wait",
"v3/reference-task-batch-trigger",
"v3/reference-task-batch-trigger-and-wait",
"v3/reference-wait-for",
"v3/reference-wait-until",
"v3/reference-wait-for-event",
"v3/reference-wait-for-request",
"v3/reference-retry-on-throw",
"v3/reference-retry-fetch",
"v3/reference-retry-intercept-fetch",
"v3/reference-notification-catalog",
"v3/reference-notify",
"v3/reference-queue"
]
},
{
"group": "Objects",
"pages": ["v3/reference-context"]
},
{
"group": "CLI",
"pages": [
"v3/reference-cli-init",
"v3/reference-cli-dev",
"v3/reference-cli-deploy",
"v3/reference-cli-login",
"v3/reference-cli-logout",
"v3/reference-cli-update",
"v3/reference-cli-build",
"v3/reference-cli-who-am-i"
]
}
]
},
{
"group": "Architecture",
"version": "v3 (Developer Preview)",
"pages": [
"v3/architecture-how-it-works",
"v3/architecture-multi-tenant-queue",
"v3/architecture-reliability"
]
},
{
"group": "Open source",
"version": "v3 (Developer Preview)",
"pages": ["v3/github-repo", "v3/open-source-self-hosting", "v3/open-source-contributing"]
},
{
"group": "Help",
"group": "Troubleshooting",
"version": "v3 (Developer Preview)",
"pages": [
"v3/help-faqs",
"v3/community",
"v3/help-email",
"v3/help-slack",
"v3/help-uptime-status"
"v3/troubleshooting-alerts",
"v3/troubleshooting-uptime-status",
"v3/troubleshooting-github-issues",
"v3/troubleshooting-github-discussions"
]
},
{
"group": "Help",
"version": "v3 (Developer Preview)",
"pages": ["v3/community", "v3/help-slack", "v3/help-email"]
},
{
"group": "Getting Started",
"version": "v2",
-7
View File
@@ -1,7 +0,0 @@
---
title: "Architecture: How it works"
sidebarTitle: "How it works"
description: "An overview of how Trigger.dev v3 works under the hood."
---
<Snippet file="incomplete-docs.mdx" />
@@ -1,7 +0,0 @@
---
title: "Architecture: Multi-tenant queue"
sidebarTitle: "Multi-tenant queue"
description: "We built a reliable and fair multi-tenant queue that controls triggering all tasks."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "Architecture: Reliability"
sidebarTitle: "Reliability"
description: "How reliability is achieved with Trigger.dev."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "Automated tests"
description: "Write automated tests of your tasks."
---
<Snippet file="coming-soon.mdx" />
+1 -1
View File
@@ -1,5 +1,5 @@
---
title: "Community"
title: "Discord Community"
url: "https://trigger.dev/discord"
---
-1
View File
@@ -17,7 +17,6 @@ description: "What features are currently available in the Developer Preview"
| Alerts | Add alerts in the UI for errors and deploys | ✅ |
| [Scheduled tasks](/v3/tasks-scheduled) | A task that can be triggered on a schedule | ✅ |
| [Zod tasks](/v3/tasks-zod) | Define tasks using Zod schemas | ⏳ |
| [Webhook tasks](/v3/tasks-webhooks) | A task that can be triggered by a webhook | ⏳ |
| Full text search of runs | Find a run by searching the payload and output | ⏳ |
| Logs view with search | All logs view with filtering and full text search | ⏳ |
| Notifications | Send data to your web app from a run | ⏳ |
-6
View File
@@ -1,6 +0,0 @@
---
title: "Frequently Asked Questions"
sidebarTitle: "FAQs"
---
<Snippet file="incomplete-docs.mdx" />
+1 -1
View File
@@ -1,5 +1,5 @@
---
title: "Slack"
title: "Slack support"
---
If you have a paid Trigger.dev account, you can request a private Slack Connect channel.
-6
View File
@@ -1,6 +0,0 @@
---
title: "Uptime status"
url: "https://trigger.openstatus.dev/"
---
View the [current Trigger.dev Cloud system status](https://trigger.openstatus.dev/).
-5
View File
@@ -1,5 +0,0 @@
---
title: "Limits & Performance"
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "Middleware"
description: "This function is called before the `run` function, it allows you to wrap the run function with custom code."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev build"
sidebarTitle: "build"
description: "This command will build your tasks."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev deploy"
sidebarTitle: "deploy"
description: "This command will deploy your tasks."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev dev"
sidebarTitle: "dev"
description: "This command runs your tasks locally."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev init"
sidebarTitle: "init"
description: "This command will setup your v3 project."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev login"
sidebarTitle: "login"
description: "This command will log you in to the CLI. Required to run any other command."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev logout"
sidebarTitle: "logout"
description: "This command will log you out of the CLI."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev update"
sidebarTitle: "update"
description: "This command can be used to update all of your trigger.dev packages to the latest versions."
---
<Snippet file="incomplete-docs.mdx" />
-7
View File
@@ -1,7 +0,0 @@
---
title: "trigger.dev whoami"
sidebarTitle: "whoami"
description: "This command will return information about you, the logged in user."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "Context"
description: "The Context object is part of the `run` function parameter and provides information about the current run."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "cron.dynamic()"
description: "Trigger a task with many different CRON schedules. For example you can use this to let your users select when they want a reminder."
---
<Snippet file="coming-soon.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "cron.task()"
description: "Trigger a task on a recurring schedule using a CRON expression."
---
<Snippet file="coming-soon.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "interval.dynamic()"
description: "Trigger a task with many different interval schedules. For example you can use this to let your users select how often they want a reminder."
---
<Snippet file="coming-soon.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "interval.task()"
description: "Trigger a task on a recurring schedule using the time interval you want between runs."
---
<Snippet file="coming-soon.mdx" />
@@ -1,6 +0,0 @@
---
title: "notification.catalog()"
description: "Create a set of events that can be emitted from your tasks. These can be subscribed to from your application to provide real-time updates to your users."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "notify()"
description: "Send a notification from your tasks. These can be subscribed to from your application to provide real-time updates to your users."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "queue()"
description: "Create queue settings that can be used when triggering a task."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "retry.fetch()"
description: "Inside a task, do a fetch request that will retry (you can specify the retry conditions)."
---
<Snippet file="incomplete-docs.mdx" />
@@ -1,6 +0,0 @@
---
title: "retry.interceptFetch()"
description: "Useful when writing automated tests it will intercept matching HTTP requests and respond with what you provide."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "retry.onThrow()"
description: "Inside a task, retry the wrapped code if it throws an error."
---
<Snippet file="incomplete-docs.mdx" />
@@ -1,6 +0,0 @@
---
title: "task.batchTriggerAndWait()"
description: "Trigger a task many times at once from inside another task, and wait for all the results."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "task.batchTrigger()"
description: "Trigger a task many times at once from your code."
---
<Snippet file="incomplete-docs.mdx" />
@@ -1,6 +0,0 @@
---
title: "task.triggerAndWait()"
description: "Trigger a task from inside another task, and wait for the result."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "task.trigger()"
description: "Trigger a task from your code."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "task()"
description: "The task() function is the simplest way to create a long-running task."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "wait.forEvent()"
description: "Inside a task, wait until a specific event is received before continuing."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "wait.forRequest()"
description: "Inside a task, wait until a specific request is received before continuing."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "wait.for()"
description: "Inside a task, wait for a period of time before continuing."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "wait.until()"
description: "Inside a task, wait until the specified date before continuing."
---
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "zod.catalog()"
description: "Create a set of events with names and payloads that are parsed using Zod schemas."
---
<Snippet file="coming-soon.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "zod.task()"
description: "A task where the payload is parsed using a zod schema."
---
<Snippet file="coming-soon.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "Rollbacks"
description: "You can rollback changes when errors happen, to give transactional guarantees to your operations."
---
<Snippet file="coming-soon.mdx" />
+2 -2
View File
@@ -59,7 +59,7 @@ This is used to identify your task so it can be triggered, managed, and you can
Your custom code inside `run()` will be executed when your task is triggered. Its an async function that has two arguments:
1. The run payload - the data that you pass to the task when you trigger it.
2. An object with `ctx` about the run ([Context](/v3/reference-context)), and any output from the optional `init` function that runs before every run attempt.
2. An object with `ctx` about the run (Context), and any output from the optional `init` function that runs before every run attempt.
Anything you return from the `run` function will be the result of the task. Data you return must be JSON serializable: strings, numbers, booleans, arrays, objects, and null.
@@ -85,7 +85,7 @@ export const taskWithRetries = task({
});
```
For more information read [the retrying guide](/v3/retrying), or see the [SDK reference](/v3/reference-task).
For more information read [the retrying guide](/v3/retrying).
It's also worth mentioning that you can [retry a block of code](/v3/retrying) inside your tasks as well.
+1 -1
View File
@@ -19,7 +19,7 @@ Sometimes OpenAI calls can take a long time to complete, or they can fail. This
This example uses Resend to send a sequence of emails over several days.
Each email is wrapped in [retry.onThrow](/v3/reference-retry-on-throw). This will retry the block of code if an error is thrown. This is useful when you don't want to retry the whole task, but just a part of it. The entire task will use the default retrying, so can also retry.
Each email is wrapped in `retry.onThrow`. This will retry the block of code if an error is thrown. This is useful when you don't want to retry the whole task, but just a part of it. The entire task will use the default retrying, so can also retry.
Additionally this task uses `wait.for` to wait for a certain amount of time before sending the next email. During the waiting time, the task will be paused and will not consume any resources.
-12
View File
@@ -1,12 +0,0 @@
---
title: "Webhook tasks"
description: "A task that is triggered when a webhook is received from an API."
---
## Built-in webhooks triggers
<Snippet file="coming-soon.mdx" />
## How to manually use Trigger.dev with webhooks
<Snippet file="incomplete-docs.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "Zod tasks"
description: "You can use Zod to define a catalog of events and then attach those events to your tasks."
---
<Snippet file="coming-soon.mdx" />
-6
View File
@@ -1,6 +0,0 @@
---
title: "Trigger filters"
description: "You can add filters to your tasks so they're only triggered when certain conditions are met."
---
<Snippet file="coming-soon.mdx" />
+29
View File
@@ -0,0 +1,29 @@
---
title: "Alerts"
description: "Get alerted when runs or deployments fail, or when deployments succeed."
---
<Steps>
<Step title="Create a new alert">
Click on "Alerts" in the left hand side menu, then click on "New alert" to open the new alert modal.
![Email alerts](/images/v3/troubleshooting-alerts-blank.png)
</Step>
<Step title="Choose your alert method">
Choose to be notified by email, Slack notification or webhook whenever:
- a run fails
- a deployment fails
- a deployment succeeds
![Email alerts](/images/v3/troubleshooting-alerts-modal.png)
</Step>
<Step title="Delete or disable alerts">
Click on the triple dot menu on the right side of the table row and select "Disable" or "Delete".
![Disable and delete alerts](/images/v3/troubleshooting-alerts-disable-delete.png)
</Step>
</Steps>
@@ -0,0 +1,6 @@
---
title: "GitHub Discussions"
url: "https://github.com/triggerdotdev/trigger.dev/discussions"
---
Please [join our community on Discord](https://github.com/triggerdotdev/trigger.dev/discussions) to ask questions, share your projects, and get help from other developers.
@@ -0,0 +1,6 @@
---
title: "GitHub Issues"
url: "https://github.com/triggerdotdev/trigger.dev/issues"
---
Please [join our community on Discord](https://github.com/triggerdotdev/trigger.dev/issues) to ask questions, share your projects, and get help from other developers.
@@ -0,0 +1,6 @@
---
title: "Uptime Status"
---
Get email notifications when Trigger.dev creates, updates or resolves a platform incident.
[Subscribe](https://status.trigger.dev/)
-16
View File
@@ -1,16 +0,0 @@
---
title: "Using APIs"
description: "You can use any Node.js library inside the run function, or do HTTP requests."
---
## Using Node.js SDKs
<Snippet file="incomplete-docs.mdx" />
## Using fetch or axios
<Snippet file="incomplete-docs.mdx" />
## Using webhooks
<Snippet file="incomplete-docs.mdx" />
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/airtable
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/airtable",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "Trigger.dev integration for airtable",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -25,8 +25,8 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"airtable": "^0.12.1",
"zod": "3.22.3"
},
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/github
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/github",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "The official GitHub integration for Trigger.dev",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -30,8 +30,8 @@
"@octokit/request-error": "^5.0.1",
"@octokit/webhooks": "^12.0.10",
"octokit": "^3.1.2",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"zod": "3.22.3"
},
"engines": {
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/linear
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/linear",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "Trigger.dev integration for @linear/sdk",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -26,8 +26,8 @@
},
"dependencies": {
"@linear/sdk": "^8.0.0",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"zod": "3.22.3"
},
"engines": {
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/slack
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/openai",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "The official OpenAI integration for Trigger.dev",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -42,8 +42,8 @@
},
"dependencies": {
"openai": "^4.16.1",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31"
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33"
},
"engines": {
"node": ">=18.0.0"
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/plain
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/plain",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "The official Plain.com integration for Trigger.dev",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -24,8 +24,8 @@
"build:tsup": "tsup"
},
"dependencies": {
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"@team-plain/typescript-sdk": "^2.7.0"
},
"engines": {
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/replicate
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/replicate",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "Trigger.dev integration for replicate",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -25,8 +25,8 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"replicate": "^0.18.1",
"zod": "3.22.3"
},
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/resend
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/resend",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "The official Resend.com integration for Trigger.dev",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -24,8 +24,8 @@
"build:tsup": "tsup"
},
"dependencies": {
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"resend": "^2.1.0"
},
"engines": {
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/sendgrid
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/sendgrid",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "Trigger.dev integration for @sendgrid/mail",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -26,8 +26,8 @@
},
"dependencies": {
"@sendgrid/mail": "^7.7.0",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31"
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33"
},
"engines": {
"node": ">=16.8.0"
+14
View File
@@ -1,5 +1,19 @@
# @trigger.dev/shopify
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.33
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/integration-kit@3.0.0-beta.32
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/shopify",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "Trigger.dev integration for @shopify/shopify-api",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -26,8 +26,8 @@
},
"dependencies": {
"@shopify/shopify-api": "^8.0.2",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"@trigger.dev/integration-kit": "workspace:^3.0.0-beta.33",
"zod": "3.22.3"
},
"engines": {
+12
View File
@@ -1,5 +1,17 @@
# @trigger.dev/slack
## 3.0.0-beta.33
### Patch Changes
- @trigger.dev/sdk@3.0.0-beta.33
## 3.0.0-beta.32
### Patch Changes
- @trigger.dev/sdk@3.0.0-beta.32
## 3.0.0-beta.31
### Patch Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@trigger.dev/slack",
"version": "3.0.0-beta.31",
"version": "3.0.0-beta.33",
"description": "The official Slack integration for Trigger.dev",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -25,7 +25,7 @@
},
"dependencies": {
"@slack/web-api": "^6.8.1",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.31",
"@trigger.dev/sdk": "workspace:^3.0.0-beta.33",
"zod": "3.22.3"
},
"engines": {

Some files were not shown because too many files have changed in this diff Show More