/**
 * Natural-language → cron expression translator. (`SCHED.3`)
 *
 * Pipeline: bounded NL input → escape into prompt template → dispatch through
 * the user's `fast_classifier` alias → first-line trim → 6-field-strip →
 * `node-cron.validate()` → return `{ cron, timezone?, nl_input, confidence }`.
 *
 * Model-neutrality contract (per `feedback_stop_haiku_drift` +
 * `project_opensquid_model_neutral_subagent_primitive`):
 *
 *   - NO vendor model id, no provider name, no host binary name appears in
 *     this file. The user's `models.yaml` maps the abstract alias name
 *     (default `fast_classifier`) to a concrete strategy.
 *   - Audit grep `haiku|sonnet|opus|gpt-[0-9]|claude-[0-9]|gemini` against
 *     this file must return zero hits.
 *
 * Prompt-engineering shape (locked per task spec):
 *
 *   - 5-field POSIX output ONLY. The prompt explicitly names "5-field POSIX
 *     cron", and we post-process to defend against models that ignore that.
 *   - "Output ONLY the cron expression with no other text" suffix —
 *     constrains chatter even on models that aren't instruction-tuned for
 *     this shape.
 *   - 4 worked examples covering minute-level + hourly + day-level + DOW
 *     filter — empirically the minimum spread that gets mid-size models to
 *     converge.
 *   - UTC default — most schedule consumers run in UTC; we add a separate
 *     `timezone` field if the NL input mentions one.
 *
 * Temperature / max_tokens: the spec wanted to set temperature=0.0 +
 * max_tokens=64 in the dispatch options. The current `ModelStrategy.call`
 * signature is `(prompt, { timeoutMs? })` — see `src/models/types.ts`. The
 * provider-specific knobs (`temperature`, `max_tokens`) are not yet plumbed
 * through. We document the intent in the prompt itself ("Output ONLY the
 * cron expression") and structurally bound the result via the first-line
 * trim + cron-validate. A follow-up task should extend `ModelStrategy.call`
 * opts to forward these and the prompt-level guard becomes redundant.
 *
 * Prompt-injection defence (per spec risk callout):
 *
 *   - 256-char input cap rejected BEFORE we ever build the prompt.
 *   - Substitution escapes `"` → `\"` and `\` → `\\` so a hostile NL input
 *     can't break out of the quoted `"{{nl}}"` slot in the template.
 *
 * Imports from: node-cron, ../models/dispatcher.js, ../models/load_config.js,
 *   ../models/types.js.
 * Imported by: src/cli.ts (`schedule add` handler) + tests.
 */
export declare const MAX_NL_INPUT_LEN = 256;
export interface NlScheduleResult {
    cron: string;
    timezone?: string;
    nl_input: string;
    confidence: 'high' | 'medium' | 'low';
}
export declare class InvalidScheduleInputError extends Error {
    constructor(message: string);
}
export declare class InvalidCronError extends Error {
    constructor(message: string);
}
export declare const PROMPT_TEMPLATE = "Convert the natural-language schedule into a 5-field POSIX cron expression.\nInput: \"{{nl}}\"\nOutput ONLY the cron expression with no other text. Use UTC unless input specifies a timezone.\nExamples:\n- \"every Monday morning around 9\" -> \"0 9 * * 1\"\n- \"every 5 minutes\" -> \"*/5 * * * *\"\n- \"daily at noon\" -> \"0 12 * * *\"\n- \"every weekday at 6pm\" -> \"0 18 * * 1-5\"";
/**
 * Escape backslash + double-quote in NL input before substitution. Order
 * matters: replace `\` first so the `\"` we emit doesn't get double-escaped.
 */
export declare function safeSubstitute(template: string, nl: string): string;
/**
 * Detect a timezone token in the ORIGINAL NL input (not in the model output —
 * the model is instructed to emit cron only). IANA `Region/City` form wins;
 * abbreviations map via `TZ_TOKEN_MAP`. Returns `undefined` if nothing
 * matches, in which case the caller defaults to UTC implicitly.
 */
export declare function detectTimezone(input: string): string | undefined;
/**
 * 5-field POSIX cron validator. Defends against 6-field (seconds-first)
 * shapes by stripping the leading field IF the trailing 5 fields validate,
 * else returning `null`.
 */
export declare function normalizeCronOutput(raw: string): string | null;
export interface NlToCronOptions {
    /** Override the alias the dispatcher resolves. Defaults to `fast_classifier`. */
    alias?: string;
    /** Per-call dispatch timeout. Defaults to 10 s — model output is < 64 tokens. */
    timeoutMs?: number;
}
export declare function nlToCron(input: string, options?: NlToCronOptions): Promise<NlScheduleResult>;
//# sourceMappingURL=schedule_nl.d.ts.map