@songsid/agend 2.1.4-beta.8 → 2.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +1 -1
  2. package/README.zh-TW.md +1 -1
  3. package/dist/agent-cli-instructions.md +2 -2
  4. package/dist/agent-endpoint.js +1 -1
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/backend/antigravity.d.ts +12 -8
  7. package/dist/backend/antigravity.js +189 -42
  8. package/dist/backend/antigravity.js.map +1 -1
  9. package/dist/backend/claude-code.d.ts +87 -23
  10. package/dist/backend/claude-code.js +361 -46
  11. package/dist/backend/claude-code.js.map +1 -1
  12. package/dist/backend/codex.d.ts +18 -0
  13. package/dist/backend/codex.js +139 -5
  14. package/dist/backend/codex.js.map +1 -1
  15. package/dist/backend/gemini-cli.js +2 -2
  16. package/dist/backend/gemini-cli.js.map +1 -1
  17. package/dist/backend/grok.js +2 -2
  18. package/dist/backend/grok.js.map +1 -1
  19. package/dist/backend/kiro.d.ts +52 -2
  20. package/dist/backend/kiro.js +267 -12
  21. package/dist/backend/kiro.js.map +1 -1
  22. package/dist/backend/opencode.js +17 -4
  23. package/dist/backend/opencode.js.map +1 -1
  24. package/dist/backend/types.d.ts +122 -3
  25. package/dist/backend/types.js +5 -1
  26. package/dist/backend/types.js.map +1 -1
  27. package/dist/backend-outage.d.ts +61 -0
  28. package/dist/backend-outage.js +71 -0
  29. package/dist/backend-outage.js.map +1 -0
  30. package/dist/channel/adapters/discord.d.ts +44 -2
  31. package/dist/channel/adapters/discord.js +529 -89
  32. package/dist/channel/adapters/discord.js.map +1 -1
  33. package/dist/channel/adapters/telegram.d.ts +30 -0
  34. package/dist/channel/adapters/telegram.js +221 -19
  35. package/dist/channel/adapters/telegram.js.map +1 -1
  36. package/dist/channel/agy-mcp-launcher.d.ts +2 -0
  37. package/dist/channel/agy-mcp-launcher.js +28 -0
  38. package/dist/channel/agy-mcp-launcher.js.map +1 -0
  39. package/dist/channel/ipc-bridge.d.ts +2 -1
  40. package/dist/channel/ipc-bridge.js +33 -4
  41. package/dist/channel/ipc-bridge.js.map +1 -1
  42. package/dist/channel/markdown-chunk.d.ts +42 -0
  43. package/dist/channel/markdown-chunk.js +205 -0
  44. package/dist/channel/markdown-chunk.js.map +1 -0
  45. package/dist/channel/mcp-server.js +34 -5
  46. package/dist/channel/mcp-server.js.map +1 -1
  47. package/dist/channel/mcp-tools.js +5 -3
  48. package/dist/channel/mcp-tools.js.map +1 -1
  49. package/dist/channel/message-queue.js +64 -8
  50. package/dist/channel/message-queue.js.map +1 -1
  51. package/dist/channel/types.d.ts +31 -1
  52. package/dist/classic-channel-manager.d.ts +65 -0
  53. package/dist/classic-channel-manager.js +172 -3
  54. package/dist/classic-channel-manager.js.map +1 -1
  55. package/dist/cli.js +124 -83
  56. package/dist/cli.js.map +1 -1
  57. package/dist/config-validator.js +16 -0
  58. package/dist/config-validator.js.map +1 -1
  59. package/dist/config.d.ts +4 -0
  60. package/dist/config.js +12 -1
  61. package/dist/config.js.map +1 -1
  62. package/dist/cross-instance-envelope.d.ts +6 -0
  63. package/dist/cross-instance-envelope.js +30 -0
  64. package/dist/cross-instance-envelope.js.map +1 -0
  65. package/dist/daemon.d.ts +538 -11
  66. package/dist/daemon.js +2272 -288
  67. package/dist/daemon.js.map +1 -1
  68. package/dist/doctor.d.ts +41 -0
  69. package/dist/doctor.js +267 -0
  70. package/dist/doctor.js.map +1 -0
  71. package/dist/fleet-context.d.ts +63 -0
  72. package/dist/fleet-context.js.map +1 -1
  73. package/dist/fleet-manager.d.ts +424 -11
  74. package/dist/fleet-manager.js +2753 -444
  75. package/dist/fleet-manager.js.map +1 -1
  76. package/dist/fleet-yaml-slim.d.ts +10 -0
  77. package/dist/fleet-yaml-slim.js +59 -0
  78. package/dist/fleet-yaml-slim.js.map +1 -0
  79. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
  80. package/dist/general-knowledge/skills/model-discovery/SKILL.md +63 -16
  81. package/dist/general-knowledge/skills/session-management/SKILL.md +171 -8
  82. package/dist/instance-lifecycle.d.ts +114 -1
  83. package/dist/instance-lifecycle.js +404 -14
  84. package/dist/instance-lifecycle.js.map +1 -1
  85. package/dist/instructions.js +42 -4
  86. package/dist/instructions.js.map +1 -1
  87. package/dist/locale.js +1024 -310
  88. package/dist/locale.js.map +1 -1
  89. package/dist/login-flows.d.ts +91 -0
  90. package/dist/login-flows.js +170 -0
  91. package/dist/login-flows.js.map +1 -0
  92. package/dist/login-manager.d.ts +63 -0
  93. package/dist/login-manager.js +134 -0
  94. package/dist/login-manager.js.map +1 -0
  95. package/dist/network-family.d.ts +18 -0
  96. package/dist/network-family.js +20 -0
  97. package/dist/network-family.js.map +1 -0
  98. package/dist/outbound-handlers.d.ts +16 -1
  99. package/dist/outbound-handlers.js +174 -40
  100. package/dist/outbound-handlers.js.map +1 -1
  101. package/dist/outbound-schemas.d.ts +10 -3
  102. package/dist/outbound-schemas.js +10 -0
  103. package/dist/outbound-schemas.js.map +1 -1
  104. package/dist/pane-input-residue.d.ts +52 -0
  105. package/dist/pane-input-residue.js +107 -0
  106. package/dist/pane-input-residue.js.map +1 -0
  107. package/dist/process-memory.d.ts +6 -0
  108. package/dist/process-memory.js +45 -0
  109. package/dist/process-memory.js.map +1 -1
  110. package/dist/reply-dedup.d.ts +7 -8
  111. package/dist/reply-dedup.js +0 -0
  112. package/dist/reply-dedup.js.map +1 -1
  113. package/dist/restart-progress.d.ts +2 -0
  114. package/dist/restart-progress.js +3 -0
  115. package/dist/restart-progress.js.map +1 -1
  116. package/dist/scheduler/db.d.ts +12 -0
  117. package/dist/scheduler/db.js +59 -0
  118. package/dist/scheduler/db.js.map +1 -1
  119. package/dist/service-installer.d.ts +11 -0
  120. package/dist/service-installer.js +84 -18
  121. package/dist/service-installer.js.map +1 -1
  122. package/dist/settings-api.js +1 -1
  123. package/dist/settings-api.js.map +1 -1
  124. package/dist/setup-wizard.js +2 -2
  125. package/dist/setup-wizard.js.map +1 -1
  126. package/dist/spawn-gate.d.ts +30 -0
  127. package/dist/spawn-gate.js +79 -0
  128. package/dist/spawn-gate.js.map +1 -0
  129. package/dist/steer-capability.d.ts +1 -0
  130. package/dist/steer-capability.js +6 -0
  131. package/dist/steer-capability.js.map +1 -0
  132. package/dist/storm-window.d.ts +83 -0
  133. package/dist/storm-window.js +251 -0
  134. package/dist/storm-window.js.map +1 -0
  135. package/dist/tips.d.ts +44 -0
  136. package/dist/tips.js +355 -0
  137. package/dist/tips.js.map +1 -0
  138. package/dist/tmux-manager.d.ts +16 -0
  139. package/dist/tmux-manager.js +110 -25
  140. package/dist/tmux-manager.js.map +1 -1
  141. package/dist/tool-progress.d.ts +40 -0
  142. package/dist/tool-progress.js +289 -0
  143. package/dist/tool-progress.js.map +1 -0
  144. package/dist/topic-commands.d.ts +45 -6
  145. package/dist/topic-commands.js +394 -66
  146. package/dist/topic-commands.js.map +1 -1
  147. package/dist/transcript-monitor.d.ts +15 -2
  148. package/dist/transcript-monitor.js +63 -17
  149. package/dist/transcript-monitor.js.map +1 -1
  150. package/dist/transcript-sources.d.ts +131 -0
  151. package/dist/transcript-sources.js +580 -0
  152. package/dist/transcript-sources.js.map +1 -0
  153. package/dist/types.d.ts +11 -0
  154. package/dist/ui/dashboard.html +55 -32
  155. package/dist/ui/settings.html +200 -60
  156. package/dist/ui/view.html +147 -30
  157. package/dist/usage/format-rich.d.ts +1 -1
  158. package/dist/usage/format-rich.js +28 -24
  159. package/dist/usage/format-rich.js.map +1 -1
  160. package/dist/usage/i18n-keys.d.ts +7 -0
  161. package/dist/usage/i18n-keys.js +34 -0
  162. package/dist/usage/i18n-keys.js.map +1 -0
  163. package/dist/usage/i18n.d.ts +5 -0
  164. package/dist/usage/i18n.js +27 -0
  165. package/dist/usage/i18n.js.map +1 -0
  166. package/dist/usage/providers.d.ts +21 -0
  167. package/dist/usage/providers.js +153 -75
  168. package/dist/usage/providers.js.map +1 -1
  169. package/dist/usage/usage-api.d.ts +11 -3
  170. package/dist/usage/usage-api.js +61 -24
  171. package/dist/usage/usage-api.js.map +1 -1
  172. package/dist/workflow-templates/default.md +2 -1
  173. package/package.json +2 -2
package/dist/locale.js CHANGED
@@ -12,317 +12,1031 @@ export function detectLocale(fleetConfig) {
12
12
  return cfg;
13
13
  return detectTimezone() === 8 ? "zh-TW" : "en";
14
14
  }
15
+ const enMessages = {
16
+ "cancel.button": "🛑 Cancel",
17
+ "cancel.sent": "🛑 Sent cancel to {0}.",
18
+ "cancel.not_running": "❌ {0} not running.",
19
+ "cancel.button_stale": "⚠️ This button has expired — {0} is not running. Each turn posts a fresh one.",
20
+ "clear.confirm_message": "⚠️ Clear {0}'s conversation history? This cannot be undone.",
21
+ "clear.confirm": "✅ Confirm clear",
22
+ "clear.cancel": "❌ Cancel",
23
+ "clear.confirm_posted": "A confirmation prompt was posted in this channel.",
24
+ "clear.clearing": "🧹 Clearing {0}'s conversation history...",
25
+ "clear.sent": "🧹 Clear command sent (`{0}`).",
26
+ "clear.cancelled": "❌ Clear cancelled for {0}.",
27
+ "clear.expired": "⌛ Clear confirmation for {0} expired.",
28
+ "clear.not_connected": "❌ Instance not connected (IPC unavailable)",
29
+ "clear.prompt_unavailable": "❌ Could not post the clear confirmation. Try again.",
30
+ "clear.failed": "❌ Failed to clear {0}: {1}",
31
+ "ctx.used": "📊 Context: {0}% used",
32
+ "ctx.backend": "Backend: {0}",
33
+ "ctx.model": "Model: {0}",
34
+ "ctx.instance": "Instance: {0}",
35
+ "ctx.unavailable": "Context info not available yet.",
36
+ "classic.already_active": "This channel already has an active agent. Use /chat to talk.",
37
+ "classic.topic_bound": "This channel is already bound to a topic-mode instance.",
38
+ "classic.not_authorized_guild": "⛔ This server is not in the allowed guilds list.",
39
+ "classic.no_agent": "No active agent in this channel.",
40
+ "classic.no_agent_start": "No active agent in this channel. Use /start first.",
41
+ "classic.started": "✅ Agent started in this channel. Use `/chat <message>` or @mention to talk.",
42
+ "classic.choose_backend": "Choose a backend for this agent:",
43
+ "classic.backend_required": "Choose a backend in the `/start` command and try again. If no backend field is shown, refresh Discord and reopen the command.",
44
+ "classic.selection_expired": "⏰ Backend selection expired. Run /start again to choose.",
45
+ "classic.backend_not_installed": "⚠️ {0} CLI (`{1}`) was not found in PATH.\nInstall: `{2}`\nStarting anyway…",
46
+ "classic.stopped": "🛑 Agent stopped in this channel.",
47
+ "classic.no_agent_here": "No active agent in this channel.",
48
+ "admin.only": "⛔ Only admins can do this.",
49
+ "admin.required": "⛔ This command requires admin access.",
50
+ "permission.denied": "⛔ Permission denied.",
51
+ "pause.usage": "Usage: `/pause <instance-name>`",
52
+ "wake.usage": "Usage: `/wake <instance-name>`",
53
+ "pause.success": "⏸ {0} paused.",
54
+ "wake.success": "▶️ {0} awake.",
55
+ "pause.not_idle": "⚠️ {0} is busy and was not paused. Wait until it is idle.",
56
+ "pause.failed": "❌ Failed to pause {0}: {1}",
57
+ "wake.failed": "❌ Failed to wake {0}: {1}",
58
+ "instance.not_found": "❌ Instance not found: {0}",
59
+ "not_authorized": "⛔ Not authorized",
60
+ "usage.chat": "Usage: `/chat <message>`",
61
+ "dashboard.title": "📊 AgEnD Dashboard",
62
+ "dashboard.starting": "⏳ Dashboard starting, retry shortly.",
63
+ "update.available": "🆕 AgEnD {0} available! Run: agend update",
64
+ "update.available_current": "🆕 AgEnD {0} available (current: {1})! Run: agend update",
65
+ "update.highlights": "Highlights: {0}",
66
+ "fleet.ready": "Fleet ready. {0}/{1} instances running. v{2}",
67
+ "fleet.ready_with_failed": "Fleet ready. {0}/{1} instances running. v{2} | Failed: {3}",
68
+ "cost.approaching": "⚠️ {0} cost: {1} / {2} ({3}%)",
69
+ "cost.limit_reached": "🛑 {0} daily limit {1} reached — pausing instance.",
70
+ "general.start_failed": "⚠️ General instance \"{0}\" failed to start:\n{1}",
71
+ "alert.unauth_user_private": "🆕 Unauthorized user tried /start in private chat:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n\nTo allow: add `{1}` to classicBot.yaml `allowed_users`",
72
+ "alert.start_not_admin": "🔑 User wants to /start but is not admin:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n• Group: {3}\n\nTo approve: add `{1}` to classicBot.yaml `admin_users`",
73
+ "alert.stop_not_admin": "🔑 User wants to /stop but is not admin:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n• Group: {3}\n\nTo approve: add `{1}` to classicBot.yaml `admin_users`",
74
+ "alert.unauth_guild": "🆕 Unauthorized guild tried /start:\n• Guild ID: {0}\n• User: {1}\n• Platform: discord\n\nTo allow: add `{0}` to classicBot.yaml `allowed_guilds`",
75
+ "alert.bot_added": "🆕 Bot added to new server:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n\nTo allow: add `{1}` to classicBot.yaml `allowed_guilds`",
76
+ "alert.new_group": "🆕 New group detected:\n• Name: {0}\n• ID: {1}\n• User: {2} ({3})\n• Platform: {4}\n\nTo allow: add `{1}` (quoted) to classicBot.yaml `allowed_groups`",
77
+ "schedule.deferred": "⏳ Schedule \"{0}\" deferred — rate limit at {1}%",
78
+ "restart.full_initiated": "🔄 Full restart initiated — waiting for all instances to idle, then reloading process...",
79
+ "restart.graceful_initiated": "🔄 Graceful restart initiated — waiting for all instances to idle...",
80
+ "inst.backend_unreachable": "🌐 `{0}` backend unreachable — {1}\nEvery instance on this backend is affected; sessions are kept and startup resume is held until it recovers. Nothing to fix locally — this notice is sent once per outage.",
81
+ "fleet.startup_retry_scheduled": "⚠️ {0} instance(s) failed to start: {1}\nAutomatic retry in {2} (then 5m, 15m).",
82
+ "fleet.startup_retry_outage": "Cause: the `{0}` backend is unreachable — sessions are kept and resumed once it is back.",
83
+ "fleet.startup_retry_gave_up": "❌ Gave up automatic startup retries for {0} instance(s): {1}\nStart them with `agend start <name>` or /restart once the cause is fixed.",
84
+ "inst.dialog_parked_hold": "⚠️ {0} is parked on a CLI dialog ({1}) that AgEnD does NOT recognise well enough to answer. Open its pane and LOOK before pressing anything: the cursor may already be on a different option than usual. For Claude's session-resume prompt, move the cursor onto \"Resume full session as-is\" and confirm that one — never confirm \"Resume from summary\" unless you want to drop the full context. Deliveries to this instance are held until the dialog is gone.",
85
+ "inst.dialog_parked_stuck": "⚠️ {0} is parked on a CLI dialog ({1}) and the automatic answer did not take. Open its pane and finish it by hand (for Claude's session-resume prompt: select \"Resume full session as-is\"). Deliveries to this instance are held until the dialog is gone.",
86
+ "fleet.dialog_parked": "⚠️ {0} has been parked on a CLI dialog for over a minute ({1}) — not auto-answered. Someone needs to choose in its pane; queued messages are held meanwhile.",
87
+ "inst.mcp_recovered": "✅ `{0}`'s MCP server is serving again — the earlier \"MCP server died\" report is retracted and no restart will happen. (A replacement or a sub-agent's server had left a dead pid behind; the live connection was verified at the IPC layer.)",
88
+ "inst.crashed_respawned": "⚠️ {0} crashed and respawned.",
89
+ "inst.crashed_respawned_log": "⚠️ {0} crashed and respawned. Check ~/.agend/daemon.log for details.",
90
+ "inst.restarted_no_context": "⚠️ {0}: restarted without context (snapshot injection failed)",
91
+ "inst.respawn_paused": "⚠️ {0} crashed 3+ times shortly after launch — paused for recovery. Check logs or run `/wake` to restart.",
92
+ "inst.recovered": "✅ {0}: recovered after {1}",
93
+ "cross_instance.message_too_large": "Message too long ({0}; limit {1}). Shorten it, or send a file path so the recipient can read the content directly.",
94
+ "cross_instance.envelope_too_large": "Message metadata makes the assembled handoff too long ({0}; safe limit {1}). Shorten the task summary or metadata, or send a file path instead.",
95
+ "cross_instance.delivery_failed_agent": "[system:delivery-failed] Your message to {0} was not delivered ({1}). correlation_id: {2}. Review the error and retry only if it is safe to do so. Do not acknowledge this status message.",
96
+ "cross_instance.delivery_failed_notice": "❌ Message to {0} was not delivered: {1} (correlation_id: {2})",
97
+ "inst.root_skip_perms": "⚠️ claude-code cannot run with --dangerously-skip-permissions as root. Set IS_SANDBOX=1 or use a non-root user.",
98
+ "inst.notification": "{0} {1}: {2} (action: {3})",
99
+ "inst.claude_model_fallback": "The selected Claude model is unavailable. Claude Code is currently using {0}; use /model to choose a supported model.",
100
+ "inst.claude_model_unavailable": "The selected Claude model is unavailable or unrecognized. Claude Code may be using a fallback; use /model to choose a supported model.",
101
+ "inst.codex_model_capacity": "The selected Codex model is currently at capacity. Retry the message manually later, or use /model to switch to another model before continuing.",
102
+ "inst.malformed_tool_call_recovered": "⚠️ {0}: detected a malformed Claude tool call and attempted to recover its reply.",
103
+ "inst.malformed_tool_call_unrecoverable": "⚠️ {0}: detected a malformed Claude tool call, but no reply text could be recovered.",
104
+ "interactive.kind.sudo_password": "sudo password",
105
+ "interactive.kind.password": "password",
106
+ "interactive.kind.confirmation": "Y/N confirmation",
107
+ "interactive.kind.press_enter": "Press Enter",
108
+ "interactive.general_notice": "⚠️ {0} is waiting for interactive input ({1}). Ask General to assist?",
109
+ "interactive.instance_notice": "⚠️ {0} is waiting for interactive input. Go to the General channel to confirm how to proceed.",
110
+ "interactive.confirm": "Confirm",
111
+ "interactive.cancel": "Cancel",
112
+ "interactive.confirmed": "✅ General assistance requested for {0}.",
113
+ "interactive.ignored": "🚫 Interactive prompt for {0} ignored.",
114
+ "interactive.expired": "⌛ Interactive prompt assistance for {0} expired.",
115
+ "interactive.self_assist": "⚠️ {0} is General itself and cannot self-assist while blocked. Use tmux attach.",
116
+ "interactive.delivery_failed": "❌ Could not deliver the assistance request for {0} to General.",
117
+ "interactive.assist_request": "[system] Interactive input assistance was confirmed for {0} (prompt type: {1}). Inspect that instance's tmux pane, report what operation is waiting, and ask the user for explicit authorization before sending any input. Never ask for or accept a password in chat; passwords must be entered directly in tmux by the operator.",
118
+ "exit.instance_notice": "🛑 {0} stopped normally (exit code 0). An administrator can restart it from General.",
119
+ "exit.general_notice": "🛑 {0} stopped (normal exit). Restart it?",
120
+ "exit.restart": "Restart",
121
+ "exit.ignore": "Ignore",
122
+ "exit.restarting": "🔄 Restarting {0}...",
123
+ "exit.restarted": "✅ {0} restarted.",
124
+ "exit.ignored": "🚫 Restart for {0} ignored.",
125
+ "exit.expired": "⌛ Restart prompt for {0} expired.",
126
+ "exit.restart_failed": "❌ Failed to restart {0}: {1}",
127
+ "hang.detected": "⚠️ {0} may be stuck — pane unchanged for {1}min, ready prompt not recognized",
128
+ "hang.restart": "🔄 Force restart",
129
+ "hang.wait": "⏳ Keep waiting",
130
+ "hang.waiting": "⏳ Continuing to wait for {0}.",
131
+ "hang.restarting": "🔄 Restarting {0}...",
132
+ "hang.restarted": "✅ {0} restarted.",
133
+ "hang.restart_failed": "❌ Failed to restart {0}: {1}",
134
+ "hang.expired": "⌛ Hang prompt for {0} expired — use /restart if it is still stuck.",
135
+ "buttons.stale": "⌛ This prompt has expired and can no longer be acted on.",
136
+ "tips.label": "Tip",
137
+ "tips.dismiss": "✅ Got it",
138
+ "tips.expired_use_tips": "⌛ That tip's buttons have expired — use /tips for a fresh one.",
139
+ "tips.confused": "❓ I don't understand",
140
+ "tips.feedback_recorded": "Feedback recorded. Thank you.",
141
+ "tips.dismissed": "✅ Tip dismissed — it will not be shown again.",
142
+ "tips.advanced.unlock_prompt": "🔓 The fleet has dismissed 60 intermediate tips. Start showing advanced tips?",
143
+ "tips.advanced.unlock": "🔓 Show advanced tips",
144
+ "tips.advanced.unlocked": "🔓 Advanced tips unlocked.",
145
+ "tips.advanced.expired": "🔓 Advanced tips are ready. Run /tips to unlock them when you want.",
146
+ "tips.enabled": "💡 Daily tips enabled.",
147
+ "tips.disabled": "🔕 Daily tips disabled. Use /tips anytime for an on-demand tip.",
148
+ "tips.empty": "🎉 You have dismissed every currently available tip.",
149
+ "tips.unavailable": "⚠️ Tips are not available yet. Try again shortly.",
150
+ "tips.usage": "Usage: /tips, /tips on, /tips off, or /tips advanced on (admin)",
151
+ "tips.posted": "💡 Tip posted.",
152
+ "restart.graceful": "🔄 Graceful restart — waiting for instances to idle...",
153
+ "update.running": "📦 Updating AgEnD... Fleet will restart automatically.",
154
+ "update.progress.preparing": "📦 Updating AgEnD... ({0}s)",
155
+ "update.progress.downloading": "⬇️ Downloading and installing... ({0}s)",
156
+ "update.progress.installed": "✅ Installation complete — v{0} ({1}s)",
157
+ "update.progress.stopping": "🔄 Stopping fleet... ({0}s)",
158
+ "update.progress.starting": "🚀 Starting fleet... ({0}s)",
159
+ "update.progress.instances": "⏳ Starting... {0}/{1} instances ({2}s)",
160
+ "update.progress.complete": "✅ Fleet restarted — v{0}, {1}/{2} instances running ({3}s)",
161
+ "update.progress.already_current": "✅ Already up to date — v{0} ({1}s)",
162
+ "update.progress.failed": "❌ Update failed during {0}: {1} ({2}s)",
163
+ "update.stage.preparing": "preparation",
164
+ "update.stage.downloading": "download/install",
165
+ "update.stage.installed": "installation verification",
166
+ "update.stage.stopping": "fleet stop",
167
+ "update.stage.starting": "fleet startup",
168
+ "update.stage.complete": "completion",
169
+ "update.stage.failed": "update",
170
+ "slash.start": "Start an agent in this channel",
171
+ "slash.stop": "Stop the agent in this channel",
172
+ "slash.chat": "Send a message to the agent",
173
+ "slash.ctx": "Show context usage",
174
+ "slash.cancel": "Interrupt the agent's current operation (sends Escape)",
175
+ "slash.dashboard": "Get dashboard URLs (admin only)",
176
+ "slash.compact": "Compact agent context window",
177
+ "slash.steer": "Interject into the agent's current task",
178
+ "steer.usage": "Usage: /steer <message> — interjects into the running turn",
179
+ "steer.sent": "🎯 Steering message sent to {0} (lands mid-turn; falls back to the queue if the CLI can't take busy input).",
180
+ "steer.not_connected": "❌ Instance not connected (IPC unavailable)",
181
+ "steer.unsupported": "⚠️ /steer is not supported for the {0} backend yet (its TUI can't take input mid-turn). The message was NOT sent — use a normal message instead, or /cancel first.",
182
+ "slash.btw": "Ask a side question without interrupting the current task",
183
+ "btw.usage": "Usage: /btw <message> — asks Claude Code a side question without interrupting its current task",
184
+ "btw.sent": "💬 Side question sent to {0}.",
185
+ "btw.not_connected": "❌ Instance not connected (IPC unavailable)",
186
+ "btw.unsupported": "⚠️ /btw is not supported for the {0} backend (Claude Code only). The message was NOT sent.",
187
+ "login.usage": "Usage: /login [backend] | /login code <text> | /login cancel",
188
+ "login.choose_backend": "Which backend should sign in again?",
189
+ "login.choose_provider": "Select the login method for Kiro:",
190
+ "login.unsupported": "⚠️ No remote login flow for backend \"{0}\". OpenCode credentials are API keys — manage them with `opencode auth` in a trusted terminal.",
191
+ "login.busy": "⚠️ A login session for {0} is already running. Use /login cancel first.",
192
+ "login.started": "🔐 Login started for {0}. I will post the authorization link here — treat it like a password.",
193
+ "login.auth_hint": "🔐 {0} login — open this link and approve. Anyone who completes it binds THEIR account, so do not forward it:",
194
+ "login.auth_code": "One-time code: {0}",
195
+ "login.need_input": "⌨️ The {0} login is asking: “{1}”. Reply with /login code <text> to enter it.",
196
+ "login.success": "✅ {0} login completed. Woke: {1}. Restarted (to reload credentials): {2}.",
197
+ "login.none": "none",
198
+ "login.failed": "❌ {0} login did not complete: {1}",
199
+ "login.cancelled": "🛑 Login session for {0} cancelled.",
200
+ "login.no_session": "No login session is running.",
201
+ "login.input_sent": "⌨️ Sent to the login prompt.",
202
+ "login.input_failed": "❌ Could not paste into the login window.",
203
+ "login.starting_backend": "🔐 Starting {0} login…",
204
+ "login.provider_selected": "▶️ Selected: {0}",
205
+ "login.still_valid": "⚠️ {0} authentication currently works. Re-login anyway?",
206
+ "login.relogin_go": "Re-login",
207
+ "login.relogin_cancel": "Cancel",
208
+ "login.chooser_posted": "🔐 Backend chooser posted.",
209
+ "login.confirm_posted": "⚠️ Authentication still works — confirmation buttons posted.",
210
+ "install.usage": "Usage: /install-cli <backend> | /install-cli cancel",
211
+ "classic.approve_done_group": "✅ Access granted — `{0}` added to the allow-list.",
212
+ "classic.approve_done_group_already": "ℹ️ `{0}` was already on the allow-list — nothing changed.",
213
+ "classic.approve_done_group_open": "ℹ️ `{0}` is already allowed: the list is empty, which means allow-all. Adding it would have restricted every other chat instead, so nothing was changed.",
214
+ "classic.approve_done_admin": "✅ `{0}` is now a ClassicBot admin.",
215
+ "classic.approve_done_admin_already": "ℹ️ `{0}` was already a ClassicBot admin.",
216
+ "classic.approve_failed": "⚠️ Could not apply access for `{0}` — ClassicBot is not configured on this fleet.",
217
+ "classic.unrecoverable_ids": "⚠️ classicBot.yaml holds ids that can never match: {0}\n\nThey were written without quotes and are too large for YAML, so their last digits were lost when the file was read. Re-add each one as a QUOTED string copied from Discord or Telegram — the digits now in the file are themselves wrong, so do not copy them from there.",
218
+ "classic.approve_group": "✅ Allow this group",
219
+ "classic.approve_group_admin": "✅ Allow + make admin",
220
+ "classic.approve_ignore": "🚫 Ignore",
221
+ "classic.approve_ignored": "🚫 Ignored — {0} was not granted access.",
222
+ "classic.approve_applying": "✅ Allowing {0}…",
223
+ "classic.approve_applying_admin": "✅ Allowing {0} and making {1} an admin…",
224
+ "install.choose_backend": "Which backend should be installed?",
225
+ "install.chooser_posted": "📦 Backend chooser posted.",
226
+ "install.starting_backend": "📦 Starting {0} install…",
227
+ "install.unsupported": "⚠️ No installer known for backend \"{0}\".",
228
+ "install.already": "✅ {0} is already installed (`{1}` found). Use /login {0} to sign in.",
229
+ "install.busy": "⚠️ Another install/login window is active. Use its cancel command first.",
230
+ "install.started": "📦 Installing {0}… I will report when it finishes (watch progress in the View page).",
231
+ "install.failed": "❌ {0} install did not complete: {1}",
232
+ "install.verify_failed": "⚠️ The {0} installer finished but `{1}` is still not on PATH. Check the View page or install over SSH.",
233
+ "install.success_no_login": "✅ {0} installed.",
234
+ "install.login_prompt": "✅ {0} installed. Sign in now?",
235
+ "install.login_now": "Sign in",
236
+ "install.later": "Later",
237
+ "install.later_ack": "👌 {0} installed — sign in later with /login {0}.",
238
+ "install.cancelled": "🛑 Install session for {0} cancelled.",
239
+ "install.no_session": "No install session is running.",
240
+ "slash.clear": "Clear agent conversation context",
241
+ "slash.save": "Save the agent's conversation",
242
+ "slash.load": "Load a saved conversation",
243
+ "slash.collab": "Toggle bot/webhook collaboration mode",
244
+ "slash.status": "Fleet status, per-instance costs and health (admin only)",
245
+ "slash.sysinfo": "System diagnostics",
246
+ "slash.restart": "Graceful restart all instances",
247
+ "slash.update": "Update AgEnD to latest version",
248
+ "slash.doctor": "Run health diagnostics",
249
+ "slash.login": "Re-login a CLI backend remotely (beta)",
250
+ "slash.install_cli": "Install a CLI backend remotely (beta)",
251
+ "slash.option.login_backend": "Backend to sign in",
252
+ "slash.option.login_code": "Text the login prompt is asking for",
253
+ "slash.option.login_cancel": "Cancel the active login session",
254
+ "slash.option.install_backend": "Backend CLI to install",
255
+ "slash.option.install_cancel": "Cancel the active install session",
256
+ "slash.usage": "AI subscription usage",
257
+ "slash.tips": "Show a useful AgEnD tip",
258
+ "slash.effort": "Set reasoning effort (admin only)",
259
+ "slash.model": "Switch model (admin only)",
260
+ "slash.pause": "Pause an idle instance",
261
+ "slash.wake": "Wake a paused instance",
262
+ "slash.option.backend": "Backend to start",
263
+ "slash.option.instance": "Instance name (required in General)",
264
+ "slash.option.message": "Your message",
265
+ "slash.option.tips_mode": "Optional daily-tip setting",
266
+ "slash.option.steer_message": "What to tell the agent mid-task",
267
+ "slash.option.btw_message": "Side question for Claude Code",
268
+ "slash.option.effort_level": "low | medium | high | xhigh | max",
269
+ "slash.option.save_filename": "File name to save as",
270
+ "slash.option.save_force": "Overwrite if file exists",
271
+ "slash.option.load_filename": "File name to load",
272
+ "chat.usage": "Usage: `/chat <message>`",
273
+ "filename.invalid": "⛔ Invalid filename — only letters, numbers, dots, hyphens, underscores allowed.",
274
+ "dashboard.disabled": "⛔ /dashboard disabled — no allowed_users configured",
275
+ "update.disabled": "⛔ /update disabled — no allowed_users configured",
276
+ "doctor.running": "🩺 Running diagnostics...",
277
+ "doctor.no_output": "No diagnostic output.",
278
+ "doctor.failed": "Diagnostics failed.",
279
+ "doctor.cli_missing": "Backend diagnostics unavailable — agend CLI not found in PATH.",
280
+ "doctor.section.prerequisites": "Prerequisites",
281
+ "doctor.section.service": "Service",
282
+ "doctor.section.fleet": "Fleet",
283
+ "doctor.section.gateways": "Channel gateways",
284
+ "doctor.section.ipc": "MCP IPC",
285
+ "doctor.config_invalid": "invalid: {0}",
286
+ "doctor.backend_label": "backend {0}",
287
+ "doctor.backend_unknown": "unknown backend",
288
+ "doctor.binary_available": "{0} available",
289
+ "doctor.binary_missing": "{0} not found",
290
+ "doctor.not_found": "not found",
291
+ "doctor.term_unset": "not set — TUI rendering may fail",
292
+ "doctor.network_family": "network family",
293
+ "doctor.network_family_auto": "Happy Eyeballs enabled; attempt timeout {0} ms",
294
+ "doctor.network_family_short": "Happy Eyeballs enabled; attempt timeout {0} ms is below AgEnD's recommended {1} ms",
295
+ "doctor.network_family_disabled": "Happy Eyeballs disabled; attempt timeout {0} ms",
296
+ "doctor.service_none": "no AgEnD service found — run: agend install",
297
+ "doctor.manager_user_unavailable": "unknown — systemd --user unavailable (common over SSH without a user D-Bus session)",
298
+ "doctor.manager_unavailable": "unknown (service manager unavailable)",
299
+ "doctor.service_installed": "installed",
300
+ "doctor.service_enabled": "enabled",
301
+ "doctor.service_active": "active",
302
+ "doctor.yes": "yes",
303
+ "doctor.no_install": "no — run: agend install",
304
+ "doctor.service_running": "running",
305
+ "doctor.inactive_start": "inactive — run: agend start",
306
+ "doctor.dbus_set": "DBUS_SESSION_BUS_ADDRESS is set",
307
+ "doctor.dbus_unset": "DBUS_SESSION_BUS_ADDRESS is not set — systemd --user may not work",
308
+ "doctor.fleet_process": "fleet process",
309
+ "doctor.pid_missing": "fleet.pid not found — fleet is not running",
310
+ "doctor.pid_invalid": "fleet.pid is invalid",
311
+ "doctor.pid_stale": "PID {0} is not alive (stale fleet.pid)",
312
+ "doctor.pid_alive": "PID {0} is alive",
313
+ "doctor.tmux_session": "tmux session",
314
+ "doctor.session_exists": "{0} exists",
315
+ "doctor.session_missing": "{0} not found",
316
+ "doctor.instances": "instances",
317
+ "doctor.config_missing": "fleet.yaml not found at {0}",
318
+ "doctor.instance_counts": "{0} running, {1} paused, {2} stopped, {3} crashed ({4} total)",
319
+ "doctor.ipc_ok": "{0}/{1} running instance socket(s) reachable",
320
+ "doctor.ipc_failed": "{0}/{1} reachable; failed: {2}",
321
+ "doctor.gateway_health": "Discord gateway health",
322
+ "doctor.gateway_unknown": "Fleet is not running; gateway health is unknown",
323
+ "doctor.gateway_no_details": "Fleet health endpoint has no per-adapter gateway details",
324
+ "doctor.gateway_unreachable": "Could not read fleet health: {0}",
325
+ "doctor.gateway_detail": "{0}; reconnects {1}; heartbeat ACK age {2}",
326
+ "doctor.title": "AgEnD doctor",
327
+ "doctor.complete": "Doctor complete ({0} warning(s))",
328
+ "doctor.errors": "Doctor found {0} error(s) ({1} warning(s))",
329
+ "install.description": "Install and start the AgEnD system service",
330
+ "install.path": "Service installed at: {0}",
331
+ "install.running": "✅ Fleet service installed and running.",
332
+ "install.start_failed": "❌ Fleet service was installed but could not be started: {0}",
333
+ "install.updated": "Service file updated (activation skipped).",
334
+ "uninstall.description": "Remove the AgEnD system service",
335
+ "uninstall.force_help": "Skip confirmation (for CI/automation)",
336
+ "uninstall.none": "No AgEnD service found.",
337
+ "uninstall.found": "AgEnD service found:",
338
+ "uninstall.manager": "Manager: {0}",
339
+ "uninstall.path": "Path: {0}",
340
+ "uninstall.enabled": "Enabled: {0}",
341
+ "uninstall.active": "Active: {0}",
342
+ "uninstall.unknown": "unknown",
343
+ "uninstall.yes": "yes",
344
+ "uninstall.no": "no",
345
+ "uninstall.running": "running",
346
+ "uninstall.inactive": "inactive",
347
+ "uninstall.non_interactive": "Non-interactive session — re-run with --force.",
348
+ "uninstall.confirm": "Remove service? [Y/n] ",
349
+ "uninstall.cancelled_force": "Service removal cancelled. Re-run with --force for non-interactive use.",
350
+ "uninstall.cancelled": "Service removal cancelled.",
351
+ "uninstall.removed": "Service disabled, stopped, and removed.",
352
+ "uninstall.failed": "Failed to uninstall service: {0}",
353
+ "usage.failed": "⚠️ Usage fetch failed: {0}",
354
+ "usage.title": "AI Subscription Usage",
355
+ "usage.title_plain": "AI subscription usage",
356
+ "usage.empty_active": "No active backends with usage tracking",
357
+ "usage.not_logged_in": "not logged in",
358
+ "usage.error_fallback": "error",
359
+ "usage.no_data": "no data",
360
+ "usage.reset.in": "resets in {0}",
361
+ "usage.reset.soon": "resets soon",
362
+ "usage.duration.days_hours": "{0}d {1}h",
363
+ "usage.duration.hours_minutes": "{0}h {1}m",
364
+ "usage.duration.minutes": "{0}m",
365
+ "usage.metric.session": "Session",
366
+ "usage.metric.weekly": "Weekly",
367
+ "usage.metric.monthly": "Monthly",
368
+ "usage.metric.days_window": "{0}-day window",
369
+ "usage.metric.named": "{0}",
370
+ "usage.metric.named_session": "{0} (session)",
371
+ "usage.metric.named_weekly": "{0} (weekly)",
372
+ "usage.metric.named_monthly": "{0} (monthly)",
373
+ "usage.metric.named_days": "{0} ({1}d)",
374
+ "usage.metric.extra_usage": "Extra usage",
375
+ "usage.metric.rate_limit_resets": "Rate limit resets",
376
+ "usage.metric.credits": "Credits",
377
+ "usage.metric.weekly_limit": "Weekly limit",
378
+ "usage.metric.pay_as_you_go": "Pay as you go",
379
+ "usage.metric.bonus_credits": "Bonus credits",
380
+ "usage.metric.overage_charges": "Overage charges",
381
+ "usage.metric.pay_per_use": "Pay-per-use",
382
+ "usage.metric.usage_monthly": "Usage (monthly)",
383
+ "usage.unit.available": "available",
384
+ "usage.unit.credits": "credits",
385
+ "usage.value.disabled": "Disabled",
386
+ "usage.value.cap": "{0} cap",
387
+ "usage.note.binding": "binding",
388
+ "usage.note.binding_severity": "binding · {0}",
389
+ "usage.note.busiest_model": "busiest of {0} model",
390
+ "usage.note.busiest_models": "busiest of {0} models",
391
+ "usage.note.used_limit_unit": "{0} / {1} {2}",
392
+ "usage.note.bonus_codes": "{0} / {1} {2} · {3} codes",
393
+ "usage.metric.agy_claude_others": "Claude & others",
394
+ "usage.metric.agy_claude_others_session": "Claude & others (session)",
395
+ "usage.metric.agy_claude_others_weekly": "Claude & others (weekly)",
396
+ "usage.hint.statusline_now": "from {0}'s statusline, just now — no API call; plan and per-model limits need a CLI login",
397
+ "usage.hint.statusline_minutes": "from {0}'s statusline, {1}m ago — no API call; plan and per-model limits need a CLI login",
398
+ "usage.hint.claude_api_key": "API-key login has no subscription usage. Use `claude /login` or set CLAUDE_CODE_OAUTH_TOKEN (from `claude setup-token`).",
399
+ "usage.hint.login_claude": "Log in with the Claude Code CLI (`claude`).",
400
+ "usage.hint.login_agy": "Log in with the Antigravity CLI (`agy`).",
401
+ "usage.hint.no_quota": "No quota information reported for this account.",
402
+ "usage.hint.login_codex": "Log in with the Codex CLI (`codex`).",
403
+ "usage.hint.codex_no_oauth": "auth.json has no OAuth login (API-key-only auth cannot read usage).",
404
+ "usage.hint.login_grok": "Log in with the Grok CLI (`grok login`).",
405
+ "usage.hint.grok_no_login": "auth.json has no usable login. Run `grok login`.",
406
+ "usage.hint.login_kiro": "Log in with the Kiro CLI (`kiro-cli`).",
407
+ "usage.hint.kiro_signed_out": "Signed out — run `kiro-cli` to log in.",
408
+ "usage.hint.token_refreshing": "Token refreshing — try again in a moment.",
409
+ "usage.hint.subscription_no_credit": "Subscription — no credit usage to report.",
410
+ "usage.hint.no_quota_account": "No quota information available for this account type.",
411
+ "usage.error.unreachable": "Could not reach {0}.",
412
+ "usage.error.token_rejected": "Token rejected. Run `{0}` once to refresh the login.",
413
+ "usage.error.rate_limited": "Rate limited by {0} — try again later.",
414
+ "usage.error.http": "Usage request failed (HTTP {0}).",
415
+ "usage.error.billing_http": "Billing request failed (HTTP {0}).",
416
+ "usage.error.invalid_response": "Invalid response from usage endpoint.",
417
+ "usage.error.invalid_billing_response": "Invalid response from billing endpoint.",
418
+ "usage.error.invalid_kiro_response": "Invalid response from GetUsageLimits.",
419
+ "usage.error.claude_token_expired": "Access token expired — it refreshes the next time any Claude instance runs.",
420
+ "usage.error.codex_token_expired": "Access token expired. Run `codex` once to refresh it.",
421
+ "usage.error.grok_expired": "Grok session expired. Run `grok login` again.",
422
+ "usage.error.grok_response_changed": "Grok billing response changed.",
423
+ "usage.error.agy_cap": "Individual cap reached — CLI is rate limited (resets in ~{0}). The per-model pool quotas are separate and may still read 0% used.",
424
+ "usage.error.agy_no_refresh": "Access token expired and no refresh token is stored. Run `agy` once.",
425
+ "usage.error.agy_token_expired": "Access token expired. Run `agy` once to refresh it (or set AGY_OAUTH_CLIENT_ID/SECRET to refresh automatically).",
426
+ "usage.error.agy_login_expired": "Google sign-in expired. Run `agy` once to log in again.",
427
+ "usage.error.agy_refresh_empty": "Google token refresh returned no token.",
428
+ "usage.error.grok_auth_readonly": "Token expired and auth.json is read-only. Run `grok` once to refresh it.",
429
+ "usage.error.grok_no_refresh": "Token expired and no refresh token was found. Run `grok login`.",
430
+ "usage.error.grok_refresh_unreachable": "Could not reach auth.x.ai to refresh the token.",
431
+ "usage.error.grok_invalid_refresh": "Invalid refresh response from auth.x.ai.",
432
+ "usage.error.grok_persist": "Refreshed but could not write auth.json. Run `grok` once instead.",
433
+ "general.pause_forbidden": "General cannot be paused",
434
+ "compact.sent": "🗜️ Compact command sent (`{0}`).",
435
+ "compact.not_connected": "❌ Instance not connected (IPC unavailable)",
436
+ "save.unsupported": "⚠️ /save is not supported for this backend (only Kiro CLI and Claude Code).",
437
+ "save.not_connected": "❌ Instance not connected (IPC unavailable)",
438
+ "clear.unsupported": "⚠️ Clear is not supported for this backend.",
439
+ "model.usage": "Usage: /model <name> — e.g. /model sonnet",
440
+ "model.list_unavailable": "No model list is available for {0}. Use `/model <name>` to set one directly.",
441
+ "model.menu": "Current model: {0}\nSelect a new model:",
442
+ "model.more": "📋 More models…",
443
+ "model.more_unavailable": "⚠️ Could not fetch the account model catalog (no OAuth token or the API is unreachable). The alias picks above still work, and /model <name> passes any name through.",
444
+ "model.selection_expired": "⏰ Model selection expired.",
445
+ "model.switching": "⏳ Switching {0} to `{1}`…",
446
+ "model.switch_failed": "Model switch to `{0}` failed: {1}",
447
+ "model.pattern_warning": "⚠️ \"{0}\" does not match {1}'s usual pattern — passing through anyway.\n",
448
+ "model.persist_failed": "❌ Could not set model for {0}.",
449
+ "model.runtime_success": "✅ Switched {0} to `{1}` (runtime).",
450
+ "model.restart_success": "✅ Set {0} to `{1}` and restarted.",
451
+ "effort.unsupported": "❌ {0} has no reasoning-effort setting.",
452
+ "effort.usage": "Usage: /effort <{0}>",
453
+ "effort.menu": "{0}\nSelect a new effort level:",
454
+ "effort.selection_expired": "⏰ Effort selection expired.",
455
+ "effort.setting": "⏳ Setting {0} effort to `{1}`…",
456
+ "effort.switch_failed": "Effort switch to `{0}` failed: {1}",
457
+ "effort.unknown": "❌ Unknown effort level `{0}`. Use: {1}.",
458
+ "effort.no_canonical": "❌ {0} accepts none of the canonical effort levels.",
459
+ "effort.clamped": "⚠️ Clamped to `{0}` (`{1}` is not supported by {2}).\n",
460
+ "effort.not_running": "❌ {0} is not running.",
461
+ "effort.runtime_success": "✅ Set {0} effort to `{1}` (runtime).",
462
+ "effort.restart_success": "✅ Set {0} effort to `{1}` and restarted.",
463
+ "effort.current_default": "Current effort: (CLI default)",
464
+ "effort.current_fleet": "Current effort: {0} (fleet default)",
465
+ "effort.current": "Current effort: {0}",
466
+ "status.no_config": "No fleet config loaded.",
467
+ "status.no_instances": "No instances configured.",
468
+ "status.title": "Fleet Status",
469
+ "status.table_header": "| Instance | Backend | Ctx | Effort | Cost | Status | State | IPC |",
470
+ "status.paused_count": "Paused instances: {0}",
471
+ "status.daily_cost": "Fleet: {0} / {1} daily",
472
+ "status.adapters": "Adapters:",
473
+ "state.idle": "idle",
474
+ "state.working": "working",
475
+ "state.stuck": "stuck",
476
+ "state.paused": "paused",
477
+ "sysinfo.title": "System Info",
478
+ "sysinfo.metric": "Metric",
479
+ "sysinfo.value": "Value",
480
+ "sysinfo.uptime": "Uptime",
481
+ "sysinfo.memory": "Memory",
482
+ "sysinfo.heap": "Heap",
483
+ "sysinfo.resources": "Resources",
484
+ "sysinfo.docs": "Docs",
485
+ "sysinfo.tips": "Tips",
486
+ "sysinfo.github": "GitHub",
487
+ "sysinfo.instances": "Instances",
488
+ "sysinfo.running": "running",
489
+ "sysinfo.paused": "paused",
490
+ "sysinfo.fleet_mem": "Fleet Mem",
491
+ "sysinfo.system_mem": "System Memory",
492
+ "topic.unbound": "This topic/thread/channel is not bound to an instance. Ask General to create one with create_instance.",
493
+ "rate_limit.five_hour": "⚠️ {0} is at {1}% of its 5-hour rate limit. Responses may be slower.",
494
+ "rate_limit.weekly": "⚠️ {0} is at {1}% weekly usage. Responses may be slower or fail.",
495
+ "failover.triggered": "⚡ Rate limit {0}% — next rotation will use {1} (was {2}).",
496
+ "failover.recovered": "✅ Rate limit recovered ({0}%) — next rotation will use {1}.",
497
+ "adapter.start_failed": "⚠️ Adapter \"{0}\" failed to start: {1}\nRetrying in the background; other adapters are unaffected.",
498
+ "adapter.reconnected": "✅ Adapter \"{0}\" reconnected after {1} attempt(s).",
499
+ "storm.opened": "⚠️ The tmux server crashed — {0} instances were affected. Delivery is held while recovery waits {1} before retrying.",
500
+ "storm.extended": "⚠️ The tmux server crashed again ({0} crashes in this storm). Automatic recovery backoff is now {1}; queued messages remain held.",
501
+ "storm.recovered": "✅ tmux recovery finished: {0}/{1} instances recovered. Unresolved: {2}.",
502
+ "storm.timed_out": "⚠️ tmux recovery timed out: {0}/{1} instances recovered. Unresolved: {2}.",
503
+ "storm.none": "none",
504
+ "general.antigravity_unsupported": "⚠️ Antigravity is not supported for General instances because it cannot receive MCP instructions. Switch to Claude Code or Kiro CLI.",
505
+ "classic.manager_unavailable": "Classic channel manager is not initialized.",
506
+ "fleet.reload_failed": "⚠️ fleet.yaml reload FAILED — {0}\nThe previous configuration is still running.",
507
+ "fleet.reload_rejected": "⚠️ fleet.yaml reload REJECTED — {0}\nThe previous configuration is still running.",
508
+ "fleet.reload_validation": "validation failed:\n{0}",
509
+ "fleet.reload_removed_all": "it removed every instance ({0} → 0)",
510
+ "fleet.reload_removed_half": "it removed more than half the instances ({0} → {1})",
511
+ "fleet.error_suppressed": "(plus {0} more in the last {1}m)",
512
+ "dashboard.port_in_use": "⚠️ Dashboard unavailable — health port {0} is already in use. Stop the conflicting process or configure a different health_port.",
513
+ "dashboard.server_failed": "⚠️ Dashboard unavailable — health server failed: {0}",
514
+ "save.usage": "Usage: /save <filename>",
515
+ "save.sent": "✅ Sent `{0}` to {1}",
516
+ "classic.not_allowed_user": "⛔ You are not in the allowed users list.",
517
+ "classic.access_requested": "⏳ Access requested. Waiting for admin approval.",
518
+ "classic.admin_only_start": "⛔ Only admins can start agents. Ask an admin to /start.",
519
+ "classic.admin_only_stop": "⛔ Only admins can stop agents.",
520
+ "cmd.admin_required": "⛔ {0} requires admin access.",
521
+ "collab.on": "🤝 Collaboration mode ON — bot/webhook messages reach the agent.",
522
+ "collab.off": "💬 Collaboration mode OFF",
523
+ "collab.on.classic": "🤝 Collaboration mode ON — @mention this bot to trigger the agent. Other bot messages are visible.",
524
+ "collab.off.classic": "💬 Collaboration mode OFF — use /chat to talk to the agent.",
525
+ };
526
+ const zhTWMessages = {
527
+ "cancel.button": "🛑 取消",
528
+ "cancel.sent": "🛑 已送出取消給 {0}。",
529
+ "cancel.not_running": "❌ {0} 未在執行。",
530
+ "cancel.button_stale": "⚠️ 這顆按鈕已失效 — {0} 沒有在執行。每一輪都會有新的按鈕。",
531
+ "clear.confirm_message": "⚠️ 確定要清空 {0} 的對話記錄嗎?此操作不可逆。",
532
+ "clear.confirm": "✅ 確認清空",
533
+ "clear.cancel": "❌ 取消",
534
+ "clear.confirm_posted": "已在此頻道送出確認按鈕。",
535
+ "clear.clearing": "🧹 正在清空 {0} 的對話記錄...",
536
+ "clear.sent": "🧹 已送出清空指令(`{0}`)。",
537
+ "clear.cancelled": "❌ 已取消清空 {0}。",
538
+ "clear.expired": "⌛ {0} 的清空確認已逾時。",
539
+ "clear.not_connected": "❌ instance 未連線(IPC unavailable)",
540
+ "clear.prompt_unavailable": "❌ 無法送出清空確認,請再試一次。",
541
+ "clear.failed": "❌ 清空 {0} 失敗:{1}",
542
+ "ctx.used": "📊 Context:{0}% 已用",
543
+ "ctx.backend": "Backend:{0}",
544
+ "ctx.model": "Model:{0}",
545
+ "ctx.instance": "Agent:{0}",
546
+ "ctx.unavailable": "Context 資訊尚未可用。",
547
+ "classic.already_active": "此頻道已有活動中的 Agent。請用 /chat 對話。",
548
+ "classic.topic_bound": "此頻道已綁定到 topic 模式的 instance。",
549
+ "classic.not_authorized_guild": "⛔ 此伺服器不在允許清單中。",
550
+ "classic.no_agent": "此頻道沒有活動中的 Agent。",
551
+ "classic.no_agent_start": "此頻道沒有活動中的 Agent。請先用 /start。",
552
+ "classic.started": "✅ Agent 已在此頻道啟動。用 `/chat <訊息>` 或 @mention 對話。",
553
+ "classic.choose_backend": "請選擇此 Agent 的 Backend:",
554
+ "classic.backend_required": "請在 `/start` 指令中選擇 Backend 後重試。若沒有顯示 Backend 欄位,請重新整理 Discord 再開啟指令。",
555
+ "classic.selection_expired": "⏰ 選擇逾時。請再次執行 /start。",
556
+ "classic.backend_not_installed": "⚠️ 找不到 {0} CLI(`{1}`)於 PATH。\n安裝:`{2}`\n仍會嘗試啟動…",
557
+ "classic.stopped": "🛑 已停止此頻道的 Agent。",
558
+ "classic.no_agent_here": "此頻道沒有活動中的 Agent。",
559
+ "admin.only": "⛔ 只有管理員能執行此操作。",
560
+ "admin.required": "⛔ 此指令需要管理員權限。",
561
+ "permission.denied": "⛔ 權限不足。",
562
+ "pause.usage": "用法:`/pause <instance-name>`",
563
+ "wake.usage": "用法:`/wake <instance-name>`",
564
+ "pause.success": "⏸ {0} 已暫停。",
565
+ "wake.success": "▶️ {0} 已喚醒。",
566
+ "pause.not_idle": "⚠️ {0} 正在工作,未暫停。請等待進入閒置狀態。",
567
+ "pause.failed": "❌ 暫停 {0} 失敗:{1}",
568
+ "wake.failed": "❌ 喚醒 {0} 失敗:{1}",
569
+ "instance.not_found": "❌ 找不到 instance:{0}",
570
+ "not_authorized": "⛔ 未授權",
571
+ "usage.chat": "用法:`/chat <訊息>`",
572
+ "dashboard.title": "📊 AgEnD 儀表板",
573
+ "dashboard.starting": "⏳ 儀表板啟動中,請稍後再試。",
574
+ "update.available": "🆕 AgEnD {0} 可更新!執行:/update",
575
+ "update.available_current": "🆕 AgEnD {0} 可更新(目前:{1})!執行:/update",
576
+ "update.highlights": "更新重點:{0}",
577
+ "fleet.ready": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2}",
578
+ "fleet.ready_with_failed": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2} | 失敗:{3}",
579
+ "cost.approaching": "⚠️ {0} 花費:{1} / {2}({3}%)",
580
+ "cost.limit_reached": "🛑 {0} 已達每日上限 {1} — 暫停 Agent。",
581
+ "general.start_failed": "⚠️ General Agent「{0}」啟動失敗:\n{1}",
582
+ "alert.unauth_user_private": "🆕 未授權使用者嘗試在私訊 /start:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_users`",
583
+ "alert.start_not_admin": "🔑 使用者想 /start 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
584
+ "alert.stop_not_admin": "🔑 使用者想 /stop 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
585
+ "alert.unauth_guild": "🆕 未授權伺服器嘗試 /start:\n• Guild ID:{0}\n• 使用者:{1}\n• 平台:discord\n\n允許:把 `{0}` 加到 classicBot.yaml 的 `allowed_guilds`",
586
+ "alert.bot_added": "🆕 Bot 被加入新伺服器:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
587
+ "alert.new_group": "🆕 偵測到新群組:\n• 名稱:{0}\n• ID:{1}\n• 使用者:{2}({3})\n• 平台:{4}\n\n允許:把 `{1}`(加引號)加到 classicBot.yaml 的 `allowed_groups`",
588
+ "schedule.deferred": "⏳ 排程「{0}」延後 — rate limit 於 {1}%",
589
+ "restart.full_initiated": "🔄 開始完整重啟 — 等待所有 Agent 閒置後重載程序...",
590
+ "restart.graceful_initiated": "🔄 開始優雅重啟 — 等待所有 Agent 閒置...",
591
+ "inst.backend_unreachable": "🌐 `{0}` 後端無法連線 — {1}\n此後端上的所有 instance 都受影響;session 會保留,啟動時的 resume 會暫停直到後端恢復。本地無需處理 — 此通知每次故障只發一次。",
592
+ "fleet.startup_retry_scheduled": "⚠️ {0} 個 instance 啟動失敗:{1}\n{2} 後自動重試(之後 5m、15m)。",
593
+ "fleet.startup_retry_outage": "原因:`{0}` 後端無法連線 — session 已保留,後端恢復後會 resume。",
594
+ "fleet.startup_retry_gave_up": "❌ 已放棄自動重試啟動 {0} 個 instance:{1}\n原因排除後請用 `agend start <name>` 或 /restart 啟動。",
595
+ "inst.dialog_parked_hold": "⚠️ {0} 停在一個 AgEnD 認不準、因此**不會**自動回答的 CLI 對話框上({1})。請到它的 pane **先看清楚再按鍵**:游標可能已經在不同的選項上。若是 Claude 的 session-resume 提示,請把游標移到「Resume full session as-is」再確認;除非你要丟掉完整 context,否則絕不要確認「Resume from summary」。對話框消失前,送給這個 instance 的訊息會先保留。",
596
+ "inst.dialog_parked_stuck": "⚠️ {0} 停在一個 CLI 對話框上({1}),自動回答沒有生效。請到它的 pane 手動完成(Claude 的 session-resume 提示:選「Resume full session as-is」)。對話框消失前,送給這個 instance 的訊息會先保留。",
597
+ "fleet.dialog_parked": "⚠️ {0} 已在 CLI 對話框上停超過一分鐘({1}),未自動回答。需要有人到它的 pane 選擇;期間排隊訊息會保留。",
598
+ "inst.mcp_recovered": "✅ `{0}` 的 MCP server 仍在服務 —— 先前的「MCP server 已終止」警報作廢,不會重啟。(是替換或子 agent 的 server 留下了死 pid;活的連線已在 IPC 層驗證。)",
599
+ "inst.crashed_respawned": "⚠️ {0} 已崩潰並重生。",
600
+ "inst.crashed_respawned_log": "⚠️ {0} 已崩潰並重生。詳見 ~/.agend/daemon.log。",
601
+ "inst.restarted_no_context": "⚠️ {0}:已重啟但無 Context(snapshot 注入失敗)",
602
+ "inst.respawn_paused": "⚠️ {0} 連續 crash 3+ 次 — 已暫停恢復。檢查 log 或執行 `/wake` 重啟。",
603
+ "inst.recovered": "✅ {0}:{1} 後恢復",
604
+ "cross_instance.message_too_large": "訊息過長({0};上限 {1})。請精簡內容,或改傳檔案路徑讓對方自行讀取。",
605
+ "cross_instance.envelope_too_large": "訊息 metadata 使組裝後內容過長({0};安全上限 {1})。請精簡任務摘要或 metadata,或改傳檔案路徑。",
606
+ "cross_instance.delivery_failed_agent": "[system:delivery-failed] 送往 {0} 的訊息未送達({1})。correlation_id: {2}。請檢查錯誤,僅在確認安全時重試;不要回覆這則狀態訊息。",
607
+ "cross_instance.delivery_failed_notice": "❌ 送往 {0} 的訊息未送達:{1}(correlation_id:{2})",
608
+ "inst.root_skip_perms": "⚠️ claude-code 不能以 root 執行 --dangerously-skip-permissions。請設定 IS_SANDBOX=1 或改用非 root 使用者。",
609
+ "inst.notification": "{0} {1}:{2}(動作:{3})",
610
+ "inst.claude_model_fallback": "選擇的 Claude Model 無法使用。Claude Code 目前實際使用 {0};請用 /model 選擇支援的 Model。",
611
+ "inst.claude_model_unavailable": "選擇的 Claude Model 無法使用或無法辨識。Claude Code 可能已改用 fallback;請用 /model 選擇支援的 Model。",
612
+ "inst.codex_model_capacity": "選擇的 Codex 模型目前服務擁擠。請稍後手動重送訊息,或用 /model 切換其他模型後再繼續。",
613
+ "inst.malformed_tool_call_recovered": "⚠️ {0}:偵測到 malformed Claude tool-call,已嘗試恢復回覆。",
614
+ "inst.malformed_tool_call_unrecoverable": "⚠️ {0}:偵測到 malformed Claude tool-call,但無法擷取可恢復的回覆文字。",
615
+ "interactive.kind.sudo_password": "sudo 密碼",
616
+ "interactive.kind.password": "密碼",
617
+ "interactive.kind.confirmation": "Y/N 確認",
618
+ "interactive.kind.press_enter": "按 Enter",
619
+ "interactive.general_notice": "⚠️ {0} 正在等待人工輸入({1})。請 General 協助嗎?",
620
+ "interactive.instance_notice": "⚠️ {0} 正在等待人工輸入。請至 General channel 確認處理方式。",
621
+ "interactive.confirm": "確認",
622
+ "interactive.cancel": "取消",
623
+ "interactive.confirmed": "✅ 已請 General 協助處理 {0}。",
624
+ "interactive.ignored": "🚫 已忽略 {0} 的人工輸入提示。",
625
+ "interactive.expired": "⌛ {0} 的人工輸入協助請求已逾時。",
626
+ "interactive.self_assist": "⚠️ {0} 就是 General;阻塞時無法自助。請直接使用 tmux attach。",
627
+ "interactive.delivery_failed": "❌ 無法把 {0} 的協助請求送進 General。",
628
+ "interactive.assist_request": "[system] 已確認協助 {0} 的人工輸入(提示類型:{1})。請查看該 instance 的 tmux pane,向使用者回報正在等待的操作,並在輸入任何內容前取得明確授權。絕不可要求或接受使用者在聊天中傳送密碼;密碼只能由操作員直接在 tmux 輸入。",
629
+ "exit.instance_notice": "🛑 {0} 已停止(正常退出,exit code 0)。管理員可至 General 重新啟動。",
630
+ "exit.general_notice": "🛑 {0} 已停止(正常退出)。要重新啟動嗎?",
631
+ "exit.restart": "重啟",
632
+ "exit.ignore": "忽略",
633
+ "exit.restarting": "🔄 正在重啟 {0}...",
634
+ "exit.restarted": "✅ {0} 已重新啟動。",
635
+ "exit.ignored": "🚫 已忽略 {0} 的重啟提示。",
636
+ "exit.expired": "⌛ {0} 的重啟提示已逾時。",
637
+ "exit.restart_failed": "❌ 無法重啟 {0}:{1}",
638
+ "hang.detected": "⚠️ {0} 可能卡住了 — 畫面已 {1} 分鐘無變化,也偵測不到就緒提示",
639
+ "hang.restart": "🔄 強制重啟",
640
+ "hang.wait": "⏳ 繼續等待",
641
+ "hang.waiting": "⏳ 繼續等待 {0}。",
642
+ "hang.restarting": "🔄 正在重啟 {0}...",
643
+ "hang.restarted": "✅ {0} 已重新啟動。",
644
+ "hang.restart_failed": "❌ 無法重啟 {0}:{1}",
645
+ "hang.expired": "⌛ {0} 的卡住提示已逾時 — 若仍卡住請用 /restart。",
646
+ "buttons.stale": "⌛ 此提示已逾時,無法再操作。",
647
+ "tips.label": "小提示",
648
+ "tips.dismiss": "✅ 我知道了",
649
+ "tips.expired_use_tips": "⌛ 這則提示的按鈕已過期——輸入 /tips 取得新提示。",
650
+ "tips.confused": "❓ 看不懂",
651
+ "tips.feedback_recorded": "已記錄,感謝回饋。",
652
+ "tips.dismissed": "✅ 已記錄,此提示不會再出現。",
653
+ "tips.advanced.unlock_prompt": "🔓 此 Fleet 已略過 60 則中階提示。要開始顯示進階提示嗎?",
654
+ "tips.advanced.unlock": "🔓 開始看進階",
655
+ "tips.advanced.unlocked": "🔓 已解鎖進階提示。",
656
+ "tips.advanced.expired": "🔓 進階提示已可解鎖;準備好時可執行 /tips。",
657
+ "tips.enabled": "💡 已開啟每日提示。",
658
+ "tips.disabled": "🔕 已關閉每日提示;仍可隨時用 /tips 主動查看。",
659
+ "tips.empty": "🎉 目前可用的提示都已讀完。",
660
+ "tips.unavailable": "⚠️ 提示系統尚未就緒,請稍後再試。",
661
+ "tips.usage": "用法:/tips、/tips on、/tips off,或管理員使用 /tips advanced on",
662
+ "tips.posted": "💡 已發出提示。",
663
+ "restart.graceful": "🔄 優雅重啟中 — 等待所有 Agent 閒置...",
664
+ "update.running": "📦 正在更新 AgEnD... Fleet 會自動重啟。",
665
+ "update.progress.preparing": "📦 正在更新 AgEnD... ({0}s)",
666
+ "update.progress.downloading": "⬇️ 下載及安裝中... ({0}s)",
667
+ "update.progress.installed": "✅ 安裝完成 — v{0} ({1}s)",
668
+ "update.progress.stopping": "🔄 停止 Fleet... ({0}s)",
669
+ "update.progress.starting": "🚀 啟動 Fleet... ({0}s)",
670
+ "update.progress.instances": "⏳ 啟動中... {0}/{1} 個 Agent({2}s)",
671
+ "update.progress.complete": "✅ Fleet 已重啟 — v{0},{1}/{2} 個 Agent 運行中({3}s)",
672
+ "update.progress.already_current": "✅ 已是最新版本 — v{0} ({1}s)",
673
+ "update.progress.failed": "❌ 更新在「{0}」階段失敗:{1} ({2}s)",
674
+ "update.stage.preparing": "準備",
675
+ "update.stage.downloading": "下載/安裝",
676
+ "update.stage.installed": "安裝驗證",
677
+ "update.stage.stopping": "停止 Fleet",
678
+ "update.stage.starting": "啟動 Fleet",
679
+ "update.stage.complete": "完成",
680
+ "update.stage.failed": "更新",
681
+ "slash.start": "在此頻道啟動 Agent",
682
+ "slash.stop": "停止此頻道的 Agent",
683
+ "slash.chat": "傳送訊息給 Agent",
684
+ "slash.ctx": "顯示 Context 使用量",
685
+ "slash.cancel": "中斷 Agent 目前的動作(送出 Escape)",
686
+ "slash.dashboard": "取得儀表板網址(管理員)",
687
+ "slash.compact": "壓縮 Agent 的 Context",
688
+ "slash.steer": "插入指示到 Agent 當前任務",
689
+ "steer.usage": "用法:/steer <訊息> — 插入到進行中的回合",
690
+ "steer.sent": "🎯 已將指示插入 {0} 的當前任務(若 CLI 不接受忙碌輸入會自動改排隊)。",
691
+ "steer.not_connected": "❌ instance 未連線(IPC 不可用)",
692
+ "steer.unsupported": "⚠️ {0} Backend 尚未支援 /steer(其 TUI 無法在回合中接收輸入)。訊息未送出——請改用一般訊息,或先 /cancel。",
693
+ "slash.btw": "不中斷目前任務,詢問一個旁支問題",
694
+ "btw.usage": "用法:/btw <訊息> — 向 Claude Code 詢問旁支問題,不中斷目前任務",
695
+ "btw.sent": "💬 已將旁支問題送給 {0}。",
696
+ "btw.not_connected": "❌ instance 未連線(IPC 不可用)",
697
+ "btw.unsupported": "⚠️ {0} Backend 不支援 /btw(僅 Claude Code 支援)。訊息未送出。",
698
+ "login.usage": "用法:/login [backend] | /login code <文字> | /login cancel",
699
+ "login.choose_backend": "要重新登入哪個 Backend?",
700
+ "login.choose_provider": "選擇 Kiro 的登入方式:",
701
+ "login.unsupported": "⚠️ Backend「{0}」沒有遠端登入流程。OpenCode 憑證是 API key——請在可信任的終端用 `opencode auth` 管理。",
702
+ "login.busy": "⚠️ {0} 的登入流程已在進行中,請先 /login cancel。",
703
+ "login.started": "🔐 已啟動 {0} 登入。授權連結會發在這裡——請視同密碼保管。",
704
+ "login.auth_hint": "🔐 {0} 登入——打開此連結完成授權。任何人完成授權都會綁定「他自己的」帳號,切勿轉傳:",
705
+ "login.auth_code": "一次性代碼:{0}",
706
+ "login.need_input": "⌨️ {0} 登入正在詢問:「{1}」。請用 /login code <文字> 輸入。",
707
+ "login.success": "✅ {0} 登入完成。已喚醒:{1}。已重啟(重新載入憑證):{2}。",
708
+ "login.none": "無",
709
+ "login.failed": "❌ {0} 登入未完成:{1}",
710
+ "login.cancelled": "🛑 已取消 {0} 的登入流程。",
711
+ "login.no_session": "目前沒有進行中的登入流程。",
712
+ "login.input_sent": "⌨️ 已送入登入視窗。",
713
+ "login.input_failed": "❌ 無法貼入登入視窗。",
714
+ "login.starting_backend": "🔐 正在啟動 {0} 登入…",
715
+ "login.provider_selected": "▶️ 已選擇:{0}",
716
+ "login.still_valid": "⚠️ 目前 {0} 登入正常。確定要重新登入嗎?",
717
+ "login.relogin_go": "確定重新登入",
718
+ "login.relogin_cancel": "取消",
719
+ "login.chooser_posted": "🔐 已送出 Backend 選單。",
720
+ "login.confirm_posted": "⚠️ 登入仍有效——已送出確認按鈕。",
721
+ "install.usage": "用法:/install-cli <backend> | /install-cli cancel",
722
+ "classic.approve_done_group": "✅ 已開放存取 —— `{0}` 已加入允許清單。",
723
+ "classic.approve_done_group_already": "ℹ️ `{0}` 本來就在允許清單裡,沒有變更。",
724
+ "classic.approve_done_group_open": "ℹ️ `{0}` 目前已經被允許:清單是空的,代表「全部允許」。加進去反而會變成只允許它、把其他聊天室全部擋掉,所以沒有做任何變更。",
725
+ "classic.approve_done_admin": "✅ 已將 `{0}` 設為 ClassicBot 管理員。",
726
+ "classic.approve_done_admin_already": "ℹ️ `{0}` 本來就是 ClassicBot 管理員。",
727
+ "classic.approve_failed": "⚠️ 無法開放 `{0}` 的存取 —— 這個 fleet 沒有設定 ClassicBot。",
728
+ "classic.unrecoverable_ids": "⚠️ classicBot.yaml 裡有永遠無法比對成功的 ID:{0}\n\n它們沒有加引號、而且大到超出 YAML 精度,讀取時末幾位數字就已經遺失。請從 Discord 或 Telegram 重新複製正確 ID、**加引號**重新填入 —— 檔案裡現在顯示的數字本身就是錯的,不要從檔案複製。",
729
+ "classic.approve_group": "✅ 允許此群組",
730
+ "classic.approve_group_admin": "✅ 允許+設為管理員",
731
+ "classic.approve_ignore": "🚫 忽略",
732
+ "classic.approve_ignored": "🚫 已忽略 —— 沒有開放 {0} 的存取權。",
733
+ "classic.approve_applying": "✅ 正在開放 {0}…",
734
+ "classic.approve_applying_admin": "✅ 正在開放 {0} 並將 {1} 設為管理員…",
735
+ "install.choose_backend": "要安裝哪個 Backend?",
736
+ "install.chooser_posted": "📦 已送出 Backend 選單。",
737
+ "install.starting_backend": "📦 正在啟動 {0} 安裝…",
738
+ "install.unsupported": "⚠️ Backend「{0}」沒有已知的安裝方式。",
739
+ "install.already": "✅ {0} 已安裝(找到 `{1}`)。可用 /login {0} 登入。",
740
+ "install.busy": "⚠️ 另一個安裝/登入視窗進行中,請先取消它。",
741
+ "install.started": "📦 正在安裝 {0}…完成後會回報(可在 View 頁面看進度)。",
742
+ "install.failed": "❌ {0} 安裝未完成:{1}",
743
+ "install.verify_failed": "⚠️ {0} 安裝程序結束,但 PATH 上仍找不到 `{1}`。請查看 View 頁面或改用 SSH 安裝。",
744
+ "install.success_no_login": "✅ {0} 已安裝。",
745
+ "install.login_prompt": "✅ {0} 已安裝。要現在登入嗎?",
746
+ "install.login_now": "登入",
747
+ "install.later": "稍後",
748
+ "install.later_ack": "👌 {0} 已安裝——之後可用 /login {0} 登入。",
749
+ "install.cancelled": "🛑 已取消 {0} 的安裝流程。",
750
+ "install.no_session": "目前沒有進行中的安裝流程。",
751
+ "slash.clear": "清空 Agent 的 Context",
752
+ "slash.save": "儲存 Agent 對話",
753
+ "slash.load": "載入已儲存的對話",
754
+ "slash.collab": "切換 bot/webhook 協作模式",
755
+ "slash.status": "顯示 Fleet 狀態與花費",
756
+ "slash.sysinfo": "系統診斷",
757
+ "slash.restart": "優雅重啟所有 Agent",
758
+ "slash.update": "更新 AgEnD 到最新版",
759
+ "slash.doctor": "執行健康診斷",
760
+ "slash.login": "遠端重新登入 CLI Backend(Beta)",
761
+ "slash.install_cli": "遠端安裝 CLI Backend(Beta)",
762
+ "slash.option.login_backend": "要登入的 Backend",
763
+ "slash.option.login_code": "登入提示要求輸入的文字",
764
+ "slash.option.login_cancel": "取消進行中的登入流程",
765
+ "slash.option.install_backend": "要安裝的 Backend CLI",
766
+ "slash.option.install_cancel": "取消進行中的安裝流程",
767
+ "slash.usage": "AI 訂閱用量",
768
+ "slash.tips": "顯示一則 AgEnD 使用提示",
769
+ "slash.effort": "設定推理強度(管理員)",
770
+ "slash.model": "切換模型(管理員)",
771
+ "slash.pause": "暫停閒置中的 Agent",
772
+ "slash.wake": "喚醒已暫停的 Agent",
773
+ "slash.option.backend": "要啟動的 Backend",
774
+ "slash.option.instance": "instance 名稱(在 General 中為必填)",
775
+ "slash.option.message": "訊息內容",
776
+ "slash.option.tips_mode": "選填的每日提示設定",
777
+ "slash.option.steer_message": "要在任務中途傳給 Agent 的內容",
778
+ "slash.option.btw_message": "給 Claude Code 的旁支問題",
779
+ "slash.option.effort_level": "low | medium | high | xhigh | max",
780
+ "slash.option.save_filename": "要儲存的檔名",
781
+ "slash.option.save_force": "檔案存在時覆寫",
782
+ "slash.option.load_filename": "要載入的檔名",
783
+ "chat.usage": "用法:`/chat <訊息>`",
784
+ "filename.invalid": "⛔ 檔名無效 — 只允許字母、數字、點、連字號、底線。",
785
+ "dashboard.disabled": "⛔ /dashboard 已停用 — 未設定 allowed_users",
786
+ "update.disabled": "⛔ /update 已停用 — 未設定 allowed_users",
787
+ "doctor.running": "🩺 執行診斷中...",
788
+ "doctor.no_output": "診斷沒有輸出。",
789
+ "doctor.failed": "診斷失敗。",
790
+ "doctor.cli_missing": "無法執行 Backend 診斷 — PATH 中找不到 agend CLI。",
791
+ "doctor.section.prerequisites": "必要條件",
792
+ "doctor.section.service": "系統服務",
793
+ "doctor.section.fleet": "Fleet",
794
+ "doctor.section.gateways": "通訊 Gateway",
795
+ "doctor.section.ipc": "MCP IPC",
796
+ "doctor.config_invalid": "無效:{0}",
797
+ "doctor.backend_label": "Backend {0}",
798
+ "doctor.backend_unknown": "未知 Backend",
799
+ "doctor.binary_available": "可使用 {0}",
800
+ "doctor.binary_missing": "找不到 {0}",
801
+ "doctor.not_found": "找不到",
802
+ "doctor.term_unset": "未設定 — TUI 顯示可能失敗",
803
+ "doctor.network_family": "網路位址族群",
804
+ "doctor.network_family_auto": "已啟用 Happy Eyeballs;每次連線嘗試逾時 {0} 毫秒",
805
+ "doctor.network_family_short": "已啟用 Happy Eyeballs;每次連線嘗試逾時 {0} 毫秒,低於 AgEnD 建議的 {1} 毫秒",
806
+ "doctor.network_family_disabled": "已停用 Happy Eyeballs;每次連線嘗試逾時 {0} 毫秒",
807
+ "doctor.service_none": "找不到 AgEnD 系統服務 — 請執行:agend install",
808
+ "doctor.manager_user_unavailable": "未知 — 無法連線 systemd --user(常見於沒有 user D-Bus session 的 SSH 環境)",
809
+ "doctor.manager_unavailable": "未知(無法連線服務管理器)",
810
+ "doctor.service_installed": "已安裝",
811
+ "doctor.service_enabled": "已啟用",
812
+ "doctor.service_active": "執行狀態",
813
+ "doctor.yes": "是",
814
+ "doctor.no_install": "否 — 請執行:agend install",
815
+ "doctor.service_running": "執行中",
816
+ "doctor.inactive_start": "未執行 — 請執行:agend start",
817
+ "doctor.dbus_set": "已設定 DBUS_SESSION_BUS_ADDRESS",
818
+ "doctor.dbus_unset": "未設定 DBUS_SESSION_BUS_ADDRESS — systemd --user 可能無法運作",
819
+ "doctor.fleet_process": "Fleet process",
820
+ "doctor.pid_missing": "找不到 fleet.pid — Fleet 未在執行",
821
+ "doctor.pid_invalid": "fleet.pid 無效",
822
+ "doctor.pid_stale": "PID {0} 已不存在(fleet.pid 已過期)",
823
+ "doctor.pid_alive": "PID {0} 正在執行",
824
+ "doctor.tmux_session": "tmux session",
825
+ "doctor.session_exists": "{0} 存在",
826
+ "doctor.session_missing": "找不到 {0}",
827
+ "doctor.instances": "instances",
828
+ "doctor.config_missing": "在 {0} 找不到 fleet.yaml",
829
+ "doctor.instance_counts": "執行中 {0}、已暫停 {1}、已停止 {2}、已崩潰 {3}(共 {4})",
830
+ "doctor.ipc_ok": "{0}/{1} 個執行中 instance socket 可連線",
831
+ "doctor.ipc_failed": "{0}/{1} 可連線;失敗:{2}",
832
+ "doctor.gateway_health": "Discord Gateway 健康狀態",
833
+ "doctor.gateway_unknown": "Fleet 未執行,無法判斷 Gateway 健康狀態",
834
+ "doctor.gateway_no_details": "Fleet 健康端點未提供各 adapter 的 Gateway 詳情",
835
+ "doctor.gateway_unreachable": "無法讀取 Fleet 健康狀態:{0}",
836
+ "doctor.gateway_detail": "{0};已重連 {1} 次;心跳 ACK 距今 {2}",
837
+ "doctor.title": "AgEnD 診斷",
838
+ "doctor.complete": "診斷完成({0} 個警告)",
839
+ "doctor.errors": "診斷發現 {0} 個錯誤({1} 個警告)",
840
+ "install.description": "安裝並啟動 AgEnD 系統服務",
841
+ "install.path": "系統服務已安裝於:{0}",
842
+ "install.running": "✅ Fleet 系統服務已安裝並啟動。",
843
+ "install.start_failed": "❌ Fleet 系統服務已安裝,但無法啟動:{0}",
844
+ "install.updated": "系統服務檔案已更新(未啟用)。",
845
+ "uninstall.description": "移除 AgEnD 系統服務",
846
+ "uninstall.force_help": "略過確認(供 CI/自動化使用)",
847
+ "uninstall.none": "找不到 AgEnD 系統服務。",
848
+ "uninstall.found": "找到 AgEnD 系統服務:",
849
+ "uninstall.manager": "管理器:{0}",
850
+ "uninstall.path": "路徑:{0}",
851
+ "uninstall.enabled": "已啟用:{0}",
852
+ "uninstall.active": "執行狀態:{0}",
853
+ "uninstall.unknown": "未知",
854
+ "uninstall.yes": "是",
855
+ "uninstall.no": "否",
856
+ "uninstall.running": "執行中",
857
+ "uninstall.inactive": "未執行",
858
+ "uninstall.non_interactive": "目前不是互動式終端;請加上 --force 後重試。",
859
+ "uninstall.confirm": "確定移除系統服務嗎?[Y/n] ",
860
+ "uninstall.cancelled_force": "已取消移除。非互動式環境請加上 --force 後重試。",
861
+ "uninstall.cancelled": "已取消移除系統服務。",
862
+ "uninstall.removed": "系統服務已停用、停止並移除。",
863
+ "uninstall.failed": "移除系統服務失敗:{0}",
864
+ "usage.failed": "⚠️ 取得用量失敗:{0}",
865
+ "usage.title": "AI 訂閱用量",
866
+ "usage.title_plain": "AI 訂閱用量",
867
+ "usage.empty_active": "沒有使用中且支援用量追蹤的 Backend",
868
+ "usage.not_logged_in": "未登入",
869
+ "usage.error_fallback": "錯誤",
870
+ "usage.no_data": "無資料",
871
+ "usage.reset.in": "{0} 後重置",
872
+ "usage.reset.soon": "即將重置",
873
+ "usage.duration.days_hours": "{0}d{1}h",
874
+ "usage.duration.hours_minutes": "{0}h{1}m",
875
+ "usage.duration.minutes": "{0}m",
876
+ "usage.metric.session": "Session",
877
+ "usage.metric.weekly": "每週",
878
+ "usage.metric.monthly": "每月",
879
+ "usage.metric.days_window": "{0} 天視窗",
880
+ "usage.metric.named": "{0}",
881
+ "usage.metric.named_session": "{0}(Session)",
882
+ "usage.metric.named_weekly": "{0}(週)",
883
+ "usage.metric.named_monthly": "{0}(每月)",
884
+ "usage.metric.named_days": "{0}({1} 天)",
885
+ "usage.metric.extra_usage": "額外用量",
886
+ "usage.metric.rate_limit_resets": "額度重置券",
887
+ "usage.metric.credits": "額度",
888
+ "usage.metric.weekly_limit": "每週上限",
889
+ "usage.metric.pay_as_you_go": "隨用隨付",
890
+ "usage.metric.bonus_credits": "贈送額度",
891
+ "usage.metric.overage_charges": "超額費用",
892
+ "usage.metric.pay_per_use": "隨用隨付",
893
+ "usage.metric.usage_monthly": "用量(每月)",
894
+ "usage.unit.available": "可用",
895
+ "usage.unit.credits": "額度",
896
+ "usage.value.disabled": "已停用",
897
+ "usage.value.cap": "上限 {0}",
898
+ "usage.note.binding": "生效",
899
+ "usage.note.binding_severity": "生效 · {0}",
900
+ "usage.note.busiest_model": "{0} 個模型中用量最高者",
901
+ "usage.note.busiest_models": "{0} 個模型中用量最高者",
902
+ "usage.note.used_limit_unit": "{0} / {1} {2}",
903
+ "usage.note.bonus_codes": "{0} / {1} {2} · {3} 組代碼",
904
+ "usage.metric.agy_claude_others": "Claude 與其他模型",
905
+ "usage.metric.agy_claude_others_session": "Claude 與其他模型(Session)",
906
+ "usage.metric.agy_claude_others_weekly": "Claude 與其他模型(每週)",
907
+ "usage.hint.statusline_now": "來自 {0} 的 statusline(剛剛);未呼叫 API,方案與各模型上限需要 CLI 登入資料",
908
+ "usage.hint.statusline_minutes": "來自 {0} 的 statusline({1} 分鐘前);未呼叫 API,方案與各模型上限需要 CLI 登入資料",
909
+ "usage.hint.claude_api_key": "API key 登入沒有訂閱用量資料。請使用 `claude /login`,或設定 CLAUDE_CODE_OAUTH_TOKEN(由 `claude setup-token` 取得)。",
910
+ "usage.hint.login_claude": "請使用 Claude Code CLI(`claude`)登入。",
911
+ "usage.hint.login_agy": "請使用 Antigravity CLI(`agy`)登入。",
912
+ "usage.hint.no_quota": "此帳號未回報額度資訊。",
913
+ "usage.hint.login_codex": "請使用 Codex CLI(`codex`)登入。",
914
+ "usage.hint.codex_no_oauth": "auth.json 沒有 OAuth 登入資料;只有 API key 時無法讀取用量。",
915
+ "usage.hint.login_grok": "請使用 Grok CLI(`grok login`)登入。",
916
+ "usage.hint.grok_no_login": "auth.json 沒有可用的登入資料。請執行 `grok login`。",
917
+ "usage.hint.login_kiro": "請使用 Kiro CLI(`kiro-cli`)登入。",
918
+ "usage.hint.kiro_signed_out": "目前已登出;請執行 `kiro-cli` 登入。",
919
+ "usage.hint.token_refreshing": "Token 更新中 — 請稍候再試。",
920
+ "usage.hint.subscription_no_credit": "訂閱方案沒有可回報的額度用量。",
921
+ "usage.hint.no_quota_account": "此帳號類型沒有可用的額度資訊。",
922
+ "usage.error.unreachable": "無法連線至 {0}。",
923
+ "usage.error.token_rejected": "Token 已被拒絕。請執行一次 `{0}` 以更新登入。",
924
+ "usage.error.rate_limited": "{0} 暫時限制請求速率,請稍後再試。",
925
+ "usage.error.http": "用量請求失敗(HTTP {0})。",
926
+ "usage.error.billing_http": "計費請求失敗(HTTP {0})。",
927
+ "usage.error.invalid_response": "用量端點回傳了無效資料。",
928
+ "usage.error.invalid_billing_response": "計費端點回傳了無效資料。",
929
+ "usage.error.invalid_kiro_response": "GetUsageLimits 回傳了無效資料。",
930
+ "usage.error.claude_token_expired": "Access token 已過期;下次啟動任一 Claude instance 時會重新整理。",
931
+ "usage.error.codex_token_expired": "Access token 已過期。請執行一次 `codex` 以重新整理。",
932
+ "usage.error.grok_expired": "Grok session 已過期。請再次執行 `grok login`。",
933
+ "usage.error.grok_response_changed": "Grok 計費回應格式已變更。",
934
+ "usage.error.agy_cap": "個人上限已用完,CLI 正受到速率限制(約 {0} 後重置)。各模型的額度池是另一組計數,因此仍可能顯示 0% 已使用。",
935
+ "usage.error.agy_no_refresh": "Access token 已過期,且未儲存 refresh token。請執行一次 `agy`。",
936
+ "usage.error.agy_token_expired": "Access token 已過期。請執行一次 `agy` 重新整理,或設定 AGY_OAUTH_CLIENT_ID/SECRET 以自動更新。",
937
+ "usage.error.agy_login_expired": "Google 登入已過期。請執行一次 `agy` 重新登入。",
938
+ "usage.error.agy_refresh_empty": "Google token 更新回應沒有 access token。",
939
+ "usage.error.grok_auth_readonly": "Token 已過期且 auth.json 為唯讀。請執行一次 `grok` 重新整理。",
940
+ "usage.error.grok_no_refresh": "Token 已過期且找不到 refresh token。請執行 `grok login`。",
941
+ "usage.error.grok_refresh_unreachable": "無法連線至 auth.x.ai 以更新 token。",
942
+ "usage.error.grok_invalid_refresh": "auth.x.ai 回傳了無效的 token 更新資料。",
943
+ "usage.error.grok_persist": "Token 已更新但無法寫入 auth.json。請改為執行一次 `grok`。",
944
+ "general.pause_forbidden": "General 不能被暫停。",
945
+ "compact.sent": "🗜️ 已送出壓縮指令(`{0}`)。",
946
+ "compact.not_connected": "❌ instance 未連線(IPC 不可用)",
947
+ "save.unsupported": "⚠️ 此 Backend 不支援 /save(僅 Kiro CLI 與 Claude Code 支援)。",
948
+ "save.not_connected": "❌ instance 未連線(IPC 不可用)",
949
+ "clear.unsupported": "⚠️ 此 Backend 不支援清空對話。",
950
+ "model.usage": "用法:/model <名稱> — 例如 /model sonnet",
951
+ "model.list_unavailable": "無法取得 {0} 的模型清單。可直接用 `/model <名稱>` 設定。",
952
+ "model.menu": "目前模型:{0}\n請選擇新模型:",
953
+ "model.more": "📋 更多模型…",
954
+ "model.more_unavailable": "⚠️ 無法取得帳號模型清單(缺 OAuth token 或 API 無法連線)。上方 alias 仍可使用,/model <名稱> 也可直接指定。",
955
+ "model.selection_expired": "⏰ 模型選擇已逾時。",
956
+ "model.switching": "⏳ 正在將 {0} 切換到 `{1}`…",
957
+ "model.switch_failed": "切換至模型 `{0}` 失敗:{1}",
958
+ "model.pattern_warning": "⚠️ \"{0}\" 不符合 {1} 常見的模型名稱格式 — 仍會原樣傳給 CLI。\n",
959
+ "model.persist_failed": "❌ 無法設定 {0} 的模型。",
960
+ "model.runtime_success": "✅ 已即時將 {0} 切換到 `{1}`。",
961
+ "model.restart_success": "✅ 已將 {0} 設為 `{1}` 並重啟。",
962
+ "effort.unsupported": "❌ {0} 沒有推理強度設定。",
963
+ "effort.usage": "用法:/effort <{0}>",
964
+ "effort.menu": "{0}\n請選擇新的推理強度:",
965
+ "effort.selection_expired": "⏰ 推理強度選擇已逾時。",
966
+ "effort.setting": "⏳ 正在將 {0} 的推理強度設為 `{1}`…",
967
+ "effort.switch_failed": "切換至推理強度 `{0}` 失敗:{1}",
968
+ "effort.unknown": "❌ 未知的推理強度 `{0}`。可用值:{1}。",
969
+ "effort.no_canonical": "❌ {0} 不接受任何標準推理強度。",
970
+ "effort.clamped": "⚠️ 已調整為 `{0}`({2} 不支援 `{1}`)。\n",
971
+ "effort.not_running": "❌ {0} 未在執行。",
972
+ "effort.runtime_success": "✅ 已即時將 {0} 的推理強度設為 `{1}`。",
973
+ "effort.restart_success": "✅ 已將 {0} 的推理強度設為 `{1}` 並重啟。",
974
+ "effort.current_default": "目前推理強度:(CLI 預設)",
975
+ "effort.current_fleet": "目前推理強度:{0}(Fleet 預設)",
976
+ "effort.current": "目前推理強度:{0}",
977
+ "status.no_config": "尚未載入 Fleet 設定。",
978
+ "status.no_instances": "尚未設定任何 instance。",
979
+ "status.title": "Fleet 狀態",
980
+ "status.table_header": "| instance | Backend | Context | 推理強度 | 花費 | 狀態 | 執行狀態 | IPC |",
981
+ "status.paused_count": "已暫停 Agent:{0}",
982
+ "status.daily_cost": "Fleet:{0} / {1}(每日)",
983
+ "status.adapters": "Adapters:",
984
+ "state.idle": "閒置",
985
+ "state.working": "工作中",
986
+ "state.stuck": "可能卡住",
987
+ "state.paused": "已暫停",
988
+ "sysinfo.title": "系統資訊",
989
+ "sysinfo.metric": "項目",
990
+ "sysinfo.value": "數值",
991
+ "sysinfo.uptime": "運行時間",
992
+ "sysinfo.memory": "記憶體",
993
+ "sysinfo.heap": "Heap",
994
+ "sysinfo.resources": "資源",
995
+ "sysinfo.docs": "文件",
996
+ "sysinfo.tips": "Tips",
997
+ "sysinfo.github": "GitHub",
998
+ "sysinfo.instances": "Instances",
999
+ "sysinfo.running": "執行中",
1000
+ "sysinfo.paused": "已暫停",
1001
+ "sysinfo.fleet_mem": "Fleet 記憶體",
1002
+ "sysinfo.system_mem": "系統記憶體",
1003
+ "topic.unbound": "此 topic/thread/channel 尚未綁定 instance。請 General 使用 create_instance 建立。",
1004
+ "rate_limit.five_hour": "⚠️ {0} 的 5 小時用量已達 {1}%。回覆可能變慢。",
1005
+ "rate_limit.weekly": "⚠️ {0} 的每週用量已達 {1}%。回覆可能變慢或失敗。",
1006
+ "failover.triggered": "⚡ Rate limit {0}% — 下次輪替將使用 {1}(原為 {2})。",
1007
+ "failover.recovered": "✅ Rate limit 已恢復({0}%)— 下次輪替將使用 {1}。",
1008
+ "adapter.start_failed": "⚠️ Adapter「{0}」啟動失敗:{1}\n將在背景重試;其他 adapters 不受影響。",
1009
+ "adapter.reconnected": "✅ Adapter「{0}」已在 {1} 次嘗試後重新連線。",
1010
+ "storm.opened": "⚠️ tmux server 已崩潰 — {0} 個 instance 受影響。訊息暫時保留,等待 {1} 後自動重試恢復。",
1011
+ "storm.extended": "⚠️ tmux server 再次崩潰(本次風暴第 {0} 次)。自動恢復退避已延長為 {1};排隊訊息會繼續保留。",
1012
+ "storm.recovered": "✅ tmux 恢復完成:{0}/{1} 個 instance 已恢復。尚未恢復:{2}。",
1013
+ "storm.timed_out": "⚠️ tmux 恢復逾時:{0}/{1} 個 instance 已恢復。尚未恢復:{2}。",
1014
+ "storm.none": "無",
1015
+ "general.antigravity_unsupported": "⚠️ Antigravity 無法接收 MCP instructions,因此不支援 General instance。請改用 Claude Code 或 Kiro CLI。",
1016
+ "classic.manager_unavailable": "Classic channel manager 尚未初始化。",
1017
+ "fleet.reload_failed": "⚠️ 重新載入 fleet.yaml 失敗 — {0}\n目前仍使用先前的設定。",
1018
+ "fleet.reload_rejected": "⚠️ 已拒絕重新載入 fleet.yaml — {0}\n目前仍使用先前的設定。",
1019
+ "fleet.reload_validation": "驗證失敗:\n{0}",
1020
+ "fleet.reload_removed_all": "這會移除所有 instance({0} → 0)",
1021
+ "fleet.reload_removed_half": "這會移除超過一半的 instance({0} → {1})",
1022
+ "fleet.error_suppressed": "(過去 {1} 分鐘內另有 {0} 次)",
1023
+ "dashboard.port_in_use": "⚠️ 儀表板無法使用 — health port {0} 已被占用。請停止衝突的 process,或設定其他 health_port。",
1024
+ "dashboard.server_failed": "⚠️ 儀表板無法使用 — health server 失敗:{0}",
1025
+ "save.usage": "用法:/save <檔名>",
1026
+ "save.sent": "✅ 已送出 `{0}` 給 {1}",
1027
+ "classic.not_allowed_user": "⛔ 你不在允許使用者清單中。",
1028
+ "classic.access_requested": "⏳ 已送出存取請求,等待管理員核准。",
1029
+ "classic.admin_only_start": "⛔ 只有管理員能啟動 Agent。請找管理員 /start。",
1030
+ "classic.admin_only_stop": "⛔ 只有管理員能停止 Agent。",
1031
+ "cmd.admin_required": "⛔ {0} 需要管理員權限。",
1032
+ "collab.on": "🤝 協作模式開啟 — bot/webhook 訊息會傳到 Agent。",
1033
+ "collab.off": "💬 協作模式關閉",
1034
+ "collab.on.classic": "🤝 協作模式開啟 — @mention 此 bot 觸發 Agent,其他 bot 訊息可見。",
1035
+ "collab.off.classic": "💬 協作模式關閉 — 用 /chat 對話。",
1036
+ };
15
1037
  const messages = {
16
- en: {
17
- "cancel.button": "🛑 Cancel",
18
- "cancel.sent": "🛑 Sent cancel to {0}.",
19
- "cancel.not_running": "❌ {0} not running.",
20
- "cancel.button_stale": "⚠️ This button has expired — {0} is not running. Each turn posts a fresh one.",
21
- "clear.confirm_message": "⚠️ Clear {0}'s conversation history? This cannot be undone.",
22
- "clear.confirm": "✅ Confirm clear",
23
- "clear.cancel": "❌ Cancel",
24
- "clear.confirm_posted": "A confirmation prompt was posted in this channel.",
25
- "clear.clearing": "🧹 Clearing {0}'s conversation history...",
26
- "clear.sent": "🧹 Clear command sent (`{0}`).",
27
- "clear.cancelled": "❌ Clear cancelled for {0}.",
28
- "clear.expired": "⌛ Clear confirmation for {0} expired.",
29
- "clear.not_connected": "❌ Instance not connected (IPC unavailable)",
30
- "clear.prompt_unavailable": "❌ Could not post the clear confirmation. Try again.",
31
- "clear.failed": "❌ Failed to clear {0}: {1}",
32
- "ctx.used": "📊 Context: {0}% used",
33
- "ctx.backend": "Backend: {0}",
34
- "ctx.model": "Model: {0}",
35
- "ctx.instance": "Instance: {0}",
36
- "ctx.unavailable": "Context info not available yet.",
37
- "classic.already_active": "This channel already has an active agent. Use /chat to talk.",
38
- "classic.topic_bound": "This channel is already bound to a topic-mode instance.",
39
- "classic.not_authorized_guild": "⛔ This server is not in the allowed guilds list.",
40
- "classic.no_agent": "No active agent in this channel.",
41
- "classic.no_agent_start": "No active agent in this channel. Use /start first.",
42
- "classic.started": "✅ Agent started in this channel. Use `/chat <message>` or @mention to talk.",
43
- "classic.choose_backend": "Choose a backend for this agent:",
44
- "classic.backend_required": "Choose a backend in the `/start` command and try again. If no backend field is shown, refresh Discord and reopen the command.",
45
- "classic.selection_expired": "⏰ Backend selection expired. Run /start again to choose.",
46
- "classic.backend_not_installed": "⚠️ {0} CLI (`{1}`) was not found in PATH.\nInstall: `{2}`\nStarting anyway…",
47
- "classic.stopped": "🛑 Agent stopped in this channel.",
48
- "classic.no_agent_here": "No active agent in this channel.",
49
- "admin.only": "⛔ Only admins can do this.",
50
- "admin.required": "⛔ This command requires admin access.",
51
- "permission.denied": "⛔ Permission denied.",
52
- "pause.usage": "Usage: `/pause <instance-name>`",
53
- "wake.usage": "Usage: `/wake <instance-name>`",
54
- "pause.success": "⏸ {0} paused.",
55
- "wake.success": "▶️ {0} awake.",
56
- "pause.not_idle": "⚠️ {0} is busy and was not paused. Wait until it is idle.",
57
- "pause.failed": "❌ Failed to pause {0}: {1}",
58
- "wake.failed": "❌ Failed to wake {0}: {1}",
59
- "instance.not_found": "❌ Instance not found: {0}",
60
- "not_authorized": "⛔ Not authorized",
61
- "usage.chat": "Usage: `/chat <message>`",
62
- "dashboard.title": "📊 AgEnD Dashboard",
63
- "dashboard.starting": "⏳ Dashboard starting, retry shortly.",
64
- "update.available": "🆕 AgEnD {0} available! Run: agend update",
65
- "update.highlights": "Highlights: {0}",
66
- "fleet.ready": "Fleet ready. {0}/{1} instances running. v{2}",
67
- "fleet.ready_with_failed": "Fleet ready. {0}/{1} instances running. v{2} | Failed: {3}",
68
- "cost.approaching": "⚠️ {0} cost: {1} / {2} ({3}%)",
69
- "cost.limit_reached": "🛑 {0} daily limit {1} reached — pausing instance.",
70
- "general.start_failed": "⚠️ General instance \"{0}\" failed to start:\n{1}",
71
- "alert.unauth_user_private": "🆕 Unauthorized user tried /start in private chat:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n\nTo allow: add `{1}` to classicBot.yaml `allowed_users`",
72
- "alert.start_not_admin": "🔑 User wants to /start but is not admin:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n• Group: {3}\n\nTo approve: add `{1}` to classicBot.yaml `admin_users`",
73
- "alert.stop_not_admin": "🔑 User wants to /stop but is not admin:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n• Group: {3}\n\nTo approve: add `{1}` to classicBot.yaml `admin_users`",
74
- "alert.unauth_guild": "🆕 Unauthorized guild tried /start:\n• Guild ID: {0}\n• User: {1}\n• Platform: discord\n\nTo allow: add `{0}` to classicBot.yaml `allowed_guilds`",
75
- "alert.bot_added": "🆕 Bot added to new server:\n• Name: {0}\n• ID: {1}\n• Platform: {2}\n\nTo allow: add `{1}` to classicBot.yaml `allowed_guilds`",
76
- "alert.new_group": "🆕 New group detected:\n• Name: {0}\n• ID: {1}\n• User: {2} ({3})\n• Platform: {4}\n\nTo allow: add `{1}` to classicBot.yaml `allowed_guilds`",
77
- "schedule.deferred": "⏳ Schedule \"{0}\" deferred — rate limit at {1}%",
78
- "restart.full_initiated": "🔄 Full restart initiated — waiting for all instances to idle, then reloading process...",
79
- "restart.graceful_initiated": "🔄 Graceful restart initiated — waiting for all instances to idle...",
80
- "inst.crashed_respawned": "⚠️ {0} crashed and respawned.",
81
- "inst.crashed_respawned_log": "⚠️ {0} crashed and respawned. Check ~/.agend/daemon.log for details.",
82
- "inst.restarted_no_context": "⚠️ {0}: restarted without context (snapshot injection failed)",
83
- "inst.respawn_paused": "⚠️ {0} crashed 3+ times shortly after launch — paused for recovery. Check logs or run `/wake` to restart.",
84
- "inst.recovered": "✅ {0}: recovered after {1}",
85
- "inst.root_skip_perms": "⚠️ claude-code cannot run with --dangerously-skip-permissions as root. Set IS_SANDBOX=1 or use a non-root user.",
86
- "inst.notification": "{0} {1}: {2} (action: {3})",
87
- "interactive.kind.sudo_password": "sudo password",
88
- "interactive.kind.password": "password",
89
- "interactive.kind.confirmation": "Y/N confirmation",
90
- "interactive.kind.press_enter": "Press Enter",
91
- "interactive.general_notice": "⚠️ {0} is waiting for interactive input ({1}). Ask General to assist?",
92
- "interactive.instance_notice": "⚠️ {0} is waiting for interactive input. Go to the General channel to confirm how to proceed.",
93
- "interactive.confirm": "Confirm",
94
- "interactive.cancel": "Cancel",
95
- "interactive.confirmed": "✅ General assistance requested for {0}.",
96
- "interactive.ignored": "🚫 Interactive prompt for {0} ignored.",
97
- "interactive.expired": "⌛ Interactive prompt assistance for {0} expired.",
98
- "interactive.self_assist": "⚠️ {0} is General itself and cannot self-assist while blocked. Use tmux attach.",
99
- "interactive.delivery_failed": "❌ Could not deliver the assistance request for {0} to General.",
100
- "interactive.assist_request": "[system] Interactive input assistance was confirmed for {0} (prompt type: {1}). Inspect that instance's tmux pane, report what operation is waiting, and ask the user for explicit authorization before sending any input. Never ask for or accept a password in chat; passwords must be entered directly in tmux by the operator.",
101
- "exit.instance_notice": "🛑 {0} stopped normally (exit code 0). An administrator can restart it from General.",
102
- "exit.general_notice": "🛑 {0} stopped (normal exit). Restart it?",
103
- "exit.restart": "Restart",
104
- "exit.ignore": "Ignore",
105
- "exit.restarting": "🔄 Restarting {0}...",
106
- "exit.restarted": "✅ {0} restarted.",
107
- "exit.ignored": "🚫 Restart for {0} ignored.",
108
- "exit.expired": "⌛ Restart prompt for {0} expired.",
109
- "exit.restart_failed": "❌ Failed to restart {0}: {1}",
110
- "hang.detected": "⚠️ {0} may be stuck — pane unchanged for {1}min, ready prompt not recognized",
111
- "hang.restart": "🔄 Force restart",
112
- "hang.wait": "⏳ Keep waiting",
113
- "hang.waiting": "⏳ Continuing to wait for {0}.",
114
- "hang.restarting": "🔄 Restarting {0}...",
115
- "hang.restarted": "✅ {0} restarted.",
116
- "hang.restart_failed": "❌ Failed to restart {0}: {1}",
117
- "hang.expired": "⌛ Hang prompt for {0} expired — use /restart if it is still stuck.",
118
- "buttons.stale": "⌛ This prompt has expired and can no longer be acted on.",
119
- "restart.graceful": "🔄 Graceful restart — waiting for instances to idle...",
120
- "update.running": "📦 Updating AgEnD... Fleet will restart automatically.",
121
- "update.progress.preparing": "📦 Updating AgEnD... ({0}s)",
122
- "update.progress.downloading": "⬇️ Downloading and installing... ({0}s)",
123
- "update.progress.installed": "✅ Installation complete — v{0} ({1}s)",
124
- "update.progress.stopping": "🔄 Stopping fleet... ({0}s)",
125
- "update.progress.starting": "🚀 Starting fleet... ({0}s)",
126
- "update.progress.instances": "⏳ Starting... {0}/{1} instances ({2}s)",
127
- "update.progress.complete": "✅ Fleet restarted — v{0}, {1}/{2} instances running ({3}s)",
128
- "update.progress.already_current": "✅ Already up to date — v{0} ({1}s)",
129
- "update.progress.failed": "❌ Update failed during {0}: {1} ({2}s)",
130
- "update.stage.preparing": "preparation",
131
- "update.stage.downloading": "download/install",
132
- "update.stage.installed": "installation verification",
133
- "update.stage.stopping": "fleet stop",
134
- "update.stage.starting": "fleet startup",
135
- "update.stage.complete": "completion",
136
- "update.stage.failed": "update",
137
- "slash.start": "Start an agent in this channel",
138
- "slash.stop": "Stop the agent in this channel",
139
- "slash.chat": "Send a message to the agent",
140
- "slash.ctx": "Show context usage",
141
- "slash.cancel": "Interrupt the agent's current operation (sends Escape)",
142
- "slash.dashboard": "Get dashboard URLs (admin only)",
143
- "slash.compact": "Compact agent context window",
144
- "slash.clear": "Clear agent conversation context",
145
- "slash.save": "Save the agent's conversation",
146
- "slash.load": "Load a saved conversation",
147
- "slash.collab": "Toggle bot/webhook collaboration mode",
148
- "slash.status": "Fleet status, per-instance costs and health (admin only)",
149
- "slash.sysinfo": "System diagnostics",
150
- "slash.restart": "Graceful restart all instances",
151
- "slash.update": "Update AgEnD to latest version",
152
- "slash.doctor": "Run health diagnostics",
153
- "slash.usage": "AI subscription usage",
154
- "slash.effort": "Set reasoning effort (admin only)",
155
- "chat.usage": "Usage: `/chat <message>`",
156
- "filename.invalid": "⛔ Invalid filename — only letters, numbers, dots, hyphens, underscores allowed.",
157
- "dashboard.disabled": "⛔ /dashboard disabled — no allowed_users configured",
158
- "update.disabled": "⛔ /update disabled — no allowed_users configured",
159
- "doctor.running": "🩺 Running diagnostics...",
160
- "save.usage": "Usage: /save <filename>",
161
- "save.sent": "✅ Sent `{0}` to {1}",
162
- "classic.not_allowed_user": "⛔ You are not in the allowed users list.",
163
- "classic.access_requested": "⏳ Access requested. Waiting for admin approval.",
164
- "classic.admin_only_start": "⛔ Only admins can start agents. Ask an admin to /start.",
165
- "classic.admin_only_stop": "⛔ Only admins can stop agents.",
166
- "cmd.admin_required": "⛔ {0} requires admin access.",
167
- "collab.on": "🤝 Collaboration mode ON — bot/webhook messages reach the agent.",
168
- "collab.off": "💬 Collaboration mode OFF",
169
- "collab.on.classic": "🤝 Collaboration mode ON — @mention this bot to trigger the agent. Other bot messages are visible.",
170
- "collab.off.classic": "💬 Collaboration mode OFF — use /chat to talk to the agent.",
171
- },
172
- "zh-TW": {
173
- "cancel.button": "🛑 取消",
174
- "cancel.sent": "🛑 已送出取消給 {0}。",
175
- "cancel.not_running": "❌ {0} 未在執行。",
176
- "cancel.button_stale": "⚠️ 這顆按鈕已失效 — {0} 沒有在執行。每一輪都會有新的按鈕。",
177
- "clear.confirm_message": "⚠️ 確定要清空 {0} 的對話記錄嗎?此操作不可逆。",
178
- "clear.confirm": "✅ 確認清空",
179
- "clear.cancel": "❌ 取消",
180
- "clear.confirm_posted": "已在此頻道送出確認按鈕。",
181
- "clear.clearing": "🧹 正在清空 {0} 的對話記錄...",
182
- "clear.sent": "🧹 已送出清空指令(`{0}`)。",
183
- "clear.cancelled": "❌ 已取消清空 {0}。",
184
- "clear.expired": "⌛ {0} 的清空確認已逾時。",
185
- "clear.not_connected": "❌ Instance 未連線(IPC unavailable)",
186
- "clear.prompt_unavailable": "❌ 無法送出清空確認,請再試一次。",
187
- "clear.failed": "❌ 清空 {0} 失敗:{1}",
188
- "ctx.used": "📊 Context:{0}% 已用",
189
- "ctx.backend": "後端:{0}",
190
- "ctx.model": "Model:{0}",
191
- "ctx.instance": "Agent:{0}",
192
- "ctx.unavailable": "Context 資訊尚未可用。",
193
- "classic.already_active": "此頻道已有活動中的 Agent。請用 /chat 對話。",
194
- "classic.topic_bound": "此頻道已綁定到 topic 模式的 instance。",
195
- "classic.not_authorized_guild": "⛔ 此伺服器不在允許清單中。",
196
- "classic.no_agent": "此頻道沒有活動中的 Agent。",
197
- "classic.no_agent_start": "此頻道沒有活動中的 Agent。請先用 /start。",
198
- "classic.started": "✅ Agent 已在此頻道啟動。用 `/chat <訊息>` 或 @mention 對話。",
199
- "classic.choose_backend": "請選擇此 Agent 的後端:",
200
- "classic.backend_required": "請在 `/start` 指令中選擇 backend 後重試。若沒有顯示 backend 欄位,請重新整理 Discord 再開啟指令。",
201
- "classic.selection_expired": "⏰ 選擇逾時。請再次執行 /start。",
202
- "classic.backend_not_installed": "⚠️ 找不到 {0} CLI(`{1}`)於 PATH。\n安裝:`{2}`\n仍會嘗試啟動…",
203
- "classic.stopped": "🛑 已停止此頻道的 Agent。",
204
- "classic.no_agent_here": "此頻道沒有活動中的 Agent。",
205
- "admin.only": "⛔ 只有管理員能執行此操作。",
206
- "admin.required": "⛔ 此指令需要管理員權限。",
207
- "permission.denied": "⛔ 權限不足。",
208
- "pause.usage": "用法:`/pause <instance-name>`",
209
- "wake.usage": "用法:`/wake <instance-name>`",
210
- "pause.success": "⏸ {0} 已暫停。",
211
- "wake.success": "▶️ {0} 已喚醒。",
212
- "pause.not_idle": "⚠️ {0} 正忙碌,未暫停。請等待 idle。",
213
- "pause.failed": "❌ 暫停 {0} 失敗:{1}",
214
- "wake.failed": "❌ 喚醒 {0} 失敗:{1}",
215
- "instance.not_found": "❌ 找不到 instance:{0}",
216
- "not_authorized": "⛔ 未授權",
217
- "usage.chat": "用法:`/chat <訊息>`",
218
- "dashboard.title": "📊 AgEnD 儀表板",
219
- "dashboard.starting": "⏳ 儀表板啟動中,請稍後再試。",
220
- "update.available": "🆕 AgEnD {0} 可更新!執行:/update",
221
- "update.highlights": "更新重點:{0}",
222
- "fleet.ready": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2}",
223
- "fleet.ready_with_failed": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2} | 失敗:{3}",
224
- "cost.approaching": "⚠️ {0} 花費:{1} / {2}({3}%)",
225
- "cost.limit_reached": "🛑 {0} 已達每日上限 {1} — 暫停 Agent。",
226
- "general.start_failed": "⚠️ General Agent「{0}」啟動失敗:\n{1}",
227
- "alert.unauth_user_private": "🆕 未授權使用者嘗試在私訊 /start:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_users`",
228
- "alert.start_not_admin": "🔑 使用者想 /start 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
229
- "alert.stop_not_admin": "🔑 使用者想 /stop 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
230
- "alert.unauth_guild": "🆕 未授權伺服器嘗試 /start:\n• Guild ID:{0}\n• 使用者:{1}\n• 平台:discord\n\n允許:把 `{0}` 加到 classicBot.yaml 的 `allowed_guilds`",
231
- "alert.bot_added": "🆕 Bot 被加入新伺服器:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
232
- "alert.new_group": "🆕 偵測到新群組:\n• 名稱:{0}\n• ID:{1}\n• 使用者:{2}({3})\n• 平台:{4}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
233
- "schedule.deferred": "⏳ 排程「{0}」延後 — rate limit 於 {1}%",
234
- "restart.full_initiated": "🔄 開始完整重啟 — 等待所有 Agent 閒置後重載程序...",
235
- "restart.graceful_initiated": "🔄 開始優雅重啟 — 等待所有 Agent 閒置...",
236
- "inst.crashed_respawned": "⚠️ {0} 已崩潰並重生。",
237
- "inst.crashed_respawned_log": "⚠️ {0} 已崩潰並重生。詳見 ~/.agend/daemon.log。",
238
- "inst.restarted_no_context": "⚠️ {0}:已重啟但無 context(snapshot 注入失敗)",
239
- "inst.respawn_paused": "⚠️ {0} 連續 crash 3+ 次 — 已暫停恢復。檢查 log 或執行 `/wake` 重啟。",
240
- "inst.recovered": "✅ {0}:{1} 後恢復",
241
- "inst.root_skip_perms": "⚠️ claude-code 不能以 root 執行 --dangerously-skip-permissions。請設定 IS_SANDBOX=1 或改用非 root 使用者。",
242
- "inst.notification": "{0} {1}:{2}(動作:{3})",
243
- "interactive.kind.sudo_password": "sudo 密碼",
244
- "interactive.kind.password": "密碼",
245
- "interactive.kind.confirmation": "Y/N 確認",
246
- "interactive.kind.press_enter": "按 Enter",
247
- "interactive.general_notice": "⚠️ {0} 正在等待人工輸入({1})。請 General 協助嗎?",
248
- "interactive.instance_notice": "⚠️ {0} 正在等待人工輸入。請至 General channel 確認處理方式。",
249
- "interactive.confirm": "確認",
250
- "interactive.cancel": "取消",
251
- "interactive.confirmed": "✅ 已請 General 協助處理 {0}。",
252
- "interactive.ignored": "🚫 已忽略 {0} 的人工輸入提示。",
253
- "interactive.expired": "⌛ {0} 的人工輸入協助請求已逾時。",
254
- "interactive.self_assist": "⚠️ {0} 就是 General;阻塞時無法自助。請直接使用 tmux attach。",
255
- "interactive.delivery_failed": "❌ 無法把 {0} 的協助請求送進 General。",
256
- "interactive.assist_request": "[system] 已確認協助 {0} 的人工輸入(提示類型:{1})。請查看該 instance 的 tmux pane,向使用者回報正在等待的操作,並在輸入任何內容前取得明確授權。絕不可要求或接受使用者在聊天中傳送密碼;密碼只能由操作員直接在 tmux 輸入。",
257
- "exit.instance_notice": "🛑 {0} 已停止(正常退出,exit code 0)。管理員可至 General 重新啟動。",
258
- "exit.general_notice": "🛑 {0} 已停止(正常退出)。要重新啟動嗎?",
259
- "exit.restart": "重啟",
260
- "exit.ignore": "忽略",
261
- "exit.restarting": "🔄 正在重啟 {0}...",
262
- "exit.restarted": "✅ {0} 已重新啟動。",
263
- "exit.ignored": "🚫 已忽略 {0} 的重啟提示。",
264
- "exit.expired": "⌛ {0} 的重啟提示已逾時。",
265
- "exit.restart_failed": "❌ 無法重啟 {0}:{1}",
266
- "hang.detected": "⚠️ {0} 可能卡住了 — 畫面已 {1} 分鐘無變化,也偵測不到就緒提示",
267
- "hang.restart": "🔄 強制重啟",
268
- "hang.wait": "⏳ 繼續等待",
269
- "hang.waiting": "⏳ 繼續等待 {0}。",
270
- "hang.restarting": "🔄 正在重啟 {0}...",
271
- "hang.restarted": "✅ {0} 已重新啟動。",
272
- "hang.restart_failed": "❌ 無法重啟 {0}:{1}",
273
- "hang.expired": "⌛ {0} 的卡住提示已逾時 — 若仍卡住請用 /restart。",
274
- "buttons.stale": "⌛ 此提示已逾時,無法再操作。",
275
- "restart.graceful": "🔄 優雅重啟中 — 等待 instances 閒置...",
276
- "update.running": "📦 正在更新 AgEnD... Fleet 會自動重啟。",
277
- "update.progress.preparing": "📦 正在更新 AgEnD... ({0}s)",
278
- "update.progress.downloading": "⬇️ 下載及安裝中... ({0}s)",
279
- "update.progress.installed": "✅ 安裝完成 — v{0} ({1}s)",
280
- "update.progress.stopping": "🔄 停止 Fleet... ({0}s)",
281
- "update.progress.starting": "🚀 啟動 Fleet... ({0}s)",
282
- "update.progress.instances": "⏳ 啟動中... {0}/{1} instances ({2}s)",
283
- "update.progress.complete": "✅ Fleet 已重啟 — v{0}, {1}/{2} instances running ({3}s)",
284
- "update.progress.already_current": "✅ 已是最新版本 — v{0} ({1}s)",
285
- "update.progress.failed": "❌ 更新在「{0}」階段失敗:{1} ({2}s)",
286
- "update.stage.preparing": "準備",
287
- "update.stage.downloading": "下載/安裝",
288
- "update.stage.installed": "安裝驗證",
289
- "update.stage.stopping": "停止 Fleet",
290
- "update.stage.starting": "啟動 Fleet",
291
- "update.stage.complete": "完成",
292
- "update.stage.failed": "更新",
293
- "slash.start": "在此頻道啟動 Agent",
294
- "slash.stop": "停止此頻道的 Agent",
295
- "slash.chat": "傳送訊息給 Agent",
296
- "slash.ctx": "顯示上下文使用量",
297
- "slash.cancel": "中斷 Agent 目前的動作(送出 Escape)",
298
- "slash.dashboard": "取得儀表板網址(管理員)",
299
- "slash.compact": "壓縮 Agent 上下文",
300
- "slash.clear": "清空 Agent 對話上下文",
301
- "slash.save": "儲存 Agent 對話",
302
- "slash.load": "載入已儲存的對話",
303
- "slash.collab": "切換 bot/webhook 協作模式",
304
- "slash.status": "顯示 Fleet 狀態與花費",
305
- "slash.sysinfo": "系統診斷",
306
- "slash.restart": "優雅重啟所有 instances",
307
- "slash.update": "更新 AgEnD 到最新版",
308
- "slash.doctor": "執行健康診斷",
309
- "chat.usage": "用法:`/chat <訊息>`",
310
- "filename.invalid": "⛔ 檔名無效 — 只允許字母、數字、點、連字號、底線。",
311
- "dashboard.disabled": "⛔ /dashboard 已停用 — 未設定 allowed_users",
312
- "update.disabled": "⛔ /update 已停用 — 未設定 allowed_users",
313
- "doctor.running": "🩺 執行診斷中...",
314
- "save.usage": "用法:/save <檔名>",
315
- "save.sent": "✅ 已送出 `{0}` 給 {1}",
316
- "classic.not_allowed_user": "⛔ 你不在允許使用者清單中。",
317
- "classic.access_requested": "⏳ 已送出存取請求,等待管理員核准。",
318
- "classic.admin_only_start": "⛔ 只有管理員能啟動 Agent。請找管理員 /start。",
319
- "classic.admin_only_stop": "⛔ 只有管理員能停止 Agent。",
320
- "cmd.admin_required": "⛔ {0} 需要管理員權限。",
321
- "collab.on": "🤝 協作模式開啟 — bot/webhook 訊息會傳到 Agent。",
322
- "collab.off": "💬 協作模式關閉",
323
- "collab.on.classic": "🤝 協作模式開啟 — @mention 此 bot 觸發 Agent,其他 bot 訊息可見。",
324
- "collab.off.classic": "💬 協作模式關閉 — 用 /chat 對話。",
325
- },
1038
+ en: enMessages,
1039
+ "zh-TW": zhTWMessages,
326
1040
  };
327
1041
  /** Translate a key with {0},{1},… positional args, using the active locale. */
328
1042
  export function t(key, ...args) {