Repository navigation
输入法组词提交带尾随空行时,消息在未按发送键的情况下被发出(安卓 + 微信输入法语音) #13138
Replies: 3 comments
|
内核的 composer 没有 compositionend 直接提交这条路。 提交只有两条:keydown Enter(有 IME 守卫: 你的事件序列里也没有 keydown/click,而 fetch 栈落在 我读的是 master 的 client 代码,没跑安卓 + 微信输入法。 |
|
感谢核对。这里贴两处代码,可能正好是 grep 没覆盖到的那一环。 先对齐结论:提交确实不是从 ① 打包进来的 Lexical: if ("\n" === e[e.length - 1]) {
const e = Kr();
if (ur(e) || dr(e)) {
...
return Nl(t, cn$1, null), ... // 派发 ENTER_COMMAND,event 参数是 null
}
}② editor.registerCommand(cn$1, (event) => {
if (event !== null && (event.altKey || event.getModifierState("AltGraph")
|| event.ctrlKey && event.metaKey
|| event.shiftKey && (event.ctrlKey || event.metaKey))) return true;
if (event?.shiftKey === true) return false;
if (event !== null && isComposingEvent(event, recentlyComposing)) return true; // ← event === null 时整条跳过
if (handlers.arbitrate("enter", false) !== "pass") { event?.preventDefault(); return true; }
event?.preventDefault();
if (event?.repeat === true) return true;
if (!handlers.canSubmit()) return true;
handlers.submit(event?.ctrlKey === true || event?.metaKey === true); // ← 提交
}, 4)
行为侧完全吻合:现场日志里提交前后没有任何 最小修复建议(与插件作者一致): 所以这条还不是 answer,麻烦先别标 —— 标了以后遇到同样问题的人会顺着"插件侧提交"这个方向排查,反而绕远。插件作者那边已确认无法安全止血:saya-ch/dsh-mobile#414 (comment) |
|
我上一条说错了:提交就在内核的 Enter 处理器里。
修法:把 我读的是 master 这段可以直接给 AI,让它在 keymap 里补 null event 分支并加回归。 |
Uh oh!
There was an error while loading. Please reload this page.
EN (TL;DR): On Android + WeChat IME voice input (auto-formatting on), the IME commits its composition with a trailing
\n\n. DSH then submitsapi/session/promptin the same synchronous flow — nokeydown, noclick, nobeforeinput, nosubmit— and the message is sent half-complete, without the user pressing send.环境:DSH Desktop
0.2.2-rc.1(Windows x64,官方 Desktop)+ 安卓手机浏览器经局域网访问(dsh-mobile插件提供的移动页)+ 微信输入法语音输入(自动整理开启)。现象
微信输入法语音"整理"结束时,会用
compositionend.data尾部的\n\n表示"这句话说完了"。DSH 在组词提交的同一个同步流程内就发出了api/session/prompt:用户没按发送键,消息被发出且只发出前半句,剩下的部分留在输入框里变成下一条消息。分点、加分号时最容易触发(输入法更爱在那里插空行)。结果是模型收到半句话。
实测事件序列(页面内 capture 监听采集)
关键观察
keydown(含Enter/keyCode 13/229)、没有click、没有beforeinput、没有submit。链路只有insertCompositionText->compositionend-> 提交。18,从来没包含那两个换行;\n\n只存在于compositionend的data里。insertCompositionText的data会反复出现整段历史文本(云端整理整体重写草稿),草稿长度曾出现67 -> 6的跳变。影响
任何"用尾部空行表示句子结束"的输入法都会触发(中文语音输入是主流输入方式)。误发直接破坏消息完整性,且用户会以为是网络或模型问题。
临时规避
关闭输入法的"自动整理 / 智能标点 / 自动分段"。关闭后同样话术不再触发(已复现 15+ 次,关闭后 0 次)。
交叉引用
移动层的同类报告(含现有 Enter 守卫为何覆盖不到这个场景):
saya-ch/dsh-mobile#414
那边已经在本仓之外加了组词路径的处理建议,但根因在 composer 的提交判断,仍需本体侧决定是否把
compositionend.data的尾部空行当作提交信号。All reactions