import { eg, type TypeFromCodec } from "@cloudflare/util-en-garde"; import { CommitSha, ProjectId, RunId, UnixTimestampMs } from "@/contracts/common"; import { AcceptedRunSnapshot } from "./project-run"; import { ProjectRunStatus, ProjectRunTerminalStatus } from "./primitives"; const NullableTimestamp = eg.union([UnixTimestampMs, eg.null]); export const ClaimRunWorkInput = eg.exactStrict( eg.object({ projectId: ProjectId, runId: RunId, }), ); export type ClaimRunWorkInput = TypeFromCodec; export const ClaimRunWorkStaleReason = eg.union([ eg.literal("run_missing"), eg.literal("run_active"), eg.literal("canceled"), eg.literal("superseded"), eg.literal("already_terminal"), eg.literal("not_currently_executable"), ]); export type ClaimRunWorkStaleReason = TypeFromCodec; const ExecuteRunWork = eg.exactStrict( eg.object({ kind: eg.literal("execute"), snapshot: AcceptedRunSnapshot, }), ); const StaleRunWork = eg.exactStrict( eg.object({ kind: eg.literal("stale"), reason: ClaimRunWorkStaleReason, }), ); export const ClaimRunWorkResult = eg.union([ExecuteRunWork, StaleRunWork]); export type ClaimRunWorkResult = TypeFromCodec; export type ExecuteRunWork = Extract; export const RunControlState = eg.exactStrict( eg.object({ runId: RunId, status: ProjectRunStatus, cancelRequestedAt: NullableTimestamp, }), ); export type RunControlState = TypeFromCodec; export const RequestRunCancelInput = eg.exactStrict( eg.object({ projectId: ProjectId, runId: RunId, }), ); export type RequestRunCancelInput = TypeFromCodec; export const RequestRunCancelResult = RunControlState; export type RequestRunCancelResult = TypeFromCodec; export const RunHeartbeatInput = eg.exactStrict( eg.object({ projectId: ProjectId, runId: RunId, }), ); export type RunHeartbeatInput = TypeFromCodec; export const RunHeartbeatResult = eg.union([RunControlState, eg.null]); export type RunHeartbeatResult = TypeFromCodec; export const RecoverWorkflowDispatchFailureInput = eg.exactStrict( eg.object({ projectId: ProjectId, runId: RunId, errorMessage: eg.string, }), ); export type RecoverWorkflowDispatchFailureInput = TypeFromCodec; const RecoverWorkflowDispatchFailureRearmedResult = eg.exactStrict( eg.object({ kind: eg.literal("rearmed"), }), ); const RecoverWorkflowDispatchFailureAlreadyActiveResult = eg.exactStrict( eg.object({ kind: eg.literal("already_active"), }), ); const RecoverWorkflowDispatchFailureTerminalResult = eg.exactStrict( eg.object({ kind: eg.literal("terminal"), }), ); const RecoverWorkflowDispatchFailureStaleResult = eg.exactStrict( eg.object({ kind: eg.literal("stale"), }), ); export const RecoverWorkflowDispatchFailureResult = eg.union([ RecoverWorkflowDispatchFailureRearmedResult, RecoverWorkflowDispatchFailureAlreadyActiveResult, RecoverWorkflowDispatchFailureTerminalResult, RecoverWorkflowDispatchFailureStaleResult, ]); export type RecoverWorkflowDispatchFailureResult = TypeFromCodec; export const FinalizeRunExecutionInput = eg.exactStrict( eg.object({ projectId: ProjectId, runId: RunId, terminalStatus: ProjectRunTerminalStatus, lastError: eg.union([eg.string, eg.null]), sandboxDestroyed: eg.boolean, }), ); export type FinalizeRunExecutionInput = TypeFromCodec; export const FinalizeRunExecutionResult = eg.exactStrict( eg.object({ snapshot: AcceptedRunSnapshot, }), ); export type FinalizeRunExecutionResult = TypeFromCodec; export const RecordRunResolvedCommitInput = eg.exactStrict( eg.object({ projectId: ProjectId, runId: RunId, commitSha: CommitSha, }), ); export type RecordRunResolvedCommitInput = TypeFromCodec; const RecordRunResolvedCommitAppliedResult = eg.exactStrict( eg.object({ kind: eg.literal("applied"), }), ); const RecordRunResolvedCommitStaleResult = eg.exactStrict( eg.object({ kind: eg.literal("stale"), status: eg.union([ProjectRunStatus, eg.null]), }), ); export const RecordRunResolvedCommitResult = eg.union([ RecordRunResolvedCommitAppliedResult, RecordRunResolvedCommitStaleResult, ]); export type RecordRunResolvedCommitResult = TypeFromCodec;