/**
 * A file selected for viewing.
 *
 * Keyed by `entryId` (not the entry value): the workspace entry id is stable
 * within a page load but regenerated on reload, and selection is transient UI
 * state anyway (reset on reload). Consumers must resolve the live entry via
 * `workspace.entries.find(e => e.id === sel.entryId)` so a removed entry
 * deselects naturally instead of holding a stale value.
 */
export interface SelectedWorkspaceFile {
    /** Stable-within-page id of the owning workspace entry. */
    readonly entryId: string;
    /** Repo-relative (git) or root-relative (local) file path. */
    readonly path: string;
}
type Listener = () => void;
/**
 * Framework-agnostic store for the currently-open workspace file.
 *
 * Implements the `useSyncExternalStore` contract identical to
 * {@link import("./selection-store.js").SelectionStore}: the context carries the
 * store instance (stable ref), and `getSelection` returns the stored object
 * reference — a new object is allocated only inside `select` — so `getSnapshot`
 * never triggers a re-render loop.
 */
export declare class WorkspaceFileSelectionStore {
    private _selected;
    private _listeners;
    select(file: SelectedWorkspaceFile): void;
    deselect(): void;
    toggle(file: SelectedWorkspaceFile): void;
    subscribe: (listener: Listener) => (() => void);
    /** Returns the current selection (stable ref between mutations). */
    getSelection: () => SelectedWorkspaceFile | null;
    private _notify;
}
export {};
//# sourceMappingURL=workspace-file-selection-store.d.ts.map