zardbot-telegram 1.0.0
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/.env.example +116 -0
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/dist/agent/manager.js +88 -0
- package/dist/agent/types.js +26 -0
- package/dist/app/start-bot-app.js +49 -0
- package/dist/bot/commands/abort.js +121 -0
- package/dist/bot/commands/commands.js +480 -0
- package/dist/bot/commands/definitions.js +27 -0
- package/dist/bot/commands/help.js +10 -0
- package/dist/bot/commands/models.js +38 -0
- package/dist/bot/commands/new.js +70 -0
- package/dist/bot/commands/opencode-start.js +101 -0
- package/dist/bot/commands/opencode-stop.js +44 -0
- package/dist/bot/commands/projects.js +223 -0
- package/dist/bot/commands/rename.js +139 -0
- package/dist/bot/commands/sessions.js +351 -0
- package/dist/bot/commands/start.js +43 -0
- package/dist/bot/commands/status.js +95 -0
- package/dist/bot/commands/task.js +399 -0
- package/dist/bot/commands/tasklist.js +220 -0
- package/dist/bot/commands/voice.js +145 -0
- package/dist/bot/handlers/agent.js +118 -0
- package/dist/bot/handlers/context.js +100 -0
- package/dist/bot/handlers/document.js +65 -0
- package/dist/bot/handlers/inline-menu.js +119 -0
- package/dist/bot/handlers/model.js +143 -0
- package/dist/bot/handlers/permission.js +235 -0
- package/dist/bot/handlers/prompt.js +240 -0
- package/dist/bot/handlers/question.js +390 -0
- package/dist/bot/handlers/tts.js +89 -0
- package/dist/bot/handlers/variant.js +138 -0
- package/dist/bot/handlers/voice.js +173 -0
- package/dist/bot/index.js +977 -0
- package/dist/bot/message-patterns.js +4 -0
- package/dist/bot/middleware/auth.js +30 -0
- package/dist/bot/middleware/interaction-guard.js +95 -0
- package/dist/bot/middleware/unknown-command.js +22 -0
- package/dist/bot/streaming/response-streamer.js +286 -0
- package/dist/bot/streaming/tool-call-streamer.js +285 -0
- package/dist/bot/utils/busy-guard.js +15 -0
- package/dist/bot/utils/commands.js +21 -0
- package/dist/bot/utils/file-download.js +91 -0
- package/dist/bot/utils/finalize-assistant-response.js +52 -0
- package/dist/bot/utils/keyboard.js +69 -0
- package/dist/bot/utils/send-with-markdown-fallback.js +165 -0
- package/dist/bot/utils/telegram-text.js +28 -0
- package/dist/bot/utils/thinking-message.js +8 -0
- package/dist/cli/args.js +98 -0
- package/dist/cli.js +80 -0
- package/dist/config.js +97 -0
- package/dist/i18n/de.js +357 -0
- package/dist/i18n/en.js +357 -0
- package/dist/i18n/es.js +357 -0
- package/dist/i18n/fr.js +357 -0
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/ru.js +357 -0
- package/dist/i18n/zh.js +357 -0
- package/dist/index.js +26 -0
- package/dist/interaction/busy.js +8 -0
- package/dist/interaction/cleanup.js +32 -0
- package/dist/interaction/guard.js +140 -0
- package/dist/interaction/manager.js +106 -0
- package/dist/interaction/types.js +1 -0
- package/dist/keyboard/manager.js +172 -0
- package/dist/keyboard/types.js +1 -0
- package/dist/model/capabilities.js +62 -0
- package/dist/model/context-limit.js +57 -0
- package/dist/model/manager.js +259 -0
- package/dist/model/types.js +24 -0
- package/dist/opencode/client.js +13 -0
- package/dist/opencode/events.js +140 -0
- package/dist/permission/manager.js +100 -0
- package/dist/permission/types.js +1 -0
- package/dist/pinned/format.js +29 -0
- package/dist/pinned/manager.js +682 -0
- package/dist/pinned/types.js +1 -0
- package/dist/process/manager.js +273 -0
- package/dist/process/types.js +1 -0
- package/dist/project/manager.js +88 -0
- package/dist/question/manager.js +176 -0
- package/dist/question/types.js +1 -0
- package/dist/rename/manager.js +53 -0
- package/dist/runtime/bootstrap.js +350 -0
- package/dist/runtime/mode.js +74 -0
- package/dist/runtime/paths.js +37 -0
- package/dist/scheduled-task/creation-manager.js +113 -0
- package/dist/scheduled-task/display.js +239 -0
- package/dist/scheduled-task/executor.js +87 -0
- package/dist/scheduled-task/foreground-state.js +32 -0
- package/dist/scheduled-task/next-run.js +207 -0
- package/dist/scheduled-task/runtime.js +368 -0
- package/dist/scheduled-task/schedule-parser.js +169 -0
- package/dist/scheduled-task/store.js +65 -0
- package/dist/scheduled-task/types.js +19 -0
- package/dist/session/cache-manager.js +455 -0
- package/dist/session/manager.js +10 -0
- package/dist/settings/manager.js +158 -0
- package/dist/stt/client.js +97 -0
- package/dist/summary/aggregator.js +1136 -0
- package/dist/summary/formatter.js +491 -0
- package/dist/summary/subagent-formatter.js +63 -0
- package/dist/summary/tool-message-batcher.js +90 -0
- package/dist/tts/client.js +130 -0
- package/dist/utils/error-format.js +29 -0
- package/dist/utils/logger.js +127 -0
- package/dist/utils/safe-background-task.js +33 -0
- package/dist/utils/telegram-rate-limit-retry.js +93 -0
- package/dist/variant/manager.js +103 -0
- package/dist/variant/types.js +1 -0
- package/package.json +79 -0
package/dist/i18n/en.js
ADDED
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
export const en = {
|
|
2
|
+
"cmd.description.status": "Server and session status",
|
|
3
|
+
"cmd.description.new": "Create a new session",
|
|
4
|
+
"cmd.description.stop": "Stop current action",
|
|
5
|
+
"cmd.description.sessions": "List sessions",
|
|
6
|
+
"cmd.description.projects": "List projects",
|
|
7
|
+
"cmd.description.task": "Create a scheduled task",
|
|
8
|
+
"cmd.description.tasklist": "List scheduled tasks",
|
|
9
|
+
"cmd.description.commands": "Custom commands",
|
|
10
|
+
"cmd.description.voice": "Select TTS voice",
|
|
11
|
+
"cmd.description.opencode_start": "Start OpenCode server",
|
|
12
|
+
"cmd.description.opencode_stop": "Stop OpenCode server",
|
|
13
|
+
"cmd.description.help": "Help",
|
|
14
|
+
"callback.unknown_command": "Unknown command",
|
|
15
|
+
"callback.processing_error": "Processing error",
|
|
16
|
+
"error.load_agents": "❌ Failed to load agents list",
|
|
17
|
+
"error.load_models": "❌ Failed to load models list",
|
|
18
|
+
"error.load_variants": "❌ Failed to load variants list",
|
|
19
|
+
"error.context_button": "❌ Failed to process context button",
|
|
20
|
+
"error.generic": "🔴 Something went wrong.",
|
|
21
|
+
"interaction.blocked.expired": "⚠️ This interaction has expired. Please start it again.",
|
|
22
|
+
"interaction.blocked.expected_callback": "⚠️ Please use the inline buttons for this step or tap Cancel.",
|
|
23
|
+
"interaction.blocked.expected_text": "⚠️ Please send a text message for this step.",
|
|
24
|
+
"interaction.blocked.expected_command": "⚠️ Please send a command for this step.",
|
|
25
|
+
"interaction.blocked.command_not_allowed": "⚠️ This command is not available in the current step.",
|
|
26
|
+
"interaction.blocked.finish_current": "⚠️ Finish the current interaction first (answer or cancel), then open another menu.",
|
|
27
|
+
"inline.blocked.expected_choice": "⚠️ Choose an option using the inline buttons or tap Cancel.",
|
|
28
|
+
"inline.blocked.command_not_allowed": "⚠️ This command is not available while inline menu is active.",
|
|
29
|
+
"question.blocked.expected_answer": "⚠️ Answer the current question using buttons, Custom answer, or Cancel.",
|
|
30
|
+
"question.blocked.command_not_allowed": "⚠️ This command is not available until current question flow is completed.",
|
|
31
|
+
"inline.button.cancel": "❌ Cancel",
|
|
32
|
+
"inline.inactive_callback": "This menu is inactive",
|
|
33
|
+
"inline.cancelled_callback": "Cancelled",
|
|
34
|
+
"common.unknown": "unknown",
|
|
35
|
+
"common.unknown_error": "unknown error",
|
|
36
|
+
"start.welcome": "👋 Welcome to OpenCode Telegram Bot!\n\nUse commands:\n/projects — select project\n/sessions — session list\n/new — new session\n/task — scheduled task\n/tasklist — scheduled tasks\n/status — status\n/help — help\n\nUse the bottom buttons to select agent mode, model, and variant.",
|
|
37
|
+
"help.keyboard_hint": "💡 Use the bottom keyboard buttons for agent mode, model, variant, and context actions.",
|
|
38
|
+
"help.text": "📖 **Help**\n\n/status - Check server status\n/sessions - Session list\n/new - Create new session\n/help - Help",
|
|
39
|
+
"bot.thinking": "💭 Thinking...",
|
|
40
|
+
"bot.project_not_selected": "🏗 Project is not selected.\n\nFirst select a project with /projects.",
|
|
41
|
+
"bot.creating_session": "🔄 Creating a new session...",
|
|
42
|
+
"bot.create_session_error": "🔴 Failed to create session. Try /new or check server status with /status.",
|
|
43
|
+
"bot.session_created": "✅ Session created: {title}",
|
|
44
|
+
"bot.session_busy": "⏳ Agent is already running a task. Wait for completion or use /abort to interrupt current run.",
|
|
45
|
+
"bot.session_reset_project_mismatch": "⚠️ Active session does not match the selected project, so it was reset. Use /sessions to pick one or /new to create a new session.",
|
|
46
|
+
"bot.prompt_send_error": "Failed to send request to OpenCode.",
|
|
47
|
+
"bot.session_error": "🔴 OpenCode returned an error: {message}",
|
|
48
|
+
"bot.session_retry": "🔁 {message}\n\nProvider keeps returning the same error on repeated retries. Use /abort to abort.",
|
|
49
|
+
"bot.unknown_command": "⚠️ Unknown command: {command}. Use /help to see available commands.",
|
|
50
|
+
"bot.photo_downloading": "⏳ Downloading photo...",
|
|
51
|
+
"bot.photo_too_large": "⚠️ Photo is too large (max {maxSizeMb}MB)",
|
|
52
|
+
"bot.photo_model_no_image": "⚠️ Current model doesn't support image input. Sending text only.",
|
|
53
|
+
"bot.photo_download_error": "🔴 Failed to download photo",
|
|
54
|
+
"bot.photo_no_caption": "💡 Tip: Add a caption to describe what you want to do with this photo.",
|
|
55
|
+
"bot.file_downloading": "⏳ Downloading file...",
|
|
56
|
+
"bot.file_too_large": "⚠️ File is too large (max {maxSizeMb}MB)",
|
|
57
|
+
"bot.file_download_error": "🔴 Failed to download file",
|
|
58
|
+
"bot.model_no_pdf": "⚠️ Current model doesn't support PDF input. Sending text only.",
|
|
59
|
+
"bot.text_file_too_large": "⚠️ Text file is too large (max {maxSizeKb}KB)",
|
|
60
|
+
"status.header_running": "🟢 OpenCode Server is running",
|
|
61
|
+
"status.health.healthy": "Healthy",
|
|
62
|
+
"status.health.unhealthy": "Unhealthy",
|
|
63
|
+
"status.line.health": "Status: {health}",
|
|
64
|
+
"status.line.version": "Version: {version}",
|
|
65
|
+
"status.line.managed_yes": "Started by bot: Yes",
|
|
66
|
+
"status.line.managed_no": "Started by bot: No",
|
|
67
|
+
"status.line.pid": "PID: {pid}",
|
|
68
|
+
"status.line.uptime_sec": "Uptime: {seconds} sec",
|
|
69
|
+
"status.line.mode": "Mode: {mode}",
|
|
70
|
+
"status.line.model": "Model: {model}",
|
|
71
|
+
"status.agent_not_set": "not set",
|
|
72
|
+
"status.project_selected": "Project: {project}",
|
|
73
|
+
"status.project_not_selected": "Project: not selected",
|
|
74
|
+
"status.project_hint": "Use /projects to select a project",
|
|
75
|
+
"status.session_selected": "Current session: {title}",
|
|
76
|
+
"status.session_not_selected": "Current session: not selected",
|
|
77
|
+
"status.session_hint": "Use /sessions to select one or /new to create one",
|
|
78
|
+
"status.server_unavailable": "🔴 OpenCode Server is unavailable\n\nUse /opencode_start to start the server.",
|
|
79
|
+
"projects.empty": "📭 No projects found.\n\nOpen a directory in OpenCode and create at least one session, then it will appear here.",
|
|
80
|
+
"projects.select": "Select a project:",
|
|
81
|
+
"projects.select_with_current": "Select a project:\n\nCurrent: 🏗 {project}",
|
|
82
|
+
"projects.page_indicator": "Page {current}/{total}",
|
|
83
|
+
"projects.prev_page": "⬅️ Previous",
|
|
84
|
+
"projects.next_page": "Next ➡️",
|
|
85
|
+
"projects.fetch_error": "🔴 OpenCode Server is unavailable or an error occurred while loading projects.",
|
|
86
|
+
"projects.page_load_error": "Cannot load this page. Please try again.",
|
|
87
|
+
"projects.selected": "✅ Project selected: {project}\n\n📋 Session was reset. Use /sessions or /new for this project.",
|
|
88
|
+
"projects.select_error": "🔴 Failed to select project.",
|
|
89
|
+
"sessions.project_not_selected": "🏗 Project is not selected.\n\nFirst select a project with /projects.",
|
|
90
|
+
"sessions.empty": "📭 No sessions found.\n\nCreate a new session with /new.",
|
|
91
|
+
"sessions.select": "Select a session:",
|
|
92
|
+
"sessions.select_page": "Select a session (page {page}):",
|
|
93
|
+
"sessions.fetch_error": "🔴 OpenCode Server is unavailable or an error occurred while loading sessions.",
|
|
94
|
+
"sessions.select_project_first": "🔴 Project is not selected. Use /projects.",
|
|
95
|
+
"sessions.page_empty_callback": "No sessions on this page",
|
|
96
|
+
"sessions.page_load_error_callback": "Cannot load this page. Please try again.",
|
|
97
|
+
"sessions.button.prev_page": "⬅️ Prev",
|
|
98
|
+
"sessions.button.next_page": "Next ➡️",
|
|
99
|
+
"sessions.loading_context": "⏳ Loading context and latest messages...",
|
|
100
|
+
"sessions.selected": "✅ Session selected: {title}",
|
|
101
|
+
"sessions.select_error": "🔴 Failed to select session.",
|
|
102
|
+
"sessions.preview.empty": "No recent messages.",
|
|
103
|
+
"sessions.preview.title": "Recent messages:",
|
|
104
|
+
"sessions.preview.you": "You:",
|
|
105
|
+
"sessions.preview.agent": "Agent:",
|
|
106
|
+
"new.project_not_selected": "🏗 Project is not selected.\n\nFirst select a project with /projects.",
|
|
107
|
+
"new.created": "✅ New session created: {title}",
|
|
108
|
+
"new.create_error": "🔴 OpenCode Server is unavailable or an error occurred while creating session.",
|
|
109
|
+
"stop.no_active_session": "🛑 Agent was not started\n\nCreate a session with /new or select one via /sessions.",
|
|
110
|
+
"stop.in_progress": "🛑 Event stream stopped, sending abort signal...\n\nWaiting for agent to stop.",
|
|
111
|
+
"stop.warn_unconfirmed": "⚠️ Event stream stopped, but server did not confirm abort.\n\nCheck /status and retry /abort in a few seconds.",
|
|
112
|
+
"stop.warn_maybe_finished": "⚠️ Event stream stopped, but the agent may have already finished.",
|
|
113
|
+
"stop.success": "✅ Agent action interrupted. No more messages from this run will be sent.",
|
|
114
|
+
"stop.warn_still_busy": "⚠️ Signal sent, but agent is still busy.\n\nEvent stream is already disabled, so no intermediate messages will be sent.",
|
|
115
|
+
"stop.warn_timeout": "⚠️ Abort request timeout.\n\nEvent stream is already disabled, retry /abort in a few seconds.",
|
|
116
|
+
"stop.warn_local_only": "⚠️ Event stream stopped locally, but server-side abort failed.",
|
|
117
|
+
"stop.error": "🔴 Failed to stop action.\n\nEvent stream is stopped, try /abort again.",
|
|
118
|
+
"opencode_start.already_running_managed": "⚠️ OpenCode Server is already running\n\nPID: {pid}\nUptime: {seconds} seconds",
|
|
119
|
+
"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.",
|
|
120
|
+
"opencode_start.starting": "🔄 Starting OpenCode Server...",
|
|
121
|
+
"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",
|
|
122
|
+
"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.",
|
|
123
|
+
"opencode_start.success": "✅ OpenCode Server started successfully\n\nPID: {pid}\nVersion: {version}",
|
|
124
|
+
"opencode_start.error": "🔴 An error occurred while starting server.\n\nCheck application logs for details.",
|
|
125
|
+
"opencode_stop.external_running": "⚠️ OpenCode Server is running as an external process\n\nThis server was not started via /opencode-start.\nStop it manually or use /status to check state.",
|
|
126
|
+
"opencode_stop.not_running": "⚠️ OpenCode Server is not running",
|
|
127
|
+
"opencode_stop.stopping": "🛑 Stopping OpenCode Server...\n\nPID: {pid}",
|
|
128
|
+
"opencode_stop.stop_error": "🔴 Failed to stop OpenCode Server\n\nError: {error}",
|
|
129
|
+
"opencode_stop.success": "✅ OpenCode Server stopped successfully",
|
|
130
|
+
"opencode_stop.error": "🔴 An error occurred while stopping server.\n\nCheck application logs for details.",
|
|
131
|
+
"agent.changed_callback": "Mode changed: {name}",
|
|
132
|
+
"agent.changed_message": "✅ Mode changed to: {name}",
|
|
133
|
+
"agent.change_error_callback": "Failed to change mode",
|
|
134
|
+
"agent.menu.current": "Current mode: {name}\n\nSelect mode:",
|
|
135
|
+
"agent.menu.select": "Select work mode:",
|
|
136
|
+
"agent.menu.empty": "⚠️ No available agents",
|
|
137
|
+
"agent.menu.error": "🔴 Failed to get agents list",
|
|
138
|
+
"model.changed_callback": "Model changed: {name}",
|
|
139
|
+
"model.changed_message": "✅ Model changed to: {name}",
|
|
140
|
+
"model.change_error_callback": "Failed to change model",
|
|
141
|
+
"model.menu.empty": "⚠️ No available models",
|
|
142
|
+
"model.menu.select": "Select model:",
|
|
143
|
+
"model.menu.current": "Current model: {name}\n\nSelect model:",
|
|
144
|
+
"model.menu.favorites_title": "⭐ Favorites (Add models to favorites in OpenCode CLI)",
|
|
145
|
+
"model.menu.favorites_empty": "— Empty.",
|
|
146
|
+
"model.menu.recent_title": "🕘 Recent",
|
|
147
|
+
"model.menu.recent_empty": "— Empty.",
|
|
148
|
+
"model.menu.favorites_hint": "ℹ️ Add models to favorites in OpenCode CLI to keep them at the top.",
|
|
149
|
+
"model.menu.error": "🔴 Failed to get models list",
|
|
150
|
+
"variant.model_not_selected_callback": "Error: model is not selected",
|
|
151
|
+
"variant.changed_callback": "Variant changed: {name}",
|
|
152
|
+
"variant.changed_message": "✅ Variant changed to: {name}",
|
|
153
|
+
"variant.change_error_callback": "Failed to change variant",
|
|
154
|
+
"variant.select_model_first": "⚠️ Select a model first",
|
|
155
|
+
"variant.menu.empty": "⚠️ No available variants",
|
|
156
|
+
"variant.menu.current": "Current variant: {name}\n\nSelect variant:",
|
|
157
|
+
"variant.menu.error": "🔴 Failed to get variants list",
|
|
158
|
+
"context.button.confirm": "✅ Yes, compact context",
|
|
159
|
+
"context.no_active_session": "⚠️ No active session. Create a session with /new",
|
|
160
|
+
"context.confirm_text": '📊 Context compaction for session "{title}"\n\nThis will reduce context usage by removing old messages from history. Current task will not be interrupted.\n\nContinue?',
|
|
161
|
+
"context.callback_session_not_found": "Session not found",
|
|
162
|
+
"context.callback_compacting": "Compacting context...",
|
|
163
|
+
"context.progress": "⏳ Compacting context...",
|
|
164
|
+
"context.error": "❌ Context compaction failed",
|
|
165
|
+
"context.success": "✅ Context compacted successfully",
|
|
166
|
+
"permission.inactive_callback": "Permission request is inactive",
|
|
167
|
+
"permission.processing_error_callback": "Processing error",
|
|
168
|
+
"permission.no_active_request_callback": "Error: no active request",
|
|
169
|
+
"permission.reply.once": "Allowed once",
|
|
170
|
+
"permission.reply.always": "Always allowed",
|
|
171
|
+
"permission.reply.reject": "Rejected",
|
|
172
|
+
"permission.send_reply_error": "❌ Failed to send permission reply",
|
|
173
|
+
"permission.blocked.expected_reply": "⚠️ Please answer the permission request first using the buttons above.",
|
|
174
|
+
"permission.blocked.command_not_allowed": "⚠️ This command is not available until you answer the permission request.",
|
|
175
|
+
"permission.header": "{emoji} Permission request: {name}\n\n",
|
|
176
|
+
"permission.button.allow": "✅ Allow once",
|
|
177
|
+
"permission.button.always": "🔓 Allow always",
|
|
178
|
+
"permission.button.reject": "❌ Reject",
|
|
179
|
+
"permission.name.bash": "Bash",
|
|
180
|
+
"permission.name.edit": "Edit",
|
|
181
|
+
"permission.name.write": "Write",
|
|
182
|
+
"permission.name.read": "Read",
|
|
183
|
+
"permission.name.webfetch": "Web Fetch",
|
|
184
|
+
"permission.name.websearch": "Web Search",
|
|
185
|
+
"permission.name.glob": "File Search",
|
|
186
|
+
"permission.name.grep": "Content Search",
|
|
187
|
+
"permission.name.list": "List Directory",
|
|
188
|
+
"permission.name.task": "Task",
|
|
189
|
+
"permission.name.lsp": "LSP",
|
|
190
|
+
"permission.name.external_directory": "External Directory",
|
|
191
|
+
"question.inactive_callback": "Poll is inactive",
|
|
192
|
+
"question.processing_error_callback": "Processing error",
|
|
193
|
+
"question.select_one_required_callback": "Select at least one option",
|
|
194
|
+
"question.enter_custom_callback": "Send your custom answer as a message",
|
|
195
|
+
"question.cancelled": "❌ Poll cancelled",
|
|
196
|
+
"question.answer_already_received": "Answer already received, please wait...",
|
|
197
|
+
"question.completed_no_answers": "✅ Poll completed (no answers)",
|
|
198
|
+
"question.no_active_project": "❌ No active project",
|
|
199
|
+
"question.no_active_request": "❌ No active request",
|
|
200
|
+
"question.send_answers_error": "❌ Failed to send answers to agent",
|
|
201
|
+
"question.multi_hint": "\n(You can select multiple options)",
|
|
202
|
+
"question.button.submit": "✅ Done",
|
|
203
|
+
"question.button.custom": "🔤 Custom answer",
|
|
204
|
+
"question.button.cancel": "❌ Cancel",
|
|
205
|
+
"question.use_custom_button_first": '⚠️ To send text, tap "Custom answer" for the current question first.',
|
|
206
|
+
"question.summary.title": "✅ Poll completed!\n\n",
|
|
207
|
+
"question.summary.question": "Question {index}:\n{question}\n\n",
|
|
208
|
+
"question.summary.answer": "Answer:\n{answer}\n\n",
|
|
209
|
+
"keyboard.agent_mode": "{emoji} {name} Mode",
|
|
210
|
+
"keyboard.context": "📊 {used} / {limit} ({percent}%)",
|
|
211
|
+
"keyboard.context_empty": "📊 0",
|
|
212
|
+
"keyboard.variant": "💭 {name}",
|
|
213
|
+
"keyboard.variant_default": "💡 Default",
|
|
214
|
+
"keyboard.updated": "⌨️ Keyboard updated",
|
|
215
|
+
"pinned.default_session_title": "new session",
|
|
216
|
+
"pinned.unknown": "Unknown",
|
|
217
|
+
"pinned.line.project": "Project: {project}",
|
|
218
|
+
"pinned.line.model": "Model: {model}",
|
|
219
|
+
"pinned.line.context": "Context: {used} / {limit} ({percent}%)",
|
|
220
|
+
"pinned.line.cost": "Cost: {cost} spent",
|
|
221
|
+
"subagent.header": "Subagent {agent}: {description}",
|
|
222
|
+
"subagent.line.status": "Status: {status}",
|
|
223
|
+
"subagent.line.task": "Task: {task}",
|
|
224
|
+
"subagent.line.agent": "Agent: {agent}",
|
|
225
|
+
"subagent.working": "Working...",
|
|
226
|
+
"subagent.working_with_details": "Working: {details}",
|
|
227
|
+
"subagent.completed": "Completed",
|
|
228
|
+
"subagent.failed": "Task failed",
|
|
229
|
+
"subagent.status.pending": "pending",
|
|
230
|
+
"subagent.status.running": "running",
|
|
231
|
+
"subagent.status.completed": "completed",
|
|
232
|
+
"subagent.status.error": "error",
|
|
233
|
+
"pinned.files.title": "Files ({count}):",
|
|
234
|
+
"pinned.files.item": " {path}{diff}",
|
|
235
|
+
"pinned.files.more": " ... and {count} more",
|
|
236
|
+
"tool.todo.overflow": "*({count} more tasks)*",
|
|
237
|
+
"tool.file_header.write": "Write File/Path: {path}\n============================================================\n\n",
|
|
238
|
+
"tool.file_header.edit": "Edit File/Path: {path}\n============================================================\n\n",
|
|
239
|
+
"runtime.wizard.ask_token": "Enter Telegram bot token (get it from @BotFather).\n> ",
|
|
240
|
+
"runtime.wizard.ask_language": "Select interface language.\nEnter the language number from the list or locale code.\nPress Enter to keep default language: {defaultLocale}\n{options}\n> ",
|
|
241
|
+
"runtime.wizard.language_invalid": "Enter a language number from the list or a supported locale code.\n",
|
|
242
|
+
"runtime.wizard.language_selected": "Selected language: {language}\n",
|
|
243
|
+
"runtime.wizard.token_required": "Token is required. Please try again.\n",
|
|
244
|
+
"runtime.wizard.token_invalid": "Token looks invalid (expected format <id>:<secret>). Please try again.\n",
|
|
245
|
+
"runtime.wizard.ask_user_id": "Enter your Telegram User ID (you can get it from @userinfobot).\n> ",
|
|
246
|
+
"runtime.wizard.user_id_invalid": "Enter a positive integer (> 0).\n",
|
|
247
|
+
"runtime.wizard.ask_api_url": "Enter OpenCode API URL (optional).\nPress Enter to use default: {defaultUrl}\n> ",
|
|
248
|
+
"runtime.wizard.ask_server_username": "Enter OpenCode server username (optional).\nPress Enter to use default: {defaultUsername}\n> ",
|
|
249
|
+
"runtime.wizard.ask_server_password": "Enter OpenCode server password (optional).\nPress Enter to keep it empty.\n> ",
|
|
250
|
+
"runtime.wizard.api_url_invalid": "Enter a valid URL (http/https) or press Enter for default.\n",
|
|
251
|
+
"runtime.wizard.start": "OpenCode Telegram Bot setup.\n",
|
|
252
|
+
"runtime.wizard.saved": "Configuration saved:\n- {envPath}\n- {settingsPath}\n",
|
|
253
|
+
"runtime.wizard.not_configured_starting": "Application is not configured yet. Starting wizard...\n",
|
|
254
|
+
"runtime.wizard.tty_required": "Interactive wizard requires a TTY terminal. Run `opencode-telegram config` in an interactive shell.",
|
|
255
|
+
"rename.no_session": "⚠️ No active session. Create or select a session first.",
|
|
256
|
+
"rename.prompt": "📝 Enter new title for session:\n\nCurrent: {title}",
|
|
257
|
+
"rename.empty_title": "⚠️ Title cannot be empty.",
|
|
258
|
+
"rename.success": "✅ Session renamed to: {title}",
|
|
259
|
+
"rename.error": "🔴 Failed to rename session.",
|
|
260
|
+
"rename.cancelled": "❌ Rename cancelled.",
|
|
261
|
+
"rename.inactive_callback": "Rename request is inactive",
|
|
262
|
+
"rename.inactive": "⚠️ Rename request is not active. Run /rename again.",
|
|
263
|
+
"rename.blocked.expected_name": "⚠️ Enter a new session name as text or tap Cancel in rename message.",
|
|
264
|
+
"rename.blocked.command_not_allowed": "⚠️ This command is not available while rename is waiting for a new name.",
|
|
265
|
+
"rename.button.cancel": "❌ Cancel",
|
|
266
|
+
"task.prompt.schedule": "⏰ Send the task schedule in natural language.\n\nExamples:\n- every 5 minutes\n- every day at 17:00\n- tomorrow at 12:00",
|
|
267
|
+
"task.schedule_empty": "⚠️ Schedule cannot be empty.",
|
|
268
|
+
"task.parse.in_progress": "⏳ Parsing schedule...",
|
|
269
|
+
"task.parse_error": "🔴 Failed to parse schedule.\n\n{message}\n\nSend the schedule again in a clearer form.",
|
|
270
|
+
"task.schedule_preview": "✅ Schedule parsed\n\nHow I understood it: {summary}\n{cronLine}Timezone: {timezone}\nType: {kind}\nNext run: {nextRunAt}",
|
|
271
|
+
"task.schedule_preview.cron": "Cron: {cron}",
|
|
272
|
+
"task.prompt.body": "📝 Now send what the bot should do on schedule.",
|
|
273
|
+
"task.prompt_empty": "⚠️ Task text cannot be empty.",
|
|
274
|
+
"task.created": "✅ Scheduled task created\n\nTask: {description}\nProject: {project}\nModel: {model}\nSchedule: {schedule}\n{cronLine}Next run: {nextRunAt}",
|
|
275
|
+
"task.created.cron": "Cron: {cron}",
|
|
276
|
+
"task.button.retry_schedule": "🔁 Re-enter schedule",
|
|
277
|
+
"task.button.cancel": "❌ Cancel",
|
|
278
|
+
"task.retry_schedule_callback": "Re-entering schedule...",
|
|
279
|
+
"task.cancel_callback": "Cancelling...",
|
|
280
|
+
"task.cancelled": "❌ Scheduled task creation cancelled.",
|
|
281
|
+
"task.inactive_callback": "This scheduled task flow is inactive",
|
|
282
|
+
"task.inactive": "⚠️ Scheduled task creation is not active. Run /task again.",
|
|
283
|
+
"task.blocked.expected_input": "⚠️ Finish the current scheduled task setup first by sending text or using the button in the schedule message.",
|
|
284
|
+
"task.blocked.command_not_allowed": "⚠️ This command is not available while scheduled task creation is active.",
|
|
285
|
+
"task.limit_reached": "⚠️ Task limit reached ({limit}). Delete an existing scheduled task first.",
|
|
286
|
+
"task.schedule_too_frequent": "Recurring schedule is too frequent. The minimum allowed interval is once every 5 minutes.",
|
|
287
|
+
"task.kind.cron": "recurring",
|
|
288
|
+
"task.kind.once": "one-time",
|
|
289
|
+
"task.run.success": "⏰ Scheduled task completed: {description}",
|
|
290
|
+
"task.run.error": "🔴 Scheduled task failed: {description}\n\nError: {error}",
|
|
291
|
+
"tasklist.empty": "📭 No scheduled tasks yet.",
|
|
292
|
+
"tasklist.select": "Select a scheduled task:",
|
|
293
|
+
"tasklist.details": "⏰ Scheduled task\n\nTask: {prompt}\nProject: {project}\nSchedule: {schedule}\n{cronLine}Timezone: {timezone}\nNext run: {nextRunAt}\nLast run: {lastRunAt}\nRun count: {runCount}",
|
|
294
|
+
"tasklist.details.cron": "Cron: {cron}",
|
|
295
|
+
"tasklist.button.delete": "🗑 Delete",
|
|
296
|
+
"tasklist.button.cancel": "❌ Cancel",
|
|
297
|
+
"tasklist.deleted_callback": "Deleted",
|
|
298
|
+
"tasklist.cancelled_callback": "Cancelled",
|
|
299
|
+
"tasklist.inactive_callback": "This scheduled task menu is inactive",
|
|
300
|
+
"tasklist.load_error": "🔴 Failed to load scheduled tasks.",
|
|
301
|
+
"commands.select": "Choose an OpenCode command:",
|
|
302
|
+
"commands.empty": "📭 No OpenCode commands are available for this project.",
|
|
303
|
+
"commands.fetch_error": "🔴 Failed to load OpenCode commands.",
|
|
304
|
+
"commands.no_description": "No description",
|
|
305
|
+
"commands.button.execute": "✅ Execute",
|
|
306
|
+
"commands.button.cancel": "❌ Cancel",
|
|
307
|
+
"commands.confirm": "Confirm execution of command {command}. To run it with arguments, send the arguments as a message.",
|
|
308
|
+
"commands.inactive_callback": "This command menu is inactive",
|
|
309
|
+
"commands.cancelled_callback": "Cancelled",
|
|
310
|
+
"commands.execute_callback": "Executing command...",
|
|
311
|
+
"commands.executing_prefix": "⚡ Executing command:",
|
|
312
|
+
"commands.arguments_empty": "⚠️ Arguments cannot be empty. Send text or tap Execute.",
|
|
313
|
+
"commands.execute_error": "🔴 Failed to execute OpenCode command.",
|
|
314
|
+
"commands.select_page": "Choose an OpenCode command (page {page}):",
|
|
315
|
+
"commands.button.prev_page": "⬅️ Prev",
|
|
316
|
+
"commands.button.next_page": "Next ➡️",
|
|
317
|
+
"commands.page_empty_callback": "No commands on this page",
|
|
318
|
+
"commands.page_load_error_callback": "Cannot load this page. Please try again.",
|
|
319
|
+
"cmd.description.rename": "Rename current session",
|
|
320
|
+
"cli.usage": "Usage:\n opencode-telegram [start] [--mode sources|installed]\n opencode-telegram status\n opencode-telegram stop\n opencode-telegram config\n\nNotes:\n - No command defaults to `start`\n - `--mode` is currently supported for `start` only",
|
|
321
|
+
"cli.placeholder.status": "Command `status` is currently a placeholder. Real status checks will be added in service layer (Phase 5).",
|
|
322
|
+
"cli.placeholder.stop": "Command `stop` is currently a placeholder. Real background process stop will be added in service layer (Phase 5).",
|
|
323
|
+
"cli.placeholder.unavailable": "Command is unavailable.",
|
|
324
|
+
"cli.error.prefix": "CLI error: {message}",
|
|
325
|
+
"cli.args.unknown_command": "Unknown command: {value}",
|
|
326
|
+
"cli.args.mode_requires_value": "Option --mode requires a value: sources|installed",
|
|
327
|
+
"cli.args.invalid_mode": "Invalid mode value: {value}. Expected sources|installed",
|
|
328
|
+
"cli.args.unknown_option": "Unknown option: {value}",
|
|
329
|
+
"cli.args.mode_only_start": "Option --mode is supported only for the start command",
|
|
330
|
+
"legacy.models.fetch_error": "🔴 Failed to get models list. Check server status with /status.",
|
|
331
|
+
"legacy.models.empty": "📋 No available models. Configure providers in OpenCode.",
|
|
332
|
+
"legacy.models.header": "📋 Available models:\n\n",
|
|
333
|
+
"legacy.models.no_provider_models": " ⚠️ No available models\n",
|
|
334
|
+
"legacy.models.env_hint": "💡 To use model in .env:\n",
|
|
335
|
+
"legacy.models.error": "🔴 An error occurred while loading models list.",
|
|
336
|
+
"stt.recognizing": "🎤 Recognizing audio...",
|
|
337
|
+
"stt.recognized": "🎤 Recognized:\n{text}",
|
|
338
|
+
"stt.not_configured": "🎤 Voice recognition is not configured.\n\nSet STT_API_URL and STT_API_KEY in .env to enable it.",
|
|
339
|
+
"stt.error": "🔴 Failed to recognize audio: {error}",
|
|
340
|
+
"stt.empty_result": "🎤 No speech detected in the audio message.",
|
|
341
|
+
"tts.not_configured": "🔊 Text-to-speech is not configured.\n\nSet TTS_API_URL in .env to enable it.\n\nRecommended: Use pocket-tts-server for local TTS.\nhttps://github.com/ai-joe-git/pocket-tts-server",
|
|
342
|
+
"tts.voice_changed": "🔊 Voice changed to: {voice}",
|
|
343
|
+
"tts.voice_error": "🔴 Failed to change voice: {error}",
|
|
344
|
+
"tts.fetch_voices_error": "🔴 Failed to fetch voices from TTS server.",
|
|
345
|
+
"tts.synthesis_error": "🔴 Failed to synthesize speech: {error}",
|
|
346
|
+
"tts.speaking": "🔊 Speaking...",
|
|
347
|
+
"tts.menu_title": "Select a voice:",
|
|
348
|
+
"tts.menu_current": "Current voice: {voice}\n\nSelect a voice:",
|
|
349
|
+
"tts.menu_empty": "⚠️ No voices available. Check TTS server configuration.",
|
|
350
|
+
"tts.menu_loading": "⏳ Loading voices...",
|
|
351
|
+
"tts.menu_error": "🔴 Failed to load voices.",
|
|
352
|
+
"tts.button.off": "🔇 TTS Off",
|
|
353
|
+
"tts.button.off_description": "Disable voice responses",
|
|
354
|
+
"tts.button.prev_page": "⬅️ Prev",
|
|
355
|
+
"tts.button.next_page": "Next ➡️",
|
|
356
|
+
"tts.off_success": "🔇 Voice responses disabled.",
|
|
357
|
+
};
|