import type { AgentSessionRuntime } from "../../core/agent-session-runtime.ts";
import type { KeybindingsManager } from "../../core/keybindings.ts";
import type { ExtensionUIContext } from "../../core/extensions/index.ts";
import type { ActivityWatchdogDiagnostic } from "./activity-watchdog.ts";
import type { EngineKeybindingState, InteractiveEngineMessage } from "./protocol.ts";
import type { RpcSlashCommand } from "../rpc/rpc-types.ts";
interface EngineMessageSource {
    onEngineMessage(listener: (message: InteractiveEngineMessage) => void): () => void;
    onKeybindingState?(listener: (state: EngineKeybindingState) => void): () => void;
}
export declare function attachInteractiveEngineKeybindingSync(runtime: EngineMessageSource, keybindings: KeybindingsManager, onState?: (state: EngineKeybindingState) => void): () => void;
export declare function attachInteractiveEngineHost(runtime: AgentSessionRuntime, ui: ExtensionUIContext, onDiagnostic: (diagnostic: ActivityWatchdogDiagnostic) => void, setShortcutHandler?: (handler: (data: string) => boolean) => void | (() => void), keybindings?: KeybindingsManager): () => void;
export declare function waitForInteractiveEngineBound(runtime: AgentSessionRuntime): Promise<void>;
export declare function interruptBlockedInteractiveEngine(runtime: AgentSessionRuntime): boolean;
/**
 * Command catalog the engine child exposes to the isolated host. Returns an
 * empty list for non-isolated runtimes so callers can merge unconditionally.
 */
export declare function getInteractiveEngineRemoteCommands(runtime: AgentSessionRuntime): readonly RpcSlashCommand[];
/** Subscribe to engine-child command catalog changes. No-op when not isolated. */
export declare function onInteractiveEngineRemoteCommandsChanged(runtime: AgentSessionRuntime, listener: (commands: readonly RpcSlashCommand[]) => void): () => void;
export {};
//# sourceMappingURL=extension-ui-bridge.d.ts.map