UNPKG

@debugmcp/mcp-debugger

Version:

Run-time step-through debugging for LLM agents.

216 lines (215 loc) 7.11 kB
/** * Registry pattern for managing debug adapters * * The AdapterRegistry provides centralized management of language-specific * debug adapters, including registration, discovery, and lifecycle management. * * @since 2.0.0 */ import { IDebugAdapter, AdapterConfig } from './debug-adapter-interface.js'; /** * Registry for managing debug adapters across multiple languages */ export interface IAdapterRegistry { /** * Register a new adapter factory for a language * @param language Language identifier (e.g., 'python', 'node') * @param factory Factory to create adapter instances * @throws Error if language is already registered */ register(language: string, factory: IAdapterFactory): void; /** * Unregister an adapter factory * @param language Language identifier * @returns true if unregistered, false if not found */ unregister(language: string): boolean; /** * Create a new adapter instance for the specified language * @param language Language identifier * @param config Adapter configuration * @returns Initialized adapter instance * @throws AdapterNotFoundError if language not registered */ create(language: string, config: AdapterConfig): Promise<IDebugAdapter>; /** * Get list of all supported languages * @returns Array of registered language identifiers */ getSupportedLanguages(): string[]; /** * Check if a language is supported * @param language Language identifier * @returns true if language has a registered adapter */ isLanguageSupported(language: string): boolean; /** * Get metadata about a registered adapter * @param language Language identifier * @returns Adapter metadata or undefined if not found */ getAdapterInfo(language: string): AdapterInfo | undefined; /** * Get all registered adapter information * @returns Map of language to adapter info */ getAllAdapterInfo(): Map<string, AdapterInfo>; /** * Dispose all created adapters and clear registry */ disposeAll(): Promise<void>; /** * Get count of active adapter instances * @returns Number of adapters currently in use */ getActiveAdapterCount(): number; } /** * Factory interface for creating debug adapter instances */ export interface IAdapterFactory { /** * Create a new adapter instance with dependencies * @param dependencies Required dependencies for the adapter * @returns New adapter instance */ createAdapter(dependencies: AdapterDependencies): IDebugAdapter; /** * Get metadata about this adapter type * @returns Adapter metadata */ getMetadata(): AdapterMetadata; /** * Validate that the factory can create adapters in current environment * @returns Validation result with any warnings or errors */ validate(): Promise<FactoryValidationResult>; } /** * Dependencies injected into adapters */ export interface AdapterDependencies { fileSystem: IFileSystem; logger: ILogger; environment: IEnvironment; processLauncher: IProcessLauncher; networkManager?: INetworkManager; } /** * Metadata about an adapter */ export interface AdapterMetadata { /** Language identifier */ language: string; /** Display name for UI */ displayName: string; /** Adapter version */ version: string; /** Author/maintainer */ author: string; /** Description of adapter capabilities */ description: string; /** URL to documentation */ documentationUrl?: string; /** Minimum debugger version required */ minimumDebuggerVersion?: string; /** File extensions supported */ fileExtensions?: string[]; /** Icon for UI (base64 or URL) */ icon?: string; } /** * Combined adapter information (metadata + runtime info) */ export interface AdapterInfo extends AdapterMetadata { /** Whether adapter is currently available */ available: boolean; /** Number of active instances */ activeInstances: number; /** Last validation result */ lastValidation?: FactoryValidationResult; /** Registration timestamp */ registeredAt: Date; } /** * Factory validation result */ export interface FactoryValidationResult { /** Whether factory is valid and can create adapters */ valid: boolean; /** Any errors preventing adapter creation */ errors: string[]; /** Warnings that don't prevent creation */ warnings: string[]; /** Additional validation details */ details?: Record<string, unknown>; } /** * Base class for adapter factories (optional helper) */ export declare abstract class BaseAdapterFactory implements IAdapterFactory { protected metadata: AdapterMetadata; constructor(metadata: AdapterMetadata); getMetadata(): AdapterMetadata; validate(): Promise<FactoryValidationResult>; abstract createAdapter(dependencies: AdapterDependencies): IDebugAdapter; } /** * Registry configuration options */ export interface AdapterRegistryConfig { /** Whether to validate factories on registration */ validateOnRegister?: boolean; /** Whether to allow re-registration of languages */ allowOverride?: boolean; /** Maximum number of adapter instances per language */ maxInstancesPerLanguage?: number; /** Whether to auto-dispose unused adapters */ autoDispose?: boolean; /** Auto-dispose timeout in milliseconds */ autoDisposeTimeout?: number; } /** * Error thrown when requested adapter is not found */ export declare class AdapterNotFoundError extends Error { language: string; availableLanguages: string[]; constructor(language: string, availableLanguages: string[]); } /** * Error thrown when factory validation fails */ export declare class FactoryValidationError extends Error { language: string; validationResult: FactoryValidationResult; constructor(language: string, validationResult: FactoryValidationResult); } /** * Error thrown when trying to register duplicate language */ export declare class DuplicateRegistrationError extends Error { language: string; constructor(language: string); } /** * Check if an object implements IAdapterFactory */ export declare function isAdapterFactory(obj: unknown): obj is IAdapterFactory; /** * Check if an object implements IAdapterRegistry */ export declare function isAdapterRegistry(obj: unknown): obj is IAdapterRegistry; /** * Map of language to adapter factory */ export type AdapterFactoryMap = Map<string, IAdapterFactory>; /** * Map of language to active adapter instances */ export type ActiveAdapterMap = Map<string, Set<IDebugAdapter>>; import type { IFileSystem } from '../interfaces/external-dependencies.js'; import type { ILogger } from '../interfaces/external-dependencies.js'; import type { IEnvironment } from '../interfaces/external-dependencies.js'; import type { IProcessLauncher } from '../interfaces/process-interfaces.js'; import type { INetworkManager } from '../interfaces/external-dependencies.js';