编码 agent 的
控制面。

在同一个表面里跑 Claude Code、Codex、Grok,还有另外三个——单个使唤,或者让它们组队盯着同一个目标。用你自己的订阅。

下载 macOS 版最新版本(v0.2.3216)其他平台
在服务器上安装
curl -fsSL https://dl.ycodium.com/install.sh | sh

它会给自己写工具。

这是一条真跑过的会话。agent 读了插件 API、写出一个插件、停下来问你,然后调用了它自己刚做好的那个工具。

录的,不是画的。真事件,用应用自己那套 reducer 重放。7 次工具调用 · 50 秒
你
I keep wanting to know how many lines each file in this project has, but there is no tool for it. Write yourself a Ycodium plugin that adds one command: given a glob, it returns each matching file with its line count, sorted longest first. Keep it tiny. Run it in this thread and show me the result for "*.md". Don't install it permanently.
工具
ycodium ycodium_inspect api
完成
工具
Read claude-config/…/toolu_01MuPEqzSSmibj44VQSAEk2j.txt
完成
工具
Staged plugin line-counter v1
完成
工具
ycodium ycodium_plugin_define import { definePlugin } from "@ycodium/plugin-api"; const ROOT = "/tmp/ycodium-fixture/…
完成
agent
Plugin staged. Now mounting it into this thread only (not installing permanently) and will need your approval.
问你
Run plugin line-counter v1 in this thread?
RejectApprove
工具
ycodium ycodium_plugin_run line-counter
完成
工具
Plugin line-counter v1 is running in this thread
完成
agent
I've staged the plugin and requested to mount it in this thread — an approval card should appear for you. Let me know once you approve it (or I'll notice when the tool becomes available) and I'll run it against *.md.
agent
The plugin is mounted and approved. Running it now against *.md.
工具
ycodium line-counter_count_lines *.md
完成
agent
Result for *.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 是真去看了页面,不是听人转述。总价是它从渲染出来的购物车上读到的,改掉背后那一行,重新加载,再看一眼。下面两张截图就是它当时真看到的。

录的,不是画的。真事件,用应用自己那套 reducer 重放。6 次工具调用 · 19 秒
你
The cart total on http://127.0.0.1:5173 is wrong. Open it in the preview, tell me what it says and why, then fix site/cart.js and reload to confirm.
工具
Read demo/site/cart.js
完成
工具
ycodium preview_open http://127.0.0.1:5173
完成
工具
ycodium preview_snapshot
完成
agent
The page shows Total: $101.75, but it should be $126.25 (Keyboard $89.50 × 1 + Cable $12.25 × 3 = $89.50 + $36.75). The bug is in site/cart.js:13 — the reduce sums item.price but ignores item.qty. Fixing it now.
image.png
工具
Edit demo/site/cart.js
完成
工具
ycodium preview_navigate http://127.0.0.1:5173
完成
工具
ycodium preview_snapshot
完成
agent
Confirmed fixed — total now shows $126.25 after reload. The bug: 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.
image.png

这是产品时间线的一层薄呈现——浏览器本身、元素选取、控制台都在应用里。

远程是默认,不是事后补的。

Ycodium 跑在一台你自己的机器上——闲置的台式机、家里的小服务器、云上的一个小实例都行——所有客户端都连到这一个地方。

  • 多个客户端能同时连到同一个 environment。
  • 合上笔记本,agent 照样接着跑。
  • 用手机看一眼进度。
  • 换一台设备,接上同一个会话继续。
Direct

直接连到 Host,走局域网或者一个可达地址,路径上没有第三方。

Relay

不用开放端口。Ycodium 的 relay——官方托管或自建——负责在客户端和 Host 之间转发这条连接。

Tailscale

已经在用 tailnet?把 Host 发布到 Tailscale Serve HTTPS 上,用一个干净的 MagicDNS 地址配对。

SSH

把桌面 app 指向 user@host,它会在那台机器上启动或接上已有的 Ycodium,再转发一个本地端口——远端不用你手动装任何东西。

Relay 只负责接通,不进会话。

直连够不到一台藏在你管不着的路由器后面的机器。Relay 的活儿是把两头介绍给彼此——不是替它们传话。会话是端到端封死的,Relay 转发的是它读不懂的字节。

你的客户端网页、桌面或手机
Relay在路径上,不在会话里
你的机器agent 真正跑的地方
端到端封死 — Noise IK
Relay 看得见
  • 某个客户端要找哪一台机器
  • 一个回给它的地址,两分钟就过期
  • 转发的字节有多大、什么时候来
Relay 永远看不见
  • 会话里的任何内容
  • 你机器的静态密钥,或者你客户端的
  • 任何它能铸造或重放的凭据
绑的是密钥,不是域名

会话身份是主机的静态密钥加客户端的静态密钥,不是 TLS 证书,也不是隧道域名。你的服务器第一次启动就生成自己那把钥匙,客户端把它 pin 下来;TLS 仍然承载密文,但你信的已经不是它了。

connect 只回一个地址

connect 回的是环境 id、一个地址、两分钟的有效期。不含凭据,也绝不替你铸一个——客户端拿自己已经持有的授权去认证那个地址,没有就先配对。

同一个 Relay,你自己跑也行

同一份 handler 既能跑成 Cloudflare Worker,也能跑成一个普通 Node 进程,所以自建的和托管的可以互换。两边都不持有主机密钥——这正是互换敢换的原因。

自带订阅

Ycodium 不转卖 token。用你已有的登录凭据,接入你本来就在付费的那些 agent——六个按名字配好了,剩下任何会说 ACP 的,填一条命令就能接。

Codex
codex login
Claude Code
claude auth login
Grok
grok login
DeepSeek Harness
DEEPSEEK_API_KEY
OpenCode
opencode auth
Kimi Code
kimi login
任何 ACP agent
告诉 Ycodium 跑哪个程序、哪个参数开 ACP 就行,不需要为它单独做适配。

同一家 provider,两个账号并排。

一个账号就是一个实例:自己的登录、自己的默认模型、自己的颜色。它们之间什么都不共享,而且选择是跟着轮次走的——中途换一下,下一轮就跑在另一个账号上。

一家 provider机器上的一个 CLI
实例 A
CLAUDE_CONFIG_DIR=~/.claude-a
  • 自己的登录
  • 自己的默认模型
  • 自己的代理
实例 B
CLAUDE_CONFIG_DIR=~/.claude-b
  • 另一个登录
  • 另一个默认模型
  • 直连,不走代理

driver 启动 CLI 时把这个实例自己的配置目录交给它,两份登录因此不会互相覆盖。Codex 走 CODEX_HOME,同一个道理;ACP 那批各自声明自己的变量名。

每个实例自己的
  • displayName
  • accentColor
  • environment
  • proxyId
  • enabled
  • hiddenModels
  • modelOrder
  • defaultModel
  • 选择器上写着每个实例登的是谁——从它自己那份凭据文件里读出来的,只解不验,只用于显示,不拿去授权任何东西
  • CLI 支持设备码就能无头登录:它自己打印网址和验证码、轮询到你批准,所以没有图形界面的机器也能持有账号
  • 模型选择挂在 thread.turn.start 上,不挂在会话上,所以一条对话里可以有两个账号各跑几轮

同一个会话,网页、桌面、手机三端都在。

在网页开始,切到桌面接着做,用手机看看进度——同一个 environment,同一段历史,不用手动交接。

网页端

打开浏览器,配对一次就能用——想瞅一眼进度,不用装任何东西。

桌面端

完整客户端,再加一件只有它能做的事:通过 SSH 直接启动或接管一台远程 Host。

移动端

专为随手看一眼做的:看一轮跑完没,批一个待审批的步骤,或者支使一下 agent。

也可以在 Telegram、企业微信或飞书里 @ 一个机器人:活儿照样落在普通项目的普通会话上,之后从三端任意一个接着看。

别的事,也不用离开这个会话。

右边那条面板放着你本来得切窗口才能用的工具。它们跟着你打开的项目走,而且跑在 environment 上,不是在你的浏览器里。

源代码管理

暂存、取消暂存、提交、切分支或 worktree。本地仓库还能一步发布到 GitHub 或 GitLab,顺手把 remote 接好。

文件

浏览、打开、编辑、搜索、上传下载——动的是 agent 干活那台机器上的文件,不是副本。

终端

同一台机器上的真终端,在对话下面的抽屉里。

拉取请求

在面板里读和审 GitHub 的 pull request、GitLab 的 merge request。

浏览器

内置预览,用来看 agent 刚起的那个 dev server。

权限模式

四挡,按会话设,就在输入框上:逐条确认、自动接受改动、自动、完全放开。

工具配一次,每个 agent 都拿得到。

在设置里加一个 MCP 服务器或者一个技能,Ycodium 之后启动的每个 provider 都会收到它。Ycodium 从不改 provider 自己的配置文件——是启动时把这些条目递进去的,所以你手工配好的东西不会被覆盖。

MCP 服务器

stdio、http、sse 三种传输,每个 CLI 单独开关,健康检查从 environment 发起而不是从你的浏览器。某个 CLI 说不了某种传输,那一格是灰的,不会悄悄跳过。

技能

一个装着 SKILL.md 的文件夹,写到 Claude、Codex、OpenCode 各自会去找的位置。两个开关分别管 agent 能不能调它、你能不能调它。

两级作用域

设置里加的归这台机器,对上面每个项目都生效。写进仓库 ycodium.json 的跟着仓库走,重名时它说了算。

现成的 MCP 服务器有目录,一键装上
插件能加工具、后台反应、设置卡和面板页
群聊本身就是一个内置插件,并不特殊
插件 API 是单向的,插件从不 import 宿主

而产品本身就是插件。

群聊桥、PR 面板、会话导入——每一个都是插件,挂在跟你自己写的插件同一套 API 上。这套 API 里没有一处是留给我们自己的。

插件能加什么
  • ctx.toolkit()给 agent 调的工具,走 MCP
  • ctx.command()一条客户端能派发的命令
  • ctx.reactor()对编排事件的一个反应
  • ctx.interval()一条后台循环,宿主替你收尾
  • ctx.cli()一条 ycodium 子命令
  • ctx.settingsCard()设置里的一张卡,含密文字段
  • ui.pages应用里属于你的一个页面
  • ui.panels停靠在对话旁边的面板
  • ui.appearance一套皮肤,一个插件最多一张
它必须先申请什么
  • fs.read读文件,路径前缀要事先声明
  • process.spawn跑白名单里的程序
  • process.workspace并且是在项目目录里跑

没声明的一律在调用那一刻被拒,不是事后审计。批准卡上会先把这个插件申请了什么摊开给你看。

这些本身就是插件
  • conversation
  • tool-display
  • skill-discovery
  • connector-registry
  • telemetry
  • trace-diagnostics
  • plugin-center

这才是一套插件 API 老不老实的检验:如果它撑不起产品自己的功能,也就撑不起你的。这一页最上面那段演示,就是一个 agent 从零写出这样一个插件、并在会话里跑起来。

你的 agent,不该窝在一个终端窗口里。

装上它,接入你已经在付费的 harness,让 agent 开始干活。

下载 macOS 版最新版本(v0.2.3216)其他平台
在服务器上安装
curl -fsSL https://dl.ycodium.com/install.sh | sh