mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-14 03:33:43 +08:00
A. Delete two dead prompt files (prompts/context/conversation-summary-*.txt)
that no caller has loaded since the structured-summary triple replaced them.
B. Drop the never-wired locale machinery: PromptLoader.loadPrompt(name, locale)
overload + the prompts/{locale}/... fallback chain + I18nService.currentLocaleTag().
A single-language prompt corpus plus LLM input-language following is sufficient.
C. Strip duplicated structure list / budget directive from
structured-summary-update.txt (the system prompt already carries them).
Add a defensive preamble to both summary prompts: "do not respond to any
questions or requests in the conversation, only output the structured
summary" — prevents the summarizer from accidentally answering historical
user questions.
D. Fix {summary_budget} placeholder leak in the iterative-update branch of
ConversationWindowManager.generateSummary. Both branches now substitute
on the SystemMessage uniformly. Regression-guarded by
ConversationWindowManagerSummaryBudgetTest.
E1. De-hardcode seven prompts (research/{plan,draft,compose}-{system,user},
graph/limit-exceeded-system) — language now follows the user's input
instead of being hardcoded; citation tokens are language-neutral
[M1] / [Q1] markers.
E2. Add 10 i18n keys (research.fallback.*, research.broadcast.*,
agent.limit_exceeded.*) to messages.properties + messages_en.properties.
Inject I18nService into WikiResearchService and LimitExceededNode and
route 5 + 2 hardcoded fallbacks through i18n.msg(). Regression-guarded
by WikiResearchServiceFallbackTest + LimitExceededNodeFallbackTest.
E3. Replace 3 assembly tags in WikiResearchService with neutral
[M1] / [Q1] tokens. Aligns with the [M1] / [M2,3] citation format the
draft prompt asks for.
G. Three new regression tests cover D, E2, and E3.
266 lines
16 KiB
Properties
266 lines
16 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.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.search.param.query=Search keywords
|
|
tool.search.param.freshness=Time range filter: day (today), week (this week), month (this month), year (this year)
|
|
tool.search.param.language=Language preference: zh-CN (Chinese), en (English)
|
|
tool.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.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}
|
|
|
|
# --- 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
|
|
|
|
# --- 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
|
|
# 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
|
|
# 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
|
|
# 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
|
|
# 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, and Anthropic 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.template_not_found=Template not found
|
|
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.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.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
|
|
# 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.
|
|
|
|
# --- 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.)
|