/**
 * autonomousHeartbeatScrub — the deterministic boundary scrub for the
 * AutonomousProgressHeartbeat's interpolated `focus`.
 *
 * Per docs/specs/autonomous-progress-heartbeat.md §Content, `focus` is
 * LLM-derived from conversation/feedback content and therefore
 * attacker-influenceable. Before it is used in the message AND before it is
 * stored into the status route's `lastEmits`, it MUST pass this deterministic
 * boundary scrub:
 *   - run it through the credential/secret/path regex set (reuse of the
 *     credential-leak-detector / PolicyEnforcementLayer patterns);
 *   - on ANY match, DROP focus entirely (the caller falls back to the generic
 *     line) — never emit partially-redacted attacker content;
 *   - length-clamp to ≤200 chars;
 *   - HTML-escape for the Telegram formatter (the message is sent on the
 *     `isProxy` path; focus is interpolated).
 *
 * This is a BOUNDARY SCRUB — a deterministic structural validator, not a new
 * LLM gate — and is therefore signal-vs-authority compliant.
 */
/** Max length of the (post-clamp, pre-escape) focus string. */
export declare const FOCUS_MAX_LENGTH = 200;
/** True if `text` matches any credential/secret/path pattern → focus must drop. */
export declare function focusHasScrubMatch(text: string): boolean;
export interface ScrubResult {
    /** The HTML-escaped, length-clamped focus to interpolate — or null to drop. */
    focus: string | null;
    /** Why focus was dropped (for the status route / observability). */
    dropped: boolean;
    /** The reason a drop happened: 'scrub-match' | 'empty'. Absent when kept. */
    reason?: 'scrub-match' | 'empty';
}
/**
 * Apply the boundary scrub to a raw focus string.
 *  - empty/whitespace → dropped (reason 'empty').
 *  - any scrub match → dropped (reason 'scrub-match') — never partially redacted.
 *  - otherwise → length-clamped to FOCUS_MAX_LENGTH then HTML-escaped.
 *
 * Length-clamp happens BEFORE escape so the 200-char budget is over the visible
 * text, not the escaped expansion. The scrub runs over the RAW text (before
 * clamp) so a secret split across the clamp boundary still trips a pattern.
 */
export declare function scrubFocus(raw: string | null | undefined): ScrubResult;
//# sourceMappingURL=autonomousHeartbeatScrub.d.ts.map