Skip to content

Commit 514e174

Browse files
committed
Using the new PENDING_VERSION status now in the UI
1 parent 825c5d0 commit 514e174

File tree

15 files changed

+128
-24
lines changed

15 files changed

+128
-24
lines changed

apps/webapp/app/components/runs/v3/TaskRunStatus.tsx

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { type TaskRunStatus } from "@trigger.dev/database";
1515
import assertNever from "assert-never";
1616
import { HourglassIcon } from "lucide-react";
1717
import { TimedOutIcon } from "~/assets/icons/TimedOutIcon";
18+
import { Callout } from "~/components/primitives/Callout";
1819
import { Spinner } from "~/components/primitives/Spinner";
1920
import { cn } from "~/utils/cn";
2021

@@ -57,10 +58,8 @@ export const filterableTaskRunStatuses = [
5758
const taskRunStatusDescriptions: Record<TaskRunStatus, string> = {
5859
DELAYED: "Task has been delayed and is waiting to be executed.",
5960
PENDING: "Task is waiting to be executed.",
60-
PENDING_VERSION:
61-
"Task is waiting for a version update because it cannot execute without additional information (task, queue, etc.).",
62-
WAITING_FOR_DEPLOY:
63-
"Task is waiting for a version update because it cannot execute without additional information (task, queue, etc.).",
61+
PENDING_VERSION: "Run cannot execute until a version includes the task and queue.",
62+
WAITING_FOR_DEPLOY: "Run cannot execute until a version includes the task and queue.",
6463
EXECUTING: "Task is currently being executed.",
6564
RETRYING_AFTER_FAILURE: "Task is being reattempted after a failure.",
6665
WAITING_TO_RESUME: `You have used a "wait" function. When the wait is complete, the task will resume execution.`,
@@ -94,21 +93,61 @@ export function descriptionForTaskRunStatus(status: TaskRunStatus): string {
9493

9594
export function TaskRunStatusCombo({
9695
status,
96+
statusReason,
9797
className,
9898
iconClassName,
9999
}: {
100100
status: TaskRunStatus;
101+
statusReason?: string;
101102
className?: string;
102103
iconClassName?: string;
103104
}) {
104105
return (
105106
<span className={cn("flex items-center gap-1", className)}>
106107
<TaskRunStatusIcon status={status} className={cn("h-4 w-4", iconClassName)} />
107108
<TaskRunStatusLabel status={status} />
109+
<TaskRunStatusReason status={status} statusReason={statusReason} />
108110
</span>
109111
);
110112
}
111113

114+
const statusReasonsToDescription: Record<string, string> = {
115+
NO_DEPLOYMENT: "No deployment or deployment image reference found for deployed run",
116+
NO_WORKER: "No worker found for run",
117+
TASK_NEVER_REGISTERED: "Task never registered",
118+
QUEUE_NOT_FOUND: "Queue not found",
119+
TASK_NOT_IN_LATEST: "Task not in latest version",
120+
BACKGROUND_WORKER_MISMATCH: "Background worker mismatch",
121+
};
122+
123+
function TaskRunStatusReason({
124+
status,
125+
statusReason,
126+
}: {
127+
status: TaskRunStatus;
128+
statusReason?: string;
129+
}) {
130+
if (status !== "PENDING_VERSION") {
131+
return null;
132+
}
133+
134+
if (!statusReason) {
135+
return null;
136+
}
137+
138+
const description = statusReasonsToDescription[statusReason];
139+
140+
if (!description) {
141+
return null;
142+
}
143+
144+
return (
145+
<Callout to="https://trigger.dev/docs" variant="warning" className="w-fit text-sm">
146+
{description}
147+
</Callout>
148+
);
149+
}
150+
112151
export function TaskRunStatusLabel({ status }: { status: TaskRunStatus }) {
113152
return <span className={runStatusClassNameColor(status)}>{runStatusTitle(status)}</span>;
114153
}

apps/webapp/app/components/runs/v3/TaskRunsTable.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,9 @@ export function TaskRunsTable({
330330
<TableCell to={path} className="w-[1%]" actionClassName="pr-0 tabular-nums">
331331
<div className="flex items-center gap-1">
332332
<RectangleStackIcon className="size-4 text-text-dimmed" />
333-
{run.startedAt ? (
333+
{run.isPending ? (
334+
"–"
335+
) : run.startedAt ? (
334336
formatDuration(new Date(run.createdAt), new Date(run.startedAt), {
335337
style: "short",
336338
})

apps/webapp/app/presenters/v3/QueueListPresenter.server.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export class QueueListPresenter extends BasePresenter {
5656
const queues = await this._replica.taskQueue.findMany({
5757
where: {
5858
runtimeEnvironmentId: environment.id,
59+
version: "V2",
5960
},
6061
select: {
6162
friendlyId: true,

apps/webapp/app/presenters/v3/RunListPresenter.server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Prisma, type TaskRunStatus } from "@trigger.dev/database";
22
import parse from "parse-duration";
33
import { sqlDatabaseSchema } from "~/db.server";
44
import { displayableEnvironment } from "~/models/runtimeEnvironment.server";
5-
import { isCancellableRunStatus, isFinalRunStatus } from "~/v3/taskStatus";
5+
import { isCancellableRunStatus, isFinalRunStatus, isPendingRunStatus } from "~/v3/taskStatus";
66
import { BasePresenter } from "./basePresenter.server";
77
import { getAllTaskIdentifiers } from "~/models/task.server";
88
import { type Direction } from "~/components/ListPagination";
@@ -367,6 +367,7 @@ WHERE
367367
spanId: run.spanId,
368368
isReplayable: true,
369369
isCancellable: isCancellableRunStatus(run.status),
370+
isPending: isPendingRunStatus(run.status),
370371
environment: displayableEnvironment(environment, userId),
371372
idempotencyKey: run.idempotencyKey ? run.idempotencyKey : undefined,
372373
ttl: run.ttl ? run.ttl : undefined,

apps/webapp/app/presenters/v3/SpanPresenter.server.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,29 @@
11
import {
22
isWaitpointOutputTimeout,
33
MachinePresetName,
4-
parsePacket,
54
prettyPrintPacket,
6-
SemanticInternalAttributes,
75
TaskRunError,
86
} from "@trigger.dev/core/v3";
7+
import { getMaxDuration } from "@trigger.dev/core/v3/isomorphic";
98
import { RUNNING_STATUSES } from "~/components/runs/v3/TaskRunStatus";
9+
import { logger } from "~/services/logger.server";
1010
import { eventRepository } from "~/v3/eventRepository.server";
1111
import { machinePresetFromName } from "~/v3/machinePresets.server";
12-
import { FINAL_ATTEMPT_STATUSES, isFailedRunStatus, isFinalRunStatus } from "~/v3/taskStatus";
13-
import { BasePresenter } from "./basePresenter.server";
14-
import { getMaxDuration } from "@trigger.dev/core/v3/isomorphic";
15-
import { logger } from "~/services/logger.server";
1612
import { getTaskEventStoreTableForRun, TaskEventStoreTable } from "~/v3/taskEventStore.server";
17-
import { Pi } from "lucide-react";
13+
import { isFailedRunStatus, isFinalRunStatus } from "~/v3/taskStatus";
14+
import { BasePresenter } from "./basePresenter.server";
1815

1916
type Result = Awaited<ReturnType<SpanPresenter["call"]>>;
2017
export type Span = NonNullable<NonNullable<Result>["span"]>;
2118
export type SpanRun = NonNullable<NonNullable<Result>["run"]>;
2219

2320
export class SpanPresenter extends BasePresenter {
2421
public async call({
25-
userId,
2622
projectSlug,
27-
organizationSlug,
2823
spanId,
2924
runFriendlyId,
3025
}: {
31-
userId: string;
3226
projectSlug: string;
33-
organizationSlug: string;
3427
spanId: string;
3528
runFriendlyId: string;
3629
}) {
@@ -156,6 +149,7 @@ export class SpanPresenter extends BasePresenter {
156149
outputType: true,
157150
//status + duration
158151
status: true,
152+
statusReason: true,
159153
startedAt: true,
160154
executedAt: true,
161155
createdAt: true,
@@ -319,6 +313,7 @@ export class SpanPresenter extends BasePresenter {
319313
id: run.id,
320314
friendlyId: run.friendlyId,
321315
status: run.status,
316+
statusReason: run.statusReason ?? undefined,
322317
createdAt: run.createdAt,
323318
startedAt: run.startedAt,
324319
executedAt: run.executedAt,

apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,13 @@ import {
7575
import { useEnvironment } from "~/hooks/useEnvironment";
7676

7777
export const loader = async ({ request, params }: LoaderFunctionArgs) => {
78-
const userId = await requireUserId(request);
7978
const { projectParam, organizationSlug, envParam, runParam, spanParam } =
8079
v3SpanParamsSchema.parse(params);
8180

8281
const presenter = new SpanPresenter();
8382

8483
try {
8584
const result = await presenter.call({
86-
userId,
87-
organizationSlug,
8885
projectSlug: projectParam,
8986
spanId: spanParam,
9087
runFriendlyId: runParam,
@@ -405,7 +402,7 @@ function RunBody({
405402
<Property.Item>
406403
<Property.Label>Status</Property.Label>
407404
<Property.Value>
408-
<TaskRunStatusCombo status={run.status} />
405+
<TaskRunStatusCombo status={run.status} statusReason={run.statusReason} />
409406
</Property.Value>
410407
</Property.Item>
411408
<Property.Item>
@@ -716,7 +713,11 @@ function RunBody({
716713
) : (
717714
<div className="flex flex-col gap-4 pt-3">
718715
<div className="border-b border-grid-bright pb-3">
719-
<TaskRunStatusCombo status={run.status} className="text-sm" />
716+
<TaskRunStatusCombo
717+
status={run.status}
718+
statusReason={run.statusReason}
719+
className="text-sm"
720+
/>
720721
</div>
721722
<RunTimeline run={run} />
722723

apps/webapp/app/v3/services/createBackgroundWorker.server.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ async function createWorkerQueue(
393393
},
394394
data: {
395395
workers: { connect: { id: worker.id } },
396+
version: "V2",
396397
},
397398
});
398399
}

apps/webapp/app/v3/taskStatus.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ export const NON_FINAL_RUN_STATUSES = [
2626

2727
export type NON_FINAL_RUN_STATUSES = (typeof NON_FINAL_RUN_STATUSES)[number];
2828

29+
export const PENDING_STATUSES = [
30+
"PENDING",
31+
"PENDING_VERSION",
32+
"WAITING_FOR_DEPLOY",
33+
] satisfies TaskRunStatus[];
34+
35+
export type PENDING_STATUSES = (typeof PENDING_STATUSES)[number];
36+
2937
export const FINAL_ATTEMPT_STATUSES = [
3038
"FAILED",
3139
"CANCELED",
@@ -92,6 +100,10 @@ export function isCancellableAttemptStatus(status: TaskRunAttemptStatus): boolea
92100
return CANCELLABLE_ATTEMPT_STATUSES.includes(status);
93101
}
94102

103+
export function isPendingRunStatus(status: TaskRunStatus): boolean {
104+
return PENDING_STATUSES.includes(status);
105+
}
106+
95107
export function isCrashableRunStatus(status: TaskRunStatus): boolean {
96108
return CRASHABLE_RUN_STATUSES.includes(status);
97109
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- AlterTable
2+
ALTER TABLE
3+
"TaskRun"
4+
ADD
5+
COLUMN "statusReason" TEXT;

internal-packages/database/prisma/schema.prisma

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1707,7 +1707,8 @@ model TaskRun {
17071707
17081708
engine RunEngineVersion @default(V1)
17091709
1710-
status TaskRunStatus @default(PENDING)
1710+
status TaskRunStatus @default(PENDING)
1711+
statusReason String?
17111712
17121713
idempotencyKey String?
17131714
idempotencyKeyExpiresAt DateTime?

internal-packages/run-engine/src/engine/systems/dequeueSystem.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ export class DequeueSystem {
199199
orgId,
200200
runId,
201201
reason: result.message,
202+
statusReason: result.code,
202203
tx: prisma,
203204
});
204205
return null;
@@ -237,6 +238,7 @@ export class DequeueSystem {
237238
orgId,
238239
runId,
239240
reason: "No deployment or deployment image reference found for deployed run",
241+
statusReason: "NO_DEPLOYMENT",
240242
tx: prisma,
241243
});
242244

@@ -517,10 +519,12 @@ export class DequeueSystem {
517519
workerId,
518520
runnerId,
519521
reason,
522+
statusReason,
520523
tx,
521524
}: {
522525
orgId: string;
523526
runId: string;
527+
statusReason: string;
524528
workerId?: string;
525529
runnerId?: string;
526530
reason?: string;
@@ -538,6 +542,7 @@ export class DequeueSystem {
538542
where: { id: runId },
539543
data: {
540544
status: "PENDING_VERSION",
545+
statusReason,
541546
},
542547
select: {
543548
id: true,

packages/cli-v3/src/entryPoints/dev-run-worker.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,9 @@ const zodIpc = new ZodIpcConnection({
256256
},
257257
async () => {
258258
const beforeImport = performance.now();
259+
resourceCatalog.setCurrentFileContext(taskManifest.entryPoint, taskManifest.filePath);
259260
await import(normalizeImportPath(taskManifest.entryPoint));
261+
resourceCatalog.clearCurrentFileContext();
260262
const durationMs = performance.now() - beforeImport;
261263

262264
log(

packages/cli-v3/src/entryPoints/managed-run-worker.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,9 @@ const zodIpc = new ZodIpcConnection({
266266
},
267267
async () => {
268268
const beforeImport = performance.now();
269+
resourceCatalog.setCurrentFileContext(taskManifest.entryPoint, taskManifest.filePath);
269270
await import(normalizeImportPath(taskManifest.entryPoint));
271+
resourceCatalog.clearCurrentFileContext();
270272
const durationMs = performance.now() - beforeImport;
271273

272274
console.log(
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { logger, queue, queues, task, tasks } from "@trigger.dev/sdk/v3";
2+
3+
export const pendingVersionsQueue = queue({
4+
name: "pending-version-queue",
5+
concurrencyLimit: 1,
6+
});
7+
8+
export const pendingVersionsTester = task({
9+
id: "pending-versions-tester",
10+
run: async (payload: any, { ctx }) => {
11+
logger.log("Pending versions tester", { payload });
12+
13+
await tasks.trigger("pending-versions-tester-2", {
14+
payload: {
15+
message: "Hello, world!",
16+
},
17+
});
18+
19+
await tasks.trigger(
20+
"pending-versions-tester-3",
21+
{
22+
message: "Hello, world!",
23+
},
24+
{
25+
queue: "pending-version-queue-2",
26+
}
27+
);
28+
},
29+
});
30+
31+
export const pendingVersionsTester3 = task({
32+
id: "pending-versions-tester-3",
33+
queue: pendingVersionsQueue,
34+
run: async (payload: any, { ctx }) => {
35+
logger.log("Pending versions tester 3", { payload });
36+
},
37+
});

references/hello-world/src/trigger/queues.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const queuesTester = task({
1010
}
1111

1212
const retrievedFromId = await queues.retrieve(ctx.queue.id);
13-
logger.log("Retrieved from IDs", { retrievedFromId });
13+
logger.log("Retrieved from ID", { retrievedFromId });
1414

1515
const retrievedFromCtxName = await queues.retrieve({
1616
type: "task",

0 commit comments

Comments
 (0)