chore: 保存工作副本——客户端授权新契约(双端点/验签/令牌/周检)与桌面会话可靠性改进

This commit is contained in:
Logan.Li committed 2026-09-14 22:10:22 +08:00
1 parent f71eef0eba
commit ae6093c9b3
163 files changed
+4911 -2494

No files matched your search

+10 -10
View File
@@ -16,10 +16,10 @@
"stop": "停止",
"send": "发送",
"placeholder": "任务或追问…(Enter 发送,Shift+Enter 换行)",
"hintFollowUp": "继续追问将带上本轮上下文",
"hintFollowUp": "追问会附带本轮摘要,过长会截断",
"hintSelection": "将附带选中 {{lines}} 行",
"hintSteps": "最多 {{max}} 步 · 不落盘",
"footerNote": "高风险需确认 · critical 拒绝 · 会话不落盘",
"hintSteps": "最多 {{max}} 步",
"footerNote": "高风险先确认 · 破坏性命令直接拒绝 · 对话不保存",
"summarize": "总结输出",
"summarizeTitle": "用 AI 总结当前终端可见输出(优先使用选中文本),不执行任何命令",
"summarizeRequest": "总结当前终端输出"
@@ -59,15 +59,15 @@
"insertedClipboard": "第 {{round}} 轮命令已复制到剪贴板(当前终端不可写入);粘贴后请检查再运行。"
},
"confirm": {
"reject": "Reject",
"once": "Once",
"always": "Always",
"hint": "Enter · Once Esc · Reject Always · 本会话同类命令不再确认",
"reject": "拒绝",
"once": "执行一次",
"always": "本会话允许",
"hint": "Enter · 执行一次 Esc · 拒绝 本会话允许 · 同类命令本会话不再确认",
"insert": "插入不执行"
},
"error": {
"noProvider": "请先在设置 → 大模型配置 Provider",
"noApiKey": "「{{provider}}」尚未保存 API Key",
"noProvider": "请先在设置 → 大模型里配置供应商",
"noApiKey": "「{{provider}}」尚未保存 API 密钥",
"emptyTask": "请输入任务或追问",
"sshRequired": "需要已连接的远程 SSH",
"modelEmpty": "模型未返回内容",
@@ -77,7 +77,7 @@
"invalidCommand": "模型未返回唯一的单行命令,已拒绝执行",
"repeatLoop": "检测到重复命令循环,已停止:{{command}}",
"criticalBlocked": "命令命中破坏性操作硬红线,不提供确认放行:{{command}}",
"execFailed": "ssh-exec 失败:{{error}}",
"execFailed": "远程执行失败:{{error}}",
"execUnknown": "未知错误",
"execNoOutput": "命令执行完成,无输出",
"maxSteps": "已达 {{max}} 步上限,请缩小范围后重试",
+4 -1
View File
@@ -33,8 +33,10 @@
"error": {
"title": "出错了",
"body": "应用遇到意外问题",
"bodyPane": "此标签遇到意外问题,其它标签仍可使用",
"recoverable": "此错误可以恢复,请尝试刷新页面",
"refreshPage": "刷新页面",
"retryPane": "重试此标签",
"restartApp": "重启应用",
"supportHint": "如果问题持续存在,请检查日志或联系支持"
},
@@ -108,7 +110,8 @@
"closeLeft": "关闭左侧标签",
"closeAll": "关闭全部",
"clone": "克隆标签",
"openSftp": "打开 SFTP"
"openSftp": "打开 SFTP",
"reconnect": "重新连接"
},
"renameAria": "重命名标签 {{title}}",
"renameHint": "双击重命名"
+5 -1
View File
@@ -35,13 +35,17 @@
"fullscreenAria": "进入全屏",
"exitFullscreen": "退出全屏",
"exitFullscreenAria": "退出全屏",
"exitFullscreenHint": "Esc / F11 退出"
"exitFullscreenHint": "Esc / F11 退出",
"reconnect": "重新连接",
"reconnectAria": "重新连接远程桌面"
},
"status": {
"connecting": "正在连接…",
"connected": "已连接",
"disconnected": "已断开",
"connectFailed": "连接失败",
"reconnecting": "自动重连中({{attempt}}/{{max}})…",
"reconnectLimit": "自动重连已达上限({{max}})",
"clipboardSynced": "已同步远端剪贴板",
"savedToDownloads": "已保存到本机下载文件夹:{{name}}",
"pastedToRemote": "已粘贴到远端",
+13 -4
View File
@@ -41,7 +41,10 @@
"refused": "连接被拒绝",
"disconnected": "连接已断开",
"keepaliveFailed": "SSH 心跳连续失败,连接已关闭",
"idleKicked": "远端 Shell 因空闲超时退出(TMOUT)"
"idleKicked": "远端 Shell 因空闲超时退出(TMOUT)",
"unexpectedDropped": "连接已断开(网络中断或服务器关闭)",
"shellExited": "远端 Shell 已退出(exit、Ctrl+D 或服务器策略)",
"shellReadFailed": "远端 Shell 读取失败"
},
"auth": {
"failed": "认证失败,请检查用户名和密码",
@@ -151,8 +154,8 @@
"nativeOnly": "串口仅在 Tauri 原生应用中可用"
},
"ai": {
"noProvider": "请先在设置 → 大模型配置 Provider",
"noApiKey": "「{{provider}}」尚未保存 API Key",
"noProvider": "请先在设置 → 大模型里配置供应商",
"noApiKey": "「{{provider}}」尚未保存 API 密钥",
"modelEmpty": "模型未返回内容",
"protocolFailed": "模型连续两次未遵循协议,已停止",
"noConclusion": "模型未返回可用结论",
@@ -160,7 +163,7 @@
"invalidCommand": "模型未返回唯一的单行命令,已拒绝执行",
"repeatLoop": "检测到重复命令循环,已停止:{{command}}",
"criticalBlocked": "命令命中破坏性操作硬红线,不提供确认放行:{{command}}",
"execFailed": "ssh-exec 失败:{{error}}",
"execFailed": "远程执行失败:{{error}}",
"maxSteps": "已达 {{max}} 步上限,请缩小范围后重试",
"sshRequired": "需要已连接的远程 SSH"
},
@@ -168,6 +171,12 @@
"readFailed": "读取失败: {{name}}",
"writeFailed": "写入失败: {{name}}"
},
"native": {
"taskJoin": "后台任务失败,请重试",
"invalidBase64": "文件数据不是有效的 Base64",
"knownHostsPath": "无法定位 ~/.ssh/known_hosts",
"invalidHostKeyDecision": "主机密钥决定无效"
},
"unknown": {
"error": "发生未知错误"
}
+5 -2
View File
@@ -132,7 +132,8 @@
"collapse": "收起",
"protocol": "协议",
"displayName": "显示名称(可选)",
"displayNamePlaceholder": "自动用 user@host 或 vnc:host",
"displayNamePlaceholder": "自动用 user@host",
"displayNamePlaceholderVnc": "自动用主机名",
"host": "主机",
"hostPlaceholder": "192.168.1.10",
"hostHint": "填写 IP 或域名;也可粘贴 host:port",
@@ -208,7 +209,8 @@
},
"importExport": {
"exportTitle": "导出会话",
"exportDefaultPath": "opsxshell-sessions.bak",
"exportDefaultPath": "opsxshell-hosts.oxs",
"exportFilterOxs": "OpsXShell 主机备份",
"exportFilterBak": "OpsXShell 备份",
"exportFilterJson": "JSON",
"exportSuccess": "已导出 {{count}} 个会话到:\n{{path}}",
@@ -224,6 +226,7 @@
"exportPasswordMismatch": "两次输入的密码不一致",
"exportPasswordRequired": "必须设置备份密码才能导出",
"importTitle": "导入会话",
"importFilterOxs": "OpsXShell 主机备份",
"importFilterBak": "OpsXShell 备份",
"importFilterJson": "JSON",
"importFilterSshConfig": "SSH Config",
+29 -17
View File
@@ -11,9 +11,9 @@
"security": "安全",
"securityDesc": "凭据与主机密钥",
"ai": "大模型",
"aiDesc": "AI Provider",
"aiDesc": "AI 供应商",
"about": "关于",
"aboutDesc": "版本与数据",
"aboutDesc": "版本、联系与诊断",
"account": "账户",
"accountDesc": "邮箱、许可证与设备"
},
@@ -89,9 +89,9 @@
"ssh": {
"connection": "连接",
"keepAlive": "保持心跳",
"keepAliveDesc": "空闲时发送 SSH 心跳;连续多次无响应才会断开",
"keepAliveDesc": "空闲时发送 SSH 协议心跳(不写入 Shell)。只挡 NAT/防火墙丢连接,不会绕过远端 TMOUT",
"autoReconnect": "自动重连",
"autoReconnectDesc": "意外断开后自动尝试重连",
"autoReconnectDesc": "标签还开着、意外断线时自动重连(新 Shell)。关标签、空闲挂起或远端 TMOUT 不会硬续",
"timeout": "连接超时",
"timeoutDesc": "建立 SSH 连接的最长等待时间(秒)",
"maxReconnect": "自动重连次数",
@@ -104,7 +104,8 @@
"suspend": "后台挂起",
"suspendDesc": "后台标签空闲多少分钟后挂起(有活跃 Shell/SFTP 时保持连接)",
"keepAliveInterval": "心跳间隔(秒)",
"keepAliveIntervalDesc": "向服务器发送心跳的频率(类似 ClientAliveInterval)。不稳定网络建议 ≤15 秒"
"keepAliveIntervalDesc": "向服务器发送心跳的频率(类似 ClientAliveInterval)。不稳定网络建议 ≤15 秒",
"sessionPolicyHint": "心跳保的是链路,不是远端会话策略。Bash TMOUT、sshd ClientAlive 和 Windows 空闲 GPO 仍会生效;长任务请在服务器上用 tmux/screen。"
},
"security": {
"credentials": "凭据保护",
@@ -122,23 +123,32 @@
},
"about": {
"tagline": "简单、便捷、人性化的原生运维终端",
"appVersion": "应用 v{{version}}",
"copyVersion": "复制版本信息",
"runtime": "运行环境",
"system": "系统",
"localData": "本地数据",
"appVersion": "v{{version}}",
"copyVersion": "复制版本、系统和路径,便于贴到 GitHub",
"copyDiagnostics": "复制诊断信息",
"copyPath": "复制路径",
"resources": "资源",
"wechat": "微信",
"copyWechat": "复制微信号",
"github": "讨论",
"githubDesc": "https://github.com/L00J/opsxshell/discussions",
"releases": "版本发布",
"releasesDesc": "安装包与更新说明",
"licenseLink": "许可证",
"licenseLinkDesc": "MIT License",
"diagnostics": "诊断",
"sessionsSettings": "会话与设置",
"masterKeyPath": "加密主密钥",
"privacyNote": "密码与密钥口令由 Rust 使用 AES-256-GCM 加密。不保存终端命令历史,也不做堡垒审计。",
"license": "MIT License · Rust · XTerm.js",
"logPath": "应用日志"
"logPath": "应用日志",
"reportBug": "报告问题",
"reportBugDesc": "打开 GitHub issue,并带上当前版本与系统"
},
"ai": {
"presets": "供应商预设",
"add": "添加",
"configured": "已配置",
"configuredHint": "选择供应商后点添加",
"emptyHint": "添加一个 Provider 开始",
"emptyHint": "添加一个供应商开始",
"noModel": "未选模型",
"name": "名称",
"model": "模型",
@@ -157,13 +167,15 @@
"otherModels": "其他模型…",
"customModel": "自定义模型",
"backToList": "返回列表",
"apiKeyOptional": "API Key(无需)",
"apiKey": "API 密钥",
"apiKeyOptional": "API 密钥(无需)",
"endpoint": "接口地址",
"advanced": "高级",
"allowHttp": "允许 HTTP(本机/内网)",
"setActive": "设为当前",
"deleteTitle": "删除",
"apiKeySaveFailed": "API Key 保存失败",
"providerNotFound": "Provider 不存在",
"apiKeySaveFailed": "API 密钥保存失败",
"providerNotFound": "供应商不存在",
"modelCatalogReadFailed": "模型目录读取失败",
"catalogUnavailable": "models.dev 暂不可用",
"family": {
+2 -1
View File
@@ -15,7 +15,8 @@
"notConnected": "未连接",
"connecting": "连接中...",
"resumeHint": "重连后将回到 {{path}}",
"reconnectingResume": "正在重连并恢复 {{path}}…"
"reconnectingResume": "正在重连并恢复 {{path}}…",
"autoReconnecting": "自动重连中({{attempt}}/{{max}})…"
},
"errors": {
"notConnected": "SFTP 尚未连接",
+3 -1
View File
@@ -34,7 +34,9 @@
"reopenShell": "重新打开 Shell",
"reopening": "正在打开…",
"disconnected": "连接已断开",
"disconnectedHint": "SSH 会话已结束或网络中断。点下方一键重新连接,即可继续工作。",
"disconnectedHint": "网络中断或服务器关闭了 SSH。标签还开着时会自动重连;也可点下方立即重连。",
"disconnectedKeepalive": "心跳失败,连接已断开",
"disconnectedKeepaliveHint": "SSH 心跳连续无响应,多半是 NAT 或网络丢了空闲连接。不会向 Shell 发送按键。标签还开着时会自动重连。",
"reconnect": "重新连接",
"suspended": "连接已挂起",
"suspendedHint": "长时间未操作,连接已进入挂起以节省资源",