import { BaseMessage } from '@langchain/core/messages';
import { StructuredTool } from '@langchain/core/tools';
import { TransactionReceipt } from '@hashgraph/sdk';
import { HederaAgentKit, ServerSigner, TokenUsageCallbackHandler, TokenUsage, BasePlugin, CostCalculation } from 'hedera-agent-kit';
import { AIProvider, VercelAIProvider, BAMLProvider } from './providers';
import { Logger } from '@hashgraphonline/standards-sdk';
import { MCPServerConfig, MCPConnectionStatus } from './mcp/types';

export interface ToolFilterConfig {
    namespaceWhitelist?: string[];
    toolBlacklist?: string[];
    toolPredicate?: (tool: StructuredTool) => boolean;
}
export type ExecutionMode = 'direct' | 'bytes';
export type OperationalMode = 'autonomous' | 'returnBytes';
export interface HederaAgentConfiguration {
    signer: ServerSigner;
    execution?: {
        mode?: ExecutionMode;
        operationalMode?: OperationalMode;
        userAccountId?: string;
        scheduleUserTransactions?: boolean;
        scheduleUserTransactionsInBytesMode?: boolean;
    };
    ai?: {
        provider?: AIProvider;
        llm?: unknown;
        apiKey?: string;
        modelName?: string;
        temperature?: number;
    };
    filtering?: ToolFilterConfig;
    messaging?: {
        systemPreamble?: string;
        systemPostamble?: string;
        conciseMode?: boolean;
    };
    extensions?: {
        plugins?: BasePlugin[];
        mirrorConfig?: Record<string, unknown>;
        modelCapability?: string;
    };
    mcp?: {
        servers?: MCPServerConfig[];
        autoConnect?: boolean;
    };
    debug?: {
        verbose?: boolean;
        silent?: boolean;
    };
}
export interface ConversationContext {
    messages: BaseMessage[];
    metadata?: Record<string, unknown>;
}
export interface ChatResponse {
    output: string;
    message?: string;
    transactionBytes?: string;
    receipt?: TransactionReceipt | object;
    scheduleId?: string;
    transactionId?: string;
    notes?: string[];
    error?: string;
    intermediateSteps?: unknown;
    rawToolOutput?: unknown;
    tokenUsage?: TokenUsage;
    cost?: CostCalculation;
    metadata?: Record<string, unknown>;
    tool_calls?: Array<{
        id: string;
        name: string;
        args: Record<string, unknown>;
        output?: string;
    }>;
    [key: string]: unknown;
}
export interface UsageStats extends TokenUsage {
    cost: CostCalculation;
}
export declare abstract class BaseAgent {
    protected config: HederaAgentConfiguration;
    protected logger: Logger;
    protected agentKit: HederaAgentKit | undefined;
    protected tools: StructuredTool[];
    protected initialized: boolean;
    protected tokenTracker: TokenUsageCallbackHandler | undefined;
    constructor(config: HederaAgentConfiguration);
    abstract boot(): Promise<void>;
    abstract chat(message: string, context?: ConversationContext): Promise<ChatResponse>;
    abstract shutdown(): Promise<void>;
    abstract switchMode(mode: OperationalMode): void;
    abstract getUsageStats(): UsageStats;
    abstract getUsageLog(): UsageStats[];
    abstract clearUsageStats(): void;
    abstract connectMCPServers(): Promise<void>;
    abstract getMCPConnectionStatus(): Map<string, MCPConnectionStatus>;
    getCore(): HederaAgentKit | undefined;
    protected filterTools(tools: StructuredTool[]): StructuredTool[];
    protected buildSystemPrompt(): string;
    isReady(): boolean;
}
export type { AIProvider, VercelAIProvider, BAMLProvider };
