* 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>
* 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>
* 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>
* 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
Provider validation used the globally active ASR provider when deciding whether to derive Bailian protocol endpoints. Non-active Bailian channels therefore sent their WebSocket endpoint through HTTP-only validation for synchronous models.
1.3.14 split settings into tabs and left the existing panel unmounted. Desktop only, matching the PC HTTPS remote-input server.
Closes#977
Co-authored-by: Cursor <cursoragent@cursor.com>