Chris233
115680cd4c
Delete .github/workflows/pr-agent.yml
2026-08-05 22:36:33 +08:00
bigsong and Claude Opus 5
9dbb316ff8
fix(asr): 删除 retranscribe 里重复的 ElevenLabs 匹配分支 ( #906 )
...
该分支与上一条完全一致,属于死代码,cargo check 会报
warning: unreachable pattern。
Co-authored-by: Claude Opus 5 <noreply@anthropic.com >
2026-08-05 22:14:28 +08:00
Chris233
f22eb54d90
fix(windows-ime): TSF 插入后输入法未切回原输入法(#852) ( #914 )
...
* fix(windows-ime): TSF 插入后输入法未切回原输入法(#852)
- restore_decision 改为依据会话已知的激活状态(openless_was_activated / activation_failed),不再依赖 GetActiveProfile 探测结果,避免后台线程误判导致跳过恢复
- restore_profile 中 legacy 失败不再短路现代 ActivateProfile,任一成功即视为整体成功
- restore_session 增加恢复后校验与一次重试;saved 本身是 OpenLess 时跳过(粘滞态防护)
- prepare/restore 补充诊断日志,便于区分未走恢复/恢复被跳过/恢复失败
* fix(windows-ime): 恢复流程抽离可测核心 + 重试等待让出 runtime 线程(#852 审查跟进)
- restore_profile 合并 TextService/KeyboardLayout 同形分支,差异收敛为参数
- 恢复重试等待在 tokio runtime 上改用 block_in_place 让出工作线程
- 粘滞防护/校验/重试抽为 run_restore_flow,可跨平台注入测试
- 新增 5 个恢复流程测试(粘滞跳过/一次成功/重试/restore 报错仍校验/探测报错)
* fix(windows-ime): 恢复校验降级为诊断日志,重试依据改为 restore 返回值(#852 审查跟进)
- run_restore_flow 重试条件改为 restore_profile 返回值(legacy+modern 均失败才重试)
- is_openless_profile_active 探测降级为恢复后诊断日志,不再参与控制流(线程局限见 #852)
- 更新恢复流程测试覆盖新语义(6 个用例,47/47 通过)
* refactor(windows-ime): 恢复策略层迁入跨平台模块并纳入 CI 单测(#852 审查跟进)
- 新增 windows_ime_restore 模块:run_restore_flow/RestoreOutcome/重试等待
迁出 windows_ime_session;sleep_restore_retry 增加 MultiThread runtime 守卫
- report_restore_step_results 提升为无门控顶层函数,测试可在任意平台执行
- restore_profile 参数收敛为 RestoreArgs 结构体(resolve_restore_args)
- 测试夹具 openless_snapshot_for_test 由生产常量派生,替换重复 GUID 字面量
- restore_session 消费 RestoreOutcome 补 debug 诊断日志
- backend-tests 纳入 windows_ime_profile/windows_ime_restore(tokio/winreg/features)
- 新增 9 个单测现已在 macOS/Linux cargo test --lib 与 Windows backend-tests 执行
2026-08-05 21:35:34 +08:00
TRIP and sim
29e7ecaeda
feat(settings): 模型 ID 直选 ASR 供应商 + 看板右侧布局改版 + 弹窗重合 ( #923 )
...
* feat(settings): 模型 ID 直选 ASR 供应商 + 看板右侧布局改版 + 弹窗重合
- ASR 供应商下拉:本地引擎的已下载模型直接以「引擎:模型ID」选项列出,
选中即使用该模型(不再需要先选引擎再选模型);下载完成后经进度事件自动刷新;
引擎级入口与删除后无匹配的兜底选项保留
- 下载弹窗改为与设置弹窗完全重合:垂直居中、同尺寸 880×600(此前顶部锚定偏高)
- 看板右侧改版:模型名在左上,Hugging Face 仓库/镜像源 pill 在右上;
下载 / 加载并测试 / 打开目录 / 删除 合并为底部一行;测试结果显示在看板里
(此前「加载并测试」无任何反馈,旧 ModelRow 是死代码)
- 删除看板「下载模型会自动出现在上方…」描述文案
* fix(settings): 平台不匹配时去掉重复的本地引擎兜底选项(pr-agent #923)
---------
Co-authored-by: sim <sim@local>
2026-08-05 18:40:58 +08:00
TRIP and sim
a580a8f32a
feat(settings): 本地 ASR 模型管理重构 + 提供商界面颜色/动画统一 ( #922 )
...
* feat(settings): 本地 ASR 模型管理重构——两栏看板 + 下载弹框 + 右上角进度 + 提供商本地模型标注
- 模型管理改为两栏看板:左侧模型选择(竖排,已下载绿勾,全平台 Qwen3 /
sherpa-onnx / foundry 归一化),右侧详情看板(HF 实时抓取的尺寸/文件数/
repo + 状态 + 操作按钮),嵌套在设置里作为单独板块
- 下载弹框:左侧模型选择 + 右侧大小/文件数详情,底部「开始下载」,布局与
看板一致(用户原话:单独的下载界面)
- 右上角下载进度浮层:Qwen3 与 sherpa 下载进度聚合 fixed 显示,完成/取消/
失败即消失
- ASR 提供商界面:本地引擎激活时直接展示本地已下载模型(标注「本地下载
(本地下载)」),可在此选用;Apple 语音显示零模型选择说明
- i18n:新增 19 个 key(5 语言)
* style(settings): 输入框/下拉底色统一 + 提供商下拉去 inputStyle + 检查更新按钮动画
- inputStyle 底色 surface-2 → select-trigger-bg:所有输入框(提供商凭据、
数据存储数字框等)与 SelectLite 下拉(麦克风/胶囊样式)颜色统一
- ProvidersSection 5 处 SelectLite 去掉 inputStyle,改 SelectLite 默认触发器
样式;LLM/ASR 供应商下拉固定 200 宽与麦克风对齐(用户反馈颜色与大小问题)
- CheckUpdateButton:状态图标颜色过渡 + 文案切换淡入动画(ol-select-value-in)
* fix(settings): 弹框 portal 到 body 修复定位/变灰 bug + 本地 ASR 逻辑重构
- DownloadDialog 全页式重设计:createPortal 到 document.body(WindowChrome
的常驻 transform/will-change 会创建 containing block,导致 fixed 弹框相对
设置面板定位、被裁剪且点不到),尺寸与设置弹窗一致、顶部锚定、左侧模型
选择 + 右上角 ✕ 关闭;GlobalDownloadProgress / UpdateDialog 同步 portal,
修复「弹框弹出时设置内容变灰、断层感」的同类 bug
- 本地 ASR 逻辑:删除 Qwen3/Foundry/Sherpa 启用开关与确认 modal——本地引擎
始终可用,激活 = 在 ASR 语音转写选择本地模型供应商(保留「实验性」标记);
供应商下拉直接列出本地引擎(标注「本地」)
- 删除「使用 Apple 语音」卡片:选中 apple-speech 供应商即等于使用
- 镜像源 / 模型存储位置 / 内存引擎收纳进「下载与存储设置」Collapsible(默认收起)
- 模型操作按钮:去掉「设为默认」,保留「加载并测试」(加载即激活为当前模型),
打开目录 + 删除同一行;修复本地模型选项标签「本地下载(本地下载)」文案 bug
- ASR 板块供应商切换时 keyed ol-tab-fade 动画
* fix(asr): sherpa/foundry 分派显式传 alias + 本地模型下拉受控 value
- dispatchEntryAction 的 setTimeout 闭包读的是当前 render 的 selected*Alias,
点非当前选中的模型会操作到上一个模型;四个 handler 改为接受 alias 参数并显式传递
- ProvidersSection 本地模型下拉 value 固定为第一个已下载模型,选择不生效;
新增 selectedLocalModelId 受控状态,随后端 active 模型与已下载列表联动
* fix(asr): 删除当前选中模型后回落选择 + Foundry 下载改顺序执行
- useLayoutEffect 只在 selectedModelId 仍存在于条目列表时提前返回,删除选中
模型后自动落到第一个已下载模型(pr-agent #922)
- Foundry 侧栏「下载」由并行 enable+prepare 改为 handleEnableAndPrepareFoundry
顺序执行:消除 foundryBusy 竞态与 syncFoundryPrefs(true/false) 冲突
---------
Co-authored-by: sim <sim@local>
2026-08-05 17:46:13 +08:00
TRIP and sim
c0e2213840
[cask] openless 1.3.16 (auto from release) [skip ci] ( #921 )
...
Co-authored-by: sim <sim@local>
2026-08-05 16:22:50 +08:00
TRIP and Chris233
d31bf5bbb7
fix(asr): 过滤 GLM-ASR 偶发的纯井号占位转写(#787) ( #916 ) ( #920 )
...
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-05 15:32:30 +08:00
TRIP and sim
b83b566cb4
chore(release): prepare 1.3.16(正式版版本号) ( #919 )
...
1.3.16-Beta.1 → 1.3.16(package.json / package-lock.json / tauri.conf.json /
Cargo.toml [package] / Cargo.lock openless 块;手工编辑,bump-version.sh 不支持
-Beta.N 后缀,keyring 依赖 3.6.3 已锚定 section 未被误改)
Co-authored-by: sim <sim@local>
2026-08-05 15:17:51 +08:00
Chris233
5f9586f739
feat(asr): 接入 ZenMux 语音转写(JSON + base64)作为可选云端 ASR(#837) ( #915 )
...
* feat(asr): 接入 ZenMux 语音转写(JSON + base64)作为可选云端 ASR(#837)
- WhisperBatchASR 新增 ZenMuxJson 请求格式:application/json + base64
input_audio,language 跟随工作语言(ISO 639-1 映射),enable_itn 可配置
- 新增 zenmux 命名预设:默认 https://zenmux.ai/api/v1 + qwen/qwen3-asr-flash,
复用 Whisper 兼容路由与 30s 分片;模型 slug 自由输入
- 设置页新增 enable_itn 开关(per-provider 高级配置,默认开启)
- 补齐五语言 i18n、前端单测与 README
* fix(asr): ZenMux「测试连接」按 JSON 协议验证 + 词典不生效说明(#837)
- validate_asr_transcription 按 provider 真实请求格式发探针:OpenRouter /
ZenMux 走 JSON+base64,其余 whisper 兼容厂商走 multipart,避免假阴性
- 设置页对 zenmux 预设增加说明:JSON 协议不发送词典热词(prompt/hotwords),
词典仍进入润色链路但不参与识别偏置;README 同步标注例外
- coordinator 再导出 whisper_request_format 供验证路径复用
2026-08-04 23:37:09 +08:00
TRIP and sim
d31cafd2d8
chore(release): prepare 1.3.16-Beta.1 ( #913 )
...
版本号 1.3.15 → 1.3.16-Beta.1(package.json / package-lock.json /
tauri.conf.json / Cargo.toml [package] / Cargo.lock openless 块,手工编辑——
bump-version.sh 不支持 -Beta.N 后缀,keyring 依赖版本 3.6.3 已锚定 section
未被误改)
Co-authored-by: sim <sim@local>
2026-08-04 18:23:47 +08:00
TRIP and sim
1fd9b43da5
fix(capsule): 切换样式立即生效 + 设置动画/视觉统一(Windows 样式切换修复) ( #912 )
...
* fix(capsule): 切换样式立即生效——设置保存即同步样式原子 + prefs:changed 即时下发
修复 Windows/Linux 上「切到默认风格仍显示流光 Siri」:样式原子此前只靠
emit_capsule 主线程闭包 ~30Hz 同步,入场帧 payload 又是同步前克隆的旧值,
Windows 主线程拥塞时闭包延迟会让整场录音下发旧样式。现在 set_settings 保存
时直接同步原子,任何平台下次录音从入场帧起就携带最新样式;胶囊 webview 另
监听 prefs:changed 广播,录音中切换也当帧换肤,并重置胶囊瞬态(退出动画/
插入字数/操作态)
* feat(settings): 录音方式滑动指示 + 静音自动停止展开/收起动画 + 下拉视觉统一
- 录音方式分段选框改为滑动指示块(left/width 过渡),并修复首次进入设置时
因 prefs/platformCaps 异步加载时序导致的高亮块永不定位
- 「静音后自动停止」整组随录音方式切换从下方拉出/收回(grid 0fr→1fr),
不再突然跳出;秒数行随开关展开/收起,开关行不再因内联下拉抽搐
- 静音时长下拉改用 SelectLite 默认底色、固定 200 宽,与麦克风下拉同视觉、
右边缘对齐
- SelectLite 触发器选中值切换动画(ol-select-value-in)
- UpdateDialog 全屏遮罩 0.18→0.05:不再把设置页白色选项行盖成灰色
* test(types): capsuleStyle 配置持久化 roundtrip 单测(默认 Siri + camelCase wire 键)
* fix(settings): 折叠态静音自动停止控件 inert 防键盘误触 + 滑动指示块随重排重测
pr_agent #912 评审两项:
- 录音方式非切换式/开关关闭时,折叠容器内 Toggle 与秒数下拉仍在 tab 顺序
与 a11y 树里,键盘用户可 Tab 到不可见控件 —— 收起时加 inert + aria-hidden
(与 Collapsible 同款方案)
- 语言切换/窗口缩放导致按钮重排时滑动指示块停在旧位置 —— ResizeObserver
监听 track 尺寸变化兜底重测
---------
Co-authored-by: sim <sim@local>
2026-08-04 18:06:56 +08:00
Chris233
12de016c32
fix(settings): 热键冲突不再拒绝保存——升级迁移停用冲突默认键 + 保存自动化解(#904) ( #907 )
...
* fix(settings): 热键冲突不再拒绝保存——升级迁移停用冲突默认键 + 保存自动化解(#904)
#904:1.3.15 新增的选区润色默认键(Windows=右 Alt)在旧配置升级时被
无条件注入。若用户录音键恰为右 Alt,则偏好文件出现持久冲突,之后任何
set_settings(含切「自动」录音方式)都被 reject_hotkey_collisions 整体
拒绝,前端又静默吞错——表现为界面显示已切换、重启后回退按住说话。
修复:
- types.rs:旧文件升级时若默认注入的选区润色键与录音键相同,改为停用
新功能而非写入冲突值;
- commands/settings.rs:保存兜底 reconcile_hotkey_collisions——热键
冲突/非法不再拒绝整份保存,按核心度自动恢复旧值或停用冲突的非核心键
(录音键永不参与调整),其余设置照常落盘并写日志;
- HotkeySettingsContext.tsx:保存失败回滚乐观状态并弹出失败提示,杜绝
「假保存」;
- 回归测试:升级迁移停用冲突键、历史冲突下切模式仍可保存、非核心键
重叠/非法自动化解;4 个旧「保存被拒」测试同步改为新兜底语义。
验证:新增测试全过;cargo test --lib 924 通过、2 失败均与改动前基线
一致(cooldown 时序抖动 + Windows 符号链接权限环境测试);前端
tsc --noEmit 与 frontend-test-runner 全过。
* fix(settings): 升级迁移按重叠判定停用冲突的选区润色默认键(#904)
2026-08-04 17:02:24 +08:00
TRIP
d0e190f20c
Merge pull request #911 from Open-Less/docs/readme-sponsor-cleanup
...
docs(readme): remove jiangmuran and Cooper, sync latest stable data
2026-08-04 15:54:22 +08:00
sim
e46e94995c
docs(readme): remove jiangmuran and Cooper, sync latest stable data
2026-08-04 15:53:57 +08:00
Chris233
cb07c205b0
feat(dictation): Toggle 模式支持「静音后自动停止」(开关默认关闭)(#860) ( #903 )
2026-08-04 12:21:43 +08:00
Chris233
b54101828d
feat(asr): 新增「自定义 OpenAI 兼容」ASR 预设与高级参数(#854) ( #898 )
...
* feat(asr): 新增「自定义 OpenAI 兼容」ASR 预设与高级参数(#854)
新增 openai-compatible 预设,可把 ASR 指向任意 OpenAI 兼容 /audio/transcriptions 端点(自建 / LAN llama.cpp 等),默认行为最保守(multipart、不发 response_format、不分片)。verbose_json 与分片时长按 provider 存于凭据 vault(asr.advanced_config),在设置页提供高级选项;命名厂商预设行为保持不变。附带后端解析/门控与前端解析纯函数单测。
* fix(asr): openai-compatible 分片时长解析对齐前端并补齐必填字段门禁(#854)
2026-08-04 00:39:35 +08:00
Chris233
5534526d5f
feat(net): 支持手动开关系统代理(#869) ( #897 )
...
- UserPreferences 新增 useSystemProxy(默认开启,零行为变化),旧配置 serde 兼容
- net.rs 全局原子开关 + 清空客户端缓存即时生效;关闭后所有 reqwest 请求直连
- 接入 LLM/ASR/下载/更新/市场等全部请求路径;回环地址恒绕过
- 前端「服务 → 网络」新增开关,桌面/移动共用,i18n ×5
2026-08-03 22:38:56 +08:00
TRIP and sim
856db1473a
[cask] openless 1.3.15 (auto from release) [skip ci] ( #899 )
...
Co-authored-by: sim <sim@local>
2026-08-03 22:36:49 +08:00
Chris233
3c21d28efe
fix(mic): 无麦克风时明确提示“未检测到麦克风”,不再误报权限未授权(#779) ( #896 )
2026-08-03 22:10:41 +08:00
Chris233
5be28b1dbd
feat(asr): 支持讯飞实时语音转写(RTASR)提供商(#842) ( #894 )
...
- 新增 asr/xfyun.rs RTASR 流式客户端:signa = Base64(HmacSHA1(MD5(appid+ts), apiKey))
鉴权,1280B/40ms 分块发送,{"end": true} 收尾,seg_id 去重拼接,断连 partial 兜底,
鉴权/限流/超时错误分类可读。
- 全链路接入:dictation 主流程、QA 面板、重新转录、取消、设置页凭据预检与
"验证"探活;凭据 xfyun.app_id / xfyun.api_key 存系统凭据库,不落日志。
- 设置页新增「讯飞实时语音转写」选项(AppID + API Key),5 种语言 i18n。
- 文档:docs/xfyun-asr.md + README/README.zh/USAGE 同步。
已知限制:标准版 RTASR 无请求级热词参数(在讯飞控制台配置),语种默认中文普通话。
2026-08-03 21:37:10 +08:00
TRIP and sim
a3d014b687
chore(release): prepare 1.3.15(正式版版本号)+ 修复 bump 脚本误改依赖版本 ( #893 )
...
* fix(scripts): bump-version.sh 锚定 [package] 段,避免误改依赖版本
* chore(release): prepare 1.3.15
---------
Co-authored-by: sim <sim@local>
2026-08-03 21:27:10 +08:00
Chris233
9bfec8aedd
fix(dictation): 转写中按热键改为静默丢弃,移除排队接力(#856) ( #891 )
...
- 删除「排队接力」grace 窗口(HOTKEY_QUEUE_GRACE_MS / is_queued_chain_press),
handle_pressed 的 Toggle/Auto 冷却检查恢复为纯 #545 拦截:识别中按下热键的
Pressed 在会话收尾后一律静默丢弃,不再放行开录下一条
- fail_dictation / 空转写收尾回 Idle 时补设冷却,失败/空结果场景排队按下同样丢弃
- 更新 session_cooldown_until 契约注释;新增回归测试 toggle_press_within_cooldown_is_dropped
2026-08-03 20:29:08 +08:00
f5fc5fd0c1
feat(android): expose advanced debug tools on mobile ( #890 )
...
* feat(android): expose advanced debug tools on mobile
Show Advanced debug tools on Android with mobile-friendly layout. Backend SAF log export already landed in #877 .
Co-authored-by: Cursor <cursoragent@cursor.com >
* fix(settings): 调试工具保留条数说明仅移动端展示,导出成功消息可换行并显示完整路径
---------
Co-authored-by: Cursor <cursoragent@cursor.com >
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-03 19:02:38 +08:00
Chris233
26cd012433
fix(llm): 官方 OpenAI gpt-5 系列不下发 temperature,修复验证 400(#857) ( #888 )
...
* fix(llm): omit temperature for OpenAI gpt-5 family (fixes #857 )
OpenAI 官方 gpt-5 系列在 Chat Completions 只接受默认 temperature=1,
传 0.3(内置默认)会被 400 拒绝,导致验证/润色全部失败。
官方渠道的 gpt-5* 不再下发 temperature,由服务端用默认值;
gpt-4 等其余模型保持原行为。custom 预设显式温度不受影响。
* fix(android): skip set_ignore_cursor_events on Android capsule path
Android 胶囊走原生 overlay,tauri::WebviewWindow 无
set_ignore_cursor_events(桌面专用),导致 Android cargo check
编译失败(E0599)。cfg 门控跳过,触摸交互由系统处理。
2026-08-03 16:21:14 +08:00
TRIP and sim
73e65a4077
chore(release): prepare 1.3.15-Beta.4 ( #889 )
...
Co-authored-by: sim <sim@local>
2026-08-03 16:05:44 +08:00
cd48a037a4
fix(less-computer): restore OpenCode model discovery and execution ( #840 )
...
* fix(less-computer): restore OpenCode model execution
* fix(capsule): gate set_ignore_cursor_events behind #[cfg(not(mobile))]
#887 introduced desktop-only capsule cursor-passthrough logic into the
unconditionally-compiled capsule_focus module, breaking Android cargo check
(E0599: no method set_ignore_cursor_events on tauri::WebviewWindow). Gate the
block to desktop; variables it consumes (classic_style, selection_polish,
visible) are still used on mobile outside the block.
---------
Co-authored-by: sim <sim@local>
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-03 16:03:41 +08:00
leaion and leaion
0063497c6e
fix(linux): fcitx5 plugin crash on empty triggerKeyList with raw hotkey ( #883 )
...
When the raw hotkey path (SetHotkeyRaw) matches and triggerRawStates==0,
the code unconditionally indexes triggerKeyList_[0]. With an empty
KeyList (common in raw mode), this is undefined behavior and segfaults
fcitx5 on every hotkey press. Only access the list when the KeyList
path matched; use raw values for the raw path.
Co-authored-by: leaion <leaion@sohu.com >
2026-08-03 14:54:30 +08:00
TRIP and sim
006cb78a93
feat(capsule): 录音胶囊样式可选(流光 Siri / Openless 默认)+ 修复 beta 构建破坏 ( #887 )
...
* feat(capsule): 录音胶囊样式可选——流光 Siri 风格 / Openless 默认风格
设置 → 录音与输入新增「胶囊样式」下拉(保留显示开关):
- UserPreferences.capsule_style('siri' 默认 / 'classic')随 capsule:state
payload 下发,切换后下一次录音即生效
- Capsule.tsx 双样式分支:siri 保留 SiriGL 光效舞台;classic 恢复 1.3.14
经典毛玻璃药丸(音量条 + 取消/确认按钮 + thinking 扫光 + 翻译徽章),
取消/确认改走 lib/ipc/dictation.ts,退出动画时长按样式区分
- 预览支持 ?style=classic;i18n 五语言新增胶囊样式文案
* fix(settings): 选区润色行适配重构后的 ShortcutRecorder props
beta HEAD 在快捷键录入交互重构(e12c8dcc)合并后遗留的构建破坏:
SelectionPolishSection 仍传已删除的 alignRecordButton / modifierPresets,
tsc 直接报错。改为新 API(value 可空 + onReset 恢复默认快捷键,
等价于旧「启用」按钮),恢复 beta 可构建状态。
* fix(capsule): 评审修复——经典药丸按钮可点 + 音频线程零偏好锁
- 经典样式(Openless 默认)下胶囊窗口长期 set_ignore_cursor_events(true)
(纯光效舞台时代遗留),✕/✓ 按钮实际不可点。现在主线程闭包按
「classic && visible && 非选区润色 && 录音/转写/润色中」关闭鼠标穿透,
终态 toast / 隐藏 / Siri / 选区润色保持穿透;值不变时不重复调用
set_ignore_cursor_events
- emit_capsule 在音频回调线程 ~30Hz 被调,原先直接读 prefs(整份克隆 +
偏好锁被 set() 跨磁盘 I/O 持有)。改为 Inner 上 AtomicU8 样式缓存,
主线程闭包每帧从 prefs 同步(与 show_capsule 同源读取),音频线程零开销
- 恢复「录音胶囊」行的 desc 文案(beta 原有,重构时被误删)
- Capsule.tsx 退出动画注释同步为按样式区分的常量名
* docs(capsule): 注明入场帧 payload 可能滞后一帧样式(防误改回音频线程读 prefs)
---------
Co-authored-by: sim <sim@local>
2026-08-03 14:17:52 +08:00
Shuo Zhang and Chris233
8a2febf59d
feat(windows): add selected-text polish workflow ( #851 )
...
* feat(selection-polish): add configurable selected-text workflow
* fix(mobile): 选区润色工作流仅桌面编译——修复 Android cargo check
PR #851 新增的 coordinator/selection_polish 模块无条件编译,但 selection
模块在 mobile 走 mobile_stubs/selection.rs stub,缺少 SelectionInsertionTarget
等桌面 API,导致 CI 的 Android cargo check 失败(E0432/E0425)。
选区润色是桌面(Windows-first)工作流,mobile 不注册全局热键、不做跨应用
替换。将相关代码统一加 #[cfg(not(mobile))] 门控:
- coordinator.rs: selection_polish 模块、Inner 字段、热键绑定方法
- hotkey_loops.rs: 选区润色热键 supervisor/bridge 函数与事件分支
- mobile_stubs/hotkey.rs: 移除桌面专属事件变体
- commands: set_selection_polish_hotkey 与 SettingsWriter 实现
本地验证:cargo check (Windows) 与 cargo check --target
aarch64-linux-android 均通过。
* chore: 剥离无关格式化改动与本地开发产物
按 review 反馈清理 PR diff 噪音,不改变任何行为:
- .gitignore: 移除作者本机诊断产物(/.codegraph/、/artifacts/、/baseline-*.log、
/cargo-*.log、/docs/notes/、+/),恢复 beta 原样
- package.json / scripts/tauri-dev-visible.mjs: 移除开发验收专用 npm script 与脚本
- 恢复被重排的既有代码格式(import 分组、match arm、函数签名、空行、
测试断言排版、serde 属性、mod 声明顺序等),仅保留功能改动
本地验证:cargo check (Windows) 与 --target aarch64-linux-android 通过,
cargo test --lib 885 passed(1 个环境相关的符号链接权限测试除外)。
* chore: 修正选区润色默认键注释与 dev 注入缩进
- types.rs: selection_polish_hotkey 注释从「默认右 Control」改为实际默认
Right Alt(与 default_selection_polish_hotkey 及前端保持一致)
- coordinator.rs: inject_hotkey_click_for_dev 修正 beta 遗留的多余缩进
* fix(selection-polish): 非 Windows 平台 fail-closed 禁用选区润色
macOS/Linux 尚未实现等效的前台窗口/焦点控件校验,无法保证云端等待
期间结果不会落到用户切换后的应用或控件上。此前非 Windows 分支的
selection_insertion_target_is_captured 直接返回 true,用户一旦在 macOS
手动启用该功能,会执行无校验替换,与「安全替换」的承诺相悖。
- selection.rs: 非 Windows 一律返回 false,阻止选区文本发给 provider
- SelectionPolishSection: 设置入口仅 Windows 显示(macOS/Linux 隐藏)
* refactor(style-pack): 移除过渡版本字符串启发式迁移
is_non_asr_selection_prompt / is_asr_style_prompt / is_generic_selection_prompt
是为从未合入 beta 的中间构建写的字符串匹配恢复逻辑('short-lived
pre-separation build'),属于 YAGNI 违反且匹配脆弱。删除恢复逻辑与
三个 helper,保留 v1 风格包 selection_prompt 为空的默认值填充;
对应测试同步为 migration_fills_empty_selection_prompts_with_style_defaults。
* feat(i18n): 选区润色 UI 文案国际化(5 语言)
新增 settings.selectionPolish / style.pack.selection* / capsule.selectionPolish /
selectionPolishPreview 四组 key,覆盖 en/ja/ko/zh-CN/zh-TW。SelectionPolishSection、
SelectionPolishPreview、Capsule 提示、Style 工作流切换等 UI 文案全部改用 t(),
消除新组件与项目其余部分的 i18n 混用。风格包模板默认值(数据)保留中文。
* fix(style): 恢复内置风格包编辑禁用(与 beta 行为一致)
PR 原改动把内置包的编辑按钮从禁用改为可编辑(行为变更未在描述中声明)。
按接手 review 意见恢复 beta 原样:内置包仅可查看/重置,不进入编辑器。
* fix(i18n): 补齐 Style 编辑器提示与「当前」徽章国际化
审查发现的收尾问题(子代理复核):
- 内联编辑器提示改用已存在的 selectionPromptHint / dictationPromptHint
- 编辑器头部改用独立 dictationPromptEditorDesc / selectionPromptEditorDesc
(保留「当前编辑…输入对象是…」原意,避免与内联提示同屏重复)
- 风格卡片「当前」徽章改用 style.pack.current
- ja: selectionPromptHint 语感修正(ASRは通らず → ASRは経由せず)
---------
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-03 13:37:41 +08:00
sim
dd90c13ae3
chore(release): prepare 1.3.15-Beta.3
2026-08-03 12:36:02 +08:00
sim
e6d3779e5d
fix(style-pack): 对账机制收窄为仅推进 prompt/version,补单元测试
...
- reconcile 不再整包替换:只推进官方 prompt 与 version,用户的名称/描述/示例/
tags/enabled 全部保留(审核意见)
- pack_version_newer 正确处理 pre-release 后缀(-beta 视为与正式版同级)
- 补 3 个单测:版本比较 / prompt-only 推进保留用户字段 / 等版本跳过 + 缺失补入
- 默认包 fallback(get_or_default_active)改为优先清晰结构;更新过期注释
2026-08-03 12:06:15 +08:00
sim
65d7438a77
feat(style-pack): 内置包版本对账机制——提示词升级随 app 更新推向所有用户
...
- load 时对内置包做版本对账:代码内置包 version 更高则用官方副本覆盖本地
(保留用户 enabled 设置),本地缺失的内置包自动补入
- 老用户的「清晰结构」包在升级后自动拿到 v3.0 Beta 提示词,无需手动重置
2026-08-03 12:06:15 +08:00
sim
23bfc4f1e5
feat(style-pack): 清晰结构 v3.0 Beta 提示词上线——人格化「语修」角色 + 场景优先级分型
...
- STRUCTURED_BUILTIN_PROMPT 替换为 Beta 版:语修人格(性格/身体/习惯/梦想/职责/能力/规则)
+ 场景优先级分型(操作指引/编程任务/模型资讯)+ ASR 术语纠错词表 + 反 AI 自述式表达约束
- 内置包版本 2.0.0 → 3.0.0;默认风格包由 light 改为 structured(与 UI 层一致)
- 同步 TS mock 的 structured prompt;polish 契约测试更新为新 Beta 锚点
2026-08-03 12:06:15 +08:00
sim
3244df1957
chore(i18n): 快捷键录入 / 本地模型 / 模型预设新增文案(zh-CN/en/ja/ko/zh-TW)
...
- 快捷键:comboResetBtn / comboMenuToggle / comboDisableHint
- 本地模型:sherpaModelWhisperLargeV3(+Desc)、modelSelect*、groupDownload/Other
- 模型预设:customModelLabel / presetListLabel
2026-08-03 11:15:30 +08:00
sim
9e3d017da4
feat(local-asr): 本地模型三板块重构 + 下拉选择 + Whisper Large V3
...
- 新增「模型选择」板块:SelectLite 下拉直接选用已下载模型(选择即激活)
- 板块重排:模型选择 / 下载与管理 / 其他(存储位置、Apple 语音)
- 新增 sherpa-onnx Whisper Large V3 多语模型(Rust 下载配置 + TS 目录 + mock)
- 同步 static_catalog_preserves_ui_order 期望列表
2026-08-03 11:15:30 +08:00
sim
d679c320b8
feat(asr-models): 云端 ASR 模型预设下拉——加入千问 qwen3-asr-flash 系列
...
- 百炼:qwen3-asr-flash(-realtime)、fun-asr 系列新版本、paraformer 预设
(filetrans 官方只接受公网 URL、后端显式拒绝,不放预设)
- Whisper 兼容厂商(whisper/groq/siliconflow/openrouter):通用预设下拉
- CredentialField 支持 options 下拉,含「自定义模型…」逃生口(切回输入框),
与既有 unifiedBailian 协议提示/onValueChange 机制融合
2026-08-03 11:15:30 +08:00
sim
a55ec3e330
refactor(coding-agent): Less Computer 后端/权限模式/模型选择改用官方 SelectLite
...
统一三平台下拉观感,替换原生 <select>(issue #418 同类问题);模型下拉保留
「默认」选项,可选回 CLI 默认模型
2026-08-03 11:15:30 +08:00
sim
c4290071b0
fix(update-button): 检查更新按钮旋转方向与尺寸稳定
...
- ol-spin 改为逆时针,与 refresh(ccw)图标方向一致
- 按钮固定宽度 + 内容居中;图标固定 14x14 容器,check/refresh 切换与旋转时不再跳动
2026-08-03 11:15:30 +08:00
sim
e12c8dcc20
feat(hotkey-recorder): 快捷键录入交互重构——主行按钮移除、箭头右对齐、动画优化
...
- 未展开主行只留键帽 + 下拉箭头,录入入口统一在展开菜单里(录制快捷键/重置/停用)
- 箭头恒靠最右;菜单展开/收起高度改为固定值动画,多次切换不再卡顿
- ShortcutRecorder 支持 value=null(问答/切风格/唤起 App 未启用时直接录入即启用)
- 菜单支持 Esc / 点击外部收起;滑动方向统一向右
- 新增 defaultDictationHotkey()(RightControl,与 mock/Rust 默认一致)
2026-08-03 11:15:30 +08:00
bigsong and Claude Fable 5
e484cd11cf
fix(less-computer): 「hotkey disabled」只在状态翻转时打一次——日志不再被它刷爆 ( #873 )
...
coding_agent_hotkey_supervisor_loop 每 5s 轮询一次绑定。没配 Less Computer
语音键的用户,每一轮都会落到同一条禁用分支并无条件打一行
「[less-computer] hotkey disabled」,稳定产出 720 行/小时。
实测一份连续跑了六天的 openless.log 里,这一行占了全部日志的 95% 以上
(132416 行中约 12.7 万行),文件涨到 11MB:真正有用的会话/错误日志被冲得
很难翻,日志轮转也被它提前触发,把更早的历史挤掉——排查线上问题时相当致命。
讽刺的是它刷得最凶的恰恰是没在用这个功能的人:一旦配上语音键,函数会走到
安装分支,反而一行都不打。
改成只在状态真正翻转成「禁用」时打一次,重新装上语音键时清掉标志位,
下次禁用仍会再打。禁用/启用的行为本身完全不变,只动日志。
Co-authored-by: Claude Fable 5 <noreply@anthropic.com >
2026-08-02 20:56:44 +08:00
浩彬(^-^)
2409036ca9
fix(android): use app cache for Marketplace installs ( #879 )
2026-08-02 20:22:22 +08:00
浩彬(^-^) and Cursor
7ad24d3e94
fix(android): persist prefs/logs under app filesDir ( #877 )
...
* fix(android): use app filesDir for persistence and SAF log export
Honor devices reject writes under /data/local/tmp, which caused PreferencesStore to fall back to openless_prefs_fallback.json and settings saves to fail. Initialize JNI storage roots before Coordinator and file logging, route logs to files/logs/openless.log, and export via ContentResolver for SAF content:// URIs.
* fix(android): guard StylePack empty asset_root and Android-only coord logs
Reject persisting style pack icons when asset_root is empty to avoid writing under cwd; no-op cleanup on empty root. Limit Coordinator persistence degrade log suffix to Android only. Add unit test.
Co-authored-by: Cursor <cursoragent@cursor.com >
---------
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-02 20:04:18 +08:00
浩彬(^-^) and Cursor
761e6c5c80
fix(android): sync mobile style group nav with desktop sidebar ( #864 )
...
Expose polish mode and marketplace via a bottom-sheet under the Style tab, matching desktop NAV_TREE grouping for issue #862 .
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-02 19:30:01 +08:00
Chris233
cfd99be1a9
fix(windows): 主窗口改为不透明——消除录音时 DWM/GPU 饱和导致的系统卡顿 ( #882 )
...
主窗口 transparent:true 使 WebView2 内容整页走 per-pixel alpha 分层合成,
但 UI 所有大面积层(winchrome/shell/sidebar/内容区)都是不透明背景,
Mica 磨砂实际被完全盖住,透明是纯 GPU 成本零视觉收益。
录音期间叠加胶囊 60fps WebGL + 30Hz 事件,DWM 被拖到饱和时:
- 其他软件合成帧送不出去 → 全局无响应
- 任务栏右键触发缩略图/重合成 → GPU 飙升
新增 tauri.windows.conf.json 平台覆盖(json_patch 数组整体替换,
必须完整列出窗口),main 窗口 transparent:false,capsule 保留透明。
macOS/Linux 不受影响。参考 tauri.linux.conf.json 既有先例。
2026-08-02 19:08:53 +08:00
浩彬(^-^) and Cursor
c498746599
fix(android): hide overview activity heatmap on mobile layout ( #863 )
...
Skip getActivityStats IPC and ActivityHeatmapCard when useMobileLayout()
is true so narrow screens avoid horizontal overflow and unnecessary work.
Closes #861
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-08-02 19:05:44 +08:00
8f49971874
feat(asr): support additional Bailian speech models ( #866 )
...
* feat(asr): support more Bailian speech models
* test(asr): cover final 8k downsample phase
* fix(asr): address review findings on Bailian model routing (#866 )
- route paraformer-8k-realtime / sensevoice-8k-realtime to classic WebSocket,
matching the 8k downsample naming space in bailian.rs
- downsample 16k->8k with pairwise averaging (first-order low-pass) instead of
pure decimation to reduce aliasing; drop the lone tail sample on flush
- cap async provider validation at 120s (60s poll) instead of 660s so the
validate button cannot block for nearly 11 minutes
- join async transcript segments with a space so latin-script words do not
get glued together
* fix(asr): drop qwen3-asr-flash-filetrans and harden async polling (#866 )
- qwen3-asr-flash-filetrans only accepts public URLs per DashScope docs; it
is incompatible with the local-recording temporary OSS + oss:// path, so
reject it in protocol_for_model / routing / picker / docs instead of
shipping a model that would silently fail on real recordings
- simplify async_transcription_body / extract_async_result_url to the
single fun-asr results shape
- add bounded retry (exponential backoff, deadline-capped) to async task
polling and result download so one transient network blip does not
discard an entire recording
* docs(asr): list qwen-audio-3.0-asr-flash as a synchronous model (#866 )
Merge with beta #876 brought qwen-audio-3.0-asr-flash into the model
picker and protocol routing; keep the model reference doc in sync and
note that -streaming variants are not supported.
---------
Co-authored-by: LauraGPT <lauragpt@users.noreply.github.com >
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-02 18:55:03 +08:00
Murphy
10ff058626
feat(asr): support qwen audio batch transcription ( #876 )
2026-08-02 11:53:53 +08:00
bigsong and Claude Fable 5
f0ffa8a873
fix(capsule): 入场帧强制重注册 Space 贴附——胶囊不再被 macOS 26 钉死在单个桌面 ( #875 )
...
实测(2026-07-31):macOS 26 会在运行中把胶囊窗口从「全 Space 贴附」剥离,
之后它表现为普通受管窗口:只在某一个桌面可见,其它桌面上听写全程无任何
UI 指示(后端 30Hz orderFrontRegardless 全部无效,窗口 onscreen=0,最长观测
到 78 秒无提示录音)。用户侧症状即「微信里不弹胶囊、Claude 里又有」——
实际按桌面分,不按 App 分。
CGS 取证 + 体外复现(CGSRemoveWindowsFromSpaces 人工制造同款坏状态)跑遍
四种救法,结论:
· 重写同值 273:无效(AppKit 同值写入是 no-op,这正是坏状态救不回的原因)
· 隐藏时翻转 0→273 再显示:无效(隐藏期间的值变化不触发重注册)
· 同一 tick 连写 0、273:无效(被合并)
· 窗口可见时发生 CanJoinAllSpaces 位 0→1 的转变:有效,完整恢复贴附
· 跨显示器移动:有效(与野外观察到的「外接屏上意外自愈」一致)
修法:入场帧(隐藏→可见)先以 272(保留 Stationary|FullScreenAuxiliary,仅去
CanJoinAllSpaces 位)上屏,30ms 后的下一个主线程 tick 写回 273——可见状态下
的位翻转强制 WindowServer 重新注册贴附。30Hz level 帧不参与。写前读当前值,
发现漂移打 warn 留证据。glow 窗口同款写法一并加固。
Co-authored-by: Claude Fable 5 <noreply@anthropic.com >
2026-08-02 11:53:17 +08:00
bigsong and Claude Fable 5
95edf8943b
fix(capsule): 润色/插入失败改走 error 态——失败提示不再被前端丢掉 ( #874 )
...
胶囊只在 error 态渲染 message,done 态按设计是「冻结光效淡出、不带文字」
(Capsule.tsx 的 VoiceOrbStage:`state === 'error' && <span>{message}</span>`)。
但 end_session 无论成败都发 CapsuleState::Done。于是 default_done_message
辛辛苦苦拼出来的失败文案,全部在前端被丢弃——算了、传了、不显示。
最典型的受害者是润色失败。它会静默回退成未润色的原文,而胶囊照常显示成功态,
界面上没有任何痕迹。实测后果:LLM 凭证失效后连着十几个小时每一句都在拿原文,
用户只能靠「今天出来的字怎么变笨了」察觉,而日志里其实每一句都 ERROR 了。
default_done_message 的注释写着「polish 失败优先告知用户」——意图是对的,
只是这句话从来没能显示出来。
改成按结果选状态:润色失败 / 插入失败 / TSF 未上屏走 error 态,成功仍走 done。
文案生成逻辑一行没动,只改用哪个状态发出去。
Co-authored-by: Claude Fable 5 <noreply@anthropic.com >
2026-08-02 11:53:01 +08:00
LeiYang and Chris233
83c4f7f4e9
feat(asr): 火山引擎 ASR 新增方舟 API Key 鉴权模式 ( #867 )
...
* feat(asr): add Ark API Key auth mode for Volcengine ASR
* refactor(asr): isolate Ark API Key slot and harden auth-mode handling
Review fixes for #867 :
- P2-1: store Ark API Key in a dedicated volcengine.api_key slot so the
two auth modes never pollute each other's credentials
- P2-2: unify per-mode credential validation in
VolcengineAuthMode::auth_ok (single trim semantics across open_session /
overview configured status / dictation preflight)
- P2-3: await auth-mode persistence on switch, roll back with a failure
toast when the write fails
- P2-4: add unit tests for endpoint/header selection per mode and
per-mode credential validation
---------
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-02 00:58:46 +08:00