import type { SessionInboxAddress } from "#execution/session-inbox/address.js";
import type { DeliverPayload, SubagentInputRequestHookPayload } from "#channel/types.js";
import type { AnswerHookRoute, ProxyInputRequest } from "#harness/proxy-input-requests.js";
import type { HarnessEmitFn, HarnessSession, SessionStateMap } from "#harness/types.js";
import type { RunMode } from "#shared/run-mode.js";
import type { InputResponse } from "#shared/input.js";
/**
 * Runs the parent-side work for a `subagent-input-request`. Conversation
 * mode emits a waiting boundary on the parent stream; the returned proxy
 * entries route the eventual response back down to the child.
 */
export declare function emitProxiedInputRequest(input: {
    readonly emit: HarnessEmitFn;
    readonly hookPayload: SubagentInputRequestHookPayload;
    readonly mode: RunMode;
    readonly session: HarnessSession;
}): Promise<{
    readonly entries: readonly (readonly [requestId: string, route: ProxyInputRequest])[];
    readonly session: HarnessSession;
}>;
/** One proxied-child bucket of a routed deliver payload. */
export interface RoutedChildDelivery {
    readonly answerHook?: AnswerHookRoute;
    readonly childContinuationToken: string;
    readonly childSessionInbox?: SessionInboxAddress;
    readonly childResponseUrl?: string;
    /** Answer-hook requests the user moved past; each hook resumes as `dismissed`. */
    readonly dismissedRequestIds?: readonly string[];
    readonly payload: {
        readonly inputResponses: readonly InputResponse[];
    };
    /** Parent-visible request IDs safe to retire once this bucket is forwarded. */
    readonly retireRequestIds: readonly string[];
    /** Present when the child is owned by a task run, which delivers on the parent's behalf. */
    readonly taskId?: string;
}
/**
 * Outcome of splitting one deliver payload by the session's proxy map.
 * `forSelf` is the parent-local remainder (or `undefined` when fully
 * routed); `forChildren` carries one entry per descendant token.
 */
export interface RoutedDeliverPayload {
    readonly forChildren: readonly RoutedChildDelivery[];
    readonly forSelf: DeliverPayload | undefined;
    readonly parentAction: {
        readonly kind: "cancel-turn";
    } | undefined;
}
/**
 * Splits a deliver payload into parent-local and proxied-child buckets.
 *
 * With `resolveMessage`, a plain-text message is also resolved against pending
 * `ctx.ask()` questions: when exactly one question is pending, a matching option or
 * permitted free text answers it and consumes the message. Otherwise the
 * message dismisses every `dismissible` question and stays with the parent.
 */
export declare function routeDeliverPayload(input: {
    readonly allowRoute?: (requestId: string, route: ProxyInputRequest) => boolean;
    readonly payload: DeliverPayload;
    readonly resolveMessage?: boolean;
    readonly state: SessionStateMap | undefined;
}): RoutedDeliverPayload;
