From 3aa3c31ed8b6591d035f545cd42efe800915a59b Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Fri, 22 May 2026 13:32:45 +0100 Subject: [PATCH] fix(supervisor): compat shim for COMPUTE checkpoint type --- .../supervisor-checkpoint-type-compat.md | 6 ++++++ apps/supervisor/src/workloadServer/index.ts | 20 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 .server-changes/supervisor-checkpoint-type-compat.md diff --git a/.server-changes/supervisor-checkpoint-type-compat.md b/.server-changes/supervisor-checkpoint-type-compat.md new file mode 100644 index 00000000000..dd26a3e6b04 --- /dev/null +++ b/.server-changes/supervisor-checkpoint-type-compat.md @@ -0,0 +1,6 @@ +--- +area: supervisor +type: fix +--- + +Keep older workloads working when checkpoints are produced by the compute path diff --git a/apps/supervisor/src/workloadServer/index.ts b/apps/supervisor/src/workloadServer/index.ts index bd38cc8700f..66b48de017c 100644 --- a/apps/supervisor/src/workloadServer/index.ts +++ b/apps/supervisor/src/workloadServer/index.ts @@ -43,6 +43,18 @@ const WorkloadActionParams = z.object({ snapshotFriendlyId: z.string(), }); +// Workloads bundled into customer task images before CLI v4.4.4 use a strict +// zod enum for checkpoint type that only allows DOCKER and KUBERNETES. The +// workload never reads this field - it only validates the response shape - so +// rewriting it to a known value keeps older runners working without affecting +// the value stored in the database or seen by internal services. +function legacifyCheckpointType(item: T): T { + if (item.checkpoint?.type === "COMPUTE") { + return { ...item, checkpoint: { ...item.checkpoint, type: "KUBERNETES" } } as T; + } + return item; +} + type WorkloadServerEvents = { runConnected: [ { @@ -384,7 +396,9 @@ export class WorkloadServer extends EventEmitter { return; } - reply.json(sinceSnapshotResponse.data satisfies WorkloadRunSnapshotsSinceResponseBody); + reply.json({ + snapshots: sinceSnapshotResponse.data.snapshots.map(legacifyCheckpointType), + } satisfies WorkloadRunSnapshotsSinceResponseBody); }, } ) @@ -409,7 +423,9 @@ export class WorkloadServer extends EventEmitter { return; } - reply.json(dequeueResponse.data satisfies WorkloadDequeueFromVersionResponseBody); + reply.json( + dequeueResponse.data.map(legacifyCheckpointType) satisfies WorkloadDequeueFromVersionResponseBody + ); }, });