AI DAILY / 2026-09-27
Drawgent:在 Excalidraw 画布上运行的编程代理
Drawgent: Coding agent on a live Excalidraw canvas
全文中文翻译 · AI 生成,仅供学习交流
Drawgent:实时 Excalidraw 画布上的编程代理
消息会进入你正在跑的会话,你在 TUI 里能看到它们。drawgent 在运行时把它的 MCP(Model Context Protocol,模型上下文协议)工具注册到这个会话里。TUI 里敲的回复、工具调用和提示都会镜像到聊天面板。
Codex 会话存放在 ~/.codex/sessions/,实时跟踪用 codex queue --thread <id>;回复从会话的 rollout 文件镜像过来。
这个会话需要 drawgent MCP,在 setup 时注册,Codex 启动时加载。
使用画布
聊天面板(右侧)
发一条请求进去,回复和工具调用会流式推进。碰到权限提示就批准,要中断就按 Stop。
每轮条目下面会显示 token 用量(输入、其中被缓存的部分、输出),代理上下文窗口的使用率,以及本轮的开销(由 Claude 报告时)。
在画布上
在某个形状旁边或形状里面写一段以 AGENT: 开头的文字,或者从便签画一个箭头指向一个形状。停止输入约 2.5 秒后触发,附带给代理的有位置、指向的对象、附近的内容。代理会把它解析成一条绿色的 DONE: … 便签。
把它改回 AGENT: 可以再发一次。
激光区域
挑 Excalidraw 的激光工具(按 K),在画上某部分画圈或涂鸦。
描迹作为一条红色轮廓留在画布上,聊天面板会打开等你下指令,附带一个芯片列出这个区域覆盖到的对象(🔴 Laser zone · API、Redis ×)。你的下一条消息会连同这个区域(边界和覆盖的元素)一起发给代理,处理完之后描迹消失。笔画间隔在 4 秒内的算同一个区域,× 丢弃这个区域。
激光手势
drawgent 会读懂这些笔画,在区域芯片上显示出来,并把它们两端的元素告诉代理。激光开启时,左下角弹出一张包含这些手势的提示卡(× 隐藏,Gestures 按钮重新唤出):
- tap(点状)或 ✕,标定这个点(空白就放这里),或标定这个元素
- arrow(一条线或带箭头的线),从 → 到,表示移动、连接、插入、数据流
- line join,让线段两端相接
- zigzag、scribble(锯齿或涂鸦),或穿过元素的线,划掉它。代理也会知道删除它会破坏什么,包括悬空的箭头、需要打通的数据流、需要闭合的缺口、框内内容、代码链接
- ✓ 批准或保留
- circle,选中圈住的内容
- 圈加一根向外的箭头,把圈住的东西移到箭头所指之处
- ↔ / ↕(两端各有一个箭头的直线),表示此处需要更多空间,图沿轴被撑开,框和区域也跟着变大
撤销
代理的编辑会进编辑器的撤销栈,Ctrl+Z 一次回退一处。
改过画布的那一轮,聊天条目下面会有「↶ Undo N canvas changes」,代理也提供 undo_changes 工具(最近一次编辑,或整轮)。人在那之后改动过的元素保持原样。
提示按队列依次执行。已被处理过的排队便签会被跳过。
excalidraw.com 房间
drawgent up --room 'https://excalidraw.com/#room=<id>,<key>'drawgent 作为协作者(🤖 Agent,光标跟着它的编辑走)加入房间。
人可以继续留在 excalidraw.com,那边的 AGENT: 便签会送到你的代理,它做的编辑也会实时出现在那里。
流量用房间密钥做端到端加密。空房间从 Excalidraw 的 Firestore 存储加载和保存。
本地编辑器镜像该房间,并保留聊天面板。
其他命令
drawgent mcp 是基于 stdio 的 MCP 服务器,提供画布工具。代理启动它,它自己找正在跑的 drawgent up。
drawgent serve 是底层服务器,需要显式指定代理(--agent claude,codex,opencode 表示已配置好的代理,或 name=command 表示任意 ACP 代理),用于脚本和容器。
up/serve 的可选项,--port、--room、--token(API bearer 加 URL 中的 ?token=)、--permissions canvas|ask|all(默认 canvas,画图工具自动批准,其他操作在聊天面板里询问)、--data、--settle-ms。
可选:Docker
docker compose up --build 跑起一个画布服务器(drawgent + Chromium,不含代理),比如在服务器上托管共享画布或房间桥接。代理从不打包进来,它们始终跑在你自己的环境里。
从源码构建
npm ci && npm run build
# 编辑器 + 渲染器页面 -> dist/(内嵌进二进制)cargo install --path .
# 或者:cargo build --releaseRelease 构建(nix develop -c make … 提供工具链,或 rustup + cargo-zigbuild):
| 命令 | 输出 |
| --- | --- |
| make musl / make dist | 静态 Linux x86_64 二进制 / 压缩包(MUSL_TARGET=aarch64-unknown-linux-musl 用于 ARM) |
| make darwin / make dist-darwin | macOS universal 二进制(Intel + Apple Silicon,macOS ≥ 13)/ 压缩包 |macOS 构建方式是在 Linux 上用 zig 交叉编译,不需要 Apple SDK(drawgent 只链接 libSystem、libiconv 和 libcharset)。
arm64 切片由链接器 ad-hoc 签名。没有做公证,下载后跑一次 xattr -d com.apple.quarantine drawgent。
状态,还没在真 Mac 上测过。
小内存机器用 JOBS=1。其中一个依赖(chromiumoxide_cdp)编译时吃很多内存。
代理工具(MCP)
- drawing_guide 提供按角色配色、尺寸、布局、常见错误(参考官方 excalidraw-mcp 指南,MIT 协议)
- get_scene 首次读取后只返回变更部分,减去代理自己的编辑;其他情况返回完整内容
- check_layout 做几何 lint,包括重叠、标签溢出或破损、箭头穿过形状或被框裁掉、文字过小或对比度过低、近乎错位、过度拥挤。修复以 update patch 形式给出,编辑回复会带上它引入的问题

