TRIP and baiqing
b4e806e3ca
fix(windows): 静默启动 #468 最后一公里 - 前端兜底 ( #474 )
...
* fix(windows): 修复 #466 #468 #469 IME 切回 / 静默启动 / QA 焦点 + #470 capsule 诊断 (#471 )
集中修复 4 个 Windows-only bug:
- #469 IME 切不回 — restore_profile 对称补 legacy TSF ChangeCurrentLanguage + ActivateLanguageProfile,回归点是 c3b59329 升级激活路径时漏改恢复路径。现代 ActivateProfile 失败降为 warn(legacy 已完成视觉切回)。
- #468 Win11 静默启动失效 — single-instance 回调读 start_minimized,true 时跳过 show_main_window;托盘 / CLI intent 路径不受影响。
- #466 QA 弹窗 X/ESC 关不掉 — Win 上从 SW_SHOWNOACTIVATE 切到 Tauri window.show + set_focus,让 webview 拿键盘焦点。配套 focus-dance:begin_qa_session 抓选区前临时把焦点还给用户原 app,抓完再 refocus QA;多轮场景下用 GetWindowThreadProcessId 区分本进程窗口,刷新 qa_focus_target,避免 stale HWND。
- #470 录音胶囊不显示 — 加 per-process 一次性诊断 log(CapsuleState 用 capsule_state_log_name 显式短名,不走 Debug 防字段扩展时泄露),下次能直接定位 prefs / state / Win32 哪一环失败。
pr_agent 五轮迭代到 No major issues + No security concerns;Cloud 评审建议的 begin_qa_session 双锁 TOCTOU 已合并为单 scope。三平台 build + pr_agent CI 全绿。
#470 没标 closes,是 refs—需要真机日志才能定位真因,先 ship 诊断手段。
* chore(release): bump version to 1.3.4-3 (Beta) — Windows #466 #468 #469 修复
* fix(settings-ui): 权限页徽章不换行 + 本地 ASR 区块 Win 灰显
权限页 (Settings → 快捷键 → 权限):
- Pill 组件加 whiteSpace:nowrap + flexShrink:0 → "已安装"徽章在 Win
窄宽下不再被挤成 3 行(每个汉字一行)。
- 行内 message span 加 whiteSpace:nowrap + overflow:hidden +
textOverflow:ellipsis + minWidth:0 → 长文本("Windows 低层键盘 hook
已安装")超宽时省略号收尾,徽章保持完整。
- zh-CN 描述大段精简:descAcc / descNoAcc / micDesc / accDesc /
hotkeyDesc / networkDesc / windowsImeDesc / windowsIme.* 都改短,
减少 Win 上拥挤感(用户反馈 zh 文案过长)。
高级页 (Settings → 高级 → 本地 ASR):
- Windows 上把"本地 ASR 模型(实验性)"标题区 + 警告小字 + Qwen3 行
整组 opacity:0.45 灰显 —— Qwen3 在 Win 是 stub 不支持,那条"实验性"
主线在 Win 没意义;用户视觉关注点应落到下方独立的 Foundry 行(Foundry
保持正常颜色)。Toggle 的 disabled 行为已经在原 onToggle 条件里,本次
纯加视觉灰显。
* fix(windows): 前端 App.tsx 在 show 主窗口前读 startMinimized 兜底
#471 在 Rust 端 setup() / single-instance callback 都加了 start_minimized
suppression,本机日志确认 Rust 路径完全正确("[main] start_minimized=true
→ 跳过初始 show")。但用户在 Win11 1.3.4-3 上仍然「重启进桌面那一刻主
窗口就出来了」。
定位到最后一条遗漏路径在前端:App.tsx 里 mount 时一条 useEffect 无条件
通过 IPC 调 `getCurrentWindow().show()`,把 Rust 端已经 suppress 的窗口
又拉出来 —— 这条路径 Rust log 完全看不见(走的是 plugin-window 的
showWindow IPC,不经过我们的 show_main_window helper)。
那条 useEffect 当初是给 issue #163 引入的:Windows 权限探测可能死锁让
首屏卡灰,所以前端兜底 force show 一次。
修法:show 前先读 prefs.startMinimized,true 就 return。读 prefs 失败
(极少数情况)保持原 show 行为,不让 #163 的兜底语义丢失。
closes #468 (the actual one this time, Rust + JS 双端都收敛了)
---------
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-18 15:29:33 +08:00
TRIP and baiqing
859fd5370f
feat(updater): Beta 渠道接通 auto-update(Builder.endpoints runtime 切换) ( #465 )
...
* feat(updater): Beta 渠道接通 auto-update(Builder.endpoints runtime 切换)
CLAUDE.md 之前的论断「tauri-plugin-updater 2.10 Builder 不暴露 endpoints()」在
2.10.1 已不成立 —— Builder 现在有 .endpoints(Vec<Url>) -> Result<Self>,build()
里 self.endpoints.unwrap_or_else(|| self.config.endpoints.clone()) 走 runtime 覆盖。
实现 channel-aware 自动更新(不 fork plugin、不写自定义下载/签名校验):
Rust(~100 行新增)
- commands.rs::app_check_update_with_channel:
Stable → webview.updater_builder().build()?.check()(默认 endpoints 从 tauri.conf)
Beta → fetch_latest_beta_release() → 拼镜像 + 直连两份 -beta manifest URL
→ builder.endpoints(urls)?.build()?.check()
- AppUpdateMetadata 字段形状对齐 plugin 的 UpdateMetadata(rid + currentVersion
+ version + body + rawJson),前端 new Update(metadata) 即可复用 plugin 的
download / install / close。
- lib.rs 注册新 command。
前端(~30 行改动)
- AutoUpdate.tsx::checkForUpdates 从 import('@tauri-apps/plugin-updater').check
改为 invoke('app_check_update_with_channel');其余 download / install / close
全走 plugin 原生 JS API(new Update(metadata) 后链式调用)。
- SettingsModal::BetaChannelControl 删掉「打开 GitHub 下载」按钮 ——
auto-update 接管了,手动下载路径冗余;保留「最新 Beta 版本号 + 刷新」做信息透明。
- i18n 5 个 locale 改 betaChannelDesc 文案,把「需要手动下载安装」改成
「自动接收最新 Beta 版本」。betaChannelDownloadBtn 等 i18n key 暂留(无用但无害)。
物理隔离仍生效:Beta tag 的 manifest 文件名带 -beta 后缀,跟 Stable 的
latest-{tgt}-{arch}.json 在 GitHub Release assets 里是分开两份;即使代码逻辑
错把 Beta URL 给 Stable 用户也是 HTTP 404,不会拿到错档。
验证:cargo test --lib serial 270 / 0 / 0;tsc clean;vite build clean。
* feat(settings): BetaChannelControl 加版本比对 + 「立即更新」按钮
之前 BetaChannelControl 在 toggle 打开后,只机械显示「最新 Beta: vX-beta-tauri」,
不管本机版本是不是已经等于那个 tag。用户报告:「显示有最新 Beta,但应该比对版本号」。
修复:
- parseVersionFromBetaTag("v1.3.4-1-beta-tauri") → "1.3.4-1"
- semverGreater(remote, local) 做 SemVer 风格比对(支持 X.Y.Z 和 X.Y.Z-N,覆盖
本仓库实际版本格式;prerelease 按 SemVer 规则 lower than no-prerelease)
- 本机 >= 最新 → 「最新 Beta: vX」 + 蓝色「已是最新」chip
- 本机 < 最新 → 「最新 Beta: vX」 + 「立即更新」按钮(蓝色高亮)
- 「立即更新」点击 → useAutoUpdate.checkForUpdates → 走和全局「检查更新」按钮
完全相同的 download/install 流程,UpdateDialog 直接挂在 BetaChannelControl 内部
- 用户的第二个 feature 诉求:「在 Beta 渠道旁边一键检查 + 自动更新」 = 这个按钮
i18n 5 个 locale 加 4 个 key:betaChannelUpToDate / betaChannelUpdateNow /
betaChannelUpdateNowTitle / betaChannelChecking。
* chore(release): bump 1.3.4-1 → 1.3.4-2 for Beta channel
`-2` 后缀让 appVersion.ts 的 IS_BETA_BUILD 仍判为 Beta,UI BETA 标签照常显示。
配本 PR 的 Beta auto-update + BetaChannelControl「立即更新」按钮,1.3.4-1 用户
切到 Beta 渠道后点检查会发现 1.3.4-2 并走 auto-update 流程一键升上来。
发布 tag:v1.3.4-2-beta-tauri。
---------
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-17 11:15:06 +08:00
TRIP and baiqing
0ecb3bd5a4
chore: bump 1.3.4-1 + sidebar 底部行折成单行 ( #462 )
...
* feat(shell): sidebar 底部行折成单行(设置 + 版本)
把 sidebar 底部「⚙ 设置」和「版本 v1.3.x」从上下两行折成一行:
- 设置按钮 display 由 flex 改成 inline-flex,去掉 label 的 flex:1
(不再撑满 sidebar 宽度)
- 版本 chip(含 BETA 标)用 marginLeft: auto 推到行尾
外观更紧凑、纵向更省、视觉重心从两行散开收到一行。
* chore(release): bump version 1.3.3 → 1.3.4-1 for Beta channel
`-1` 后缀让 appVersion.ts 的 IS_BETA_BUILD 自动判为 Beta,UI 上的
BETA 标签会自动恢复显示。bump-version.sh 不收带 dash 的 prerelease
格式,所以这次手动同步 5 个文件(package.json / package-lock.json
root + nested / tauri.conf.json / Cargo.toml / Cargo.lock)。
发布 tag 仍走 v<v>-beta-tauri:v1.3.4-1-beta-tauri。
---------
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-17 10:18:21 +08:00
baiqing
e6749b1d71
chore(release): bump version 1.3.2-3 → 1.3.3 for Beta channel
...
为 v1.3.3-beta-tauri 发布周期 bump 版本,5 个版本字段同步:
- package.json
- package-lock.json (root + packages[""])
- src-tauri/tauri.conf.json
- src-tauri/Cargo.toml
- src-tauri/Cargo.lock (cargo update -p openless)
含本周期 Beta 主要改动:
- Pro 风格"清晰结构"提示词 v1.7(回 v1.3.0 设计哲学)+ Light 模式语音纠错
- 「我的发布」改为弹框形态(搜索/登录/关闭三段顶部布局,已下架 5 分钟自动消失,Modal 进入动画)
- Marketplace URL 硬编码 apic.openless.top(Settings 不再输入)
- 风格市场按钮移到 Style 页刷新左
- list cache (sessionStorage, 5min) 重开秒呈现 + optimistic UI (like/upload)
- GitHub OAuth Device Flow Phase 1(client_id Ov23liyv3nEucG7oMHNE,登录后自动填 marketplaceDevLogin)
- 上传 picker 两步式确认 + z-index 修复
2026-05-16 17:26:35 +08:00
baiqing
efa94afc27
chore(release): bump version to 1.3.2-3 (Beta)
2026-05-15 12:35:02 +08:00
baiqing
5695d8c467
chore(release): bump version to 1.3.2-2 (Beta)
2026-05-15 08:42:08 +08:00
baiqing
e0a48ce801
chore(release): bump version to 1.3.2-1 (Beta)
2026-05-14 15:00:15 +08:00
baiqing
eca6fae8c0
chore(release): bump version to 1.3.1 (Stable)
2026-05-14 12:58:30 +08:00
baiqing
d3f56c2926
chore(release): v1.3.1-20 — Wayland callout 三命令 + Qwen3-ASR 长语音修复
...
- PR #433:Wayland callout 补全 --toggle-qa / --cancel-dictation
三命令并列 + 五语言同步翻译
- PR #434:本地 Qwen3-ASR 末段静默 padding 修末 chunk 丢内容;
动态超时 max(15, ceil(audio_s × 0.6) + 10) 修长录音超时
2026-05-13 23:11:13 +08:00
baiqing
38f202a010
chore(release): v1.3.1-19 — SelectLite zoom 偏移 + 闪动修复(PR #428)
...
bump 1.3.1-18 → 1.3.1-19,6 处版本号手动同步(bump-version.sh regex 不收
Beta 版本号):package.json / package-lock.json (root+nested) / tauri.conf.json
/ Cargo.toml / Cargo.lock(openless)。
[变更]
- SelectLite 下拉位置在 html.zoom != 1 下不再右偏(fontScale 的 large 档影响
最大);CSS zoom 在 WKWebView 下让 getBoundingClientRect 返回 post-zoom
坐标但 position:fixed 用 pre-zoom 坐标,positionPopover 现在补偿 zoom 转回。
- 下拉打开瞬间的位置闪动消除(popoverMounted state 触发 useLayoutEffect 同步
二次定位,替代 requestAnimationFrame 的 post-paint 校正)。
- 移除 macOS 走原生 <select> 的旁路分支,三平台统一自定义 popover。
2026-05-13 14:27:34 +08:00
baiqing
1d0f01a4b5
chore(release): 补齐 package-lock.json 到 1.3.1-18
...
上一次 bump 漏改了 package-lock.json 的 root + nested version,
导致 beta push CI 的 'Verify version sync across all 5 files' 步骤红。
release-tauri.yml 已基于 v1.3.1-18-beta-tauri 出包成功,本 patch 只
为修复 CI 元数据对齐,不影响已发布产物。
2026-05-13 13:55:00 +08:00
baiqing
c5bdb02595
chore(release): v1.3.1-17 — Mac native select + 胶囊白底升 0.85 + ASR 行清理
...
[SelectLite]
- macOS 走原生 <select>(NSPopUpButton),不再用自定义 portal popover——
WKWebView 里 portal+position:fixed 的位置漂移问题反复修不干净
- Win/Linux 仍用自定义 popover:popover 锁到 trigger 宽(width 不再用 minWidth),
避免内容撑大跑出 trigger 范围
- positionPopover 横向 maxLeft 用 rect.width,两帧 left 一致
[Capsule]
- pill 白底 alpha 0.62 → 0.85(用户:"让白色更白一些")
- cancel/confirm 按钮保持 1.3.0 stable 取值;thinking 字号 17/weight 600/cap-shine
动画保留
- 此前 v1.3.1-9 ~ v1.3.1-15 多轮 alpha 微调 / NSVisualEffectView 实验全部回退
[Settings ASR 行]
- 下拉只保留云端 provider,删 disabled 的本地引擎条目
- 本地引擎激活时下拉锁住 + 显示一行"ASR 提供商已被接管"提示
- i18n 五语言加 settings.providers.asrProviderTakenOver
[版本]
1.3.1-8 → 1.3.1-17,四处版本号同步
2026-05-12 21:58:51 +08:00
baiqing
40c39e11d3
chore(release): v1.3.1-8 hotfix — SelectLite 死锁 + 玻璃统一
...
[CRITICAL fix: SelectLite 所有下拉打不开]
v1.3.1-7 (PR #426 ) 我引入了 deadlock:
- anchor 初始 null + portal 条件 `open && anchor && createPortal(...)`
- 我删了 useLayoutEffect 在 open=true 时调 positionPopover
- 改成 popoverRef callback ref(只在 DOM mount 时 fire)
- 但 popover DOM 挂载条件依赖 anchor 非 null → anchor 永 null → 死锁
用户报"所有竖向切换横幅的界面全都打不开了"——LLM 供应商 / ASR 提供商 /
paste shortcut / mirror / language / polish mode 等 SelectLite 下拉全部
点击无反应。这是我的 review 失误,深表歉意。
修:加回 useLayoutEffect 在 open=true 时调 positionPopover 一次(用 trigger
宽 fallback 立即设 anchor),保留 callback ref RAF 在 popover mount 后用
真实宽精确重定位。两步合并:anchor 立即不为 null → portal 渲染 → callback
ref 触发 → 重新精确定位。
[玻璃统一处理]
用户:"现在完全没有磨砂玻璃的效果,应该把底下的细控组件、边栏以及盖栏
等设置的边栏采用同一种方式处理"。
之前 main content (`<main>`) 用 `var(--ol-surface)` 完全不透明白底,跟透明
sidebar 视觉割裂。改成 `rgba(255,255,255,0.62)` + `backdrop-filter blur(18px)
saturate(170%)`,跟 sidebar 一起坐在 WindowChrome 磨砂底板上,全应用一块
连续玻璃。
[版本]
1.3.1-7 → 1.3.1-8,6 处版本号同步。
2026-05-12 19:38:29 +08:00
baiqing
5aafc29ee5
chore(release): bump version to 1.3.1-7 (Beta) + Capsule 磨砂玻璃 + thinking 黑底
...
[bump] v1.3.1-6 → v1.3.1-7。本版本含 PR #426 merged(SelectLite 位置/动画/
滚外关)+ 本 commit 的两件用户实机 surface:
[Capsule 磨砂玻璃 Windows 路径打开]
之前 Capsule.tsx Windows 路径 useBackdrop = os !== 'win' 强制关掉 backdrop-filter,
让 Windows 胶囊看上去就是白色 pill 没玻璃感。WebView2 现在支持 backdrop-filter,
打开让 Windows 玻璃感对齐 macOS:
- Pill: backdrop-filter blur(28px) saturate(180%)
- CircleButton (cancel): blur(12px) saturate(160%)
[Thinking 字体重做]
- 字号 17 保持,字重 700 → 600 稍细
- 底字浅亮黄 #FCD34D → var(--ol-ink) 黑(用户:"亮黄太显眼,黑底更稳")
- 中段扫光 var(--ol-blue) 深蓝不变(继续作为高对比"滑动"标志)
2026-05-12 19:16:24 +08:00
baiqing
ca5cb5277a
chore(release): bump version to 1.3.1-6 (Beta)
...
PR #425 合并后 bump。本版本相对 v1.3.1-5-beta 累积:
[胶囊动画]
- 入场 .26s → .38s,cubic-bezier(.16,.86,.32,1.18) 更强 spring overshoot
- 出场 .24s → .36s(EXIT_ANIM_MS 同步加到 360),cubic-bezier(.55,.06,.68,.19)
慢启动加速收尾的平滑曲线,让用户能看清"左右收缩 + 下移 + 淡出"
- thinking 字号 14 → 17,字重 500 → 700,浅亮黄底字 + 深蓝扫光
[LocalAsr Windows Qwen3]
- 删除顶部"白底显眼"提示 banner(已 inert + 灰显,banner 多余)
- Windows 列表为空时不再画 placeholder Card,简化为空白占位
- 千问3 ASR 标题加 amber 小 badge "实验性"
- 5 个 locale 新加 i18n key qwenExperimentalBadge
[polish prompt 反 AI 自述]
- OUTPUT_BLOCK 新加"# 反 AI 自述式表达(强约束)":禁词列表 +
保持原句人称视角 + 直陈原意不扩写
- Light task 加"工程化直陈"段
- Formal task 加"工程化正式"段(不展开为商务铺垫)
- Structured task 加"判断事项的标准"4 种独立事项形态,事项 ≥3 强制双层
即使输入听起来像顺着说下来的口播
2026-05-12 18:44:42 +08:00
baiqing
1a810c1c67
chore(release): bump version to 1.3.1-5 (Beta)
...
PR #423 合并后 bump。本版本相对 v1.3.1-4-beta 累积:
[3 个 dev task] (worktree-isolated dev agents + 3 个 reviewer)
- 胶囊动画:进入从中心冒出向左右生长,退出左右收缩 + 淡化 + 下移
- Windows 千问3 ASR 灰显 disabled + 不可激活提示 banner
- 5 个 SVG 重画:translate / vocab / history / overview / selectionAsk
[review feedback fix]
- Capsule EXIT_ANIM_MS / INITIAL_VISIBLE_STATE 抽 const
- Qwen3 disabled 区加 inert 让键盘 Tab 跳过
- overview icon 加 sparkline 数据线区分 layout icon
- selectionAsk 气泡尾巴拉到 y=23 防 viewBox 24 底裁切
[用户实机 surface]
- Vocab 词条大椭圆真根因:父 flex minHeight 拉伸子 item,加
alignSelf:flex-start 阻止
- Windows 原生顶栏 vs 玻璃色差:caption color 0xFFFFFF → 0x00F7F5F5
跟 glass 起始色一致;glass alpha 0.78 → 0.92 压色差
[polish prompt 反降级]
- Structured task block 加"不可降级到轻度润色"和"多个组合需求归类规则"
2026-05-12 17:46:25 +08:00
baiqing
a7a9284db6
chore(release): bump version to 1.3.1-4 (Beta)
...
PR #422 合并后 bump。本版本相对 v1.3.1-3-beta 累积修复:
- Windows 默认字号 'large'(fontScale.ts UA 检测)
- Windows 原生标题栏底色刷成白色,与 sidebar 视觉统一(DWM CAPTION_COLOR)
- 全平台玻璃统一:WindowChrome 撤销 PR #419 留下的"Windows 100% opaque +
无 backdropFilter"分支,两平台用同一半透明 background + blur saturate(190%),
alpha 0.92 → 0.78 让玻璃感更明显但不过透
- Vocab 词条大圈再次根治:global.css button reset 补加 outline:none /
min-width:0 / min-height:0 / box-sizing:border-box
- polish ROLE_BLOCK 撤销 b2325a27 回滚,恢复 7e60bdb5 8-条规则状态
- polish ROLE_BLOCK 「意图难判」规则改为强制结构化(用户拍板的新版)
2026-05-12 17:00:05 +08:00
baiqing
b227b69a03
chore(release): bump version to 1.3.1-3 (Beta)
...
PR #421 hotfix 合并后 bump。本版本相对 v1.3.1-1-beta-tauri 累积修复:
- Windows 主窗口交还原生 Win11 chrome(修 PR #419 删自定义标题栏后无法
拖/关/最小化的卡死状态)
- Vocab 词条 Windows 大圈(global.css button appearance:none)
- polish "清晰结构"模式输出退化成单段(ROLE_BLOCK 回滚到 v1.2.24-9-beta)
v1.3.1-2 tag + release 已删除(含 Windows 主窗口无 chrome 阻塞 bug)。
2026-05-12 15:35:09 +08:00
baiqing
a2a944ea31
chore(release): bump version to 1.3.1-2 (Beta)
...
PR #419 已合并到 beta,UI 完整版(Windows 原生 chrome / 胶囊缩小 /
自定义下拉 / a11y 焦点指示 + 键盘 scrollIntoView + 视口 clamp)相比
上一轮 1.3.1-1 commit (90b35057 ) 累积了实质改动,bump patch-build
号到 1.3.1-2 区分。
6 处版本号同步:package.json / package-lock.json (root + nested) /
tauri.conf.json / Cargo.toml / Cargo.lock。
2026-05-12 14:58:08 +08:00
baiqing
8a6ac8b308
fix(ci): 补齐 package-lock.json 的 version 字段对齐
...
90b35057 bump 到 1.3.1-1 时漏改了 package-lock.json 的 root 与
nested version 字段(都还是 1.3.0),CI "Verify version sync
across 5 files" 卡死所有平台,本 PR 的 build / check 步骤根本
没机会执行。
手动同步到 1.3.1-1,与 package.json / tauri.conf.json /
Cargo.toml / Cargo.lock 对齐。本地复跑 CI 第一步的 node -p 校验
全部一致。
2026-05-12 13:48:44 +08:00
baiqing
8ea4e8932f
chore(release): bump version to 1.3.0 (Stable)
2026-05-12 10:28:07 +08:00
baiqing
e90fe9f7b1
chore(release): correct beta version to 1.3.0-1 (MSI requires numeric pre-release)
...
上一条 1.3.0-BETA 在 Windows MSI 打包阶段被 Tauri 拒绝:MSI ProductVersion
只接受 \"MAJOR.MINOR.BUILD\" + 数字 pre-release(≤ 65535)。BETA 字面被
canonicalize 时报错 \"optional pre-release identifier in app version must be
numeric-only\"。
按仓库历史 (1.2.24-7/8/9) 同体例改为 1.3.0-1,表示 1.3.0 的第 1 个 Beta。
2026-05-12 09:56:20 +08:00
baiqing
7136cf55cc
chore(release): bump version to 1.3.0-BETA
2026-05-12 02:04:32 +08:00
baiqing
cc215fdce3
chore(release): bump version to 1.2.24-9 (Beta-9)
2026-05-11 13:19:17 +08:00
baiqing
47bda0d0ac
chore(release): bump version to 1.2.24-8 (Beta-8)
2026-05-11 07:10:53 +08:00
baiqing
049147c481
chore(release): sync package-lock.json version to 1.2.24-7
...
CI ci.yml "Verify version sync across all 5 files" 步骤要求 5 处版本号一致:
package.json / package-lock.json (root + nested) / tauri.conf.json /
Cargo.toml / Cargo.lock 的 [openless] 包。上一个 commit (568d30d ) 漏改了
package-lock.json 两处 → Linux + macOS CI fail。
修法跟 PR #383 后续 commit 941542c6 同形:手动同步两处 'version'
字段到 1.2.24-7。下次正确流程是用 scripts/bump-version.sh 一把过。
2026-05-10 10:42:20 +08:00
weikeyi
941542c6e7
chore(release): 同步 package-lock 版本到 1.2.24-6
2026-05-09 17:22:21 +08:00
TRIP and baiqing
b44cb998af
fix(installer): unregister TSF IME before replacing OpenLessIme.dll on upgrade ( #321 ) ( #369 )
...
Auto-update was failing on Windows because OpenLessIme.dll is a TSF input-method
DLL: once registered, Windows maps it into every text-input client process
(browsers, IDEs, chat apps...). The installer's PREINSTALL hook tried to
overwrite the file directly while it was still mapped, hitting a sharing
violation and aborting the update.
NSIS hook (openless-ime-hooks.nsh):
- PREINSTALL now calls OPENLESS_IME_UNREGISTER_X86/X64 first to release the
COM/TSF registration. On a fresh install this is a harmless no-op (existing
unregister macros log the exit code without aborting).
- DLL bytes are written to OpenLessIme.dll.new and atomically renamed into
place. If the old DLL is still locked by a TSF client process, Delete fails
and we fall back to Rename /REBOOTOK + SetRebootFlag — Windows queues the
replacement via PendingFileRenameOperations and the new bytes activate after
the next reboot. Same TSF registration path is preserved, so re-registration
in POSTINSTALL stays valid across the reboot.
WiX (openless-ime.wxs):
- UnregisterOpenLessImeX86/X64 now also fire Before InstallFiles when a
previous version is installed (Installed AND NOT REMOVE). Original condition
(REMOVE="ALL", Before RemoveFiles) only covered the dedicated uninstall
sequence; auto-update / minor-upgrade skipped it entirely and ran straight
into the same sharing violation as NSIS.
Bumps to 1.2.24-5 (Beta-5).
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-08 19:58:05 +08:00
TRIP and baiqing
29d3a79eb6
chore: bump version to 1.2.24-4 (Beta-4) ( #358 )
...
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-08 11:57:36 +08:00
TRIP and baiqing
10440c7f72
chore: bump version to 1.2.24-3 (Beta-3) ( #349 )
...
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-08 09:47:30 +08:00
TRIP and baiqing
2a99d6bf6e
chore: bump version to 1.2.24-2 (Beta-2) ( #345 )
...
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-08 09:08:23 +08:00
TRIP and baiqing
4962a661a3
chore: bump version to 1.2.24-1 ( #337 )
...
将 Beta 版本号从 1.2.24-beta.1 改为 1.2.24-1。
原因:Tauri MSI bundler 对 prerelease 段的限制比 npm/Cargo semver 严格,
要求 prerelease identifier 必须是「numeric-only and ≤ 65535」。
1.2.24-beta.1(含字母 + 多段)会让 windows MSI 构建直接报:
failed to bundle project: optional pre-release identifier in app version
must be numeric-only and cannot be greater than 65535 for msi target
实测后果:上次 v1.2.24-beta.1-beta-tauri tag 触发的 CI run 25501471895,
macOS arm64 / macOS x64 / Linux 都成功,只有 Windows MSI 卡在 candle 之前。
修复:
- 1.2.24-1 是合法的 npm/Cargo semver prerelease 写法( id="1" 纯数字)
- Tauri MSI 接受这种格式
- semver 排序仍然 1.2.23 < 1.2.24-1 < 1.2.24,符合渠道隔离要求
- 后续 Beta 迭代版本号: 1.2.24-2 / 1.2.24-3 / ...
- Beta 身份不靠版本字面,靠 tag 后缀 `-beta-tauri`(release-tauri.yml 检测)
5 处版本号同步:package.json、package-lock.json (root + nested)、
tauri.conf.json、Cargo.toml、Cargo.lock。CI 用的同一段 verify 通过。
合入后由维护者删旧 tag/release(已删)+ 推 v1.2.24-1-beta-tauri 触发新 CI。
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-07 22:40:18 +08:00
TRIP and baiqing
f4442e52d9
chore: bump version to 1.2.24-beta.1 ( #334 )
...
Co-authored-by: baiqing <lbx12309@icloud.com >
2026-05-07 22:04:50 +08:00
baiqing
5491ef5d33
chore(release): 1.2.23
...
Hotfix for 1.2.22:
- fix(recorder): macOS 麦克风停录后未释放(cpal Stream::drop 不调
AudioOutputUnitStop,显式 pause 强制停 callback)
- fix(coord): 录音条等真实开始捕获 PCM 后再弹出,避免短录音漏首字
- fix(localasr): macOS 不再渲染 Windows 专属的 Foundry Local Whisper 卡片
- fix(hotkey): macOS 上 Alt/Meta 键标签显示 Option/Cmd 而非 Alt/Win
2026-05-07 16:57:18 +08:00
baiqing
01aa439686
chore(release): 1.2.22
2026-05-07 13:08:00 +08:00
baiqing
d5fa5b7df3
chore(release): 1.2.21
...
主要修复
─────────
- fix(windows): TSF DLL 静态链接 CRT,防 host 进程(QQ 等)私有
MSVCP140 劫持导致切微软拼音崩溃 0xc0000005(PR #287 + #289 + Codex
P1 review)。
- fix(windows): 移除 DisableThreadLibraryCalls — /MT 下 CRT 需要
thread attach/detach 通知做 per-thread TLS 清理,禁用反而触发崩溃。
- fix(recording): 录音条出现时 mic 已 capture,按 Option 不再吞开头
字。emit Recording 加 race 检查避免短按时覆盖 stop/cancel UI 信号。
- fix(startup): splash 透明背景 + 卡片化,避免长启动时左半白屏。
- fix(vault): keyring chunks 用稳定 account name —— macOS Keychain
Always-Allow 不再因 UUID 轮换失效;不再每次 load 都尝试删 9 个
legacy entries 触发 ACL 弹窗(与 PR #277 一起)。
新功能
─────────
- feat(security): 凭据从 plaintext JSON 迁移到平台 credential vault
(macOS Keychain / Windows Credential Manager / Linux libsecret)。
Windows 2560 byte 限制下用 chunked storage;partial-write safe。
legacy 多源迁移完成后自动清理(PR #277)。
工程
─────────
- chore(ci): 暂时搁置 macos-13(Intel mac)matrix —— GH Actions
runner pool 紧张到每次 dispatch queue 1-2h(已观测 4 次)。Apple
Silicon 用户 dmg 仍发;Intel mac 用户保留 v1.2.20 dmg + Rosetta
说明(issue #299)。
- chore(devex): CI 加 macOS 矩阵 + 5-way 版本号一致性校验 +
scripts/bump-version.sh 一行同步 5 处版本号。.gitignore 加
promo-openless-v2 / node_modules / dist / target 全局兜底(PR #294)。
- docs: docs/audit-2026-05-06.md 工程审计基线,覆盖架构 / UI bug /
多端一致性 / IPC 1:1 校验 / P0/P1/P2 改进路径。
- chore: 9 个改进 issue (#295-#303) 跟踪 audit 列出的所有 P1/P2/P3
问题。
2026-05-06 21:24:51 +08:00
baiqing
97fca4abab
fix(devex): bump-version 修 BSD sed / lock 失败吞错 / package-lock 未同步
...
Codex 在 PR #294 上提了 3 个 P2,全部采纳:
P2-A: BSD sed 不支持 GNU 行号范围 0,/.../
原 sed -E -i.bak "0,/^version = .../s//.../" 在 macOS 默认 BSD sed 上
会 fail。换成 awk first-match 替换(mac BSD awk + GNU awk 都支持)。
P2-B: Cargo.lock 同步失败被 `|| true` 吞了
原 cargo update -p openless ... || true 会让脚本继续,validate 又只
校验 Cargo.toml 不校验 Cargo.lock。删 || true,让 set -euo pipefail
在 cargo update fail 时立刻退出;同时 validate 加 Cargo.lock 校验。
P2-C: package-lock.json 未跟着同步
npm 把 root version 也存在 package-lock.json 里(root + packages['']
两处)。原脚本只 sed package.json 不更 lock,会让 npm ci 在 CI 出现
EUSAGE。换成 npm version --no-git-tag-version --allow-same-version
一次更两个文件。
ci.yml 的 verify step 也升级到校验 5 处一致:
package.json / package-lock.json root+nested / tauri.conf.json /
Cargo.toml / Cargo.lock 的 [openless] 包。
dry-run 已验证(用当前版本 1.2.20 跑一遍输出全部一致)。
2026-05-06 21:04:28 +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
baiqing
149a6b8eca
chore(release): 1.2.19 — Windows updater 修 NSIS+MSI 拆两轮跑
2026-05-04 23:12:55 +08:00
baiqing
429780b5e4
chore(release): 1.2.18 — Windows bundle 顺序锁 nsis,msi 让 updater 资产先落盘
...
历史链:
1.2.13 ✓ 无 IME wxs,MSI+NSIS 全过
1.2.15 ✗ 加 IME wxs;CI pwsh 把 JSON 引号吃掉,tauri 连 candle 都没跑
1.2.16 ✗ shell 切 bash 后到 light 阶段,但 ICE80 触发,Repair 没 -sice
1.2.17 ✗ Repair 加了 -sice:ICE80 修了 MSI;但 Tauri 字母序 msi→nsis 让
MSI 先挂掉,NSIS 永远没机会跑,updater .exe(.sig) 缺失
1.2.18 显式 --bundles nsis,msi:NSIS 先写盘产 updater 资产,MSI 再失败
由 Repair 兜底 light.exe 重链
唯一改动:Build (Windows) 步骤两个分支都加 --bundles nsis,msi。
预留:NSIS 不读 wix.fragmentPaths,所以 .exe 暂不带 IME DLL;MSI 仍带,
后续单独 issue 跟进 NSIS IME 集成,不挂当前发版。
2026-05-04 22:56:33 +08:00
baiqing
a5f1a8f16d
chore(release): 1.2.17 — Windows MSI 修 light.exe ICE80 报错
...
x86/x64 IME DLL 都装进 INSTALLDIR\windows-ime\,32-bit 组件落在 64-bit
Directory 是 ICE80 的硬性报错。本场景路径绝对指向、不依赖 SysWOW64
重定向,按 Microsoft 文档是合法用法,给手动 light.exe 重链加 -sice:ICE80
即可放行。改动同步覆盖 CI workflow 和本地打包脚本。
2026-05-04 22:21:50 +08:00
baiqing
49210363d6
chore(release): 1.2.16 — Windows MSI 修 PowerShell 引号吞双引号 bug
...
1.2.15 第 4 轮 Windows job 在 wix 阶段之前就 exit 2,根因是上一版我把
Build (Windows) 整步切成 shell:pwsh 后,& npm run tauri --- build --config
'{"bundle":{"createUpdaterArtifacts":true}}' 这条命令 PowerShell 调外部
进程时把 JSON 内的双引号剥光,tauri 收到 {bundle:{createUpdaterArtifacts:true}}
直接拒绝。log 第 586 行能看到剥过引号的 commandline。
修法:
- Build (Windows) 切回 shell:bash(单引号能保留内部双引号)。set +e 抓
exit code 写到 GITHUB_ENV,让本步不直接失败,把判断权交给下一步。
- 新增独立 step "Repair Windows MSI if Tauri failed at WiX link"(pwsh),
仅在 tauri 非零退出且 MSI 不存在时手动从 appRoot 跑 light.exe 重链。
本地 windows-package-msvc.ps1::Repair-TauriMsiBundle 同款手术。
2026-05-04 21:53:23 +08:00
baiqing
dcfeb405bf
chore(release): 1.2.15 — Windows MSI 修复 IME bundle 集成
...
1.2.14 三轮 release pipeline Windows job 全挂在 WiX 集成上:
1. 没构建 IME DLL → light.exe 找不到文件
2. 加了 build 步骤后用相对路径 src-tauri\target\... → Tauri wix bundler
cwd 和本地脚本不同,相对路径 resolve 错位
3. 改 $(env.OPENLESS_IME_DLL_X64) 想用绝对路径 → candle 处理 env var
substitution 时 abort(具体原因被 Tauri 吞掉)
1.2.15 切换到本地 windows-package-msvc.ps1 已经验证可行的 Repair 思路:
- wxs 维持字面相对路径 src-tauri\target\... (让 candle 正常吃过)
- workflow 接住 tauri build 失败:从 appRoot (openless-all/app/) 手动跑
light.exe 重链 main.wixobj + openless-ime.wixobj。这是 light 唯一能
resolve 该相对路径的 cwd。
2026-05-04 20:39:22 +08:00
baiqing
72ebe76be0
chore(release): 1.2.14
...
包含自 1.2.13 以来的修复与新功能:
- feat(autostart): 跨端开机自启 (#194 )
- feat(asr): SiliconFlow / GLM-ASR / Groq / OpenAI Whisper preset (#212 )
- fix(qa): Windows / Linux 划词追问浮窗 Esc + 拖拽 + 文案 (#205 / #206 )
- fix(settings): preset 切换 race + per-provider 凭据隔离 (#219 / #220 )
- fix(overview): 概览整屏适配 + 嵌套 scroller 细滚动条 (#243 / #248 )
- 一系列 Windows IME (TSF) 模块 (#233 / #240 等)
2026-05-04 18:58:03 +08:00
baiqing
e5608db21e
feat(autostart): macOS / Linux / Windows 三平台开机自启
...
接入官方 tauri-plugin-autostart:
- macOS:~/Library/LaunchAgents/com.openless.app.plist (LaunchAgent)
- Linux:~/.config/autostart/openless.desktop (XDG)
- Windows:HKCU\Software\Microsoft\Windows\CurrentVersion\Run (per-user,
不需要 admin)
设置页 → 录制 区追加「开机自启」Toggle;状态以 OS 为唯一真相,
直接调插件 isEnabled / enable / disable,不进 prefs,避免缓存
与系统设置不一致。
Closes #194
2026-05-04 07:07:55 +08:00
baiqing
1a0efe402c
feat: 划词语音问答前端 — closes #118 前端部分
...
- 新增 qa 浮窗(tauri.conf.json windows[2]):380x280 无装饰磨砂玻璃
- 新增 QaPanel.tsx:loading skeleton / answer markdown / error 三态
- marked@^11 渲染 markdown,注入轻量排版 CSS
- Esc / 失焦 / 30s 超时自动 dismiss(Pin 时跳过)
- 监听 qa:state + qa:dismiss 后端事件
- App.tsx 路由:?window=qa → QaPanel
- types.ts:QaHotkeyBinding + UserPreferences.qaHotkey/qaSaveHistory
以及 QaStatePayload(snake_case 字段对齐 Rust)
- ipc.ts:getQaHotkeyLabel / setQaHotkey / qaWindowDismiss / qaWindowPin
以及 mockSettings 默认 cmd+shift+;
- Settings 录音区新增「提问模式快捷键」下拉(4 预设 + 不启用)
与「保存 Q&A 历史」开关
- i18n:zh-CN + en 同步新增 qa.* 与 settings.recording.qa* 文案
2026-05-01 13:14:11 +08:00
baiqing
48f21341c1
fix(asr): 修 Volcengine 序号竞态 + UI 重做(毛玻璃 / 滑动 / 字体设置 / History 双列滚动)
...
ASR 稳定性
volcengine.rs::consume_pcm_chunk 不再每块一个 spawn——每次 consume 调用一次 spawn、
内部串行 send;BufferingAudioConsumer 启动时一次性 flush 15KB 缓冲不再触发
"autoAssignedSequence (N) mismatch sequence in request (N+1)" 断连。
UI 重做
- sidebar 整体改透明,让 LOGO/导航/快捷键/BETA + footer 共用外层一片磨砂玻璃
- 内容卡圆角与外层窗口对齐 (mac 20 / win 14)
- 标签页切换换成 cubic-bezier(0.32,0.72,0,1) 横向 14px 滑入(0.32s)
- 主窗口加 acceptFirstMouse: true,后台单击即激活并触发交互
- footer 问号点开版本说明 popover;齿轮恢复直接打开 Settings
自动更新统一
抽出 components/AutoUpdate.tsx:useAutoUpdate hook + UpdateDialog;
Settings 关于 + footer 检查更新共用同一套状态机和对话框。
字体大小设置
挂在 SettingsModal 现有"个性化"section(与语言 / 玻璃强度并列),
通过 documentElement.style.zoom 三档缩放 + localStorage 持久化。
History 列独立滚动
把 padding + overflow:auto 合到 key={currentTab} 的 wrapper 上,
History 根的 height:100% 终于能解析到固定高度,左右两列各自独立 scroll;
Overview/Vocab/Style 自然高度溢出仍走 wrapper 滚条,行为不变。
2026-05-01 07:55:47 +08:00
baiqing
f937f586ee
chore: bump version to 1.2.6
2026-04-30 21:33:28 +08:00
baiqing
f456516f69
chore: release 1.2.5
2026-04-30 18:58:35 +08:00
baiqing
a853b592a1
chore: release 1.2.4 mac titlebar polish
2026-04-30 18:27:35 +08:00