from __future__ import annotations | |
import os | |
from pathlib import Path | |
from autogpt.config import Config | |
CFG = Config() | |
# Set a dedicated folder for file I/O | |
WORKSPACE_PATH = Path(os.getcwd()) / "auto_gpt_workspace" | |
# Create the directory if it doesn't exist | |
if not os.path.exists(WORKSPACE_PATH): | |
os.makedirs(WORKSPACE_PATH) | |
def path_in_workspace(relative_path: str | Path) -> Path: | |
"""Get full path for item in workspace | |
Parameters: | |
relative_path (str | Path): Path to translate into the workspace | |
Returns: | |
Path: Absolute path for the given path in the workspace | |
""" | |
return safe_path_join(WORKSPACE_PATH, relative_path) | |
def safe_path_join(base: Path, *paths: str | Path) -> Path: | |
"""Join one or more path components, asserting the resulting path is within the workspace. | |
Args: | |
base (Path): The base path | |
*paths (str): The paths to join to the base path | |
Returns: | |
Path: The joined path | |
""" | |
joined_path = base.joinpath(*paths).resolve() | |
if CFG.restrict_to_workspace and not joined_path.is_relative_to(base): | |
raise ValueError( | |
f"Attempted to access path '{joined_path}' outside of workspace '{base}'." | |
) | |
return joined_path | |