/**
 * OwlCoda TUI Permission Prompt
 *
 * Rich permission request dialogs with:
 * - Full bordered dialog (for standalone prompts)
 * - Top-border-only dialog for compact approval prompts
 * - Per-tool-type renderers (bash, file, web)
 * - Inline compact prompt for readline contexts
 */
export interface PermissionChoice {
    key: string;
    label: string;
    isDefault?: boolean;
}
export interface PermissionDialogOptions {
    /** Tool name requesting permission. */
    toolName: string;
    /** Short description of what the tool wants to do. */
    action: string;
    /** Optional detail text (e.g. file path, command). */
    detail?: string;
    /** Available choices. Default: [Approve (y), Reject (n)] */
    choices?: PermissionChoice[];
    /** Max width for the dialog. */
    width?: number;
}
/**
 * Render a full-bordered permission dialog.
 *
 * ```
 * ╭─── 🔐 Permission Required ─────╮
 * │                                  │
 * │  bash wants to execute:          │
 * │  rm -rf /tmp/old-files           │
 * │                                  │
 * │  [Y] Approve  [N] Reject        │
 * │  [A] Always approve this tool    │
 * │                                  │
 * ╰──────────────────────────────────╯
 * ```
 */
export declare function renderPermissionDialog(opts: PermissionDialogOptions): string;
export interface TopBorderDialogOptions {
    /** Title displayed in/after the top border line. */
    title: string;
    /** Optional subtitle (dimmed, below title). */
    subtitle?: string;
    /** Border color token. Default: 'permission'. */
    color?: string;
    /** Content lines to render below the border. */
    content: string[];
    /** Inner horizontal padding. Default: 2. */
    paddingX?: number;
}
/**
 * Render a top-border-only dialog for compact approval prompts.
 *
 * ```
 * ╭─ 🔐 Bash ────────────────────────────╮
 *   rm -rf /tmp/old-files
 *
 *   [Y] Allow  [N] Deny  [A] Always
 * ```
 *
 * Only the top border is drawn (with rounded corners). Content below
 * has indented padding but no side or bottom borders.
 */
export declare function renderTopBorderDialog(opts: TopBorderDialogOptions): string;
/**
 * Render a bash permission dialog with command preview.
 */
/**
 * Detect potentially destructive bash commands.
 *
 * Delegates to `classifyBashCommand` (single source of truth — issue #2)
 * and returns a short warning string when the level is `dangerous`,
 * preserving the previous "null = no warning" contract this module's
 * callers depend on.
 *
 * `needs_approval` and `unknown` deliberately do NOT produce a warning
 * banner here: the permission card itself is already asking for consent,
 * so duplicating "this writes a file" copy on every `git commit` would
 * be noise. `dangerous` is reserved for things the operator should pause
 * over even when consenting (rm -rf, force-push, sudo, …).
 *
 * For headless callers and any new code that needs structured detail,
 * import `classifyBashCommand` directly from `../bash-risk.js`.
 */
export declare function detectDestructiveCommand(command: string): string | null;
export declare function renderBashPermission(command: string, cwd?: string, selectedIndex?: number): string;
/**
 * Render a TaskCreate permission dialog with command preview.
 *
 * TaskCreate may carry a `command` to spawn. When it does, the operator
 * should see the same risk verdict they would for `bash` — both surfaces
 * route through `classifyBashCommand`, so the warning copy and border
 * color are identical to `renderBashPermission`. Without a command this
 * is a pure TODO entry and never asks for approval (the call is allowed
 * by the headless policy without prompting).
 */
export declare function renderTaskCreatePermission(command: string, cwd?: string, selectedIndex?: number): string;
/**
 * Render a file permission dialog with path and action.
 */
export declare function renderFilePermission(filePath: string, action: 'read' | 'write' | 'create' | 'edit', selectedIndex?: number): string;
/**
 * Render a web permission dialog with URL.
 */
export declare function renderWebPermission(url: string, method?: string, selectedIndex?: number): string;
/** Permission choices in canonical order. Index 0 default-highlight is
 *  Deny (index 1) — safer than defaulting to Allow when the user just
 *  hits Enter. Number-key shortcuts map 1→Allow, 2→Deny, 3→Always. */
export declare const PERMISSION_CHOICES: ReadonlyArray<{
    key: string;
    label: string;
    description: string;
    decision: 'allow' | 'deny' | 'always';
}>;
/** Format the choice list vertically with a highlight arrow pointing at
 *  the current selection. Arrow keys (and 1/2/3 numeric shortcuts) move
 *  the selection; Enter confirms. Previous horizontal `[Y] Allow [N] Deny
 *  [A] Always` format conflated "here are the keys" with "here is what
 *  will happen if you just press Enter", and the old handler treated
 *  empty Enter as Allow — which made arrow-key presses (useInput's
 *  `input` is '' for special keys) silently run the tool. */
export declare function formatChoiceList(selectedIndex: number): string[];
/**
 * Render a compact inline permission prompt (single line).
 * For use in readline contexts.
 */
export declare function renderInlinePermission(toolName: string, detail?: string, selectedIndex?: number): string;
