编码 agent 的
控制面。
在同一个表面里跑 Claude Code、Codex、Grok,还有另外三个——单个使唤,或者让它们组队盯着同一个目标。用你自己的订阅。
curl -fsSL https://dl.ycodium.com/install.sh | sh它会给自己写工具。
这是一条真跑过的会话。agent 读了插件 API、写出一个插件、停下来问你,然后调用了它自己刚做好的那个工具。
*.md.*.md.*.md:
3 README.md
The plugin (line-counter) is mounted in this thread only — it wasn't installed permanently, so it disappears when this session ends. It walks the project tree (skipping .git, node_modules, etc.), matches file basenames against your glob, and returns lines<TAB>path, sorted longest first. Say the word if you want it made permanent (ycodium_plugin_promote).这是产品时间线的一层薄呈现——展开的输出、diff、完整的批准卡都在应用里。
它会看页面。
agent 是真去看了页面,不是听人转述。总价是它从渲染出来的购物车上读到的,改掉背后那一行,重新加载,再看一眼。下面两张截图就是它当时真看到的。
site/cart.js:13 — the reduce sums item.price but ignores item.qty.
Fixing it now.
cart.js:13 summed item.price without multiplying by item.qty, so the Cable's quantity of 3 wasn't counted. Fixed by changing the reduce to sum + item.price * item.qty.
这是产品时间线的一层薄呈现——浏览器本身、元素选取、控制台都在应用里。
远程是默认,不是事后补的。
Ycodium 跑在一台你自己的机器上——闲置的台式机、家里的小服务器、云上的一个小实例都行——所有客户端都连到这一个地方。
- 多个客户端能同时连到同一个 environment。
- 合上笔记本,agent 照样接着跑。
- 用手机看一眼进度。
- 换一台设备,接上同一个会话继续。
直接连到 Host,走局域网或者一个可达地址,路径上没有第三方。
不用开放端口。Ycodium 的 relay——官方托管或自建——负责在客户端和 Host 之间转发这条连接。
已经在用 tailnet?把 Host 发布到 Tailscale Serve HTTPS 上,用一个干净的 MagicDNS 地址配对。
把桌面 app 指向 user@host,它会在那台机器上启动或接上已有的 Ycodium,再转发一个本地端口——远端不用你手动装任何东西。
Relay 只负责接通,不进会话。
直连够不到一台藏在你管不着的路由器后面的机器。Relay 的活儿是把两头介绍给彼此——不是替它们传话。会话是端到端封死的,Relay 转发的是它读不懂的字节。
- 某个客户端要找哪一台机器
- 一个回给它的地址,两分钟就过期
- 转发的字节有多大、什么时候来
- 会话里的任何内容
- 你机器的静态密钥,或者你客户端的
- 任何它能铸造或重放的凭据
会话身份是主机的静态密钥加客户端的静态密钥,不是 TLS 证书,也不是隧道域名。你的服务器第一次启动就生成自己那把钥匙,客户端把它 pin 下来;TLS 仍然承载密文,但你信的已经不是它了。
connect 回的是环境 id、一个地址、两分钟的有效期。不含凭据,也绝不替你铸一个——客户端拿自己已经持有的授权去认证那个地址,没有就先配对。
同一份 handler 既能跑成 Cloudflare Worker,也能跑成一个普通 Node 进程,所以自建的和托管的可以互换。两边都不持有主机密钥——这正是互换敢换的原因。
自带订阅
Ycodium 不转卖 token。用你已有的登录凭据,接入你本来就在付费的那些 agent——六个按名字配好了,剩下任何会说 ACP 的,填一条命令就能接。
同一家 provider,两个账号并排。
一个账号就是一个实例:自己的登录、自己的默认模型、自己的颜色。它们之间什么都不共享,而且选择是跟着轮次走的——中途换一下,下一轮就跑在另一个账号上。
CLAUDE_CONFIG_DIR=~/.claude-a- 自己的登录
- 自己的默认模型
- 自己的代理
CLAUDE_CONFIG_DIR=~/.claude-b- 另一个登录
- 另一个默认模型
- 直连,不走代理
driver 启动 CLI 时把这个实例自己的配置目录交给它,两份登录因此不会互相覆盖。Codex 走 CODEX_HOME,同一个道理;ACP 那批各自声明自己的变量名。
displayNameaccentColorenvironmentproxyIdenabledhiddenModelsmodelOrderdefaultModel
- 选择器上写着每个实例登的是谁——从它自己那份凭据文件里读出来的,只解不验,只用于显示,不拿去授权任何东西
- CLI 支持设备码就能无头登录:它自己打印网址和验证码、轮询到你批准,所以没有图形界面的机器也能持有账号
- 模型选择挂在
thread.turn.start上,不挂在会话上,所以一条对话里可以有两个账号各跑几轮
同一个会话,网页、桌面、手机三端都在。
在网页开始,切到桌面接着做,用手机看看进度——同一个 environment,同一段历史,不用手动交接。
也可以在 Telegram、企业微信或飞书里 @ 一个机器人:活儿照样落在普通项目的普通会话上,之后从三端任意一个接着看。
别的事,也不用离开这个会话。
右边那条面板放着你本来得切窗口才能用的工具。它们跟着你打开的项目走,而且跑在 environment 上,不是在你的浏览器里。
暂存、取消暂存、提交、切分支或 worktree。本地仓库还能一步发布到 GitHub 或 GitLab,顺手把 remote 接好。
浏览、打开、编辑、搜索、上传下载——动的是 agent 干活那台机器上的文件,不是副本。
同一台机器上的真终端,在对话下面的抽屉里。
在面板里读和审 GitHub 的 pull request、GitLab 的 merge request。
内置预览,用来看 agent 刚起的那个 dev server。
四挡,按会话设,就在输入框上:逐条确认、自动接受改动、自动、完全放开。
工具配一次,每个 agent 都拿得到。
在设置里加一个 MCP 服务器或者一个技能,Ycodium 之后启动的每个 provider 都会收到它。Ycodium 从不改 provider 自己的配置文件——是启动时把这些条目递进去的,所以你手工配好的东西不会被覆盖。
stdio、http、sse 三种传输,每个 CLI 单独开关,健康检查从 environment 发起而不是从你的浏览器。某个 CLI 说不了某种传输,那一格是灰的,不会悄悄跳过。
一个装着 SKILL.md 的文件夹,写到 Claude、Codex、OpenCode 各自会去找的位置。两个开关分别管 agent 能不能调它、你能不能调它。
设置里加的归这台机器,对上面每个项目都生效。写进仓库 ycodium.json 的跟着仓库走,重名时它说了算。
而产品本身就是插件。
群聊桥、PR 面板、会话导入——每一个都是插件,挂在跟你自己写的插件同一套 API 上。这套 API 里没有一处是留给我们自己的。
ctx.toolkit()给 agent 调的工具,走 MCPctx.command()一条客户端能派发的命令ctx.reactor()对编排事件的一个反应ctx.interval()一条后台循环,宿主替你收尾ctx.cli()一条 ycodium 子命令ctx.settingsCard()设置里的一张卡,含密文字段ui.pages应用里属于你的一个页面ui.panels停靠在对话旁边的面板ui.appearance一套皮肤,一个插件最多一张
fs.read读文件,路径前缀要事先声明process.spawn跑白名单里的程序process.workspace并且是在项目目录里跑
没声明的一律在调用那一刻被拒,不是事后审计。批准卡上会先把这个插件申请了什么摊开给你看。
conversationtool-displayskill-discoveryconnector-registrytelemetrytrace-diagnosticsplugin-center
这才是一套插件 API 老不老实的检验:如果它撑不起产品自己的功能,也就撑不起你的。这一页最上面那段演示,就是一个 agent 从零写出这样一个插件、并在会话里跑起来。
你的 agent,不该窝在一个终端窗口里。
装上它,接入你已经在付费的 harness,让 agent 开始干活。
curl -fsSL https://dl.ycodium.com/install.sh | sh