ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Orca IME 回归清单:横跨 Native Chat 与终端的跨平台输入法契约设计

Orca IME 回归清单:横跨 Native Chat 与终端的跨平台输入法契约设计 Orca IME 回归清单横跨 Native Chat 与终端的跨平台输入法契约设计【免费下载链接】orcaOrca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.项目地址: https://gitcode.com/GitHub_Trending/orca48/orca在 Orca 这类并行 Agent 开发环境ADE中中文、韩文等 CJK 输入法IME候选框与流式渲染、SSH 远程 PTY 天然冲突组合输入preedit可能在浏览器还拥有文本框时就被 React 重渲染覆盖。本文基于仓库中的 IME 回归清单 展开讲解 Orca 如何用持久验收契约替代单机器症状复现来管理 IME 回归覆盖四条问题台账、有界状态与所有权契约、异步附件落定的结算协议、跨平台原生验证矩阵以及提交前必须通过的代码优雅度门禁并给出仓库中对应的源码实现证据帮助读者掌握一套可复用的 IME 输入契约设计与回归测试方法论。一、清单的定位验收契约而非症状记录ime-regression-checklist.md 的开篇就明确了这份文档的性质These reports define durable acceptance contracts, not only the symptoms from one machine. 这些报告定义的是持久化的验收契约而不只是某一台机器上的症状。也就是说清单里的每一条不是在我机器上复现了 XX 问题的工单而是一个可以长期执行的断言集合根因是什么、所有权不变量是什么、需要哪些证据才算修好。这一设计思路直接决定了后续所有小节的结构台账、有界状态契约、落定协议、跨平台验证、代码门禁五层逐层收紧。二、跟进问题台账四条 IME 回归的验收契约台账按Issue → 根因 → 所有权不变量 → 必需证据四列组织覆盖 Orca 中四个真实发生过的 IME 回归。以下完整继承原文档的四条契约并补充仓库内的实现落点。2.1 Native Chat 组合输入被流式渲染或附件落定覆盖Issue #16911根因浏览器拥有正在组合的 textarea 期间React reconciliation 或异步解析的附件写入应用层草稿重复的落定settlement会重新收养过期的 DOM。所有权不变量从compositionstart到第一次compositionend或 blur 为止textarea 归浏览器所有。所有已解析路径排队进入共享的语义汇semantic sink落定时先收养浏览器 DOM再一次性 flush。必需证据重复的过期流式重渲染须保留元素与 preedit空闲时的外部草稿仍能同步并发 SSH 完成须保持完成顺序且保留重复项两种落定顺序都只执行一次禁用时丢弃已排队工作blur 不得抢走焦点原生组合只提交一次。这条契约对应的是 Native Chat 输入区与流式内容更新的竞态。附件路径上限与落定逻辑集中在 use-native-chat-composer-attachments.ts该文件实现了NATIVE_FILE_DROP_MAX_PATHS的原子拒收语义。2.2 终端 preedit 没有可见光标Issue #16949根因不透明的组合覆盖层遮住了渲染器光标在最后一格final cell时过宽的 inline preedit 还会把 caret 放到被裁剪的屏幕之外。所有权不变量由既有的 xtermCompositionHelper在 preedit 之后、行余文row remainder之前拥有一个可见 caret末格组合结束须在屏幕内右对齐而行中组合保持左锚定。必需证据start、update、任意宽度末格包含性、行中余文放置、清理、以及未 start 直接 update均有测试覆盖预览终端与普通终端均继承实时光标主题。这一条的修复落在对 xterm 的规范化源码补丁里。config/patches/xterm-src/xterm__xterm6.1.0-beta.303.src.patch 中对CompositionHelper.ts的修改可见两处关键实现创建组合视图时插入xterm-composition-caretspan补丁第 956–959 行附近caret.className xterm-composition-caret并注释Keep DOM order LTR so the insertion caret follows the preedit以及末格对齐逻辑——补丁第 1075 行附近注释End alignment keeps the caret visible when the preedit consumes the remaining width正好对应末格结束对齐、行中左锚定的不变量。2.3 输入诊断记录不到 CJK 样本Issue #17104 之前根因探针只观察回显的 keydown而不是 reconciliation 后的组合提交commit随后只能猜哪一条排队输入拥有不透明的 TUI 输出。所有权不变量即使compositionend.data为空一次 reconciliation 后的组合也要被观察只有孤立输入才进入精确百分位重叠或丢输入间隙只产生一个聚合的、标记为模糊ambiguous的 burst。必需证据覆盖 Linux IBus 空数据提交、孤立的直接/IME 样本、混合来源模糊、超时/容量间隙、UTF-8 输出字节数、以及 stop/drain 清理。实现位于输入延迟探针模块。echo-candidate-timeout.ts 定义MAX_PENDING_ECHO_CANDIDATES 64echo-instrumentation.ts 的文件头注释与契约逐字对应Overlapping inputs are one ambiguous burst because terminal output is opaque; the probe never apportions one output batch across those inputs重叠输入合并为一个模糊 burst因为终端输出是不透明的探针绝不把同一批输出分摊到多条输入上。recordKeystroke在pendingCount MAX_PENDING_ECHO_CANDIDATES时转入trackIgnoredEchoDispatch即溢出不是任意归因而是显式的模糊计数。2.4 韩文 preedit 重复 Codex 占位符Issue #17104根因xterm 通用的行尾复制row-tail reproduction把应用语义层的 Codex/Claude composer 占位符也复制了出来而表现层样式无法安全地识别占位符。所有权不变量xterm 永远保留通用的被覆盖行文本只有 Orca 既有的结构性 composer 分类器structural composer classifier才在确切的、当前激活的组合会话期间掩码一个已验证的占位符repaint 重分类只在组合进行中执行end、blur 或 disposal 清空所有权、分类与监听器。任意 dim 输出和 shell 相似物lookalike必须保持可见。必需证据覆盖 Codex prompt/footer 与 Claude prompt/frame 分类、任意全 dim 与 shell 相似物反例、repaint 进入/退出、end/blur/disposal 清理以及在光标列 2 处保留通用行文本的渲染层 Electron 证据。这条契约的渲染侧实现就是 terminal-ime-composer-placeholder-mask.ts。三、有界状态与所有权契约每个瞬态集合都要有生命周期和上限清单第二节要求每个瞬态集合和所有权跟踪器都必须有显式的生命周期和边界bound。原文档列出三条具体契约仓库源码逐条可验3.1 Native Chat 文件拖放256 上限与原子拒收Native Chat 使用NATIVE_FILE_DROP_MAX_PATHS256。若某次解析完成的批次会跨越上限整批原子拒收溢出提示在落定期间保持可见已接受的路径保留顺序与重复项。队列在进入前re-entry 前、禁用时、以及 pane 所有者重挂载时清空。该常量在 useGlobalFileDrop.ts、use-native-chat-composer-attachments.ts 与 workspace-file-drag.ts 中被共同引用保证拖放、粘贴、composer 三条路径共享同一个容量语义。3.2 终端占位符掩码标量activeSessionId而非集合终端占位符掩码只跟踪一个标量activeSessionId因为 xterm 一次只渲染一个组合视图。从 terminal-ime-composer-placeholder-mask.ts 可以看到实现与契约完全一致let activeSessionId: number | null null第 27 行源码注释说明更晚的事务取代任何更旧的待定事务只保留 id 就能让畸形/重复 start 有界而不会驱逐活跃所有权handleSessionStart直接覆盖旧值新 start 取代旧 starthandleSessionEnd仅当activeSessionId id时才清空——过期的 end 无法清除最新的所有者handleBlur捕获阶段与dispose都会清空 id 并移除orca-ime-composer-placeholder类。清单特别强调组合路由仍刻意保留按 ID 的引用计数 map因为它服务于传输层所有权不能被标量取代。对应实现在 terminal-ime-composition-route.tspendingCompositionSessionCountsByElement是一个WeakMapHTMLElement, Mapnumber, number注释解释了为什么按会话引用计数——等待某个组合的调用者必须能区分它自己的会话与之后开始的会话两条重叠的路由可以拥有同一个会话而不清除彼此的待定状态。标量渲染层掩码与引用计数传输层路由各司其职这正是清单所要求的不要安装第二套组合状态机。3.3 输入诊断64 上限、超时排空与 pane 解绑清理输入诊断把待定与已忽略的回显候选上限设为MAX_PENDING_ECHO_CANDIDATES64对待定用户输入信号设上限、排空超时候选并在 pane 解绑时清空所有系列溢出产生的是显式的模糊 burst而不是任意归因。除前述 echo-candidate-timeout.ts 的常量定义外同目录的 echo-instrumentation.test.ts、diagnostic-lifecycle.test.ts 等测试文件对应有必需证据列中列出的超时/容量间隙与 stop/drain 清理断言。四、Native Chat 异步附件落定一次、原子、不抢焦点附件解析是一种外部语义写入涵盖本地文件选择、粘贴图片的临时保存、以及 SSH 上传。清单规定组合激活期间这些结果不得替换浏览器拥有的 textarea 值。具体验收场景有四条乱序完成并发两个 SSH 上传、第二个先完成、且同一路径返回两次——须保留完成顺序与两个重复项落定顺序等价第一个落定事件上先收养浏览器 DOM 再 flush 排队路径。必须在一个 React batch 内同时演练compositionend然后 blur和blur 然后compositionend两种顺序两种顺序都只能收养并 flush恰好一次禁用即丢弃若在上传解析前或队列 flush 前 composer 被禁用丢弃该结果blur 兜底若compositionend缺失blur 执行同样的一次性落定且不聚焦 textarea、不抢回焦点。从源码结构看这套共享语义汇的设计对应清单门禁第三条本地选择、粘贴图片临时保存、SSH 上传结果必须走同一个 resolved-attachment sink队列里排队的是语义路径永远不是整个草稿快照。五、跨平台验证矩阵合成事件之外还有原生证据层清单明确区分两层证据合成 DOM 事件只能证明 Orca 的事件与渲染契约不能代替操作系统的真实输入法。变更必须额外覆盖以下原生证据环境原生证据macOSNative Chat 与终端中各做一次原生韩文 2-set 组合preedit 在外部渲染后存活caret 保持可见提交恰好发生一次Windows微软韩文 IME 覆盖在未被触碰的 Codex 占位符上preedit 是唯一可见文本取消后占位符恢复普通行中内容保持可见Linux / SSHIBus Hangul SSH 托管 PTY空数据的compositionend仍产生一条诊断样本和一个已提交的音节仓库提供了 Linux 侧的自动化入口run-terminal-ibus-hangul-e2e.mjs 用于在 IBus 韩文环境下跑终端 e2e作为原生证据层的可执行载体。远程证据的三态判定对于远程SSH场景清单给出了严格的状态语义防止把问不到误判为已退出live拥有主机报告了当前的验证会话或进程身份exited需要主机侧正向证据证明同一身份已终止或已不存在unverifiable任何传输失败、过期身份、超时、或无法向拥有主机发问结果都是unverifiable——它绝不是组合或 PTY 进程已退出的证据。这一判定规则把不可验证与已退出明确切开避免监控/诊断系统因网络抖动产生假阴性。六、代码优雅度门禁提交前的九条硬约束清单最后一节要求每个 IME 修复必须通过全部检查这九条是仓库内可执行的评审标准也构成了对 IME 代码的通用设计约束复用既有组件复用已经拥有该状态或覆盖层的组件不安装第二套组合状态机所有权边界显式化浏览器、渲染器、PTY 三者边界写清楚临时文本provisional text不得泄漏进已提交状态或 PTY 输入单一语义汇本地选择、粘贴图片临时保存、SSH 上传结果走同一个 resolved-attachment sink队列排队语义路径而不是整个草稿快照正确性与微优化分离正确性变更不得夹带无关的微优化有界状态使用按组合per-composition有界的状态与工作每个监听器、定时器、观察者、DOM 节点都随其所有者一起销毁参见 terminal-ime-composer-placeholder-mask.ts 中dispose对三处事件监听与 render 订阅的完整清理配对反例测试用配对的反例negative测试保持普通拉丁输入、混合样式终端内容、本地与 SSH PTY、预览终端、文件夹工作区的行为不变平台怪癖收敛到事件契约平台差异放在事件契约或运行时平台检查之后禁止按 IME 厂商、语言或终端 Agent 名称分支xterm 补丁单一来源把规范化的 xterm 源码补丁作为唯一手工编辑来源然后一起重新生成其 bundle 补丁与 lockfile仓库配套了 regenerate-xterm-patches.mjs 与 xterm-upstream.jsonconfig/patches/下同时存放*.src.patch与生成后的 bundle patch即一处手改、两处再生确定性优先优先使用确定性重放或状态迁移测试原生证据是第二层永远不能替代回归覆盖。七、小结从症状修复到契约工程IME 回归清单 展示的是一种可迁移的 IME 工程方法先为每个回归定义所有权不变量与必需证据第二节再为所有瞬态集合加上显式的生命周期与数值上限256、标量会话 id、64然后规定外部异步写入的一次性、原子落定协议最后用合成事件 原生证据双层验证和三态远程判定封口。仓库内 terminal-ime-composition-route.ts、terminal-ime-composer-placeholder-mask.ts、typing-latency 探针 与 xterm 源码补丁 是这套契约在 Orca 中的具体落点可作为同类浏览器拥有输入、框架频繁重渲染、PTY 输出不透明三重竞态场景下的参考实现。【免费下载链接】orcaOrca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.项目地址: https://gitcode.com/GitHub_Trending/orca48/orca创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表