Files
Codewalkers/apps/server/trpc/routers/dispatch.ts
Lukas May d81e0864f7 feat: Add retry mechanism for blocked tasks
Blocked tasks (from spawn failures) were a dead-end with no way to
recover. Add retryBlockedTask to DispatchManager that resets status
to pending and re-queues, a tRPC mutation that also kicks dispatchNext,
and a Retry button in the task slide-over when status is blocked.
2026-03-05 20:41:49 +01:00

50 lines
1.6 KiB
TypeScript

/**
* Dispatch Router — queue, dispatchNext, getQueueState, completeTask
*/
import { z } from 'zod';
import type { ProcedureBuilder } from '../trpc.js';
import { requireDispatchManager } from './_helpers.js';
export function dispatchProcedures(publicProcedure: ProcedureBuilder) {
return {
queueTask: publicProcedure
.input(z.object({ taskId: z.string().min(1) }))
.mutation(async ({ ctx, input }) => {
const dispatchManager = requireDispatchManager(ctx);
await dispatchManager.queue(input.taskId);
return { success: true };
}),
dispatchNext: publicProcedure
.mutation(async ({ ctx }) => {
const dispatchManager = requireDispatchManager(ctx);
return dispatchManager.dispatchNext();
}),
getQueueState: publicProcedure
.query(async ({ ctx }) => {
const dispatchManager = requireDispatchManager(ctx);
return dispatchManager.getQueueState();
}),
completeTask: publicProcedure
.input(z.object({ taskId: z.string().min(1) }))
.mutation(async ({ ctx, input }) => {
const dispatchManager = requireDispatchManager(ctx);
await dispatchManager.completeTask(input.taskId);
return { success: true };
}),
retryBlockedTask: publicProcedure
.input(z.object({ taskId: z.string().min(1) }))
.mutation(async ({ ctx, input }) => {
const dispatchManager = requireDispatchManager(ctx);
await dispatchManager.retryBlockedTask(input.taskId);
// Kick dispatch loop to pick up the re-queued task
await dispatchManager.dispatchNext();
return { success: true };
}),
};
}