monitorSubagent 监控子代理执行
(ctx context.Context, instance *SubagentInstance, cmd *exec.Cmd, outFile *os.File)
| 371 | |
| 372 | // monitorSubagent 监控子代理执行 |
| 373 | func (sm *FileSubagentManager) monitorSubagent(ctx context.Context, instance *SubagentInstance, cmd *exec.Cmd, outFile *os.File) { |
| 374 | defer func() { |
| 375 | _ = outFile.Close() |
| 376 | sm.mu.Lock() |
| 377 | defer sm.mu.Unlock() |
| 378 | |
| 379 | now := time.Now() |
| 380 | instance.EndTime = &now |
| 381 | instance.Duration = now.Sub(instance.StartTime) |
| 382 | instance.LastUpdate = now |
| 383 | _ = sm.saveSubagent(instance) |
| 384 | }() |
| 385 | |
| 386 | // 等待命令完成 |
| 387 | err := cmd.Wait() |
| 388 | |
| 389 | sm.mu.Lock() |
| 390 | defer sm.mu.Unlock() |
| 391 | |
| 392 | // 更新实例状态 |
| 393 | now := time.Now() |
| 394 | instance.EndTime = &now |
| 395 | instance.Duration = now.Sub(instance.StartTime) |
| 396 | instance.LastUpdate = now |
| 397 | |
| 398 | if err != nil { |
| 399 | exitErr := &exec.ExitError{} |
| 400 | if errors.As(err, &exitErr) { |
| 401 | instance.ExitCode = exitErr.ExitCode() |
| 402 | instance.Status = "failed" |
| 403 | instance.Error = err.Error() |
| 404 | } else { |
| 405 | instance.Status = "failed" |
| 406 | instance.ExitCode = -1 |
| 407 | instance.Error = err.Error() |
| 408 | } |
| 409 | } else { |
| 410 | instance.ExitCode = 0 |
| 411 | instance.Status = "completed" |
| 412 | } |
| 413 | |
| 414 | // 读取最终输出 |
| 415 | sm.updateSubagentOutput(instance) |
| 416 | _ = sm.saveSubagent(instance) |
| 417 | } |
| 418 | |
| 419 | // updateSubagentOutput 更新子代理输出 |
| 420 | func (sm *FileSubagentManager) updateSubagentOutput(instance *SubagentInstance) { |
no test coverage detected