// Tiny event bus for cross-component state (pending count, agent toggle, etc.). // No reactive framework — just publish/subscribe with last-value semantics. // // `state` is a plain mutable object for values that don't need subscriptions. // Set by the app router on each navigation; read by components like the rail. export const state = { spaceId: null, // string | null — ID of the currently active Space view: null, // { entityType, entityId } | null — entity focused in main panel }; const subs = new Map(); // event → Set const last = new Map(); // event → last value export function on(event, fn) { if (!subs.has(event)) subs.set(event, new Set()); subs.get(event).add(fn); if (last.has(event)) fn(last.get(event)); return () => subs.get(event).delete(fn); } export function emit(event, value) { last.set(event, value); const set = subs.get(event); if (set) for (const fn of set) fn(value); } export function get(event) { return last.get(event); }