/** * ProjectionClient - Local TUI-side projection consumer. * TUI keeps a contracts-only copy of the ProjectionClient surface so it never imports runtime. * * @module packages/tui/src/ProjectionClient */ import type { ProjectionSubscriber, SessionProjection } from './types.js' export type { SessionProjection, TaskProjection, AgentProjection, ToolRunProjection, CommandRunProjection, ArtifactProjection, PermissionPromptProjection, BlockerProjection, ProjectionSubscriber, } from './types.js' export class ProjectionClient { private snapshot: SessionProjection | null = null private subscribers: Set = new Set() receive_snapshot(projection: SessionProjection): void { this.snapshot = projection for (const sub of this.subscribers) { sub(projection) } } subscribe(subscriber: ProjectionSubscriber): () => void { this.subscribers.add(subscriber) return () => this.subscribers.delete(subscriber) } get_snapshot(): SessionProjection | null { return this.snapshot } }