"""对话内重命名当前 task 工作目录:登记意图,run 收尾后执行。""" from __future__ import annotations from pathlib import Path from core.task_actions import DeferredTaskActions from .base import Tool class RenameWorkingDirTool(Tool): name = "rename_working_dir" description = ( "Rename the current task's top-level working directory. " "The rename is safely deferred until the current response finishes, so all tasks " "sharing this directory keep their association. Use this instead of shell mv/rename " "for the current working directory." ) parameters = { "type": "object", "properties": { "new_name": { "type": "string", "description": "新的目录 leaf 名,不是路径;不能含 / 或 \\,不能以 . 开头。", }, }, "required": ["new_name"], } def __init__( self, actions: DeferredTaskActions, working_dir: Path, **kwargs, ) -> None: super().__init__(**kwargs) self.actions = actions self.working_dir = Path(working_dir) def execute(self, new_name: str) -> str: # 延迟 import,避免 agent_builder -> tool_registry -> 本工具 -> agent_builder # 的模块初始化环;名称规则仍只有 validate_task_name 一个事实源。 from core.agent_builder import InvalidTaskName, validate_task_name try: safe = validate_task_name(new_name) except InvalidTaskName as e: return f"[Error] new_name 不合法: {e}" if safe == self.working_dir.name: return f"[Error] new_name 与当前工作目录名相同: {safe!r}" target = self.working_dir.parent / safe if target.exists(): return f"[Error] 目标目录已存在: {safe!r}" replaced = self.actions.rename_working_dir_to self.actions.rename_working_dir_to = safe if replaced and replaced != safe: return ( f"[OK] 已把本轮待执行的工作目录改名从 {replaced!r} 更新为 {safe!r}。" "将在本轮回复完成后安全执行。" ) return ( f"[OK] 已登记工作目录改名为 {safe!r},将在本轮回复完成后安全执行;" "所有共享该目录的 task 关联会同步更新。" )