Skip to main content

工作台远程组件

远程组件(Remote Component)是视图扩展(View Extension)的一种渲染方式,用于在 Assistant 工作台中承载插件自定义 UI。 视图扩展负责视图出现在哪里、对谁可见以及允许使用哪些能力;远程组件负责这些能力在 iframe 中如何呈现和交互。它不是独立的插件类型,也不替代服务端视图提供器。
开始前建议先阅读视图扩展

适用场景

当工作台需要以下能力时使用远程组件:
  • 多面板业务工作台、编辑器或画布。
  • 拖放、时间线、图形化编辑等复杂交互。
  • 需要组合多个分页数据集和局部刷新。
  • 需要与 Assistant 对话、文件预览或其他工作台视图协同。
标准指标、表格、列表或只读详情优先使用平台声明式视图。

推荐工程结构

将可维护源码和生成产物分开:
  • src/**/*.tssrc/**/*.tsx 是源码。
  • app.jsapp.css 是构建产物,不应手工维护。
  • 插件构建必须生成并复制远程组件产物。
  • 为远程源码配置独立的 TypeScript 类型检查。
React 是推荐开发方式。视图协议也支持 vueesm 运行时;当前产品执行 iframe 隔离模式。

定义稳定键

公开视图键遵循 <providerKey>__<manifestKey>component.entry 是提供器内部的入口键,不是浏览器 URL。

注册视图提供器

视图提供器返回工作台清单,并处理数据与操作:
REVIEW_FEATURE 应由拥有合同审核数据和 Agent 工具的领域中间件声明。Assistant 连接该中间件后,工作台宿主才会展示视图。 如果视图需要固定工作台入口,在 agent.workbench.fixed 插槽返回同一清单,并增加 workbench.fixed 和菜单配置。

返回远程组件入口

提供器通过 getRemoteComponentEntry() 返回完整 HTML 文档。推荐使用 Plugin SDK 的 HTML 生成器:
平台会校验远程入口键,并在获取 HTML 前重新检查宿主访问、视图可见性和功能激活状态。

实现前端入口

远程组件先安装桥接监听器,再在收到 init 后渲染业务 UI:
完整的消息类型、超时、操作、文件、客户端命令和宿主事件处理见远程组件宿主桥接

数据与操作

远程组件不直接调用平台 API。它通过宿主桥接请求数据:
提供器使用服务端上下文查询数据,并在筛选和分页前应用租户、组织与用户权限:
数据量较大的工作台应按页和面板远程加载。parameters 只传递标量或标量数组,不要直接发送嵌套筛选对象。 变更操作通过清单声明的 executeActionexecuteFileAction 完成。成功结果可以返回 refresh: true;复杂远程组件也可以根据返回的业务 ID 只刷新受影响的区域。

主题、组件与布局

  • 使用 @xpert-ai/plugin-shadcn-ui 构建按钮、输入框、对话框、表格等标准控件。
  • 在远程入口中加载一次共享样式,并在应用宿主 --xui-* 主题令牌后调用 installShadcnThemeVars()
  • 使用 Tailwind 编译远程组件自己的 TSX,生成生产 app.css
  • 保持 htmlbody#root 和最外层应用为 width: 100%height: 100%
  • 在 flex/grid 祖先上设置 min-width: 0min-height: 0 和受控溢出。
  • 将竞争主工作区宽度的导航或检查器面板设计为可折叠。
  • 使用 AlertDialog 处理真正有后果的确认;不要使用浏览器原生确认框。

多语言

以宿主 init.locale 为准,在入口处一次性归一化语言。至少维护 en-USzh-Hans 资源;不要把所有 zh-* 语言都映射为简体中文。 组件使用语义翻译键和共享 Intl 格式化器,不应在 JSX 中编写 locale === ... 文案分支。视图清单继续使用 { en_US, zh_Hans } 平台多语言对象。

状态与调试

  • 临时 UI 状态保存在 React state 或 ref 中。
  • 持久业务状态通过宿主桥接写入服务端。
  • 不要读取或写入 localStoragesessionStorage
  • 详细日志由宿主 init.debug.enabled 控制,生产环境默认关闭。
  • 日志不得包含令牌、租户/组织 ID、文件内容、完整快照或个人敏感信息。

可选:由工具按需打开

常驻工作台入口由宿主枚举插槽。只有当视图应在某个工具调用后出现时,才返回 xpert.extension_view
工具只负责打开已经注册的视图,不应返回完整页面数据,也不应携带宿主身份、API 地址或凭据。

验证清单

  • 视图提供器已在插件服务端模块中注册。
  • 清单包含 source 和正确的 activation.requiredFeatures
  • 移除对应功能后,Agent 工具和视图都会消失。
  • 远程入口键、视图键和公开视图键稳定且经过测试。
  • 生产构建会重新生成 app.jsapp.css,并检查生成产物未过期。
  • iframe 消息校验来源、协议版本、实例 ID 和请求 ID。
  • 数据、JSON 操作、文件操作、客户端命令和宿主事件都已在清单中声明。
  • 数据读取和变更按租户、组织、用户和业务权限隔离。
  • 主题在浅色、深色和支持的密度下正确工作。
  • 中英文资源、键和插值参数保持一致。
  • 使用真实生成产物运行工作台端到端测试。
  • 涉及平台权限、文件或安装状态时,再执行一次已安装平台验证。
继续阅读远程组件宿主桥接,查看每种宿主能力的协议映射。