Round 2 regression fixes: - B10 (INV-2 outbox, CRITICAL): wiring.ts — switch durable events from eventBus.publish (live-only) to eventIngestor.ingest (persistent) for debug.record.created and memory.promoted. Add required RuntimeEvent fields (id, source, route). - B12 (Scheduler events, CRITICAL): Scheduler.ts — replace all 4 eventBus.publish calls with eventIngestor.ingest + registered event types (task.started/task.failed/agent.lost/agent.cancelled). Remove unregistered task.status.changed references. - B15 (duplicate ProjectionClient): remove orphan tui/src/ProjectionClient.ts (zero references, superseded by runtime/src/projection/ProjectionClient.ts re-exported via @aircoding/runtime barrel). - RuntimeApp: wire Scheduler→WorkerManager in constructor; document start() bootstrap→recover→hydrate→ready sequence (DD §22.2). - createRuntime: read project_id from .air/shared/project.json (DD §6.1 stable UUID), fallback to Date.now() only if not initialized. - B16 (api_key strict): ProviderManager.get_or_create_adapter now calls ModelConfigLoader.validate() before passing raw api_key to adapter. Also fix from R1 regression: - ArchitectureDesigner: replace broken additive-heuristic risk scoring (single runtime file→replan, large refactor→confirmation only) with change-scope classification (contracts→confirmation, breaking→escalate, large→replan, safe→silent_continue). Remove dead evaluate_risk(). - MainAgent test: update confirmation test from old state name AWAITING_CONFIRMATION to canonical CONFIRMING (B13 state machine fix). Test: 148/148 pass (regression + e2e + llm + toolchain-cpp). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
41 lines
1.2 KiB
TypeScript
Executable File
41 lines
1.2 KiB
TypeScript
Executable File
/**
|
|
* ProjectionClient - In-process projection consumer for TUI
|
|
* DD §13.2. Runtime creates and wires this client to ProjectionStore.
|
|
* TUI imports this from runtime to receive projection updates.
|
|
*
|
|
* @module packages/runtime/src/projection/ProjectionClient
|
|
*/
|
|
|
|
import type { SessionProjection, ProjectionSubscriber } from './ProjectionStore.js'
|
|
|
|
export { type SessionProjection, type TaskProjection, type AgentProjection, type ProjectionSubscriber } from './ProjectionStore.js'
|
|
|
|
export class ProjectionClient {
|
|
private snapshot: SessionProjection | null = null
|
|
private subscribers: Set<ProjectionSubscriber> = new Set()
|
|
|
|
/**
|
|
* Receive and cache a projection snapshot (called by RuntimeApp).
|
|
*/
|
|
receive_snapshot(projection: SessionProjection): void {
|
|
this.snapshot = projection
|
|
for (const sub of this.subscribers) {
|
|
sub(projection)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Subscribe to projection updates.
|
|
*/
|
|
subscribe(subscriber: ProjectionSubscriber): () => void {
|
|
this.subscribers.add(subscriber)
|
|
return () => this.subscribers.delete(subscriber)
|
|
}
|
|
|
|
/**
|
|
* Get current snapshot.
|
|
*/
|
|
get_snapshot(): SessionProjection | null {
|
|
return this.snapshot
|
|
}
|
|
} |