export interface ConversationRouteInput { controllerSession: string; messageId: string; requestText: string; /** The selected public target. A retry through a different alias conflicts instead of authorizing another send. */ canonicalTarget: string; } export interface ConversationRouteChoice { route: "native" | "terminal"; targetId: string; } export interface ConversationRouteRecord { schema: "agent-knock-knock/conversation-route"; version: 1; revision: number; id: string; controller_session: string; message_id: string; request_text: string; canonical_target: string; route: ConversationRouteChoice["route"]; target_id: string; created_at: string; updated_at: string; /** A recorded receipt is an observation, not proof of delivery or task acceptance. */ state: "reserved" | "uncertain" | "recorded"; receipt?: Record; error_code?: string; } export interface ConversationRouteStore { load(input: ConversationRouteInput): ConversationRouteRecord | undefined; reserve(input: ConversationRouteInput, choice: ConversationRouteChoice): { record: ConversationRouteRecord; created: boolean; }; recordReceipt(input: ConversationRouteInput, choice: ConversationRouteChoice, receipt: Record): ConversationRouteRecord; markUncertain(input: ConversationRouteInput, choice: ConversationRouteChoice, errorCode?: string): ConversationRouteRecord; } export declare class ConversationRouteError extends Error { readonly code: "conversation_route_conflict" | "conversation_route_missing" | "conversation_route_invalid"; constructor(code: "conversation_route_conflict" | "conversation_route_missing" | "conversation_route_invalid", message: string); } export declare function conversationRouteId(controllerSession: string, messageId: string): string; /** Select once after preflight; crashes and uncertain delivery never authorize a different route. * This journal does not replace the selected provider's stable-message-ID dispatch ledger. */ export declare function createConversationRouteStore(storeDir: string, locks: { acquire(lockPath: string): () => void; }, options?: { now?(): Date; }): ConversationRouteStore;