← Files NGS Analysis WorkbenchARCHIVED FILE

src/runStatus.ts

1.62 KB · Sep 30, 2026 · 23:20 UTC

↓ Download file

export const ACTIVE_RUN_STATUSES = [
  "starting",
  "running",
  "cancel_requested",
  "canceling",
] as const;

export const TERMINAL_RUN_STATUSES = [
  "completed",
  "failed",
  "canceled",
  "orphaned",
] as const;

export function latestActiveRunFilters(): {
  statuses: string[];
  limit: 1;
} {
  return {
    statuses: [...ACTIVE_RUN_STATUSES],
    limit: 1,
  };
}

export function isActiveRunStatus(status: string | undefined): boolean {
  return Boolean(
    status && ACTIVE_RUN_STATUSES.some((candidate) => candidate === status),
  );
}

export function isTerminalRunStatus(status: string): boolean {
  return TERMINAL_RUN_STATUSES.some((candidate) => candidate === status);
}

export type RunStatusTone =
  | "danger"
  | "info"
  | "neutral"
  | "success"
  | "warning";

export interface RunStatusPresentation {
  label: string;
  status: string;
  tone: RunStatusTone;
}

export function runStatusPresentation(status: string): RunStatusPresentation {
  return {
    label: humanizeRunStatus(status),
    status,
    tone: runStatusTone(status),
  };
}

function runStatusTone(status: string): RunStatusTone {
  if (status === "completed" || status === "already_finished") return "success";
  if (status === "failed") return "danger";
  if (
    status === "blocked" ||
    status === "canceling" ||
    status === "cancel_requested" ||
    status === "orphaned"
  )
    return "warning";
  if (status === "canceled" || status === "finished_unverified")
    return "neutral";
  return "info";
}

function humanizeRunStatus(value: string) {
  return value
    .replaceAll("_", " ")
    .replace(/^\w/, (character) => character.toUpperCase());
}

SHA-256: a7e7345b0e3ce4629c0e34f182b5600b0069098c1c0a55c75886ec1f1e97ccc6