19 Commits
Author SHA1 Message Date
浩彬(^-^)andChris233 5b39599486 fix(llm): omit temperature for OpenAI GPT-6 family (#1101) (#1115)
* fix(llm): omit temperature for OpenAI GPT-6 family (#1101)

Official openai channel already skipped temperature for gpt-5* (#857);
GPT-6 Astra/Sol/Luna reject non-default temperature the same way. Extend
the omit rule and cover display-name / prefixed model ids in unit tests.

* test(llm): tighten GPT-6 API model coverage

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-28 01:28:26 +08:00
浩彬(^-^)andChris233 820d7acf7a fix(hotkey): Support Space and Mouse4/5 as dictation shortcuts (#1113)
* fix(hotkey): allow Space and Mouse4/5 as dictation shortcuts

Normalize Space recording to the named primary so validate/parse no longer
trim it to empty (#1109), surface real binding/register errors, and add a
Windows WH_MOUSE_LL path so Mouse4/Mouse5 can be recorded, saved, and trigger
dictation globally (#1099).

* fix(i18n): add mouseSideHint to remaining locales

Unblocks tsc after Mouse4/Mouse5 recording hint was added for en/zh-CN.

* fix(linux-egui): use current time in host_contract history fixture

Hardcoded 2026-08-27 falls outside the test's 30-day retention window as of
2026-09-26, so append_history pruned the entry and list_history returned [].

* fix(linux-egui): restore missing main.rs test helpers

cargo check --all-targets failed because remote UI unit tests still called
disconnected_app/rendered_text after those fixtures were dropped.

* fix(linux-egui): drop obsolete remote_ui unit test

remote_ui was removed from OpenLessEguiApp but the fingerprint rendering test
still called it, breaking cargo check --all-targets on Linux egui CI.

* fix(core): avoid tokio::spawn in e2ee sync store for TaskSpawner seam

Linux egui CI's check-core-runtime-seam rejects production tokio::spawn.
Match the in-task async blocks used by the last green Linux egui PR.

* fix(core): mark e2ee test modules for TaskSpawner seam scanner

The seam gate only recognizes #[cfg(test)], not #![cfg(test)]. Add an
explicit marker module so test-only tokio::spawn usage is ignored.

* fix(ci): exclude desktop registration on mobile and stabilize history fixture

---------

Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-28 00:20:02 +08:00
cbde1fc267 fix(history): 支持已完成条目重新转录 (#1079)
* fix(history): 支持已完成条目重新转录

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

* docs: 更新 Issue 1046 交付记录

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

* docs: 记录上游 Issue 1046 PR

* fix(history): preserve records and split long Qwen audio

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-16 22:22:48 +08:00
9b55ae1a8c fix(selection-voice): 修复 EditPlan 解析失败并支持格式/提示词配置 (#1077)
* fix(selection-voice): 可配置 EditPlan 提示词与 XML/JSON 优先解析 (#1076)

避免听写润色 framing 覆盖 EditPlan 契约;支持风格包/自定义提示词、格式优先级与解析失败时展示模型原文。

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

* docs(memory): 记录 EditPlan 修复 PR

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

* fix(selection-voice): route EditPlan framing explicitly

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-15 20:36:24 +08:00
82357e8df3 fix(android): 对齐应用内更新 minisign 并修复凭据 vault (#1061)
* fix(android): parse Tauri-wrapped minisign keys so in-app APK install can open

Android updater called PublicKey::from_base64 on the wrapped tauri.conf pubkey, so install died before installApk. Also keep vault envelope failures from looking like an unconfigured Volcengine ASR provider.

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

* fix(linux-egui): 补齐根证书指纹字段并让 fcitx5 门禁匹配实际安装调用

Release Linux egui 在 beta 上因 RemoteInputStatus 缺字段、match 臂类型不一致,以及门禁要求 ensure_fcitx5_ready(?) 而失败;安装调用本身已在监听器之前,错误会展示在 UI 里。

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

* fix(android): Keystore 暂时不可用时不要让 Tauri setup abort

Core.start() 会走 configuration_snapshot → load_credentials_for_update;信封读失败若返回 Err,setup hook 直接 SIGABRT。改为记录 last_read_error 并返回未缓存默认值,应用可以启动。

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

* fix(android): 凭据信封暂时读失败时不要挡住 2.0 启动握手

Core.start() 在 setup 成功后还会被 event bridge 和 get_startup_snapshot 再调一次;此时 last_read_error 已记下,require_readable_vault 把 Persistence 抛成「暂时无法启动」。握手改为降级空凭据状态继续运行。

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

* fix(android): 创建渠道时重试 Keystore,失败不覆盖空信封

启动时信封暂时读失败后,require_readable_vault 会在真正 load 之前短路,导致添加提供商一直操作失败。改为每次读写都重试 Keystore;读失败返回 Persistence 且不缓存/不写入默认空根;前端展示后端具体错误。

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

* debug(android): 把 Keystore 暂时不可用的具体异常名带回日志

添加提供商已会重试信封,但 Keystore 仍返回 temporarily unavailable。JNI 原先丢掉 Kotlin 异常与 JNI 失败路径,无法区分 class load、status 3 还是 BackendBusy。

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

* fix(android): 无法用于 Cipher 的 Keystore 密钥按失效信封恢复

真机 open 稳定抛出 InvalidKeyException(非 UserNotAuthenticated)。继续当成 temporarily unavailable 会让已保存凭据永远读不出来。改为走密钥缺失路径,删除无法解密的信封后可以重新配置提供商。

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

* fix(android): 凭据 Keystore 写入改走主线程并换用 v3 别名

清掉失效信封后,增加提供商仍在 seal 上失败(ProviderException/KeyStoreException)。HyperOS 上 Keystore2 从 JNI 后台线程调用常失败;改为主线程执行,并换用未损坏的 v3 别名,失败时删除别名再生成一次。

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

* fix(android): KeyMint AES-GCM 失败时回退到应用私有软件密钥

HyperOS 上 seal 稳定返回 KeyStoreException 10,主线程与 v3 别名仍无法写信封。Keystore 不可用时改用 UID 私有软件 AES-GCM,避免增加提供商失败。

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

* fix(android): preserve credentials across key fallback

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris233 <h-chris233@outlook.com>
2026-09-13 01:58:26 +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
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
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
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
浩彬(^-^)andCursor ec33bd5dd2 fix(android): 修复小屏大字号下的设置与风格页面排版 (#960) (#983)
* fix(android): 修复移动端设置与润色页排版及底栏遮挡 (#960)

设置弹窗 z-index 低于底栏导致底部控件无法点击;润色风格/市场页与 Android 权限区补齐 mobile 布局。

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

* feat(ui): 通用设置新增易读布局,大字号小屏防溢出换行

新增 stackedRowLayout 偏好与 useLayoutStack;设置外观区可手动开启同行控件换行,覆盖老人机等极限场景。关联 #960。

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

* fix(android): 安全查询悬浮窗权限,修复 HyperOS canDrawOverlays 闪退

WebView IPC 线程不再直接 JNI 调用 Settings.canDrawOverlays,改走 Kotlin 主线程桥接并捕获异常,避免 Redmi/HyperOS 在权限轮询时崩溃。

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

* feat(ui): 保守排版开关与易读布局 min-width 增强

新增 conservativeLayout 偏好与 ol-conservative-scope 单列满宽规则;易读布局补充 min-width 换行;设置与主要页面支持双开关独立并存。

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

* fix(android): can_draw_overlays JNI 生命周期以通过 Android CI 编译

为 env 与 context 绑定同一 lifetime,满足 call_static_bool_with_context_class 的借用约束。

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

* fix(android): 恢复 AccessibilityService 对 Settings.Secure 的 import

isEnabled 仍使用 Settings.Secure 查询无障碍状态,与 canDrawOverlays 移除的 import 无关。

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

* fix(ui): 将易读/保守排版开关独立为「布局」区块并置顶

原开关藏在「外观」卡片深处不易发现;现于设置→通用页录音输入下方展示独立「布局」卡片。

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

* fix(ui): 统一易读与保守排版布局规则

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-23 00:22:21 +08:00
浩彬(^-^)andCursor ead09481bd feat(android): 可选 Shizuku 与三层跨应用粘贴回退 (#932)
* feat(android): add optional Shizuku accessibility recovery path

Integrate best-effort OpenLessAccessibilityService recovery via Shizuku UserService with safe rollback, manifest/Gradle scaffolding, JNI bridge, settings UI, and contract tests.

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

* fix(android): add primary constructor for Shizuku UserService Stub

Kotlin requires an explicit supertype initializer when extending AIDL Stub; fixes Gradle compile error on CI.

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

* fix(android): replace accessibility heartbeat with IPC paste results

Remove SharedPreferences cross-process heartbeat gating, use structured PASTE/PING IPC with safe retry rules, tighten editable target validation, and fix Shizuku manifest attribute merging for mixed-quote providers.

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

* fix(android): use literal const values in accessibility command receiver

Kotlin const val cannot reference enum codes; fixes release APK compile.

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

* fix(android): 修复无障碍组件短名与全名匹配误判

Settings.Secure 常以 pkg/.Class 存储服务列表,主检测路径改用 ComponentName 规范化比较,避免 enabled=false 误报未授权;同步 Rust JNI 路径并补齐测试。

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

* fix(android): 为 JNI 调用的无障碍检测方法添加 @Keep

Release 构建中 R8 会剥离仅由 JNI 反射调用的 pingAccessibilityProcess,导致 NoSuchMethodError 与 operational=false 误报;同步保护 isEnabled 并补充契约测试。

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

* fix(android): 恢复无障碍粘贴的可编辑目标回退查找

粘贴失败日志为 NO_FOCUSED_EDITOR:过严的 isFocused 校验与移除树遍历导致找不到输入框。恢复 FOCUS_ACCESSIBILITY、宽松焦点匹配与 findEditableInTree 回退,并保留严格缓存校验。

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

* fix(android): 跨窗口扫描与缓存优先修复粘贴目标查找

微信等场景下 rootInActiveWindow 非输入窗口导致 NO_FOCUSED_EDITOR;改为缓存优先、遍历全部无障碍窗口,并加深树搜索。

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

* fix(android): 识别非 isEditable 的粘贴目标节点

微信等 App 不向无障碍暴露 isEditable;扩展为 EditText/ACTION_PASTE/ACTION_SET_TEXT 目标,并订阅文本变更事件以预热缓存。

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

* fix(android): 三层粘贴回退(无障碍 → Shizuku → 剪贴板)

无障碍失败后尝试 Shizuku 注入 KEYCODE_PASTE,再回退剪贴板;精简 Tier1 为 findFocus + ACTION_PASTE。

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

* fix(android): 粘贴结果校验与 Shizuku processNameSuffix

ACTION_PASTE 返回 true 但文本未写入时降级为 PASTE_REJECTED 并走 Tier2;修复 UserService 绑定 NPE;Tier1 成功后跳过 Shizuku。

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

* fix(android): 恢复无障碍可编辑目标查找以修复微信等应用粘贴

aaa3fbf2 将 Tier1 简化为 findFocus 导致微信等应用 PASTE_REJECTED;恢复跨窗口/树扫描与焦点缓存,保留粘贴结果校验与 Promise.allSettled 容错。

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

* fix(android): 通过 IPC 传递粘贴文本修复后台剪贴板读取被拒绝

无障碍子进程在应用未聚焦时无法读剪贴板,导致 Tier1 直接 PASTE_REJECTED;主进程将听写文本经 EXTRA_PASTE_TEXT 传入粘贴流程。

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

* fix(android): Tier2 粘贴改用 Shizuku.newProcess 绕过 MTK UserService 崩溃

联发科/小米 ROM 上 UserService 进程在 LoadedApk.makeApplicationInner 因 procName 为 null 而 NPE;粘贴键注入优先走 Shizuku.newProcess,失败再回退 UserService。

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

* fix(android): Tier2 粘贴改用 Shizuku daemon UserService

newProcess 为私有 API;粘贴键注入改走 daemon(true) 绑定,避免 MTK 上 :shizuku 子进程 Application NPE。

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

* test(android): 修正 daemon 粘贴契约断言

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

* fix(android): daemon 粘贴绑定补全 processNameSuffix

Shizuku UserServiceArgs 要求 suffix 非空;daemon(true)+suffix=paste 避免此前 null NPE 与 MTK :shizuku 子进程崩溃。

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

* fix(android): Tier2 粘贴经反射调用 Shizuku.newProcess

MTK 上 UserService 子进程仍触发 LoadedApk NPE;粘贴键注入优先反射 newProcess 执行 input keyevent 279,UserService 作回退。

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

* chore(android): 移除粘贴调试日志

微信等应用三层粘贴回退已在真机验证通过,清理 DBG-21a66f/DBG-53a00d 临时 instrumentation。

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

* fix(android): 修复 CI 单元测试在无 Robolectric 下失败

ComponentIds 改为纯 Kotlin 规范化(对齐 Rust);isValidServiceComponent 拒绝首尾空白;Target 测试改用 action id 常量。

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

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 21:50:09 +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
浩彬(^-^) 2409036ca9 fix(android): use app cache for Marketplace installs (#879) 2026-08-02 20:22:22 +08:00
浩彬(^-^)andCursor 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
浩彬(^-^)andCursor 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
浩彬(^-^)andCursor 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
浩彬(^-^) ee0f746324 feat(windows): add SendInput insertion and keyboard list controls
Merge PR #740 after review and full CI. This supersedes PR #734 by including its SendInput insertion mode work plus the keyboard-list visibility preference for #738.
2026-06-25 13:51:11 +08:00
浩彬(^-^) fa09eaf605 feat(hotkey): support side-specific modifier combos
Add side-aware combo detection for dictation on macOS/Windows, shortcut recording support for side-specific modifiers, overlap validation, and tests.
2026-06-25 13:41:28 +08:00
浩彬(^-^)andCursor 94fe8c7850 Fix/revert windows capsule qa acrylic (#496)
* chore(ci): nudge Actions to index release workflow on fork

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

* chore(ci): nudge Actions to index release workflow on fork

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

* chore(ci): nudge Actions to index release workflow on fork

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

* chore(ci): nudge Actions to index release workflow on fork

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

* chore: add CapsWriter to .gitignore for local voice inference reference

* fix(windows): revert capsule/qa Acrylic to remove dark host rect

Reverts the apply_acrylic blocks from #487. Full-window Acrylic
tinted the 220×84 capsule hitbox, causing a visible dark rectangle
around the pill on light backgrounds.

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

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 14:31:06 +08:00