61 lines · 2.0 KB · TypeScript
RawDownload
type LatestRunTiming = {  readonly runId: string | null;  readonly startedAt: string | null;  readonly completedAt: string | null;}; type RuntimeActivityState = {  readonly orchestrationStatus: string;  readonly activeRunId?: string | null;}; export function formatDuration(durationMs: number): string {  if (!Number.isFinite(durationMs) || durationMs < 0) return "0ms";  if (durationMs < 1_000) return `${Math.max(1, Math.round(durationMs))}ms`;  if (durationMs < 10_000) {    const tenths = Math.round(durationMs / 100) / 10;    return tenths >= 10 ? "10s" : `${tenths.toFixed(1)}s`;  }  if (durationMs < 60_000) return `${Math.round(durationMs / 1_000)}s`;  const totalSeconds = Math.round(durationMs / 1_000);  const hours = Math.floor(totalSeconds / 3_600);  const minutes = Math.floor((totalSeconds % 3_600) / 60);  const seconds = totalSeconds % 60;  const parts: string[] = [];  if (hours > 0) parts.push(`${hours}h`);  if (minutes > 0) parts.push(`${minutes}m`);  if (seconds > 0) parts.push(`${seconds}s`);  return parts.join(" ");} export function formatElapsed(startIso: string, endIso: string | undefined): string | null {  if (!endIso) return null;  const startedAt = Date.parse(startIso);  const endedAt = Date.parse(endIso);  if (Number.isNaN(startedAt) || Number.isNaN(endedAt) || endedAt < startedAt) {    return null;  }  return formatDuration(endedAt - startedAt);} export function isLatestRunSettled(  latestRun: LatestRunTiming | null,  runtime: RuntimeActivityState | null,): boolean {  if (!latestRun?.startedAt) return false;  if (!latestRun.completedAt) return false;  if (!runtime) return true;  if (runtime.orchestrationStatus === "running") return false;  return true;} export function deriveActiveWorkStartedAt(  latestRun: LatestRunTiming | null,  runtime: RuntimeActivityState | null,  sendStartedAt: string | null,): string | null {  if (!isLatestRunSettled(latestRun, runtime)) {    return latestRun?.startedAt ?? sendStartedAt;  }  return sendStartedAt;}