Repository navigation
Conversation
之前的状况:Tauri 有完整更新链路(`appCheckUpdateWithChannel` → plugin-updater / Android 安装器);egui 侧完全没有 —— `supports_auto_update` 恒为 false, `settings.recording.autoUpdateCheckLabel` 这一行被刻意藏起来(`auto_update_check` 存下来没人读),关于页只有链接。也就是说「检查更新」在 Linux 上根本不存在。 Linux 只发 deb/rpm,没有可自替换的封装,所以这里做到「发现新版本 + 打开下载页」, 不假装能自安装: - 新增 `linux-egui/src/update_check.rs`:解析 GitHub Releases 的**公开 atom 源** (与 Tauri 的 Beta 检测同源,CDN 缓存、没有 REST 的 60 次/小时限流)。 标签从 `<id>` 里取 —— `<title>` 是 `OpenLess v2.0.2-Beta.3-tauri`,带产品名前缀, 不能直接当标签。版本比较忽略构建后缀 `-149`,同一基线上正式版 > 预发布版, `Beta.10 > Beta.9` 按数字比。 - 关于页新增「更新」卡片:Beta 频道开关(写 `update_channel` + `update_channel_explicit`,与 Tauri 同一组偏好)、按频道切换文案的检查按钮、 状态行(检查中 / 已是最新 / 有新版本 vX / 失败原因),发现新版本时出现 「打开 Releases」。 - `auto_update_check` 现在真的被读取:启动后查一次、之后每 60 分钟一次(空闲态才 触发,避免和手动检查并发)。录音设置里的那一行开关因此从「藏起来」恢复成真开关。 - 网络走 `openless_core::net`(沿用系统代理偏好 + 重试)。 验证:`update_check` 4 个单测(解析 / 频道选择 / 版本比较 / 空源);一个 `--ignored` 的真源演练(真连 GitHub 解析当前发布,本地跑通);crate 全量测试、 clippy `-D warnings`、`localization_contract`、前端 144 个契约测试全绿。
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
与 Tauri 的 AutoUpdateGate 对齐:后台检查(启动 + 每 60 分钟)找到新版本时, Linux 侧不能自动安装,所以只发一条通知 + 状态行提示「有新版本 vX」, 用户自己去设置 → 关于 打开下载页。手动检查不打扰。
这两个功能在 Linux 上一直不存在 —— Tauri 侧的 `supports_auto_update` 式门禁只是 「Tauri 版不在 Linux 上跑」的副作用,不是「Linux 不需要」。Core 早就准备好了 `host_context` / `edit_observation` 两个注入点,Linux 一直注入的是 Noop。 底座:fcitx5 插件的 `GetSurroundingText` - 新 D-Bus 方法返回焦点输入上下文自报的 `valid⇟program⇟cursor⇟anchor⇟text` (偏移是**字符**数)。应用不支持 surrounding text 时 `valid=0`。 - 为什么走 IME 而不是 AT-SPI:提交文字本来就走这条 input context,应用自报的 光标位置比遍历无障碍树可靠,且不需要额外权限。 - 返回单字符串而不是 D-Bus struct:fcitx 的 vtable 对多返回值类型的签名校验 不接受 `std::tuple`,实测编译失败;用 `\x1f` 分段(文本在最后一段)更简单也 不会和文本内容冲突。 光标上下文(`linux-egui/src/host_context.rs`) - `LinuxHostContextAdapter` 读一次 surrounding text,按 600 字符预算切出光标前后 两段交给 `prompts::cursor_context_input`,模型就能接着用户正在写的内容润色。 - 设置 → 隐私与数据 新增开关(Core 偏好 `cursor_context_enabled`)。 - `include_cursor=false` 时**连 surrounding text 都不读**(不是读了再丢)。 自动学词 - `LinuxEditObservationAdapter`:插入完成后每 250 ms 采样一次,内容变了就用 Core 的 `minimal_edit` 求最小编辑对,只有「改动落在刚插入的文本里」 (`edit_is_within_typed_text`)才上报给 `EditObservationSink`;Core 接受则推进 基线继续观察(同一轮多处修改都能收集),拒绝则立即停止读文档。 - 设置 → 高级 新增「自动学词」页:开关 + 观察时长 / 建议时限 / 短语长度上限 + 恢复默认。 隐私门禁 密码管理器与终端一律不读:`is_sensitive_program` 在**读取之前**判断 (keepass/1password/bitwarden/lastpass/dashlane + terminal/konsole/alacritty/ kitty/wezterm/xterm/tilix/guake/yakuake/putty/tmux/screen),命中时连 surrounding text 都不请求,并在日志里只记程序名。 验证 - `host_context` 9 个单测:敏感应用识别、光标切分、空文档、越界光标(不 panic)、 预算上限、编辑落在插入文本内/外、敏感应用直接停、假 reader 驱动整条观察循环。 - `fcitx5_contract` 新增 surrounding text 契约(无焦点时必须 `Ok(None)` 而不是报错)。 - fcitx5 插件 `build.sh` + `ctest` 通过;crate 274 测试、clippy `-D warnings`、 `localization_contract`(测试样例已改英文,避免污染中文基线)全绿。
对着 Core 的事件与端口逐个对了一遍,Linux 宿主这几处是「定义了但没人消费」: 1. **`BackendEventKind::QaLevel` / `SelectionVoiceLevel`** —— QA 面板录音时的实时 电平。Linux 从来没转发过,面板上那圈「录音呼吸光」的 `level` 一直写死 0.0。 现在电平走一条**独立的轻量消息** `HostToPopup::QaLevel`(高频,每秒十几次; 走快照会重建整段对话,把滚动和输入框拖卡),并且不参与序号排序 —— 迟到的 电平只值一帧,没有覆盖旧状态的风险。QA 面板的环接上真实电平。 2. **`BackendEventKind::InsertFallback`** —— 插入失败时 Core 会兜底把文字放进 剪贴板,但宿主什么都不说,用户以为没生效、文字丢了。现在状态行 + 桌面通知 明确提示「已复制到剪贴板」。`reason` 是给日志看的错误码(Tauri 也不显示)。 3. **`BackendEventKind::Notification`** —— Core 的主动通知(插件升级等)被无声 丢弃。现在转成桌面通知 + 状态行。 顺带:**「流式插入」开关在 Linux 上是假的** —— Core 会先问 `TextInsertionSession::supports_streaming()`,而 fcitx5 的插入会话只实现整段提交 (`CommitDictationTarget`),没有增量替换通道。两个相关开关直接从设置页移除, 等真的实现增量替换再放出来(不留点了没反应的开关)。 验证:crate 274 测试全绿(含 localization_contract)、clippy `-D warnings` 干净。
接线(Core 有事件、宿主之前没人消费): - `MicrophoneDevicesChanged` → 重扫麦克风列表(否则设置页下拉停在旧设备上) - `HotkeyStatusChanged` → 失败时把原因写进状态行,并强制下一帧重探隐私页探针 (否则页面继续显示「已就绪」) 按决定下线: - **剪贴板:Linux 不做**。`Fcitx5TextInserter` 关掉 clipboard fallback —— 插入失败 就是失败,由状态行 + 桌面通知显式告知(文字仍在历史里可重试),不再悄悄塞进 剪贴板。设置页移除「插入后恢复剪贴板」开关与整组「插入与剪贴板」卡片 (流式插入本就因 fcitx5 无增量替换通道而不可用)。 - 语音唤醒、本地模型不做:保持 `voice_activation_runtime: None` / `local_asr_runtime: None`,UI 上也不出现对应开关。
对 `a60bf630`(Open-Less#1250)里 QaPanel 的重写,把 Linux 这侧缺的部分补上: - **`activity`(在干什么)**:Core 的 `QaStateEvent.activity` 早就有 `thinking / searching_web / reading_web / using_tool{tool_name}`,但 egui 从来没读, 面板永远显示「思考中」。现在透过快照带过来并按类型显示具体动作, `using_tool` 带工具名。 - **逐条消息复制按钮**:Tauri 这次给用户消息与助手消息各加了一个 `CopyMessage`。 Linux 用现有的 `fcitx5_copy_to_clipboard` 实现(只做**用户显式点击**的复制; 听写的插入兜底仍然不做,两者不是一回事)。 - **用户头像改成麦克风图标**:Tauri 把 GitHub 头像换成了 `MicIcon` —— 这条消息本来 就是用户说出来的,头像属于身份、不属于说话方式。顺手删掉不再使用的 `textured_circle`。 - `SupervisorCommand::Send` 装箱:`HostToPopup` 变体与快照体积都长了,clippy 的 `large_enum_variant` 会拦。 **没同步的部分(Linux 上不适用)**:面板 `expanded` 收缩(录音时变胶囊、有内容才 展开)与 `nativeReady` 的尺寸握手 —— 那是 Tauri 原生窗口动态改尺寸的行为,Linux 的 QA 面板是固定 420×540 的独立进程窗口,没有对应操作。 验证:crate 274 + 217 测试全绿、clippy `-D warnings`、i18n 目录同步(新增 `qa.activity.*` 四条)无漂移。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linux 上「检查更新」原来根本不存在:
supports_auto_update恒为 false,关于页只有链接,录音设置里的「自动检查更新」那一行被刻意藏起来(auto_update_check存下来没人读)。Tauri 侧是完整的(
appCheckUpdateWithChannel→ plugin-updater / Android 安装器 / 进度事件 / 错误分流),这次把 Linux 侧补到同一套语义,但只做到检测 + 跳转:Linux 只发 deb/rpm,没有可自替换的封装,假装能自安装就是假开关。实现
linux-egui/src/update_check.rs:解析 GitHub Releases 的公开 atom 源(与 Tauri 的 Beta 检测同源,CDN 缓存、没有 REST 的 60 次/小时限流)。<id>里取 —— 真实<title>是OpenLess v2.0.2-Beta.3-tauri,带产品名前缀,直接当标签会全部解析失败(这是实测踩到的)。2.0.2-Beta.3-149≡2.0.2-Beta.3),同一基线上正式版 > 预发布版,Beta.10 > Beta.9按数字比而不是字符串。update_channel+update_channel_explicit,与 Tauri 同一组偏好)、按频道换文案的检查按钮、状态行(检查中 / 已是最新 / 有新版本 vX / 失败原因),发现新版本时出现「打开 Releases」。auto_update_check打开时启动后查一次、之后每 60 分钟一次;只在空闲态触发,避免与手动检查并发。录音设置里那一行从「藏起来」恢复成真开关。openless_core::net(沿用系统代理偏好与重试)。验证
顺带的 UI 对齐审计
把 Tauri 最近的 UI 改动逐项对了一遍(
src/pages/settings/*与 egui 渲染函数的 key 对比),结论:navigation.ts里明确os === 'win' || os === 'mac'等)