开源项目深度笔记 · 2026-06-05

agentcookie:让第二台 Mac 上的 Agent 自动继承你的登录态

它解决的是一个很具体但越来越常见的问题:你的日常电脑已经登录了各种网站和 CLI,但真正跑 agent 的可能是另一台 Mac mini。agentcookie 试图把 Chrome cookie、CLI bearer token、API key 和相关 auth blob 连续、单向、加密地同步过去,让 OpenClaw、Hermes 或其他 agent runtime 一醒来就已经“像你一样登录”。

agentcookie source-to-sink sync diagram Source Mac 你日常使用、正常登录的网站 Sink Mac agent 真正执行任务的机器 Chrome Cookies CLI secrets bus blocklist filter 真实 Chrome profile cookies-plain.db per-CLI adapters cmux WebKit optional Tailscale tailnet AES-256-GCM + replay defense 目标:无人值守、单向、持续同步登录态
macOS-only当前 README 明确:两端今天都只支持 macOS
Tailscale默认传输平面,不走第三方托管中继
AES-256-GCM同步 payload 在 tailnet 之上再做应用层加密
MITLICENSE 文件显示为 MIT;FAQ 处有 Apache 2.0 表述不一致

一、agentcookie 是什么?

一句话:它是给“第二台 agent 机器”同步登录态的本地工具。源机器是你日常登录网站的 Mac,目标机器是跑 agent 的 Mac。它把认证状态持续推过去。

通俗比喻

你可以把它理解成“登录态搬运工”。你在主力 Mac 上登录 GitHub、Instacart、eBay、各种 CLI。agentcookie 观察这些登录态变化,把能搬的 cookie/token/API key 安全地搬到另一台 Mac,让那台机器上的 agent 不用重新登录。

工程定义

它读取源 Mac 上 Chrome Cookies SQLite 和 per-CLI secrets bus,经 blocklist 过滤后,用配对派生密钥做 AES-256-GCM 封装,通过 Tailscale tailnet POST 到 sink。sink 再把状态写入 Chrome profile、plaintext sidecar、CLI adapter session file 或 cmux WebKit cookie jar。

先说风险:这不是普通配置同步。它同步的是 session cookie、bearer token、API key。它的价值和风险都来自同一个事实:sink 上的 agent 会“像你一样登录”。部署前要认真看 threat model 和 blocklist。

二、它解决的不是“同步浏览器”,而是“无人值守 agent 授权”

传统 cookie 同步工具多半假设两台电脑都有人在用:点一下导入、合并一下 cookie、手动解锁一下 vault。agentcookie 的场景是:另一台 Mac mini 上没有人在,agent 需要 30 秒内带着你的登录态执行任务。

Web agent

浏览器驱动任务

比如 agent 打开网站查订单、预约、购物车、后台页面。如果没有登录态,它会卡在 2FA、验证码、Keychain prompt 或 OAuth 页面。

CLI agent

命令行工具调用

很多 PP CLI 或内部 CLI 需要 bearer token、API key、session.json。agentcookie 的 secrets bus 把这类 auth blob 也一起同步。

Headless sink

第二台 Mac mini

sink 可以通过 LaunchAgent 持续运行,开机后自动接收。目标是“装完以后人不用再碰”。

它与 Chrome 自带同步的区别

问题Chrome Sync / 手动复制agentcookie
是否适合无人值守弱,常需要 GUI、登录或人工确认强,设计目标就是 headless sink
传输方式依赖平台账户或人工导出一对一 tailnet,应用层 AEAD 加密
CLI token不覆盖secrets bus 覆盖 bearer/API key/env blob
控制粒度浏览器级source/sink 双侧 blocklist,per-CLI manifest
风险平台托管或人工误操作sink 获得高权限登录态,需要严格隔离

三、工作原理:一次同步如何发生

项目文档把一次 sync 拆得很清楚:source 读 cookie、解密、过滤、封装、加密、POST;sink 解密、校验、过滤、写入多个 delivery surface。

1. 监听变化source watch Chrome Cookies 文件,以及 secrets bus 中的 per-CLI secrets.env 或 manifest。
2. 读取并解密通过 macOS Keychain 的 Chrome Safe Storage 取本机 key,读 SQLite cookie。
3. 过滤source blocklist 先过滤;sink 也有独立 blocklist 做防御纵深。
4. 封装 payloadSyncEnvelope 带 protocol_version、source_hostname、sequence、cookies/secrets。
5. 加密传输X25519 + HKDF 派生 pair key,AES-256-GCM;跑在 Tailscale WireGuard 上。
6. 写入 sinkChrome profile、sidecar、adapter session、cmux browser、secrets bus。

协议内核

Pairing

source 生成配对码和 X25519 keypair,sink 输入 code 和 pair URL。双方用 X25519 ECDH,再以 pairing code 作为 HKDF salt,得到 32-byte pair key。

SyncEnvelope

协议 v1 的 envelope 包含 protocol_versionsource_hostnamesequence 和 cookie 数组。sink 先验 AEAD tag,再验版本、sequence、blocklist。

{
  "protocol_version": 1,
  "source_hostname": "my-laptop.tailnet.ts.net",
  "sequence": 1747432817,
  "cookies": [ { "host_key": ".example.com", "name": "session", "value": "..." } ]
}
Chrome DB source AEAD seal Tailscale sink verify write surfaces agent Cookies SQLite + Keychain filter + envelope AES-256-GCM tailnet channel version + sequence Chrome / sidecar / CLI runs logged in

四、为什么它有这么多 delivery surface?

因为不同 agent 和 CLI 读登录态的方式不一样。agentcookie 的实用性来自“同时喂多种入口”,而不是只写一个 cookie 文件。

Surface写到哪里解决什么限制
Universal Chrome profilesink 的真实 Default Chrome Cookies SQLite,并用 sink Keychain 重加密不改造任何 cookie 工具也能读 Chrome 登录态需要处理 macOS Safe Storage 权限;headless 安装需要一次 login password
Plaintext sidecar~/.agentcookie/cookies-plain.dbagentcookie-aware 工具可以不碰 Keychain 直接读默认明文落盘,必须依赖用户目录权限和机器隔离
Per-CLI adapters各 CLI 的 session.json / config.toml / cookies.json让特定 CLI 无需懂 Chrome cookie 格式每个 CLI 格式变动都可能需要 adapter 维护
cmux WebKitcmux rpc browser.cookies.set给 cmux 内置 WebKit 浏览器注入登录态只同步 cookie;localStorage/IndexedDB/device-bound session 可能仍要手动登录
Secrets bus~/.agentcookie/secrets/<cli>/secrets.env同步 bearer token、API key、OAuth refresh token 等非 cookie 认证不是密钥生成/轮换系统,只搬运已有凭据
关键理解:cookie 只是其中一种认证状态。现代 agent 要调用很多 CLI 和 API,真正有价值的是 cookie + token + API key + session file 的组合搬运。

五、Secrets Bus:它把 CLI 认证也纳入同步

README 里最容易被忽略的点是 secrets bus。它不是只同步浏览器 cookie,而是提供一个 per-CLI 的文件标准,让 bearer token/API key/env blob 也随同同步。

v1 文件形态

所有 secrets 放在 ~/.agentcookie/secrets/<cli-name>/,核心文件是 secrets.envmanifest.toml。env 格式是严格 dotenv 子集,便于 Go/Python/Node/Ruby 读一致。

v2 adoption standard

项目可以放一个 agentcookie.toml,声明自己参与同步、secret 文件在哪、哪些 key 默认同步、哪些 key 排除、是否有 alias 和 carried files。agentcookie discover 自动发现。

# ~/.agentcookie/secrets/example-cli/secrets.env
API_TOKEN=abc123
OAUTH_REFRESH_TOKEN="..."

# agentcookie.toml
schema_version = 2
name = "example-cli"
display_name = "Example CLI"

[secrets.file]
path = "~/.config/example-cli/.env"

[sync]
default = true

[sync.keys]
LOCAL_MACHINE_ONLY = false

它不是 Vault

文档说得很清楚:secrets bus 不是 secret store,不负责生成密钥、不发 OAuth、不做轮换、不判断过期。它只是把某个 CLI 已经拥有的认证结果搬到 sink,让 agent 可以调用。

六、安全边界:它保护什么,不保护什么

agentcookie 自己的 threat model 写得比较坦诚。这里要分清“传输安全”“落盘安全”“机器被攻破”是三件事。

它努力保护的

  • 传输中 cookie 明文:payload 用 AES-256-GCM,底层还走 Tailscale WireGuard。
  • 配对过程 MITM:X25519 + HKDF,并把 pairing code 混入 salt。
  • 重放攻击:sync envelope 带 sequence,sink 拒绝不递增 payload;新版本强调持久 replay defense。
  • sink 侧最终控制:sink 也有 blocklist,source 推来也可以 drop。
  • DoS 和恶意 payload:文档列出 body cap、timeout、路径遍历、控制字符等防护。

它明确不保护的

  • root/sudo 攻破任一机器。拿到本机高权限,Chrome SQLite + Keychain 本来就能被读。
  • Chrome 或恶意浏览器扩展被攻破。源头已经能读 cookie,agentcookie 不提高这条线。
  • 设备指纹绑定会话。cookie 搬过去,不代表 canvas、屏幕、语言、TLS 指纹也一样。
  • 用户被诱导配对到恶意 sink。配对成功后,cookie 流动就是设计行为。

关于 macOS Keychain 的现实处理

v0.13 runbook 的重点是“one-password keychain onboarding”:为了让 universal cookie delivery 工作,sink 需要让 Chrome Safe Storage 可被指定路径读取。现代 macOS 不允许完全无密码修改 Keychain item access,所以底线是 SSH 里输入一次 login password,而不是 GUI 里点一堆 Allow。

我的安全判断:这类工具适合“你完全控制的第二台 Mac”,不适合跑在不可信云主机、多人共用机器或权限边界模糊的环境。你应该把 sink 当作已经持有你大量会话凭据的高敏主机来管理。

七、DBSC:为什么 Google 这类站点不能简单复制 cookie

Chrome 的 Device Bound Session Credentials 会把某些 session refresh 绑定到源机器安全硬件。agentcookie 没有也不应该尝试绕过它。

DBSC 会发生什么

如果站点采用 DBSC,复制到 sink 的 cookie 可能短时间内还能用,但刷新挑战需要源 Mac Secure Enclave 中不可导出的私钥签名。sink 做不到,所以几分钟后失效。

agentcookie 的态度

它会标记 DBSC-suspect cookie,在 doctor 里警告;也支持 --skip-dbsc-suspect 直接不发。对 Google/Workspace 这类场景,正确方式是在 sink 的 Chrome 上登录一次,建立自己的 device-bound session。

重要但不致命:DBSC 只影响 cookie 这一条路。secrets bus 中的 bearer token、API key、OAuth refresh token 不属于 DBSC cookie 协议范围,仍可正常同步。

八、我会怎么落地它

适合使用

  • 你有一台专用 Mac mini 跑 agent,且这台机器物理/账号/网络都可控。
  • 你的 agent 需要频繁访问已登录网页或 authenticated CLI。
  • 你已经用 Tailscale 管理自己的设备,不想引入第三方 relay。
  • 你能接受维护 blocklist,把高风险站点排除或在 sink 单独登录。

不建议使用

  • sink 是不可信云主机、共享主机或多人账号。
  • 你只是偶尔让 agent 浏览网页,手动登录一次成本不高。
  • 你无法解释“哪些 cookie/token 会被同步、谁能读、如何撤销”。
  • 主要目标是 Google/Workspace 这类可能设备绑定的会话复制。

部署前检查清单

  1. 先列站点。哪些网站允许同步,哪些必须 blocklist,例如银行、支付、公司核心后台。
  2. 先隔离 sink。单独用户、磁盘加密、Tailscale ACL、不要装杂乱插件和未知二进制。
  3. 先跑 degraded path。确认 sidecar/adapters 足够时,不必急着开 universal Chrome profile。
  4. 再开 universal delivery。需要理解 Keychain partition、signed binary、one-password onboarding。
  5. 定期 doctor。看 Tailscale、pairing、listener、cookie delivery、adapter、DBSC-suspect 等健康项。
# README 当前推荐的安装入口
go install github.com/mvanhorn/agentcookie/cmd/agentcookie@latest

# source
agentcookie wizard install --as source --peer <second-mac-hostname>

# sink
agentcookie wizard install --as sink --peer <first-mac-hostname> \
  --code <pairing-code> --pair-url http://<first-mac-hostname>:9998/pair

# 验证
agentcookie doctor
agentcookie wizard verify-adapters
agentcookie accounts off x.com

九、我的结论

agentcookie 的价值很明确:当 AI agent 从“本机工具”变成“另一台长期运行的执行节点”,认证状态会成为第一大摩擦。它把这个摩擦系统化处理:cookie、CLI token、API key、adapter、cmux、LaunchAgent、Tailscale、pairing、blocklist、doctor,都围绕“第二台 Mac 无人值守但要已登录”这个单点展开。

我最欣赏的是它没有把问题讲成“万能登录同步”。文档明确承认 DBSC、设备指纹、root compromise、Chrome compromise、plaintext sidecar 默认风险。也就是说,它是一个面向懂边界的 power user / agent operator 的工具,不是给普通用户无脑安装的浏览器同步插件。

如果要类比:agentcookie 是 AI agent 时代的“会话状态复制层”。它不让 agent 更聪明,但让 agent 更少卡在登录、Keychain prompt、API key 缺失这些非智能问题上。前提是你愿意承担并管理它带来的权限集中风险。

资料来源