import { type NativeChatSelectionSnapshot } from '../native-chat-selection-contract.js'; export interface NativeSelectionSnapshot { readonly active: boolean; readonly keys: ReadonlySet; } export declare const EMPTY_NATIVE_SELECTION: NativeSelectionSnapshot; export type NativeSelectionAction = { type: 'enter'; key?: string; } | { type: 'exit'; } | { type: 'toggle' | 'remove'; key: string; }; /** Pure session-local selection rules; React owns subscription and lifetime. */ export declare function nativeSelectionReducer(state: NativeSelectionSnapshot, action: NativeSelectionAction): NativeSelectionSnapshot; /** Minimal read boundary for the public ui-chat contract; no host UI imports. */ export interface NativeChat { readonly nodes: { get(key: string): unknown; source(key: string): { subscribe(listener: () => void): () => void; }; }; } export declare function readNativeChat(value: unknown): NativeChat | undefined; export declare function isSelectableNativeNode(value: unknown): value is { key: string; kind: string; }; /** A missing projection may be unloaded; a present ineligible node is authoritative. */ export declare function observeSelectedNativeNodes(chat: NativeChat, keys: ReadonlySet, remove: (key: string) => void, fail: () => void): () => void; export declare function nativeSelectionCopyText(chat: NativeChat, key: string): string; /** Freeze the selected public projections; DOM order and selection order are not message order. */ export declare function nativeSelectionSnapshot(chat: NativeChat, sessionId: string, keys: ReadonlySet): NativeChatSelectionSnapshot; /** Only the visible user input is eligible. Non-text blocks stay explicit in the confirmation. */ export declare function nativeWorldPublishOrigin(chat: NativeChat, sessionId: string, key: string): import('../world-publish-source.js').WorldPublishOrigin; //# sourceMappingURL=harness-native-selection.d.ts.map