66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
"""对话内重命名当前 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 关联会同步更新。"
|
||
)
|