mateclaw/mateclaw-server/src/main/resources/messages.properties
matevip 9c8c393b3c refactor(prompt): clean up prompt corpus, fix summary_budget bug, route fallbacks through i18n
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.
2026-04-19 09:02:37 +08:00

258 lines
21 KiB
Properties

# ==================== MateClaw i18n: zh-CN (default) ====================
# --- Result Codes ---
result.success=\u64cd\u4f5c\u6210\u529f
result.unauthorized=\u672a\u767b\u5f55\u6216Token\u5df2\u8fc7\u671f
result.forbidden=\u6ca1\u6709\u6743\u9650
result.not_found=\u8d44\u6e90\u4e0d\u5b58\u5728
result.system_error=\u7cfb\u7edf\u5185\u90e8\u9519\u8bef
result.param_error=\u53c2\u6570\u6821\u9a8c\u5931\u8d25
result.agent_not_found=Agent\u4e0d\u5b58\u5728
result.agent_busy=Agent\u6b63\u5728\u6267\u884c\u4efb\u52a1\uff0c\u8bf7\u7a0d\u540e
result.llm_error=\u5927\u6a21\u578b\u8c03\u7528\u5931\u8d25
result.tool_not_found=\u5de5\u5177\u4e0d\u5b58\u5728
result.channel_error=\u6e20\u9053\u6d88\u606f\u53d1\u9001\u5931\u8d25
# --- Tool Descriptions ---
tool.getCurrentDateTime.desc=\u83b7\u53d6\u5f53\u524d\u65e5\u671f\u548c\u65f6\u95f4\uff0c\u8fd4\u56de\u683c\u5f0f\u4e3a yyyy-MM-dd HH:mm:ss
tool.getCurrentDate.desc=\u83b7\u53d6\u5f53\u524d\u65e5\u671f\uff0c\u8fd4\u56de\u683c\u5f0f\u4e3a yyyy-MM-dd
tool.getCurrentTime.desc=\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\uff0c\u8fd4\u56de\u683c\u5f0f\u4e3a HH:mm:ss
tool.read_file.desc=\u8bfb\u53d6\u6307\u5b9a\u6587\u4ef6\u7684\u5185\u5bb9\u3002\u652f\u6301\u6309\u884c\u8303\u56f4\u8bfb\u53d6\uff081-based\uff09\u3002\u8fd4\u56de\u5305\u542b filePath\u3001totalLines\u3001readLines\u3001content \u7684\u7ed3\u6784\u5316 JSON \u7ed3\u679c\u3002\u5982\u679c\u6587\u4ef6\u8fc7\u5927\uff0c\u4f1a\u81ea\u52a8\u622a\u65ad\u5e76\u63d0\u793a\u7ee7\u7eed\u8bfb\u53d6\u7684\u884c\u53f7\u3002\u4ec5\u652f\u6301\u6587\u672c\u6587\u4ef6\uff0c\u4e0d\u652f\u6301 PDF/Office \u6587\u6863\uff0c\u8bf7\u4f7f\u7528 extract_document_text \u5de5\u5177\u3002
tool.read_file.param.filePath=\u6587\u4ef6\u7684\u7edd\u5bf9\u8def\u5f84\u6216\u76f8\u5bf9\u8def\u5f84
tool.read_file.param.startLine=\u8d77\u59cb\u884c\u53f7\uff08\u4ece 1 \u5f00\u59cb\uff0c\u5305\u542b\uff09\uff0c\u4e0d\u4f20\u5219\u4ece\u7b2c 1 \u884c\u5f00\u59cb
tool.read_file.param.endLine=\u7ed3\u675f\u884c\u53f7\uff08\u4ece 1 \u5f00\u59cb\uff0c\u5305\u542b\uff09\uff0c\u4e0d\u4f20\u5219\u8bfb\u5230\u672b\u5c3e\u6216\u8fbe\u5230\u622a\u65ad\u4e0a\u9650
tool.write_file.desc=\u5c06\u5185\u5bb9\u5199\u5165\u6307\u5b9a\u6587\u4ef6\u3002\u5982\u679c\u6587\u4ef6\u5df2\u5b58\u5728\u5219\u5b8c\u5168\u8986\u5199\uff0c\u4e0d\u5b58\u5728\u5219\u521b\u5efa\u65b0\u6587\u4ef6\uff08\u81ea\u52a8\u521b\u5efa\u7236\u76ee\u5f55\uff09\u3002\u8fd4\u56de\u5305\u542b filePath\u3001bytesWritten \u7684\u7ed3\u6784\u5316 JSON \u7ed3\u679c\u3002\u6b64\u64cd\u4f5c\u9700\u8981\u7528\u6237\u5ba1\u6279\u786e\u8ba4\u3002
tool.write_file.param.filePath=\u6587\u4ef6\u7684\u7edd\u5bf9\u8def\u5f84\u6216\u76f8\u5bf9\u8def\u5f84
tool.write_file.param.content=\u8981\u5199\u5165\u7684\u6587\u4ef6\u5185\u5bb9
tool.edit_file.desc=\u901a\u8fc7\u67e5\u627e\u66ff\u6362\u7f16\u8f91\u6587\u4ef6\u5185\u5bb9\u3002\u627e\u5230 old_text \u7cbe\u786e\u5339\u914d\u7684\u6587\u672c\u5e76\u66ff\u6362\u4e3a new_text\u3002\u8fd4\u56de\u5305\u542b filePath\u3001replacements \u7684\u7ed3\u6784\u5316 JSON \u7ed3\u679c\u3002\u9700\u8981\u7528\u6237\u5ba1\u6279\u786e\u8ba4\u3002\u9ed8\u8ba4\u53ea\u66ff\u6362\u7b2c\u4e00\u5904\uff0c\u8bbe\u7f6e replaceAll=true \u66ff\u6362\u5168\u90e8\u3002
tool.edit_file.param.filePath=\u6587\u4ef6\u7684\u7edd\u5bf9\u8def\u5f84\u6216\u76f8\u5bf9\u8def\u5f84
tool.edit_file.param.oldText=\u8981\u67e5\u627e\u7684\u539f\u59cb\u6587\u672c\uff08\u7cbe\u786e\u5339\u914d\uff09
tool.edit_file.param.newText=\u66ff\u6362\u540e\u7684\u65b0\u6587\u672c
tool.edit_file.param.replaceAll=\u662f\u5426\u66ff\u6362\u6240\u6709\u5339\u914d\u9879\uff0c\u9ed8\u8ba4 false\uff08\u4ec5\u66ff\u6362\u7b2c\u4e00\u5904\uff09
tool.execute_shell_command.desc=\u5728\u672c\u5730\u670d\u52a1\u5668\u4e0a\u6267\u884c Shell \u547d\u4ee4\u3002\u7528\u4e8e\u6267\u884c\u7cfb\u7edf\u547d\u4ee4\u3001\u67e5\u770b\u6587\u4ef6\u3001\u8fd0\u884c\u811a\u672c\u7b49\u64cd\u4f5c\u3002Windows \u4e0b\u4f7f\u7528 cmd.exe\uff0cLinux/macOS \u4e0b\u4f7f\u7528 /bin/sh\u3002\u5371\u9669\u64cd\u4f5c\u4f1a\u89e6\u53d1\u5b89\u5168\u5ba1\u6279\u3002\u8fd4\u56de\u5305\u542b exitCode\u3001stdout\u3001stderr\u3001timedOut \u7684\u7ed3\u6784\u5316\u7ed3\u679c\u3002
tool.execute_shell_command.param.command=\u8981\u6267\u884c\u7684 Shell \u547d\u4ee4
tool.execute_shell_command.param.timeoutSeconds=\u8d85\u65f6\u79d2\u6570\uff0c\u9ed8\u8ba4 60 \u79d2
tool.search.desc=\u5728\u4e92\u8054\u7f51\u4e0a\u641c\u7d22\u6700\u65b0\u4fe1\u606f\u3002\u5f53\u9700\u8981\u67e5\u8be2\u5b9e\u65f6\u65b0\u95fb\u3001\u6700\u65b0\u6570\u636e\u6216\u4e0d\u786e\u5b9a\u7684\u4e8b\u5b9e\u65f6\u4f7f\u7528\u6b64\u5de5\u5177\u3002\u652f\u6301 freshness\u3001language\u3001count \u53ef\u9009\u53c2\u6570\u3002
tool.search.param.query=\u641c\u7d22\u5173\u952e\u8bcd
tool.search.param.freshness=\u65f6\u95f4\u8303\u56f4\u8fc7\u6ee4: day (\u4eca\u5929), week (\u672c\u5468), month (\u672c\u6708), year (\u4eca\u5e74)
tool.search.param.language=\u8bed\u8a00\u504f\u597d: zh-CN (\u4e2d\u6587), en (\u82f1\u6587)
tool.search.param.count=\u6700\u5927\u7ed3\u679c\u6570\u91cf: 1-10, \u9ed8\u8ba4 5
tool.create_cron_job.desc=\u521b\u5efa\u5b9a\u65f6\u4efb\u52a1\u3002\u4efb\u52a1\u5c06\u5728\u6307\u5b9a\u65f6\u95f4\u81ea\u52a8\u8fd0\u884c\u5e76\u5411\u5f53\u524d Agent \u53d1\u9001\u89e6\u53d1\u6d88\u606f\u3002\u4f7f\u7528 5 \u5b57\u6bb5 cron \u8868\u8fbe\u5f0f\uff1a\u5206 \u65f6 \u65e5 \u6708 \u5468\u3002
tool.list_cron_jobs.desc=\u5217\u51fa\u6240\u6709\u5b9a\u65f6\u4efb\u52a1\uff0c\u5305\u542b\u540d\u79f0\u3001cron \u8868\u8fbe\u5f0f\u3001\u4e0b\u6b21\u8fd0\u884c\u65f6\u95f4\u3001\u542f\u7528\u72b6\u6001\u3002
tool.toggle_cron_job.desc=\u542f\u7528\u6216\u7981\u7528\u6307\u5b9a\u7684\u5b9a\u65f6\u4efb\u52a1\u3002
tool.delete_cron_job.desc=\u5220\u9664\u6307\u5b9a\u7684\u5b9a\u65f6\u4efb\u52a1\uff0c\u9700\u8981\u7528\u6237\u5ba1\u6279\u3002
tool.delegateToAgent.desc=\u59d4\u6d3e\u4efb\u52a1\u7ed9\u53e6\u4e00\u4e2a Agent \u6267\u884c\uff0c\u5b9e\u73b0\u591a Agent \u534f\u4f5c\u3002\u76ee\u6807 Agent \u5c06\u5728\u72ec\u7acb\u4f1a\u8bdd\u4e2d\u6267\u884c\u4efb\u52a1\uff0c\u8fd4\u56de\u5176\u6700\u7ec8\u56de\u590d\u3002\u9700\u63d0\u4f9b\u5b8c\u6574\u7684\u4efb\u52a1\u4e0a\u4e0b\u6587\u3002
tool.delegateToAgent.param.agentName=\u76ee\u6807 Agent \u7684\u540d\u79f0\uff08\u7cbe\u786e\u5339\u914d\uff09
tool.delegateToAgent.param.task=\u8981\u59d4\u6d3e\u7684\u4efb\u52a1\u63cf\u8ff0\uff0c\u5fc5\u987b\u5305\u542b\u5b8c\u6574\u4e0a\u4e0b\u6587\u4fe1\u606f
tool.listAvailableAgents.desc=\u5217\u51fa\u6240\u6709\u53ef\u7528\u7684 Agent\uff08\u5df2\u542f\u7528\uff09\uff0c\u5305\u62ec\u540d\u79f0\u3001\u7c7b\u578b\u548c\u63cf\u8ff0\u3002
# --- Tool Error Messages ---
tool.read_file.error.not_found=\u6587\u4ef6\u4e0d\u5b58\u5728: {0}
tool.read_file.error.is_directory=\u8def\u5f84\u662f\u76ee\u5f55\u800c\u975e\u6587\u4ef6: {0}
tool.read_file.error.not_readable=\u6587\u4ef6\u4e0d\u53ef\u8bfb: {0}
tool.read_file.error.start_exceeds=\u8d77\u59cb\u884c {0} \u8d85\u51fa\u6587\u4ef6\u603b\u884c\u6570 {1}
tool.read_file.error.start_gt_end=\u8d77\u59cb\u884c {0} \u5927\u4e8e\u7ed3\u675f\u884c {1}
tool.read_file.error.read_exception=\u8bfb\u53d6\u6587\u4ef6\u5f02\u5e38: {0}
tool.write_file.error.path_empty=\u6587\u4ef6\u8def\u5f84\u4e0d\u80fd\u4e3a\u7a7a
tool.write_file.error.is_directory=\u8def\u5f84\u662f\u4e00\u4e2a\u5df2\u6709\u76ee\u5f55\uff0c\u65e0\u6cd5\u4f5c\u4e3a\u6587\u4ef6\u5199\u5165: {0}
tool.write_file.error.write_exception=\u5199\u5165\u6587\u4ef6\u5f02\u5e38: {0}
tool.edit_file.error.path_empty=\u6587\u4ef6\u8def\u5f84\u4e0d\u80fd\u4e3a\u7a7a
tool.edit_file.error.old_text_empty=oldText \u4e0d\u80fd\u4e3a\u7a7a
tool.edit_file.error.same_text=oldText \u548c newText \u5185\u5bb9\u76f8\u540c\uff0c\u65e0\u9700\u66ff\u6362
tool.edit_file.error.not_found=\u6587\u4ef6\u4e0d\u5b58\u5728: {0}
tool.edit_file.error.is_directory=\u8def\u5f84\u662f\u76ee\u5f55\u800c\u975e\u6587\u4ef6: {0}
tool.edit_file.error.not_rw=\u6587\u4ef6\u4e0d\u53ef\u8bfb\u5199: {0}
tool.edit_file.error.old_not_found=\u6587\u4ef6\u4e2d\u672a\u627e\u5230\u6307\u5b9a\u7684 oldText\uff0c\u8bf7\u68c0\u67e5\u6587\u672c\u662f\u5426\u7cbe\u786e\u5339\u914d\uff08\u5305\u62ec\u7a7a\u683c\u548c\u6362\u884c\uff09
tool.edit_file.error.edit_exception=\u7f16\u8f91\u6587\u4ef6\u5f02\u5e38: {0}
tool.shell.error.timeout=\u547d\u4ee4\u6267\u884c\u8d85\u65f6\uff08{0}\u79d2\uff09\uff0c\u5df2\u5f3a\u5236\u7ec8\u6b62
tool.shell.error.exception=\u6267\u884c\u5f02\u5e38: {0}
# --- Guard Rules ---
guard.SHELL_RM_RF_ROOT.name=\u9012\u5f52\u5f3a\u5236\u5220\u9664\u6839\u76ee\u5f55
guard.SHELL_RM_RF_ROOT.fix=\u8bf7\u6307\u5b9a\u5177\u4f53\u76ee\u5f55\u8def\u5f84\u800c\u975e\u6839\u76ee\u5f55
guard.SHELL_MKFS.name=\u6587\u4ef6\u7cfb\u7edf\u683c\u5f0f\u5316
guard.SHELL_MKFS.fix=\u786e\u8ba4\u76ee\u6807\u8bbe\u5907\u540e\u624b\u52a8\u6267\u884c
guard.SHELL_DD_DEV.name=\u76f4\u63a5\u78c1\u76d8\u5199\u5165
guard.SHELL_DD_DEV.fix=\u786e\u8ba4\u76ee\u6807\u8bbe\u5907\u540e\u624b\u52a8\u6267\u884c
guard.SHELL_KILL_INIT.name=\u6740\u6b7b init/systemd
guard.SHELL_KILL_INIT.fix=\u4f7f\u7528 systemctl \u7ba1\u7406\u670d\u52a1
guard.SHELL_CURL_PIPE_SH.name=\u7ba1\u9053\u4e0b\u8f7d\u6267\u884c (curl)
guard.SHELL_CURL_PIPE_SH.fix=\u5148\u4e0b\u8f7d\u6587\u4ef6\u5ba1\u67e5\u5185\u5bb9\u518d\u6267\u884c
guard.SHELL_WGET_PIPE_SH.name=\u7ba1\u9053\u4e0b\u8f7d\u6267\u884c (wget)
guard.SHELL_WGET_PIPE_SH.fix=\u5148\u4e0b\u8f7d\u6587\u4ef6\u5ba1\u67e5\u5185\u5bb9\u518d\u6267\u884c
guard.SHELL_FORK_BOMB.name=Fork Bomb
guard.SHELL_FORK_BOMB.fix=\u6b64\u547d\u4ee4\u65e0\u6b63\u5f53\u7528\u9014
guard.SHELL_REVERSE_SHELL.name=\u53cd\u5411 Shell
guard.SHELL_REVERSE_SHELL.fix=\u6b64\u547d\u4ee4\u53ef\u80fd\u88ab\u7528\u4e8e\u8fdc\u7a0b\u63a7\u5236
guard.SHELL_RM.name=rm \u5220\u9664\u547d\u4ee4
guard.SHELL_RM.fix=\u8bf7\u786e\u8ba4\u8981\u5220\u9664\u7684\u6587\u4ef6\u5217\u8868\uff0c\u8003\u8651\u4f7f\u7528 trash \u66ff\u4ee3 rm
guard.SHELL_RM_RF.name=\u9012\u5f52\u5f3a\u5236\u5220\u9664
guard.SHELL_RM_RF.fix=\u4f7f\u7528 rm -ri \u6216\u6307\u5b9a\u5177\u4f53\u6587\u4ef6
guard.SHELL_RM_ROOT.name=\u4ece\u6839\u8def\u5f84\u5220\u9664
guard.SHELL_RM_ROOT.fix=\u8bf7\u6307\u5b9a\u5177\u4f53\u8def\u5f84
guard.SHELL_RMDIR_ROOT.name=\u4ece\u6839\u8def\u5f84\u5220\u9664\u76ee\u5f55
guard.SHELL_RMDIR_ROOT.fix=\u8bf7\u6307\u5b9a\u5177\u4f53\u8def\u5f84
guard.SHELL_SQL_DROP.name=SQL DROP \u64cd\u4f5c
guard.SHELL_SQL_DROP.fix=\u8bf7\u5148\u5907\u4efd\u6570\u636e\u518d\u6267\u884c
guard.SHELL_SQL_TRUNCATE.name=SQL TRUNCATE \u64cd\u4f5c
guard.SHELL_SQL_TRUNCATE.fix=\u8bf7\u5148\u5907\u4efd\u6570\u636e\u518d\u6267\u884c
guard.SHELL_SQL_DELETE_ALL.name=SQL \u65e0\u6761\u4ef6 DELETE
guard.SHELL_SQL_DELETE_ALL.fix=\u8bf7\u6dfb\u52a0 WHERE \u6761\u4ef6
guard.SHELL_SQL_ALTER_DROP.name=SQL ALTER TABLE DROP
guard.SHELL_SQL_ALTER_DROP.fix=\u8bf7\u5148\u5907\u4efd\u6570\u636e\u518d\u6267\u884c
guard.SHELL_SHUTDOWN.name=\u7cfb\u7edf\u5173\u673a
guard.SHELL_SHUTDOWN.fix=\u8bf7\u786e\u8ba4\u662f\u5426\u9700\u8981\u5173\u673a
guard.SHELL_REBOOT.name=\u7cfb\u7edf\u91cd\u542f
guard.SHELL_REBOOT.fix=\u8bf7\u786e\u8ba4\u662f\u5426\u9700\u8981\u91cd\u542f
guard.SHELL_CHMOD_777.name=\u8fc7\u5ea6\u5bbd\u677e\u6743\u9650
guard.SHELL_CHMOD_777.fix=\u4f7f\u7528\u6700\u5c0f\u5fc5\u8981\u6743\u9650
guard.SHELL_EVAL.name=\u52a8\u6001\u4ee3\u7801\u6267\u884c
guard.SHELL_EVAL.fix=\u907f\u514d\u4f7f\u7528 eval
guard.SHELL_GIT_FORCE_PUSH.name=Git \u5f3a\u5236\u63a8\u9001
guard.SHELL_GIT_FORCE_PUSH.fix=\u4f7f\u7528 --force-with-lease
guard.SHELL_GIT_RESET_HARD.name=Git \u786c\u91cd\u7f6e
guard.SHELL_GIT_RESET_HARD.fix=\u5148\u7528 git stash
guard.SHELL_CRONTAB.name=\u5b9a\u65f6\u4efb\u52a1\u4fee\u6539
guard.SHELL_CRONTAB.fix=\u8bf7\u786e\u8ba4\u5b9a\u65f6\u4efb\u52a1\u5185\u5bb9
guard.SHELL_AUTHORIZED_KEYS.name=SSH \u5bc6\u94a5\u4fee\u6539
guard.SHELL_AUTHORIZED_KEYS.fix=\u8bf7\u786e\u8ba4 SSH \u5bc6\u94a5\u53d8\u66f4
guard.SHELL_SUDOERS.name=sudo \u6743\u9650\u4fee\u6539
guard.SHELL_SUDOERS.fix=\u8bf7\u4f7f\u7528 visudo
guard.SHELL_OBFUSCATED_EXEC.name=\u6df7\u6dc6\u4ee3\u7801\u6267\u884c
guard.SHELL_OBFUSCATED_EXEC.fix=\u5148\u89e3\u7801\u67e5\u770b\u5185\u5bb9\u518d\u6267\u884c
guard.CRED_PASSWORD_ASSIGN.name=\u51ed\u636e\u4fe1\u606f\u66b4\u9732
guard.CRED_PASSWORD_ASSIGN.fix=\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u6216\u5bc6\u94a5\u7ba1\u7406\u670d\u52a1
guard.CRED_AWS_KEY.name=AWS Access Key \u6cc4\u9732
guard.CRED_AWS_KEY.fix=\u4f7f\u7528 IAM Role \u6216 AWS Secrets Manager
guard.CRED_PRIVATE_KEY.name=\u79c1\u94a5\u6cc4\u9732
guard.CRED_PRIVATE_KEY.fix=\u8bf7\u52ff\u5728\u53c2\u6570\u4e2d\u4f20\u9012\u79c1\u94a5
# --- Exception Messages (structured keys) ---
err.auth.invalid_credentials=\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef
err.auth.username_exists=\u7528\u6237\u540d\u5df2\u5b58\u5728
err.auth.user_not_found=\u7528\u6237\u4e0d\u5b58\u5728
err.auth.wrong_password=\u539f\u5bc6\u7801\u9519\u8bef
err.agent.not_found=Agent\u4e0d\u5b58\u5728
err.agent.disabled=Agent \u5df2\u7981\u7528
err.workspace.not_found=\u5de5\u4f5c\u533a\u4e0d\u5b58\u5728
err.workspace.slug_exists=\u5de5\u4f5c\u533a\u6807\u8bc6\u5df2\u5b58\u5728
err.workspace.cannot_modify_default=\u4e0d\u80fd\u4fee\u6539\u9ed8\u8ba4\u5de5\u4f5c\u533a\u7684\u6807\u8bc6
err.workspace.cannot_delete_default=\u4e0d\u80fd\u5220\u9664\u9ed8\u8ba4\u5de5\u4f5c\u533a
err.workspace.member_exists=\u7528\u6237\u5df2\u7ecf\u662f\u8be5\u5de5\u4f5c\u533a\u7684\u6210\u5458
err.workspace.not_member=\u7528\u6237\u4e0d\u662f\u8be5\u5de5\u4f5c\u533a\u7684\u6210\u5458
err.workspace.cannot_modify_owner=\u4e0d\u80fd\u4fee\u6539\u5de5\u4f5c\u533a\u62e5\u6709\u8005\u7684\u89d2\u8272
err.workspace.cannot_remove_owner=\u4e0d\u80fd\u79fb\u9664\u5de5\u4f5c\u533a\u62e5\u6709\u8005
err.workspace.insufficient_permission=\u6743\u9650\u4e0d\u8db3
err.channel.not_found=\u6e20\u9053\u4e0d\u5b58\u5728
err.channel.name_required=\u6e20\u9053\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.channel.type_required=\u6e20\u9053\u7c7b\u578b\u4e0d\u80fd\u4e3a\u7a7a
err.tool.not_found=\u5de5\u5177\u4e0d\u5b58\u5728
err.tool.builtin_readonly=\u5185\u7f6e\u5de5\u5177\u4e0d\u53ef\u5220\u9664
err.skill.not_found=\u6280\u80fd\u4e0d\u5b58\u5728
err.skill.name_required=\u6280\u80fd\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.skill.name_exists=\u6280\u80fd\u540d\u79f0\u5df2\u5b58\u5728
err.skill.builtin_readonly=\u5185\u7f6e\u6280\u80fd\u4e0d\u53ef\u5220\u9664
err.mcp.not_found=MCP server \u4e0d\u5b58\u5728
err.mcp.builtin_readonly=\u5185\u7f6e MCP server \u4e0d\u53ef\u5220\u9664
err.mcp.name_required=MCP server \u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.mcp.transport_required=\u4f20\u8f93\u7c7b\u578b\u4e0d\u80fd\u4e3a\u7a7a
err.mcp.transport_unsupported=\u4e0d\u652f\u6301\u7684\u4f20\u8f93\u7c7b\u578b
err.mcp.stdio_command_required=stdio \u7c7b\u578b\u5fc5\u987b\u6307\u5b9a command
err.mcp.http_url_required=HTTP/SSE \u7c7b\u578b\u5fc5\u987b\u6307\u5b9a url
err.cron.not_found=\u5b9a\u65f6\u4efb\u52a1\u4e0d\u5b58\u5728
err.cron.name_required=\u4efb\u52a1\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.cron.agent_required=\u8bf7\u9009\u62e9\u5173\u8054 Agent
err.cron.expression_required=Cron \u8868\u8fbe\u5f0f\u4e0d\u80fd\u4e3a\u7a7a
err.cron.trigger_required=\u89e6\u53d1\u6d88\u606f\u4e0d\u80fd\u4e3a\u7a7a
err.cron.target_required=\u6267\u884c\u76ee\u6807\u4e0d\u80fd\u4e3a\u7a7a
# agent (extended)
err.agent.no_default_model=\u65e0\u6cd5\u6784\u5efa Agent\uff1a\u8bf7\u5148\u914d\u7f6e\u5e76\u542f\u7528\u9ed8\u8ba4\u6a21\u578b
err.agent.model_not_configured=\u6a21\u578b Provider \u672a\u5b8c\u6210\u914d\u7f6e
err.agent.protocol_not_supported=\u5f53\u524d\u4e0d\u652f\u6301\u8be5\u534f\u8bae
err.agent.plan_compile_failed=Plan-Execute StateGraph \u7f16\u8bd1\u5931\u8d25
err.agent.graph_compile_failed=StateGraph v2 \u7f16\u8bd1\u5931\u8d25
err.agent.protocol_limited=StateGraph \u5f53\u524d\u4ec5\u652f\u6301 DashScope/OpenAI/Anthropic \u534f\u8bae
err.agent.provider_not_configured=Provider \u672a\u5b8c\u6210\u914d\u7f6e
err.agent.provider_apikey_invalid=Provider API Key \u672a\u914d\u7f6e\u6216\u65e0\u6548
err.agent.provider_baseurl_missing=Provider Base URL \u672a\u914d\u7f6e
err.agent.dashscope_key_missing=DashScope API Key \u672a\u914d\u7f6e
err.agent.anthropic_not_configured=Anthropic Provider \u672a\u5b8c\u6210\u914d\u7f6e
err.agent.anthropic_key_invalid=Anthropic API Key \u672a\u914d\u7f6e\u6216\u65e0\u6548
err.agent.template_not_found=\u6a21\u677f\u4e0d\u5b58\u5728
err.common.wrong_workspace=\u8d44\u6e90\u4e0d\u5c5e\u4e8e\u5f53\u524d\u5de5\u4f5c\u533a
# llm
err.llm.model_config_not_found=\u6a21\u578b\u914d\u7f6e\u4e0d\u5b58\u5728
err.llm.no_available_model=\u6ca1\u6709\u53ef\u7528\u7684\u6a21\u578b\u914d\u7f6e
err.llm.cannot_disable_default=\u9ed8\u8ba4\u6a21\u578b\u4e0d\u80fd\u88ab\u7981\u7528
err.llm.cannot_delete_default=\u9ed8\u8ba4\u6a21\u578b\u4e0d\u80fd\u5220\u9664
err.llm.provider_model_required=Provider \u548c\u6a21\u578b\u6807\u8bc6\u4e0d\u80fd\u4e3a\u7a7a
err.llm.model_exists=\u6a21\u578b\u5df2\u5b58\u5728
err.llm.model_not_found=\u6a21\u578b\u4e0d\u5b58\u5728
err.llm.builtin_readonly=\u5185\u7f6e\u6a21\u578b\u4e0d\u652f\u6301\u5220\u9664
err.llm.only_enabled_default=\u53ea\u6709\u542f\u7528\u72b6\u6001\u7684\u6a21\u578b\u624d\u80fd\u8bbe\u4e3a\u9ed8\u8ba4
err.llm.name_required=\u6a21\u578b\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.llm.id_required=\u6a21\u578b\u6807\u8bc6\u4e0d\u80fd\u4e3a\u7a7a
err.llm.id_exists=\u6a21\u578b\u6807\u8bc6\u5df2\u5b58\u5728
err.llm.provider_fields_required=Provider ID \u548c\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.llm.provider_exists=Provider \u5df2\u5b58\u5728
err.llm.provider_builtin_readonly=\u5185\u7f6e Provider \u4e0d\u652f\u6301\u5220\u9664
err.llm.provider_not_found=Provider \u4e0d\u5b58\u5728
err.llm.discovery_not_supported=\u8be5\u4f9b\u5e94\u5546\u4e0d\u652f\u6301\u6a21\u578b\u53d1\u73b0
err.llm.no_model_for_test=\u6ca1\u6709\u5df2\u914d\u7f6e\u7684\u6a21\u578b\uff0c\u65e0\u6cd5\u6d4b\u8bd5
err.llm.chatgpt_no_discovery=ChatGPT OAuth \u4e0d\u652f\u6301\u6a21\u578b\u53d1\u73b0
err.llm.chatgpt_no_test=ChatGPT OAuth \u4e0d\u652f\u6301\u6a21\u578b\u6d4b\u8bd5
err.llm.base_url_missing=Base URL \u672a\u914d\u7f6e
err.llm.dashscope_key_missing=DashScope API Key \u672a\u914d\u7f6e
err.llm.gemini_key_missing=Gemini API Key \u672a\u914d\u7f6e
err.llm.anthropic_key_missing=Anthropic API Key \u672a\u914d\u7f6e
err.llm.oauth_state_invalid=\u65e0\u6548\u7684 OAuth state
err.llm.oauth_no_refresh=\u65e0 refresh_token\uff0c\u8bf7\u91cd\u65b0\u767b\u5f55
err.llm.oauth_not_connected=\u672a\u8fde\u63a5 OpenAI OAuth
err.llm.oauth_exchange_failed=OAuth token \u4ea4\u6362\u5931\u8d25
err.llm.oauth_no_token=OAuth \u54cd\u5e94\u4e2d\u7f3a\u5c11 access_token
err.llm.chatgpt_not_configured=ChatGPT provider \u672a\u914d\u7f6e
err.llm.pkce_failed=PKCE \u751f\u6210\u5931\u8d25
err.llm.chatgpt_stream_failed=ChatGPT \u6d41\u5f0f\u8c03\u7528\u5931\u8d25
err.llm.chatgpt_error=ChatGPT \u8fd4\u56de\u9519\u8bef
err.llm.chatgpt_account_missing=chatgpt-account-id \u7f3a\u5931
# datasource
err.datasource.not_found=\u6570\u636e\u6e90\u4e0d\u5b58\u5728
err.datasource.sql_empty=SQL \u4e0d\u80fd\u4e3a\u7a7a
err.datasource.only_single_sql=\u4ec5\u5141\u8bb8\u6267\u884c\u5355\u6761 SQL
err.datasource.sql_parse_failed=SQL \u89e3\u6790\u5931\u8d25
err.datasource.only_select=\u4ec5\u5141\u8bb8 SELECT \u67e5\u8be2
err.datasource.connection_failed=\u83b7\u53d6\u6570\u636e\u5e93\u8fde\u63a5\u5931\u8d25
err.datasource.unsupported_db=\u4e0d\u652f\u6301\u7684\u6570\u636e\u5e93\u7c7b\u578b
err.datasource.unsafe_jdbc=JDBC \u53c2\u6570\u5305\u542b\u4e0d\u5b89\u5168\u9009\u9879
# approval
err.approval.not_found=\u5ba1\u6279\u8bb0\u5f55\u4e0d\u5b58\u5728\u6216\u5df2\u8fc7\u671f
# --- WorkspacePathGuard ---
guard.path.not_allowed=\u8def\u5f84\u4e0d\u5728\u5de5\u4f5c\u533a\u5141\u8bb8\u8303\u56f4\u5185: {0}\uff0c\u5141\u8bb8\u7684\u6839\u76ee\u5f55: {1}
guard.path.symlink_escape=\u8def\u5f84\u901a\u8fc7\u7b26\u53f7\u94fe\u63a5\u9003\u9038\u51fa\u5de5\u4f5c\u533a: {0}\uff0c\u5141\u8bb8\u7684\u6839\u76ee\u5f55: {1}
# --- RuntimeContext ---
context.current_time=[system-context] \u5f53\u524d\u65f6\u95f4: {0} {1} (Asia/Shanghai)
context.working_dir=[system-context] \u5de5\u4f5c\u76ee\u5f55: {0}
context.working_dir_hint=\u4f60\u53ea\u80fd\u5728\u6b64\u76ee\u5f55\u53ca\u5176\u5b50\u76ee\u5f55\u5185\u8bfb\u5199\u6587\u4ef6\u548c\u6267\u884c\u547d\u4ee4\u3002
# --- Wiki Research Fallback (RFC: prompt-cleanup) ---
research.fallback.no_plan=\u65e0\u6cd5\u4e3a\u8be5\u4e3b\u9898\u751f\u6210\u7814\u7a76\u8ba1\u5212\u3002
research.fallback.no_materials=\u6ca1\u6709\u8db3\u591f\u7684\u6750\u6599\u56de\u7b54\u8be5\u4e3b\u9898\u3002
research.fallback.no_materials_for_question=\u73b0\u6709\u6750\u6599\u4e2d\u672a\u627e\u5230\u4e0e\u8be5\u95ee\u9898\u76f8\u5173\u7684\u5185\u5bb9\u3002
research.fallback.draft_empty=\u73b0\u6709\u6750\u6599\u4e0d\u8db3\u4ee5\u56de\u7b54\u8be5\u5b50\u95ee\u9898\u3002
research.fallback.failed=\u7814\u7a76\u8fc7\u7a0b\u5931\u8d25: {0}
research.broadcast.no_plan=\u4e3b\u9898\u65e0\u6cd5\u5206\u89e3\u4e3a\u53ef\u7814\u7a76\u7684\u5b50\u95ee\u9898
research.broadcast.draft_all_empty=\u6240\u6709\u5b50\u95ee\u9898\u90fd\u672a\u80fd\u8d77\u8349\u51fa\u5185\u5bb9
research.broadcast.failed=\u7814\u7a76\u5931\u8d25
# --- Agent Limit Exceeded Fallback (RFC: prompt-cleanup) ---
agent.limit_exceeded.fallback=\u62b1\u6b49\uff0c\u5df2\u8fbe\u5230\u6700\u5927\u63a8\u7406\u6b65\u6570\uff0c\u672a\u80fd\u83b7\u5f97\u5b8c\u6574\u7ed3\u679c\u3002
agent.limit_exceeded.empty_context=\uff08\u5c1a\u672a\u6536\u96c6\u5230\u5de5\u5177\u8c03\u7528\u7ed3\u679c\uff09