diff --git a/docs/releases/2.0.2-Beta.3-release-notes.md b/docs/releases/2.0.2-Beta.3-release-notes.md new file mode 100644 index 000000000..2f43dbc9c --- /dev/null +++ b/docs/releases/2.0.2-Beta.3-release-notes.md @@ -0,0 +1,53 @@ +# OpenLess 2.0.2-Beta.3+build.20261026-c9f49c60 + +本次为 **Beta 测试版**,比较范围为上一公开 Beta **`v2.0.2-Beta.2-tauri` → `v2.0.2-Beta.3-tauri`**。正式版用户不会自动收到本版本。 + +## 功能更新 + +- **光标上下文默认开启**:macOS、Windows 和 Android 用户首次使用时默认启用光标附近上下文;用户仍可在隐私设置中关闭。密码输入、Secure Input、Windows UIA 密码控件、已知密码管理器和终端继续被排除。相关实现见提交 [`f71ffd54`](https://github.com/Open-Less/openless/commit/f71ffd5482ee1ba2c85315418eb41be68284576e) 和合并 PR [#1268](https://github.com/Open-Less/openless/pull/1268)。 +- **云同步覆盖更多设置**:历史记录、流式插入、Windows composition、选区语音、润色上下文、更新渠道和布局等可同步设置现在会进入兼容的 legacy sync 与加密同步路径。相关提交 [`f71ffd54`](https://github.com/Open-Less/openless/commit/f71ffd5482ee1ba2c85315418eb41be68284576e)。 + +## Bug 修复 + +- **Windows 麦克风启动和崩溃风险**:WASAPI/CPAL 的 COM 资源和设备对象保持在所属线程释放,增加了跨线程枚举与生命周期回归测试,覆盖 Issue #1227 报告的堆损坏风险。提交 [`f88bf246`](https://github.com/Open-Less/openless/commit/f88bf246e7b6823ecd0422475cca3802ed4a50bb)。 +- **同步事件串线**:冲突、恢复和状态事件现在携带服务 origin,旧服务器或旧账户事件不能覆盖当前同步服务的本地状态。提交 [`99b05579`](https://github.com/Open-Less/openless/commit/99b05579fc0632908613f41b90624c9a508cb53f)。 +- **Beta CI 合同修复**:光标上下文默认值变化同步到隐私路径测试,云同步事件 fixture 补齐 `serviceOrigin` 字段,避免 App 端 Linux Core CI 因陈旧合同失败。PR [#1268](https://github.com/Open-Less/openless/pull/1268)。 + +## 架构改动 + +- **录音优先启动路径**:`PipelineDictationEngine` 在识别器准备之前先建立麦克风捕获,使用有界 PCM 缓冲保留开头音频;取消会立即释放麦克风,准备完成后按原顺序交付暂存 PCM。已有 `capture_starts_before_slow_preparation_and_cancellation_releases_it_promptly` 回归测试和 Windows 音频生命周期测试覆盖该路径。 +- **Linux egui 日志后端**:Linux 宿主日志等级和噪声处理重新整理,补齐边界诊断。PR [#1259](https://github.com/Open-Less/openless/pull/1259)。 +- **iOS Beta 基线**:iOS Host、键盘和录音扩展对齐 Beta,并隔离设备构建与测试流程。PR [#1254](https://github.com/Open-Less/openless/pull/1254)。 + +## 构建与分发改动 + +- 应用版本统一为 `2.0.2-Beta.3+build.20261026-c9f49c60`。 +- 新 Beta 标签为 `v2.0.2-Beta.3-tauri`,不会移动 `v2.0.2-Beta.2-tauri` 或稳定版标签。 +- Tauri release workflow 构建 macOS ARM64/Intel、Windows x64 和 Android 四 ABI 产物;Linux egui 与 HarmonyOS 仍由各自手动验收流程附加。 + +## PR 与参与者 + +| PR / 提交 | 内容 | 提交者 | +| --- | --- | --- | +| [#1268](https://github.com/Open-Less/openless/pull/1268) | App 合同 fixture、默认光标上下文测试和 Beta CI 收尾 | [@appergb](https://github.com/appergb) | +| [#1259](https://github.com/Open-Less/openless/pull/1259) | Linux egui 日志后端 | [@aeoform](https://github.com/aeoform) | +| [#1254](https://github.com/Open-Less/openless/pull/1254) | iOS Beta 对齐与设备构建隔离 | [@appergb](https://github.com/appergb) | +| [`f88bf246`](https://github.com/Open-Less/openless/commit/f88bf246e7b6823ecd0422475cca3802ed4a50bb) | Windows WASAPI 生命周期修复 | TRIP / [@appergb](https://github.com/appergb) | +| [`99b05579`](https://github.com/Open-Less/openless/commit/99b05579fc0632908613f41b90624c9a508cb53f) | 同步服务 origin 隔离 | lvbaiqing | +| [`f71ffd54`](https://github.com/Open-Less/openless/commit/f71ffd5482ee1ba2c85315418eb41be68284576e) | 设置同步与默认光标上下文 | lvbaiqing | + +## 验证说明 + +- Beta 基线 CI:App PR [#1268](https://github.com/Open-Less/openless/pull/1268) 的配置检查、Linux Core、Windows、macOS、Android、Harmony、iOS device-build、native capsule 和 UI motion 全部通过。 +- 合并后 Core 合同测试:`cargo test --locked -p openless-core --test contract_2`,6/6 通过。 +- 合并后前端测试:`npm test`,152/152 通过,TypeScript 与 Vite production build 成功。 +- 合并前完整 `openless-core`:1391 项通过,3 项 ignored;Windows CI 包含 WASAPI COM 生命周期测试。 +- Vite 构建仍输出已有的循环 re-export 和大 chunk 警告,但未导致构建或测试失败。 +- 本机无法替代真实 Windows 麦克风硬件测量 P50/P95;发布包应以 Windows CI 和实际 Beta 用户设备反馈继续验证冷启动延迟。 + +## 下载与升级 + +- Beta 用户应在设置中加入 Beta 渠道,或从 GitHub Release 下载 `v2.0.2-Beta.3-tauri` 对应平台安装包。 +- macOS 14 或更新版本:Apple Silicon 使用 `aarch64.dmg`,Intel 使用 `x64.dmg`。若构建未配置 Apple Developer ID 签名与公证,仍需按现有发行说明处理 Gatekeeper。 +- Windows 提供 x64 NSIS 安装包;Android 提供四种 ABI 的 Beta APK。 +- Stable 用户不会从 Stable updater feed 自动收到此 Beta。 diff --git a/openless-all/app/package-lock.json b/openless-all/app/package-lock.json index 7612b1df2..dc382c304 100644 --- a/openless-all/app/package-lock.json +++ b/openless-all/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "openless-app", - "version": "2.0.2-Beta.2+build.20261023-dictation-71a18a77", + "version": "2.0.2-Beta.3+build.20261026-c9f49c60", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "openless-app", - "version": "2.0.2-Beta.2+build.20261023-dictation-71a18a77", + "version": "2.0.2-Beta.3+build.20261026-c9f49c60", "dependencies": { "@base-ui/react": "^1.6.0", "@shadcn/react": "^0.2.1", diff --git a/openless-all/app/package.json b/openless-all/app/package.json index 0ac3c608c..4af1a03e1 100644 --- a/openless-all/app/package.json +++ b/openless-all/app/package.json @@ -1,7 +1,7 @@ { "name": "openless-app", "private": true, - "version": "2.0.2-Beta.2+build.20261023-dictation-71a18a77", + "version": "2.0.2-Beta.3+build.20261026-c9f49c60", "type": "module", "scripts": { "pretest": "npm run build", diff --git a/openless-all/app/scripts/desktop-version-contract.test.mjs b/openless-all/app/scripts/desktop-version-contract.test.mjs index d03e5d1bb..e2492589e 100644 --- a/openless-all/app/scripts/desktop-version-contract.test.mjs +++ b/openless-all/app/scripts/desktop-version-contract.test.mjs @@ -3,7 +3,7 @@ import { readFile } from 'node:fs/promises'; const app = new URL('../', import.meta.url); const read = async (path) => (await readFile(new URL(path, app), 'utf8')).replace(/\r\n/g, '\n'); -const version = '2.0.2-Beta.2+build.20261023-dictation-71a18a77'; +const version = '2.0.2-Beta.3+build.20261026-c9f49c60'; const pkg = JSON.parse(await read('package.json')); const lock = JSON.parse(await read('package-lock.json')); const tauri = JSON.parse(await read('src-tauri/tauri.conf.json')); diff --git a/openless-all/app/src-tauri/Cargo.lock b/openless-all/app/src-tauri/Cargo.lock index 13b8308d0..fdc676e19 100644 --- a/openless-all/app/src-tauri/Cargo.lock +++ b/openless-all/app/src-tauri/Cargo.lock @@ -4372,7 +4372,7 @@ dependencies = [ [[package]] name = "openless" -version = "2.0.2-Beta.2+build.20261023-dictation-71a18a77" +version = "2.0.2-Beta.3+build.20261026-c9f49c60" dependencies = [ "anyhow", "arboard", diff --git a/openless-all/app/src-tauri/Cargo.toml b/openless-all/app/src-tauri/Cargo.toml index cd39d9243..4571f80ae 100644 --- a/openless-all/app/src-tauri/Cargo.toml +++ b/openless-all/app/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "openless" -version = "2.0.2-Beta.2+build.20261023-dictation-71a18a77" +version = "2.0.2-Beta.3+build.20261026-c9f49c60" license = "AGPL-3.0-only" description = "OpenLess — local voice input that types where your cursor is" authors = ["OpenLess"] diff --git a/openless-all/app/src-tauri/tauri.conf.json b/openless-all/app/src-tauri/tauri.conf.json index a0086f01d..697be3b27 100644 --- a/openless-all/app/src-tauri/tauri.conf.json +++ b/openless-all/app/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "OpenLess", - "version": "2.0.2-Beta.2+build.20261023-dictation-71a18a77", + "version": "2.0.2-Beta.3+build.20261026-c9f49c60", "identifier": "com.openless.app", "build": { "beforeDevCommand": "npm run dev",