/**
 * SessionReplyExtractor — pull the FINAL assistant message out of a completed
 * mentee session's persisted transcript, instead of racing the live tmux pane.
 *
 * The mentor cycle's reply leg (MENTOR-LIVE-READINESS-SPEC §Recipient side)
 * spawns a mentee session and needs its reply. Reading the tmux pane after the
 * session completes is racy (the reaper removes the pane first → empty capture)
 * AND yields raw stream JSON rather than clean prose. The transcript files
 * persist the assistant's final message verbatim:
 *
 *   - Codex: the rollout JSONL carries
 *     `{"type":"event_msg","payload":{"type":"task_complete","last_agent_message":"…"}}`
 *     (the cleanest source); fallbacks are the last `agent_message` event or the
 *     last `response_item` message with role=assistant.
 *   - Claude Code: the session JSONL carries assistant turns; the last
 *     assistant text block is the reply.
 *
 * Both extractors are pure (string in → string|null out), tolerant of
 * malformed/partial lines, and return null when no assistant text is present
 * (the caller then falls back to the tmux capture).
 */
/** Extract the final assistant message from a Codex rollout JSONL file's content. */
export declare function extractCodexFinalMessage(content: string): string | null;
/**
 * Extract the final assistant message from a Claude Code session JSONL
 * transcript's content. Claude JSONL rows are one JSON object per line; an
 * assistant turn has `{type:'assistant', message:{content:[{type:'text',text}]}}`
 * (or a string content). Returns the last assistant text block.
 */
export declare function extractClaudeFinalMessage(content: string): string | null;
/**
 * Locate a Claude Code session's transcript file by its session id, scanning
 * ONLY the immediate layout Claude Code actually uses:
 * `<projectsDir>/<encoded-cwd>/<claudeSessionId>.jsonl` (depth 1), plus the
 * root defensively.
 *
 * Why not a recursive walk: `~/.claude/projects` accumulates >10k nested
 * directories across many encoded-cwd subtrees on a busy agent. A depth-first
 * walk with any finite iteration guard exhausts the guard deep inside an
 * unrelated subtree before it ever reaches the right subdir — so it returns
 * "not found" even though the file is sitting one level down. That was the
 * exact bug that made Stage-A prompt capture silently return empty. Scanning
 * the immediate children is both correct (matches Claude's real layout) and
 * O(number-of-projects) instead of O(every-nested-dir).
 *
 * Pure w.r.t. inputs (no globals); returns the absolute path or null.
 */
export declare function findClaudeTranscriptShallow(projectsDir: string, claudeSessionId: string): string | null;
//# sourceMappingURL=SessionReplyExtractor.d.ts.map