我们想接入 VSCode 通过 SSH 做远程编辑所用的流程,因为现在人人都在用 VSCode,尤其是在用那些借助 LLM 生成代码的 VSCode 分支版本。
LLM 把代码写错,我们管它叫“幻觉”;人把代码写错,我们管它叫“工程”。
如果你清楚自己在做什么,LLM 生成的代码在一般情况下就很有用。但如果你能让 LLM 与执行环境形成闭环(也就是“Agent”架构),它就会格外好用。这件事可说的很多,不过眼下先说一点:这是对付幻觉的一剂半有效的解药——LLM 生成代码,智能体脚手架运行代码,代码报出错误,智能体再把错误反馈给 LLM,如此反复迭代。
所以,问题显而易见:你不会希望这种迭代式开发过程发生在自己的开发笔记本上,因为 LLM 缺乏边界感,它改起你的系统配置来,会和改你正在做的那个 Git 项目一样乐此不疲。你真正想要的是:为 LLM 运行一套闭环的、智能体式(“agentic”?现在是这么说的吗)的配置,跑在一个能瞬间启动、绝对坑不了你的全新 Linux 实例上。你应该明白我们要往哪儿去了。
不过!我想先表达一点担忧。
Emacs 里有远程编辑系统的精神先驱,一大坨极其好用的 Elisp,名叫“Tramp”。只要你能把 Tramp 接到任何一种能运行 Bourne shell 命令的交互式环境(通常是一个 SSH 会话)上,它就能把 Emacs 延伸到那个环境里。
VSCode 也有一个类似 Tramp 的功能。挺不错,对吧?你大概会以为,就是拿 Tramp 来,稍微简化一下,把 Elisp 换成 Typescript。
你想错了!
Tramp 是就地取材、依托远程连接本身工作的,VSCode 却是发动全面入侵:它先运行一段 Bash 引导脚本,下载一个智能体,其中还包括一份 Node 的二进制安装。
我想这就是源代码?
这个智能体通过端口转发的 SSH 运行。它会回连到你正在运行的 VSCode 前端,建立一条 WebSockets 连接。这条连接上的底层协议可以:
- 在文件系统里随意游走
- 编辑任意文件
- 启动它自己的 shell PTY 进程
- 让自己常驻
在安全领域,对按这种方式工作的工具有个专门的名字。我不会大声说出来,因为那对 VSCode 不公平,不过咱们就说,这个名字带着一股 murid 的味道吧。
让人用 VSCode 远程编辑开发服务器上的东西,我会有点紧张;要是在生产环境出事故的时候发生这种事,我会气得发狂。
事实证明,要在 VSCode 里连上自定义的 Fly Machine,我们根本不用在意这些,所以这一切在深层意义上都无关紧要。不过:我们已经决定重新做回一个博客了,所以我们得搞明白这些,现在你也知道了。
