跳转至

待处理的分割关闭可能遗漏 shell 退役

已恢复的分割窗格可以在其 IPC spawn/reattach 回复仍待处理时被显式关闭。此时其传输层尚未绑定 PTY ID。旧的关闭路径会删除持久化叶节点绑定,并销毁未绑定的传输层,而不会请求退役。延迟结果清理有意保留了用于重新挂载的 reattach 和冷恢复回复,因此现有 shell 或新冷恢复的 shell 可能在没有窗格且没有 kill 请求的情况下继续存活。

这是一个与 #15210 中 缺失的 kill 请求 相匹配的具体机制。相关的关闭、延迟结果排除以及 daemon 冷恢复行为同时存在于 v1.4.184 和 v1.4.198 中。该报告并未证明这一序列产生了其 51 个 shell。它也没有证明 Electron-main 堆中存在保留的斜率,或独立解释 #19831。

所有权与修复

显式分割关闭钩子在移除叶节点绑定之前捕获其持久化请求的 PTY。现有的标签页退役规划会解析本地/直接 SSH 执行所有者。它会立即请求退役,并保留一个显式关闭回调,用于处理延迟的同 ID 结果。延迟回调会重新检查当前 store 所有权和当前传输映射,包括同一叶节点上的替换项。只有当没有所有者剩余时,它才会发出第二次请求。

仅主动请求是不够的:在 adapter/history 锁存在之前,Electron spawn 预检可能仍在等待。kill 可能返回 SessionNotFoundError,随后待处理的 spawn 会创建一个新的冷恢复 shell。延迟结果请求关闭了这个窗口。如果 spawn 已经拥有 adapter 的历史锁,则普通的已知 ID 关闭会排在其后等待;对照用例保留该行为。

通用 detach/destroy 保持其现有行为。重复 destroy 保留显式意图,而不同的返回 reattach 身份仍受保护。标签页聚合/行 ID 不被计为独立的同标签页所有者;它可能是正在关闭的叶节点自身的过期索引。其他存活标签页使用所有现有退役所有权来源;远程别名匹配复用现有规范化身份。

成对运行时句柄、运行时拥有的原生提示以及未解析的所有者绝不会回退到本地 kill。它们不属于本次 IPC 修复范围。provider 失败会由现有退役辅助函数记录;请求退役并不确认进程已死亡。不会引入主机清单扫描、wire 变更、全局墓碑或由重新挂载驱动的关闭。在关闭时已经存在的共享所有者保留其既定的退役责任;这不会改变所有 pending-fresh/共享所有者竞态。

关闭确认评审更正

原始测试在关闭决策之后调用 executeClosePane。另一次评审发现,公共 handleRequestClosePane 回调在传输层仍未绑定时跳过了运行中工作检查。退役现在会从现有退役计划中获取待处理的本地/直接 SSH 身份,并首先运行现有确认流程。未验证的待处理探测会请求确认;取消会保留进程。在延迟决策或确认生效之前,捕获的标签页代际、窗格、传输层、绑定和执行所有者必须仍然匹配。已成为最终窗格的分割不能将旧的确认变成整个标签页关闭。

pending-pane-close-confirmation.test.ts 验证公共回调,包括存活和未验证的工作、取消、已确认关闭、已完成附加、所有权替换以及直接 SSH。这些是在下方原始对比证明之后添加的独立回归控制项;它们不会改变其历史用例数量。

复现

在已安装现有依赖项的仓库根目录中:

ORCA_BACKGROUND_LAUNCH=1 node docs/audits/pending-split-close/reproduce.mjs

该脚本运行实际的关闭钩子、布局绑定、窗格关闭处理器、IPC 传输层、daemon 服务器和 daemon adapter。React 注册以及无关的展示/状态回调会被 mock。daemon 用例使用临时 socket、合成历史和现有假子进程 fixture;不会启动真实 shell 或 Orca 窗口。它会清理其临时配置,并通过仓库的跨平台 runProcess 调用 Vitest。

fix.patch 仅在基线的临时 Vite 源码转换中被反向应用。工作文件保持不变。新的辅助/测试源码仍然存在,但基线关闭钩子无法调用该辅助函数。源码哈希和精确用例记录在 results.json 中:

版本 通过 失败
修复前 10 14
修复后 24 0

这 24 个用例保留了原始九个复现/对照场景,并新增同叶节点/新映射/不同标签页采用、兄弟所有权、重复 destroy、provider 失败/重试、spawn 拒绝、返回 ID 不匹配、直接 SSH、未解析/成对运行时路由以及文件夹工作区覆盖。八个独立的所有权查询测试覆盖 legacy/scoped 别名和现有标签页所有权来源。基线失败包括关于新主动请求的断言;它们不是 14 个独立泄漏。

历史入口点:v1.4.184 TerminalPane.tsx:1163、use-terminal-pane-lifecycle.ts:1368、pty-transport.ts:859 和 src/main/daemon/daemon-pty-adapter.ts:750。当前等价项为 use-terminal-pane-close-actions.ts、terminal-pane-pane-closed.ts、ipc-pty-connect.ts 和 daemon-pty-spawn-result.ts。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca