/**
 * Live elapsed time since an ISO 8601 timestamp, re-rendering once per second.
 *
 * The shape behind every "how long has this been going" affordance in the
 * thread: an approval gate waiting on a human, a sub-agent card whose nested
 * activity cannot be streamed (the Cursor SDK returns sub-agent internals only
 * at completion), a long-running tool. A ticking duration is the honest signal
 * that work is progressing when there is nothing else to show — as opposed to
 * fabricating intermediate state.
 *
 * Returns elapsed milliseconds (clamped to >= 0 against client/server clock
 * skew), or `null` when the timestamp is absent or unparseable — callers
 * render nothing rather than a bogus "0s". The interval is scoped to the
 * component instance and torn down on unmount, so a thread full of settled
 * cards costs zero timers.
 *
 * @param startedAt ISO 8601 timestamp the clock counts from (e.g.
 *   `ToolCall.approval_requested_at`, `SubAgentExecution.started_at`).
 */
export declare function useElapsedSince(startedAt: string): number | null;
/**
 * Format an elapsed duration for the live tickers driven by
 * {@link useElapsedSince}: `just now`, `42s`, `3m 12s`, `1h 5m`.
 *
 * Second-granularity (unlike ToolCallDetail's `formatDuration`, which keeps
 * millisecond precision for completed calls) because a live counter that
 * flickers sub-second digits reads as noise, not progress.
 */
export declare function formatElapsed(ms: number): string;
//# sourceMappingURL=useElapsedSince.d.ts.map