@
bkingfilm 富文本确实是最难的一块。我的做法是不去跟编辑器抢 DOM,而是用它自己的输入协议跟它说话。
先把 selection 放到目标位置(替换就 selectNodeContents 全选,追加就 collapse 到末尾),然后派一个合成的 beforeinput,带 inputType: 'insertText' 和 data 。Lexical / Slate / ProseMirror / Draft 这些受控编辑器都靠这个事件更新自己的 model 。关键是看它有没有 preventDefault():取消了就说明编辑器打算自己把内容写进去,那我什么都不做,不去 clobber 它;没取消才自己写 innerText 再补一个 input 。你说的 execCommand 那条路留着当兜底,合成事件被 isTrusted 挡掉的站确实还有。
普通 input 也有个类似的坑:直接 el.value = 会被 React 的脏值检测吃掉,得 HTMLInputElement.prototype 上取原生 setter 来调,再补 input + change 。
我目前只验证到单段文本,你说的多段 + 两次 insertParagraph 那种没专门处理。所以 type_into 会把写完之后的实际内容 final_value 返回给 agent,让它自己看得见有没有写进去,而不是默默失败。要是你手上有能打穿它的站,欢迎丢给我。