/**
 * Chinese translations — the original strings as authored. This is the
 * "source of truth" dictionary; `en.ts` mirrors the same keys.
 */
export const messages = {
    // ─── Card buttons ────────────────────────────────────────────────────────
    'card.btn.open_terminal': '🖥️ 打开终端',
    'card.btn.open_writable_terminal': '🖥️ 打开可操作终端',
    'card.btn.get_write_link': '🔑 获取操作链接',
    'card.writable_terminal_link': '🔑 可操作终端（群内可见，任何人可直接操控）：[{url}]({url})',
    'card.btn.restart_cli': '🔄 重启 {cliName}',
    'card.btn.disconnect': '⏏ 断开',
    'card.btn.close_session': '❌ 关闭会话',
    'card.btn.resume_session': '▶️ 恢复会话',
    'card.btn.show_output': '📖 显示输出',
    'card.btn.hide_output': '📕 隐藏输出',
    'card.btn.export_text': '📝 导出文字',
    'card.btn.refresh': '🔃 刷新',
    'card.btn.takeover': '🔄 接管',
    'card.btn.skip_repo': '▶️ 直接开启会话',
    'card.btn.manual_repo': '使用此目录',
    'card.btn.half_page_up': '⇞ 上半屏',
    'card.btn.half_page_down': '⇟ 下半屏',
    'card.btn.send_custom': '📝 发送自定义回复',
    'card.btn.retry_last_task': '🔁 重发上一条任务',
    // ─── Card status ─────────────────────────────────────────────────────────
    'card.status.starting': '启动中…',
    'card.status.working': '工作中',
    'card.status.idle': '等待输入',
    'card.status.analyzing': '正在分析…',
    'card.status.limited': '限额已达',
    'card.status.retry_ready': '可重试',
    'card.status.executing': '正在执行…',
    'card.status.session_closed': '🛑 会话已关闭',
    'card.status.relay_frozen': '🔄 会话已搬迁',
    'card.status.selected': '已选择',
    'card.status.waiting_screenshot': '_(等待第一张截图…)_',
    'card.status.truncated_prefix': '… (已截断)',
    'card.pending.title': '处理中',
    'card.pending.body': '🔄 正在处理你的请求...',
    'card.pending.detoured_title': '已发送',
    'card.pending.detoured_body': '最终回复已发送到其他目标。',
    'card.pending.mentioned_body': '最终回复已通过新消息发送。',
    // ─── Card body text ──────────────────────────────────────────────────────
    'card.body.cli_terminated': '{cliName} 进程已终止。',
    'card.body.relay_frozen': '本会话已通过 /relay 搬到其他群继续，本卡片冻结作为存档；按钮已移除，避免误操作影响新群里活着的会话。',
    'card.body.click_resume_or_run': '点击「恢复会话」继续，或在终端执行：',
    'card.body.click_resume_only': '点击「恢复会话」继续。',
    'card.body.cli_no_cli_resume': '{cliName} 不支持从命令行精确恢复指定会话，可在飞书内 resume。',
    'card.body.working_dir': '📁 工作目录：',
    'card.body.choose_label': '选择:',
    'card.usage_limit.retry_at': '⚠️ 当前已达到 {cliName} 使用限额。请在 {retryLabel} 后再试。',
    'card.usage_limit.retry_ready': '✅ {cliName} 限额预计已刷新。你可以重发上一条任务，或直接发送新消息。',
    'card.private.snapshot_note': '🔒 仅你可见的静态快照（不会实时刷新）。点「打开终端」查看实时画面。',
    // ─── Repo select card ────────────────────────────────────────────────────
    'card.repo.title': '📁 项目仓库管理',
    'card.repo.placeholder_switch': '选择仓库并切换',
    'card.repo.manual_placeholder': '输入任意工作目录，如 /path/to/project 或 ~/projects/foo',
    'card.repo.manual_empty': '请输入工作目录路径',
    'card.repo.current_active': '当前工作目录：',
    'card.repo.current_marker': ' ← 当前',
    'card.repo.note': '也可以回复 `/repo <编号>` 切换（如 `/repo 1`），或直接 `/repo <路径|项目名>`（如 `/repo botmux`、`/repo ~/projects/foo`）跳过本卡片；`/repo wt <编号|项目名> [分支名]` 基于远端默认分支新建 worktree 打开',
    'card.repo.placeholder_worktree': '🌿 选仓库新建 worktree 打开',
    'card.repo.toast_worktree_creating': '正在创建 worktree，完成后会在话题里通知…',
    // 群内授权卡片
    'card.grant.title': '🔑 使用授权',
    'card.grant.body_request': '用户 **{name}** 申请在本群使用我。<at id={owner}></at> 是否允许 ta 在本群与我对话？',
    'card.grant.body_owner': '是否授权 **{name}** 在本群与我对话？（<at id={owner}></at>）',
    'card.grant.body_owner_multi': '是否授权 {names} 在本群与我对话？（<at id={owner}></at>）',
    'card.grant.btn_chat': '授权本群对话',
    'card.grant.btn_global': '全局授权对话',
    'card.grant.btn_deny': '拒绝',
    'card.grant.note': '仅授予对话权（本群或全局）；/restart、/close、终端写入等敏感操作仍仅限 allowedUsers（owner）。',
    'card.grant.toast_owner_only': '仅 owner 可操作',
    'card.grant.toast_expired': '该授权请求已失效',
    'card.grant.toast_no_repo_perm': '无操作权限',
    'card.grant.toast_failed': '授权失败：{reason}',
    'card.land.title': '🧳 沙盒改动落盘',
    'card.land.body': '沙盒会话产生了 **{files}** 个文件改动（**+{ins} / -{del}**）。\n落盘目标：`{dir}`\n\n审阅下方 diff，确认后「应用到磁盘」会把这些改动 `git apply` 回真实仓库。',
    'card.land.files_header': '改动文件',
    'card.land.preview_header': 'diff 预览',
    'card.land.truncated': '预览已截断，完整改动见下方 .patch 文件',
    'card.land.patch_note': '已附完整 .patch 文件（可 git apply）',
    'card.land.btn_apply': '应用到磁盘',
    'card.land.btn_discard': '丢弃',
    'card.land.note': '仅 owner 可应用；改动来自隔离副本，应用前真实仓库不受影响。',
    'card.land.applied_title': '✅ 已落盘',
    'card.land.discarded_title': '🗑 已丢弃沙盒改动',
    'card.land.failed_title': '❌ 落盘失败',
    'card.land.applied_body': '已把 {files} 个文件的改动（+{ins}/-{del}）应用到 `{dir}`。',
    'card.land.discarded_body': '改动未应用，沙盒副本保持原样。',
    'card.land.toast_owner_only': '仅 owner 可操作落盘',
    'card.land.stale': '卡片缺少会话信息（可能是旧卡），请在会话里重新发 /land。',
    'cmd.land.no_workingdir': '会话没有 workingDir，无法确定落盘目标。',
    'cmd.land.cannot': '无法落盘：{error}',
    'cmd.land.empty': '沙盒副本没有改动，无需落盘。',
    'card.grant.result_chat': '✅ 已授权本群使用',
    'card.grant.result_global': '✅ 已全局授权',
    'card.grant.result_deny': '🚫 已拒绝该申请',
    'card.grant.partial_failed': '⚠️ 以下目标授权失败（可重新 /grant 重试）：{names}',
    'card.grant.notify_chat': '✅ {at} 已获授权在本群使用我，发消息 @ 我即可。',
    'card.grant.notify_global': '✅ {at} 已获全局授权，在任意群发消息 @ 我即可。',
    'card.grant.notify_quota_suffix': '（消息额度 {n} 条，用尽后自动收回授权）',
    // 消息额度用尽
    'quota.exhausted_notify': '⚠️ {at} 的消息额度已用尽（{limit}/{limit}），已收回与我的对话授权。如需继续，请联系 owner 重新 /grant。',
    // 被授权人命令限制（restrictGrantCommands 开启时）
    'cmd.grant_restricted': '⚠️ 当前授权仅允许普通对话，不能使用 {cmd} 等命令。如需放开请联系 owner。',
    // /grant、/revoke 命令回执
    'cmd.grant.owner_only': '仅 owner 可使用 /grant。',
    'cmd.grant.usage': '用法：@机器人 /grant @某人 [条数]（授权 ta 在本群与我对话，可一次 @ 多人/多 bot；带数字则给 N 条消息额度）｜@机器人 /grant（授权本群所有成员对话）。仅授对话权，敏感操作仍由 allowedUsers 控制。',
    'cmd.grant.bad_quota': '⚠️ 额度格式不对。用法：@机器人 /grant @某人 5（给 5 条消息额度，须为正整数）；不带数字则按默认额度 / 无限。',
    'cmd.grant.chat_done': '✅ 已授权本群所有成员与我对话（@ 我即可）。敏感操作仍仅限 allowedUsers。',
    'cmd.grant.chat_already': 'ℹ️ 本群已是授权状态，无需重复授权。',
    'cmd.grant.chat_failed': '⚠️ 授权失败：{reason}',
    'cmd.revoke.owner_only': '仅 owner 可使用 /revoke。',
    'cmd.revoke.usage': '用法：@机器人 /revoke @某人（撤销 ta 的本群对话权，可一次 @ 多人/多 bot）｜@机器人 /revoke（撤销本群整群对话授权）。',
    'cmd.revoke.chat_done': '✅ 已撤销本群整群对话授权。',
    'cmd.revoke.chat_none': 'ℹ️ 本群当前没有整群对话授权。',
    'cmd.revoke.chat_failed': '⚠️ 撤销失败：{reason}',
    'cmd.revoke.done': '已撤销 {name} 的权限（范围：{scope}）。',
    'cmd.revoke.would_open': '⚠️ 撤销失败：该用户是最后一个全局授权用户 / owner，撤销会让机器人对所有人开放，已阻止。',
    'cmd.revoke.failed': '⚠️ 撤销失败：{reason}',
    'cmd.revoke.scope_chat': '本群 ',
    'cmd.revoke.scope_global': '全局',
    'cmd.revoke.scope_global_talk': '全局对话 ',
    'cmd.revoke.scope_none': '无',
    'cmd.revoke.multi_header': '撤销结果：',
    'cmd.revoke.multi_ok': '✅ {name} —— 已撤销（范围：{scope}）',
    'cmd.revoke.multi_would_open': '⚠️ {name} —— 跳过：ta 是最后的全局授权用户 / owner，撤销会让机器人对所有人开放',
    'cmd.revoke.multi_failed': '⚠️ {name} —— 撤销失败：{reason}',
    // ─── Adopt card ──────────────────────────────────────────────────────────
    'card.adopt.title': '📡 选择要接入的 CLI 会话',
    'card.adopt.placeholder_select': '选择 CLI 会话',
    'card.adopt.uptime_unknown': '未知',
    'card.adopt.section_live': '**接管运行中的会话**（观察 tmux / zellij 里的活进程）',
    'card.adopt.section_resume': '**恢复历史会话**（从磁盘 resume 导入，无需进程在跑）',
    'card.adopt.placeholder_resume': '选择要 resume 的历史会话',
    'card.codex_app_thread.title': '📱 选择要继续的 Codex App 对话',
    'card.codex_app_thread.subtitle': '从 Codex App 本地历史中恢复一个已有对话；botmux 会用 app-server 协议继续该 thread。',
    'card.codex_app_thread.placeholder_select': '选择 Codex App 对话',
    'card.codex_app_thread.updated_unknown': '未知时间',
    // ─── /relay picker card (pull mode) ─────────────────────────────────────
    'card.relay.title': '📋 选择要接力到本群的会话',
    'card.relay.title_p2p': '📋 选择要接力到本单聊的会话',
    'card.relay.empty': '当前没有可接力的会话。\n（picker 只列你作为 owner、同一机器人在其他群里的活跃会话。）',
    'card.relay.btn_pull': '接力到本群',
    'card.relay.btn_confirm': '确认接力到本群',
    'card.relay.btn_confirm_p2p': '确认接力到本单聊',
    'card.relay.btn_confirm_running': '会话运行中，暂不可迁移',
    'card.relay.field_status': '状态',
    'card.relay.status_running': '🟢 运行中',
    'card.relay.status_idle': '⚪ 空闲',
    'card.relay.selected_tag': '已选中',
    'card.relay.hint_pick_first': '点击上方任意会话以选中，然后再点确认按钮触发接力。',
    'card.relay.search_placeholder': '🔍 搜索会话（标题/群名/路径）',
    'card.relay.btn_search': '搜索',
    'card.relay.btn_prev_page': '← 上一页',
    'card.relay.btn_next_page': '下一页 →',
    'card.relay.page_indicator': '第 {current} / {total} 页',
    'card.relay.empty_filtered': '没有匹配「{query}」的会话，请换个关键词。',
    'card.relay.placeholder_select': '选择要接力的会话',
    'card.relay.type_group': '普通群',
    'card.relay.type_topic': '话题群',
    'card.relay.type_p2p': '单聊',
    'card.relay.field_type': '类型',
    'card.relay.field_location': '位置',
    'card.relay.field_time': '活跃',
    'card.relay.toast_adopt_not_relayable': '该会话是 /adopt 接入的外部 tmux，无法接力。',
    'card.relay.toast_not_found': '会话已不存在或已关闭。',
    'card.relay.toast_not_owner': '只有会话发起人能接力它。',
    'card.relay.toast_not_invoker': '这张菜单是别人召唤的，请自己发 /relay 召唤一张。',
    'card.relay.toast_worker_busy': '⚠️ 会话当前正在处理中，请等它空闲后再接力。',
    'card.relay.toast_not_started_yet': '⚠️ 会话还没选仓库、CLI 没起来，无法接力。请先回原会话把仓库选了。',
    'card.relay.toast_same_chat': '该会话已在目标位置（同一话题/群），无需接力。',
    'card.relay.toast_failed': '接力失败：{error}',
    'card.relay.toast_target_has_session': '本群已有该机器人的活跃会话，请先 /close 它再接力',
    'cmd.relay.target_has_session_msg': '⚠️ 本群已有该机器人的活跃会话「{title}」。请先用 /close 关掉那个会话，再接力新的过来。',
    'card.relay.toast_success': '✅ 已接力到本群',
    // ─── TUI prompt card ─────────────────────────────────────────────────────
    'card.tui.input_placeholder': '输入自定义回复…',
    // ─── Command responses ───────────────────────────────────────────────────
    'cmd.no_active_session': '当前话题没有活跃的会话。',
    'cmd.card.operator_only': '⚠️ 仅授权用户（allowedUsers）可以使用 /card。',
    'cmd.term.operator_only': '⚠️ 仅授权用户（allowedUsers）可以用 /term 获取可操作终端链接。',
    'cmd.term.no_session': '当前话题没有活跃会话，/term 需要一个跑着的会话。',
    'cmd.term.not_ready': '🔒 终端还没就绪，等会话起好后再发 /term。',
    'cmd.term.failed': '⚠️ 可操作链接发送失败（私密卡与 DM 均失败），看 daemon 日志。',
    'cmd.term.sent_dm': '🔑 可操作终端链接已私信发你（不在群里暴露）。',
    'cmd.card.off_ok': '🔕 已关闭本群流式卡片，状态改用「处理中卡片」原地更新（不撤回）。/card on 恢复出卡；/card 可临时召唤一张实时卡。',
    'cmd.card.on_ok': '🔔 已恢复本群流式卡片。下条状态起重新出实时卡。',
    'cmd.card.fail': '⚠️ 操作失败：{reason}',
    'cmd.card.usage': '用法：/card（召唤实时卡）| /card off（本群关流式卡）| /card on（恢复出卡）',
    'cmd.card.not_ready': '终端尚未就绪，等会话起好后流式卡片会自动出现。',
    'cmd.card.private_not_ready': '🔒 终端尚未就绪，等会话起好后再发一次 /card。',
    'cmd.card.private_not_group': '🔒 私密卡片仅支持普通群聊，话题群 / 单聊无法发送（飞书限制）。',
    'cmd.card.private_no_audience': '🔒 没有可见对象：当前 bot 未配置 owner（allowedUsers 为空）。',
    'cmd.card.private_failed': '🔒 私密卡片发送失败 —— 可能是缺少消息发送权限、bot 不在群内，或当前为话题群。',
    'cmd.card.private_partial': '🔒 私密卡片已发送 {sent}/{total}，部分接收人发送失败。',
    'cmd.reply_mode.status': '当前群回复模式：{mode}\n可用命令：/reply-mode chat｜topic｜new-topic（shared 仍作为 topic 的兼容别名）',
    'cmd.reply_mode.updated': '✅ 已切换当前群回复模式为：{mode}',
    'cmd.reply_mode.unsupported': '⚠️ /reply-mode 仅支持普通群与私聊；话题群无需设置（本就是话题）。',
    'cmd.reply_mode.owner_only': '⚠️ 只有 owner/allowedUsers 可以修改会话模式。',
    'cmd.reply_mode.usage': '用法：/reply-mode chat｜topic｜new-topic\nchat=群内平铺回复且复用群会话；topic=回复落在话题里但复用同一个群 session（shared 是兼容别名）；new-topic=每次 @ 都开一个独立话题+独立会话。',
    'cmd.reply_mode.failed': '⚠️ 切换失败：{reason}',
    'cmd.reply_mode.dm_status': '当前私聊会话模式：{mode}\n可用命令：/reply-mode chat｜topic',
    'cmd.reply_mode.dm_updated': '✅ 已切换私聊会话模式为：{mode}',
    'cmd.reply_mode.dm_usage': '用法（私聊）：/reply-mode chat｜topic\nchat=整段 DM 共用一个连续会话；topic=每条消息各自起独立会话。',
    'cmd.reply_mode.dm_shared_unsupported': '⚠️ shared 仅对普通群有意义；私聊只支持 chat｜topic。',
    'cmd.restart.in_progress': '🔄 正在重启 {cliName}...',
    'cmd.restart.terminated': '{cliName} 进程已终止，下次发消息时将自动恢复。',
    'cmd.cd.usage': '用法：/cd <path>\n例如：/cd ~/projects/my-app',
    'cmd.cd.switched': '工作目录已切换到 {path}，下次发消息时将在新目录下恢复。',
    'cmd.cd.dir_not_exist': '目录不存在：{path}',
    'cmd.cd.cannot_read': '无法读取路径：{path}（{msg}）',
    'cmd.cd.not_a_directory': '路径不是目录：{path}',
    'cmd.repo.no_prior_scan': '请先执行 /repo 查看项目列表。',
    'cmd.repo.index_out_of_range': '序号超出范围，有效范围：1-{max}',
    'cmd.repo.path_not_found': '❌ 找不到目录或项目：`{arg}`\n请传入绝对路径、相对路径，或 workingDir 下的一级项目名。',
    'cmd.repo.selected_in_pending': '✅ 已选择 {name}',
    'cmd.repo.switched_to': '🔄 已切换到 {name}',
    'cmd.repo.warning_running': '⚠️ 当前会话已在运行中，切换仓库将关闭当前会话并创建新会话。\n如需切换，请在下方卡片中选择新仓库。',
    'cmd.repo.scan_dir_not_exist': '扫描目录不存在：{dirs}\n请检查 bots.json 中的 workingDir 是否指向有效目录。',
    'cmd.repo.working_dir_not_exist': '❌ 配置的工作目录不存在或不是目录：{dirs}\n请检查 ~/.botmux/bots.json 中的 workingDir / workingDirs，或重新运行 `botmux setup` 修改为已存在的目录。',
    'cmd.repo.no_git_repos': '在 {dirs} 下未找到 git 仓库。',
    'cmd.repo.worktree_usage': '用法：`/repo wt <编号|项目名|路径> [新分支名]` — 基于该仓库的远端默认分支新建 worktree 并打开。',
    'cmd.repo.worktree_creating': '🌿 正在为 `{repo}` 创建 worktree（含 git fetch，可能需要几秒）…',
    'cmd.repo.worktree_created': '🌿 worktree 已创建：`{path}`\n分支 `{branch}`，基于 `{base}`',
    'cmd.repo.worktree_failed': '❌ 创建 worktree 失败：{error}',
    'cmd.repo.worktree_in_progress': '⏳ 已有一个 worktree 正在创建，请稍候…',
    'cmd.repo.worktree_created_not_switched': '🌿 worktree 已创建：`{path}`（分支 `{branch}`），但会话状态已变化，未自动切换。需要时可用 `/repo {path}` 打开。',
    'cmd.repo.worktree_switch_failed': '⚠️ worktree 已创建：`{path}`，但自动切换失败：{error}\n可用 `/repo {path}` 手动打开。',
    'cmd.skip.opened': '▶️ 已直接开启会话（工作目录：{cwd}）',
    'cmd.status.running': '运行中',
    'cmd.status.waiting': '等待中',
    'cmd.status.fallback_no_session': '当前话题没有活跃的会话。\nDaemon active sessions: {count}\n{cliName}: v{version}',
    'cmd.login.no_credentials': '❌ 无法获取应用凭证',
    'cmd.login.title': '🔐 飞书用户授权',
    'cmd.login.step1': '1. 点击下方链接完成授权：',
    'cmd.login.step2': '2. 授权后浏览器会跳到一个「打不开 / 无法访问此网站（ERR_CONNECTION_REFUSED）」的页面——这是正常的（回调地址是本机 127.0.0.1，daemon 在远端故连不上）',
    'cmd.login.step3': '3. 复制地址栏里那条 http://127.0.0.1:9768/callback?code=... 的完整网址，发回本话题即可。\n   ⚠️ 若地址栏看不到（被页面拦截 / 没跳转）：按 F12 开控制台 → Network（网络）→ 勾 All（全部）→ 再点「授权」→ 找到对 127.0.0.1:9768 的那条请求 → 右键 Copy → Copy URL，发回本话题。',
    'cmd.login.footer': '授权后可下载第三方卡片中的图片等资源。',
    'cmd.login.status_hint': '查看状态：/login status',
    'cmd.subdoc.no_session': '⚠️ /subscribe-lark-doc 需要在一个活跃会话里用：先在本话题正常发起会话，再订阅文档。',
    'cmd.subdoc.usage': '用法：\n• /subscribe-lark-doc <飞书文档链接> — 订阅该文档，文档评论将喂进本会话\n• /subscribe-lark-doc list — 查看本会话已订阅的文档\n• /subscribe-lark-doc off — 退订本会话所有文档',
    'cmd.subdoc.need_login': '🔐 订阅文档评论需要「文档权限」的用户授权（含读写评论 + 订阅事件，与通用 /login 的权限不同）。点下方链接完成授权，再重发 /subscribe-lark-doc <文档链接>。\n⚠️ 还需在开发者后台为本应用启用这些权限、并订阅「云文档评论」事件，否则收不到评论。',
    'cmd.subdoc.subscribed': '✅ 已订阅文档 {title}。\n之后该文档的评论（{mode}）会作为消息喂进本会话，我的回复会发表为文档评论。\n退订：/subscribe-lark-doc off',
    'cmd.subdoc.subscribed_moved': '✅ 已订阅文档 {title}（{mode}）。\n⚠️ 该文档原先绑在另一条会话上，现已改绑到本会话。',
    'cmd.subdoc.unsubscribed': '✅ 已退订本会话的 {count} 个文档。',
    'cmd.subdoc.none': '本会话还没有订阅任何文档。用 /subscribe-lark-doc <文档链接> 订阅。',
    'cmd.subdoc.list_title': '📄 本会话已订阅的文档：',
    'cmd.subdoc.failed': '❌ 订阅失败：{err}',
    'cmd.subdoc.mode_mention': '仅 @我 的评论',
    'cmd.subdoc.mode_all': '所有新评论',
    'daemon.doc_comment_prefix': '[来自飞书文档评论 · {author}]',
    'daemon.doc_comment_reply_prefix': '↪ 回复 {author}：',
    'daemon.doc_comment_replied_card': '✅ 已回复到飞书文档的评论。',
    'cmd.adopt.already_adopted': '本话题已接入 {label} ({pane})。\n请先点击卡片上的「断开」按钮，再 /adopt 切换 CLI 会话（原 CLI 不受影响）。',
    'cmd.adopt.no_sessions': '未发现可接入的 CLI 会话',
    'cmd.adopt.pane_not_found': '未找到 tmux pane {pane}',
    'cmd.adopt.target_exited': '⚠️ 目标 CLI 会话已退出',
    'cmd.adopt.success': '📡 已接入 {cliName} · {project} ({pane})',
    'cmd.adopt.resume_success': '↩️ 已恢复 {cliName} 历史会话 · {project} —「{title}」',
    'cmd.adopt.resume_not_found': '⚠️ 该历史会话已不存在或已被占用（{id}）',
    'cmd.detach.success': '⏏ 已断开，原 CLI 会话不受影响',
    'cmd.detach.not_adopted': '本话题不是 /adopt 接入的会话，/detach 不适用。要结束 botmux 会话用 /close（会一并结束 CLI 进程）。',
    'cmd.codex_app_adopt.no_threads': '未发现可继续的 Codex App 对话',
    'cmd.codex_app_adopt.thread_not_found': '未找到 Codex App 对话 {threadId}',
    'cmd.codex_app_adopt.list_failed': '读取 Codex App 对话失败：{error}',
    'cmd.codex_app_adopt.success': '📱 已继续 Codex App 对话：{title}',
    'cmd.oncall.need_group': '/oncall 需要在群聊中、以新话题方式使用。',
    'cmd.oncall.not_bound': '当前群尚未绑定 oncall 项目。\n\n用法：\n/oncall bind <path>     — 绑定当前群到某个项目目录，跳过仓库选择卡片\n/oncall unbind          — 解除当前群的 oncall 绑定\n/oncall status          — 查看当前绑定状态\n\n绑定后：群内任何成员都可以 @ 机器人提问；仅 allowedUsers 能点卡片按钮、执行 /cd /restart /close 等命令。',
    'cmd.oncall.bound': '🟢 已绑定 oncall\n工作目录：{dir}\n\n/oncall unbind 可解除绑定；/cd <path> 切换工作目录（仍保留 oncall 模式）。',
    'cmd.oncall.bind_usage': '用法：/oncall bind <path>\n例如：/oncall bind ~/projects/payments-service',
    'cmd.oncall.bind_failed_no_bot': '⚠️ 无法在配置文件中找到当前机器人条目，绑定失败。',
    'cmd.oncall.bind_failed': '⚠️ 绑定失败：{reason}',
    'cmd.oncall.bind_success': '✅ {verb} oncall\n群：{chatId}\n工作目录：{target} → {resolved}\n\n下次在本群开新话题时会直接用此目录启动 CLI，不再弹仓库选择卡片。',
    'cmd.oncall.verb_bound': '已绑定',
    'cmd.oncall.verb_updated': '已更新',
    'cmd.oncall.unbind_failed': '⚠️ 解绑失败：{reason}',
    'cmd.oncall.unbind_not_bound': '当前群未绑定 oncall。（已记录解绑意图，default-oncall 不会再自动绑此群）',
    'cmd.oncall.unbind_success': '✅ 已解除 oncall 绑定。下次开新话题将恢复默认仓库选择卡片流程。',
    'cmd.oncall.unknown_sub': '未知子命令：{sub}\n支持：/oncall bind <path> | /oncall unbind | /oncall status',
    'cmd.config.no_bot': '⚠️ 无法识别当前响应的机器人，/botconfig 无法执行。',
    'cmd.config.no_owner': '⚠️ 本机器人未配置 allowedUsers（无 owner），不能通过聊天改配置。请在部署机器上用 `botmux setup` 配置。',
    'cmd.config.not_admin': '⛔ 仅 owner / allowedUsers 可改配置。',
    'cmd.config.card_dm_failed': '⚠️ 配置卡只私信发送，但这次没能发给你（为避免配置暴露在群里，不在群内展示）。请确认已和我开启单聊后，重新发送 /botconfig。',
    'cmd.config.help': '⚙️ /botconfig —— 远程改本机器人运营配置（仅 owner/allowedUsers，写盘即热更新，无需重启）\n\n用法：\n/botconfig get              — 查看当前配置\n/botconfig set <字段> <值>  — 修改\n/botconfig unset <字段>     — 清回默认（部分字段支持）\n\n可改字段：\n{fields}\n\n敏感字段 allowedUsers 需在结尾加 `确认` 才生效；secret（appSecret/凭证）不能经此修改。',
    'cmd.config.snapshot': '⚙️ 当前配置\nCLI：{cli}　品牌：{brand}　管理员：{admins} 人\n工作目录：{dirs}\n\n{fields}\n\n（改：/botconfig set <字段> <值>；查帮助：/botconfig help）',
    'cmd.config.set_usage': '用法：/botconfig set <字段> <值>　或　/botconfig unset <字段>\n查看可改字段：/botconfig help',
    'cmd.config.unknown_field': '未知字段：{field}\n可改字段：{fields}',
    'cmd.config.not_clearable': '字段 {field} 不支持 unset（用 /botconfig set {field} on|off，或直接设新值）。',
    'cmd.config.value_required': '请提供 {field} 的值：/botconfig set {field} <值>',
    'cmd.config.invalid_bool': '{field} 需要布尔值（on/off），收到：{value}',
    'cmd.config.invalid_enum': '{field} 取值需为 {values} 之一。',
    'cmd.config.invalid_cli': '⚠️ {msg}',
    'cmd.config.set_ok': '✅ 已更新 {field}：{old} → {new}\n{effect}',
    'cmd.config.unset_ok': '✅ 已清除 {field}（原值 {old}），回退默认。\n{effect}',
    'cmd.config.effect_immediate': '↳ 立即生效（下条消息/事件起读取新值）。',
    'cmd.config.effect_next_session': '↳ 新会话生效；运行中的会话发 /restart 重启后换用新值。',
    'cmd.config.write_failed': '⚠️ 写入失败：{reason}',
    'cmd.config.unknown_sub': '未知子命令：{sub}\n支持：/botconfig get | set | unset | help',
    'cmd.config.card_dmd': '⚙️ 配置卡片已私信给你（仅你可见）→ 去和我的私聊里查看 / 操作。',
    'card.config.title': '⚙️ {name} · 配置',
    'card.config.summary': '🤖 CLI **{cli}**　·　🧠 model **{model}**　·　🌐 lang **{lang}**　·　👤 管理员 **{admins}**',
    'card.config.default': '默认',
    'card.config.sec.runtime': '🧠 运行',
    'card.config.sec.card': '🎴 卡片行为',
    'card.config.sec.autostart': '🚀 主动开工',
    'card.config.sec.security': '🔒 安全 / 授权',
    'card.config.quota_label': '消息额度',
    'card.config.quota_off': '不限',
    'card.config.p2p.placeholder': '私聊模式',
    'card.config.p2p.thread': '🧵 thread（每条 DM 独立会话）',
    'card.config.p2p.chat': '💬 chat（连续单聊会话）',
    'config.label.disableStreamingCard': '关闭实时卡片',
    'config.label.writableTerminalLinkInCard': '卡内嵌可写终端',
    'config.label.privateCard': '私有快照卡',
    'config.label.autoStartOnGroupJoin': '进群即开工',
    'config.label.autoStartOnNewTopic': '新话题即开工',
    'config.label.disableCliBypass': '关绕过·更安全',
    'config.label.restrictGrantCommands': '被授权人仅对话',
    'card.config.note': '🟢=开 ⚪=关，点一下即切换并刷新（model/cli 下个新会话起效）。语言：`/botconfig zh`｜`/botconfig en`。\n更多字段点「✏️ 文本设置」；allowedUsers / oncall 用 `/botconfig help`。',
    'card.config.text_btn': '✏️ 文本设置',
    'card.config.text_title': '✏️ {name} · 文本设置',
    'card.config.text_note': '改完点「保存」一次写入；某项留空 = 清除该项。角色较长/多行建议改用 `/role team set`。',
    'card.config.lbl_brand': '卡片签名（brandLabel）',
    'card.config.lbl_prompt': '入群首轮 prompt',
    'card.config.lbl_role': '默认角色（team，跨群）',
    'card.config.save': '💾 保存',
    'card.config.back': '⬅ 返回配置',
    'card.config.text_saved': '✓ 已保存',
    'card.config.text_sent': '✏️ 文本设置卡已发到你私聊 ↓',
    'card.config.text_send_fail': '⚠️ 发送失败（你可能没和本 bot 开过私聊）',
    'config.label.autoStartPrompt': '入群首轮 prompt',
    'cmd.config.allow_usage': '用法：/botconfig set allowedUsers <邮箱/on_/ou_，逗号或空格分隔> 确认\n例：/botconfig set allowedUsers alice@corp.com, ou_xxx 确认',
    'cmd.config.allow_invalid': '⚠️ 非法条目（需完整邮箱或 on_/ou_ 开头）：{items}',
    'cmd.config.allow_confirm': '⚠️ 即将把管理员名单改为：\n{list}\n\n这会改变谁能管理本机器人。确认请重发并在结尾加 `确认`：\n/botconfig set allowedUsers {list} 确认',
    'cmd.config.allow_ok': '✅ 管理员名单已更新（{total} 条，解析出 {count} 个 open_id），立即生效。',
    'cmd.config.allow_lockout': '⛔ 新名单不含你自己，会把你踢出管理员（防自锁）。请在名单中保留自己再试。',
    'cmd.config.allow_empty': '⚠️ 新名单解析后为空（邮箱/ID 都无法解析），已拒绝。',
    'cmd.group.empty_fallback': '新会话 {ts}',
    'cmd.group.no_bot': '⚠️ 无法识别当前响应的机器人，/group 创建失败。',
    'cmd.group.no_sender': '⚠️ 无法获取发起人 open_id，/group 创建失败。',
    'cmd.group.created': '✅ 已新建群「{name}」\n👉 {link}\n\n直接在新群里开聊就行，整个群是一个独立的 CLI 会话。{hints}',
    'cmd.group.failed': '⚠️ 建群失败：{error}',
    'cmd.group.warn_invite_rejected': '⚠️ 飞书拒绝了自动邀请（你可能不在当前机器人的 app scope 下）。请到群里手动加入。',
    'cmd.group.warn_transfer_failed': '⚠️ 转让群主失败（{reason}），当前机器人仍是群主。可在新群里手动转让。',
    'cmd.group.bots_invited': '🤖 群内机器人：{bots}',
    'cmd.group.warn_bots_rejected': '⚠️ 部分机器人未能加入（{bots}），可能不在当前机器人的 app scope 下。请到群里手动添加。',
    'cmd.group.warn_share_link_failed': '⚠️ 群分享链接获取失败，上面的链接仅群内成员可点开，非成员请群主手动邀请。',
    'cmd.group.resolve_failed': '⚠️ 无法解析被 @ 的机器人（可能群成员信息暂时拿不到），未建群。请稍后重试。',
    // ─── /relay --create ────────────────────────────────────────────────────
    'cmd.relay.empty_group_name': '会话接力 {ts}',
    'cmd.relay.no_session': '⚠️ /relay 必须在已有会话的话题里发起。',
    'cmd.relay.target_has_session': '⚠️ 本群里这个机器人已经有一个活跃会话「{title}」。请先用 /close 关掉那个会话，再 /relay 接力新的过来。',
    'cmd.relay.no_sender': '⚠️ 无法获取发起人 open_id，/relay 取消。',
    'cmd.relay.no_mentions': '⚠️ /relay --create 必须 @ 至少一个机器人作为新群的协作伙伴。',
    'cmd.relay.not_owner': '⚠️ 只有会话发起人能用 /relay --create 把会话搬到新群。',
    'cmd.relay.adopt_not_relayable': '⚠️ 该会话是 /adopt 接入的外部 tmux 进程，CLI 在你电脑里跑，botmux 控不了 tmux 生命周期，无法接力。',
    'cmd.relay.not_started_yet': '⚠️ 会话还没选仓库、CLI 没起来，无法接力。请先在本会话里选仓库把 CLI 起起来。',
    'cmd.relay.worker_busy': '⚠️ 会话正在处理中（mid-turn），无法接力。请等当前回合结束（idle）后再发 /relay。',
    'cmd.relay.resolve_failed': '⚠️ 无法解析被 @ 的机器人，/relay 取消。请稍后重试。',
    'cmd.relay.m1_announce': '📋 已从「{sourceChat}」接力会话过来。\n⚠️ 飞书消息历史留在源群，AI 记忆已接续。\n@ 对应机器人继续对话即可。',
    'cmd.relay.m1_announce_dm': '📋 已从「{sourceChat}」接力会话过来。\n⚠️ 飞书消息历史留在源会话，AI 记忆已接续。\n直接发消息继续对话即可。',
    'cmd.relay.m1_final_all_ok': '🚀 会话已接力到本群\n📋 来源：{sourceChat}\n✅ 已就绪：{successBots}\n⚠️ 飞书消息历史留在源群，AI 记忆已接续。@ 对应机器人继续对话。',
    'cmd.relay.m1_final_partial': '🚀 会话已接力到本群\n📋 来源：{sourceChat}\n✅ 已就绪：{successBots}\n⚠️ 未能迁移：{failedBots}\n→ 请在本群发 /relay，从菜单里把上述 bot 在源群的会话拉过来\n⚠️ 飞书消息历史留在源群，AI 记忆已接续。',
    'cmd.relay.m1_final_all_fresh': '🚀 新群已建好，机器人都已邀请。\n📋 来源：{sourceChat}\n本次没有可迁移的源会话——@ 任意机器人开始新对话即可。',
    'cmd.relay.created': '✅ 已创建群「{name}」并接力会话\n👉 {link}\n\n{report}',
    'cmd.relay.report_leader_ok': '• {bot}（当前会话）已接力',
    'cmd.relay.report_leader_no_session': '• {bot}（当前会话）— 跳过（无活跃会话）',
    'cmd.relay.report_leader_failed': '• {bot}（当前会话）— 接力失败：{error}',
    'cmd.relay.report_peer_ok': '• {bot} 已接力',
    'cmd.relay.report_peer_no_session': '• {bot} — 跳过（在源话题无会话）',
    'cmd.relay.report_peer_not_owner': '• {bot} — 跳过（会话不属于你）',
    'cmd.relay.report_peer_offline': '• {bot} — 跳过（守护进程离线）',
    'cmd.relay.report_peer_busy': '• {bot} — 跳过（会话繁忙，超时）',
    'cmd.relay.report_peer_failed': '• {bot} — 接力失败：{error}',
    'cmd.relay.failed': '⚠️ /relay --create 失败：{error}',
    // ─── /schedule ───────────────────────────────────────────────────────────
    'schedule.empty_with_examples': '暂无定时任务。\n\n用法示例：\n/schedule 每日17:50 帮我看看今天AI圈有什么新闻\n/schedule 工作日每天9:00 检查服务状态\n/schedule 每周一10:00 生成周报',
    'schedule.list_header': '定时任务列表 ({count})：',
    'schedule.next_label': ' → 下次: {time}',
    'schedule.last_label': ' | 上次: {time}',
    'schedule.removed': '已删除定时任务 {id}',
    'schedule.not_found': '未找到任务 {id}',
    'schedule.enabled': '已启用定时任务 {id}',
    'schedule.disabled': '已禁用定时任务 {id}',
    'schedule.triggered_now': '已触发定时任务 {id} 立即执行',
    'schedule.created': '✅ 定时任务已创建！\n\nID: {id}\n名称: {name}\n规则: {rule}\nPrompt: {prompt}\n工作目录: {dir}\n下次执行: {next}',
    'schedule.parse_failed': '无法解析定时任务，请使用自然语言格式：\n\n/schedule 每日17:50 帮我看看今天AI圈有什么新闻\n/schedule 工作日每天9:00 检查服务状态\n/schedule 每周一10:00 生成周报\n/schedule 每小时 检查服务健康状态\n/schedule 每30分钟 ping一下服务\n/schedule 每月1号9:00 生成月报\n\n管理命令：\n/schedule list — 查看所有任务\n/schedule remove <id> — 删除任务\n/schedule enable <id> — 启用任务\n/schedule disable <id> — 禁用任务\n/schedule run <id> — 立即执行一次',
    // ─── /help ───────────────────────────────────────────────────────────────
    'help.heading_session': '📌 会话管理：',
    'help.close': '/close      - 关闭当前会话，终止 {cliName} 进程',
    'help.restart': '/restart    - 重启 {cliName} 进程（保留 session）',
    'help.cd': '/cd <path>  - 切换工作目录并重启 {cliName} 进程',
    'help.repo_list': '/repo       - 仓库待选时直接在默认目录开会话；会话中则弹项目选择卡片',
    'help.repo_n': '/repo <N>   - 切换到第 N 个项目',
    'help.repo_path': '/repo <路径|项目名> - 直接指定路径或 workingDir 下的项目名，跳过选择卡片',
    'help.repo_wt': '/repo wt <编号|项目名> [分支] - 基于远端默认分支新建 worktree 并打开',
    'help.status': '/status     - 查看当前会话状态（含终端链接）',
    'help.card': '/card       - 手动弹出当前会话的流式卡片（关流式时也能临时召唤，并恢复实时刷新；开了私密卡片则改发仅授权人可见的静态快照）',
    'help.term': '/term       - 获取当前会话的「可操作终端」（带写权限）链接，私密发给 owner（群内仅你可见，话题/单聊回退私信，不在群里暴露）',
    'help.subscribe_doc': '/subscribe-lark-doc <文档链接|list|off> - 订阅飞书文档：文档评论喂进本会话，我的回复发回评论（首次需 /login）',
    'help.heading_passthrough': '🔀 透传给 {cliName}（字面送达，供其内置 slash 命令处理）：',
    'help.heading_schedule': '⏰ 定时任务：',
    'help.schedule_create': '/schedule 每日17:50 帮我看AI新闻   - 创建定时任务（自然语言）',
    'help.schedule_list': '/schedule list                     - 查看所有定时任务',
    'help.schedule_remove': '/schedule remove <id>              - 删除任务',
    'help.schedule_toggle': '/schedule enable/disable <id>      - 启用/禁用任务',
    'help.schedule_run': '/schedule run <id>                 - 立即执行一次',
    'help.schedule_formats': '支持的时间格式：每日/每天、每周X、每月X号、工作日每天、每N小时、每N分钟',
    'help.heading_adopt': '📡 会话接入：',
    'help.adopt': '/adopt              - 接管运行中的 CLI 会话，或从磁盘 resume 导入历史会话',
    'help.adopt_pane': '/adopt <tmux_pane>  - 直接接入指定 tmux pane（或历史会话 id）',
    'help.detach': '/detach             - 断开本话题与 adopt 会话的桥接（原 CLI 不受影响，/disconnect 同义）',
    'help.heading_login': '🔐 用户授权：',
    'help.login': '/login              - 飞书用户授权（可下载第三方卡片图片等）',
    'help.login_status': '/login status       - 查看授权状态',
    'help.heading_oncall': '🛎️ Oncall 模式（群聊）：',
    'help.oncall_bind': '/oncall bind <path>  - 把当前群绑到某个项目，跳过仓库选择卡片',
    'help.oncall_unbind': '/oncall unbind       - 解绑当前群',
    'help.oncall_status': '/oncall status       - 查看当前群的 oncall 绑定',
    'help.heading_grant': '🔑 使用授权（owner 专用）：',
    'help.grant': '@机器人 /grant @某人   - 授权对方在本群对话（可一次 @ 多人/多 bot）；/grant（不带人）授权本群所有成员对话',
    'help.revoke': '@机器人 /revoke @某人  - 撤销对方本群对话权（可一次 @ 多人/多 bot）；/revoke（不带人）撤销整群授权',
    'help.heading_config': '⚙️ 远程改配置（owner 专用，写盘即热更新、无需重启）：',
    'help.config_get': '/botconfig get  - 查看本机器人当前运营配置',
    'help.config_set': '/botconfig set <字段> <值>  - 改 model/cli/lang/开关等；/botconfig help 看全部字段',
    'help.heading_group': '🆕 一键新建会话群：',
    'help.group': '/group <群名>  (别名 /g)  - 自动建群、邀请你进群（整群=一个 CLI 会话）',
    'help.list_slash': '/list-slash-command  (别名 /slash)  - 列出当前可用的 slash 命令（固定放行 / CLI 默认 / 自定义配置 / 自动发现）',
    'help.help': '/help       - 显示此帮助',
    // ─── /list-slash-command ─────────────────────────────────────────────────
    'slashlist.heading': '🧩 当前可用的 Slash 命令（{cliName}）',
    'slashlist.part_builtin': '① botmux 固定放行（内置透传白名单）：',
    'slashlist.part_adapter': '② 当前 CLI 默认放行：',
    'slashlist.part_custom': '③ 用户自定义配置（bots.json · customPassthroughCommands）：',
    'slashlist.part_custom_empty': '（未配置 —— 在 bots.json 给本 bot 加 customPassthroughCommands: ["/xxx"] 即可额外放行）',
    'slashlist.part_discovered': '④ 自动发现（CLI 文件系统自定义命令 / skill / 插件）：',
    'slashlist.part_discovered_empty': '（未发现 —— 当前 CLI 目录暂无 commands/skills/plugins；工作区：{dir}）',
    'slashlist.part_discovered_unsupported': '（{cliName} 暂未声明可枚举的文件系统命令目录）',
    'slashlist.more': '… 另有 {n} 条未展示',
    'slashlist.mcp_note': 'ℹ️ MCP 的 /mcp__<server>__<prompt> 需运行时握手才能枚举，此处不列。检测到 MCP server：{servers}',
    'slashlist.col_cmd': '命令',
    'slashlist.col_desc': '说明',
    // ─── AI system prompt (Claude Code: --append-system-prompt) ──────────────
    'ai.routing.intro': '你连接到了飞书（Lark）话题群。用户在飞书上阅读，看不到你的终端输出。',
    'ai.routing.must_use_botmux': '想让用户看到的内容必须通过 `botmux send` 命令发送，终端输出不会到达聊天。',
    'ai.routing.usage_heading': '使用指南：',
    'ai.routing.usage_send_when': '- 用 `botmux send` 发送：关键结论、方案（等用户确认再执行）、最终结果、进度更新。',
    'ai.routing.usage_send_text': '- 发送纯文本即可：`botmux send "消息"`。格式自动处理。',
    'ai.routing.usage_heredoc': '- 多行消息必须用 heredoc，禁止写成 `botmux send "第一行\\n第二行"`；否则 `\\n` 可能按字面量显示在飞书里。',
    'ai.routing.heredoc_example': "  正确多行示例：\n```bash\nbotmux send <<'EOF'\n第一行\n第二行\nEOF\n```",
    'ai.routing.usage_images': '- 附带图片：`botmux send --images /path/to/img.png "说明文字"`',
    'ai.routing.usage_files': '- 附带文件：`botmux send --files /path/to/file.pdf "请查收"`',
    'ai.routing.usage_history': '- 需要上下文时用 `botmux history` 读取之前的对话。',
    'ai.routing.usage_bots_list': '- 查看可协作的机器人：`botmux bots list`',
    // ─── AI identity (multi-bot routing rules) ───────────────────────────────
    'ai.identity.unknown': '(未知)',
    'ai.identity.routing_intro': '群里可能有多个机器人，消息里用 `@名字` 和 `open_id` 区分接收方。对照上面的 name/open_id 判断本条消息归属：',
    'ai.identity.rule_own_part': '- 只执行明确分给自己的那部分，别抢别的机器人的活',
    'ai.identity.rule_silent_when_other': '- 整条消息都指派给别的机器人时，保持沉默不要回复',
    'ai.identity.rule_no_proactive_pull': '- **默认不主动拉别的 bot 进来**。除非用户明确要求、或某段任务只能由对方做，否则一个人做完自己的部分就行。',
    'ai.identity.mention_intro': '**和别的机器人协作的硬性物理事实**：飞书话题群里其他 bot **默认收不到** 你 `botmux send` 出去的消息——',
    'ai.identity.mention_must': '要让某个 bot 接力干活，**必须** 显式 `--mention <对方 bot 的 open_id>`，不 --mention 对方 bot 完全不会被触发。',
    'ai.identity.mention_partners': '- 协作伙伴的 open_id 会列在每条用户消息附带的 `<available_bots>` 块里，也可以 `botmux bots list` 查',
    'ai.identity.mention_usage': '- 用法：`botmux send --mention ou_xxx "消息内容"`（多个 bot 重复 `--mention`）；`--mention-back` 可一键 @ 回触发你的那个人/ bot（open_id 自动取，无需手填）',
    'ai.identity.mention_gate': '- **@ 硬门**：每条 `botmux send` 必须显式三选一否则报错不发——`--mention`（点名）/ `--mention-back`（@回触发者）/ `--no-mention`（不@）。按内容价值选：有实质结论、要对方继续看/确认/决策 → --mention-back（或 --mention 点名）；纯记录/低优先级进度/简短确认 → --no-mention；没信息量的"收到"不如不发。别把 --no-mention 当默认，也别无意义 @ 打扰',
    'ai.identity.mention_when_to': '- 该 --mention 的场景：用户明确要求让对方接力、把任务的某段交给对方、需要对方给最终结论或做独立操作',
    'ai.identity.mention_when_not': '- 不必 --mention 的场景：纯状态更新/确认/感谢——尽量合并到下一次有内容的消息里再带上，避免互相 ping 触发空转',
    // ─── AI hints (non-Claude CLIs: BOTMUX_SHELL_HINTS) ──────────────────────
    'ai.shell.intro': '你运行在飞书（Lark）话题群中。用户在飞书阅读回复，看不到你的终端输出。',
    'ai.shell.commands_are_shell': '重要：botmux send / botmux history / botmux quoted / botmux bots 都是 shell 命令（CLI 程序，已安装在 $PATH），不是 MCP 工具。必须通过 Bash 工具执行，不要到 MCP 工具列表里找。',
    'ai.shell.how_to_send': '把消息发给用户（唯一方式）：用 Bash 执行 `botmux send "消息内容"`；附带图片用 `--images /path`，附带文件用 `--files /path`。',
    'ai.shell.multiline_heredoc': '多行消息必须用 heredoc，禁止写成 `botmux send "第一行\\n第二行"`；否则 `\\n` 可能按字面量显示在飞书里。',
    'ai.shell.heredoc_example': "正确多行示例：\n```bash\nbotmux send <<'EOF'\n第一行\n第二行\nEOF\n```",
    'ai.shell.helpers': '辅助命令：`botmux history`（读此会话历史；thread/话题会话拉话题内，普通群 chat-scope 会话拉整群）、`botmux quoted <message_id>`（按需读取被引用的消息，仅在 prompt 头部出现 `[用户引用了消息 ...]` 提示时使用）、`botmux bots list`（查群内其他机器人）。',
    'ai.shell.when_to_send': '发送时机：关键结论、方案（等用户确认再动手）、最终结果、进度更新。只 print/echo 不算回复。',
    'ai.shell.mention_gate': '@ 决策（硬性）：每条 `botmux send` 必须显式三选一否则报错——`--mention <open_id:名字>`（点名某人/bot，让别的 bot 接力必须用它）/ `--mention-back`（@回触发你的那条消息的发送者）/ `--no-mention`（不@）。按内容价值选：有实质结论要对方看/确认/决策→--mention-back；纯记录/低优先级/简短确认→--no-mention；没信息量的"收到"不如不发。别把 --no-mention 当默认，也别无意义 @ 打扰。',
    // ─── AI prompt blocks (session-manager) ──────────────────────────────────
    'ai.attach.hint': '使用 Read 工具查看，序号与正文中的 [图片 N] / [文件 N] 占位符对应',
    'ai.identity.short_routing': '提醒：让别的 bot 接力干活必须 `botmux send --mention <对方 open_id>`，否则对方 bot 不会被触发。',
    'ai.available_bots.hint': '让这里的某个 bot 接力干活必须 --mention 它的 open_id（botmux send --mention ou_xxx ...），不 --mention 对方 bot 完全收不到消息',
    'ai.followup.reminder': '回复必须 botmux send，终端输出用户看不到',
    'ai.cursor.sender_note': 'sender 标签只是元信息（标识当前发言人），不要把其中的 open_id 或名字（例如 ou_xxx:高鹏）抄进 botmux send 的正文或开头；要 @ 回触发者请用 botmux send --mention-back。',
    'ai.bridge.attachments_label': '[附件]',
    'ai.bridge.mentions_label': '[@提及]',
    'schedule.title_prefix': '[定时]',
    // ─── Role command ─────────────────────────────────────────────────────────
    'role.current': '📋 当前生效的 Role：',
    'role.byte_count': '{bytes} / {max} 字节',
    'role.empty': '当前没有生效的 Role（团队级与本群均未配置）。\n\n用法：\n• /role set <Markdown> — 设置本群 Role（覆盖团队级）\n• /role team set <Markdown> — 设置团队级 Role（本机器人跨群默认）\n• /role cap set <一句话> — 设置能力标签（花名册展示）',
    'role.saved_via_cmd': '✅ 本群 Role 已更新（{bytes} / {max} 字节）。新会话生效。',
    'role.deleted_via_cmd': '✅ 本群 Role 已删除。',
    'role.nothing_to_delete': '当前群没有 Role 配置，无需删除。',
    'role.set_empty': 'Role 内容不能为空。用法：/role set <Markdown 内容>',
    'role.no_chat': '无法获取群信息，请稍后重试。',
    'role.src_chat': '（来源：本群覆盖）',
    'role.src_team': '（来源：团队级默认）',
    'role.team_current': '📋 团队级 Role（本机器人，跨群默认）：',
    'role.team_empty': '尚未设置团队级 Role。\n用法：/role team set <Markdown> — 设置；/role team delete — 删除',
    'role.team_saved': '✅ 团队级 Role 已更新（{bytes} / {max} 字节）。未单独覆盖的群在新会话生效。',
    'role.team_deleted': '✅ 团队级 Role 已删除。',
    'role.team_nothing': '没有团队级 Role，无需删除。',
    'role.cap_current': '🏷️ 当前能力标签：{cap}',
    'role.cap_empty': '尚未设置能力标签。\n用法：/role cap set <一句话能力描述>',
    'role.cap_saved': '✅ 能力标签已更新：{cap}',
    'role.cap_cleared': '✅ 能力标签已清除。',
    'role.cap_set_empty': '能力标签不能为空。用法：/role cap set <描述>',
    'role.help': '/role 用法：\n• /role — 查看当前生效 Role\n• /role set <Markdown> — 设置本群 Role（覆盖团队级）\n• /role delete — 删除本群 Role\n• /role team [set <Markdown>|delete] — 团队级 Role（跨群默认）\n• /role cap [set <一句话>|clear] — 能力标签（花名册展示）',
    'pair.usage': '用法：/pair <配对码>（在团队平台网页点"登录"会显示配对码）。',
    'pair.ok': '✅ 登录配对成功，请回到网页继续。',
    'pair.expired': '配对码已过期，请在网页重新发起登录。',
    'pair.already': '该配对码已被使用，请在网页重新发起登录。',
    'pair.not_found': '配对码无效，请检查后重试（区分有效期，过期需重新发起）。',
    // ─── Card handler responses ──────────────────────────────────────────────
    'card.action.adopt_no_restart': '⚠️ adopt 模式不支持重启（不会触动你自己的 tmux pane / CLI 进程）',
    'card.action.restarted': '🔄 已重启 {cliName}',
    'card.action.restarted_fresh': '🔄 已重新启动 {cliName}',
    'card.action.resume_missing_session_id': '⚠️ 缺少 session_id，无法恢复。',
    'card.action.resume_success': '✅ 会话已恢复，发条消息继续与 {cliName} 对话。',
    'card.action.resume_not_found': '⚠️ 找不到会话 {short}，可能已被清理。',
    'card.action.resume_not_closed': '会话已是活跃状态，无需恢复。',
    'card.action.resume_anchor_occupied': '⚠️ 当前话题已有新会话{detail}，无法恢复旧会话。',
    'card.action.resume_anchor_holder': '（占用者：{short}）',
    'card.action.resume_adopt_unsupported': '⚠️ adopt 接管会话不支持 resume。',
    'card.action.disconnected': '⏏ 已断开，原 CLI 会话不受影响',
    'card.voice.toast_wait': '🔊 正在生成语音总结，请耐心等待…',
    'card.voice.toast_already': '🔊 这条已经在生成语音啦，请稍候',
    'card.voice.toast_session_gone': '⚠️ 会话已不在线，无法生成语音总结',
    'card.voice.toast_need_auth': '🔒 你没有该机器人的使用权限，无法生成语音总结，请联系管理员授权',
    'card.action.takeover_retired': '⚠️ 旧版"接管"按钮已停用。bridge 模式下原 CLI 由 botmux 桥接，无需接管即可在飞书中收到回答。如需 /resume 完整接管能力，请等待 /adopt --takeover 命令上线。',
    'card.action.terminal_not_ready': '⚠️ 终端尚未就绪，请稍后再试。',
    'card.action.no_output': '(当前无输出内容)',
    'card.action.tui_select_title': 'Select options',
    'card.action.tui_custom_input': 'Custom input',
    'card.action.tui_done': 'Done',
    'card.action.continue_using_current_repo': '继续使用当前仓库：{cwd}',
    'card.action.retry_last_task_missing': '⚠️ 找不到上一条任务，无法重发。请直接发送新的消息。',
    'card.action.retry_last_task_unavailable': '⚠️ 当前重试状态已失效。请直接发送新的消息。',
    'card.action.retry_last_task_not_ready': '⚠️ 当前仍在限额中，请在 {retryLabel} 后再试。',
    // ─── Worker → daemon notices ─────────────────────────────────────────────
    'worker.adopted_session_exited': '⏏ /adopt的 CLI 会话已断开',
    'worker.crash_loop_stopped': '⚠️ {cliName} 在 1 分钟内崩溃 {count} 次，已停止自动重启。发消息可触发重新启动。',
    // ─── CLI setup wizard / pm2 lifecycle (no per-bot context) ───────────────
    'setup.lark_create_app': '请先在飞书开放平台创建应用: https://open.feishu.cn/app',
    'setup.lark_permissions_required': '需要的权限:',
    'setup.lark_perm_im_message': '  - im:message (发送/接收消息)',
    'setup.lark_perm_group_at_msg': '  - im:message.group_at_msg (群消息)',
    'setup.lark_perm_resource': '  - im:resource (文件下载)',
    'setup.lark_perm_chat': '  - im:chat (群信息)',
    'setup.lark_perm_user_base': '  - contact:user.base:readonly (用户信息)',
    'setup.lark_enable_events': '启用事件订阅 (WebSocket 模式):',
    'setup.supported_clis': '支持的 CLI: 1) claude-code  2) aiden  3) coco  4) codex  5) cursor  6) gemini  7) opencode  8) antigravity  9) mtr  10) hermes  11) codex-app  12) mira',
    'setup.prompt_cli_choice': 'CLI 适配器 [1]: ',
    'setup.prompt_working_dir': '默认工作目录 [~]: ',
    'setup.prompt_allowed_users': '允许的用户 (邮箱或 open_id，逗号分隔，留空=不限制): ',
    'setup.prompt_lang': 'UI 语言 / UI language [zh/en, 默认 zh]: ',
    'setup.section_lark_app_config': '── 飞书应用配置 ──',
    'setup.section_reconfigure': '── 重新配置 ──',
    'setup.section_add_new_bot': '── 添加新机器人 ──',
    'setup.config_written': '✅ 配置已写入: {path}',
    'setup.next_step': '下一步:',
    'setup.next_step_short': '下一步: botmux restart',
    'setup.next_start_daemon': '  1. botmux start              启动 daemon（飞书后台配长连接前必须先启动）',
    'setup.next_autostart': '  2. botmux autostart enable   注册开机自启（推荐：{platformName}，无需 sudo）',
    'setup.platform_mac': 'mac launchd',
    'setup.platform_linux': 'linux user systemd',
    'setup.platform_other': '当前平台暂不支持',
    'setup.wizard_title': '🤖 botmux 配置向导',
    'setup.config_dir': '配置目录: {path}',
    'setup.data_dir': '数据目录: {path}',
    'setup.bots_already_configured': '已配置 {count} 个机器人：',
    'setup.prompt_action_existing_bots': '操作: 1) 添加新机器人  2) 重新配置  (1/2) [1]: ',
    'setup.old_config_backed_up': '旧配置已备份: {path}',
    'setup.added_bot': '✅ 已添加机器人 {appId}，共 {count} 个',
    'setup.config_file': '   配置文件: {path}',
    'setup.using_single_bot_config': '当前使用单机器人配置: {path}',
    'setup.prompt_action_env_exists': '操作: 1) 添加新机器人  2) 覆盖当前配置  (1/2): ',
    'setup.old_env_backed_up': '   旧 .env 已备份: {path}',
    'setup.env_missing_keys': '⚠️  当前 .env 缺少 LARK_APP_ID 或 LARK_APP_SECRET，请先完成基础配置',
    'setup.current_bot': '当前机器人: {appId} ({cliId})',
    'setup.migrated_to_multibot': '✅ 已迁移到多机器人配置',
    'start.no_config': '❌ 未找到配置文件',
    'start.run_setup': '   请先运行: botmux setup',
    'start.daemon_started': '✅ daemon 已启动{suffix}',
    'start.daemon_started_suffix': ' ({count} 个机器人, 每个独立进程)',
    'start.logs_hint': '   日志: botmux logs',
    'start.status_hint': '   状态: botmux status',
    'start.autostart_synced': '   autostart unit 已同步到当前 Node/cli.js 路径',
    // ─── Daemon runtime notices ──────────────────────────────────────────────
    'daemon.auto_start_join_title': '主动开工（入群）',
    'daemon.auto_start_join_seed': '🚀 已加入本群，开始工作…',
    'daemon.cmd_requires_session': '{cmd} 需要在已有会话内使用（先发一条普通消息启动 CLI）。',
    'daemon.cmd_allowed_users_only': '⚠️ {cmd} 仅 allowedUsers 可执行。',
    'daemon.download_failed_need_login': '⚠️ 部分图片/文件下载失败（缺少 User Token）。请在话题中发送 /login 授权后重新发送。',
    'daemon.foreign_bot_mention_prefix': '[来自 {botName} 的 @mention]',
    'daemon.cmd_needs_active_cli': '{cmd} 需要活跃的 CLI 进程，当前话题无运行中的会话。',
    'daemon.enriched_mentions_label': '消息中的 @mention：',
    'daemon.choose_repo_first': '请先在上方卡片中选择仓库，您的消息已暂存，选择后会自动发送。',
    // ─── i18n coverage v2: shared fragments + cards + chat messages ───────────
    'common.operator': '操作人：{by}',
    'common.empty_paren': '（空）',
    'common.truncated_short': '…（已截断）',
    // Workflow approval card
    'card.wf.none': '无',
    'card.wf.title_pending': '需要审批：{node}',
    'card.wf.title_resolved': '{prefix}：{node}',
    'card.wf.review_content': '审批内容',
    'card.wf.review_preview_suffix': '（预览，完整内容见下方 Web 详情）',
    'card.wf.comment_placeholder': '可选：填写审批意见',
    'card.wf.btn_approve': '✅ 通过',
    'card.wf.btn_reject': '❌ 拒绝',
    'card.wf.btn_cancel_run': '取消 Run',
    'card.wf.btn_web_detail': 'Web 详情',
    'card.wf.resolved.approved': '已通过',
    'card.wf.resolved.rejected': '已拒绝',
    'card.wf.resolved.cancelled': '已取消',
    'card.wf.banner.approved': '✅ 已通过',
    'card.wf.banner.rejected': '❌ 已拒绝',
    'card.wf.banner.cancelled': '🛑 已取消',
    'card.wf.comment_label': '备注：{comment}',
    'card.wf.truncated': '…（已截断，完整内容请在 Web 查看）',
    // Workflow progress card
    'card.wf.field.status': '状态',
    'card.wf.field.progress': '进度',
    'card.wf.field.failed': '失败',
    'card.wf.progress_value': '{done} / {total} 节点完成',
    'card.wf.section.running': '进行中',
    'card.wf.section.waiting': '等待审批',
    'card.wf.section.loop': '循环节点',
    'card.wf.failure_summary': '失败摘要',
    'card.wf.terminal.live': '查看当前终端',
    'card.wf.terminal.log': '查看执行日志',
    'card.wf.usage': '用法：/workflow run <id> [key=value ...]\n或：/workflow cancel <runId>',
    'wf.err.missing_run_id': '缺少 runId',
    'wf.err.cancel_only_run_id': '/workflow cancel 只接受 runId',
    'wf.err.run_id_charset': 'runId 只能包含字母、数字、下划线、点和短横线',
    'wf.err.unknown_subcommand': '只支持 /workflow run / cancel 子命令',
    'wf.err.missing_workflow_id': '缺少 workflow id',
    'wf.err.workflow_id_charset': 'workflow id 只能包含字母、数字、下划线、点和短横线',
    'wf.err.param_format': '参数必须是 key=value 形式：{token}',
    'wf.err.param_name_charset': '参数名只能包含字母、数字、下划线、点和短横线：{key}',
    'wf.err.duplicate_param': '重复参数：{key}',
    'wf.cmd_failed': 'Workflow 命令失败：{error}',
    // Ask card
    'card.ask.field.deadline': '截止',
    'card.ask.field.answerable': '可答复',
    'card.ask.question_n': '问题 {n}',
    'card.ask.submit': '提交',
    'card.ask.custom_reply_hint': '💬 选项都不合适？直接在话题里回复你的答案即可。',
    'card.ask.title': 'botmux ask',
    'card.ask.title_done': 'botmux ask 已结束',
    'card.ask.toast.unauthorized': '你没有权限回答这个 ask',
    'card.ask.toast.already_settled': '这个 ask 已经被回答或结束',
    'card.ask.toast.stale': '⚠️ 此 ask 已失效',
    'card.ask.custom_reply': '自定义回复',
    'card.ask.q_summary_line': '问题{n}：{labels}',
    'card.ask.q_unparseable': '问题{n}：（无法解析）',
    'card.ask.selected': '已选择',
    'card.ask.supplement': '补充：{comment}',
    'card.ask.timed_out': '超时未答',
    'card.ask.invalidated': '已失效',
    'card.ask.no_approver': '无可用答复人',
    'card.ask.answerable_talk_members': '本群可对话成员',
    // Voice summary instruction (injected into the model session)
    'card.voice.summary_instruction': '🔊【语音总结请求】把你上一条发给用户的回复，精简成不超过 5 句、适合朗读的口语：去掉代码、命令、文件路径、URL、英文缩写和 markdown 标记，只讲结论，第一句直接进正题。然后调用 `botmux send --voice "<精简后的口语>"` 把它作为语音发出来。只发这一条语音，不要再额外发文字说明。',
    // Card action toasts (dedupe / in-flight / approver gate)
    'toast.action_received_no_repeat': '操作已收到，请勿重复点击',
    'toast.action_in_progress': '操作正在处理中，请稍候',
    'toast.action_received_bg': '操作已收到，后台处理中',
    'toast.not_in_approver_list': '你不在该审批人名单里，无法操作',
    // Quote hint (injected into the CLI prompt)
    'prompt.quote_hint': '[用户引用了消息 用 botmux quoted {id} 查看]',
    // Markdown / contextual reply card chrome
    'card.you': '你',
    'card.sent_to': '发送给：',
    // Adopt preamble card title
    'card.adopt_last_round': '📜 /adopt 前最后一轮',
    'card.local_turn_resumed': '🖥️ 终端本地对话续传（daemon 重启时模型正在输出）',
    'card.local_turn': '🖥️ 终端本地对话（在 adopted pane 中直接输入，已同步至飞书）',
    // Scheduler announcements
    'scheduler.task_started': '🕐 定时任务「{name}」开始执行',
    'scheduler.task_triggered_target_chat': '🕐 定时任务「{name}」已在目标群聊触发',
    'scheduler.task_triggered_target_thread': '🕐 定时任务「{name}」已在目标话题触发',
    // External event trigger seed
    'trigger.external_event': '外部事件触发：{source}',
    // Worker-side submit / notify messages
    'worker.submit_impossible': '⚠️ 刚才那条消息没有写入 {cliName}，因为当前按键配置无法从终端自动提交。\n原因：{reason}\n请调整 Claude Code Chat keybinding 后重发。\n开头：{preview}',
    'worker.submit_unconfirmed': '⚠️ 刚才那条消息发给 {cliName} 后没能确认提交（重试 Enter 后等了 {secs}s 仍未在{transcriptLabel}里看到新记录）。可能卡在输入框里——请去 Web 终端看一下，手动按 Enter 或重发。\n开头：{preview}',
    'worker.coco_session_dir_gone': '⚠️ 当前 CoCo 进程的会话目录已被删除（可能是 e2e 测试清理或手动 rm），写到 events.jsonl 的内容会落到一个失效 inode 上，桥接读不到。请重启 CoCo 后重新 /adopt。',
    // Restart / maintenance report (bot-0 DM to owner)
    'restart.updated_restarted': '🔄 **botmux 已更新并重启**',
    'restart.restarted': '🔄 **botmux 已重启**',
    'restart.version_delta': '版本：{old} → {new}',
    'restart.version': '版本：{version}',
    'restart.unfinished_sessions': '未结束会话：{count} 个',
    'restart.dashboard': 'Dashboard：{url}',
    'restart.changelog_label': '更新内容：',
    'restart.changelog_link_fallback': '详情：{url}',
    'restart.card_title': 'botmux 维护通知',
    // Auto-start (joined chat) member-read failure admin DM
    'daemon.auto_start_member_read_failed': '⚠️ botmux「被拉进新群自动开工」已开启，但读取群成员失败，无法判断群里是否有授权用户，自动开工被跳过。\n\n最可能原因：缺少读取群成员的权限（im:chat / 群信息读取），或没有订阅「机器人进群」事件 `im.chat.member.bot.added_v1`。\n\n请到飞书开放平台 → 应用 → 权限管理 / 事件订阅 里补齐，然后 `botmux restart`。\n\n错误详情：{detail}',
    // Sandbox landing (/land) errors
    'sandbox.no_clone': '该会话没有沙盒改动层（未开沙盒，或改动层已清理）',
    'sandbox.clone_not_git': '沙盒改动层不可用，暂不支持落盘',
    'sandbox.nothing_to_land': '没有改动可落盘',
    'sandbox.target_not_git': '落盘目标目录不存在：{dir}',
    'sandbox.apply_failed': '落盘失败：{detail}',
    'sandbox.diff_failed': '读取沙盒改动失败：{detail}',
    'sandbox.workingdir_not_found': '找不到会话 workingDir',
    'sandbox.no_changes_left': '沙盒改动层已无改动',
};
//# sourceMappingURL=zh.js.map