@foxden-app/foxclaw 0.2.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 (126) hide show
  1. package/.env.example +36 -0
  2. package/LICENSE +22 -0
  3. package/README.md +244 -0
  4. package/README_EN.md +244 -0
  5. package/dist/channels/bridge_messaging_router.d.ts +27 -0
  6. package/dist/channels/bridge_messaging_router.js +85 -0
  7. package/dist/channels/telegram/telegram_channel_adapter.d.ts +12 -0
  8. package/dist/channels/telegram/telegram_channel_adapter.js +21 -0
  9. package/dist/channels/telegram/telegram_messaging_port.d.ts +25 -0
  10. package/dist/channels/telegram/telegram_messaging_port.js +51 -0
  11. package/dist/channels/weixin/account_store.d.ts +15 -0
  12. package/dist/channels/weixin/account_store.js +54 -0
  13. package/dist/channels/weixin/ilink/aes_ecb.d.ts +3 -0
  14. package/dist/channels/weixin/ilink/aes_ecb.js +12 -0
  15. package/dist/channels/weixin/ilink/api.d.ts +44 -0
  16. package/dist/channels/weixin/ilink/api.js +187 -0
  17. package/dist/channels/weixin/ilink/cdn_upload.d.ts +11 -0
  18. package/dist/channels/weixin/ilink/cdn_upload.js +60 -0
  19. package/dist/channels/weixin/ilink/cdn_url.d.ts +7 -0
  20. package/dist/channels/weixin/ilink/cdn_url.js +7 -0
  21. package/dist/channels/weixin/ilink/constants.d.ts +7 -0
  22. package/dist/channels/weixin/ilink/constants.js +27 -0
  23. package/dist/channels/weixin/ilink/context.d.ts +13 -0
  24. package/dist/channels/weixin/ilink/context.js +13 -0
  25. package/dist/channels/weixin/ilink/login_qr.d.ts +34 -0
  26. package/dist/channels/weixin/ilink/login_qr.js +233 -0
  27. package/dist/channels/weixin/ilink/media_image.d.ts +11 -0
  28. package/dist/channels/weixin/ilink/media_image.js +44 -0
  29. package/dist/channels/weixin/ilink/mime.d.ts +3 -0
  30. package/dist/channels/weixin/ilink/mime.js +36 -0
  31. package/dist/channels/weixin/ilink/pic_decrypt.d.ts +2 -0
  32. package/dist/channels/weixin/ilink/pic_decrypt.js +56 -0
  33. package/dist/channels/weixin/ilink/random.d.ts +2 -0
  34. package/dist/channels/weixin/ilink/random.js +7 -0
  35. package/dist/channels/weixin/ilink/redact.d.ts +4 -0
  36. package/dist/channels/weixin/ilink/redact.js +34 -0
  37. package/dist/channels/weixin/ilink/runtime_attach.d.ts +3 -0
  38. package/dist/channels/weixin/ilink/runtime_attach.js +13 -0
  39. package/dist/channels/weixin/ilink/send.d.ts +21 -0
  40. package/dist/channels/weixin/ilink/send.js +108 -0
  41. package/dist/channels/weixin/ilink/session_guard.d.ts +6 -0
  42. package/dist/channels/weixin/ilink/session_guard.js +39 -0
  43. package/dist/channels/weixin/ilink/types.d.ts +155 -0
  44. package/dist/channels/weixin/ilink/types.js +10 -0
  45. package/dist/channels/weixin/ilink/upload.d.ts +15 -0
  46. package/dist/channels/weixin/ilink/upload.js +75 -0
  47. package/dist/channels/weixin/sync_buf_store.d.ts +3 -0
  48. package/dist/channels/weixin/sync_buf_store.js +19 -0
  49. package/dist/channels/weixin/weixin_channel_adapter.d.ts +18 -0
  50. package/dist/channels/weixin/weixin_channel_adapter.js +273 -0
  51. package/dist/channels/weixin/weixin_messaging_port.d.ts +29 -0
  52. package/dist/channels/weixin/weixin_messaging_port.js +113 -0
  53. package/dist/codex_app/client.d.ts +176 -0
  54. package/dist/codex_app/client.js +1230 -0
  55. package/dist/codex_app/deeplink.d.ts +7 -0
  56. package/dist/codex_app/deeplink.js +29 -0
  57. package/dist/codex_app/local_usage.d.ts +16 -0
  58. package/dist/codex_app/local_usage.js +123 -0
  59. package/dist/config.d.ts +44 -0
  60. package/dist/config.js +131 -0
  61. package/dist/controller/access.d.ts +11 -0
  62. package/dist/controller/access.js +33 -0
  63. package/dist/controller/activity.d.ts +62 -0
  64. package/dist/controller/activity.js +330 -0
  65. package/dist/controller/commands.d.ts +6 -0
  66. package/dist/controller/commands.js +17 -0
  67. package/dist/controller/controller.d.ts +326 -0
  68. package/dist/controller/controller.js +7503 -0
  69. package/dist/controller/observer.d.ts +16 -0
  70. package/dist/controller/observer.js +98 -0
  71. package/dist/controller/presentation.d.ts +80 -0
  72. package/dist/controller/presentation.js +568 -0
  73. package/dist/controller/service_tier.d.ts +9 -0
  74. package/dist/controller/service_tier.js +32 -0
  75. package/dist/controller/session_observer.d.ts +22 -0
  76. package/dist/controller/session_observer.js +259 -0
  77. package/dist/controller/status.d.ts +10 -0
  78. package/dist/controller/status.js +28 -0
  79. package/dist/core/bridge_scope.d.ts +18 -0
  80. package/dist/core/bridge_scope.js +46 -0
  81. package/dist/core/channel_port.d.ts +15 -0
  82. package/dist/core/channel_port.js +1 -0
  83. package/dist/i18n.d.ts +1108 -0
  84. package/dist/i18n.js +1154 -0
  85. package/dist/lock.d.ts +7 -0
  86. package/dist/lock.js +80 -0
  87. package/dist/logger.d.ts +12 -0
  88. package/dist/logger.js +57 -0
  89. package/dist/main.d.ts +2 -0
  90. package/dist/main.js +236 -0
  91. package/dist/runtime.d.ts +3 -0
  92. package/dist/runtime.js +14 -0
  93. package/dist/store/database.d.ts +79 -0
  94. package/dist/store/database.js +489 -0
  95. package/dist/store/migrate_bridge_scope.d.ts +6 -0
  96. package/dist/store/migrate_bridge_scope.js +59 -0
  97. package/dist/telegram/addressing.d.ts +33 -0
  98. package/dist/telegram/addressing.js +57 -0
  99. package/dist/telegram/api.d.ts +14 -0
  100. package/dist/telegram/api.js +89 -0
  101. package/dist/telegram/gateway.d.ts +76 -0
  102. package/dist/telegram/gateway.js +383 -0
  103. package/dist/telegram/media.d.ts +34 -0
  104. package/dist/telegram/media.js +180 -0
  105. package/dist/telegram/rendering.d.ts +10 -0
  106. package/dist/telegram/rendering.js +21 -0
  107. package/dist/telegram/scope.d.ts +6 -0
  108. package/dist/telegram/scope.js +24 -0
  109. package/dist/telegram/text.d.ts +7 -0
  110. package/dist/telegram/text.js +47 -0
  111. package/dist/types.d.ts +343 -0
  112. package/dist/types.js +1 -0
  113. package/docs/agent-assisted-install.md +84 -0
  114. package/docs/install-for-beginners.md +287 -0
  115. package/docs/troubleshooting.md +239 -0
  116. package/package.json +62 -0
  117. package/scripts/doctor.sh +3 -0
  118. package/scripts/launchd/install.sh +54 -0
  119. package/scripts/status.sh +3 -0
  120. package/scripts/systemd/install.sh +83 -0
  121. package/scripts/systemd/uninstall.sh +15 -0
  122. package/skills/foxclaw/SKILL.md +167 -0
  123. package/skills/foxclaw/agents/openai.yaml +4 -0
  124. package/skills/foxclaw/references/telegram-setup.md +93 -0
  125. package/skills/foxclaw/scripts/bootstrap_host.py +350 -0
  126. package/skills/foxclaw/scripts/bootstrap_remote.py +67 -0
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,1108 @@
1
+ import type { AppLocale } from './types.js';
2
+ type MessageParams = Record<string, string | number | null | undefined>;
3
+ declare const MESSAGES: {
4
+ readonly en: {
5
+ readonly yes: "yes";
6
+ readonly no: "no";
7
+ readonly none: "none";
8
+ readonly empty: "(empty)";
9
+ readonly untitled: "(untitled)";
10
+ readonly unknown: "unknown";
11
+ readonly server_default: "server default";
12
+ readonly no_cwd: "(no cwd)";
13
+ readonly help_commands_title: "Commands:";
14
+ readonly help_advanced_aliases: "Advanced aliases: /model, /effort, /access";
15
+ readonly help_plain_text_hint: "Plain text, photos, and files continue the current thread, or create one if none is bound.";
16
+ readonly help_weixin_note: "WeChat: inline buttons are not available. Thread/model/access panels include copy-paste commands at the bottom. Example: /permissions full-access";
17
+ readonly weixin_copy_paste_divider: "---";
18
+ readonly weixin_copy_threads_title: "Copy-paste (WeChat):";
19
+ readonly weixin_copy_threads_filter: "Current filter: {term}";
20
+ readonly weixin_copy_threads_empty: "(Empty list — run /threads, then copy an /open line from the next message.)";
21
+ readonly weixin_copy_threads_filter_hint: "Filter: /threads <keyword>";
22
+ readonly weixin_copy_models_title: "Model / effort (copy one line each):";
23
+ readonly weixin_copy_efforts_title: "Effort:";
24
+ readonly weixin_copy_access_title: "Access preset (copy one line):";
25
+ readonly weixin_copy_where_nav_title: "Quick commands:";
26
+ readonly weixin_copy_auth_title: "Auth commands:";
27
+ readonly weixin_copy_approval_title: "Approval commands:";
28
+ readonly weixin_copy_answer_title: "Answer commands:";
29
+ readonly weixin_copy_plan_title: "Plan commands:";
30
+ readonly weixin_copy_mcp_title: "MCP commands:";
31
+ readonly weixin_copy_mcp_json_hint: "For form requests, reply with JSON first.";
32
+ readonly usage_access_preset: "Unknown access preset: {value}. Use: read-only, default, or full-access.";
33
+ readonly access_preset_configured: "Access preset set to: {value}";
34
+ readonly usage_mode: "Usage: /mode <default|plan>\n/plan arms Plan for the next turn only; /agent returns to Agent.";
35
+ readonly mode_current: "Current mode: {value}";
36
+ readonly mode_configured: "Mode set to: {value}";
37
+ readonly mode_plan_armed: "Plan mode is armed for the next turn only. After that turn starts, this chat returns to Agent.";
38
+ readonly usage_active: "Usage: /active <steer|queue>";
39
+ readonly active_current: "Active-turn messages: {value}";
40
+ readonly active_configured: "Active-turn messages set to: {value}";
41
+ readonly usage_goal: "Usage: /goal [objective|pause|resume|done|budget <tokens|off>|clear confirm]";
42
+ readonly usage_history: "Usage: /history [limit 1-30]";
43
+ readonly usage_files: "Usage: /files <query>";
44
+ readonly cmd_desc_help: "Show commands";
45
+ readonly cmd_desc_setup: "Unified preference panel";
46
+ readonly cmd_desc_fast: "Toggle Fast mode";
47
+ readonly cmd_desc_active: "Active-turn message behavior";
48
+ readonly cmd_desc_status: "Bridge status";
49
+ readonly cmd_desc_account: "Codex account";
50
+ readonly cmd_desc_quota: "Codex quota";
51
+ readonly cmd_desc_login_device: "ChatGPT device login";
52
+ readonly cmd_desc_threads: "Recent threads";
53
+ readonly cmd_desc_open: "Open a cached thread";
54
+ readonly cmd_desc_goal: "Thread goal";
55
+ readonly cmd_desc_history: "Recent turns";
56
+ readonly cmd_desc_files: "Find files";
57
+ readonly cmd_desc_remote: "Remote control status";
58
+ readonly cmd_desc_watch: "Watch the bound thread";
59
+ readonly cmd_desc_unwatch: "Stop watching the bound thread";
60
+ readonly cmd_desc_steer: "Steer active turn";
61
+ readonly cmd_desc_takeover: "Interrupt and send a new prompt";
62
+ readonly cmd_desc_queue: "Send after the current turn";
63
+ readonly cmd_desc_new: "Start a new thread";
64
+ readonly cmd_desc_review: "Start code review";
65
+ readonly cmd_desc_fork: "Fork current thread";
66
+ readonly cmd_desc_undo: "Rollback turns";
67
+ readonly cmd_desc_rename: "Rename current thread";
68
+ readonly cmd_desc_compact: "Compact context";
69
+ readonly cmd_desc_archive: "Archive current thread";
70
+ readonly cmd_desc_loaded: "Loaded threads";
71
+ readonly cmd_desc_skills: "List skills";
72
+ readonly cmd_desc_hooks: "List hooks";
73
+ readonly cmd_desc_plugins: "List plugins";
74
+ readonly cmd_desc_apps: "List apps";
75
+ readonly cmd_desc_features: "Feature flags";
76
+ readonly cmd_desc_config: "Config summary";
77
+ readonly cmd_desc_provider: "Provider capabilities";
78
+ readonly cmd_desc_mcp: "MCP status";
79
+ readonly cmd_desc_mode: "Agent or one-shot Plan";
80
+ readonly cmd_desc_plan: "Plan next turn only";
81
+ readonly cmd_desc_auth: "Auth and login panel";
82
+ readonly cmd_desc_auth_reload: "Reload Codex auth";
83
+ readonly cmd_desc_models: "Model settings";
84
+ readonly cmd_desc_permissions: "Access settings";
85
+ readonly cmd_desc_reveal: "Open in Codex.app";
86
+ readonly cmd_desc_where: "Current thread info";
87
+ readonly cmd_desc_interrupt: "Stop the active turn";
88
+ readonly status_connected: "Connected: {value}";
89
+ readonly status_app_server: "Codex app-server: {value}";
90
+ readonly status_app_server_running: "running";
91
+ readonly status_app_server_stale: "stale";
92
+ readonly status_user_agent: "User agent: {value}";
93
+ readonly status_current_thread: "Current thread: {value}";
94
+ readonly status_configured_model: "Configured model: {value}";
95
+ readonly status_configured_effort: "Configured effort: {value}";
96
+ readonly status_fast: "Fast: {value}";
97
+ readonly status_collaboration_mode: "Mode: {value}";
98
+ readonly status_access_preset: "Configured access: {value}";
99
+ readonly status_approval_policy: "Approval policy: {value}";
100
+ readonly status_sandbox_mode: "Sandbox: {value}";
101
+ readonly status_sync_on_open: "Sync on /open: {value}";
102
+ readonly status_sync_on_turn_complete: "Sync on turn complete: {value}";
103
+ readonly status_pending_approvals: "Pending approvals: {value}";
104
+ readonly status_pending_user_inputs: "Pending questions: {value}";
105
+ readonly status_active_turns: "Active turns: {value}";
106
+ readonly status_codex_account: "Codex account: {value}";
107
+ readonly status_codex_plan: "Codex plan: {value}";
108
+ readonly status_codex_usage_title: "Codex usage ({value}):";
109
+ readonly status_codex_usage_window: "{window}: {percent}% used{reset}";
110
+ readonly status_codex_usage_reset: ", resets {value}";
111
+ readonly status_codex_usage_unavailable: "Codex usage: unavailable ({error})";
112
+ readonly status_codex_local_history: "Codex local history: {sessions} sessions, {turns} turns, {events} usage records";
113
+ readonly status_codex_local_tokens: "Codex local tokens: total {total}; input {input}, output {output}, cached input {cached}, reasoning output {reasoning}";
114
+ readonly status_codex_local_usage_unavailable: "Codex local history: unavailable ({error})";
115
+ readonly status_codex_credits: "Codex credits: {value}";
116
+ readonly status_codex_limit_reached: "Codex limit: {value}";
117
+ readonly auth_reload_restarting: "Restarting Codex app-server to reload auth...";
118
+ readonly auth_reload_done: "Codex app-server restarted. Current auth has been reloaded.";
119
+ readonly auth_reload_blocked_active: "Cannot reload Codex auth while a turn, approval, or question is active. Wait or use /interrupt first.";
120
+ readonly usage_auth: "Usage: /auth [list|use <n>|enable <n>|disable <n>|reload|add <name>]";
121
+ readonly usage_auth_add: "Usage: /auth add <name>. Use letters, numbers, dot, dash, or underscore.";
122
+ readonly auth_list_title: "Codex auth files:";
123
+ readonly auth_current: "Current auth: {value}";
124
+ readonly auth_dir: "Auth dir: {value}";
125
+ readonly auth_candidate_count: "Candidates: {value}";
126
+ readonly auth_candidate_status_enabled: "enabled";
127
+ readonly auth_candidate_status_disabled: "disabled";
128
+ readonly auth_candidate_enabled: "Enabled auth candidate for auto-rotation: {value}";
129
+ readonly auth_candidate_disabled: "Disabled auth candidate for auto-rotation: {value}";
130
+ readonly auth_candidate_enabled_short: "Auth enabled";
131
+ readonly auth_candidate_disabled_short: "Auth disabled";
132
+ readonly auth_no_candidates: "No auth candidates found. Expected files like auth.json_personal in the auth dir.";
133
+ readonly auth_choice_expired: "This auth list is no longer active";
134
+ readonly auth_choice_mismatch: "Auth choice does not match this message";
135
+ readonly auth_choice_recorded: "Auth selected";
136
+ readonly auth_switching: "Switching Codex auth to {value}...";
137
+ readonly auth_switch_done: "Codex auth switched to {value}.";
138
+ readonly auth_auto_switching: "Codex auth problem detected ({error}). Switching to {value}...";
139
+ readonly auth_auto_done: "Auto-switched Codex auth to {value}.";
140
+ readonly auth_auto_retrying: "Retrying the same request with the new auth...";
141
+ readonly auth_auto_retry_thread_missing: "Auth was switched, but the original thread is no longer available ({threadId}). Retry was stopped to avoid creating duplicate sessions.";
142
+ readonly auth_auto_no_candidate: "Codex auth problem detected ({error}), but no unused auth candidate is available.";
143
+ readonly auth_add_exists: "Auth candidate already exists: {value}";
144
+ readonly auth_add_preparing: "Preparing new Codex auth candidate {value}...";
145
+ readonly auth_add_started: "New auth login started for {value}.";
146
+ readonly auth_add_done: "New Codex auth candidate added: {value}.";
147
+ readonly auth_add_failed: "New auth login failed for {value}: {error}";
148
+ readonly auth_add_cancelled: "New auth login cancelled. Restored previous auth.";
149
+ readonly auth_add_reverted: "Restored previous auth.";
150
+ readonly auth_add_missing_file: "Login completed, but the new auth file was not created: {value}";
151
+ readonly button_login_device: "Login device";
152
+ readonly button_auth_reload: "Reload auth";
153
+ readonly button_auth_enable: "Enable";
154
+ readonly button_auth_disable: "Disable";
155
+ readonly another_turn_running: "Another turn is already running. Use /interrupt, /takeover, /queue, or wait.";
156
+ readonly working: "Working...";
157
+ readonly usage_open: "Usage: /open <n>";
158
+ readonly usage_watch: "Usage: /watch [n]";
159
+ readonly usage_takeover: "Usage: /takeover <message>";
160
+ readonly usage_queue: "Usage: /queue <message>";
161
+ readonly unknown_cached_thread: "Unknown cached thread. Run /threads first.";
162
+ readonly cached_thread_unavailable: "That cached thread is no longer available. Run /threads again.";
163
+ readonly watch_no_thread_bound: "No thread is currently bound. Use /open first.";
164
+ readonly watch_already_enabled: "Already watching thread {threadId}.";
165
+ readonly watch_started_active: "Watching thread {threadId}. Live Codex updates from the current turn will appear here.";
166
+ readonly watch_started_idle: "Watching thread {threadId}. I will mirror the next live turn from Codex CLI here.";
167
+ readonly watch_read_only_active: "This chat is watching that turn read-only. Use approval commands if needed, or /unwatch before sending a new prompt.";
168
+ readonly watch_not_enabled: "This chat is not watching any thread.";
169
+ readonly watch_stopped: "Stopped watching thread {threadId}.";
170
+ readonly queued_prompt_set: "Queued. I will send it after the current turn finishes.";
171
+ readonly queued_prompt_replaced: "Replaced the queued prompt. I will send the new one after the current turn finishes.";
172
+ readonly bound_to_thread: "Bound to thread {threadId}";
173
+ readonly line_title: "Title: {value}";
174
+ readonly line_cwd: "CWD: {value}";
175
+ readonly codex_sync_failed: "Codex.app sync failed: {error}";
176
+ readonly opened_in_codex: "Opened in Codex.app.";
177
+ readonly started_new_thread: "Started new thread {threadId}";
178
+ readonly thread_new_prompt_short: "Send PWD";
179
+ readonly thread_new_prompt: "Send the PWD for the new thread. Send \".\" to use the default:\n{cwd}";
180
+ readonly thread_new_cwd_missing: "PWD does not exist:\n{cwd}\nCreate it and start the new thread there?";
181
+ readonly thread_new_cwd_reply_hint: "Tap Create, or reply \"yes\" to create it. Send another PWD to choose a different directory.";
182
+ readonly thread_new_cwd_expired: "This new-thread request is no longer active.";
183
+ readonly thread_new_cwd_cancelled: "New thread cancelled.";
184
+ readonly thread_new_cwd_created: "Created directory:\n{cwd}";
185
+ readonly thread_new_cwd_not_directory: "PWD exists but is not a directory:\n{cwd}";
186
+ readonly thread_new_cwd_still_missing: "Directory still does not exist after create.";
187
+ readonly thread_new_cwd_create_failed: "Failed to create PWD:\n{cwd}\n{error}";
188
+ readonly no_thread_bound_reveal: "No thread is currently bound. Use /open, /new, or send a message first.";
189
+ readonly failed_open_codex: "Failed to open Codex.app thread: {error}";
190
+ readonly opened_thread_in_codex: "Opened thread {threadId} in Codex.app.";
191
+ readonly no_active_turn: "No active turn to interrupt.";
192
+ readonly interrupt_requested_for: "Interrupt requested for {turnId}";
193
+ readonly unknown_command: "Unknown command: /{name}";
194
+ readonly unsupported_action: "Unsupported action";
195
+ readonly approval_already_resolved: "Approval already resolved";
196
+ readonly approval_mismatch: "Approval does not match this message";
197
+ readonly decision_recorded: "Decision recorded";
198
+ readonly codex_turn_error: "Codex error: {error}";
199
+ readonly user_input_requested: "Codex needs input:";
200
+ readonly user_input_reply_hint: "Reply with text, or tap an option below.";
201
+ readonly user_input_selected: "Selected: {value}";
202
+ readonly user_input_submitted: "Submitted to Codex.";
203
+ readonly user_input_submitted_waiting: "Submitted to Codex. Waiting for Codex to continue.";
204
+ readonly user_input_interrupted: "This turn was interrupted; this answer will not continue.";
205
+ readonly user_input_already_submitted: "Answer already submitted";
206
+ readonly user_input_waiting_notice: "Your answer was submitted to Codex and the turn is still waiting to continue.\nThread: {threadId}\nTurn: {turnId}";
207
+ readonly user_input_expired: "This question is no longer active";
208
+ readonly user_input_mismatch: "Question does not match this message";
209
+ readonly user_input_recorded: "Answer recorded";
210
+ readonly user_input_empty_answer: "Please send a non-empty answer.";
211
+ readonly user_input_use_buttons: "Please tap an option, or reply with text when there is only one unanswered question.";
212
+ readonly user_input_other_hint: "You may reply with a custom answer.";
213
+ readonly user_input_secret_warning: "Telegram replies are not hidden; avoid sending secrets here.";
214
+ readonly plan_impl_title: "Plan mode produced a plan.";
215
+ readonly plan_impl_prompt: "Do you want Codex to execute it now?";
216
+ readonly plan_impl_button_run: "Execute this plan";
217
+ readonly plan_impl_button_fresh: "Clear context and execute";
218
+ readonly plan_impl_button_stay: "Keep planning";
219
+ readonly plan_impl_expired: "This plan prompt is no longer active";
220
+ readonly plan_impl_mismatch: "This plan prompt does not match this message";
221
+ readonly plan_impl_staying: "Kept the plan. No execution started.";
222
+ readonly plan_impl_started: "Started executing the plan.\nThread: {threadId}\nTurn: {turnId}";
223
+ readonly plan_impl_started_fresh: "Started executing the plan in a fresh context.\nThread: {threadId}\nTurn: {turnId}";
224
+ readonly interactive_input_unsupported: "Codex requested interactive tool input, but this bridge only supports approvals in v1. Returning empty answers.";
225
+ readonly current_thread_unavailable_continued: "Current thread was unavailable. Continued in a new thread {threadId}.";
226
+ readonly previous_thread_unavailable_started: "Previous thread was unavailable. Started a new thread {threadId}.";
227
+ readonly bridge_error: "Bridge error: {error}";
228
+ readonly attachment_too_large: "Telegram attachment is too large to download via Bot API: {name} ({size} bytes)";
229
+ readonly attachment_download_failed: "Failed to download Telegram attachment {name}: {error}";
230
+ readonly approval_timed_out_denied: "Approval timed out and was denied.\nThread: {threadId}";
231
+ readonly model_change_blocked: "Cannot change model while a turn is active. Use /interrupt or wait.";
232
+ readonly model_reset: "Configured model reset to server default.";
233
+ readonly effort_adjusted_default_model: "Effort {effort} is not supported by the default model, so it was adjusted.";
234
+ readonly service_tier_cleared_due_to_model_switch: "Fast was turned off because the selected model does not support it.";
235
+ readonly applies_next_turn: "Applies on the next turn.";
236
+ readonly tip_use_models: "Tip: use /models and tap buttons next time.";
237
+ readonly unknown_model: "Unknown model: {model}\nUse /models to list available models.";
238
+ readonly model_configured: "Configured model: {model}";
239
+ readonly effort_adjusted_model: "Effort {effort} is not supported by {model}, so it was adjusted.";
240
+ readonly effort_change_blocked: "Cannot change reasoning effort while a turn is active. Use /interrupt or wait.";
241
+ readonly effort_reset: "Configured effort reset to server default.";
242
+ readonly usage_effort: "Usage: /effort <none|minimal|low|medium|high|xhigh|default>\nOr just use /models and tap buttons.";
243
+ readonly model_does_not_support_effort: "{model} does not support {effort}.\nSupported: {supported}";
244
+ readonly effort_configured: "Configured effort: {effort}";
245
+ readonly usage_fast: "Usage: /fast <on|off|toggle>";
246
+ readonly fast_enabled: "on ({tier})";
247
+ readonly fast_disabled: "off";
248
+ readonly fast_unsupported: "unsupported";
249
+ readonly fast_cleared_due_to_model_switch: "Fast was turned off because the selected model does not support it.";
250
+ readonly fast_not_supported_by_model: "Current model does not support Fast.";
251
+ readonly fast_configured: "Fast: {value}";
252
+ readonly thread_no_longer_available: "Thread is no longer available";
253
+ readonly thread_opened: "Thread opened";
254
+ readonly opened_sync_failed_short: "Opened, Codex.app sync failed";
255
+ readonly opened_in_codex_short: "Opened in Codex.app";
256
+ readonly turn_already_finished: "Turn already finished";
257
+ readonly interrupt_already_requested: "Interrupt already requested";
258
+ readonly interrupt_requested: "Interrupt requested";
259
+ readonly interrupt_failed: "Interrupt failed: {error}";
260
+ readonly opened_model_settings: "Opened model settings";
261
+ readonly opened_setup_panel: "Opened setup panel";
262
+ readonly opened_access_settings: "Opened access settings";
263
+ readonly opened_thread_list: "Opened thread list";
264
+ readonly no_thread_bound_callback: "No thread is currently bound";
265
+ readonly reveal_failed: "Reveal failed: {error}";
266
+ readonly wait_current_turn: "Wait for the current turn to finish";
267
+ readonly using_server_default_model: "Using server default model";
268
+ readonly model_no_longer_available: "Model no longer available";
269
+ readonly callback_model: "Model: {model}";
270
+ readonly using_default_effort: "Using default effort";
271
+ readonly unknown_effort: "Unknown effort";
272
+ readonly effort_not_supported_by_model: "Not supported by this model";
273
+ readonly callback_effort: "Effort: {effort}";
274
+ readonly callback_fast: "Fast: {value}";
275
+ readonly callback_access: "Access: {value}";
276
+ readonly completed: "Completed.";
277
+ readonly completed_see_reply_below: "Completed. See the reply below.";
278
+ readonly interrupted: "Interrupted.";
279
+ readonly interrupted_see_reply_below: "Interrupted. Partial reply is below.";
280
+ readonly stale_preview_restarted: "The bridge restarted while turn {threadId} was still live. This status card is no longer live. Open the thread in Codex.app or send another message to continue.";
281
+ readonly stale_preview_expired: "This live preview expired after the bridge stopped tracking the turn. If a final reply arrived, see below. Otherwise send the message again.";
282
+ readonly stale_user_input_interrupted: "The bridge found a stale Codex input request for thread {threadId} with no recoverable Telegram question. It interrupted that stuck turn; send the message again to continue.";
283
+ readonly streaming_reply_below: "Streaming reply below...";
284
+ readonly interrupt_requested_preview: "Interrupt requested...";
285
+ readonly interrupt_requested_waiting: "Interrupt requested. Waiting for Codex to stop...";
286
+ readonly interrupted_partial_output: "Interrupted. The reply above is partial output.";
287
+ readonly approval_requested: "Approval requested: {kind}";
288
+ readonly approval_kind_command: "command";
289
+ readonly approval_kind_fileChange: "file change";
290
+ readonly line_thread: "Thread: {value}";
291
+ readonly line_turn: "Turn: {value}";
292
+ readonly line_command: "Command: {value}";
293
+ readonly line_reason: "Reason: {value}";
294
+ readonly line_decision: "Decision: {value}";
295
+ readonly approval_decision_accept: "allow";
296
+ readonly approval_decision_session: "allow for session";
297
+ readonly approval_decision_deny: "deny";
298
+ readonly button_allow: "Allow";
299
+ readonly button_allow_session: "Allow Session";
300
+ readonly button_deny: "Deny";
301
+ readonly button_interrupt: "Interrupt";
302
+ readonly button_permissions: "Access";
303
+ readonly button_models: "Models";
304
+ readonly button_threads: "Threads";
305
+ readonly button_reveal: "Reveal";
306
+ readonly button_auto: "Auto";
307
+ readonly button_new_thread: "New";
308
+ readonly threads_no_matches: "<b>No threads matched</b>\n<code>{searchTerm}</code>";
309
+ readonly threads_no_recent: "<b>No recent threads.</b>";
310
+ readonly threads_recent_title: "<b>Recent threads</b>";
311
+ readonly threads_archived_title: "<b>Archived threads</b>";
312
+ readonly threads_tap_to_open: "Tap a button below to open or manage a thread.";
313
+ readonly threads_filter: "Filter: <code>{searchTerm}</code>";
314
+ readonly threads_range: "Showing {start}-{end}";
315
+ readonly threads_filter_cleared_short: "Filter cleared";
316
+ readonly button_prev_page: "Prev";
317
+ readonly button_next_page: "Next";
318
+ readonly button_clear_filter: "Clear filter";
319
+ readonly button_recent_threads: "Recent";
320
+ readonly button_archived_threads: "Archived";
321
+ readonly button_thread_rename: "Rename";
322
+ readonly button_thread_watch: "Watch";
323
+ readonly button_thread_archive: "Archive/Delete";
324
+ readonly button_thread_unarchive: "Unarchive";
325
+ readonly threads_current: "Current: <b>{title}</b>";
326
+ readonly where_no_thread_bound: "No thread is currently bound.";
327
+ readonly where_send_message_or_new: "Send a message or use /new.";
328
+ readonly where_thread_unavailable: "Thread {threadId} is unavailable.";
329
+ readonly where_thread: "Thread: {value}";
330
+ readonly where_title: "Title: {value}";
331
+ readonly where_preview: "Preview: {value}";
332
+ readonly where_configured_model: "Configured model: {value}";
333
+ readonly where_configured_effort: "Configured effort: {value}";
334
+ readonly where_fast: "Fast: {value}";
335
+ readonly where_collaboration_mode: "Mode: {value}";
336
+ readonly where_access_preset: "Configured access: {value}";
337
+ readonly where_approval_policy: "Approval policy: {value}";
338
+ readonly where_sandbox_mode: "Sandbox: {value}";
339
+ readonly where_provider: "Provider: {value}";
340
+ readonly where_status: "Status: {value}";
341
+ readonly where_cwd: "CWD: {value}";
342
+ readonly where_updated: "Updated: {value}";
343
+ readonly models_title: "<b>Model settings</b>";
344
+ readonly models_tap_to_change: "Tap buttons below. Changes apply on the next turn.";
345
+ readonly models_model: "Model: <b>{value}</b>";
346
+ readonly models_effort: "Effort: <b>{value}</b>";
347
+ readonly models_current_default_target: "Current default target: <code>{value}</code>";
348
+ readonly models_supported_efforts: "Supported efforts: <code>{value}</code>";
349
+ readonly models_supported_efforts_unknown: "Supported efforts: <code>unknown</code>";
350
+ readonly permissions_title: "<b>Access settings</b>";
351
+ readonly permissions_tap_to_change: "Tap buttons below. Changes apply on the next turn.";
352
+ readonly permissions_preset: "Preset: <b>{value}</b>";
353
+ readonly permissions_approval_policy: "Approval policy: <b>{value}</b>";
354
+ readonly permissions_sandbox_mode: "Sandbox: <b>{value}</b>";
355
+ readonly setup_title: "<b>Session preferences</b>";
356
+ readonly setup_summary: "Current: <b>{value}</b>";
357
+ readonly setup_focus_overview: "Focus: Overview";
358
+ readonly setup_focus_model: "Focus: Model";
359
+ readonly setup_focus_effort: "Focus: Effort";
360
+ readonly setup_focus_fast: "Focus: Fast";
361
+ readonly setup_focus_access: "Focus: Access";
362
+ readonly setup_focus_mode: "Focus: Mode";
363
+ readonly setup_focus_active: "Focus: Active turn messages";
364
+ readonly setup_row_model: "• Model: {value}";
365
+ readonly setup_row_effort: "• Effort: {value}";
366
+ readonly setup_row_fast: "• Fast: {value}";
367
+ readonly setup_row_access: "• Access: {value}";
368
+ readonly setup_row_mode: "• Mode: {value}";
369
+ readonly setup_row_active: "• Active turn messages: {value}";
370
+ readonly active_turn_message_mode_steer: "Steer current turn";
371
+ readonly active_turn_message_mode_queue: "Queue next turn";
372
+ readonly button_fast_on: "⚡ Fast: on";
373
+ readonly button_fast_off: "Fast: off";
374
+ readonly button_fast_unsupported: "Fast unsupported";
375
+ readonly access_preset_read_only: "Read-only";
376
+ readonly access_preset_default: "Default";
377
+ readonly access_preset_full_access: "Full access";
378
+ readonly collaboration_mode_default: "Agent";
379
+ readonly collaboration_mode_plan: "Plan";
380
+ readonly approval_policy_on_request: "Ask when needed";
381
+ readonly approval_policy_never: "Never ask";
382
+ readonly approval_policy_untrusted: "Ask for untrusted commands";
383
+ readonly approval_policy_on_failure: "Ask on failure";
384
+ readonly sandbox_mode_read_only: "Read-only";
385
+ readonly sandbox_mode_workspace_write: "Workspace write";
386
+ readonly sandbox_mode_danger_full_access: "Danger full access";
387
+ readonly account_title: "Codex account";
388
+ readonly account_current: "Current: {value}";
389
+ readonly account_not_signed_in: "Not signed in";
390
+ readonly account_updated: "Account updated: {value}";
391
+ readonly quota_title: "Codex quota";
392
+ readonly usage_quota_nudge: "Usage: /quota_nudge <credits|usage_limit> confirm";
393
+ readonly quota_nudge_sent: "Nudge email requested.";
394
+ readonly login_device_started: "Device login started.";
395
+ readonly login_url: "URL: {value}";
396
+ readonly login_code: "Code: {value}";
397
+ readonly login_id: "Login id: {value}";
398
+ readonly login_cancel_hint: "Cancel: /login_cancel {value}";
399
+ readonly login_cancel_no_pending: "No pending login. Pass a login id if needed.";
400
+ readonly login_cancelled: "Login cancelled.";
401
+ readonly login_completed: "Login completed.";
402
+ readonly login_failed: "Login failed: {error}";
403
+ readonly usage_logout: "Usage: /logout confirm";
404
+ readonly logout_done: "Logged out.";
405
+ readonly usage_steer: "Usage: /steer <message>";
406
+ readonly steer_sent: "Steered active turn {turnId}.";
407
+ readonly thread_forked: "Forked and bound to thread {threadId}.";
408
+ readonly usage_rollback: "Usage: /undo [n] or /rollback [n]";
409
+ readonly rollback_confirm_required: "Rollback {count} turns? Send /rollback {count} confirm.";
410
+ readonly rollback_done: "Rolled back {count} turn(s). Local file changes are not reverted.";
411
+ readonly usage_rename: "Usage: /rename <name>";
412
+ readonly rename_done: "Renamed thread to: {name}";
413
+ readonly thread_rename_prompt_short: "Send the new name";
414
+ readonly thread_rename_prompt: "Send the new name for: {title}";
415
+ readonly compact_started: "Context compaction started.";
416
+ readonly archive_done: "Archived thread {threadId} and cleared the current binding.";
417
+ readonly usage_unarchive: "Usage: /unarchive <n>. Run /threads archived first.";
418
+ readonly usage_thread_archive: "Usage: /thread_archive <n>. Run /threads first.";
419
+ readonly usage_thread_rename: "Usage: /thread_rename <n> <name>. Run /threads first.";
420
+ readonly unarchive_done: "Unarchived and bound to thread {threadId}.";
421
+ readonly thread_is_archived_use_unarchive: "This cached thread is archived. Use /unarchive <n>.";
422
+ readonly thread_archived_short: "Thread archived";
423
+ readonly thread_unarchived_short: "Thread unarchived";
424
+ readonly thread_not_archived: "This cached thread is not archived.";
425
+ readonly usage_review: "Usage: /review [base <branch>|commit <sha>|custom <instructions>]";
426
+ readonly review_started: "Review started: {turnId}";
427
+ readonly diff_title: "Latest diff:";
428
+ readonly diff_unavailable: "No turn diff is available yet.";
429
+ readonly loaded_title: "Loaded threads";
430
+ readonly loaded_empty: "No loaded threads.";
431
+ readonly skills_title: "Skills";
432
+ readonly skills_reloaded: "Reloaded from disk.";
433
+ readonly skills_filter: "Filter: {value}";
434
+ readonly skills_empty: "No skills found.";
435
+ readonly skills_errors: "Errors:";
436
+ readonly list_truncated: "...and {count} more.";
437
+ readonly usage_skill: "Usage: /skill <name>";
438
+ readonly skill_title: "Skill: {name}";
439
+ readonly skill_name: "Name: {value}";
440
+ readonly skill_enabled_state: "Enabled: {value}";
441
+ readonly skill_scope: "Scope: {value}";
442
+ readonly skill_path: "Path: {value}";
443
+ readonly skill_default_prompt: "Default prompt: {value}";
444
+ readonly skill_not_found: "Skill not found: {name}";
445
+ readonly usage_skill_enable: "Usage: /skill_enable <name>";
446
+ readonly usage_skill_disable: "Usage: /skill_disable <name>";
447
+ readonly skill_enabled: "Skill enabled: {name}";
448
+ readonly skill_disabled: "Skill disabled: {name}";
449
+ readonly hooks_title: "Hooks";
450
+ readonly hooks_empty: "No hooks found.";
451
+ readonly hooks_warnings: "Warnings:";
452
+ readonly hooks_errors: "Errors:";
453
+ readonly plugins_title: "Plugins";
454
+ readonly plugins_filter: "Filter: {value}";
455
+ readonly plugins_empty: "No plugins found.";
456
+ readonly usage_plugin: "Usage: /plugin <name>";
457
+ readonly plugin_title: "Plugin: {name}";
458
+ readonly plugin_not_found: "Plugin not found: {name}";
459
+ readonly usage_plugin_skill: "Usage: /plugin_skill <marketplace> <plugin> <skill>";
460
+ readonly plugin_skill_title: "Plugin skill {marketplace}/{plugin}: {skill}";
461
+ readonly plugin_skill_empty: "Plugin skill content is empty or unavailable.";
462
+ readonly apps_title: "Apps";
463
+ readonly apps_reloaded: "Reloaded from sources.";
464
+ readonly apps_empty: "No apps found.";
465
+ readonly features_title: "Experimental features";
466
+ readonly features_empty: "No features found.";
467
+ readonly config_title: "Config summary";
468
+ readonly config_layers: "Config layers: {count}";
469
+ readonly requirements_title: "Config requirements";
470
+ readonly requirements_empty: "No config requirements are configured.";
471
+ readonly provider_title: "Model provider capabilities";
472
+ readonly thread_status_changed: "Thread {threadId} status: {status}";
473
+ readonly thread_token_usage_high: "Thread {threadId} token usage is high: {percent}% ({total}/{limit}).";
474
+ readonly warning_title: "Warning";
475
+ readonly warning_guardian_title: "Guardian warning";
476
+ readonly warning_deprecation_title: "Deprecation notice";
477
+ readonly warning_config_title: "Config warning";
478
+ readonly mcp_title: "MCP servers";
479
+ readonly mcp_empty: "No MCP servers found.";
480
+ readonly mcp_reload_done: "MCP config reload requested.";
481
+ readonly usage_mcp_login: "Usage: /mcp_login <server>";
482
+ readonly mcp_login_started: "MCP OAuth login for {name}: {url}";
483
+ readonly usage_mcp_resource: "Usage: /mcp_resource <server> <uri>";
484
+ readonly mcp_resource_title: "MCP resource {server}: {uri}";
485
+ readonly mcp_resource_empty: "Resource returned no content.";
486
+ readonly mcp_resource_blob: "Blob content ({size} base64 chars).";
487
+ readonly mcp_elicitation_requested: "MCP server needs input:";
488
+ readonly mcp_server_name: "Server: {value}";
489
+ readonly mcp_elicitation_message: "Message: {value}";
490
+ readonly mcp_elicitation_url: "URL: {value}";
491
+ readonly mcp_elicitation_schema: "Schema: {value}";
492
+ readonly mcp_elicitation_reply_json: "Reply with JSON, then tap Accept.";
493
+ readonly mcp_elicitation_json_ready: "JSON captured. Tap Accept to submit.";
494
+ readonly mcp_elicitation_use_buttons: "Use the buttons on the MCP request.";
495
+ readonly mcp_elicitation_invalid_json: "Invalid JSON. Reply with valid JSON.";
496
+ readonly mcp_elicitation_json_recorded: "JSON recorded.";
497
+ readonly mcp_elicitation_expired: "This MCP request is no longer active.";
498
+ readonly mcp_elicitation_mismatch: "MCP request does not match this message.";
499
+ readonly mcp_elicitation_json_required: "Reply with JSON before accepting this form.";
500
+ readonly usage_approve: "Usage: /approve <id> <allow|session|deny>";
501
+ readonly usage_answer: "Usage: /answer <id> <questionNo> <optionNo|text>";
502
+ readonly usage_planimpl: "Usage: /planimpl <id> <run|fresh|stay>";
503
+ readonly usage_mcpel: "Usage: /mcpel <id> <accept|decline|cancel>";
504
+ readonly approval_kind_permissions: "permissions";
505
+ readonly permission_network: "Network: {value}";
506
+ readonly permission_read_paths: "Read paths: {value}";
507
+ readonly permission_write_paths: "Write paths: {value}";
508
+ readonly permission_entries: "File entries: {value}";
509
+ readonly button_accept: "Accept";
510
+ readonly button_decline: "Decline";
511
+ readonly button_cancel: "Cancel";
512
+ readonly button_create_dir: "Create";
513
+ readonly thread_name_updated: "Thread renamed: {name}";
514
+ readonly thread_archived_notification: "Thread archived: {threadId}";
515
+ readonly thread_unarchived_notification: "Thread unarchived: {threadId}";
516
+ readonly goal_title: "Thread goal";
517
+ readonly goal_no_thread_bound: "No thread is currently bound. Use /open or send a message first.";
518
+ readonly goal_empty: "No goal is set for the current thread.";
519
+ readonly goal_updated: "Goal updated.";
520
+ readonly goal_cleared: "Goal cleared.";
521
+ readonly goal_clear_requires_confirm: "This clears the current thread goal. Use: /goal clear confirm";
522
+ readonly goal_status: "Status: {value}";
523
+ readonly goal_objective: "Objective: {value}";
524
+ readonly goal_budget: "Budget: {value}";
525
+ readonly goal_tokens: "{value} tokens";
526
+ readonly goal_usage: "Used: {tokens} tokens, {seconds}s";
527
+ readonly goal_updated_at: "Updated: {value}";
528
+ readonly goal_status_active: "active";
529
+ readonly goal_status_paused: "paused";
530
+ readonly goal_status_budget_limited: "budget-limited";
531
+ readonly goal_status_complete: "complete";
532
+ readonly goal_updated_notification: "Goal updated: {status} · {objective}";
533
+ readonly goal_cleared_notification: "Goal cleared for thread {threadId}";
534
+ readonly history_title: "Recent turns for {threadId}";
535
+ readonly history_no_thread_bound: "No thread is currently bound. Use /open first.";
536
+ readonly history_empty: "No turns found.";
537
+ readonly files_title: "Files matching \"{query}\" in {root}";
538
+ readonly files_empty: "No matching files found.";
539
+ readonly remote_title: "Remote control";
540
+ readonly remote_unknown: "Remote control status has not been received yet.";
541
+ readonly remote_status: "Status: {value}";
542
+ readonly remote_environment: "Environment: {value}";
543
+ readonly remote_installation: "Installation: {value}";
544
+ readonly model_rerouted_notification: "Model rerouted: {from} -> {to} ({reason})";
545
+ readonly model_verification_notification: "Model verification required: {value}";
546
+ readonly mcp_tool_progress: "MCP progress: {message}";
547
+ readonly status_active: "active";
548
+ readonly status_idle: "idle";
549
+ readonly status_not_loaded: "not-loaded";
550
+ readonly status_error: "error";
551
+ };
552
+ readonly zh: {
553
+ readonly yes: "是";
554
+ readonly no: "否";
555
+ readonly none: "无";
556
+ readonly empty: "(空)";
557
+ readonly untitled: "(未命名)";
558
+ readonly unknown: "未知";
559
+ readonly server_default: "服务端默认";
560
+ readonly no_cwd: "(无工作目录)";
561
+ readonly help_commands_title: "命令列表:";
562
+ readonly help_advanced_aliases: "高级别名:/model、/effort、/access";
563
+ readonly help_plain_text_hint: "直接发送普通文本、图片或文件,都会继续当前线程;如果当前没有绑定线程,会自动新建。";
564
+ readonly help_weixin_note: "微信:无法使用底部内联按钮。线程/模型/权限类消息底部会附带可复制命令。例如:/permissions full-access";
565
+ readonly weixin_copy_paste_divider: "---";
566
+ readonly weixin_copy_threads_title: "可复制命令(微信):";
567
+ readonly weixin_copy_threads_filter: "当前筛选:{term}";
568
+ readonly weixin_copy_threads_empty: "(暂无列表 — 先发 /threads,再在下一轮消息里复制 /open 行。)";
569
+ readonly weixin_copy_threads_filter_hint: "筛选:/threads <关键词>";
570
+ readonly weixin_copy_models_title: "模型 / 推理强度(每次复制一行):";
571
+ readonly weixin_copy_efforts_title: "推理强度:";
572
+ readonly weixin_copy_access_title: "权限预设(复制一行):";
573
+ readonly weixin_copy_where_nav_title: "快捷命令:";
574
+ readonly weixin_copy_auth_title: "认证命令:";
575
+ readonly weixin_copy_approval_title: "审批命令:";
576
+ readonly weixin_copy_answer_title: "回答命令:";
577
+ readonly weixin_copy_plan_title: "计划执行命令:";
578
+ readonly weixin_copy_mcp_title: "MCP 命令:";
579
+ readonly weixin_copy_mcp_json_hint: "表单请求请先直接回复 JSON。";
580
+ readonly usage_access_preset: "无效的权限预设:{value}。请使用:read-only、default 或 full-access。";
581
+ readonly access_preset_configured: "已设置权限预设:{value}";
582
+ readonly usage_mode: "用法:/mode <default|plan>\n/plan 只让下一轮进入 Plan;/agent 切回 Agent。";
583
+ readonly mode_current: "当前模式:{value}";
584
+ readonly mode_configured: "已切换模式:{value}";
585
+ readonly mode_plan_armed: "Plan 已开启,只在下一轮生效一次;那一轮启动后会自动回到 Agent。";
586
+ readonly usage_active: "用法:/active <steer|queue>";
587
+ readonly active_current: "运行中新消息:{value}";
588
+ readonly active_configured: "运行中新消息已设置为:{value}";
589
+ readonly usage_goal: "用法:/goal [目标|pause|resume|done|budget <token数|off>|clear confirm]";
590
+ readonly usage_history: "用法:/history [数量 1-30]";
591
+ readonly usage_files: "用法:/files <关键词>";
592
+ readonly cmd_desc_help: "查看命令";
593
+ readonly cmd_desc_setup: "统一偏好面板";
594
+ readonly cmd_desc_fast: "切换 Fast 模式";
595
+ readonly cmd_desc_active: "运行中新消息处理方式";
596
+ readonly cmd_desc_status: "查看桥接状态";
597
+ readonly cmd_desc_account: "Codex 账号";
598
+ readonly cmd_desc_quota: "Codex 用量";
599
+ readonly cmd_desc_login_device: "ChatGPT 设备登录";
600
+ readonly cmd_desc_threads: "最近线程";
601
+ readonly cmd_desc_open: "打开缓存线程";
602
+ readonly cmd_desc_goal: "线程目标";
603
+ readonly cmd_desc_history: "最近 turns";
604
+ readonly cmd_desc_files: "查找文件";
605
+ readonly cmd_desc_remote: "远程控制状态";
606
+ readonly cmd_desc_watch: "观察当前线程";
607
+ readonly cmd_desc_unwatch: "停止观察当前线程";
608
+ readonly cmd_desc_steer: "追加当前回复指令";
609
+ readonly cmd_desc_takeover: "中断并接管当前线程";
610
+ readonly cmd_desc_queue: "当前回复后接一句";
611
+ readonly cmd_desc_new: "新建线程";
612
+ readonly cmd_desc_review: "启动代码审查";
613
+ readonly cmd_desc_fork: "Fork 当前线程";
614
+ readonly cmd_desc_undo: "回滚对话轮次";
615
+ readonly cmd_desc_rename: "重命名当前线程";
616
+ readonly cmd_desc_compact: "压缩上下文";
617
+ readonly cmd_desc_archive: "归档当前线程";
618
+ readonly cmd_desc_loaded: "查看已加载线程";
619
+ readonly cmd_desc_skills: "查看 Skills";
620
+ readonly cmd_desc_hooks: "查看 Hooks";
621
+ readonly cmd_desc_plugins: "查看 Plugins";
622
+ readonly cmd_desc_apps: "查看 Apps";
623
+ readonly cmd_desc_features: "查看功能开关";
624
+ readonly cmd_desc_config: "查看配置摘要";
625
+ readonly cmd_desc_provider: "查看模型供应商能力";
626
+ readonly cmd_desc_mcp: "查看 MCP 状态";
627
+ readonly cmd_desc_mode: "Agent 或单次 Plan";
628
+ readonly cmd_desc_plan: "下一轮使用 Plan";
629
+ readonly cmd_desc_auth: "认证与登录面板";
630
+ readonly cmd_desc_auth_reload: "重新读取 Codex 认证";
631
+ readonly cmd_desc_models: "模型设置";
632
+ readonly cmd_desc_permissions: "权限设置";
633
+ readonly cmd_desc_reveal: "在 Codex.app 中打开";
634
+ readonly cmd_desc_where: "当前线程信息";
635
+ readonly cmd_desc_interrupt: "中断当前回复";
636
+ readonly status_connected: "已连接:{value}";
637
+ readonly status_app_server: "Codex app-server:{value}";
638
+ readonly status_app_server_running: "运行中";
639
+ readonly status_app_server_stale: "失效";
640
+ readonly status_user_agent: "客户端:{value}";
641
+ readonly status_current_thread: "当前线程:{value}";
642
+ readonly status_configured_model: "已配置模型:{value}";
643
+ readonly status_configured_effort: "已配置推理强度:{value}";
644
+ readonly status_fast: "Fast:{value}";
645
+ readonly status_collaboration_mode: "模式:{value}";
646
+ readonly status_access_preset: "已配置权限:{value}";
647
+ readonly status_approval_policy: "审批策略:{value}";
648
+ readonly status_sandbox_mode: "沙箱模式:{value}";
649
+ readonly status_sync_on_open: "打开时同步到 /open:{value}";
650
+ readonly status_sync_on_turn_complete: "回复完成后同步:{value}";
651
+ readonly status_pending_approvals: "待审批:{value}";
652
+ readonly status_pending_user_inputs: "待确认问题:{value}";
653
+ readonly status_active_turns: "进行中的回复:{value}";
654
+ readonly status_codex_account: "Codex 账号:{value}";
655
+ readonly status_codex_plan: "Codex 套餐:{value}";
656
+ readonly status_codex_usage_title: "Codex 用量({value}):";
657
+ readonly status_codex_usage_window: "{window}:已用 {percent}%{reset}";
658
+ readonly status_codex_usage_reset: ",重置时间 {value}";
659
+ readonly status_codex_usage_unavailable: "Codex 用量:无法获取({error})";
660
+ readonly status_codex_local_history: "Codex 本地历史:{sessions} 个会话,{turns} 轮,{events} 条用量记录";
661
+ readonly status_codex_local_tokens: "Codex 本地 Token:总计 {total};输入 {input},输出 {output},缓存输入 {cached},推理输出 {reasoning}";
662
+ readonly status_codex_local_usage_unavailable: "Codex 本地历史:无法获取({error})";
663
+ readonly status_codex_credits: "Codex 额度:{value}";
664
+ readonly status_codex_limit_reached: "Codex 限制:{value}";
665
+ readonly auth_reload_restarting: "正在重启 Codex app-server 以重新读取 auth...";
666
+ readonly auth_reload_done: "Codex app-server 已重启,当前 auth 已重新读取。";
667
+ readonly auth_reload_blocked_active: "当前有回复、审批或问题在进行中,不能重载 Codex auth。请先等待,或使用 /interrupt。";
668
+ readonly usage_auth: "用法:/auth [list|use <编号>|enable <编号>|disable <编号>|reload|add <名称>]";
669
+ readonly usage_auth_add: "用法:/auth add <名称>。名称只能包含字母、数字、点、短横线或下划线。";
670
+ readonly auth_list_title: "Codex auth 文件:";
671
+ readonly auth_current: "当前 auth:{value}";
672
+ readonly auth_dir: "Auth 目录:{value}";
673
+ readonly auth_candidate_count: "候选数量:{value}";
674
+ readonly auth_candidate_status_enabled: "启用";
675
+ readonly auth_candidate_status_disabled: "禁用";
676
+ readonly auth_candidate_enabled: "已启用 auth 候选自动轮换:{value}";
677
+ readonly auth_candidate_disabled: "已禁用 auth 候选自动轮换:{value}";
678
+ readonly auth_candidate_enabled_short: "auth 已启用";
679
+ readonly auth_candidate_disabled_short: "auth 已禁用";
680
+ readonly auth_no_candidates: "没有找到 auth 候选文件。请在 auth 目录中放置类似 auth.json_personal 的文件。";
681
+ readonly auth_choice_expired: "这个 auth 列表已经不再有效";
682
+ readonly auth_choice_mismatch: "这个 auth 选择按钮不属于当前消息";
683
+ readonly auth_choice_recorded: "已选择 auth";
684
+ readonly auth_switching: "正在切换 Codex auth 到 {value}...";
685
+ readonly auth_switch_done: "Codex auth 已切换到 {value}。";
686
+ readonly auth_auto_switching: "检测到 Codex auth 问题({error}),正在切换到 {value}...";
687
+ readonly auth_auto_done: "已自动切换 Codex auth 到 {value}。";
688
+ readonly auth_auto_retrying: "正在用新的 auth 重试同一条请求...";
689
+ readonly auth_auto_retry_thread_missing: "Auth 已切换,但原线程已经不可用({threadId})。已停止重试,避免创建重复 session。";
690
+ readonly auth_auto_no_candidate: "检测到 Codex auth 问题({error}),但没有可用的未失败候选 auth。";
691
+ readonly auth_add_exists: "auth 候选已经存在:{value}";
692
+ readonly auth_add_preparing: "正在准备新的 Codex auth 候选 {value}...";
693
+ readonly auth_add_started: "{value} 的新 auth 登录已开始。";
694
+ readonly auth_add_done: "新的 Codex auth 候选已添加:{value}。";
695
+ readonly auth_add_failed: "{value} 的新 auth 登录失败:{error}";
696
+ readonly auth_add_cancelled: "新 auth 登录已取消,已恢复之前的 auth。";
697
+ readonly auth_add_reverted: "已恢复之前的 auth。";
698
+ readonly auth_add_missing_file: "登录已完成,但没有创建新的 auth 文件:{value}";
699
+ readonly button_login_device: "设备登录";
700
+ readonly button_auth_reload: "重载 auth";
701
+ readonly button_auth_enable: "启用";
702
+ readonly button_auth_disable: "禁用";
703
+ readonly another_turn_running: "已经有一个回复在进行中。请先等待,或使用 /interrupt、/takeover、/queue。";
704
+ readonly working: "处理中...";
705
+ readonly usage_open: "用法:/open <编号>";
706
+ readonly usage_watch: "用法:/watch [编号]";
707
+ readonly usage_takeover: "用法:/takeover <消息>";
708
+ readonly usage_queue: "用法:/queue <消息>";
709
+ readonly unknown_cached_thread: "找不到这个缓存线程,请先运行 /threads。";
710
+ readonly cached_thread_unavailable: "这个缓存线程已经不可用,请重新运行 /threads。";
711
+ readonly watch_no_thread_bound: "当前没有绑定线程,请先使用 /open。";
712
+ readonly watch_already_enabled: "已经在观察线程 {threadId}。";
713
+ readonly watch_started_active: "已开始观察线程 {threadId}。当前这轮 Codex 更新会同步到这里。";
714
+ readonly watch_started_idle: "已开始观察线程 {threadId}。之后 CLI 里这条线程一旦有新 live turn,我会同步到这里。";
715
+ readonly watch_read_only_active: "当前聊天正在只读观察这轮。需要审批时可用审批命令;要发送新 prompt 请先 /unwatch。";
716
+ readonly watch_not_enabled: "当前没有正在观察的线程。";
717
+ readonly watch_stopped: "已停止观察线程 {threadId}。";
718
+ readonly queued_prompt_set: "已排队。当前回复结束后我会自动发送。";
719
+ readonly queued_prompt_replaced: "已替换排队消息。当前回复结束后我会自动发送新的内容。";
720
+ readonly bound_to_thread: "已绑定到线程 {threadId}";
721
+ readonly line_title: "标题:{value}";
722
+ readonly line_cwd: "工作目录:{value}";
723
+ readonly codex_sync_failed: "同步到 Codex.app 失败:{error}";
724
+ readonly opened_in_codex: "已在 Codex.app 中打开。";
725
+ readonly started_new_thread: "已新建线程 {threadId}";
726
+ readonly thread_new_prompt_short: "发送 PWD";
727
+ readonly thread_new_prompt: "请发送新线程的 PWD。发送 \".\" 使用默认目录:\n{cwd}";
728
+ readonly thread_new_cwd_missing: "PWD 不存在:\n{cwd}\n是否新建这个目录,并在其中启动新线程?";
729
+ readonly thread_new_cwd_reply_hint: "点击“新建”,或直接回复“yes/确定”来创建。也可以发送另一个 PWD。";
730
+ readonly thread_new_cwd_expired: "这个新线程请求已失效。";
731
+ readonly thread_new_cwd_cancelled: "已取消新建线程。";
732
+ readonly thread_new_cwd_created: "已新建目录:\n{cwd}";
733
+ readonly thread_new_cwd_not_directory: "PWD 已存在,但不是目录:\n{cwd}";
734
+ readonly thread_new_cwd_still_missing: "创建后目录仍不存在。";
735
+ readonly thread_new_cwd_create_failed: "新建 PWD 失败:\n{cwd}\n{error}";
736
+ readonly no_thread_bound_reveal: "当前没有绑定线程。请先使用 /open、/new,或直接发送一条消息。";
737
+ readonly failed_open_codex: "打开 Codex.app 线程失败:{error}";
738
+ readonly opened_thread_in_codex: "已在 Codex.app 中打开线程 {threadId}。";
739
+ readonly no_active_turn: "当前没有可中断的回复。";
740
+ readonly interrupt_requested_for: "已请求中断 {turnId}";
741
+ readonly unknown_command: "未知命令:/{name}";
742
+ readonly unsupported_action: "不支持的操作";
743
+ readonly approval_already_resolved: "这个审批已经处理过了";
744
+ readonly approval_mismatch: "这个审批按钮不属于当前消息";
745
+ readonly decision_recorded: "已记录你的决定";
746
+ readonly codex_turn_error: "Codex 报错:{error}";
747
+ readonly user_input_requested: "Codex 需要你确认:";
748
+ readonly user_input_reply_hint: "请直接回复文字,或点击下方选项。";
749
+ readonly user_input_selected: "已选择:{value}";
750
+ readonly user_input_submitted: "已提交给 Codex。";
751
+ readonly user_input_submitted_waiting: "已提交给 Codex,正在等待 Codex 继续。";
752
+ readonly user_input_interrupted: "这一轮已经中断,这次回答不会继续触发后续流程。";
753
+ readonly user_input_already_submitted: "回答已经提交";
754
+ readonly user_input_waiting_notice: "你的回答已经提交给 Codex,但这轮仍在等待继续。\n线程:{threadId}\n轮次:{turnId}";
755
+ readonly user_input_expired: "这个问题已经不再等待回答";
756
+ readonly user_input_mismatch: "这个问题按钮不属于当前消息";
757
+ readonly user_input_recorded: "已记录回答";
758
+ readonly user_input_empty_answer: "请发送非空回答。";
759
+ readonly user_input_use_buttons: "请点击选项;如果只剩一个未回答问题,也可以直接回复文字。";
760
+ readonly user_input_other_hint: "也可以直接回复自定义答案。";
761
+ readonly user_input_secret_warning: "Telegram 回复不会隐藏内容,请不要在这里发送敏感密钥。";
762
+ readonly plan_impl_title: "Plan 模式已经产出计划。";
763
+ readonly plan_impl_prompt: "要让 Codex 现在执行这个计划吗?";
764
+ readonly plan_impl_button_run: "执行这个计划";
765
+ readonly plan_impl_button_fresh: "清空上下文再执行";
766
+ readonly plan_impl_button_stay: "继续规划";
767
+ readonly plan_impl_expired: "这个计划确认已经失效";
768
+ readonly plan_impl_mismatch: "这个计划确认按钮不属于当前消息";
769
+ readonly plan_impl_staying: "已保留计划,暂不执行。";
770
+ readonly plan_impl_started: "已开始执行计划。\n线程:{threadId}\n轮次:{turnId}";
771
+ readonly plan_impl_started_fresh: "已在新上下文中开始执行计划。\n线程:{threadId}\n轮次:{turnId}";
772
+ readonly interactive_input_unsupported: "Codex 请求交互式工具输入,但当前桥接的 v1 版本只支持审批,因此会返回空答案。";
773
+ readonly current_thread_unavailable_continued: "当前线程不可用,已切换到新线程 {threadId} 继续。";
774
+ readonly previous_thread_unavailable_started: "之前的线程不可用,已新建线程 {threadId}。";
775
+ readonly bridge_error: "桥接错误:{error}";
776
+ readonly attachment_too_large: "Telegram 附件太大,Bot API 无法下载:{name}({size} 字节)";
777
+ readonly attachment_download_failed: "下载 Telegram 附件失败:{name},错误:{error}";
778
+ readonly approval_timed_out_denied: "审批已超时,并自动拒绝。\n线程:{threadId}";
779
+ readonly model_change_blocked: "当前有回复在进行中,暂时不能切换模型。请先等待,或使用 /interrupt。";
780
+ readonly model_reset: "模型已重置为服务端默认值。";
781
+ readonly effort_adjusted_default_model: "默认模型不支持 {effort},所以已自动调整推理强度。";
782
+ readonly service_tier_cleared_due_to_model_switch: "所选模型不支持 Fast,已自动关闭。";
783
+ readonly applies_next_turn: "会在下一轮对话生效。";
784
+ readonly tip_use_models: "下次直接用 /models 点按钮会更方便。";
785
+ readonly unknown_model: "未知模型:{model}\n请使用 /models 查看可用模型。";
786
+ readonly model_configured: "已配置模型:{model}";
787
+ readonly effort_adjusted_model: "{model} 不支持 {effort},所以已自动调整推理强度。";
788
+ readonly effort_change_blocked: "当前有回复在进行中,暂时不能切换推理强度。请先等待,或使用 /interrupt。";
789
+ readonly effort_reset: "推理强度已重置为服务端默认值。";
790
+ readonly usage_effort: "用法:/effort <none|minimal|low|medium|high|xhigh|default>\n或者直接使用 /models 点按钮。";
791
+ readonly model_does_not_support_effort: "{model} 不支持 {effort}。\n支持的强度:{supported}";
792
+ readonly effort_configured: "已配置推理强度:{effort}";
793
+ readonly usage_fast: "用法:/fast <on|off|toggle>";
794
+ readonly fast_enabled: "开({tier})";
795
+ readonly fast_disabled: "关";
796
+ readonly fast_unsupported: "不支持";
797
+ readonly fast_cleared_due_to_model_switch: "所选模型不支持 Fast,已自动关闭。";
798
+ readonly fast_not_supported_by_model: "当前模型不支持 Fast。";
799
+ readonly fast_configured: "Fast:{value}";
800
+ readonly thread_no_longer_available: "这个线程已经不可用";
801
+ readonly thread_opened: "线程已打开";
802
+ readonly opened_sync_failed_short: "已打开,但同步到 Codex.app 失败";
803
+ readonly opened_in_codex_short: "已在 Codex.app 中打开";
804
+ readonly turn_already_finished: "这轮回复已经结束了";
805
+ readonly interrupt_already_requested: "已经请求过中断了";
806
+ readonly interrupt_requested: "已请求中断";
807
+ readonly interrupt_failed: "中断失败:{error}";
808
+ readonly opened_model_settings: "已打开模型设置";
809
+ readonly opened_setup_panel: "已打开偏好面板";
810
+ readonly opened_access_settings: "已打开权限设置";
811
+ readonly opened_thread_list: "已打开线程列表";
812
+ readonly no_thread_bound_callback: "当前没有绑定线程";
813
+ readonly reveal_failed: "在 Codex.app 中打开失败:{error}";
814
+ readonly wait_current_turn: "请等当前回复结束后再操作";
815
+ readonly using_server_default_model: "已切换为服务端默认模型";
816
+ readonly model_no_longer_available: "这个模型已经不可用了";
817
+ readonly callback_model: "模型:{model}";
818
+ readonly using_default_effort: "已切换为默认推理强度";
819
+ readonly unknown_effort: "未知的推理强度";
820
+ readonly effort_not_supported_by_model: "当前模型不支持这个推理强度";
821
+ readonly callback_effort: "推理强度:{effort}";
822
+ readonly callback_fast: "Fast:{value}";
823
+ readonly callback_access: "权限:{value}";
824
+ readonly completed: "已完成。";
825
+ readonly completed_see_reply_below: "已完成,结果见下方回复。";
826
+ readonly interrupted: "已中断。";
827
+ readonly interrupted_see_reply_below: "已中断,已收到的部分回复见下方。";
828
+ readonly stale_preview_restarted: "桥接在该线程 {threadId} 仍处于活动状态时重启了。这张状态卡已经不再实时更新。你可以去 Codex.app 打开线程,或重新发一条消息继续。";
829
+ readonly stale_preview_expired: "之前的实时预览在桥接停止跟踪这轮回复后已经失效。如果下方已有最终回复,请以最终回复为准;否则请重新发送消息。";
830
+ readonly stale_user_input_interrupted: "桥接发现线程 {threadId} 有一条已经无法恢复到 Telegram 的 Codex 输入请求,已中断这条卡住的回复。请重新发送消息继续。";
831
+ readonly streaming_reply_below: "回复正在下方持续输出...";
832
+ readonly interrupt_requested_preview: "已请求中断...";
833
+ readonly interrupt_requested_waiting: "已请求中断,正在等待 Codex 停止...";
834
+ readonly interrupted_partial_output: "已请求中断,以上为部分输出。";
835
+ readonly approval_requested: "需要审批:{kind}";
836
+ readonly approval_kind_command: "命令执行";
837
+ readonly approval_kind_fileChange: "文件修改";
838
+ readonly line_thread: "线程:{value}";
839
+ readonly line_turn: "轮次:{value}";
840
+ readonly line_command: "命令:{value}";
841
+ readonly line_reason: "原因:{value}";
842
+ readonly line_decision: "决定:{value}";
843
+ readonly approval_decision_accept: "允许";
844
+ readonly approval_decision_session: "本会话内允许";
845
+ readonly approval_decision_deny: "拒绝";
846
+ readonly button_allow: "允许";
847
+ readonly button_allow_session: "本会话允许";
848
+ readonly button_deny: "拒绝";
849
+ readonly button_interrupt: "中断";
850
+ readonly button_permissions: "权限";
851
+ readonly button_models: "模型";
852
+ readonly button_threads: "线程";
853
+ readonly button_reveal: "打开";
854
+ readonly button_auto: "自动";
855
+ readonly button_new_thread: "新建";
856
+ readonly threads_no_matches: "<b>没有匹配的线程</b>\n<code>{searchTerm}</code>";
857
+ readonly threads_no_recent: "<b>暂无最近线程。</b>";
858
+ readonly threads_recent_title: "<b>最近线程</b>";
859
+ readonly threads_archived_title: "<b>已归档线程</b>";
860
+ readonly threads_tap_to_open: "点击下方按钮即可切换或管理线程。";
861
+ readonly threads_filter: "筛选:<code>{searchTerm}</code>";
862
+ readonly threads_range: "显示第 {start}-{end} 条";
863
+ readonly threads_filter_cleared_short: "已清除筛选";
864
+ readonly button_prev_page: "上一页";
865
+ readonly button_next_page: "下一页";
866
+ readonly button_clear_filter: "清除筛选";
867
+ readonly button_recent_threads: "最近线程";
868
+ readonly button_archived_threads: "已归档";
869
+ readonly button_thread_rename: "重命名";
870
+ readonly button_thread_watch: "观察";
871
+ readonly button_thread_archive: "归档/删除";
872
+ readonly button_thread_unarchive: "取消归档";
873
+ readonly threads_current: "当前:<b>{title}</b>";
874
+ readonly where_no_thread_bound: "当前没有绑定线程。";
875
+ readonly where_send_message_or_new: "直接发一条消息,或者使用 /new。";
876
+ readonly where_thread_unavailable: "线程 {threadId} 当前不可用。";
877
+ readonly where_thread: "线程:{value}";
878
+ readonly where_title: "标题:{value}";
879
+ readonly where_preview: "摘要:{value}";
880
+ readonly where_configured_model: "已配置模型:{value}";
881
+ readonly where_configured_effort: "已配置推理强度:{value}";
882
+ readonly where_fast: "Fast:{value}";
883
+ readonly where_collaboration_mode: "模式:{value}";
884
+ readonly where_access_preset: "已配置权限:{value}";
885
+ readonly where_approval_policy: "审批策略:{value}";
886
+ readonly where_sandbox_mode: "沙箱模式:{value}";
887
+ readonly where_provider: "提供方:{value}";
888
+ readonly where_status: "状态:{value}";
889
+ readonly where_cwd: "工作目录:{value}";
890
+ readonly where_updated: "更新时间:{value}";
891
+ readonly models_title: "<b>模型设置</b>";
892
+ readonly models_tap_to_change: "点击下方按钮即可切换,变更会在下一轮对话生效。";
893
+ readonly models_model: "模型:<b>{value}</b>";
894
+ readonly models_effort: "推理强度:<b>{value}</b>";
895
+ readonly models_current_default_target: "当前默认目标:<code>{value}</code>";
896
+ readonly models_supported_efforts: "支持的强度:<code>{value}</code>";
897
+ readonly models_supported_efforts_unknown: "支持的强度:<code>未知</code>";
898
+ readonly permissions_title: "<b>权限设置</b>";
899
+ readonly permissions_tap_to_change: "点击下方按钮即可切换,变更会在下一轮对话生效。";
900
+ readonly permissions_preset: "当前预设:<b>{value}</b>";
901
+ readonly permissions_approval_policy: "审批策略:<b>{value}</b>";
902
+ readonly permissions_sandbox_mode: "沙箱模式:<b>{value}</b>";
903
+ readonly setup_title: "<b>会话偏好</b>";
904
+ readonly setup_summary: "当前:<b>{value}</b>";
905
+ readonly setup_focus_overview: "聚焦:总览";
906
+ readonly setup_focus_model: "聚焦:模型";
907
+ readonly setup_focus_effort: "聚焦:推理强度";
908
+ readonly setup_focus_fast: "聚焦:Fast";
909
+ readonly setup_focus_access: "聚焦:权限";
910
+ readonly setup_focus_mode: "聚焦:模式";
911
+ readonly setup_focus_active: "聚焦:运行中新消息";
912
+ readonly setup_row_model: "• 模型:{value}";
913
+ readonly setup_row_effort: "• 推理强度:{value}";
914
+ readonly setup_row_fast: "• Fast:{value}";
915
+ readonly setup_row_access: "• 权限:{value}";
916
+ readonly setup_row_mode: "• 模式:{value}";
917
+ readonly setup_row_active: "• 运行中新消息:{value}";
918
+ readonly active_turn_message_mode_steer: "引导当前回复";
919
+ readonly active_turn_message_mode_queue: "排队到下一轮";
920
+ readonly button_fast_on: "⚡ Fast:开";
921
+ readonly button_fast_off: "Fast:关";
922
+ readonly button_fast_unsupported: "Fast 不支持";
923
+ readonly access_preset_read_only: "只读";
924
+ readonly access_preset_default: "默认";
925
+ readonly access_preset_full_access: "完全访问";
926
+ readonly collaboration_mode_default: "Agent";
927
+ readonly collaboration_mode_plan: "Plan";
928
+ readonly approval_policy_on_request: "按需询问";
929
+ readonly approval_policy_never: "从不询问";
930
+ readonly approval_policy_untrusted: "不可信命令时询问";
931
+ readonly approval_policy_on_failure: "失败时询问";
932
+ readonly sandbox_mode_read_only: "只读";
933
+ readonly sandbox_mode_workspace_write: "工作区可写";
934
+ readonly sandbox_mode_danger_full_access: "危险完全访问";
935
+ readonly account_title: "Codex 账号";
936
+ readonly account_current: "当前:{value}";
937
+ readonly account_not_signed_in: "未登录";
938
+ readonly account_updated: "账号已更新:{value}";
939
+ readonly quota_title: "Codex 用量";
940
+ readonly usage_quota_nudge: "用法:/quota_nudge <credits|usage_limit> confirm";
941
+ readonly quota_nudge_sent: "已请求发送额度提醒邮件。";
942
+ readonly login_device_started: "已开始设备码登录。";
943
+ readonly login_url: "地址:{value}";
944
+ readonly login_code: "验证码:{value}";
945
+ readonly login_id: "登录 ID:{value}";
946
+ readonly login_cancel_hint: "取消:/login_cancel {value}";
947
+ readonly login_cancel_no_pending: "当前没有待处理登录。如有需要,请带上 login id。";
948
+ readonly login_cancelled: "登录已取消。";
949
+ readonly login_completed: "登录已完成。";
950
+ readonly login_failed: "登录失败:{error}";
951
+ readonly usage_logout: "用法:/logout confirm";
952
+ readonly logout_done: "已退出登录。";
953
+ readonly usage_steer: "用法:/steer <消息>";
954
+ readonly steer_sent: "已追加指令到当前回复 {turnId}。";
955
+ readonly thread_forked: "已 fork 并绑定到线程 {threadId}。";
956
+ readonly usage_rollback: "用法:/undo [n] 或 /rollback [n]";
957
+ readonly rollback_confirm_required: "确认回滚 {count} 轮?请发送 /rollback {count} confirm。";
958
+ readonly rollback_done: "已回滚 {count} 轮。注意:本地文件改动不会被撤销。";
959
+ readonly usage_rename: "用法:/rename <名称>";
960
+ readonly rename_done: "线程已重命名为:{name}";
961
+ readonly thread_rename_prompt_short: "请发送新名称";
962
+ readonly thread_rename_prompt: "请发送新名称:{title}";
963
+ readonly compact_started: "已开始压缩上下文。";
964
+ readonly archive_done: "已归档线程 {threadId},并清除当前绑定。";
965
+ readonly usage_unarchive: "用法:/unarchive <编号>。请先运行 /threads archived。";
966
+ readonly usage_thread_archive: "用法:/thread_archive <编号>。请先运行 /threads。";
967
+ readonly usage_thread_rename: "用法:/thread_rename <编号> <名称>。请先运行 /threads。";
968
+ readonly unarchive_done: "已取消归档并绑定到线程 {threadId}。";
969
+ readonly thread_is_archived_use_unarchive: "这个缓存线程已归档,请使用 /unarchive <编号>。";
970
+ readonly thread_archived_short: "线程已归档";
971
+ readonly thread_unarchived_short: "线程已取消归档";
972
+ readonly thread_not_archived: "这个缓存线程没有归档。";
973
+ readonly usage_review: "用法:/review [base <分支>|commit <sha>|custom <要求>]";
974
+ readonly review_started: "已开始代码审查:{turnId}";
975
+ readonly diff_title: "最新 diff:";
976
+ readonly diff_unavailable: "当前还没有可查看的 diff。";
977
+ readonly loaded_title: "已加载线程";
978
+ readonly loaded_empty: "当前没有已加载线程。";
979
+ readonly skills_title: "Skills";
980
+ readonly skills_reloaded: "已从磁盘重新加载。";
981
+ readonly skills_filter: "筛选:{value}";
982
+ readonly skills_empty: "没有找到 skill。";
983
+ readonly skills_errors: "错误:";
984
+ readonly list_truncated: "……另有 {count} 项。";
985
+ readonly usage_skill: "用法:/skill <名称>";
986
+ readonly skill_title: "Skill:{name}";
987
+ readonly skill_name: "名称:{value}";
988
+ readonly skill_enabled_state: "已启用:{value}";
989
+ readonly skill_scope: "范围:{value}";
990
+ readonly skill_path: "路径:{value}";
991
+ readonly skill_default_prompt: "默认提示:{value}";
992
+ readonly skill_not_found: "找不到 skill:{name}";
993
+ readonly usage_skill_enable: "用法:/skill_enable <名称>";
994
+ readonly usage_skill_disable: "用法:/skill_disable <名称>";
995
+ readonly skill_enabled: "已启用 skill:{name}";
996
+ readonly skill_disabled: "已禁用 skill:{name}";
997
+ readonly hooks_title: "Hooks";
998
+ readonly hooks_empty: "没有找到 hook。";
999
+ readonly hooks_warnings: "警告:";
1000
+ readonly hooks_errors: "错误:";
1001
+ readonly plugins_title: "Plugins";
1002
+ readonly plugins_filter: "筛选:{value}";
1003
+ readonly plugins_empty: "没有找到 plugin。";
1004
+ readonly usage_plugin: "用法:/plugin <名称>";
1005
+ readonly plugin_title: "Plugin:{name}";
1006
+ readonly plugin_not_found: "找不到 plugin:{name}";
1007
+ readonly usage_plugin_skill: "用法:/plugin_skill <marketplace> <plugin> <skill>";
1008
+ readonly plugin_skill_title: "Plugin skill {marketplace}/{plugin}:{skill}";
1009
+ readonly plugin_skill_empty: "Plugin skill 内容为空或不可用。";
1010
+ readonly apps_title: "Apps";
1011
+ readonly apps_reloaded: "已从来源重新加载。";
1012
+ readonly apps_empty: "没有找到 app。";
1013
+ readonly features_title: "实验功能";
1014
+ readonly features_empty: "没有找到功能开关。";
1015
+ readonly config_title: "配置摘要";
1016
+ readonly config_layers: "配置层数:{count}";
1017
+ readonly requirements_title: "配置要求";
1018
+ readonly requirements_empty: "当前没有配置要求。";
1019
+ readonly provider_title: "模型供应商能力";
1020
+ readonly thread_status_changed: "线程 {threadId} 状态:{status}";
1021
+ readonly thread_token_usage_high: "线程 {threadId} Token 用量偏高:{percent}%({total}/{limit})。";
1022
+ readonly warning_title: "警告";
1023
+ readonly warning_guardian_title: "Guardian 警告";
1024
+ readonly warning_deprecation_title: "弃用提醒";
1025
+ readonly warning_config_title: "配置警告";
1026
+ readonly mcp_title: "MCP 服务器";
1027
+ readonly mcp_empty: "没有找到 MCP 服务器。";
1028
+ readonly mcp_reload_done: "已请求重新加载 MCP 配置。";
1029
+ readonly usage_mcp_login: "用法:/mcp_login <服务器>";
1030
+ readonly mcp_login_started: "{name} 的 MCP OAuth 登录:{url}";
1031
+ readonly usage_mcp_resource: "用法:/mcp_resource <服务器> <uri>";
1032
+ readonly mcp_resource_title: "MCP 资源 {server}:{uri}";
1033
+ readonly mcp_resource_empty: "资源没有返回内容。";
1034
+ readonly mcp_resource_blob: "Blob 内容({size} 个 base64 字符)。";
1035
+ readonly mcp_elicitation_requested: "MCP 服务器需要输入:";
1036
+ readonly mcp_server_name: "服务器:{value}";
1037
+ readonly mcp_elicitation_message: "消息:{value}";
1038
+ readonly mcp_elicitation_url: "地址:{value}";
1039
+ readonly mcp_elicitation_schema: "Schema:{value}";
1040
+ readonly mcp_elicitation_reply_json: "请回复 JSON,然后点击接受。";
1041
+ readonly mcp_elicitation_json_ready: "JSON 已记录,点击接受即可提交。";
1042
+ readonly mcp_elicitation_use_buttons: "请使用 MCP 请求消息上的按钮。";
1043
+ readonly mcp_elicitation_invalid_json: "JSON 无效,请回复有效 JSON。";
1044
+ readonly mcp_elicitation_json_recorded: "JSON 已记录。";
1045
+ readonly mcp_elicitation_expired: "这个 MCP 请求已经不再等待处理。";
1046
+ readonly mcp_elicitation_mismatch: "这个 MCP 请求按钮不属于当前消息。";
1047
+ readonly mcp_elicitation_json_required: "接受表单前请先回复 JSON。";
1048
+ readonly usage_approve: "用法:/approve <id> <allow|session|deny>";
1049
+ readonly usage_answer: "用法:/answer <id> <问题编号> <选项编号|文字>";
1050
+ readonly usage_planimpl: "用法:/planimpl <id> <run|fresh|stay>";
1051
+ readonly usage_mcpel: "用法:/mcpel <id> <accept|decline|cancel>";
1052
+ readonly approval_kind_permissions: "权限扩展";
1053
+ readonly permission_network: "网络:{value}";
1054
+ readonly permission_read_paths: "可读路径:{value}";
1055
+ readonly permission_write_paths: "可写路径:{value}";
1056
+ readonly permission_entries: "文件条目:{value}";
1057
+ readonly button_accept: "接受";
1058
+ readonly button_decline: "拒绝";
1059
+ readonly button_cancel: "取消";
1060
+ readonly button_create_dir: "新建";
1061
+ readonly thread_name_updated: "线程已重命名:{name}";
1062
+ readonly thread_archived_notification: "线程已归档:{threadId}";
1063
+ readonly thread_unarchived_notification: "线程已取消归档:{threadId}";
1064
+ readonly goal_title: "线程目标";
1065
+ readonly goal_no_thread_bound: "当前没有绑定线程。请先 /open 或直接发一条消息。";
1066
+ readonly goal_empty: "当前线程没有设置目标。";
1067
+ readonly goal_updated: "目标已更新。";
1068
+ readonly goal_cleared: "目标已清除。";
1069
+ readonly goal_clear_requires_confirm: "这会清除当前线程目标。请使用:/goal clear confirm";
1070
+ readonly goal_status: "状态:{value}";
1071
+ readonly goal_objective: "目标:{value}";
1072
+ readonly goal_budget: "预算:{value}";
1073
+ readonly goal_tokens: "{value} tokens";
1074
+ readonly goal_usage: "已用:{tokens} tokens,{seconds} 秒";
1075
+ readonly goal_updated_at: "更新时间:{value}";
1076
+ readonly goal_status_active: "运行中";
1077
+ readonly goal_status_paused: "已暂停";
1078
+ readonly goal_status_budget_limited: "预算受限";
1079
+ readonly goal_status_complete: "已完成";
1080
+ readonly goal_updated_notification: "目标已更新:{status} · {objective}";
1081
+ readonly goal_cleared_notification: "线程 {threadId} 的目标已清除";
1082
+ readonly history_title: "线程 {threadId} 的最近 turns";
1083
+ readonly history_no_thread_bound: "当前没有绑定线程。请先 /open。";
1084
+ readonly history_empty: "没有找到 turns。";
1085
+ readonly files_title: "在 {root} 中匹配「{query}」的文件";
1086
+ readonly files_empty: "没有找到匹配文件。";
1087
+ readonly remote_title: "远程控制";
1088
+ readonly remote_unknown: "还没有收到远程控制状态。";
1089
+ readonly remote_status: "状态:{value}";
1090
+ readonly remote_environment: "环境:{value}";
1091
+ readonly remote_installation: "安装:{value}";
1092
+ readonly model_rerouted_notification: "模型已改路由:{from} -> {to}({reason})";
1093
+ readonly model_verification_notification: "模型需要额外验证:{value}";
1094
+ readonly mcp_tool_progress: "MCP 进度:{message}";
1095
+ readonly status_active: "运行中";
1096
+ readonly status_idle: "空闲";
1097
+ readonly status_not_loaded: "未加载";
1098
+ readonly status_error: "错误";
1099
+ };
1100
+ };
1101
+ type MessageKey = keyof typeof MESSAGES.en;
1102
+ export declare function normalizeLocale(languageCode?: string | null): AppLocale;
1103
+ export declare function t(locale: AppLocale, key: MessageKey, params?: MessageParams): string;
1104
+ export declare function getTelegramCommands(locale: AppLocale): Array<{
1105
+ command: string;
1106
+ description: string;
1107
+ }>;
1108
+ export {};