Skip to content

[BUG] terminal.created WS 事件未填充 terminalMetaAtomFamily,外部创建的终端面板空白 #17

Description

@pallyoung

问题描述

terminal-panel.tsx 处理 terminal.created WebSocket 事件时,只更新了终端 ID 列表(setTerminalIdssetActiveTerminalId),但未设置 terminalMetaAtomFamily

XtermHost 的渲染守卫检查 activeTerminalMeta(来自 terminalMetaAtomFamily),若该值为 null,则终端面板不渲染。

影响场景

  • 用户在第二个浏览器 tab 中打开工作区,此时终端由另一个 tab 创建
  • Agent 在后台创建终端
  • 以上场景下,WS 事件到达但 meta 未填充,终端面板一片空白

对比

  • 当前 tab 按钮创建终端:走 terminal.create dispatch 结果路径(line 180),正确调用了 store.set(terminalMetaAtomFamily(...))
  • terminal.list 初始化:正确填充了 meta(line 96)
  • terminal.created 事件路径:缺失

相关代码

if (event === 'created') {
const createData = payload as { id: string; kind: 'shell' | 'agent' };
if (createData.kind !== 'shell') {
return;
}
setTerminalIds((prev) => {
if (prev.includes(createData.id)) return prev;
return [...prev, createData.id];
});
setActiveTerminalId(createData.id);
} else if (event === 'output') {
const outputData = payload as TerminalBinaryPayload;
const meta = store.get(terminalMetaAtomFamily(terminalId));
if (!meta || meta.kind !== 'shell') return;

修复建议

terminal.created 事件处理器中,向服务端请求该 terminal 的元数据(或从事件 payload 中补充),并调用 store.set(terminalMetaAtomFamily(createData.id), {...}) 填充 meta。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions