import { BaseMessage } from '@langchain/core/messages';
import { TokenCounter } from './TokenCounter';

/**
 * Result of adding a message to the memory window
 */
export interface AddMessageResult {
    /** Whether the message was successfully added */
    added: boolean;
    /** Messages that were pruned to make room */
    prunedMessages: BaseMessage[];
    /** Current token count after operation */
    currentTokenCount: number;
    /** Remaining token capacity */
    remainingCapacity: number;
}
/**
 * Memory window that manages conversation history with token-based size limits
 * Automatically prunes old messages to stay within token limits while preserving conversational context
 */
export declare class MemoryWindow {
    private messages;
    private maxTokens;
    private reserveTokens;
    private tokenCounter;
    private systemPrompt;
    private systemPromptTokens;
    static readonly DEFAULT_MAX_TOKENS = 8000;
    static readonly DEFAULT_RESERVE_TOKENS = 1000;
    static readonly PRUNING_BATCH_SIZE = 2;
    constructor(maxTokens?: number, reserveTokens?: number, tokenCounter?: TokenCounter);
    /**
     * Add a message to the memory window, pruning old messages if necessary
     * @param message - The message to add
     * @returns Result of the add operation including any pruned messages
     */
    addMessage(message: BaseMessage): AddMessageResult;
    /**
     * Prune old messages to fit within token limits
     * Removes messages in pairs to maintain conversational flow
     * @returns Array of pruned messages
     */
    pruneToFit(): BaseMessage[];
    /**
     * Get current token count including system prompt and messages
     * @returns Current token count
     */
    getCurrentTokenCount(): number;
    /**
     * Get remaining token capacity before hitting the reserve limit
     * @returns Remaining tokens that can be used
     */
    getRemainingTokenCapacity(): number;
    /**
     * Check if a message can be added without exceeding limits
     * @param message - The message to check
     * @returns True if message can be added within reserve limits
     */
    canAddMessage(message: BaseMessage): boolean;
    /**
     * Get all messages in the memory window
     * @returns Copy of current messages array
     */
    getMessages(): BaseMessage[];
    /**
     * Clear all messages from the memory window
     */
    clear(): void;
    /**
     * Set the system prompt and update token calculations
     * @param systemPrompt - The system prompt text
     */
    setSystemPrompt(systemPrompt: string): void;
    /**
     * Get the current system prompt
     * @returns Current system prompt
     */
    getSystemPrompt(): string;
    /**
     * Get current configuration
     * @returns Memory window configuration
     */
    getConfig(): {
        maxTokens: number;
        reserveTokens: number;
        currentTokens: number;
        messageCount: number;
        systemPromptTokens: number;
    };
    /**
     * Update token limits
     * @param maxTokens - New maximum token limit
     * @param reserveTokens - New reserve token amount
     */
    updateLimits(maxTokens: number, reserveTokens?: number): void;
    /**
     * Get statistics about the memory window
     * @returns Memory usage statistics
     */
    getStats(): {
        totalMessages: number;
        currentTokens: number;
        maxTokens: number;
        reserveTokens: number;
        systemPromptTokens: number;
        usagePercentage: number;
        remainingCapacity: number;
        canAcceptMore: boolean;
    };
    /**
     * Clean up resources
     */
    dispose(): void;
}
