import type { PluginInput } from "@opencode-ai/plugin";
import { type ParentWakePromptContext, type PendingParentWake } from "./parent-wake-dedupe";
type OpencodeClient = PluginInput["client"];
export type { ParentWakePromptContext, PendingParentWake } from "./parent-wake-dedupe";
type ParentWakeNotifierDeps = {
    client: OpencodeClient;
    directory: string;
    enqueueNotificationForParent: (parentSessionID: string | undefined, operation: () => Promise<void>) => Promise<void>;
};
type ParentWakeNotifierOptions = {
    pendingRetryMs: number;
    acceptedMessageSkewMs: number;
    toolCallDeferMaxMs: number;
    failureRequeueWindowMs: number;
    /**
     * If the latest message in the parent session is a `user` message added
     * within this window, the parent-wake injection is deferred. Prevents the
     * race where a parent-wake `dispatchInternalPrompt` collides with a fresh
     * user prompt, which on macOS/Electron has triggered native SIGABRT crashes
     * inside OpenCode's `@parcel/watcher` TSFN callback path. See issue #4120.
     */
    userMessageInProgressWindowMs: number;
    parentSessionActivityInProgressWindowMs?: number;
};
export declare class ParentWakeNotifier {
    private readonly deps;
    private readonly options;
    private pendingParentWakes;
    private pendingParentWakeTimers;
    private dispatchedParentWakes;
    private dispatchedParentWakeTimers;
    private recentParentSessionActivity;
    constructor(deps: ParentWakeNotifierDeps, options: ParentWakeNotifierOptions);
    getPendingParentWakes(): Map<string, PendingParentWake>;
    getPendingParentWakeTimers(): Map<string, ReturnType<typeof setTimeout>>;
    getDispatchedParentWakes(): Map<string, PendingParentWake>;
    getDispatchedParentWakeTimers(): Map<string, ReturnType<typeof setTimeout>>;
    recordParentSessionActivity(sessionID: string): void;
    queuePendingParentWake(sessionID: string, notification: string, promptContext: ParentWakePromptContext, shouldReply: boolean, delayMs?: number): void;
    flushPendingParentWake(sessionID: string): Promise<void>;
    clearDispatchedParentWake(sessionID: string): void;
    requeueDispatchedParentWake(sessionID: string, reason: string): Promise<boolean>;
    schedulePendingParentWakeFlush(sessionID: string, delayMs?: number): void;
    clearPendingParentWakeTimer(sessionID: string): void;
    shutdown(): void;
    private isSessionActive;
    private hasRecentParentSessionActivity;
    private trackDispatchedParentWake;
    private loadParentWakeSessionMessages;
    private getParentWakeMessageRole;
    private getParentWakeMessageFinish;
    private getParentWakeMessageCreatedAt;
    private parentWakePartIsWaitingOnTool;
    private latestAssistantToolWaitState;
    private parentWakeMessageHasOutput;
    private parentWakeMessageContainsNotification;
    private isUserMessageInProgress;
    private shouldDeferParentWakeForSessionHistory;
    private hasAcceptedMessageAfterDispatchedParentWake;
    private requeueWake;
}
