/**
 * Pure decision helpers for `botmux send` (extracted from cmdSend so they can
 * be unit-tested without process.exit / Lark I/O).
 *
 * Two policies live here:
 *   - resolveQuoteTarget: which message a chat-scope send should quote (reply
 *     to), so 普通群 messages render Lark's 引用 chain. Thread-scope and
 *     --top-level never quote.
 *   - validateMentionDecision: the @ hard-gate — every model-initiated reply
 *     must explicitly choose --mention / --mention-back / --no-mention.
 */
export interface QuoteTargetArgs {
    /** session.scope === 'chat' */
    isChatScope: boolean;
    /** --top-level publish mode */
    sendTopLevel: boolean;
    /** --no-quote: force a plain (un-quoted) send */
    noQuote: boolean;
    /** --quote <message_id> explicit override */
    explicitQuote?: string;
    /** session.quoteTargetId — the latest inbound message this turn responds to */
    sessionQuoteTargetId?: string;
}
/**
 * Resolve the message id a send should quote, or null for a plain send.
 * Priority: --quote > session.quoteTargetId. Only chat-scope, non-top-level,
 * non-`--no-quote` sends quote.
 */
export declare function resolveQuoteTarget(args: QuoteTargetArgs): string | null;
export interface MentionDecisionArgs {
    /** config.send.requireMentionDecision */
    enabled: boolean;
    /** --top-level publish is exempt from the gate */
    sendTopLevel: boolean;
    /** at least one --mention <ou:Name> given */
    hasMentionArgs: boolean;
    /** --mention-back given */
    mentionBack: boolean;
    /** --no-mention given */
    noMention: boolean;
    /** whether the session knows who sent the message being replied to */
    hasQuoteTargetSender: boolean;
}
export interface MentionDecisionResult {
    ok: boolean;
    /** present when !ok — the message to print before exit(2) */
    error?: string;
}
/**
 * Enforce that the model made an explicit @ decision before sending.
 * Returns ok:false with a context-aware error when no decision was made or
 * the flags contradict each other.
 */
export declare function validateMentionDecision(args: MentionDecisionArgs): MentionDecisionResult;
/**
 * Agent "raise-hand" attention flag for `botmux send --attention[=kind]`.
 *
 * `--attention`            → boolean raise, kind defaults to 'blocked'.
 * `--attention=<kind>`     → raise with an explicit kind.
 * Unknown kinds fall back to 'blocked' (lenient: never fail the send over a
 * typo'd category — the reason text carries the real meaning).
 *
 * MUST be parsed here, not via argValue('--attention'), because a bare
 * `--attention "我卡住了"` would otherwise eat the message as the flag value.
 * Callers must also add '--attention' to positionals()' booleanFlags so the
 * body isn't swallowed.
 */
export declare const ATTENTION_KINDS: readonly ["authz", "decision", "blocked", "help"];
export declare function parseAttentionFlag(args: string[]): {
    requested: boolean;
    kind: string;
};
export interface AttentionUsageArgs {
    requested: boolean;
    /** --top-level */
    sendTopLevel: boolean;
    /** --chat-id <id> */
    overrideChatId?: string;
    /** --into <topic> */
    sendInto?: string;
    /** --voice */
    asVoice?: boolean;
    /** message body has non-empty text */
    hasText: boolean;
}
/**
 * Guard `--attention` usage. Returns an error string, or null if OK.
 * `--attention` only makes sense replying into the CURRENT session: clear-on-reply
 * binds to this session's anchor, so routing the message elsewhere (--top-level /
 * --chat-id / --into) would leave the needs-you signal un-clearable. And the
 * dashboard needs a text reason, so an image/file-only send can't raise.
 */
export declare function attentionUsageError(args: AttentionUsageArgs): string | null;
//# sourceMappingURL=send-policy.d.ts.map