@bd7pil/ocrc 0.9.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.
Files changed (292) hide show
  1. package/LICENSE +34 -0
  2. package/README.md +330 -0
  3. package/dist/cli/host-backends.js +216 -0
  4. package/dist/cli/host-backends.js.map +1 -0
  5. package/dist/cli/host.js +185 -0
  6. package/dist/cli/host.js.map +1 -0
  7. package/dist/cli/index.js +67 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/init.js +68 -0
  10. package/dist/cli/init.js.map +1 -0
  11. package/dist/cli/install.js +220 -0
  12. package/dist/cli/install.js.map +1 -0
  13. package/dist/cli/pair.js +11 -0
  14. package/dist/cli/pair.js.map +1 -0
  15. package/dist/cli/uninstall.js +75 -0
  16. package/dist/cli/uninstall.js.map +1 -0
  17. package/dist/connectivity/auth/cf-access.js +20 -0
  18. package/dist/connectivity/auth/cf-access.js.map +1 -0
  19. package/dist/connectivity/auth/index.js +2 -0
  20. package/dist/connectivity/auth/index.js.map +1 -0
  21. package/dist/connectivity/auth/select.js +19 -0
  22. package/dist/connectivity/auth/select.js.map +1 -0
  23. package/dist/connectivity/auth/token.js +157 -0
  24. package/dist/connectivity/auth/token.js.map +1 -0
  25. package/dist/connectivity/exposure/cloudflared.js +77 -0
  26. package/dist/connectivity/exposure/cloudflared.js.map +1 -0
  27. package/dist/connectivity/exposure/index.js +2 -0
  28. package/dist/connectivity/exposure/index.js.map +1 -0
  29. package/dist/connectivity/exposure/providers.js +49 -0
  30. package/dist/connectivity/exposure/providers.js.map +1 -0
  31. package/dist/connectivity/pairing.js +29 -0
  32. package/dist/connectivity/pairing.js.map +1 -0
  33. package/dist/core/agent/acp-backend.js +539 -0
  34. package/dist/core/agent/acp-backend.js.map +1 -0
  35. package/dist/core/agent/acp-connect.js +92 -0
  36. package/dist/core/agent/acp-connect.js.map +1 -0
  37. package/dist/core/agent/acp-normalizer.js +81 -0
  38. package/dist/core/agent/acp-normalizer.js.map +1 -0
  39. package/dist/core/agent/acp-replay.js +89 -0
  40. package/dist/core/agent/acp-replay.js.map +1 -0
  41. package/dist/core/agent/acp-store.js +129 -0
  42. package/dist/core/agent/acp-store.js.map +1 -0
  43. package/dist/core/agent/backend.js +2 -0
  44. package/dist/core/agent/backend.js.map +1 -0
  45. package/dist/core/agent/diff-util.js +70 -0
  46. package/dist/core/agent/diff-util.js.map +1 -0
  47. package/dist/core/agent/event.js +12 -0
  48. package/dist/core/agent/event.js.map +1 -0
  49. package/dist/core/agent/opencode-backend.js +598 -0
  50. package/dist/core/agent/opencode-backend.js.map +1 -0
  51. package/dist/core/agent/opencode-normalizer.js +69 -0
  52. package/dist/core/agent/opencode-normalizer.js.map +1 -0
  53. package/dist/core/agent/registry.js +55 -0
  54. package/dist/core/agent/registry.js.map +1 -0
  55. package/dist/core/agent/v2-backend.js +176 -0
  56. package/dist/core/agent/v2-backend.js.map +1 -0
  57. package/dist/core/card-bus.js +74 -0
  58. package/dist/core/card-bus.js.map +1 -0
  59. package/dist/core/channels.js +95 -0
  60. package/dist/core/channels.js.map +1 -0
  61. package/dist/core/history.js +91 -0
  62. package/dist/core/history.js.map +1 -0
  63. package/dist/core/list-files.js +50 -0
  64. package/dist/core/list-files.js.map +1 -0
  65. package/dist/core/opencode-events.js +29 -0
  66. package/dist/core/opencode-events.js.map +1 -0
  67. package/dist/core/primary-election.js +91 -0
  68. package/dist/core/primary-election.js.map +1 -0
  69. package/dist/core/push.js +152 -0
  70. package/dist/core/push.js.map +1 -0
  71. package/dist/core/relay.js +400 -0
  72. package/dist/core/relay.js.map +1 -0
  73. package/dist/core/scheduler.js +150 -0
  74. package/dist/core/scheduler.js.map +1 -0
  75. package/dist/core/state.js +222 -0
  76. package/dist/core/state.js.map +1 -0
  77. package/dist/core/stream-accumulator.js +76 -0
  78. package/dist/core/stream-accumulator.js.map +1 -0
  79. package/dist/core/structured-card.js +2 -0
  80. package/dist/core/structured-card.js.map +1 -0
  81. package/dist/core/types.js +2 -0
  82. package/dist/core/types.js.map +1 -0
  83. package/dist/index.js +3 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/opencode/global-events.js +57 -0
  86. package/dist/opencode/global-events.js.map +1 -0
  87. package/dist/opencode/list-sessions.js +122 -0
  88. package/dist/opencode/list-sessions.js.map +1 -0
  89. package/dist/opencode/submit.js +39 -0
  90. package/dist/opencode/submit.js.map +1 -0
  91. package/dist/opencode/workspaces.js +51 -0
  92. package/dist/opencode/workspaces.js.map +1 -0
  93. package/dist/plugin/config.js +128 -0
  94. package/dist/plugin/config.js.map +1 -0
  95. package/dist/plugin/control-plane.js +133 -0
  96. package/dist/plugin/control-plane.js.map +1 -0
  97. package/dist/plugin/entry.js +409 -0
  98. package/dist/plugin/entry.js.map +1 -0
  99. package/dist/plugin/v2/event-map.js +193 -0
  100. package/dist/plugin/v2/event-map.js.map +1 -0
  101. package/dist/plugin/v2/types.js +15 -0
  102. package/dist/plugin/v2/types.js.map +1 -0
  103. package/dist/transport/interface.js +2 -0
  104. package/dist/transport/interface.js.map +1 -0
  105. package/dist/transport/telegram/esc.js +9 -0
  106. package/dist/transport/telegram/esc.js.map +1 -0
  107. package/dist/transport/telegram/handlers/info-commands.js +101 -0
  108. package/dist/transport/telegram/handlers/info-commands.js.map +1 -0
  109. package/dist/transport/telegram/handlers.js +1348 -0
  110. package/dist/transport/telegram/handlers.js.map +1 -0
  111. package/dist/transport/telegram/i18n/en.js +538 -0
  112. package/dist/transport/telegram/i18n/en.js.map +1 -0
  113. package/dist/transport/telegram/i18n/index.js +83 -0
  114. package/dist/transport/telegram/i18n/index.js.map +1 -0
  115. package/dist/transport/telegram/i18n/zh.js +538 -0
  116. package/dist/transport/telegram/i18n/zh.js.map +1 -0
  117. package/dist/transport/telegram/index.js +792 -0
  118. package/dist/transport/telegram/index.js.map +1 -0
  119. package/dist/transport/telegram/main-keyboard.js +36 -0
  120. package/dist/transport/telegram/main-keyboard.js.map +1 -0
  121. package/dist/transport/telegram/managers/abort-suppression-manager.js +33 -0
  122. package/dist/transport/telegram/managers/abort-suppression-manager.js.map +1 -0
  123. package/dist/transport/telegram/managers/external-input-suppression-manager.js +51 -0
  124. package/dist/transport/telegram/managers/external-input-suppression-manager.js.map +1 -0
  125. package/dist/transport/telegram/managers/interaction-manager.js +254 -0
  126. package/dist/transport/telegram/managers/interaction-manager.js.map +1 -0
  127. package/dist/transport/telegram/managers/permission-manager.js +242 -0
  128. package/dist/transport/telegram/managers/permission-manager.js.map +1 -0
  129. package/dist/transport/telegram/managers/question-manager.js +191 -0
  130. package/dist/transport/telegram/managers/question-manager.js.map +1 -0
  131. package/dist/transport/telegram/managers/rename-manager.js +56 -0
  132. package/dist/transport/telegram/managers/rename-manager.js.map +1 -0
  133. package/dist/transport/telegram/menus.js +77 -0
  134. package/dist/transport/telegram/menus.js.map +1 -0
  135. package/dist/transport/telegram/permission-flow.js +156 -0
  136. package/dist/transport/telegram/permission-flow.js.map +1 -0
  137. package/dist/transport/telegram/question-flow.js +224 -0
  138. package/dist/transport/telegram/question-flow.js.map +1 -0
  139. package/dist/transport/telegram/render/block-parser.js +365 -0
  140. package/dist/transport/telegram/render/block-parser.js.map +1 -0
  141. package/dist/transport/telegram/render/block-plain-text.js +87 -0
  142. package/dist/transport/telegram/render/block-plain-text.js.map +1 -0
  143. package/dist/transport/telegram/render/block-splitter.js +152 -0
  144. package/dist/transport/telegram/render/block-splitter.js.map +1 -0
  145. package/dist/transport/telegram/render/chunker.js +71 -0
  146. package/dist/transport/telegram/render/chunker.js.map +1 -0
  147. package/dist/transport/telegram/render/limits.js +13 -0
  148. package/dist/transport/telegram/render/limits.js.map +1 -0
  149. package/dist/transport/telegram/render/markdown-normalizer.js +102 -0
  150. package/dist/transport/telegram/render/markdown-normalizer.js.map +1 -0
  151. package/dist/transport/telegram/render/markdown-to-telegram-v2.js +116 -0
  152. package/dist/transport/telegram/render/markdown-to-telegram-v2.js.map +1 -0
  153. package/dist/transport/telegram/render/part-signature.js +14 -0
  154. package/dist/transport/telegram/render/part-signature.js.map +1 -0
  155. package/dist/transport/telegram/render/pipeline.js +23 -0
  156. package/dist/transport/telegram/render/pipeline.js.map +1 -0
  157. package/dist/transport/telegram/render/rich-blocks.js +311 -0
  158. package/dist/transport/telegram/render/rich-blocks.js.map +1 -0
  159. package/dist/transport/telegram/render/text-splitter.js +64 -0
  160. package/dist/transport/telegram/render/text-splitter.js.map +1 -0
  161. package/dist/transport/telegram/render/types.js +2 -0
  162. package/dist/transport/telegram/render/types.js.map +1 -0
  163. package/dist/transport/telegram/renderer.js +305 -0
  164. package/dist/transport/telegram/renderer.js.map +1 -0
  165. package/dist/transport/telegram/streaming/duration-formatter.js +68 -0
  166. package/dist/transport/telegram/streaming/duration-formatter.js.map +1 -0
  167. package/dist/transport/telegram/streaming/finalize-assistant-response.js +37 -0
  168. package/dist/transport/telegram/streaming/finalize-assistant-response.js.map +1 -0
  169. package/dist/transport/telegram/streaming/response-streamer.js +400 -0
  170. package/dist/transport/telegram/streaming/response-streamer.js.map +1 -0
  171. package/dist/transport/telegram/streaming/running-tool-tracker.js +150 -0
  172. package/dist/transport/telegram/streaming/running-tool-tracker.js.map +1 -0
  173. package/dist/transport/telegram/streaming/stream-throttle.js +57 -0
  174. package/dist/transport/telegram/streaming/stream-throttle.js.map +1 -0
  175. package/dist/transport/telegram/streaming/tool-call-streamer.js +390 -0
  176. package/dist/transport/telegram/streaming/tool-call-streamer.js.map +1 -0
  177. package/dist/transport/telegram/streaming-render.js +182 -0
  178. package/dist/transport/telegram/streaming-render.js.map +1 -0
  179. package/dist/transport/telegram/types/interaction.js +2 -0
  180. package/dist/transport/telegram/types/interaction.js.map +1 -0
  181. package/dist/transport/telegram/types/model.js +25 -0
  182. package/dist/transport/telegram/types/model.js.map +1 -0
  183. package/dist/transport/telegram/types/permission.js +2 -0
  184. package/dist/transport/telegram/types/permission.js.map +1 -0
  185. package/dist/transport/telegram/types/question.js +2 -0
  186. package/dist/transport/telegram/types/question.js.map +1 -0
  187. package/dist/transport/telegram/types/rename.js +2 -0
  188. package/dist/transport/telegram/types/rename.js.map +1 -0
  189. package/dist/transport/telegram/types/scheduled-task.js +23 -0
  190. package/dist/transport/telegram/types/scheduled-task.js.map +1 -0
  191. package/dist/transport/telegram/types/session.js +2 -0
  192. package/dist/transport/telegram/types/session.js.map +1 -0
  193. package/dist/transport/telegram/ui.js +28 -0
  194. package/dist/transport/telegram/ui.js.map +1 -0
  195. package/dist/transport/web/index.js +148 -0
  196. package/dist/transport/web/index.js.map +1 -0
  197. package/dist/transport/web/middleware/cf-access.js +104 -0
  198. package/dist/transport/web/middleware/cf-access.js.map +1 -0
  199. package/dist/transport/web/opencode-config.js +15 -0
  200. package/dist/transport/web/opencode-config.js.map +1 -0
  201. package/dist/transport/web/routes/abort.js +12 -0
  202. package/dist/transport/web/routes/abort.js.map +1 -0
  203. package/dist/transport/web/routes/approval.js +16 -0
  204. package/dist/transport/web/routes/approval.js.map +1 -0
  205. package/dist/transport/web/routes/catalog.js +11 -0
  206. package/dist/transport/web/routes/catalog.js.map +1 -0
  207. package/dist/transport/web/routes/channels.js +53 -0
  208. package/dist/transport/web/routes/channels.js.map +1 -0
  209. package/dist/transport/web/routes/commands.js +15 -0
  210. package/dist/transport/web/routes/commands.js.map +1 -0
  211. package/dist/transport/web/routes/context.js +17 -0
  212. package/dist/transport/web/routes/context.js.map +1 -0
  213. package/dist/transport/web/routes/controls.js +34 -0
  214. package/dist/transport/web/routes/controls.js.map +1 -0
  215. package/dist/transport/web/routes/create-session.js +21 -0
  216. package/dist/transport/web/routes/create-session.js.map +1 -0
  217. package/dist/transport/web/routes/diff.js +7 -0
  218. package/dist/transport/web/routes/diff.js.map +1 -0
  219. package/dist/transport/web/routes/files.js +22 -0
  220. package/dist/transport/web/routes/files.js.map +1 -0
  221. package/dist/transport/web/routes/logs.js +9 -0
  222. package/dist/transport/web/routes/logs.js.map +1 -0
  223. package/dist/transport/web/routes/m8.js +69 -0
  224. package/dist/transport/web/routes/m8.js.map +1 -0
  225. package/dist/transport/web/routes/mcp.js +7 -0
  226. package/dist/transport/web/routes/mcp.js.map +1 -0
  227. package/dist/transport/web/routes/message.js +32 -0
  228. package/dist/transport/web/routes/message.js.map +1 -0
  229. package/dist/transport/web/routes/overrides.js +20 -0
  230. package/dist/transport/web/routes/overrides.js.map +1 -0
  231. package/dist/transport/web/routes/question.js +32 -0
  232. package/dist/transport/web/routes/question.js.map +1 -0
  233. package/dist/transport/web/routes/rename.js +12 -0
  234. package/dist/transport/web/routes/rename.js.map +1 -0
  235. package/dist/transport/web/routes/schedules.js +28 -0
  236. package/dist/transport/web/routes/schedules.js.map +1 -0
  237. package/dist/transport/web/routes/session.js +20 -0
  238. package/dist/transport/web/routes/session.js.map +1 -0
  239. package/dist/transport/web/routes/sessions.js +25 -0
  240. package/dist/transport/web/routes/sessions.js.map +1 -0
  241. package/dist/transport/web/routes/subagents.js +11 -0
  242. package/dist/transport/web/routes/subagents.js.map +1 -0
  243. package/dist/transport/web/routes/suggestions.js +7 -0
  244. package/dist/transport/web/routes/suggestions.js.map +1 -0
  245. package/dist/transport/web/routes/todo.js +7 -0
  246. package/dist/transport/web/routes/todo.js.map +1 -0
  247. package/dist/transport/web/routes/version.js +5 -0
  248. package/dist/transport/web/routes/version.js.map +1 -0
  249. package/dist/transport/web/routes/workspaces.js +7 -0
  250. package/dist/transport/web/routes/workspaces.js.map +1 -0
  251. package/dist/transport/web/server.js +111 -0
  252. package/dist/transport/web/server.js.map +1 -0
  253. package/dist/transport/web/session-summary.js +46 -0
  254. package/dist/transport/web/session-summary.js.map +1 -0
  255. package/dist/transport/web/ws-hub.js +83 -0
  256. package/dist/transport/web/ws-hub.js.map +1 -0
  257. package/dist/utils/logger.js +105 -0
  258. package/dist/utils/logger.js.map +1 -0
  259. package/dist/utils/markdown.js +129 -0
  260. package/dist/utils/markdown.js.map +1 -0
  261. package/dist/utils/paths.js +18 -0
  262. package/dist/utils/paths.js.map +1 -0
  263. package/dist/utils/version.js +44 -0
  264. package/dist/utils/version.js.map +1 -0
  265. package/package.json +91 -0
  266. package/web/dist/_app/env.js +1 -0
  267. package/web/dist/_app/immutable/assets/0.DxN3RsuG.css +1 -0
  268. package/web/dist/_app/immutable/assets/2.BNuGfmZP.css +1 -0
  269. package/web/dist/_app/immutable/assets/3.CTDprntu.css +1 -0
  270. package/web/dist/_app/immutable/chunks/BUpwHpMJ.js +1 -0
  271. package/web/dist/_app/immutable/chunks/BjY4dxcB.js +2 -0
  272. package/web/dist/_app/immutable/chunks/C2FuqD3s.js +1 -0
  273. package/web/dist/_app/immutable/chunks/CUHGq08X.js +2 -0
  274. package/web/dist/_app/immutable/chunks/CWj6FrbW.js +1 -0
  275. package/web/dist/_app/immutable/chunks/ClvoqtGj.js +1 -0
  276. package/web/dist/_app/immutable/chunks/DIEDQ_hk.js +1 -0
  277. package/web/dist/_app/immutable/entry/app.BoRpcVMj.js +2 -0
  278. package/web/dist/_app/immutable/entry/start.Cj-PQNTq.js +1 -0
  279. package/web/dist/_app/immutable/nodes/0.y9YEms5p.js +3 -0
  280. package/web/dist/_app/immutable/nodes/1.CPhhiRM2.js +1 -0
  281. package/web/dist/_app/immutable/nodes/2.B_c84Mc9.js +1 -0
  282. package/web/dist/_app/immutable/nodes/3.ClTd0J3D.js +64 -0
  283. package/web/dist/_app/version.json +1 -0
  284. package/web/dist/apple-touch-icon.png +0 -0
  285. package/web/dist/favicon.png +0 -0
  286. package/web/dist/favicon.svg +17 -0
  287. package/web/dist/icon-192.png +0 -0
  288. package/web/dist/icon-512-maskable.png +0 -0
  289. package/web/dist/icon-512.png +0 -0
  290. package/web/dist/index.html +73 -0
  291. package/web/dist/manifest.webmanifest +28 -0
  292. package/web/dist/service-worker.js +1 -0
@@ -0,0 +1,83 @@
1
+ import { en } from "./en.js";
2
+ import { zh } from "./zh.js";
3
+ const LOCALE_DEFINITIONS = [
4
+ {
5
+ code: "en",
6
+ label: "English",
7
+ dateLocale: "en-US",
8
+ dictionary: en,
9
+ },
10
+ {
11
+ code: "zh",
12
+ label: "简体中文",
13
+ dateLocale: "zh-CN",
14
+ dictionary: zh,
15
+ },
16
+ ];
17
+ const DEFAULT_LOCALE = "zh"; // ocrc: Chinese-first
18
+ export const SUPPORTED_LOCALES = LOCALE_DEFINITIONS.map((definition) => definition.code);
19
+ const localeDefinitionByCode = Object.fromEntries(LOCALE_DEFINITIONS.map((definition) => [definition.code, definition]));
20
+ let runtimeLocaleOverride = null;
21
+ export function resolveSupportedLocale(locale) {
22
+ const normalized = locale?.trim().toLowerCase();
23
+ if (!normalized) {
24
+ return null;
25
+ }
26
+ if (Object.hasOwn(localeDefinitionByCode, normalized)) {
27
+ return normalized;
28
+ }
29
+ const baseLocale = normalized.split("-")[0];
30
+ if (baseLocale && Object.hasOwn(localeDefinitionByCode, baseLocale)) {
31
+ return baseLocale;
32
+ }
33
+ return null;
34
+ }
35
+ export function normalizeLocale(locale, fallback = DEFAULT_LOCALE) {
36
+ return resolveSupportedLocale(locale) ?? fallback;
37
+ }
38
+ export function isSupportedLocale(locale) {
39
+ return resolveSupportedLocale(locale) !== null;
40
+ }
41
+ export function getLocaleOptions() {
42
+ return LOCALE_DEFINITIONS.map(({ code, label }) => ({ code, label }));
43
+ }
44
+ export function getDateLocale(locale) {
45
+ const activeLocale = locale ?? getLocale();
46
+ return localeDefinitionByCode[activeLocale].dateLocale;
47
+ }
48
+ function interpolate(template, params) {
49
+ if (!params) {
50
+ return template;
51
+ }
52
+ return template.replace(/\{([a-zA-Z0-9_]+)\}/g, (fullMatch, key) => {
53
+ const value = params[key];
54
+ if (value === undefined || value === null) {
55
+ return fullMatch;
56
+ }
57
+ return String(value);
58
+ });
59
+ }
60
+ export function getLocale() {
61
+ if (runtimeLocaleOverride) {
62
+ return runtimeLocaleOverride;
63
+ }
64
+ // ocrc: Chinese-first fork — zh unless OCRC_LOCALE/BOT_LOCALE overrides.
65
+ const localeFromEnv = process.env.OCRC_LOCALE ?? process.env.BOT_LOCALE ?? "zh";
66
+ return normalizeLocale(localeFromEnv, DEFAULT_LOCALE);
67
+ }
68
+ export function setRuntimeLocale(locale) {
69
+ runtimeLocaleOverride = locale;
70
+ }
71
+ export function resetRuntimeLocale() {
72
+ runtimeLocaleOverride = null;
73
+ }
74
+ export function t(key, params, locale) {
75
+ const activeLocale = locale ?? getLocale();
76
+ const dictionary = localeDefinitionByCode[activeLocale].dictionary;
77
+ const template = dictionary[key] ?? en[key];
78
+ if (!template) {
79
+ return key;
80
+ }
81
+ return interpolate(template, params);
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/transport/telegram/i18n/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,538 @@
1
+ export const zh = {
2
+ "cmd.description.status": "服务器和会话状态",
3
+ "cmd.description.new": "创建新会话",
4
+ "cmd.description.stop": "停止当前操作",
5
+ "cmd.description.detach": "从当前会话分离",
6
+ "cmd.description.sessions": "列出会话",
7
+ "cmd.description.messages": "浏览会话消息",
8
+ "cmd.description.settings": "更改机器人设置",
9
+ "cmd.description.projects": "列出项目",
10
+ "cmd.description.worktree": "切换 git worktree",
11
+ "cmd.description.task": "创建定时任务",
12
+ "cmd.description.tasklist": "查看定时任务",
13
+ "cmd.description.commands": "自定义命令",
14
+ "cmd.description.skills": "技能目录",
15
+ "cmd.description.mcps": "MCP servers",
16
+ "cmd.description.opencode_start": "启动 OpenCode 服务器",
17
+ "cmd.description.opencode_stop": "停止 OpenCode 服务器",
18
+ "cmd.description.ls": "列出目录内容",
19
+ "cmd.description.help": "帮助",
20
+ "callback.unknown_command": "未知命令",
21
+ "callback.processing_error": "处理错误",
22
+ "error.load_agents": "❌ 加载代理列表失败",
23
+ "error.load_models": "❌ 加载模型列表失败",
24
+ "error.load_variants": "❌ 加载变体列表失败",
25
+ "error.context_button": "❌ 处理上下文按钮失败",
26
+ "error.generic": "🔴 出现了一些问题。",
27
+ "interaction.blocked.expired": "⚠️ 此交互已过期。请重新开始。",
28
+ "interaction.blocked.expected_callback": "⚠️ 此步骤请使用内联按钮,或点击取消。",
29
+ "interaction.blocked.expected_text": "⚠️ 此步骤请发送一条文本消息。",
30
+ "interaction.blocked.expected_command": "⚠️ 此步骤请发送一条命令。",
31
+ "interaction.blocked.command_not_allowed": "⚠️ 当前步骤不可用此命令。",
32
+ "interaction.blocked.finish_current": "⚠️ 请先完成当前交互(回答或取消),然后再打开其他菜单。",
33
+ "inline.blocked.expected_choice": "⚠️ 请使用内联按钮选择一个选项,或点击取消。",
34
+ "inline.blocked.command_not_allowed": "⚠️ 内联菜单激活期间不可用此命令。",
35
+ "question.blocked.expected_answer": "⚠️ 请使用按钮、自定义回答或取消来回答当前问题。",
36
+ "question.blocked.command_not_allowed": "⚠️ 在当前问答流程完成之前不可用此命令。",
37
+ "inline.button.cancel": "❌ 取消",
38
+ "inline.button.close": "❌ 关闭",
39
+ "inline.inactive_callback": "此菜单已失效",
40
+ "common.cancelled": "已取消",
41
+ "common.unknown": "未知",
42
+ "common.unknown_error": "未知错误",
43
+ "start.welcome": "👋 欢迎使用 OpenCode Telegram Bot!\n\n可用命令:\n/projects — 选择项目\n/sessions — 会话列表\n/new — 新建会话\n/commands — 自定义命令\n/skills — 技能目录\n/task — 定时任务\n/tasklist — 定时任务列表\n/status — 状态\n/help — 帮助\n\n请使用底部按钮选择 Agent、模型和变体。",
44
+ "help.keyboard_hint": "💡 Agent、模型、变体和上下文操作请使用底部键盘按钮。",
45
+ "help.text": "📖 **帮助**\n\n/status - 查看服务器状态\n/sessions - 会话列表\n/new - 创建新会话\n/help - 帮助",
46
+ "bot.thinking": "💭 思考中...",
47
+ "progress.compact.activity": "{header}\n{activity}",
48
+ "progress.compact.working_header": "⏳ 工作中",
49
+ "progress.compact.finished_header": "✅ 工作完成",
50
+ "progress.compact.thinking": "💭 思考中...",
51
+ "progress.compact.responding": "✍️ 正在撰写回复...",
52
+ "progress.compact.waiting_question": "❓ 等待你的回答...",
53
+ "progress.compact.waiting_permission": "🔐 等待权限...",
54
+ "progress.compact.retrying": "🔁 正在重试...",
55
+ "progress.compact.task": "🤖 任务运行中",
56
+ "progress.compact.done": "{header}\n工具调用:{tools} · 已更改文件:{files}",
57
+ "bot.project_not_selected": "🏗 未选择项目。\n\n请先使用 /projects 选择一个项目。",
58
+ "bot.creating_session": "🔄 正在创建新会话...",
59
+ "bot.create_session_error": "🔴 创建会话失败。请重试 /new,或使用 /status 检查服务器状态。",
60
+ "bot.session_created": "✅ 会话已创建:{title}",
61
+ "bot.session_busy": "⏳ 代理正在执行任务。请等待完成,或使用 /abort 中断当前运行。",
62
+ "bot.session_reset_project_mismatch": "⚠️ 活动会话与所选项目不匹配,因此已重置。使用 /sessions 选择一个会话,或 /new 创建新会话。",
63
+ "bot.prompt_send_error": "向 OpenCode 发送请求失败。",
64
+ "bot.session_error": "🔴 OpenCode 返回错误:{message}",
65
+ "bot.assistant_reply_undelivered": "⚠️ The last assistant reply could not be delivered. Send your message again if you still need it.",
66
+ "bot.stale_messages_skipped": "⚠️ Some messages were skipped while Telegram was unreachable. Please send them again.",
67
+ "bot.session_retry": "🔁 {message}\n\n提供方在重复重试时持续返回同一错误。使用 /abort 可停止。",
68
+ "bot.external_user_input": "外部用户输入",
69
+ "background.session_fallback": "会话 {id}",
70
+ "background.assistant_response": "🔔 助手已在后台会话中回复:{session}",
71
+ "background.question_asked": "❓ 后台会话需要回答:{session}",
72
+ "background.permission_asked": "🔐 后台会话请求了权限:{session}",
73
+ "background.open_session_button": "打开会话",
74
+ "bot.unknown_command": "⚠️ 未知命令:{command}。使用 /help 查看可用命令。",
75
+ "bot.photo_downloading": "⏳ 正在下载照片...",
76
+ "bot.photo_too_large": "⚠️ 照片过大(最大 {maxSizeMb}MB)",
77
+ "bot.photo_model_no_image": "⚠️ 当前模型不支持图像输入。将仅发送文本。",
78
+ "bot.photo_download_error": "🔴 下载照片失败",
79
+ "bot.photo_no_caption": "💡 提示:添加说明文字以描述你希望对这张照片做什么。",
80
+ "bot.file_downloading": "⏳ 正在下载文件...",
81
+ "bot.files_downloading": "⏳ 正在下载文件...",
82
+ "bot.file_too_large": "⚠️ 文件过大(最大 {maxSizeMb}MB)",
83
+ "bot.file_download_error": "🔴 下载文件失败",
84
+ "bot.file_type_unsupported": "⚠️ 不支持此文件类型。请发送图片、文档(PDF、DOCX、PPTX)或文本/代码文件。",
85
+ "bot.rich_message_media_skipped": "⚠️ 已跳过 {count} 个不受支持的媒体部分。",
86
+ "bot.message_type_unsupported": "⚠️ 不支持此消息类型。",
87
+ "bot.media_group_not_processed": "⚠️ 此相册中有一个或多个文件无法处理。未向 OpenCode 发送任何内容。",
88
+ "bot.media_group_download_error": "🔴 无法下载其中一个文件。未向 OpenCode 发送任何内容。",
89
+ "bot.model_no_pdf": "⚠️ 当前模型不支持PDF输入。将仅发送文本。",
90
+ "bot.document_extraction_error": "🔴 文档文本提取失败。",
91
+ "bot.text_file_too_large": "⚠️ 文本文件过大(最大 {maxSizeKb}KB)",
92
+ "status.header_running": "🟢 OpenCode 服务器正在运行",
93
+ "status.health.healthy": "健康",
94
+ "status.health.unhealthy": "不健康",
95
+ "status.line.health": "状态:{health}",
96
+ "status.line.version": "OpenCode 版本:{version}",
97
+ "status.line.bot_version": "Bot version: {version}",
98
+ "status.line.managed_yes": "由机器人启动:是",
99
+ "status.line.managed_no": "由机器人启动:否",
100
+ "status.line.pid": "PID:{pid}",
101
+ "status.line.uptime_sec": "运行时间:{seconds} 秒",
102
+ "status.line.mode": "Agent:{mode}",
103
+ "status.line.model": "模型:{model}",
104
+ "status.line.tts": "语音回复:{tts}",
105
+ "status.tts.off": "关闭",
106
+ "status.tts.all": "全部",
107
+ "status.tts.auto": "自动",
108
+ "status.agent_not_set": "未设置",
109
+ "status.project_selected": "项目:{project}",
110
+ "status.worktree_selected": "Worktree:{worktree}",
111
+ "status.project_not_selected": "项目:未选择",
112
+ "status.project_hint": "使用 /projects 选择项目",
113
+ "status.session_selected": "当前会话:{title}",
114
+ "status.session_not_selected": "当前会话:未选择",
115
+ "status.session_hint": "使用 /sessions 选择一个会话,或 /new 创建",
116
+ "status.header_unavailable": "🔴 OpenCode 服务器不可用",
117
+ "status.unavailable_hint": "使用 /opencode_start 启动服务器。",
118
+ "tts.off": "🔇 语音回复已关闭。",
119
+ "tts.all": "🔊 已为所有消息启用语音回复。",
120
+ "tts.auto": "🎤 仅为语音消息启用语音回复。",
121
+ "tts.not_configured": "⚠️ 语音回复暂不可用。请先设置 `TTS_API_URL` 和 `TTS_API_KEY`。",
122
+ "tts.failed": "⚠️ 生成语音回复失败。",
123
+ "settings.menu.title": "⚙️ 机器人设置\n点按设置项以切换其值:",
124
+ "settings.compact_output.label": "紧凑输出模式",
125
+ "settings.delete_progress_on_finish.label": "完成后删除进度",
126
+ "settings.thinking_content.label": "思考内容",
127
+ "settings.response_streaming.label": "回复流式模式",
128
+ "settings.response_streaming.edit": "edit",
129
+ "settings.response_streaming.draft": "draft (experimental)",
130
+ "settings.diff_files.label": "Diff 文件",
131
+ "settings.assistant_footer.label": "回复页脚",
132
+ "settings.pin_session_dashboard.label": "Pin session dashboard",
133
+ "settings.tts.label": "语音回复",
134
+ "settings.prompt_queue.label": "消息队列",
135
+ "settings.value.on": "开启",
136
+ "settings.value.off": "关闭",
137
+ "settings.saved": "✅ 设置已保存。",
138
+ "projects.empty": "📭 未找到项目。\n\n在 OpenCode 中打开一个目录并至少创建一个会话,然后它会出现在这里。",
139
+ "projects.select": "请选择一个项目:",
140
+ "projects.select_with_current": "请选择一个项目:\n\n当前:🏗 {project}",
141
+ "projects.page_indicator": "第 {current}/{total} 页",
142
+ "projects.prev_page": "⬅️ 上一页",
143
+ "projects.next_page": "下一页 ➡️",
144
+ "projects.fetch_error": "🔴 OpenCode 服务器不可用,或加载项目时发生错误。",
145
+ "projects.page_load_error": "无法加载此页面。请重试。",
146
+ "projects.selected": "✅ 已选择项目:{project}\n\n📋 会话已重置。请在此项目中使用 /sessions 或 /new。",
147
+ "projects.select_error": "🔴 选择项目失败。",
148
+ "sessions.project_not_selected": "🏗 未选择项目。\n\n请先使用 /projects 选择一个项目。",
149
+ "sessions.empty": "📭 未找到会话。\n\n使用 /new 创建新会话。",
150
+ "sessions.select": "请选择一个会话:",
151
+ "sessions.select_page": "请选择一个会话(第 {page} 页):",
152
+ "sessions.fetch_error": "🔴 OpenCode 服务器不可用,或加载会话时发生错误。",
153
+ "sessions.select_project_first": "🔴 未选择项目。使用 /projects。",
154
+ "sessions.page_empty_callback": "这一页没有会话",
155
+ "sessions.page_load_error_callback": "无法加载此页面。请重试。",
156
+ "sessions.button.prev_page": "⬅️ 上一页",
157
+ "sessions.button.next_page": "下一页 ➡️",
158
+ "sessions.loading_context": "⏳ 正在加载上下文和最新消息...",
159
+ "sessions.selected": "✅ 已选择会话:{title}",
160
+ "sessions.select_error": "🔴 选择会话失败。",
161
+ "sessions.preview.empty": "没有最近消息。",
162
+ "sessions.preview.title": "最近消息:",
163
+ "sessions.preview.you": "你:",
164
+ "sessions.preview.agent": "代理:",
165
+ "messages.project_not_selected": "🏗 未选择项目。\n\n请先使用 /projects 选择项目。",
166
+ "messages.session_not_selected": "💬 未选择会话。\n\n请先使用 /sessions 选择会话,或使用 /new 创建会话。",
167
+ "messages.session_project_mismatch": "⚠️ 所选会话与当前项目不匹配。请通过 /sessions 重新选择会话。",
168
+ "messages.empty": "📭 当前会话中没有用户消息。",
169
+ "messages.select": "选择一条消息:",
170
+ "messages.select_page": "选择一条消息(第 {page} 页):",
171
+ "messages.fetch_error": "🔴 OpenCode Server 不可用,或加载消息时发生错误。",
172
+ "messages.inactive_callback": "此消息菜单已失效",
173
+ "messages.page_empty_callback": "此页面没有消息",
174
+ "messages.button.prev_page": "⬅️ 上一页",
175
+ "messages.button.next_page": "下一页 ➡️",
176
+ "messages.button.revert": "↩️ Revert",
177
+ "messages.button.fork": "🔀 Fork",
178
+ "messages.button.back": "⬅️ 返回",
179
+ "messages.button.cancel": "❌ 取消",
180
+ "messages.revert_success": "✅ 已恢复到消息:\n\n{text}",
181
+ "messages.revert_error": "❌ 无法恢复消息。请重试。",
182
+ "messages.fork_success": "🔀 从消息创建分支:\n\n{text}",
183
+ "messages.fork_error": "❌ 创建分支失败。请重试。",
184
+ "attach.project_not_selected": "🏗 未选择项目。\n\n请先使用 /projects 选择一个项目。",
185
+ "attach.session_not_selected": "💬 未选择会话。\n\n请先使用 /sessions 选择一个会话。",
186
+ "attach.session_project_mismatch": "⚠️ 选中的会话与当前项目不匹配。请通过 /sessions 重新选择。",
187
+ "attach.connected": "✅ 已连接到会话:{title}",
188
+ "attach.already_connected": "ℹ️ 已经连接到会话:{title}",
189
+ "attach.status.idle_message": "状态:idle。正在等待新事件。",
190
+ "attach.status.busy_message": "状态:busy。新的提示词暂时被阻止。",
191
+ "attach.restored_question": "已恢复该会话的待处理问题。",
192
+ "attach.restored_permissions": "已恢复待处理权限请求:{count}。",
193
+ "attach.disconnect_hint": "如需断开连接,只需切换到其他会话或项目。",
194
+ "attach.error": "🔴 无法连接到当前会话。",
195
+ "detach.project_not_selected": "🏗 未选择项目。\n\n请先使用 /projects 选择一个项目。",
196
+ "detach.no_active_session": "ℹ️ 机器人当前未附加到任何会话。",
197
+ "detach.success": "✅ 已从会话分离:{title}\n\nOpenCode 会话未停止。如果它仍在运行,将继续独立执行。稍后可通过 /sessions 重新选择它来查看。",
198
+ "detach.error": "🔴 无法从当前会话分离。",
199
+ "new.project_not_selected": "🏗 未选择项目。\n\n请先使用 /projects 选择一个项目。",
200
+ "new.created": "✅ 新会话已创建:{title}",
201
+ "new.create_error": "🔴 OpenCode 服务器不可用,或创建会话时发生错误。",
202
+ "stop.no_active_session": "🛑 代理尚未启动\n\n使用 /new 创建会话,或通过 /sessions 选择一个。",
203
+ "stop.in_progress": "🛑 已停止事件流,正在发送中止信号...\n\n等待代理停止。",
204
+ "stop.warn_unconfirmed": "⚠️ 事件流已停止,但服务器未确认中止。\n\n检查 /status,并在几秒后重试 /abort。",
205
+ "stop.warn_maybe_finished": "⚠️ 事件流已停止,但代理可能已完成。",
206
+ "stop.success": "✅ 代理操作已中断。本次运行的后续消息将不再发送。",
207
+ "stop.warn_still_busy": "⚠️ 信号已发送,但代理仍在忙。\n\n事件流已禁用,因此不会发送中间消息。",
208
+ "stop.warn_timeout": "⚠️ 中止请求超时。\n\n事件流已禁用,请在几秒后重试 /abort。",
209
+ "stop.warn_local_only": "⚠️ 已在本地停止事件流,但服务器端中止失败。",
210
+ "stop.error": "🔴 停止操作失败。\n\n事件流已停止,请再次尝试 /abort。",
211
+ "opencode_start.already_running_managed": "⚠️ OpenCode 服务器已在运行\n\nPID:{pid}\n运行时间:{seconds} 秒",
212
+ "opencode_start.already_running_external": "✅ OpenCode 服务器正作为外部进程运行\n\n版本:{version}\n\n该服务器不是由机器人启动,因此 /opencode-stop 无法停止它。",
213
+ "opencode_start.already_running": "✅ OpenCode 服务器已在运行\n\n版本:{version}",
214
+ "opencode_start.remote_configured": "⚠️ /opencode_start 仅适用于本地 OpenCode 服务器。",
215
+ "opencode_start.starting": "🔄 正在启动 OpenCode 服务器...",
216
+ "opencode_start.start_error": "🔴 启动 OpenCode 服务器失败\n\n错误:{error}\n\n请检查 OpenCode CLI 已安装且在 PATH 中可用:\nopencode --version\nnpm install -g @opencode-ai/cli",
217
+ "opencode_start.started_not_ready": "⚠️ OpenCode 服务器已启动,但未响应\n\nPID:{pid}\n\n服务器可能仍在启动中。几秒后试试 /status。",
218
+ "opencode_start.success": "✅ OpenCode 服务器启动成功\n\nPID:{pid}\n版本:{version}",
219
+ "opencode_start.error": "🔴 启动服务器时发生错误。\n\n请查看应用日志了解详情。",
220
+ "opencode_stop.external_running": "⚠️ OpenCode 服务器正作为外部进程运行\n\n该服务器不是通过 /opencode-start 启动的。\n请手动停止它,或使用 /status 检查状态。",
221
+ "opencode_stop.remote_configured": "⚠️ /opencode_stop 仅适用于本地 OpenCode 服务器。",
222
+ "opencode_stop.not_running": "⚠️ OpenCode 服务器未运行",
223
+ "opencode_stop.pid_not_found": "⚠️ OpenCode 服务器正在端口 {port} 上响应,但未找到可停止的本地进程。",
224
+ "opencode_stop.stopping": "🛑 正在停止 OpenCode 服务器...\n\nPID:{pid}",
225
+ "opencode_stop.stop_error": "🔴 停止 OpenCode 服务器失败\n\n错误:{error}",
226
+ "opencode_stop.still_running": "停止请求后服务器仍在响应。",
227
+ "opencode_stop.success": "✅ OpenCode 服务器已成功停止",
228
+ "opencode_stop.error": "🔴 停止服务器时发生错误。\n\n请查看应用日志了解详情。",
229
+ "agent.changed_message": "✅ Agent 已切换为:{name}",
230
+ "agent.change_error_callback": "切换 Agent 失败",
231
+ "agent.menu.current": "当前 Agent:{name}\n\n请选择 Agent:",
232
+ "agent.menu.select": "请选择 Agent:",
233
+ "agent.menu.empty": "⚠️ 没有可用的代理",
234
+ "agent.menu.error": "🔴 获取代理列表失败",
235
+ "model.changed_message": "✅ 模型已切换为:{name}",
236
+ "model.change_error_callback": "切换模型失败",
237
+ "model.menu.empty": "⚠️ 没有可用模型",
238
+ "model.menu.select": "请选择模型:",
239
+ "model.menu.current": "当前模型:{name}\n\n请选择模型:",
240
+ "model.menu.favorites_title": "⭐ 收藏(可在 OpenCode CLI 中将模型加入收藏)",
241
+ "model.menu.favorites_empty": "— 列表为空。",
242
+ "model.menu.recent_title": "🕘 最近使用",
243
+ "model.menu.recent_empty": "— 列表为空。",
244
+ "model.menu.favorites_hint": "ℹ️ 可在 OpenCode CLI 中将模型加入收藏,使其显示在列表顶部。",
245
+ "model.menu.error": "🔴 获取模型列表失败",
246
+ "model.search.button": "🔍 搜索",
247
+ "model.search.prompt": "🔍 输入模型名称进行搜索:",
248
+ "model.search.results_title": '"{query}" 的搜索结果:',
249
+ "model.search.no_results": '未找到 "{query}" 的模型',
250
+ "model.search.search_again": "↩ 重新搜索",
251
+ "model.search.error": "搜索失败",
252
+ "model.button.back": "⬅️ 返回",
253
+ "model.providers.button": "🗂 提供商",
254
+ "model.providers.title": "从列表中选择提供商:",
255
+ "model.providers.empty": "⚠️ 没有已连接的提供商",
256
+ "model.providers.error": "无法获取提供商列表",
257
+ "model.providers.page_indicator": "第 {current}/{total} 页",
258
+ "model.providers.prev_page": "⬅️ 上一页",
259
+ "model.providers.next_page": "下一页 ➡️",
260
+ "model.provider_models.title": "{provider} — 选择模型:",
261
+ "model.provider_models.empty": "⚠️ {provider} 没有可用模型",
262
+ "model.provider_models.page_indicator": "第 {current}/{total} 页",
263
+ "variant.model_not_selected_callback": "错误:未选择模型",
264
+ "variant.changed_message": "✅ 变体已切换为:{name}",
265
+ "variant.change_error_callback": "切换变体失败",
266
+ "variant.select_model_first": "⚠️ 请先选择一个模型",
267
+ "variant.menu.empty": "⚠️ 没有可用变体",
268
+ "variant.menu.current": "当前变体:{name}\n\n请选择变体:",
269
+ "variant.menu.error": "🔴 获取变体列表失败",
270
+ "context.button.confirm": "✅ 是的,压缩上下文",
271
+ "context.no_active_session": "⚠️ 没有活动会话。使用 /new 创建会话",
272
+ "context.confirm_text": '📊 会话 "{title}" 的上下文压缩\n\n这会通过移除历史中的旧消息来减少上下文占用。当前任务不会被中断。\n\n继续?',
273
+ "context.callback_compacting": "正在压缩上下文...",
274
+ "context.progress": "⏳ 正在压缩上下文...",
275
+ "context.error": "❌ 上下文压缩失败",
276
+ "context.success": "✅ 上下文压缩成功",
277
+ "permission.inactive_callback": "权限请求已失效",
278
+ "permission.processing_error_callback": "处理错误",
279
+ "permission.no_active_request_callback": "错误:没有活动请求",
280
+ "permission.reply.once": "仅允许一次",
281
+ "permission.reply.always": "始终允许",
282
+ "permission.reply.reject": "已拒绝",
283
+ "permission.send_reply_error": "❌ 发送权限回复失败",
284
+ "permission.blocked.expected_reply": "⚠️ 请先使用上方按钮回答权限请求。",
285
+ "permission.blocked.command_not_allowed": "⚠️ 在你回答权限请求之前不可用此命令。",
286
+ "permission.header": "{emoji} 权限请求:{name}\n\n",
287
+ "permission.grouped_count": "\n⚠️ 有 {count} 个相同的请求待处理,你的回答将同时应用于全部。\n",
288
+ "permission.button.allow": "✅ 允许一次",
289
+ "permission.button.always": "🔓 始终允许",
290
+ "permission.button.reject": "❌ 拒绝",
291
+ "permission.name.bash": "Bash",
292
+ "permission.name.edit": "编辑",
293
+ "permission.name.write": "写入",
294
+ "permission.name.read": "读取",
295
+ "permission.name.webfetch": "Web 获取",
296
+ "permission.name.websearch": "Web 搜索",
297
+ "permission.name.glob": "文件搜索",
298
+ "permission.name.grep": "内容搜索",
299
+ "permission.name.list": "列出目录",
300
+ "permission.name.task": "任务",
301
+ "permission.name.lsp": "LSP",
302
+ "permission.name.external_directory": "外部目录",
303
+ "question.inactive_callback": "投票已失效",
304
+ "question.processing_error_callback": "处理错误",
305
+ "question.select_one_required_callback": "请至少选择一个选项",
306
+ "question.enter_custom_callback": "请发送你的自定义回答",
307
+ "question.cancelled": "❌ 投票已取消",
308
+ "question.answer_already_received": "已收到答案,请稍候...",
309
+ "question.completed_no_answers": "✅ 投票完成(无答案)",
310
+ "question.no_active_project": "❌ 没有活动项目",
311
+ "question.no_active_request": "❌ 没有活动请求",
312
+ "question.send_answers_error": "❌ 向代理发送答案失败",
313
+ "question.multi_hint": "\n(你可以选择多个选项)",
314
+ "question.button.submit": "✅ 完成",
315
+ "question.button.custom": "🔤 自定义回答",
316
+ "question.button.cancel": "❌ 取消",
317
+ "question.use_custom_button_first": '⚠️ 要发送文本,请先点击当前问题的 "自定义回答" 按钮。',
318
+ "question.summary.title": "✅ 投票已完成!\n\n",
319
+ "question.summary.question": "问题 {index}:\n{question}\n\n",
320
+ "question.summary.answer": "回答:\n{answer}\n\n",
321
+ "keyboard.agent_mode": "{emoji} {name} Agent",
322
+ "keyboard.context": "📊 {used} / {limit} ({percent}%)",
323
+ "keyboard.context_empty": "📊 0",
324
+ "keyboard.variant": "💭 {name}",
325
+ "keyboard.variant_default": "💡 默认",
326
+ "keyboard.queued_prompt": "❌ {index}. {text}",
327
+ "queue.added": "📥 已加入队列({count}/{max})。当前任务完成后将自动发送。",
328
+ "queue.full": "⚠️ 队列已满({max})。请删除一条消息或等待当前任务完成。",
329
+ "queue.media_limit": "⚠️ 队列媒体总大小限制为 {maxSizeMb} MiB。请等待一个项目发送后重试。",
330
+ "queue.removed": "🗑 消息已从队列中移除。",
331
+ "queue.not_found": "该消息已不在队列中。",
332
+ "queue.disabled_hint": "可在 /settings 中开启消息队列。",
333
+ "keyboard.updated": "⌨️ 键盘已更新",
334
+ "pinned.default_session_title": "新会话",
335
+ "pinned.unknown": "未知",
336
+ "pinned.line.project": "项目: {project}",
337
+ "pinned.line.worktree": "Worktree: {worktree}",
338
+ "pinned.line.model": "模型: {model}",
339
+ "pinned.line.attach": "Tracking: {status}",
340
+ "pinned.attach.status.idle": "active, idle",
341
+ "pinned.attach.status.busy": "active, busy",
342
+ "pinned.line.context": "上下文: {used} / {limit} ({percent}%)",
343
+ "pinned.line.cost": "费用: {cost}",
344
+ "subagent.header": "子代理 {agent}: {description}",
345
+ "subagent.line.status": "状态: {status}",
346
+ "subagent.line.task": "任务: {task}",
347
+ "subagent.line.agent": "代理: {agent}",
348
+ "subagent.working": "执行中...",
349
+ "subagent.working_with_details": "执行中: {details}",
350
+ "subagent.completed": "已完成",
351
+ "subagent.failed": "任务失败",
352
+ "subagent.status.pending": "等待中",
353
+ "subagent.status.running": "运行中",
354
+ "subagent.status.completed": "已完成",
355
+ "subagent.status.error": "错误",
356
+ "pinned.files.title": "文件({count}):",
357
+ "pinned.files.item": " {path}{diff}",
358
+ "pinned.files.more": " ... 还有 {count} 个",
359
+ "tool.todo.overflow": "*(还有 {count} 个任务)*",
360
+ "tool.file_header.write": "写入文件/路径: {path}\n============================================================\n\n",
361
+ "tool.file_header.edit": "编辑文件/路径: {path}\n============================================================\n\n",
362
+ "runtime.wizard.ask_token": "请输入 Telegram 机器人 token(从 @BotFather 获取)。\n> ",
363
+ "runtime.wizard.ask_language": "请选择界面语言。\n输入列表中的语言编号或 locale code。\n按 Enter 保持默认语言:{defaultLocale}\n{options}\n> ",
364
+ "runtime.wizard.language_invalid": "请输入列表中的语言编号或受支持的 locale code。\n",
365
+ "runtime.wizard.language_selected": "已选择语言:{language}\n",
366
+ "runtime.wizard.token_required": "必须提供 token。请重试。\n",
367
+ "runtime.wizard.token_invalid": "token 看起来无效(期望格式 <id>:<secret>)。请重试。\n",
368
+ "runtime.wizard.ask_user_id": "请输入你的 Telegram User ID(可从 @userinfobot 获取)。\n> ",
369
+ "runtime.wizard.user_id_invalid": "请输入一个正整数(> 0)。\n",
370
+ "runtime.wizard.ask_api_url": "请输入 OpenCode API URL(可选)。\n按 Enter 使用默认值:{defaultUrl}\n> ",
371
+ "runtime.wizard.ask_server_username": "请输入 OpenCode 服务器用户名(可选)。\n按 Enter 使用默认值:{defaultUsername}\n> ",
372
+ "runtime.wizard.ask_server_password": "请输入 OpenCode 服务器密码(可选)。\n按 Enter 保持为空。\n> ",
373
+ "runtime.wizard.api_url_invalid": "请输入有效 URL(http/https),或按 Enter 使用默认值。\n",
374
+ "runtime.wizard.start": "OpenCode Telegram Bot 设置。\n",
375
+ "runtime.wizard.saved": "配置已保存:\n- {envPath}\n",
376
+ "runtime.wizard.not_configured_starting": "应用尚未配置。正在启动向导...\n",
377
+ "runtime.wizard.tty_required": "交互式向导需要 TTY 终端。请在交互式 shell 中运行 `opencode-telegram config`。",
378
+ "runtime.container.command_unavailable": "⚠️ Docker 镜像中无法使用此命令。",
379
+ "rename.no_session": "⚠️ 没有活动会话。请先创建或选择一个会话。",
380
+ "rename.prompt": "📝 请输入会话的新标题:\n\n当前:{title}",
381
+ "rename.empty_title": "⚠️ 标题不能为空。",
382
+ "rename.success": "✅ 会话已重命名为:{title}",
383
+ "rename.error": "🔴 重命名会话失败。",
384
+ "rename.cancelled": "❌ 重命名已取消。",
385
+ "rename.inactive_callback": "重命名请求已失效",
386
+ "rename.inactive": "⚠️ 重命名请求未激活。请再次运行 /rename。",
387
+ "rename.blocked.expected_name": "⚠️ 请以文本输入新会话名称,或在重命名消息中点击取消。",
388
+ "rename.blocked.command_not_allowed": "⚠️ 重命名等待新名称期间不可用此命令。",
389
+ "rename.button.cancel": "❌ 取消",
390
+ "task.prompt.schedule": "⏰ 请用自然语言发送任务的时间安排。\n\n示例:\n- 每 5 分钟\n- 每天 17:00\n- 明天 12:00",
391
+ "task.schedule_empty": "⚠️ 时间安排不能为空。",
392
+ "task.parse.in_progress": "⏳ 正在解析时间安排...",
393
+ "task.parse_error": "🔴 无法解析时间安排。\n\n{message}\n\n请用更清晰的方式重新发送。",
394
+ "task.schedule_preview": "✅ 时间安排已解析\n\n理解为:{summary}\n{cronLine}时区:{timezone}\n类型:{kind}\n下次运行:{nextRunAt}",
395
+ "task.schedule_preview.cron": "Cron: {cron}",
396
+ "task.prompt.body": "📝 现在发送机器人按此时间安排需要执行的内容。",
397
+ "task.prompt_empty": "⚠️ 任务文本不能为空。",
398
+ "task.created": "✅ 定时任务已创建\n\n任务:{description}\n项目:{project}\n代理:{agent}\n模型:{model}\n时间安排:{schedule}\n{cronLine}下次运行:{nextRunAt}",
399
+ "task.created.cron": "Cron: {cron}",
400
+ "task.button.retry_schedule": "🔁 重新输入时间安排",
401
+ "task.button.cancel": "❌ 取消",
402
+ "task.retry_schedule_callback": "正在重新输入时间安排...",
403
+ "task.inactive_callback": "这个定时任务流程已失效",
404
+ "task.inactive": "⚠️ 定时任务创建流程未激活。请重新运行 /task。",
405
+ "task.blocked.expected_input": "⚠️ 请先完成当前定时任务设置:发送文本,或使用时间安排消息中的按钮。",
406
+ "task.blocked.command_not_allowed": "⚠️ 定时任务创建进行中时,此命令不可用。",
407
+ "task.limit_reached": "⚠️ 已达到任务数量上限({limit})。请先删除一个现有定时任务。",
408
+ "task.schedule_too_frequent": "重复任务过于频繁。最小允许间隔为每 5 分钟一次。",
409
+ "task.kind.cron": "重复",
410
+ "task.kind.once": "一次性",
411
+ "task.run.success": "⏰ 定时任务已完成: {description}",
412
+ "task.run.error": "🔴 定时任务执行失败: {description}\n\n错误: {error}",
413
+ "task.run.error.interactive_question": "定时任务请求了交互式问题,无法在无人值守时继续。",
414
+ "task.run.error.interactive_permission": "定时任务请求了交互式权限,无法在无人值守时继续。",
415
+ "tasklist.empty": "📭 还没有定时任务。",
416
+ "tasklist.select": "请选择一个定时任务:",
417
+ "tasklist.details": "⏰ 定时任务\n\n任务:{prompt}\n项目:{project}\n计划:{schedule}\n{cronLine}时区:{timezone}\n下次运行:{nextRunAt}\n上次运行:{lastRunAt}\n运行次数:{runCount}",
418
+ "tasklist.details.cron": "Cron: {cron}",
419
+ "tasklist.button.delete": "🗑 删除",
420
+ "tasklist.button.cancel": "❌ 取消",
421
+ "tasklist.deleted_callback": "已删除",
422
+ "tasklist.inactive_callback": "此定时任务菜单已失效",
423
+ "tasklist.load_error": "🔴 无法加载定时任务。",
424
+ "commands.select": "请选择一个 OpenCode 命令:",
425
+ "commands.empty": "📭 当前项目没有可用的 OpenCode 命令。",
426
+ "commands.fetch_error": "🔴 加载 OpenCode 命令失败。",
427
+ "commands.no_description": "无描述",
428
+ "commands.button.execute": "✅ 执行",
429
+ "commands.button.cancel": "❌ 取消",
430
+ "commands.confirm": "请确认执行命令 {command}。若需带参数执行,请发送一条包含参数的消息。",
431
+ "commands.inactive_callback": "该命令菜单已失效",
432
+ "commands.execute_callback": "正在执行命令...",
433
+ "commands.executing_prefix": "⚡ 执行命令:",
434
+ "commands.arguments_empty": "⚠️ 参数不能为空。请发送文本或点击执行。",
435
+ "commands.execute_error": "🔴 执行 OpenCode 命令失败。",
436
+ "commands.select_page": "请选择一个 OpenCode 命令(第 {page} 页):",
437
+ "commands.button.prev_page": "⬅️ 上一页",
438
+ "commands.button.next_page": "下一页 ➡️",
439
+ "commands.page_empty_callback": "这一页没有命令",
440
+ "commands.page_load_error_callback": "无法加载此页面。请重试。",
441
+ "commands.download.no_roots": "未配置允许浏览的根目录。",
442
+ "commands.download.downloading": "正在下载文件...",
443
+ "commands.download.not_found": "未找到文件",
444
+ "commands.download.not_file": "该路径不是文件",
445
+ "commands.download.file_too_large": "文件过大",
446
+ "commands.download.size": "大小",
447
+ "commands.download.modified": "修改时间",
448
+ "commands.download.error": "下载文件失败。",
449
+ "skills.select": "请选择一个 OpenCode 技能:",
450
+ "skills.empty": "📭 当前项目没有可用的 OpenCode 技能。",
451
+ "skills.fetch_error": "🔴 加载 OpenCode 技能失败。",
452
+ "skills.no_description": "无描述",
453
+ "skills.button.execute": "✅ 执行",
454
+ "skills.button.cancel": "❌ 取消",
455
+ "skills.confirm": "请确认执行技能 {skill}。若需带参数执行,请发送一条包含参数的消息。",
456
+ "skills.inactive_callback": "该技能菜单已失效",
457
+ "skills.execute_callback": "正在使用技能...",
458
+ "skills.executing_prefix": "⚡ 使用技能:",
459
+ "skills.arguments_empty": "⚠️ 参数不能为空。请发送文本或点击执行。",
460
+ "skills.select_page": "请选择一个 OpenCode 技能(第 {page} 页):",
461
+ "skills.button.prev_page": "⬅️ 上一页",
462
+ "skills.button.next_page": "下一页 ➡️",
463
+ "skills.page_empty_callback": "这一页没有技能",
464
+ "skills.page_load_error_callback": "无法加载此页面。请重试。",
465
+ "mcps.select": "MCP servers:",
466
+ "mcps.empty": "📭 No MCP servers configured.",
467
+ "mcps.fetch_error": "🔴 Failed to load MCP servers.",
468
+ "mcps.toggle_error": "🔴 Failed to toggle MCP server.",
469
+ "mcps.enabling": "Enabling...",
470
+ "mcps.disabling": "Disabling...",
471
+ "mcps.status.connected": "🟢 Connected",
472
+ "mcps.status.disabled": "🔴 Disabled",
473
+ "mcps.status.failed": "⚠️ Failed",
474
+ "mcps.status.needs_auth": "🔒 Needs auth",
475
+ "mcps.status.needs_client_registration": "🔒 Needs registration",
476
+ "mcps.detail.title": "Server: {name}",
477
+ "mcps.detail.status": "Status: {status}",
478
+ "mcps.detail.error": "Error: {error}",
479
+ "mcps.button.enable": "🟢 Enable",
480
+ "mcps.button.disable": "🔴 Disable",
481
+ "mcps.button.back": "⬅️ Back",
482
+ "mcps.auth_required": "This server requires authorization and cannot be enabled from the bot.",
483
+ "cmd.description.rename": "重命名当前会话",
484
+ "legacy.models.fetch_error": "🔴 获取模型列表失败。请使用 /status 检查服务器状态。",
485
+ "legacy.models.empty": "📋 没有可用模型。请在 OpenCode 中配置 providers。",
486
+ "legacy.models.header": "📋 可用模型:\n\n",
487
+ "legacy.models.no_provider_models": " ⚠️ 没有可用模型\n",
488
+ "legacy.models.env_hint": "💡 在 .env 中使用该模型:\n",
489
+ "legacy.models.error": "🔴 加载模型列表时发生错误。",
490
+ "stt.recognizing": "🎤 正在识别音频...",
491
+ "stt.recognized": "🎤 识别结果:",
492
+ "stt.not_configured": "🎤 语音识别尚未配置。\n\n在 .env 中设置 STT_API_URL 和 STT_API_KEY 以启用。",
493
+ "stt.error": "🔴 识别音频失败:{error}",
494
+ "stt.empty_result": "🎤 音频消息中未检测到语音。",
495
+ "cmd.description.open": "通过浏览目录添加项目",
496
+ "worktree.branch_detached": "detached HEAD",
497
+ "worktree.select_with_current": "选择一个 worktree:",
498
+ "worktree.project_not_selected": "🏗 尚未选择项目。\n\n请先使用 /projects 选择一个项目。",
499
+ "worktree.not_git_repo": "🌿 当前项目不支持 git worktree。请先选择一个 git 仓库。",
500
+ "worktree.not_git_repo_callback": "当前项目不是 git 仓库",
501
+ "worktree.empty": "📭 当前仓库未找到任何 git worktree。",
502
+ "worktree.fetch_error": "🔴 加载 git worktree 失败。",
503
+ "worktree.page_empty_callback": "此页面没有 worktree",
504
+ "worktree.selection_missing_callback": "所选 worktree 已不可用",
505
+ "worktree.already_selected_callback": "该 worktree 已被选中",
506
+ "worktree.selected": "✅ 已选择 worktree:{worktree}\n\n📋 会话已重置。请使用 /sessions 或 /new 继续。",
507
+ "worktree.select_error": "🔴 选择 worktree 失败。",
508
+ "open.back": "⬆️ 上级",
509
+ "open.roots": "📋 返回根目录",
510
+ "open.prev_page": "⬅️ 上一页",
511
+ "open.next_page": "下一页 ➡️",
512
+ "open.select_current": "✅ 选择此文件夹",
513
+ "open.select_root": "📂 选择要浏览的根目录:",
514
+ "open.access_denied": "⛔ 访问被拒绝:路径超出允许的目录范围",
515
+ "open.scan_error": "🔴 无法浏览目录:{error}",
516
+ "open.open_error": "🔴 无法打开目录浏览器。",
517
+ "open.selected": "✅ 项目已添加:{project}\n\n📋 使用 /sessions 或 /new 开始工作。",
518
+ "open.select_error": "🔴 添加项目失败。",
519
+ "open.no_subfolders": "📭 无子文件夹",
520
+ "open.subfolder_count": "{count} 个子文件夹",
521
+ "open.subfolders_count": "{count} 个子文件夹",
522
+ "ls.access_denied": "⛔ 访问被拒绝:路径在当前项目之外",
523
+ "ls.scan_error": "🔴 无法列出目录",
524
+ "ls.header": "目录列表",
525
+ "ls.total": "总计:{count} 个项目",
526
+ "ls.file.header": "文件详情",
527
+ "ls.file.download": "📥 下载",
528
+ "ls.file.back": "⬅️ 返回",
529
+ "ls.file.attach": "📎 附加到下一条提示",
530
+ "attachment.added": "📎 已附加:{path}\n\n发送消息后文件将一并发送。",
531
+ "attachment.cancel": "❌ 取消附加",
532
+ "attachment.cancelled": "❌ 已取消附加",
533
+ "attachment.invalid": "⚠️ 附加的文件已不可用,将不带该文件发送消息。",
534
+ "local_command.empty_output": "The command produced no output.",
535
+ "local_command.failed": "Command failed with exit code {exitCode}: {stderr}",
536
+ "local_command.timeout": "The command timed out.",
537
+ };
538
+ //# sourceMappingURL=zh.js.map