TRIP
96ca96609f
Merge pull request #287 from appergb/fix/windows-ime-static-crt
...
fix(windows-ime): 静态链接 CRT 防 host 进程 MSVCP140 劫持(修 QQ 切微软拼音崩溃)
2026-05-06 19:21:09 +08:00
baiqing
901e9dfe3f
fix(windows-ime): 移除 DisableThreadLibraryCalls — /MT 下需 thread 通知
...
Codex P1 (PR #287 ):DLL 改用 /MT 静态链接 CRT 后,仍调
DisableThreadLibraryCalls(instance) 会让静态 CRT 拿不到 DLL_THREAD_DETACH
通知,per-thread TLS 初始化/清理断裂 — 在 host 进程(QQ / Office /
微软拼音切换)创建新 input thread 时反而把这次想修的崩溃问题重新引回。
Microsoft 文档 DisableThreadLibraryCalls 备注明确:使用 static CRT 的
DLL 不应禁用 thread library calls。
修复:删除该调用;保留 g_module 缓存。
2026-05-06 19:07:54 +08:00
baiqing
80de07851c
fix(windows-ime): 静态链接 CRT 防 host 进程 MSVCP140 劫持
...
用户反馈:在 Windows 11 切到微软拼音时 QQ (QQEX.exe v9.9.26.44725) 崩
0xc0000005,故障模块 D:\program\QQ\versions\<ver>\resources\app\
MSVCP140.dll @ 偏移 0x13080。
根因(DLL Hell 经典场景):
1. QQ 把私有版本的 MSVCP140.dll 放在 app/ 目录,DLL 搜索顺序优先于系统
2. ctfmon 切微软拼音 → 把所有已注册 TSF DLL 加载进 QQ 进程
3. 我们 OpenLessIme.dll 此前用 MSBuild 默认 RuntimeLibrary(=
MultiThreadedDLL,动态链接 MSVCP140.dll/VCRUNTIME140.dll/UCRT)
4. 在 QQ 进程内被绑给 QQ 自带的旧版 MSVCP140 → 调 std::wstring /
std::thread / std::mutex 等跑的是 QQ 那份 → ABI 行为漂移 → AV
修复:
- vcxproj 4 处 ItemDefinitionGroup(Debug/Release × Win32/x64)显式声明
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>(Release)/
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>(Debug)。
- DLL 自带 CRT 副本,QQ 私有 MSVCP140 劫持不到。
- DLL 体积 +~300 KB;DLL 内部 STL 不能跨边界共享,但我们 IPC 走 named
pipe + JSON(C ABI 友好),不受影响。
不动的部分:
- TSF 接口本身已是 COM C ABI(vtable + COM-typed 参数),无需改
- 重量级 ASR/LLM/polish 早已在 OpenLess.exe 主进程,DLL 只做 TSF text
service hooks + IPC(已合规"组件极简,IPC 通信"原则)
QQ 客观脆弱性已整理详细报告(桌面 PDF/DOCX + GitHub issue),用于上报
TSRC:app/ 目录下 MSVCP140 劫持系统 CRT、版本号目录嵌套混乱、无 IME
崩溃隔离机制、CRT 漂移。
2026-05-06 18:08:21 +08:00
baiqing
2bd77fe87e
fix(tauri): 释放 Rust crate ~2.11 — npm 端已发 2.11,旧 ~2.10 锁反向 fail
...
Release run 25419948896 三平台 (Linux / Win / mac arm64) 都挂在
tauri build 启动检查:
Found version mismatched Tauri packages.
tauri (v2.10.3) : @tauri-apps/api (v2.11.0)
根因翻转:
- 之前 (PR #281 ) Rust crate 漂上 2.11 而 npm 没发,所以锁 ~2.10 把 Rust
拉下来。
- 这次 PR #286 加 @tauri-apps/plugin-dialog 时 npm 解析把
@tauri-apps/api 升到 2.11.0(plugin-dialog 依赖 ^2.11.0),
Rust 还锁 ~2.10 → 反向 mismatch。
修复:
- Cargo.toml 锁 ~2.11
- cargo update 让 tauri / tauri-runtime / tauri-runtime-wry 三件套都升到
2.11.0(连带 wry 0.54.4 → 0.55.1 等 transitive 依赖)。
后续如果 Tauri 团队再发 2.12 而 npm 滞后,回头看 PR #281 同款做法处理。
2026-05-06 14:33:01 +08:00
baiqing
26ce2ff0b5
chore(release): 1.2.20
...
主要修复
─────────
- fix(windows): NSIS 安装包注册 OpenLess TSF DLL(含 32-bit COM 注册到
Wow6432Node + Sysnative 绕过 32-bit installer 的 WOW64 重定向);
改 perMachine 安装让 regsvr32 能写 HKLM。修「Windows 输入法后端:不可用」
自 1.2.15 起的长期 bug。
- fix(local-asr): 切走/删模型/手动释放时引擎真正归还 1+ GB RAM;下载稳定性
4 次指数退避 + Range 分块 + 取消正确传播;点击下载即崩(tokio::spawn →
tauri::async_runtime)。
- fix(tauri): Rust crate tauri 锁 ~2.10,避开 npm 端 @tauri-apps/api
尚未发布 2.11 导致的跨 minor 版本检查 fail。
- fix(capsule): AudioBars 用 cubic-bezier 缓动 + 0.18s transition,圆点→
长条形变在 60Hz audio level 高频更新下平滑混合,不再阶梯式跳变。
- fix(recorder): liveness watchdog + 全局超时;watchdog 从首次回调开始计时
避免慢启动误报(issue #238)。
- fix(windows): hotkey trigger leak、capsule 视觉异常、音量计稳定(多 PR)。
- fix(credentials): 凭据状态按 active provider 判断。
新功能
─────────
- feat(asr): 本地 Qwen3-ASR-Flash 全链路 — 模型注册表、HF/HF-Mirror 4 并发
分块下载、Settings → 模型设置页、Coordinator 第三分支接入。
- feat(i18n): 日本語 / 한국어 完整翻译(217 string × 2 语种)+ 5 locale
在语言名后加 Beta 标识。
- feat(translation): 输出语言扩展为日 / 韩,与翻译链路解耦。
- feat(recording): 录音时静音系统输出,多会话共享 mute guard。
- feat(i18n): 繁體中文 UI 完整 + 简繁脚本随 UI 切换同步。
- feat(settings): 合并设置内外两个「关于」(QQ 群 / 反馈 / 源码 / 隐私
全部并入弹窗的关于)+ 一键导出错误日志(plugin-dialog 选保存位置,
跨 macOS / Windows)。
工程
─────────
- chore(ci): release-tauri.yml + ci.yml checkout 拉 submodule,修 mac 端
qwen-asr build 缺源文件。
- chore(release-prep): 清理 #268/#279 双 NSIS 方案残留。
- chore(deps): 引入 tauri-plugin-dialog ~2 给前端 save dialog 用。
2026-05-06 14:25:29 +08:00
TRIP
eaf1dbed08
Merge pull request #286 from appergb/feat/settings-about-merge-export-log
...
feat(settings): 合并内外两个'关于' + 一键导出错误日志
2026-05-06 14:23:57 +08:00
baiqing
8397b9d1a5
feat(settings): 合并设置内外两个"关于" + 一键导出错误日志
...
用户反馈:
1. 设置侧栏内有"关于" tab,弹窗里也有一个"关于",重复入口让人混乱
2. 需要"一键导出错误日志"功能,让用户选择保存位置,跨 macOS/Windows
## 设置"关于"合并 (T2)
- Settings.tsx 删 'about' 从 SettingsSectionId / SECTION_ORDER / 渲染分支 + 整个 AboutSection 函数(保留 settings.about i18n 块以防其他引用)
- SettingsModal.tsx 的 AboutMini 接管所有内容:
- 新增 source GitHub 链接(迁自 AboutSection)
- 新增 QQ 群行(含 1078960553 群号 + 复制按钮,逻辑迁自 AboutSection)
- 保留原有 docs / feedback / privacy / localFirst pill / AboutUpdateControl
## 一键导出错误日志 (T3)
- Cargo.toml + package.json 引入 tauri-plugin-dialog(拿原生 save dialog)
- lib.rs:plugin init + log_dir_path 改 pub fn 让 commands.rs 能调
- commands.rs:新增 export_error_log(target_path) — std::fs::copy
log_dir_path()/openless.log → target_path(mac:
~/Library/Logs/OpenLess/openless.log,windows:
%LOCALAPPDATA%\OpenLess\Logs\openless.log)
- ipc.ts:exportErrorLog wrapper —— save dialog 选路径 → invoke 后端复制
- AboutMini 新增"导出错误日志"行:busy / ok / err 状态 + 实际保存路径 tooltip
## 5 个 locale 同步
modal.about 块统一新增 10 个 key(保证 typeof zhCN 类型完整不破坏编译):
- source / qq / qqDesc / copyQq
- exportErrorLog / exportErrorLogDesc / exportErrorLogBtn
- exporting / exportSuccess / exportFailed
zh-CN / zh-TW / en 用产品惯用术语;ja / ko 沿用 Beta 翻译风格。
## 验证
- npx tsc --noEmit 通过(5 locale 类型一致)
- vite build 通过
- cargo check 通过(plugin-dialog 与锁定的 tauri ~2.10 兼容)
2026-05-06 14:16:42 +08:00
TRIP
f29a3ff196
Merge pull request #284 from appergb/feat/i18n-ja-ko-beta-full
...
feat(i18n): 完整翻译 ja/ko + 5 locale 加 Beta 标识
2026-05-06 14:00:50 +08:00
TRIP
83f1c807b3
Merge pull request #283 from appergb/feat/capsule-audio-easing
...
feat(capsule): AudioBars 用 cubic-bezier 缓动 + 加长 transition
2026-05-06 13:45:08 +08:00
baiqing
13e6084ce2
feat(i18n): 完整翻译 ja/ko + 5 locale 加 Beta 标识
...
用户反馈:之前 ja.ts / ko.ts 只是 35 行 scaffold,缺失的 key 全部 fallback
到英文,对日韩用户体验割裂;用户希望"完善为完整版本,并在语言名称
后加 Beta 标识"。
改动:
1. 5 个 locale (en / zh-CN / zh-TW / ja / ko) 的
settings.language.{ja,ko} 都加上 " (Beta)" 后缀,让用户在任何 UI
语言下都能看到日韩为预览版本。
2. ja.ts 重写为完整 217 string 翻译版(保留 ...en spread 作为安全网,
未来新增 key 仍 fallback 英文不会破坏编译)。
3. ko.ts 同上。
翻译质量:AI 机器翻译初版,符合 i18n 模板结构与占位符约束({{var}} /
markdown emphasis 全部保留),通过 tsc strict 校验(typeof zhCN)。
建议后续 native speaker review 调整敬语、专业术语、文体一致性。
类型保证:keep `typeof zhCN` 约束让 ts 编译强制 ja/ko 与 zh-CN 同
schema;新加 zh-CN key 时 ja/ko 仍能编译(...en fallback),但用户在
日韩 UI 下会看到英文 — 提示团队补全翻译。
2026-05-06 13:35:25 +08:00
baiqing
0d5d275370
feat(capsule): AudioBars 用 cubic-bezier 缓动 + 加长 transition
...
用户反馈:录音胶囊的语音条 UI 跳转有问题——目前是圆形跳成矩形,
视觉效果不自然,且存在卡顿,动效不够优雅、速度太快。
根因:AudioBars 每个 bar 的 height 跟随 audio level 在 2~24px 之间
变化(width=3 + borderRadius:999,height=2 像圆点、height=24 像
长条),但 transition 只有 0.08s。audio level 来自后端 RMS 回调,
60Hz 高频更新;每次 React re-render 修改 inline style.height 都重启
transition 动画。0.08s 在持续 retrigger 场景下永远在动画前段,
视觉上是阶梯式跳变("圆形跳成矩形"+ 卡顿)。
修复:transition 0.08s → 0.18s + cubic-bezier(0.22, 1, 0.36, 1)
(easeOutExpo-like),让多次 update 在曲线内平滑混合,圆→长条
的形变变得自然顺滑。0.18s 仍跟得上音量节奏,不影响响应感。
2026-05-06 13:26:33 +08:00
TRIP
b1d65fa05c
Merge pull request #282 from appergb/fix/ci-checkout-submodules
...
fix(ci): checkout 拉 submodules — 修 mac 端 qwen-asr build fail
2026-05-06 13:09:47 +08:00
baiqing
262a9ad2d7
fix(ci): checkout 拉 submodules — 修 mac 端 qwen-asr build fail
...
release-tauri.yml run 25415755417 mac arm64 在 cargo build 时挂在:
error: no such file or directory: 'vendor/qwen-asr/qwen_asr.c'
根因:build.rs 的 #[cfg(target_os = "macos")] 分支用 cc-rs 编译
vendor/qwen-asr/*.c,但 vendor/qwen-asr 是 git submodule,CI 的
actions/checkout@v4 默认不拉 submodule,目录是空的。Linux/Windows
build.rs 不进 cc 编译路径,所以没踩;mac 是唯一编译 qwen-asr 的平台。
修:release-tauri.yml + ci.yml 的 actions/checkout@v4 都加
\`with: submodules: recursive\`,让所有平台都拉一致的源码树。
2026-05-06 13:03:36 +08:00
TRIP
284b75d3d2
Merge pull request #281 from appergb/fix/tauri-version-pin
...
fix(tauri): 锁 Rust crate ~2.10 修 npm/Rust 跨 minor mismatch
2026-05-06 12:01:57 +08:00
baiqing
e090eb2a3b
fix(tauri): 锁 Rust crate ~2.10 — 修 npm/Rust 跨 minor 版本检查 fail
...
CI release-tauri.yml 三平台 (mac arm64 / Windows / Linux) Build step 在
~10 秒内全部失败:
Found version mismatched Tauri packages.
tauri (v2.11.0) : @tauri-apps/api (v2.10.1)
根因:
- Cargo.toml 写 \`tauri = { version = "2" }\`,cargo 解析到 latest 2.x = 2.11.0
- npm \`@tauri-apps/api\` / \`@tauri-apps/cli\` latest 仍是 2.10.1(Tauri 团队
把 Rust crate 发到了 crates.io 2.11,但 npm 包还没同步发 2.11)
- tauri build 启动时校验 npm 与 Rust crate 必须 major+minor 一致,跨 minor
直接 fail——三平台都没机会跑到 bundle 阶段。
修复:
- Cargo.toml 把 \`tauri\` 锁成 \`~2.10\`,让 cargo 选 2.10.x patch 版本,
与 npm 端 2.10.1 对齐。
- cargo update 精确下调到 tauri 2.10.3 / tauri-runtime 2.10.1 /
tauri-runtime-wry 2.10.1(连带 wry 0.55.1→0.54.4 / tray-icon 0.23.1→0.21.3
等 transitive 依赖一并回退,让 lock 内部一致——这也是 Cargo.lock diff 大
的原因,所有改动都是 \`cargo update\` 自动算出来的,没有手改)。
等 Tauri 团队把 npm @tauri-apps/api 2.11 发布后,再放开 Cargo.toml 的
约束。期间 package-lock.json 保持 2.10.1,CI 走 \`npm ci\` 不会自动漂。
2026-05-06 11:55:39 +08:00
TRIP
6b38e5ef1d
Merge pull request #280 from appergb/chore/release-prep-dedupe-nsis
...
chore(release-prep): 清理 #268/#279 双 NSIS 方案残留
2026-05-06 11:25:56 +08:00
baiqing
3414e1ff5e
chore(release-prep): 修 P2 + 清理 noop bundle.resources override
...
完整审查 CI 流程后发现两类问题:
1. windows-build-gnu.ps1 不 build OpenLessIme.dll 也不 export
OPENLESS_IME_DLL_X64 / _X86 env,但 NSIS hook (nsis/openless-ime-hooks.nsh)
PREINSTALL 用 File "$%OPENLESS_IME_DLL_X64%" / _X86 引用 dll,
makensis 编译时 env 为空 → File 路径无效 → NSIS bundle 失败。
补 IME dll 双平台 (x64 / Win32) build + Set-Item Env:。
(Codex PR #280 P2 review)
2. build-mac.sh 之前为绕过 bundle.resources 占位 dll 加的
--config '{"bundle":{"resources":{}}}' override,
PR #280 已删除 bundle.resources,此 override 退化为 noop,删除让命令更干净。
release-tauri.yml 还有 2 处同源遗留("复制 dll 到 openless-ime-payload"
死步骤、Linux build 同样的 noop override)需要 workflow scope 才能动,
留待下一个 PR。
2026-05-06 11:20:24 +08:00
baiqing
7799b5e0d2
chore(release-prep): 清理 #268/#279 双方案残留
...
main 上 #268 (millionart/codex/register-windows-ime-nsis-installer) 与 #279
(本人) 都修了 NSIS 注册 TSF DLL,merge #279 时未手动解决冲突,导致:
1. tauri.conf.json 出现两个 windows.nsis block(line 92-95 和 105-108),
serde_json 用最后写入的覆盖前面,结果 #268 的 nsis/openless-ime-hooks.nsh
被丢弃,实际生效的是 #279 的 installer.nsh。
2. #279 的 bundle.resources 把 dll 多打一份到 $INSTDIR\tsf-ime\,与 #268
PREINSTALL File 直接装到 $INSTDIR\windows-ime\ 并存。
3. installer.nsh 与 openless-ime-payload/ 残留为死代码。
#268 方案更稳:x64 注册带 Sysnative + DisableX64FSRedirection 双保险,有
POSTUNINSTALL 清理 hook,有测试覆盖(4a7a1b6b/test、933e014a/test),且
不污染 MSI(不用 bundle.resources,避免 dll 重复)。
清理:
- 删除 tauri.conf.json 重复 nsis block,保留 nsis/openless-ime-hooks.nsh
- 删除 bundle.resources(#268 不需要)
- 删除死文件 installer.nsh
- 删除死目录 openless-ime-payload/
release-tauri.yml 里"复制 dll 到 openless-ime-payload"步骤、build-mac.sh
与 Linux build 的 --config '{"bundle":{"resources":{}}}' override 暂留 —
没有 bundle.resources 后这些是 noop,不会破坏 build;当前 token 没有
workflow scope,等下一次有需求再清。
2026-05-06 11:12:06 +08:00
TRIP
b84b0bdae3
Merge pull request #279 from appergb/fix/local-asr-release-flow
...
fix(windows): NSIS 安装包注册 TSF DLL + local-asr RAM 真正归还
2026-05-06 11:07:27 +08:00
baiqing
81fa80da69
fix(windows): NSIS x64 dll 用 Sysnative 绕过 WOW64 重定向
...
NSIS installer 是 32-bit 进程,进程内的 $SYSDIR / $WINDIR\System32 都因
WOW64 文件系统重定向变成 $WINDIR\SysWOW64,跑的是 32-bit regsvr32 → x64 dll
被注册到 HKLM\Software\Wow6432Node\Classes\CLSID(KEY_WOW64_32KEY 视图)。
但 windows_ime_profile.rs 用 KEY_WOW64_64KEY 校验时只看 HKLM\Software\Classes
\CLSID,永远查不到 → 仍判 RegistrationBroken("OpenLess COM registration is
missing")。
修复:x64 改用 $WINDIR\Sysnative\regsvr32.exe — 这是 32-bit 进程访问真
64-bit System32 的专用 alias,写入会落在 KEY_WOW64_64KEY 视图。x86 保持
SysWOW64 不变(确实需要 32-bit regsvr32 写 Wow6432Node)。
2026-05-06 10:52:12 +08:00
baiqing
c52658b08b
fix(windows): NSIS 也注册 32-bit TSF DLL — 修 P1 review
...
Codex review 发现:windows_ime_profile.rs::inspect_windows_ime_registration() 同时
用 KEY_WOW64_64KEY 和 KEY_WOW64_32KEY 两次检查 HKLM\Software\Classes\CLSID\{...}\
InprocServer32,少了任一边就返回 RegistrationBroken("OpenLess 32-bit COM
registration is missing")。MSI 流程通过 wxs 同时跑了 64-bit 和 SysWOW64\regsvr32
注册两份;之前的 NSIS hook 只注册了 x64,所以 NSIS / updater 用户依然在 Settings
页看到「不可用」。
修复:
- bundle.resources 拆出 x64 / x86 两份 dll target;x64 → tsf-ime\x64,x86 → tsf-ime\x86
- installer.nsh PostInstall/PreUninstall 增加 x86 分支,
x86 用 $WINDIR\SysWOW64\regsvr32.exe(写 KEY_WOW64_32KEY 必需)
- CI Build Windows IME native DLLs 步骤把复制 dll 移到循环里,x64 + x86 都覆盖
仓库占位
- 仓库新增 0 字节 x86 占位 dll,让本地 mac/linux 构建也能 resolve resources
2026-05-06 10:47:03 +08:00
baiqing
5aec74653b
fix(windows): NSIS 安装包注册 OpenLess TSF DLL — 修"输入法后端:不可用"
...
## 现象
1.2.15 起在 Settings 页"Windows 输入法后端"出现 Pill「不可用」。`get_windows_ime_status()`
查 HKLM 注册表四件套(COM CLSID + TSF LanguageProfile + 三个 Category),缺一即报 NotInstalled。
## 根因
- MSI 通过 wix/openless-ime.wxs 的 RegisterOpenLessIme* CustomAction 跑 regsvr32 → 注册齐全。
- NSIS 包既没把 OpenLessIme.dll 打进去(wxs.componentRefs 是 MSI-only),也没 hook 跑
regsvr32 → 用 setup.exe 安装的用户、走 updater 自动升级的存量用户全部命中"不可用"。
- 由于 updater latest-windows-x86_64.json 是 NSIS pass 写的,老 MSI 用户每次更新后也
会被替换为没 TSF 的 NSIS 版本。
## 修复
- 加 src-tauri/installer.nsh:NSIS_HOOK_POSTINSTALL/PREUNINSTALL 跑 regsvr32 注册/反注册。
- bundle.resources map 把 OpenLessIme.dll 拷贝到 $INSTDIR\tsf-ime\OpenLessIme.dll
(target 路径避开 wxs File 已声明的 windows-ime\x64\,避免 MSI component 路径冲突)。
- bundle.windows.nsis.installMode = "perMachine",让 NSIS 以管理员身份运行(写 HKLM 必需)。
- CI 在 build native dll 后把真 dll 复制到 src-tauri/openless-ime-payload/x64/OpenLessIme.dll;
仓库 commit 0 字节占位文件,让本地 mac 端 tauri build 也能 resolve resources 路径。
- build-mac.sh 与 Linux build 步骤加 --config '{"bundle":{"resources":{}}}' 跳过 Windows-only
的 dll 占位,避免污染 mac .app / Linux .deb/.rpm/.AppImage。
## Trade-off
- NSIS perMachine 升级需要 UAC,老 currentUser 用户首次升级时多一次 UAC 提示。
- MSI 包里 dll 会有两份(wxs File + bundle.resources),磁盘冗余 ~几百 KB,无功能影响。
2026-05-06 10:41:07 +08:00
Chris233
7f1df503b9
Merge pull request #276 from H-Chris233/fix/issue-222-pr-agent-hardening
...
加固 PR-Agent workflow 的 secrets 暴露面
2026-05-06 08:08:40 +08:00
H-Chris233
bd4547b613
Pin PR-Agent runtime while preserving automatic reviews
...
The workflow must keep reviewing every PR and every pushed commit automatically, including fork PRs, so the hardening focuses on pinning the code that actually runs in the secrets-bearing job. The wrapper action commit still delegates to a mutable Docker tag, so the workflow now calls the PR-Agent container by immutable digest directly.
Constraint: Maintainer preference is automatic PR-Agent coverage for each PR and synchronize event.
Constraint: Issue #222 requires removing mutable third-party execution refs from the secrets-bearing path.
Rejected: Pin only the action repository commit | the wrapper Dockerfile still resolves pragent/pr-agent:github_action at runtime.
Rejected: Require trusted comment triggers for fork PRs | too inconvenient because new commits would not be reviewed automatically.
Confidence: medium
Scope-risk: moderate
Directive: If fork PR automation remains required, keep the runtime container digest-pinned and do not checkout PR head code in this workflow.
Tested: Parsed .github/workflows/pr-agent.yml with PyYAML and asserted docker:// sha256 form; git diff --check; grep confirmed no action ref or github_action tag remains in the workflow.
Not-tested: Live GitHub Actions execution or Docker Hub digest pull from this host.
Related: https://github.com/appergb/openless/issues/222
2026-05-06 07:51:46 +08:00
Chris233
56694db7f6
Merge pull request #275 from Hongbro886/docs
...
docs(readme): document macOS-only qwen-asr submodule init step
2026-05-06 07:12:31 +08:00
Chris233
f803361b5c
Merge pull request #273 from H-Chris233/fix/issue-223-active-asr-credentials
...
fix(providers): 按 active ASR provider 返回配置状态
2026-05-06 07:11:00 +08:00
whoa
bfc718323b
docs(readme): document macOS-only qwen-asr submodule init step
2026-05-06 06:29:38 +08:00
H-Chris233
cb60a034b6
让凭据状态按 active provider 判断,修复错误配置提示
...
get_credentials 不再把 ASR 配置状态硬编码为 Volcengine,而是返回 active provider 与通用 asrConfigured/llmConfigured。前端 provider setup prompt 与 Overview 改为读取通用状态并展示 active provider 名称,避免 Whisper-compatible 用户已配置却持续被提示未配置。配置完成判定统一为 API Key 可空但 endpoint/model 必须存在:云端 ASR 需 endpoint/model,LLM 需 endpoint/model。保留旧字段做兼容过渡。
Constraint: 最小修改原则,保持现有 provider 凭据存储结构不变
Rejected: 只按 ASR API key 标记已配置 | keyless provider 会被误判,且 endpoint/model 缺失仍不可运行
Rejected: 彻底移除旧 volcengineConfigured/arkConfigured 字段 | 需要分阶段兼容前端调用
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: Provider configured 表示具备 endpoint/model 基础配置;连接有效性仍由验证按钮负责
Tested: npm run -s build
Tested: cargo test -q (74 passed)
Related: #223
2026-05-06 00:23:19 +08:00
Chris233
b802dc4154
Merge pull request #274 from sora520/feat/mute-during-recording
...
feat(recording): mute system output while recording
2026-05-06 00:14:57 +08:00
Chris233
fa6d4d15c8
Merge pull request #270 from appergb/fix/local-asr-release-flow
...
fix(local-asr): 切走/删模型/手动释放时真正归还 RAM
2026-05-06 00:05:57 +08:00
Chris233
d7e3017fa9
Merge pull request #272 from sora520/fix/translation-hotkey-placeholder
...
fix(i18n): render translation hotkey placeholder
2026-05-06 00:02:32 +08:00
kaku.ki
78a38460ce
fix(recording): make QA mute release idempotent
2026-05-06 00:13:44 +09:00
kaku.ki
bb0fefc786
fix(recording): share mute guard across sessions
2026-05-05 23:56:26 +09:00
kaku.ki
9511eb6333
feat(recording): mute system output while recording
2026-05-05 23:28:56 +09:00
kaku.ki
72c14bc437
fix(i18n): render translation hotkey placeholder
2026-05-05 22:02:36 +09:00
Chris233
6d1ff0f872
Merge pull request #271 from H-Chris233/feat/ja-ko-output-language
...
feat(i18n): 增加日语/韩语支持并让输出语言随界面语言联动
2026-05-05 20:47:49 +08:00
H-Chris233
04536830a2
让界面语言直接驱动日文/韩文输出偏好并避免翻译链路冲突
...
在现有简繁联动基础上扩展 ja/ko 本地化与 outputLanguagePreference,保持不新增额外设置项。前端在语言切换时统一同步 chineseScriptPreference + outputLanguagePreference;后端在 polish/QA 链路注入输出语言偏好,但翻译链路固定以 target_language 为唯一约束,避免 UI 语言与翻译目标冲突。
Constraint: 用户要求最小修改且不新增独立输出语言开关
Rejected: 新增单独输出语言设置项 | 与既定交互约束冲突
Confidence: high
Scope-risk: moderate
Reversibility: clean
Directive: 翻译链路不要再次注入 output language 偏好,除非先定义与 target_language 的优先级规则
Tested: npm run -s build
Tested: cargo test -q (72 passed)
Not-tested: 真机端到端切换 ja/ko 后的实际模型输出体验
2026-05-05 20:28:38 +08:00
Chris233
5c1a796771
Merge pull request #268 from millionart/codex/register-windows-ime-nsis-installer
...
fix: register Windows IME from NSIS installer
2026-05-05 20:20:57 +08:00
baiqing
463a6d9716
fix(local-asr): 切走/删模型/手动释放时真正归还 RAM
...
三个问题合修:
1. 用户点"释放"按钮后活动监视器看 RSS 不下降。原因:encoder f32 weights
是 malloc 出来的几百 MB,free 后 macOS libmalloc 不会立即把页归还内核。
修:drop QwenAsrEngine 后调 malloc_zone_pressure_relief(NULL, 0),主动
归还。decoder bf16 走 mmap 不依赖这个。
2. 切回云端 ASR 后本地引擎仍驻留。set_active_asr_provider 切到非 local
时未释放,1.2GB+ RAM 一直留到进程退出。
3. 删除已下载的模型时未释放内存里加载的同 id 引擎,留下 mmap 指向已
unlink 文件 + RAM 不归还的双重问题。
Windows 端本期不上线(cache.rs macOS cfg 块包住改动)。
2026-05-05 20:20:46 +08:00
millionart
ec9f658a1d
fix: harden Windows IME installer smoke
2026-05-05 19:31:49 +08:00
millionart
b303ea405b
fix: guard windows installer smoke exits
2026-05-05 19:05:56 +08:00
millionart
4a7a1b6b8c
test: cover nsis ime edge cases
2026-05-05 18:51:29 +08:00
millionart
eca76deaee
fix: require machine nsis installs for ime
2026-05-05 18:50:10 +08:00
millionart
dbbe419ffb
fix: handle nsis ime installer edge cases
2026-05-05 18:49:36 +08:00
millionart
933e014a80
test: assert nsis uninstall ignores unregister failures
2026-05-05 18:36:17 +08:00
millionart
68ee9dfae4
fix: keep nsis uninstall non-blocking
2026-05-05 18:26:09 +08:00
millionart
e67755d04e
fix: address Windows IME installer review feedback
2026-05-05 18:16:48 +08:00
millionart
753236dd55
fix: register Windows IME from NSIS installer
2026-05-05 17:38:28 +08:00
Chris233
c4dba80f34
Merge pull request #265 from H-Chris233/feat/zh-tw-script-sync
...
Align Chinese output script with locale selection (zh-CN/zh-TW)
2026-05-05 17:31:28 +08:00
H-Chris233 and OmX
7985476886
Avoid stale locale-script writes when language change awaits i18n switch
...
Latest review flagged that language handlers captured prefs before awaiting setLocalePreference, then replayed stale snapshots via object spread.
This adds functional update support to updatePrefs in HotkeySettingsContext and switches both language pickers to merge chineseScriptPreference against current prefs at write time.
Constraint: Keep the fix minimal and avoid refactoring unrelated settings flows
Rejected: Read prefs from IPC again before each write | Adds extra roundtrip and still duplicates merge logic
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Async settings handlers should pass functional updaters whenever they await before persisting
Tested: npm run -s build (openless-all/app)
Not-tested: cargo test -q (no Rust changes in this patch)
Related: https://github.com/appergb/openless/pull/265
Co-authored-by: OmX <omx@oh-my-codex.dev >
2026-05-05 17:03:22 +08:00