cli-wechat-bridge 1.2.1 → 1.2.3
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/README.md +146 -73
- package/README_EN.md +544 -0
- package/bin/telegram-check-update.mjs +10 -0
- package/bin/telegram-claude.mjs +10 -0
- package/bin/telegram-codex.mjs +10 -0
- package/bin/telegram-daemon.mjs +10 -0
- package/bin/telegram-opencode.mjs +10 -0
- package/bin/telegram-pi.mjs +10 -0
- package/bin/telegram-setup.mjs +10 -0
- package/dist/bridge/adapter-control.js +19 -12
- package/dist/bridge/bridge-adapters.claude.js +219 -115
- package/dist/bridge/bridge-adapters.codex.js +532 -99
- package/dist/bridge/bridge-adapters.core.js +84 -7
- package/dist/bridge/bridge-adapters.opencode.js +202 -55
- package/dist/bridge/bridge-adapters.pi.js +23 -18
- package/dist/bridge/bridge-adapters.shared.js +9 -9
- package/dist/bridge/bridge-session-resume.js +13 -6
- package/dist/bridge/bridge-state.js +3 -1
- package/dist/bridge/bridge-utils.js +94 -144
- package/dist/bridge/claude-hooks.js +60 -3
- package/dist/bridge/claude-native-controls.js +19 -12
- package/dist/bridge/language-control.js +33 -0
- package/dist/bridge/native-terminal-control.js +26 -10
- package/dist/bridge/opencode-v2-compat.js +11 -3
- package/dist/bridge/wechat-bridge.js +154 -72
- package/dist/channels/channel-driver-factory.js +56 -0
- package/dist/channels/local/local-channel-port.js +40 -0
- package/dist/channels/local/local-driver.js +217 -0
- package/dist/channels/telegram/setup-cli.js +12 -0
- package/dist/channels/telegram/setup.js +163 -0
- package/dist/channels/telegram/telegram-channel-port.js +47 -0
- package/dist/channels/telegram/telegram-config.js +66 -0
- package/dist/channels/telegram/telegram-driver.js +106 -0
- package/dist/channels/telegram/telegram-message.js +41 -0
- package/dist/channels/telegram/telegram-transport.js +378 -0
- package/dist/channels/wechat/wechat-driver.js +11 -2
- package/dist/channels/wecom/wecom-driver.js +8 -1
- package/dist/companion/local-companion-start.js +180 -61
- package/dist/companion/local-companion.js +27 -7
- package/dist/companion/pi-tui-bridge-extension.js +10 -4
- package/dist/core/bridge-control.js +3 -0
- package/dist/core/bridge-defer.js +3 -2
- package/dist/core/bridge-event-forwarder.js +3 -0
- package/dist/core/channel-types.js +13 -1
- package/dist/daemon/wechat-daemon.js +239 -126
- package/dist/i18n/index.js +25 -11
- package/dist/i18n/messages-en.js +245 -1
- package/dist/i18n/messages-zh.js +245 -1
- package/dist/runtime/legacy-adapter-runtime.js +7 -4
- package/dist/wechat/channel-config.js +3 -2
- package/package.json +17 -5
- package/skills/codex-bridge/SKILL.md +35 -0
- package/skills/codex-bridge/agents/openai.yaml +4 -0
- package/skills/codex-bridge/scripts/install.mjs +28 -0
package/dist/i18n/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// This file is part of CLI-WeChat-Bridge. Modifications and derivative works
|
|
5
5
|
// must be released under AGPL-3.0-or-later with full source code; see
|
|
6
6
|
// LICENSE.txt. Network services built on it must offer source to users.
|
|
7
|
+
import fs from "node:fs";
|
|
7
8
|
import { messages as zhMessages } from "./messages-zh.js";
|
|
8
9
|
import { messages as enMessages } from "./messages-en.js";
|
|
9
10
|
const catalogs = {
|
|
@@ -11,25 +12,38 @@ const catalogs = {
|
|
|
11
12
|
en: enMessages,
|
|
12
13
|
};
|
|
13
14
|
let currentLocale = "zh";
|
|
14
|
-
export function
|
|
15
|
-
currentLocale
|
|
15
|
+
export function getLocale() {
|
|
16
|
+
return currentLocale;
|
|
16
17
|
}
|
|
17
|
-
export function
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
export function parseLocale(value) {
|
|
19
|
+
if (typeof value !== "string")
|
|
20
|
+
return null;
|
|
21
|
+
const normalized = value.trim().toLowerCase();
|
|
22
|
+
if (["en", "english", "英文"].includes(normalized))
|
|
23
|
+
return "en";
|
|
24
|
+
if (["zh", "chinese", "中文"].includes(normalized))
|
|
25
|
+
return "zh";
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
export function readLocalePreference(filePath) {
|
|
29
|
+
try {
|
|
30
|
+
return parseLocale(JSON.parse(fs.readFileSync(filePath, "utf8"))?.locale);
|
|
21
31
|
}
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
24
34
|
}
|
|
25
35
|
}
|
|
36
|
+
export function setLocale(locale) {
|
|
37
|
+
currentLocale = locale;
|
|
38
|
+
}
|
|
39
|
+
export function initLocaleFromEnv(env = process.env, fallback = "zh") {
|
|
40
|
+
currentLocale = parseLocale(env.CLI_BRIDGE_LANG) ?? fallback;
|
|
41
|
+
}
|
|
26
42
|
export function t(key, params) {
|
|
27
43
|
const catalog = catalogs[currentLocale];
|
|
28
44
|
let message = catalog[key] ?? catalogs.en[key] ?? key;
|
|
29
45
|
if (params) {
|
|
30
|
-
|
|
31
|
-
message = message.replaceAll(`{${name}}`, String(value));
|
|
32
|
-
}
|
|
46
|
+
message = message.replace(/\{(\w+)\}/g, (token, name) => Object.hasOwn(params, name) ? String(params[name]) : token);
|
|
33
47
|
}
|
|
34
48
|
return message;
|
|
35
49
|
}
|
package/dist/i18n/messages-en.js
CHANGED
|
@@ -5,6 +5,83 @@
|
|
|
5
5
|
// must be released under AGPL-3.0-or-later with full source code; see
|
|
6
6
|
// LICENSE.txt. Network services built on it must offer source to users.
|
|
7
7
|
export const messages = {
|
|
8
|
+
"bridge.deferred": "Queued for delivery after the current local Codex turn finishes. Queue position: {position}.",
|
|
9
|
+
"approval.codex.command": "Codex needs approval before running a command.",
|
|
10
|
+
"approval.codex.commandReason": "Codex needs approval before running a command: {reason}",
|
|
11
|
+
"approval.codex.file": "Codex needs approval before applying a file change.",
|
|
12
|
+
"approval.codex.fileReason": "Codex needs approval before applying a file change: {reason}",
|
|
13
|
+
"approval.codex.permissions": "Codex needs approval before granting extra permissions.",
|
|
14
|
+
"approval.codex.permissionsReason": "Codex needs approval before granting extra permissions: {reason}",
|
|
15
|
+
"approval.codex.commandPreview": "Command execution approval requested.",
|
|
16
|
+
"approval.codex.filePreview": "File change approval requested.",
|
|
17
|
+
"approval.claude.summary": "Claude permission is required for {tool}.",
|
|
18
|
+
"approval.label.plan": "plan",
|
|
19
|
+
"approval.label.command": "command",
|
|
20
|
+
"approval.label.path": "path",
|
|
21
|
+
"approval.label.pattern": "pattern",
|
|
22
|
+
"approval.label.url": "url",
|
|
23
|
+
"task.interrupted": "Interrupted",
|
|
24
|
+
"adapter.codex.modelUnavailable": "Codex model {model} is not available.",
|
|
25
|
+
"adapter.pi.localSwitchInterrupted": "The active WeChat task was interrupted because the local Pi terminal switched sessions.",
|
|
26
|
+
"adapter.pi.extensionDisconnected": "The native Pi TUI bridge extension disconnected and did not reconnect.",
|
|
27
|
+
"adapter.claude.controlsIdle": "Claude must be idle with no pending approval before using remote controls.",
|
|
28
|
+
"adapter.claude.controlActive": "A Claude control operation is in progress.",
|
|
29
|
+
"adapter.claude.notRunning": "claude adapter is not running.",
|
|
30
|
+
"adapter.claude.busy": "claude is still working. Wait for the current reply or use /stop.",
|
|
31
|
+
"adapter.claude.approvalPending": "A Claude approval request is pending. Reply with /confirm or /deny.",
|
|
32
|
+
"adapter.claude.inputPending": "Claude is waiting for answers. Reply with /answer or use /stop.",
|
|
33
|
+
"adapter.claude.sessionControlActive": "A CLI control operation is in progress. Wait for it to finish before switching sessions.",
|
|
34
|
+
"adapter.claude.notReady": "Claude is not running yet.",
|
|
35
|
+
"adapter.claude.switching": "Claude is already switching sessions.",
|
|
36
|
+
"adapter.claude.switchBusy": "Claude is still working. Wait for the current reply or use /stop.",
|
|
37
|
+
"adapter.claude.approvalLocal": "Remote approval is not safely available for this Claude prompt. Approve it in the local Claude terminal.",
|
|
38
|
+
"adapter.codex.notRunning": "codex adapter is not running.",
|
|
39
|
+
"adapter.codex.panelNotRunning": "codex panel is not running.",
|
|
40
|
+
"adapter.codex.busy": "codex is still working. Wait for the current reply or use /stop.",
|
|
41
|
+
"adapter.codex.localBusy": "The local Codex panel is still working. Wait for the current reply or use /stop.",
|
|
42
|
+
"adapter.codex.approvalPending": "A Codex approval request is pending. Reply with /confirm or /deny.",
|
|
43
|
+
"adapter.codex.localInputPending": "Codex is waiting for local terminal input before the session can continue.",
|
|
44
|
+
"adapter.codex.inputPending": "Codex is waiting for user input. Reply with /answer and your response, or use /stop.",
|
|
45
|
+
"adapter.codex.inputPendingShort": "Codex is waiting for user input. Reply with /answer or use /stop.",
|
|
46
|
+
"adapter.codex.modelThreadRequired": "Codex model selection requires an active app-server thread.",
|
|
47
|
+
"adapter.codex.planThreadRequired": "Codex plan mode requires an active app-server thread.",
|
|
48
|
+
"adapter.codex.planUnavailable": "Codex plan mode is not available in this app-server.",
|
|
49
|
+
"adapter.codex.modelMissing": "Codex did not return the current thread model.",
|
|
50
|
+
"adapter.codex.switching": "Codex is already switching visible threads.",
|
|
51
|
+
"adapter.opencode.modelUnavailable": "This OpenCode model is no longer available. Send /model again.",
|
|
52
|
+
"adapter.opencode.modelUnconfirmed": "OpenCode did not confirm the selected model.",
|
|
53
|
+
"adapter.opencode.planUnavailable": "OpenCode primary agent 'plan' is not available.",
|
|
54
|
+
"adapter.opencode.agentsMissing": "OpenCode did not return any primary agents.",
|
|
55
|
+
"adapter.opencode.planReplacementMissing": "OpenCode did not return an agent that can replace plan mode.",
|
|
56
|
+
"adapter.opencode.agentUnconfirmed": "OpenCode did not confirm the selected agent.",
|
|
57
|
+
"adapter.opencode.notRunning": "OpenCode is not running.",
|
|
58
|
+
"adapter.opencode.adapterNotRunning": "OpenCode adapter is not running.",
|
|
59
|
+
"adapter.opencode.notReady": "OpenCode is not running yet.",
|
|
60
|
+
"adapter.opencode.busy": "OpenCode is still working. Wait for the current reply or use /stop.",
|
|
61
|
+
"adapter.opencode.approvalPending": "An OpenCode approval request is pending. Reply with /confirm or /deny.",
|
|
62
|
+
"adapter.opencode.inputPending": "OpenCode is waiting for user input. Reply with /answer or use /stop.",
|
|
63
|
+
"adapter.pi.busy": "Pi is still working. Wait for the current reply or use /stop.",
|
|
64
|
+
"adapter.pi.switchBusy": "Pi is still working. Stop the current turn before switching sessions.",
|
|
65
|
+
"adapter.pi.switchCancelled": "Pi session switch was cancelled by an extension.",
|
|
66
|
+
"adapter.pi.createBusy": "Pi is still working. Stop the current turn before creating a session.",
|
|
67
|
+
"adapter.pi.createCancelled": "Pi session creation was cancelled by an extension.",
|
|
68
|
+
"adapter.pi.listModelsBusy": "Pi is still working. Wait for the current turn before listing models.",
|
|
69
|
+
"adapter.pi.invalidModels": "Pi TUI returned an invalid model list.",
|
|
70
|
+
"adapter.pi.selectModelBusy": "Pi is still working. Wait for the current turn before switching models.",
|
|
71
|
+
"adapter.pi.invalidModel": "Pi TUI returned an invalid selected model.",
|
|
72
|
+
"adapter.pi.disconnected": "Native Pi TUI is not connected to the WeChat bridge.",
|
|
73
|
+
"companion.modelsUnsupported": "Model listing is not supported by this companion.",
|
|
74
|
+
"companion.modelUnsupported": "Model selection is not supported by this companion.",
|
|
75
|
+
"companion.planUnsupported": "Plan mode is not supported by this companion.",
|
|
76
|
+
"channel.unauthorized": "Unauthorized.",
|
|
77
|
+
"native.control.inactive": "No terminal control operation is active.",
|
|
78
|
+
"native.control.sessionChanged": "The active CLI session changed during control. Try again.",
|
|
79
|
+
"native.control.timeout": "Native CLI control timed out; the result could not be confirmed.",
|
|
80
|
+
"native.control.busy": "Another CLI control operation is in progress.",
|
|
81
|
+
"native.control.draft": "The local terminal has an input draft. Submit or clear it before using remote controls.",
|
|
82
|
+
"native.control.invalid": "Invalid native control command.",
|
|
83
|
+
"native.control.menuOpen": "A native CLI menu is already open. Close it before using remote controls.",
|
|
84
|
+
"native.control.selectorChanged": "The native selector changed unexpectedly.",
|
|
8
85
|
// === Bridge welcome & control ===
|
|
9
86
|
"bridge.welcome": "WeChat Bridge ready ({adapter}).\nCWD: {cwd}",
|
|
10
87
|
"bridge.stopped": "Bridge stopped.",
|
|
@@ -17,7 +94,7 @@ export const messages = {
|
|
|
17
94
|
"bridge.fatalError": "Bridge error: {message}",
|
|
18
95
|
"bridge.backlogIgnored": "Ignored {count} backlog message(s) sent before the bridge started (they will not be processed).\nIf you actually sent them after the bridge started, your system clock is likely skewed by more than {graceSeconds}s — sync the clock and restart the bridge.",
|
|
19
96
|
// === Daemon welcome & control ===
|
|
20
|
-
"daemon.welcome": "
|
|
97
|
+
"daemon.welcome": "{channel} Daemon ready.\nCWD: {cwd}\nActive: {adapter}\n\nCommands: /claude, /codex, /opencode, /pi, /stop, /confirm, /deny, /status, /lang [zh|en], /model, /plan, /all <prompt>\n{bindings}\n\nManage: /bind [emoji] cmd, /unbind [emoji], /bindings",
|
|
21
98
|
"daemon.noActiveAdapter": "No active terminal is selected. Send /codex, /claude, /opencode, or /pi to start one.",
|
|
22
99
|
"daemon.switchResult.new": "Started a new visible CLI.",
|
|
23
100
|
"daemon.switchResult.reused": "Reused the existing visible CLI.",
|
|
@@ -139,4 +216,171 @@ export const messages = {
|
|
|
139
216
|
"doctor.endpoint.issue.companionDead": "companion pid={pid} is dead",
|
|
140
217
|
"doctor.endpoint.issue.workerStatus": "visible worker status={status}",
|
|
141
218
|
"doctor.endpoint.issue.instanceMismatch": "endpoint instanceId does not match bridge lock instanceId",
|
|
219
|
+
// Shared controls and channel replies
|
|
220
|
+
"language.current": "Current language: {locale}. Use /lang zh or /lang en to switch.",
|
|
221
|
+
"language.usage": "Usage: /lang zh or /lang en. Send /lang to check the current language.",
|
|
222
|
+
"language.changed": "Language switched to {locale}.",
|
|
223
|
+
"language.saveFailed": "Could not save the language setting: {error}",
|
|
224
|
+
"language.companionRestart": "Some visible CLI clients could not update their bridge language. Restart those clients to synchronize it.",
|
|
225
|
+
"control.plan.unavailable": "Plan mode is not available for {name}.",
|
|
226
|
+
"control.plan.enabled": "{name} plan mode enabled. Send /plan off to restore the previous mode.",
|
|
227
|
+
"control.plan.disabled": "{name} plan mode disabled.",
|
|
228
|
+
"control.model.unavailable": "Model selection is not available for {name}.",
|
|
229
|
+
"control.model.sessionChanged": "The active session changed. Send /model again.",
|
|
230
|
+
"control.model.empty": "{name} did not return any available models.",
|
|
231
|
+
"control.model.header": "Available {name} models:",
|
|
232
|
+
"control.model.current": " (current)",
|
|
233
|
+
"control.model.instructions": "Reply with /model <number> to switch. The list is valid for 5 minutes.",
|
|
234
|
+
"control.model.expired": "The model list has expired or belongs to another session. Send /model again.",
|
|
235
|
+
"control.model.range": "Model selection is outside the displayed range. Send /model again to refresh the list.",
|
|
236
|
+
"control.model.changed": "{name} model switched to {model}.",
|
|
237
|
+
"bridge.unauthorized": "Unauthorized. This {mode} only accepts messages from {operator}.",
|
|
238
|
+
"bridge.mode.bridge": "bridge",
|
|
239
|
+
"bridge.mode.daemon": "daemon",
|
|
240
|
+
"bridge.broadcast.daemonOnly": "/all is only available in daemon mode. Start the daemon with wechat-daemon or wecom-daemon to broadcast to all workers.",
|
|
241
|
+
"bridge.newSession.unavailable": "/new is not available in {adapter} mode.",
|
|
242
|
+
"bridge.interrupt.workerSent": "Interrupt signal sent to the active worker.",
|
|
243
|
+
"bridge.interrupt.workerIdle": "No running worker was available to interrupt.",
|
|
244
|
+
"bridge.approval.applyFailed": "The worker could not apply this approval request.",
|
|
245
|
+
"bridge.approval.denyFailed": "The worker could not deny this approval request cleanly.",
|
|
246
|
+
"bridge.answer.none": "No pending user input request.",
|
|
247
|
+
"bridge.answer.failed": "The worker could not apply this answer.",
|
|
248
|
+
"bridge.answer.sent": "Answer submitted. Continuing...",
|
|
249
|
+
"bridge.input.waiting": "{adapter} is waiting for structured input. Reply with /answer <key>=<value> ...",
|
|
250
|
+
"bridge.busy.remote": "{adapter} is still working. Wait for the current reply or use /stop.",
|
|
251
|
+
"bridge.busy.local": "{adapter} is currently busy with a local terminal turn. Wait for it to finish or use /stop.",
|
|
252
|
+
"session.noun": "session",
|
|
253
|
+
"session.thread": "thread",
|
|
254
|
+
"session.switch.local": "{adapter} {noun} switched to {id} from the local terminal.",
|
|
255
|
+
"session.switch.remote": "{adapter} {noun} switched to {id} from WeChat.",
|
|
256
|
+
"session.switch.restore": "{adapter} restored shared {noun} {id} on startup.",
|
|
257
|
+
"session.switch.generic": "{adapter} {noun} switched to {id}.",
|
|
258
|
+
"session.list.empty": "No saved {adapter} {noun} were found for this working directory.",
|
|
259
|
+
"session.sessions": "sessions",
|
|
260
|
+
"session.threads": "threads",
|
|
261
|
+
"session.list.header": "Recent {adapter} {noun}:",
|
|
262
|
+
"session.list.current": " [current]",
|
|
263
|
+
"session.list.instructions": "Reply with /resume <number> or /resume <unique-id-prefix>.",
|
|
264
|
+
"session.localInput": "Local {adapter} input",
|
|
265
|
+
"session.taskFailed": "{adapter} task failed:\n{text}",
|
|
266
|
+
"session.alreadyActive": "{adapter} {noun} {id} is already active.",
|
|
267
|
+
"session.list.expired": "The recent session list has expired. Send /resume again before choosing a number.",
|
|
268
|
+
"session.list.range": "Resume selection {target} is outside the displayed range. Send /resume again to refresh the list.",
|
|
269
|
+
"session.list.ambiguous": "Session ID prefix {target} is ambiguous. Send /resume again and use a longer ID prefix.",
|
|
270
|
+
"approval.claude.header": "Claude permission request.",
|
|
271
|
+
"approval.cli.header": "CLI approval is required.",
|
|
272
|
+
"approval.tool": "tool",
|
|
273
|
+
"approval.details": "details",
|
|
274
|
+
"approval.adapter": "adapter",
|
|
275
|
+
"approval.summary": "summary",
|
|
276
|
+
"approval.target": "target",
|
|
277
|
+
"approval.confirmInstructions": "Reply with /confirm, confirm, or yes to continue.",
|
|
278
|
+
"approval.denyInstructions": "Reply with /deny, deny, or no to reject.",
|
|
279
|
+
"approval.instructions": "Reply with /confirm or /yes to continue, /deny or /no to reject.",
|
|
280
|
+
"approval.pending.claude": "Approval is pending for {target}. Reply with /confirm, confirm, or yes to continue, or /deny, deny, or no to reject.",
|
|
281
|
+
"approval.pending": "Approval is pending for {target}. Reply with /confirm or /deny.",
|
|
282
|
+
"input.secretWarning": "Warning: this prompt includes secret input upstream, but WeChat replies are not hidden.",
|
|
283
|
+
"input.options": "options:",
|
|
284
|
+
"input.preview": "preview:",
|
|
285
|
+
"input.multiple": "multiple selections: allowed (separate values with commas)",
|
|
286
|
+
"input.customAnswer": "custom answer: allowed",
|
|
287
|
+
"input.customNote": "custom note: allowed",
|
|
288
|
+
"input.answer.multiple": "Reply with /answer <option numbers or exact labels separated by commas>.",
|
|
289
|
+
"input.answer.single": "Reply with /answer <option number or exact label>.",
|
|
290
|
+
"input.answer.custom": "You may enter a custom answer instead of an option.",
|
|
291
|
+
"input.answer.note": "Add \"| your note\" to include extra context.",
|
|
292
|
+
"input.answer.text": "Reply with /answer <your answer>.",
|
|
293
|
+
"input.answer.ordered": "Reply with /answer questionId=value; questionId2=value.",
|
|
294
|
+
"input.answer.numbers": "You can use question numbers instead of ids.",
|
|
295
|
+
"input.answer.optionValue": "For option questions, value can be the option number or exact label.",
|
|
296
|
+
"input.answer.multipleValue": "For multi-select questions, separate option values with commas.",
|
|
297
|
+
"input.answer.optionNote": "Add \"| your note\" after an option answer to include extra context.",
|
|
298
|
+
"input.answer.stop": "Use /stop to interrupt the active turn instead.",
|
|
299
|
+
"input.answer.required": "Question \"{question}\" requires an answer.",
|
|
300
|
+
"input.answer.optionRequired": "Question \"{question}\" expects an option number or label.",
|
|
301
|
+
"input.answer.empty": "Reply with /answer followed by your response.",
|
|
302
|
+
"input.answer.missingQuestion": "No pending user input question was found.",
|
|
303
|
+
"input.answer.unknownQuestion": "Unknown question reference: {reference}",
|
|
304
|
+
"input.answer.duplicate": "Question \"{question}\" was answered more than once.",
|
|
305
|
+
"input.answer.missing": "Missing answers for: {questions}.",
|
|
306
|
+
"input.pending.generic": "The active CLI is waiting for user input. Reply with /answer and your response, or use /stop to interrupt.",
|
|
307
|
+
"input.pending.single": "The active CLI is waiting for user input for {question}. Reply with /answer and your response, or use /stop to interrupt.",
|
|
308
|
+
"input.pending.multiple": "The active CLI is waiting for answers to {count} questions. Reply with /answer questionId=value; questionId2=value, or use /stop to interrupt.",
|
|
309
|
+
"daemon.activateFailed": "Could not activate terminal: {adapter}.\n{detail}",
|
|
310
|
+
"daemon.activeTerminal": "Active terminal: {adapter}.\n{detail}",
|
|
311
|
+
"daemon.stopping": "Stopping {channel}-daemon...",
|
|
312
|
+
"daemon.switch.previous": " Active terminal remains {adapter}.",
|
|
313
|
+
"daemon.switch.none": " No terminal is active yet.",
|
|
314
|
+
"daemon.switch.threadNotReady": "The visible Codex CLI connected, but its active thread is not ready yet.{previous} Check {log}.",
|
|
315
|
+
"daemon.switch.newNotConnected": "Started the bridge slot and tried to open the visible CLI, but it has not connected yet.{previous} Check {log}.",
|
|
316
|
+
"daemon.switch.existingNotConnected": "Tried to open a visible CLI for the existing slot, but it has not connected yet.{previous} Check {log}.",
|
|
317
|
+
"daemon.switch.notConnected": "The visible CLI is not connected yet.{previous} Check {log}.",
|
|
318
|
+
"daemon.switch.opened": "Opened a visible CLI for the existing slot.",
|
|
319
|
+
"daemon.switch.slotStarted": "Started the bridge slot.",
|
|
320
|
+
"daemon.switch.slotReused": "Reused the bridge slot.",
|
|
321
|
+
"daemon.broadcast.empty": "/all needs at least one running adapter. Open one first with /codex, /claude, /opencode, or /pi.",
|
|
322
|
+
"daemon.broadcast.busy": "/all canceled: {workers} still busy — {names}. Wait for the current replies or use /stop first.",
|
|
323
|
+
"daemon.broadcast.singleBusy": "this worker is",
|
|
324
|
+
"daemon.broadcast.multipleBusy": "these workers are",
|
|
325
|
+
"daemon.broadcast.sent": "Broadcast dispatched to {count} {workers}: {names}. Each reply arrives prefixed with its adapter name.",
|
|
326
|
+
"daemon.broadcast.singleWorker": "worker",
|
|
327
|
+
"daemon.broadcast.multipleWorkers": "workers",
|
|
328
|
+
"daemon.broadcast.skipped": "Not started (skipped): {names}. Start them with their /command to include them next time.",
|
|
329
|
+
"daemon.resume.disabled": "{channel} /resume is disabled for {adapter} in daemon mode. Use /resume directly inside the visible terminal; the remote channel will follow that local session.",
|
|
330
|
+
"bridge.resume.disabled": "{channel} /resume is disabled in {adapter} mode. Use /resume directly inside \"{command}\"; the remote channel will follow the active local session.",
|
|
331
|
+
"status.daemon": "{channel}-daemon status",
|
|
332
|
+
"status.none": "(none)",
|
|
333
|
+
"status.unknown": "(unknown)",
|
|
334
|
+
"status.notStarted": "not started",
|
|
335
|
+
"status.pendingApproval": "pending_approval",
|
|
336
|
+
"status.pendingInput": "pending_input",
|
|
337
|
+
"status.questions": "{count} question(s)",
|
|
338
|
+
"operator.wechat": "the configured WeChat owner",
|
|
339
|
+
"operator.wecom": "the paired WeCom operator",
|
|
340
|
+
"operator.telegram": "the paired Telegram operator",
|
|
341
|
+
"operator.local": "the local operator",
|
|
342
|
+
"status.label.instance_id": "instance_id",
|
|
343
|
+
"status.label.adapter": "adapter",
|
|
344
|
+
"status.label.command": "command",
|
|
345
|
+
"status.label.cwd": "cwd",
|
|
346
|
+
"status.label.profile": "profile",
|
|
347
|
+
"status.label.bridge_started_at": "bridge_started_at",
|
|
348
|
+
"status.label.authorized_user": "authorized_user",
|
|
349
|
+
"status.label.ignored_backlog_count": "ignored_backlog_count",
|
|
350
|
+
"status.label.persisted_shared_session_id": "persisted_shared_session_id",
|
|
351
|
+
"status.label.worker_status": "worker_status",
|
|
352
|
+
"status.label.worker_pid": "worker_pid",
|
|
353
|
+
"status.label.shared_session_id": "shared_session_id",
|
|
354
|
+
"status.label.last_session_switch_at": "last_session_switch_at",
|
|
355
|
+
"status.label.last_session_switch_source": "last_session_switch_source",
|
|
356
|
+
"status.label.last_session_switch_reason": "last_session_switch_reason",
|
|
357
|
+
"status.label.active_turn_id": "active_turn_id",
|
|
358
|
+
"status.label.active_turn_origin": "active_turn_origin",
|
|
359
|
+
"status.label.pending_approval_origin": "pending_approval_origin",
|
|
360
|
+
"status.label.pending_user_input_origin": "pending_user_input_origin",
|
|
361
|
+
"status.label.last_activity_at": "last_activity_at",
|
|
362
|
+
"status.label.last_input_at": "last_input_at",
|
|
363
|
+
"status.label.last_output_at": "last_output_at",
|
|
364
|
+
"status.label.pending_confirmation": "pending_confirmation",
|
|
365
|
+
"status.label.pending_user_input": "pending_user_input",
|
|
366
|
+
"status.label.active": "active",
|
|
367
|
+
"status.label.started_at": "started_at",
|
|
368
|
+
"session.list.failed": "Failed to list {adapter} {noun}: {message}",
|
|
369
|
+
"input.question.default": "Question {number}",
|
|
370
|
+
"input.request.claude": "Claude is waiting for your answers.",
|
|
371
|
+
"input.request.codex": "Codex needs more information before the tool can continue.",
|
|
372
|
+
"input.request.opencode": "OpenCode requested answers to {count} {questions}.",
|
|
373
|
+
"input.request.singular": "question",
|
|
374
|
+
"input.request.plural": "questions",
|
|
375
|
+
"native.claude.emptyPrompt": "Claude must be at an empty native prompt before changing models or plan mode.",
|
|
376
|
+
"native.claude.focusClose": "Could not identify the focused Claude model. Close the menu and try again.",
|
|
377
|
+
"native.claude.focus": "Could not identify the focused Claude model.",
|
|
378
|
+
"native.claude.invalidModel": "Invalid Claude model selection. Send /model again.",
|
|
379
|
+
"native.claude.changed": "The Claude model list changed. Send /model again.",
|
|
380
|
+
"native.claude.unavailable": "The Claude model is no longer selectable. Send /model again.",
|
|
381
|
+
"native.claude.update": "This Claude version does not expose session-only model selection. Update Claude Code and try again.",
|
|
382
|
+
"native.claude.confirmation": "Claude displayed an unexpected model switch confirmation. Check the visible terminal before trying again.",
|
|
383
|
+
"native.claude.notConfirmed": "Claude did not confirm the selected model.",
|
|
384
|
+
"native.claude.restoreUnsupported": "Claude cannot restore permission mode {mode} through the native mode switch.",
|
|
385
|
+
"native.claude.restoreFailed": "Claude could not restore {mode}; check the native permission mode.",
|
|
142
386
|
};
|
package/dist/i18n/messages-zh.js
CHANGED
|
@@ -5,6 +5,83 @@
|
|
|
5
5
|
// must be released under AGPL-3.0-or-later with full source code; see
|
|
6
6
|
// LICENSE.txt. Network services built on it must offer source to users.
|
|
7
7
|
export const messages = {
|
|
8
|
+
"bridge.deferred": "已排队,将在当前本地 Codex 任务结束后发送。队列位置:{position}。",
|
|
9
|
+
"approval.codex.command": "Codex 执行命令前需要批准。",
|
|
10
|
+
"approval.codex.commandReason": "Codex 执行命令前需要批准:{reason}",
|
|
11
|
+
"approval.codex.file": "Codex 修改文件前需要批准。",
|
|
12
|
+
"approval.codex.fileReason": "Codex 修改文件前需要批准:{reason}",
|
|
13
|
+
"approval.codex.permissions": "Codex 获取额外权限前需要批准。",
|
|
14
|
+
"approval.codex.permissionsReason": "Codex 获取额外权限前需要批准:{reason}",
|
|
15
|
+
"approval.codex.commandPreview": "请求批准执行命令。",
|
|
16
|
+
"approval.codex.filePreview": "请求批准修改文件。",
|
|
17
|
+
"approval.claude.summary": "Claude 执行 {tool} 需要授权。",
|
|
18
|
+
"approval.label.plan": "计划",
|
|
19
|
+
"approval.label.command": "命令",
|
|
20
|
+
"approval.label.path": "路径",
|
|
21
|
+
"approval.label.pattern": "匹配模式",
|
|
22
|
+
"approval.label.url": "URL",
|
|
23
|
+
"task.interrupted": "已中断",
|
|
24
|
+
"adapter.codex.modelUnavailable": "Codex 模型 {model} 不可用。",
|
|
25
|
+
"adapter.pi.localSwitchInterrupted": "本地 Pi 终端切换了会话,当前远程任务已中断。",
|
|
26
|
+
"adapter.pi.extensionDisconnected": "原生 Pi TUI 桥接扩展已断开且未重新连接。",
|
|
27
|
+
"adapter.claude.controlsIdle": "请等待 Claude 空闲并处理待审批请求后,再使用远程控制。",
|
|
28
|
+
"adapter.claude.controlActive": "Claude 控制操作正在进行中。",
|
|
29
|
+
"adapter.claude.notRunning": "Claude 适配器未运行。",
|
|
30
|
+
"adapter.claude.busy": "Claude 仍在运行,请等待当前回复或使用 /stop。",
|
|
31
|
+
"adapter.claude.approvalPending": "Claude 有待审批请求,请回复 /confirm 或 /deny。",
|
|
32
|
+
"adapter.claude.inputPending": "Claude 正在等待回答,请回复 /answer 或使用 /stop。",
|
|
33
|
+
"adapter.claude.sessionControlActive": "CLI 控制操作正在进行中,请等待完成后再切换会话。",
|
|
34
|
+
"adapter.claude.notReady": "Claude 尚未启动。",
|
|
35
|
+
"adapter.claude.switching": "Claude 正在切换会话。",
|
|
36
|
+
"adapter.claude.switchBusy": "Claude 仍在运行,请等待当前回复或使用 /stop。",
|
|
37
|
+
"adapter.claude.approvalLocal": "当前 Claude 提示无法通过远程审批,请在本地 Claude 终端中批准。",
|
|
38
|
+
"adapter.codex.notRunning": "Codex 适配器未运行。",
|
|
39
|
+
"adapter.codex.panelNotRunning": "Codex 本地面板未运行。",
|
|
40
|
+
"adapter.codex.busy": "Codex 仍在运行,请等待当前回复或使用 /stop。",
|
|
41
|
+
"adapter.codex.localBusy": "本地 Codex 面板仍在运行,请等待当前回复或使用 /stop。",
|
|
42
|
+
"adapter.codex.approvalPending": "Codex 有待审批请求,请回复 /confirm 或 /deny。",
|
|
43
|
+
"adapter.codex.localInputPending": "Codex 正在等待本地终端输入,完成后才能继续会话。",
|
|
44
|
+
"adapter.codex.inputPending": "Codex 正在等待输入,请用 /answer 提交回答或使用 /stop。",
|
|
45
|
+
"adapter.codex.inputPendingShort": "Codex 正在等待输入,请回复 /answer 或使用 /stop。",
|
|
46
|
+
"adapter.codex.modelThreadRequired": "切换 Codex 模型需要活动的 app-server 线程。",
|
|
47
|
+
"adapter.codex.planThreadRequired": "Codex 计划模式需要活动的 app-server 线程。",
|
|
48
|
+
"adapter.codex.planUnavailable": "当前 Codex app-server 不支持计划模式。",
|
|
49
|
+
"adapter.codex.modelMissing": "Codex 未返回当前线程的模型。",
|
|
50
|
+
"adapter.codex.switching": "Codex 正在切换可见线程。",
|
|
51
|
+
"adapter.opencode.modelUnavailable": "该 OpenCode 模型已不可用,请重新发送 /model。",
|
|
52
|
+
"adapter.opencode.modelUnconfirmed": "OpenCode 未确认所选模型。",
|
|
53
|
+
"adapter.opencode.planUnavailable": "OpenCode 的 plan 主代理不可用。",
|
|
54
|
+
"adapter.opencode.agentsMissing": "OpenCode 未返回任何主代理。",
|
|
55
|
+
"adapter.opencode.planReplacementMissing": "OpenCode 未返回可替代计划模式的代理。",
|
|
56
|
+
"adapter.opencode.agentUnconfirmed": "OpenCode 未确认所选代理。",
|
|
57
|
+
"adapter.opencode.notRunning": "OpenCode 未运行。",
|
|
58
|
+
"adapter.opencode.adapterNotRunning": "OpenCode 适配器未运行。",
|
|
59
|
+
"adapter.opencode.notReady": "OpenCode 尚未启动。",
|
|
60
|
+
"adapter.opencode.busy": "OpenCode 仍在运行,请等待当前回复或使用 /stop。",
|
|
61
|
+
"adapter.opencode.approvalPending": "OpenCode 有待审批请求,请回复 /confirm 或 /deny。",
|
|
62
|
+
"adapter.opencode.inputPending": "OpenCode 正在等待输入,请回复 /answer 或使用 /stop。",
|
|
63
|
+
"adapter.pi.busy": "Pi 仍在运行,请等待当前回复或使用 /stop。",
|
|
64
|
+
"adapter.pi.switchBusy": "Pi 仍在运行,请停止当前任务后再切换会话。",
|
|
65
|
+
"adapter.pi.switchCancelled": "Pi 会话切换已被扩展取消。",
|
|
66
|
+
"adapter.pi.createBusy": "Pi 仍在运行,请停止当前任务后再创建会话。",
|
|
67
|
+
"adapter.pi.createCancelled": "Pi 会话创建已被扩展取消。",
|
|
68
|
+
"adapter.pi.listModelsBusy": "Pi 仍在运行,请等待当前任务结束后再列出模型。",
|
|
69
|
+
"adapter.pi.invalidModels": "Pi TUI 返回了无效的模型列表。",
|
|
70
|
+
"adapter.pi.selectModelBusy": "Pi 仍在运行,请等待当前任务结束后再切换模型。",
|
|
71
|
+
"adapter.pi.invalidModel": "Pi TUI 返回了无效的所选模型。",
|
|
72
|
+
"adapter.pi.disconnected": "原生 Pi TUI 尚未连接到桥接。",
|
|
73
|
+
"companion.modelsUnsupported": "当前 companion 不支持列出模型。",
|
|
74
|
+
"companion.modelUnsupported": "当前 companion 不支持切换模型。",
|
|
75
|
+
"companion.planUnsupported": "当前 companion 不支持计划模式。",
|
|
76
|
+
"channel.unauthorized": "未授权。",
|
|
77
|
+
"native.control.inactive": "当前没有终端控制操作。",
|
|
78
|
+
"native.control.sessionChanged": "控制期间活动 CLI 会话发生变化,请重试。",
|
|
79
|
+
"native.control.timeout": "原生 CLI 控制超时,无法确认操作结果。",
|
|
80
|
+
"native.control.busy": "另一个 CLI 控制操作正在进行中。",
|
|
81
|
+
"native.control.draft": "本地终端有输入草稿,请提交或清除后再使用远程控制。",
|
|
82
|
+
"native.control.invalid": "无效的原生控制命令。",
|
|
83
|
+
"native.control.menuOpen": "原生 CLI 菜单已打开,请关闭后再使用远程控制。",
|
|
84
|
+
"native.control.selectorChanged": "原生选择器发生了意外变化。",
|
|
8
85
|
// === 桥接欢迎 & 控制 ===
|
|
9
86
|
"bridge.welcome": "微信桥接就绪 ({adapter})。\n工作目录: {cwd}",
|
|
10
87
|
"bridge.stopped": "桥接已停止。",
|
|
@@ -17,7 +94,7 @@ export const messages = {
|
|
|
17
94
|
"bridge.fatalError": "桥接错误: {message}",
|
|
18
95
|
"bridge.backlogIgnored": "已忽略 {count} 条桥接启动前的积压消息(不会自动处理)。\n如果你是在桥接启动后才发送的消息却看到此提示,说明本机系统时钟可能不准(偏差超过 {graceSeconds} 秒),请校准时间后重启桥接。",
|
|
19
96
|
// === Daemon 欢迎 & 控制 ===
|
|
20
|
-
"daemon.welcome": "
|
|
97
|
+
"daemon.welcome": "{channel} Daemon 就绪。\n工作目录: {cwd}\n当前: {adapter}\n\n命令: /claude, /codex, /opencode, /pi, /stop, /confirm, /deny, /status, /lang [zh|en], /model, /plan, /all <prompt>\n{bindings}\n\n管理: /bind [表情] 命令, /unbind [表情], /bindings",
|
|
21
98
|
"daemon.noActiveAdapter": "未选择活跃终端。发送 /codex、/claude、/opencode 或 /pi 启动一个。",
|
|
22
99
|
"daemon.switchResult.new": "已启动新的可见 CLI。",
|
|
23
100
|
"daemon.switchResult.reused": "已复用现有的可见 CLI。",
|
|
@@ -139,4 +216,171 @@ export const messages = {
|
|
|
139
216
|
"doctor.endpoint.issue.companionDead": "companion pid={pid} 已退出",
|
|
140
217
|
"doctor.endpoint.issue.workerStatus": "可见端 worker 状态={status}",
|
|
141
218
|
"doctor.endpoint.issue.instanceMismatch": "端点 instanceId 与桥接锁 instanceId 不一致",
|
|
219
|
+
// Shared controls and channel replies
|
|
220
|
+
"language.current": "当前语言:{locale}。发送 /lang zh 或 /lang en 切换。",
|
|
221
|
+
"language.usage": "用法:/lang zh 或 /lang en。发送 /lang 查看当前语言。",
|
|
222
|
+
"language.changed": "语言已切换为 {locale}。",
|
|
223
|
+
"language.saveFailed": "无法保存语言设置:{error}",
|
|
224
|
+
"language.companionRestart": "部分可见 CLI 未能更新桥接语言,请重启这些 CLI 同步语言设置。",
|
|
225
|
+
"control.plan.unavailable": "{name} 不支持计划模式控制。",
|
|
226
|
+
"control.plan.enabled": "{name} 计划模式已开启。发送 /plan off 恢复之前的模式。",
|
|
227
|
+
"control.plan.disabled": "{name} 计划模式已关闭。",
|
|
228
|
+
"control.model.unavailable": "{name} 不支持模型选择。",
|
|
229
|
+
"control.model.sessionChanged": "当前会话已变更,请重新发送 /model。",
|
|
230
|
+
"control.model.empty": "{name} 未返回可用模型。",
|
|
231
|
+
"control.model.header": "{name} 可用模型:",
|
|
232
|
+
"control.model.current": " (当前)",
|
|
233
|
+
"control.model.instructions": "回复 /model <编号> 切换模型。列表有效期为 5 分钟。",
|
|
234
|
+
"control.model.expired": "模型列表已过期或属于其他会话,请重新发送 /model。",
|
|
235
|
+
"control.model.range": "模型编号超出显示范围,请重新发送 /model 刷新列表。",
|
|
236
|
+
"control.model.changed": "{name} 模型已切换为 {model}。",
|
|
237
|
+
"bridge.unauthorized": "未授权。此{mode}仅接受来自 {operator} 的消息。",
|
|
238
|
+
"bridge.mode.bridge": "桥接",
|
|
239
|
+
"bridge.mode.daemon": "守护进程",
|
|
240
|
+
"bridge.broadcast.daemonOnly": "/all 仅支持守护进程模式。启动 wechat-daemon 或 wecom-daemon 后可向全部 CLI 广播。",
|
|
241
|
+
"bridge.newSession.unavailable": "{adapter} 模式不支持 /new。",
|
|
242
|
+
"bridge.interrupt.workerSent": "已向当前任务发送中断信号。",
|
|
243
|
+
"bridge.interrupt.workerIdle": "没有可中断的运行中任务。",
|
|
244
|
+
"bridge.approval.applyFailed": "CLI 未能处理此审批请求。",
|
|
245
|
+
"bridge.approval.denyFailed": "CLI 未能完成此审批请求的拒绝操作。",
|
|
246
|
+
"bridge.answer.none": "没有待回答的问题。",
|
|
247
|
+
"bridge.answer.failed": "CLI 未能接收此答案。",
|
|
248
|
+
"bridge.answer.sent": "答案已提交,继续执行…",
|
|
249
|
+
"bridge.input.waiting": "{adapter} 正在等待结构化回答。回复 /answer <问题>=<答案> …",
|
|
250
|
+
"bridge.busy.remote": "{adapter} 仍在工作,请等待回复或发送 /stop 中断。",
|
|
251
|
+
"bridge.busy.local": "{adapter} 正在执行本地终端任务,请等待完成或发送 /stop 中断。",
|
|
252
|
+
"session.noun": "会话",
|
|
253
|
+
"session.thread": "线程",
|
|
254
|
+
"session.switch.local": "{adapter} {noun}已从本地终端切换至 {id}。",
|
|
255
|
+
"session.switch.remote": "{adapter} {noun}已从远程通道切换至 {id}。",
|
|
256
|
+
"session.switch.restore": "{adapter} 启动时已恢复共享{noun} {id}。",
|
|
257
|
+
"session.switch.generic": "{adapter} {noun}已切换至 {id}。",
|
|
258
|
+
"session.list.empty": "当前工作目录没有已保存的 {adapter} {noun}。",
|
|
259
|
+
"session.sessions": "会话",
|
|
260
|
+
"session.threads": "线程",
|
|
261
|
+
"session.list.header": "最近的 {adapter} {noun}:",
|
|
262
|
+
"session.list.current": " [当前]",
|
|
263
|
+
"session.list.instructions": "回复 /resume <编号> 或 /resume <唯一 ID 前缀>。",
|
|
264
|
+
"session.localInput": "本地 {adapter} 输入",
|
|
265
|
+
"session.taskFailed": "{adapter} 任务失败:\n{text}",
|
|
266
|
+
"session.alreadyActive": "{adapter} {noun} {id} 已是当前会话。",
|
|
267
|
+
"session.list.expired": "最近会话列表已过期,请重新发送 /resume 再选择编号。",
|
|
268
|
+
"session.list.range": "恢复编号 {target} 超出显示范围,请重新发送 /resume 刷新列表。",
|
|
269
|
+
"session.list.ambiguous": "会话 ID 前缀 {target} 对应多个会话,请重新发送 /resume 并使用更长的前缀。",
|
|
270
|
+
"approval.claude.header": "Claude 权限请求。",
|
|
271
|
+
"approval.cli.header": "CLI 正在等待审批。",
|
|
272
|
+
"approval.tool": "工具",
|
|
273
|
+
"approval.details": "详情",
|
|
274
|
+
"approval.adapter": "适配器",
|
|
275
|
+
"approval.summary": "摘要",
|
|
276
|
+
"approval.target": "目标",
|
|
277
|
+
"approval.confirmInstructions": "回复 /confirm、confirm 或 yes 继续。",
|
|
278
|
+
"approval.denyInstructions": "回复 /deny、deny 或 no 拒绝。",
|
|
279
|
+
"approval.instructions": "回复 /confirm 或 /yes 继续,/deny 或 /no 拒绝。",
|
|
280
|
+
"approval.pending.claude": "正在等待 {target} 的审批。回复 /confirm、confirm 或 yes 继续,/deny、deny 或 no 拒绝。",
|
|
281
|
+
"approval.pending": "正在等待 {target} 的审批,请回复 /confirm 或 /deny。",
|
|
282
|
+
"input.secretWarning": "警告:上游问题包含私密输入,但通道回复不会隐藏内容。",
|
|
283
|
+
"input.options": "选项:",
|
|
284
|
+
"input.preview": "预览:",
|
|
285
|
+
"input.multiple": "允许多选(使用英文逗号分隔)",
|
|
286
|
+
"input.customAnswer": "允许自定义答案",
|
|
287
|
+
"input.customNote": "允许补充说明",
|
|
288
|
+
"input.answer.multiple": "回复 /answer <选项编号或完整名称,以英文逗号分隔>。",
|
|
289
|
+
"input.answer.single": "回复 /answer <选项编号或完整名称>。",
|
|
290
|
+
"input.answer.custom": "也可以直接输入自定义答案。",
|
|
291
|
+
"input.answer.note": "可添加“| 补充说明”提供更多上下文。",
|
|
292
|
+
"input.answer.text": "回复 /answer <答案>。",
|
|
293
|
+
"input.answer.ordered": "回复 /answer 问题ID=答案; 问题ID2=答案。",
|
|
294
|
+
"input.answer.numbers": "问题可使用编号或 ID。",
|
|
295
|
+
"input.answer.optionValue": "选择题答案可使用选项编号或完整名称。",
|
|
296
|
+
"input.answer.multipleValue": "多选题答案请使用英文逗号分隔。",
|
|
297
|
+
"input.answer.optionNote": "可在选项答案后添加“| 补充说明”提供更多上下文。",
|
|
298
|
+
"input.answer.stop": "发送 /stop 可中断当前任务。",
|
|
299
|
+
"input.answer.required": "问题“{question}”需要答案。",
|
|
300
|
+
"input.answer.optionRequired": "问题“{question}”需要选项编号或名称。",
|
|
301
|
+
"input.answer.empty": "请在 /answer 后填写答案。",
|
|
302
|
+
"input.answer.missingQuestion": "没有找到待回答的问题。",
|
|
303
|
+
"input.answer.unknownQuestion": "无法识别问题:{reference}",
|
|
304
|
+
"input.answer.duplicate": "问题“{question}”被重复回答。",
|
|
305
|
+
"input.answer.missing": "以下问题缺少答案:{questions}。",
|
|
306
|
+
"input.pending.generic": "当前 CLI 正在等待回答。回复 /answer 和答案,或发送 /stop 中断。",
|
|
307
|
+
"input.pending.single": "当前 CLI 正在等待问题“{question}”的答案。回复 /answer 和答案,或发送 /stop 中断。",
|
|
308
|
+
"input.pending.multiple": "当前 CLI 正在等待 {count} 个问题的答案。回复 /answer 问题ID=答案; 问题ID2=答案,或发送 /stop 中断。",
|
|
309
|
+
"daemon.activateFailed": "无法启用终端:{adapter}。\n{detail}",
|
|
310
|
+
"daemon.activeTerminal": "当前终端:{adapter}。\n{detail}",
|
|
311
|
+
"daemon.stopping": "正在停止 {channel}-daemon…",
|
|
312
|
+
"daemon.switch.previous": " 当前终端仍为 {adapter}。",
|
|
313
|
+
"daemon.switch.none": " 尚无已启用的终端。",
|
|
314
|
+
"daemon.switch.threadNotReady": "可见 Codex 已连接,但当前线程尚未就绪。{previous}请查看 {log}。",
|
|
315
|
+
"daemon.switch.newNotConnected": "桥接 slot 已启动并尝试打开可见 CLI,但 CLI 尚未连接。{previous}请查看 {log}。",
|
|
316
|
+
"daemon.switch.existingNotConnected": "已尝试为现有 slot 打开可见 CLI,但 CLI 尚未连接。{previous}请查看 {log}。",
|
|
317
|
+
"daemon.switch.notConnected": "可见 CLI 尚未连接。{previous}请查看 {log}。",
|
|
318
|
+
"daemon.switch.opened": "已为现有 slot 打开可见 CLI。",
|
|
319
|
+
"daemon.switch.slotStarted": "桥接 slot 已启动。",
|
|
320
|
+
"daemon.switch.slotReused": "已复用桥接 slot。",
|
|
321
|
+
"daemon.broadcast.empty": "/all 需要至少一个运行中的 CLI。请先发送 /codex、/claude、/opencode 或 /pi 启动。",
|
|
322
|
+
"daemon.broadcast.busy": "/all 已取消:{workers}仍在工作 — {names}。请等待回复或先发送 /stop。",
|
|
323
|
+
"daemon.broadcast.singleBusy": "此 CLI",
|
|
324
|
+
"daemon.broadcast.multipleBusy": "这些 CLI",
|
|
325
|
+
"daemon.broadcast.sent": "已广播至 {count} 个 {workers}:{names}。各条回复会标注 CLI 名称。",
|
|
326
|
+
"daemon.broadcast.singleWorker": "CLI",
|
|
327
|
+
"daemon.broadcast.multipleWorkers": "CLI",
|
|
328
|
+
"daemon.broadcast.skipped": "未启动(已跳过):{names}。发送对应 /命令启动后,即可参与下次广播。",
|
|
329
|
+
"daemon.resume.disabled": "守护进程中的 {adapter} 不支持 {channel} /resume。请在可见终端中执行 /resume,远程通道会跟随该会话。",
|
|
330
|
+
"bridge.resume.disabled": "{adapter} 模式不支持 {channel} /resume。请在“{command}”内执行 /resume,远程通道会跟随当前本地会话。",
|
|
331
|
+
"status.daemon": "{channel}-daemon 状态",
|
|
332
|
+
"status.none": "(无)",
|
|
333
|
+
"status.unknown": "(未知)",
|
|
334
|
+
"status.notStarted": "未启动",
|
|
335
|
+
"status.pendingApproval": "待审批",
|
|
336
|
+
"status.pendingInput": "待回答",
|
|
337
|
+
"status.questions": "{count} 个问题",
|
|
338
|
+
"operator.wechat": "已配置的微信操作者",
|
|
339
|
+
"operator.wecom": "已配对的企业微信操作者",
|
|
340
|
+
"operator.telegram": "已配对的 Telegram 操作者",
|
|
341
|
+
"operator.local": "本地操作者",
|
|
342
|
+
"status.label.instance_id": "实例 ID",
|
|
343
|
+
"status.label.adapter": "适配器",
|
|
344
|
+
"status.label.command": "命令",
|
|
345
|
+
"status.label.cwd": "工作目录",
|
|
346
|
+
"status.label.profile": "配置",
|
|
347
|
+
"status.label.bridge_started_at": "桥接启动时间",
|
|
348
|
+
"status.label.authorized_user": "授权用户",
|
|
349
|
+
"status.label.ignored_backlog_count": "已忽略积压消息数",
|
|
350
|
+
"status.label.persisted_shared_session_id": "保存的共享会话 ID",
|
|
351
|
+
"status.label.worker_status": "CLI 状态",
|
|
352
|
+
"status.label.worker_pid": "CLI PID",
|
|
353
|
+
"status.label.shared_session_id": "共享会话 ID",
|
|
354
|
+
"status.label.last_session_switch_at": "最近会话切换时间",
|
|
355
|
+
"status.label.last_session_switch_source": "最近会话切换来源",
|
|
356
|
+
"status.label.last_session_switch_reason": "最近会话切换原因",
|
|
357
|
+
"status.label.active_turn_id": "当前任务 ID",
|
|
358
|
+
"status.label.active_turn_origin": "当前任务来源",
|
|
359
|
+
"status.label.pending_approval_origin": "待审批来源",
|
|
360
|
+
"status.label.pending_user_input_origin": "待回答来源",
|
|
361
|
+
"status.label.last_activity_at": "最近活动时间",
|
|
362
|
+
"status.label.last_input_at": "最近输入时间",
|
|
363
|
+
"status.label.last_output_at": "最近输出时间",
|
|
364
|
+
"status.label.pending_confirmation": "待审批",
|
|
365
|
+
"status.label.pending_user_input": "待回答",
|
|
366
|
+
"status.label.active": "当前 CLI",
|
|
367
|
+
"status.label.started_at": "启动时间",
|
|
368
|
+
"session.list.failed": "无法列出 {adapter} {noun}:{message}",
|
|
369
|
+
"input.question.default": "问题 {number}",
|
|
370
|
+
"input.request.claude": "Claude 正在等待你的回答。",
|
|
371
|
+
"input.request.codex": "Codex 需要更多信息才能继续执行工具。",
|
|
372
|
+
"input.request.opencode": "OpenCode 请求回答 {count} 个{questions}。",
|
|
373
|
+
"input.request.singular": "问题",
|
|
374
|
+
"input.request.plural": "问题",
|
|
375
|
+
"native.claude.emptyPrompt": "切换模型或计划模式前,Claude 原生输入框必须为空且处于空闲状态。",
|
|
376
|
+
"native.claude.focusClose": "无法识别 Claude 当前选中的模型,请关闭菜单后重试。",
|
|
377
|
+
"native.claude.focus": "无法识别 Claude 当前选中的模型。",
|
|
378
|
+
"native.claude.invalidModel": "Claude 模型选择无效,请重新发送 /model。",
|
|
379
|
+
"native.claude.changed": "Claude 模型列表已变更,请重新发送 /model。",
|
|
380
|
+
"native.claude.unavailable": "此 Claude 模型已不可选,请重新发送 /model。",
|
|
381
|
+
"native.claude.update": "当前 Claude 版本不支持仅为当前会话选择模型,请更新 Claude Code 后重试。",
|
|
382
|
+
"native.claude.confirmation": "Claude 显示了与目标不符的模型切换确认,请先检查可见终端再重试。",
|
|
383
|
+
"native.claude.notConfirmed": "Claude 未确认选中的模型。",
|
|
384
|
+
"native.claude.restoreUnsupported": "Claude 无法通过原生模式切换恢复权限模式 {mode}。",
|
|
385
|
+
"native.claude.restoreFailed": "Claude 未能恢复 {mode},请检查原生权限模式。",
|
|
142
386
|
};
|