@vfarcic/dot-ai
Version:
AI-powered development productivity platform that enhances software development workflows through intelligent automation and AI-driven assistance
178 lines • 6.07 kB
TypeScript
/**
* Plugin Manager for dot-ai Plugin System
*
* Discovers plugins at startup and manages tool routing.
* Provides discovered tools to the MCP server for registration.
*
* PRD #343: kubectl Plugin Migration
*
* Background Retry: If plugins aren't ready at startup, discovery continues
* in the background every 30 seconds. MCP server starts immediately and
* remains observable via the version tool.
*/
import { PluginConfig, DiscoveredPlugin, InvokeResponse } from './plugin-types';
import { Logger } from './error-handling';
import { AITool, ToolExecutor } from './ai-provider.interface';
/**
* Callback invoked when a plugin is discovered in the background
*/
export type PluginDiscoveredCallback = (plugin: DiscoveredPlugin) => void;
/**
* Error thrown when plugin discovery fails
*/
export declare class PluginDiscoveryError extends Error {
readonly failedPlugins: Array<{
name: string;
error: string;
}>;
constructor(message: string, failedPlugins: Array<{
name: string;
error: string;
}>);
}
/**
* Manages plugin discovery, registration, and tool routing
*/
export declare class PluginManager {
private readonly logger;
private readonly plugins;
private readonly discoveredPlugins;
private readonly toolToPlugin;
/** Plugins pending background discovery */
private pendingPlugins;
/** Background retry timer */
private backgroundRetryTimer;
/** When background retry started */
private backgroundRetryStartTime;
/** Callback for background discovery */
private onPluginDiscovered;
constructor(logger: Logger);
/**
* Parse plugin configuration from file
*
* Reads from /etc/dot-ai/plugins.json (mounted from ConfigMap in K8s).
* Returns empty array if file doesn't exist (plugins only work in-cluster).
* Throws on invalid JSON or malformed plugin configuration.
*/
static parsePluginConfig(): PluginConfig[];
/**
* Set callback for when plugins are discovered in the background
*
* This allows the MCP server to register new tools when plugins
* become available after initial startup.
*/
setOnPluginDiscovered(callback: PluginDiscoveredCallback): void;
/**
* Discover all configured plugins
*
* Does a quick initial discovery attempt (2 retries, 1s apart).
* Plugins that fail are queued for background retry.
* Required plugins that fail will throw PluginDiscoveryError.
*
* Call startBackgroundDiscovery() after this to enable background retries.
*/
discoverPlugins(configs: PluginConfig[]): Promise<void>;
/**
* Start background discovery for plugins that failed initial discovery
*
* Retries every 30 seconds for up to 10 minutes.
* When a plugin is discovered, calls the onPluginDiscovered callback.
*/
startBackgroundDiscovery(): void;
/**
* Stop background discovery
*/
stopBackgroundDiscovery(): void;
/**
* Get pending plugins that are still awaiting discovery
*/
getPendingPlugins(): string[];
/**
* Check if background discovery is active
*/
isBackgroundDiscoveryActive(): boolean;
/**
* Schedule the next background retry attempt
*/
private scheduleBackgroundRetry;
/**
* Run a background retry attempt for all pending plugins
*/
private runBackgroundRetry;
/**
* Quick discovery attempt for a single plugin
*
* Does 2 retries with 1 second delay. Returns true if discovered,
* false if should be queued for background retry.
*/
private discoverPluginQuick;
/**
* Get all discovered tools as AITool format for registration
*
* Only returns tools where the tool-to-plugin mapping is canonical.
* This filters out duplicate tools when multiple plugins define the same tool name.
*/
getDiscoveredTools(): AITool[];
/**
* Get tools from a specific plugin
*/
getPluginTools(pluginName: string): AITool[];
/**
* Check if a tool is provided by a plugin
*/
isPluginTool(toolName: string): boolean;
/**
* Get the plugin name for a tool
*/
getToolPlugin(toolName: string): string | undefined;
/**
* Invoke a tool on a specific plugin (explicit routing)
*
* PRD #359: Unified plugin invocation with explicit plugin specification.
* Use this when you know which plugin provides the tool, avoiding
* ambiguity when multiple plugins might have tools with the same name.
*/
invokeToolOnPlugin(pluginName: string, toolName: string, args: Record<string, unknown>, state?: Record<string, unknown>, sessionId?: string): Promise<InvokeResponse>;
/**
* Create a ToolExecutor that routes plugin tools to plugins
*
* Returns a function compatible with toolLoop's toolExecutor parameter.
* Plugin tools are routed to their plugins via HTTP; non-plugin tools
* are routed to the optional fallback executor.
*
* @param fallbackExecutor Optional executor for non-plugin tools
* @returns ToolExecutor function for use in agentic tool loops
*/
createToolExecutor(fallbackExecutor?: ToolExecutor): ToolExecutor;
/**
* Get list of discovered plugin names
*/
getDiscoveredPluginNames(): string[];
/**
* Get discovered plugin metadata
*/
getDiscoveredPlugin(name: string): DiscoveredPlugin | undefined;
/**
* Get all discovered plugins
*/
getAllDiscoveredPlugins(): DiscoveredPlugin[];
/**
* Get plugin statistics
*/
getStats(): {
pluginCount: number;
toolCount: number;
plugins: Array<{
name: string;
version: string;
toolCount: number;
}>;
pendingDiscovery: string[];
backgroundDiscoveryActive: boolean;
};
/**
* Convert PluginToolDefinition to AITool format
*/
private convertToAITool;
}
//# sourceMappingURL=plugin-manager.d.ts.map