Commit Graph
1235 Commits
Author SHA1 Message Date
baiqing 760f662f73 fix(style): 风格编辑器输入框背景用主题 token,修复回退后暗色模式白底
beta-3 的 Style.tsx 把输入/文本域背景写死 #fff,回退后在系统暗色模式下
会显示刺眼白底。改回 var(--ol-style-input-bg)(浅色 rgba(255,255,255,.86)、
暗色 rgba(255,255,255,.04)),随主题自动跟随。Claude 审核指出。
2026-06-13 14:00:36 +08:00
baiqing 5671805a09 revert(ui): 回退 AURA 界面大改到 beta-3 外观,保留功能与今日修复
把 #650 引入的 AURA / 玻璃拟态界面大改回退到 beta-3 (v1.3.6-3) 的外观,同时保留
AURA 期间合入的功能与今日两处行为修复。

回退到 beta-3:
- 外壳 FloatingShell、概览 / 历史页、卡片按钮 _atoms、设置弹窗、tokens.css / global.css
- 移除随 AURA 加入的主题切换(themeMode.ts / ThemeSection.tsx)
- 设置关闭按钮去掉圆形底(beta-3 本就透明)

保留:Apple 语音、手机远程录入、安卓、划词追问等功能,后端不动。

今日行为修复:
- 风格页切换不再卡顿(prefs:changed 监听只订阅一次 + motion layoutDependency 限制 layout 重测)
- ASR 本地引擎不再锁死,可在 provider 页直接切换(Apple 语音 macOS 直接可选)

为划词追问页补回其引用的 6 个 solid / radius token,避免回退后丢色。
2026-06-13 13:48:18 +08:00
TRIP 8142cceebd Merge pull request #649 from aron-76/codex/macos-capsule-input-monitor
Fix macOS capsule monitor targeting
2026-06-13 10:47:00 +08:00
TRIP 8c1e0c50e3 Merge pull request #652 from HKLHaoBin/feat/card-ui-unification
fix(ui): 统一卡片样式并修复深色模式可读性
2026-06-13 10:39:37 +08:00
HKLHaoBinandCursor 356e8ad480 Fix Style page dark mode readability with style tokens.
Replace hardcoded light card backgrounds with --ol-style-* tokens and strengthen dark subtle/input contrast.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-13 00:47:53 +08:00
HKLHaoBin 012cb77cea 统一卡片 UI 设计,优化主题切换与背景样式 2026-06-12 23:15:12 +08:00
HKLHaoBinandCursor 00fd21d78e Add system/light/dark theme switching in settings.
Apply theme before first paint via main.tsx, persist preference locally, and expose a segmented control in General settings with aura-skin contract coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-12 22:10:53 +08:00
aron-76 601c4700e9 fix macos capsule monitor targeting 2026-06-12 21:38:17 +08:00
HKLHaoBin e330edef14 重构样式与组件以提高一致性并优化设计
• 更新了 Card 组件样式,采用新的变量来实现玻璃拟态效果和阴影。
• 修改了 Btn 组件中的按钮样式,以符合新的颜色令牌(tokens)。
• 调整了 Collapsible 组件样式,以获得更好的边框和背景一致性。
• 统一了各设置组件的边框圆角和背景颜色。
• 增强了 AboutSection、CheckUpdateButton 及其他板块,以利用新的设计令牌。
• 优化了应用外壳(app shell)和 aura 表面的全局样式,确保视觉效果的一致性。
• 引入了新的颜色令牌,以实现更好的主题管理和无障碍性。
• 更新了多个组件的 CSS,以反映设计系统的变更,包括按钮状态和背景。
2026-06-12 21:14:16 +08:00
Chris233 81b7cfffb6 Merge pull request #650 from HKLHaoBin/openless-android-beta-to-beta
feat(android): 将 Android APK 运行时移植到 beta
2026-06-12 19:03:02 +08:00
HKLHaoBin 1ea467a001 feat(android): port Android APK runtime onto beta 2026-06-12 18:13:12 +08:00
HKLHaoBinandCursor cb63eaa766 ci(android): harden Gradle wrapper download in APK workflow
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-12 17:55:06 +08:00
HKLHaoBinandCursor dbc2643583 Add Android APK CI workflow for manual dispatch on beta.
Sync android-apk.yml from openless-android so the workflow appears in Actions.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-12 17:55:06 +08:00
Chris233 8b7dd83dcc Merge pull request #646 from katanumahotori/codex/whisper-dynamic-timeout-upstream
Scale Cloud Whisper timeout for long recordings
2026-06-12 16:10:16 +08:00
片沼ほとりandCodex c7a65b92c3 Handle Apple Speech retranscription timeout
Co-Authored-By: Codex <codex@openai.com>
2026-06-12 08:24:32 +09:00
片沼ほとりandCodex 0ba04c13e0 Scale cloud Whisper timeout for long recordings
Co-Authored-By: Codex <codex@openai.com>
2026-06-12 08:11:04 +09:00
Chris233 834dd6398e Merge pull request #636 from Open-Less/feat/issue-574-apple-speech-asr-wire
feat(asr): Apple Speech 本地 ASR provider (macOS) — 完成 #574
2026-06-11 16:58:37 +08:00
Chris233 91023ed806 Merge pull request #618 from ciddwd/feat/mobile-remote-input
Feat/mobile remote input
2026-06-11 16:58:16 +08:00
Chris233 67447e6232 Merge pull request #637 from Open-Less/feat/issue-613-retain-recording-retranscribe
feat(history): 转录失败保留录音 + 历史「重新转录」(#613)
2026-06-11 16:57:45 +08:00
吕柏青andClaude Fable 5 7b71dc55ca feat(history): 转录失败保留录音 + 历史「重新转录」(issue #613)
ASR 转录失败时若本次录音已归档,写一条 transcribeFailed 历史记录,让用户能在
历史页回放原始录音并对其重新转录,不再丢失可恢复的语音内容。

后端:
- dictation_end: 新增 write_transcribe_failed_history 辅助函数,在 14 处真实
  转录失败分支(各 provider 的 Ok(Err)/超时;不含 cancel/empty 分支)写历史。
  history id 用 coordinator session_id,与归档 wav 文件名对齐,回放/重转才能命中。
  仅在录音确已归档时写(沿用 empty-transcript「以实际归档状态为准」语义)。
- coordinator: retranscribe_pcm —— 复用 build_qa_asr_start,用当前 provider 对一段
  PCM 重新转录,统一覆盖流式/批处理全部 provider,整段超时兜底。
- persistence: HistoryStore::update_entry,原地按 id 替换历史条目(保持位置)。
- commands/history: retranscribe_recording 命令 —— 读归档 wav→取 PCM→重转→回写
  rawTranscript/finalText 并清 error_code,返回更新后的整条记录。已注册到 lib.rs。

前端:
- ipc: retranscribeRecording。
- History.tsx: 失败条目(有 errorCode)且录音仍在时显示「重新转录」按钮,
  loading 态防重复点击,成功后局部刷新该条。
- i18n: history.retranscribe / retranscribing / retranscribeFailed(5 语言)。

仅做 ASR 重转,不自动二次润色(依赖 LLM 凭据且 issue 标为待定,留作后续)。
验证:cargo check + cargo test(481 通过)+ npm run build 均通过。

Closes #613

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 15:26:03 +08:00
ciddwd 6e62009260 fix(remote-input): 全面自审——修复 2 个 HIGH 竞态与一批中危问题
按评审机器人的维度(安全/并发/资源/错误处理/边界)对远程输入全部改动面
做了一轮地毯式自审,修复如下:

Rust 核心(2 HIGH + 3 medium):
- [HIGH] start_remote_dictation TOCTOU:busy 预检查与 remote_source_active
  置位原在锁外,竞态输家把残留标志泄给抢先启动的本地会话(被劫持进远程
  分支:不开麦克风、听写全文经 remote:result 泄给手机)。新增
  begin_session_with_source(remote),busy 判定与置位移入 begin_session_state
  同一临界区(与本地路径同构);busy 时返回 Err(REMOTE_BUSY) 供手机回执。
- [HIGH] 服务关停/重置 PIN 不撤销存量连接:连接任务是裸 spawn,shutdown 只
  停 accept loop,已配对手机仍能录音落字。新增 watch 关停广播,shutdown 时
  断开全部存量 WS 连接(旧 handle 被覆盖时靠 sender drop 自动生效)。
- end_session 新增 RemoteFlagsJanitor(Drop 兜底):十余处终结路径统一在
  会话回 Idle 时清远程标志;同时修复 double-stop 过早清标志导致「仅回传」
  失效与 remote:result 丢失(phase 非 Idle 不清)。
- stop/cancel_remote_dictation 加守卫:手机 stop/断连不再能终止 PC 用户
  正在进行的本地听写。
- refresh_remote_server 串行化(异步锁 + 代数):连点开关/连改端口不再交错
  启动、误报 port-in-use;中间代直接让位只跑最后一轮。
- WS 主循环加 keepalive(30s Ping / 90s 无上行断开):手机息屏不发 FIN 时
  半开连接与录音会话不再悬挂;PCM 单帧加 64KB 上限防认证后 DoS。
- 私钥 remote-key-v4.der 在 Unix 下收紧为 0600。

H5 录音页(4 medium + 1 low):
- getUserMedia 超时后迟到 resolve 用代际计数作废,不再泄漏麦克风轨道;
- hold 按下立即松手不再发孤立 stop(startSent 配对),transcribing/polishing
  加 30s 客户端兜底超时,UI 不再可能永久卡「识别中…」;
- iOS 来电/Siri 后的 'interrupted' 状态改为非 running 即 resume;
- sessionStorage 被禁时写后读回校验,根除无限 reload 循环;
- readyTimer/busyTimer 统一跟踪清理,杜绝迟到定时器错盖新状态。

设置页(2 medium + 1 low):
- listen() 异步注册 vs 卸载竞态:注册完成若已卸载立即退订;
- 端口输入改草稿+失焦提交:不再逐键重启服务,clamp 对齐 [1024,65535],
  取整防 u16 反序列化失败;
- 重置 PIN 用命令返回值本地更新,不再撞异步重启窗口闪烁,并加错误处理。

验证:cargo check 0 错误;cargo test --lib 508 过(5 例失败为基线既有 asr
mock);tsc 通过;node --check app.js 通过。
2026-06-10 15:19:09 +08:00
吕柏青andClaude Fable 5 050927e719 feat(asr): Apple Speech 本地 ASR 接线 — dictation/QA/cancel + 平台门控 (issue #574)
承接草稿 PR #625 的 provider 基础,补完后端接线:
- coordinator: ActiveAsr::AppleSpeech 变体(macOS only)
- asr_setup: build_apple_speech + ensure_asr_credentials 平台门控 +
  build_qa_asr_start QA 接线 + is_keyless_local_asr_provider
- dictation_session/dictation_end: 听写 start + 批处理 transcribe(沿用
  local_qwen 动态超时)
- qa_session: QA transcribe arm
- resources: cancel arm
- commands: active_apple_speech_asr_is_supported(非 macOS 返回 false)+
  keyless 校验白名单 + asr_configured_for_provider + set_active_asr_provider
  非 macOS 拒绝门控

provider 仅 macOS 编译;非 macOS 由门控判不可用。前端 UI/i18n 已随 #625 落地。
验证:cargo check(macOS)通过、provider 单测 5/5 通过、npm run build 通过。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 15:00:14 +08:00
ciddwd 23cc80ea23 fix(remote-input): 启动错误按 reason 区分展示 + 清理证书过时注释
1. 错误粒度:remote-input:error 携带的 reason 之前被前端忽略,任何启动失败
   (TLS/权限/证书生成)都显示「端口被占用」误导排查。现在仅 reason ==
   'port-in-use' 时显示端口文案,其余显示通用 startError + 原始 reason
   (5 语言)。
2. load_or_generate_cert 残留 v3 时代「做成自签名 CA」的过时注释,与下方
   v4「非 CA 服务器证书」的实现矛盾(review 机器人因此误判 iOS 不可用)。
   统一为:主路径页面级例外,cert.cer/mobileconfig 是系统级安装兜底。

验证:cargo check 通过;tsc 通过。
2026-06-10 14:57:14 +08:00
ciddwd d3f2e33054 fix(remote-input): verify_hello 锁定检查与失败累计合并到同一临界区
之前分两次拿锁:同一 IP 的并发握手可以都先通过锁定检查、再各自累计失败,
让计数越过 PIN_MAX_FAILS 却不触发锁定。合并后并发请求无法在检查与累计之间
穿插。PIN 比较本身无共享状态,留在锁外。

另:cancel_remote_dictation 补注释说明 double-cancel(stop 收尾后断连)下
cancel_session 经 begin_cancel_session_state 返回 None 早退,是安全 no-op
(review 提到的 panic 不存在)。

验证:cargo check 通过。
2026-06-10 14:50:04 +08:00
吕柏青 7ed72be76e feat(asr): Apple Speech 本地 ASR provider 基础(Draft, issue #574)
从旧 WIP 分支抢救 provider 并重新落到当前 beta 结构;只含可干净合并的基础,coordinator/dictation 接线、命令、完整编译验证待后续(见 PR 待办)。

- asr/local/apple_speech_provider.rs:SFSpeechRecognizer 批处理识别 + 授权 + objc2 桥接 + 单测
- asr/local/mod.rs:注册 + APPLE_SPEECH_PROVIDER_ID + is_apple_speech
- build.rs:链接 Speech.framework(macOS);Info.plist:NSSpeechRecognitionUsageDescription
- 前端:LocalAsr / ProvidersSection / Overview / shared + 5 语言 i18n
2026-06-10 14:49:24 +08:00
Chris233 4dcd16debb Merge pull request #635 from zouzhe1/fix/mimo-asr-credential-gate
fix(asr): validate MiMo credentials as ASR provider
2026-06-10 13:53:48 +08:00
Chris233 f6c0b3250a Merge pull request #634 from Open-Less/fix/issue-602-keychain-prompt-storm
fix(vault): 保存凭据跳过未变化的 keychain 条目,修复切换供应商弹窗风暴 (#602)
2026-06-10 12:14:59 +08:00
Chris233 cffbd06adb Merge pull request #633 from Open-Less/fix/issue-631-capsule-click-guard
fix(capsule): 终态/空闲让胶囊点击穿透,修复贴近输入框误触弹主界面 (#631)
2026-06-10 12:14:05 +08:00
ciddwd 6372ecdb24 fix(remote-input): 落实 review 三项建议
1. 远程标志清理收敛(修真 bug):Starting 阶段 stop 走 pending_stop 延迟
   end_session 后无人清 remote_source_active,残留 true 会让下一次本地听写
   误走远程分支(跳过 cpal、等不到手机 PCM)。抽 clear_remote_source_flags
   并补到 pending_stop 收尾与 cancel_session(幂等,本地会话 no-op)。
2. PIN 防爆破改按源 IP 锁定:pin_fails 改 HashMap<IpAddr,_>,accept loop 经
   axum Extension 注入 peer IP;带容量上限 + 过期清理,防伪造海量源 IP 撑爆。
3. 证书信任警告:mobileconfig 处注释说明安全边界(证书为非 CA 纯服务器证书,
   无签发能力);设置页新增 certTrustWarning 文案(5 语言)。

验证:cargo check 通过;cargo test --lib coordinator 相关全过(asr mock 5 例
失败为基线既有,与本改动无关);tsc 通过。
2026-06-10 11:59:51 +08:00
ciddwd 797964b59e Merge upstream/beta into feat/mobile-remote-input
解决与上游两次大重构的冲突:
- commands.rs 已拆为 commands/ 域模块:远程输入 4 个命令迁入新建
  commands/remote_input.rs(mod.rs glob 重导出,lib.rs 零改);
  set_settings 的远程服务 prefs diff 重启逻辑迁入 commands/settings.rs。
- coordinator/dictation.rs 已拆为 5 个子模块:远程音频源接入与跳过
  麦克风权限闸门迁入 dictation_session.rs;remote_no_insert 禁流式/
  跳插入与 remote:result 回传迁入 dictation_end.rs(适配
  streaming_insert_eligible 新增的 chinese_script_preference 参数)。
- Cargo.lock 重新生成。

验证:cargo check 通过;tsc 通过。
2026-06-10 11:44:10 +08:00
吕柏青 7ddd73a057 fix(vault): 保存凭据跳过未变化的 keychain 条目,修复切换供应商弹窗风暴 (#602)
切换供应商只改 root.active 一个字段,但 save_credentials 会先读旧 manifest、
再重写所有 chunks、再重写 manifest —— macOS 上每个 keychain 条目各自 ACL,
ad-hoc 签名/未永久授权时每次访问各弹一次「访问密码」弹窗,一次切换弹 3+ 次。

三处收口(都基于已有的进程级凭据缓存,行为冷路径不变):
1. manifest 进程缓存(CREDENTIALS_MANIFEST_CACHE):load/save 成功后回填,
   后续 save 不再回 keychain 读旧 manifest(省 1 次 ACL 访问);冷缓存仍读
   真实 manifest,UUID 代际旧 chunks 的清理信息不丢。
2. chunk_skip_mask:用缓存里上次落盘的 root 反推旧 chunk 内容,逐字节一致的
   chunk 跳过重写。仅旧 manifest 已是稳定名(generation=None)时启用;缓存
   序列化顺序差异只会多写(回退旧行为),不会漏写。
3. manifest 内容只由 chunks 数决定:数量不变且已是稳定名 → 跳过重写。

典型单 chunk 凭据库:切换供应商 3 次 keychain 访问 → 1 次。
2026-06-10 09:36:08 +08:00
吕柏青 287a0ff4b4 fix(capsule): 终态/空闲让胶囊点击穿透,修复贴近输入框误触弹主界面 (#631)
胶囊窗口 220×110 远大于可见 pill,录音完成后 2s toast + 360ms 离场动画期间
透明区域仍会吃掉点击并激活 OpenLess(把主界面带到前台)。在 emit_capsule
主线程闭包按状态切换 set_ignore_cursor_events:Done/Cancelled/Error/Idle
点击穿透到下层应用;Recording/Transcribing/Polishing 保留 ✕/✓ 按钮可点。
按状态变化去重,录音中 ~30Hz 电平帧不重复调系统 API。Linux 分支不操作
胶囊窗口,不受影响。
2026-06-10 09:26:22 +08:00
bbb 64c8cc1d60 fix(asr): validate MiMo credentials as ASR provider 2026-06-10 08:45:02 +08:00
Chris233 9f61c8324b Merge pull request #630 from H-Chris233/fix/qwen-engine-mutex-poison-null-ctx-guard
fix: guard qwen_engine std::Mutex poison + null ctx FFI calls
2026-06-09 23:18:41 +08:00
Chris233 6385493519 Merge pull request #632 from H-Chris233/fix/mimo-asr-api-key-race
fix: MiMo ASR API Key 为空竞态修复
2026-06-09 22:25:37 +08:00
H-Chris233 53bb8fee37 fix: MiMo ASR API Key 为空竞态修复(三处)
1. CredentialField onBlur: save() fire-and-forget 与 validate 按钮存在 IPC 竞态
   — 用户输入 Key 后立即点「测试连接」时 setCredential 可能晚于 validate 到达后端。
   — 添加 mountedRef 守卫防止组件卸载后 stale save。

2. read_mimo_credentials: 将 .ok().flatten().unwrap_or_default() 改为显式 match
   — keyring 读取失败不再静默吞错,分别用 warn/error 记日志。
2026-06-09 22:04:42 +08:00
Chris233 7d37e4b16f Merge pull request #628 from Open-Less/fix/issue-580-settings-modal-portal
fix(settings): 设置弹窗用 Portal 渲染避免被页面滚动条覆盖 (#580)
2026-06-09 21:03:37 +08:00
Chris233 6abc03c78f Merge pull request #626 from Open-Less/fix/issue-525-macos-clipboard-restore
fix(insertion): macOS 插入后恢复用户剪贴板 (#525)
2026-06-09 21:00:09 +08:00
Chris233 aaf9133f73 Merge pull request #627 from Open-Less/fix/issue-612-history-search
fix(history): 历史页搜索框可点击、可搜索 (#612)
2026-06-09 20:58:50 +08:00
Chris233 ec5acef170 Merge pull request #629 from Open-Less/fix/issue-622-enforce-traditional-chinese
fix(polish): Traditional 模式强制中文字形转换,不再只靠 prompt (#622)
2026-06-09 20:58:02 +08:00
H-Chris233 0ba3817cee fix: guard qwen_engine Mutex poison + null ctx FFI calls
Two crash-risk fences on the dictation hot path:

1. set_token_handler: Replace std::sync::Mutex::lock().expect() with
   unwrap_or_else(|poisoned| poisoned.into_inner()) to survive a poisoned
   mutex instead of panicking the process. This is the ONLY std Mutex in
   the codebase (all others use parking_lot). If token_trampoline's C FFI
   callback panics, the Mutex poisons and the next dictation crashes.

2. transcribe_audio / transcribe_stream: Add is_null() guard before C FFI
   calls to prevent UB if engine is somehow used after Drop (defense-
   in-depth under normal Arc ownership).
2026-06-09 20:56:18 +08:00
Chris233 bba2c90ef2 Merge pull request #623 from H-Chris233/fix/crash-guards-llm-endpoint-url-asr-model-validation
fix: crash guards for LLM endpoint URL + ASR model loading
2026-06-09 20:06:40 +08:00
吕柏青 36f8b7291e fix(polish): Traditional 模式强制中文字形转换,不再只靠 prompt (#622)
繁体用户实测:选 Traditional 后最终插入文字仍可能含简体。根因——

1. finalize_polished_text 仅在 Raw / 翻译 / 润色失败时强制 apply_chinese_script_preference;
   普通模式 LLM 润色成功时只靠 system prompt 指示 LLM 输出繁体,而部分 provider 会
   跟随简体 ASR 输入继续输出简体,prompt 指示不可靠(issue #622)。
2. 流式插入路径逐字落字,刻意跳过 apply_chinese_script_preference(dictation_streaming.rs
   注释明示),无法回退已落字符。

修复:
- finalize_polished_text 在非流式路径下无条件套用 apply_chinese_script_preference
  (对 Auto 是 no-op,不影响自动模式行为;非 Auto 时保证最终文字不混简体)。
- streaming_insert_eligible 增加 chinese_script_preference 门:非 Auto 时关闭流式,
  转走会做字形转换的一次性路径(满足 issue「无法安全转换则 fallback 到 one-shot」)。
- 新增单测:finalize 对 issue 两个验收用例输出繁体;非 Auto 时流式不 eligible。

Auto 模式保持原行为不变。
2026-06-09 20:06:11 +08:00
吕柏青 2ff80d0f72 fix(settings): 设置弹窗用 Portal 渲染避免被页面滚动条覆盖 (#580)
在历史/风格页滚动后打开设置弹窗,WebKitGTK(Debian/KDE Wayland)下页面自绘滚动条
(.ol-thinscroll) 会盖在弹窗之上。根因:弹窗用 position:absolute 处于页面 overflow:hidden
祖容器的同一 stacking context 内,而 WebKitGTK 滚动条不创建独立合成层,z-index 对其无效
(issue #580 中 position:fixed、isolation:isolate 均无效已验证)。

- SettingsModal 改用 createPortal 渲染到 document.body,彻底脱离页面 DOM 树与
  stacking context(与 SelectLite 的 popover 同款做法)。
- 遮罩层 position 由 absolute 改为 fixed,覆盖整窗;视觉与交互不变。
- 设计 token 定义在 :root,body 下的 portal 正常继承,无样式丢失。
2026-06-09 19:58:34 +08:00
吕柏青 ac1f723afc fix(history): 历史页搜索框可点击、可搜索 (#612)
历史页顶部带搜索图标的区域此前是静态 div,只显示「共 N 条 · 显示 M」统计,
无法获得焦点、无法输入、无过滤逻辑(issue #612,Windows beta 实测)。

- 把静态 span 改为真实 `<input type="search">`,可聚焦输入;统计文案下移为独立小字。
- 按关键词实时过滤左侧列表,匹配 finalText / rawTranscript / appName(大小写不敏感、trim);
  与现有 mode 筛选叠加。
- 清空关键词恢复显示全部(受当前 mode 筛选)。
- ⌘K / Ctrl+K 聚焦搜索框(设计稿预期)。
- 搜索无结果时显示专门提示 history.searchNoMatch,区别于「暂无历史」。
- 新增 i18n: history.searchPlaceholder / history.searchNoMatch(en/ja/ko/zh-CN/zh-TW)。
2026-06-09 19:56:06 +08:00
吕柏青 4b4d21912b fix(insertion): macOS 插入后恢复用户剪贴板 (#525)
此前 macOS 的 insert() 只写剪贴板 + post Cmd+V,完全忽略 restore_clipboard_after_paste
参数;整套剪贴板恢复机制被 #[cfg(not(target_os = "macos"))] 排除,导致设置里的
「恢复剪贴板」开关在 macOS 上无效(issue #525,实测 macOS 26.5 / M4 Pro)。

- 把剪贴板恢复机制(保存原内容 → 延迟回写 → 仅当剪贴板仍是刚插入文字时才恢复)改为
  跨平台可用,去掉 cfg(not macos) 门控;insert_with_clipboard_restore 仍仅 Windows/
  Linux 使用(依赖 PasteShortcut 模拟),故保留其门控。
- macOS insert() 改为:保存原剪贴板 → 写转写文字 → Cmd+V → 粘贴成功且开关开启时按
  CLIPBOARD_RESTORE_DELAY 延迟恢复;粘贴失败则保留转写文字供手动粘贴、不恢复。
- CLIPBOARD_RESTORE_DELAY 合并为统一常量;删除随之失效的 macos_insert_status_after_paste。
- should_restore_clipboard 守卫测试改为跨平台运行,新增 macOS 成功路径测试。
2026-06-09 19:50:23 +08:00
H-Chris233 97293b1a40 fix: add crash guards for LLM endpoint URL and ASR model loading
Three defensive layers to prevent user-facing crashes:

1. coordinator/llm_pipeline.rs: Auto-prepend http:// when endpoint URL is
   missing scheme (user types 192.168.1.100:8080/v1 without http://).
   Add catch_unwind guards around all 4 build_active_llm_provider call
   sites to turn panics (e.g. poisoned credentials mutex) into logged
   errors instead of process kills.

2. polish.rs: Replace try_clone().expect() with safe fallback — if the
   request body isn't clonable, send once without retry instead of
   panicking the process.

3. test_run.rs: Validate model files (config.json, vocab.json,
   merges.txt exist and are non-empty; at least one .safetensors >= 1KB)
   before calling into the C FFI qwen_load / qwen_transcribe_audio,
   preventing segfaults from corrupted/incomplete model downloads.
2026-06-09 12:35:20 +08:00
TRIP 19ae8641d6 Merge pull request #621 from Open-Less/fix/aura-ui-polish
revert(ui): 回退 aura 皮肤 + 钥匙串/彩虹边框/提示词修复 (1.3.6-3)
2026-06-08 17:43:24 +08:00
吕柏青 e2af9ba38e chore(release): 1.3.6-3 2026-06-08 17:30:38 +08:00
吕柏青 5a8757d3c2 feat(polish): 清晰结构提示词前置第一指令,≥2 件事强制编号罗列
弱模型(deepseek-v4-flash)被 8 段长提示词稀释、抓不到关键的'必须罗列'规则。把
'≥2 件事必须编号清单、揉成一段=失败'前置到最顶(高于角色),让模型第一眼读到。
2026-06-08 17:30:38 +08:00