import type { AdmittedChatSession, ConnectionReport, RosterView } from "./session.js"; import { recipientLabel, type Person, type Recipient } from "./view.js"; /** Bound on listed choices; the rest stay reachable by typing an explicit name. Provisional. */ export declare const MAX_CHOICES = 50; export interface Choice { readonly recipient: Recipient; readonly label: string; readonly detail?: string; } /** * Listed choices: the session's joined concrete channels first, then present peers by name. Roles * are not listed (there is no role directory); they are typed as `role:`. A partial roster * says so in the detail of the last row rather than looking complete. A peer whose name another * principal carries, on the roster or among `heard` (the transcript's senders), shows its principal. */ export declare function listChoices(conn: ConnectionReport | undefined, roster: RosterView | undefined, selfPrincipal: string, heard?: readonly Person[]): Choice[]; /** * Parse an explicitly typed recipient: `#channel`, `@name-or-id`, `role:`. A bare word is not * guessed. Returns the refusal text instead of throwing. */ export declare function parseRecipient(text: string): { ok: true; recipient: Recipient; } | { ok: false; error: string; }; /** * Disclose what a chosen channel is before it is used: unregistered channels get a visible warning * (the native policy, not this UI, decides whether a send is allowed). A refused or failed read is * reported as such, never as "registered". Non-channel recipients need no read. */ export declare function discloseChoice(session: AdmittedChatSession, r: Recipient): Promise; export { recipientLabel }; //# sourceMappingURL=picker.d.ts.map