Chris233
7655dcc7fa
feat(pipeline): 多模态识别管线(实验性),传统/多模态模式与 omni 凭据隔离 ( #902 ) ( #924 )
...
* feat(pipeline): 多模态识别管线(实验性),传统/多模态模式与 omni 凭据隔离 (#902 )
新增实验性「多模态识别管线」:高级设置开启后,服务页出现传统/多模态模式切换。多模态模式用单个模型(OpenAI 兼容 input_audio 或 Gemini 原生 generateContent)一步完成「提示词 + 音频 → 最终文本」,覆盖主听写、划词问答(OpenAI 兼容流式 / Gemini 一次性)、选区润色(omni 当纯文本 LLM)、Less Computer 转写。两套配置在凭据库中完全隔离(新增 omni 命名空间),切换不删数据、不回退传统配置。
* fix(merge): 修正多模态路径对 beta API 的适配(translation_active/bump/front_app)与 ElevenLabs 重复分支
2026-08-06 19:15:54 +08:00
TRIP and sim
b62e2324c5
feat(selection-polish): macOS 移植——前台应用+选区文本指纹校验与默认热键 ( #926 )
...
- selection.rs:SelectionInsertionTarget 增加 macos 字段(前台应用名 + pid);
capture/is_captured/validate/reactivate 四函数实现 macOS 分支:
* validate = 前台应用一致性 + 选区重读(AX 直读,失败退化为模拟 Cmd+C)比较
* reactivate = NSRunningApplication activateWithOptions 交还焦点
- types.rs:macOS 默认选中润色热键 = RightAlt(右 Option,CGEventTap keycode
61 可区分左右,不占用 Cmd/Ctrl 常用组合),与 Windows 保持一致
- capabilities:selection-polish-preview 窗口加入默认能力列表(预览窗事件
listen 之前会被 ACL 拒绝)
- SelectionPolishSection:设置入口去掉 os==='win' 门控,macOS 可见
- 单测:selection_text_matches 随 cfg 扩展在 macOS 编译,940 pass
Co-authored-by: sim <sim@local>
2026-08-06 05:08:58 +08:00
TRIP and sim
df1a42c3a9
fix(local-asr): 下载进度全局浮层 + 事件节流 + 取消清理 + 看板过滤 + 3s 文件监测 ( #925 )
...
- 进度浮层全局化:新 GlobalDownloadProgress 自监听三引擎下载事件,挂 App 根,
主窗口所有页面常驻显示;含取消按钮(按引擎分派 cancel 命令)
- Rust 进度事件 ≥150ms 节流(qwen3/sherpa/foundry),修进度条高频抽搐
- 取消下载清理 .partial/.partial.idx(sparse 预分配全长,1.7B 模型残留巨大),
新增 remove_partial_artifacts 单测
- 看板只列已下载/下载中的模型(下载弹窗保留全目录列表),条目行距加大
- 3s 轮询磁盘状态 + 选中瞬间校验 + 下载事件驱动刷新;fetchAll 按平台分支
(macOS 上 sherpa/foundry catalog 命令未注册导致 Promise.all 整体失败)
- 同 provider 切换模型走轻量路径 + 乐观 draft 值,修下拉闪回旧模型
Co-authored-by: sim <sim@local>
2026-08-06 03:52:05 +08:00
cd33c89089
feat(history): 记录插入目标应用;详情页支持重试与换风格重新润色;条目显示真实风格包名 ( #910 )
...
* feat(history): 记录听写落到了哪个应用
历史详情页的「插入」行早就会渲染 app_name(History.tsx),但听写写历史时这个
字段写死 None —— 实测本机 200 条历史全部 appName=null,那一行永远只有字数,
看不出这段话落到了哪个 app。
前台应用其实 begin_session 就采过(capture_frontmost_app,日志里能看到
`front_app captured: Claude (com.anthropic.claudefordesktop)`),只是一直
只喂给 polish prompt,没写进历史。补上写入即可,前端不用改。
顺带把成功、空转写、转录失败三条路径都补上:排查「在某个 app 里总是识别不到」
时,这一列本身就是线索。
macOS 采到的是 `名称 (bundle id)` 的显示串,新增 `split_front_app_label` 拆成
两个字段落库,详情页只显示人读得懂的应用名,bundle id 进它自己的字段。划词润色
与语音问答两条路径此前把整串塞在 app_name 里,一并改走同一个拆分,避免同一个
列表里两种写法。
拆分对 Windows 的窗口标题要保守:只有括号内容形如反向域名(含点、无空格)才认
作 bundle id,「未命名文档 (未保存)」「Inbox (12)」这类标题保持原样不截断。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* refactor(history): 详情页把「识别 / 润色 / 插入」明细移到正文卡片之上
这三行是这条记录的元信息(走了哪个模型、各步多久、落到哪个 app),读的时候
应该先看到它、再读正文;放在两张长文本卡片之后,长内容一多就要滚到底才看得见。
纯挪位:块内容不变,分隔线从上缘(marginTop/borderTop)改到下缘
(marginBottom/borderBottom)。这也给下一步在正文卡片下方增加「重新润色」
区域腾出了位置。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* feat(history): 历史详情页支持重试与换风格重新润色
两个入口,一条后端通道:
- 「用原风格重试」:同样的原文用当前风格再跑一遍。用户说「AI 这次不太对」时,
真正想做的是这个对照实验 —— 判断上次结果是模型抖动还是稳定行为。
- 选风格 +「应用」:同一段话换个风格包看效果,结果作为新卡片出现在下方。
后端 `repolish` 命令本来就在(commands/dictation.rs),但写死用当前激活的风格包,
而且前端没有任何页面调它 —— 等于一条建好没接通的通道。这里给它加一个可选的
`style_pack_id`:省略 = 当前激活包(重试),给了 id = 用指定包试算一次。指定的包
不需要处于激活状态,也不会改变激活状态 —— 这只是一次性试算,不该有把用户当前
风格换掉的副作用。显式指定时按 id 精确取,不走 get_or_default_active 的兜底链:
静默回落到别的包会让结果无从解释。
结果只在本次查看时显示,不写回历史条目:历史的 finalText 是「当时真的插进去的
那段文字」,是一条事实记录,不该被事后试算覆盖。面板上的说明把这点直说了,结果
卡带复制按钮。切换到另一条记录时结果清空(key={item.id}),不会把上一条的结果
留在新条目下面。
范围说明:这里只重跑润色、不重跑识别。成功听写的录音在插入后就删了(隐私设计),
原文是唯一还留着的输入。真正的「重新转录」入口仍然只对留有录音的失败条目开放,
本次不动。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* fix(history): 流水线明细右列的耗时不再被从中间截断换行
「143 毫秒」会显示成「143 毫 / 秒」两行。原因是这一行用的是
`grid-template-columns: auto 1fr auto`:右侧 auto 列会缩到 min-content,
而中文可以在任意字符间断行,所以它的 min-content 只有一个字宽 —— 中间那个
贪心的 1fr 列就把它挤扁了。
三个右列(识别耗时 / 润色耗时 / 插入状态)都加 nowrap,min-content 变成整串
宽度。挤压转移到中间的 provider·model 列,那一列本来就带 overflowWrap:anywhere,
换行是它该做的事。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* fix(history): 重新润色超时时说人话,别把 "timeout" 原样甩给用户
后端的 LLMError::Timeout 过 IPC 边界后退化成裸字符串 "timeout",前端直接拼进
「重新润色失败:{err}」——用户看到的就是「重新润色失败:timeout」。这句话既没
说是谁超时了,也没说能怎么办,第一反应必然是「这个新功能坏了」。
实际原因通常是当前 LLM provider 30 秒内没回包。实测一次:某免费模型池
(openrouter free)13 次非流式请求里 6 次撞上 30s 客户端超时,成功的那 7 次
耗时从 2.3s 到 21.2s 不等。功能本身是通的,换个 provider 就好。
超时单独给一句能照着做的提示:说明是 provider 没响应、建议换更快的或稍后重试。
其余错误保持原样透传(那些通常是凭据/参数问题,原文更有诊断价值)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* feat(history): 历史条目显示实际风格包名,与重新润色面板对齐
历史列表和详情页的 Pill 一直显示 `session.mode`,那是风格包的 baseMode ——
四个内置分类之一。所有自建包都会落进这四个桶,所以用「超级豆包」口述出来的
记录,Pill 上写的是「轻度润色」,看不出到底是哪个包产出的。
同页的「重新润色」面板用的却是包名(下拉选项、结果标题都是 pack.name),
一页两套命名:下拉里选「超级豆包」,上面的 Pill 却写「轻度润色」。
改成优先用 session.stylePackId 查真实包名(该字段后端早就在写),内置包仍走
i18n 的 MODE_LABEL —— 内置包名在后端是硬编码中文,直接显示会在英/日/韩界面
串语言。旧历史没有 stylePackId、或包已被删除时回落到原来的模式名。
Pill 的 tone 仍按 baseMode 走,颜色保留原有的粗分类信息。
顺带两处修复:
- 风格包加载提到 History 顶层,与 RepolishPanel 共用。面板按 key={item.id}
重挂载,原先每切一条历史都要重发一次 list_style_packs。顶层存全部包(含已
禁用,历史可能出自后来被禁用的包),面板自己再 filter(enabled)。
- 长包名撑破布局:Pill 自带 nowrap + flexShrink: 0,会把同排的「复制」按钮挤
成文字竖排;grid 子项默认 min-width: auto,还会逼出横向滚动条。显示包名的
Pill 统一改成可收缩 + 省略号(全名挂 title),两个 grid 子项补 minWidth: 0。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* fix(history): 按审查意见修复重新润色与前台应用名记录
- 重试优先用原记录风格包(包已删除/旧历史回落当前激活包),结果标题显示真实包名
- split_front_app_label 增加平台开关:仅 macOS 拆分,Windows 窗口标题整串保留
- 重新润色面板排除 QA 记录
- 超时错误匹配收紧为整串形态,避免误判
* fix(history): 按 PR 910 审查意见修复重新润色面板与前台应用拆分
- 结果卡标题 Pill 截断 + minWidth:0,长包名不再撑破结果网格
- 下拉默认选中当前激活包(defaultPackId)
- 面板下拉与结果标题的内置包名统一走 i18n mode 名(packDisplayName)
- 重试回落显式落到当前激活包,结果标题与实际执行一致
- split_front_app 返回 FrontApp 结构体,6 个调用点同步更新
- repolish hint 补充回落说明(5 locale)
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com >
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-06 01:14:30 +08:00
cd58759c26
fix(translation): 翻译不会生效时不再进入翻译态(胶囊误报 + 空转 LLM) ( #908 )
...
* fix(translation): 翻译不会生效时不再进入翻译态
两个症状同源:`translation_modifier_seen` 的语义只是「按过 Shift」,
而「是否真的翻译」的判定散落在读取侧,胶囊那一侧漏了目标语言检查。
- 没在翻译页选目标语言,录音中按 Shift → 光标处显示「正在翻译」,
但 end_session 走的是普通润色,什么也没翻。
- 目标语言等于用户唯一的工作语言(例:工作语言只勾了简体中文、目标也选
简体中文)→ 源语言必定就是目标语言,仍会照常发起一次 LLM 翻译往返,
纯浪费时延和 token。
新增 `types::translation_effective` 作为唯一判定入口,并把判定收到写入侧
(`mark_translation_modifier_seen`):该函数每次按键才跑一次,读一次
prefs 无所谓;而读取侧之一是音频回调线程上的 emit_capsule,按帧执行,
不能碰偏好锁(capsule_focus.rs 既有注释已就此立过规矩)。收紧后 flag 的
语义变成「本次会话真的要翻译」,胶囊提示与 polish 分派读同一个真值。
工作语言有多个时不拦:中/英双语用户把目标设成英文是正常用法(说中文出
英文),源语言无法预先判定。简体/繁体是语言列表里两个独立条目,简→繁
仍照常翻译。安卓浮层的 start_dictation_with_translation 一并走同一个 gate。
「按了但不翻」的情况会记一条 INFO 说明原因,否则用户只看到胶囊没提示,
无从判断是没生效还是没按到。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* feat(translation): 目标语言与唯一工作语言相同时在翻译页给出提示
后端已经不会在这种组合下发起翻译(上一个 commit),但用户在设置页看不出
任何异常:状态灯仍写「已启用」,按 Shift 却什么也不会发生,只能靠翻日志
才知道为什么。
- 翻译目标语言卡片下方出现一条警示:说明这个组合不会生效,并给出两条
出路(换目标语言,或多勾一个工作语言)。
- 「已启用 / 未启用」状态灯改为同时看目标语言和这个冗余判定,不再谎报。
判定逻辑抽成 `lib/translationTarget.ts`,与后端 `translation_effective`
同一套规则(多工作语言不拦、简→繁不误判),两侧各带单测钉住契约。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* refactor(translation): translation_modifier_seen 更名 translation_active + 修正安卓 overlay 日志
* refactor(translation): 更名 arm_translation_if_effective 并简化冗余判定表达式
审查跟进(PR #908):mark_translation_active 的实际行为是「只在翻译会
生效时置位并返回是否置位」,名字却像无条件 setter,改为
arm_translation_if_effective 更诚实;translation_effective 里的
matches!([only] if ...) 改写为显式 len==1 + trim 相等(语义完全等价)。
行为零变化:translation_effective 6 个单测全过(backend-tests),
cargo check 全绿。
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com >
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-06 00:42:59 +08:00
27198b9b2f
feat(overview): 「近 7 天」脱离历史 200 条上限,并支持近 7/30 天 × 条数/字数/时长切换 ( #909 )
...
* feat(activity): 每日活动汇总记录字数与时长
activity.json 此前每天只存一个条数。概览页想给出「近 30 天说了多少字」
这类周期指标时,只能回头从 list_history() 现算 —— 而历史有 200 条硬上限,
日均上百次的用户两三天就把上周挤没了,算出来的字数与时长必然偏低。
把单日值从裸数字扩成 {count, chars, durationMs}:
- chars 口径 = 最终插入文本的 Unicode 字符数,与历史详情页的「N 字」一致;
- durationMs 口径 = 录音时长,不含识别/润色耗时,与详情页「录音 x.x 秒」同源。
两个口径都刻意跟已有 UI 对齐,避免同一个数在两处对不上。
磁盘格式用 untagged enum 兼容旧文件:老用户的 activity.json 全是裸数字,
读不回来的话年度热力图会一次性清空(会被当成数据丢失)。旧日期没有字数/
时长,读回 0 —— 诚实缺省,好过整天丢掉条数。四个单测钉住这个契约:纯旧
格式、纯新格式、新旧混排(升级当天必然出现)、以及缺字段的对象。
存储代价可忽略:只存聚合数字、不存文本,一天一行,两年上限 731 行。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* feat(overview): 「近 7 天」改为周期 × 指标可切换,并脱离历史 200 条上限
两件事,同一张卡:
1. 修数据源。「近 7 天」此前从 list_history() 现算,而历史有 200 条硬上限。
实测(日均约 88 次听写的真实数据):history.json 正好卡在 200 条,只装得下
两天多,于是近 7 天里前 4 天全画成 0 —— 而同一页的年度热力图上那 4 天分别是
40 / 118 / 108 / 37,亮着的。同一个页面两块数据自相矛盾。改读 activity 后
两者同源,柱子和格子对得上。
2. 加周期与指标切换。卡片标题位变成「近 7 天 / 近 30 天」,右侧原来的「条数 /
天」变成「条数 / 字数 / 时长」。月度字数是用户实际想看的数(跟按月计费的
竞品比较时要用),此前完全看不到。
卡片顶部显示周期总计(大字)+ 日均:想知道「这个月总共说了多少字」是要一个数,
不是在 30 根柱子里目测求和。30 天模式下柱子只有几像素宽,逐柱数字会糊成一片,
改为 title 悬浮显示、横轴只标首/中/末三个日期。
聚合逻辑抽成 lib/activityMetrics.ts 并带单测:窗口长度恒定、缺失日期补 0、
跨月边界、老数据无 chars/durationMs 时不产生 NaN(NaN 会把柱状图的 max 算坏)。
日期键一律用本地年月日拼,不能用 toISOString() —— 后者按 UTC 切日,东八区凌晨
的会话会算到前一天,与后端 chrono::Local 写的键对不上。
顺带:活动数据的 IPC 不再按 mobile 跳过。热力图在移动端仍不渲染(issue #861),
但周期指标卡是要渲染的,跳过 IPC 会让它在移动端永远空。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* feat(overview): 概览页支持 ⌘R / Ctrl+R 刷新
历史页早就有这个键(History.tsx),概览页没有 —— 想看到新数据只能切到别的
页再切回来触发重挂载。⌘R 是「重新加载」的通用直觉,两个数据页应该一致。
一次刷新本页全部三份数据:历史、活动、凭据。preventDefault 拦掉 webview
默认的整页 reload,只重发 IPC,不让整个前端重挂载。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
* fix(history): 详情页字数按 Unicode 码点统计,与概览页/后端口径一致
finalText.length 按 UTF-16 码元计数,emoji / CJK 扩展 B 等增补平面字符
会被双算;后端 activity 的 chars 用 polished.chars().count()(Unicode 标量),
概览页「字数」指标也以此为准。改用 Array.from(...).length 后三处同口径。
* fix(overview): 今日字数按 Unicode 码点统计,与历史详情/后端口径统一
概览页顶部「今日字数」此前用 finalText.length 按 UTF-16 码元计数,emoji / CJK 扩展 B 等增补平面字符会被双算;历史详情页(commit 70464a19)与后端 activity 的 chars 已是 Unicode 标量口径。抽成 lib/unicode.ts 的 countCodePoints 让两处前端共用,消除第三处口径漂移。
* fix(overview): 历史与活动刷新加请求序号防竞态
⌘R 一次触发历史、活动、凭据三份刷新,历史与活动此前没有 credentialsRequestSeq 那样的防竞态:快速连按可能让较早的慢响应后到并覆盖新数据。沿用同一模式,请求前自增序号、响应校验一致才 setState。
* style(overview): 分段切换器按钮光标改 pointer
SegmentedToggle 是可点击按钮,与 _atoms 中 Btn 的 cursor: pointer 交互约定保持一致(此前为 default,看起来像不可点)。
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com >
Co-authored-by: Chris233 <h-chris233@outlook.com >
2026-08-05 23:44:32 +08:00
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