/**
 * core/durabilityBarrier — the one seam a durable session composer may hold
 * inside a run, and nothing else may.
 *
 * ── What it is ───────────────────────────────────────────────────────────────
 * A run's tool dispatch asks, once per ReAct iteration, "is there a durable
 * write still in flight from the LAST iteration?" and — only if there is —
 * waits for it before executing this iteration's tools. That is the entire
 * mechanism. It exists because the alternative is a bound nobody can state:
 * without it, iteration N's tools can run while iteration N-1's write is still
 * on the wire, so a crash replays MORE than one iteration of side effects and
 * "how much can re-execute?" has no answer.
 *
 * ── Why it is a WeakMap and not an option ────────────────────────────────────
 * This is deliberately **not** a public extension point. footprintjs's stage
 * seams and phase chain are closed here, and a general "run something between
 * my stages" hook would be a new one — it would let any consumer inject
 * latency, ordering and failures into a traversal, and every later feature
 * would have to reason about it. So the barrier is keyed off the runner
 * instance in a module-private WeakMap that appears on no barrel and no
 * subpath: `agentfootprint/hosting`'s session writer installs it, the tool
 * dispatch reads it, and there is no third party. Nothing in the public API
 * surface mentions it, which is the point.
 *
 * ── Why it costs nothing when nobody installed one ───────────────────────────
 * {@link pendingDurableWrite} returns `undefined` — not a resolved promise —
 * when no barrier is installed, so the dispatch loop does not `await`, does not
 * schedule a microtask, and produces byte-identical timing to an agent that
 * never heard of durability.
 *
 * Pattern: Instance-keyed private capability (a WeakMap "friend" channel).
 * Role: core/ layer, internal. No events, no state, no scope.
 *
 * @internal
 */
/**
 * What a barrier answers: the write still in flight, or `undefined` when there
 * is nothing to wait for. Returning `undefined` is the fast path and the
 * common case — a mode that persists at run end only never installs one at all.
 *
 * @internal
 */
export type DurabilityBarrier = () => Promise<void> | undefined;
/**
 * Install the barrier for one runner. Returns the uninstall function; the
 * caller owns it, exactly as `attach()` and `on()` hand back their own.
 *
 * Last install wins. One runner has at most one barrier because one composer
 * owns its durability — two would be two answers to "has the last write
 * landed?", and a run cannot honour both.
 *
 * @internal
 */
export declare function installDurabilityBarrier(owner: object, barrier: DurabilityBarrier): () => void;
/**
 * The durable write still in flight for this runner, or `undefined` when there
 * is no barrier installed or nothing outstanding.
 *
 * @internal
 */
export declare function pendingDurableWrite(owner: object): Promise<void> | undefined;
