export type ContributionData = | null | boolean | number | string | ReadonlyArray | { readonly [key: string]: ContributionData }; export interface Contribution { readonly id: string; readonly label: string; readonly data?: Data; } export interface PluginDefinition { readonly id: string; readonly version: string; readonly requires?: ReadonlyArray; readonly provides?: Readonly>; readonly activate: (context: PluginActivationContext) => void | Promise; } export interface PluginActivationContext { readonly resolve: (capability: string) => Service; readonly register: { (slot: string, contribution: Contribution): void; (slot: string, contribution: Contribution, value: Value): void; }; readonly onDispose: (finalizer: () => void | Promise) => void; } export interface PluginRuntimeContributionSnapshot { readonly generation: number; readonly entries: ReadonlyArray; } export interface PluginRuntimeSnapshot { readonly active: ReadonlyArray; readonly blocked: Readonly>>; readonly contributions: Readonly>>>; } export interface PluginRuntimeOptions { readonly validateSnapshot?: (snapshot: PluginRuntimeSnapshot) => void; readonly onLifecycle?: (event: { readonly phase: "activate" | "deactivate"; readonly pluginId: string; }) => void; readonly onLifecycleError?: (event: { readonly phase: "activate" | "deactivate"; readonly pluginId: string; readonly error: unknown; }) => void; readonly onCleanupError?: (event: { readonly phase: "retire" | "rollback"; readonly error: unknown; }) => void; }