/** * Recognize an agent completion report written as PROSE, and reduce it to the * one thing a person asked for: the answer. * * reply-render.ts already strips the report's JSON form. The report has a * second form, and it is the one that reached the owner's phone: the base * agent prompt (agents/orchestrator-prompts.ts) asks every agent to close with * * - Summary: 1-2 sentences * - Changes: files created/modified * - Decisions: choices made + rationale * - Issues: problems encountered * - Uncertainties: anything the caller should verify * * so "Hey, are you there?" came back as a filled-in form with `Changes: None` * under it. That is an internal contract between an agent and the WRFC * controller. It belongs in the transcript and in operator surfaces; on a lock * screen it is paperwork where an answer should be. * * The source of that shape is fixed too (a conversational spawn no longer asks * for a report at all). This module is the boundary half of the same fix, and * it is deliberate duplication: any future prompt or archetype change can * reintroduce the shape, and no such change should be able to put a form back * on someone's phone. * * Pure string work, no I/O, no clock, no surface knowledge. */ interface HeadingLine { /** Normalized heading word, e.g. `summary`. */ readonly key: string; /** Text that followed the heading on the same line. */ readonly inline: string; } /** * Read one line as a report heading, or null. * * Two shapes count, and only these two: * 1. A markdown heading whose text is a report heading (`## Summary`). * 2. A label followed by a colon (`Summary:`, `- Summary:`, `**Summary**:`), * optionally as a list item. * * The colon requirement is what keeps a sentence that merely begins with the * word "Changes" from being read as a section boundary. */ export declare function readReportHeading(line: string): HeadingLine | null; /** * Replace a prose completion report with the answer it carries. * * Returns the text unchanged when it is not a report. When it IS one, the * result is the prose that preceded it plus the summary, and when the summary * says nothing, the result can legitimately be empty. Empty is honest; the * caller sends nothing rather than sending a form. */ export declare function stripProseCompletionReport(text: string): string; export {}; //# sourceMappingURL=completion-report-prose.d.ts.map