mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-14 19:45:08 +08:00
338 lines
25 KiB
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.
|