fix(agent_tasks): 自动修正目标文件路径不匹配问题

当解压后的项目目录结构发生变化时,原有的目标文件路径可能无法匹配。自动检测并修正这些路径,确保任务能正确执行。对于无法修正的路径,记录警告并回退到全量扫描模式。
This commit is contained in:
lintsinghua 2025-12-17 19:55:08 +08:00
parent d62fd25fa6
commit c49e46c231
1 changed files with 66 additions and 0 deletions

View File

@ -304,6 +304,72 @@ async def _execute_agent_task(task_id: str):
event_emitter=event_emitter, # 🔥 新增
)
# 🔥 自动修正 target_files 路径
# 如果发生了目录调整(例如 ZIP 解压后只有一层目录root 被下移),
# 原有的 target_files (如 "Prefix/file.php") 可能无法匹配。
# 我们需要检测并移除这些无效的前缀。
if task.target_files and len(task.target_files) > 0:
# 1. 检查是否存在不匹配的文件
all_exist = True
for tf in task.target_files:
if not os.path.exists(os.path.join(project_root, tf)):
all_exist = False
break
if not all_exist:
logger.info(f"Target files path mismatch detected in {project_root}")
# 尝试通过路径匹配来修复
# 获取当前根目录的名称
root_name = os.path.basename(project_root)
new_target_files = []
fixed_count = 0
for tf in task.target_files:
# 检查文件是否以 root_name 开头(例如 "PHP-Project/index.php" 而 root 是 ".../PHP-Project"
if tf.startswith(root_name + "/"):
fixed_path = tf[len(root_name)+1:]
if os.path.exists(os.path.join(project_root, fixed_path)):
new_target_files.append(fixed_path)
fixed_count += 1
continue
# 如果上面的没匹配,尝试暴力搜索(只针对未找到的文件)
# 这种情况比较少见,先保留原样或标记为丢失
if os.path.exists(os.path.join(project_root, tf)):
new_target_files.append(tf)
else:
# 尝试查看 tf 的 basename 是否在根目录直接存在(针对常见的最简情况)
basename = os.path.basename(tf)
if os.path.exists(os.path.join(project_root, basename)):
new_target_files.append(basename)
fixed_count += 1
else:
# 实在找不到,保留原样,让后续流程报错或忽略
new_target_files.append(tf)
if fixed_count > 0:
logger.info(f"🔧 Auto-fixed {fixed_count} target file paths")
await event_emitter.emit_info(f"🔧 自动修正了 {fixed_count} 个目标文件的路径")
task.target_files = new_target_files
# 🔥 重新验证修正后的文件
valid_target_files = []
if task.target_files:
for tf in task.target_files:
if os.path.exists(os.path.join(project_root, tf)):
valid_target_files.append(tf)
else:
logger.warning(f"⚠️ Target file not found: {tf}")
if not valid_target_files:
logger.warning("❌ No valid target files found after adjustment!")
await event_emitter.emit_warning("⚠️ 警告:无法找到指定的目标文件,将扫描所有文件")
task.target_files = None # 回退到全量扫描
elif len(valid_target_files) < len(task.target_files):
logger.warning(f"⚠️ Partial target files missing. Found {len(valid_target_files)}/{len(task.target_files)}")
task.target_files = valid_target_files
logger.info(f"🚀 Task {task_id} started with Dynamic Agent Tree architecture")
# 🔥 获取项目根目录后检查取消