/** * Process-wide store for transient progress bars in the footer: first-run * downloads of the external tool binaries (fd, rg, the semantic-index engine), * the semantic index build, and `/learn` reading session transcripts. * * Modeled on `taskStore` — a singleton the footer reads directly and re-renders * on change — but deliberately separate from it: this is short-lived status, * not agent work, so it must never render as a task-panel plan row. Entries are * keyed so several concurrent jobs each own a stable footer line; a caller * removes its key when the work settles and the line disappears. * * Most entries are startup work, and `clear()` drops them when the first user * turn begins. A caller running later (a slash command, say) owns its key for * the length of its own await and must remove it in a `finally`, so a failure * cannot strand a bar in the footer. */ export type StartupProgress = { readonly key: string; kind: "download"; label: string; receivedBytes: number; totalBytes: number | null; } | { readonly key: string; kind: "work"; label: string; done: number; total: number; unit: string; } | { readonly key: string; kind: "error"; label: string; message: string; }; type Listener = () => void; declare class StartupProgressStore { private readonly entries; private readonly listeners; /** Insert or replace the entry for its key. */ set(entry: StartupProgress): void; /** Drop a key's line once its work settled (download done, index ready/skipped). */ remove(key: string): void; /** Wipe everything — called when the first user turn starts (transient startup status). */ clear(): void; list(): readonly StartupProgress[]; subscribe(listener: Listener): () => void; private emit; } /** Shared, process-wide startup-progress store. */ export declare const startupProgress: StartupProgressStore; export {}; //# sourceMappingURL=startup-progress.d.ts.map