99 * 6. 会话恢复 - 支持 resume 参数
1010 */
1111
12+ import { nanoid } from 'nanoid' ;
1213import { z } from 'zod' ;
1314import { BackgroundAgentManager } from '../../../agent/subagents/BackgroundAgentManager.js' ;
1415import { SubagentExecutor } from '../../../agent/subagents/SubagentExecutor.js' ;
@@ -19,10 +20,48 @@ import type {
1920} from '../../../agent/subagents/types.js' ;
2021import { PermissionMode } from '../../../config/types.js' ;
2122import { HookManager } from '../../../hooks/HookManager.js' ;
23+ import { vanillaStore } from '../../../store/vanilla.js' ;
2224import { createTool } from '../../core/createTool.js' ;
2325import type { ExecutionContext , ToolResult } from '../../types/index.js' ;
2426import { ToolErrorType , ToolKind } from '../../types/index.js' ;
2527
28+ /**
29+ * 从错误中提取用户友好的错误信息
30+ */
31+ function extractUserFriendlyError ( error : Error ) : string {
32+ const message = error . message || 'Unknown error' ;
33+
34+ // 检查是否是 API 限流错误
35+ if ( message . includes ( 'Too Many Requests' ) || message . includes ( '429' ) ) {
36+ // 尝试从错误链中提取更详细的信息
37+ const cause = ( error as { cause ?: { responseBody ?: string } } ) . cause ;
38+ if ( cause ?. responseBody ) {
39+ try {
40+ const body = JSON . parse ( cause . responseBody ) ;
41+ if ( body . message ) {
42+ return body . message ;
43+ }
44+ } catch {
45+ // 忽略解析错误
46+ }
47+ }
48+ return 'API 请求过于频繁,请稍后重试' ;
49+ }
50+
51+ // 检查是否是网络错误
52+ if ( message . includes ( 'ECONNREFUSED' ) || message . includes ( 'ETIMEDOUT' ) ) {
53+ return '网络连接失败,请检查网络设置' ;
54+ }
55+
56+ // 检查是否是认证错误
57+ if ( message . includes ( '401' ) || message . includes ( 'Unauthorized' ) ) {
58+ return 'API 认证失败,请检查 API Key 配置' ;
59+ }
60+
61+ // 返回简化的错误信息(不包含堆栈)
62+ return message . split ( '\n' ) [ 0 ] ;
63+ }
64+
2665/**
2766 * 获取可用的 subagent 类型(用于 Zod 枚举)
2867 */
@@ -191,11 +230,20 @@ export const taskTool = createTool({
191230 // 创建执行器
192231 const executor = new SubagentExecutor ( subagentConfig ) ;
193232
233+ // 生成唯一 ID 并启动进度显示
234+ const subagentId = nanoid ( 8 ) ;
235+ vanillaStore
236+ . getState ( )
237+ . app . actions . startSubagentProgress ( subagentId , subagent_type , description ) ;
238+
194239 // 构建执行上下文
195240 const subagentContext : SubagentContext = {
196241 prompt,
197242 parentSessionId : context . sessionId ,
198243 permissionMode : context . permissionMode , // 继承父 Agent 的权限模式
244+ onToolStart : ( toolName ) => {
245+ vanillaStore . getState ( ) . app . actions . updateSubagentTool ( toolName ) ;
246+ } ,
199247 } ;
200248
201249 updateOutput ?.( `⚙️ 执行任务中...` ) ;
@@ -247,7 +295,10 @@ export const taskTool = createTool({
247295 console . warn ( '[Task] SubagentStop hook execution failed:' , hookError ) ;
248296 }
249297
250- // 6. 返回结果
298+ // 6. 完成进度显示
299+ vanillaStore . getState ( ) . app . actions . completeSubagentProgress ( result . success ) ;
300+
301+ // 7. 返回结果
251302 if ( result . success ) {
252303 const outputPreview =
253304 result . message . length > 1000
@@ -289,11 +340,16 @@ export const taskTool = createTool({
289340 } ;
290341 }
291342 } catch ( error ) {
343+ // 异常时也要完成进度显示
344+ vanillaStore . getState ( ) . app . actions . completeSubagentProgress ( false ) ;
345+
292346 const err = error as Error ;
347+ const errorMessage = extractUserFriendlyError ( err ) ;
348+
293349 return {
294350 success : false ,
295351 llmContent : `Subagent execution error: ${ err . message } ` ,
296- displayContent : `❌ Subagent 执行异常\n\n${ err . message } \n\n ${ err . stack || '' } ` ,
352+ displayContent : `❌ Subagent 执行异常\n\n${ errorMessage } ` ,
297353 error : {
298354 type : ToolErrorType . EXECUTION_ERROR ,
299355 message : err . message ,
0 commit comments