@songsid/agend 2.1.4-beta.17 → 2.1.4-beta.19
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.
- package/dist/backend/antigravity.d.ts +1 -0
- package/dist/backend/antigravity.js +4 -0
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/codex.d.ts +17 -0
- package/dist/backend/codex.js +51 -0
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/types.d.ts +10 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.js +54 -20
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.js +5 -3
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/types.d.ts +1 -1
- package/dist/cli.js +31 -21
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +3 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +58 -2
- package/dist/daemon.js +263 -29
- package/dist/daemon.js.map +1 -1
- package/dist/doctor.js +34 -27
- package/dist/doctor.js.map +1 -1
- package/dist/fleet-context.d.ts +4 -0
- package/dist/fleet-manager.d.ts +25 -0
- package/dist/fleet-manager.js +451 -88
- package/dist/fleet-manager.js.map +1 -1
- package/dist/locale.js +656 -320
- package/dist/locale.js.map +1 -1
- package/dist/outbound-handlers.js +5 -1
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/restart-progress.d.ts +2 -0
- package/dist/restart-progress.js +3 -0
- package/dist/restart-progress.js.map +1 -1
- package/dist/scheduler/db.d.ts +5 -0
- package/dist/scheduler/db.js +35 -0
- package/dist/scheduler/db.js.map +1 -1
- package/dist/tips.d.ts +34 -0
- package/dist/tips.js +554 -0
- package/dist/tips.js.map +1 -0
- package/dist/topic-commands.d.ts +9 -2
- package/dist/topic-commands.js +144 -59
- package/dist/topic-commands.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/ui/dashboard.html +55 -32
- package/dist/ui/settings.html +46 -37
- package/dist/ui/view.html +23 -15
- package/package.json +1 -1
package/dist/locale.js
CHANGED
|
@@ -12,327 +12,663 @@ 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}` 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
|
+
"tips.label": "Tip",
|
|
120
|
+
"tips.dismiss": "✅ Got it",
|
|
121
|
+
"tips.dismissed": "✅ Tip dismissed — it will not be shown again.",
|
|
122
|
+
"tips.advanced.unlock_prompt": "🔓 The fleet has dismissed 30 intermediate tips. Start showing advanced tips?",
|
|
123
|
+
"tips.advanced.unlock": "🔓 Show advanced tips",
|
|
124
|
+
"tips.advanced.unlocked": "🔓 Advanced tips unlocked.",
|
|
125
|
+
"tips.advanced.expired": "🔓 Advanced tips are ready. Run /tips to unlock them when you want.",
|
|
126
|
+
"tips.enabled": "💡 Daily tips enabled.",
|
|
127
|
+
"tips.disabled": "🔕 Daily tips disabled. Use /tips anytime for an on-demand tip.",
|
|
128
|
+
"tips.empty": "🎉 You have dismissed every currently available tip.",
|
|
129
|
+
"tips.unavailable": "⚠️ Tips are not available yet. Try again shortly.",
|
|
130
|
+
"tips.usage": "Usage: /tips, /tips on, or /tips off",
|
|
131
|
+
"tips.posted": "💡 Tip posted in General.",
|
|
132
|
+
"tips.general_only": "⚠️ /tips is available in a General topic.",
|
|
133
|
+
"restart.graceful": "🔄 Graceful restart — waiting for instances to idle...",
|
|
134
|
+
"update.running": "📦 Updating AgEnD... Fleet will restart automatically.",
|
|
135
|
+
"update.progress.preparing": "📦 Updating AgEnD... ({0}s)",
|
|
136
|
+
"update.progress.downloading": "⬇️ Downloading and installing... ({0}s)",
|
|
137
|
+
"update.progress.installed": "✅ Installation complete — v{0} ({1}s)",
|
|
138
|
+
"update.progress.stopping": "🔄 Stopping fleet... ({0}s)",
|
|
139
|
+
"update.progress.starting": "🚀 Starting fleet... ({0}s)",
|
|
140
|
+
"update.progress.instances": "⏳ Starting... {0}/{1} instances ({2}s)",
|
|
141
|
+
"update.progress.complete": "✅ Fleet restarted — v{0}, {1}/{2} instances running ({3}s)",
|
|
142
|
+
"update.progress.already_current": "✅ Already up to date — v{0} ({1}s)",
|
|
143
|
+
"update.progress.failed": "❌ Update failed during {0}: {1} ({2}s)",
|
|
144
|
+
"update.stage.preparing": "preparation",
|
|
145
|
+
"update.stage.downloading": "download/install",
|
|
146
|
+
"update.stage.installed": "installation verification",
|
|
147
|
+
"update.stage.stopping": "fleet stop",
|
|
148
|
+
"update.stage.starting": "fleet startup",
|
|
149
|
+
"update.stage.complete": "completion",
|
|
150
|
+
"update.stage.failed": "update",
|
|
151
|
+
"slash.start": "Start an agent in this channel",
|
|
152
|
+
"slash.stop": "Stop the agent in this channel",
|
|
153
|
+
"slash.chat": "Send a message to the agent",
|
|
154
|
+
"slash.ctx": "Show context usage",
|
|
155
|
+
"slash.cancel": "Interrupt the agent's current operation (sends Escape)",
|
|
156
|
+
"slash.dashboard": "Get dashboard URLs (admin only)",
|
|
157
|
+
"slash.compact": "Compact agent context window",
|
|
158
|
+
"slash.steer": "Interject into the agent's current task",
|
|
159
|
+
"steer.usage": "Usage: /steer <message> — interjects into the running turn",
|
|
160
|
+
"steer.sent": "🎯 Steering message sent to {0} (lands mid-turn; falls back to the queue if the CLI can't take busy input).",
|
|
161
|
+
"steer.not_connected": "❌ Instance not connected (IPC unavailable)",
|
|
162
|
+
"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.",
|
|
163
|
+
"slash.btw": "Ask a side question without interrupting the current task",
|
|
164
|
+
"btw.usage": "Usage: /btw <message> — asks Claude Code a side question without interrupting its current task",
|
|
165
|
+
"btw.sent": "💬 Side question sent to {0}.",
|
|
166
|
+
"btw.not_connected": "❌ Instance not connected (IPC unavailable)",
|
|
167
|
+
"btw.unsupported": "⚠️ /btw is not supported for the {0} backend (Claude Code only). The message was NOT sent.",
|
|
168
|
+
"slash.clear": "Clear agent conversation context",
|
|
169
|
+
"slash.save": "Save the agent's conversation",
|
|
170
|
+
"slash.load": "Load a saved conversation",
|
|
171
|
+
"slash.collab": "Toggle bot/webhook collaboration mode",
|
|
172
|
+
"slash.status": "Fleet status, per-instance costs and health (admin only)",
|
|
173
|
+
"slash.sysinfo": "System diagnostics",
|
|
174
|
+
"slash.restart": "Graceful restart all instances",
|
|
175
|
+
"slash.update": "Update AgEnD to latest version",
|
|
176
|
+
"slash.doctor": "Run health diagnostics",
|
|
177
|
+
"slash.usage": "AI subscription usage",
|
|
178
|
+
"slash.tips": "Show a useful AgEnD tip",
|
|
179
|
+
"slash.effort": "Set reasoning effort (admin only)",
|
|
180
|
+
"slash.model": "Switch model (admin only)",
|
|
181
|
+
"slash.pause": "Pause an idle instance",
|
|
182
|
+
"slash.wake": "Wake a paused instance",
|
|
183
|
+
"slash.option.backend": "Backend to start",
|
|
184
|
+
"slash.option.instance": "Instance name (required in General)",
|
|
185
|
+
"slash.option.message": "Your message",
|
|
186
|
+
"slash.option.tips_mode": "Optional daily-tip setting",
|
|
187
|
+
"slash.option.steer_message": "What to tell the agent mid-task",
|
|
188
|
+
"slash.option.btw_message": "Side question for Claude Code",
|
|
189
|
+
"slash.option.effort_level": "low | medium | high | xhigh | max",
|
|
190
|
+
"slash.option.save_filename": "File name to save as",
|
|
191
|
+
"slash.option.save_force": "Overwrite if file exists",
|
|
192
|
+
"slash.option.load_filename": "File name to load",
|
|
193
|
+
"chat.usage": "Usage: `/chat <message>`",
|
|
194
|
+
"filename.invalid": "⛔ Invalid filename — only letters, numbers, dots, hyphens, underscores allowed.",
|
|
195
|
+
"dashboard.disabled": "⛔ /dashboard disabled — no allowed_users configured",
|
|
196
|
+
"update.disabled": "⛔ /update disabled — no allowed_users configured",
|
|
197
|
+
"doctor.running": "🩺 Running diagnostics...",
|
|
198
|
+
"doctor.no_output": "No diagnostic output.",
|
|
199
|
+
"doctor.failed": "Diagnostics failed.",
|
|
200
|
+
"doctor.cli_missing": "Backend diagnostics unavailable — agend CLI not found in PATH.",
|
|
201
|
+
"doctor.section.prerequisites": "Prerequisites",
|
|
202
|
+
"doctor.section.service": "Service",
|
|
203
|
+
"doctor.section.fleet": "Fleet",
|
|
204
|
+
"doctor.section.ipc": "MCP IPC",
|
|
205
|
+
"doctor.config_invalid": "invalid: {0}",
|
|
206
|
+
"doctor.backend_label": "backend {0}",
|
|
207
|
+
"doctor.backend_unknown": "unknown backend",
|
|
208
|
+
"doctor.binary_available": "{0} available",
|
|
209
|
+
"doctor.binary_missing": "{0} not found",
|
|
210
|
+
"doctor.not_found": "not found",
|
|
211
|
+
"doctor.term_unset": "not set — TUI rendering may fail",
|
|
212
|
+
"doctor.service_none": "no AgEnD service found — run: agend install",
|
|
213
|
+
"doctor.manager_user_unavailable": "unknown — systemd --user unavailable (common over SSH without a user D-Bus session)",
|
|
214
|
+
"doctor.manager_unavailable": "unknown (service manager unavailable)",
|
|
215
|
+
"doctor.service_installed": "installed",
|
|
216
|
+
"doctor.service_enabled": "enabled",
|
|
217
|
+
"doctor.service_active": "active",
|
|
218
|
+
"doctor.yes": "yes",
|
|
219
|
+
"doctor.no_install": "no — run: agend install",
|
|
220
|
+
"doctor.service_running": "running",
|
|
221
|
+
"doctor.inactive_start": "inactive — run: agend start",
|
|
222
|
+
"doctor.dbus_set": "DBUS_SESSION_BUS_ADDRESS is set",
|
|
223
|
+
"doctor.dbus_unset": "DBUS_SESSION_BUS_ADDRESS is not set — systemd --user may not work",
|
|
224
|
+
"doctor.fleet_process": "fleet process",
|
|
225
|
+
"doctor.pid_missing": "fleet.pid not found — fleet is not running",
|
|
226
|
+
"doctor.pid_invalid": "fleet.pid is invalid",
|
|
227
|
+
"doctor.pid_stale": "PID {0} is not alive (stale fleet.pid)",
|
|
228
|
+
"doctor.pid_alive": "PID {0} is alive",
|
|
229
|
+
"doctor.tmux_session": "tmux session",
|
|
230
|
+
"doctor.session_exists": "{0} exists",
|
|
231
|
+
"doctor.session_missing": "{0} not found",
|
|
232
|
+
"doctor.instances": "instances",
|
|
233
|
+
"doctor.config_missing": "fleet.yaml not found at {0}",
|
|
234
|
+
"doctor.instance_counts": "{0} running, {1} paused, {2} stopped, {3} crashed ({4} total)",
|
|
235
|
+
"doctor.ipc_ok": "{0}/{1} running instance socket(s) reachable",
|
|
236
|
+
"doctor.ipc_failed": "{0}/{1} reachable; failed: {2}",
|
|
237
|
+
"doctor.title": "AgEnD doctor",
|
|
238
|
+
"doctor.complete": "Doctor complete ({0} warning(s))",
|
|
239
|
+
"doctor.errors": "Doctor found {0} error(s) ({1} warning(s))",
|
|
240
|
+
"install.description": "Install and start the AgEnD system service",
|
|
241
|
+
"install.path": "Service installed at: {0}",
|
|
242
|
+
"install.running": "✅ Fleet service installed and running.",
|
|
243
|
+
"install.start_failed": "❌ Fleet service was installed but could not be started: {0}",
|
|
244
|
+
"install.updated": "Service file updated (activation skipped).",
|
|
245
|
+
"uninstall.description": "Remove the AgEnD system service",
|
|
246
|
+
"uninstall.force_help": "Skip confirmation (for CI/automation)",
|
|
247
|
+
"uninstall.none": "No AgEnD service found.",
|
|
248
|
+
"uninstall.found": "AgEnD service found:",
|
|
249
|
+
"uninstall.manager": "Manager: {0}",
|
|
250
|
+
"uninstall.path": "Path: {0}",
|
|
251
|
+
"uninstall.enabled": "Enabled: {0}",
|
|
252
|
+
"uninstall.active": "Active: {0}",
|
|
253
|
+
"uninstall.unknown": "unknown",
|
|
254
|
+
"uninstall.yes": "yes",
|
|
255
|
+
"uninstall.no": "no",
|
|
256
|
+
"uninstall.running": "running",
|
|
257
|
+
"uninstall.inactive": "inactive",
|
|
258
|
+
"uninstall.non_interactive": "Non-interactive session — re-run with --force.",
|
|
259
|
+
"uninstall.confirm": "Remove service? [Y/n] ",
|
|
260
|
+
"uninstall.cancelled_force": "Service removal cancelled. Re-run with --force for non-interactive use.",
|
|
261
|
+
"uninstall.cancelled": "Service removal cancelled.",
|
|
262
|
+
"uninstall.removed": "Service disabled, stopped, and removed.",
|
|
263
|
+
"uninstall.failed": "Failed to uninstall service: {0}",
|
|
264
|
+
"usage.failed": "⚠️ Usage fetch failed: {0}",
|
|
265
|
+
"general.pause_forbidden": "General cannot be paused",
|
|
266
|
+
"compact.sent": "🗜️ Compact command sent (`{0}`).",
|
|
267
|
+
"compact.not_connected": "❌ Instance not connected (IPC unavailable)",
|
|
268
|
+
"save.unsupported": "⚠️ /save is not supported for this backend (only Kiro CLI and Claude Code).",
|
|
269
|
+
"save.not_connected": "❌ Instance not connected (IPC unavailable)",
|
|
270
|
+
"clear.unsupported": "⚠️ Clear is not supported for this backend.",
|
|
271
|
+
"model.usage": "Usage: /model <name> — e.g. /model sonnet",
|
|
272
|
+
"model.list_unavailable": "No model list is available for {0}. Use `/model <name>` to set one directly.",
|
|
273
|
+
"model.menu": "Current model: {0}\nSelect a new model:",
|
|
274
|
+
"model.selection_expired": "⏰ Model selection expired.",
|
|
275
|
+
"model.switching": "⏳ Switching {0} to `{1}`…",
|
|
276
|
+
"model.switch_failed": "Model switch to `{0}` failed: {1}",
|
|
277
|
+
"model.pattern_warning": "⚠️ \"{0}\" does not match {1}'s usual pattern — passing through anyway.\n",
|
|
278
|
+
"model.persist_failed": "❌ Could not set model for {0}.",
|
|
279
|
+
"model.runtime_success": "✅ Switched {0} to `{1}` (runtime).",
|
|
280
|
+
"model.restart_success": "✅ Set {0} to `{1}` and restarted.",
|
|
281
|
+
"effort.unsupported": "❌ {0} has no reasoning-effort setting.",
|
|
282
|
+
"effort.usage": "Usage: /effort <{0}>",
|
|
283
|
+
"effort.menu": "{0}\nSelect a new effort level:",
|
|
284
|
+
"effort.selection_expired": "⏰ Effort selection expired.",
|
|
285
|
+
"effort.setting": "⏳ Setting {0} effort to `{1}`…",
|
|
286
|
+
"effort.switch_failed": "Effort switch to `{0}` failed: {1}",
|
|
287
|
+
"effort.unknown": "❌ Unknown effort level `{0}`. Use: {1}.",
|
|
288
|
+
"effort.no_canonical": "❌ {0} accepts none of the canonical effort levels.",
|
|
289
|
+
"effort.clamped": "⚠️ Clamped to `{0}` (`{1}` is not supported by {2}).\n",
|
|
290
|
+
"effort.not_running": "❌ {0} is not running.",
|
|
291
|
+
"effort.runtime_success": "✅ Set {0} effort to `{1}` (runtime).",
|
|
292
|
+
"effort.restart_success": "✅ Set {0} effort to `{1}` and restarted.",
|
|
293
|
+
"effort.current_default": "Current effort: (CLI default)",
|
|
294
|
+
"effort.current_fleet": "Current effort: {0} (fleet default)",
|
|
295
|
+
"effort.current": "Current effort: {0}",
|
|
296
|
+
"status.no_config": "No fleet config loaded.",
|
|
297
|
+
"status.no_instances": "No instances configured.",
|
|
298
|
+
"status.title": "Fleet Status",
|
|
299
|
+
"status.table_header": "| Instance | Backend | Ctx | Effort | Cost | Status | State | IPC |",
|
|
300
|
+
"status.paused_count": "Paused instances: {0}",
|
|
301
|
+
"status.daily_cost": "Fleet: {0} / {1} daily",
|
|
302
|
+
"status.adapters": "Adapters:",
|
|
303
|
+
"state.idle": "idle",
|
|
304
|
+
"state.working": "working",
|
|
305
|
+
"state.stuck": "stuck",
|
|
306
|
+
"state.paused": "paused",
|
|
307
|
+
"sysinfo.title": "System Info",
|
|
308
|
+
"sysinfo.metric": "Metric",
|
|
309
|
+
"sysinfo.value": "Value",
|
|
310
|
+
"sysinfo.uptime": "Uptime",
|
|
311
|
+
"sysinfo.memory": "Memory",
|
|
312
|
+
"sysinfo.heap": "Heap",
|
|
313
|
+
"topic.unbound": "This topic/thread/channel is not bound to an instance. Ask General to create one with create_instance.",
|
|
314
|
+
"rate_limit.five_hour": "⚠️ {0} is at {1}% of its 5-hour rate limit. Responses may be slower.",
|
|
315
|
+
"rate_limit.weekly": "⚠️ {0} is at {1}% weekly usage. Responses may be slower or fail.",
|
|
316
|
+
"failover.triggered": "⚡ Rate limit {0}% — next rotation will use {1} (was {2}).",
|
|
317
|
+
"failover.recovered": "✅ Rate limit recovered ({0}%) — next rotation will use {1}.",
|
|
318
|
+
"adapter.start_failed": "⚠️ Adapter \"{0}\" failed to start: {1}\nRetrying in the background; other adapters are unaffected.",
|
|
319
|
+
"adapter.reconnected": "✅ Adapter \"{0}\" reconnected after {1} attempt(s).",
|
|
320
|
+
"general.antigravity_unsupported": "⚠️ Antigravity is not supported for General instances because it cannot receive MCP instructions. Switch to Claude Code or Kiro CLI.",
|
|
321
|
+
"classic.manager_unavailable": "Classic channel manager is not initialized.",
|
|
322
|
+
"fleet.reload_failed": "⚠️ fleet.yaml reload FAILED — {0}\nThe previous configuration is still running.",
|
|
323
|
+
"fleet.reload_rejected": "⚠️ fleet.yaml reload REJECTED — {0}\nThe previous configuration is still running.",
|
|
324
|
+
"fleet.reload_validation": "validation failed:\n{0}",
|
|
325
|
+
"fleet.reload_removed_all": "it removed every instance ({0} → 0)",
|
|
326
|
+
"fleet.reload_removed_half": "it removed more than half the instances ({0} → {1})",
|
|
327
|
+
"fleet.error_suppressed": "(plus {0} more in the last {1}m)",
|
|
328
|
+
"dashboard.port_in_use": "⚠️ Dashboard unavailable — health port {0} is already in use. Stop the conflicting process or configure a different health_port.",
|
|
329
|
+
"dashboard.server_failed": "⚠️ Dashboard unavailable — health server failed: {0}",
|
|
330
|
+
"save.usage": "Usage: /save <filename>",
|
|
331
|
+
"save.sent": "✅ Sent `{0}` to {1}",
|
|
332
|
+
"classic.not_allowed_user": "⛔ You are not in the allowed users list.",
|
|
333
|
+
"classic.access_requested": "⏳ Access requested. Waiting for admin approval.",
|
|
334
|
+
"classic.admin_only_start": "⛔ Only admins can start agents. Ask an admin to /start.",
|
|
335
|
+
"classic.admin_only_stop": "⛔ Only admins can stop agents.",
|
|
336
|
+
"cmd.admin_required": "⛔ {0} requires admin access.",
|
|
337
|
+
"collab.on": "🤝 Collaboration mode ON — bot/webhook messages reach the agent.",
|
|
338
|
+
"collab.off": "💬 Collaboration mode OFF",
|
|
339
|
+
"collab.on.classic": "🤝 Collaboration mode ON — @mention this bot to trigger the agent. Other bot messages are visible.",
|
|
340
|
+
"collab.off.classic": "💬 Collaboration mode OFF — use /chat to talk to the agent.",
|
|
341
|
+
};
|
|
342
|
+
const zhTWMessages = {
|
|
343
|
+
"cancel.button": "🛑 取消",
|
|
344
|
+
"cancel.sent": "🛑 已送出取消給 {0}。",
|
|
345
|
+
"cancel.not_running": "❌ {0} 未在執行。",
|
|
346
|
+
"cancel.button_stale": "⚠️ 這顆按鈕已失效 — {0} 沒有在執行。每一輪都會有新的按鈕。",
|
|
347
|
+
"clear.confirm_message": "⚠️ 確定要清空 {0} 的對話記錄嗎?此操作不可逆。",
|
|
348
|
+
"clear.confirm": "✅ 確認清空",
|
|
349
|
+
"clear.cancel": "❌ 取消",
|
|
350
|
+
"clear.confirm_posted": "已在此頻道送出確認按鈕。",
|
|
351
|
+
"clear.clearing": "🧹 正在清空 {0} 的對話記錄...",
|
|
352
|
+
"clear.sent": "🧹 已送出清空指令(`{0}`)。",
|
|
353
|
+
"clear.cancelled": "❌ 已取消清空 {0}。",
|
|
354
|
+
"clear.expired": "⌛ {0} 的清空確認已逾時。",
|
|
355
|
+
"clear.not_connected": "❌ Instance 未連線(IPC unavailable)",
|
|
356
|
+
"clear.prompt_unavailable": "❌ 無法送出清空確認,請再試一次。",
|
|
357
|
+
"clear.failed": "❌ 清空 {0} 失敗:{1}",
|
|
358
|
+
"ctx.used": "📊 Context:{0}% 已用",
|
|
359
|
+
"ctx.backend": "後端:{0}",
|
|
360
|
+
"ctx.model": "Model:{0}",
|
|
361
|
+
"ctx.instance": "Agent:{0}",
|
|
362
|
+
"ctx.unavailable": "Context 資訊尚未可用。",
|
|
363
|
+
"classic.already_active": "此頻道已有活動中的 Agent。請用 /chat 對話。",
|
|
364
|
+
"classic.topic_bound": "此頻道已綁定到 topic 模式的 instance。",
|
|
365
|
+
"classic.not_authorized_guild": "⛔ 此伺服器不在允許清單中。",
|
|
366
|
+
"classic.no_agent": "此頻道沒有活動中的 Agent。",
|
|
367
|
+
"classic.no_agent_start": "此頻道沒有活動中的 Agent。請先用 /start。",
|
|
368
|
+
"classic.started": "✅ Agent 已在此頻道啟動。用 `/chat <訊息>` 或 @mention 對話。",
|
|
369
|
+
"classic.choose_backend": "請選擇此 Agent 的後端:",
|
|
370
|
+
"classic.backend_required": "請在 `/start` 指令中選擇 backend 後重試。若沒有顯示 backend 欄位,請重新整理 Discord 再開啟指令。",
|
|
371
|
+
"classic.selection_expired": "⏰ 選擇逾時。請再次執行 /start。",
|
|
372
|
+
"classic.backend_not_installed": "⚠️ 找不到 {0} CLI(`{1}`)於 PATH。\n安裝:`{2}`\n仍會嘗試啟動…",
|
|
373
|
+
"classic.stopped": "🛑 已停止此頻道的 Agent。",
|
|
374
|
+
"classic.no_agent_here": "此頻道沒有活動中的 Agent。",
|
|
375
|
+
"admin.only": "⛔ 只有管理員能執行此操作。",
|
|
376
|
+
"admin.required": "⛔ 此指令需要管理員權限。",
|
|
377
|
+
"permission.denied": "⛔ 權限不足。",
|
|
378
|
+
"pause.usage": "用法:`/pause <instance-name>`",
|
|
379
|
+
"wake.usage": "用法:`/wake <instance-name>`",
|
|
380
|
+
"pause.success": "⏸ {0} 已暫停。",
|
|
381
|
+
"wake.success": "▶️ {0} 已喚醒。",
|
|
382
|
+
"pause.not_idle": "⚠️ {0} 正忙碌,未暫停。請等待 idle。",
|
|
383
|
+
"pause.failed": "❌ 暫停 {0} 失敗:{1}",
|
|
384
|
+
"wake.failed": "❌ 喚醒 {0} 失敗:{1}",
|
|
385
|
+
"instance.not_found": "❌ 找不到 instance:{0}",
|
|
386
|
+
"not_authorized": "⛔ 未授權",
|
|
387
|
+
"usage.chat": "用法:`/chat <訊息>`",
|
|
388
|
+
"dashboard.title": "📊 AgEnD 儀表板",
|
|
389
|
+
"dashboard.starting": "⏳ 儀表板啟動中,請稍後再試。",
|
|
390
|
+
"update.available": "🆕 AgEnD {0} 可更新!執行:/update",
|
|
391
|
+
"update.available_current": "🆕 AgEnD {0} 可更新(目前:{1})!執行:/update",
|
|
392
|
+
"update.highlights": "更新重點:{0}",
|
|
393
|
+
"fleet.ready": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2}",
|
|
394
|
+
"fleet.ready_with_failed": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2} | 失敗:{3}",
|
|
395
|
+
"cost.approaching": "⚠️ {0} 花費:{1} / {2}({3}%)",
|
|
396
|
+
"cost.limit_reached": "🛑 {0} 已達每日上限 {1} — 暫停 Agent。",
|
|
397
|
+
"general.start_failed": "⚠️ General Agent「{0}」啟動失敗:\n{1}",
|
|
398
|
+
"alert.unauth_user_private": "🆕 未授權使用者嘗試在私訊 /start:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_users`",
|
|
399
|
+
"alert.start_not_admin": "🔑 使用者想 /start 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
|
|
400
|
+
"alert.stop_not_admin": "🔑 使用者想 /stop 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
|
|
401
|
+
"alert.unauth_guild": "🆕 未授權伺服器嘗試 /start:\n• Guild ID:{0}\n• 使用者:{1}\n• 平台:discord\n\n允許:把 `{0}` 加到 classicBot.yaml 的 `allowed_guilds`",
|
|
402
|
+
"alert.bot_added": "🆕 Bot 被加入新伺服器:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
|
|
403
|
+
"alert.new_group": "🆕 偵測到新群組:\n• 名稱:{0}\n• ID:{1}\n• 使用者:{2}({3})\n• 平台:{4}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
|
|
404
|
+
"schedule.deferred": "⏳ 排程「{0}」延後 — rate limit 於 {1}%",
|
|
405
|
+
"restart.full_initiated": "🔄 開始完整重啟 — 等待所有 Agent 閒置後重載程序...",
|
|
406
|
+
"restart.graceful_initiated": "🔄 開始優雅重啟 — 等待所有 Agent 閒置...",
|
|
407
|
+
"inst.crashed_respawned": "⚠️ {0} 已崩潰並重生。",
|
|
408
|
+
"inst.crashed_respawned_log": "⚠️ {0} 已崩潰並重生。詳見 ~/.agend/daemon.log。",
|
|
409
|
+
"inst.restarted_no_context": "⚠️ {0}:已重啟但無 context(snapshot 注入失敗)",
|
|
410
|
+
"inst.respawn_paused": "⚠️ {0} 連續 crash 3+ 次 — 已暫停恢復。檢查 log 或執行 `/wake` 重啟。",
|
|
411
|
+
"inst.recovered": "✅ {0}:{1} 後恢復",
|
|
412
|
+
"inst.root_skip_perms": "⚠️ claude-code 不能以 root 執行 --dangerously-skip-permissions。請設定 IS_SANDBOX=1 或改用非 root 使用者。",
|
|
413
|
+
"inst.notification": "{0} {1}:{2}(動作:{3})",
|
|
414
|
+
"interactive.kind.sudo_password": "sudo 密碼",
|
|
415
|
+
"interactive.kind.password": "密碼",
|
|
416
|
+
"interactive.kind.confirmation": "Y/N 確認",
|
|
417
|
+
"interactive.kind.press_enter": "按 Enter",
|
|
418
|
+
"interactive.general_notice": "⚠️ {0} 正在等待人工輸入({1})。請 General 協助嗎?",
|
|
419
|
+
"interactive.instance_notice": "⚠️ {0} 正在等待人工輸入。請至 General channel 確認處理方式。",
|
|
420
|
+
"interactive.confirm": "確認",
|
|
421
|
+
"interactive.cancel": "取消",
|
|
422
|
+
"interactive.confirmed": "✅ 已請 General 協助處理 {0}。",
|
|
423
|
+
"interactive.ignored": "🚫 已忽略 {0} 的人工輸入提示。",
|
|
424
|
+
"interactive.expired": "⌛ {0} 的人工輸入協助請求已逾時。",
|
|
425
|
+
"interactive.self_assist": "⚠️ {0} 就是 General;阻塞時無法自助。請直接使用 tmux attach。",
|
|
426
|
+
"interactive.delivery_failed": "❌ 無法把 {0} 的協助請求送進 General。",
|
|
427
|
+
"interactive.assist_request": "[system] 已確認協助 {0} 的人工輸入(提示類型:{1})。請查看該 instance 的 tmux pane,向使用者回報正在等待的操作,並在輸入任何內容前取得明確授權。絕不可要求或接受使用者在聊天中傳送密碼;密碼只能由操作員直接在 tmux 輸入。",
|
|
428
|
+
"exit.instance_notice": "🛑 {0} 已停止(正常退出,exit code 0)。管理員可至 General 重新啟動。",
|
|
429
|
+
"exit.general_notice": "🛑 {0} 已停止(正常退出)。要重新啟動嗎?",
|
|
430
|
+
"exit.restart": "重啟",
|
|
431
|
+
"exit.ignore": "忽略",
|
|
432
|
+
"exit.restarting": "🔄 正在重啟 {0}...",
|
|
433
|
+
"exit.restarted": "✅ {0} 已重新啟動。",
|
|
434
|
+
"exit.ignored": "🚫 已忽略 {0} 的重啟提示。",
|
|
435
|
+
"exit.expired": "⌛ {0} 的重啟提示已逾時。",
|
|
436
|
+
"exit.restart_failed": "❌ 無法重啟 {0}:{1}",
|
|
437
|
+
"hang.detected": "⚠️ {0} 可能卡住了 — 畫面已 {1} 分鐘無變化,也偵測不到就緒提示",
|
|
438
|
+
"hang.restart": "🔄 強制重啟",
|
|
439
|
+
"hang.wait": "⏳ 繼續等待",
|
|
440
|
+
"hang.waiting": "⏳ 繼續等待 {0}。",
|
|
441
|
+
"hang.restarting": "🔄 正在重啟 {0}...",
|
|
442
|
+
"hang.restarted": "✅ {0} 已重新啟動。",
|
|
443
|
+
"hang.restart_failed": "❌ 無法重啟 {0}:{1}",
|
|
444
|
+
"hang.expired": "⌛ {0} 的卡住提示已逾時 — 若仍卡住請用 /restart。",
|
|
445
|
+
"buttons.stale": "⌛ 此提示已逾時,無法再操作。",
|
|
446
|
+
"tips.label": "小提示",
|
|
447
|
+
"tips.dismiss": "✅ 我知道了",
|
|
448
|
+
"tips.dismissed": "✅ 已記錄,此提示不會再出現。",
|
|
449
|
+
"tips.advanced.unlock_prompt": "🔓 此 fleet 已略過 30 則中階提示。要開始顯示進階提示嗎?",
|
|
450
|
+
"tips.advanced.unlock": "🔓 開始看進階",
|
|
451
|
+
"tips.advanced.unlocked": "🔓 已解鎖進階提示。",
|
|
452
|
+
"tips.advanced.expired": "🔓 進階提示已可解鎖;準備好時可執行 /tips。",
|
|
453
|
+
"tips.enabled": "💡 已開啟每日提示。",
|
|
454
|
+
"tips.disabled": "🔕 已關閉每日提示;仍可隨時用 /tips 主動查看。",
|
|
455
|
+
"tips.empty": "🎉 目前可用的提示都已讀完。",
|
|
456
|
+
"tips.unavailable": "⚠️ 提示系統尚未就緒,請稍後再試。",
|
|
457
|
+
"tips.usage": "用法:/tips、/tips on 或 /tips off",
|
|
458
|
+
"tips.posted": "💡 已在 General 發出提示。",
|
|
459
|
+
"tips.general_only": "⚠️ /tips 請在 General topic 使用。",
|
|
460
|
+
"restart.graceful": "🔄 優雅重啟中 — 等待 instances 閒置...",
|
|
461
|
+
"update.running": "📦 正在更新 AgEnD... Fleet 會自動重啟。",
|
|
462
|
+
"update.progress.preparing": "📦 正在更新 AgEnD... ({0}s)",
|
|
463
|
+
"update.progress.downloading": "⬇️ 下載及安裝中... ({0}s)",
|
|
464
|
+
"update.progress.installed": "✅ 安裝完成 — v{0} ({1}s)",
|
|
465
|
+
"update.progress.stopping": "🔄 停止 Fleet... ({0}s)",
|
|
466
|
+
"update.progress.starting": "🚀 啟動 Fleet... ({0}s)",
|
|
467
|
+
"update.progress.instances": "⏳ 啟動中... {0}/{1} instances ({2}s)",
|
|
468
|
+
"update.progress.complete": "✅ Fleet 已重啟 — v{0}, {1}/{2} instances running ({3}s)",
|
|
469
|
+
"update.progress.already_current": "✅ 已是最新版本 — v{0} ({1}s)",
|
|
470
|
+
"update.progress.failed": "❌ 更新在「{0}」階段失敗:{1} ({2}s)",
|
|
471
|
+
"update.stage.preparing": "準備",
|
|
472
|
+
"update.stage.downloading": "下載/安裝",
|
|
473
|
+
"update.stage.installed": "安裝驗證",
|
|
474
|
+
"update.stage.stopping": "停止 Fleet",
|
|
475
|
+
"update.stage.starting": "啟動 Fleet",
|
|
476
|
+
"update.stage.complete": "完成",
|
|
477
|
+
"update.stage.failed": "更新",
|
|
478
|
+
"slash.start": "在此頻道啟動 Agent",
|
|
479
|
+
"slash.stop": "停止此頻道的 Agent",
|
|
480
|
+
"slash.chat": "傳送訊息給 Agent",
|
|
481
|
+
"slash.ctx": "顯示上下文使用量",
|
|
482
|
+
"slash.cancel": "中斷 Agent 目前的動作(送出 Escape)",
|
|
483
|
+
"slash.dashboard": "取得儀表板網址(管理員)",
|
|
484
|
+
"slash.compact": "壓縮 Agent 上下文",
|
|
485
|
+
"slash.steer": "插入指示到 Agent 當前任務",
|
|
486
|
+
"steer.usage": "用法:/steer <訊息> — 插入到進行中的回合",
|
|
487
|
+
"steer.sent": "🎯 已將指示插入 {0} 的當前任務(若 CLI 不接受忙碌輸入會自動改排隊)。",
|
|
488
|
+
"steer.not_connected": "❌ Instance 未連線(IPC 不可用)",
|
|
489
|
+
"steer.unsupported": "⚠️ {0} backend 尚未支援 /steer(其 TUI 無法在回合中接收輸入)。訊息未送出——請改用一般訊息,或先 /cancel。",
|
|
490
|
+
"slash.btw": "不中斷目前任務,詢問一個旁支問題",
|
|
491
|
+
"btw.usage": "用法:/btw <訊息> — 向 Claude Code 詢問旁支問題,不中斷目前任務",
|
|
492
|
+
"btw.sent": "💬 已將旁支問題送給 {0}。",
|
|
493
|
+
"btw.not_connected": "❌ Instance 未連線(IPC 不可用)",
|
|
494
|
+
"btw.unsupported": "⚠️ {0} backend 不支援 /btw(僅 Claude Code 支援)。訊息未送出。",
|
|
495
|
+
"slash.clear": "清空 Agent 對話上下文",
|
|
496
|
+
"slash.save": "儲存 Agent 對話",
|
|
497
|
+
"slash.load": "載入已儲存的對話",
|
|
498
|
+
"slash.collab": "切換 bot/webhook 協作模式",
|
|
499
|
+
"slash.status": "顯示 Fleet 狀態與花費",
|
|
500
|
+
"slash.sysinfo": "系統診斷",
|
|
501
|
+
"slash.restart": "優雅重啟所有 instances",
|
|
502
|
+
"slash.update": "更新 AgEnD 到最新版",
|
|
503
|
+
"slash.doctor": "執行健康診斷",
|
|
504
|
+
"slash.usage": "AI 訂閱用量",
|
|
505
|
+
"slash.tips": "顯示一則 AgEnD 使用提示",
|
|
506
|
+
"slash.effort": "設定推理強度(管理員)",
|
|
507
|
+
"slash.model": "切換模型(管理員)",
|
|
508
|
+
"slash.pause": "暫停閒置中的 instance",
|
|
509
|
+
"slash.wake": "喚醒已暫停的 instance",
|
|
510
|
+
"slash.option.backend": "要啟動的後端",
|
|
511
|
+
"slash.option.instance": "Instance 名稱(在 General 中為必填)",
|
|
512
|
+
"slash.option.message": "訊息內容",
|
|
513
|
+
"slash.option.tips_mode": "選填的每日提示設定",
|
|
514
|
+
"slash.option.steer_message": "要在任務中途傳給 Agent 的內容",
|
|
515
|
+
"slash.option.btw_message": "給 Claude Code 的旁支問題",
|
|
516
|
+
"slash.option.effort_level": "low | medium | high | xhigh | max",
|
|
517
|
+
"slash.option.save_filename": "要儲存的檔名",
|
|
518
|
+
"slash.option.save_force": "檔案存在時覆寫",
|
|
519
|
+
"slash.option.load_filename": "要載入的檔名",
|
|
520
|
+
"chat.usage": "用法:`/chat <訊息>`",
|
|
521
|
+
"filename.invalid": "⛔ 檔名無效 — 只允許字母、數字、點、連字號、底線。",
|
|
522
|
+
"dashboard.disabled": "⛔ /dashboard 已停用 — 未設定 allowed_users",
|
|
523
|
+
"update.disabled": "⛔ /update 已停用 — 未設定 allowed_users",
|
|
524
|
+
"doctor.running": "🩺 執行診斷中...",
|
|
525
|
+
"doctor.no_output": "診斷沒有輸出。",
|
|
526
|
+
"doctor.failed": "診斷失敗。",
|
|
527
|
+
"doctor.cli_missing": "無法執行後端診斷 — PATH 中找不到 agend CLI。",
|
|
528
|
+
"doctor.section.prerequisites": "必要條件",
|
|
529
|
+
"doctor.section.service": "系統服務",
|
|
530
|
+
"doctor.section.fleet": "Fleet",
|
|
531
|
+
"doctor.section.ipc": "MCP IPC",
|
|
532
|
+
"doctor.config_invalid": "無效:{0}",
|
|
533
|
+
"doctor.backend_label": "後端 {0}",
|
|
534
|
+
"doctor.backend_unknown": "未知後端",
|
|
535
|
+
"doctor.binary_available": "可使用 {0}",
|
|
536
|
+
"doctor.binary_missing": "找不到 {0}",
|
|
537
|
+
"doctor.not_found": "找不到",
|
|
538
|
+
"doctor.term_unset": "未設定 — TUI 顯示可能失敗",
|
|
539
|
+
"doctor.service_none": "找不到 AgEnD 系統服務 — 請執行:agend install",
|
|
540
|
+
"doctor.manager_user_unavailable": "未知 — 無法連線 systemd --user(常見於沒有 user D-Bus session 的 SSH 環境)",
|
|
541
|
+
"doctor.manager_unavailable": "未知(無法連線服務管理器)",
|
|
542
|
+
"doctor.service_installed": "已安裝",
|
|
543
|
+
"doctor.service_enabled": "已啟用",
|
|
544
|
+
"doctor.service_active": "執行狀態",
|
|
545
|
+
"doctor.yes": "是",
|
|
546
|
+
"doctor.no_install": "否 — 請執行:agend install",
|
|
547
|
+
"doctor.service_running": "執行中",
|
|
548
|
+
"doctor.inactive_start": "未執行 — 請執行:agend start",
|
|
549
|
+
"doctor.dbus_set": "已設定 DBUS_SESSION_BUS_ADDRESS",
|
|
550
|
+
"doctor.dbus_unset": "未設定 DBUS_SESSION_BUS_ADDRESS — systemd --user 可能無法運作",
|
|
551
|
+
"doctor.fleet_process": "Fleet process",
|
|
552
|
+
"doctor.pid_missing": "找不到 fleet.pid — Fleet 未在執行",
|
|
553
|
+
"doctor.pid_invalid": "fleet.pid 無效",
|
|
554
|
+
"doctor.pid_stale": "PID {0} 已不存在(fleet.pid 已過期)",
|
|
555
|
+
"doctor.pid_alive": "PID {0} 正在執行",
|
|
556
|
+
"doctor.tmux_session": "tmux session",
|
|
557
|
+
"doctor.session_exists": "{0} 存在",
|
|
558
|
+
"doctor.session_missing": "找不到 {0}",
|
|
559
|
+
"doctor.instances": "Instances",
|
|
560
|
+
"doctor.config_missing": "在 {0} 找不到 fleet.yaml",
|
|
561
|
+
"doctor.instance_counts": "執行中 {0}、已暫停 {1}、已停止 {2}、已崩潰 {3}(共 {4})",
|
|
562
|
+
"doctor.ipc_ok": "{0}/{1} 個執行中 instance socket 可連線",
|
|
563
|
+
"doctor.ipc_failed": "{0}/{1} 可連線;失敗:{2}",
|
|
564
|
+
"doctor.title": "AgEnD 診斷",
|
|
565
|
+
"doctor.complete": "診斷完成({0} 個警告)",
|
|
566
|
+
"doctor.errors": "診斷發現 {0} 個錯誤({1} 個警告)",
|
|
567
|
+
"install.description": "安裝並啟動 AgEnD 系統服務",
|
|
568
|
+
"install.path": "系統服務已安裝於:{0}",
|
|
569
|
+
"install.running": "✅ Fleet 系統服務已安裝並啟動。",
|
|
570
|
+
"install.start_failed": "❌ Fleet 系統服務已安裝,但無法啟動:{0}",
|
|
571
|
+
"install.updated": "系統服務檔案已更新(未啟用)。",
|
|
572
|
+
"uninstall.description": "移除 AgEnD 系統服務",
|
|
573
|
+
"uninstall.force_help": "略過確認(供 CI/自動化使用)",
|
|
574
|
+
"uninstall.none": "找不到 AgEnD 系統服務。",
|
|
575
|
+
"uninstall.found": "找到 AgEnD 系統服務:",
|
|
576
|
+
"uninstall.manager": "管理器:{0}",
|
|
577
|
+
"uninstall.path": "路徑:{0}",
|
|
578
|
+
"uninstall.enabled": "已啟用:{0}",
|
|
579
|
+
"uninstall.active": "執行狀態:{0}",
|
|
580
|
+
"uninstall.unknown": "未知",
|
|
581
|
+
"uninstall.yes": "是",
|
|
582
|
+
"uninstall.no": "否",
|
|
583
|
+
"uninstall.running": "執行中",
|
|
584
|
+
"uninstall.inactive": "未執行",
|
|
585
|
+
"uninstall.non_interactive": "目前不是互動式終端;請加上 --force 後重試。",
|
|
586
|
+
"uninstall.confirm": "確定移除系統服務嗎?[Y/n] ",
|
|
587
|
+
"uninstall.cancelled_force": "已取消移除。非互動式環境請加上 --force 後重試。",
|
|
588
|
+
"uninstall.cancelled": "已取消移除系統服務。",
|
|
589
|
+
"uninstall.removed": "系統服務已停用、停止並移除。",
|
|
590
|
+
"uninstall.failed": "移除系統服務失敗:{0}",
|
|
591
|
+
"usage.failed": "⚠️ 取得用量失敗:{0}",
|
|
592
|
+
"general.pause_forbidden": "General 不能被暫停。",
|
|
593
|
+
"compact.sent": "🗜️ 已送出壓縮指令(`{0}`)。",
|
|
594
|
+
"compact.not_connected": "❌ Instance 未連線(IPC 不可用)",
|
|
595
|
+
"save.unsupported": "⚠️ 此後端不支援 /save(僅 Kiro CLI 與 Claude Code 支援)。",
|
|
596
|
+
"save.not_connected": "❌ Instance 未連線(IPC 不可用)",
|
|
597
|
+
"clear.unsupported": "⚠️ 此後端不支援清空對話。",
|
|
598
|
+
"model.usage": "用法:/model <名稱> — 例如 /model sonnet",
|
|
599
|
+
"model.list_unavailable": "無法取得 {0} 的模型清單。可直接用 `/model <名稱>` 設定。",
|
|
600
|
+
"model.menu": "目前模型:{0}\n請選擇新模型:",
|
|
601
|
+
"model.selection_expired": "⏰ 模型選擇已逾時。",
|
|
602
|
+
"model.switching": "⏳ 正在將 {0} 切換到 `{1}`…",
|
|
603
|
+
"model.switch_failed": "切換至模型 `{0}` 失敗:{1}",
|
|
604
|
+
"model.pattern_warning": "⚠️ \"{0}\" 不符合 {1} 常見的模型名稱格式 — 仍會原樣傳給 CLI。\n",
|
|
605
|
+
"model.persist_failed": "❌ 無法設定 {0} 的模型。",
|
|
606
|
+
"model.runtime_success": "✅ 已即時將 {0} 切換到 `{1}`。",
|
|
607
|
+
"model.restart_success": "✅ 已將 {0} 設為 `{1}` 並重啟。",
|
|
608
|
+
"effort.unsupported": "❌ {0} 沒有推理強度設定。",
|
|
609
|
+
"effort.usage": "用法:/effort <{0}>",
|
|
610
|
+
"effort.menu": "{0}\n請選擇新的推理強度:",
|
|
611
|
+
"effort.selection_expired": "⏰ 推理強度選擇已逾時。",
|
|
612
|
+
"effort.setting": "⏳ 正在將 {0} 的推理強度設為 `{1}`…",
|
|
613
|
+
"effort.switch_failed": "切換至推理強度 `{0}` 失敗:{1}",
|
|
614
|
+
"effort.unknown": "❌ 未知的推理強度 `{0}`。可用值:{1}。",
|
|
615
|
+
"effort.no_canonical": "❌ {0} 不接受任何標準推理強度。",
|
|
616
|
+
"effort.clamped": "⚠️ 已調整為 `{0}`({2} 不支援 `{1}`)。\n",
|
|
617
|
+
"effort.not_running": "❌ {0} 未在執行。",
|
|
618
|
+
"effort.runtime_success": "✅ 已即時將 {0} 的推理強度設為 `{1}`。",
|
|
619
|
+
"effort.restart_success": "✅ 已將 {0} 的推理強度設為 `{1}` 並重啟。",
|
|
620
|
+
"effort.current_default": "目前推理強度:(CLI 預設)",
|
|
621
|
+
"effort.current_fleet": "目前推理強度:{0}(Fleet 預設)",
|
|
622
|
+
"effort.current": "目前推理強度:{0}",
|
|
623
|
+
"status.no_config": "尚未載入 Fleet 設定。",
|
|
624
|
+
"status.no_instances": "尚未設定任何 instance。",
|
|
625
|
+
"status.title": "Fleet 狀態",
|
|
626
|
+
"status.table_header": "| Instance | 後端 | 上下文 | 推理強度 | 花費 | 狀態 | 執行狀態 | IPC |",
|
|
627
|
+
"status.paused_count": "已暫停 instances:{0}",
|
|
628
|
+
"status.daily_cost": "Fleet:{0} / {1}(每日)",
|
|
629
|
+
"status.adapters": "Adapters:",
|
|
630
|
+
"state.idle": "閒置",
|
|
631
|
+
"state.working": "工作中",
|
|
632
|
+
"state.stuck": "可能卡住",
|
|
633
|
+
"state.paused": "已暫停",
|
|
634
|
+
"sysinfo.title": "系統資訊",
|
|
635
|
+
"sysinfo.metric": "項目",
|
|
636
|
+
"sysinfo.value": "數值",
|
|
637
|
+
"sysinfo.uptime": "運行時間",
|
|
638
|
+
"sysinfo.memory": "記憶體",
|
|
639
|
+
"sysinfo.heap": "Heap",
|
|
640
|
+
"topic.unbound": "此 topic/thread/channel 尚未綁定 instance。請 General 使用 create_instance 建立。",
|
|
641
|
+
"rate_limit.five_hour": "⚠️ {0} 的 5 小時用量已達 {1}%。回覆可能變慢。",
|
|
642
|
+
"rate_limit.weekly": "⚠️ {0} 的每週用量已達 {1}%。回覆可能變慢或失敗。",
|
|
643
|
+
"failover.triggered": "⚡ Rate limit {0}% — 下次輪替將使用 {1}(原為 {2})。",
|
|
644
|
+
"failover.recovered": "✅ Rate limit 已恢復({0}%)— 下次輪替將使用 {1}。",
|
|
645
|
+
"adapter.start_failed": "⚠️ Adapter「{0}」啟動失敗:{1}\n將在背景重試;其他 adapters 不受影響。",
|
|
646
|
+
"adapter.reconnected": "✅ Adapter「{0}」已在 {1} 次嘗試後重新連線。",
|
|
647
|
+
"general.antigravity_unsupported": "⚠️ Antigravity 無法接收 MCP instructions,因此不支援 General instance。請改用 Claude Code 或 Kiro CLI。",
|
|
648
|
+
"classic.manager_unavailable": "Classic channel manager 尚未初始化。",
|
|
649
|
+
"fleet.reload_failed": "⚠️ 重新載入 fleet.yaml 失敗 — {0}\n目前仍使用先前的設定。",
|
|
650
|
+
"fleet.reload_rejected": "⚠️ 已拒絕重新載入 fleet.yaml — {0}\n目前仍使用先前的設定。",
|
|
651
|
+
"fleet.reload_validation": "驗證失敗:\n{0}",
|
|
652
|
+
"fleet.reload_removed_all": "這會移除所有 instance({0} → 0)",
|
|
653
|
+
"fleet.reload_removed_half": "這會移除超過一半的 instance({0} → {1})",
|
|
654
|
+
"fleet.error_suppressed": "(過去 {1} 分鐘內另有 {0} 次)",
|
|
655
|
+
"dashboard.port_in_use": "⚠️ 儀表板無法使用 — health port {0} 已被占用。請停止衝突的 process,或設定其他 health_port。",
|
|
656
|
+
"dashboard.server_failed": "⚠️ 儀表板無法使用 — health server 失敗:{0}",
|
|
657
|
+
"save.usage": "用法:/save <檔名>",
|
|
658
|
+
"save.sent": "✅ 已送出 `{0}` 給 {1}",
|
|
659
|
+
"classic.not_allowed_user": "⛔ 你不在允許使用者清單中。",
|
|
660
|
+
"classic.access_requested": "⏳ 已送出存取請求,等待管理員核准。",
|
|
661
|
+
"classic.admin_only_start": "⛔ 只有管理員能啟動 Agent。請找管理員 /start。",
|
|
662
|
+
"classic.admin_only_stop": "⛔ 只有管理員能停止 Agent。",
|
|
663
|
+
"cmd.admin_required": "⛔ {0} 需要管理員權限。",
|
|
664
|
+
"collab.on": "🤝 協作模式開啟 — bot/webhook 訊息會傳到 Agent。",
|
|
665
|
+
"collab.off": "💬 協作模式關閉",
|
|
666
|
+
"collab.on.classic": "🤝 協作模式開啟 — @mention 此 bot 觸發 Agent,其他 bot 訊息可見。",
|
|
667
|
+
"collab.off.classic": "💬 協作模式關閉 — 用 /chat 對話。",
|
|
668
|
+
};
|
|
15
669
|
const messages = {
|
|
16
|
-
en:
|
|
17
|
-
|
|
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.steer": "Interject into the agent's current task",
|
|
145
|
-
"steer.usage": "Usage: /steer <message> — interjects into the running turn",
|
|
146
|
-
"steer.sent": "🎯 Steering message sent to {0} (lands mid-turn; falls back to the queue if the CLI can't take busy input).",
|
|
147
|
-
"steer.not_connected": "❌ Instance not connected (IPC unavailable)",
|
|
148
|
-
"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.",
|
|
149
|
-
"slash.clear": "Clear agent conversation context",
|
|
150
|
-
"slash.save": "Save the agent's conversation",
|
|
151
|
-
"slash.load": "Load a saved conversation",
|
|
152
|
-
"slash.collab": "Toggle bot/webhook collaboration mode",
|
|
153
|
-
"slash.status": "Fleet status, per-instance costs and health (admin only)",
|
|
154
|
-
"slash.sysinfo": "System diagnostics",
|
|
155
|
-
"slash.restart": "Graceful restart all instances",
|
|
156
|
-
"slash.update": "Update AgEnD to latest version",
|
|
157
|
-
"slash.doctor": "Run health diagnostics",
|
|
158
|
-
"slash.usage": "AI subscription usage",
|
|
159
|
-
"slash.effort": "Set reasoning effort (admin only)",
|
|
160
|
-
"chat.usage": "Usage: `/chat <message>`",
|
|
161
|
-
"filename.invalid": "⛔ Invalid filename — only letters, numbers, dots, hyphens, underscores allowed.",
|
|
162
|
-
"dashboard.disabled": "⛔ /dashboard disabled — no allowed_users configured",
|
|
163
|
-
"update.disabled": "⛔ /update disabled — no allowed_users configured",
|
|
164
|
-
"doctor.running": "🩺 Running diagnostics...",
|
|
165
|
-
"save.usage": "Usage: /save <filename>",
|
|
166
|
-
"save.sent": "✅ Sent `{0}` to {1}",
|
|
167
|
-
"classic.not_allowed_user": "⛔ You are not in the allowed users list.",
|
|
168
|
-
"classic.access_requested": "⏳ Access requested. Waiting for admin approval.",
|
|
169
|
-
"classic.admin_only_start": "⛔ Only admins can start agents. Ask an admin to /start.",
|
|
170
|
-
"classic.admin_only_stop": "⛔ Only admins can stop agents.",
|
|
171
|
-
"cmd.admin_required": "⛔ {0} requires admin access.",
|
|
172
|
-
"collab.on": "🤝 Collaboration mode ON — bot/webhook messages reach the agent.",
|
|
173
|
-
"collab.off": "💬 Collaboration mode OFF",
|
|
174
|
-
"collab.on.classic": "🤝 Collaboration mode ON — @mention this bot to trigger the agent. Other bot messages are visible.",
|
|
175
|
-
"collab.off.classic": "💬 Collaboration mode OFF — use /chat to talk to the agent.",
|
|
176
|
-
},
|
|
177
|
-
"zh-TW": {
|
|
178
|
-
"cancel.button": "🛑 取消",
|
|
179
|
-
"cancel.sent": "🛑 已送出取消給 {0}。",
|
|
180
|
-
"cancel.not_running": "❌ {0} 未在執行。",
|
|
181
|
-
"cancel.button_stale": "⚠️ 這顆按鈕已失效 — {0} 沒有在執行。每一輪都會有新的按鈕。",
|
|
182
|
-
"clear.confirm_message": "⚠️ 確定要清空 {0} 的對話記錄嗎?此操作不可逆。",
|
|
183
|
-
"clear.confirm": "✅ 確認清空",
|
|
184
|
-
"clear.cancel": "❌ 取消",
|
|
185
|
-
"clear.confirm_posted": "已在此頻道送出確認按鈕。",
|
|
186
|
-
"clear.clearing": "🧹 正在清空 {0} 的對話記錄...",
|
|
187
|
-
"clear.sent": "🧹 已送出清空指令(`{0}`)。",
|
|
188
|
-
"clear.cancelled": "❌ 已取消清空 {0}。",
|
|
189
|
-
"clear.expired": "⌛ {0} 的清空確認已逾時。",
|
|
190
|
-
"clear.not_connected": "❌ Instance 未連線(IPC unavailable)",
|
|
191
|
-
"clear.prompt_unavailable": "❌ 無法送出清空確認,請再試一次。",
|
|
192
|
-
"clear.failed": "❌ 清空 {0} 失敗:{1}",
|
|
193
|
-
"ctx.used": "📊 Context:{0}% 已用",
|
|
194
|
-
"ctx.backend": "後端:{0}",
|
|
195
|
-
"ctx.model": "Model:{0}",
|
|
196
|
-
"ctx.instance": "Agent:{0}",
|
|
197
|
-
"ctx.unavailable": "Context 資訊尚未可用。",
|
|
198
|
-
"classic.already_active": "此頻道已有活動中的 Agent。請用 /chat 對話。",
|
|
199
|
-
"classic.topic_bound": "此頻道已綁定到 topic 模式的 instance。",
|
|
200
|
-
"classic.not_authorized_guild": "⛔ 此伺服器不在允許清單中。",
|
|
201
|
-
"classic.no_agent": "此頻道沒有活動中的 Agent。",
|
|
202
|
-
"classic.no_agent_start": "此頻道沒有活動中的 Agent。請先用 /start。",
|
|
203
|
-
"classic.started": "✅ Agent 已在此頻道啟動。用 `/chat <訊息>` 或 @mention 對話。",
|
|
204
|
-
"classic.choose_backend": "請選擇此 Agent 的後端:",
|
|
205
|
-
"classic.backend_required": "請在 `/start` 指令中選擇 backend 後重試。若沒有顯示 backend 欄位,請重新整理 Discord 再開啟指令。",
|
|
206
|
-
"classic.selection_expired": "⏰ 選擇逾時。請再次執行 /start。",
|
|
207
|
-
"classic.backend_not_installed": "⚠️ 找不到 {0} CLI(`{1}`)於 PATH。\n安裝:`{2}`\n仍會嘗試啟動…",
|
|
208
|
-
"classic.stopped": "🛑 已停止此頻道的 Agent。",
|
|
209
|
-
"classic.no_agent_here": "此頻道沒有活動中的 Agent。",
|
|
210
|
-
"admin.only": "⛔ 只有管理員能執行此操作。",
|
|
211
|
-
"admin.required": "⛔ 此指令需要管理員權限。",
|
|
212
|
-
"permission.denied": "⛔ 權限不足。",
|
|
213
|
-
"pause.usage": "用法:`/pause <instance-name>`",
|
|
214
|
-
"wake.usage": "用法:`/wake <instance-name>`",
|
|
215
|
-
"pause.success": "⏸ {0} 已暫停。",
|
|
216
|
-
"wake.success": "▶️ {0} 已喚醒。",
|
|
217
|
-
"pause.not_idle": "⚠️ {0} 正忙碌,未暫停。請等待 idle。",
|
|
218
|
-
"pause.failed": "❌ 暫停 {0} 失敗:{1}",
|
|
219
|
-
"wake.failed": "❌ 喚醒 {0} 失敗:{1}",
|
|
220
|
-
"instance.not_found": "❌ 找不到 instance:{0}",
|
|
221
|
-
"not_authorized": "⛔ 未授權",
|
|
222
|
-
"usage.chat": "用法:`/chat <訊息>`",
|
|
223
|
-
"dashboard.title": "📊 AgEnD 儀表板",
|
|
224
|
-
"dashboard.starting": "⏳ 儀表板啟動中,請稍後再試。",
|
|
225
|
-
"update.available": "🆕 AgEnD {0} 可更新!執行:/update",
|
|
226
|
-
"update.highlights": "更新重點:{0}",
|
|
227
|
-
"fleet.ready": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2}",
|
|
228
|
-
"fleet.ready_with_failed": "Fleet 就緒。{0}/{1} 個 Agent 運行中。v{2} | 失敗:{3}",
|
|
229
|
-
"cost.approaching": "⚠️ {0} 花費:{1} / {2}({3}%)",
|
|
230
|
-
"cost.limit_reached": "🛑 {0} 已達每日上限 {1} — 暫停 Agent。",
|
|
231
|
-
"general.start_failed": "⚠️ General Agent「{0}」啟動失敗:\n{1}",
|
|
232
|
-
"alert.unauth_user_private": "🆕 未授權使用者嘗試在私訊 /start:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_users`",
|
|
233
|
-
"alert.start_not_admin": "🔑 使用者想 /start 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
|
|
234
|
-
"alert.stop_not_admin": "🔑 使用者想 /stop 但非管理員:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n• 群組:{3}\n\n核准:把 `{1}` 加到 classicBot.yaml 的 `admin_users`",
|
|
235
|
-
"alert.unauth_guild": "🆕 未授權伺服器嘗試 /start:\n• Guild ID:{0}\n• 使用者:{1}\n• 平台:discord\n\n允許:把 `{0}` 加到 classicBot.yaml 的 `allowed_guilds`",
|
|
236
|
-
"alert.bot_added": "🆕 Bot 被加入新伺服器:\n• 名稱:{0}\n• ID:{1}\n• 平台:{2}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
|
|
237
|
-
"alert.new_group": "🆕 偵測到新群組:\n• 名稱:{0}\n• ID:{1}\n• 使用者:{2}({3})\n• 平台:{4}\n\n允許:把 `{1}` 加到 classicBot.yaml 的 `allowed_guilds`",
|
|
238
|
-
"schedule.deferred": "⏳ 排程「{0}」延後 — rate limit 於 {1}%",
|
|
239
|
-
"restart.full_initiated": "🔄 開始完整重啟 — 等待所有 Agent 閒置後重載程序...",
|
|
240
|
-
"restart.graceful_initiated": "🔄 開始優雅重啟 — 等待所有 Agent 閒置...",
|
|
241
|
-
"inst.crashed_respawned": "⚠️ {0} 已崩潰並重生。",
|
|
242
|
-
"inst.crashed_respawned_log": "⚠️ {0} 已崩潰並重生。詳見 ~/.agend/daemon.log。",
|
|
243
|
-
"inst.restarted_no_context": "⚠️ {0}:已重啟但無 context(snapshot 注入失敗)",
|
|
244
|
-
"inst.respawn_paused": "⚠️ {0} 連續 crash 3+ 次 — 已暫停恢復。檢查 log 或執行 `/wake` 重啟。",
|
|
245
|
-
"inst.recovered": "✅ {0}:{1} 後恢復",
|
|
246
|
-
"inst.root_skip_perms": "⚠️ claude-code 不能以 root 執行 --dangerously-skip-permissions。請設定 IS_SANDBOX=1 或改用非 root 使用者。",
|
|
247
|
-
"inst.notification": "{0} {1}:{2}(動作:{3})",
|
|
248
|
-
"interactive.kind.sudo_password": "sudo 密碼",
|
|
249
|
-
"interactive.kind.password": "密碼",
|
|
250
|
-
"interactive.kind.confirmation": "Y/N 確認",
|
|
251
|
-
"interactive.kind.press_enter": "按 Enter",
|
|
252
|
-
"interactive.general_notice": "⚠️ {0} 正在等待人工輸入({1})。請 General 協助嗎?",
|
|
253
|
-
"interactive.instance_notice": "⚠️ {0} 正在等待人工輸入。請至 General channel 確認處理方式。",
|
|
254
|
-
"interactive.confirm": "確認",
|
|
255
|
-
"interactive.cancel": "取消",
|
|
256
|
-
"interactive.confirmed": "✅ 已請 General 協助處理 {0}。",
|
|
257
|
-
"interactive.ignored": "🚫 已忽略 {0} 的人工輸入提示。",
|
|
258
|
-
"interactive.expired": "⌛ {0} 的人工輸入協助請求已逾時。",
|
|
259
|
-
"interactive.self_assist": "⚠️ {0} 就是 General;阻塞時無法自助。請直接使用 tmux attach。",
|
|
260
|
-
"interactive.delivery_failed": "❌ 無法把 {0} 的協助請求送進 General。",
|
|
261
|
-
"interactive.assist_request": "[system] 已確認協助 {0} 的人工輸入(提示類型:{1})。請查看該 instance 的 tmux pane,向使用者回報正在等待的操作,並在輸入任何內容前取得明確授權。絕不可要求或接受使用者在聊天中傳送密碼;密碼只能由操作員直接在 tmux 輸入。",
|
|
262
|
-
"exit.instance_notice": "🛑 {0} 已停止(正常退出,exit code 0)。管理員可至 General 重新啟動。",
|
|
263
|
-
"exit.general_notice": "🛑 {0} 已停止(正常退出)。要重新啟動嗎?",
|
|
264
|
-
"exit.restart": "重啟",
|
|
265
|
-
"exit.ignore": "忽略",
|
|
266
|
-
"exit.restarting": "🔄 正在重啟 {0}...",
|
|
267
|
-
"exit.restarted": "✅ {0} 已重新啟動。",
|
|
268
|
-
"exit.ignored": "🚫 已忽略 {0} 的重啟提示。",
|
|
269
|
-
"exit.expired": "⌛ {0} 的重啟提示已逾時。",
|
|
270
|
-
"exit.restart_failed": "❌ 無法重啟 {0}:{1}",
|
|
271
|
-
"hang.detected": "⚠️ {0} 可能卡住了 — 畫面已 {1} 分鐘無變化,也偵測不到就緒提示",
|
|
272
|
-
"hang.restart": "🔄 強制重啟",
|
|
273
|
-
"hang.wait": "⏳ 繼續等待",
|
|
274
|
-
"hang.waiting": "⏳ 繼續等待 {0}。",
|
|
275
|
-
"hang.restarting": "🔄 正在重啟 {0}...",
|
|
276
|
-
"hang.restarted": "✅ {0} 已重新啟動。",
|
|
277
|
-
"hang.restart_failed": "❌ 無法重啟 {0}:{1}",
|
|
278
|
-
"hang.expired": "⌛ {0} 的卡住提示已逾時 — 若仍卡住請用 /restart。",
|
|
279
|
-
"buttons.stale": "⌛ 此提示已逾時,無法再操作。",
|
|
280
|
-
"restart.graceful": "🔄 優雅重啟中 — 等待 instances 閒置...",
|
|
281
|
-
"update.running": "📦 正在更新 AgEnD... Fleet 會自動重啟。",
|
|
282
|
-
"update.progress.preparing": "📦 正在更新 AgEnD... ({0}s)",
|
|
283
|
-
"update.progress.downloading": "⬇️ 下載及安裝中... ({0}s)",
|
|
284
|
-
"update.progress.installed": "✅ 安裝完成 — v{0} ({1}s)",
|
|
285
|
-
"update.progress.stopping": "🔄 停止 Fleet... ({0}s)",
|
|
286
|
-
"update.progress.starting": "🚀 啟動 Fleet... ({0}s)",
|
|
287
|
-
"update.progress.instances": "⏳ 啟動中... {0}/{1} instances ({2}s)",
|
|
288
|
-
"update.progress.complete": "✅ Fleet 已重啟 — v{0}, {1}/{2} instances running ({3}s)",
|
|
289
|
-
"update.progress.already_current": "✅ 已是最新版本 — v{0} ({1}s)",
|
|
290
|
-
"update.progress.failed": "❌ 更新在「{0}」階段失敗:{1} ({2}s)",
|
|
291
|
-
"update.stage.preparing": "準備",
|
|
292
|
-
"update.stage.downloading": "下載/安裝",
|
|
293
|
-
"update.stage.installed": "安裝驗證",
|
|
294
|
-
"update.stage.stopping": "停止 Fleet",
|
|
295
|
-
"update.stage.starting": "啟動 Fleet",
|
|
296
|
-
"update.stage.complete": "完成",
|
|
297
|
-
"update.stage.failed": "更新",
|
|
298
|
-
"slash.start": "在此頻道啟動 Agent",
|
|
299
|
-
"slash.stop": "停止此頻道的 Agent",
|
|
300
|
-
"slash.chat": "傳送訊息給 Agent",
|
|
301
|
-
"slash.ctx": "顯示上下文使用量",
|
|
302
|
-
"slash.cancel": "中斷 Agent 目前的動作(送出 Escape)",
|
|
303
|
-
"slash.dashboard": "取得儀表板網址(管理員)",
|
|
304
|
-
"slash.compact": "壓縮 Agent 上下文",
|
|
305
|
-
"slash.steer": "插入指示到 Agent 當前任務",
|
|
306
|
-
"steer.usage": "用法:/steer <訊息> — 插入到進行中的回合",
|
|
307
|
-
"steer.sent": "🎯 已將指示插入 {0} 的當前任務(若 CLI 不接受忙碌輸入會自動改排隊)。",
|
|
308
|
-
"steer.not_connected": "❌ Instance 未連線(IPC 不可用)",
|
|
309
|
-
"steer.unsupported": "⚠️ {0} backend 尚未支援 /steer(其 TUI 無法在回合中接收輸入)。訊息未送出——請改用一般訊息,或先 /cancel。",
|
|
310
|
-
"slash.clear": "清空 Agent 對話上下文",
|
|
311
|
-
"slash.save": "儲存 Agent 對話",
|
|
312
|
-
"slash.load": "載入已儲存的對話",
|
|
313
|
-
"slash.collab": "切換 bot/webhook 協作模式",
|
|
314
|
-
"slash.status": "顯示 Fleet 狀態與花費",
|
|
315
|
-
"slash.sysinfo": "系統診斷",
|
|
316
|
-
"slash.restart": "優雅重啟所有 instances",
|
|
317
|
-
"slash.update": "更新 AgEnD 到最新版",
|
|
318
|
-
"slash.doctor": "執行健康診斷",
|
|
319
|
-
"chat.usage": "用法:`/chat <訊息>`",
|
|
320
|
-
"filename.invalid": "⛔ 檔名無效 — 只允許字母、數字、點、連字號、底線。",
|
|
321
|
-
"dashboard.disabled": "⛔ /dashboard 已停用 — 未設定 allowed_users",
|
|
322
|
-
"update.disabled": "⛔ /update 已停用 — 未設定 allowed_users",
|
|
323
|
-
"doctor.running": "🩺 執行診斷中...",
|
|
324
|
-
"save.usage": "用法:/save <檔名>",
|
|
325
|
-
"save.sent": "✅ 已送出 `{0}` 給 {1}",
|
|
326
|
-
"classic.not_allowed_user": "⛔ 你不在允許使用者清單中。",
|
|
327
|
-
"classic.access_requested": "⏳ 已送出存取請求,等待管理員核准。",
|
|
328
|
-
"classic.admin_only_start": "⛔ 只有管理員能啟動 Agent。請找管理員 /start。",
|
|
329
|
-
"classic.admin_only_stop": "⛔ 只有管理員能停止 Agent。",
|
|
330
|
-
"cmd.admin_required": "⛔ {0} 需要管理員權限。",
|
|
331
|
-
"collab.on": "🤝 協作模式開啟 — bot/webhook 訊息會傳到 Agent。",
|
|
332
|
-
"collab.off": "💬 協作模式關閉",
|
|
333
|
-
"collab.on.classic": "🤝 協作模式開啟 — @mention 此 bot 觸發 Agent,其他 bot 訊息可見。",
|
|
334
|
-
"collab.off.classic": "💬 協作模式關閉 — 用 /chat 對話。",
|
|
335
|
-
},
|
|
670
|
+
en: enMessages,
|
|
671
|
+
"zh-TW": zhTWMessages,
|
|
336
672
|
};
|
|
337
673
|
/** Translate a key with {0},{1},… positional args, using the active locale. */
|
|
338
674
|
export function t(key, ...args) {
|