Skip to content
Source
Sign inSign up
Open History to see the last commit

AgentElapsed.tsx

50 lines1.7 KB

1import type { RuntimeSubagent } from "@t3tools/client-runtime/state/subagentRuntime";
2import { isOrchestrationV2WorkActive } from "@t3tools/contracts";
3import { deriveSubagentElapsedMs } from "@t3tools/shared/orchestrationTiming";
4import { tickTextContent } from "~/lib/tickTextContent";
5​
6function formatElapsedSeconds(totalSeconds: number): string {
7 const seconds = Math.max(0, Math.floor(totalSeconds));
8 const minutes = Math.floor(seconds / 60);
9 if (minutes === 0) {
10 return `${seconds}s`;
11 }
12 const hours = Math.floor(minutes / 60);
13 if (hours === 0) {
14 return `${minutes}m ${String(seconds % 60).padStart(2, "0")}s`;
15 }
16 return `${hours}h ${String(minutes % 60).padStart(2, "0")}m`;
18​
19function formatCompactElapsedSeconds(totalSeconds: number): string {
20 const seconds = Math.max(0, Math.floor(totalSeconds));
21 if (seconds < 60) return `${seconds}s`;
22 const minutes = Math.floor(seconds / 60);
23 if (minutes < 60) return `${minutes}m`;
24 if (minutes >= 600) return `${Math.floor(minutes / 60)}h`;
25 return `${Math.floor(minutes / 6) / 10}h`;
27​
28export function AgentElapsed({
29 agent,
30 compact = false,
31}: {
32 agent: Pick<RuntimeSubagent, "status" | "startedAt" | "completedAt">;
33 compact?: boolean;
34}) {
35 const format = compact ? formatCompactElapsedSeconds : formatElapsedSeconds;
36 const live = isOrchestrationV2WorkActive(agent.status);
37 const { status, startedAt, completedAt } = agent;
38 if (deriveSubagentElapsedMs(agent, 0) === null) {
39 return null;
40 }
41 return (
42 <span
43 ref={tickTextContent((nowMs) => {
44 const elapsedMs = deriveSubagentElapsedMs({ status, startedAt, completedAt }, nowMs);
45 return elapsedMs === null ? "" : format(elapsedMs / 1000);
46 }, live)}
47 className="tabular-nums"
48 />
49 );