@tencent-ai/cloud-agent-sdk 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"MockAgentProvider-D-basTXz.cjs","names":["z"],"sources":["../../agent-provider/src/common/_legacy/tool-schemas.ts","../../agent-provider/src/common/_legacy/MockAgentProvider.ts"],"sourcesContent":["/**\n * ACP Tool Input/Output Schema 定义\n *\n * 用于约束 ACP 协议中 ToolCallUpdate 的 rawInput 和 rawOutput 字段\n * 基于 getCraftToolProvider 使用的工具定义\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// 基础类型\n// ============================================================================\n\n/**\n * 工具类型标识\n */\nexport type ToolName =\n | 'list_dir'\n | 'search_file'\n | 'read_file'\n | 'read_lints'\n | 'rag_search'\n | 'read_rules'\n | 'mcp_get_tool_description'\n | 'mcp_call_tool'\n | 'fetch_mcp_resource'\n | 'create_rule'\n | 'update_memory'\n | 'search_content'\n | 'write_to_file'\n | 'replace_in_file'\n | 'delete_file'\n | 'execute_command'\n | 'preview_url'\n | 'ask_followup_question'\n | 'invoke_integration'\n | 'call_integration'\n | 'search_integration_tool'\n | 'supabase_get_logs'\n | 'supabase_execute_sql'\n | 'supabase_apply_migration'\n | 'supabase_list_migration'\n | 'supabase_list_tables'\n | 'cloud_studio_fetch_log'\n | 'cloud_studio_execute_command'\n | 'cloud_studio_deploy_sandbox'\n | 'component_get_prompt'\n | 'web_fetch'\n | 'use_skill'\n | 'web_search'\n | 'task'\n | 'codebase_search'\n | 'lsp'\n | 'spec_create'\n | 'spec_update';\n\n// ============================================================================\n// 工具输入类型定义\n// ============================================================================\n\nexport interface ListDirInput {\n target_directory: string;\n ignore_globs?: string;\n}\n\nexport interface SearchFileInput {\n target_directory: string;\n pattern: string;\n recursive: boolean;\n caseSensitive: boolean;\n}\n\nexport interface ReadFileInput {\n filePath: string;\n offset?: number;\n limit?: number;\n}\n\nexport interface ReadLintsInput {\n paths?: string;\n}\n\nexport interface RagSearchInput {\n queryString: string;\n knowledgeBaseNames: string;\n}\n\nexport interface ReadRulesInput {\n ruleNames: string;\n}\n\nexport interface McpGetToolDescriptionInput {\n toolRequests: string;\n}\n\nexport interface McpCallToolInput {\n serverName: string;\n toolName: string;\n arguments: string;\n maxOutputLength?: number;\n}\n\nexport interface FetchMcpResourceInput {\n server: string;\n uri: string;\n arguments?: Record<string, unknown>;\n downloadPath?: string;\n}\n\nexport interface CreateRuleInput {\n ruleScope: string;\n ruleName: string;\n ruleType: string;\n ruleContent: string;\n ruleDescription?: string;\n}\n\nexport interface UpdateMemoryInput {\n action?: 'create' | 'update' | 'delete';\n existing_knowledge_id?: string;\n knowledge_to_store?: string;\n title?: string;\n}\n\nexport interface SearchContentInput {\n pattern: string;\n directory: string;\n fileTypes?: string;\n contextBefore?: number;\n contextAfter?: number;\n contextAround?: number;\n outputMode?: string;\n caseSensitive?: boolean;\n}\n\nexport interface WriteToFileInput {\n filePath: string;\n content: string;\n}\n\nexport interface ReplaceInFileInput {\n filePath: string;\n old_str: string;\n new_str: string;\n}\n\nexport interface DeleteFileInput {\n target_file: string;\n explanation?: string;\n}\n\nexport interface ExecuteCommandInput {\n command: string;\n requires_approval: boolean;\n}\n\nexport interface PreviewUrlInput {\n url: string;\n}\n\nexport interface AskFollowupQuestionInput {\n questions: Array<{\n question: string;\n header: string;\n options: Array<{\n label: string;\n description: string;\n }>;\n multiSelect?: boolean;\n }>;\n}\n\nexport interface InvokeIntegrationInput {\n [key: string]: unknown;\n}\n\nexport interface CallIntegrationInput {\n [key: string]: unknown;\n}\n\nexport interface SearchIntegrationToolInput {\n [key: string]: unknown;\n}\n\nexport interface SupabaseGetLogsInput {\n [key: string]: unknown;\n}\n\nexport interface SupabaseExecuteSqlInput {\n [key: string]: unknown;\n}\n\nexport interface SupabaseApplyMigrationInput {\n [key: string]: unknown;\n}\n\nexport interface SupabaseListMigrationInput {\n [key: string]: unknown;\n}\n\nexport interface SupabaseListTablesInput {\n [key: string]: unknown;\n}\n\nexport interface CloudStudioFetchLogInput {\n [key: string]: unknown;\n}\n\nexport interface CloudStudioExecuteCommandInput {\n [key: string]: unknown;\n}\n\nexport interface CloudStudioDeploySandboxInput {\n [key: string]: unknown;\n}\n\nexport interface ComponentGetPromptInput {\n [key: string]: unknown;\n}\n\nexport interface WebFetchInput {\n url: string;\n fetchInfo: string;\n}\n\nexport interface UseSkillInput {\n command: string;\n}\n\nexport interface WebSearchInput {\n explanation: string;\n searchTerm: string;\n}\n\nexport interface TaskInput {\n subagent_name: string;\n description: string;\n prompt: string;\n subagent_path?: string;\n}\n\nexport interface CodebaseSearchInput {\n query: string;\n path: string;\n limit?: number;\n}\n\nexport interface LspInput {\n [key: string]: unknown;\n}\n\nexport interface SpecCreateInput {\n name: string;\n overview: string;\n relative_history: string;\n}\n\nexport interface SpecUpdateInput {\n status?: 'prepare' | 'ready' | 'building' | 'finished';\n}\n\n/**\n * 工具输入类型映射\n */\nexport type ToolInputMap = {\n list_dir: ListDirInput;\n search_file: SearchFileInput;\n read_file: ReadFileInput;\n read_lints: ReadLintsInput;\n rag_search: RagSearchInput;\n read_rules: ReadRulesInput;\n mcp_get_tool_description: McpGetToolDescriptionInput;\n mcp_call_tool: McpCallToolInput;\n fetch_mcp_resource: FetchMcpResourceInput;\n create_rule: CreateRuleInput;\n update_memory: UpdateMemoryInput;\n search_content: SearchContentInput;\n write_to_file: WriteToFileInput;\n replace_in_file: ReplaceInFileInput;\n delete_file: DeleteFileInput;\n execute_command: ExecuteCommandInput;\n preview_url: PreviewUrlInput;\n ask_followup_question: AskFollowupQuestionInput;\n invoke_integration: InvokeIntegrationInput;\n call_integration: CallIntegrationInput;\n search_integration_tool: SearchIntegrationToolInput;\n supabase_get_logs: SupabaseGetLogsInput;\n supabase_execute_sql: SupabaseExecuteSqlInput;\n supabase_apply_migration: SupabaseApplyMigrationInput;\n supabase_list_migration: SupabaseListMigrationInput;\n supabase_list_tables: SupabaseListTablesInput;\n cloud_studio_fetch_log: CloudStudioFetchLogInput;\n cloud_studio_execute_command: CloudStudioExecuteCommandInput;\n cloud_studio_deploy_sandbox: CloudStudioDeploySandboxInput;\n component_get_prompt: ComponentGetPromptInput;\n web_fetch: WebFetchInput;\n use_skill: UseSkillInput;\n web_search: WebSearchInput;\n task: TaskInput;\n codebase_search: CodebaseSearchInput;\n lsp: LspInput;\n spec_create: SpecCreateInput;\n spec_update: SpecUpdateInput;\n};\n\n// ============================================================================\n// 工具输出类型定义\n// ============================================================================\n\nexport interface ListFilesResult {\n type: 'list_files_result';\n files: Array<{\n filePath: string;\n size: string;\n modifyTime: string;\n }>;\n root: string;\n listing?: string;\n}\n\nexport interface SearchFileResult {\n type: 'search_file_result';\n path: string;\n pattern: string;\n recursive?: boolean;\n caseSensitive?: boolean;\n results: Array<{\n filePath: string;\n size: string;\n modifyTime: string;\n }>;\n}\n\nexport interface ReadFileResult {\n type: 'read_file_result';\n path: string;\n content: string;\n totalLineCount: number;\n hasMore: boolean;\n diagnostic?: string;\n hint?: string;\n image?: {\n data: string;\n mimeType: string;\n };\n}\n\nexport interface ReadLintsResult {\n type: 'read_lints_result';\n diagnostics: string[];\n totalCount?: number;\n hint?: string;\n isTruncated?: boolean;\n}\n\nexport interface KnowledgeSearchResult {\n type: 'knowledge_base_result';\n selectedKnowledgeBases: string;\n queryInput: string;\n}\n\nexport interface RuleMatchResult {\n type: 'rule_match_result';\n ruleDescription: string;\n filePaths: string[];\n}\n\nexport interface McpCallToolResult {\n type: 'mcp_call_tool_result';\n serverName: string;\n toolName: string;\n data: Array<{\n type: 'text' | 'image' | 'resource';\n text?: string;\n data?: string;\n mimeType?: string;\n resource?: {\n uri: string;\n mimeType?: string;\n text?: string;\n blob?: string;\n };\n }>;\n isError?: boolean;\n error?: unknown;\n hint?: string;\n}\n\nexport interface FetchMcpResourceToolResult {\n type: 'fetch_mcp_resource_result';\n server: string;\n uri: string;\n content: string;\n downloadPath?: string;\n}\n\nexport interface RuleCreateResult {\n type: 'rule_create_result';\n ruleName: string;\n createState: 'success' | 'invoke' | 'cancelled';\n hint?: string;\n filePath?: string;\n}\n\nexport interface UpdateMemoryResult {\n type: 'update_memory_result';\n success: boolean;\n message: string;\n action: 'create' | 'update' | 'delete';\n knowledge_id?: string;\n}\n\nexport interface SearchContentResult {\n type: 'search_content_result';\n directory: string;\n pattern: string;\n fileTypes: string;\n matches: Array<{\n filePath: string;\n content: string;\n startLine: number;\n endLine: number;\n size: string;\n modifyTime: string;\n }>;\n totalCount: number;\n hasMore: boolean;\n offset: number;\n limit: number;\n contextBefore: number;\n contextAfter: number;\n contextAround?: number;\n outputMode: string;\n caseSensitive: boolean;\n hint?: string;\n}\n\nexport interface WriteToFileResult {\n type: 'write_to_file_result';\n path: string;\n addLineCount: number;\n removedLines: number;\n addedChars?: number;\n removedChars?: number;\n bytesWritten: number;\n isNewFile: boolean;\n oldContent?: string;\n diagnostic?: string;\n}\n\nexport interface ReplaceInFileResult {\n type: 'replace_in_file_result';\n path: string;\n addLineCount?: number;\n removedLines?: number;\n addedChars?: number;\n removedChars?: number;\n matchCount?: number;\n hint?: string;\n diagnosticChange?: {\n added: string;\n removed: string;\n unchanged: string;\n };\n}\n\nexport interface DeleteFilesResult {\n type: 'delete_file_result';\n path: string;\n recursive: boolean;\n hint?: string;\n}\n\nexport interface ExecuteCommandResult {\n type: 'execute_command_result';\n stdout: string;\n stderr: string;\n exitCode: number;\n hint?: string;\n serviceInfo?: {\n isWatchCommand: boolean;\n isServiceOutput: boolean;\n serviceReady: boolean;\n message: string;\n };\n use_standalone_terminal?: boolean;\n}\n\nexport interface PreviewToolResult {\n type: 'preview_tool_result';\n url: string;\n message: string;\n}\n\nexport interface MultiQuestionResult {\n type: 'multi_question_result';\n questions: Array<{\n id: string;\n question: string;\n options: string[];\n multiSelect?: boolean;\n title?: string;\n }>;\n answers: Record<string, string | string[]>;\n message: string;\n}\n\nexport interface InvokeIntegrationToolResult {\n type: 'invoke_integration_tool_result';\n recommend: {\n id: string;\n type: string;\n status: 'connected' | 'disconnected';\n };\n message: string;\n}\n\nexport interface CallIntegrationToolResult {\n type: 'call_integration_tool_result';\n integrationId: string;\n toolName: string;\n data: {\n type: 'text';\n text: string;\n };\n isError?: boolean;\n error?: unknown;\n}\n\nexport interface SearchIntegrationToolResult {\n type: 'search_integration_tool_result';\n data: Array<{\n integrationId: string;\n integrationName: string;\n toolName: string;\n description: string;\n inputSchema: Record<string, unknown>;\n }>;\n hint?: string;\n}\n\nexport interface SupabaseToolsResult {\n type: 'supabase_get_logs_result' | 'supabase_execute_sql_result' | 'supabase_apply_migration_result' | 'supabase_list_migration_result' | 'supabase_list_tables_result';\n message: string;\n}\n\nexport interface CloudStudioFetchLogResult {\n type: 'cloud_studio_fetch_log_result';\n success: boolean;\n logs: Record<string, string>;\n}\n\nexport interface CloudStudioExecuteCommandResult {\n type: 'cloud_studio_execute_command_result';\n success: boolean;\n message: string;\n}\n\nexport interface CloudStudioDeployResult {\n type: 'cloud_studio_integration_result';\n previewUrl?: string;\n steps: Array<{\n status: 'idle' | 'success' | 'running' | 'error';\n name: 'createSandbox' | 'uploadProject' | 'installDependencies' | 'startService' | 'preview';\n error?: {\n code?: number;\n message?: string;\n };\n }>;\n}\n\nexport interface ComponentGetPromptResult {\n type: 'component_get_prompt_result';\n componentType: string;\n webFramework: string;\n data: {\n type: 'text';\n text: string;\n };\n}\n\nexport interface WebFetchToolResult {\n type: 'web_fetch_tool_result';\n message: string;\n data: string;\n loading?: string;\n title?: string;\n favicon?: string;\n}\n\nexport interface UseSkillToolResult {\n type: 'use_skill_tool_result';\n commandMessage: string;\n message: string;\n}\n\nexport interface WebSearchToolResult {\n type: 'web_search_tool_result';\n data: Array<{\n passage: string;\n uri: string;\n site: string;\n title: string;\n snippets?: string[];\n content?: string;\n }>;\n searchInput?: string;\n}\n\nexport interface TaskToolResult {\n type: 'task_tool_result';\n toolInfo?: Array<{\n name: string;\n info: string;\n needApprove?: boolean;\n toolCallId?: string;\n executeStatus?: 'ing' | 'completed' | 'cancel' | 'fail';\n }>;\n startCallTool?: boolean;\n finalResult?: string;\n toolCallBrief?: string;\n}\n\nexport interface CodebaseSearchResult {\n type: 'codebase_search_result';\n query: string;\n path: string;\n content: string;\n}\n\nexport interface LSPToolResult {\n type: 'lsp_tool_result';\n operation: string;\n result: string;\n resultCount?: number;\n fileCount?: number;\n character?: number;\n}\n\nexport interface PlanCreateToolResult {\n type: 'plan_create_tool_result';\n message: string;\n data: string;\n}\n\nexport interface PlanUpdateToolResult {\n type: 'plan_update_tool_result';\n status: 'prepare' | 'ready' | 'building' | 'finished';\n data: string;\n reminder: string;\n}\n\n/**\n * 工具输出类型映射\n */\nexport type ToolOutputMap = {\n list_dir: ListFilesResult;\n search_file: SearchFileResult;\n read_file: ReadFileResult;\n read_lints: ReadLintsResult;\n rag_search: KnowledgeSearchResult;\n read_rules: RuleMatchResult;\n mcp_get_tool_description: Record<string, unknown>;\n mcp_call_tool: McpCallToolResult;\n fetch_mcp_resource: FetchMcpResourceToolResult;\n create_rule: RuleCreateResult;\n update_memory: UpdateMemoryResult;\n search_content: SearchContentResult;\n write_to_file: WriteToFileResult;\n replace_in_file: ReplaceInFileResult;\n delete_file: DeleteFilesResult;\n execute_command: ExecuteCommandResult;\n preview_url: PreviewToolResult;\n ask_followup_question: MultiQuestionResult;\n invoke_integration: InvokeIntegrationToolResult;\n call_integration: CallIntegrationToolResult;\n search_integration_tool: SearchIntegrationToolResult;\n supabase_get_logs: SupabaseToolsResult;\n supabase_execute_sql: SupabaseToolsResult;\n supabase_apply_migration: SupabaseToolsResult;\n supabase_list_migration: SupabaseToolsResult;\n supabase_list_tables: SupabaseToolsResult;\n cloud_studio_fetch_log: CloudStudioFetchLogResult;\n cloud_studio_execute_command: CloudStudioExecuteCommandResult;\n cloud_studio_deploy_sandbox: CloudStudioDeployResult;\n component_get_prompt: ComponentGetPromptResult;\n web_fetch: WebFetchToolResult;\n use_skill: UseSkillToolResult;\n web_search: WebSearchToolResult;\n task: TaskToolResult;\n codebase_search: CodebaseSearchResult;\n lsp: LSPToolResult;\n spec_create: PlanCreateToolResult;\n spec_update: PlanUpdateToolResult;\n};\n\n// ============================================================================\n// Zod Schema 定义 (用于运行时验证)\n// ============================================================================\n\n/**\n * 工具输入 Schema 定义\n * 用于验证和约束 rawInput\n */\nexport const ToolInputSchemas = {\n list_dir: z.object({\n target_directory: z.string().describe('要列出内容的目录路径'),\n ignore_globs: z.string().optional().describe('可选的 glob 模式数组,用于忽略特定文件'),\n }),\n\n search_file: z.object({\n target_directory: z.string().describe('搜索的目录绝对路径'),\n pattern: z.string().describe('文件模式(如 \"*.js\"),支持通配符'),\n recursive: z.boolean().describe('是否递归搜索子目录'),\n caseSensitive: z.boolean().describe('是否区分大小写'),\n }),\n\n read_file: z.object({\n filePath: z.string().describe('要读取的文件的绝对路径'),\n offset: z.number().optional().describe('开始读取的行号'),\n limit: z.number().optional().describe('要读取的行数'),\n }),\n\n read_lints: z.object({\n paths: z.string().optional().describe('要读取 lint 错误的文件或目录路径'),\n }),\n\n rag_search: z.object({\n queryString: z.string().describe('用户的实际问题或搜索查询'),\n knowledgeBaseNames: z.string().describe('知识库名称,多个用逗号分隔'),\n }),\n\n read_rules: z.object({\n ruleNames: z.string().describe('要读取的规则关键词,用逗号分隔,格式:{ruleName}_{ruleId}'),\n }),\n\n mcp_get_tool_description: z.object({\n toolRequests: z.string().describe('JSON 字符串,二维数组格式:[[\"server1\", \"tool1\"], [\"server2\", \"tool2\"]]'),\n }),\n\n mcp_call_tool: z.object({\n serverName: z.string().describe('MCP 服务器名称'),\n toolName: z.string().describe('要调用的工具名称'),\n arguments: z.string().describe('目标 MCP 工具的参数,JSON 格式字符串'),\n maxOutputLength: z.number().optional().describe('控制工具输出的最大长度,默认 200000'),\n }),\n\n fetch_mcp_resource: z.object({\n server: z.string().describe('MCP 服务器标识符'),\n uri: z.string().describe('要读取的资源 URI'),\n arguments: z.record(z.unknown()).optional().describe('资源模板的参数'),\n downloadPath: z.string().optional().describe('可选的绝对路径,用于保存资源到磁盘'),\n }),\n\n create_rule: z.object({\n ruleScope: z.string().describe('规则范围,project rule 或 user rule'),\n ruleName: z.string().describe('规则文件名,不带扩展名'),\n ruleType: z.string().describe('规则类型,always、manual 或 requested'),\n ruleContent: z.string().describe('规则内容,使用 Markdown 格式'),\n ruleDescription: z.string().optional().describe('规则描述,使用 Markdown 格式'),\n }),\n\n update_memory: z.object({\n action: z.enum(['create', 'update', 'delete']).optional().describe('执行的操作'),\n existing_knowledge_id: z.string().optional().describe('更新或删除时必需,现有记忆的 ID'),\n knowledge_to_store: z.string().optional().describe('要存储的特定记忆'),\n title: z.string().optional().describe('记忆的标题'),\n }),\n\n search_content: z.object({\n pattern: z.string().describe('要搜索的关键字或正则表达式模式'),\n directory: z.string().describe('要搜索的目录的绝对路径'),\n fileTypes: z.string().optional().describe('可选的逗号分隔文件扩展名'),\n contextBefore: z.number().optional().describe('每个匹配前显示的行数'),\n contextAfter: z.number().optional().describe('每个匹配后显示的行数'),\n contextAround: z.number().optional().describe('每个匹配前后显示的行数'),\n outputMode: z.string().optional().describe('输出模式:content、files_with_matches 或 count'),\n caseSensitive: z.boolean().optional().describe('是否区分大小写'),\n }),\n\n write_to_file: z.object({\n filePath: z.string().describe('目标文件的绝对路径'),\n content: z.string().describe('要写入的内容'),\n }),\n\n replace_in_file: z.object({\n filePath: z.string().describe('要修改的文件的绝对路径'),\n old_str: z.string().describe('要替换的文本'),\n new_str: z.string().describe('替换后的文本'),\n }),\n\n delete_file: z.object({\n target_file: z.string().describe('要删除的文件的绝对路径'),\n explanation: z.string().optional().describe('为什么使用此工具的一句话解释'),\n }),\n\n execute_command: z.object({\n command: z.string().describe('要执行的 CLI 命令'),\n requires_approval: z.boolean().describe('命令是否需要用户批准'),\n }),\n\n preview_url: z.object({\n url: z.string().describe('要打开的完整、有效的 HTTP/HTTPS URL'),\n }),\n\n ask_followup_question: z.object({\n questions: z.array(z.object({\n question: z.string(),\n header: z.string().max(12),\n options: z.array(z.object({\n label: z.string().max(50),\n description: z.string(),\n })).min(2).max(4),\n multiSelect: z.boolean().optional(),\n })).min(1).max(4),\n }),\n\n invoke_integration: z.object({}).passthrough(),\n\n call_integration: z.object({}).passthrough(),\n\n search_integration_tool: z.object({}).passthrough(),\n\n supabase_get_logs: z.object({}).passthrough(),\n\n supabase_execute_sql: z.object({}).passthrough(),\n\n supabase_apply_migration: z.object({}).passthrough(),\n\n supabase_list_migration: z.object({}).passthrough(),\n\n supabase_list_tables: z.object({}).passthrough(),\n\n cloud_studio_fetch_log: z.object({}).passthrough(),\n\n cloud_studio_execute_command: z.object({}).passthrough(),\n\n cloud_studio_deploy_sandbox: z.object({}).passthrough(),\n\n component_get_prompt: z.object({}).passthrough(),\n\n web_fetch: z.object({\n url: z.string().describe('要获取内容的 URL'),\n fetchInfo: z.string().describe('用户想要获取的信息描述'),\n }),\n\n use_skill: z.object({\n command: z.string().describe('技能名称(不含参数),如 \"pdf\" 或 \"xlsx\"'),\n }),\n\n web_search: z.object({\n explanation: z.string().describe('为什么使用此工具的一句话解释'),\n searchTerm: z.string().describe('要在网络上搜索的搜索词'),\n }),\n\n task: z.object({\n subagent_name: z.string().describe('要调用的子代理名称'),\n description: z.string().describe('任务的简短描述(3-5 个词)'),\n prompt: z.string().describe('子代理要执行的任务'),\n subagent_path: z.string().optional().describe('子代理定义文件的路径'),\n }),\n\n codebase_search: z.object({\n query: z.string().describe('关于你想理解的内容的完整问题'),\n path: z.string().describe('限制搜索范围的目录路径前缀'),\n limit: z.number().max(100).optional().describe('返回的最大结果数,默认 10'),\n }),\n\n lsp: z.object({}).passthrough(),\n\n spec_create: z.object({\n name: z.string().describe('Plan 名称,用作稳定标识符/文件名'),\n overview: z.string().describe('用一两句话精确概括本次 plan 的主要内容'),\n relative_history: z.string().describe('准备阶段的上下文,包含用户需求、代码位置、额外上下文等'),\n }),\n\n spec_update: z.object({\n status: z.enum(['prepare', 'ready', 'building', 'finished']).optional().describe('Plan 状态'),\n }),\n} satisfies Record<ToolName, z.ZodTypeAny>;\n\n/**\n * 工具输出 Schema 定义\n * 用于验证和约束 rawOutput\n */\nexport const ToolOutputSchemas = {\n list_dir: z.object({\n type: z.literal('list_files_result'),\n files: z.array(z.object({\n filePath: z.string(),\n size: z.string(),\n modifyTime: z.string(),\n })),\n root: z.string(),\n listing: z.string().optional(),\n }),\n\n search_file: z.object({\n type: z.literal('search_file_result'),\n path: z.string(),\n pattern: z.string(),\n recursive: z.boolean().optional(),\n caseSensitive: z.boolean().optional(),\n results: z.array(z.object({\n filePath: z.string(),\n size: z.string(),\n modifyTime: z.string(),\n })),\n }),\n\n read_file: z.object({\n type: z.literal('read_file_result'),\n path: z.string(),\n content: z.string(),\n totalLineCount: z.number(),\n hasMore: z.boolean(),\n diagnostic: z.string().optional(),\n hint: z.string().optional(),\n image: z.object({\n data: z.string(),\n mimeType: z.string(),\n }).optional(),\n }),\n\n read_lints: z.object({\n type: z.literal('read_lints_result'),\n diagnostics: z.array(z.string()),\n totalCount: z.number().optional(),\n hint: z.string().optional(),\n isTruncated: z.boolean().optional(),\n }),\n\n rag_search: z.object({\n type: z.literal('knowledge_base_result'),\n selectedKnowledgeBases: z.string(),\n queryInput: z.string(),\n }),\n\n read_rules: z.object({\n type: z.literal('rule_match_result'),\n ruleDescription: z.string(),\n filePaths: z.array(z.string()),\n }),\n\n mcp_get_tool_description: z.object({}).passthrough(),\n\n mcp_call_tool: z.object({\n type: z.literal('mcp_call_tool_result'),\n serverName: z.string(),\n toolName: z.string(),\n data: z.array(z.union([\n z.object({\n type: z.literal('text'),\n text: z.string(),\n }),\n z.object({\n type: z.literal('image'),\n data: z.string(),\n mimeType: z.string(),\n }),\n z.object({\n type: z.literal('resource'),\n resource: z.object({\n uri: z.string(),\n mimeType: z.string().optional(),\n text: z.string().optional(),\n blob: z.string().optional(),\n }),\n }),\n ])),\n isError: z.boolean().optional(),\n error: z.unknown().optional(),\n hint: z.string().optional(),\n }),\n\n fetch_mcp_resource: z.object({\n type: z.literal('fetch_mcp_resource_result'),\n server: z.string(),\n uri: z.string(),\n content: z.string(),\n downloadPath: z.string().optional(),\n }),\n\n create_rule: z.object({\n type: z.literal('rule_create_result'),\n ruleName: z.string(),\n createState: z.enum(['success', 'invoke', 'cancelled']),\n hint: z.string().optional(),\n filePath: z.string().optional(),\n }),\n\n update_memory: z.object({\n type: z.literal('update_memory_result'),\n success: z.boolean(),\n message: z.string(),\n action: z.enum(['create', 'update', 'delete']),\n knowledge_id: z.string().optional(),\n }),\n\n search_content: z.object({\n type: z.literal('search_content_result'),\n directory: z.string(),\n pattern: z.string(),\n fileTypes: z.string(),\n matches: z.array(z.object({\n filePath: z.string(),\n content: z.string(),\n startLine: z.number(),\n endLine: z.number(),\n size: z.string(),\n modifyTime: z.string(),\n })),\n totalCount: z.number(),\n hasMore: z.boolean(),\n offset: z.number(),\n limit: z.number(),\n contextBefore: z.number(),\n contextAfter: z.number(),\n contextAround: z.number().optional(),\n outputMode: z.string(),\n caseSensitive: z.boolean(),\n hint: z.string().optional(),\n }),\n\n write_to_file: z.object({\n type: z.literal('write_to_file_result'),\n path: z.string(),\n addLineCount: z.number(),\n removedLines: z.number(),\n addedChars: z.number().optional(),\n removedChars: z.number().optional(),\n bytesWritten: z.number(),\n isNewFile: z.boolean(),\n oldContent: z.string().optional(),\n diagnostic: z.string().optional(),\n }),\n\n replace_in_file: z.object({\n type: z.literal('replace_in_file_result'),\n path: z.string(),\n addLineCount: z.number().optional(),\n removedLines: z.number().optional(),\n addedChars: z.number().optional(),\n removedChars: z.number().optional(),\n matchCount: z.number().optional(),\n hint: z.string().optional(),\n diagnosticChange: z.object({\n added: z.string(),\n removed: z.string(),\n unchanged: z.string(),\n }).optional(),\n }),\n\n delete_file: z.object({\n type: z.literal('delete_file_result'),\n path: z.string(),\n recursive: z.boolean(),\n hint: z.string().optional(),\n }),\n\n execute_command: z.object({\n type: z.literal('execute_command_result'),\n stdout: z.string(),\n stderr: z.string(),\n exitCode: z.number(),\n hint: z.string().optional(),\n serviceInfo: z.object({\n isWatchCommand: z.boolean(),\n isServiceOutput: z.boolean(),\n serviceReady: z.boolean(),\n message: z.string(),\n }).optional(),\n use_standalone_terminal: z.boolean().optional(),\n }),\n\n preview_url: z.object({\n type: z.literal('preview_tool_result'),\n url: z.string(),\n message: z.string(),\n }),\n\n ask_followup_question: z.object({\n type: z.literal('multi_question_result'),\n questions: z.array(z.object({\n id: z.string(),\n question: z.string(),\n options: z.array(z.string()),\n multiSelect: z.boolean().optional(),\n title: z.string().optional(),\n })),\n answers: z.record(z.union([z.string(), z.array(z.string())])),\n message: z.string(),\n }),\n\n invoke_integration: z.object({\n type: z.literal('invoke_integration_tool_result'),\n recommend: z.object({\n id: z.string(),\n type: z.string(),\n status: z.enum(['connected', 'disconnected']),\n }),\n message: z.string(),\n }),\n\n call_integration: z.object({\n type: z.literal('call_integration_tool_result'),\n integrationId: z.string(),\n toolName: z.string(),\n data: z.object({\n type: z.literal('text'),\n text: z.string(),\n }),\n isError: z.boolean().optional(),\n error: z.unknown().optional(),\n }),\n\n search_integration_tool: z.object({\n type: z.literal('search_integration_tool_result'),\n data: z.array(z.object({\n integrationId: z.string(),\n integrationName: z.string(),\n toolName: z.string(),\n description: z.string(),\n inputSchema: z.record(z.unknown()),\n })),\n hint: z.string().optional(),\n }),\n\n supabase_get_logs: z.object({\n type: z.enum([\n 'supabase_get_logs_result',\n 'supabase_execute_sql_result',\n 'supabase_apply_migration_result',\n 'supabase_list_migration_result',\n 'supabase_list_tables_result',\n ]),\n message: z.string(),\n }),\n\n supabase_execute_sql: z.object({\n type: z.enum([\n 'supabase_get_logs_result',\n 'supabase_execute_sql_result',\n 'supabase_apply_migration_result',\n 'supabase_list_migration_result',\n 'supabase_list_tables_result',\n ]),\n message: z.string(),\n }),\n\n supabase_apply_migration: z.object({\n type: z.enum([\n 'supabase_get_logs_result',\n 'supabase_execute_sql_result',\n 'supabase_apply_migration_result',\n 'supabase_list_migration_result',\n 'supabase_list_tables_result',\n ]),\n message: z.string(),\n }),\n\n supabase_list_migration: z.object({\n type: z.enum([\n 'supabase_get_logs_result',\n 'supabase_execute_sql_result',\n 'supabase_apply_migration_result',\n 'supabase_list_migration_result',\n 'supabase_list_tables_result',\n ]),\n message: z.string(),\n }),\n\n supabase_list_tables: z.object({\n type: z.enum([\n 'supabase_get_logs_result',\n 'supabase_execute_sql_result',\n 'supabase_apply_migration_result',\n 'supabase_list_migration_result',\n 'supabase_list_tables_result',\n ]),\n message: z.string(),\n }),\n\n cloud_studio_fetch_log: z.object({\n type: z.literal('cloud_studio_fetch_log_result'),\n success: z.boolean(),\n logs: z.record(z.string()),\n }),\n\n cloud_studio_execute_command: z.object({\n type: z.literal('cloud_studio_execute_command_result'),\n success: z.boolean(),\n message: z.string(),\n }),\n\n cloud_studio_deploy_sandbox: z.object({\n type: z.literal('cloud_studio_integration_result'),\n previewUrl: z.string().optional(),\n steps: z.array(z.object({\n status: z.enum(['idle', 'success', 'running', 'error']),\n name: z.enum(['createSandbox', 'uploadProject', 'installDependencies', 'startService', 'preview']),\n error: z.object({\n code: z.number().optional(),\n message: z.string().optional(),\n }).optional(),\n })),\n }),\n\n component_get_prompt: z.object({\n type: z.literal('component_get_prompt_result'),\n componentType: z.string(),\n webFramework: z.string(),\n data: z.object({\n type: z.literal('text'),\n text: z.string(),\n }),\n }),\n\n web_fetch: z.object({\n type: z.literal('web_fetch_tool_result'),\n message: z.string(),\n data: z.string(),\n loading: z.string().optional(),\n title: z.string().optional(),\n favicon: z.string().optional(),\n }),\n\n use_skill: z.object({\n type: z.literal('use_skill_tool_result'),\n commandMessage: z.string(),\n message: z.string(),\n }),\n\n web_search: z.object({\n type: z.literal('web_search_tool_result'),\n data: z.array(z.object({\n passage: z.string(),\n uri: z.string(),\n site: z.string(),\n title: z.string(),\n snippets: z.array(z.string()).optional(),\n content: z.string().optional(),\n })),\n searchInput: z.string().optional(),\n }),\n\n task: z.object({\n type: z.literal('task_tool_result'),\n toolInfo: z.array(z.object({\n name: z.string(),\n info: z.string(),\n needApprove: z.boolean().optional(),\n toolCallId: z.string().optional(),\n executeStatus: z.enum(['ing', 'completed', 'cancel', 'fail']).optional(),\n })).optional(),\n startCallTool: z.boolean().optional(),\n finalResult: z.string().optional(),\n toolCallBrief: z.string().optional(),\n }),\n\n codebase_search: z.object({\n type: z.literal('codebase_search_result'),\n query: z.string(),\n path: z.string(),\n content: z.string(),\n }),\n\n lsp: z.object({\n type: z.literal('lsp_tool_result'),\n operation: z.string(),\n result: z.string(),\n resultCount: z.number().optional(),\n fileCount: z.number().optional(),\n character: z.number().optional(),\n }),\n\n spec_create: z.object({\n type: z.literal('plan_create_tool_result'),\n message: z.string(),\n data: z.string(),\n }),\n\n spec_update: z.object({\n type: z.literal('plan_update_tool_result'),\n status: z.enum(['prepare', 'ready', 'building', 'finished']),\n data: z.string(),\n reminder: z.string(),\n }),\n} satisfies Record<ToolName, z.ZodTypeAny>;\n\n// ============================================================================\n// 工具 Schema 验证工具函数\n// ============================================================================\n\n/**\n * 验证工具输入\n * @param toolName 工具名称\n * @param input 输入数据\n * @returns 验证结果\n */\nexport function validateToolInput<TName extends ToolName>(\n toolName: TName,\n input: unknown\n): { success: true; data: ToolInputMap[TName] } | { success: false; error: z.ZodError } {\n const schema = ToolInputSchemas[toolName];\n const result = schema.safeParse(input);\n if (result.success) {\n return { success: true, data: result.data as ToolInputMap[TName] };\n }\n return { success: false, error: result.error };\n}\n\n/**\n * 验证工具输出\n * @param toolName 工具名称\n * @param output 输出数据\n * @returns 验证结果\n */\nexport function validateToolOutput<TName extends ToolName>(\n toolName: TName,\n output: unknown\n): { success: true; data: ToolOutputMap[TName] } | { success: false; error: z.ZodError } {\n const schema = ToolOutputSchemas[toolName];\n const result = schema.safeParse(output);\n if (result.success) {\n return { success: true, data: result.data as ToolOutputMap[TName] };\n }\n return { success: false, error: result.error };\n}\n","/**\n * Mock Agent Provider\n *\n * 职责:\n * 1. 专门用于 Mock 数据验证链路\n * 2. 返回符合 ACP 协议的模拟数据\n * 3. 用于前端开发和测试阶段\n *\n * Mock 数据包括:\n * - 流式文本消息 (agent_message_chunk)\n * - 嵌入资源内容\n * - 资源链接\n * - 工具调用流程 (tool_call + tool_call_update)\n */\n\nimport type {\n PromptRequest,\n PromptResponse,\n SessionNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n LoadSessionRequest,\n LoadSessionResponse,\n AuthenticateRequest,\n AuthenticateResponse,\n CancelNotification,\n SetSessionModelRequest,\n SetSessionModelResponse,\n SetSessionModeRequest,\n SetSessionModeResponse\n} from '@agentclientprotocol/sdk';\nimport type { IAgentProvider } from './types';\nimport type {\n SessionUpdateParams,\n PermissionRequestParams,\n PermissionResponse\n} from './acp-client-protocol';\nimport {\n validateToolOutput,\n ReadFileResult,\n DeleteFilesResult\n} from './tool-schemas.js';\n\n\nexport interface MockAgentProviderConfig {\n useRealProvider?: boolean; // 是否使用真实 Provider(保留向后兼容)\n}\n\n/**\n * ACP 协议 Mock 数据 - 初始化响应\n */\nexport const mockInitializeResponse: InitializeResponse = {\n protocolVersion: 1,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: {\n image: true,\n audio: false,\n embeddedContext: true\n },\n mcpCapabilities: {\n http: true,\n sse: true\n }\n }\n};\n\n/**\n * ACP 协议 Mock 数据 - 会话创建响应\n */\nexport const mockNewSessionResponse = (sessionId: string): NewSessionResponse => ({\n sessionId\n});\n\n/**\n * Mock 会话数据存储\n * 每个会话都有对应的模拟历史消息\n */\nconst mockSessionHistories = new Map<string, Array<{\n type: 'user' | 'assistant';\n content: string;\n timestamp: number;\n}>>();\n\n// 初始化会话历史数据\nmockSessionHistories.set('1', [\n {\n type: 'user',\n content: '帮我开发一个五子棋游戏,需要包含以下功能:\\n1. 双人对战模式\\n2. 悔棋功能\\n3. 计时器',\n timestamp: Date.now() - 1800000 - 60000,\n },\n {\n type: 'assistant',\n content: '好的,我来帮你开发一个五子棋游戏。我会创建以下文件结构:\\n\\n- `index.html` - 主页面\\n- `game.js` - 游戏逻辑\\n- `style.css` - 样式文件\\n\\n让我开始创建这些文件...',\n timestamp: Date.now() - 1800000 - 50000,\n },\n {\n type: 'assistant',\n content: '我已经完成了所有文件的创建和修改。游戏支持双人对战、悔棋和计时功能。你可以直接在浏览器中打开 index.html 开始游戏。',\n timestamp: Date.now() - 1800000,\n },\n]);\n\nmockSessionHistories.set('2', [\n {\n type: 'user',\n content: '登录页面的样式有问题,按钮颜色不对齐,帮我修复一下',\n timestamp: Date.now() - 7200000 - 120000,\n },\n {\n type: 'assistant',\n content: '我来检查登录页面的样式。让我先看看相关的 CSS 文件...',\n timestamp: Date.now() - 7200000 - 100000,\n },\n {\n type: 'assistant',\n content: '样式问题已修复,请查看效果。主要修改了按钮的 flex 布局和颜色变量。',\n timestamp: Date.now() - 7200000,\n },\n]);\n\nmockSessionHistories.set('3', [\n {\n type: 'user',\n content: 'API 接口响应太慢了,需要添加缓存和错误重试机制',\n timestamp: Date.now() - 14400000 - 180000,\n },\n {\n type: 'assistant',\n content: '好的,我来优化 API 接口。我会实现:\\n1. Redis 缓存层\\n2. 指数退避重试策略\\n3. 请求去重',\n timestamp: Date.now() - 14400000 - 150000,\n },\n {\n type: 'assistant',\n content: '已添加缓存和错误重试机制。性能提升了约 60%。',\n timestamp: Date.now() - 14400000,\n },\n]);\n\nmockSessionHistories.set('4', [\n {\n type: 'user',\n content: '帮我为核心模块添加单元测试,覆盖率要达到 80% 以上',\n timestamp: Date.now() - 86400000 - 300000,\n },\n {\n type: 'assistant',\n content: '好的,我会使用 Jest 来编写单元测试。让我先看看核心模块的代码结构...',\n timestamp: Date.now() - 86400000 - 250000,\n },\n {\n type: 'assistant',\n content: '测试覆盖率已达到 85%,超过了目标。主要测试了:\\n- 用户认证逻辑\\n- 数据验证\\n- 错误处理',\n timestamp: Date.now() - 86400000,\n },\n]);\n\nexport class MockAgentProvider implements IAgentProvider {\n // ========== ACP 原生事件回调集合 ==========\n private sessionUpdateCallbacks: Set<(params: SessionUpdateParams) => void> = new Set();\n private permissionRequestResolvers: Map<string, (params: PermissionRequestParams) => Promise<PermissionResponse>> = new Map();\n private errorCallbacks: Set<(error: Error, sessionId?: string) => void> = new Set();\n\n // Minimal connection tracking to keep API compatibility with previous SSE provider\n private activeConnections: Map<string, unknown> = new Map();\n /**\n * Mock 模式下,等待用户权限决策的解析器集合\n * key: toolCallId -> resolver(outcome)\n */\n private pendingPermissionResolvers: Map<string, (outcome: { outcome: 'selected' | 'cancelled'; optionId?: string; timedOut?: boolean }) => void> = new Map();\n /**\n * Mock 模式下,已初始化的会话集合\n */\n private initializedSessions: Map<string, { cwd: string; mcpServers: any[]; createdAt: number }> = new Map();\n /**\n * 临时缓存当前正在发送的消息的 SessionUpdateParams\n * key: sessionId -> params[]\n * 在 sendMockMessage 开始时初始化,结束时保存到 mockSessionHistories\n */\n private currentSessionUpdates: Map<string, SessionUpdateParams[]> = new Map();\n\n constructor(config: MockAgentProviderConfig = {}) {\n console.log('[MockAgentProvider] Initialized');\n\n // 初始化一些默认的 Mock session 数据\n this.initializeMockSessions();\n }\n\n setSessionMode?(params: SetSessionModeRequest): Promise<SetSessionModeResponse | void> {\n throw new Error('Method not implemented.');\n }\n setSessionModel?(params: SetSessionModelRequest): Promise<SetSessionModelResponse | void> {\n throw new Error('Method not implemented.');\n }\n extMethod?(method: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n throw new Error('Method not implemented.');\n }\n extNotification?(method: string, params: Record<string, unknown>): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n /**\n * 初始化默认的 Mock session 数据\n */\n private initializeMockSessions(): void {\n const mockSessions = [\n {\n sessionId: '1',\n cwd: '/Users/example/Project',\n mcpServers: [],\n createdAt: Date.now() - 3600000, // 1小时前\n },\n {\n sessionId: '2',\n cwd: '/Users/example/Project',\n mcpServers: [],\n createdAt: Date.now() - 7200000, // 2小时前\n },\n {\n sessionId: '3',\n cwd: '/Users/example/Project',\n mcpServers: [],\n createdAt: Date.now() - 86400000, // 1天前\n },\n ];\n\n mockSessions.forEach(session => {\n this.initializedSessions.set(session.sessionId, {\n cwd: session.cwd,\n mcpServers: session.mcpServers,\n createdAt: session.createdAt,\n });\n });\n\n console.log('[MockAgentProvider] Initialized mock sessions:', mockSessions.length);\n }\n\n /**\n * 从 PromptRequest 中提取文本内容\n * Provider 自己决定如何处理 ContentBlock 数组\n */\n private extractTextFromRequest(request: PromptRequest): string {\n if (request.prompt && Array.isArray(request.prompt)) {\n return request.prompt\n .filter((block) => block.type === 'text')\n .map((block) => ('text' in block ? block.text : ''))\n .join('\\n');\n }\n return '';\n }\n\n /**\n * 发送消息 - 直接使用 Mock 数据\n * 接收 PromptRequest,由 Provider 决定如何处理\n */\n async sendMessage(request: PromptRequest): Promise<void> {\n // 提取文本内容 - 这是 Provider 的职责\n const content = this.extractTextFromRequest(request);\n const sessionId = request.sessionId;\n\n console.log('[MockAgentProvider] Sending mock message:', { sessionId, content });\n\n try {\n // 直接使用 Mock 数据\n await this.sendMockMessage(sessionId, content);\n } catch (error) {\n console.error('[MockAgentProvider] Send message failed:', error);\n\n // 触发错误事件\n this.emitEvent({\n type: 'error',\n sessionId,\n timestamp: Date.now(),\n data: { error: error instanceof Error ? error.message : 'Unknown error' },\n });\n\n throw error;\n }\n }\n\n /**\n * 使用 Mock 数据模拟流式响应\n */\n private async sendMockMessage(sessionId: string, content: string): Promise<void> {\n console.log('[MockAgentProvider] Using mock data for:', content);\n\n // ✅ 初始化临时事件缓存\n this.currentSessionUpdates.set(sessionId, []);\n\n // 发送连接成功事件\n this.emitEvent({\n type: 'connected',\n sessionId,\n timestamp: Date.now(),\n });\n\n // 模拟延迟\n await this.delay(300);\n\n // 1. 发送文本回复消息\n const messageId1 = `m-text-${Date.now()}`;\n const textReply = `我收到了你发送的「${content}」信息,这是符合 ACP 协议的 mock 数据。\\n\\n下面演示不同类型的 ContentBlock:\\n\\n`;\n await this.streamMockTextContent(sessionId, messageId1, textReply);\n\n await this.delay(500);\n\n // 2. 发送包含嵌入资源的回复\n const messageId2 = `m-resource-${Date.now()}`;\n await this.sendMockEmbeddedResource(sessionId, messageId2);\n\n await this.delay(500);\n\n // 3. 发送包含资源链接的回复\n const messageId3 = `m-link-${Date.now()}`;\n await this.sendMockResourceLink(sessionId, messageId3);\n\n await this.delay(500);\n\n // 4. 模拟工具调用流程\n const toolMessageId = `m-tool-${Date.now()}`;\n await this.sendMockEditContentToolCallFlow(sessionId, toolMessageId);\n await this.delay(500);\n\n const diffToolMessageId = `m-tool-d-${Date.now()}`;\n await this.sendMockEditDiffToolCallFlow(sessionId, diffToolMessageId);\n await this.delay(500);\n\n const readToolMessageId = `m-tool-r-${Date.now()}`;\n await this.sendMockReadContentToolCallFlow(sessionId, readToolMessageId);\n await this.delay(300);\n\n // 添加 search_file 和 search_content 的 mock 数据\n const searchContentMessageId = `m-tool-sc-${Date.now()}`;\n await this.sendMockSearchContentToolCallFlow(sessionId, searchContentMessageId);\n\n await this.delay(500);\n\n const searchFileMessageId = `m-tool-sf-${Date.now()}`;\n await this.sendMockSearchFileToolCallFlow(sessionId, searchFileMessageId);\n\n await this.delay(500);\n\n // 6. 发送 list_files 工具调用\n const listFilesMessageId = `m-tool-lf-${Date.now()}`;\n await this.sendMockListFilesToolCallFlow(sessionId, listFilesMessageId);\n\n await this.delay(500);\n\n // 7. 发送 ask_followup_question 工具调用\n const askFollowupMessageId = `m-tool-afq-${Date.now()}`;\n await this.sendMockAskFollowupQuestionToolCallFlow(sessionId, askFollowupMessageId);\n await this.delay(500);\n\n // 添加删除文件工具调用的 mock 数据\n const deleteFileMessageId = `m-tool-df-${Date.now()}`;\n await this.sendMockDeleteFileToolCallFlow(sessionId, deleteFileMessageId);\n\n await this.delay(300);\n\n // 8. 发送 execute_command 工具调用\n const executeCommandMessageId = `m-tool-ec-${Date.now()}`;\n await this.sendMockExecuteCommandToolCallFlow(sessionId, executeCommandMessageId);\n\n await this.delay(300);\n\n // 8.1 发送 execute_command 工具调用(需要权限确认)\n const executeCommandApprovalMessageId = `m-tool-ec-approval-${Date.now()}`;\n await this.sendMockExecuteCommandWithApprovalToolCallFlow(sessionId, executeCommandApprovalMessageId);\n\n await this.delay(300);\n\n // 8.2 发送 write_to_file 工具调用(需要权限确认)\n const writeFileApprovalMessageId = `m-tool-wtf-approval-${Date.now()}`;\n await this.sendMockWriteFileWithApprovalToolCallFlow(sessionId, writeFileApprovalMessageId);\n\n await this.delay(300);\n\n // 9. 发送 preview_url 工具调用 (测试 unknown tool)\n const previewUrlMessageId = `m-tool-pu-${Date.now()}`;\n await this.sendMockPreviewUrlToolCallFlow(sessionId, previewUrlMessageId);\n\n await this.delay(300);\n\n // 10. 发送 list_code_definition_names 工具调用 (测试 unknown tool)\n const listCodeDefMessageId = `m-tool-lcd-${Date.now()}`;\n await this.sendMockListCodeDefinitionNamesToolCallFlow(sessionId, listCodeDefMessageId);\n\n await this.delay(300);\n\n // 添加 web_fetch 工具调用的 mock 数据\n const webFetchMessageId = `m-tool-wf-${Date.now()}`;\n await this.sendMockWebFetchToolCallFlow(sessionId, webFetchMessageId);\n\n await this.delay(300);\n\n // 11. 发送 read_lints 工具调用\n const readLintsMessageId = `m-tool-rl-${Date.now()}`;\n await this.sendMockReadLintsToolCallFlow(sessionId, readLintsMessageId);\n\n await this.delay(300);\n\n // 10. 发送 web_search 工具调用\n const webSearchMessageId = `m-tool-ws-${Date.now()}`;\n await this.sendMockWebSearchToolCallFlow(sessionId, webSearchMessageId);\n\n await this.delay(300);\n\n // 发送完成事件\n this.emitEvent({\n type: 'done',\n sessionId,\n timestamp: Date.now(),\n });\n }\n\n /**\n * 流式发送 Mock 文本消息内容 (符合 ACP 协议的 agent_message_chunk)\n */\n private async streamMockTextContent(sessionId: string, messageId: string, content: string): Promise<void> {\n const chunkSize = 10; // 每次发送 10 个字符\n\n for (let i = 0; i < content.length; i += chunkSize) {\n // 获取当前块的内容\n const chunk = content.substring(i, i + chunkSize);\n\n console.log(`Text Chunk: \"${chunk}\" | messageId: ${messageId} | sessionId: ${sessionId}`);\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: chunk,\n }\n }\n } as SessionNotification,\n });\n\n // 模拟网络延迟\n await this.delay(50);\n }\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * 取消消息 (Mock 模式下直接完成)\n * @deprecated 使用 cancel 代替\n */\n async cancelMessage(sessionId: string): Promise<void> {\n console.log('[MockAgentProvider] Message cancelled:', sessionId);\n\n // 发送完成事件\n this.emitEvent({\n type: 'done',\n sessionId,\n timestamp: Date.now(),\n });\n }\n\n /**\n * ACP 协议: prompt - 发送用户消息\n *\n * Mock 实现: 复用 sendMessage\n */\n async prompt(request: PromptRequest): Promise<PromptResponse> {\n console.log('[MockAgentProvider] prompt called:', request);\n await this.sendMessage(request);\n // Mock 模式下,返回 end_turn 响应\n return {\n stopReason: 'end_turn',\n };\n }\n\n /**\n * ACP 协议: cancel - 取消消息\n *\n * Mock 实现: 复用 cancelMessage\n */\n async cancel(params: CancelNotification): Promise<void> {\n console.log('[MockAgentProvider] cancel called:', params);\n return this.cancelMessage(params.sessionId);\n }\n\n // ========== ACP 原生事件监听器 ==========\n\n /**\n * 监听会话更新事件(ACP 协议原生)\n */\n onSessionUpdate(callback: (params: SessionUpdateParams) => void): () => void {\n this.sessionUpdateCallbacks.add(callback);\n return () => {\n this.sessionUpdateCallbacks.delete(callback);\n };\n }\n\n /**\n * 监听权限请求事件(ACP 协议原生)\n */\n onRequestPermission(\n callback: (params: PermissionRequestParams) => Promise<PermissionResponse>\n ): () => void {\n this.permissionRequestResolvers.set('__global__', callback);\n return () => {\n this.permissionRequestResolvers.delete('__global__');\n };\n }\n\n /**\n * 监听错误事件(扩展事件,非 ACP 标准协议)\n */\n onError(callback: (error: Error, sessionId?: string) => void): () => void {\n this.errorCallbacks.add(callback);\n return () => {\n this.errorCallbacks.delete(callback);\n };\n }\n\n /**\n * 触发会话更新事件(内部辅助方法)\n */\n private emitSessionUpdate(params: SessionUpdateParams): void {\n console.log('[MockAgentProvider] Emitting session update:', params, 'to', this.sessionUpdateCallbacks.size, 'callbacks');\n\n this.sessionUpdateCallbacks.forEach(callback => {\n try {\n callback(params);\n } catch (error) {\n console.error('[MockAgentProvider] Session update callback error:', error);\n }\n });\n }\n\n /**\n * 触发错误事件(内部辅助方法)\n */\n private emitError(error: Error, sessionId?: string): void {\n console.log('[MockAgentProvider] Emitting error:', error, 'for session:', sessionId);\n\n this.errorCallbacks.forEach(callback => {\n try {\n callback(error, sessionId);\n } catch (err) {\n console.error('[MockAgentProvider] Error callback error:', err);\n }\n });\n }\n\n /**\n * 向后兼容的 emitEvent 方法\n * 将旧的事件格式桥接到新的 ACP 原生事件\n */\n private emitEvent(event: any): void {\n // 根据 event.type 路由到对应的新方法\n if (event.type === 'error') {\n const error = event.data?.error ? new Error(event.data.error) : new Error('Unknown error');\n this.emitError(error, event.sessionId);\n } else if (event.type === 'session_update' && event.notification) {\n // 转换为 SessionUpdateParams\n const params: SessionUpdateParams = {\n notification: event.notification,\n messageId: event.messageId,\n };\n this.emitSessionUpdate(params);\n } else if (event.type === 'connected' || event.type === 'done') {\n // 这些事件类型不再需要,忽略\n console.log('[MockAgentProvider] Ignoring deprecated event type:', event.type);\n } else {\n console.warn('[MockAgentProvider] Unknown event type:', event.type);\n }\n }\n\n /**\n * ACP 协议: initialize - 初始化连接\n *\n * Mock 实现: 返回预设的初始化响应\n */\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n console.log('[MockAgentProvider] initialize', request);\n\n // 模拟网络延迟\n await this.delay(100);\n\n // 返回 Mock 初始化响应\n return mockInitializeResponse;\n }\n\n /**\n * ACP 协议: authenticate - 身份验证\n *\n * Mock 实现: 直接返回成功\n */\n async authenticate(request: AuthenticateRequest): Promise<AuthenticateResponse | void> {\n console.log('[MockAgentProvider] authenticate', request);\n // Mock 模式下不需要身份验证\n return;\n }\n\n /**\n * ACP 协议: newSession - 创建新会话\n *\n * Mock 实现: 生成唯一的 sessionId 并存储会话信息\n */\n async newSession(request: NewSessionRequest): Promise<NewSessionResponse> {\n console.log('[MockAgentProvider] session/new', request);\n\n // 模拟网络延迟\n await this.delay(100);\n\n // 生成唯一的 sessionId (格式: sess_<timestamp>_<random>)\n const sessionId = `sess_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n\n // 存储会话信息\n this.initializedSessions.set(sessionId, {\n cwd: request.cwd,\n mcpServers: request.mcpServers || [],\n createdAt: Date.now()\n });\n\n console.log('[MockAgentProvider] Created session:', sessionId, 'with config:', {\n cwd: request.cwd,\n mcpServers: request.mcpServers\n });\n\n // 返回 sessionId\n return mockNewSessionResponse(sessionId);\n }\n\n /**\n * ACP 协议: session/load - 加载已有会话\n *\n * Mock 实现: 流式回放会话历史(完整的事件回放)\n */\n async loadSession(request: LoadSessionRequest): Promise<LoadSessionResponse> {\n console.log('[MockAgentProvider] session/load', request);\n\n const { sessionId, cwd, mcpServers } = request;\n\n // 更新或添加会话配置\n this.initializedSessions.set(sessionId, {\n cwd,\n mcpServers: mcpServers || [],\n createdAt: Date.now()\n });\n\n // 从 mockSessionHistories 加载历史\n const history = mockSessionHistories.get(sessionId);\n if (history && history.length > 0) {\n console.log('[MockAgentProvider] Loading session from mockSessionHistories:', sessionId, 'with', history.length, 'entries');\n\n // 模拟流式回放会话历史\n for (let i = 0; i < history.length; i++) {\n const message = history[i];\n\n // 检查是否为事件数组格式(JSON 字符串)\n if (message.type === 'assistant' && message.content && message.content.startsWith('[')) {\n try {\n const events: any[] = JSON.parse(message.content);\n console.log('[MockAgentProvider] Replaying events from history:', {\n index: i,\n eventCount: events.length,\n });\n\n // 回放所有事件(通过 emitEvent 桥接)\n for (const event of events) {\n await this.delay(20); // 每个事件间隔 20ms\n this.emitEvent(event);\n }\n } catch (error) {\n console.error('[MockAgentProvider] Failed to parse events from history:', error);\n }\n } else {\n // 旧格式:普通文本消息\n const messageId = `load-${sessionId}-${i}-${Date.now()}`;\n const sessionUpdateType = message.type === 'user'\n ? 'user_message_chunk'\n : 'agent_message_chunk';\n\n await this.delay(50);\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: message.timestamp,\n notification: {\n sessionId,\n update: {\n sessionUpdate: sessionUpdateType,\n content: {\n type: 'text',\n text: message.content,\n }\n }\n } as SessionNotification,\n });\n }\n }\n\n console.log('[MockAgentProvider] Session loaded from mockSessionHistories:', sessionId);\n return {};\n }\n\n // 如果没有任何历史数据\n console.log('[MockAgentProvider] No history found for session:', sessionId);\n return {};\n }\n\n /**\n * ACP 协议: session/request_permission - 请求用户权限\n *\n * Agent 调用此方法来请求用户批准工具调用。\n * 此方法会:\n * 1. 发送 request_permission 事件给 UI\n * 2. 阻塞等待用户响应\n * 3. 返回用户的决策结果\n *\n * @param sessionId ACP 会话 ID\n * @param toolCallId 工具调用 ID\n * @param toolCall 工具调用信息\n * @param options 可用的权限选项\n * @returns 用户的决策结果\n */\n async requestPermission(\n sessionId: string,\n toolCallId: string,\n toolCall: any,\n options: any[]\n ): Promise<{ outcome: 'selected' | 'cancelled'; optionId?: string; timedOut?: boolean }> {\n console.log('[MockAgentProvider] requestPermission called:', { sessionId, toolCallId, toolCall, options });\n\n // 发送权限请求事件给 UI\n this.emitEvent({\n type: 'request_permission',\n sessionId,\n messageId: `permission-${toolCallId}`,\n timestamp: Date.now(),\n data: {\n sessionId,\n toolCall,\n options,\n },\n });\n\n // 阻塞等待用户决策(或超时)\n const permissionOutcome = await new Promise<{\n outcome: 'selected' | 'cancelled';\n optionId?: string;\n timedOut?: boolean;\n }>((resolve) => {\n // 保存解析器,respondToPermissionRequest 会调用它\n this.pendingPermissionResolvers.set(toolCallId, resolve);\n\n // 超时降级:如果 60s 内没有用户响应,默认拒绝(避免无限挂起)\n setTimeout(() => {\n if (this.pendingPermissionResolvers.has(toolCallId)) {\n this.pendingPermissionResolvers.delete(toolCallId);\n console.log('[MockAgentProvider] Permission request timed out:', toolCallId);\n resolve({ outcome: 'cancelled', optionId: 'reject-once', timedOut: true });\n }\n }, 60000);\n });\n\n console.log('[MockAgentProvider] Permission outcome:', permissionOutcome);\n return permissionOutcome;\n }\n\n /**\n * 直接释放权限请求的 await(更直接的方法)\n *\n * 这个方法直接从 pendingPermissionResolvers 中获取 resolver 并调用,\n * 不需要经过 respondToPermissionRequest 的中转。\n *\n * @param toolCallId 工具调用 ID\n * @param outcome 用户的决策结果\n */\n releasePermissionRequest(toolCallId: string, outcome: { outcome: 'selected' | 'cancelled'; optionId?: string }): void {\n console.log('[MockAgentProvider] releasePermissionRequest called:', { toolCallId, outcome });\n\n const resolver = this.pendingPermissionResolvers.get(toolCallId);\n if (resolver) {\n // 直接调用 resolver 释放 await\n resolver({ ...outcome, timedOut: false });\n this.pendingPermissionResolvers.delete(toolCallId);\n console.log('[MockAgentProvider] Permission request released:', toolCallId);\n } else {\n console.warn('[MockAgentProvider] No pending permission request found for:', toolCallId);\n }\n }\n\n /**\n * 响应用户的权限决策(兼容旧接口)\n *\n * 这个方法内部调用 releasePermissionRequest。\n * 保留这个方法是为了向后兼容和符合 ACP 协议的命名规范。\n *\n * @param sessionId ACP 会话 ID(未使用,保留以符合接口)\n * @param payload 权限响应数据\n */\n async respondToPermissionRequest(sessionId: string, payload: {\n toolCallId: string;\n outcome: { outcome: 'selected' | 'cancelled'; optionId?: string }\n }): Promise<void> {\n console.log('[MockAgentProvider] respondToPermissionRequest called:', payload);\n\n // 直接调用 releasePermissionRequest\n this.releasePermissionRequest(payload.toolCallId, payload.outcome);\n }\n\n /**\n * 销毁 Provider\n */\n destroy(): void {\n // 清空所有回调解集合\n this.activeConnections.clear();\n this.pendingPermissionResolvers.clear();\n this.permissionRequestResolvers.clear();\n this.initializedSessions.clear();\n this.sessionUpdateCallbacks.clear();\n this.errorCallbacks.clear();\n // ✅ 清空临时事件缓存\n this.currentSessionUpdates.clear();\n console.log('[MockAgentProvider] Destroyed');\n }\n\n /**\n * 获取所有已初始化的会话列表(扩展方法,非 ACP 标准协议)\n * 返回 sessionId 及其配置信息和标题\n */\n getAllSessions(): Array<{ sessionId: string; title: string; cwd: string; mcpServers: any[]; createdAt: number }> {\n const mockTitles = {\n '1': '开发五子棋游戏',\n '2': '修复登录页面样式',\n '3': 'API 接口优化',\n };\n\n const sessions = Array.from(this.initializedSessions.entries()).map(([sessionId, config]) => ({\n sessionId,\n title: mockTitles[sessionId as keyof typeof mockTitles] || `Session ${sessionId}`,\n ...config,\n }));\n console.log('[MockAgentProvider] Getting all sessions:', sessions.length);\n return sessions;\n }\n\n /**\n * 发送嵌入资源消息 (符合 ACP 协议)\n */\n private async sendMockEmbeddedResource(sessionId: string, messageId: string): Promise<void> {\n console.log(`📎 Sending embedded resource: ${messageId}`);\n\n // 发送文本介绍部分\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-intro`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '这是一个嵌入的 Python 文件示例:\\n\\n',\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 发送嵌入资源内容块\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-resource`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'resource',\n resource: {\n uri: 'file:///mock/example.py',\n mimeType: 'text/x-python',\n text: 'def hello_world():\\n print(\"Hello, World!\")\\n return \"success\"\\n\\nif __name__ == \"__main__\":\\n hello_world()'\n }\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 发送结尾文本\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-conclusion`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '\\n\\n以上是直接嵌入的文件内容,无需额外请求即可显示。',\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n /**\n * 发送资源链接消息 (符合 ACP 协议)\n */\n private async sendMockResourceLink(sessionId: string, messageId: string): Promise<void> {\n console.log(`🔗 Sending resource link: ${messageId}`);\n\n // 发送文本介绍部分\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-intro`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '这是一个指向外部文档的资源链接:\\n\\n',\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 发送资源链接内容块\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-link`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'resource_link',\n uri: 'https://agentclientprotocol.com/protocol/content',\n name: 'ACP Content Protocol',\n mimeType: 'text/html',\n description: 'Agent Client Protocol - Content specification',\n size: BigInt(256000)\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 发送结尾文本\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-conclusion`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '\\n\\n点击上面的链接可以访问完整的协议文档。',\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n /**\n * 发送完整的工具调用流程 (符合 ACP 协议)\n */\n private async sendMockEditDiffToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🔧 Starting tool call flow: ${messageId}`);\n\n\n // 2. 发送工具调用事件 - 使用 ACP 协议的 tool_call session/update\n const toolCallId = `tool-${Date.now()}`;\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Write File',\n kind: 'edit',\n status: 'pending',\n locations: [{ path: 'example.py', line: 0 }]\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n\n // 调用 requestPermission 接口请求用户权限\n // 这个方法会:\n // 1. 发送 request_permission 事件给 UI\n // 2. 阻塞等待用户响应\n // 3. 返回用户的决策结果\n // const permissionOutcome = await this.requestPermission(\n // sessionId,\n // toolCallId,\n // {\n // toolCallId,\n // kind: 'edit',\n // arguments: {\n // file_path: 'example.py',\n // content: 'def hello_world():\\n print(\"Hello from ACP tool call!\")...'\n // }\n // },\n // [\n // { optionId: 'allow-once', name: 'Allow once', kind: 'allow_once' },\n // { optionId: 'reject-once', name: 'Reject', kind: 'reject_once' }\n // ]\n // );\n\n // 根据用户决策推进后续 Mock 行为,区分同意与拒绝,发送不同的 tool_call_update 与消息\n // if (permissionOutcome.outcome === 'selected') {\n const content = `def hello_world():\\n print(\"Hello from ACP tool call!\")\\n return \"success\"\\n\\nif __name__ == \"__main__\":\\n hello_world()`;\n const chunkSize = 10; // 每次发送 10 个字符\n\n for (let i = 0; i < content.length; i += chunkSize) {\n // 获取当前块的内容\n const chunk = content.substring(i, i + chunkSize);\n\n console.log(`🐸 tool call Chunk: \"${chunk}\" | messageId: ${messageId} | sessionId: ${sessionId}`);\n\n // ✅ 5.1 开始执行 (in_progress)\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress', // ✅ 最终完成状态\n content: [\n {\n type: 'diff', // ✅ 使用 diff 类型显示文件修改\n path: 'example.py',\n oldText: '', // 新文件\n newText: chunk\n }\n ],\n locations: [{ path: 'example.py', line: 0 }]\n }\n } as SessionNotification,\n });\n // 模拟网络延迟\n await this.delay(50);\n }\n\n\n // 模拟工具执行时间\n await this.delay(1200);\n\n // ✅ 5.2 执行完成 (completed)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed', // ✅ 最终完成状态\n content: [\n {\n type: 'diff', // ✅ 使用 diff 类型显示文件修改\n path: 'example.py',\n oldText: 'def 213', // 新文件\n newText: 'def hello_world():\\n print(\"Hello from ACP tool call!\")\\n return \"success\"\\n\\nif __name__ == \"__main__\":\\n hello_world()'\n }\n ],\n locations: [{ path: 'example.py', line: 0 }]\n }\n } as SessionNotification,\n });\n\n // 发送总结消息\n await this.delay(300);\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '✅ 工具调用完成!我成功创建了一个名为 `example.py` 的文件。\\n\\nACP 协议工具调用流程:\\n1. `tool_call` (pending) - 创建工具调用\\n2. `tool_call_update` (in_progress) - 开始执行\\n3. `tool_call_update` (completed) - 执行完成\\n\\n这就是完整的工具调用生命周期!',\n }\n }\n } as SessionNotification,\n });\n // } else {\n // // ✅ 5.3 权限拒绝 (failed)\n // await this.delay(300);\n // this.emitEvent({\n // type: 'session_update',\n // sessionId,\n // messageId,\n // timestamp: Date.now(),\n // notification: {\n // sessionId,\n // update: {\n // sessionUpdate: 'tool_call_update',\n // toolCallId,\n // status: 'failed', // ✅ 失败状态\n // content: [\n // {\n // type: 'content',\n // content: {\n // type: 'text',\n // text: permissionOutcome.timedOut\n // ? 'Permission request timed out; tool execution cancelled (mock)'\n // : 'User rejected permission; tool execution cancelled (mock)'\n // }\n // }\n // ]\n // }\n // } as SessionNotification,\n // });\n\n // // 发送总结消息\n // await this.delay(300);\n // this.emitEvent({\n // type: 'session_update',\n // sessionId,\n // messageId: `${messageId}-summary`,\n // timestamp: Date.now(),\n // notification: {\n // sessionId,\n // update: {\n // sessionUpdate: 'agent_message_chunk',\n // content: {\n // type: 'text',\n // text: permissionOutcome.timedOut\n // ? '⏰ 权限请求超时,工具调用已取消(mock)。'\n // : '❌ 已拒绝执行写文件操作,工具调用已取消(mock)。',\n // }\n // }\n // } as SessionNotification,\n // });\n // }\n\n await this.delay(100);\n\n // 5. 发送工具调用完成后的总结消息\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '✅ 工具调用完成!我成功创建了一个名为 `example.py` 的文件。\\n\\n工具调用流程包括:\\n1. 发送工具调用请求 (tool_call)\\n2. 返回执行结果 (tool_call_update)\\n\\n这就是 ACP 协议中完整的工具调用生命周期。',\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n\n\n private async sendMockEditContentToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🔧 Starting tool call flow: ${messageId}`);\n\n // 2. 发送工具调用事件 - 使用 ACP 协议的 tool_call session/update\n const toolCallId = `tool-${Date.now()}`;\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n \"codebuddy.ai\": {\n toolName: 'write_to_file',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Write File',\n kind: 'edit',\n status: 'pending',\n locations: [{ path: 'example-edit-content.py', line: 0 }]\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n\n\n const content = `def hello_world():\\n print(\"Hello from ACP tool call!\")\\n return \"success\"\\n\\nif __name__ == \"__main__\":\\n hello_world()`;\n const chunkSize = 10; // 每次发送 10 个字符\n\n let accumulatedInput = '';\n for (let i = 0; i < content.length; i += chunkSize) {\n // 获取当前块的内容\n const chunk = content.substring(i, i + chunkSize);\n accumulatedInput += chunk;\n\n console.log(`🐸 tool call Chunk: \"${chunk}\" | messageId: ${messageId} | sessionId: ${sessionId}`);\n\n // ✅ 5.1 开始执行 (in_progress)\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n \"codebuddy.ai\": {\n toolName: 'write_to_file',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress', // ✅ 最终完成状态\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: accumulatedInput,\n\n }\n }\n ],\n rawInput: {\n \"filePath\": \"example-edit-content.py\",\n \"content\": accumulatedInput,\n },\n locations: [{ path: 'example-edit-content.py', line: 0 }]\n }\n } as SessionNotification,\n });\n // 模拟网络延迟\n await this.delay(50);\n }\n\n\n // 模拟工具执行时间\n await this.delay(1200);\n\n // ✅ 5.2 执行完成 (completed)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n \"codebuddy.ai\": {\n toolName: 'write_to_file',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed', // ✅ 最终完成状态\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: content\n }\n }\n ],\n rawOutput: {\n \"type\": 'write_to_file_result',\n \"path\": \"example-edit-content.py\",\n \"addLineCount\": 10,\n \"removedLines\": 20,\n },\n locations: [{ path: 'example-edit-content.py', line: 0 }]\n }\n } as SessionNotification,\n });\n\n // 发送总结消息\n await this.delay(300);\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n \"codebuddy.ai\": {\n toolName: 'write_to_file',\n },\n },\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '✅ 工具调用完成!我成功创建了一个名为 `example.py` 的文件。\\n\\nACP 协议工具调用流程:\\n1. `tool_call` (pending) - 创建工具调用\\n2. `tool_call_update` (in_progress) - 开始执行\\n3. `tool_call_update` (completed) - 执行完成\\n\\n这就是完整的工具调用生命周期!',\n }\n },\n rawInput: {\n \"filePath\": \"example-edit-content.py\",\n \"content\": accumulatedInput,\n }\n } as SessionNotification,\n });\n\n\n await this.delay(100);\n\n // 5. 发送工具调用完成后的总结消息\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: '✅ 工具调用完成!我成功创建了一个名为 `example.py` 的文件。\\n\\n工具调用流程包括:\\n1. 发送工具调用请求 (tool_call)\\n2. 返回执行结果 (tool_call_update)\\n\\n这就是 ACP 协议中完整的工具调用生命周期。',\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n\n /**\n * 发送完整的工具调用流程 - kind 为 read (符合 ACP 协议)\n *\n * 模拟 read_file 工具调用流程,流式发送 rawInput 和 rawOutput\n */\n private async sendMockReadContentToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`📖 Starting read tool call flow: ${messageId}`);\n\n // 配置:模拟读取文件\n const filePath = '/Users/liumingyuan/Project/caseTest/subagent/test.js';\n const toolCallId = `tool-${Date.now()}`;\n\n // 1. 发送 tool_call (pending) - 不带 rawInput\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'read_file'\n }\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Read File',\n status: 'pending',\n locations: [{ path: filePath, line: 0 }]\n }\n } as SessionNotification\n });\n\n console.log('[MockAgentProvider] tool_call (pending) sent');\n await this.delay(100);\n\n // 2. 流式发送 rawInput (模拟参数逐个到达)\n // 将 filePath 分块流式发送\n const filePathChunks = [\n '/Users/liumingyuan/',\n 'Project/caseTest',\n '/subagent/',\n 'test.js'\n ];\n\n let accumulatedInput = '';\n for (const chunk of filePathChunks) {\n accumulatedInput += chunk;\n\n // 尝试解析累积的 input\n try {\n // const parsed = JSON.parse(accumulatedInput);\n // const rawInput: ReadFileInput = {\n // filePath: parsed.filePath\n // };\n\n // 验证 rawInput\n // const inputValidation = validateToolInput('read_file', rawInput);\n // if (inputValidation.success) {\n // 发送 tool_call_update with rawInput\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'read_file'\n }\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n rawInput: {\n filePath: accumulatedInput\n }\n }\n } as SessionNotification\n });\n await this.delay(100);\n console.log('[MockAgentProvider] tool_call_update with rawInput:', chunk);\n // }\n } catch {\n // JSON 还未完整,继续累积\n }\n\n\n }\n\n // Mock file content\n const fileContent = `/**\n * Test file for subagent functionality\n */\n\nfunction helloWorld() {\n console.log('Hello from test.js!');\n return 'success';\n}\n\nclass TestClass {\n constructor(name) {\n this.name = name;\n }\n\n greet() {\n return \\`Hello, \\${this.name}!\\`;\n }\n}\n\n// Export functions\nmodule.exports = {\n helloWorld,\n TestClass\n};\n`;\n\n const totalLineCount = 26;\n const chunkSize = 20;\n let accumulatedContent = '';\n\n // 3. 流式返回结果 with in_progress\n for (let i = 0; i < fileContent.length; i += chunkSize) {\n const chunk = fileContent.substring(i, i + chunkSize);\n accumulatedContent += chunk;\n const progress = Math.round(((i + chunkSize) / fileContent.length) * 100);\n const isLastChunk = (i + chunkSize) >= fileContent.length;\n\n const rawOutput: ReadFileResult = {\n type: 'read_file_result',\n path: filePath,\n content: accumulatedContent,\n totalLineCount,\n hasMore: !isLastChunk,\n hint: `Reading file... ${Math.min(progress, 100)}% complete`\n };\n\n // 验证 rawOutput\n const outputValidation = validateToolOutput('read_file', rawOutput);\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'read_file'\n }\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: accumulatedContent\n }\n }\n ],\n locations: [{ path: filePath, line: 0 }],\n rawOutput: (outputValidation.success ? outputValidation.data : rawOutput) as unknown as Record<string, unknown>\n }\n } as SessionNotification\n });\n\n console.log(`📖 Read chunk ${i / chunkSize + 1}: progress ${progress}%`);\n await this.delay(30);\n }\n\n // 4. 发送 completed 事件\n const finalRawOutput: ReadFileResult = {\n type: 'read_file_result',\n path: filePath,\n content: fileContent,\n totalLineCount,\n hasMore: false\n };\n\n const finalOutputValidation = validateToolOutput('read_file', finalRawOutput);\n if (!finalOutputValidation.success) {\n throw new Error(`Invalid rawOutput: ${JSON.stringify(finalOutputValidation.error.errors)}`);\n }\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: fileContent\n }\n }\n ],\n locations: [{ path: filePath, line: 0 }],\n rawOutput: finalOutputValidation.data as unknown as Record<string, unknown>\n }\n } as SessionNotification\n });\n\n console.log('[MockAgentProvider] tool_call_update (completed) sent');\n }\n\n /**\n * 发送 search_content 工具调用流程 (符合 ACP 协议)\n *\n * 用于模拟在文件内容中搜索特定文本的工具调用\n * 支持显示匹配的文件路径、行号和上下文内容\n */\n private async sendMockSearchContentToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🔍 Starting search_content tool call flow: ${messageId}`);\n\n const pattern = '一行工具';\n const directory = '/Users/liumingyuan/Project/caseTest/subagent';\n\n // 1. 发送工具调用事件\n const toolCallId = `tool-sc-${Date.now()}`;\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n \"codebuddy.ai\": {\n toolName: 'search_content',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Search Content',\n kind: 'search', // ✅ kind 为 search\n status: 'pending',\n locations: [{ path: directory, line: 0 }],\n rawInput: {\n pattern,\n directory,\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n\n // 2. 发送 in_progress 状态和搜索结果\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Searching for \"${pattern}\" in ${directory}...`,\n }\n }\n ],\n locations: [{ path: directory, line: 0 }]\n }\n } as SessionNotification,\n });\n\n await this.delay(500);\n\n // 3. 发送完成状态和匹配结果\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Found 1 matching result\\n\\nconvert_to_oneline.py\\n 56| print(\"文件内容转一行工具\")\\n`,\n }\n }\n ],\n locations: [{ path: directory, line: 0 }],\n rawOutput: {\n pattern,\n directory,\n matches: [\n {\n filePath: 'convert_to_oneline.py',\n fileName: 'convert_to_oneline.py',\n content: ' print(\"文件内容转一行工具\")',\n startLine: 56,\n endLine: 56,\n }\n ],\n totalCount: 1,\n hasMore: false,\n }\n }\n } as SessionNotification,\n });\n\n // 4. 发送总结消息\n await this.delay(300);\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: `✅ 内容搜索完成!在 \\`${directory}\\` 目录中找到 1 个匹配结果。\\n\\n**搜索结果:**\\n- \\`convert_to_oneline.py\\` 第 56 行: \\`print(\"文件内容转一行工具\")\\`\\n\\n**工具调用流程:**\\n1. \\`tool_call\\` (pending) - 创建搜索工具调用\\n2. \\`tool_call_update\\` (in_progress) - 执行搜索\\n3. \\`tool_call_update\\` (completed) - 返回匹配结果`,\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n /**\n * 发送 search_file 工具调用流程 (符合 ACP 协议)\n *\n * 用于模拟按文件名模式搜索文件的工具调用\n * 支持递归搜索和文件大小显示\n */\n private async sendMockSearchFileToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🔍 Starting search_file tool call flow: ${messageId}`);\n\n const pattern = '*.py';\n const directory = '/Users/liumingyuan/Project/caseTest/subagent';\n\n // 1. 发送工具调用事件\n const toolCallId = `tool-sf-${Date.now()}`;\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n \"codebuddy.ai\": {\n toolName: 'search_file',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Search File',\n kind: 'search', // ✅ kind 为 search\n status: 'pending',\n locations: [{ path: directory, line: 0 }],\n rawInput: {\n target_directory: directory,\n pattern,\n recursive: true,\n caseSensitive: false,\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n\n // 2. 发送 in_progress 状态\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Searching for files matching \"${pattern}\" in ${directory}...`,\n }\n }\n ],\n locations: [{ path: directory, line: 0 }]\n }\n } as SessionNotification,\n });\n\n await this.delay(500);\n\n // 3. 发送完成状态和搜索结果\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Found 5 files\\n\\nbubble_sort.py (10.38 KB)\\nconvert_to_oneline.py (2.2 KB)\\ntls12_examples.py (4.58 KB)\\n.codebuddy/skills/analyzing-financial-statements/calculate_ratios.py (12.22 KB)\\n.codebuddy/skills/analyzing-financial-statements/interpret_ratios.py (15.83 KB)\\n`,\n }\n }\n ],\n locations: [{ path: directory, line: 0 }],\n rawOutput: {\n path: directory,\n pattern,\n recursive: true,\n caseSensitive: false,\n results: [\n { filePath: 'bubble_sort.py', size: '10.38 KB' },\n { filePath: 'convert_to_oneline.py', size: '2.2 KB' },\n { filePath: 'tls12_examples.py', size: '4.58 KB' },\n { filePath: '.codebuddy/skills/analyzing-financial-statements/calculate_ratios.py', size: '12.22 KB' },\n { filePath: '.codebuddy/skills/analyzing-financial-statements/interpret_ratios.py', size: '15.83 KB' },\n ],\n }\n }\n } as SessionNotification,\n });\n\n // 4. 发送总结消息\n await this.delay(300);\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: `✅ 文件搜索完成!在 \\`${directory}\\` 目录中找到 5 个匹配的 Python 文件。\\n\\n**搜索结果:**\\n- \\`bubble_sort.py\\` (10.38 KB)\\n- \\`convert_to_oneline.py\\` (2.2 KB)\\n- \\`tls12_examples.py\\` (4.58 KB)\\n- \\`.codebuddy/skills/analyzing-financial-statements/calculate_ratios.py\\` (12.22 KB)\\n- \\`.codebuddy/skills/analyzing-financial-statements/interpret_ratios.py\\` (15.83 KB)\\n\\n**工具调用流程:**\\n1. \\`tool_call\\` (pending) - 创建搜索工具调用\\n2. \\`tool_call_update\\` (in_progress) - 执行搜索\\n3. \\`tool_call_update\\` (completed) - 返回搜索结果`,\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n /**\n * 发送删除文件工具调用流程 (符合 ACP 协议)\n *\n * 用于模拟删除文件的工具调用\n * 支持显示删除操作的进度和结果\n */\n private async sendMockDeleteFileToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🗑️ Starting delete_file tool call flow: ${messageId}`);\n\n // 配置:模拟删除文件\n const targetFile = '/Users/liumingyuan/Project/caseTest/subagent/temp_file.txt';\n const toolCallId = `tool-df-${Date.now()}`;\n\n // 1. 发送 tool_call (pending) - 不带 rawInput\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'delete_file'\n }\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Delete File',\n status: 'pending',\n locations: [{ path: targetFile, line: 0 }]\n }\n } as SessionNotification\n });\n\n console.log('[MockAgentProvider] delete_file tool_call (pending) sent');\n await this.delay(200);\n\n // 2. 流式发送 rawInput (模拟参数逐个到达)\n // 将 target_file 分块流式发送\n const filePathChunks = [\n '/Users/liumingyuan/',\n 'Project/caseTest',\n '/subagent/',\n 'temp_file.txt'\n ];\n\n let accumulatedInput = '';\n for (const chunk of filePathChunks) {\n accumulatedInput += chunk;\n\n // 发送 tool_call_update with rawInput\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'delete_file'\n }\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n rawInput: {\n target_file: accumulatedInput,\n explanation: 'Deleting temporary test file'\n }\n }\n } as SessionNotification\n });\n await this.delay(100);\n console.log('[MockAgentProvider] delete_file tool_call_update with rawInput:', chunk);\n }\n\n await this.delay(300);\n\n // 3. 模拟删除操作进度\n const progressSteps = [\n { progress: 25, message: 'Checking file permissions...' },\n { progress: 50, message: 'Validating file path...' },\n { progress: 75, message: 'Removing file...' },\n { progress: 100, message: 'File deleted successfully' }\n ];\n\n for (const step of progressSteps) {\n const rawOutput: DeleteFilesResult = {\n type: 'delete_file_result',\n path: targetFile,\n recursive: false,\n hint: step.message\n };\n\n // 验证 rawOutput\n const outputValidation = validateToolOutput('delete_file', rawOutput);\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'delete_file'\n }\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: step.progress === 100 ? 'deleted' : 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `🗑️ ${step.message} (${step.progress}%)`\n }\n }\n ],\n locations: [{ path: targetFile, line: 0 }],\n rawOutput: (outputValidation.success ? outputValidation.data : rawOutput) as unknown as Record<string, unknown>\n }\n } as SessionNotification\n });\n\n console.log(`🗑️ Delete progress: ${step.progress}% - ${step.message}`);\n await this.delay(200);\n }\n\n // 4. 发送最终完成事件\n const finalRawOutput: DeleteFilesResult = {\n type: 'delete_file_result',\n path: targetFile,\n recursive: false,\n hint: 'File successfully deleted from filesystem'\n };\n\n const finalOutputValidation = validateToolOutput('delete_file', finalRawOutput);\n if (!finalOutputValidation.success) {\n throw new Error(`Invalid delete_file rawOutput: ${JSON.stringify(finalOutputValidation.error.errors)}`);\n }\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `✅ 文件删除完成!\\n\\n**删除的文件:** \\`${targetFile}\\`\\n\\n**操作详情:**\\n- 文件路径验证 ✓\\n- 权限检查 ✓\\n- 文件删除 ✓\\n\\n文件已从文件系统中成功移除。`\n }\n }\n ],\n locations: [{ path: targetFile, line: 0 }],\n rawOutput: finalOutputValidation.data as unknown as Record<string, unknown>\n }\n } as SessionNotification\n });\n\n console.log('[MockAgentProvider] delete_file tool_call_update (completed) sent');\n\n // 5. 发送总结消息\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: `🗑️ **删除文件工具调用演示完成**\\n\\n**工具调用流程:**\\n1. \\`tool_call\\` (pending) - 创建删除文件工具调用\\n2. \\`tool_call_update\\` (in_progress) - 流式发送参数和执行删除操作\\n3. \\`tool_call_update\\` (completed) - 返回删除结果\\n\\n**rawInput 包含:**\\n- \\`target_file\\`: 要删除的文件路径\\n- \\`explanation\\`: 删除原因说明\\n\\n**rawOutput 包含:**\\n- \\`type\\`: 'delete_file_result'\\n- \\`path\\`: 被删除的文件路径\\n- \\`recursive\\`: 是否递归删除\\n- \\`hint\\`: 操作提示信息`,\n }\n }\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n /**\n * 发送 ask_followup_question 工具调用流程 (符合 ACP 协议)\n *\n * 用于模拟向用户提问并获取回答的工具调用\n * 数据结构与 genie-ide 保持一致:question (单个问题字符串) + options (选项数组)\n */\n private async sendMockAskFollowupQuestionToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`❓ Starting ask_followup_question tool call flow: ${messageId}`);\n\n const toolCallId = `tool-afq-${Date.now()}`;\n\n // 问题数据 - 与 genie-ide 保持一致的数据结构\n const question = '你希望创建什么类型的项目?';\n const options = [\n 'Web 应用(前端 + 后端)',\n '命令行工具(CLI)',\n '移动应用(React Native / Flutter)',\n '桌面应用(Electron)',\n '后端服务(API / 微服务)',\n ];\n\n // 1. 发送 tool_call (pending)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'ask_followup_question',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Ask Followup Question',\n kind: 'other',\n status: 'pending',\n rawInput: {\n question,\n options: JSON.stringify(options),\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(100);\n\n // 2. 发送 tool_call_update (in_progress) - 显示问题\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'ask_followup_question',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n rawInput: {\n question,\n options: JSON.stringify(options),\n },\n },\n } as SessionNotification,\n });\n\n console.log('[MockAgentProvider] ask_followup_question tool displayed, waiting for user interaction...');\n // 工具显示完成,等待用户交互(暂未实现交互逻辑)\n }\n\n /**\n * 发送 list_dir 工具调用流程 (符合 ACP 协议)\n *\n * 用于模拟列出目录中的文件\n * 数据结构符合 tool-schemas.ts 中的 ListDirInput 和 ListFilesResult\n */\n private async sendMockListFilesToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`📁 Starting list_dir tool call flow: ${messageId}`);\n\n const target_directory = '/Users/test/project/src';\n const toolCallId = `tool-ld-${Date.now()}`;\n\n // Mock 文件列表数据 - 符合 ListFilesResult.files 格式\n const mockFiles = [\n { filePath: `${target_directory}/index.ts`, size: '2.5 KB', modifyTime: '2024-01-15 10:30:00' },\n { filePath: `${target_directory}/App.tsx`, size: '8.2 KB', modifyTime: '2024-01-15 09:45:00' },\n { filePath: `${target_directory}/utils.ts`, size: '1.8 KB', modifyTime: '2024-01-14 16:20:00' },\n { filePath: `${target_directory}/components/`, size: '-', modifyTime: '2024-01-15 11:00:00' },\n { filePath: `${target_directory}/hooks/`, size: '-', modifyTime: '2024-01-14 14:30:00' },\n { filePath: `${target_directory}/styles/`, size: '-', modifyTime: '2024-01-13 09:00:00' },\n { filePath: `${target_directory}/types.d.ts`, size: '3.1 KB', modifyTime: '2024-01-12 18:45:00' },\n { filePath: `${target_directory}/constants.ts`, size: '0.9 KB', modifyTime: '2024-01-10 12:00:00' },\n ];\n\n // 生成 listing 格式的文本输出\n const listing = mockFiles\n .map(f => {\n const name = f.filePath.split('/').pop() || '';\n const isDir = f.filePath.endsWith('/');\n return isDir ? `📁 ${name}` : `📄 ${name} (${f.size})`;\n })\n .join('\\n');\n\n // 1. 发送 tool_call (pending)\n // rawInput 符合 ListDirInput: { target_directory, ignore_globs? }\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'list_dir',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'List Directory',\n kind: 'search',\n status: 'pending',\n locations: [{ path: target_directory, line: 0 }],\n rawInput: {\n target_directory,\n // ignore_globs 是可选的,这里不传\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(100);\n\n // 2. 发送 tool_call_update (in_progress)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'list_dir',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Listing directory ${target_directory}...`,\n },\n },\n ],\n locations: [{ path: target_directory, line: 0 }],\n },\n } as SessionNotification,\n });\n\n await this.delay(300);\n\n // 3. 发送 tool_call_update (completed) 包含文件列表\n // rawOutput 符合 ListFilesResult: { type, files, root, listing? }\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'list_dir',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Listed ${mockFiles.length} items in ${target_directory}`,\n },\n },\n ],\n locations: [{ path: target_directory, line: 0 }],\n rawOutput: {\n type: 'list_files_result',\n files: mockFiles,\n root: target_directory,\n listing: listing,\n },\n },\n } as SessionNotification,\n });\n\n console.log('[MockAgentProvider] list_dir tool call completed');\n }\n\n /**\n * 发送 preview_url 工具调用流程 (符合 ACP 协议)\n *\n * 用于测试 unknown-tool-renderer 的显示效果\n * preview_url 是一个未知工具,会使用 UnknownToolRenderer 渲染\n */\n private async sendMockPreviewUrlToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🌐 Starting preview_url tool call flow: ${messageId}`);\n\n const toolCallId = `tool-pu-${Date.now()}`;\n const url = 'https://example.com/preview';\n\n // 1. 发送 tool_call (pending)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'preview_url',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Preview URL',\n kind: 'other',\n status: 'pending',\n rawInput: {\n url,\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 2. 发送 tool_call_update (in_progress)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'preview_url',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Loading preview for ${url}...`,\n },\n },\n ],\n },\n } as SessionNotification,\n });\n\n await this.delay(800);\n\n // 3. 发送 tool_call_update (completed)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'preview_url',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Preview loaded successfully for ${url}`,\n },\n },\n ],\n rawOutput: {\n url,\n title: 'Example Domain',\n screenshot: 'base64-encoded-screenshot-data...',\n status: 200,\n },\n },\n } as SessionNotification,\n });\n\n console.log('[MockAgentProvider] preview_url tool call completed');\n }\n\n /**\n * 发送 list_code_definition_names 工具调用流程 (符合 ACP 协议)\n *\n * 用于测试 unknown-tool-renderer 的显示效果\n * list_code_definition_names 是一个未知工具,会使用 UnknownToolRenderer 渲染\n */\n private async sendMockListCodeDefinitionNamesToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`📝 Starting list_code_definition_names tool call flow: ${messageId}`);\n\n const toolCallId = `tool-lcd-${Date.now()}`;\n const filePath = '/Users/test/project/src/utils.ts';\n\n // 1. 发送 tool_call (pending)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'list_code_definition_names',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'List Code Definitions',\n kind: 'other',\n status: 'pending',\n rawInput: {\n filePath,\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 2. 发送 tool_call_update (in_progress)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'list_code_definition_names',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Analyzing code definitions in ${filePath}...`,\n },\n },\n ],\n },\n } as SessionNotification,\n });\n\n await this.delay(600);\n\n // 3. 发送 tool_call_update (completed)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'list_code_definition_names',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Found 5 code definitions in ${filePath}`,\n },\n },\n ],\n rawOutput: {\n filePath,\n definitions: [\n { name: 'formatDate', type: 'function', line: 5 },\n { name: 'parseJSON', type: 'function', line: 15 },\n { name: 'debounce', type: 'function', line: 28 },\n { name: 'Config', type: 'interface', line: 42 },\n { name: 'DEFAULT_OPTIONS', type: 'const', line: 55 },\n ],\n },\n },\n } as SessionNotification,\n });\n\n console.log('[MockAgentProvider] list_code_definition_names tool call completed');\n }\n\n /**\n * 发送 web_fetch 工具调用流程 (符合 ACP 协议)\n *\n * 用于模拟从 URL 获取网页内容的工具调用\n */\n private async sendMockWebFetchToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🌐 Starting web_fetch tool call flow: ${messageId}`);\n\n const toolCallId = `tool-wf-${Date.now()}`;\n const targetUrl = 'https://github.com/anthropics/claude-code';\n\n // 1. 发送 tool_call (pending)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'web_fetch',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Web Fetch',\n kind: 'other',\n status: 'pending',\n rawInput: {\n url: targetUrl,\n fetchInfo: 'Fetching page content...',\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 2. 流式发送 rawInput(模拟 URL 逐步到达)\n const urlChunks = [\n 'https://github.com/',\n 'anthropics/',\n 'claude-code',\n ];\n\n let accumulatedUrl = '';\n for (const chunk of urlChunks) {\n accumulatedUrl += chunk;\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'web_fetch',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n rawInput: {\n url: accumulatedUrl,\n fetchInfo: 'Fetching page content...',\n },\n },\n } as SessionNotification,\n });\n await this.delay(100);\n console.log('[MockAgentProvider] web_fetch tool_call_update with rawInput:', chunk);\n }\n\n await this.delay(500);\n\n // 3. 模拟获取进度\n const progressSteps = [\n { loading: 'Connecting to server...' },\n { loading: 'Downloading content...' },\n { loading: 'Parsing HTML...' },\n ];\n\n for (const step of progressSteps) {\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'web_fetch',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n rawInput: {\n url: targetUrl,\n fetchInfo: step.loading,\n },\n rawOutput: {\n loading: step.loading,\n },\n },\n } as SessionNotification,\n });\n console.log(`🌐 Fetch progress: ${step.loading}`);\n await this.delay(300);\n }\n\n // 4. 发送完成事件,包含模拟的网页内容\n const mockWebContent = `# Claude Code\n\nClaude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster through natural conversation.\n\n## Features\n\n- **Agentic coding**: Claude Code can read, write, and edit files, run commands, and more.\n- **Context-aware**: Claude Code understands your entire codebase and can answer questions about it.\n- **Natural conversation**: Just describe what you want to do in plain English.\n\n## Installation\n\n\\`\\`\\`bash\nnpm install -g @anthropic-ai/claude-code\n\\`\\`\\`\n\n## Usage\n\n\\`\\`\\`bash\nclaude-code\n\\`\\`\\`\n\nStart a conversation with Claude Code and let it help you with your coding tasks!`;\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'web_fetch',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n rawInput: {\n url: targetUrl,\n fetchInfo: 'Fetch web page content',\n },\n rawOutput: {\n title: 'Claude Code - GitHub',\n favicon: 'https://github.githubassets.com/favicons/favicon.svg',\n data: mockWebContent,\n },\n },\n } as SessionNotification,\n });\n\n console.log('[MockAgentProvider] web_fetch tool_call_update (completed) sent');\n\n // 5. 发送总结消息\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: `🌐 **Web Fetch 工具调用演示完成**\\n\\n**工具调用流程:**\\n1. \\`tool_call\\` (pending) - 创建 web_fetch 工具调用\\n2. \\`tool_call_update\\` (in_progress) - 流式发送 URL 和获取进度\\n3. \\`tool_call_update\\` (completed) - 返回网页内容\\n\\n**rawInput 包含:**\\n- \\`url\\`: 目标 URL\\n- \\`fetchInfo\\`: 获取说明\\n\\n**rawOutput 包含:**\\n- \\`title\\`: 网页标题\\n- \\`favicon\\`: 网站图标\\n- \\`data\\`: 网页内容(Markdown 格式)`,\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(100);\n }\n\n /**\n * 发送 web_search 工具调用流程 (符合 ACP 协议)\n *\n * 用于模拟网络搜索的工具调用\n * 数据结构符合 tool-schemas.ts 中的 web_search 定义\n */\n private async sendMockWebSearchToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🔍 Starting web_search tool call flow: ${messageId}`);\n\n const toolCallId = `tool-ws-${Date.now()}`;\n const searchTerm = 'TypeScript 5.0 new features';\n const explanation = 'Searching for the latest TypeScript 5.0 features to provide accurate and up-to-date information.';\n\n // 1. 发送 tool_call (pending)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'web_search',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Web Search',\n kind: 'search',\n status: 'pending',\n rawInput: {\n searchTerm,\n explanation,\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 2. 发送 tool_call_update (in_progress) - 流式显示搜索中\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'web_search',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `🔍 Searching the web for \"${searchTerm}\"...`,\n },\n },\n ],\n rawInput: {\n searchTerm,\n explanation,\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(800);\n\n // 3. 发送 tool_call_update (completed) - 包含搜索结果\n const searchResults = [\n {\n title: 'Announcing TypeScript 5.0 - TypeScript Blog',\n url: 'https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/',\n snippet: 'TypeScript 5.0 brings many new features, including decorators, const type parameters, and improvements to enums. This release also includes significant performance improvements...',\n publishedDate: '2023-03-16',\n },\n {\n title: 'TypeScript 5.0: What\\'s New - LogRocket Blog',\n url: 'https://blog.logrocket.com/whats-new-typescript-5-0/',\n snippet: 'TypeScript 5.0 introduces several exciting features: ECMAScript decorators, const type parameters, multiple config extends, all enums are union enums, and more...',\n publishedDate: '2023-04-10',\n },\n {\n title: 'TypeScript 5.0 Release Notes - GitHub',\n url: 'https://github.com/microsoft/TypeScript/releases/tag/v5.0.0',\n snippet: 'Official release notes for TypeScript 5.0. Key highlights include: Decorators, const Type Parameters, Supporting Multiple Configuration Files in extends...',\n publishedDate: '2023-03-16',\n },\n {\n title: 'A Complete Guide to TypeScript 5.0 Features - Medium',\n url: 'https://medium.com/typescript-5-features-guide',\n snippet: 'Explore all the new features in TypeScript 5.0: decorators with metadata, const type parameters for better type inference, improved module resolution...',\n publishedDate: '2023-05-22',\n },\n {\n title: 'TypeScript 5.0 Performance Improvements',\n url: 'https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html',\n snippet: 'TypeScript 5.0 includes significant performance improvements: faster type checking, reduced memory usage, and improved build times. Package size reduced by 50%...',\n publishedDate: '2023-03-16',\n },\n ];\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'web_search',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `Found ${searchResults.length} results for \"${searchTerm}\"`,\n },\n },\n ],\n rawInput: {\n searchTerm,\n explanation,\n },\n rawOutput: {\n query: searchTerm,\n totalResults: searchResults.length,\n results: searchResults,\n searchEngine: 'web',\n timestamp: new Date().toISOString(),\n },\n },\n } as SessionNotification,\n });\n\n // 4. 发送总结消息\n await this.delay(300);\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId: `${messageId}-summary`,\n timestamp: Date.now(),\n notification: {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: {\n type: 'text',\n text: `🔍 **Web 搜索完成**\\n\\n**搜索词:** \\`${searchTerm}\\`\\n\\n**搜索结果:** 找到 ${searchResults.length} 个相关结果\\n\\n**主要发现:**\\n1. **TypeScript 5.0 新特性** - 包括装饰器、const 类型参数、枚举改进等\\n2. **性能提升** - 类型检查更快,内存使用减少,包大小减少 50%\\n3. **配置增强** - 支持多配置文件继承\\n\\n**工具调用流程:**\\n1. \\`tool_call\\` (pending) - 创建搜索工具调用\\n2. \\`tool_call_update\\` (in_progress) - 执行网络搜索\\n3. \\`tool_call_update\\` (completed) - 返回搜索结果\\n\\n**rawInput 包含:**\\n- \\`searchTerm\\`: 搜索关键词\\n- \\`explanation\\`: 搜索原因说明\\n\\n**rawOutput 包含:**\\n- \\`query\\`: 搜索查询\\n- \\`totalResults\\`: 结果总数\\n- \\`results\\`: 搜索结果数组(包含 title、url、snippet、publishedDate)`,\n },\n },\n } as SessionNotification,\n });\n\n console.log('[MockAgentProvider] web_search tool call completed');\n }\n\n /**\n * 发送 read_lints 工具调用流程 (符合 ACP 协议)\n *\n * 数据结构 (来自 tool-schemas.ts):\n * - Input: ReadLintsInput = { paths?: string }\n * - Output: ReadLintsResult = {\n * type: 'read_lints_result';\n * diagnostics: string[];\n * totalCount?: number;\n * hint?: string;\n * isTruncated?: boolean;\n * }\n */\n private async sendMockReadLintsToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`🔍 Starting read_lints tool call flow: ${messageId}`);\n\n const toolCallId = `tool-rl-${Date.now()}`;\n const targetPath = '/Users/test/project/src/components/Button.tsx';\n\n // 1. 发送 tool_call (pending)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'read_lints',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Read Lints',\n kind: 'read',\n status: 'pending',\n rawInput: {\n paths: targetPath,\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(200);\n\n // 2. 发送 tool_call_update (in_progress)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'read_lints',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n rawInput: {\n paths: targetPath,\n },\n },\n } as SessionNotification,\n });\n\n await this.delay(300);\n\n // 3. 发送 tool_call_update (completed) - 包含 lint 错误\n const diagnosticsText = `Button.tsx - ERROR (3 issues)\n[ERROR] Line 15, Column 8: 'useState' is defined but never used. Consider removing this import.\n[ERROR] Line 23, Column 12: Type 'string' is not assignable to type 'number'. Expected a numeric value.\n[ERROR] Line 45, Column 4: Missing return statement in function that is expected to return 'ReactNode'.`;\n\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'read_lints',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n rawInput: {\n paths: targetPath,\n },\n rawOutput: {\n type: 'read_lints_result',\n diagnostics: [diagnosticsText],\n totalCount: 3,\n hint: 'Found 3 lint errors in Button.tsx',\n isTruncated: false,\n },\n },\n } as SessionNotification,\n });\n\n console.log('[MockAgentProvider] read_lints tool call completed');\n }\n\n /**\n * 发送 execute_command 工具调用流程 (符合 ACP 协议)\n *\n * 数据结构 (来自 tool-schemas.ts):\n * - Input: ExecuteCommandInput = { command: string; requires_approval: boolean; }\n * - Output: ExecuteCommandResult = {\n * type: 'execute_command_result';\n * stdout: string;\n * stderr: string;\n * exitCode: number;\n * hint?: string;\n * serviceInfo?: { isWatchCommand, isServiceOutput, serviceReady, message };\n * use_standalone_terminal?: boolean;\n * }\n */\n private async sendMockExecuteCommandToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`💻 Starting execute_command tool call flow: ${messageId}`);\n const toolCallId = `tool-ec-${Date.now()}`;\n const command = 'npm run build';\n // 1. 发送 tool_call (pending)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'execute_command',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Execute Command',\n kind: 'execute',\n status: 'pending',\n rawInput: {\n command,\n requires_approval: false,\n },\n },\n } as SessionNotification,\n });\n await this.delay(200);\n // 2. 发送 tool_call_update (in_progress) - 模拟命令执行中\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'execute_command',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'in_progress',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: '> npm run build\\n\\nRunning build script...',\n },\n },\n ],\n },\n } as SessionNotification,\n });\n await this.delay(1000);\n // 3. 发送 tool_call_update (completed) - 命令执行完成\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'execute_command',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: '> npm run build\\n\\n> genie@1.0.0 build\\n> tsc -b\\n\\nBuild completed successfully.',\n },\n },\n ],\n rawOutput: {\n type: 'execute_command_result',\n stdout: '> genie@1.0.0 build\\n> tsc -b\\n\\nBuild completed successfully.',\n stderr: '',\n exitCode: 0,\n hint: 'Build completed in 2.5s',\n },\n },\n } as SessionNotification,\n });\n console.log('[MockAgentProvider] execute_command tool call completed');\n }\n /**\n * 发送 execute_command 工具调用流程(需要权限确认)(符合 ACP 协议)\n *\n * 这个方法模拟需要用户确认才能执行的命令\n * 用于测试权限确认菜单 (Run/Skip/Reject)\n *\n * 数据结构 (来自 tool-schemas.ts):\n * - Input: ExecuteCommandInput = { command: string; requires_approval: boolean; }\n * \n * 权限请求通过 rawInput.permissionRequest 字段传递:\n * - permissionRequest.options: 可选的权限选项数组\n */\n private async sendMockExecuteCommandWithApprovalToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`💻 Starting execute_command (with approval) tool call flow: ${messageId}`);\n const toolCallId = `tool-ec-approval-${Date.now()}`;\n const command = 'rm -rf node_modules && npm install';\n // 权限请求选项 - 与 ACP 协议的 PermissionOption 结构一致\n const permissionRequest = {\n options: [\n { optionId: 'allow-once', name: '运行', kind: 'allow_once' },\n { optionId: 'skip-once', name: '跳过', kind: 'skip_once' },\n { optionId: 'reject-once', name: '拒绝', kind: 'reject_once' },\n ],\n };\n // 1. 发送 tool_call (pending) - 需要权限确认\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'execute_command',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Execute Command',\n kind: 'execute',\n status: 'pending',\n rawInput: {\n command,\n requires_approval: true, // 保留向后兼容\n permissionRequest, // 新增:权限请求信息\n },\n },\n } as SessionNotification,\n });\n await this.delay(200);\n // 2. 发送 tool_call_update (in_progress) - 等待用户确认\n // 这时 UI 应该显示权限确认菜单 (Run/Skip/Reject)\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'execute_command',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'pending', // 保持 pending 状态等待用户审批\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: `$ ${command}\\n\\nWaiting for approval...`,\n },\n },\n ],\n rawInput: {\n command,\n requires_approval: true,\n permissionRequest, // 确保 rawInput 中也包含权限请求\n },\n },\n } as SessionNotification,\n });\n console.log('[MockAgentProvider] execute_command (with approval) tool call waiting for user approval');\n // 注意:这里不发送 completed,等待用户在 UI 上点击 Run/Skip/Reject\n }\n /**\n * 发送 write_to_file 工具调用流程(需要权限确认)(符合 ACP 协议)\n *\n * 这个方法模拟需要用户确认才能执行的文件写入\n * 用于测试权限确认菜单 (允许/跳过/拒绝)\n *\n * 权限请求通过 rawInput.permissionRequest 字段传递:\n * - permissionRequest.options: 可选的权限选项数组\n */\n private async sendMockWriteFileWithApprovalToolCallFlow(sessionId: string, messageId: string): Promise<void> {\n console.log(`📝 Starting write_to_file (with approval) tool call flow: ${messageId}`);\n const toolCallId = `tool-wtf-approval-${Date.now()}`;\n const filePath = '/Users/test/project/src/config.ts';\n const content = `export const config = {\n apiUrl: 'https://api.example.com',\n debug: true,\n timeout: 5000,\n};`;\n // 权限请求选项 - 与 ACP 协议的 PermissionOption 结构一致\n const permissionRequest = {\n options: [\n { optionId: 'allow-once', name: '允许', kind: 'allow_once' },\n { optionId: 'skip-once', name: '跳过', kind: 'skip_once' },\n { optionId: 'reject-once', name: '拒绝', kind: 'reject_once' },\n ],\n };\n // 1. 发送 tool_call (pending) - 需要权限确认\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'write_to_file',\n },\n },\n update: {\n sessionUpdate: 'tool_call',\n toolCallId,\n title: 'Write File',\n kind: 'edit',\n status: 'pending',\n locations: [{ path: filePath, line: 0 }],\n rawInput: {\n filePath,\n content,\n permissionRequest, // 权限请求信息\n },\n },\n } as SessionNotification,\n });\n await this.delay(200);\n // 2. 发送 tool_call_update (pending) - 等待用户确认\n // 这时 UI 应该显示权限确认菜单\n this.emitEvent({\n type: 'session_update',\n sessionId,\n messageId,\n timestamp: Date.now(),\n notification: {\n sessionId,\n _meta: {\n 'codebuddy.ai': {\n toolName: 'write_to_file',\n },\n },\n update: {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'pending', // 保持 pending 状态等待用户审批\n content: [\n {\n type: 'content',\n content: {\n type: 'text',\n text: content,\n },\n },\n ],\n locations: [{ path: filePath, line: 0 }],\n rawInput: {\n filePath,\n content,\n permissionRequest, // 确保 rawInput 中也包含权限请求\n },\n },\n } as SessionNotification,\n });\n console.log('[MockAgentProvider] write_to_file (with approval) tool call waiting for user approval');\n // 注意:这里不发送 completed,等待用户在 UI 上点击 允许/跳过/拒绝\n }\n}\n"],"mappings":"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"}