1582 Commits
Author SHA1 Message Date
sim 7204c282f1 feat(capsule): typeless 放大到原版 1/5 面积、黑底白波纹;Siri 预览改用真实光效舞台
- 窗口 174×48 → 206×57,CSS zoom 0.378 → 0.447(面积 = 原版 460×128 的 1/5)
- typeless 配色改为黑色胶囊 + 白色波纹(深色主题同调)
- VoiceOrbStage 提取为独立组件;设置页 Siri 预览直接渲染缩放 0.5 的真实
  SiriGL 光条,与实际胶囊样式一致
2026-09-10 13:15:49 +08:00
sim 105fb99dc0 fix(core): volcengine 配置判定不再要求 resource id——运行时留空会回落默认资源
听写运行时对空 resource id 回落 volc.seedasr.sauc.duration(resolve_resource_id),
但 volcengine_configured 把它当硬门槛:合法的「密钥齐全、资源 id 留空」配置被误报
「语音识别未配置」并每次启动弹配置提示。认证是否就绪只取决于密钥本身。
2026-09-10 13:15:49 +08:00
sim e3f63e97fc build(macos): 兜底校验加新鲜度——打包失败时旧 bundle 不允许再通过校验 2026-09-10 12:15:03 +08:00
zhou zhichaoandChris233 882fac63f0 fix(remote-input): preserve phone trust across restarts and IP changes (#1037)
* fix(remote-input): preserve phone trust with a persistent local CA

* fix(remote-input): disclose LAN certificate MITM risk

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-10 06:36:12 +08:00
Eclock2000andChris233 7584091464 fix(hotkeys): support F13–F20 and the native Mac Dictation key (#1040)
* fix(hotkeys): 支持专用 F20 与 Mac 原生听写键

* fix(hotkeys): make the Mac Dictation key a single trigger option

* refactor(hotkeys): remove optional Dictation key status UI

* fix(hotkeys): re-enable disabled Mac Dictation event tap

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-10 02:00:30 +08:00
sim ce43e1b11b build(macos): DMG 兜底(hdiutil + Applications 替身)并按第一性原则收紧注释
- tauri build 退出码非零不再夭折脚本:.app 已生成时用 hdiutil 兜底打包 DMG,
  内容含 /Applications 替身,保留拖拽安装
- Cargo.toml Xcode 27 beta 构建注释压缩为一行事实 + 对策
2026-09-10 00:27:19 +08:00
sim 417ad38ce9 fix(macos): 四项修复——typeless 胶囊 1/7 缩放贴底、红绿灯对齐、ASR 误报、Keychain 节流
- typeless 胶囊窗口 460×128 → 174×48(面积 1/7),内容 CSS zoom 0.378 同步缩放;
  底部间距按样式区分,typeless 贴紧工作区底边(Dock 可见时贴其上沿,自动隐藏时贴屏幕底)
- 红绿灯 trafficLightPosition y 16→26:实测左间距 21.5、上间距 12,下移 9.5px 后两边距相等
- 启动时把偏好 active ASR 同步进凭据库(原仅 Windows):get_credentials 按凭据库
  active 渠道取密钥,脱钩会误报「语音识别未配置」并弹设置提示
- Keychain 节流:credentials.v2 补写与旧版逐账户扫描每进程只做一次并缓存结果,
  失败重放同一错误;新增凭据来源一次性日志
2026-09-10 00:26:36 +08:00
kevinlinandChris233 bf1237c6b1 feat(provider): 增加腾讯云实时语音处理链路 (#1020)
* feat: add Tencent TokenHub and realtime ASR

Rebase onto Core 2.0: Hunyuan realtime ASR and TokenHub polish now live
in openless-core with the shared provider registry, credentials, and
cloud transcription session lifecycle.

* fix: harden Tencent ASR and TokenHub

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-09 23:39:11 +08:00
Chris233 5113eaf245 feat(providers): 统一模型字段、搜索与异步保存隔离 (#1044)
* feat(providers): unify model fields and isolate asynchronous updates

* fix(providers): preserve pending credential drafts
2026-09-09 14:57:35 +08:00
sim 68f94b788b fix(tauri): 重建 settings.rs 合并——保留 2.0 effect-plan 架构并应用 set_settings 返回保存后 prefs 的契约
首次合并遗留的未解决冲突:以 1d29f8a6 干净版为底(2.0 SettingsRuntime
effect-plan 架构),叠加 fix/settings-experimental-consistency 的返回值
契约(桌面 set_settings 返回 UserPreferences,与前端 setSettings 对齐)。
2026-09-09 13:34:07 +08:00
sim e9185e48ce fix(i18n): 补齐 de/es/fr 的 OrcaRouter 与实验性徽标键,统一实验性措辞
- de/es/fr(2.0 新增语言)补 common.experimental、providers.orcarouter、
  searchModels/noMatchingModels/orcarouterCatalogHint/orcarouterAsrCatalogHint
- streamingInsertTitleLinux/sherpaTitle 等按 experimentalTitles 测试统一措辞
- 移除 locale 强制同步输出语言的 effect:2.0 设计为 UI 语言独立于输出/
  识别语言(locale-lifecycle 测试守护),保留偏好写入门控本身
2026-09-09 13:28:48 +08:00
sim cd18fe7174 Merge fix/settings-experimental-consistency into codex/ui-2.0-details(偏好写入门控 + 语言区域同步与 2.0 布局偏好并存) 2026-09-09 13:22:00 +08:00
sim 0fa21daaf0 Merge origin/beta into codex/ui-2.0-details(汇入 #1022/#1023/#1041/#1042,保留 2.0 渠道卡片结构并整合 OrcaRouter 目录选择) 2026-09-09 13:14:35 +08:00
sim 1d29f8a6cd feat(app): finalize 2.0 channel settings UI, 8-language alignment and cloud-sync groundwork
- 渠道设置界面:ChannelList/LlmProtocolFields/ProvidersSection 渠道级协议与模型配置
- 8 种界面语言 1711 项文案对齐(de/en/es/fr/ja/ko/zh-CN/zh-TW)
- Core 协议层 llm_protocol 与 provider_service 配套、云同步准备
- linux-egui 后端与 Android updater 配套调整
2026-09-09 13:04:10 +08:00
sim 9a88bee5c6 feat(app): polish desktop UI, expand languages and prepare cloud sync 2026-09-09 01:13:16 +08:00
AnKaifengandChris233 66915405fd feat(providers): add OrcaRouter model catalog, LLM, and ASR support (#1022)
* feat(providers): add OrcaRouter model catalog integration

* fix(providers): harden OrcaRouter catalog integration

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-09 00:41:55 +08:00
a3fc7171d2 feat(llm): add OpenCode Zen polish provider, default deepseek-v4-flash (#1023)
* feat(llm): add OpenCode Zen polish provider, default deepseek-v4-flash

Dictation polish uses OpenAI-compatible chat/completions. For OpenCode Go, change the Base URL to /zen/go/v1.

* fix(macos): 避免 Fn 长按与功能键误触发听写 (#1008)

Auto 和 Toggle 模式只在 Fn 短按松开且未叠加功能层操作时触发听写;长按及亮度、音量等 systemDefined 事件留给 macOS。

保留显式 Hold 模式的按住说话语义,并跳过 Fn 短按释放后的冗余仲裁延迟。

Co-authored-by: Chris233 <h-chris233@outlook.com>

* fix(asr): 百炼 WebSocket 优先走 IPv4,避开本机 IPv6 黑洞 (#1036)

* fix(asr): 百炼 WebSocket 优先走 IPv4,避开本机 IPv6 黑洞

dashscope 的 AAAA 在部分 Windows 双栈网上 TCP 443 会挂死,connect_async 先试 IPv6 会卡满 5 秒超时,听写进不了 Listening。

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(asr): preserve websocket ports and retry handshake addresses

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>

* fix(updater): Beta 构建默认跟随 Beta 渠道 (#1041)

* fix(updater): default beta builds to beta channel (#1034)

* fix(updater): persist channel switches atomically

* feat(llm): 支持渠道级 Chat Completions、Responses 和 Messages (#1042)

* feat(llm): add channel request formats and compatibility presets

* fix(llm): harden channel protocol handling

* feat(llm): integrate OpenCode Zen with shared request formats

---------

Co-authored-by: Mark <shawninjuly@gmail.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
Co-authored-by: 浩彬(^-^) <146098469+HKLHaoBin@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 20:54:01 +08:00
Chris233 2b7c9d13c1 feat(llm): 支持渠道级 Chat Completions、Responses 和 Messages (#1042)
* feat(llm): add channel request formats and compatibility presets

* fix(llm): harden channel protocol handling
2026-09-08 18:52:45 +08:00
Chris233 a9ee22f334 fix(updater): Beta 构建默认跟随 Beta 渠道 (#1041)
* fix(updater): default beta builds to beta channel (#1034)

* fix(updater): persist channel switches atomically
2026-09-08 15:41:36 +08:00
sim ee002a15bd test(core): 限定沙箱权限段的路径断言 2026-09-08 14:42:05 +08:00
sim 4519f19c92 style(app): 统一前端与平台源码格式 2026-09-08 14:35:28 +08:00
sim d686406a70 refactor(app): 清理废弃代码并明确模块注释 2026-09-08 14:27:29 +08:00
sim 7ae366e2aa Merge remote-tracking branch 'origin/beta' into codex/ui-2.0-details 2026-09-08 14:21:03 +08:00
sim a6ed77c0d0 feat(ui): 完善设置子页与自定义风格图标 2026-09-08 14:16:24 +08:00
af9eaa3e16 fix(asr): 百炼 WebSocket 优先走 IPv4,避开本机 IPv6 黑洞 (#1036)
* fix(asr): 百炼 WebSocket 优先走 IPv4,避开本机 IPv6 黑洞

dashscope 的 AAAA 在部分 Windows 双栈网上 TCP 443 会挂死,connect_async 先试 IPv6 会卡满 5 秒超时,听写进不了 Listening。

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(asr): preserve websocket ports and retry handshake addresses

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-08 12:47:09 +08:00
sim 69f454bd68 feat(ui): integrate 2.0 interface and agent work
Consolidate the current 2.0 sidebar, overview, settings, vocabulary editing, correction rules page, and first-launch splash with their Core and Tauri adapters. Include the accompanying source and architecture documentation updates.

Validation: npm test (build and 73 discovered test files); cargo test -p openless-core --locked; Core/Linux and Tauri rustfmt checks.
2026-09-08 11:12:05 +08:00
MarkandChris233 6a7cd5f4cd fix(macos): 避免 Fn 长按与功能键误触发听写 (#1008)
Auto 和 Toggle 模式只在 Fn 短按松开且未叠加功能层操作时触发听写;长按及亮度、音量等 systemDefined 事件留给 macOS。

保留显式 Hold 模式的按住说话语义,并跳过 Fn 短按释放后的冗余仲裁延迟。

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-08 01:39:55 +08:00
sim 9d03bae349 test(linux-egui): host_contract 按有效目标语义更新 Windows 键盘断言
#1021 重构后 WindowsKeyboardRuntimeTarget 由插入模式派生:默认 TSF 模式下
翻转 keyboard-list 偏好不产生有效目标变化,Linux 接受并广播 PreferencesChanged;
将插入模式切到 SendInput 且隐藏键盘列表会真正驱动 Windows 语言 profile,
合同仍要求显式拒绝(Unsupported)。旧断言只翻转原始字段,与新语义冲突。
2026-09-07 14:31:36 +08:00
sim b1370b5d40 chore(docs): 删除已无引用的火山控制台截图
volcengine-setup.md 重写为以 descriptor 为锚后,旧指南的 4 张控制台
截图不再被任何文档引用。
2026-09-07 14:24:16 +08:00
sim 34cab16fce docs: 以源码为准重写 1-app 文档系统(19 篇)
保留目录骨架与文件名,内容全部以当前源码为依据重写:范围与版本锚点
(2.0.0-Beta.1 / crate 0.1.0 / com.openless.app)、架构分层与 Core 模块地图、
桌面验收清单(功能域→源码入口→证据)、Linux 交接 8 篇(沿用 L01-L12 登记体系,
锚点落到 settings.rs/audio.rs/ports.rs 等)、后端接口契约、Android 计划、
运营指南 5 篇(以 provider descriptor 与实际 CSP/.gitmodules 为锚)。
原过程中的计划叙述、截图与历史收口记录不再保留。
2026-09-07 13:48:29 +08:00
sim 639c2fbf9b chore: 删除未使用死文件与零引用依赖
前端:chat 桶文件、SegSimple、SwitchLite、androidMicrophonePermission 转发
shim、SelectionPolishSection 孤儿分区、autostart 环境类型声明;依赖移除
@formkit/auto-animate 与 @tauri-apps/plugin-autostart npm 包装层(Rust 插件
与 capability 保留,autostart 经原生 invoke 字符串调用)。
Rust:polish 旧副本两文件、android/types.rs、remote_server/lan_addresses.rs
(均为 Core 2.0 整合遗留,模块树未引用,编译行为不变)。
npm test 构建与全部测试通过;三 crate cargo fmt --check 干净。
2026-09-07 13:36:08 +08:00
sim 6608f66b44 chore: 将 .mimosa 运行状态目录移出版本库并加入 .gitignore
修正 92da4fbf 中误随 git add -A 提交的 Mimosa 安全钩子运行状态文件;
该目录为插件会话状态,不属于版本库,已忽略以防再次混入。
2026-09-07 13:36:08 +08:00
sim 92da4fbf9b docs: 清理已了结的规划过程文档并同步引用
删除已完成/已收口任务的规划与过程记录(2.0 UX 收口、Core 2.0 计划、
PR#1019 复核与桌面复审、平台边界审计、Linux 引导知识快照、
Linux 共享后端阶段计划、供应商渠道计划、Windows sherpa 规划、
PR#711 评审截图、应用内测试计划),保留规范性文档、验收清单、
Linux 交接目录与运营指南,并修复全部引用链接。
2026-09-07 13:29:55 +08:00
sim be1118bc2a style(src-tauri): 应用 rustfmt 默认风格统一格式 2026-09-07 13:29:55 +08:00
sim 11d9aa4b29 merge: Core 2.0 前端 UI 整理(feat/core-2-ux-linux → beta) 2026-09-07 12:51:39 +08:00
sim 30e580fc37 feat(ui): Core 2.0 入口、设置与布局整理,Linux 引导与视觉改进
- 主页前置下一步与真实服务状态,服务卡直达对应设置;概览与热力图排布调整
- 设置按任务分类并支持搜索、焦点返回与 Escape 语义;旧 section ID 保持稳定
- AI 分区拆分语言模型/语音识别/本地模型/连接;渠道列表与表单重构,设置实底
- 本地模型管理与下载目录重排,补空态、主操作与窄屏布局
- Core 生成 provider descriptor 公开目录供浏览器预览懒加载,原生 IPC 合同不变
- Linux egui 按开始/听写/AI 服务/模型/工具/手机输入/历史/设置组织页面并加环境引导
- 五语言文案与文档(体验梳理、架构、计划收口)同步
2026-09-07 12:51:24 +08:00
Teariceandtonyzaca7755963 82aa33ffd6 fix(windows-ime): 避免 TSF 预检导致文本重复插入 (#1021)
Co-authored-by: tonyzaca7755963 <tonyzaca7755963@users.noreply.github.com>
2026-09-07 08:29:07 +08:00
823a6a14cd fix(windows): 修复剪贴板 sentinel 竞争导致划词追问与划词编辑无法抓取选区 (#1024) (#1025)
* fix(selection-voice): auto-hide capsule when begin fails without selection

Schedule the standard 2s capsule idle timer after no-selection begin errors so the Siri-style prompt does not stay on screen indefinitely.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection): log why selection capture missed for voice/polish

Distinguish clipboard sentinel unchanged, empty copy, shortcut failure, and prefetch vs live capture so user-exported logs can diagnose false no-selection reports.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection): fix capture diag logging compile errors

Format optional front_app in prefetch miss logs and gate the NoCapturePath fallback to non-desktop targets so macOS/Windows/Linux builds compile cleanly.

Co-authored-by: Cursor <cursoragent@cursor.com>

* debug(selection): add sentinel/post_copy DEBUG logs to diagnose Chrome capture

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection): Windows content-change check instead of sentinel for Ctrl+C validation

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection): settle clipboard after sentinel for Windows history race

Clipboard History async listeners can hold the clipboard after we write the
sentinel, so target-app Ctrl+C silently fails. Wait for settle, poll, and
optionally resend Ctrl+C. Bump to 1.3.18-Beta.10.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection): parenthesize duration cast comparisons for Rust parse

Bare `as u64 <` is parsed as a generic; cfg(windows) code still must parse on Linux CI.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection): handle GetOpenClipboardWindow Result and type key_down

windows 0.58 returns Result<HWND>; annotate VIRTUAL_KEY for GetAsyncKeyState.

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore(selection): 从 PR 中移除 fork 专用版本号与 release workflow

上游 PR 只保留选区捕获 / 剪贴板 sentinel 修复。版本号仍由上游发布流程管理。

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-07 08:24:36 +08:00
4c45a938ce fix(floating-windows): 浮窗跟随鼠标所在的屏,多显示器下不再被钉死在主屏 (#1028)
* fix(floating-windows): 浮窗跟随鼠标所在的屏,多显示器下不再被钉死在主屏

接了外接屏时,Less Computer 的全屏彩虹描边(跑马灯)、Less Computer 聊天浮窗和
QA 浮窗都只出现在主屏上,胶囊却在你正在用的那块屏 —— 两边分家。

原因是这三个浮窗选屏时问的是「我自己现在在哪块屏」(window.current_monitor)。
它们都是懒创建 + 常驻隐藏的窗口:隐藏时停在上一次出现的屏,而这辈子第一次出现
就在系统默认(主)屏,于是每次 show 都算出主屏、又铺回主屏,永久钉死。

胶囊自己踩过并修好过同一个坑 —— 改成跟随鼠标光标所在的屏(capsule_target_monitor
的注释写着「不能用窗口自己的 current_monitor」),这三个浮窗漏掉了。这里抽出共用的
floating_window_monitor_frame,让浮窗和胶囊看同一块屏;非 macOS 没有这条
CGEvent/AX 通路,仍走 current_monitor,行为不变。

顺带把选屏的纯逻辑抽成 pick_monitor_for_anchor_point 并补单测:光标在哪块屏就选
哪块、落在所有屏之外时退到最近的屏。

注:QA 浮窗只在首次 show 时定位(之后有意保留用户拖动后的位置),所以这条对它只
影响第一次出现的位置。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* test(macos): fix mixed-DPI monitor fixture

* ci: rerun with updated Linux gate

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-07 00:19:52 +08:00
fd632c2fc7 fix(windows): 粘贴模式下也可隐藏键盘列表中的 OpenLess (#1015) (#1017)
* fix(windows): allow hiding OpenLess from keyboard list in paste mode

Extend the keyboard-list visibility toggle and desired-profile logic from
SendInput-only to all non-TSF insertion modes so clipboard paste can hide
OpenLess without blocking TSF when switched back.

Refs: #1015
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(macos): 把 mlx.metallib 放到 Resources,避免 ad-hoc codesign 失败

Contents/MacOS 里的非 Mach-O 会被当成 nested code;克隆仓没有 Developer ID 时 identity '-' 会直接 bundle 失败。metallib 改为 Contents/Resources,worker 启动时调用 MLX set_metallib_path。

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(ci): dispatch 时按版本号跳过 Windows MSI,避免 Beta.N 被 WiX 拒绝

workflow_dispatch 的 ref 不是 tag,OPENLESS_RELEASE_CHANNEL 会落成 stable,但 app 版本仍是 1.3.18-Beta.7。WiX 要求 prerelease 只能是数字,MSI 直接失败。版本带 Beta/Alpha/RC 时与 beta 渠道一样跳过 MSI。

Co-authored-by: Cursor <cursoragent@cursor.com>

* ci(linux): test core without egui host

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-06 23:37:56 +08:00
Chris233 fc38edd1a3 refactor: consolidate Core 2.0 and restore cross-platform behavior (#1019)
* refactor: split Linux egui host from shared backend

* fix: keep CI contracts portable across runners

* fix(ci): preserve CRLF while removing qwen dependency

* fix(ci): regenerate target lockfile and install ripgrep

* fix(ci): gate desktop-only selection voice module

* ci: limit native build parallelism on cross-platform runners

* fix(host): expose blocking task seam to coordinator

* fix(settings): avoid macOS default hotkey collision

* docs: record cross-platform CI evidence

* ci: expose Linux validation package artifact

* ci: grant reusable Linux package permissions

* refactor: remove legacy coordinator dictation facade

* ci: skip unsupported MSI prerelease builds

* ci: install minisign only for signed Linux releases

* fix: keep test-only coordinator session helper

* refactor: move style preview diagnostics into core

* fix: import shared preferences type from core

* refactor: centralize enabled vocabulary projection

* ci: install ripgrep for Linux package gates

* test: make source contract line-ending agnostic

* fix: keep Linux desktop entry standards compliant

* docs: expose core style diagnostics contract

* ci: resolve Linux package version in app directory

* refactor: centralize ASR vocabulary priority

* fix: use shared vocabulary note constant

* refactor: keep vocabulary priority inside core

* test: retain starting-stop queue coverage

* ci: scope Linux updater URL to the current repository

* docs: close implementation and artifact evidence

* docs: record final CI artifact evidence

* fix(android): align updater plugin versions

* fix(android): pin updater crate exactly

* refactor(core): remove unused type anchor

* docs: record final artifact runs

* fix(remote-input): preserve beta status fields

* fix(tauri): finish beta host merge

* fix(asr): pass scoped operation to native qwen adapter

* fix(macos): bundle mlx metallib as a resource

* test(remote-input): update status wire contract

* feat: share Less Computer voice flow with Linux

* refactor(core): centralize host-independent runtime policy

* refactor(core): complete 2.0 backend consolidation

* fix(ci): prepare Sherpa after cache restore

* fix(macos): route native model paths through Core store

* fix(macos): use ModelStore catalog API

* fix(ci): serialize macOS native test build

* test(ci): preserve macOS cargo diagnostics

* fix(macos): release input source lock before await

* test(core): replace legacy hotkey injection gate

* test(core): move Codex sandbox contract into Core

* fix(core): close final runtime policy gaps

* fix(windows): terminate coding agent process trees

* fix(core): complete local model migration

* fix(credentials): align Core LLM model account

* fix(core): restore 1.x parity across shared backend

* fix(android): complete shared backend stubs

* fix: close cross-platform migration review gaps

* fix: complete migration lifecycles and platform compatibility

* docs: define desktop 2.0 acceptance and Linux handoff

* fix: close desktop parity and session lifecycle gaps

* fix: finish voice lifecycle and desktop feedback parity

* fix: close desktop cancellation and feedback race gaps

* fix: honor proxy settings and reject stale session effects

* fix: dispatch native cleanup on host runtimes and order events

* fix: keep optional recording effects best effort

* fix: close desktop agent model and QA lifecycle gaps

* fix: preserve desktop raw voice and QA turn ownership

* fix: finalize desktop dictation and QA feedback
2026-09-06 18:39:46 +08:00
zhou zhichaoandChris233 fc9824eecc fix(remote-input): 开关已开时启动也要拉起局域网服务 (#1002)
* fix(remote-input): start the LAN server on launch when already enabled

Toggling the setting only refreshed the server on a prefs change. After restart the switch stayed on but port 8443 never bound, so the phone page could not open.

* fix(remote-input): unstick Windows startup and settings

On Windows, NIC enumeration and Tauri path APIs from the async runtime can stall the LAN server, and set_remote_locale's main-thread tray refresh deadlocks the settings page. Start the server on Ready and keep those calls off the UI thread.

* fix(remote-input): harden LAN discovery and startup lifecycle

* fix(remote-input): feed phone PCM into ASR instead of the PC mic

Remote dictation still opened the computer microphone and never assigned
the phone sink, so Safari audio was dropped. Arm a deferred bridge on
start and skip the local capture device for remote sessions.

* fix(remote-input): scope PCM cleanup to active session

* test(remote-input): import RMS helper

* fix(remote-input): clear idle PCM sink on cancel

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-08-27 12:51:26 +08:00
Murphy 18e1aaf403 fix(polish): 润色流式请求让取消检测和网络等待赛跑,不再悬挂到 budget 结束 (#1001)
* fix(polish): 润色流式请求让取消检测和网络等待赛跑,不再悬挂到 budget 结束

配置为 qwen-audio-3.0-asr-flash + deepseek-v4-flash 时,若润色阶段对话模型
接口迟迟不返回,取消操作(点击胶囊关闭按钮 / 按快捷键重新发起)会晚至
32~53 秒才生效,期间胶囊卡死在屏幕上、快捷键无响应,只能强制重启 App
才能恢复(本机日志复现,见 issue)。

根因:chat_completion_messages_streaming 的取消检测只在 SSE 循环顶部轮询
一次,真正等待网络数据的两处 await(建连/发送请求、逐帧读取)都不会被
取消打断,只能等到数据到达或 budget(首字 30s+ / 空闲 20s / 硬顶 900s)
自然超时。同一类问题在转写(ASR)阶段已在 #798 修过,但没有推广到润色
阶段——这是一处遗留的修复范围缺口。

用同款 tokio::select! 赛跑模式补齐:新增 wait_until_cancelled helper
(75ms 轮询,与 wait_for_processing_cancel 同款间隔),分别和
send_with_transient_retry、response.chunk() 赛跑,命中取消就复用既有的
"空流 → InvalidResponse" 错误路径。不改变任何超时预算数值,不改变
already_streamed 语义,不改变 dictation.rs 状态机。

Fixes #1000

* test(polish): 补上 SSE 循环内取消的回归测试,并修正建连阶段取消的状态码

上一版新增的 cancellation_before_response_arrives_* 只覆盖了「服务端连状态行
都不回」的建连阶段,走的是 send_with_transient_retry 之前那个 select!。而
issue #1000 日志里打出的是 "cancelled by caller after 0 deltas ... breaking
SSE loop",说明 response 头已到达、代码已进入 SSE 循环,真正卡住的是
response.chunk() 那一次 await——也就是本次修复的核心那处 select!,此前没有
任何回归测试覆盖:把它还原成旧写法,原用例照样通过。

补 cancellation_mid_stream_does_not_wait_out_the_budget:服务端立刻回 200
header 让客户端进入 SSE 循环,随后长时间不发 delta,取消后必须在一个轮询
周期内返回,而不是等满 30s 首字预算。

顺带把建连阶段取消返回的 status 从编造的 200 改成 0:那条路径上一个 HTTP
响应字节都没收到,日志打成 "status 200" 会让人误以为服务端回了 200 空body。
两个用例的断言因此分别锁 status 0 / 200,互相不会冒充。

* fix(polish): 读取非 2xx 错误 body 时也让取消赛跑,并给 select! 加 biased

外部 review(codex)指出前两版仍漏了一处不可取消的网络等待:收到非 2xx
响应头后的 response.text()。polish_client 走的是 POLISH_CLIENT_HARD_CAP_SECS
(900s)总超时,服务端只要回一个 500 头就挂住不发 body,取消完全不生效,
最坏卡死 15 分钟——症状与 issue #1000 一致,且比原路径的 30s 首字预算严重
一个数量级。

补 cancellation_while_reading_error_body_does_not_hang:服务端回 500 头并
声明 1KB body 却一字节不发。去掉这次赛跑后该用例实测耗时 5.01s(真实场景
连接不关就是等满 900s)。

三处 select! 统一加 biased,让取消分支先于网络分支被 poll,消掉「budget 归
零与取消同时就绪时随机选分支」的竞态。

按 review 意见收紧措辞与注释:原注释称 Response 被 drop 会中断底层 TCP,
在 HTTP/2 多路复用与连接池下未必成立,改为只声明放弃这次请求的等待;
wait_until_cancelled 与两个既有用例的说明各压掉约一半。
2026-08-26 16:15:02 +08:00
Jimmy LeeandChris233 2cf5069846 fix(asr): 修复 macOS MLX 后端闪退与发布资源缺失 (#999)
* fix/local-qwen-asr-exit: 修复使用本地的qwen3-asr识别闪退的问题 #986

* add mlx error

* 修复github action打包出来的dmg运行本地qwen3-asr-rs时崩溃的问题

* fix(asr): 隔离 macOS MLX worker 并修复发布资源

* fix(asr): 修复 macOS worker 超时与 socket 测试

* fix(asr): scope MLX cancellation to owning operation

* fix(asr): preserve abort semantics on target switch

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-08-26 13:25:11 +08:00
3cc6a59dd6 feat(selection-voice): Windows 选区语音编辑 MVP,划词提问面板预览与意图分流 (#987) (#995)
* feat(selection-voice): Windows 选区语音编辑 MVP(issue #987)

选区 + 专用快捷键 + 语音指令:指令润色后按 auto/manual/heuristic 分流到 QA 或 EditPlan 确定性编辑,含设置页、预览窗与热键集成。

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): 修复 Windows 编译(展平 session 模块结构)

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): 用 polish_text 替代 ActiveLLMProvider::complete

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(ci): 补全 mock trait 与 SessionId 单元测试类型

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(release): feature 分支跳过 MSI 并上传 NSIS 安装包

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): post-utterance intent picker and merged settings

Let users choose question vs edit after speaking (default prompt mode), merge polish and voice into one settings card, keep hotkey supervisor polling, and show capsule errors when trigger preconditions fail.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(i18n): add selectionWorkspace keys for ja, ko, zh-TW

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): compare hotkey supervisor signatures as Option<&str>

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(coordinator): gate selection_voice_intent_prompt init to Windows

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-workspace): unify voice and polish hotkey with edge prefetch

Reuse the selection polish shortcut for voice edit and prefetch selection at hotkey press to avoid Alt clearing the selection before capture.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): align auto/toggle hotkey modes and intent UX

Match dictation auto short/long-press semantics, fix toggle stop blocked by busy flag, block overlapping dictation, and invert intent toggle to heuristic-off / AI-on.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(ci): gate selection-voice dictation block to Windows only

selection_voice_session is Windows-gated; non-Windows builds failed with E0433 when dictation referenced it unconditionally.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): surface end-workflow errors instead of stuck loading

When stopping a voice session, failures during ASR, intent, or edit-plan steps now reset state and show a user-facing capsule error with stage hints.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): annotate end-workflow async block error type as String

Windows CI failed because the async block inferred Result<_, str> instead of Result<_, String>.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): route translation edits through translate pipeline

Infer target language from voice instructions like translate-to-English and build a full_rewrite plan via translate_text instead of fragile EditPlan JSON. Also normalize common LLM JSON aliases and improve parse fallbacks.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(selection-voice): use XML EditPlan format for LLM edit responses

Switch voice-edit system prompt to XML envelopes with child elements for multiline text. Add parse_edit_plan with XML-first parsing and JSON fallback for legacy outputs.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(edit-plan): correct XML entity match string literals

Fix E0762 unterminated character literal in decode_xml_text that broke all platform builds.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(edit-plan): resolve XML parser type errors for CI

Use Option for find_open_tag, fix unwrap_or types, bool attr matching, and promote_alias_field slice arity.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(edit-plan): fix remaining XML parser compile errors

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(edit-plan): fix tuple arity, map remove keys, and borrow in normalize

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): unify voice edit with QA panel and improve intent

Route voice edits through QaPanel for shared preview/confirm UX, hide capsule when the session ends, prioritize heuristic edit cues for auto intent, and fix translation identity checks.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(selection-voice): 统一语音编辑为 QA 面板预览模式并支持回退

将选区语音编辑流程统一到 QA 面板,新增预览与回退功能。

- 新增 `revert_selection_voice_preview` Tauri 命令及 IPC 调用,支持回退到上一轮编辑预览
- 在 QA 面板中新增 `editRevertAvailable` 状态,处理预览模式下的错误与空闲状态
- 优化 `emit_selection_voice_end_error` 逻辑:预览模式下错误回退到 Idle 状态并关闭面板,其他模式下显示错误胶囊
- 新增翻译结果与原文相同时的错误提示
- 跟踪 `previous_preview_text` 以支持回退操作
- 同步更新多语言(zh-CN、zh-TW、en、ja、ko)编辑按钮文案及新增回退文案

* fix(ci): gate selection-voice QA follow-up to Windows and fix compile errors

Add missing selection_voice_preview_mode helper, cfg-gate revert command registration, and release QA mutex before async follow-up edit to satisfy Send.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(ci): stub selection module in backend-tests harness

hotkey.rs now prefetches workspace selection on polish shortcut; provide no-op stub for Rust-only test crate.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(qa): route intent by interrogative and add edit-instruction mode

Detect question vs non-question for selection-voice Auto intent, polish QA mic ASR, and gate ask/edit on the panel checkbox so text and voice stay consistent.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(selection-voice): 增强语音编辑功能,优化 QA 面板状态同步

* fix(selection-voice): stop legacy edit keywords from misrouting to QA

Filter pre-#987 default keywords like 「改成」 so edit imperatives no longer match question heuristics, and reset qa_stream_cancelled before streaming so prior QA cancellations do not yield empty-stream failures.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(selection-voice): address review blockers

* fix(selection-voice): gate QA preview cleanup to Windows

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-08-25 23:34:52 +08:00
Chris233 58c0ade3ab fix(windows-ime): make TSF shutdown fully cancelable (#991)
* fix(windows-ime): make TSF shutdown fully cancelable

Remove the uncancelable named-pipe flush, post owned submit requests to the TSF owner thread, cancel pending edit sessions during shutdown, and keep the DLL loaded while asynchronous edit sessions remain alive.\n\nRelated to #954.

* fix(windows-ime): handle uncertain submits and startup failures

* fix(windows-ime): keep untrusted responses outcome-unknown
2026-08-25 22:29:50 +08:00
Chris233 5d379f2849 chore(release): 1.3.18-Beta.7 2026-08-24 22:36:11 +08:00
Mark 2981bf28c3 fix(macos): 避免 Keychain 授权弹窗重复出现 (#990) 2026-08-23 22:47:41 +08:00
Chris233 6efc8396ea feat(macos): auto-select newline mode for terminal apps (#988)
* feat(macos): add line feed newline option

* feat(macos): auto-select newline mode by target app

* style(macos): localize newline fallback comment
2026-08-23 16:30:17 +08:00
Chris233 3f59b1352e fix(asr): clarify Volcengine API Key source 2026-08-23 16:10:41 +08:00