Skip to content

fix(desktop): guard IME confirm Enter in ask inputs and small inputs - #8251

Open
complyue wants to merge 2 commits into
esengine:main-v2from
complyue:fix/ime-confirm-enter-send
Open

fix(desktop): guard IME confirm Enter in ask inputs and small inputs#8251
complyue wants to merge 2 commits into
esengine:main-v2from
complyue:fix/ime-confirm-enter-send

Conversation

@complyue

Copy link
Copy Markdown

背景

WebKit(桌面端内嵌 WebView)的 IME 事件时序特殊:输入法确认 Enter 时,compositionend 先于确认的 keydown 触发(此时 isComposing=falsekeyCode=13),导致所有"回车即提交"的小输入框在中文等输入法确认候选词时误发送

Composer 此前已有防护(上游已通过 lib/composerKeyboard.tsisImeKeyEvent 合入),但 ask 卡片、命令面板、规则/笔记/重命名/添加等小输入框没有防护,IME 用户在这些输入框敲回车确认候选词时会把半截内容提交出去。

目的

把 IME 防护统一扩展到所有 Enter 提交的小输入框:

  • 新增 lib/imeComposition.ts:共享的全局 compositionend 监听(isImeEvent),复用上游 isImeKeyEventkeyCode 229 检查与 100ms 确认宽限期
  • 每个输入框的 keydown 处理前加一次 isImeEvent(e) 检查,命中则 preventDefault 并返回

价值

  • 中文等 IME 用户不再误提交:确认候选词的回车被正确吞掉,只有真正的回车才提交
  • 轻量实现:单个全局监听器 + 每处一行检查,无需为每个输入框维护 composition 状态;100ms 宽限期同时保证快速连按第二个回车仍可正常提交
  • 测试覆盖:ask-card-layout.test.ts(+78)、command-palette-interactions.test.tsx(+34)

变更内容

11 个文件,+159:

  • 新增:lib/imeComposition.tsisImeEvent,复用 composerKeyboard.isImeKeyEvent
  • 组件(各 +1~4 行 guard):AskCardApprovalModalCommandPaletteHistoryPanelMemoryPanelModelSwitcherOnboardingOverlaySettingsPanel
  • 测试:__tests__/ask-card-layout.test.ts__tests__/command-palette-interactions.test.tsx

另含 3 行 ratchet 边界调整(tools/repolint/baseline.json):guard 给 3 个历史遗留大文件(ApprovalModal 1040 行 / MemoryPanel 1891 行 / SettingsPanel 7570 行)各净增 2-3 行,预算相应 238→240、1088→1091、6768→6770。已拒绝全量 -update 以保持 PR diff 聚焦,理由见提交信息。

验证

  • go run ./tools/repolint clean(1957 baselined);gofmt / go vet 无 Go 侧改动
  • 前端测试需 node 环境,本机未安装,建议 CI 中跑 pnpm test

Cache-impact: none - 仅 desktop/frontend TS 与 repolint baseline 调整,不触及 provider 可见的系统提示前缀
Cache-guard: 未改动 internal/tool、internal/provider、internal/boot 等缓存敏感路径
Documentation-impact: none - 无 docs/*.md 改动,文档保持正确

Composer had the guard; the other Enter-submitting inputs (ask card,
command palette, rule/note/rename/add inputs) still sent on IME
confirm Enter. Add a shared compositionend listener in
lib/imeComposition.ts and one isImeEvent() check per keydown.
The IME guard adds 2-3 lines to three legacy files that already sit at
their ratchet file-size budget (ApprovalModal 1040, MemoryPanel 1891,
SettingsPanel 7570 lines). Raise their budgets 238->240, 1088->1091,
6768->6770. Full -update was rejected to keep the PR diff focused.
@github-actions github-actions Bot added desktop Wails desktop app (desktop/**) v2 Go rewrite (1.x) — main-v2 branch, active development labels Aug 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

desktop Wails desktop app (desktop/**) v2 Go rewrite (1.x) — main-v2 branch, active development

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant