/** * Plugins — dynamiczne ładowanie widgetów, funkcji, adapterów z zewnętrznych * źródeł (ESM remote modules). Framework dostarcza kontrakt + runtime ma * domyślny loader (`DefaultPluginLoader`), który używa dynamic import(). * * Bezpieczeństwo: każdy plugin musi pochodzić z whitelistowanej listy * URL-i / origin; runtime może (opcjonalnie) weryfikować subresource integrity * (SRI) hash przed załadowaniem. */ import type { Observable } from 'rxjs'; export type PluginKind = 'widget' | 'function' | 'adapter' | 'theme'; /** * Manifest pluginu — eksportowany z `?manifest` lub jako default * export modułu. Musi zawierać deklarację czego dostarcza i wersję protokołu. */ export interface PluginManifest { readonly id: string; readonly version: string; readonly protocol: '1'; readonly exports: readonly PluginExport[]; readonly dependsOn?: readonly string[]; readonly description?: string; readonly author?: string; } export interface PluginExport { readonly kind: PluginKind; readonly name: string; readonly description?: string; } export interface PluginModule { readonly manifest: PluginManifest; /** * Funkcja wywoływana przez runtime po załadowaniu modułu — dostaje * `registry` (subset PluginRegistry), żeby rejestrować widgety / funkcje / * adaptery. Zwraca opcjonalny teardown. */ activate(registry: PluginRegistrar): Promise<(() => void) | undefined> | (() => void) | undefined; } export interface PluginRegistrar { registerWidget(name: string, component: unknown): void; registerFunction(name: string, fn: unknown): void; registerAdapter(kind: string, impl: unknown): void; } export interface PluginLoaderOptions { /** Whitelista origin-ów. Loader rzuci jeśli URL nie pasuje. */ readonly allowedOrigins: readonly string[]; /** * Mapa SRI hashy (sha256) dla modułów. Gdy podana — moduły bez hasha są * odrzucane. Sprawdzany jest hash treści (fetch + SubtleCrypto) przed * dynamic import(). */ readonly integrity?: Readonly>; } export interface PluginLoader { load(url: string): Promise; unload(id: string): Promise; readonly loaded$: Observable; } export interface LoadedPlugin { readonly url: string; readonly manifest: PluginManifest; readonly teardown: (() => void) | null; } export declare class PluginError extends Error { readonly url: string; readonly cause?: unknown | undefined; constructor(message: string, url: string, cause?: unknown | undefined); } export declare const PLUGIN_LOADER: import("../index.js").EchelonToken; //# sourceMappingURL=index.d.ts.map