import type { AutomaticStudyAnalysisView } from "./study-analysis-job.js"; export declare const RUN_DETAIL_SCHEMA = "humanish.run-detail.v1"; /** A participant's most recent recorded thinking. Quoted, never summarized. */ export interface RunThought { /** The provider's reasoning summary, verbatim. */ text: string; /** Its own heading, when the provider gave one ("reasoning turn 25"). */ title?: string; at?: string; } export interface RunParticipant { /** Stream id — stable within a run, and what distinguishes lanes of one study. */ id: string; /** What to call them on screen: the lane's own label, else the persona id. */ label: string; /** The persona id, when the trace recorded one. */ personaId?: string; /** * The persona's declared traits (`patience:medium`, `skill:medium`, …). This is the abbreviated * persona a reader actually wants beside a live thought — it says who is struggling, which a * name alone does not. */ traits: string[]; /** `running`, `passed`, `failed`, `contract_proof_only` — the lane's own word for itself. */ status?: string; /** Why the actor stopped, when it has. */ completionReason?: string; thought?: RunThought; turns?: number; actions?: number; /** * Thoughts recorded so far. The mid-run flush carries the trace ITEMS but not the `counts` block, * so a live participant has no turn count to show — but the thoughts can be counted directly, and * "8 thoughts" is a true statement about progress rather than an inferred turn number. */ thoughts?: number; /** `null` when declared absent; absent when never recorded. Never coerced to 0. */ estimatedCostUsd?: number | null; } export interface RunDetail { automaticAnalysis?: AutomaticStudyAnalysisView; schema: typeof RUN_DETAIL_SCHEMA; runId: string; participants: RunParticipant[]; /** * Repo-relative path to this run's self-contained Observer artifact, when it has been written. * The terminal cannot show screenshots; this is where the operator goes for the pictures. */ observerPath?: string; } /** * Read one run's participants. Returns null when the run has no readable bundle yet — an ordinary * state for a run that has just started, not a failure. * * Reads the bundle NARROWLY rather than through `loadRunBundle`, which applies the strict * evidence-of-record guard. That guard is right for verification and wrong here: a mid-run flush is * a partial document by definition, so validating it as a complete bundle would make the live view * — the only view that needs this — the one case that never renders. Nothing read here is treated * as a claim about what a participant did; it is what to put on a screen. */ export declare function readRunDetail(cwdInput: string, runId: string): Promise;