import type { TriggerSource } from "../../core/index.js"; /** "0 17 * * 5" → "Fridays at 5:00 PM"; "0 8 * * *" → "Daily at 8:00 AM". Only the simple fixed-time forms humanize — anything else (ranges, lists, step values) returns null and the raw cron stays the honest label. The clock this returns is BARE, with no zone: the engine evaluates every cron in UTC, and naming the zone is the render site's job (see {@link triggerLabel}) so the mapping itself stays a pure cron→clock read. */ export declare function humanizeCron(cron: string): string | null; export declare function triggerLabel(source: TriggerSource): string; /** The rule this automation runs by, as one sentence: what starts it → what it then does. The card's title when the record wrote no description of its own. (It replaced a two-box `trigger → action` diagram, whose second labels — "Schedule", "1 action", "N steps" — named the boxes, not the rule, and went with them.) The ACTION half arrives already humanized: a record's task is the producer's to read, and a card that guessed at one would put words in an automation's mouth. Without it there is no sentence, and the card falls back to the description or the name. */ export declare function automationRule(when: TriggerSource | undefined, action: string | undefined): string | undefined; export interface AutomationCardProps { /** The automation record's display name. */ name: string; /** Whether the automations engine reports it enabled. */ enabled: boolean; /** The record's trigger — the rule sentence's WHEN half. */ when?: TriggerSource; /** The rule sentence's ACTION half, already humanized. Without both halves * there is no sentence and the name is all this card has. */ action?: string; /** The record's one-line description. Preferred over the composed * `when → action` title: it is the human phrasing of the same rule. */ description?: string; /** E3 — the automation's terms, one sentence each ("Caps at $200 a bill — * anything higher asks you first"), as a tick list under the status line; * omitted entirely when there are none. */ rules?: string[]; /** Standing-grant asks still undecided (grant sets): the state line reads * "Enabled · waiting on N permissions" until the set is granted. */ pendingGrants?: number; /** §13 — the automation's sponsor: it always runs as a named person, and the * window says whose access that is. */ sponsor?: { subject: string; display?: string; }; /** How many principals can reach the app, when that is knowable. */ editors?: number; } /** §13's window label — "runs with Dana's access", and the wider editor set * when one exists. The subject is the honest fallback: Vendo holds no * directory, so a display name for anyone but the caller would be invented. */ export declare function sponsorLabel(sponsor: { subject: string; display?: string; } | undefined, editors?: number): string | null; /** The read-only automation card (the thread's record of a live automation). */ export declare function AutomationCard({ name, enabled, when, action, description, rules, pendingGrants, sponsor, editors }: AutomationCardProps): import("react").JSX.Element;