import type { AsyncJob, AsyncJobManager, SubagentRecord } from "../async/job-manager"; import type { CronJobView, JobsObserver } from "./jobs-observer"; import type { ObservableSession, SessionObserverRegistry } from "./session-observer-registry"; export type TaskStatus = "running" | "waiting" | "done" | "failed" | "cancelled"; export type TaskKind = "bash" | "subagent" | "cron"; export interface TaskRow { id: string; kind: TaskKind; label: string; status: TaskStatus; startedAt: number; resumable?: boolean; monitorOutputLines?: number; } export interface TasksSnapshot { rows: TaskRow[]; worstState: TaskStatus | "none"; failedUnacknowledged: boolean; } export declare const EMPTY_TASKS_SNAPSHOT: TasksSnapshot; export declare function mapAsyncJobStatus(status: AsyncJob["status"]): TaskStatus; export declare function mapSessionStatus(status: ObservableSession["status"]): TaskStatus; export declare function mapSubagentStatus(status: SubagentRecord["status"]): TaskStatus; export declare function mapCronStatus(cron: Pick): TaskStatus; /** Joins manager jobs, monitor/cron views, and live session metadata. Stable * subagent records are canonical for lifecycle state; the registry contributes * only the current display label and timestamp. */ export declare class TasksAggregator { #private; readonly manager: AsyncJobManager; readonly jobsObserver: JobsObserver; readonly sessions: SessionObserverRegistry; readonly ownerId?: string | undefined; constructor(manager: AsyncJobManager, jobsObserver: JobsObserver, sessions: SessionObserverRegistry, ownerId?: string | undefined); onChange(cb: () => void): () => void; getSnapshot(): TasksSnapshot; acknowledgeFailures(): void; dispose(): void; }