/**
 * Settings-namespace scope contracts owned beside the settings transport.
 */
import type { SettingsPathOpView } from '@deepseek-ai/dsh-api-remotes/client';
/** Client-side sync state of one settings namespace. */
export interface SettingsScopeSnapshot<T> {
    /**
     * `loading` until the first accepted section, `ready` while one stands, and
     * `unavailable` when the namespace is not exposed to this client or the
     * connection keeps preferences process-local (memory mode).
     */
    status: 'loading' | 'ready' | 'unavailable';
    /** Last accepted schema-resolved section; undefined before the first acceptance. */
    value: T | undefined;
    /**
     * Composition layer the Host resolved {@link value} over, when the owning
     * plugin declared one. What a field reverts to once cleared.
     */
    base: unknown;
    /**
     * Raw user layer as stored, when one exists. A field's PRESENCE here is what
     * marks it overridden — an override whose value equals the composition
     * default is still an override, and comparing values could not see it.
     */
    user: unknown;
    /** Namespace revision fencing the next write; undefined before the first Host view. */
    revision: number | undefined;
    /** Whether the Host document accepts writes; memory mode never does. */
    writable: boolean;
    /** `host` syncs with the Host document; `memory` keeps a remote browser process-local. */
    mode: 'host' | 'memory';
}
/** Domain-owned description of one settings namespace consumed by a browser plugin. */
export interface SettingsScopeSpec<T> {
    /** Settings namespace registered by the owning Host plugin. */
    namespace: string;
    /**
     * Narrow one wire section; undefined keeps the last accepted value. The
     * default validates the section against the namespace's own serialized wire
     * schema, so domains add a decoder only to narrow beyond that schema.
     */
    decode?: (section: unknown) => T | undefined;
}
/**
 * Reactive owner handle over one namespace's durable section — the browser
 * mirror of the Host-side `SettingsScope` owner seam. Domain services read
 * and observe the snapshot and route explicit user choices through its
 * mutation methods.
 */
export interface SettingsScope<T> {
    /** @returns the current sync snapshot (stable reference until the next change). */
    getSnapshot(): SettingsScopeSnapshot<T>;
    /**
     * Observe snapshot replacements.
     * @param listener - invoked after each snapshot change.
     * @returns the disposer removing this listener.
     */
    subscribe(listener: () => void): () => void;
    /**
     * Queue one atomic namespace mutation. All operations share one revision
     * fence, Host validation, persistence decision, and recovery read. Supplying
     * `expectedRevision` preserves an earlier read as the fence instead of using
     * the latest queued or mirrored revision.
     * @param ops - ordered field operations copied when queued.
     * @param expectedRevision - optional fixed revision read by the domain editor.
     * @returns settlement after the mutation and any latest-write recovery read.
     */
    mutate(ops: readonly SettingsPathOpView[], expectedRevision?: number): Promise<void>;
    /**
     * Queue one field write. Rapid writes preserve mutation order, each carries
     * the latest known namespace revision, and only the latest settlement may
     * publish; a rejected or failed latest write reloads Host state instead.
     * @param field - scalar field inside the namespace section.
     * @param value - JSON-shaped value selected by the user.
     * @returns settlement after the write and any latest-write recovery read.
     */
    set(field: string, value: unknown): Promise<void>;
    /**
     * Queue one field clear, so the field re-inherits the composition layer.
     * Shares {@link set}'s ordering, revision, and recovery contract.
     * @param field - scalar field inside the namespace section.
     * @returns settlement after the clear and any latest-write recovery read.
     */
    unset(field: string): Promise<void>;
}
//# sourceMappingURL=settings-contract.d.ts.map