mateclaw/mateclaw-server/src/main/resources/messages.properties
倪程伟 b23cc32f33
fix(wiki): make global starter-pack templates read-only
Global transformation templates (workspace_id IS NULL, e.g. the 7 built-in
starter packs made global by V165) were shared across every workspace but
not actually read-only: any workspace member could edit or delete them,
mutating/affecting all workspaces, with deletes unrecoverable (Flyway
seed runs once).

- Controller: reject update/delete of null-workspace templates with 403
  (err.wiki.global_template_readonly); read/apply paths unchanged.
- Service: defense-in-depth — update/delete also reject global templates,
  guarding non-HTTP callers (WikiTool LLM entry points). delete() now
  checks the entity before deleting instead of deleting blindly.
- findByName: add deterministic ORDER BY (workspace_id IS NULL) ASC so a
  workspace-local template wins over a same-named global one (was LIMIT 1
  with no ordering). Consistent across H2/MySQL/Kingbase.
- i18n: new err.wiki.global_template_readonly (zh + en).
- Tests: +2 controller mock tests (403 on update/delete, no service write),
  +2 E2E tests (global template stays intact; findByName prefers local).

Tests: 10/10 green (4 controller + 6 E2E).
2026-07-15 14:57:18 +08:00

341 lines
37 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.web_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.web_search.param.query=\u641c\u7d22\u5173\u952e\u8bcd
tool.web_search.param.freshness=\u65f6\u95f4\u8303\u56f4\u8fc7\u6ee4: day (\u4eca\u5929), week (\u672c\u5468), month (\u672c\u6708), year (\u4eca\u5e74)
tool.web_search.param.language=\u8bed\u8a00\u504f\u597d: zh-CN (\u4e2d\u6587), en (\u82f1\u6587)
tool.web_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.read_file.truncated=\u8f93\u51fa\u5df2\u622a\u65ad\uff08\u6700\u591a {0} \u884c / {1}KB\uff09\u3002\u4f7f\u7528 startLine={2} \u7ee7\u7eed\u8bfb\u53d6\u3002
tool.read_file.line_truncated_marker= ...[\u672c\u884c\u8fc7\u957f\uff0c\u5df2\u622a\u65ad]
tool.read_file.line_truncated=\u7b2c {0} \u884c\u957f\u5ea6\u8d85\u8fc7\u5355\u6b21\u8f93\u51fa\u4e0a\u9650\uff08{1}KB\uff09\u3002\u8981\u7ee7\u7eed\u8bfb\u53d6\u8be5\u884c\u5269\u4f59\u5185\u5bb9\uff0c\u8bf7\u4f7f\u7528 startLine={2}\u3001startColumn={3}\uff1b\u6216\u4f7f\u7528 startLine={4} \u8df3\u5230\u4e0b\u4e00\u884c\u3002\u4e0d\u8981\u63a8\u65ad\u6216\u865a\u6784\u88ab\u622a\u65ad\u7684\u5185\u5bb9\u3002
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}
# --- Generative tools ---
tool.image_generate.desc=\u751f\u6210\u56fe\u7247\u3002\u6839\u636e\u6587\u5b57\u63cf\u8ff0\u521b\u4f5c\u56fe\u50cf\uff0c\u652f\u6301 DashScope\u3001OpenAI\u3001fal.ai\u3001\u667a\u8c31 CogView \u7b49 Provider\u3002\u4efb\u52a1\u5f02\u6b65\u6267\u884c\uff0c\u5b8c\u6210\u540e\u524d\u7aef\u4f1a\u81ea\u52a8\u63a5\u6536 SSE \u4e8b\u4ef6 async_task_completed \u5e76\u628a\u56fe\u7247\u63a8\u5230\u5bf9\u8bdd\u4e2d\uff0c\u65e0\u9700\u624b\u52a8\u5237\u65b0\u3002
tool.video_generate.desc=\u751f\u6210\u89c6\u9891\u3002\u652f\u6301\u6587\u751f\u89c6\u9891\u3001\u56fe\u751f\u89c6\u9891\u7b49\u6a21\u5f0f\uff0c\u652f\u6301 DashScope\u3001\u667a\u8c31 CogVideo\u3001Kling\u3001Runway\u3001MiniMax \u3001fal.ai \u7b49 Provider\u3002\u4efb\u52a1\u5f02\u6b65\u6267\u884c\uff08\u7ea6 1-5 \u5206\u949f\uff09\uff0c\u5b8c\u6210\u540e\u524d\u7aef\u4f1a\u81ea\u52a8\u63a5\u6536 SSE \u4e8b\u4ef6 async_task_completed \u5e76\u628a\u89c6\u9891\u63a8\u5230\u5bf9\u8bdd\u4e2d\uff0c\u65e0\u9700\u624b\u52a8\u5237\u65b0\u3002
tool.music_generate.desc=\u751f\u6210\u97f3\u4e50\u6216\u6b4c\u66f2\u3002\u652f\u6301\u6587\u5b57\u63cf\u8ff0\u751f\u6210\u97f3\u4e50\u3001\u6b4c\u8bcd\u8c31\u66f2\u3001\u7eaf\u97f3\u4e50\u7b49\u6a21\u5f0f\uff0c\u652f\u6301 Google Lyria \u548c MiniMax Music \u7b49 Provider\u3002\u4efb\u52a1\u5f02\u6b65\u6267\u884c\uff08\u7ea6 1-3 \u5206\u949f\uff09\uff0c\u5b8c\u6210\u540e\u524d\u7aef\u4f1a\u81ea\u52a8\u63a5\u6536 SSE \u4e8b\u4ef6 async_task_completed \u5e76\u628a\u97f3\u9891\u63a8\u5230\u5bf9\u8bdd\u4e2d\uff0c\u65e0\u9700\u624b\u52a8\u5237\u65b0\u3002
tool.model3d_generate.desc=\u751f\u6210 3D \u6a21\u578b (.glb)\u3002\u652f\u6301\u6587\u751f 3D \u4e0e\u56fe\u751f 3D \u4e24\u79cd\u6a21\u5f0f\uff0c\u76ee\u524d Provider \u4e3a\u817e\u8baf\u6df7\u5143 3D Rapid\u3002\u4efb\u52a1\u5f02\u6b65\u6267\u884c\uff08\u7ea6 1-3 \u5206\u949f\uff09\uff0c\u5b8c\u6210\u540e\u524d\u7aef\u4f1a\u81ea\u52a8\u63a5\u6536 SSE \u4e8b\u4ef6 async_task_completed \u5e76\u628a\u6a21\u578b\u63a8\u5230\u5bf9\u8bdd\u4e2d\uff08\u5e26 model-viewer \u9884\u89c8\uff09\uff0c\u65e0\u9700\u624b\u52a8\u5237\u65b0\u3002
# --- Document rendering tools ---
tool.renderPdf.desc=\u4ece Markdown \u751f\u6210\u65b0\u7684 PDF \u6587\u4ef6\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002\u5f53\u7528\u6237\u660e\u786e\u8981\u6c42 PDF\uff08\u5bfc\u51fa PDF / \u751f\u6210 pdf / \u53e6\u5b58\u4e3a PDF\uff09\u65f6\u5fc5\u987b\u4f7f\u7528\u672c\u5de5\u5177\uff0c\u4e0d\u8981\u7528 renderDocx \u66ff\u4ee3\uff0c\u4e5f\u4e0d\u8981\u901a\u8fc7 chrome --headless\u3001wkhtmltopdf \u7b49\u65b9\u5f0f\u7ed5\u8fc7\u3002\u9002\u5408\u62a5\u544a\u3001\u767d\u76ae\u4e66\u3001\u5408\u540c\u7b49\u6700\u7ec8\u4ea4\u4ed8\u7269\u3002\u53ef\u9009\u7684 YAML frontmatter \u53ef\u9a71\u52a8\u5c01\u9762\u9875\u4e0e\u9875\u7709\u9875\u811a\u3002markdown \u6b63\u6587\u8f83\u5927\uff08>5KB\uff09\u65f6\u6539\u7528 renderPdfFromFile\u3002
tool.renderPdfFromFile.desc=\u4ece\u78c1\u76d8\u4e0a\u7684 markdown \u6587\u4ef6\u751f\u6210 PDF \u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002\u5f53\u7528\u6237\u8981\u6c42 PDF \u4e14 markdown \u6b63\u6587\u5df2\u5199\u5165\u6587\u4ef6\u65f6\u4f7f\u7528\u672c\u5de5\u5177\uff0c\u907f\u514d LLM \u628a\u81ea\u5df1\u7684\u5185\u5bb9\u4f5c\u4e3a\u53c2\u6570\u91cd\u590d\u8f93\u51fa\u3002\u652f\u6301\u4e0e renderPdf \u76f8\u540c\u7684 markdown \u5b50\u96c6\u4e0e frontmatter \u7ea6\u5b9a\u3002
tool.renderDocx.desc=\u4ece Markdown \u751f\u6210\u65b0\u7684\u53ef\u7f16\u8f91 .docx\uff08Word\uff09\u6587\u4ef6\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002\u9002\u5408\u7528\u6237\u540e\u7eed\u4ecd\u9700\u4fee\u6539\u7684\u6587\u6863\u2014\u2014\u62a5\u544a\u3001\u5907\u5fd8\u5f55\u3001\u5408\u540c\u3001\u4fe1\u51fd\u3001\u7b80\u5386\u3002\u652f\u6301\u6807\u9898\u3001\u52a0\u7c97\u3001\u6709\u5e8f/\u65e0\u5e8f\u5217\u8868\u3001\u8868\u683c\u3001\u56fe\u7247\uff08SVG \u81ea\u52a8\u6805\u683c\u5316\u4e3a PNG\uff09\u3002\u7528\u6237\u8981\u6c42 PDF \u65f6\u6539\u7528 renderPdf\uff0c\u8981\u8868\u683c\u5de5\u4f5c\u7c3f\u7528 renderXlsx\uff0c\u8981\u5e7b\u706f\u7247\u7528 renderPptx\u3002markdown \u6b63\u6587\u8f83\u5927\uff08>5KB\uff09\u65f6\u6539\u7528 renderDocxFromFile\u3002
tool.renderDocxFromFile.desc=\u4ece\u78c1\u76d8\u4e0a\u7684 markdown \u6587\u4ef6\u751f\u6210\u53ef\u7f16\u8f91 .docx\uff08Word\uff09\u6587\u4ef6\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002markdown \u6b63\u6587\u8f83\u5927\uff08>5KB\uff09\u65f6\u4f18\u5148\u7528\u672c\u5de5\u5177\uff0c\u907f\u514d LLM \u91cd\u590d\u8f93\u51fa\u81ea\u5df1\u7684\u5185\u5bb9\u3002\u7528\u6237\u8981\u6c42 PDF \u65f6\u6539\u7528 renderPdfFromFile\u3002markdown \u5b50\u96c6\u4e0e renderDocx \u76f8\u540c\u3002
tool.renderDocxFromFiles.desc=\u6309\u987a\u5e8f\u62fc\u63a5\u591a\u4e2a markdown \u6587\u4ef6\u751f\u6210\u5355\u4e2a .docx \u5e76\u8fd4\u56de\u4e0b\u8f7d\u94fe\u63a5\u3002\u9002\u5408\u5206\u7ae0\u8282\u64b0\u5199\u7684\u957f\u62a5\u544a\uff08\u5c01\u9762\u3001\u76ee\u5f55\u3001\u6b63\u6587\u3001\u9644\u5f55\u5206\u522b\u6210\u6587\u4ef6\uff09\u3002\u6587\u4ef6\u4ee5 UTF-8 \u8bfb\u53d6\u5e76\u4ee5\u7a7a\u884c\u8fde\u63a5\uff0cmarkdown \u5b50\u96c6\u4e0e renderDocx \u76f8\u540c\u3002
tool.renderXlsx.desc=\u4ece Markdown \u751f\u6210\u65b0\u7684 .xlsx\uff08Excel\uff09\u5de5\u4f5c\u7c3f\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002\u9002\u5408\u8d22\u52a1\u62a5\u8868\u3001\u6570\u636e\u8868\u3001\u5bf9\u6bd4\u77e9\u9635\u3001\u8ba1\u5212\u8868\u3002\u7ea6\u5b9a\uff1a\u6bcf\u4e2a\u300c# \u6807\u9898\u300d\u5f00\u542f\u4e00\u4e2a\u65b0\u5de5\u4f5c\u8868\uff0c\u5176\u4e0b\u7684\u7ba1\u9053\u8868\u683c\u6210\u4e3a\u8868\u4f53\uff0c\u9996\u884c\u4f5c\u4e3a\u8868\u5934\uff0c\u6570\u5b57\u5355\u5143\u683c\u81ea\u52a8\u8bc6\u522b\u4e3a\u6570\u503c\u3002markdown \u6b63\u6587\u8f83\u5927\uff08>5KB\uff09\u65f6\u6539\u7528 renderXlsxFromFile\u3002
tool.renderXlsxFromFile.desc=\u4ece\u78c1\u76d8\u4e0a\u7684 markdown \u6587\u4ef6\u751f\u6210 .xlsx\uff08Excel\uff09\u5de5\u4f5c\u7c3f\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002markdown \u6b63\u6587\u8f83\u5927\uff08>5KB\uff09\u65f6\u4f18\u5148\u7528\u672c\u5de5\u5177\u3002markdown \u5b50\u96c6\u4e0e renderXlsx \u76f8\u540c\uff08\u6bcf\u4e2a\u300c# \u6807\u9898\u300d\u4e00\u4e2a\u5de5\u4f5c\u8868\uff0c\u7ba1\u9053\u8868\u683c\u4e3a\u8868\u4f53\uff09\u3002
tool.renderPptx.desc=\u4ece Markdown \u751f\u6210\u65b0\u7684 .pptx \u6f14\u793a\u6587\u7a3f\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002\u9002\u5408\u63d0\u6848\u6f14\u793a\u3001\u9879\u76ee\u8ba1\u5212\u3001\u6f14\u8bb2\u3001\u6c47\u62a5\u3002\u91c7\u7528 Marp \u98ce\u683c\u7ea6\u5b9a\uff1a\u5355\u72ec\u4e00\u884c\u300c---\u300d\u5206\u9694\u5e7b\u706f\u7247\uff0c\u6bcf\u9875\u9996\u4e2a\u300c#/##/###\u300d\u4f5c\u4e3a\u6807\u9898\uff0c\u300c-\u300d\u300c*\u300d\u5f00\u5934\u7684\u884c\u4e3a\u8981\u70b9\uff0c\u300c<!-- \u6ce8\u91ca -->\u300d\u4e3a\u6f14\u8bb2\u8005\u5907\u6ce8\u3002markdown \u6b63\u6587\u8f83\u5927\uff08>5KB\uff09\u65f6\u6539\u7528 renderPptxFromFile\u3002
tool.renderPptxFromFile.desc=\u4ece\u78c1\u76d8\u4e0a\u7684 markdown \u6587\u4ef6\u751f\u6210 .pptx \u6f14\u793a\u6587\u7a3f\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002markdown \u6b63\u6587\u8f83\u5927\uff08>5KB\uff09\u65f6\u4f18\u5148\u7528\u672c\u5de5\u5177\u3002Marp \u98ce\u683c markdown \u5b50\u96c6\u4e0e renderPptx \u76f8\u540c\u3002
tool.render_html_image.desc=\u5c06 HTML \u6e32\u67d3\u4e3a PNG \u56fe\u7247\u5e76\u8fd4\u56de\u4e00\u6b21\u6027\u4e0b\u8f7d\u94fe\u63a5\u3002\u5f53\u7528\u6237\u5e0c\u671b\u4ee5\u300c\u56fe\u7247\u300d\u5f62\u5f0f\u4ea4\u4ed8 HTML \u5236\u54c1\uff08\u67b6\u6784\u56fe\u3001\u4fe1\u606f\u56fe\u3001\u4eea\u8868\u76d8\u3001\u539f\u578b\u7a3f\uff09\u65f6\u4f7f\u7528\uff0c\u5c24\u5176\u5728\u4f01\u4e1a\u5fae\u4fe1\u3001\u9489\u9489\u3001\u98de\u4e66\u3001Telegram\u3001Discord \u7b49\u65e0\u6cd5\u70b9\u5f00 HTML \u94fe\u63a5\u7684 IM \u6e20\u9053\u3002filePath \u4e0e html \u53c2\u6570\u4e8c\u9009\u4e00\u3002
tool.extract_document_text.desc=\u4ece Office/PDF \u6587\u6863\u4e2d\u63d0\u53d6\u6587\u672c\u5185\u5bb9\uff0c\u652f\u6301 PDF\u3001Word(.docx/.doc)\u3001Excel(.xlsx/.xls)\u3001PowerPoint(.pptx/.ppt)\u3002\u6309\u683c\u5f0f\u8d70\u591a\u7ea7 fallback \u63d0\u53d6\u94fe\uff08\u7cfb\u7edf\u547d\u4ee4 \u2192 Python \u2192 Java \u2192 Tika\uff09\uff0c\u8fd4\u56de\u63d0\u53d6\u6587\u672c\u3001\u6240\u7528\u65b9\u6cd5\u4e0e\u5143\u6570\u636e\u3002options \u53ef\u6307\u5b9a pages \u9875\u7801\u8303\u56f4\u6216 method \u5f3a\u5236\u63d0\u53d6\u5668\u3002
tool.extract_pdf_text.desc=\u63d0\u53d6 PDF \u6587\u4ef6\u7684\u6587\u672c\u5185\u5bb9\uff0c\u662f extract_document_text \u7684\u5feb\u6377\u65b9\u5f0f\u3002\u53ef\u901a\u8fc7 pages \u53c2\u6570\u6307\u5b9a\u9875\u7801\u8303\u56f4\uff08\u5982 "1-5" \u6216 "1,3,5"\uff09\uff0c\u4e0d\u4f20\u5219\u63d0\u53d6\u5168\u90e8\u3002
tool.extract_docx_text.desc=\u63d0\u53d6 Word \u6587\u6863\uff08.docx/.doc\uff09\u7684\u6587\u672c\u5185\u5bb9\uff0c\u662f extract_document_text \u7684\u5feb\u6377\u65b9\u5f0f\u3002
tool.detect_file_type.desc=\u68c0\u6d4b\u6587\u4ef6\u7684 MIME \u7c7b\u578b\u4e0e\u6587\u4ef6\u7c7b\u522b\u3002\u7528\u4e8e\u8bfb\u53d6\u6587\u4ef6\u524d\u5224\u65ad\u7c7b\u578b\u3001\u533a\u5206\u6587\u672c\u6587\u4ef6\u4e0e\u4e8c\u8fdb\u5236\u6587\u6863\uff08PDF/Office\uff09\u3001\u9009\u62e9\u5408\u9002\u7684\u8bfb\u53d6\u6216\u63d0\u53d6\u5de5\u5177\u3002\u8fd4\u56de mimeType\u3001fileCategory \u4e0e\u5efa\u8bae\u5de5\u5177 suggestedTool\u3002
# --- 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
guard.CRED_JWT_TOKEN.name=JWT Token \u6cc4\u9732
guard.CRED_JWT_TOKEN.fix=\u8bf7\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u6216\u5bc6\u94a5\u7ba1\u7406\u670d\u52a1\uff0c\u907f\u514d\u660e\u6587\u4f20\u9012 JWT
guard.CRED_GITHUB_TOKEN.name=GitHub Token \u6cc4\u9732
guard.CRED_GITHUB_TOKEN.fix=\u8bf7\u7acb\u5373\u5728 GitHub \u540e\u53f0\u64a4\u9500\u8be5 Token\uff0c\u6539\u7528\u73af\u5883\u53d8\u91cf
# --- 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.agent.name_required=Agent \u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.agent.duplicate_name=\u5f53\u524d\u5de5\u4f5c\u533a\u5df2\u5b58\u5728\u540c\u540d\u5458\u5de5\uff0c\u8bf7\u6362\u4e2a\u540d\u5b57\u518d\u8bd5
err.workflow.name_required=\u5de5\u4f5c\u6d41\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a
err.workflow.duplicate_name=\u5f53\u524d\u5de5\u4f5c\u533a\u5df2\u5b58\u5728\u540c\u540d\u5de5\u4f5c\u6d41\uff0c\u8bf7\u6362\u4e2a\u540d\u5b57\u518d\u8bd5
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.workspace.not_empty=\u5de5\u4f5c\u533a\u4e0b\u8fd8\u6709\u77e5\u8bc6\u5e93\uff0c\u8bf7\u5148\u5220\u9664\u77e5\u8bc6\u5e93\u540e\u518d\u5220\u9664\u5de5\u4f5c\u533a
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.skill.builtin_not_archivable=\u5185\u7f6e\u6280\u80fd\u4e0d\u53ef\u5f52\u6863
err.skill.cross_workspace_binding=\u4e0d\u80fd\u5c06\u5176\u5b83\u5de5\u4f5c\u533a\u7684\u6280\u80fd\u7ed1\u5b9a\u5230\u5f53\u524d Agent
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
err.cron.wiki_kb_required=\u8bf7\u9009\u62e9\u77e5\u8bc6\u5e93
err.cron.wiki_kb_invalid=\u77e5\u8bc6\u5e93 ID \u683c\u5f0f\u4e0d\u5408\u6cd5
err.cron.wiki_kb_not_found=\u77e5\u8bc6\u5e93\u4e0d\u5b58\u5728
# 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/Gemini \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.gemini_not_configured=Gemini Provider \u672a\u5b8c\u6210\u914d\u7f6e
err.agent.gemini_key_invalid=Gemini API Key \u672a\u914d\u7f6e\u6216\u65e0\u6548
err.agent.template_not_found=\u6a21\u677f\u4e0d\u5b58\u5728
err.agent.delete_forbidden=\u53ea\u6709\u521b\u5efa\u8005\u6216\u5de5\u4f5c\u533a\u7ba1\u7406\u5458\u53ef\u5220\u9664\u6b64 Agent
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.oauth_no_discovery=OAuth Provider \u4e0d\u652f\u6301\u6a21\u578b\u53d1\u73b0
err.llm.oauth_no_test=OAuth Provider \u4e0d\u652f\u6301\u6a21\u578b\u6d4b\u8bd5
err.anthropic.no_claude_code=Claude Code \u51ed\u636e\u672a\u627e\u5230\uff0c\u8bf7\u5b89\u88c5 Claude Code \u5ba2\u6237\u7aef\u5e76\u7528 Pro/Max \u8d26\u53f7\u767b\u5f55
err.anthropic.token_expired_no_refresh=Claude Code token \u5df2\u8fc7\u671f\u4e14\u65e0\u6cd5\u5237\u65b0\uff0c\u8bf7\u6253\u5f00 Claude Code \u5ba2\u6237\u7aef\u91cd\u65b0\u767b\u5f55
err.anthropic.refresh_failed=Claude Code token \u5237\u65b0\u5931\u8d25
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.device_code_start_failed=Device code \u7533\u8bf7\u5931\u8d25
err.llm.chatgpt_models_fetch_failed=\u62c9\u53d6 ChatGPT \u53ef\u7528\u6a21\u578b\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
err.llm.gemini_stream_failed=Gemini \u6d41\u5f0f\u8c03\u7528\u5931\u8d25
err.llm.gemini_error=Gemini \u8fd4\u56de\u9519\u8bef
err.llm.model_not_supported=\u6a21\u578b ID \u4e0d\u652f\u6301\u5728 DashScope \u539f\u751f\u534f\u8bae\u4e2d\u4f7f\u7528\u3002\u70b9\u7248\u672c\u683c\u5f0f\u7684\u7cfb\u5217\uff08\u4f8b\u5982 qwen3.5-*\u3001qwen3.6-*\uff09\u53ea\u80fd\u901a\u8fc7\u517c\u5bb9\u6a21\u5f0f\u4f7f\u7528\u3002\u8bf7\u4f7f\u7528\u5141\u8bb8\u7684 ID\uff0c\u5982 qwen-max / qwen-plus / qwen3-max\u3002
# 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
context.skill_dir_hint=\u5171\u4eab\u6280\u80fd\u4f4d\u4e8e {0}\uff0c\u4f60\u4e5f\u53ef\u4ee5\u8bfb\u53d6\u548c\u8fd0\u884c\u5176\u4e2d\u7684\u6587\u4ef6\uff08\u5373\u4f7f\u5728\u5de5\u4f5c\u76ee\u5f55\u4e4b\u5916\uff09\u3002
context.model_identity=[system-context] \u6a21\u578b: {0}
context.model_identity_hint=\u88ab\u95ee\u5230\u4f60\u7528\u7684\u4ec0\u4e48\u6a21\u578b\u65f6\uff0c\u6309\u672c\u8f6e\u8fd9\u4e2a\u5024\u56de\u7b54\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
# --- Cron unified tasks conversation ---
cron.tasks_conversation.title=\ud83d\udccb \u5b9a\u65f6\u4efb\u52a1
cron.run_header.scheduled=\u5b9a\u65f6\u89e6\u53d1
cron.run_header.manual=\u624b\u52a8\u89e6\u53d1
cron.run.silent=\uff08\u672c\u6b21\u5b9a\u65f6\u4efb\u52a1\u68c0\u67e5\u540e\u65e0\u65b0\u5185\u5bb9\uff0c\u5df2\u8df3\u8fc7\u6295\u9012\uff09
# --- Wiki vision-in pipeline ---
err.wiki.vision.disabled=\u56fe\u7247\u8bc6\u522b\u529f\u80fd\u672a\u542f\u7528
err.wiki.vision.no_provider=\u672a\u914d\u7f6e\u53ef\u7528\u7684\u56fe\u7247\u8bc6\u522b provider
err.wiki.vision.provider_failed=\u56fe\u7247\u8bc6\u522b provider \u8c03\u7528\u5931\u8d25
err.wiki.vision.all_failed=\u6240\u6709\u56fe\u7247\u8bc6\u522b provider \u8c03\u7528\u5931\u8d25
# --- Wiki transformation: global starter pack is read-only ---
err.wiki.global_template_readonly=\u5185\u7f6e\u5168\u5c40\u6a21\u677f\u53ea\u8bfb\uff0c\u4e0d\u53ef\u7f16\u8f91\u6216\u5220\u9664
# --- Chat: assistant stop / interrupt placeholders ---
chat.stopMarker.userAborted=[\u5df2\u88ab\u7528\u6237\u4e2d\u6b62]
# --- Tool: send_file ---
tool.send_file.error.too_large=\u6587\u4ef6\u8fc7\u5927\uff1a{0}MB \u8d85\u51fa\u9650\u5236 {1}MB
tool.send_file.error.failed=\u53d1\u9001\u6587\u4ef6\u5931\u8d25\uff1a{0}
tool.send_file.success={0} \u5df2\u53d1\u9001\uff1a[{0}]({1})\uff08\u94fe\u63a5 10 \u5206\u949f\u5185\u6709\u6548\uff09\u3002\n\u91cd\u8981\uff1a\u56de\u7b54\u7528\u6237\u65f6**\u5fc5\u987b**\u4f7f\u7528\u4e0a\u8ff0\u76f8\u5bf9\u8def\u5f84 `{1}`\uff0c**\u4e0d\u8981**\u6dfb\u52a0\u4efb\u4f55 https://\u3001http:// \u57df\u540d\u524d\u7f00\uff0c\u524d\u7aef\u4f1a\u81ea\u52a8\u62fc\u63a5\u5f53\u524d\u4e3b\u673a\u3002
# --- Settings: workspace storage root ---
err.settings.storage_root_invalid=\u5b58\u50a8\u8def\u5f84\u65e0\u6548
err.settings.storage_root_not_absolute=\u5b58\u50a8\u8def\u5f84\u5fc5\u987b\u4e3a\u7edd\u5bf9\u8def\u5f84
err.settings.storage_root_create_failed=\u65e0\u6cd5\u521b\u5efa\u5b58\u50a8\u76ee\u5f55\uff0c\u8bf7\u68c0\u67e5\u8def\u5f84\u4e0e\u5199\u5165\u6743\u9650