"""Register a task file as a stable artifact without publishing it to chat.""" from __future__ import annotations import json from pathlib import Path from uuid import UUID from core.artifact_lifecycle import register_workspace_artifact from core.artifacts import ArtifactPathError, resolve_artifact_path from .base import Tool class RegisterArtifactTool(Tool): name = "register_artifact" description = ( "Register one existing file in the current task as a stable artifact and return " "its artifact_id. Use this before a tool that requires an artifact input. " "Registration does not publish the file as a final chat deliverable." ) parameters = { "type": "object", "properties": { "path": { "type": "string", "minLength": 1, "maxLength": 1000, "description": "File path relative to the current task working directory.", } }, "required": ["path"], "additionalProperties": False, } def __init__( self, user_id: UUID, task_id: UUID, *, working_dir: Path, **kwargs, ) -> None: super().__init__(**kwargs) self.user_id = user_id self.task_id = task_id self.working_dir = Path(working_dir) def execute(self, path: str) -> str: if self.user_root is None: return "[Error] artifact registration requires a user workspace" if len(str(path or "")) > 1000: return "[Error] artifact path is too long" try: _, relative_path = resolve_artifact_path( path, working_dir=self.working_dir, user_root=self.user_root, require_file=True, allow_legacy_user_relative=False, ) artifact = register_workspace_artifact( user_id=self.user_id, task_id=self.task_id, user_root=self.user_root, working_dir=self.working_dir, path=relative_path, ) except (ArtifactPathError, ValueError) as exc: return f"[Error] cannot register artifact: {exc}" return json.dumps(artifact, ensure_ascii=False)