// src/flow/IShellRegistry.ts import type { IShellInfo } from './ShellRegistry'; /** * Interface for shell info registry (instance-based). * * ═══════════════════════════════════════════════════════════════════════════ * COLLECTOR PATTERN (Expert Panel 2024-12) * ═══════════════════════════════════════════════════════════════════════════ * * Joe Duffy (Midori OS): * "Separate 'collect metadata' from 'consume metadata'. Decorators * collect to a static queue; runtime consumes into an instance." * * This interface represents the CONSUMER side of the Collector Pattern: * - Decorators write to `ShellRegistry._pendingRegistrations` (static, write-only) * - `ShellRegistryComponent` implements this interface (instance, read-write) * - On bootstrap, component drains the pending queue and becomes authority * * This enables: * - Instance-based lookups (for test isolation) * - Multiple registries for different contexts * - Clean separation of collection and consumption * - No ambient authority - component must be passed explicitly * * Mark Miller (Capability Security): * "The interface represents the capability to access the registry. * Only code with a reference can query it. No global lookup." * ═══════════════════════════════════════════════════════════════════════════ */ export interface IShellRegistry { /** * Register shell info for a component type. * * Called via Matrix protocol (not decorators - those use static queue). * * @param componentClass - Component class name * @param info - Shell rendering info */ register(componentClass: string, info: IShellInfo): void; /** * Look up shell info for a component type. * * @param componentClass - Component class name * @returns Shell info or undefined if not registered */ lookup(componentClass: string): IShellInfo | undefined; /** * Check if a component type has registered shell info. * * @param componentClass - Component class name * @returns true if registered */ has(componentClass: string): boolean; /** * Get all registered component types. * * @returns Array of registered component class names */ getRegisteredTypes(): string[]; /** * Clear all registrations. * Primarily for testing. */ clear(): void; }