import type { SemanticTone } from "../../ui/status-dot.js"; import type { RailSession } from "./session-list-entry.js"; /** * Everything the sidebar hover says about one session, derived only from the * compact list row. Every field is null (or empty) when the row has nothing * true to say, so the card never shows an empty label or a zero count. */ export type SessionHoverFacts = { status: { label: string; tone: SemanticTone; live: boolean; }; /** Short lines that explain the status: how long it has waited, when it checks next, who paused it. */ context: string[]; /** The agent's own waiting reason or the pause reason, verbatim. */ reason: string | null; origin: { kind: "schedule" | "site"; label: string; } | null; model: { id: string; effort: string | null; } | null; subAgents: { total: string; parts: { label: string; tone: "attention" | "danger" | null; }[]; } | null; commands: string | null; }; /** How long since `iso`, as a duration that keeps reading as one: "<1 min", "24 min", "3 hours", "2 days". */ export declare function formatWaitDuration(iso: string, now: number): string | null; /** "Next check at 14:30", "Next check tomorrow, 09:00", or "Next check due now". */ export declare function nextCheckLabel(deadlineAt: string, now: number): string | null; export declare function sessionHoverFacts(session: RailSession, { descendantCount, descendantCountTruncated, now, }: { descendantCount: number; descendantCountTruncated: boolean; now?: number | undefined; }): SessionHoverFacts; /** * The hover's facts as one plain sentence list, for the row's accessible * description. The row's name already carries its title, state and creator, so * this adds only what the card adds, in the same order. */ export declare function sessionHoverDescription(facts: SessionHoverFacts): string;