import { AgentActivityDurableMessage, AgentSessionEngine, AgentActivityMessagePage } from '@tutti-os/agent-activity-core'; type AgentConversationMessagePagePhase = "error" | "idle" | "loading"; interface AgentConversationMessageControllerSnapshot { agentSessionId: string | null; error: unknown | null; olderPagePhase: AgentConversationMessagePagePhase; } interface AgentConversationMessagePageInput { agentSessionId: string; beforeVersion: number; limit: number; order: "desc"; signal: AbortSignal; workspaceId: string; } interface AgentConversationMessageControllerDiagnostics { error?(input: { agentSessionId: string; beforeVersion: number; error: unknown; }): void; page?(input: { agentSessionId: string; details: Readonly>; event: string; level?: "debug" | "warn"; messages?: readonly AgentActivityDurableMessage[]; }): void; synchronizationError?(input: { agentSessionId: string; error: unknown; }): void; } interface CreateAgentConversationMessageControllerInput { diagnostics?: AgentConversationMessageControllerDiagnostics; engine: Pick; ensureSessionSynchronized?(input: { agentSessionId: string; onError(error: unknown): void; workspaceId: string; }): () => void; isAvailable(agentSessionId?: string | null): boolean; listSessionMessages(input: AgentConversationMessagePageInput): Promise; onOlderPageApplied?(agentSessionId: string): void; onOlderPageFailed?(error: unknown): void; onOlderPageSettled?(): void; onSnapshotChanged?(snapshot: AgentConversationMessageControllerSnapshot): void; pageSize?: number; workspaceId: string; } interface AgentConversationMessageController { cancel(): void; dispose(): void; getSnapshot(): AgentConversationMessageControllerSnapshot; loadOlder(agentSessionId?: string | null): Promise; requestInitial(agentSessionId: string, options?: { force?: boolean; }): void; requestLatest(agentSessionId?: string | null): void; setActiveSession(agentSessionId: string | null): void; } /** * Owns the renderer-neutral message-query state for one focused conversation. * * Canonical detail/latest hydration remains an Engine reconcile command. * Explicit older-page reads are fenced to the active Session and applied to * the same Engine, so Desktop and Mobile cannot drift into separate paging * stores or retry/concurrency rules. */ declare function createAgentConversationMessageController(input: CreateAgentConversationMessageControllerInput): AgentConversationMessageController; export { type AgentConversationMessageController, type AgentConversationMessageControllerDiagnostics, type AgentConversationMessageControllerSnapshot, type AgentConversationMessagePageInput, type AgentConversationMessagePagePhase, type CreateAgentConversationMessageControllerInput, createAgentConversationMessageController };