import type { ObservedConversationEntry } from '../storage/schema/observed-conversation.store.js'; /** Noun in the HELD outcome: message send / ask → "message"; file send → "file". */ export type HeldNoun = 'message' | 'file'; /** Soft per-row budget for HELD delta lines (shared spirit with cursor view). */ export declare const HELD_MAX_MESSAGE_CHARS = 2000; /** * Readable sender for HELD delta and cursor-view journal rows. * Storage may keep synthetic bot ids (e.g. actorless shortcut); agents must not * read the raw placeholder as a teammate name. */ export declare function observedSenderLabel(entry: Pick): string; /** * Exact-count truncation marker (EN). Shared by HELD delta and wake-time cursor view. * PRD: `(+{N} earlier messages not shown)` */ export declare function exactEarlierMessagesMarker(count: number): string; /** Unknown-count truncation marker (EN). PRD: `(earlier messages not shown)` */ export declare function unknownEarlierMessagesMarker(): string; /** * Per-message clip suffix when a row exceeds its byte share. * PRD: append `… [truncated]` (ellipsis already applied by truncateUtf8). */ export declare function truncatedMarkerSuffix(): string; /** Clip row text and append Iris's truncation marker when clipped. */ export declare function clipHeldRowText(text: string, maxChars?: number): string; /** Clock time from receivedAt/messageTs for HELD lines (`13:44:59`). */ export declare function heldTimeLabel(entry: ObservedConversationEntry): string; export declare function formatHeldDeltaLine(entry: ObservedConversationEntry): string; /** * HELD outcome (EN) — sole stdout when a send is held. * Iris template (PRD): * * HELD: the conversation moved while you were composing. {N} new message(s) arrived, * so your {message|file} was not sent: * [{sender} {time}] {text} * Read them, then resend to post it (revised or unchanged). To stay silent, do nothing. */ export declare function renderHeldCopy(input: { /** Full after-cursor non-own population (exact N). */ totalNewCount: number; /** Newest-fitting rows included in the body (chronological). */ shown: ObservedConversationEntry[]; noun: HeldNoun; }): string; /** * Approved ZH variant (not emitted until locale support lands). Kept next to EN * so the pair cannot drift. */ export declare function renderHeldCopyZh(input: { totalNewCount: number; shown: ObservedConversationEntry[]; noun: HeldNoun; }): string; //# sourceMappingURL=send-hold-copy.d.ts.map