Advertisement

← vibesdk

worker/agents/core/AgentComponent.ts

3.0 KB Download file
import { AgentInfrastructure } from './AgentCore';
import { StructuredLogger } from '../../logger';
import { WebSocketMessageType } from '../../api/websocketTypes';
import { WebSocketMessageData } from '../../api/websocketTypes';
import { FileManager } from '../services/implementations/FileManager';
import { DeploymentManager } from '../services/implementations/DeploymentManager';
import { GitVersionControl } from '../git';
import { AgentState, BaseProjectState } from './state';
import { WebSocketMessageResponses } from '../constants';

/**
 * Base class for all agent components (behaviors and objectives)
 * 
 * Provides common infrastructure access patterns via protected helpers.
 * 
 * Both BaseCodingBehavior and ProjectObjective extend this class to access:
 * - Core infrastructure (state, env, sql, logger)
 * - Services (fileManager, deploymentManager, git)
 */
export abstract class AgentComponent<TState extends BaseProjectState = AgentState> {
    constructor(protected readonly infrastructure: AgentInfrastructure<TState>) {}
    
    // ==========================================
    // PROTECTED HELPERS (Infrastructure access)
    // ==========================================
    
    protected get env(): Env {
        return this.infrastructure.env;
    }
    
    get logger(): StructuredLogger {
        return this.infrastructure.logger();
    }
    
    protected getAgentId(): string {
        return this.infrastructure.getAgentId();
    }
    
    public getWebSockets(): WebSocket[] {
        return this.infrastructure.getWebSockets();
    }

    protected get state(): TState {
        return this.infrastructure.state;
    }

    setState(state: TState): void {
        try {
            this.infrastructure.setState(state);
        } catch (error) {
            this.broadcastError("Error setting state", error);
            this.logger.error("State details:", {
                originalState: JSON.stringify(this.state, null, 2),
                newState: JSON.stringify(state, null, 2)
            });
        }
    }
    
    // ==========================================
    // PROTECTED HELPERS (Service access)
    // ==========================================
    
    protected get fileManager(): FileManager {
        return this.infrastructure.fileManager;
    }
    
    protected get deploymentManager(): DeploymentManager {
        return this.infrastructure.deploymentManager;
    }
    
    public get git(): GitVersionControl {
        return this.infrastructure.git;
    }

    protected broadcast<T extends WebSocketMessageType>(
        type: T, 
        data?: WebSocketMessageData<T>
    ): void {
        this.infrastructure.broadcast(type, data);
    }

    protected broadcastError(context: string, error: unknown): void {
        const errorMessage = error instanceof Error ? error.message : String(error);
        this.logger.error(`${context}:`, error);
        this.broadcast(WebSocketMessageResponses.ERROR, {
            error: `${context}: ${errorMessage}`
        });
    }
}