@grinev/opencode-telegram-bot 0.11.2 → 0.11.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/dist/bot/commands/models.js +4 -4
- package/dist/bot/commands/opencode-start.js +24 -8
- package/dist/bot/commands/status.js +2 -3
- package/dist/bot/handlers/permission.js +3 -4
- package/dist/bot/handlers/question.js +1 -3
- package/dist/bot/index.js +4 -3
- package/dist/bot/utils/send-with-markdown-fallback.js +20 -0
- package/dist/bot/utils/telegram-text.js +26 -0
- package/dist/i18n/de.js +6 -5
- package/dist/i18n/en.js +6 -5
- package/dist/i18n/es.js +6 -5
- package/dist/i18n/ru.js +6 -5
- package/dist/i18n/zh.js +6 -5
- package/package.json +1 -1
|
@@ -15,21 +15,21 @@ export async function modelsCommand(ctx) {
|
|
|
15
15
|
}
|
|
16
16
|
let message = t("legacy.models.header");
|
|
17
17
|
for (const provider of providers) {
|
|
18
|
-
message += `🔹
|
|
18
|
+
message += `🔹 ${provider.id}\n`;
|
|
19
19
|
const models = Object.values(provider.models);
|
|
20
20
|
if (models.length === 0) {
|
|
21
21
|
message += t("legacy.models.no_provider_models");
|
|
22
22
|
}
|
|
23
23
|
else {
|
|
24
24
|
for (const model of models) {
|
|
25
|
-
message += `
|
|
25
|
+
message += ` - ${model.id}\n`;
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
message += "\n";
|
|
29
29
|
}
|
|
30
30
|
message += t("legacy.models.env_hint");
|
|
31
|
-
message += "
|
|
32
|
-
await ctx.reply(message
|
|
31
|
+
message += "OPENCODE_MODEL_PROVIDER=<provider.id>\nOPENCODE_MODEL_ID=<model.id>";
|
|
32
|
+
await ctx.reply(message);
|
|
33
33
|
}
|
|
34
34
|
catch (error) {
|
|
35
35
|
logger.error("[ModelsCommand] Error listing models:", error);
|
|
@@ -2,6 +2,7 @@ import { opencodeClient } from "../../opencode/client.js";
|
|
|
2
2
|
import { processManager } from "../../process/manager.js";
|
|
3
3
|
import { logger } from "../../utils/logger.js";
|
|
4
4
|
import { t } from "../../i18n/index.js";
|
|
5
|
+
import { editBotText } from "../utils/telegram-text.js";
|
|
5
6
|
/**
|
|
6
7
|
* Wait for OpenCode server to become ready by polling health endpoint
|
|
7
8
|
* @param maxWaitMs Maximum time to wait in milliseconds
|
|
@@ -58,24 +59,39 @@ export async function opencodeStartCommand(ctx) {
|
|
|
58
59
|
// 4. Start the process
|
|
59
60
|
const { success, error } = await processManager.start();
|
|
60
61
|
if (!success) {
|
|
61
|
-
await
|
|
62
|
+
await editBotText({
|
|
63
|
+
api: ctx.api,
|
|
64
|
+
chatId: ctx.chat.id,
|
|
65
|
+
messageId: statusMessage.message_id,
|
|
66
|
+
text: t("opencode_start.start_error", { error: error || t("common.unknown_error") }),
|
|
67
|
+
});
|
|
62
68
|
return;
|
|
63
69
|
}
|
|
64
70
|
// 5. Wait for server to become ready
|
|
65
71
|
logger.info("[Bot] Waiting for OpenCode server to become ready...");
|
|
66
72
|
const ready = await waitForServerReady(10000);
|
|
67
73
|
if (!ready) {
|
|
68
|
-
await
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
await editBotText({
|
|
75
|
+
api: ctx.api,
|
|
76
|
+
chatId: ctx.chat.id,
|
|
77
|
+
messageId: statusMessage.message_id,
|
|
78
|
+
text: t("opencode_start.started_not_ready", {
|
|
79
|
+
pid: processManager.getPID() ?? "-",
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
71
82
|
return;
|
|
72
83
|
}
|
|
73
84
|
// 6. Get server version and send success message
|
|
74
85
|
const { data: health } = await opencodeClient.global.health();
|
|
75
|
-
await
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
86
|
+
await editBotText({
|
|
87
|
+
api: ctx.api,
|
|
88
|
+
chatId: ctx.chat.id,
|
|
89
|
+
messageId: statusMessage.message_id,
|
|
90
|
+
text: t("opencode_start.success", {
|
|
91
|
+
pid: processManager.getPID() ?? "-",
|
|
92
|
+
version: health?.version || t("common.unknown"),
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
79
95
|
logger.info(`[Bot] OpenCode server started successfully, PID=${processManager.getPID()}`);
|
|
80
96
|
}
|
|
81
97
|
catch (err) {
|
|
@@ -9,7 +9,7 @@ import { keyboardManager } from "../../keyboard/manager.js";
|
|
|
9
9
|
import { pinnedMessageManager } from "../../pinned/manager.js";
|
|
10
10
|
import { logger } from "../../utils/logger.js";
|
|
11
11
|
import { t } from "../../i18n/index.js";
|
|
12
|
-
import {
|
|
12
|
+
import { sendBotText } from "../utils/telegram-text.js";
|
|
13
13
|
export async function statusCommand(ctx) {
|
|
14
14
|
try {
|
|
15
15
|
const { data, error } = await opencodeClient.global.health();
|
|
@@ -77,12 +77,11 @@ export async function statusCommand(ctx) {
|
|
|
77
77
|
}
|
|
78
78
|
const keyboard = keyboardManager.getKeyboard();
|
|
79
79
|
if (ctx.chat) {
|
|
80
|
-
await
|
|
80
|
+
await sendBotText({
|
|
81
81
|
api: ctx.api,
|
|
82
82
|
chatId: ctx.chat.id,
|
|
83
83
|
text: message,
|
|
84
84
|
options: { reply_markup: keyboard },
|
|
85
|
-
parseMode: "Markdown",
|
|
86
85
|
});
|
|
87
86
|
}
|
|
88
87
|
else {
|
|
@@ -21,6 +21,7 @@ const PERMISSION_NAME_KEYS = {
|
|
|
21
21
|
list: "permission.name.list",
|
|
22
22
|
task: "permission.name.task",
|
|
23
23
|
lsp: "permission.name.lsp",
|
|
24
|
+
external_directory: "permission.name.external_directory",
|
|
24
25
|
};
|
|
25
26
|
// Permission type emojis
|
|
26
27
|
const PERMISSION_EMOJIS = {
|
|
@@ -35,6 +36,7 @@ const PERMISSION_EMOJIS = {
|
|
|
35
36
|
list: "📂",
|
|
36
37
|
task: "⚙️",
|
|
37
38
|
lsp: "🔧",
|
|
39
|
+
external_directory: "📁",
|
|
38
40
|
};
|
|
39
41
|
function getCallbackMessageId(ctx) {
|
|
40
42
|
const message = ctx.callbackQuery?.message;
|
|
@@ -191,7 +193,6 @@ export async function showPermissionRequest(bot, chatId, request) {
|
|
|
191
193
|
try {
|
|
192
194
|
const message = await bot.sendMessage(chatId, text, {
|
|
193
195
|
reply_markup: keyboard,
|
|
194
|
-
parse_mode: "Markdown",
|
|
195
196
|
});
|
|
196
197
|
logger.debug(`[PermissionHandler] Message sent, messageId=${message.message_id}`);
|
|
197
198
|
permissionManager.startPermission(request, message.message_id);
|
|
@@ -217,9 +218,7 @@ function formatPermissionText(request) {
|
|
|
217
218
|
// Show patterns (commands/files)
|
|
218
219
|
if (request.patterns.length > 0) {
|
|
219
220
|
request.patterns.forEach((pattern) => {
|
|
220
|
-
|
|
221
|
-
const escapedPattern = pattern.replace(/`/g, "\\`");
|
|
222
|
-
text += `\`${escapedPattern}\`\n`;
|
|
221
|
+
text += `• ${pattern}\n`;
|
|
223
222
|
});
|
|
224
223
|
}
|
|
225
224
|
return text;
|
|
@@ -192,7 +192,6 @@ async function updateQuestionMessage(ctx) {
|
|
|
192
192
|
try {
|
|
193
193
|
await ctx.editMessageText(text, {
|
|
194
194
|
reply_markup: keyboard,
|
|
195
|
-
parse_mode: "Markdown",
|
|
196
195
|
});
|
|
197
196
|
}
|
|
198
197
|
catch (err) {
|
|
@@ -212,7 +211,6 @@ export async function showCurrentQuestion(bot, chatId) {
|
|
|
212
211
|
try {
|
|
213
212
|
const message = await bot.sendMessage(chatId, text, {
|
|
214
213
|
reply_markup: keyboard,
|
|
215
|
-
parse_mode: "Markdown",
|
|
216
214
|
});
|
|
217
215
|
logger.debug(`[QuestionHandler] Message sent, messageId=${message.message_id}`);
|
|
218
216
|
questionManager.addMessageId(message.message_id);
|
|
@@ -342,7 +340,7 @@ function formatQuestionText(question) {
|
|
|
342
340
|
const totalQuestions = questionManager.getTotalQuestions();
|
|
343
341
|
const progressText = totalQuestions > 0 ? `${currentIndex + 1}/${totalQuestions}` : "";
|
|
344
342
|
const headerTitle = [progressText, question.header].filter(Boolean).join(" ");
|
|
345
|
-
const header = headerTitle ?
|
|
343
|
+
const header = headerTitle ? `${headerTitle}\n\n` : "";
|
|
346
344
|
const multiple = question.multiple ? t("question.multi_hint") : "";
|
|
347
345
|
return `${header}${question.question}${multiple}`;
|
|
348
346
|
}
|
package/dist/bot/index.js
CHANGED
|
@@ -46,7 +46,7 @@ import { processUserPrompt } from "./handlers/prompt.js";
|
|
|
46
46
|
import { handleVoiceMessage } from "./handlers/voice.js";
|
|
47
47
|
import { handleDocumentMessage } from "./handlers/document.js";
|
|
48
48
|
import { downloadTelegramFile, toDataUri } from "./utils/file-download.js";
|
|
49
|
-
import {
|
|
49
|
+
import { sendBotText } from "./utils/telegram-text.js";
|
|
50
50
|
import { getModelCapabilities, supportsInput } from "../model/capabilities.js";
|
|
51
51
|
import { getStoredModel } from "../model/manager.js";
|
|
52
52
|
let botInstance = null;
|
|
@@ -151,17 +151,18 @@ async function ensureEventSubscription(directory) {
|
|
|
151
151
|
try {
|
|
152
152
|
const parts = formatSummary(messageText);
|
|
153
153
|
const assistantParseMode = getAssistantParseMode();
|
|
154
|
+
const assistantMessageFormat = assistantParseMode === "MarkdownV2" ? "markdown_v2" : "raw";
|
|
154
155
|
logger.debug(`[Bot] Sending completed message to Telegram (chatId=${chatIdInstance}, parts=${parts.length})`);
|
|
155
156
|
for (let i = 0; i < parts.length; i++) {
|
|
156
157
|
const isLastPart = i === parts.length - 1;
|
|
157
158
|
const keyboard = isLastPart && keyboardManager.isInitialized() ? keyboardManager.getKeyboard() : undefined;
|
|
158
159
|
const options = keyboard ? { reply_markup: keyboard } : undefined;
|
|
159
|
-
await
|
|
160
|
+
await sendBotText({
|
|
160
161
|
api: botInstance.api,
|
|
161
162
|
chatId: chatIdInstance,
|
|
162
163
|
text: parts[i],
|
|
163
164
|
options,
|
|
164
|
-
|
|
165
|
+
format: assistantMessageFormat,
|
|
165
166
|
});
|
|
166
167
|
}
|
|
167
168
|
}
|
|
@@ -56,3 +56,23 @@ export async function sendMessageWithMarkdownFallback({ api, chatId, text, optio
|
|
|
56
56
|
await api.sendMessage(chatId, text, options);
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
export async function editMessageWithMarkdownFallback({ api, chatId, messageId, text, options, parseMode, }) {
|
|
60
|
+
if (!parseMode) {
|
|
61
|
+
await api.editMessageText(chatId, messageId, text, options);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const markdownOptions = {
|
|
65
|
+
...(options || {}),
|
|
66
|
+
parse_mode: parseMode,
|
|
67
|
+
};
|
|
68
|
+
try {
|
|
69
|
+
await api.editMessageText(chatId, messageId, text, markdownOptions);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (!isTelegramMarkdownParseError(error)) {
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
logger.warn("[Bot] Markdown parse failed, retrying edited message in raw mode", error);
|
|
76
|
+
await api.editMessageText(chatId, messageId, text, options);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { editMessageWithMarkdownFallback, sendMessageWithMarkdownFallback, } from "./send-with-markdown-fallback.js";
|
|
2
|
+
function resolveParseMode(format) {
|
|
3
|
+
if (format === "markdown_v2") {
|
|
4
|
+
return "MarkdownV2";
|
|
5
|
+
}
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
export async function sendBotText({ api, chatId, text, options, format = "raw", }) {
|
|
9
|
+
await sendMessageWithMarkdownFallback({
|
|
10
|
+
api,
|
|
11
|
+
chatId,
|
|
12
|
+
text,
|
|
13
|
+
options,
|
|
14
|
+
parseMode: resolveParseMode(format),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export async function editBotText({ api, chatId, messageId, text, options, format = "raw", }) {
|
|
18
|
+
await editMessageWithMarkdownFallback({
|
|
19
|
+
api,
|
|
20
|
+
chatId,
|
|
21
|
+
messageId,
|
|
22
|
+
text,
|
|
23
|
+
options,
|
|
24
|
+
parseMode: resolveParseMode(format),
|
|
25
|
+
});
|
|
26
|
+
}
|
package/dist/i18n/de.js
CHANGED
|
@@ -54,7 +54,7 @@ export const de = {
|
|
|
54
54
|
"bot.file_download_error": "🔴 Datei konnte nicht heruntergeladen werden",
|
|
55
55
|
"bot.model_no_pdf": "⚠️ Das aktuelle Modell unterstützt keine PDF-Eingabe. Sende nur Text.",
|
|
56
56
|
"bot.text_file_too_large": "⚠️ Textdatei ist zu groß (max. {maxSizeKb}KB)",
|
|
57
|
-
"status.header_running": "🟢
|
|
57
|
+
"status.header_running": "🟢 OpenCode-Server läuft",
|
|
58
58
|
"status.health.healthy": "OK",
|
|
59
59
|
"status.health.unhealthy": "Nicht OK",
|
|
60
60
|
"status.line.health": "Status: {health}",
|
|
@@ -115,7 +115,7 @@ export const de = {
|
|
|
115
115
|
"opencode_start.already_running_managed": "⚠️ OpenCode-Server läuft bereits\n\nPID: {pid}\nBetriebszeit: {seconds} Sekunden",
|
|
116
116
|
"opencode_start.already_running_external": "✅ OpenCode-Server läuft bereits als externer Prozess\n\nVersion: {version}\n\nDieser Server wurde nicht vom Bot gestartet, daher kann /opencode-stop ihn nicht stoppen.",
|
|
117
117
|
"opencode_start.starting": "🔄 Starte OpenCode-Server...",
|
|
118
|
-
"opencode_start.start_error": "🔴 OpenCode-Server konnte nicht gestartet werden\n\nFehler: {error}\n\nPrüfe, ob OpenCode CLI installiert und im PATH verfügbar ist:\
|
|
118
|
+
"opencode_start.start_error": "🔴 OpenCode-Server konnte nicht gestartet werden\n\nFehler: {error}\n\nPrüfe, ob OpenCode CLI installiert und im PATH verfügbar ist:\nopencode --version\nnpm install -g @opencode-ai/cli",
|
|
119
119
|
"opencode_start.started_not_ready": "⚠️ OpenCode-Server gestartet, aber reagiert nicht\n\nPID: {pid}\n\nDer Server startet möglicherweise noch. Versuche /status in ein paar Sekunden.",
|
|
120
120
|
"opencode_start.success": "✅ OpenCode-Server erfolgreich gestartet\n\nPID: {pid}\nVersion: {version}",
|
|
121
121
|
"opencode_start.error": "🔴 Beim Starten des Servers ist ein Fehler aufgetreten.\n\nSiehe Anwendungslogs für Details.",
|
|
@@ -169,7 +169,7 @@ export const de = {
|
|
|
169
169
|
"permission.send_reply_error": "❌ Antwort auf Berechtigungsanfrage konnte nicht gesendet werden",
|
|
170
170
|
"permission.blocked.expected_reply": "⚠️ Bitte beantworte zuerst die Berechtigungsanfrage mit den Buttons oben.",
|
|
171
171
|
"permission.blocked.command_not_allowed": "⚠️ Dieser Befehl ist erst verfügbar, wenn du die Berechtigungsanfrage beantwortet hast.",
|
|
172
|
-
"permission.header": "{emoji}
|
|
172
|
+
"permission.header": "{emoji} Berechtigungsanfrage: {name}\n\n",
|
|
173
173
|
"permission.button.allow": "✅ Einmal erlauben",
|
|
174
174
|
"permission.button.always": "🔓 Immer erlauben",
|
|
175
175
|
"permission.button.reject": "❌ Ablehnen",
|
|
@@ -184,6 +184,7 @@ export const de = {
|
|
|
184
184
|
"permission.name.list": "Verzeichnis auflisten",
|
|
185
185
|
"permission.name.task": "Task",
|
|
186
186
|
"permission.name.lsp": "LSP",
|
|
187
|
+
"permission.name.external_directory": "Externes Verzeichnis",
|
|
187
188
|
"question.inactive_callback": "Umfrage ist inaktiv",
|
|
188
189
|
"question.processing_error_callback": "Verarbeitungsfehler",
|
|
189
190
|
"question.select_one_required_callback": "Wähle mindestens eine Option",
|
|
@@ -194,7 +195,7 @@ export const de = {
|
|
|
194
195
|
"question.no_active_project": "❌ Kein aktives Projekt",
|
|
195
196
|
"question.no_active_request": "❌ Keine aktive Anfrage",
|
|
196
197
|
"question.send_answers_error": "❌ Antworten konnten nicht an den Agenten gesendet werden",
|
|
197
|
-
"question.multi_hint": "\n
|
|
198
|
+
"question.multi_hint": "\n(Du kannst mehrere Optionen auswählen)",
|
|
198
199
|
"question.button.submit": "✅ Fertig",
|
|
199
200
|
"question.button.custom": "🔤 Eigene Antwort",
|
|
200
201
|
"question.button.cancel": "❌ Abbrechen",
|
|
@@ -272,7 +273,7 @@ export const de = {
|
|
|
272
273
|
"cli.args.mode_only_start": "Option --mode wird nur für den start-Befehl unterstützt",
|
|
273
274
|
"legacy.models.fetch_error": "🔴 Modellliste konnte nicht geladen werden. Prüfe den Serverstatus mit /status.",
|
|
274
275
|
"legacy.models.empty": "📋 Keine verfügbaren Modelle. Konfiguriere Provider in OpenCode.",
|
|
275
|
-
"legacy.models.header": "📋
|
|
276
|
+
"legacy.models.header": "📋 Verfügbare Modelle:\n\n",
|
|
276
277
|
"legacy.models.no_provider_models": " ⚠️ Keine verfügbaren Modelle\n",
|
|
277
278
|
"legacy.models.env_hint": "💡 Um ein Modell in .env zu nutzen:\n",
|
|
278
279
|
"legacy.models.error": "🔴 Beim Laden der Modellliste ist ein Fehler aufgetreten.",
|
package/dist/i18n/en.js
CHANGED
|
@@ -54,7 +54,7 @@ export const en = {
|
|
|
54
54
|
"bot.file_download_error": "🔴 Failed to download file",
|
|
55
55
|
"bot.model_no_pdf": "⚠️ Current model doesn't support PDF input. Sending text only.",
|
|
56
56
|
"bot.text_file_too_large": "⚠️ Text file is too large (max {maxSizeKb}KB)",
|
|
57
|
-
"status.header_running": "🟢
|
|
57
|
+
"status.header_running": "🟢 OpenCode Server is running",
|
|
58
58
|
"status.health.healthy": "Healthy",
|
|
59
59
|
"status.health.unhealthy": "Unhealthy",
|
|
60
60
|
"status.line.health": "Status: {health}",
|
|
@@ -115,7 +115,7 @@ export const en = {
|
|
|
115
115
|
"opencode_start.already_running_managed": "⚠️ OpenCode Server is already running\n\nPID: {pid}\nUptime: {seconds} seconds",
|
|
116
116
|
"opencode_start.already_running_external": "✅ OpenCode Server is already running as an external process\n\nVersion: {version}\n\nThis server was not started by bot, so /opencode-stop cannot stop it.",
|
|
117
117
|
"opencode_start.starting": "🔄 Starting OpenCode Server...",
|
|
118
|
-
"opencode_start.start_error": "🔴 Failed to start OpenCode Server\n\nError: {error}\n\nCheck that OpenCode CLI is installed and available in PATH:\
|
|
118
|
+
"opencode_start.start_error": "🔴 Failed to start OpenCode Server\n\nError: {error}\n\nCheck that OpenCode CLI is installed and available in PATH:\nopencode --version\nnpm install -g @opencode-ai/cli",
|
|
119
119
|
"opencode_start.started_not_ready": "⚠️ OpenCode Server started, but is not responding\n\nPID: {pid}\n\nServer may still be starting. Try /status in a few seconds.",
|
|
120
120
|
"opencode_start.success": "✅ OpenCode Server started successfully\n\nPID: {pid}\nVersion: {version}",
|
|
121
121
|
"opencode_start.error": "🔴 An error occurred while starting server.\n\nCheck application logs for details.",
|
|
@@ -169,7 +169,7 @@ export const en = {
|
|
|
169
169
|
"permission.send_reply_error": "❌ Failed to send permission reply",
|
|
170
170
|
"permission.blocked.expected_reply": "⚠️ Please answer the permission request first using the buttons above.",
|
|
171
171
|
"permission.blocked.command_not_allowed": "⚠️ This command is not available until you answer the permission request.",
|
|
172
|
-
"permission.header": "{emoji}
|
|
172
|
+
"permission.header": "{emoji} Permission request: {name}\n\n",
|
|
173
173
|
"permission.button.allow": "✅ Allow once",
|
|
174
174
|
"permission.button.always": "🔓 Allow always",
|
|
175
175
|
"permission.button.reject": "❌ Reject",
|
|
@@ -184,6 +184,7 @@ export const en = {
|
|
|
184
184
|
"permission.name.list": "List Directory",
|
|
185
185
|
"permission.name.task": "Task",
|
|
186
186
|
"permission.name.lsp": "LSP",
|
|
187
|
+
"permission.name.external_directory": "External Directory",
|
|
187
188
|
"question.inactive_callback": "Poll is inactive",
|
|
188
189
|
"question.processing_error_callback": "Processing error",
|
|
189
190
|
"question.select_one_required_callback": "Select at least one option",
|
|
@@ -194,7 +195,7 @@ export const en = {
|
|
|
194
195
|
"question.no_active_project": "❌ No active project",
|
|
195
196
|
"question.no_active_request": "❌ No active request",
|
|
196
197
|
"question.send_answers_error": "❌ Failed to send answers to agent",
|
|
197
|
-
"question.multi_hint": "\n
|
|
198
|
+
"question.multi_hint": "\n(You can select multiple options)",
|
|
198
199
|
"question.button.submit": "✅ Done",
|
|
199
200
|
"question.button.custom": "🔤 Custom answer",
|
|
200
201
|
"question.button.cancel": "❌ Cancel",
|
|
@@ -272,7 +273,7 @@ export const en = {
|
|
|
272
273
|
"cli.args.mode_only_start": "Option --mode is supported only for the start command",
|
|
273
274
|
"legacy.models.fetch_error": "🔴 Failed to get models list. Check server status with /status.",
|
|
274
275
|
"legacy.models.empty": "📋 No available models. Configure providers in OpenCode.",
|
|
275
|
-
"legacy.models.header": "📋
|
|
276
|
+
"legacy.models.header": "📋 Available models:\n\n",
|
|
276
277
|
"legacy.models.no_provider_models": " ⚠️ No available models\n",
|
|
277
278
|
"legacy.models.env_hint": "💡 To use model in .env:\n",
|
|
278
279
|
"legacy.models.error": "🔴 An error occurred while loading models list.",
|
package/dist/i18n/es.js
CHANGED
|
@@ -54,7 +54,7 @@ export const es = {
|
|
|
54
54
|
"bot.file_download_error": "🔴 No se pudo descargar el archivo",
|
|
55
55
|
"bot.model_no_pdf": "⚠️ El modelo actual no admite entrada PDF. Enviaré solo texto.",
|
|
56
56
|
"bot.text_file_too_large": "⚠️ El archivo de texto es demasiado grande (max {maxSizeKb}KB)",
|
|
57
|
-
"status.header_running": "🟢
|
|
57
|
+
"status.header_running": "🟢 OpenCode Server está en ejecución",
|
|
58
58
|
"status.health.healthy": "Saludable",
|
|
59
59
|
"status.health.unhealthy": "No saludable",
|
|
60
60
|
"status.line.health": "Estado: {health}",
|
|
@@ -115,7 +115,7 @@ export const es = {
|
|
|
115
115
|
"opencode_start.already_running_managed": "⚠️ OpenCode Server ya está en ejecución\n\nPID: {pid}\nTiempo activo: {seconds} segundos",
|
|
116
116
|
"opencode_start.already_running_external": "✅ OpenCode Server ya está en ejecución como un proceso externo\n\nVersión: {version}\n\nEste servidor no fue iniciado por el bot, por lo que /opencode-stop no puede detenerlo.",
|
|
117
117
|
"opencode_start.starting": "🔄 Iniciando OpenCode Server...",
|
|
118
|
-
"opencode_start.start_error": "🔴 No se pudo iniciar OpenCode Server\n\nError: {error}\n\nRevisa que OpenCode CLI esté instalado y disponible en PATH:\
|
|
118
|
+
"opencode_start.start_error": "🔴 No se pudo iniciar OpenCode Server\n\nError: {error}\n\nRevisa que OpenCode CLI esté instalado y disponible en PATH:\nopencode --version\nnpm install -g @opencode-ai/cli",
|
|
119
119
|
"opencode_start.started_not_ready": "⚠️ OpenCode Server se inició, pero no responde\n\nPID: {pid}\n\nEl servidor puede estar iniciando. Prueba /status en unos segundos.",
|
|
120
120
|
"opencode_start.success": "✅ OpenCode Server iniciado correctamente\n\nPID: {pid}\nVersión: {version}",
|
|
121
121
|
"opencode_start.error": "🔴 Ocurrió un error al iniciar el servidor.\n\nRevisa los logs de la aplicación para más detalles.",
|
|
@@ -169,7 +169,7 @@ export const es = {
|
|
|
169
169
|
"permission.send_reply_error": "❌ No se pudo enviar la respuesta de permisos",
|
|
170
170
|
"permission.blocked.expected_reply": "⚠️ Primero responde a la solicitud de permisos usando los botones de arriba.",
|
|
171
171
|
"permission.blocked.command_not_allowed": "⚠️ Este comando no está disponible hasta que respondas a la solicitud de permisos.",
|
|
172
|
-
"permission.header": "{emoji}
|
|
172
|
+
"permission.header": "{emoji} Solicitud de permisos: {name}\n\n",
|
|
173
173
|
"permission.button.allow": "✅ Permitir una vez",
|
|
174
174
|
"permission.button.always": "🔓 Permitir siempre",
|
|
175
175
|
"permission.button.reject": "❌ Rechazar",
|
|
@@ -184,6 +184,7 @@ export const es = {
|
|
|
184
184
|
"permission.name.list": "Listar directorio",
|
|
185
185
|
"permission.name.task": "Tarea",
|
|
186
186
|
"permission.name.lsp": "LSP",
|
|
187
|
+
"permission.name.external_directory": "Directorio externo",
|
|
187
188
|
"question.inactive_callback": "La encuesta está inactiva",
|
|
188
189
|
"question.processing_error_callback": "Error de procesamiento",
|
|
189
190
|
"question.select_one_required_callback": "Selecciona al menos una opción",
|
|
@@ -194,7 +195,7 @@ export const es = {
|
|
|
194
195
|
"question.no_active_project": "❌ No hay un proyecto activo",
|
|
195
196
|
"question.no_active_request": "❌ No hay una solicitud activa",
|
|
196
197
|
"question.send_answers_error": "❌ No se pudieron enviar las respuestas al agente",
|
|
197
|
-
"question.multi_hint": "\n
|
|
198
|
+
"question.multi_hint": "\n(Puedes seleccionar varias opciones)",
|
|
198
199
|
"question.button.submit": "✅ Listo",
|
|
199
200
|
"question.button.custom": "🔤 Respuesta personalizada",
|
|
200
201
|
"question.button.cancel": "❌ Cancelar",
|
|
@@ -272,7 +273,7 @@ export const es = {
|
|
|
272
273
|
"cli.args.mode_only_start": "La opción --mode solo se admite para el comando start",
|
|
273
274
|
"legacy.models.fetch_error": "🔴 No se pudo obtener la lista de modelos. Revisa el estado del servidor con /status.",
|
|
274
275
|
"legacy.models.empty": "📋 No hay modelos disponibles. Configura los proveedores en OpenCode.",
|
|
275
|
-
"legacy.models.header": "📋
|
|
276
|
+
"legacy.models.header": "📋 Modelos disponibles:\n\n",
|
|
276
277
|
"legacy.models.no_provider_models": " ⚠️ No hay modelos disponibles\n",
|
|
277
278
|
"legacy.models.env_hint": "💡 Para usar el modelo en .env:\n",
|
|
278
279
|
"legacy.models.error": "🔴 Ocurrió un error al cargar la lista de modelos.",
|
package/dist/i18n/ru.js
CHANGED
|
@@ -54,7 +54,7 @@ export const ru = {
|
|
|
54
54
|
"bot.file_download_error": "🔴 Не удалось скачать файл",
|
|
55
55
|
"bot.model_no_pdf": "⚠️ Текущая модель не поддерживает PDF. Отправляю только текст.",
|
|
56
56
|
"bot.text_file_too_large": "⚠️ Текстовый файл слишком большой (макс. {maxSizeKb}КБ)",
|
|
57
|
-
"status.header_running": "🟢
|
|
57
|
+
"status.header_running": "🟢 OpenCode Server запущен",
|
|
58
58
|
"status.health.healthy": "Healthy",
|
|
59
59
|
"status.health.unhealthy": "Unhealthy",
|
|
60
60
|
"status.line.health": "Статус: {health}",
|
|
@@ -115,7 +115,7 @@ export const ru = {
|
|
|
115
115
|
"opencode_start.already_running_managed": "⚠️ OpenCode Server уже запущен\n\nPID: {pid}\nUptime: {seconds} секунд",
|
|
116
116
|
"opencode_start.already_running_external": "✅ OpenCode Server уже запущен внешним процессом\n\nВерсия: {version}\n\nЭтот сервер не был запущен через бота, поэтому команда /opencode-stop не сможет его остановить.",
|
|
117
117
|
"opencode_start.starting": "🔄 Запускаю OpenCode Server...",
|
|
118
|
-
"opencode_start.start_error": "🔴 Не удалось запустить OpenCode Server\n\nОшибка: {error}\n\nПроверьте, что OpenCode CLI установлен и доступен в PATH:\
|
|
118
|
+
"opencode_start.start_error": "🔴 Не удалось запустить OpenCode Server\n\nОшибка: {error}\n\nПроверьте, что OpenCode CLI установлен и доступен в PATH:\nopencode --version\nnpm install -g @opencode-ai/cli",
|
|
119
119
|
"opencode_start.started_not_ready": "⚠️ OpenCode Server запущен, но не отвечает\n\nPID: {pid}\n\nСервер может запускаться. Попробуйте /status через несколько секунд.",
|
|
120
120
|
"opencode_start.success": "✅ OpenCode Server успешно запущен\n\nPID: {pid}\nВерсия: {version}",
|
|
121
121
|
"opencode_start.error": "🔴 Произошла ошибка при запуске сервера.\n\nПроверьте логи приложения для подробностей.",
|
|
@@ -169,7 +169,7 @@ export const ru = {
|
|
|
169
169
|
"permission.send_reply_error": "❌ Не удалось отправить ответ на запрос разрешения",
|
|
170
170
|
"permission.blocked.expected_reply": "⚠️ Сначала ответьте на запрос разрешения кнопками выше.",
|
|
171
171
|
"permission.blocked.command_not_allowed": "⚠️ Эта команда недоступна, пока вы не ответите на запрос разрешения.",
|
|
172
|
-
"permission.header": "{emoji}
|
|
172
|
+
"permission.header": "{emoji} Запрос разрешения: {name}\n\n",
|
|
173
173
|
"permission.button.allow": "✅ Разрешить один раз",
|
|
174
174
|
"permission.button.always": "🔓 Разрешить всегда",
|
|
175
175
|
"permission.button.reject": "❌ Отклонить",
|
|
@@ -184,6 +184,7 @@ export const ru = {
|
|
|
184
184
|
"permission.name.list": "List Directory",
|
|
185
185
|
"permission.name.task": "Task",
|
|
186
186
|
"permission.name.lsp": "LSP",
|
|
187
|
+
"permission.name.external_directory": "Внешняя директория",
|
|
187
188
|
"question.inactive_callback": "Опрос неактивен",
|
|
188
189
|
"question.processing_error_callback": "Ошибка при обработке",
|
|
189
190
|
"question.select_one_required_callback": "Выберите хотя бы один вариант",
|
|
@@ -194,7 +195,7 @@ export const ru = {
|
|
|
194
195
|
"question.no_active_project": "❌ Нет активного проекта",
|
|
195
196
|
"question.no_active_request": "❌ Нет активного запроса",
|
|
196
197
|
"question.send_answers_error": "❌ Не удалось отправить ответы агенту",
|
|
197
|
-
"question.multi_hint": "\n
|
|
198
|
+
"question.multi_hint": "\n(Можно выбрать несколько вариантов)",
|
|
198
199
|
"question.button.submit": "✅ Готово",
|
|
199
200
|
"question.button.custom": "🔤 Свой ответ",
|
|
200
201
|
"question.button.cancel": "❌ Отмена",
|
|
@@ -272,7 +273,7 @@ export const ru = {
|
|
|
272
273
|
"cli.args.mode_only_start": "Опция --mode поддерживается только для команды start",
|
|
273
274
|
"legacy.models.fetch_error": "🔴 Не удалось получить список моделей. Проверьте статус сервера /status.",
|
|
274
275
|
"legacy.models.empty": "📋 Нет доступных моделей. Настройте провайдеры через OpenCode.",
|
|
275
|
-
"legacy.models.header": "📋
|
|
276
|
+
"legacy.models.header": "📋 Доступные модели:\n\n",
|
|
276
277
|
"legacy.models.no_provider_models": " ⚠️ Нет доступных моделей\n",
|
|
277
278
|
"legacy.models.env_hint": "💡 Для использования модели в .env:\n",
|
|
278
279
|
"legacy.models.error": "🔴 Произошла ошибка при получении списка моделей.",
|
package/dist/i18n/zh.js
CHANGED
|
@@ -54,7 +54,7 @@ export const zh = {
|
|
|
54
54
|
"bot.file_download_error": "🔴 下载文件失败",
|
|
55
55
|
"bot.model_no_pdf": "⚠️ 当前模型不支持PDF输入。将仅发送文本。",
|
|
56
56
|
"bot.text_file_too_large": "⚠️ 文本文件过大(最大 {maxSizeKb}KB)",
|
|
57
|
-
"status.header_running": "🟢
|
|
57
|
+
"status.header_running": "🟢 OpenCode 服务器正在运行",
|
|
58
58
|
"status.health.healthy": "健康",
|
|
59
59
|
"status.health.unhealthy": "不健康",
|
|
60
60
|
"status.line.health": "状态:{health}",
|
|
@@ -115,7 +115,7 @@ export const zh = {
|
|
|
115
115
|
"opencode_start.already_running_managed": "⚠️ OpenCode 服务器已在运行\n\nPID:{pid}\n运行时间:{seconds} 秒",
|
|
116
116
|
"opencode_start.already_running_external": "✅ OpenCode 服务器正作为外部进程运行\n\n版本:{version}\n\n该服务器不是由机器人启动,因此 /opencode-stop 无法停止它。",
|
|
117
117
|
"opencode_start.starting": "🔄 正在启动 OpenCode 服务器...",
|
|
118
|
-
"opencode_start.start_error": "🔴 启动 OpenCode 服务器失败\n\n错误:{error}\n\n请检查 OpenCode CLI 已安装且在 PATH 中可用:\
|
|
118
|
+
"opencode_start.start_error": "🔴 启动 OpenCode 服务器失败\n\n错误:{error}\n\n请检查 OpenCode CLI 已安装且在 PATH 中可用:\nopencode --version\nnpm install -g @opencode-ai/cli",
|
|
119
119
|
"opencode_start.started_not_ready": "⚠️ OpenCode 服务器已启动,但未响应\n\nPID:{pid}\n\n服务器可能仍在启动中。几秒后试试 /status。",
|
|
120
120
|
"opencode_start.success": "✅ OpenCode 服务器启动成功\n\nPID:{pid}\n版本:{version}",
|
|
121
121
|
"opencode_start.error": "🔴 启动服务器时发生错误。\n\n请查看应用日志了解详情。",
|
|
@@ -169,7 +169,7 @@ export const zh = {
|
|
|
169
169
|
"permission.send_reply_error": "❌ 发送权限回复失败",
|
|
170
170
|
"permission.blocked.expected_reply": "⚠️ 请先使用上方按钮回答权限请求。",
|
|
171
171
|
"permission.blocked.command_not_allowed": "⚠️ 在你回答权限请求之前不可用此命令。",
|
|
172
|
-
"permission.header": "{emoji}
|
|
172
|
+
"permission.header": "{emoji} 权限请求:{name}\n\n",
|
|
173
173
|
"permission.button.allow": "✅ 允许一次",
|
|
174
174
|
"permission.button.always": "🔓 始终允许",
|
|
175
175
|
"permission.button.reject": "❌ 拒绝",
|
|
@@ -184,6 +184,7 @@ export const zh = {
|
|
|
184
184
|
"permission.name.list": "列出目录",
|
|
185
185
|
"permission.name.task": "任务",
|
|
186
186
|
"permission.name.lsp": "LSP",
|
|
187
|
+
"permission.name.external_directory": "外部目录",
|
|
187
188
|
"question.inactive_callback": "投票已失效",
|
|
188
189
|
"question.processing_error_callback": "处理错误",
|
|
189
190
|
"question.select_one_required_callback": "请至少选择一个选项",
|
|
@@ -194,7 +195,7 @@ export const zh = {
|
|
|
194
195
|
"question.no_active_project": "❌ 没有活动项目",
|
|
195
196
|
"question.no_active_request": "❌ 没有活动请求",
|
|
196
197
|
"question.send_answers_error": "❌ 向代理发送答案失败",
|
|
197
|
-
"question.multi_hint": "\n
|
|
198
|
+
"question.multi_hint": "\n(你可以选择多个选项)",
|
|
198
199
|
"question.button.submit": "✅ 完成",
|
|
199
200
|
"question.button.custom": "🔤 自定义回答",
|
|
200
201
|
"question.button.cancel": "❌ 取消",
|
|
@@ -272,7 +273,7 @@ export const zh = {
|
|
|
272
273
|
"cli.args.mode_only_start": "选项 --mode 仅支持 start 命令",
|
|
273
274
|
"legacy.models.fetch_error": "🔴 获取模型列表失败。请使用 /status 检查服务器状态。",
|
|
274
275
|
"legacy.models.empty": "📋 没有可用模型。请在 OpenCode 中配置 providers。",
|
|
275
|
-
"legacy.models.header": "📋
|
|
276
|
+
"legacy.models.header": "📋 可用模型:\n\n",
|
|
276
277
|
"legacy.models.no_provider_models": " ⚠️ 没有可用模型\n",
|
|
277
278
|
"legacy.models.env_hint": "💡 在 .env 中使用该模型:\n",
|
|
278
279
|
"legacy.models.error": "🔴 加载模型列表时发生错误。",
|