/** * headlines.ts, per-node headlines + the stall tell for the fleet read-model. * * OWNER'S LINE (the contract this module enforces): a headline that updates * when an agent moves to a new task is fine; a headline that constantly * streams new text is not. So: * * - A node's headline is DERIVED from its task/phase identity only, never * from tool chatter, output lines, or an agent's per-turn progress text. * Same identity ⇒ the byte-identical headline object (same `updatedAt`), * replaced in place on a transition. There is no API through which a * caller can push arbitrary headline text, so no surface can turn the * field into a feed. * - The length cap is enforced HERE, at the read-model, not per surface. * * The stall tell is pure timestamp comparison: a live node whose last * observed activity is older than the threshold gains a quiet marker * (`since`, `quietForMs`), no generated text, ever. */ import type { ProcessHeadline, ProcessNode, ProcessStallTell } from './types.js'; /** Read-model cap on headline text, enforced here so every surface inherits it. */ export declare const HEADLINE_MAX_CHARS = 80; /** Default stall-tell threshold: a live node quiet this long gains the marker. */ export declare const DEFAULT_STALL_TELL_MS: number; /** * The task/phase identity a node's headline derives from, the ONLY input * that can change a headline. Agent nodes deliberately exclude their `phase` * activity (the orchestrator's per-turn `Turn N · Tool` progress line churns * every tool call, a feed, not a transition); orchestration/workflow nodes * include their phase activity text because it changes exactly at phase * transitions. */ export declare function headlineSource(node: ProcessNode): string | null; /** * Registry-owned headline side-table. `derive` returns the EXISTING headline * object (byte-stable, same `updatedAt`) while the node's task/phase identity * is unchanged, and regenerates, replacing in place, only on a transition. */ export declare class HeadlineTable { private readonly entries; derive(node: ProcessNode, now: number): ProcessHeadline | undefined; /** Drop entries for nodes no longer present so the table cannot leak. */ prune(liveNodeIds: ReadonlySet): void; } /** * Pure timestamp comparison: a live node whose last observed activity * (`currentActivity.at`, falling back to `startedAt`) is at least * `thresholdMs` old gains the quiet marker. No text is generated, surfaces * render the marker however they like. */ export declare function deriveStallTell(node: ProcessNode, now: number, thresholdMs: number): ProcessStallTell | undefined; //# sourceMappingURL=headlines.d.ts.map