/** Minimal session-side plugin lifecycle. The app owns every service and registry. */ export interface AppPlugin { id: string; setup(api: Api): void | Promise; } export interface AppInstance { readonly driver: Driver; activate(): void | Promise; api(owner: string): Api; close(): void; } export interface AppDefinition { id: string; create(): AppInstance; plugins: readonly AppPlugin[]; } export function defineApp(definition: AppDefinition): AppDefinition { return definition; } export function definePlugin(plugin: AppPlugin): AppPlugin { return plugin; } export class TestAppRuntime { readonly definition: AppDefinition; readonly driver: Driver; private readonly instance: AppInstance; constructor(definition: AppDefinition) { this.definition = definition; this.instance = definition.create(); this.driver = this.instance.driver; } async start(): Promise { for (const plugin of this.definition.plugins) await plugin.setup(this.instance.api(plugin.id)); await this.instance.activate(); } close(): void { this.instance.close(); } }