import type { AgentHarnessEvent } from "../../internal/harness.js";
import type { Stats } from "./assemble-result.js";
import type { HarnessHandlersDeps, Prepared, RunState } from "./contracts.js";
/**
 * What the driver hands the harness-handlers lane, once per leg — the four positional parameters the
 * factory used to take, as one carrier of REFERENCES (the handlers read the seats live on every event).
 */
export interface RunHarnessHandlersInput {
    /** borrowed-mutable — the leg's prepared seat. Read throughout; written only into one per-run ref cell
     *  (`callIssuedAtRef.current`, cleared when the model's turn ends). */
    prepared: Prepared;
    /** borrowed-mutable — the run's usage counters. This lane is their WRITER: the turn's usage lands on
     *  them in onMessageEnd, tool calls and turns are counted in onToolStart / onTurnEnd. */
    stats: Stats;
    /** borrowed-mutable — the run's mutable state; the handlers write the turn / counters / limits /
     *  budget groups, per the writer table on the type. */
    rs: RunState;
    /** borrowed-readonly — the driver-declared const seats + the runner's onError, see
     *  {@link HarnessHandlersDeps}. */
    deps: HarnessHandlersDeps;
}
/** The five harness event handlers + the workspace-move mint, as the driver destructures them. */
export interface RunHarnessHandlersResult {
    onMessageUpdate: (event: Extract<AgentHarnessEvent, {
        type: "message_update";
    }>) => void;
    onMessageEnd: (event: Extract<AgentHarnessEvent, {
        type: "message_end";
    }>) => void;
    onToolStart: (event: Extract<AgentHarnessEvent, {
        type: "tool_execution_start";
    }>) => void;
    onToolEnd: (event: Extract<AgentHarnessEvent, {
        type: "tool_execution_end";
    }>) => void;
    onTurnEnd: () => void;
    /** The single workspace_changed mint (cwd diff vs the closure's dedupe state); the run body
     *  calls it after a resume's approved-call resolution, which bypasses onToolEnd. */
    announceWorkspaceMove: () => void;
}
/** R5 抽取:runLocked 的五个 harness 事件处理器(onMessageUpdate/onMessageEnd/
 *  onToolStart/onToolEnd/onTurnEnd,~530 行)整块搬迁。正文逐字;唯一字面变化 = this.deps.onError →
 *  deps.runnerHooks.onError(1 处)。`lastWorkspaceCwd` 是纯 R5 局部(读写全在 onToolEnd 内,零段外
 *  读者),声明随迁进工厂体——调用点放在原声明位之后,初值 `prepared.cwdRef?.current` 的求值时机不变
 *  (中间只有声明无执行)。*/
export declare function createHarnessHandlers(input: RunHarnessHandlersInput): RunHarnessHandlersResult;
