/**
 * Provider Adapter 抽象层类型定义
 * SDK 架构核心 —— 统一事件流接口
 *
 * 参考自 SpectrAI 项目的 adapter 设计，用于支持多种 AI Provider
 */
import { EventEmitter } from "node:events";
export type SessionStatus = "starting" | "thinking" | "tool_using" | "waiting_input" | "completed" | "terminated" | "error";
export type ProviderEventType = "ai_request" | "text_delta" | "thinking" | "command_output" | "tool_use_start" | "tool_use_end" | "permission_request" | "ask_user_question" | "exit_plan_mode" | "turn_complete" | "session_complete" | "error";
/**
 * Agent 工具动作类型分类
 * 用于细粒度显示 agent 当前正在执行的具体动作
 */
export type ToolActionType = "skill" | "mcp" | "idle" | "edit_file" | "write_file" | "read_file" | "bash" | "search" | "web" | "ai_request" | "lsp" | "notebook" | "other";
/**
 * 工具动作信息
 */
export interface ToolActionInfo {
    /** 动作类型分类 */
    actionType: ToolActionType;
    /** 动作显示标签（中文） */
    actionLabel: string;
    /** 具体描述（如文件名、命令等） */
    actionDetail?: string;
}
/**
 * MCP 元数据（从 SDK tool state.metadata 中提取）
 */
export interface ToolMetadata {
    /** MCP server 名称（如 "aws-mcp"） */
    mcpServer?: string;
    /** 其他元数据 */
    [key: string]: unknown;
}
/**
 * 脱敏终端剪贴板生成的临时 paste 文件路径。
 * 主流程：匹配 Windows/POSIX/裸目录形式 -> 替换为稳定占位符，避免临时文件路径进入日志与状态详情。
 */
export declare function redactTransientClipboardPastePaths(text: string): string;
/**
 * 判断输入是否只是终端剪贴板生成的临时 paste 文件路径。
 * 主流程：剥离包裹引号 -> 要求整串匹配，避免误拦截显式读取该文件的正常命令。
 */
export declare function isTransientClipboardPasteFilePath(text: string): boolean;
/**
 * 递归脱敏工具展示参数，保留真实执行输入不变，仅用于日志/状态/时间线展示。
 */
export declare function redactTransientClipboardPastePathsInValue(value: unknown): unknown;
export declare function getCanonicalMcpDetail(rawToolName: string): string;
/**
 * 根据工具名称获取动作类型信息
 * @param toolName 工具名称
 * @param toolInput 工具输入参数
 * @param metadata SDK 提供的元数据（可能包含 MCP server 信息）
 */
export declare function getToolActionInfo(toolName: string | undefined, toolInput?: Record<string, unknown>, metadata?: ToolMetadata): ToolActionInfo;
export interface RuntimeTokenUsage {
    inputTokens: number;
    outputTokens: number;
}
export type CommandOutputStream = "stdout" | "stderr" | "mixed";
export interface RuntimeStatusActionInfo {
    actionType?: ToolActionType;
    actionLabel?: string;
    actionDetail?: string;
    actionResult?: string;
    actionId?: string;
    usage?: RuntimeTokenUsage;
}
export interface ProviderEvent {
    type: ProviderEventType;
    sessionId: string;
    timestamp: string;
    data: {
        /** 文本内容（text_delta / thinking / error） */
        text?: string;
        /** AI 请求模型名称（ai_request） */
        model?: string;
        /** AI 请求 endpoint 摘要（ai_request，不含密钥） */
        endpoint?: string;
        /** AI 请求方法（ai_request） */
        requestMethod?: string;
        /** AI 请求完整 URL（ai_request，不含密钥） */
        requestUrl?: string;
        /** AI 请求头（ai_request，敏感值已脱敏） */
        requestHeaders?: Record<string, string>;
        /** AI 请求是否流式返回（ai_request）或命令输出流名（command_output） */
        stream?: boolean | CommandOutputStream;
        /** AI 请求上下文消息数量（ai_request） */
        messageCount?: number;
        /** AI 请求可用工具数量（ai_request） */
        toolCount?: number;
        /** AI 请求最后一条用户消息预览（ai_request） */
        lastUserMessagePreview?: string;
        /** AI 请求体完整 JSON（ai_request，不含 header/API key） */
        requestBody?: string;
        /** 工具名称（tool_use_start / tool_use_end） */
        toolName?: string;
        /** 工具输入参数（tool_use_start / ask_user_question / exit_plan_mode） */
        toolInput?: Record<string, unknown>;
        /** 工具执行结果（tool_use_end） */
        toolResult?: string;
        /** 工具调用是否出错（tool_use_end） */
        isError?: boolean;
        /** Token 用量（turn_complete） */
        usage?: RuntimeTokenUsage;
        /** AI 响应体完整 JSON（turn_complete，不含请求 header/API key） */
        responseBody?: string;
        /** AI 响应结束原因（turn_complete） */
        finishReason?: string;
        /** 退出码（session_complete） */
        exitCode?: number;
        /** 权限请求描述（permission_request） */
        permissionPrompt?: string;
        /** 工具调用 ID（关联 start/end） */
        toolUseId?: string;
        /** AskUserQuestion 的问题列表 */
        questions?: Array<{
            question: string;
            header?: string;
            options?: Array<{
                label: string;
                description?: string;
            }>;
            multiple?: boolean;
        }>;
        /** 工具动作类型（tool_use_start） */
        actionType?: ToolActionType;
        /** 工具动作显示标签（tool_use_start） */
        actionLabel?: string;
        /** 工具动作详情（tool_use_start） */
        actionDetail?: string;
        /** 工具调用关联 ID（tool_use_start / tool_use_end） */
        actionId?: string;
        /** 工具返回数据（tool_use_end） */
        actionResult?: string;
        /** 命令输出批次序号（command_output） */
        sequence?: number;
        /** 命令执行目录（command_output） */
        cwd?: string;
        /** 超长命令落盘路径（command_output） */
        commandFilePath?: string;
        /** 命令行数（command_output） */
        commandLineCount?: number;
    };
}
export interface AdapterSessionConfig {
    /** CLI 命令（支持绝对路径） */
    command: string;
    /** 工作目录 */
    workingDirectory: string;
    /** 初始 prompt（创建会话后自动发送） */
    initialPrompt?: string;
    /** 初始 prompt 是否显示为用户消息 */
    initialPromptVisibility?: "visible" | "hidden";
    /** 是否自动确认所有工具调用 */
    autoAccept: boolean;
    /** 系统提示注入 */
    systemPrompt?: string | {
        type: string;
        preset: string;
        append: string;
    };
    /** 模型名称覆盖 */
    model?: string;
    /** 最大对话轮次（0=无限） */
    maxTurns?: number;
    /** 允许的工具列表（空=全部） */
    allowedTools?: string[];
    /** MCP 配置路径 */
    mcpConfigPath?: string;
    /** Provider 特定参数 */
    providerArgs?: string[];
    /** 环境变量覆盖 */
    envOverrides?: Record<string, string>;
    /** 额外 MCP 服务器 */
    extraMcpServers?: Record<string, unknown>;
    /** Node.js 版本 */
    nodeVersion?: string;
    /** Claude Code 可执行文件路径 */
    executablePath?: string;
    /** git-bash 路径（仅 Windows） */
    gitBashPath?: string;
    /** 工作区内额外目录 */
    additionalDirectories?: string[];
}
export interface AdapterSession {
    /** 内部会话 ID */
    sessionId: string;
    /** Provider 端的会话 ID（用于恢复） */
    providerSessionId?: string;
    /** 当前状态 */
    status: SessionStatus;
    /** 对话消息历史 */
    messages: ConversationMessage[];
    /** 创建时间 */
    createdAt: string;
    /** 累计 Token 用量 */
    totalUsage: {
        inputTokens: number;
        outputTokens: number;
    };
    /** SDK 进程 PID（用于检测进程是否存活） */
    pid?: number;
}
export interface ConversationMessage {
    id: string;
    sessionId: string;
    role: "user" | "assistant" | "tool_use" | "tool_result";
    content: string;
    timestamp: string;
    /** 工具名称（tool_use / tool_result） */
    toolName?: string;
    /** 工具输入参数（tool_use） */
    toolInput?: Record<string, unknown>;
    /** 工具结果（tool_result） */
    toolResult?: string;
    /** 是否出错（tool_result） */
    isError?: boolean;
    /** 工具调用 ID */
    toolUseId?: string;
}
export interface PermissionRequest {
    sessionId: string;
    toolName: string;
    toolInput: Record<string, unknown>;
    permissionPrompt?: string;
}
export interface AskUserQuestionRequest {
    sessionId: string;
    questions: Array<{
        question: string;
        header?: string;
        options?: Array<{
            label: string;
            description?: string;
        }>;
        multiple?: boolean;
    }>;
}
/**
 * Provider Adapter 基类
 *
 * 每个 AI CLI 工具对应一个 Adapter 实现，负责：
 * 1. 管理 CLI 进程/SDK 客户端的生命周期
 * 2. 将 Provider 特定的消息格式转换为统一的 ProviderEvent
 * 3. 维护对话消息历史
 *
 * 事件:
 * - 'event'(ProviderEvent) — 统一事件流
 * - 'status-change'(sessionId, SessionStatus) — 会话状态变更
 * - 'permission-request'(PermissionRequest) — 权限确认请求
 * - 'ask-user-question'(AskUserQuestionRequest) — 用户问答请求
 */
export declare abstract class BaseProviderAdapter extends EventEmitter {
    /** Provider 唯一标识（如 'claude-code', 'opencode'） */
    abstract readonly providerId: string;
    /** 友好名称（如 'Claude Code', 'OpenCode'） */
    abstract readonly displayName: string;
    /**
     * 启动新会话
     * @param sessionId 内部会话 ID
     * @param config 会话配置
     */
    abstract startSession(sessionId: string, config: AdapterSessionConfig): Promise<void>;
    /**
     * 发送用户消息（触发新一轮对话）
     * @param sessionId 会话 ID
     * @param message 用户消息文本
     */
    abstract sendMessage(sessionId: string, message: string): Promise<void>;
    /**
     * 回应权限确认请求
     * @param sessionId 会话 ID
     * @param accept true=允许, false=拒绝
     */
    abstract sendConfirmation(sessionId: string, accept: boolean): Promise<void>;
    /**
     * 回答 AskUserQuestion
     * @param sessionId 会话 ID
     * @param answers 答案映射
     */
    abstract sendQuestionAnswer?(sessionId: string, answers: Record<string, string>): Promise<void>;
    /**
     * 设置空闲命令配置（用于SDK模式）
     * 当 AI 进入 waiting_input 状态时，自动执行这些命令
     * @param sessionId 会话 ID
     * @param commands 空闲命令配置
     */
    abstract setIdleCommands?(sessionId: string, commands: {
        idleInputCommand: string;
        nonInputCommand: string;
    }): void;
    /**
     * 发送快捷键 token 序列（如 [enter]、[ctrl+c]），复用 SDK 输入流但不创建普通用户消息。
     * @param sessionId 会话 ID
     * @param command 快捷 token 文本
     */
    abstract sendShortcutInput?(sessionId: string, command: string): Promise<void>;
    /**
     * 中止当前正在执行的轮次（软中断）
     * 会话保持活跃，用户可继续发送新消息。
     * @param sessionId 会话 ID
     */
    abstract abortCurrentTurn(sessionId: string): Promise<void>;
    /**
     * 重置当前会话上下文但保留 SDK 会话本身。
     */
    abstract resetContext?(sessionId: string): Promise<void>;
    /**
     * 终止会话
     * @param sessionId 会话 ID
     */
    abstract terminateSession(sessionId: string): Promise<void>;
    /**
     * 恢复之前的会话
     * @param sessionId 内部会话 ID
     * @param providerSessionId Provider 端的会话 ID
     * @param config 会话配置
     */
    abstract resumeSession?(sessionId: string, providerSessionId: string, config: AdapterSessionConfig): Promise<void>;
    /**
     * 获取指定会话的对话历史
     * @param sessionId 会话 ID
     */
    abstract getConversation(sessionId: string): ConversationMessage[];
    /**
     * 检查会话是否存在且活跃
     * @param sessionId 会话 ID
     */
    abstract hasSession(sessionId: string): boolean;
    /**
     * 获取会话的 Provider 端会话 ID（用于恢复）
     */
    abstract getProviderSessionId(sessionId: string): string | undefined;
    /**
     * 获取会话状态
     */
    abstract getSessionStatus(sessionId: string): SessionStatus | undefined;
    /**
     * 获取会话的 SDK 进程 PID（用于孤儿进程检测）
     */
    abstract getSessionPid?(sessionId: string): number | undefined;
    /**
     * 清理所有资源（应用退出时调用）
     */
    abstract cleanup(): void;
}
//# sourceMappingURL=types.d.ts.map