为什么做 NeuroSquad:把智能体放上画布,而不是排成一排标签页
第一次提交三周之后,第一个公开版本。它要解决什么问题,以及支撑整个应用的三个决定。
今天,NeuroSquad 0.1.91 正式公开——一个 Windows 安装程序、十个智能体 CLI,外加一块画布。第一次提交是在 9 月 3 日,开发过程中,运行在 NeuroSquad 自家卡片里的智能体也帮着一起写了它。这篇文章讲的是:它为什么长成现在这个样子。
问题:一排需要你一直盯着的标签页
智能体 CLI 已经好用到这种程度:只开一个,瓶颈就不在它身上了。于是你再开一个去写测试,第三个去补文档,也许第四个去处理另一个仓库。接下来,工作就变成了“盯梢”:哪个标签页已经做完了,哪个卡在“我可以运行这条命令吗?”这种问题上已经十分钟,哪个还在跑。
标签页天生不适合这件事。它把眼前这一个之外的一切都藏起来,不告诉你任何状态,彼此之间也一无所知。第三个标签页里的智能体看不到第五个标签页里的浏览器——哪怕那正是它需要的。
所以 NeuroSquad 押了三个注。每个智能体都是画布上的一张带真实终端的卡片,整块画布一眼尽收。智能体做完一轮或需要你时,应用会主动告诉你,你不用再挨个去看。两张卡片之间的一支箭头,让智能体可以使用箭头指向的东西。
卡片就是真实的终端,而且绝不能死
卡片不是一个假装成智能体的聊天窗口。它就是你本来就在用的 CLI——Claude Code、Codex CLI、OpenCode、Qwen Code,以及另外六个——运行在真实的伪终端里,有它自己的界面、自己的快捷键和自己的小脾气。CLI 明天更新,卡片明天就用上新版本。
这个选择定下了整个代码库的第一条铁律:只要智能体还活着,终端组件就绝不能卸载,因为一卸载,进程就被杀掉了。听上去理所当然,结果它几乎决定了画布上的每一个功能:
- 切换工作区不会替换画布。本次会话中打开过的每个工作区都保留着自己已挂载的画布,不活跃的只是被隐藏起来。
- 放大到一组卡片,是把镜头移到这个分组的框上,而不是做筛选——筛选会把分组外的卡片卸载掉。
- 把卡片展开到全屏,是一个 1:1 的视口加上一份保存下来的几何信息,而不是换一个组件。
- 画布库在按下 Delete 键时会删除选中的节点。在这里,这等于按一下键就杀掉一个会话,所以画布库根本无权删除节点:由我们自己的监听器收集选中项,并在一个对话框里统一问你一次。
同一个赌注下面还压着一大堆 Windows 的“管道活”。CLI 要通过系统自身的查找机制解析成绝对路径,因为桌面应用看到的 PATH 和你终端里的不一样。路径要用正斜杠传递,因为伪终端库会把反斜杠搞乱——cmd.exe 除外,它会把 C:/… 当成一串命令开关。父智能体留在环境里的变量要在子智能体启动前清掉,否则子智能体会悄悄停止保存会话记录。这些都看不见,而且全都是靠把真东西跑起来才发现的。
“已完成”和“等你处理”是两件不同的事
画布的全部意义在于:你可以把目光移开。所以应用必须知道什么时候该把你叫回来——而原因有两种,截然不同。已完成意味着智能体结束了这一轮,你想什么时候看回答都行。等你处理意味着智能体此刻被卡住了,在你批准某件事之前寸步难行。
第一个版本分不清这两者。它盯着终端看:窗口标题 1.2 秒不再变化、输出安静 2.5 秒,就算这一轮结束了。对“已完成”来说这是个不错的猜测,可它和一个正在等权限确认的智能体,是完全相同的沉默。
办法是直接问智能体本身。Claude Code 有生命周期钩子,所以每张卡片启动它时,都会在你自己的设置之上叠加一个小小的设置文件:你提交提示词时,它报告工作中;它发出通知时,报告等你处理;它停下时,报告已完成。每个钩子都只是一行 curl,发往应用在本地回环接口上运行的服务器,卡片的令牌放在 URL 里而不是请求头里——这样无论在哪种 Shell 里执行,这条命令都能原样生效。
通过钩子上报状态的智能体,会为自己关掉旧的猜测式检测器,否则你会收到两次提醒,而且猜出来的“已完成”会覆盖真实的“等你处理”。没有钩子的 CLI 仍然使用启发式判断。点击通知,画布镜头会飞到那张卡片上,卡片闪起绿光,而且会一直闪到镜头飞到为止。
箭头就是工具
第三个赌注是大家问得最多的。NeuroSquad 在 127.0.0.1 上运行自己的 MCP 服务器,每个支持 MCP 的智能体都会在上面拿到一个会话。会话里有什么,由画布上的箭头决定。
- 一支指向浏览器卡片的箭头,给智能体
browser_*工具:一个真实的 Chrome,就显示在卡片里,你看着智能体在里面点击和输入。 - 一支指向终端卡片的箭头,给它
terminal_*:在那个 Shell 里运行命令,并读取它的屏幕。 - 指向笔记的箭头给它
note_*,指向待办清单的给它todo_*。 - 指向另一个智能体的箭头给它
agent_*——而这支箭头是有方向的。它从负责人指向助手;助手不能把活儿反推回去。
箭头就是权限。没有箭头,就没有工具——于是画布如实地画出了每个智能体能触及的范围。每一次调用都会在发生的那一刻画在对应的箭头上,你能亲眼看到负责人把任务交给助手,而不必去日志里翻。
主智能体把工作拆到看板上,沿箭头逐一交出;每个帮手——Codex、Qwen、OpenCode——自己认领任务,完成后移到“审阅”。
默认本地
这里没有账号,中间也没有我们的服务器。工作区、卡片和箭头都是应用数据文件夹里的 JSON 文件。听写在你的电脑上完成识别,用的是 Parakeet 或 Whisper。“用量”页面从智能体自己的日志里读取 token 和费用,而不是在它们前面架一个代理。删除卡片永远不会碰你的项目文件夹。
这个版本里还有不少这篇文章没能展开的内容:能在手机浏览器里运行整个应用的远程访问,每个智能体各自隔离的 git worktree,以及预算刹车——工作区花费达到上限时,它会中断其中的每一个智能体,用的是 Ctrl+C 而不是强杀,所以不会丢失任何会话。
接下来
第一个版本的安装程序有 550 MB,其中大部分是一个语音模型,只有用听写的人才会加载它。这是第一件要解决的事。再往后:一个会明确告诉你是什么挡了路的安装程序,以及能自己安装的更新。
0.1.91 的完整内容见更新日志。

