mateclaw/mateclaw-server/src/main/resources/messages_en.properties

338 lines
25 KiB
Properties

# ==================== MateClaw i18n: en-US ====================
# --- Result Codes ---
result.success=Success
result.unauthorized=Not logged in or token expired
result.forbidden=Access denied
result.not_found=Resource not found
result.system_error=Internal server error
result.param_error=Parameter validation failed
result.agent_not_found=Agent not found
result.agent_busy=Agent is busy, please try later
result.llm_error=LLM call failed
result.tool_not_found=Tool not found
result.channel_error=Channel message sending failed
# --- Tool Descriptions ---
tool.getCurrentDateTime.desc=Get current date and time in yyyy-MM-dd HH:mm:ss format
tool.getCurrentDate.desc=Get current date in yyyy-MM-dd format
tool.getCurrentTime.desc=Get current time in HH:mm:ss format
tool.read_file.desc=Read the contents of a file. Supports line-range reading (1-based). Returns structured JSON with filePath, totalLines, readLines, content. Auto-truncates large files with continuation hints. Text files only; use extract_document_text for PDF/Office documents.
tool.read_file.param.filePath=Absolute or relative file path
tool.read_file.param.startLine=Start line number (1-based, inclusive). Omit to start from line 1
tool.read_file.param.endLine=End line number (1-based, inclusive). Omit to read to EOF or truncation limit
tool.write_file.desc=Write content to a file. Overwrites if exists, creates if not (auto-creates parent directories). Returns structured JSON with filePath, bytesWritten. Requires user approval.
tool.write_file.param.filePath=Absolute or relative file path
tool.write_file.param.content=Content to write to the file
tool.edit_file.desc=Edit file content via find-and-replace. Finds exact match of old_text and replaces with new_text. Returns structured JSON with filePath, replacements count. Requires user approval. Replaces first occurrence by default; set replaceAll=true for all.
tool.edit_file.param.filePath=Absolute or relative file path
tool.edit_file.param.oldText=Original text to find (exact match)
tool.edit_file.param.newText=Replacement text
tool.edit_file.param.replaceAll=Replace all occurrences, default false (first only)
tool.execute_shell_command.desc=Execute a shell command on the local server. For running system commands, viewing files, running scripts. Uses cmd.exe on Windows, /bin/sh on Linux/macOS. Dangerous operations trigger security approval. Returns structured result with exitCode, stdout, stderr, timedOut.
tool.execute_shell_command.param.command=Shell command to execute
tool.execute_shell_command.param.timeoutSeconds=Timeout in seconds, default 60
tool.web_search.desc=Search the internet for latest information. Use when querying real-time news, latest data, or uncertain facts. Supports optional freshness, language, count parameters.
tool.web_search.param.query=Search keywords
tool.web_search.param.freshness=Time range filter: day (today), week (this week), month (this month), year (this year)
tool.web_search.param.language=Language preference: zh-CN (Chinese), en (English)
tool.web_search.param.count=Max results: 1-10, default 5
tool.create_cron_job.desc=Create a scheduled task (cron job). Runs automatically at specified time and sends trigger message to current agent. Use 5-field cron: minute hour day month weekday.
tool.list_cron_jobs.desc=List all scheduled tasks with name, cron expression, next run time, and enabled status.
tool.toggle_cron_job.desc=Enable or disable a scheduled task by its job ID.
tool.delete_cron_job.desc=Delete a scheduled task. Requires user approval.
tool.delegateToAgent.desc=Delegate a task to another Agent for multi-agent collaboration. Target Agent executes in an independent session and returns its final reply. Provide complete task context as the target cannot see current conversation history.
tool.delegateToAgent.param.agentName=Target Agent name (exact match)
tool.delegateToAgent.param.task=Task description with complete context information
tool.listAvailableAgents.desc=List all available Agents (enabled), including name, type, and description.
# --- Tool Error Messages ---
tool.read_file.error.not_found=File does not exist: {0}
tool.read_file.error.is_directory=Path is a directory, not a file: {0}
tool.read_file.error.not_readable=File is not readable: {0}
tool.read_file.error.start_exceeds=Start line {0} exceeds total lines {1}
tool.read_file.error.start_gt_end=Start line {0} is greater than end line {1}
tool.read_file.error.read_exception=Read file exception: {0}
tool.read_file.truncated=Output truncated (max {0} lines / {1}KB). Use startLine={2} to continue reading.
tool.read_file.line_truncated_marker= ...[line too long, truncated]
tool.read_file.line_truncated=Line {0} exceeds the {1}KB single-output limit. To read the rest of this line, continue with startLine={2}, startColumn={3}; or skip to startLine={4} for the next line. Do NOT infer or fabricate the omitted content.
tool.write_file.error.path_empty=File path cannot be empty
tool.write_file.error.is_directory=Path is an existing directory, cannot write as file: {0}
tool.write_file.error.write_exception=Write file exception: {0}
tool.edit_file.error.path_empty=File path cannot be empty
tool.edit_file.error.old_text_empty=oldText cannot be empty
tool.edit_file.error.same_text=oldText and newText are identical, no replacement needed
tool.edit_file.error.not_found=File does not exist: {0}
tool.edit_file.error.is_directory=Path is a directory, not a file: {0}
tool.edit_file.error.not_rw=File is not readable/writable: {0}
tool.edit_file.error.old_not_found=Specified oldText not found in file. Check for exact match including spaces and line breaks.
tool.edit_file.error.edit_exception=Edit file exception: {0}
tool.shell.error.timeout=Command timed out ({0} seconds), forcefully terminated
tool.shell.error.exception=Execution exception: {0}
# --- Generative tools ---
tool.image_generate.desc=Generate an image from a text description. Supports DashScope, OpenAI, fal.ai, Zhipu CogView, etc. Runs asynchronously; the client receives the image automatically via the SSE async_task_completed event without a manual refresh.
tool.video_generate.desc=Generate a video. Supports text-to-video and image-to-video modes via DashScope, Zhipu CogVideo, Kling, Runway, MiniMax, fal.ai, etc. Runs asynchronously (1-5 minutes); the client receives the video automatically via the SSE async_task_completed event without a manual refresh.
tool.music_generate.desc=Generate music or a song. Supports text-to-music, lyrics composition, and instrumental modes via Google Lyria and MiniMax Music. Runs asynchronously (1-3 minutes); the client receives the audio automatically via the SSE async_task_completed event without a manual refresh.
tool.model3d_generate.desc=Generate a 3D model (.glb). Supports text-to-3D and image-to-3D modes via Tencent Hunyuan 3D Rapid. Runs asynchronously (1-3 minutes); the client receives the model automatically via the SSE async_task_completed event with an inline model-viewer preview, no manual refresh required.
# --- Document rendering tools ---
tool.renderPdf.desc=Render a new PDF file from Markdown and return a one-time download URL. Use this tool whenever the user explicitly asks for a PDF (export PDF / save as PDF); do not substitute renderDocx, and do not bypass it via chrome --headless / wkhtmltopdf. Best for final deliverables such as reports, white papers, and contracts. Optional YAML frontmatter drives the cover page and page header/footer. For markdown bodies larger than ~5 KB, use renderPdfFromFile instead.
tool.renderPdfFromFile.desc=Render a PDF from a Markdown file on disk and return a one-time download URL. Use this when the user asks for a PDF and the markdown body is already saved to a file, so the LLM need not repeat its own output as a tool argument. Same markdown subset and frontmatter convention as renderPdf.
tool.renderDocx.desc=Render a new editable .docx (Word) file from Markdown and return a one-time download URL. Best for documents the user will keep revising — reports, memos, contracts, letters, resumes. Supports headings, bold, ordered/unordered lists, tables, and images (SVG is rasterized to PNG). Use renderPdf when the user asked for a PDF, renderXlsx for spreadsheets, renderPptx for slide decks. For markdown bodies larger than ~5 KB, use renderDocxFromFile instead.
tool.renderDocxFromFile.desc=Render an editable .docx (Word) file from a Markdown file on disk and return a one-time download URL. Prefer this for large markdown bodies (>5 KB) so the LLM need not repeat its own output. Use renderPdfFromFile when the user asked for a PDF. Same markdown subset as renderDocx.
tool.renderDocxFromFiles.desc=Render a single .docx by concatenating multiple Markdown files in order and return a download URL. Use for long reports split into chapters (cover, table of contents, body, appendix as separate files). Files are read as UTF-8 and joined with a blank line; same markdown subset as renderDocx.
tool.renderXlsx.desc=Render a new .xlsx (Excel) workbook from Markdown and return a one-time download URL. Best for financial reports, data tables, comparison matrices, and plans. Convention: each `# Heading` starts a new sheet, the pipe table below it becomes the sheet body, the first row is the header, and numeric cells are auto-detected. For markdown larger than ~5 KB, use renderXlsxFromFile instead.
tool.renderXlsxFromFile.desc=Render a .xlsx (Excel) workbook from a Markdown file on disk and return a one-time download URL. Prefer this for large markdown bodies (>5 KB). Same markdown subset as renderXlsx (`# Heading` per sheet, pipe tables as the body).
tool.renderPptx.desc=Render a new .pptx slide deck from Markdown and return a one-time download URL. Best for pitch decks, project plans, talks, and briefings. Uses Marp-style convention: a lone `---` line separates slides, the first `#/##/###` of a slide is its title, `-`/`*` lines are bullets, and `<!-- comment -->` becomes speaker notes. For markdown larger than ~5 KB, use renderPptxFromFile instead.
tool.renderPptxFromFile.desc=Render a .pptx slide deck from a Markdown file on disk and return a one-time download URL. Prefer this for large markdown bodies (>5 KB). Same Marp-style markdown subset as renderPptx.
tool.render_html_image.desc=Render HTML to a PNG image and return a one-time download URL. Use when the user wants an HTML artifact (architecture diagram, infographic, dashboard, mockup) delivered as an image — especially on IM channels (WeCom, DingTalk, Feishu, Telegram, Discord) where a raw HTML link is not clickable. Supply exactly one of filePath or html.
tool.extract_document_text.desc=Extract text content from Office/PDF documents — PDF, Word (.docx/.doc), Excel (.xlsx/.xls), PowerPoint (.pptx/.ppt). Runs a per-format multi-stage fallback chain (system command, Python, Java, Tika) and returns the extracted text, the method used, and metadata. The options argument may set a pages range or force a specific extraction method.
tool.extract_pdf_text.desc=Extract text content from a PDF file; a shortcut for extract_document_text. The pages argument selects a page range (e.g. "1-5" or "1,3,5"); omit it to extract the whole document.
tool.extract_docx_text.desc=Extract text content from a Word document (.docx/.doc); a shortcut for extract_document_text.
tool.detect_file_type.desc=Detect a file's MIME type and category. Use before reading a file to decide its type, distinguish text files from binary documents (PDF/Office), and pick the right read or extract tool. Returns mimeType, fileCategory, and a suggestedTool.
# --- Guard Rules ---
guard.SHELL_RM_RF_ROOT.name=Recursive force delete root directory
guard.SHELL_RM_RF_ROOT.fix=Specify a concrete directory path instead of root
guard.SHELL_MKFS.name=Filesystem formatting
guard.SHELL_MKFS.fix=Verify target device and execute manually
guard.SHELL_DD_DEV.name=Direct disk write
guard.SHELL_DD_DEV.fix=Verify target device and execute manually
guard.SHELL_KILL_INIT.name=Kill init/systemd
guard.SHELL_KILL_INIT.fix=Use systemctl to manage services
guard.SHELL_CURL_PIPE_SH.name=Pipe download execution (curl)
guard.SHELL_CURL_PIPE_SH.fix=Download file first, review content, then execute
guard.SHELL_WGET_PIPE_SH.name=Pipe download execution (wget)
guard.SHELL_WGET_PIPE_SH.fix=Download file first, review content, then execute
guard.SHELL_FORK_BOMB.name=Fork Bomb
guard.SHELL_FORK_BOMB.fix=This command has no legitimate use
guard.SHELL_REVERSE_SHELL.name=Reverse Shell
guard.SHELL_REVERSE_SHELL.fix=This command may be used for remote control
guard.SHELL_RM.name=rm delete command
guard.SHELL_RM.fix=Confirm files to delete, consider using trash instead of rm
guard.SHELL_RM_RF.name=Recursive force delete
guard.SHELL_RM_RF.fix=Use rm -ri or specify exact files
guard.SHELL_RM_ROOT.name=Delete from root path
guard.SHELL_RM_ROOT.fix=Specify a concrete path
guard.SHELL_RMDIR_ROOT.name=Delete directory from root path
guard.SHELL_RMDIR_ROOT.fix=Specify a concrete path
guard.SHELL_SQL_DROP.name=SQL DROP operation
guard.SHELL_SQL_DROP.fix=Backup data before executing
guard.SHELL_SQL_TRUNCATE.name=SQL TRUNCATE operation
guard.SHELL_SQL_TRUNCATE.fix=Backup data before executing
guard.SHELL_SQL_DELETE_ALL.name=SQL unconditional DELETE
guard.SHELL_SQL_DELETE_ALL.fix=Add a WHERE clause
guard.SHELL_SQL_ALTER_DROP.name=SQL ALTER TABLE DROP
guard.SHELL_SQL_ALTER_DROP.fix=Backup data before executing
guard.SHELL_SHUTDOWN.name=System shutdown
guard.SHELL_SHUTDOWN.fix=Confirm shutdown is needed
guard.SHELL_REBOOT.name=System reboot
guard.SHELL_REBOOT.fix=Confirm reboot is needed
guard.SHELL_CHMOD_777.name=Overly permissive chmod
guard.SHELL_CHMOD_777.fix=Use minimum necessary permissions
guard.SHELL_EVAL.name=Dynamic code execution
guard.SHELL_EVAL.fix=Avoid using eval
guard.SHELL_GIT_FORCE_PUSH.name=Git force push
guard.SHELL_GIT_FORCE_PUSH.fix=Use --force-with-lease
guard.SHELL_GIT_RESET_HARD.name=Git hard reset
guard.SHELL_GIT_RESET_HARD.fix=Use git stash first
guard.SHELL_CRONTAB.name=Crontab modification
guard.SHELL_CRONTAB.fix=Confirm crontab content
guard.SHELL_AUTHORIZED_KEYS.name=SSH key modification
guard.SHELL_AUTHORIZED_KEYS.fix=Confirm SSH key changes
guard.SHELL_SUDOERS.name=Sudo privilege modification
guard.SHELL_SUDOERS.fix=Use visudo
guard.SHELL_OBFUSCATED_EXEC.name=Obfuscated code execution
guard.SHELL_OBFUSCATED_EXEC.fix=Decode and review content before executing
guard.CRED_PASSWORD_ASSIGN.name=Credential exposure
guard.CRED_PASSWORD_ASSIGN.fix=Use environment variables or secret manager
guard.CRED_AWS_KEY.name=AWS Access Key leak
guard.CRED_AWS_KEY.fix=Use IAM Role or AWS Secrets Manager
guard.CRED_PRIVATE_KEY.name=Private key leak
guard.CRED_PRIVATE_KEY.fix=Do not pass private keys in parameters
guard.CRED_JWT_TOKEN.name=JWT token leak
guard.CRED_JWT_TOKEN.fix=Use environment variables or secret manager; avoid passing JWTs in plaintext
guard.CRED_GITHUB_TOKEN.name=GitHub token leak
guard.CRED_GITHUB_TOKEN.fix=Revoke the token in GitHub immediately and switch to environment variables
# --- WorkspacePathGuard ---
guard.path.not_allowed=Path is outside workspace boundary: {0}, allowed root: {1}
guard.path.symlink_escape=Path escapes workspace via symlink: {0}, allowed root: {1}
# --- Exception Messages (structured keys, resolved by GlobalExceptionHandler) ---
# auth
err.auth.invalid_credentials=Invalid username or password
err.auth.username_exists=Username already exists
err.auth.user_not_found=User not found
err.auth.wrong_password=Incorrect current password
# agent
err.agent.not_found=Agent not found
err.agent.disabled=Agent is disabled
err.agent.name_required=Agent name is required
err.agent.duplicate_name=An employee with this name already exists in this workspace — try a different name
err.workflow.name_required=Workflow name is required
err.workflow.duplicate_name=A workflow with this name already exists in this workspace — try a different name
# workspace
err.workspace.not_found=Workspace not found
err.workspace.slug_exists=Workspace slug already exists
err.workspace.cannot_modify_default=Cannot modify default workspace slug
err.workspace.cannot_delete_default=Cannot delete default workspace
err.workspace.member_exists=User is already a member of this workspace
err.workspace.not_member=User is not a member of this workspace
err.workspace.cannot_modify_owner=Cannot modify workspace owner role
err.workspace.cannot_remove_owner=Cannot remove workspace owner
err.workspace.insufficient_permission=Insufficient permission
err.workspace.not_empty=Workspace still contains knowledge bases; delete them first
# channel
err.channel.not_found=Channel not found
err.channel.name_required=Channel name cannot be empty
err.channel.type_required=Channel type cannot be empty
# tool
err.tool.not_found=Tool not found
err.tool.builtin_readonly=Built-in tool cannot be deleted
# skill
err.skill.not_found=Skill not found
err.skill.name_required=Skill name cannot be empty
err.skill.name_exists=Skill name already exists
err.skill.builtin_readonly=Built-in skill cannot be deleted
err.skill.builtin_not_archivable=Built-in skill cannot be archived
err.skill.cross_workspace_binding=Cannot bind a skill from a different workspace to this Agent
# mcp
err.mcp.not_found=MCP server not found
err.mcp.builtin_readonly=Built-in MCP server cannot be deleted
err.mcp.name_required=MCP server name cannot be empty
err.mcp.transport_required=Transport type cannot be empty
err.mcp.transport_unsupported=Unsupported transport type
err.mcp.stdio_command_required=stdio type requires command
err.mcp.http_url_required=HTTP/SSE type requires URL
# cron
err.cron.not_found=Scheduled task not found
err.cron.name_required=Task name cannot be empty
err.cron.agent_required=Please select an Agent
err.cron.expression_required=Cron expression cannot be empty
err.cron.trigger_required=Trigger message cannot be empty
err.cron.target_required=Execution target cannot be empty
err.cron.wiki_kb_required=Please select a knowledge base
err.cron.wiki_kb_invalid=Knowledge base id is malformed
err.cron.wiki_kb_not_found=Knowledge base does not exist
# agent (extended)
err.agent.no_default_model=Cannot build Agent: please configure and enable a default model in Settings > Models
err.agent.model_not_configured=Model provider not configured, please fill in API Key in Settings > Models
err.agent.protocol_not_supported=Protocol not currently supported
err.agent.plan_compile_failed=Plan-Execute StateGraph compilation failed
err.agent.graph_compile_failed=StateGraph v2 compilation failed
err.agent.protocol_limited=StateGraph currently only supports DashScope, OpenAI-compatible, Anthropic, and Gemini protocols
err.agent.provider_not_configured=Provider not configured, please fill in valid API Key and Base URL
err.agent.provider_apikey_invalid=Provider API Key not configured or invalid
err.agent.provider_baseurl_missing=Provider Base URL not configured
err.agent.dashscope_key_missing=DashScope API Key not configured
err.agent.anthropic_not_configured=Anthropic Provider not configured
err.agent.anthropic_key_invalid=Anthropic API Key not configured or invalid
err.agent.gemini_not_configured=Gemini Provider not configured
err.agent.gemini_key_invalid=Gemini API Key not configured or invalid
err.agent.template_not_found=Template not found
err.agent.delete_forbidden=Only the creator or a workspace admin can delete this Agent
err.common.wrong_workspace=Resource does not belong to current workspace
# llm
err.llm.model_config_not_found=Model config not found
err.llm.no_available_model=No available model config
err.llm.cannot_disable_default=Cannot disable default model, switch default first
err.llm.cannot_delete_default=Cannot delete default model, switch default first
err.llm.provider_model_required=Provider and model ID cannot be empty
err.llm.model_exists=Model already exists
err.llm.model_not_found=Model not found
err.llm.builtin_readonly=Built-in model cannot be deleted
err.llm.only_enabled_default=Only enabled models can be set as default
err.llm.name_required=Model name cannot be empty
err.llm.id_required=Model identifier cannot be empty
err.llm.id_exists=Model identifier already exists
err.llm.provider_fields_required=Provider ID and name cannot be empty
err.llm.provider_exists=Provider already exists
err.llm.provider_builtin_readonly=Built-in provider cannot be deleted
err.llm.provider_not_found=Provider not found
err.llm.discovery_not_supported=This provider does not support model discovery
err.llm.no_model_for_test=No configured models, cannot test connection
err.llm.chatgpt_no_discovery=ChatGPT OAuth does not support model discovery
err.llm.chatgpt_no_test=ChatGPT OAuth does not support model testing
err.llm.oauth_no_discovery=OAuth provider does not support model discovery
err.llm.oauth_no_test=OAuth provider does not support model testing
err.anthropic.no_claude_code=Claude Code credentials not found. Install Claude Code and sign in with a Pro/Max account.
err.anthropic.token_expired_no_refresh=Claude Code token expired and cannot be refreshed. Please open Claude Code and sign in again.
err.anthropic.refresh_failed=Claude Code token refresh failed
err.llm.base_url_missing=Base URL not configured
err.llm.dashscope_key_missing=DashScope API Key not configured
err.llm.gemini_key_missing=Gemini API Key not configured
err.llm.anthropic_key_missing=Anthropic API Key not configured
err.llm.oauth_state_invalid=Invalid OAuth state, may be expired or reused
err.llm.oauth_no_refresh=No refresh_token, please log in again
err.llm.oauth_not_connected=Not connected to OpenAI OAuth, please log in first
err.llm.oauth_exchange_failed=OAuth token exchange failed
err.llm.oauth_no_token=access_token missing in OAuth response
err.llm.chatgpt_not_configured=ChatGPT provider not configured, check database initialization
err.llm.pkce_failed=PKCE code_challenge generation failed
err.llm.device_code_start_failed=Device code request failed
err.llm.chatgpt_models_fetch_failed=Failed to fetch available ChatGPT models
err.llm.chatgpt_stream_failed=ChatGPT streaming call failed
err.llm.chatgpt_error=ChatGPT returned an error
err.llm.chatgpt_account_missing=chatgpt-account-id missing, disconnect and re-login via OAuth
err.llm.gemini_stream_failed=Gemini streaming call failed
err.llm.gemini_error=Gemini returned an error
# datasource
err.datasource.not_found=Datasource not found
err.datasource.sql_empty=SQL cannot be empty
err.datasource.only_single_sql=Only single SQL statement allowed
err.datasource.sql_parse_failed=SQL parse failed
err.datasource.only_select=Only SELECT queries allowed
err.datasource.connection_failed=Failed to get database connection
err.datasource.unsupported_db=Unsupported database type
err.datasource.unsafe_jdbc=JDBC parameters contain unsafe options
# approval
err.approval.not_found=Approval record not found or expired
# --- RuntimeContext ---
context.current_time=[system-context] Current time: {0} {1} (Asia/Shanghai)
context.working_dir=[system-context] Working directory: {0}
context.working_dir_hint=You can only read/write files and execute commands within this directory and its subdirectories.
context.skill_dir_hint=Shared skills live under {0}; you may also read and run files there, even though it is outside the working directory.
# --- Wiki Research Fallback (RFC: prompt-cleanup) ---
research.fallback.no_plan=Unable to generate a research plan for this topic.
research.fallback.no_materials=Not enough material to answer this topic.
research.fallback.no_materials_for_question=No relevant material was found in the knowledge base for this question.
research.fallback.draft_empty=Insufficient material to answer this sub-question.
research.fallback.failed=Research failed: {0}
research.broadcast.no_plan=Topic cannot be decomposed into researchable sub-questions.
research.broadcast.draft_all_empty=No sub-question could be drafted from available material.
research.broadcast.failed=Research failed.
# --- Agent Limit Exceeded Fallback (RFC: prompt-cleanup) ---
agent.limit_exceeded.fallback=Sorry, the maximum reasoning steps were reached before a full answer could be produced.
agent.limit_exceeded.empty_context=(No tool call results collected yet.)
# --- Cron unified tasks conversation ---
cron.tasks_conversation.title=📋 Scheduled Tasks
cron.run_header.scheduled=scheduled
cron.run_header.manual=manual
cron.run.silent=(Scheduled task found nothing new this run — delivery skipped)
# --- Wiki vision-in pipeline ---
err.wiki.vision.disabled=Image vision pipeline is currently disabled
err.wiki.vision.no_provider=No image vision provider is configured
err.wiki.vision.provider_failed=Image vision provider call failed
err.wiki.vision.all_failed=All image vision providers failed
# --- Chat: assistant stop / interrupt placeholders ---
chat.stopMarker.userAborted=[Stopped by user]
# --- Tool: send_file ---
tool.send_file.error.too_large=File too large: {0}MB exceeds limit of {1}MB
tool.send_file.error.failed=Failed to send file: {0}
tool.send_file.success={0} sent: [{0}]({1}) (link valid for 10 minutes).\nIMPORTANT: when replying to the user you **must** use the relative path `{1}` exactly; do **not** prepend any https:// or http:// host. The frontend will prepend the current host automatically.