export type Lang = 'en' | 'zh';
declare const en: {
    readonly 'lang.pick': "Select language / 选择界面语言";
    readonly 'lang.label.en': "English";
    readonly 'lang.label.zh': "中文";
    readonly 'lang.saved': "Language preference saved to {file}";
    readonly 'menu.title': "Agim · maintenance entry";
    readonly 'menu.subtitle': "What would you like to do?";
    readonly 'menu.config': "Configure (messengers, agents, SMTP, Baidu Maps …)";
    readonly 'menu.status': "Show service status";
    readonly 'menu.start': "Start the service (foreground)";
    readonly 'menu.start_bg': "Start the service (background)";
    readonly 'menu.restart': "Restart the service";
    readonly 'menu.stop': "Stop the service";
    readonly 'menu.token': "Manage web access tokens";
    readonly 'menu.invite_admin': "Invite a new admin (one-time IM token)";
    readonly 'menu.uninstall': "Uninstall Agim (keeps workspaces)";
    readonly 'menu.quit': "Quit";
    readonly 'invite_admin.title': "👥 Admin invite";
    readonly 'invite_admin.generated': "✓ Invite token generated:";
    readonly 'invite_admin.howto': "Forward this command to the invitee — they paste it into IM (any messenger this bot is on):";
    readonly 'invite_admin.note': "⚠️ Single-use. Generating another invite invalidates the previous one. Token also at:";
    readonly 'token.title': "Web access tokens";
    readonly 'token.subtitle': "Tokens grant access to the web console at http://<host>:3000/.";
    readonly 'token.choice.create': "Generate a new token";
    readonly 'token.choice.list': "List existing tokens";
    readonly 'token.choice.revoke': "Revoke a token";
    readonly 'token.choice.back': "← Back";
    readonly 'token.create.label_prompt': "Optional label (e.g. \"macbook\"):";
    readonly 'token.create.printed': "Save this token now — the raw value is not recoverable later:";
    readonly 'token.list.empty': "(no tokens yet)";
    readonly 'token.revoke.prompt': "Pick a token to revoke:";
    readonly 'token.revoke.confirm': "Revoke {label} ({id})?";
    readonly 'token.revoke.success': "✓ token revoked";
    readonly 'token.revoke.not_found': "✗ token not found";
    readonly 'config.title': "Agim · config";
    readonly 'config.subtitle': "Pick a section to edit. Each section has a Back option.";
    readonly 'config.section.messengers': "Messengers (WeChat / Feishu / DingTalk / Email)";
    readonly 'config.section.agents': "AI agents (Claude Code / OpenCode / Codex)";
    readonly 'config.section.acp': "Remote ACP agents";
    readonly 'config.section.web': "Web admin — listen address + port";
    readonly 'config.section.smtp': "SMTP — email reminder delivery";
    readonly 'config.section.baidu': "Baidu Maps AK — /memo address geocoding";
    readonly 'web.title': "Web admin — listen bind + port";
    readonly 'web.subtitle': "Bind controls who can reach the web console. Loopback only is the safe default; non-loopback requires a TLS-terminating reverse proxy in front of agim.";
    readonly 'web.current': "Current — bind: {bind}, port: {port}";
    readonly 'web.action.bind': "Change bind address";
    readonly 'web.action.port': "Change port";
    readonly 'web.action.back': "← Back";
    readonly 'web.bind.prompt': "Pick a bind address:";
    readonly 'web.bind.option.loopback': "127.0.0.1 — loopback only (recommended)";
    readonly 'web.bind.option.public': "0.0.0.0 — all interfaces (requires reverse-proxy TLS in front!)";
    readonly 'web.bind.public_warn': "⚠️  0.0.0.0 binds every network interface. Web auth tokens will travel cleartext unless you put a TLS-terminating reverse proxy (nginx / caddy / traefik) in front of agim. Set IMHUB_WEB_TLS_ACK=1 to silence the boot banner once your TLS terminator is verified.";
    readonly 'web.bind.public_confirm': "You have a TLS reverse proxy in front of agim. Continue?";
    readonly 'web.bind.saved': "✅ bind set to {bind} (written to {file}). Restart agim to pick up the new address.";
    readonly 'web.port.prompt': "Enter port (current: {current}):";
    readonly 'web.port.saved': "✅ port set to {port} (written to config.json). Restart agim to bind the new port.";
    readonly 'config.section.done': "Done — save and exit";
    readonly 'config.saved': "Config saved to {file}";
    readonly 'svc.offer.not_running_title': "🚀 Service is not running yet.";
    readonly 'svc.offer.not_running_q': "Start Agim in the background now?";
    readonly 'svc.offer.bg_started': "✅ Agim started in the background (pid {pid}, log: {log})";
    readonly 'svc.offer.bg_url': "   Web console: http://{bind}:{port}";
    readonly 'svc.offer.skipped': "Skipped. Run `agim start` (foreground) or `agim start --bg` (background) when you are ready.";
    readonly 'svc.offer.bg_check_log': "⚠️ The background daemon may have failed — check the log:";
    readonly 'svc.offer.running_title': "✓ Agim is already running ({mode}, pid {pid}).";
    readonly 'svc.offer.restart_q': "You changed the config — restart now so it takes effect?";
    readonly 'svc.offer.restart_skipped': "Skipped. Run `agim restart` later when ready.";
    readonly 'svc.offer.foreground_hint': "A foreground `agim start` is running elsewhere — restart it manually (Ctrl-C + re-run) for the new config to take effect.";
    readonly 'svc.offer.systemd_restarted': "✅ systemd restart issued.";
    readonly 'messengers.title': "Messengers";
    readonly 'messengers.subtitle': "Pick a messenger to configure. Each is independent.";
    readonly 'messengers.status.enabled': "enabled";
    readonly 'messengers.status.enabled_no_creds': "enabled (credentials missing)";
    readonly 'messengers.status.disabled': "not configured";
    readonly 'messengers.label.wechat': "WeChat (iLink bot)";
    readonly 'messengers.label.telegram': "Telegram";
    readonly 'messengers.label.feishu': "Feishu / Lark";
    readonly 'messengers.label.dingtalk': "DingTalk (钉钉)";
    readonly 'messengers.label.discord': "Discord";
    readonly 'messengers.label.email': "Email (SMTP push)";
    readonly 'messengers.row': "{label} — {status}";
    readonly 'messengers.action.configure': "Configure";
    readonly 'messengers.action.reconfigure': "Re-configure (replace credentials)";
    readonly 'messengers.action.remove': "Remove from enabled list";
    readonly 'messengers.action.enable_email': "Enable email push (also requires SMTP)";
    readonly 'messengers.action.disable_email': "Disable email push";
    readonly 'messengers.action.back': "← Back";
    readonly 'messengers.removed': "{label} removed from the enabled list.";
    readonly 'messengers.enabled': "{label} configured and enabled.";
    readonly 'messengers.smtp_hint': "Email push relies on the SMTP settings above. Configure SMTP first if you have not.";
    readonly 'wechat.fetching': "Fetching QR code from iLink…";
    readonly 'wechat.scan': "📱 Scan with WeChat — paste the URL into a browser to render the image:";
    readonly 'wechat.waiting': "Waiting for scan + confirm (up to 2 minutes)…";
    readonly 'wechat.logged_in': "✅ Logged in as {user} (bot id: {bot})";
    readonly 'wechat.failed': "❌ Login failed or timed out. You can retry from this menu.";
    readonly 'tg.docs': "To get a bot token:\n  1. Open Telegram and search for @BotFather\n  2. Send /newbot and follow the prompts\n  3. Copy the bot token";
    readonly 'tg.field.token': "Bot token";
    readonly 'tg.field.token_keep': "Bot token (Enter = keep existing {hint})";
    readonly 'tg.field.channel': "Channel id (optional, Enter = default)";
    readonly 'feishu.docs': "To create a Feishu bot:\n  1. https://open.feishu.cn/app → 创建自建应用\n  2. Enable Bot capability\n  3. Subscribe to im.message.receive_v1\n  4. Permissions: im:message, im:message.p2p_msg:readonly, im:message:send_as_bot\n  5. Create + publish a version\n  6. Copy App ID and App Secret";
    readonly 'feishu.field.app_id': "App ID";
    readonly 'feishu.field.app_secret': "App Secret";
    readonly 'feishu.field.app_secret_keep': "App Secret (Enter = keep existing)";
    readonly 'dingtalk.docs': "To create a DingTalk Stream-mode bot:\n  1. https://open.dingtalk.com → create an Enterprise Internal App (1-person company works for personal use)\n  2. App → Add capability → Bot → choose Stream mode → publish\n  3. Copy ClientID (== AppKey) and ClientSecret from the app credentials page";
    readonly 'dingtalk.field.client_id': "ClientID (AppKey)";
    readonly 'dingtalk.field.client_secret': "ClientSecret";
    readonly 'dingtalk.field.client_secret_keep': "ClientSecret (Enter = keep existing)";
    readonly 'dingtalk.field.dm_policy': "DM access policy";
    readonly 'dingtalk.field.group_policy': "Group chat access policy";
    readonly 'dingtalk.field.ack_reaction': "Inbound ack-reaction mode";
    readonly 'dingtalk.policy.open': "open — anyone can talk to the bot";
    readonly 'dingtalk.policy.pairing': "pairing — first DM sender becomes paired; later DMs from others ignored";
    readonly 'dingtalk.policy.allowlist': "allowlist — only IDs in allowFrom / groupAllowFrom (manage in config.json or Web admin)";
    readonly 'dingtalk.policy.disabled': "disabled — bot ignores group messages entirely";
    readonly 'dingtalk.ack.off': "off — no ack glyph sent";
    readonly 'dingtalk.ack.emoji': "emoji — ⏳ on receive, ✅ on done";
    readonly 'dingtalk.ack.kaomoji': "kaomoji — pure-text faces, for clients with no emoji font";
    readonly 'discord.docs': "To create a Discord bot:\n  1. https://discord.com/developers/applications → New Application\n  2. Bot tab → Add Bot → enable MESSAGE CONTENT INTENT (privileged)\n  3. Reset Token to grab the bot token\n  4. OAuth2 → URL Generator → invite to your server";
    readonly 'discord.field.token': "Bot token";
    readonly 'discord.field.token_keep': "Bot token (Enter = keep existing)";
    readonly 'discord.field.channel': "Channel id (optional, Enter = default)";
    readonly 'discord.field.guilds': "Allowed guild ids (comma-separated, optional)";
    readonly 'discord.field.channels': "Allowed channel ids (comma-separated, optional)";
    readonly 'agents.title': "AI agents";
    readonly 'agents.subtitle': "Pick an agent to configure. Status comes from probing its CLI.";
    readonly 'agents.status.enabled_installed': "enabled · CLI installed";
    readonly 'agents.status.enabled_missing': "enabled · CLI NOT installed";
    readonly 'agents.status.disabled_installed': "not enabled · CLI installed";
    readonly 'agents.status.disabled_missing': "not enabled · CLI NOT installed";
    readonly 'agents.row': "{label} — {status}";
    readonly 'agents.label.claude-code': "Claude Code";
    readonly 'agents.label.opencode': "OpenCode";
    readonly 'agents.label.codex': "Codex";
    readonly 'agents.action.enable': "Add to enabled list";
    readonly 'agents.action.disable': "Remove from enabled list";
    readonly 'agents.action.set_default': "Set as default agent";
    readonly 'agents.action.recheck': "Re-check CLI installation";
    readonly 'agents.action.install_hint': "Show install instructions";
    readonly 'agents.action.back': "← Back";
    readonly 'agents.installed_msg': "✅ {label}: CLI installed and reachable.";
    readonly 'agents.missing_msg': "❌ {label}: CLI not found on PATH.";
    readonly 'agents.auth_hint.opencode': "After install, run: opencode auth login";
    readonly 'agents.auth_hint.codex': "After install, run: codex login";
    readonly 'agents.auth_hint.cursor': "After install, run: cursor-agent login (OAuth) or set CURSOR_API_KEY";
    readonly 'agents.install_hint.claude-code': "Install: npm install -g @anthropic-ai/claude-code";
    readonly 'agents.install_hint.opencode': "Install: npm i -g opencode-ai@latest  (or visit https://github.com/anomalyco/opencode)";
    readonly 'agents.install_hint.codex': "Install: npm install -g @openai/codex";
    readonly 'agents.install_hint.cursor': "Install: curl https://cursor.com/install -fsS | bash";
    readonly 'agents.enabled': "Enabled {label}{also_default}.";
    readonly 'agents.also_default': " (also set as default)";
    readonly 'agents.removed': "Removed {label} from enabled list.";
    readonly 'agents.default_set': "Default agent is now {label}.";
    readonly 'agents.default_picker': "Default agent (used when no /prefix)";
    readonly 'agents.set_default_subtitle': "Pick the default agent.";
    readonly 'agents.set_default_action': "Set / change default agent";
    readonly 'acp.title': "Remote ACP agents";
    readonly 'acp.subtitle': "HTTP agents exposed via ACP. Add, edit, or remove.";
    readonly 'acp.action.add': "Add a new agent";
    readonly 'acp.action.edit': "Edit {name}";
    readonly 'acp.action.remove': "Remove {name}";
    readonly 'acp.action.back': "← Back";
    readonly 'acp.field.name': "Agent name (used as /prefix)";
    readonly 'acp.field.endpoint': "Endpoint URL (e.g. https://api.example.com)";
    readonly 'acp.field.auth_type': "Auth type";
    readonly 'acp.field.auth_token': "Bearer token";
    readonly 'acp.auth.none': "None (public endpoint)";
    readonly 'acp.auth.bearer': "Bearer token";
    readonly 'acp.added': "Added agent: {name}";
    readonly 'acp.removed': "Removed agent: {name}";
    readonly 'smtp.title': "SMTP (for /remind email delivery)";
    readonly 'smtp.subtitle': "These end up in {envFile} (chmod 600). Skip if email is not used.";
    readonly 'smtp.current_set': "Currently configured: {user} via {host}:{port}";
    readonly 'smtp.current_unset': "Currently configured: (none)";
    readonly 'smtp.action.edit': "Edit / re-configure SMTP";
    readonly 'smtp.action.disable': "Disable SMTP (clear all keys)";
    readonly 'smtp.action.back': "← Back";
    readonly 'smtp.preset': "Pick a preset or Custom";
    readonly 'smtp.preset.gmail': "Gmail (smtp.gmail.com:465, requires App Password)";
    readonly 'smtp.preset.outlook': "Outlook (smtp.office365.com:587)";
    readonly 'smtp.preset.qq': "QQ Mail (smtp.qq.com:465, requires authorization code)";
    readonly 'smtp.preset.163': "163 Mail (smtp.163.com:465, requires authorization code)";
    readonly 'smtp.preset.custom': "Custom SMTP server";
    readonly 'smtp.preset.skip': "Skip — disable SMTP";
    readonly 'smtp.field.host': "SMTP host";
    readonly 'smtp.field.port': "SMTP port";
    readonly 'smtp.field.user': "SMTP user (login email)";
    readonly 'smtp.field.pass': "SMTP password / app password (hidden)";
    readonly 'smtp.field.pass_keep': "SMTP password (hidden, Enter = keep existing)";
    readonly 'smtp.field.from': "From address (Enter = same as user)";
    readonly 'smtp.field.secure': "TLS mode";
    readonly 'smtp.secure.auto': "auto (recommended)";
    readonly 'smtp.secure.true': "true (SSL on connect, e.g. port 465)";
    readonly 'smtp.secure.false': "false (STARTTLS, e.g. port 587)";
    readonly 'smtp.saved': "SMTP credentials saved to {file} (chmod 600)";
    readonly 'smtp.cleared': "SMTP disabled — cleared {file}";
    readonly 'env.shadowed_warn': "⚠️  {key} is also set by the running environment (systemd unit / shell export). Saving to {file} alone will NOT change the active value — update the unit file or `unset` the shell export first.";
    readonly 'baidu.title': "Baidu Maps AK (for /memo address geocoding)";
    readonly 'baidu.subtitle': "Optional — without it, /memo still works with raw coords + browser GPS.";
    readonly 'baidu.howto': "Get a free AK: https://lbsyun.baidu.com → Console → 应用管理 → 创建应用 → 服务端 API";
    readonly 'baidu.action.set': "Set / update AK";
    readonly 'baidu.action.clear': "Clear AK (disable geocoding)";
    readonly 'baidu.action.back': "← Back";
    readonly 'baidu.input': "Paste AK (32-char string starting with non-digit, leave blank to skip)";
    readonly 'baidu.saved': "Baidu Maps AK saved to {file}";
    readonly 'baidu.cleared': "Baidu Maps AK cleared";
    readonly 'svc.status.title': "Agim · status";
    readonly 'svc.status.systemd_active': "systemd unit `{unit}` is active (pid {pid})";
    readonly 'svc.status.systemd_inactive': "systemd unit `{unit}` exists but is inactive";
    readonly 'svc.status.bg_running': "background daemon running (pid {pid}, log: {log})";
    readonly 'svc.status.fg_running': "foreground process running (pid {pid})";
    readonly 'svc.status.not_running': "no running Agim instance found";
    readonly 'svc.status.web': "web console: http://{bind}:{port}";
    readonly 'svc.status.uptime': "uptime: {duration}";
    readonly 'svc.start.starting_fg': "Starting in foreground — Ctrl-C to stop.";
    readonly 'svc.start.starting_bg': "Starting in background…";
    readonly 'svc.start.bg_ready': "✅ Background daemon started (pid {pid}, log: {log})";
    readonly 'svc.start.bg_hint': "Tip: use `agim stop` to terminate; `agim status` to inspect.";
    readonly 'svc.start.systemd_managed': "A systemd unit already manages Agim. Use `systemctl start {unit}`.";
    readonly 'svc.start.already_running': "Already running (pid {pid}). Use `agim restart` instead.";
    readonly 'svc.stop.stopping_systemd': "Stopping systemd unit `{unit}`…";
    readonly 'svc.stop.stopping_bg': "Stopping background daemon (pid {pid})…";
    readonly 'svc.stop.not_running': "Nothing to stop — Agim is not running.";
    readonly 'svc.stop.stopped': "✅ Stopped.";
    readonly 'svc.restart.systemd': "Restarting via `systemctl restart im-hub.service`…";
    readonly 'svc.restart.bg': "Restarting background daemon…";
    readonly 'svc.restart.fg_warning': "A foreground process is running; cannot restart from another shell. Stop it (Ctrl-C) and run `agim start --bg`.";
    readonly 'svc.restart.done': "✅ Restarted.";
    readonly 'svc.uninstall.intro': "Choose what to uninstall. Picking option 2 or 3 will also do everything option 1 does.";
    readonly 'svc.uninstall.mode.prompt': "Uninstall mode:";
    readonly 'svc.uninstall.mode.keep_name': "Keep all data (safe — default)";
    readonly 'svc.uninstall.mode.keep_desc': "Stop service, remove npm install + {config} + systemd unit. Tokens, memory, sessions, workspaces all preserved.";
    readonly 'svc.uninstall.mode.creds_name': "Wipe credentials, keep history";
    readonly 'svc.uninstall.mode.creds_desc': "Above + delete Web tokens, bootstrap token, ACP token, approval-bus socket. Memory / sessions / memos / audit kept.";
    readonly 'svc.uninstall.mode.full_name': "Full destruction (irreversible)";
    readonly 'svc.uninstall.mode.full_desc': "shred sensitive files then rm -rf {home} and {workspaces}. All data permanently destroyed.";
    readonly 'svc.uninstall.stopping': "Stopping any running instance…";
    readonly 'svc.uninstall.removing_npm': "Removing global npm package `agim-cli`…";
    readonly 'svc.uninstall.removing_unit': "Removing systemd unit…";
    readonly 'svc.uninstall.removing_config': "Removing {config} + env…";
    readonly 'svc.uninstall.removing_creds': "Removing Web tokens / bootstrap token / ACP token / approval-bus socket…";
    readonly 'svc.uninstall.full_warn': "⚠️  About to PERMANENTLY DESTROY everything under {home} and {workspaces}. This includes memory, sessions, audit logs, memos, viewer pastes. There is no undo.";
    readonly 'svc.uninstall.full_confirm_prompt': "Type \"DELETE\" (uppercase) to confirm, or press Enter to abort:";
    readonly 'svc.uninstall.full_aborted': "Did not type DELETE — aborted, no data destroyed.";
    readonly 'svc.uninstall.shredding': "Securely overwriting credential files…";
    readonly 'svc.uninstall.shred_unavailable': "⚠️  `shred` not available — falling back to unlink (file blocks may be recoverable from raw disk). Install coreutils for secure wipe.";
    readonly 'svc.uninstall.removing_all': "Removing {home} and {workspaces}…";
    readonly 'svc.uninstall.workspaces_kept': "Workspaces kept at {workspaces} (your memos / sessions / agent data).";
    readonly 'svc.uninstall.done': "✅ Uninstalled. Workspaces preserved.";
    readonly 'svc.uninstall.creds_done': "✅ Uninstalled. Credentials wiped, history preserved.";
    readonly 'svc.uninstall.full_done': "✅ Full destruction complete. All data wiped.";
    readonly 'svc.uninstall.cancelled': "Cancelled.";
    readonly back: "← Back";
    readonly cancel: "Cancel";
    readonly confirm: "Confirm";
    readonly yes: "Yes";
    readonly no: "No";
    readonly skip: "Skip";
    readonly press_enter_for_default: "(Enter = accept default)";
    readonly press_esc_to_skip: "(Esc = skip)";
    readonly 'error.prefix': "❌ Error: {message}";
    readonly 'warning.prefix': "⚠️  {message}";
    readonly 'info.prefix': "ℹ {message}";
    readonly 'start.mcp_connected': "MCP 服务器已连接：{servers}（{toolCount} 个工具）";
    readonly 'start.mcp_connect_failures': "MCP 服务器连接失败：{failures}";
    readonly 'start.native_agent': "native agent：{desc}";
    readonly 'start.native_boot_failed': "Native LLM/MCP 启动失败：{message}";
    readonly 'start.agents_unavailable': "部分 agent 不可用：{missing}";
    readonly 'start.agents_install_header': "安装 agent：";
    readonly 'start.agents_install_one': "安装 {agent}：{hint}";
    readonly 'start.agents_install_line': "  - {agent}：{hint}";
    readonly 'start.no_agents': "未找到可用的 coding agent！";
    readonly 'start.install_one_agent': "请至少安装一个 agent，然后重新运行 agim start。";
    readonly 'start.agent_workspace': "Agent 工作区：{agent} → {dir}";
    readonly 'start.workspace_boot_failed': "Agent 工作区初始化失败：{message}";
    readonly 'start.workspace_fallback': "Agent 将回退到 Agim cwd（systemd 下为 \"/\"）";
    readonly 'start.admin_bootstrap_failed': "admin bootstrap 设置失败：{message}";
    readonly 'agents.label.native': "Native（进程内 LLM）";
    readonly 'agents.install_hint.native': "在 ~/.agim/config.json 配置 llmBackends + llmRoles — 见 /settings/llm 或 docs/llm-backends.md";
    readonly 'token.cli.create_ok': "已创建新的访问 token。";
    readonly 'token.cli.create_warn': "原始值仅显示这一次，请立即保存。";
    readonly 'token.cli.create_usage': "在 /login 页面粘贴，或使用 Authorization: Bearer <token> 头发送。";
    readonly 'token.cli.unlabeled': "（无标签）";
    readonly 'token.cli.list_path': "存储位置：{file}";
    readonly 'token.cli.list_empty': "（暂无 token — 运行 `agim token create` 创建）";
    readonly 'token.cli.never': "（从未）";
    readonly 'token.cli.revoke_ok': "token {id} 已撤销。";
    readonly 'token.cli.revoke_missing': "未找到 token {id}。";
    readonly 'token.bootstrap.ok_title': "Web bootstrap 访问 token（一次性读取）：";
    readonly 'token.bootstrap.save_warn': "请立即保存 — 执行本命令后 bootstrap 文件将被删除。";
    readonly 'token.bootstrap.usage': "在 /login 粘贴，或使用 Authorization: Bearer <token>。";
    readonly 'token.bootstrap.none': "无可用的 bootstrap token。";
    readonly 'token.bootstrap.start_hint': "请先启动 agim（`agim start`）以生成首个 token，然后重新运行：";
    readonly 'token.bootstrap.consumed': "Bootstrap token 已被消费或从未写入。";
    readonly 'token.bootstrap.file_hint': "若主机上文件仍存在：cat {file}";
    readonly 'token.bootstrap.create_hint': "或创建新 token：";
    readonly 'ok.prefix': "✓ {message}";
};
export type Key = keyof typeof en;
/** Translate. If `key` is missing in `lang`, falls back to en, then to the key itself. */
export declare function t(lang: Lang, key: Key, vars?: Record<string, string | number>): string;
/** Read persisted preference; returns null when not set. */
export declare function readSavedLang(): Lang | null;
/** Persist to ~/.agim/cli-lang. Best-effort — failures only logged. */
export declare function saveLang(lang: Lang): void;
/** Localized install hints for missing agents at `agim start`. */
export declare function formatAgentInstallHint(lang: Lang, missing: string[]): string;
export declare function resolveCliLang(): Lang;
export declare const LANG_PREF_FILE: string;
export {};
//# sourceMappingURL=i18n.d.ts.map