import type { RunContext } from './approval-bus.js';
export interface PushPayload {
    /** Body text to send. Required. Empty / whitespace-only → error. */
    text?: unknown;
    /** Optional override: <platform>:<channelId>:<threadId>. Same-user same-
     *  platform only; requires IMHUB_PUSH_CROSS_THREAD=on. Omit to push to
     *  the caller's own thread (the common case). */
    toThread?: unknown;
    /** Optional placeholder for future card support — ignored for now (v1
     *  is text-only). */
    kind?: unknown;
}
export type PushResult = {
    ok: true;
    result: {
        outboxId: number;
        immediate: boolean;
        targetThread: string;
        /** D+ Stage 1 (#9) — set true when the notification-evaluator
         *  gate suppressed the message. Outbox row was not enqueued;
         *  `outboxId=0` and `immediate=false` in that case. From the
         *  caller's view the push "succeeded" because the agent did
         *  its part; the gate decides if the human gets pinged. */
        suppressed?: boolean;
        /** Reason returned by the evaluator. Empty unless suppressed. */
        suppressedReason?: string;
    };
} | {
    ok: false;
    error: string;
};
/** Public entry called by approval-bus.handlePush. */
export declare function handlePushOp(payload: PushPayload, ctx: RunContext): Promise<PushResult>;
//# sourceMappingURL=push-rpc.d.ts.map