import { type PresetDef } from './preset-prompt.js';
/**
 * Every preset, in one table.
 *
 * Each of these used to be a file of its own whose whole body was one `definePreset` call (or a
 * hand-rolled equivalent) plus four alias exports — 56 exported names for 14 objects, with the
 * same four doc comments copied down the directory. What actually varies between them is two or
 * three values, which is what a row is.
 *
 * The prompt text itself is not here: it ships in `prompts/presets/<stem>.md` and reaches this
 * table through the generated constants, so a prompt is edited as prose in one place.
 *
 * Pure by construction (no `node:*`), so the dashboard can render any preset in the browser (#520).
 */
export declare const presets: {
    /**
     * [Research] (#331): the problem-variability review, shipped as a direct prompt (see
     * `runPrompt`) rather than a build agent — research reviews existing code, so it skips the
     * scope -> build scaffolding. `showMultiSelect()` + `<AWAIT>` becomes a live turn-boundary
     * gate (#339/#340) the dashboard resolves.
     */
    readonly research: PresetDef;
    /**
     * [Maintainability] (#361): deliberately minimal, so its performance can be judged before a
     * more explicit prompt is written. Keep it in sync with the issue rather than growing it here.
     */
    readonly maintainability: PresetDef;
    /** [Readability] (#360): the reader's-eye pass — seams, altitude, and one commit per refactor. */
    readonly readability: PresetDef;
    /** [Security audit] (#461). */
    readonly securityAudit: PresetDef;
    /**
     * [UX (auto)] (#962, replacing #472's gated prompt): rate every UI flow, then fix the low
     * scorers. Unattended by design — it ends in work rather than in `<AWAIT>`, so an agent started
     * from it finishes on its own. A gated sibling that offers its ratings as choices is #962's
     * stated follow-up and belongs beside this row, not inside it.
     */
    readonly ux: PresetDef;
    /**
     * [Maintenance] (#881/#882): the periodic codebase sweep. Note `${{ }}` fragments cannot nest (the
     * scanner stops at the first `}}`), which is why its target is a plain blank.
     */
    readonly maintenance: PresetDef;
    /**
     * [Market research] (#694). Its prompt defines `<SESSION_NAME>` itself rather than reading
     * `${{ tf.session_name }}`: it is launched from the launcher, where no session exists yet.
     */
    readonly marketResearch: PresetDef;
    /**
     * [Update from GitHub] (#1208, #1501): the one GitHub sync. It resumes from the
     * `lastImportedAt` in `tickets/meta.json` and reconciles rather than refilling — an existing
     * ticket is edited in place, keeping the `.plan.md` written against it, and a
     * closed issue's ticket goes. An empty `tickets/` is its first-import branch: every open issue
     * comes across, which is why the separate import preset could go (#1501).
     *
     * The timestamp is read by the agent out of the repo rather than rendered into the prompt: the
     * file travels in the same commit as the tickets it describes, so an agent whose work never landed
     * cannot leave behind a stamp claiming those issues were imported.
     *
     * Marked {@link PresetSpec.newAgent}: syncing is repo work, not a reply, so it opens its own
     * session rather than appending to whichever one the user happens to be reading.
     */
    readonly updateTickets: PresetDef;
    /** [Plan tickets] (#685): turn tickets into costed plans. */
    readonly planTickets: PresetDef;
    /** [Suggest new tickets] (#462/#683): the dashboard prefills this one line and the user edits it freely. */
    readonly suggestNewTickets: PresetDef;
    /**
     * [Suggest new features] (#1109): the product-inward, generative corner of the PM cluster. It
     * studies what the product does today and proposes net-new features as tickets in `tickets/`.
     * Distinct from its neighbours: `suggestNewTickets` echoes a line the human types,
     * `marketResearch` looks outward at the market, and `suggestTicketsToWorkOn` picks from tickets
     * that already exist. Autonomous rather than gated — a proposal is a reviewable ticket, so the
     * human triages later instead of approving mid-run, which also keeps it usable unattended.
     */
    readonly suggestNewFeatures: PresetDef;
    /**
     * [Suggest tickets to work on] (#698): the gated sibling of the triage pair. It ends in
     * `<AWAIT>`, so it is deliberately kept out of {@link AUTO_PM_JOBS} — firing it unattended
     * would wedge an agent against a human who is not there.
     */
    readonly suggestTicketsToWorkOn: PresetDef;
    /** [Drain queue] (#855): work the entries already on `TODO_AGENTS.md`. */
    readonly drainQueue: PresetDef;
    /**
     * [Do quick-win work] (#891) and [Do consensual work] (#892): read `tickets/*.md`, pick the ones
     * matching one filter, and append them to `TODO_AGENTS.md` — how the queue refills itself from
     * the ticket backlog. The pair splits on cost, and the split is the point: both are consensual
     * (zero open questions, zero variability), so neither needs a human, and they differ only in
     * whether the work is cheap. Keeping them apart lets the rotation queue the cheap batch and the
     * significant batch on separate turns rather than in one indiscriminate sweep.
     *
     * Each prompt pins its own `<SESSION_NAME>` and aborts when `tf-<SESSION_NAME>`
     * already exists. That collision guard is what makes them safe to fire on a schedule: a triage
     * still in flight owns the branch, so the next firing does nothing instead of triaging twice.
     */
    readonly triageQuick: PresetDef;
    readonly triageConsensual: PresetDef;
};
/** The presets by key, e.g. `planTickets`. */
export type PresetKey = keyof typeof presets;
/**
 * Whether a prompt is the one that takes work OFF the queue (#1117).
 *
 * The daemon knows a drain by the `drains` flag on its job; an agent started by hand arrives as bare
 * prompt text with no such marking, so the text is all there is to recognise it by. Compared
 * against the rendered preset rather than against a copy of its words, so rewording the preset
 * cannot leave this behind — that drift would show up only as a lane on the Overview quietly
 * staying empty, which is the kind of bug nobody reports.
 *
 * Deliberately exact: a prompt that merely mentions the queue is not a drain, and mistaking one
 * for the other would name a ticket as being implemented by an agent doing something else entirely.
 */
export declare function drainsQueue(prompt: string): boolean;
/**
 * The presets the launcher offers, in the order it shows them.
 *
 * One list rather than a `launcher: true` flag on each row: membership and order are the same
 * decision, and a flag would have stated half of it while the order lived somewhere else. It is
 * also the answer to "which presets are user-facing" — `drainQueue` is absent because only the
 * daemon fires it, which previously had nothing marking it internal.
 */
export declare const LAUNCHER_PRESETS: readonly PresetDef[];
//# sourceMappingURL=preset-catalog.d.ts.map