/**
 * ProjectRegistry — project-level aggregation over the trace corpus.
 *
 * Thin reader over TraceStore that answers the questions a chat-first,
 * resumable UI needs:
 *   - listProjects() → project IDs with latest activity
 *   - projectTimeline(id) → chats + builds + runtime runs, chronological
 *   - projectChats(id) → chat-level summaries (turn count, outcome)
 *
 * All queries are pure reads; no state duplication.
 */
import type { Run } from '../trace/schema';
import type { TraceStore } from '../trace/store';
export interface ProjectSummary {
    projectId: string;
    chatCount: number;
    buildCount: number;
    appRuntimeCount: number;
    lastActivityAt: number;
    latestChatId?: string;
    latestOutcome?: {
        pass: boolean;
        score?: number;
    };
}
export interface ChatSummary {
    chatId: string;
    projectId: string;
    builderRunId: string;
    startedAt: number;
    endedAt?: number;
    status: Run['status'];
    outcome?: Run['outcome'];
    /** Counts of spans emitted during the chat. */
    llmTurns?: number;
    toolCalls?: number;
    buildRunId?: string;
    appRuntimeRunIds: string[];
}
export interface ProjectTimelineEntry {
    run: Run;
    layerBucket: 'chat' | 'build' | 'runtime' | 'other';
}
export declare class ProjectRegistry {
    private store;
    constructor(store: TraceStore);
    listProjects(): Promise<ProjectSummary[]>;
    projectTimeline(projectId: string): Promise<ProjectTimelineEntry[]>;
    projectChats(projectId: string): Promise<ChatSummary[]>;
}
//# sourceMappingURL=project-registry.d.ts.map