# 宣布推出工作区组件 (/docs/zh/posts/announcing-workspace-widgets)



# 宣布推出工作区组件 [#宣布推出工作区组件]

今天我们发布**工作区组件**，一种把实时、可交互的应用直接放到 Robutler 工作区画布上的方式，与你的智能体和聊天并排摆放。

<!-- more -->

## 变化在哪里 [#变化在哪里]

在今天之前，工作区是一个很好的地方，用来和你的智能体对话、把内容钉住待用。有了组件，它变成一张真正的桌面，由一块块可组合的小部件搭起来：

* 一个在你的标签页里运行的 **Python 内核**，预装了 numpy 和 matplotlib。画一张图，它会作为同级组件落在画布上，而不是埋在某个终端面板里。
* 一个 **本地终端**，连接到你自己机器上的守护进程。
* 一个 **SSH 组件**，用于你反复登录的生产机器。密钥和主机管理方式和旧版终端一样，只是更干净。
* 一个 **浏览器嵌入**，用于你天天盯着的那些仪表盘。
* 一个 **CodeMirror** 编辑器，用于快速改文本和代码。
* **便签**、**图形**和**连线**，用来在画布上勾画方案（像 Figjam，只不过就在你的智能体旁边）。
* 还有几个街机风格的小游戏（贪吃蛇、俄罗斯方块、太空侵略者），因为工作区也该有点乐趣。

从 `+` 按钮 → **组件** → 搜索目录，就能开一个。

## 智能体构建者有什么新东西 [#智能体构建者有什么新东西]

组件不只是给人用的。智能体可以：

* **把组件生成到画布上**，通过 `present.*` 这一族工具。`present.image`、`present.code`、`present.url`、`present.chart`、`present.note`，以及通用的 `present.widget` 辅助方法，让智能体把可视化产物贴在对话旁边。
* **驱动 Python 内核**，通过 `workspace_widgets_invoke(id, 'eval' | 'run', ...)`。订阅 `stdout`、`stderr`、`display` 事件，matplotlib 图形会实时直接流回画布。
* **运行终端命令**，在守护进程组件和 SSH 组件上使用同一个 `workspace_widgets_invoke(id, 'run', ...)` 工具。每条命令都会写一条可审计的 `widget.agent_command` 通知，你能清楚看到到底执行了什么。

智能体工厂已经知道这个新界面，它可以根据几条提示词线索构建组件、用 `host.kv` 接上状态，并为原生 iOS 和 Android 版 Robutler 应用输出 DSL 投影。

## 默认信任，有风险的能力需手动开启 [#默认信任有风险的能力需手动开启]

如果开关一直是打开的，让智能体执行终端命令就很危险。所以我们采用相反的默认值：每个守护进程组件和 SSH 组件启动时，**允许智能体执行命令**都是关闭的。你准备好了就按组件打开它，用完就关掉。

Python 内核默认是打开的，因为它们被沙盒隔离在你的标签页里，即使智能体行为再离谱也跑不出 Pyodide。如果你想在共享会话中锁住内核，开关也一样在那里。

每一条被接受和被拒绝的智能体命令都会写一行审计记录。打开通知信息流，搜索 `widget.agent_command`，就能看到你这一周的历史。

## 跨平台组件 [#跨平台组件]

组件可以选择附带一份**投影**，也就是从一个 JS 函数编译出来的小型声明式树。投影支撑三件事：

. 一个轻量预览，在画布上渲染而不加载完整的 iframe（钉了几十个组件时，对性能提升很大）。
. 在今年晚些时候上线的 iOS 和 Android 版 Robutler 应用里做原生组件渲染。应用会定期轮询投影，并把它渲染成真正的 iOS 或 Android 组件卡片。
. 一个停靠栏投影，把组件钉到停靠栏后由投影接手，这样你可以一眼看到状态，而不必把完整的 iframe 一直放在内存里。

如果你今天在写组件，返回一份投影是可选的，但我们建议这么做。DSL 语法见[宿主 SDK 指南](/guides/widgets/host-sdk/)。

## 试一试 [#试一试]

打开你的[工作区](/workspace)，点 `+` 按钮，选择**组件**。或者干脆问你的智能体：“给我看看 NVDA 的股价图”，然后看着 Python 内核启动、matplotlib 图形生成，智能体在旁边给它配上说明。

我们很期待看到你构建的东西。

Robutler 团队
