/**
 * Compose the user `AgentMessage` from the visible query plus per-turn
 * enrichments. Block 0 is always the user query; later blocks are LLM-only
 * context in fixed order.
 *
 * Pure boundary: no I/O, no global reads, and no dependency on runtime message
 * state. The caller supplies the context-warning eligibility boolean.
 */
import type { ImageContent } from '../../ai/types.js';
import type { AgentFileUpload } from '../../contracts/agent-uploads.js';
import type { FocusedRange, RangeRestriction } from '../../contracts/user-turn-enrichments.js';
import type { UserAgentMessage } from '../../core/core-types.js';
export interface BuildUserMessageInput {
    /** The user's typed message. Always block 0 of the resulting content array. */
    query: string;
    /** Optional images attached to the user message. Inlined alongside the query. */
    images?: readonly ImageContent[];
    /** Host-provided UI/checkpoint id for parity with LangGraph human message ids. */
    userMessageId?: string;
    interactionMode?: string;
    fileUploads?: readonly AgentFileUpload[];
    workbookSummary?: string;
    focusedRange?: FocusedRange;
    rangeRestrictions?: readonly RangeRestriction[];
    /** When `true`, append the `# CONTEXT UPDATE WARNING` block. Caller decides eligibility. */
    contextWarningEligible: boolean;
    /** When `true`, the user message is tagged `contextResetBoundary: true`. */
    contextReset?: boolean;
    /** Used as `AgentMessage.timestamp`. Defaults to `Date.now()` when omitted. */
    timestamp?: number;
}
/**
 * Compose the `UserAgentMessage`.
 *
 * Block ordering (matches backend):
 *   0. query (always)
 *   1. workbook_summary (when present)
 *   2. range_restrictions OR focused_range (precedence: restrictions when non-empty)
 *   3. uploads (when present)
 *   4. context_update_warning (when contextWarningEligible)
 *
 * Images (when provided) are appended to block 0's position group — they're not
 * enrichments and stay on the user-visible side. They sit AFTER the query block
 * but the snapshot projection still reads `content[0].text` only, so users see
 * their typed text and the LLM sees text + images + enrichments in order.
 */
export declare function buildUserMessage(input: BuildUserMessageInput): UserAgentMessage;
//# sourceMappingURL=build-user-message.d.ts.map