import type { AttachSession } from '../session/context.js'; /** The slice of the session the roster reads. */ export type RosterSession = Pick; export interface RosterHooks { /** Live per-node human-ticket counts — read fresh on every rebuild, since the * viewer's attention poll reassigns the map behind us. */ asks: () => Record; /** Transient footer notice (errors, "already fired", swap failures). */ setNotice: (msg: string) => void; /** Ask the viewer to re-run the full chrome refresh. Detail popups call this * on close so a wait row that resolved while the popup was open disappears. */ requestChromeRefresh: () => void; /** Open the viewer-owned Inspector popup (`surface inspect`) on a section — * the cron wait row routes to `schedule`; the native Inspector owns details. */ openInspector: (section: 'overview' | 'schedule') => void; } export interface AttachRoster { /** Rebuild the rows from the canvas source, reconcile the selection, repaint. */ refresh(): Promise; /** Roster key routing, called BEFORE the editor sees the key. Returns true * when the roster consumed it (the editor must not see it). */ handleKey(data: string): boolean; /** Report real tmux-pane focus (DECSET 1004). Repaints the editor cursor. */ setPaneFocused(focused: boolean): void; } export declare function createRoster(s: RosterSession, hooks: RosterHooks): AttachRoster;